aboutsummaryrefslogtreecommitdiff
path: root/Python/pywarpx/_libwarpx.py
diff options
context:
space:
mode:
Diffstat (limited to 'Python/pywarpx/_libwarpx.py')
-rwxr-xr-xPython/pywarpx/_libwarpx.py263
1 files changed, 168 insertions, 95 deletions
diff --git a/Python/pywarpx/_libwarpx.py b/Python/pywarpx/_libwarpx.py
index fcf7f45d6..691288d07 100755
--- a/Python/pywarpx/_libwarpx.py
+++ b/Python/pywarpx/_libwarpx.py
@@ -300,7 +300,7 @@ class LibWarpX():
self.libwarpx_so.warpx_sett_new.argtypes = [ctypes.c_int, c_real]
self.libwarpx_so.warpx_getdt.argtypes = [ctypes.c_int]
- def get_boundary_number(self, boundary):
+ def _get_boundary_number(self, boundary):
'''
Utility function to find the boundary number given a boundary name.
@@ -308,13 +308,14 @@ class LibWarpX():
Parameters
----------
- boundary : the boundary from which to get the scraped particle data.
- In the form x/y/z_hi/lo or eb.
+ boundary : str
+ The boundary from which to get the scraped particle data. In the
+ form x/y/z_hi/lo or eb.
Returns
-------
-
- Integer index in the boundary scraper buffer for the given boundary.
+ int
+ Integer index in the boundary scraper buffer for the given boundary.
'''
if self.geometry_dim == '3d':
dimensions = {'x' : 0, 'y' : 1, 'z' : 2}
@@ -348,7 +349,9 @@ class LibWarpX():
@staticmethod
def _array1d_from_pointer(pointer, dtype, size):
'''
+
Function for converting a ctypes pointer to a numpy array
+
'''
if not pointer:
raise Exception(f'_array1d_from_pointer: pointer is a nullptr')
@@ -385,7 +388,7 @@ class LibWarpX():
def get_nattr(self):
'''
- Get the number of extra attributes.
+ Get the number of extra particle attributes.
'''
# --- The -3 is because the comps include the velocites
@@ -393,10 +396,15 @@ class LibWarpX():
def get_nattr_species(self, species_name):
'''
-
Get the number of real attributes for the given species.
+ Parameters
+ ----------
+
+ species_name: str
+ Name of the species
'''
+
return self.libwarpx_so.warpx_nCompsSpecies(
ctypes.c_char_p(species_name.encode('utf-8')))
@@ -423,8 +431,7 @@ class LibWarpX():
def initialize(self, argv=None, mpi_comm=None):
'''
- Initialize WarpX and AMReX. Must be called before
- doing anything else.
+ Initialize WarpX and AMReX. Must be called before doing anything else.
'''
if argv is None:
@@ -450,27 +457,33 @@ class LibWarpX():
def getistep(self, level=0):
'''
-
Get the current time step number for the specified level
Parameter
---------
- level : the refinement level to reference
+ level : int
+ The refinement level to reference
'''
+
return self.libwarpx_so.warpx_getistep(level)
def gett_new(self, level=0):
'''
- Get the next time for the specified level
+ Get the next time for the specified level.
+
+ Parameters
+ ----------
+ level : int
+ The refinement level to reference
'''
+
return self.libwarpx_so.warpx_gett_new(level)
def evolve(self, num_steps=-1):
'''
-
Evolve the simulation for num_steps steps. If num_steps=-1,
the simulation will be run until the end as specified in the
inputs file.
@@ -478,21 +491,54 @@ class LibWarpX():
Parameters
----------
- num_steps: int, the number of steps to take
-
+ num_steps: int
+ The number of steps to take
'''
self.libwarpx_so.warpx_evolve(num_steps);
def getProbLo(self, direction):
+ '''
+ Get the values of the lower domain boundary.
+
+ Parameters
+ ----------
+
+ direction : int
+ Direction of interest
+ '''
+
assert 0 <= direction < self.dim, 'Inappropriate direction specified'
return self.libwarpx_so.warpx_getProbLo(direction)
def getProbHi(self, direction):
+ '''
+ Get the values of the upper domain boundary.
+
+ Parameters
+ ----------
+
+ direction : int
+ Direction of interest
+ '''
+
assert 0 <= direction < self.dim, 'Inappropriate direction specified'
return self.libwarpx_so.warpx_getProbHi(direction)
def getCellSize(self, direction, level=0):
+ '''
+ Get the cell size in the given direction and on the given level.
+
+ Parameters
+ ----------
+
+ direction : int
+ Direction of interest
+
+ level : int
+ The refinement level to reference
+ '''
+
assert 0 <= direction < 3, 'Inappropriate direction specified'
assert 0 <= level and level <= self.libwarpx_so.warpx_finestLevel(), 'Inappropriate level specified'
return self.libwarpx_so.warpx_getCellSize(direction, level)
@@ -538,25 +584,33 @@ class LibWarpX():
#
# self.libwarpx_so.warpx_ComputePMLFactors(lev, dt)
- def add_particles(self, species_name, x=None, y=None, z=None, ux=None, uy=None, uz=None, w=None,
- unique_particles=True, **kwargs):
+ def add_particles(self, species_name, x=None, y=None, z=None, ux=None, uy=None,
+ uz=None, w=None, unique_particles=True, **kwargs):
'''
-
A function for adding particles to the WarpX simulation.
Parameters
----------
- species_name : the species to add the particle to
- x, y, z : arrays or scalars of the particle positions (default = 0.)
- ux, uy, uz : arrays or scalars of the particle momenta (default = 0.)
- w : array or scalar of particle weights (default = 0.)
- unique_particles : whether the particles are unique or duplicated on
- several processes. (default = True)
- kwargs : dictionary containing an entry for all the extra particle
- attribute arrays. If an attribute is not given it will be
- set to 0.
+ species_name : str
+ The type of species for which particles will be added
+
+ x, y, z : arrays or scalars
+ The particle positions (default = 0.)
+
+ ux, uy, uz : arrays or scalars
+ The particle momenta (default = 0.)
+
+ w : array or scalars
+ Particle weights (default = 0.)
+
+ unique_particles : bool
+ Whether the particles are unique or duplicated on several processes
+ (default = True)
+ kwargs : dict
+ Containing an entry for all the extra particle attribute arrays. If
+ an attribute is not given it will be set to 0.
'''
# --- Get length of arrays, set to one for scalars
@@ -646,30 +700,31 @@ class LibWarpX():
def get_particle_count(self, species_name, local=False):
'''
-
- This returns the number of particles of the specified species in the
- simulation.
+ Get the number of particles of the specified species in the simulation.
Parameters
----------
- species_name : the species name that the number will be returned for
- local : If True the particle count on this processor will
- be returned.
+ species_name : str
+ The species name that the number will be returned for
+
+ local : bool
+ If True the particle count on this processor will be returned.
+ Default False.
Returns
-------
+ int
An integer count of the number of particles
-
'''
+
return self.libwarpx_so.warpx_getNumParticles(
ctypes.c_char_p(species_name.encode('utf-8')), local
)
def get_particle_structs(self, species_name, level):
'''
-
This returns a list of numpy arrays containing the particle struct data
on each tile for this process. The particle data is represented as a structured
numpy array and contains the particle 'x', 'y', 'z', 'id', and 'cpu'.
@@ -680,13 +735,17 @@ class LibWarpX():
Parameters
----------
- species_name : the species name that the data will be returned for
+ species_name : str
+ The species name that the data will be returned for
+
+ level : int
+ The refinement level to reference
Returns
-------
- A List of numpy arrays.
-
+ List of numpy arrays
+ The requested particle struct data
'''
particles_per_tile = _LP_c_int()
@@ -709,7 +768,6 @@ class LibWarpX():
def get_particle_arrays(self, species_name, comp_name, level):
'''
-
This returns a list of numpy arrays containing the particle array data
on each tile for this process.
@@ -719,14 +777,20 @@ class LibWarpX():
Parameters
----------
- species_name : the species name that the data will be returned for
- comp_name : the component of the array data that will be returned.
+ species_name : str
+ The species name that the data will be returned for
+
+ comp_name : str
+ The component of the array data that will be returned
+
+ level : int
+ The refinement level to reference
Returns
-------
- A List of numpy arrays.
-
+ List of numpy arrays
+ The requested particle array data
'''
particles_per_tile = _LP_c_int()
@@ -887,7 +951,6 @@ class LibWarpX():
def get_particle_comp_index(self, species_name, pid_name):
'''
-
Get the component index for a given particle attribute. This is useful
to get the corrent ordering of attributes when adding new particles using
`add_particles()`.
@@ -895,15 +958,19 @@ class LibWarpX():
Parameters
----------
- species_name : the species name that the data will be returned for
- pid_name : string that is used to identify the new component
+ species_name : str
+ The name of the species
+
+ pid_name : str
+ Name of the component for which the index will be returned
Returns
-------
+ int
Integer corresponding to the index of the requested attribute
-
'''
+
return self.libwarpx_so.warpx_getParticleCompIndex(
ctypes.c_char_p(species_name.encode('utf-8')),
ctypes.c_char_p(pid_name.encode('utf-8'))
@@ -911,17 +978,21 @@ class LibWarpX():
def add_real_comp(self, species_name, pid_name, comm=True):
'''
-
Add a real component to the particle data array.
Parameters
----------
- species_name : the species name for which the new component will be added
- pid_name : string that is used to identify the new component
- comm : should the component be communicated
+ species_name : str
+ The species name for which the new component will be added
+
+ pid_name : str
+ Name that can be used to identify the new component
+ comm : bool
+ Should the component be communicated
'''
+
self.libwarpx_so.warpx_addRealComp(
ctypes.c_char_p(species_name.encode('utf-8')),
ctypes.c_char_p(pid_name.encode('utf-8')), comm
@@ -929,47 +1000,45 @@ class LibWarpX():
def get_species_charge_sum(self, species_name, local=False):
'''
-
Returns the total charge in the simulation due to the given species.
Parameters
----------
- species_name : the species name for which charge will be summed
- local : If True return total charge per processor
+ species_name : str
+ The species name for which charge will be summed
+ local : bool
+ If True return total charge per processor
'''
+
return self.libwarpx_so.warpx_sumParticleCharge(
ctypes.c_char_p(species_name.encode('utf-8')), local
)
def get_particle_boundary_buffer_size(self, species_name, boundary):
'''
-
This returns the number of particles that have been scraped so far in the simulation
from the specified boundary and of the specified species.
Parameters
----------
- species_name : return the number of scraped particles of this species
- boundary : the boundary from which to get the scraped particle data.
- In the form x/y/z_hi/lo
-
- Returns
- -------
-
- The number of particles scraped so far from a boundary and of a species.
+ species_name : str
+ Return the number of scraped particles of this species
+ boundary : str
+ The boundary from which to get the scraped particle data in the
+ form x/y/z_hi/lo
'''
+
return self.libwarpx_so.warpx_getParticleBoundaryBufferSize(
ctypes.c_char_p(species_name.encode('utf-8')),
- self.get_boundary_number(boundary)
+ self._get_boundary_number(boundary)
)
def get_particle_boundary_buffer_structs(self, species_name, boundary, level):
'''
-
This returns a list of numpy arrays containing the particle struct data
for a species that has been scraped by a specific simulation boundary. The
particle data is represented as a structured numpy array and contains the
@@ -981,23 +1050,22 @@ class LibWarpX():
Parameters
----------
- species_name : the species name that the data will be returned for
- boundary : the boundary from which to get the scraped particle data.
- In the form x/y/z_hi/lo or eb.
- level : Which AMR level to retrieve scraped particle data from.
+ species_name : str
+ The species name that the data will be returned for
- Returns
- -------
-
- A List of numpy arrays.
+ boundary : str
+ The boundary from which to get the scraped particle data in the
+ form x/y/z_hi/lo or eb.
+ level : int
+ Which AMR level to retrieve scraped particle data from.
'''
particles_per_tile = _LP_c_int()
num_tiles = ctypes.c_int(0)
data = self.libwarpx_so.warpx_getParticleBoundaryBufferStructs(
ctypes.c_char_p(species_name.encode('utf-8')),
- self.get_boundary_number(boundary), level,
+ self._get_boundary_number(boundary), level,
ctypes.byref(num_tiles), ctypes.byref(particles_per_tile)
)
@@ -1014,7 +1082,6 @@ class LibWarpX():
def get_particle_boundary_buffer(self, species_name, boundary, comp_name, level):
'''
-
This returns a list of numpy arrays containing the particle array data
for a species that has been scraped by a specific simulation boundary.
@@ -1024,33 +1091,34 @@ class LibWarpX():
Parameters
----------
- species_name : the species name that the data will be returned for.
- boundary : the boundary from which to get the scraped particle data.
- In the form x/y/z_hi/lo or eb.
- comp_name : the component of the array data that will be returned.
- If "step_scraped" the special attribute holding the
- timestep at which a particle was scraped will be
- returned.
- level : Which AMR level to retrieve scraped particle data from.
+ species_name : str
+ The species name that the data will be returned for.
- Returns
- -------
+ boundary : str
+ The boundary from which to get the scraped particle data in the
+ form x/y/z_hi/lo or eb.
- A List of numpy arrays.
+ comp_name : str
+ The component of the array data that will be returned. If
+ "step_scraped" the special attribute holding the timestep at
+ which a particle was scraped will be returned.
+ level : int
+ Which AMR level to retrieve scraped particle data from.
'''
+
particles_per_tile = _LP_c_int()
num_tiles = ctypes.c_int(0)
if comp_name == 'step_scraped':
data = self.libwarpx_so.warpx_getParticleBoundaryBufferScrapedSteps(
ctypes.c_char_p(species_name.encode('utf-8')),
- self.get_boundary_number(boundary), level,
+ self._get_boundary_number(boundary), level,
ctypes.byref(num_tiles), ctypes.byref(particles_per_tile)
)
else:
data = self.libwarpx_so.warpx_getParticleBoundaryBuffer(
ctypes.c_char_p(species_name.encode('utf-8')),
- self.get_boundary_number(boundary), level,
+ self._get_boundary_number(boundary), level,
ctypes.byref(num_tiles), ctypes.byref(particles_per_tile),
ctypes.c_char_p(comp_name.encode('utf-8'))
)
@@ -1083,20 +1151,25 @@ class LibWarpX():
def depositChargeDensity(self, species_name, level, clear_rho=True, sync_rho=True):
'''
-
Deposit the specified species' charge density in rho_fp in order to
- access that data via pywarpx.fields.RhoFPWrapper()
+ access that data via pywarpx.fields.RhoFPWrapper().
Parameters
----------
- species_name : the species name that will be deposited.
- level : Which AMR level to retrieve scraped particle data from.
- clear_rho : If True, zero out rho_fp before deposition.
- sync_rho : If True, perform MPI exchange and properly set boundary
- cells for rho_fp.
+ species_name : str
+ The species name that will be deposited.
+
+ level : int
+ Which AMR level to retrieve scraped particle data from.
+ clear_rho : bool
+ If True, zero out rho_fp before deposition.
+
+ sync_rho : bool
+ If True, perform MPI exchange and properly set boundary cells for rho_fp.
'''
+
if clear_rho:
from . import fields
fields.RhoFPWrapper(level, True)[...] = 0.0