#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) 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; 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 // 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