@@ -77,6 +77,7 @@ PlasmaParticleContainer::ReadParameters ()
77
77
queryWithParser (pp, " can_laser_injection" , m_can_laser_injection);
78
78
queryWithParser (pp, " uz_threshold" , m_uz_threshold);
79
79
queryWithParser (pp, " injection_weight_factor" , m_injection_weight_factor);
80
+ queryWithParser (pp, " beta_p" , m_beta_p);
80
81
81
82
m_can_ionize = m_can_field_ionize || m_can_laser_ionize;
82
83
@@ -715,6 +716,7 @@ LaserIonization (const int islice,
715
716
arrdata_elec[PlasmaIdx::w ][pidx] = arrdata_ion[PlasmaIdx::w ][ip];
716
717
arrdata_elec[PlasmaIdx::ux ][pidx] = ux * phys_const.c ;
717
718
arrdata_elec[PlasmaIdx::uy ][pidx] = uy * phys_const.c ;
719
+ arrdata_elec[PlasmaIdx::phi_ion][pidx] = std::sqrt (1 ._rt + ux*ux + uy*uy + uz*uz + 0 .5_rt*amrex::abs (A*A)) - m_beta_p * uz - 1 ._rt ;
718
720
arrdata_elec[PlasmaIdx::psi ][pidx] = std::sqrt (1 ._rt + ux*ux + uy*uy + uz*uz + 0 .5_rt*amrex::abs (A*A))-uz; // psi = gamma - uz
719
721
arrdata_elec[PlasmaIdx::x_prev ][pidx] = arrdata_ion[PlasmaIdx::x_prev][ip];
720
722
arrdata_elec[PlasmaIdx::y_prev ][pidx] = arrdata_ion[PlasmaIdx::y_prev][ip];
@@ -768,6 +770,10 @@ InjectionCondition (const int lev, const Fields& fields, const MultiLaser& laser
768
770
const int ez_comp = Comps[WhichSlice::This][" Ez" ];
769
771
auto laser_geom = laser.GetLaserGeom ();
770
772
773
+ amrex::Real a0 = laser.m_all_lasers [0 ].m_a0 ;
774
+ amrex::Real e_max = a0*a0/2 *std::pow ((1 +a0*a0/2 ),-0 .5_rt);
775
+ amrex::Real phi_min = e_max*e_max/2 - m_beta_p*std::sqrt ((1 +e_max*e_max/2 )*(1 +e_max*e_max/2 )-1 );
776
+
771
777
// This kernel marks the plasma particles that has been injected in the wake
772
778
amrex::ParallelFor (num_particles,
773
779
[=] AMREX_GPU_DEVICE (int ip) {
@@ -804,7 +810,12 @@ InjectionCondition (const int lev, const Fields& fields, const MultiLaser& laser
804
810
805
811
amrex::Real condition = uz - uz_condition; // condition for injection
806
812
807
- if (condition > 0 && Ezp < 0 ){
813
+ amrex::Real gam_p = std::sqrt (1 ._rt + ux*ux + uy*uy + uz*uz + 0 .5_rt*amrex::abs (A*A));
814
+ amrex::Real gam_p_inv = 1 /gam_p;
815
+ amrex::Real phi_ion = ptd_plasma.rdata (PlasmaIdx::phi_ion)[ip];
816
+ amrex::Real condition2 = phi_ion - phi_min + gam_p_inv - 1 ._rt ;
817
+
818
+ if (condition2 > 0 ){
808
819
ptd_plasma.id (ip) = 3 ; // set the injected electron ID to 3
809
820
}
810
821
});
@@ -925,7 +936,7 @@ PlasmaToBeam (const MultiLaser& laser, amrex::Vector<amrex::Geometry> const& gm,
925
936
amrex::Real psi = ptd_plasma.rdata (PlasmaIdx::psi)[ip];
926
937
ptd_beam.rdata (BeamIdx::uz)[pidx_beam] = (1 +ux*ux+uy*uy - psi*psi + 0 .5_rt*amrex::abs (A*A))/(2 .*psi)*phys_const.c ;
927
938
amrex::Real uz = ptd_beam.rdata (BeamIdx::uz)[pidx_beam] * clight_inv;
928
- const amrex::Real gam = std::sqrt (1 . + ux*ux + uy*uy + uz*uz);
939
+ const amrex::Real gam = std::sqrt (1 . + ux*ux + uy*uy + uz*uz + 0 .5_rt* amrex::abs (A*A) );
929
940
ptd_beam.rdata (BeamIdx::w)[pidx_beam] = ptd_plasma.rdata (PlasmaIdx::w)[ip] * gam / (psi) * f;
930
941
// conservation of j_x and j_y
931
942
ptd_beam.idata (BeamIdx::nsubcycles)[pidx_beam] = 0 ;
0 commit comments