コード例 #1
0
ファイル: simulation.py プロジェクト: skuschel/fbpic
    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
コード例 #2
0
ファイル: simulation.py プロジェクト: EZoni/fbpic
    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
コード例 #3
0
                               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,