#!/usr/bin/env python3 from pywarpx import picmi # Physical constants c = picmi.constants.c q_e = picmi.constants.q_e # Number of time steps max_steps = 100 # Number of cells nx = 32 ny = 32 nz = 256 # 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 = 0 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 = 100, data_list = diag_field_list, write_dir = '.', warpx_file_prefix = 'Python_LaserAcceleration_plt') # Set up simulation sim = picmi.Simulation( solver = solver, max_steps = max_steps, verbose = 1, particle_shape = 'cubic', warpx_use_filter = 1, warpx_serialize_ics = 1, warpx_do_dynamic_scheduling = 0) # 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)