def _create_new_fbpic_species(self, s, layout, initialize_self_field): # - For the case of a plasma defined in a gridded layout if (type(s.initial_distribution)==PICMI_AnalyticDistribution) and \ (type(layout) == PICMI_GriddedLayout): assert initialize_self_field == False import numexpr density_expression = s.initial_distribution.density_expression if s.density_scale is not None: density_expression = "%f*(%s)" \ %(s.density_scale, density_expression) def dens_func(z, r): n = numexpr.evaluate(density_expression) return n p_nr = layout.n_macroparticle_per_cell[0] p_nt = layout.n_macroparticle_per_cell[1] p_nz = layout.n_macroparticle_per_cell[2] fbpic_species = self.fbpic_sim.add_new_species( q=s.charge, m=s.mass, n=1., dens_func=dens_func, p_nz=p_nz, p_nr=p_nr, p_nt=p_nt, p_zmin=s.initial_distribution.lower_bound[-1], p_zmax=s.initial_distribution.upper_bound[-1], continuous_injection=s.initial_distribution.fill_in) # - For the case of a Gaussian beam elif (type(s.initial_distribution)==PICMI_GaussianBunchDistribution) \ and (type(layout) == PICMI_PseudoRandomLayout): dist = s.initial_distribution gamma0_beta0 = dist.centroid_velocity[-1] / c gamma0 = (1 + gamma0_beta0**2)**.5 sig_r = dist.rms_bunch_size[0] sig_z = dist.rms_bunch_size[-1] sig_gamma = dist.rms_velocity[-1] / c sig_vr = dist.rms_velocity[0] / gamma0 if sig_vr != 0: tf = -sig_r**2 / sig_vr**2 * dist.velocity_divergence[0] else: tf = 0. zf = dist.centroid_position[-1] + \ dist.centroid_velocity[-1]/gamma0 * tf # Calculate size at focus and emittance sig_r0 = (sig_r**2 - (sig_vr * tf)**2)**0.5 n_emit = gamma0 * sig_r0 * sig_vr / c # Get the number of physical particles n_physical_particles = dist.n_physical_particles if s.density_scale is not None: n_physical_particles *= s.density_scale fbpic_species = add_particle_bunch_gaussian( self.fbpic_sim, q=s.charge, m=s.mass, gamma0=gamma0, sig_gamma=sig_gamma, sig_r=sig_r0, sig_z=sig_z, n_emit=n_emit, n_physical_particles=n_physical_particles, n_macroparticles=layout.n_macroparticles, zf=zf, tf=tf, initialize_self_field=initialize_self_field) # - For the case of an empty species elif (s.initial_distribution is None) and (layout is None): fbpic_species = self.fbpic_sim.add_new_species(q=s.charge, m=s.mass) else: raise ValueError('Unknown combination of layout and distribution') return fbpic_species
def _create_new_fbpic_species(self, s, layout, injection_plane_position, injection_plane_normal_vector, initialize_self_field): # - For the case of a plasma/beam defined in a gridded layout if type(layout) == PICMI_GriddedLayout: # - Uniform distribution if type(s.initial_distribution) == PICMI_UniformDistribution: n0 = s.initial_distribution.density dens_func = None # - Analytic distribution elif type(s.initial_distribution) == PICMI_AnalyticDistribution: import numexpr density_expression = s.initial_distribution.density_expression if s.density_scale is not None: n0 = s.density_scale else: n0 = 1. def dens_func(x, y, z): d = locals() d.update(s.initial_distribution.user_defined_kw) n = numexpr.evaluate(density_expression, local_dict=d) return n else: raise ValueError( 'Unknown combination of layout and distribution') p_nr = layout.n_macroparticle_per_cell[0] p_nt = layout.n_macroparticle_per_cell[1] p_nz = layout.n_macroparticle_per_cell[2] if initialize_self_field or (injection_plane_position is not None): assert s.initial_distribution.fill_in != True if injection_plane_position is None: z_injection_plane = None else: z_injection_plane = injection_plane_position[-1] gamma0_beta0 = s.initial_distribution.directed_velocity[-1] / c gamma0 = (1 + gamma0_beta0**2)**.5 dist = s.initial_distribution fbpic_species = add_particle_bunch( self.fbpic_sim, q=s.charge, m=s.mass, gamma0=gamma0, n=n0, dens_func=dens_func, p_nz=p_nz, p_nr=p_nr, p_nt=p_nt, p_zmin=dist.lower_bound[-1] if dist.lower_bound[-1] is not None else -np.inf, p_zmax=dist.upper_bound[-1] if dist.upper_bound[-1] is not None else +np.inf, p_rmin=0, p_rmax=dist.upper_bound[0] if dist.upper_bound[0] is not None else +np.inf, boost=self.fbpic_sim.boost, z_injection_plane=z_injection_plane, initialize_self_field=initialize_self_field, boost_positions_in_dens_func=True) else: dist = s.initial_distribution fbpic_species = self.fbpic_sim.add_new_species( q=s.charge, m=s.mass, n=n0, dens_func=dens_func, p_nz=p_nz, p_nr=p_nr, p_nt=p_nt, p_zmin=dist.lower_bound[-1] if dist.lower_bound[-1] is not None else -np.inf, p_zmax=dist.upper_bound[-1] if dist.upper_bound[-1] is not None else +np.inf, p_rmax=dist.upper_bound[0] if dist.upper_bound[0] is not None else +np.inf, continuous_injection=s.initial_distribution.fill_in, boost_positions_in_dens_func=True) # - For the case of a Gaussian beam elif (type(s.initial_distribution)==PICMI_GaussianBunchDistribution) \ and (type(layout) == PICMI_PseudoRandomLayout): dist = s.initial_distribution gamma0_beta0 = dist.centroid_velocity[-1] / c gamma0 = (1 + gamma0_beta0**2)**.5 sig_r = dist.rms_bunch_size[0] sig_z = dist.rms_bunch_size[-1] sig_gamma = dist.rms_velocity[-1] / c sig_vr = dist.rms_velocity[0] / gamma0 if sig_vr != 0: tf = -sig_r**2 / sig_vr**2 * dist.velocity_divergence[0] else: tf = 0. zf = dist.centroid_position[-1] + \ dist.centroid_velocity[-1]/gamma0 * tf # Calculate size at focus and emittance sig_r0 = (sig_r**2 - (sig_vr * tf)**2)**0.5 n_emit = gamma0 * sig_r0 * sig_vr / c # Get the number of physical particles n_physical_particles = dist.n_physical_particles if s.density_scale is not None: n_physical_particles *= s.density_scale fbpic_species = add_particle_bunch_gaussian( self.fbpic_sim, q=s.charge, m=s.mass, gamma0=gamma0, sig_gamma=sig_gamma, sig_r=sig_r0, sig_z=sig_z, n_emit=n_emit, n_physical_particles=n_physical_particles, n_macroparticles=layout.n_macroparticles, zf=zf, tf=tf, boost=self.fbpic_sim.boost, initialize_self_field=initialize_self_field) # - For the case of an empty species elif (s.initial_distribution is None) and (layout is None): fbpic_species = self.fbpic_sim.add_new_species(q=s.charge, m=s.mass) else: raise ValueError('Unknown combination of layout and distribution') return fbpic_species
n=n_e, dens_func=dens_func, p_zmin=p_zmin, p_zmax=p_zmax, p_rmax=p_rmax, p_nz=p_nz, p_nr=p_nr, p_nt=p_nt) beam = add_particle_bunch_gaussian( sim, q=-e, m=m_e, sig_r=sig_r, sig_z=sig_z, n_emit=0, #initial emittance is 0 gamma0=gamma0, sig_gamma=sig_gamma, n_physical_particles=Qtot / e, n_macroparticles=5000, zf=L0, tf=(L0 - z0Beam) / c, z_injection_plane=L0) # Load initial fields # Add a laser to the fields of the simulation #add_laser( sim, a0, w0, ctau, z0 ) #add_laser_pulse(sim,PulseTrain_profile,method="antenna",z0_antenna=z0Antenna,v_antenna=0) #fw_propagating=True add_laser_pulse(sim, UniformPulseTrainN(NumberOfPulses, UniformPulseSpacing), method="antenna", z0_antenna=z0Antenna,