11#ifndef WARPX_ParticleContainer_H_
12#define WARPX_ParticleContainer_H_
33#include <AMReX_Config.H>
113 std::string
const& current_fp_string,
117 bool skip_deposition=
false,
202 std::unique_ptr<amrex::MultiFab>
GetChargeDensity(
int lev,
bool local =
false);
211 void CalculateNuei (std::string
const & electron_species_name);
245 void Restart (
const std::string& dir);
255 bool sort_particles_for_deposition,
311 bool const onMainGrid =
true;
313 return static_cast<int>(std::count(
v.begin(),
v.end(), onMainGrid ));
318 bool const fromMainGrid =
true;
320 return static_cast<int>(std::count(
v.begin(),
v.end(), fromMainGrid ));
388 [[nodiscard]]
int getSpeciesID (
const std::string& product_str)
const;
420 enum struct PCTypes {Physical, RigidInjected, Photon};
437 template<
typename ...Args>
440 Args
const&... pc_dsts)
const noexcept
562 template<
typename First,
typename ...Args>
564 First
const& pc_dst, Args
const&... others)
const noexcept
568 "For particle creation processes, either all or none of the "
569 "particle species must use tiling.");
@ v
Definition RigidInjectedParticleContainer.H:27
#define WARPX_ALWAYS_ASSERT_WITH_MESSAGE(EX, MSG)
Definition TextMsg.H:13
PushType
Particle push scheme.
Definition WarpXAlgorithmSelection.H:170
@ Explicit
Standard leap-frog scheme.
Definition WarpXAlgorithmSelection.H:170
PositionPushType
For advanced collision algorithms that split the particle push in substeps.
Definition WarpXAlgorithmSelection.H:178
@ Full
Definition WarpXAlgorithmSelection.H:178
MomentumPushType
For advanced collision algorithms that split the particle push in substeps.
Definition WarpXAlgorithmSelection.H:185
@ Full
Definition WarpXAlgorithmSelection.H:185
SubcyclingHalf
Subcycling half selector.
Definition WarpXAlgorithmSelection.H:166
@ None
Definition WarpXAlgorithmSelection.H:166
Definition ExternalParticleFields.H:40
void SortParticlesByBin(const amrex::IntVect &bin_size, bool sort_particles_for_deposition, const amrex::IntVect &sort_idx_type)
Definition MultiParticleContainer.cpp:865
std::vector< std::string > GetLasersNames() const
Definition MultiParticleContainer.H:341
amrex::Vector< std::unique_ptr< WarpXParticleContainer > >::iterator begin()
Definition MultiParticleContainer.H:390
void deleteInvalidParticles()
Definition MultiParticleContainer.cpp:897
std::unique_ptr< amrex::Parser > m_Bz_particle_parser
Definition MultiParticleContainer.H:357
void InitQED()
Definition MultiParticleContainer.cpp:1272
std::unique_ptr< amrex::Parser > m_Ey_particle_parser
Definition MultiParticleContainer.H:360
std::unique_ptr< amrex::MultiFab > GetChargeDensity(int lev, bool local=false)
Definition MultiParticleContainer.cpp:686
int nLasers() const
Definition MultiParticleContainer.H:287
bool getDoBackTransformedParticles() const
Definition MultiParticleContainer.H:304
amrex::Real m_qed_schwinger_zmax
Definition MultiParticleContainer.H:540
void RedistributeLocal(const amrex::IntVect &max_cells_travelled)
Definition MultiParticleContainer.cpp:905
amrex::Real m_qed_schwinger_zmin
Definition MultiParticleContainer.H:539
void InitMultiPhysicsModules()
Definition MultiParticleContainer.cpp:463
std::string m_B_ext_particle_s
Definition MultiParticleContainer.H:352
void QuantumSyncGenerateTable()
Definition MultiParticleContainer.cpp:1435
MultiParticleContainer & operator=(MultiParticleContainer const &)=delete
amrex::Vector< amrex::ParticleReal > h_repeated_plasma_lens_strengths_E
Definition MultiParticleContainer.H:368
void AllocData()
Definition MultiParticleContainer.cpp:433
void SetParticleDistributionMap(int lev, amrex::DistributionMapping &new_dm)
Definition MultiParticleContainer.cpp:976
void InitData()
Definition MultiParticleContainer.cpp:443
amrex::Real m_qed_schwinger_ymin
Definition MultiParticleContainer.H:537
std::vector< bool > m_laser_deposit_on_main_grid
Definition MultiParticleContainer.H:430
void Evolve(ablastr::fields::MultiFabRegister &fields, int lev, std::string const ¤t_fp_string, amrex::Real t, amrex::Real dt, SubcyclingHalf subcycling_half=SubcyclingHalf::None, bool skip_deposition=false, PositionPushType position_push_type=PositionPushType::Full, MomentumPushType momentum_push_type=MomentumPushType::Full, ImplicitOptions const *implicit_options=nullptr)
This evolves all the particles by one PIC time step, including current deposition,...
Definition MultiParticleContainer.cpp:481
void Increment(amrex::MultiFab &mf, int lev)
Definition MultiParticleContainer.cpp:960
void mapSpeciesProduct()
Definition MultiParticleContainer.cpp:1037
void ContinuousInjection(const amrex::RealBox &injection_box) const
Definition MultiParticleContainer.cpp:989
amrex::Gpu::DeviceVector< amrex::ParticleReal > d_repeated_plasma_lens_lengths
Definition MultiParticleContainer.H:371
MultiParticleContainer(MultiParticleContainer const &)=delete
void doResampling(const amrex::Vector< amrex::Geometry > &geom, int timestep, bool verbose)
This function loops over all species and performs resampling if appropriate.
Definition MultiParticleContainer.cpp:1225
void DepositMassMatrices(ablastr::fields::MultiFabRegister &fields, int lev, amrex::Real dt)
Deposit mass matrices.
Definition MultiParticleContainer.cpp:529
amrex::Vector< std::unique_ptr< WarpXParticleContainer > >::iterator end()
Definition MultiParticleContainer.H:391
int NSpeciesBreitWheeler() const
Definition MultiParticleContainer.H:491
void CalculateNuei(std::string const &electron_species_name)
Definition MultiParticleContainer.cpp:824
void ReadHeader(std::istream &is)
Definition ParticleIO.cpp:231
static constexpr auto m_default_quantum_sync_photon_creation_energy_threshold
Definition MultiParticleContainer.H:475
void ApplyBoundaryConditions()
Definition MultiParticleContainer.cpp:920
std::vector< std::string > lasers_names
Definition MultiParticleContainer.H:424
amrex::Gpu::DeviceVector< amrex::ParticleReal > d_repeated_plasma_lens_starts
Definition MultiParticleContainer.H:370
bool m_do_qed_schwinger
Definition MultiParticleContainer.H:516
std::unique_ptr< amrex::Parser > m_By_particle_parser
Definition MultiParticleContainer.H:356
void PushX(amrex::Real dt)
This pushes the particle positions by one time step for all the species in the MultiParticleContainer...
Definition MultiParticleContainer.cpp:546
amrex::Vector< amrex::ParticleReal > h_repeated_plasma_lens_lengths
Definition MultiParticleContainer.H:367
std::string m_qed_schwinger_ele_product_name
Definition MultiParticleContainer.H:518
int m_nspecies_quantum_sync
Definition MultiParticleContainer.H:471
int m_qed_schwinger_ele_product
Definition MultiParticleContainer.H:522
int nSpecies() const
Definition MultiParticleContainer.H:286
int m_nspecies_breit_wheeler
Definition MultiParticleContainer.H:472
void MFItInfoCheckTiling(const WarpXParticleContainer &) const noexcept
Definition MultiParticleContainer.H:559
void InitQuantumSync()
Definition MultiParticleContainer.cpp:1303
std::shared_ptr< BreitWheelerEngine > m_shr_p_bw_engine
Definition MultiParticleContainer.H:460
void Redistribute()
Definition MultiParticleContainer.cpp:881
std::vector< PCTypes > species_types
Definition MultiParticleContainer.H:435
void PostRestart()
Definition MultiParticleContainer.cpp:453
int NSpeciesQuantumSync() const
Definition MultiParticleContainer.H:486
amrex::ParticleReal m_quantum_sync_photon_creation_energy_threshold
Definition MultiParticleContainer.H:480
amrex::ParticleReal maxParticleDtInv()
Definition MultiParticleContainer.cpp:417
WarpXParticleContainer & GetParticleContainerFromName(const std::string &name) const
Definition MultiParticleContainer.cpp:405
std::vector< std::string > species_names
Definition MultiParticleContainer.H:422
amrex::Box ComputeSchwingerGlobalBox() const
Definition MultiParticleContainer.cpp:1716
amrex::Gpu::DeviceVector< amrex::ParticleReal > d_repeated_plasma_lens_strengths_B
Definition MultiParticleContainer.H:373
amrex::Real m_qed_schwinger_ymax
Definition MultiParticleContainer.H:538
void doQEDSchwinger()
Definition MultiParticleContainer.cpp:1608
std::string m_E_ext_particle_s
Definition MultiParticleContainer.H:353
amrex::Real m_qed_schwinger_xmin
Definition MultiParticleContainer.H:535
int nSpeciesGatherFromMainGrid() const
Definition MultiParticleContainer.H:316
WarpXParticleContainer * GetParticleContainerPtr(int index) const
Definition MultiParticleContainer.H:86
void defineAllParticleTiles()
Definition MultiParticleContainer.cpp:889
void BreitWheelerGenerateTable()
Definition MultiParticleContainer.cpp:1524
std::unique_ptr< amrex::MultiFab > GetZeroChargeDensity(int lev)
This returns a MultiFAB filled with zeros. It is used to return the charge density when there is no p...
Definition MultiParticleContainer.cpp:565
void ReadParameters()
Definition MultiParticleContainer.cpp:130
int doContinuousInjection() const
Definition MultiParticleContainer.cpp:1009
amrex::Vector< amrex::ParticleReal > h_repeated_plasma_lens_strengths_B
Definition MultiParticleContainer.H:369
int nSpeciesDepositOnMainGrid() const
Definition MultiParticleContainer.H:309
void DepositTemperatures(ablastr::fields::MultiFabRegister &fields, amrex::Real relative_time)
Deposit temperature to species MFs. This is done for each species and can be used in the future for a...
Definition MultiParticleContainer.cpp:656
MultiParticleContainer & operator=(MultiParticleContainer &&)=default
std::unique_ptr< CollisionHandler > collisionhandler
Definition MultiParticleContainer.H:426
amrex::ParticleReal m_repeated_plasma_lens_period
Definition MultiParticleContainer.H:365
amrex::Real m_qed_schwinger_xmax
Definition MultiParticleContainer.H:536
bool m_params_initialized
Definition MultiParticleContainer.H:553
void doCollisions(int step, amrex::Real cur_time, amrex::Real dt)
Definition MultiParticleContainer.cpp:1219
void MFItInfoCheckTiling(const WarpXParticleContainer &pc_src, First const &pc_dst, Args const &... others) const noexcept
Definition MultiParticleContainer.H:563
int getSpeciesID(const std::string &product_str) const
Definition MultiParticleContainer.cpp:1088
amrex::Vector< amrex::Long > NumberOfParticlesInGrid(int lev) const
Definition MultiParticleContainer.cpp:937
void InitBreitWheeler()
Definition MultiParticleContainer.cpp:1375
void doFieldIonization(int lev, const amrex::MultiFab &Ex, const amrex::MultiFab &Ey, const amrex::MultiFab &Ez, const amrex::MultiFab &Bx, const amrex::MultiFab &By, const amrex::MultiFab &Bz)
Definition MultiParticleContainer.cpp:1153
amrex::Vector< amrex::Long > GetZeroParticlesInGrid(int lev) const
This returns a vector filled with zeros whose size is the number of boxes in the simulation boxarray....
Definition MultiParticleContainer.cpp:928
std::unique_ptr< amrex::MultiFab > GetGlobalPlasmaFrequency(int lev)
Definition MultiParticleContainer.cpp:708
bool m_do_back_transformed_particles
Definition MultiParticleContainer.H:557
void GenerateGlobalDebyeLength()
Definition MultiParticleContainer.cpp:749
void PushP(int lev, amrex::Real dt, const amrex::MultiFab &Ex, const amrex::MultiFab &Ey, const amrex::MultiFab &Ez, const amrex::MultiFab &Bx, const amrex::MultiFab &By, const amrex::MultiFab &Bz, MomentumPushType momentum_push_type)
Definition MultiParticleContainer.cpp:554
void TransformMomentumToCurvilinear(bool forward)
Definition MultiParticleContainer.cpp:426
std::array< amrex::ParticleReal, 3 > meanParticleVelocity(int index)
Definition MultiParticleContainer.H:91
amrex::Vector< std::unique_ptr< WarpXParticleContainer > > allcontainers
Definition MultiParticleContainer.H:547
void SetParticleBoxArray(int lev, amrex::BoxArray &new_ba)
Definition MultiParticleContainer.cpp:968
void doQedQuantumSync(int lev, const amrex::MultiFab &Ex, const amrex::MultiFab &Ey, const amrex::MultiFab &Ez, const amrex::MultiFab &Bx, const amrex::MultiFab &By, const amrex::MultiFab &Bz)
Performs QED photon emission for the species for which it is enabled.
Definition MultiParticleContainer.cpp:1875
WarpXParticleContainer & GetParticleContainer(int index) const
Definition MultiParticleContainer.H:83
void ScrapeParticlesAtEB(ablastr::fields::MultiLevelScalarField const &distance_to_eb)
Definition MultiParticleContainer.cpp:1248
void UpdateAntennaPosition(amrex::Real dt) const
Update antenna position for continuous injection of lasers in a boosted frame. Empty function for con...
Definition MultiParticleContainer.cpp:999
MultiParticleContainer(MultiParticleContainer &&)=default
void CheckIonizationProductSpecies()
Definition MultiParticleContainer.cpp:1237
std::unique_ptr< amrex::Parser > m_Ex_particle_parser
Definition MultiParticleContainer.H:359
void DepositCurrent(ablastr::fields::MultiLevelVectorField const &J, amrex::Real dt, amrex::Real relative_time, PushType push_type=PushType::Explicit)
Deposit current density.
Definition MultiParticleContainer.cpp:590
std::vector< std::string > GetSpeciesAndLasersNames() const
Definition MultiParticleContainer.H:343
amrex::Vector< amrex::ParticleReal > h_repeated_plasma_lens_starts
Definition MultiParticleContainer.H:366
int m_qed_schwinger_threshold_poisson_gaussian
Definition MultiParticleContainer.H:531
std::vector< bool > m_gather_from_main_grid
instead of gathering fields from the finest patch level, gather from the coarsest
Definition MultiParticleContainer.H:433
void doQedEvents(int lev, const amrex::MultiFab &Ex, const amrex::MultiFab &Ey, const amrex::MultiFab &Ez, const amrex::MultiFab &Bx, const amrex::MultiFab &By, const amrex::MultiFab &Bz)
Performs QED events (Breit-Wheeler process and photon emission).
Definition MultiParticleContainer.cpp:1778
void DepositCharge(const ablastr::fields::MultiLevelScalarField &rho, amrex::Real relative_time)
Deposit charge density.
Definition MultiParticleContainer.cpp:619
void CheckQEDProductSpecies()
Definition MultiParticleContainer.cpp:1956
amrex::Real m_qed_schwinger_y_size
Definition MultiParticleContainer.H:526
amrex::Gpu::DeviceVector< amrex::ParticleReal > d_repeated_plasma_lens_strengths_E
Definition MultiParticleContainer.H:372
int nContainers() const
Definition MultiParticleContainer.H:288
ExternalParticleFields m_external_particle_fields_metadata
Definition MultiParticleContainer.H:363
void WriteHeader(std::ostream &os) const
Definition ParticleIO.cpp:242
std::string m_qed_schwinger_pos_product_name
Definition MultiParticleContainer.H:520
void Restart(const std::string &dir)
Definition ParticleIO.cpp:129
std::vector< std::string > GetSpeciesNames() const
Definition MultiParticleContainer.H:339
void ContinuousFluxInjection(amrex::Real t, amrex::Real dt) const
Definition MultiParticleContainer.cpp:1025
int m_qed_schwinger_pos_product
Definition MultiParticleContainer.H:524
amrex::MFItInfo getMFItInfo(const WarpXParticleContainer &pc_src, Args const &... pc_dsts) const noexcept
Definition MultiParticleContainer.H:439
MultiParticleContainer(amrex::AmrCore *amr_core)
Definition MultiParticleContainer.cpp:96
std::unique_ptr< amrex::Parser > m_Ez_particle_parser
Definition MultiParticleContainer.H:361
std::shared_ptr< QuantumSynchrotronEngine > m_shr_p_qs_engine
Definition MultiParticleContainer.H:461
~MultiParticleContainer()=default
std::vector< bool > m_deposit_on_main_grid
instead of depositing (current, charge) on the finest patch level, deposit to the coarsest grid
Definition MultiParticleContainer.H:429
void SetDoBackTransformedParticles(bool do_back_transformed_particles)
Definition MultiParticleContainer.cpp:1112
PCTypes
Definition MultiParticleContainer.H:420
std::unique_ptr< amrex::Parser > m_Bx_particle_parser
Definition MultiParticleContainer.H:355
void doQedBreitWheeler(int lev, const amrex::MultiFab &Ex, const amrex::MultiFab &Ey, const amrex::MultiFab &Ez, const amrex::MultiFab &Bx, const amrex::MultiFab &By, const amrex::MultiFab &Bz)
Performs Breit-Wheeler process for the species for which it is enabled.
Definition MultiParticleContainer.cpp:1792
Definition WarpXParticleContainer.H:195
Long size() const noexcept
amrex_particle_real ParticleReal
PODVector< T, ArenaAllocator< T > > DeviceVector
constexpr auto c2
square of the vacuum speed of light [m^2/s^2]
Definition constant.H:221
constexpr auto m_e
electron mass [kg]
Definition constant.H:172
amrex::Vector< ScalarField > MultiLevelScalarField
Definition MultiFabRegister.H:210
amrex::Vector< VectorField > MultiLevelVectorField
Definition MultiFabRegister.H:218
bool notInLaunchRegion() noexcept
Definition ImplicitOptions.H:7
Definition MultiFabRegister.H:275
MFItInfo & SetDynamic(bool f) noexcept
MFItInfo & EnableTiling(const IntVect &ts=FabArrayBase::mfiter_tile_size) noexcept