10 #ifndef WARPX_WarpXParticleContainer_H_ 11 #define WARPX_WarpXParticleContainer_H_ 24 #include <AMReX_Particles.H> 25 #include <AMReX_AmrCore.H> 58 yold,
zold, uxold, uyold, uzold,
77 :
public amrex::ParIter<0,0,PIdx::nattribs>
80 using amrex::ParIter<0,0,PIdx::nattribs>::ParIter;
84 WarpXParIter (ContainerType& pc,
int level, amrex::MFItInfo& info);
86 const std::array<RealVector, PIdx::nattribs>&
GetAttribs ()
const {
87 return GetStructOfArrays().GetRealData();
91 return GetStructOfArrays().GetRealData();
95 return GetStructOfArrays().GetRealData(comp);
99 return GetStructOfArrays().GetRealData(comp);
103 return GetStructOfArrays().GetIntData(comp);
132 :
public amrex::ParticleContainer<0,0,PIdx::nattribs>
136 #ifdef WARPX_USE_OPENPMD 152 virtual void InitData () = 0;
159 virtual void Evolve (
int lev,
160 const amrex::MultiFab& Ex,
const amrex::MultiFab& Ey,
const amrex::MultiFab& Ez,
161 const amrex::MultiFab& Bx,
const amrex::MultiFab& By,
const amrex::MultiFab& Bz,
162 const amrex::MultiFab& Ex_avg,
const amrex::MultiFab& Ey_avg,
const amrex::MultiFab& Ez_avg,
163 const amrex::MultiFab& Bx_avg,
const amrex::MultiFab& By_avg,
const amrex::MultiFab& Bz_avg,
164 amrex::MultiFab& jx, amrex::MultiFab& jy, amrex::MultiFab& jz,
165 amrex::MultiFab* cjx, amrex::MultiFab* cjy, amrex::MultiFab* cjz,
166 amrex::MultiFab* rho, amrex::MultiFab* crho,
167 const amrex::MultiFab* cEx,
const amrex::MultiFab* cEy,
const amrex::MultiFab* cEz,
168 const amrex::MultiFab* cBx,
const amrex::MultiFab* cBy,
const amrex::MultiFab* cBz,
171 virtual void PostRestart () = 0;
174 const amrex::Real ,
const amrex::Real ,
175 const amrex::Real ,
const amrex::Real ,
185 void PushX ( amrex::Real dt);
186 void PushX (
int lev, amrex::Real dt);
191 virtual void PushP (
int lev, amrex::Real dt,
192 const amrex::MultiFab& Ex,
193 const amrex::MultiFab& Ey,
194 const amrex::MultiFab& Ez,
195 const amrex::MultiFab& Bx,
196 const amrex::MultiFab& By,
197 const amrex::MultiFab& Bz) = 0;
199 void DepositCharge(amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rho,
200 bool local =
false,
bool reset =
false,
201 bool do_rz_volume_scaling =
false );
202 std::unique_ptr<amrex::MultiFab> GetChargeDensity(
int lev,
bool local =
false);
206 const int *
const ion_lev,
207 amrex::MultiFab* rho,
210 const long np_to_depose,
220 const int *
const ion_lev,
225 const long np_to_depose,
246 amrex::Real sumParticleCharge(
bool local =
false);
248 std::array<amrex::Real, 3> meanParticleVelocity(
bool local =
false);
250 amrex::Real maxParticleVelocity(
bool local =
false);
252 void AddNParticles (
int lev,
253 int n,
const amrex::ParticleReal*
x,
const amrex::ParticleReal* y,
const amrex::ParticleReal*
z,
254 const amrex::ParticleReal* vx,
const amrex::ParticleReal* vy,
const amrex::ParticleReal* vz,
255 int nattr,
const amrex::ParticleReal* attr,
int uniqueparticles, amrex::Long
id=-1);
257 virtual void ReadHeader (std::istream& is);
259 virtual void WriteHeader (std::ostream& os)
const;
263 static void ReadParameters ();
265 static void BackwardCompatibility ();
272 void ApplyBoundaryConditions (
ParticleBC boundary_conditions);
274 bool do_splitting =
false;
275 bool initialize_self_fields =
false;
276 amrex::Real self_fields_required_precision = 1.e-11;
281 using amrex::ParticleContainer<0, 0, PIdx::nattribs>::AddRealComp;
282 using amrex::ParticleContainer<0, 0, PIdx::nattribs>::AddIntComp;
286 particle_comps[
name] = NumRealComps();
293 particle_icomps[
name] = NumIntComps();
294 particle_runtime_icomps[
name] = NumIntComps() - 0;
308 amrex::ParticleReal
getMass ()
const {
return mass;}
323 bool m_do_random_filter =
false;
324 bool m_do_uniform_filter =
false;
325 bool m_do_parser_filter =
false;
326 amrex::Real m_random_fraction = 1.0;
327 int m_uniform_stride = 1;
335 template<PhysicalSpecies PhysSpec>
336 bool AmIA () const noexcept {
return (physical_species == PhysSpec);}
349 amrex::Array<amrex::Real,3> m_v_galilean = {{0}};
362 bool m_deposit_on_main_grid =
false;
365 bool m_gather_from_main_grid =
false;
368 int do_not_deposit = 0;
369 int do_not_gather = 0;
375 int do_continuous_injection = 0;
377 int do_field_ionization = 0;
381 int ionization_initial_level = 0;
388 int do_resampling = 0;
390 int do_back_transformed_diagnostics = 1;
393 bool m_do_qed =
false;
402 int m_qed_breit_wheeler_ele_product;
417 using TmpParticleTile = std::array<amrex::Gpu::DeviceVector<amrex::ParticleReal>,
419 using TmpParticles = amrex::Vector<std::map<PairIndex, TmpParticleTile> >;
430 void defineAllParticleTiles () noexcept;
433 virtual
void particlePostLocate(
ParticleType& p, const
amrex::ParticleLocData& pld,
434 const
int lev) override;
const RealVector & GetAttribs(int comp) const
Definition: WarpXParticleContainer.H:94
virtual void UpdateContinuousInjectionPosition(amrex::Real)
Definition: WarpXParticleContainer.H:240
ParticleBC
Definition: WarpXParticleContainer.H:29
Definition: WarpXParticleContainer.H:33
DtType
Definition: WarpXDtType.H:10
std::array< amrex::Gpu::DeviceVector< amrex::ParticleReal >, TmpIdx::nattribs > TmpParticleTile
Definition: WarpXParticleContainer.H:418
Definition: WarpXParticleContainer.H:36
virtual void GetParticleSlice(const int, const amrex::Real, const amrex::Real, const amrex::Real, const amrex::Real, const amrex::Real, DiagnosticParticles &)
Definition: WarpXParticleContainer.H:173
virtual void set_breit_wheeler_engine_ptr(std::shared_ptr< BreitWheelerEngine >)
Definition: WarpXParticleContainer.H:398
std::unique_ptr< ParserWrapper< 7 > > m_particle_filter_parser
Definition: WarpXParticleContainer.H:328
amrex::Vector< amrex::FArrayBox > local_rho
Definition: WarpXParticleContainer.H:410
amrex::Gpu::DeviceVector< amrex::Real > adk_power
Definition: WarpXParticleContainer.H:383
int m_qed_breit_wheeler_pos_product
Definition: WarpXParticleContainer.H:404
void AddRealComp(const std::string &name, bool comm=true)
Definition: WarpXParticleContainer.H:284
Definition: WarpXParticleContainer.H:45
std::map< std::string, int > getParticleRuntimeiComps() const noexcept
Definition: WarpXParticleContainer.H:303
RealVector & GetAttribs(int comp)
Definition: WarpXParticleContainer.H:98
std::map< std::string, int > particle_icomps
Definition: WarpXParticleContainer.H:351
IntVector & GetiAttribs(int comp)
Definition: WarpXParticleContainer.H:102
std::map< std::string, int > particle_runtime_icomps
Definition: WarpXParticleContainer.H:353
def x
Definition: read_lab_particles.py:25
int DoFieldIonization() const
Definition: WarpXParticleContainer.H:310
PhysicalSpecies
Definition: SpeciesPhysicalProperties.H:19
const std::array< RealVector, PIdx::nattribs > & GetAttribs() const
Definition: WarpXParticleContainer.H:86
tuple w
Definition: yt3d_mpi.py:43
Definition: WarpXParticleContainer.H:49
Definition: MultiParticleContainer.H:53
virtual void set_quantum_sync_engine_ptr(std::shared_ptr< QuantumSynchrotronEngine >)
Definition: WarpXParticleContainer.H:400
bool AmIA() const noexcept
Definition: WarpXParticleContainer.H:336
def uz
Definition: read_lab_particles.py:29
int DoQED() const
Definition: WarpXParticleContainer.H:311
virtual void ContinuousInjection(const amrex::RealBox &)
Definition: WarpXParticleContainer.H:238
virtual void ConvertUnits(ConvertDirection)
Definition: WarpXParticleContainer.H:261
amrex::ParticleReal getCharge() const
Definition: WarpXParticleContainer.H:306
amrex::Gpu::DeviceVector< amrex::Real > adk_prefactor
Definition: WarpXParticleContainer.H:384
def z
Definition: read_lab_particles.py:26
amrex::ParticleReal getMass() const
Definition: WarpXParticleContainer.H:308
Definition: WarpXParticleContainer.H:41
PhysicalSpecies physical_species
Definition: WarpXParticleContainer.H:359
std::map< std::string, int > getParticleComps() const noexcept
Definition: WarpXParticleContainer.H:300
amrex::Vector< amrex::FArrayBox > local_jz
Definition: WarpXParticleContainer.H:413
amrex::Vector< std::map< std::pair< int, int >, DiagnosticParticleData > > DiagnosticParticles
Definition: WarpXParticleContainer.H:147
virtual ~WarpXParticleContainer()
Definition: WarpXParticleContainer.H:150
amrex::StructOfArrays< DiagIdx::nattribs, 0 > DiagnosticParticleData
Definition: WarpXParticleContainer.H:142
int doBackTransformedDiagnostics() const
Definition: WarpXParticleContainer.H:298
std::map< std::string, int > particle_comps
Definition: WarpXParticleContainer.H:350
amrex::Real charge
Definition: WarpXParticleContainer.H:357
std::string ionization_product_name
Definition: WarpXParticleContainer.H:379
amrex::Gpu::DeviceVector< amrex::Real > ionization_energies
Definition: WarpXParticleContainer.H:382
TmpParticles tmp_particle_data
Definition: WarpXParticleContainer.H:422
int n
Definition: run_libensemble_on_warpx.py:68
void AddIntComp(const std::string &name, bool comm=true)
Definition: WarpXParticleContainer.H:291
int species_id
Definition: WarpXParticleContainer.H:355
amrex::Gpu::DeviceVector< amrex::Real > adk_exp_prefactor
Definition: WarpXParticleContainer.H:385
Definition: WarpXParticleContainer.H:37
Definition: WarpXParticleContainer.H:58
virtual bool has_quantum_sync() const
Definition: WarpXParticleContainer.H:319
Definition: WarpXParticleContainer.H:37
amrex::Array< amrex::Real, 3 > get_v_galilean()
Definition: WarpXParticleContainer.H:338
amrex::Vector< std::map< PairIndex, TmpParticleTile > > TmpParticles
Definition: WarpXParticleContainer.H:419
Definition: WarpXParticleContainer.H:63
std::string physical_element
Definition: WarpXParticleContainer.H:386
std::map< std::string, int > getParticleRuntimeComps() const noexcept
Definition: WarpXParticleContainer.H:302
int ionization_product
Definition: WarpXParticleContainer.H:378
name
Definition: run_automated.py:204
ConvertDirection
Definition: WarpXParticleContainer.H:31
std::map< std::string, int > particle_runtime_comps
Definition: WarpXParticleContainer.H:352
Definition: WarpXParticleContainer.H:37
std::string m_qed_quantum_sync_phot_product_name
Definition: WarpXParticleContainer.H:407
virtual void resample(const int)
Virtual method to resample the species. Overriden by PhysicalParticleContainer only. Empty body is here because making the method purely virtual would mean that we need to override the method for every derived class. Note that in practice this function is never called because resample() is only called for PhysicalParticleContainers.
Definition: WarpXParticleContainer.H:346
virtual bool has_breit_wheeler() const
Definition: WarpXParticleContainer.H:320
Definition: WarpXParticleContainer.H:39
std::string m_qed_breit_wheeler_ele_product_name
Definition: WarpXParticleContainer.H:403
const std::map< std::string, int > to_index
Definition: WarpXParticleContainer.H:65
std::pair< int, int > PairIndex
Definition: WarpXParticleContainer.H:416
amrex::Real mass
Definition: WarpXParticleContainer.H:358
amrex::Vector< amrex::FArrayBox > local_jx
Definition: WarpXParticleContainer.H:411
Definition: WarpXParticleContainer.H:59
std::string m_qed_breit_wheeler_pos_product_name
Definition: WarpXParticleContainer.H:405
int ion_atomic_number
Definition: WarpXParticleContainer.H:380
def ux
Definition: read_lab_particles.py:28
std::map< std::string, int > getParticleiComps() const noexcept
Definition: WarpXParticleContainer.H:301
Definition: WarpXParticleContainer.H:76
std::array< RealVector, PIdx::nattribs > & GetAttribs()
Definition: WarpXParticleContainer.H:90
Definition: WarpXParticleContainer.H:54
WarpXParticleContainer::ParticleType ParticleType
Definition: CollisionType.cpp:46
int m_qed_quantum_sync_phot_product
Definition: WarpXParticleContainer.H:406
friend MultiParticleContainer
Definition: WarpXParticleContainer.H:135
Definition: WarpXParticleContainer.H:131
amrex::Vector< amrex::FArrayBox > local_jy
Definition: WarpXParticleContainer.H:412
Definition: WarpXOpenPMD.H:83