12#ifndef CD_ItoKMCPhysicsImplem_H
13#define CD_ItoKMCPhysicsImplem_H
24#include <CD_NamespaceHeader.H>
26using namespace Physics::ItoKMC;
30 CH_TIME(
"ItoKMCPhysics::ItoKMCPhysics");
57 CH_TIME(
"ItoKMCPhysics::~ItoKMCPhysics");
63 CH_TIME(
"ItoKMCPhysics::define");
73 const auto&
rhsPhotons = R.getNonReactiveProducts();
93 CH_TIME(
"ItoKMCPhysics::defineSpeciesMap");
111 CH_TIME(
"ItoKMCPhysics::defineKMC");
131 CH_TIME(
"ItoKMCPhysics::defineKMC");
145 CH_TIME(
"ItoKMCPhysics::definePhotoPathways");
161 const size_t&
src =
r.getSourcePhoton();
198 CH_TIME(
"ItoKMCPhysics::getSpeciesMap");
206 CH_TIME(
"ItoKMCPhysics::parseRuntimeOptions");
216 CH_TIME(
"ItoKMCPhysics::parsePPC");
228 CH_TIME(
"ItoKMCPhysics::parseDebug");
238 CH_TIME(
"ItoKMCPhysics::parseAlgorithm");
244 pp.get(
"algorithm",
str);
255 else if (
str ==
"explicit_euler") {
258 else if (
str ==
"midpoint") {
261 else if (
str ==
"prc") {
264 else if (
str ==
"implicit_euler") {
267 else if (
str ==
"hybrid_explicit_euler") {
270 else if (
str ==
"hybrid_midpoint") {
273 else if (
str ==
"hybrid_prc") {
276 else if (
str ==
"hybrid_implicit_euler") {
280 MayDay::Error(
"ItoKMCPhysics::parseAlgorithm - unknown algorithm requested");
350 CH_TIME(
"ItoKMCPhysics::advanceKMC");
370 auto computeCharge = [&]() ->
long long {
379 case SpeciesType::Ito: {
384 case SpeciesType::CDR: {
390 MayDay::Abort(
"ItoKMCPhysics::advanceKMC -- logic bust in computeCharge()");
410 case Algorithm::SSA: {
415 case Algorithm::ExplicitEuler: {
420 case Algorithm::Midpoint: {
425 case Algorithm::PRC: {
430 case Algorithm::ImplicitEuler: {
435 case Algorithm::HybridExplicitEuler: {
440 case Algorithm::HybridMidpoint: {
445 case Algorithm::HybridPRC: {
450 case Algorithm::HybridImplicitEuler: {
456 MayDay::Error(
"ItoKMCPhysics::advanceKMC - logic bust");
481 for (
int i = 0;
i < propensities.size();
i++) {
500 if (
N < std::numeric_limits<FPR>::max()) {
525 CH_TIMERS(
"ItoKMCPhysics::reconcileParticles");
526 CH_TIMER(
"ItoKMCPhysics::reconcileParticles::compute_downstream",
t1);
527 CH_TIMER(
"ItoKMCPhysics::reconcileParticles::particle_placement",
t2);
539 MayDay::Warning(
"ItoKMCPhysics::reconcileParticles - new number of particles is < 0 (overflow issue?)");
541 else if (
static_cast<long long>(
numNew) < 0
LL) {
542 MayDay::Warning(
"ItoKMCPhysics::reconcileParticles - integer overflow!");
546 MayDay::Warning(
"ItoKMCPhysics::reconcileParticles - old number of particles is < 0");
548 else if (
static_cast<long long>(
numOld) < 0
LL) {
549 MayDay::Warning(
"ItoKMCPhysics::reconcileParticles - integer overflow for old particles!");
562 if (m_particlePlacement == ParticlePlacement::Downstream) {
565 Z = m_itoSpecies[m_downstreamSpecies]->getChargeNumber();
569 v =
v /
v.vectorLength();
603 static_cast<long long>(m_maxNewParticles));
609 switch (m_particlePlacement) {
610 case ParticlePlacement::Centroid: {
615 case ParticlePlacement::Random: {
620 case ParticlePlacement::Downstream: {
638 MayDay::Error(
"ItoKMCPhysics::reconcileParticles - logic bust");
666 CH_TIME(
"ItoKMCPhysics::computeUpstreamPosition");
679 const int Z = (
a_Z > 0) ? 1 : (
a_Z < 0) ? -1 : 0;
688 Real D = std::numeric_limits<Real>::max();
692 const Real d =
x.dotProduct(
v);
706 MayDay::Abort(
"ItoKMCPhysics::computeUpstreamPosition - logic bust");
717 CH_TIME(
"ItoKMCPhysics::removeParticles");
719 constexpr long long zero = 0
LL;
731 if (
lit().weight() < 1.0) {
732 MayDay::Error(
"ItoKMCPhysics::removeParticles -- bad particle mass!");
750 MayDay::Error(
"ItoKMCPhysics::removeParticles: logic bust (trying to remove too many particles)");
758 ParticleManagement::deleteParticles(
a_particles, std::numeric_limits<Real>::min());
771 pout() <<
"ItoKMCPhysics::removeParticles: Error = " <<
errDiff <<
endl;
773 MayDay::Abort(
"ItoKMCPhysics::removeParticles - incorrect mass removed");
791 CH_TIME(
"ItoKMCPhysics::reconcilePhotons");
800 static_cast<long long>(m_maxNewPhotons));
817 CH_TIME(
"ItoKMCPhysics::reconcilePhotoionization");
824 if (m_photoPathways.find(
i) != m_photoPathways.end()) {
843 if (
type == SpeciesType::Ito) {
846 else if (
type == SpeciesType::CDR) {
850 MayDay::Error(
"CD_ItoKMCPhysics.H - logic bust in reconcilePhotoionization");
887 hop -= std::min(
d, 0.0) *
u;
893#include <CD_NamespaceFooter.H>
Agglomeration of useful data operations.
Main file for describing Ito-based plasma physics.
Real FPR
Numerical representation of the KMC state. Can be floating-point or integer type.
Definition CD_ItoKMCPhysics.H:44
SpeciesType
Map to species type.
Definition CD_ItoKMCPhysics.H:71
Namespace containing various particle management utilities.
File containing some useful static methods related to random number generation.
Declaration of various useful units.
static void computeMinValidBox(RealVect &a_lo, RealVect &a_hi, const RealVect a_normal, const RealVect a_centroid)
Compute the tightest possible valid box around a cut-cell volume.
Definition CD_DataOps.cpp:3581
A particle class for use with ItoSolvers, i.e. drifting Brownian walkers.
Definition CD_ItoParticle.H:40
Particle class for usage with Monte Carlo radiative transfer.
Definition CD_Photon.H:29
Reaction class for describing photoionization in ItoKMCPhysics.
Definition CD_ItoKMCPhotoReaction.H:31
int m_maxNewParticles
Maximum new number of particles generated by the chemistry advance.
Definition CD_ItoKMCPhysics.H:536
void reconcilePhotons(Vector< List< Photon > * > &a_newPhotons, const Vector< FPR > &a_numNewPhotons, const RealVect a_cellPos, const RealVect a_centroidPos, const RealVect a_lo, const RealVect a_hi, const RealVect a_bndryCentroid, const RealVect a_bndryNormal, const Real a_dx, const Real a_kappa) const noexcept
Generate new photons.
Definition CD_ItoKMCPhysicsImplem.H:780
int m_NSSA
Solver setting for the Cao et. al algorithm.
Definition CD_ItoKMCPhysics.H:553
bool m_incrementNewParticles
If true, increment onto existing particles rather than creating new ones.
Definition CD_ItoKMCPhysics.H:454
Vector< RefCountedPtr< RtSpecies > > m_rtSpecies
List of solver-tracked photon species.
Definition CD_ItoKMCPhysics.H:524
int m_downstreamSpecies
An internal integer describing which species is the "ionizing" species.
Definition CD_ItoKMCPhysics.H:531
virtual void updateReactionRates(std::vector< std::shared_ptr< const KMCReaction > > &a_kmcReactions, const RealVect a_E, const RealVect a_pos, const Vector< Real > &a_phi, const Vector< RealVect > &a_gradPhi, const Real a_dt, const Real a_dx, const Real a_kappa) const noexcept=0
Update reaction rates.
RealVect forwardIsotropicDiffusion(const ItoParticle &a_particle, const Real a_dt) const noexcept
Quasi-isotropic diffusion function for a particle which does not permit backward diffusion.
Definition CD_ItoKMCPhysicsImplem.H:877
Vector< DiffusionFunction > m_itoDiffusionFunctions
Diffusion functions for the various Ito species.
Definition CD_ItoKMCPhysics.H:509
Real m_eps
Solver setting for the Cao et. al. algorithm.
Definition CD_ItoKMCPhysics.H:570
bool m_debug
Turn on/off debugging.
Definition CD_ItoKMCPhysics.H:444
void reconcilePhotoionization(Vector< List< ItoParticle > * > &a_itoParticles, Vector< List< PointParticle > * > &a_cdrParticles, const Vector< List< Photon > * > &a_absorbedPhotons) const noexcept
Reconcile photoionization reactions.
Definition CD_ItoKMCPhysicsImplem.H:813
std::vector< Real > m_reactiveDtFactors
List of reactions that are a part of the time step limitation.
Definition CD_ItoKMCPhysics.H:491
int m_maxNewPhotons
Maximum new number of photons generated by the chemistry advance.
Definition CD_ItoKMCPhysics.H:541
void defineKMC() const noexcept
Define the KMC solver and state.
Definition CD_ItoKMCPhysicsImplem.H:109
RealVect isotropicDiffusion(const ItoParticle &a_particle, const Real a_dt) const noexcept
Isotropic diffusion function for a particle.
Definition CD_ItoKMCPhysicsImplem.H:865
void advanceKMC(Vector< FPR > &a_numParticles, Vector< FPR > &a_numNewPhotons, Real &a_physicsDt, const Vector< Real > &a_phi, const Vector< RealVect > &a_gradPhi, const Real a_dt, const RealVect a_E, const RealVect a_pos, const Real a_dx, const Real a_kappa) const
Advance the reaction network using the KMC algorithm.
Definition CD_ItoKMCPhysicsImplem.H:339
std::string m_className
Class name. Used for options parsing.
Definition CD_ItoKMCPhysics.H:439
bool computeUpstreamPosition(RealVect &a_pos, RealVect &a_lo, RealVect &a_hi, const int &a_Z, const List< ItoParticle > &a_particles, const RealVect &a_electricField, const RealVect &a_cellPos, const Real &a_dx) const noexcept
Compute the upstream position in a grid cell. Returns false if an upstream position was undefinable.
Definition CD_ItoKMCPhysicsImplem.H:657
const Vector< DiffusionFunction > & getItoDiffusionFunctions() const noexcept
Get diffusion functions.
Definition CD_ItoKMCPhysicsImplem.H:303
std::vector< ItoKMCPhotoReaction > m_photoReactions
List of photoionization reactions.
Definition CD_ItoKMCPhysics.H:486
const Vector< RefCountedPtr< RtSpecies > > & getRtSpecies() const
Get all photon species.
Definition CD_ItoKMCPhysicsImplem.H:297
Vector< RefCountedPtr< ItoSpecies > > m_itoSpecies
List of solver-tracked particle drift-diffusion species.
Definition CD_ItoKMCPhysics.H:514
Vector< RefCountedPtr< CdrSpecies > > m_cdrSpecies
List of solver-tracked fluid drift-diffusion species.
Definition CD_ItoKMCPhysics.H:519
Real m_exitTol
Exit tolerance for implicit KMC-leaping algorithms.
Definition CD_ItoKMCPhysics.H:575
virtual ~ItoKMCPhysics() noexcept
Destructor. Does nothing.
Definition CD_ItoKMCPhysicsImplem.H:55
static thread_local KMCSolverType m_kmcSolver
Kinetic Monte Carlo solver used in advanceReactionNetwork.
Definition CD_ItoKMCPhysics.H:464
void defineSpeciesMap() noexcept
Build internal representation of how we distinguish the Ito and CDR solvers.
Definition CD_ItoKMCPhysicsImplem.H:91
const Vector< RefCountedPtr< ItoSpecies > > & getItoSpecies() const
Get all particle drift-diffusion species.
Definition CD_ItoKMCPhysicsImplem.H:285
Real m_SSAlim
Solver setting for the Cao et. al. algorithm.
Definition CD_ItoKMCPhysics.H:564
void parseAlgorithm() noexcept
Parse reaction algorithm.
Definition CD_ItoKMCPhysicsImplem.H:236
int m_maxIter
Maximum number of iterations for implicit KMC-leaping algorithms.
Definition CD_ItoKMCPhysics.H:558
int m_Ncrit
Solver setting for the Cao et. al algorithm.
Definition CD_ItoKMCPhysics.H:547
const std::map< int, std::pair< SpeciesType, int > > & getSpeciesMap() const noexcept
Get the internal mapping between plasma species and Ito solvers.
Definition CD_ItoKMCPhysicsImplem.H:196
std::map< int, std::pair< std::discrete_distribution< int >, std::map< int, int > > > m_photoPathways
Random number generators for photoionization pathways.
Definition CD_ItoKMCPhysics.H:499
void reconcileParticles(Vector< List< ItoParticle > * > &a_particles, const Vector< FPR > &a_newNumParticles, const Vector< FPR > &a_oldNumParticles, const RealVect a_electricField, const RealVect a_cellPos, const RealVect a_centroidPos, const RealVect a_lo, const RealVect a_hi, const RealVect a_bndryCentroid, const RealVect a_bndryNormal, const Real a_dx, const Real a_kappa) const noexcept
Reconcile the number of particles.
Definition CD_ItoKMCPhysicsImplem.H:512
Algorithm m_algorithm
Algorithm to use for KMC advance.
Definition CD_ItoKMCPhysics.H:424
virtual void parseRuntimeOptions() noexcept
Parse run-time options.
Definition CD_ItoKMCPhysicsImplem.H:204
void removeParticles(List< ItoParticle > &a_particles, const long long a_numToRemove) const
Remove particles from the input list.
Definition CD_ItoKMCPhysicsImplem.H:715
const Vector< RefCountedPtr< CdrSpecies > > & getCdrSpecies() const
Get all fluid drift-diffusion species.
Definition CD_ItoKMCPhysicsImplem.H:291
static thread_local std::vector< std::shared_ptr< const KMCReaction > > m_kmcReactionsThreadLocal
KMC reactions used in advanceReactionNetowkr.
Definition CD_ItoKMCPhysics.H:476
std::vector< KMCReaction > m_kmcReactions
List of reactions for the KMC solver.
Definition CD_ItoKMCPhysics.H:481
int getNumPhotonSpecies() const
Return number of RTE solvers.
Definition CD_ItoKMCPhysicsImplem.H:327
int getNumPlasmaSpecies() const
Return total number of plasma species.
Definition CD_ItoKMCPhysicsImplem.H:321
int getNumItoSpecies() const
Return number of Ito solvers.
Definition CD_ItoKMCPhysicsImplem.H:309
virtual Real initialSigma(const Real a_time, const RealVect a_pos) const
Set initial surface charge. Default is 0, override if you want.
Definition CD_ItoKMCPhysicsImplem.H:333
void define() noexcept
Define method – defines all the internal machinery.
Definition CD_ItoKMCPhysicsImplem.H:61
std::map< int, std::pair< SpeciesType, int > > m_speciesMap
Map for associating a plasma species with an Ito solver or CDR solver.
Definition CD_ItoKMCPhysics.H:434
RealVect noDiffusion(const ItoParticle &a_particle, const Real a_dt) const noexcept
No diffusion function for a particle.
Definition CD_ItoKMCPhysicsImplem.H:859
void killKMC() const noexcept
Kill the KMC solver.
Definition CD_ItoKMCPhysicsImplem.H:129
void definePhotoPathways() noexcept
Define pathways for photo-reactions.
Definition CD_ItoKMCPhysicsImplem.H:143
void parsePPC() noexcept
Parse the maximum number of particles generated per cell.
Definition CD_ItoKMCPhysicsImplem.H:214
static thread_local bool m_hasKMCSolver
Is the KMC solver defined or not.
Definition CD_ItoKMCPhysics.H:459
int getNumCdrSpecies() const
Return number of CDR solvers.
Definition CD_ItoKMCPhysicsImplem.H:315
ParticlePlacement m_particlePlacement
Particle placement algorithm.
Definition CD_ItoKMCPhysics.H:429
void parseDebug() noexcept
Parse the maximum number of particles generated per cell.
Definition CD_ItoKMCPhysicsImplem.H:226
bool m_isDefined
Is defined or not.
Definition CD_ItoKMCPhysics.H:449
static thread_local KMCState m_kmcState
KMC state used in advanceReactionNetwork.
Definition CD_ItoKMCPhysics.H:469
ItoKMCPhysics() noexcept
Constructor. Does nothing.
Definition CD_ItoKMCPhysicsImplem.H:28
A particle class that only has a position and a weight.
Definition CD_PointParticle.H:29
static Real get(T &a_distribution)
For getting a random number from a user-supplied distribution. T must be a distribution for which we ...
Definition CD_RandomImplem.H:221
static RealVect getDirection()
Get a random direction in space.
Definition CD_RandomImplem.H:182
static Real getNormal01()
Get a number from a normal distribution centered on zero and variance 1.
Definition CD_RandomImplem.H:172
static RealVect randomPosition(const RealVect a_lo, const RealVect a_hi) noexcept
Return a random position in the cube (a_lo, a_hi);.
Definition CD_RandomImplem.H:289
Base class for a tracer particle solver. This solver can advance particles in a pre-defined velocity ...
Definition CD_TracerParticleSolver.H:37
TracerParticleSolver()
Default constructor.
Definition CD_TracerParticleSolverImplem.H:25
virtual Real computeDt() const
Write checkpoint data into HDF5 file. @paramo[out] a_handle HDF5 file.
Definition CD_TracerParticleSolverImplem.H:622
constexpr Real c
Speed of light.
Definition CD_Units.H:39