13#ifndef CD_ITOKMCPHYSICSIMPLEM_H
14#define CD_ITOKMCPHYSICSIMPLEM_H
25#include <CD_NamespaceHeader.H>
27using namespace Physics::ItoKMC;
31 CH_TIME(
"ItoKMCPhysics::ItoKMCPhysics");
58 CH_TIME(
"ItoKMCPhysics::~ItoKMCPhysics");
64 CH_TIME(
"ItoKMCPhysics::define");
74 const auto&
rhsPhotons = R.getNonReactiveProducts();
94 CH_TIME(
"ItoKMCPhysics::defineSpeciesMap");
112 CH_TIME(
"ItoKMCPhysics::defineKMC");
132 CH_TIME(
"ItoKMCPhysics::killKMC");
146 CH_TIME(
"ItoKMCPhysics::definePhotoPathways");
162 const size_t&
src =
r.getSourcePhoton();
199 CH_TIME(
"ItoKMCPhysics::getSpeciesMap");
207 CH_TIME(
"ItoKMCPhysics::parseRuntimeOptions");
217 CH_TIME(
"ItoKMCPhysics::parsePPC");
229 CH_TIME(
"ItoKMCPhysics::parseDebug");
239 CH_TIME(
"ItoKMCPhysics::parseAlgorithm");
245 pp.get(
"algorithm",
str);
256 else if (
str ==
"explicit_euler") {
259 else if (
str ==
"midpoint") {
262 else if (
str ==
"prc") {
265 else if (
str ==
"implicit_euler") {
268 else if (
str ==
"hybrid_explicit_euler") {
271 else if (
str ==
"hybrid_midpoint") {
274 else if (
str ==
"hybrid_prc") {
277 else if (
str ==
"hybrid_implicit_euler") {
281 MayDay::Error(
"ItoKMCPhysics::parseAlgorithm - unknown algorithm requested");
351 CH_TIME(
"ItoKMCPhysics::advanceKMC");
371 auto computeCharge = [&]() ->
long long {
380 case SpeciesType::Ito: {
385 case SpeciesType::CDR: {
391 MayDay::Abort(
"ItoKMCPhysics::advanceKMC -- logic bust in computeCharge()");
457 MayDay::Error(
"ItoKMCPhysics::advanceKMC - logic bust");
482 for (
int i = 0;
i < propensities.size();
i++) {
501 if (
N < std::numeric_limits<FPR>::max()) {
526 CH_TIMERS(
"ItoKMCPhysics::reconcileParticles");
527 CH_TIMER(
"ItoKMCPhysics::reconcileParticles::compute_downstream",
t1);
528 CH_TIMER(
"ItoKMCPhysics::reconcileParticles::particle_placement",
t2);
540 MayDay::Warning(
"ItoKMCPhysics::reconcileParticles - new number of particles is < 0 (overflow issue?)");
542 else if (
static_cast<long long>(
numNew) < 0
LL) {
543 MayDay::Warning(
"ItoKMCPhysics::reconcileParticles - integer overflow!");
547 MayDay::Warning(
"ItoKMCPhysics::reconcileParticles - old number of particles is < 0");
549 else if (
static_cast<long long>(
numOld) < 0
LL) {
550 MayDay::Warning(
"ItoKMCPhysics::reconcileParticles - integer overflow for old particles!");
563 if (m_particlePlacement == ParticlePlacement::Downstream) {
566 Z = m_itoSpecies[m_downstreamSpecies]->getChargeNumber();
570 v =
v /
v.vectorLength();
604 static_cast<long long>(m_maxNewParticles));
610 switch (m_particlePlacement) {
611 case ParticlePlacement::Centroid: {
616 case ParticlePlacement::Random: {
621 case ParticlePlacement::Downstream: {
639 MayDay::Error(
"ItoKMCPhysics::reconcileParticles - logic bust");
667 CH_TIME(
"ItoKMCPhysics::computeUpstreamPosition");
680 const int Z = (
a_Z > 0) ? 1 : (
a_Z < 0) ? -1 : 0;
689 Real D = std::numeric_limits<Real>::max();
693 const Real d =
x.dotProduct(
v);
707 MayDay::Abort(
"ItoKMCPhysics::computeUpstreamPosition - logic bust");
718 CH_TIME(
"ItoKMCPhysics::removeParticles");
720 constexpr long long zero = 0
LL;
732 if (
lit().weight() < 1.0) {
733 MayDay::Error(
"ItoKMCPhysics::removeParticles -- bad particle mass!");
751 MayDay::Error(
"ItoKMCPhysics::removeParticles: logic bust (trying to remove too many particles)");
759 ParticleManagement::deleteParticles(
a_particles, std::numeric_limits<Real>::min());
772 pout() <<
"ItoKMCPhysics::removeParticles: Error = " <<
errDiff <<
endl;
774 MayDay::Abort(
"ItoKMCPhysics::removeParticles - incorrect mass removed");
792 CH_TIME(
"ItoKMCPhysics::reconcilePhotons");
801 static_cast<long long>(m_maxNewPhotons));
818 CH_TIME(
"ItoKMCPhysics::reconcilePhotoionization");
825 if (m_photoPathways.find(
i) != m_photoPathways.end()) {
844 if (
type == SpeciesType::Ito) {
847 else if (
type == SpeciesType::CDR) {
851 MayDay::Error(
"CD_ItoKMCPhysics.H - logic bust in reconcilePhotoionization");
888 hop -= std::min(
d, 0.0) *
u;
894#include <CD_NamespaceFooter.H>
Agglomeration of useful data operations.
Declaration of the Physics::ItoKMC::ItoKMCPhysics abstract base class.
Real FPR
Floating-point type used to represent particle counts in the KMC state.
Definition CD_ItoKMCPhysics.H:45
SpeciesType
Tag for distinguishing species solved with an Ito diffusion or CDR fluid formalism.
Definition CD_ItoKMCPhysics.H:71
@ ImplicitEuler
Implicit Euler tau leaping.
@ Midpoint
Gillespie's midpoint method.
@ ExplicitEuler
Regular tau leaping.
@ PRC
Hu and Li's Poisson random correction method.
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:3687
A particle class for use with ItoSolvers, i.e. drifting Brownian walkers.
Definition CD_ItoParticle.H:41
Particle class for usage with Monte Carlo radiative transfer.
Definition CD_Photon.H:30
Reaction class for describing photoionization in ItoKMCPhysics.
Definition CD_ItoKMCPhotoReaction.H:32
int m_maxNewParticles
Maximum new number of particles generated by the chemistry advance.
Definition CD_ItoKMCPhysics.H:545
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:781
int m_NSSA
Solver setting for the Cao et. al algorithm.
Definition CD_ItoKMCPhysics.H:562
bool m_incrementNewParticles
If true, increment onto existing particles rather than creating new ones.
Definition CD_ItoKMCPhysics.H:464
Vector< RefCountedPtr< RtSpecies > > m_rtSpecies
List of solver-tracked photon species.
Definition CD_ItoKMCPhysics.H:533
int m_downstreamSpecies
An internal integer describing which species is the "ionizing" species.
Definition CD_ItoKMCPhysics.H:540
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:878
Vector< DiffusionFunction > m_itoDiffusionFunctions
Diffusion functions for the various Ito species.
Definition CD_ItoKMCPhysics.H:518
Real m_eps
Solver setting for the Cao et. al. algorithm.
Definition CD_ItoKMCPhysics.H:579
bool m_debug
Turn on/off debugging.
Definition CD_ItoKMCPhysics.H:454
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:814
std::vector< Real > m_reactiveDtFactors
List of reactions that are a part of the time step limitation.
Definition CD_ItoKMCPhysics.H:500
int m_maxNewPhotons
Maximum new number of photons generated by the chemistry advance.
Definition CD_ItoKMCPhysics.H:550
void defineKMC() const noexcept
Define the KMC solver and state.
Definition CD_ItoKMCPhysicsImplem.H:110
RealVect isotropicDiffusion(const ItoParticle &a_particle, const Real a_dt) const noexcept
Isotropic diffusion function for a particle.
Definition CD_ItoKMCPhysicsImplem.H:866
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:340
std::string m_className
Class name. Used for options parsing.
Definition CD_ItoKMCPhysics.H:449
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:658
const Vector< DiffusionFunction > & getItoDiffusionFunctions() const noexcept
Get diffusion functions for all Ito species.
Definition CD_ItoKMCPhysicsImplem.H:304
std::vector< ItoKMCPhotoReaction > m_photoReactions
List of photoionization reactions.
Definition CD_ItoKMCPhysics.H:495
const Vector< RefCountedPtr< RtSpecies > > & getRtSpecies() const
Get all photon species.
Definition CD_ItoKMCPhysicsImplem.H:298
Vector< RefCountedPtr< ItoSpecies > > m_itoSpecies
List of solver-tracked particle drift-diffusion species.
Definition CD_ItoKMCPhysics.H:523
Vector< RefCountedPtr< CdrSpecies > > m_cdrSpecies
List of solver-tracked fluid drift-diffusion species.
Definition CD_ItoKMCPhysics.H:528
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:334
Real m_exitTol
Exit tolerance for implicit KMC-leaping algorithms.
Definition CD_ItoKMCPhysics.H:584
virtual ~ItoKMCPhysics() noexcept
Destructor. Does nothing.
Definition CD_ItoKMCPhysicsImplem.H:56
static thread_local KMCSolverType m_kmcSolver
Kinetic Monte Carlo solver used in advanceReactionNetwork.
Definition CD_ItoKMCPhysics.H:474
void defineSpeciesMap() noexcept
Build internal representation of how we distinguish the Ito and CDR solvers.
Definition CD_ItoKMCPhysicsImplem.H:92
const Vector< RefCountedPtr< ItoSpecies > > & getItoSpecies() const
Get all particle drift-diffusion species.
Definition CD_ItoKMCPhysicsImplem.H:286
Real m_SSAlim
Solver setting for the Cao et. al. algorithm.
Definition CD_ItoKMCPhysics.H:573
void parseAlgorithm() noexcept
Parse reaction algorithm.
Definition CD_ItoKMCPhysicsImplem.H:237
int m_maxIter
Maximum number of iterations for implicit KMC-leaping algorithms.
Definition CD_ItoKMCPhysics.H:567
int m_Ncrit
Solver setting for the Cao et. al algorithm.
Definition CD_ItoKMCPhysics.H:556
const std::map< int, std::pair< SpeciesType, int > > & getSpeciesMap() const noexcept
Get the internal mapping from plasma-species index to solver type and solver index.
Definition CD_ItoKMCPhysicsImplem.H:197
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:508
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:513
@ HybridMidpoint
Hybrid SSA / midpoint (Cao et al.).
@ ImplicitEuler
Implicit tau-leaping with Euler steps.
@ SSA
Gillespie's Stochastic Simulation Algorithm (exact).
@ Midpoint
Explicit tau-leaping with midpoint (second-order) steps.
@ ExplicitEuler
Explicit tau-leaping with Euler steps.
@ HybridImplicitEuler
Hybrid SSA / implicit Euler (Cao et al.).
@ HybridPRC
Hybrid SSA / PRC (Cao et al.).
@ HybridExplicitEuler
Hybrid SSA / explicit Euler (Cao et al.).
@ PRC
Partially-rejected corrections tau-leaping.
Algorithm m_algorithm
Algorithm to use for KMC advance.
Definition CD_ItoKMCPhysics.H:434
virtual void parseRuntimeOptions() noexcept
Parse run-time options.
Definition CD_ItoKMCPhysicsImplem.H:205
@ Random
Place particles at a uniformly random position within the cell.
void removeParticles(List< ItoParticle > &a_particles, const long long a_numToRemove) const
Remove particles from the input list.
Definition CD_ItoKMCPhysicsImplem.H:716
const Vector< RefCountedPtr< CdrSpecies > > & getCdrSpecies() const
Get all fluid drift-diffusion species.
Definition CD_ItoKMCPhysicsImplem.H:292
static thread_local std::vector< std::shared_ptr< const KMCReaction > > m_kmcReactionsThreadLocal
Thread-local copies of KMC reactions used in advanceReactionNetwork.
Definition CD_ItoKMCPhysics.H:485
std::vector< KMCReaction > m_kmcReactions
List of reactions for the KMC solver.
Definition CD_ItoKMCPhysics.H:490
int getNumPhotonSpecies() const
Return number of RTE solvers.
Definition CD_ItoKMCPhysicsImplem.H:328
int getNumPlasmaSpecies() const
Return total number of plasma species.
Definition CD_ItoKMCPhysicsImplem.H:322
int getNumItoSpecies() const
Return number of Ito solvers.
Definition CD_ItoKMCPhysicsImplem.H:310
void define() noexcept
Define method – defines all the internal machinery.
Definition CD_ItoKMCPhysicsImplem.H:62
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:444
RealVect noDiffusion(const ItoParticle &a_particle, const Real a_dt) const noexcept
No diffusion function for a particle.
Definition CD_ItoKMCPhysicsImplem.H:860
void killKMC() const noexcept
Kill the KMC solver.
Definition CD_ItoKMCPhysicsImplem.H:130
void definePhotoPathways() noexcept
Define pathways for photo-reactions.
Definition CD_ItoKMCPhysicsImplem.H:144
void parsePPC() noexcept
Parse the maximum number of particles generated per cell.
Definition CD_ItoKMCPhysicsImplem.H:215
static thread_local bool m_hasKMCSolver
Is the KMC solver defined or not.
Definition CD_ItoKMCPhysics.H:469
int getNumCdrSpecies() const
Return number of CDR solvers.
Definition CD_ItoKMCPhysicsImplem.H:316
ParticlePlacement m_particlePlacement
Particle placement algorithm.
Definition CD_ItoKMCPhysics.H:439
void parseDebug() noexcept
Parse the maximum number of particles generated per cell.
Definition CD_ItoKMCPhysicsImplem.H:227
bool m_isDefined
Is defined or not.
Definition CD_ItoKMCPhysics.H:459
static thread_local KMCState m_kmcState
KMC state used in advanceReactionNetwork.
Definition CD_ItoKMCPhysics.H:479
ItoKMCPhysics() noexcept
Constructor. Does nothing.
Definition CD_ItoKMCPhysicsImplem.H:29
A particle class that only has a position and a weight.
Definition CD_PointParticle.H:30
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:217
static RealVect getDirection()
Get a random direction in space.
Definition CD_RandomImplem.H:180
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:284
Base class for a tracer particle solver. This solver can advance particles in a pre-defined velocity ...
Definition CD_TracerParticleSolver.H:38
TracerParticleSolver()
Default constructor.
Definition CD_TracerParticleSolverImplem.H:26
virtual Real computeDt() const
Compute dt = dx/max(v_x, v_y, v_z) minimized over all particles.
Definition CD_TracerParticleSolverImplem.H:623
constexpr Real c
Speed of light.
Definition CD_Units.H:40