Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add PICMI Scripts for LWFA Tests #2700

Merged
merged 24 commits into from
Jan 3, 2022
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
115 changes: 115 additions & 0 deletions Examples/Physics_applications/laser_acceleration/PICMI_inputs_1d.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
from pywarpx import picmi

# Physical constants
c = picmi.constants.c
q_e = picmi.constants.q_e

# Number of time steps
max_steps = 1000

# Number of cells
nz = 512

# Physical domain
zmin = -56e-06
zmax = 12e-06

# Domain decomposition
max_grid_size = 64
blocking_factor = 32

# Create grid
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 = [0., 0., c],
warpx_max_grid_size = max_grid_size,
warpx_blocking_factor = blocking_factor)

# Particles: plasma electrons
plasma_density = 2e23
plasma_xmin = None
plasma_ymin = None
plasma_zmin = 10e-06
plasma_xmax = None
plasma_ymax = None
plasma_zmax = None
uniform_distribution = picmi.UniformDistribution(
density = plasma_density,
lower_bound = [plasma_xmin, plasma_ymin, plasma_zmin],
upper_bound = [plasma_xmax, plasma_ymax, plasma_zmax],
fill_in = True)
electrons = picmi.Species(
particle_type = 'electron',
name = 'electrons',
initial_distribution = uniform_distribution)

# Laser
e_max = 16e12
position_z = 9e-06
profile_t_peak = 30.e-15
profile_focal_distance = 100e-06
laser = picmi.GaussianLaser(
wavelength = 0.8e-06,
waist = 5e-06,
duration = 15e-15,
focal_position = [0, 0, profile_focal_distance + position_z],
centroid_position = [0, 0, position_z - c*profile_t_peak],
propagation_direction = [0, 0, 1],
polarization_direction = [0, 1, 0],
E0 = e_max,
fill_in = False)
laser_antenna = picmi.LaserAntenna(
position = [0., 0., position_z],
normal_vector = [0, 0, 1])

# Electromagnetic solver
solver = picmi.ElectromagneticSolver(
grid = grid,
method = 'Yee',
cfl = 0.9,
divE_cleaning = 0)

# Diagnostics
diag_field_list = ["B", "E", "J", "rho"]
field_diag = picmi.FieldDiagnostic(
name = 'diag1',
grid = grid,
period = 1000,
data_list = diag_field_list)

# Set up simulation
sim = picmi.Simulation(
solver = solver,
max_steps = max_steps,
verbose = 1,
particle_shape = 'cubic',
warpx_use_filter = 1)

# Add plasma electrons
sim.add_species(
electrons,
layout = picmi.GriddedLayout(grid = grid, n_macroparticle_per_cell = [10]))

# Add laser
sim.add_laser(
laser,
injection_method = laser_antenna)

# Add diagnostics
sim.add_diagnostic(field_diag)

# Write input file that can be used to run with the compiled version
sim.write_input_file(file_name = 'inputs_1d_picmi')

# Initialize inputs and WarpX instance
sim.initialize_inputs()
sim.initialize_warpx()

# Advance simulation until last time step
sim.step(max_steps)
148 changes: 148 additions & 0 deletions Examples/Physics_applications/laser_acceleration/PICMI_inputs_2d.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
from pywarpx import picmi

# Physical constants
c = picmi.constants.c
q_e = picmi.constants.q_e

# Number of time steps
max_steps = 1000

# Number of cells
nx = 64
nz = 512

# Physical domain
xmin = -30e-06
xmax = 30e-06
zmin = -56e-06
zmax = 12e-06

# Domain decomposition
max_grid_size = 64
blocking_factor = 32

# Create grid
grid = picmi.Cartesian2DGrid(
number_of_cells = [nx, nz],
lower_bound = [xmin, zmin],
upper_bound = [xmax, zmax],
lower_boundary_conditions = ['open', 'open'],
upper_boundary_conditions = ['open', 'open'],
lower_boundary_conditions_particles = ['absorbing', 'absorbing'],
upper_boundary_conditions_particles = ['absorbing', 'absorbing'],
moving_window_velocity = [0., c],
warpx_max_grid_size = max_grid_size,
warpx_blocking_factor = blocking_factor)

# Particles: plasma electrons
plasma_density = 2e23
plasma_xmin = -20e-06
plasma_ymin = None
plasma_zmin = 10e-06
plasma_xmax = 20e-06
plasma_ymax = None
plasma_zmax = None
uniform_distribution = picmi.UniformDistribution(
density = plasma_density,
lower_bound = [plasma_xmin, plasma_ymin, plasma_zmin],
upper_bound = [plasma_xmax, plasma_ymax, plasma_zmax],
fill_in = True)
electrons = picmi.Species(
particle_type = 'electron',
name = 'electrons',
initial_distribution = uniform_distribution)

# Particles: beam electrons
q_tot = 1e-12
x_m = 0.
y_m = 0.
z_m = -28e-06
x_rms = 0.5e-06
y_rms = 0.5e-06
z_rms = 0.5e-06
ux_m = 0.
uy_m = 0.
uz_m = 500.
ux_th = 2.
uy_th = 2.
uz_th = 50.
gaussian_bunch_distribution = picmi.GaussianBunchDistribution(
n_physical_particles = q_tot / q_e,
rms_bunch_size = [x_rms, y_rms, z_rms],
rms_velocity = [c*ux_th, c*uy_th, c*uz_th],
centroid_position = [x_m, y_m, z_m],
centroid_velocity = [c*ux_m, c*uy_m, c*uz_m])
beam = picmi.Species(
particle_type = 'electron',
name = 'beam',
initial_distribution = gaussian_bunch_distribution)

