diff options
-rwxr-xr-x | Examples/Physics_applications/laser_acceleration/PICMI_inputs_laser_acceleration.py | 3 | ||||
-rw-r--r-- | Examples/Physics_applications/laser_acceleration/inputs_1d | 66 | ||||
-rw-r--r-- | Examples/Physics_applications/plasma_acceleration/PICMI_inputs_plasma_acceleration_1d.py | 71 | ||||
-rw-r--r-- | Python/pywarpx/picmi.py | 51 | ||||
-rw-r--r-- | Regression/WarpX-tests.ini | 37 | ||||
-rw-r--r-- | requirements.txt | 2 |
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 |