import numpy as np from pywarpx import picmi constants = picmi.constants nx = 64 ny = 64 xmin = -20.e-6 ymin = -20.e-6 xmax = +20.e-6 ymax = +20.e-6 uniform_plasma = picmi.UniformDistribution( density=1.e25, upper_bound=[0., None, None], directed_velocity=[0.1 * constants.c, 0., 0.]) electrons = picmi.Species(particle_type='electron', name='electrons', initial_distribution=uniform_plasma) grid = picmi.Cartesian2DGrid( number_of_cells=[nx, ny], lower_bound=[xmin, ymin], upper_bound=[xmax, ymax], lower_boundary_conditions=['periodic', 'periodic'], upper_boundary_conditions=['periodic', 'periodic'], moving_window_velocity=[0., 0., 0.], warpx_max_grid_size=32)
grid = picmi.Cartesian3DGrid( number_of_cells=[nx, ny, nz], lower_bound=[xmin, ymin, zmin], upper_bound=[xmax, ymax, zmax], lower_boundary_conditions=['periodic', 'periodic', 'open'], upper_boundary_conditions=['periodic', 'periodic', 'open'], moving_window_velocity=moving_window_velocity, warpx_max_grid_size=32, warpx_coord_sys=0) solver = picmi.ElectromagneticSolver(grid=grid, cfl=1) beam_distribution = picmi.UniformDistribution( density=1.e23, lower_bound=[-20.e-6, -20.e-6, -150.e-6], upper_bound=[+20.e-6, +20.e-6, -100.e-6], directed_velocity=[0., 0., 1.e9]) plasma_distribution = picmi.UniformDistribution( density=1.e22, lower_bound=[-200.e-6, -200.e-6, 0.], upper_bound=[+200.e-6, +200.e-6, 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)
import numpy as np from pywarpx import picmi nr = 64 nz = 64 rmin = 0.e0 zmin = -20.e-6 rmax = +20.e-6 zmax = +20.e-6 uniform_plasma = picmi.UniformDistribution(density=1.e25, upper_bound=[None, None, 0.], directed_velocity=[0., 0., 0.1]) electrons = picmi.Species(particle_type='electron', name='electrons', initial_distribution=uniform_plasma) grid = picmi.CylindricalGrid( number_of_cells=[nr, nz], lower_bound=[rmin, zmin], upper_bound=[rmax, zmax], lower_boundary_conditions=['dirichlet', 'periodic'], upper_boundary_conditions=['dirichlet', 'periodic'], moving_window_velocity=[0., 0.], warpx_max_grid_size=32) solver = picmi.ElectromagneticSolver(grid=grid, cfl=1.) sim = picmi.Simulation(solver=solver,
ymin = 0.0 xmax = D_CA ymax = D_CA / nx * ny number_per_cell_each_dim = [32, 16] ########################## # physics components ########################## v_rms_elec = np.sqrt(constants.kb * T_ELEC / constants.m_e) v_rms_ion = np.sqrt(constants.kb * T_INERT / M_ION) uniform_plasma_elec = picmi.UniformDistribution( density = PLASMA_DENSITY, upper_bound = [None] * 3, rms_velocity = [v_rms_elec] * 3, directed_velocity = [0.] * 3 ) uniform_plasma_ion = picmi.UniformDistribution( density = PLASMA_DENSITY, upper_bound = [None] * 3, rms_velocity = [v_rms_ion] * 3, directed_velocity = [0.] * 3 ) electrons = picmi.Species( particle_type='electron', name='electrons', initial_distribution=uniform_plasma_elec ) ions = picmi.Species(
np.cos(laser_polarization), np.sin(laser_polarization), 0. ], propagation_direction=[0, 0, 1], E0=laser_a0 * 2. * np.pi * constants.m_e * constants.c**2 / (constants.q_e * laser_wavelength)) # Maximum amplitude of the laser field (in V/m) laser_antenna = picmi.LaserAntenna( position=[0., 0., laser_injection_loc], # This point is on the laser plane normal_vector=[0., 0., 1.]) # The plane normal direction # --- plasma uniform_plasma = picmi.UniformDistribution(density=plasma_density, lower_bound=plasma_min, upper_bound=plasma_max, fill_in=True) electrons = picmi.Species(particle_type='electron', name='electrons', initial_distribution=uniform_plasma) ########################## # numerics components ########################## grid = picmi.Cartesian3DGrid( number_of_cells=[nx, ny, nz], lower_bound=[xmin, ymin, zmin], upper_bound=[xmax, ymax, zmax], lower_boundary_conditions=['periodic', 'periodic', 'open'],
################################# ############ NUMERICS ########### ################################# serialize_initial_conditions = 1 verbose = 1 cfl = 1.0 # Order of particle shape factors particle_shape = 1 ################################# ############ PLASMA ############# ################################# elec_dist = picmi.UniformDistribution( density=plasma_density, rms_velocity=[elec_rms_velocity] * 3, directed_velocity=[elec_rms_velocity, 0., 0.]) ion_dist = picmi.UniformDistribution( density=plasma_density, rms_velocity=[ion_rms_velocity] * 3, ) electrons = picmi.Species( particle_type='electron', name='electron', warpx_do_not_deposit=1, initial_distribution=elec_dist, ) ions = picmi.Species(particle_type='H', name='ion',
xmin = -125e-6 ymin = -125e-6 zmin = -149e-6 xmax = 125e-6 ymax = 125e-6 zmax = 1e-6 ########################## # physics components ########################## uniform_plasma_elec = picmi.UniformDistribution( density=1e23, # number of electrons per m^3 lower_bound=[-1e-5, -1e-5, -149e-6], upper_bound=[1e-5, 1e-5, -129e-6], directed_velocity=[0., 0., 2000. * picmi.constants.c ] # uth the std of the (unitless) momentum ) electrons = picmi.Species(particle_type='electron', name='electrons', initial_distribution=uniform_plasma_elec, warpx_save_particles_at_xhi=1, warpx_save_particles_at_eb=1) ########################## # numerics components ########################## grid = picmi.Cartesian3DGrid(
density = 2.e24 epsilon0 = 0.001 * constants.c epsilon1 = 0.001 * constants.c epsilon2 = 0.001 * constants.c w0 = 5.e-6 n_osc_z = 3 # Wave vector of the wave k0 = 2. * np.pi * n_osc_z / (zmax - zmin) # Plasma frequency wp = np.sqrt((density * constants.q_e**2) / (constants.m_e * constants.ep0)) kp = wp / constants.c uniform_plasma = picmi.UniformDistribution(density=density, upper_bound=[+18e-6, +18e-6, None], directed_velocity=[0., 0., 0.]) momentum_expressions = [ """+ epsilon0/kp*2*x/w0**2*exp(-(x**2+y**2)/w0**2)*sin(k0*z) - epsilon1/kp*2/w0*exp(-(x**2+y**2)/w0**2)*sin(k0*z) + epsilon1/kp*4*x**2/w0**3*exp(-(x**2+y**2)/w0**2)*sin(k0*z) - epsilon2/kp*8*x/w0**2*exp(-(x**2+y**2)/w0**2)*sin(k0*z) + epsilon2/kp*8*x*(x**2-y**2)/w0**4*exp(-(x**2+y**2)/w0**2)*sin(k0*z)""", """+ epsilon0/kp*2*y/w0**2*exp(-(x**2+y**2)/w0**2)*sin(k0*z) + epsilon1/kp*4*x*y/w0**3*exp(-(x**2+y**2)/w0**2)*sin(k0*z) + epsilon2/kp*8*y/w0**2*exp(-(x**2+y**2)/w0**2)*sin(k0*z) + epsilon2/kp*8*y*(x**2-y**2)/w0**4*exp(-(x**2+y**2)/w0**2)*sin(k0*z)""", """- epsilon0/kp*k0*exp(-(x**2+y**2)/w0**2)*cos(k0*z) - epsilon1/kp*k0*2*x/w0*exp(-(x**2+y**2)/w0**2)*cos(k0*z) - epsilon2/kp*k0*4*(x**2-y**2)/w0**2*exp(-(x**2+y**2)/w0**2)*cos(k0*z)"""
warpx_blocking_factor=blocking_factor, refined_regions=[[ 1, [xmin_refined, zmin_refined], [xmax_refined, zmax_refined] ]]) # 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.
solver = picmi.ElectrostaticSolver( grid=grid, method='Multigrid', required_precision=1e-6, warpx_self_fields_verbosity=0 ) #embedded_boundary = picmi.EmbeddedBoundary( # implicit_function="-max(max(x-12.5e-6,-12.5e-6-x),max(z+6.15e-5,-8.65e-5-z))" #) ########################## # physics components ########################## uniform_plasma_elec = picmi.UniformDistribution( density = 1e15, # number of electrons per m^3 lower_bound = [-1e-5, -1e-5, -125e-6], upper_bound = [1e-5, 1e-5, -120e-6], directed_velocity = [0., 0., 5e6] # uth the std of the (unitless) momentum ) electrons = picmi.Species( particle_type='electron', name='electrons', initial_distribution=uniform_plasma_elec, warpx_save_particles_at_zhi=1, warpx_save_particles_at_zlo=1, warpx_reflection_model_zhi="0.5" ) ########################## # diagnostics ##########################
moving_window_velocity = None, warpx_max_grid_size = 32 ) solver = picmi.ElectrostaticSolver( grid=grid, method='Multigrid', required_precision=1e-6, warpx_self_fields_verbosity=0 ) ########################## # physics components ########################## uniform_plasma_elec = picmi.UniformDistribution( density = 1e15, upper_bound = [None] * 3, rms_velocity = [np.sqrt(constants.kb * 1e3 / constants.m_e)] * 3, directed_velocity = [0.] * 3 ) electrons = picmi.Species( particle_type='electron', name='electrons', initial_distribution=uniform_plasma_elec, warpx_save_previous_position=True ) ########################## # diagnostics ########################## field_diag = picmi.ParticleDiagnostic( species=electrons,
def setup_run(self): """Setup simulation components.""" ####################################################################### # Set geometry and boundary conditions # ####################################################################### self.grid = picmi.Cartesian1DGrid( number_of_cells=[self.nz], warpx_max_grid_size=128, lower_bound=[0], upper_bound=[self.gap], lower_boundary_conditions=['dirichlet'], upper_boundary_conditions=['dirichlet'], lower_boundary_conditions_particles=['absorbing'], upper_boundary_conditions_particles=['absorbing'], warpx_potential_hi_z=self.voltage, ) ####################################################################### # Field solver # ####################################################################### self.solver = picmi.ElectrostaticSolver(grid=self.grid, method='Multigrid', required_precision=1e-12, warpx_self_fields_verbosity=0) ####################################################################### # Particle types setup # ####################################################################### self.electrons = picmi.Species( particle_type='electron', name='electrons', initial_distribution=picmi.UniformDistribution( density=self.plasma_density, rms_velocity=[ np.sqrt(constants.kb * self.elec_temp / constants.m_e) ] * 3, )) self.ions = picmi.Species( particle_type='He', name='he_ions', charge='q_e', mass=self.m_ion, initial_distribution=picmi.UniformDistribution( density=self.plasma_density, rms_velocity=[ np.sqrt(constants.kb * self.gas_temp / self.m_ion) ] * 3, )) ####################################################################### # Collision initialization # ####################################################################### cross_sec_direc = '../../../../warpx-data/MCC_cross_sections/He/' mcc_electrons = picmi.MCCCollisions( name='coll_elec', species=self.electrons, background_density=self.gas_density, background_temperature=self.gas_temp, background_mass=self.ions.mass, scattering_processes={ 'elastic': { 'cross_section': cross_sec_direc + 'electron_scattering.dat' }, 'excitation1': { 'cross_section': cross_sec_direc + 'excitation_1.dat', 'energy': 19.82 }, 'excitation2': { 'cross_section': cross_sec_direc + 'excitation_2.dat', 'energy': 20.61 }, 'ionization': { 'cross_section': cross_sec_direc + 'ionization.dat', 'energy': 24.55, 'species': self.ions }, }) mcc_ions = picmi.MCCCollisions( name='coll_ion', species=self.ions, background_density=self.gas_density, background_temperature=self.gas_temp, scattering_processes={ 'elastic': { 'cross_section': cross_sec_direc + 'ion_scattering.dat' }, 'back': { 'cross_section': cross_sec_direc + 'ion_back_scatter.dat' }, # 'charge_exchange' : { # 'cross_section' : cross_sec_direc+'charge_exchange.dat' # } }) ####################################################################### # Initialize simulation # ####################################################################### self.sim = picmi.Simulation( solver=self.solver, time_step_size=self.dt, max_steps=self.max_steps, warpx_collisions=[mcc_electrons, mcc_ions], warpx_load_balance_intervals=self.max_steps // 5000, verbose=self.test) self.sim.add_species(self.electrons, layout=picmi.GriddedLayout( n_macroparticle_per_cell=[self.seed_nppc], grid=self.grid)) self.sim.add_species(self.ions, layout=picmi.GriddedLayout( n_macroparticle_per_cell=[self.seed_nppc], grid=self.grid)) ####################################################################### # Add diagnostics for the CI test to be happy # ####################################################################### field_diag = picmi.FieldDiagnostic( name='diag1', grid=self.grid, period=0, data_list=['rho_electrons', 'rho_he_ions'], write_dir='.', warpx_file_prefix='Python_background_mcc_1d_plt') self.sim.add_diagnostic(field_diag)