# Laser
e_max = 16e12
position_z = 9e-06
profile_t_peak = 30.e-15
profile_focal_distance = 100e-06
laser = picmi.GaussianLaser(
wavelength = 0.8e-06,
waist = 5e-06,
duration = 15e-15,
focal_position = [0, 0, profile_focal_distance + position_z],
centroid_position = [0, 0, position_z - c*profile_t_peak],
propagation_direction = [0, 0, 1],
polarization_direction = [0, 1, 0],
E0 = e_max,
fill_in = False)
laser_antenna = picmi.LaserAntenna(
position = [0., 0., position_z],
normal_vector = [0, 0, 1])

# Electromagnetic solver
solver = picmi.ElectromagneticSolver(
grid = grid,
method = 'Yee',
cfl = 1.,
divE_cleaning = 0)

# Diagnostics
diag_field_list = ["B", "E", "J", "rho"]
field_diag = picmi.FieldDiagnostic(
name = 'diag1',
grid = grid,
period = 1000,
data_list = diag_field_list)

# Set up simulation
sim = picmi.Simulation(
solver = solver,
max_steps = max_steps,
verbose = 1,
particle_shape = 'cubic',
warpx_use_filter = 1)

# Add plasma electrons
sim.add_species(
electrons,
layout = picmi.GriddedLayout(grid = grid, n_macroparticle_per_cell = [1, 1, 1]))

# Add beam electrons
sim.add_species(
beam,
layout = picmi.PseudoRandomLayout(grid = grid, n_macroparticles = 100))

# Add laser
sim.add_laser(
laser,
injection_method = laser_antenna)

# Add diagnostics
sim.add_diagnostic(field_diag)

# Write input file that can be used to run with the compiled version
sim.write_input_file(file_name = 'inputs_2d_picmi')

# Initialize inputs and WarpX instance
sim.initialize_inputs()
sim.initialize_warpx()

# Advance simulation until last time step
sim.step(max_steps)
121 changes: 121 additions & 0 deletions Examples/Physics_applications/laser_acceleration/PICMI_inputs_3d.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
from pywarpx import picmi

# Physical constants
c = picmi.constants.c
q_e = picmi.constants.q_e

# Number of time steps
max_steps = 1000
ax3l marked this conversation as resolved.
Show resolved Hide resolved

# Number of cells
nx = 64
ny = 64
nz = 512

# Physical domain
xmin = -30e-06
xmax = 30e-06
ymin = -30e-06
ymax = 30e-06
zmin = -56e-06
zmax = 12e-06

# Domain decomposition
max_grid_size = 64
blocking_factor = 32

# Create grid
grid = picmi.Cartesian3DGrid(
number_of_cells = [nx, ny, nz],
lower_bound = [xmin, ymin, zmin],
upper_bound = [xmax, ymax, zmax],
lower_boundary_conditions = ['periodic', 'periodic', 'dirichlet'],
upper_boundary_conditions = ['periodic', 'periodic', 'dirichlet'],
lower_boundary_conditions_particles = ['periodic', 'periodic', 'absorbing'],
upper_boundary_conditions_particles = ['periodic', 'periodic', 'absorbing'],
moving_window_velocity = [0., 0., c],
warpx_max_grid_size = max_grid_size,
warpx_blocking_factor = blocking_factor)

# Particles: plasma electrons
plasma_density = 2e23
plasma_xmin = -20e-06
plasma_ymin = -20e-06
plasma_zmin = 10e-06
plasma_xmax = 20e-06
plasma_ymax = 20e-06
plasma_zmax = None
uniform_distribution = picmi.UniformDistribution(
density = plasma_density,
lower_bound = [plasma_xmin, plasma_ymin, plasma_zmin],
upper_bound = [plasma_xmax, plasma_ymax, plasma_zmax],
fill_in = True)
electrons = picmi.Species(
particle_type = 'electron',
name = 'electrons',
initial_distribution = uniform_distribution)

# Laser
e_max = 16e12
position_z = 9e-06
profile_t_peak = 30.e-15
profile_focal_distance = 100e-06
laser = picmi.GaussianLaser(
wavelength = 0.8e-06,
waist = 5e-06,
duration = 15e-15,
focal_position = [0, 0, profile_focal_distance + position_z],
centroid_position = [0, 0, position_z - c*profile_t_peak],
propagation_direction = [0, 0, 1],
polarization_direction = [0, 1, 0],
E0 = e_max,
fill_in = False)
laser_antenna = picmi.LaserAntenna(
position = [0., 0., position_z],
normal_vector = [0, 0, 1])

# Electromagnetic solver
solver = picmi.ElectromagneticSolver(
grid = grid,
method = 'Yee',
cfl = 1.,
divE_cleaning = 0)

# Diagnostics
diag_field_list = ["B", "E", "J", "rho"]
field_diag = picmi.FieldDiagnostic(
name = 'diag1',
grid = grid,
period = 1000,
data_list = diag_field_list)

# Set up simulation
sim = picmi.Simulation(
solver = solver,
max_steps = max_steps,
verbose = 1,
particle_shape = 'cubic',
warpx_use_filter = 1)

# Add plasma electrons
sim.add_species(
electrons,
layout = picmi.GriddedLayout(grid = grid, n_macroparticle_per_cell = [1, 1, 1]))

# Add laser
sim.add_laser(
laser,
injection_method = laser_antenna)

# Add diagnostics
sim.add_diagnostic(field_diag)

# Write input file that can be used to run with the compiled version
sim.write_input_file(file_name = 'inputs_3d_picmi')

# Initialize inputs and WarpX instance
sim.initialize_inputs()
sim.initialize_warpx()

# Advance simulation until last time step
sim.step(max_steps)
Loading