Skip to content

Commit 6593444

Browse files
committed
hamiltonian method
1 parent 45f3e60 commit 6593444

File tree

3 files changed

+15
-3
lines changed

3 files changed

+15
-3
lines changed

src/laser/MultiLaser.H

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,6 @@ public:
190190
*/
191191
bool UseLaser (const int islice) const { return m_use_laser && HasSlice(islice); }
192192

193-
private:
194193

195194
bool m_use_laser {false}; /**< whether a laser is used or not */
196195
/** Laser central wavelength defined by user.

src/particles/plasma/PlasmaParticleContainer.H

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ struct PlasmaIdx
3232
ux_half_step, // momentum half a step behind the current slice for leapfrog pusher
3333
uy_half_step, // at the same step for AB5 pusher
3434
psi_half_step, // never effected by temp slice
35+
phi_ion,
3536
#ifdef HIPACE_USE_AB5_PUSH
3637
Fx1, Fx2, Fx3, Fx4, Fx5, // AB5 force terms
3738
Fy1, Fy2, Fy3, Fy4, Fy5, //
@@ -239,6 +240,7 @@ public:
239240
bool m_can_laser_injection = false; /**< whether laser injection is enabled */
240241
amrex::Real m_uz_threshold = 1.;
241242
amrex::Real m_injection_weight_factor = 1.;
243+
amrex::Real m_beta_p = 1.;
242244
std::string m_product_beam_name = ""; /**< name of Injection product beam */
243245
BeamParticleContainer* m_product_beam_pc = nullptr; /**< Injection product beam */
244246

src/particles/plasma/PlasmaParticleContainer.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ PlasmaParticleContainer::ReadParameters ()
7777
queryWithParser(pp, "can_laser_injection", m_can_laser_injection);
7878
queryWithParser(pp, "uz_threshold", m_uz_threshold);
7979
queryWithParser(pp, "injection_weight_factor", m_injection_weight_factor);
80+
queryWithParser(pp, "beta_p", m_beta_p);
8081

8182
m_can_ionize = m_can_field_ionize || m_can_laser_ionize;
8283

@@ -715,6 +716,7 @@ LaserIonization (const int islice,
715716
arrdata_elec[PlasmaIdx::w ][pidx] = arrdata_ion[PlasmaIdx::w ][ip];
716717
arrdata_elec[PlasmaIdx::ux ][pidx] = ux * phys_const.c;
717718
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;
718720
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
719721
arrdata_elec[PlasmaIdx::x_prev ][pidx] = arrdata_ion[PlasmaIdx::x_prev][ip];
720722
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
768770
const int ez_comp = Comps[WhichSlice::This]["Ez"];
769771
auto laser_geom = laser.GetLaserGeom();
770772

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+
771777
// This kernel marks the plasma particles that has been injected in the wake
772778
amrex::ParallelFor(num_particles,
773779
[=] AMREX_GPU_DEVICE (int ip) {
@@ -804,7 +810,12 @@ InjectionCondition (const int lev, const Fields& fields, const MultiLaser& laser
804810

805811
amrex::Real condition = uz - uz_condition; // condition for injection
806812

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){
808819
ptd_plasma.id(ip) = 3; // set the injected electron ID to 3
809820
}
810821
});
@@ -925,7 +936,7 @@ PlasmaToBeam (const MultiLaser& laser, amrex::Vector<amrex::Geometry> const& gm,
925936
amrex::Real psi = ptd_plasma.rdata(PlasmaIdx::psi)[ip];
926937
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;
927938
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));
929940
ptd_beam.rdata(BeamIdx::w)[pidx_beam] = ptd_plasma.rdata(PlasmaIdx::w)[ip] * gam / (psi) * f;
930941
// conservation of j_x and j_y
931942
ptd_beam.idata(BeamIdx::nsubcycles)[pidx_beam] = 0;

0 commit comments

Comments
 (0)