aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xExamples/Physics_applications/laser_acceleration/PICMI_inputs_laser_acceleration.py3
-rw-r--r--Examples/Physics_applications/laser_acceleration/inputs_1d66
-rw-r--r--Examples/Physics_applications/plasma_acceleration/PICMI_inputs_plasma_acceleration_1d.py71
-rw-r--r--Python/pywarpx/picmi.py51
-rw-r--r--Regression/WarpX-tests.ini37
-rw-r--r--requirements.txt2
6 files changed, 228 insertions, 2 deletions
diff --git a/Examples/Physics_applications/laser_acceleration/PICMI_inputs_laser_acceleration.py b/Examples/Physics_applications/laser_acceleration/PICMI_inputs_laser_acceleration.py
index 87d02472c..7e75e14de 100755
--- a/Examples/Physics_applications/laser_acceleration/PICMI_inputs_laser_acceleration.py
+++ b/Examples/Physics_applications/laser_acceleration/PICMI_inputs_laser_acceleration.py
@@ -114,7 +114,8 @@ field_diag1 = picmi.FieldDiagnostic(name = 'diag1',
part_diag1 = picmi.ParticleDiagnostic(name = 'diag1',
period = 10,
- species = [electrons])
+ species = [electrons],
+ data_list = ['ux', 'uy', 'uz', 'weighting'])
##########################
# simulation setup
diff --git a/Examples/Physics_applications/laser_acceleration/inputs_1d b/Examples/Physics_applications/laser_acceleration/inputs_1d
new file mode 100644
index 000000000..55a55969a
--- /dev/null
+++ b/Examples/Physics_applications/laser_acceleration/inputs_1d
@@ -0,0 +1,66 @@
+#################################
+####### GENERAL PARAMETERS ######
+#################################
+max_step = 1000
+amr.n_cell = 512
+amr.max_grid_size = 64 # maximum size of each AMReX box, used to decompose the domain
+amr.blocking_factor = 32 # minimum size of each AMReX box, used to decompose the domain
+geometry.coord_sys = 0 # 0: Cartesian
+geometry.prob_lo = -56.e-6 # physical domain
+geometry.prob_hi = 12.e-6
+amr.max_level = 0 # Maximum level in hierarchy (1 might be unstable, >1 is not supported)
+
+#################################
+####### Boundary condition ######
+#################################
+boundary.field_lo = pec
+boundary.field_hi = pec
+
+#################################
+############ NUMERICS ###########
+#################################
+warpx.verbose = 1
+warpx.do_dive_cleaning = 0
+warpx.use_filter = 1
+warpx.cfl = 0.9 # if 1., the time step is set to its CFL limit
+warpx.do_moving_window = 1
+warpx.moving_window_dir = z # Only z is supported for the moment
+warpx.moving_window_v = 1.0 # units of speed of light
+
+# Order of particle shape factors
+algo.particle_shape = 3
+
+#################################
+############ PLASMA #############
+#################################
+particles.species_names = electrons
+
+electrons.species_type = electron
+electrons.injection_style = "NUniformPerCell"
+electrons.num_particles_per_cell_each_dim = 10
+electrons.zmin = 10.e-6
+electrons.profile = constant
+electrons.density = 2.e23 # number of electrons per m^3
+electrons.momentum_distribution_type = "at_rest"
+electrons.do_continuous_injection = 1
+
+#################################
+############ PLASMA #############
+#################################
+lasers.names = laser1
+laser1.profile = Gaussian
+laser1.position = 0. 0. 9.e-6 # This point is on the laser plane
+laser1.direction = 0. 0. 1. # The plane normal direction
+laser1.polarization = 0. 1. 0. # The main polarization vector
+laser1.e_max = 16.e12 # Maximum amplitude of the laser field (in V/m)
+laser1.profile_waist = 5.e-6 # The waist of the laser (in m)
+laser1.profile_duration = 15.e-15 # The duration of the laser (in s)
+laser1.profile_t_peak = 30.e-15 # Time at which the laser reaches its peak (in s)
+laser1.profile_focal_distance = 100.e-6 # Focal distance from the antenna (in m)
+laser1.wavelength = 0.8e-6 # The wavelength of the laser (in m)
+
+# Diagnostics
+diagnostics.diags_names = diag1
+diag1.intervals = 200
+diag1.diag_type = Full
+diag1.fields_to_plot = Ex Ey Ez Bx By Bz jx jy jz rho
diff --git a/Examples/Physics_applications/plasma_acceleration/PICMI_inputs_plasma_acceleration_1d.py b/Examples/Physics_applications/plasma_acceleration/PICMI_inputs_plasma_acceleration_1d.py
new file mode 100644
index 000000000..a604c0cd4
--- /dev/null
+++ b/Examples/Physics_applications/plasma_acceleration/PICMI_inputs_plasma_acceleration_1d.py
@@ -0,0 +1,71 @@
+from pywarpx import picmi
+#from warp import picmi
+
+constants = picmi.constants
+
+nz = 64
+
+zmin = -200.e-6
+zmax = +200.e-6
+
+moving_window_velocity = [0., 0., constants.c]
+
+number_per_cell_each_dim = [10]
+
+max_steps = 1000
+
+grid = picmi.Cartesian1DGrid(number_of_cells = [nz],
+ lower_bound = [zmin],
+ upper_bound = [zmax],
+ lower_boundary_conditions = ['dirichlet'],
+ upper_boundary_conditions = ['dirichlet'],
+ lower_boundary_conditions_particles = ['absorbing'],
+ upper_boundary_conditions_particles = ['absorbing'],
+ moving_window_velocity = moving_window_velocity,
+ warpx_max_grid_size=32)
+
+solver = picmi.ElectromagneticSolver(grid=grid, cfl=0.999)
+
+beam_distribution = picmi.UniformDistribution(density = 1.e23,
+ lower_bound = [None, None, -150.e-6],
+ upper_bound = [None, None, -100.e-6],
+ directed_velocity = [0., 0., 1.e9])
+
+plasma_distribution = picmi.UniformDistribution(density = 1.e22,
+ lower_bound = [None, None, 0.],
+ upper_bound = [None, None, None],
+ fill_in = True)
+
+beam = picmi.Species(particle_type='electron', name='beam', initial_distribution=beam_distribution)
+plasma = picmi.Species(particle_type='electron', name='plasma', initial_distribution=plasma_distribution)
+
+sim = picmi.Simulation(solver = solver,
+ max_steps = max_steps,
+ verbose = 1,
+ warpx_current_deposition_algo = 'esirkepov',
+ warpx_use_filter = 0)
+
+sim.add_species(beam, layout=picmi.GriddedLayout(grid=grid, n_macroparticle_per_cell=number_per_cell_each_dim))
+sim.add_species(plasma, layout=picmi.GriddedLayout(grid=grid, n_macroparticle_per_cell=number_per_cell_each_dim))
+
+field_diag = picmi.FieldDiagnostic(name = 'diag1',
+ grid = grid,
+ period = max_steps,
+ data_list = ['Ex', 'Ey', 'Ez', 'Jx', 'Jy', 'Jz', 'part_per_cell'],
+ write_dir = '.',
+ warpx_file_prefix = 'Python_PlasmaAcceleration_plt')
+
+part_diag = picmi.ParticleDiagnostic(name = 'diag1',
+ period = max_steps,
+ species = [beam, plasma],
+ data_list = ['ux', 'uy', 'uz', 'weighting'])
+
+sim.add_diagnostic(field_diag)
+sim.add_diagnostic(part_diag)
+
+# write_inputs will create an inputs file that can be used to run
+# with the compiled version.
+#sim.write_input_file(file_name = 'inputs_from_PICMI')
+
+# Alternatively, sim.step will run WarpX, controlling it from Python
+sim.step()
diff --git a/Python/pywarpx/picmi.py b/Python/pywarpx/picmi.py
index 460b21602..2efe6c1d4 100644
--- a/Python/pywarpx/picmi.py
+++ b/Python/pywarpx/picmi.py
@@ -463,6 +463,57 @@ class CylindricalGrid(picmistandard.PICMI_CylindricalGrid):
pywarpx.amr.max_level = 0
+class Cartesian1DGrid(picmistandard.PICMI_Cartesian1DGrid):
+ def init(self, kw):
+ self.max_grid_size = kw.pop('warpx_max_grid_size', 32)
+ self.max_grid_size_x = kw.pop('warpx_max_grid_size_x', None)
+ self.blocking_factor = kw.pop('warpx_blocking_factor', None)
+ self.blocking_factor_x = kw.pop('warpx_blocking_factor_x', None)
+
+ self.potential_xmin = None
+ self.potential_xmax = None
+ self.potential_ymin = None
+ self.potential_ymax = None
+ self.potential_zmin = kw.pop('warpx_potential_lo_z', None)
+ self.potential_zmax = kw.pop('warpx_potential_hi_z', None)
+
+ def initialize_inputs(self):
+ pywarpx.amr.n_cell = self.number_of_cells
+
+ # Maximum allowable size of each subdomain in the problem domain;
+ # this is used to decompose the domain for parallel calculations.
+ pywarpx.amr.max_grid_size = self.max_grid_size
+ pywarpx.amr.max_grid_size_x = self.max_grid_size_x
+ pywarpx.amr.blocking_factor = self.blocking_factor
+ pywarpx.amr.blocking_factor_x = self.blocking_factor_x
+
+ # Geometry
+ pywarpx.geometry.coord_sys = 0 # Cartesian
+ pywarpx.geometry.prob_lo = self.lower_bound # physical domain
+ pywarpx.geometry.prob_hi = self.upper_bound
+
+ # Boundary conditions
+ pywarpx.boundary.field_lo = [BC_map[bc] for bc in [self.bc_xmin]]
+ pywarpx.boundary.field_hi = [BC_map[bc] for bc in [self.bc_xmax]]
+ pywarpx.boundary.particle_lo = [self.bc_xmin_particles]
+ pywarpx.boundary.particle_hi = [self.bc_xmax_particles]
+
+ if self.moving_window_velocity is not None and np.any(np.not_equal(self.moving_window_velocity, 0.)):
+ pywarpx.warpx.do_moving_window = 1
+ if self.moving_window_velocity[2] != 0.:
+ pywarpx.warpx.moving_window_dir = 'z'
+ pywarpx.warpx.moving_window_v = self.moving_window_velocity[2]/constants.c # in units of the speed of light
+
+ if self.refined_regions:
+ assert len(self.refined_regions) == 1, Exception('WarpX only supports one refined region.')
+ assert self.refined_regions[0][0] == 1, Exception('The one refined region can only be level 1')
+ pywarpx.amr.max_level = 1
+ pywarpx.warpx.fine_tag_lo = self.refined_regions[0][1]
+ pywarpx.warpx.fine_tag_hi = self.refined_regions[0][2]
+ # The refinement_factor is ignored (assumed to be [2,2])
+ else:
+ pywarpx.amr.max_level = 0
+
class Cartesian2DGrid(picmistandard.PICMI_Cartesian2DGrid):
def init(self, kw):
self.max_grid_size = kw.pop('warpx_max_grid_size', 32)
diff --git a/Regression/WarpX-tests.ini b/Regression/WarpX-tests.ini
index 0d4d1e997..05b3c0f53 100644
--- a/Regression/WarpX-tests.ini
+++ b/Regression/WarpX-tests.ini
@@ -912,6 +912,24 @@ particleTypes = electrons
analysisRoutine = Examples/analysis_default_regression.py
tolerance = 1.e-14
+[LaserAcceleration_1d]
+buildDir = .
+inputFile = Examples/Physics_applications/laser_acceleration/inputs_1d
+runtime_params = warpx.do_dynamic_scheduling=0 amr.n_cell=256 max_step=100 electrons.zmin=10.e-6 warpx.serialize_ics=1
+dim = 1
+addToCompileString =
+restartTest = 0
+useMPI = 1
+numprocs = 2
+useOMP = 1
+numthreads = 1
+compileTest = 0
+doVis = 0
+compareParticles = 1
+particleTypes = electrons
+analysisRoutine = Examples/analysis_default_regression.py
+tolerance = 1.e-14
+
[LaserAcceleration_single_precision_comms]
buildDir = .
inputFile = Examples/Physics_applications/laser_acceleration/inputs_3d
@@ -1606,6 +1624,25 @@ particleTypes = beam
analysisRoutine = Examples/analysis_default_regression.py
tolerance = 1.e-14
+[Python_PlasmaAcceleration_1d]
+buildDir = .
+inputFile = Examples/Physics_applications/plasma_acceleration/PICMI_inputs_plasma_acceleration_1d.py
+runtime_params =
+customRunCmd = python PICMI_inputs_plasma_acceleration_1d.py
+dim = 1
+addToCompileString = USE_PYTHON_MAIN=TRUE PYINSTALLOPTIONS="--user --prefix="
+restartTest = 0
+useMPI = 1
+numprocs = 2
+useOMP = 1
+numthreads = 1
+compileTest = 0
+doVis = 0
+compareParticles = 1
+particleTypes = beam
+analysisRoutine = Examples/analysis_default_regression.py
+tolerance = 1.e-14
+
[PlasmaAccelerationBoost3d]
buildDir = .
inputFile = Examples/Physics_applications/plasma_acceleration/inputs_3d_boost
diff --git a/requirements.txt b/requirements.txt
index aad3798f6..489be8c3f 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -3,7 +3,7 @@ numpy~=1.15
periodictable~=1.5
# PICMI
-picmistandard==0.0.16
+picmistandard==0.0.18
# for development against an unreleased PICMI version, use:
#picmistandard @ git+https://github.com/picmi-standard/picmi.git#subdirectory=PICMI_Python