|
WarpX
|
#include <MultiParticleContainer.H>
Public Member Functions | |
| MultiParticleContainer (amrex::AmrCore *amr_core) | |
| ~MultiParticleContainer () | |
| WarpXParticleContainer & | GetParticleContainer (int ispecies) const |
| WarpXParticleContainer * | GetParticleContainerPtr (int ispecies) const |
| std::unique_ptr< WarpXParticleContainer > & | GetUniqueContainer (int ispecies) |
| std::array< amrex::Real, 3 > | meanParticleVelocity (int ispecies) |
| void | AllocData () |
| void | InitData () |
| void | Evolve (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, const amrex::MultiFab &Ex_avg, const amrex::MultiFab &Ey_avg, const amrex::MultiFab &Ez_avg, const amrex::MultiFab &Bx_avg, const amrex::MultiFab &By_avg, const amrex::MultiFab &Bz_avg, amrex::MultiFab &jx, amrex::MultiFab &jy, amrex::MultiFab &jz, amrex::MultiFab *cjx, amrex::MultiFab *cjy, amrex::MultiFab *cjz, amrex::MultiFab *rho, amrex::MultiFab *crho, const amrex::MultiFab *cEx, const amrex::MultiFab *cEy, const amrex::MultiFab *cEz, const amrex::MultiFab *cBx, const amrex::MultiFab *cBy, const amrex::MultiFab *cBz, amrex::Real t, amrex::Real dt, DtType a_dt_type=DtType::Full) |
| void | PushX (amrex::Real dt) |
| 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) |
| std::unique_ptr< amrex::MultiFab > | GetChargeDensity (int lev, bool local=false) |
| 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) |
| void | doCoulombCollisions () |
| void | doResampling (const int timestep) |
| This function loops over all species and performs resampling if appropriate. More... | |
| void | doQEDSchwinger () |
| void | Restart (const std::string &dir) |
| void | PostRestart () |
| void | ReadHeader (std::istream &is) |
| void | WriteHeader (std::ostream &os) const |
| void | SortParticlesByBin (amrex::IntVect bin_size) |
| void | Redistribute () |
| void | RedistributeLocal (const int num_ghost) |
| void | ApplyBoundaryConditions () |
| amrex::Vector< long > | NumberOfParticlesInGrid (int lev) const |
| void | Increment (amrex::MultiFab &mf, int lev) |
| void | SetParticleBoxArray (int lev, amrex::BoxArray &new_ba) |
| void | SetParticleDistributionMap (int lev, amrex::DistributionMapping &new_dm) |
| int | nSpecies () const |
| int | nSpeciesBackTransformedDiagnostics () const |
| int | mapSpeciesBackTransformedDiagnostics (int i) const |
| int | doBackTransformedDiagnostics () const |
| int | nSpeciesDepositOnMainGrid () const |
| int | nSpeciesGatherFromMainGrid () const |
| void | GetLabFrameData (const std::string &snapshot_name, const int i_lab, const int direction, const amrex::Real z_old, const amrex::Real z_new, const amrex::Real t_boost, const amrex::Real t_lab, const amrex::Real dt, amrex::Vector< WarpXParticleContainer::DiagnosticParticleData > &parts) const |
| void | ContinuousInjection (const amrex::RealBox &injection_box) const |
| void | UpdateContinuousInjectionPosition (amrex::Real dt) const |
| int | doContinuousInjection () const |
| std::vector< std::string > | GetSpeciesNames () const |
| PhysicalParticleContainer & | GetPCtmp () |
| 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) More... | |
| int | getSpeciesID (std::string product_str) const |
Public Attributes | |
| std::string | m_B_ext_particle_s = "default" |
| std::string | m_E_ext_particle_s = "default" |
| amrex::Vector< amrex::Real > | m_B_external_particle |
| amrex::Vector< amrex::Real > | m_E_external_particle |
| std::unique_ptr< ParserWrapper< 4 > > | m_Bx_particle_parser |
| std::unique_ptr< ParserWrapper< 4 > > | m_By_particle_parser |
| std::unique_ptr< ParserWrapper< 4 > > | m_Bz_particle_parser |
| std::unique_ptr< ParserWrapper< 4 > > | m_Ex_particle_parser |
| std::unique_ptr< ParserWrapper< 4 > > | m_Ey_particle_parser |
| std::unique_ptr< ParserWrapper< 4 > > | m_Ez_particle_parser |
Protected Types | |
| enum | PCTypes { PCTypes::Physical, PCTypes::RigidInjected, PCTypes::Photon } |
Protected Member Functions | |
| 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. More... | |
| 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. More... | |
| template<typename ... Args> | |
| amrex::MFItInfo | getMFItInfo (const WarpXParticleContainer &pc_src, Args const &... pc_dsts) const noexcept |
| void | InitQED () |
| int | NSpeciesQuantumSync () const |
| int | NSpeciesBreitWheeler () const |
| void | InitQuantumSync () |
| void | InitBreitWheeler () |
| void | QuantumSyncGenerateTable () |
| void | BreitWheelerGenerateTable () |
Static Protected Attributes | |
| static constexpr auto | m_default_quantum_sync_photon_creation_energy_threshold |
Private Member Functions | |
| void | ReadParameters () |
| void | mapSpeciesProduct () |
| void | MFItInfoCheckTiling (const WarpXParticleContainer &) const noexcept |
| template<typename First , typename ... Args> | |
| void | MFItInfoCheckTiling (const WarpXParticleContainer &pc_src, First const &pc_dst, Args const &... others) const noexcept |
| void | CheckIonizationProductSpecies () |
| void | CheckQEDProductSpecies () |
Private Attributes | |
| amrex::Vector< std::unique_ptr< WarpXParticleContainer > > | allcontainers |
| std::unique_ptr< PhysicalParticleContainer > | pc_tmp |
| int | nspecies_back_transformed_diagnostics = 0 |
| std::vector< int > | map_species_back_transformed_diagnostics |
| int | do_back_transformed_diagnostics = 0 |
The class MultiParticleContainer holds multiple instances of the polymorphic class WarpXParticleContainer, stored in its member variable "allcontainers". The class WarpX typically has a single (pointer to an) instance of MultiParticleContainer.
MultiParticleContainer typically has two types of functions:
|
strongprotected |
| MultiParticleContainer::MultiParticleContainer | ( | amrex::AmrCore * | amr_core | ) |
|
inline |
| void MultiParticleContainer::AllocData | ( | ) |
| void MultiParticleContainer::ApplyBoundaryConditions | ( | ) |
Apply BC. For now, just discard particles outside the domain, regardless of the whole simulation BC.
|
protected |
Called by InitBreitWheeler if a new table has to be generated.
|
private |
Should be called right after mapSpeciesProduct in InitData. It checks the physical correctness of product particle species selected by the user for ionization process.
|
private |
Should be called right after mapSpeciesProduct in InitData. It checks the physical correctness of product particle species selected by the user for QED processes.
| void MultiParticleContainer::ContinuousInjection | ( | const amrex::RealBox & | injection_box | ) | const |
|
inline |
| int MultiParticleContainer::doContinuousInjection | ( | ) | const |
| void MultiParticleContainer::doCoulombCollisions | ( | ) |
| void MultiParticleContainer::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 | ||
| ) |
|
protected |
Performs Breit-Wheeler process for the species for which it is enabled.
| void MultiParticleContainer::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)
|
protected |
Performs QED photon emission for the species for which it is enabled.
| void MultiParticleContainer::doQEDSchwinger | ( | ) |
If Schwinger process is activated, this function is called at every timestep in Evolve and is used to create Schwinger electron-positron pairs. Within this function we loop over all cells to calculate the number of created physical pairs. If this number is higher than 0, we create a single particle per species in this cell, with a weight corresponding to the number of physical particles.
| void MultiParticleContainer::doResampling | ( | const int | timestep | ) |
This function loops over all species and performs resampling if appropriate.
| [in] | timestep | the current timestep. |
| void MultiParticleContainer::Evolve | ( | 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, | ||
| const amrex::MultiFab & | Ex_avg, | ||
| const amrex::MultiFab & | Ey_avg, | ||
| const amrex::MultiFab & | Ez_avg, | ||
| const amrex::MultiFab & | Bx_avg, | ||
| const amrex::MultiFab & | By_avg, | ||
| const amrex::MultiFab & | Bz_avg, | ||
| amrex::MultiFab & | jx, | ||
| amrex::MultiFab & | jy, | ||
| amrex::MultiFab & | jz, | ||
| amrex::MultiFab * | cjx, | ||
| amrex::MultiFab * | cjy, | ||
| amrex::MultiFab * | cjz, | ||
| amrex::MultiFab * | rho, | ||
| amrex::MultiFab * | crho, | ||
| const amrex::MultiFab * | cEx, | ||
| const amrex::MultiFab * | cEy, | ||
| const amrex::MultiFab * | cEz, | ||
| const amrex::MultiFab * | cBx, | ||
| const amrex::MultiFab * | cBy, | ||
| const amrex::MultiFab * | cBz, | ||
| amrex::Real | t, | ||
| amrex::Real | dt, | ||
| DtType | a_dt_type = DtType::Full |
||
| ) |
This evolves all the particles by one PIC time step, including current deposition, the field solve, and pushing the particles, for all the species in the MultiParticleContainer. This is the electromagnetic version.
| std::unique_ptr< MultiFab > MultiParticleContainer::GetChargeDensity | ( | int | lev, |
| bool | local = false |
||
| ) |
This deposits the particle charge onto a node-centered MultiFab and returns a unique ptr to it. The charge density is accumulated over all the particles in the MultiParticleContainer
| void MultiParticleContainer::GetLabFrameData | ( | const std::string & | snapshot_name, |
| const int | i_lab, | ||
| const int | direction, | ||
| const amrex::Real | z_old, | ||
| const amrex::Real | z_new, | ||
| const amrex::Real | t_boost, | ||
| const amrex::Real | t_lab, | ||
| const amrex::Real | dt, | ||
| amrex::Vector< WarpXParticleContainer::DiagnosticParticleData > & | parts | ||
| ) | const |
|
inlineprotectednoexcept |
|
inline |
|
inline |
|
inline |
| int MultiParticleContainer::getSpeciesID | ( | std::string | product_str | ) | const |
|
inline |
|
inline |
| void MultiParticleContainer::Increment | ( | amrex::MultiFab & | mf, |
| int | lev | ||
| ) |
|
protected |
Initializes the Quantum Synchrotron engine
| void MultiParticleContainer::InitData | ( | ) |
|
protected |
Initialize QED engines and provides smart pointers to species who need QED processes
|
protected |
Initializes the Quantum Synchrotron engine
|
inline |
|
private |
|
inline |
|
inlineprivatenoexcept |
|
inlineprivatenoexcept |
|
inline |
|
inline |
|
inlineprotected |
Returns the number of species having Breit Wheeler process enabled
|
inline |
|
inline |
|
inlineprotected |
Returns the number of species having Quantum Synchrotron process enabled
| Vector< long > MultiParticleContainer::NumberOfParticlesInGrid | ( | int | lev | ) | const |
| void MultiParticleContainer::PostRestart | ( | ) |
| void MultiParticleContainer::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 | ||
| ) |
This pushes the particle momenta by dt for all the species in the MultiParticleContainer. It is used to desynchronize the particles after initializaton or when restarting from a checkpoint. It is also used to synchronize particles at the the end of the run. This is the electromagnetic version.
| void MultiParticleContainer::PushX | ( | amrex::Real | dt | ) |
This pushes the particle positions by one half time step for all the species in the MultiParticleContainer. It is used to desynchronize the particles after initializaton or when restarting from a checkpoint.
|
protected |
Called by InitQuantumSync if a new table has to be generated.
| void MultiParticleContainer::ReadHeader | ( | std::istream & | is | ) |
|
private |
| void MultiParticleContainer::Redistribute | ( | ) |
| void MultiParticleContainer::RedistributeLocal | ( | const int | num_ghost | ) |
| void MultiParticleContainer::Restart | ( | const std::string & | dir | ) |
| void MultiParticleContainer::SetParticleBoxArray | ( | int | lev, |
| amrex::BoxArray & | new_ba | ||
| ) |
| void MultiParticleContainer::SetParticleDistributionMap | ( | int | lev, |
| amrex::DistributionMapping & | new_dm | ||
| ) |
| void MultiParticleContainer::SortParticlesByBin | ( | amrex::IntVect | bin_size | ) |
| void MultiParticleContainer::UpdateContinuousInjectionPosition | ( | amrex::Real | dt | ) | const |
| void MultiParticleContainer::WriteHeader | ( | std::ostream & | os | ) | const |
|
protected |
|
private |
|
protected |
|
private |
|
protected |
| std::string MultiParticleContainer::m_B_ext_particle_s = "default" |
| amrex::Vector<amrex::Real> MultiParticleContainer::m_B_external_particle |
|
protected |
Whether to absorb particles exiting the domain
| std::unique_ptr<ParserWrapper<4> > MultiParticleContainer::m_Bx_particle_parser |
| std::unique_ptr<ParserWrapper<4> > MultiParticleContainer::m_By_particle_parser |
| std::unique_ptr<ParserWrapper<4> > MultiParticleContainer::m_Bz_particle_parser |
|
staticprotected |
Default value of the energy threshold for photon creation in Quantum Synchrotron process.
|
protected |
instead of depositing (current, charge) on the finest patch level, deposit to the coarsest grid
|
protected |
Whether or not to activate Schwinger process
| std::string MultiParticleContainer::m_E_ext_particle_s = "default" |
| amrex::Vector<amrex::Real> MultiParticleContainer::m_E_external_particle |
| std::unique_ptr<ParserWrapper<4> > MultiParticleContainer::m_Ex_particle_parser |
| std::unique_ptr<ParserWrapper<4> > MultiParticleContainer::m_Ey_particle_parser |
| std::unique_ptr<ParserWrapper<4> > MultiParticleContainer::m_Ez_particle_parser |
|
protected |
instead of gathering fields from the finest patch level, gather from the coarsest
|
protected |
|
protected |
|
protected |
Index for Schwinger electron product species in allcontainers
|
protected |
Name of Schwinger electron product species
|
protected |
Index for Schwinger positron product species in allcontainers
|
protected |
Name of Schwinger positron product species
|
protected |
If the number of physical Schwinger pairs created within a cell is higher than this threshold we use a Gaussian distribution rather than a Poisson distribution for the pair production rate calculations
|
protected |
Transverse size used in 2D Schwinger pair production rate calculations
|
protected |
Energy threshold for photon creation in Quantum Synchrotron process.
|
protected |
|
protected |
|
private |
|
private |
|
private |
|
protected |
|
protected |
1.8.13