#ifndef WARPX_LaserParticleContainer_H_ #define WARPX_LaserParticleContainer_H_ #include #include #include #include enum class laser_t { Null, Gaussian, Harris, parse_field_function }; class LaserParticleContainer : public WarpXParticleContainer { public: LaserParticleContainer (amrex::AmrCore* amr_core, int ispecies, const std::string& name); virtual ~LaserParticleContainer () {} virtual void InitData () final; #ifdef WARPX_DO_ELECTROSTATIC virtual void EvolveES (const amrex::Vector, 3> >& E, amrex::Vector >& rho, amrex::Real t, amrex::Real dt) { BL_ASSERT(false); } #endif // WARPX_DO_ELECTROSTATIC virtual void Evolve (int lev, const amrex::MultiFab&, const amrex::MultiFab&, const amrex::MultiFab&, const amrex::MultiFab&, const amrex::MultiFab&, const amrex::MultiFab&, amrex::MultiFab& jx, amrex::MultiFab& jy, amrex::MultiFab& jz, amrex::MultiFab*, amrex::MultiFab*, amrex::MultiFab*, amrex::MultiFab* rho, amrex::MultiFab* crho, const amrex::MultiFab*, const amrex::MultiFab*, const amrex::MultiFab*, const amrex::MultiFab*, const amrex::MultiFab*, const amrex::MultiFab*, amrex::Real t, amrex::Real dt, DtType a_dt_type=DtType::Full) final; virtual void PushP (int lev, amrex::Real dt, const amrex::MultiFab& , const amrex::MultiFab& , const amrex::MultiFab& , const amrex::MultiFab& , const amrex::MultiFab& , const amrex::MultiFab& ) final; virtual void PostRestart () final; void gaussian_laser_profile (const int np, amrex::Real const * AMREX_RESTRICT const Xp, amrex::Real const * AMREX_RESTRICT const Yp, amrex::Real t, amrex::Real * AMREX_RESTRICT const amplitude); void harris_laser_profile (const int np, amrex::Real const * AMREX_RESTRICT const Xp, amrex::Real const * AMREX_RESTRICT const Yp, amrex::Real t, amrex::Real * AMREX_RESTRICT const amplitude); void calculate_laser_plane_coordinates (const int np, const int thread_num, amrex::Real * AMREX_RESTRICT const pplane_Xp, amrex::Real * AMREX_RESTRICT const pplane_Yp); void update_laser_particle (const int np, amrex::ParticleReal * AMREX_RESTRICT const puxp, amrex::ParticleReal * AMREX_RESTRICT const puyp, amrex::ParticleReal * AMREX_RESTRICT const puzp, amrex::ParticleReal const * AMREX_RESTRICT const pwp, amrex::Real const * AMREX_RESTRICT const amplitude, const amrex::Real dt, const int thread_num); protected: std::string laser_name; private: // runtime paramters laser_t profile = laser_t::Null; amrex::Vector position; amrex::Vector nvec; amrex::Vector p_X; amrex::Vector stc_direction; long pusher_algo = -1; amrex::Real e_max = std::numeric_limits::quiet_NaN(); amrex::Real wavelength = std::numeric_limits::quiet_NaN(); amrex::Real Z0_lab = 0; // Position of the antenna in the lab frame long min_particles_per_mode = 4; // computed using runtime parameters amrex::Vector p_Y; amrex::Vector u_X; amrex::Vector u_Y; amrex::Real weight = std::numeric_limits::quiet_NaN(); amrex::Real mobility = std::numeric_limits::quiet_NaN(); // Gaussian profile amrex::Real profile_waist = std::numeric_limits::quiet_NaN(); amrex::Real profile_duration = std::numeric_limits::quiet_NaN(); amrex::Real profile_t_peak = std::numeric_limits::quiet_NaN(); amrex::Real profile_focal_distance = std::numeric_limits::quiet_NaN(); amrex::Real zeta = 0.; amrex::Real beta = 0.; amrex::Real phi2 = 0.; amrex::Real theta_stc = 0.; // parse_field_function profile WarpXParser parser; std::string field_function; // laser particle domain amrex::RealBox laser_injection_box; // Theoretical position of the antenna. Used if do_continuous_injection=1. // Track the position of the antenna until it enters the simulation domain. amrex::Vector updated_position; void ComputeSpacing (int lev, amrex::Real& Sx, amrex::Real& Sy) const; void ComputeWeightMobility (amrex::Real Sx, amrex::Real Sy); void InitData (int lev); // Inject the laser antenna during the simulation, if it started // outside of the simulation domain and enters it. void ContinuousInjection(const amrex::RealBox& injection_box) override; // Update position of the antenna void UpdateContinuousInjectionPosition(amrex::Real dt) override; }; #endif