13#ifndef CD_ITOKMCSTREAMERTAGGERIMPLEM_H
14#define CD_ITOKMCSTREAMERTAGGERIMPLEM_H
21#include <CD_NamespaceHeader.H>
23using namespace Physics::ItoKMC;
28 CH_TIME(
"ItoKMCStreamerTagger::ItoKMCStreamerTagger");
30 this->m_name =
"ItoKMCStreamerTagger";
31 this->m_numTagFields = 2;
40 const RefCountedPtr<S>& a_timeStepper,
41 const RefCountedPtr<AmrMesh>& a_amr) noexcept
44 CH_TIME(
"ItoKMCStreamerTagger::ItoKMCStreamerTagger");
45 if (this->m_verbosity > 5) {
46 pout() <<
"ItoKMCStreamerTagger::ItoKMCStreamerTagger" << endl;
49 this->define(a_physics, a_timeStepper, a_amr);
56 CH_TIME(
"ItoKMCStreamerTagger::parseOptions");
57 if (this->m_verbosity > 5) {
58 pout() <<
"ItoKMCStreamerTagger::parseOptions" << endl;
61 this->parseVerbosity();
62 this->parseTagBoxes();
63 this->parseRefinementBoxes();
66 ParmParse pp(this->m_name.c_str());
67 pp.get(
"coarsen_curvature", this->m_coarsenCurvature);
68 pp.get(
"refine_curvature", this->m_refineCurvature);
69 pp.get(
"refine_alpha", this->m_refineAlpha);
70 pp.get(
"coarsen_alpha", this->m_coarsenAlpha);
71 pp.get(
"max_coarsen_lvl", this->m_maxCoarsenLevel);
78 CH_TIME(
"ItoKMCStreamerTagger::parseRuntimeOptions");
79 if (this->m_verbosity > 5) {
80 pout() <<
"ItoKMCStreamerTagger::parseRuntimeOptions" << endl;
83 this->parseVerbosity();
84 this->parseTagBoxes();
85 this->parseRefinementBoxes();
88 ParmParse pp(this->m_name.c_str());
89 pp.get(
"coarsen_curvature", this->m_coarsenCurvature);
90 pp.get(
"refine_curvature", this->m_refineCurvature);
91 pp.get(
"refine_alpha", this->m_refineAlpha);
92 pp.get(
"coarsen_alpha", this->m_coarsenAlpha);
93 pp.get(
"max_coarsen_lvl", this->m_maxCoarsenLevel);
104 const RealVect& a_gradE,
105 const Real a_minGradE,
106 const Real a_maxGradE)
const noexcept
108 CH_TIME(
"ItoKMCStreamerTagger::computeTagFields");
109 if (this->m_verbosity > 5) {
110 pout() <<
"ItoKMCStreamerTagger::computeTagFields" << endl;
113 Vector<Real> tagFields(this->m_numTagFields);
115 const Real E = a_E.vectorLength();
116 tagFields[0] = E / a_maxE;
117 tagFields[1] = this->m_physics->computeAlpha(E, a_pos) * a_dx;
118 tagFields[1] -= this->m_physics->computeEta(E, a_pos) * a_dx;
129 const Vector<Real>& a_tagFields,
130 const Vector<RealVect>& a_gradTagFields)
const noexcept
132 CH_TIME(
"ItoKMCStreamerTagger::coarsenCell");
133 if (this->m_verbosity > 5) {
134 pout() <<
"ItoKMCStreamerTagger::coarsenCell" << endl;
137 bool coarsen =
false;
139 if (a_lvl >= m_maxCoarsenLevel) {
140 const Real E = a_tagFields[0];
141 const Real alphaDx = a_tagFields[1];
142 const RealVect gradE = a_gradTagFields[0];
144 const bool coarsenCurv = gradE.vectorLength() * a_dx / E < m_coarsenCurvature;
145 const bool coarsenAlpha = alphaDx < m_coarsenAlpha;
147 coarsen = coarsenCurv && coarsenAlpha;
162 const Vector<Real>& a_tagFields,
163 const Vector<RealVect>& a_gradTagFields)
const noexcept
165 CH_TIME(
"ItoKMCStreamerTagger::refineCell");
166 if (this->m_verbosity > 5) {
167 pout() <<
"ItoKMCStreamerTagger::refineCell" << endl;
170 const Real E = a_tagFields[0];
171 const Real alphaDx = a_tagFields[1];
172 const RealVect gradE = a_gradTagFields[0];
174 const bool refineCurv = gradE.vectorLength() * a_dx / E > m_refineCurvature;
175 const bool refineAlpha = alphaDx > m_refineAlpha;
176 const bool refineManual = (a_lvl < this->getManualRefinementLevel(a_pos));
178 return refineCurv || refineAlpha || refineManual;
181#include <CD_NamespaceFooter.H>
Declaration of the Physics::ItoKMC::ItoKMCStreamerTagger CellTagger.
CellTagger for the ItoKMC module that refines on the ionization coefficient and field curvature.
Definition CD_ItoKMCStreamerTagger.H:31
ItoKMCStreamerTagger() noexcept
Constructor. Must subsequently call the define function.
Definition CD_ItoKMCStreamerTaggerImplem.H:26
virtual bool refineCell(const RealVect &a_pos, const Real a_time, const Real a_dx, const int a_lvl, const Vector< Real > &a_tagFields, const Vector< RealVect > &a_gradTagFields) const noexcept override
Determine if a particular cell should be refined.
Definition CD_ItoKMCStreamerTaggerImplem.H:158
virtual void parseRuntimeOptions() noexcept override
Parse runtime-configurable class options.
Definition CD_ItoKMCStreamerTaggerImplem.H:76
virtual Vector< Real > computeTagFields(const RealVect &a_pos, const Real a_time, const Real a_dx, const RealVect &a_E, const Real a_minE, const Real a_maxE, const RealVect &a_gradE, const Real a_minGradE, const Real a_maxGradE) const noexcept override
Compute per-cell tagging fields from the electric field and its gradient.
Definition CD_ItoKMCStreamerTaggerImplem.H:98
virtual bool coarsenCell(const RealVect &a_pos, const Real a_time, const Real a_dx, const int a_lvl, const Vector< Real > &a_tagFields, const Vector< RealVect > &a_gradTagFields) const noexcept override
Determine if a particular cell should be coarsened.
Definition CD_ItoKMCStreamerTaggerImplem.H:125
virtual ~ItoKMCStreamerTagger() noexcept
Destructor.
Definition CD_ItoKMCStreamerTaggerImplem.H:35
virtual void parseOptions() noexcept override
Parse class options.
Definition CD_ItoKMCStreamerTaggerImplem.H:54