Integrate a dataset over specified direction(s).
$ pgkyl integrate --help Usage: pgkyl integr [OPTIONS] AXIS Integrate data over a specified axis or axes Options: -u, --use TEXT Specify the tag to integrate -t, --tag TEXT Optional tag for the resulting array -h, --help Show this message and exit.
Consider the gyrokinetic simulation of an ion acoustic wave as an example. It outputs the integrated particle density over time, which can plot as follows:
pgkyl gk-ionSound-1x2v-p1_ion_intM0.bp pl
We can see from the values on the y-axis that the total number
of particles is 12.566. The number of particles should be conserved,
to machine precision. We can check this another way by integrating
the particle density along \(x\) (the 0th dimension) at the end
of the simulation with
pgkyl gk-ionSound-1x2v-p1_ion_GkM0_1.bp interp integr 0 print
where we have abbreviated
integr, and we use
the print command to print the result of the integral to screen. The
output of this command is simply
The integrate command can also be used to integrate higher dimensional datasets in one or more directions. We could take the ion distribution function and integrated along the \(v_\parallel\) and \(\mu\) directions (1st and 2nd dimensions, respectively) with
pgkyl gk-ionSound-1x2v-p1_ion_0.bp gk-ionSound-1x2v-p1_ion_GkM0_0.bp interp \ activate -i 0 integr 1,2 ev -l 'integrate 1,2' 'f 6.283185 *' \ activate -i1,2 pl -f0 -x 'x' -y 'Number density, $n$'
In this command we:
- First load the ion distribution function (*_ion_0.bp) and its number density (*_ion_GkM0_0.bp) at \(t=0\).
- Integrate the distribution function over velocity space with
activate -i 0 integr 1,2.
- Multiply such integral by \(2\pi B_0/m_i\) (\(B_0=m_i=1\) here) with
ev -l 'integrate 1,2' 'f 6.283185 *'.
- Activate the number denstiy and integrated distribution function data sets and plot them with
activate -i1,2 pl -f0.
and this should give approximately the same number density as the
GkM0 diagnostic outputted by the simulation, as shown below.
Another useful application of the integrate command is to integrate,
or average, over time (although note that the ev
command has a
avg operation that may make this easier). Usually
this requires collecting multiple frames into a single dataset with
the collect command, and then integrating over the
0th dimension (time).
So if we increase the
tEnd of the gyrokinetic ion sound wave
simulation to 10 and the number of frames to 50 we could
plot the electrostatic potential as a function of time and position
pgkyl "gk-ionSound-1x2v-p1_phi_[0-9]*.bp" interp collect pl -x 'time' -y 'x' --clabel '$\phi$'
We can integrate this potential in time and plot it on top of the initial potential with
pgkyl gk-ionSound-1x2v-p1_phi_0.bp -l '$t=0$' -t phi0 \ "gk-ionSound-1x2v-p1_phi_[0-9]*.bp" -t phis interp collect -u phis -t phiC \ integrate -u phiC -t phiInt 0 ev -l 'Time average' -t phiAvg 'phiInt 10. /' \ activate -t phi0,phiAvg pl -f0 -x '$x$' -y '$\phi$'
This command uses tags to select which dataset to perform an operation on. The end result is the plot below
showing that the time averaged potential is lower amplitude due to the collisionless Landau damping of the wave.