16#ifndef CD_DischargeInceptionStepperImplem_H
17#define CD_DischargeInceptionStepperImplem_H
32#include <CD_NamespaceHeader.H>
34using namespace Physics::DischargeInception;
36template <
typename P,
typename F,
typename C>
39 CH_TIME(
"DischargeInceptionStepper::DischargeInceptionStepper");
40 if (m_verbosity > 5) {
41 pout() <<
"DischargeInceptionStepper::DischargeInceptionStepper" << endl;
48 m_mode = Mode::Stationary;
49 m_transportAlgorithm = TransportAlgorithm::ImExCTU;
50 m_timeStepRestriction = TimeStepRestriction::Unknown;
53 m_fullIntegration =
false;
54 m_evaluateTownsend =
false;
55 m_relativeDeltaU = 1 + 0.05;
61 m_rho = [](
const RealVect x) -> Real {
65 m_sigma = [](
const RealVect x) -> Real {
69 m_alpha = [](
const Real E,
const RealVect x) -> Real {
73 m_eta = [](
const Real E,
const RealVect x) -> Real {
77 m_voltageCurve = [](
const Real a_time) -> Real {
81 m_backgroundRate = [](
const Real E,
const RealVect x) -> Real {
85 m_detachmentRate = [](
const Real E,
const RealVect x) -> Real {
89 m_fieldEmission = [](
const Real E,
const RealVect x) -> Real {
93 m_secondaryEmission = [](
const Real E,
const RealVect x) -> Real {
97 m_initialIonDensity = [](
const RealVect x) -> Real {
101 m_ionMobility = [](
const Real E) -> Real {
105 m_ionDiffusion = [](
const Real E) -> Real {
110template <
typename P,
typename F,
typename C>
113 CH_TIME(
"DischargeInceptionStepper::~DischargeInceptionStepper");
114 if (m_verbosity > 5) {
115 pout() <<
"DischargeInceptionStepper::~DischargeInceptionStepper" << endl;
119template <
typename P,
typename F,
typename C>
123 CH_TIME(
"DischargeInceptionStepper::setupSolvers");
124 if (m_verbosity > 5) {
125 pout() <<
"DischargeInceptionStepper::setupSolvers" << endl;
129 auto voltage = [](
const Real a_time) -> Real {
134 m_fieldSolver = RefCountedPtr<FieldSolver>(
new F());
135 m_fieldSolver->setVerbosity(m_verbosity);
136 m_fieldSolver->parseOptions();
137 m_fieldSolver->setAmr(m_amr);
138 m_fieldSolver->setComputationalGeometry(m_computationalGeometry);
139 m_fieldSolver->setVoltage(voltage);
140 m_fieldSolver->setRealm(m_realm);
141 m_fieldSolver->setTime(0, 0.0, 0.0);
145 m_tracerParticleSolver->parseOptions();
146 m_tracerParticleSolver->setAmr(m_amr);
147 m_tracerParticleSolver->setComputationalGeometry(m_computationalGeometry);
148 m_tracerParticleSolver->setRealm(m_realm);
149 m_tracerParticleSolver->setPhase(m_phase);
150 m_tracerParticleSolver->setTime(0, 0.0, 0.0);
151 m_tracerParticleSolver->setName(
"Tracer particle solver");
152 m_tracerParticleSolver->setVolumeScale(
true);
153 m_tracerParticleSolver->setDeposition(DepositionType::NGP);
158 m_ionSolver->parseOptions();
159 m_ionSolver->setPhase(m_phase);
160 m_ionSolver->setAmr(m_amr);
161 m_ionSolver->setComputationalGeometry(m_computationalGeometry);
162 m_ionSolver->setRealm(m_realm);
166 m_ionSolver->setSpecies(
species);
169template <
typename P,
typename F,
typename C>
173 CH_TIME(
"DischargeInceptionStepper::allocate");
175 pout() <<
"DischargeInceptionStepper::allocate" <<
endl;
178 m_fieldSolver->allocate();
179 m_tracerParticleSolver->allocate();
180 m_ionSolver->allocate();
197 case Mode::Stationary: {
214 case Mode::Transient: {
235template <
typename P,
typename F,
typename C>
239 CH_TIME(
"DischargeInceptionStepper::initialData");
241 pout() <<
"DischargeInceptionStepper::initialData" <<
endl;
244 this->solvePoisson();
247template <
typename P,
typename F,
typename C>
251 CH_TIME(
"DischargeInceptionStepper::solvePoisson");
253 pout() <<
"DischargeInceptionStepper::solvePoisson" <<
endl;
257 m_fieldSolver->setRho(m_rho);
258 m_fieldSolver->setSigma(m_sigma);
259 m_fieldSolver->setVoltage([](
const Real&
a_time) {
264 DataOps::copy(m_fieldSolver->getPotential(), m_potentialInho);
265 const bool convergedInho = m_fieldSolver->solve(m_fieldSolver->getPotential(),
266 m_fieldSolver->getRho(),
267 m_fieldSolver->getSigma(),
271 MayDay::Warning(
"DischargeInceptionStepper::solvePoisson -- could not solve the inhomogeneous Poisson equation. ");
274 DataOps::copy(m_potentialInho, m_fieldSolver->getPotential());
275 DataOps::copy(m_electricFieldInho, m_fieldSolver->getElectricField());
284 m_fieldSolver->setVoltage([](
const Real&
a_time) {
288 DataOps::copy(m_fieldSolver->getPotential(), m_potentialHomo);
289 const bool convergedHomo = m_fieldSolver->solve(m_fieldSolver->getPotential(),
290 m_fieldSolver->getRho(),
291 m_fieldSolver->getSigma(),
295 MayDay::Warning(
"DischargeInceptionStepper::solvePoisson -- could not solve the homogeneous Poisson equation. ");
298 DataOps::copy(m_potentialHomo, m_fieldSolver->getPotential());
299 DataOps::copy(m_electricFieldHomo, m_fieldSolver->getElectricField());
302 m_homogeneousFieldGas =
m_amr->alias(phase::gas, m_electricFieldHomo);
323 m_fieldSolver->setRho(m_rho);
324 m_fieldSolver->setSigma(m_sigma);
325 m_fieldSolver->setVoltage(
voltage);
326 m_fieldSolver->solve(m_fieldSolver->getPotential(), m_fieldSolver->getRho(), m_fieldSolver->getSigma(),
false);
329 DataOps::incr(m_potential, m_fieldSolver->getPotential(), -1.0);
339 MayDay::Error(
"DischargeInceptionStepper::solvePoisson - debug test failed. Check your BCs!");
344template <
typename P,
typename F,
typename C>
348 CH_TIME(
"DischargeInceptionStepper::registerRealms");
350 pout() <<
"DischargeInceptionStepper::registerRealms" <<
endl;
356template <
typename P,
typename F,
typename C>
360 CH_TIME(
"DischargeInceptionStepper::registerOperators");
362 pout() <<
"DischargeInceptionStepper::registerOperators" <<
endl;
365 m_fieldSolver->registerOperators();
366 m_tracerParticleSolver->registerOperators();
367 m_ionSolver->registerOperators();
370template <
typename P,
typename F,
typename C>
374 CH_TIME(
"DischargeInceptionStepper::parseOptions");
378 this->parseVoltages();
381 this->parseInceptionAlgorithm();
382 this->parseTransportAlgorithm();
385template <
typename P,
typename F,
typename C>
389 CH_TIME(
"DischargeInceptionStepper::parseRuntimeOptions");
391 pout() <<
"DischargeInceptionStepper::parseRuntimeOptions" <<
endl;
396 this->parseInceptionAlgorithm();
397 this->parseTransportAlgorithm();
400template <
typename P,
typename F,
typename C>
404 CH_TIME(
"DischargeInceptionStepper::parseVerbosity");
406 pout() <<
"DischargeInceptionStepper::parseVerbosity" <<
endl;
411 pp.get(
"profile", m_profile);
412 pp.query(
"debug", m_debug);
415template <
typename P,
typename F,
typename C>
419 CH_TIME(
"DischargeInceptionStepper::parseMode");
421 pout() <<
"DischargeInceptionStepper::parseMode" <<
endl;
429 if (
str ==
"stationary") {
430 m_mode = Mode::Stationary;
432 else if (
str ==
"transient") {
433 m_mode = Mode::Transient;
436 MayDay::Error(
"Expected 'none', 'stationary', or 'transient' for 'DischargeInceptionStepper.mode'");
440template <
typename P,
typename F,
typename C>
444 CH_TIME(
"DischargeInceptionStepper::parseVoltages");
446 pout() <<
"DischargeInceptionStepper::parseVoltages" <<
endl;
451 pp.get(
"rel_step_dU", m_relativeDeltaU);
452 pp.get(
"step_dK", m_deltaK);
453 pp.get(
"limit_max_K", m_maxKLimit);
454 pp.get(
"K_inception", m_inceptionK);
455 pp.get(
"eval_townsend", m_evaluateTownsend);
457 m_relativeDeltaU = 1.0 + m_relativeDeltaU;
460template <
typename P,
typename F,
typename C>
464 CH_TIME(
"DischargeInceptionStepper::parseOutput");
466 pout() <<
"DischargeInceptionStepper::parseOutput" <<
endl;
471 pp.get(
"output_file", m_outputFile);
474template <
typename P,
typename F,
typename C>
478 CH_TIME(
"DischargeInceptionStepper::parseInceptionAlgorithm");
480 pout() <<
"DischargeInceptionStepper::parseInceptionAlgorithm" <<
endl;
488 pp.get(
"full_integration", m_fullIntegration);
489 pp.get(
"inception_alg",
str);
490 if (
str ==
"euler") {
491 m_inceptionAlgorithm = IntegrationAlgorithm::Euler;
493 else if (
str ==
"trapz") {
494 m_inceptionAlgorithm = IntegrationAlgorithm::Trapezoidal;
497 MayDay::Error(
"Expected 'euler' or 'trapz' for 'DischargeInceptionStepper.inception_alg'");
500 pp.get(
"min_phys_dx", m_minPhysDx);
501 pp.get(
"max_phys_dx", m_maxPhysDx);
502 pp.get(
"min_grid_dx", m_minGridDx);
503 pp.get(
"max_grid_dx", m_maxGridDx);
504 pp.get(
"alpha_dx", m_alphaDx);
505 pp.get(
"grad_alpha_dx", m_gradAlphaDx);
506 pp.get(
"townsend_grid_dx", m_townsendGridDx);
508 if (m_minPhysDx <= 0.0) {
509 MayDay::Abort(
"DischargeInceptionStepper.min_phys_dx must be > 0.0");
511 if (m_maxPhysDx <= 0.0) {
512 MayDay::Abort(
"DischargeInceptionStepper.max_phys_dx must be > 0.0");
514 if (m_minGridDx <= 0.0) {
515 MayDay::Abort(
"DischargeInceptionStepper.min_grid_dx must be > 0.0");
517 if (m_maxGridDx <= 0.0) {
518 MayDay::Abort(
"DischargeInceptionStepper.max_grid_dx must be > 0.0");
520 if (m_alphaDx <= 0.0) {
521 MayDay::Abort(
"DischargeInceptionStepper.alpha_dx must be > 0.0");
523 if (m_gradAlphaDx <= 0.0) {
524 MayDay::Abort(
"DischargeInceptionStepper.grad_alpha_dx must be > 0.0");
526 if (m_townsendGridDx <= 0.0) {
527 MayDay::Abort(
"DischargeInceptionStepper.townsend_grid_dx must be > 0.0");
531template <
typename P,
typename F,
typename C>
535 CH_TIME(
"DischargeInceptionStepper::parseTransportAlgorithm");
537 pout() <<
"DischargeInceptionStepper::parseTransportAlgorithm" <<
endl;
544 pp.get(
"transport_alg",
str);
545 pp.get(
"ion_transport", m_ionTransport);
546 pp.get(
"cfl", m_cfl);
547 pp.get(
"first_dt", m_firstDt);
548 pp.get(
"min_dt", m_minDt);
549 pp.get(
"max_dt", m_maxDt);
550 pp.get(
"max_dt_growth", m_maxDtGrowth);
551 pp.get(
"voltage_eps", m_epsVoltage);
557 if (
str ==
"euler") {
558 m_transportAlgorithm = TransportAlgorithm::Euler;
560 else if (
str ==
"heun") {
561 m_transportAlgorithm = TransportAlgorithm::Heun;
563 else if (
str ==
"imex") {
564 m_transportAlgorithm = TransportAlgorithm::ImExCTU;
567 MayDay::Error(
"Expected 'euler', 'heun', or 'imex' for 'DischargeInceptionStepper.transport_alg'");
571template <
typename P,
typename F,
typename C>
575 CH_TIME(
"DischargeInceptionStepper::parsePlotVariables");
577 pout() <<
"DischargeInceptionStepper::parsePlotVariables" <<
endl;
581 m_plotPoisson =
false;
582 m_plotTracer =
false;
583 m_plotNegativeIons =
false;
584 m_plotInceptionIntegral =
false;
585 m_plotInceptionVoltage =
false;
586 m_plotBackgroundIonization =
false;
587 m_plotDetachment =
false;
588 m_plotFieldEmission =
false;
591 m_plotTownsend =
false;
596 const int num =
pp.countval(
"plt_vars");
601 for (
int i = 0;
i <
num;
i++) {
606 m_plotPoisson =
true;
612 m_plotNegativeIons =
true;
615 m_plotInceptionIntegral =
true;
618 m_plotInceptionVoltage =
true;
621 m_plotBackgroundIonization =
true;
624 m_plotDetachment =
true;
627 m_plotFieldEmission =
true;
636 m_plotTownsend =
true;
643template <
typename P,
typename F,
typename C>
647 CH_TIME(
"DischargeInceptionStepper::writeCheckpointData");
649 pout() <<
"DischargeInceptionStepper::writeCheckpointData" <<
endl;
655template <
typename P,
typename F,
typename C>
659 CH_TIME(
"DischargeInceptionStepper::readCheckpointData");
661 pout() <<
"DischargeInceptionStepper::readCheckpointData" <<
endl;
664 MayDay::Error(
"DischargeInceptionStepper::readCheckpointData -- restart not supported. Use Driver.restart=0");
668template <
typename P,
typename F,
typename C>
672 CH_TIME(
"DischargeInceptionStepper::getNumberOfPlotVariables");
674 pout() <<
"DischargeInceptionStepper::getNumberOfPlotVariables" <<
endl;
685 if (m_plotNegativeIons) {
690 case Mode::Stationary: {
694 ncomp += 2 * m_voltageSweeps.size();
697 ncomp += 2 * m_voltageSweeps.size();
707 if (m_plotInceptionIntegral) {
708 ncomp += 2 * m_voltageSweeps.size();
712 if (m_plotInceptionVoltage) {
717 if (m_plotBackgroundIonization) {
718 ncomp += m_voltageSweeps.size();
722 if (m_plotDetachment) {
723 ncomp += m_voltageSweeps.size();
727 if (m_plotFieldEmission) {
728 ncomp += 2 * m_voltageSweeps.size();
733 ncomp += m_voltageSweeps.size();
738 ncomp += m_voltageSweeps.size();
742 if (m_plotAlpha && m_plotEta) {
743 ncomp += m_voltageSweeps.size();
747 if (m_plotTownsend) {
748 ncomp += 2 * m_voltageSweeps.size();
753 case Mode::Transient: {
770 if (m_plotInceptionIntegral) {
773 if (m_plotTownsend) {
776 if (m_plotBackgroundIonization) {
779 if (m_plotDetachment) {
782 if (m_plotFieldEmission) {
791 if (m_plotAlpha && m_plotEta) {
805template <
typename P,
typename F,
typename C>
809 CH_TIME(
"DischargeInceptionStepper::getPlotVariableNames");
811 pout() <<
"DischargeInceptionStepper::getPlotVariableNames" <<
endl;
832 if (m_plotNegativeIons) {
841 case Mode::Stationary: {
842 plotVars.append(this->getStationaryPlotVariableNames());
846 case Mode::Transient: {
847 plotVars.append(this->getTransientPlotVariableNames());
852 MayDay::Error(
"DischargeInceptionStepper::getPlotVariableNames - logic bust");
861template <
typename P,
typename F,
typename C>
865 CH_TIME(
"DischargeInceptionStepper::getStationaryPlotVariableNames");
867 pout() <<
"DischargeInceptionStepper::getStationaryPlotVariableNames" <<
endl;
876 for (
const Real&
V : m_voltageSweeps) {
881 for (
const Real&
V : m_voltageSweeps) {
902 if (m_plotInceptionVoltage) {
911 if (m_plotInceptionIntegral) {
914 for (
const Real&
V : m_voltageSweeps) {
919 for (
const Real&
V : m_voltageSweeps) {
926 if (m_plotTownsend) {
927 for (
size_t i = 0;
i < m_voltageSweeps.size();
i++) {
933 for (
size_t i = 0;
i < m_voltageSweeps.size();
i++) {
941 if (m_plotBackgroundIonization) {
944 for (
const Real&
V : m_voltageSweeps) {
951 if (m_plotDetachment) {
954 for (
const Real&
V : m_voltageSweeps) {
961 if (m_plotFieldEmission) {
964 for (
const Real&
V : m_voltageSweeps) {
969 for (
const Real&
V : m_voltageSweeps) {
977 for (
size_t i = 0;
i < m_voltageSweeps.size();
i++) {
987 for (
size_t i = 0;
i < m_voltageSweeps.size();
i++) {
995 if (m_plotAlpha && m_plotEta) {
996 for (
size_t i = 0;
i < m_voltageSweeps.size();
i++) {
1006template <
typename P,
typename F,
typename C>
1010 CH_TIME(
"DischargeInceptionStepper::getTransientPlotVariableNames");
1012 pout() <<
"DischargeInceptionStepper::getTransientPlotVariableNames" <<
endl;
1019 plotVars.push_back(
"Electric potential");
1028 plotVars.push_back(
"Space charge density");
1029 plotVars.push_back(
"Surface charge density");
1032 if (m_plotInceptionIntegral) {
1033 plotVars.push_back(
"Inception integral");
1036 if (m_plotTownsend) {
1037 plotVars.push_back(
"Townsend criterion");
1040 if (m_plotBackgroundIonization) {
1041 plotVars.push_back(
"Background rate");
1044 if (m_plotDetachment) {
1045 plotVars.push_back(
"Detachment rate");
1048 if (m_plotFieldEmission) {
1049 plotVars.push_back(
"Field emission");
1053 plotVars.push_back(
"Townsend alpha coefficient");
1057 plotVars.push_back(
"Townsend eta coefficient");
1060 if (m_plotAlpha && m_plotEta) {
1061 plotVars.push_back(
"Effective Townsend coefficient");
1071template <
typename P,
typename F,
typename C>
1078 CH_TIME(
"DischargeInceptionStepper::writePlotData");
1080 pout() <<
"DischargeInceptionStepper::writePlotData" <<
endl;
1083 if (m_plotPoisson) {
1091 if (m_plotNegativeIons) {
1097 case Mode::Stationary: {
1102 case Mode::Transient:
1107 MayDay::Error(
"DischargeInceptionStepper::writePlotData - logic bust");
1114template <
typename P,
typename F,
typename C>
1119 const int a_level)
const noexcept
1121 CH_TIME(
"DischargeInceptionStepper::writePlotDataStationary");
1122 if (m_verbosity > 5) {
1123 pout() <<
"DischargeInceptionStepper::writePlotDataStationary" <<
endl;
1135 for (
const auto&
V : m_voltageSweeps) {
1150 for (
const auto&
V : m_voltageSweeps) {
1172 m_amr->arithmeticAverage(
scratch, m_realm);
1173 m_amr->interpGhostPwl(
scratch, m_realm);
1180 if (m_plotInceptionVoltage) {
1191 if (m_plotInceptionIntegral) {
1192 for (
int i = 0;
i < m_voltageSweeps.size();
i++) {
1195 for (
int i = 0;
i < m_voltageSweeps.size();
i++) {
1200 if (m_plotTownsend) {
1201 for (
int i = 0;
i < m_voltageSweeps.size();
i++) {
1205 for (
int i = 0;
i < m_voltageSweeps.size();
i++) {
1210 if (m_plotBackgroundIonization) {
1211 for (
int i = 0;
i < m_voltageSweeps.size();
i++) {
1216 if (m_plotDetachment) {
1217 for (
int i = 0;
i < m_voltageSweeps.size();
i++) {
1222 if (m_plotFieldEmission) {
1223 for (
int i = 0;
i < m_voltageSweeps.size();
i++) {
1226 for (
int i = 0;
i < m_voltageSweeps.size();
i++) {
1240 for (
size_t i = 0;
i < m_voltageSweeps.size();
i++) {
1241 this->evaluateFunction(
alpha, m_voltageSweeps[
i], m_alpha,
a_level);
1265 for (
size_t i = 0;
i < m_voltageSweeps.size();
i++) {
1266 this->evaluateFunction(
eta, m_voltageSweeps[
i], m_eta,
a_level);
1268 this->evaluateFunction(
etaCoar, m_voltageSweeps[
i], m_eta,
a_level - 1);
1281 if (m_plotAlpha && m_plotEta) {
1294 for (
size_t i = 0;
i < m_voltageSweeps.size();
i++) {
1313template <
typename P,
typename F,
typename C>
1318 const int a_level)
const noexcept
1320 CH_TIME(
"DischargeInceptionStepper::writePlotDataTransient");
1321 if (m_verbosity > 5) {
1322 pout() <<
"DischargeInceptionStepper::writePlotDataTransient" <<
endl;
1340 m_amr->arithmeticAverage(
scratch, m_realm);
1341 m_amr->interpGhostPwl(
scratch, m_realm);
1349 m_amr->arithmeticAverage(
scratch, m_realm);
1350 m_amr->interpGhostPwl(
scratch, m_realm);
1357 if (m_plotInceptionIntegral) {
1361 if (m_plotTownsend) {
1365 if (m_plotBackgroundIonization) {
1379 if (m_plotDetachment) {
1388 this->evaluateFunction(
detachRate, m_voltageCurve(m_time), m_detachmentRate,
a_level);
1399 if (m_plotFieldEmission) {
1412 this->evaluateFunction(
alpha, m_voltageCurve(m_time), m_alpha,
a_level);
1414 this->evaluateFunction(
alphaCoar, m_voltageCurve(m_time), m_alpha,
a_level - 1);
1437 this->evaluateFunction(
eta, m_voltageCurve(m_time), m_eta,
a_level);
1439 this->evaluateFunction(
etaCoar, m_voltageCurve(m_time), m_eta,
a_level - 1);
1453 if (m_plotAlpha && m_plotEta) {
1483template <
typename P,
typename F,
typename C>
1487 CH_TIME(
"DischargeInceptionStepper::computeDt");
1489 pout() <<
"DischargeInceptionStepper::computeDt" <<
endl;
1492 Real dt = std::numeric_limits<Real>::max();
1494 if (m_mode == Mode::Transient) {
1497 m_timeStepRestriction = TimeStepRestriction::Unknown;
1500 if (m_ionTransport) {
1501 Real ionDt = std::numeric_limits<Real>::infinity();
1502 switch (m_transportAlgorithm) {
1503 case TransportAlgorithm::Euler: {
1504 ionDt = m_cfl * m_ionSolver->computeAdvectionDiffusionDt();
1508 case TransportAlgorithm::Heun: {
1509 ionDt = m_cfl * m_ionSolver->computeAdvectionDiffusionDt();
1513 case TransportAlgorithm::ImExCTU: {
1514 ionDt = m_cfl * m_ionSolver->computeAdvectionDt();
1519 MayDay::Error(
"DischargeInceptionStepper::computDt -- logic bust");
1527 m_timeStepRestriction = TimeStepRestriction::CDR;
1541 if (
dVdt > std::numeric_limits<Real>::epsilon()) {
1552 m_timeStepRestriction = TimeStepRestriction::VoltageCurve;
1558 m_timeStepRestriction = TimeStepRestriction::MaxHardcap;
1563 m_timeStepRestriction = TimeStepRestriction::MinHardcap;
1570template <
typename P,
typename F,
typename C>
1574 CH_TIME(
"DischargeInceptionStepper::advance");
1576 pout() <<
"DischargeInceptionStepper::advance" <<
endl;
1579 if (m_mode == Mode::Transient) {
1580 Timer timer(
"DischargeInceptionStepper::advance");
1601 timer.startEvent(
"Ion advance");
1602 if (m_ionTransport) {
1605 this->advanceIons(
a_dt);
1607 timer.stopEvent(
"Ion advance");
1610 timer.startEvent(
"Inception integral");
1612 this->computeInceptionIntegralTransient(
curVoltage);
1613 timer.stopEvent(
"Inception integral");
1615 if (m_evaluateTownsend) {
1616 timer.startEvent(
"Townsend criterion");
1618 this->computeTownsendCriterionTransient(
curVoltage);
1619 timer.stopEvent(
"Townsend criterion");
1623 timer.startEvent(
"Compute Vcr");
1624 const Real Vcr = this->computeCriticalVolumeTransient();
1625 const Real Acr = this->computeCriticalAreaTransient();
1628 timer.stopEvent(
"Compute Vcr");
1632 m_ionizationVolumeTransient.emplace_back(
curTime,
Vion);
1636 if (m_Rdot.size() >= 2) {
1639 for (
size_t i = 0;
i < m_Rdot.size() - 1;
i++) {
1640 const Real dt = m_Rdot[
i + 1].first - m_Rdot[
i].first;
1642 p += 0.5 *
dt * (m_Rdot[
i + 1].second + m_Rdot[
i].second);
1645 m_inceptionProbability.emplace_back(
curTime, 1.0 -
exp(-p));
1649 timer.startEvent(
"Get max/min K");
1650 Real maxK = -std::numeric_limits<Real>::max();
1651 Real minK = +std::numeric_limits<Real>::max();
1653 Real maxT = -std::numeric_limits<Real>::max();
1654 Real minT = +std::numeric_limits<Real>::max();
1659 if (!m_fullIntegration) {
1660 maxK = std::min(
maxK, m_inceptionK);
1665 timer.stopEvent(
"Get max/min K");
1667 timer.startEvent(
"Write report");
1668 this->writeReportTransient();
1669 timer.stopEvent(
"Write report");
1676 MayDay::Error(
"DischargeInceptionStepper::advance -- must have 'DischargeInceptionStepper.mode = transient'");
1682template <
typename P,
typename F,
typename C>
1686 CH_TIME(
"DischargeInceptionStepper::advanceIons");
1687 if (m_verbosity > 5) {
1688 pout() <<
"DischargeInceptionStepper::advanceIons" <<
endl;
1697 m_ionSolver->extrapolateAdvectiveFluxToEB(
ebFlux);
1700 switch (m_transportAlgorithm) {
1701 case TransportAlgorithm::Euler: {
1705 m_ionSolver->computeDivJ(
divJ,
phi, 0.0,
false,
true,
false);
1711 case TransportAlgorithm::Heun: {
1722 m_ionSolver->computeDivJ(
k1,
phi, 0.0,
false,
true,
false);
1727 m_ionSolver->computeDivJ(
k2,
yp, 0.0,
false,
true,
false);
1733 case TransportAlgorithm::ImExCTU: {
1744 m_ionSolver->computeDivF(
k1,
phi,
a_dt,
false,
true,
true);
1753 m_ionSolver->advanceCrankNicholson(
phi,
k2,
k1,
a_dt);
1758 MayDay::Error(
"DischargeInceptionStepper::advanceIons -- logic bust");
1764 m_amr->average(
phi, m_realm, m_phase, Average::Conservative);
1765 m_amr->interpGhost(
phi, m_realm, m_phase);
1768template <
typename P,
typename F,
typename C>
1772 CH_TIME(
"DischargeInceptionStepper::synchronizeSolverTimes");
1774 pout() <<
"DischargeInceptionStepper::synchronizeSolverTimes" <<
endl;
1786template <
typename P,
typename F,
typename C>
1790 CH_TIME(
"DischargeInceptionStepper::printStepReport");
1793 pout() <<
"DischargeInceptionStepper::printStepReport" <<
endl;
1798 switch (m_timeStepRestriction) {
1799 case TimeStepRestriction::Unknown: {
1804 case TimeStepRestriction::CDR: {
1809 case TimeStepRestriction::VoltageCurve: {
1814 case TimeStepRestriction::MinHardcap: {
1819 case TimeStepRestriction::MaxHardcap: {
1825 MayDay::Warning(
"DischargeInceptionStepper::printStepReport - logic bust");
1833 pout() <<
" ** Crit. volume = " << m_criticalVolume.back().second <<
endl;
1834 pout() <<
" ** Inception probability = " << m_inceptionProbability.back().second <<
endl;
1839template <
typename P,
typename F,
typename C>
1843 CH_TIME(
"DischargeInceptionStepper::preRegrid");
1845 pout() <<
"DischargeInceptionStepper::preRegrid" <<
endl;
1855 m_amr->copyData(m_scratchHomo, m_potentialHomo);
1856 m_amr->copyData(m_scratchInho, m_potentialInho);
1859template <
typename P,
typename F,
typename C>
1863 CH_TIME(
"DischargeInceptionStepper::regrid");
1865 pout() <<
"DischargeInceptionStepper::regrid" <<
endl;
1890 case Mode::Stationary: {
1900 case Mode::Transient: {
1915 this->solvePoisson();
1918 this->computeIonVelocity(m_voltageCurve(
m_time));
1919 this->computeIonDiffusion(m_voltageCurve(
m_time));
1922template <
typename P,
typename F,
typename C>
1926 CH_TIME(
"DischargeInceptionStepper::postRegrid");
1928 pout() <<
"DischargeInceptionStepper::postRegrid" <<
endl;
1931 m_scratchHomo.clear();
1932 m_scratchInho.clear();
1935template <
typename P,
typename F,
typename C>
1939 CH_TIME(
"DischargeInceptionStepper::setVoltageCurve");
1940 if (m_verbosity > 5) {
1941 pout() <<
"DischargeInceptionStepper::setVoltageCurve" <<
endl;
1947template <
typename P,
typename F,
typename C>
1951 CH_TIME(
"DischargeInceptionStepper::setRho");
1952 if (m_verbosity > 5) {
1953 pout() <<
"DischargeInceptionStepper::setRho" <<
endl;
1959template <
typename P,
typename F,
typename C>
1963 CH_TIME(
"DischargeInceptionStepper::setSigma");
1964 if (m_verbosity > 5) {
1965 pout() <<
"DischargeInceptionStepper::setSigma" <<
endl;
1971template <
typename P,
typename F,
typename C>
1975 CH_TIME(
"DischargeInceptionStepper::setIonDensity");
1976 if (m_verbosity > 5) {
1977 pout() <<
"DischargeInceptionStepper::setIonDensity" <<
endl;
1983template <
typename P,
typename F,
typename C>
1987 CH_TIME(
"DischargeInceptionStepper::setIonMobility");
1988 if (m_verbosity > 5) {
1989 pout() <<
"DischargeInceptionStepper::setIonMobility" <<
endl;
1995template <
typename P,
typename F,
typename C>
1999 CH_TIME(
"DischargeInceptionStepper::setIonDiffusion");
2000 if (m_verbosity > 5) {
2001 pout() <<
"DischargeInceptionStepper::setIonDiffusion" <<
endl;
2007template <
typename P,
typename F,
typename C>
2012 CH_TIME(
"DischargeInceptionStepper::setAlpha");
2013 if (m_verbosity > 5) {
2014 pout() <<
"DischargeInceptionStepper::setAlpha" <<
endl;
2020template <
typename P,
typename F,
typename C>
2024 CH_TIME(
"DischargeInceptionStepper::setEta");
2025 if (m_verbosity > 5) {
2026 pout() <<
"DischargeInceptionStepper::setEta" <<
endl;
2032template <
typename P,
typename F,
typename C>
2039template <
typename P,
typename F,
typename C>
2046template <
typename P,
typename F,
typename C>
2051 CH_TIME(
"DischargeInceptionStepper::setBackgroundRate");
2052 if (m_verbosity > 5) {
2053 pout() <<
"DischargeInceptionStepper::setBackgroundRate" <<
endl;
2059template <
typename P,
typename F,
typename C>
2064 CH_TIME(
"DischargeInceptionStepper::setDetachmentRate");
2065 if (m_verbosity > 5) {
2066 pout() <<
"DischargeInceptionStepper::setDetachmentRate" <<
endl;
2072template <
typename P,
typename F,
typename C>
2077 CH_TIME(
"DischargeInceptionStepper::setFieldEmission");
2078 if (m_verbosity > 5) {
2079 pout() <<
"DischargeInceptionStepper::setFieldEmission" <<
endl;
2085template <
typename P,
typename F,
typename C>
2090 CH_TIME(
"DischargeInceptionStepper::setSecondaryEmission");
2091 if (m_verbosity > 5) {
2092 pout() <<
"DischargeInceptionStepper::setSecondaryEmission" <<
endl;
2098template <
typename P,
typename F,
typename C>
2105template <
typename P,
typename F,
typename C>
2109 CH_TIME(
"DischargeInceptionStepper::seedUniformParticles");
2111 pout() <<
"DischargeInceptionStepper::seedUniformParticles" <<
endl;
2130#pragma omp parallel for schedule(runtime)
2171 p.template
vect<0>() = p.position();
2182template <
typename P,
typename F,
typename C>
2186 CH_TIME(
"DischargeInceptionStepper::seedIonizationParticles");
2187 if (m_verbosity > 5) {
2188 pout() <<
"DischargeInceptionStepper::seedIonizationParticles" <<
endl;
2205 for (
int lvl = 0;
lvl <= m_amr->getFinestLevel();
lvl++) {
2219#pragma omp parallel for schedule(runtime)
2234 if (!
ebisbox.isAllCovered()) {
2243 const Real E =
EE.vectorLength();
2265 const Real E =
EE.vectorLength();
2294 p.template
vect<0>() = p.position();
2301 m_amr->arithmeticAverage(
alphaMesh, m_realm, m_phase);
2302 m_amr->interpGhost(
alphaMesh, m_realm, m_phase);
2305 m_amr->computeGradient(m_gradAlpha,
alphaMesh, m_realm, m_phase);
2308 m_amr->arithmeticAverage(m_gradAlpha, m_realm, m_phase);
2309 m_amr->interpGhost(m_gradAlpha, m_realm, m_phase);
2310 m_amr->interpToCentroids(m_gradAlpha, m_realm, m_phase);
2313template <
typename P,
typename F,
typename C>
2317 CH_TIME(
"DischargeInceptionStepper::postInitialize");
2319 pout() <<
"DischargeInceptionStepper::postInitialize" <<
endl;
2323 m_ionSolver->initialData();
2324 this->computeIonVelocity(m_voltageCurve(
m_time));
2325 this->computeIonDiffusion(m_voltageCurve(
m_time));
2328 case Mode::Stationary: {
2329 this->computeInceptionIntegralStationary();
2330 this->computeTownsendCriterionStationary();
2331 this->computeCriticalVolumeStationary();
2332 this->computeCriticalAreaStationary();
2333 this->computeIonizationVolumeStationary();
2334 this->computeInceptionVoltageVolume();
2337 if (m_plotBackgroundIonization) {
2338 this->computeBackgroundIonizationStationary();
2341 if (m_plotDetachment) {
2342 this->computeDetachmentStationary();
2345 if (m_plotFieldEmission) {
2346 this->computeFieldEmissionStationary();
2349 this->writeReportStationary();
2353 case Mode::Transient: {
2356 this->seedIonizationParticles(m_voltageCurve(
m_time));
2357 this->computeInceptionIntegralTransient(m_voltageCurve(
m_time));
2360 if (m_evaluateTownsend) {
2361 this->seedIonizationParticles(m_voltageCurve(
m_time));
2362 this->computeTownsendCriterionTransient(m_voltageCurve(
m_time));
2366 Real maxK = -std::numeric_limits<Real>::max();
2367 Real minK = +std::numeric_limits<Real>::max();
2369 Real maxT = -std::numeric_limits<Real>::max();
2370 Real minT = +std::numeric_limits<Real>::max();
2374 if (!m_fullIntegration) {
2375 maxK = std::min(
maxK, m_inceptionK);
2379 m_Rdot.emplace_back(
m_time, this->computeRdot(m_voltageCurve(
m_time)));
2380 m_criticalVolume.emplace_back(
m_time, this->computeCriticalVolumeTransient());
2381 m_criticalArea.emplace_back(
m_time, this->computeCriticalAreaTransient());
2382 m_ionizationVolumeTransient.emplace_back(
m_time, this->computeIonizationVolumeTransient(m_voltageCurve(
m_time)));
2383 m_inceptionProbability.emplace_back(
m_time, 0.0);
2395template <
typename P,
typename F,
typename C>
2399 CH_TIME(
"DischargeInceptionStepper::interpolateGradAlphaToParticles");
2401 pout() <<
"DischargeInceptionStepper::interpolateGradAlphaToParticles" <<
endl;
2409 m_tracerParticleSolver->getInterpolationType(),
2413template <
typename P,
typename F,
typename C>
2418 CH_TIME(
"DischargeInceptionStepper::computeInceptionIntegral");
2419 if (m_verbosity > 5) {
2420 pout() <<
"DischargeInceptionStepper::computeInceptionIntegral" <<
endl;
2439 this->seedIonizationParticles(
a_voltage);
2440 this->resetTracerParticles();
2443 switch (m_inceptionAlgorithm) {
2444 case IntegrationAlgorithm::Euler: {
2445 this->inceptionIntegrateEuler(
a_voltage);
2449 case IntegrationAlgorithm::Trapezoidal: {
2450 this->inceptionIntegrateTrapezoidal(
a_voltage);
2455 MayDay::Error(
"DischargeInceptionStepper::computeInceptionIntegral -- logic bust");
2468template <
typename P,
typename F,
typename C>
2472 CH_TIME(
"DischargeInceptionStepper::computeInceptionIntegralStationary");
2474 pout() <<
"DischargeInceptionStepper::computeInceptionIntegralStationary" <<
endl;
2485 this->superposition(
gasField, 1.0);
2490 const Real Ecrit = this->getCriticalField();
2496 m_inceptionIntegralPlus.resize(0);
2497 m_inceptionIntegralMinu.resize(0);
2515 m_inceptionIntegralPlus.push_back(
Kplus);
2516 m_inceptionIntegralMinu.push_back(
Kminu);
2557 m_voltageSweeps.resize(0);
2558 for (
int i = 0;
i < m_KPlusValues.size();
i++) {
2559 m_voltageSweeps.push_back(
std::get<0>(m_KPlusValues[
i]));
2563template <
typename P,
typename F,
typename C>
2567 CH_TIME(
"DischargeInceptionStepper::computeInceptionIntegralTransient");
2568 if (m_verbosity > 5) {
2569 pout() <<
"DischargeInceptionStepper::computeInceptionIntegralTransient" <<
endl;
2573 switch (m_inceptionAlgorithm) {
2574 case IntegrationAlgorithm::Euler: {
2575 this->inceptionIntegrateEuler(
a_voltage);
2579 case IntegrationAlgorithm::Trapezoidal: {
2580 this->inceptionIntegrateTrapezoidal(
a_voltage);
2585 MayDay::Error(
"DischargeInceptionStepper::computeInceptionIntegralTransient - logic bust");
2592 m_tracerParticleSolver->deposit(m_inceptionIntegral);
2594 m_amr->conservativeAverage(m_inceptionIntegral, m_realm, m_phase);
2595 m_amr->interpGhost(m_inceptionIntegral, m_realm, m_phase);
2598template <
typename P,
typename F,
typename C>
2602 CH_TIME(
"DischargeInceptionStepper::inceptionIntegrateEuler");
2603 if (m_verbosity > 5) {
2604 pout() <<
"DischargeInceptionStepper::inceptionIntegrateEuler" <<
endl;
2618 m_tracerParticleSolver->
remap();
2632 m_tracerParticleSolver->setVelocity(
scratch);
2633 m_tracerParticleSolver->interpolateVelocities();
2635 while (
amrParticles.getNumberOfValidParticlesGlobal() > 0) {
2637 this->interpolateGradAlphaToParticles();
2640 for (
int lvl = 0;
lvl <= m_amr->getFinestLevel();
lvl++) {
2648#pragma omp parallel for schedule(runtime)
2714 if (!m_fullIntegration) {
2718 if (p.weight() >= m_inceptionK) {
2730 m_tracerParticleSolver->
remap();
2737 if (!m_fullIntegration) {
2738 for (
int lvl = 0;
lvl <= m_amr->getFinestLevel();
lvl++) {
2744#pragma omp parallel for schedule(runtime)
2751 lit().weight() = std::min(m_inceptionK,
lit().weight());
2757 this->rewindTracerParticles();
2766 MayDay::Warning(
"DischargeInceptionStepper::inceptionIntegrateEuler - lost/gained particles!");
2770template <
typename P,
typename F,
typename C>
2774 CH_TIME(
"DischargeInceptionStepper::inceptionIntegrateTrapezoidal");
2775 if (m_verbosity > 5) {
2776 pout() <<
"DischargeInceptionStepper::inceptionIntegrateTrapezoidal" <<
endl;
2802 m_tracerParticleSolver->
remap();
2816 m_tracerParticleSolver->setVelocity(
scratch);
2817 m_tracerParticleSolver->interpolateVelocities();
2819 while (
amrParticles.getNumberOfValidParticlesGlobal() > 0) {
2821 this->interpolateGradAlphaToParticles();
2824 for (
int lvl = 0;
lvl <= m_amr->getFinestLevel();
lvl++) {
2832#pragma omp parallel for schedule(runtime)
2904 m_tracerParticleSolver->
remap();
2908 for (
int lvl = 0;
lvl <= m_amr->getFinestLevel();
lvl++) {
2916#pragma omp parallel for schedule(runtime)
2980 if (!m_fullIntegration) {
2984 if (p.weight() >= m_inceptionK) {
2996 m_tracerParticleSolver->
remap();
3004 if (!m_fullIntegration) {
3005 for (
int lvl = 0;
lvl <= m_amr->getFinestLevel();
lvl++) {
3011#pragma omp parallel for schedule(runtime)
3018 lit().weight() = std::min(m_inceptionK,
lit().weight());
3024 this->rewindTracerParticles();
3027template <
typename P,
typename F,
typename C>
3031 CH_TIME(
"DischargeInceptionStepper::computeTownsendCriterionStationary");
3033 pout() <<
"DischargeInceptionStepper::computeTownsendCriterionStationary" <<
endl;
3036 CH_assert(m_inceptionIntegralPlus.size() == m_inceptionIntegralMinu.size());
3038 m_townsendCriterionPlus.resize(0);
3039 m_townsendCriterionMinu.resize(0);
3041 for (
size_t i = 0;
i < m_voltageSweeps.size();
i++) {
3071 if (m_evaluateTownsend) {
3074 this->resetTracerParticles();
3076 switch (m_inceptionAlgorithm) {
3077 case IntegrationAlgorithm::Euler: {
3078 this->townsendTrackEuler(
voltage);
3082 case IntegrationAlgorithm::Trapezoidal: {
3083 this->townsendTrackTrapezoidal(
voltage);
3088 MayDay::Error(
"DischargeInceptionStepper::computeTownsendCriterionStationary -- logic bust");
3100 this->resetTracerParticles();
3102 switch (m_inceptionAlgorithm) {
3103 case IntegrationAlgorithm::Euler: {
3104 this->townsendTrackEuler(-
voltage);
3108 case IntegrationAlgorithm::Trapezoidal: {
3109 this->townsendTrackTrapezoidal(-
voltage);
3114 MayDay::Error(
"DischargeInceptionStepper::computeTownsendCriterionStationary -- logic bust");
3127 return x > 0.0 ?
exp(
x) - 1 : 0.0;
3143 if (!m_fullIntegration) {
3144 auto truncate = [](
const Real x) ->
Real {
3145 return std::min(
x, 1.0);
3161template <
typename P,
typename F,
typename C>
3165 CH_TIME(
"DischargeInceptionStepper::computeTownsendCriterionTransient");
3166 if (m_verbosity > 5) {
3167 pout() <<
"DischargeInceptionStepper::computeTownsendCriterionTransient" <<
endl;
3171 switch (m_inceptionAlgorithm) {
3172 case IntegrationAlgorithm::Euler: {
3177 case IntegrationAlgorithm::Trapezoidal: {
3178 this->townsendTrackTrapezoidal(
a_voltage);
3183 MayDay::Error(
"DischargeInceptionStepper::computeTownsendCriterionTransient - logic bust");
3193 m_tracerParticleSolver->deposit(
gamma);
3197 return x > 0.0 ?
exp(
x) - 1 : 0.0;
3204 if (!m_fullIntegration) {
3206 return std::min(
x, 1.0);
3210 m_amr->conservativeAverage(m_townsendCriterion, m_realm, m_phase);
3211 m_amr->interpGhost(m_townsendCriterion, m_realm, m_phase);
3214template <
typename P,
typename F,
typename C>
3218 CH_TIME(
"DischargeInceptionStepper::townsendTrackEuler");
3219 if (m_verbosity > 5) {
3220 pout() <<
"DischargeInceptionStepper::townsendTrackEuler" <<
endl;
3233 m_tracerParticleSolver->
remap();
3246 m_tracerParticleSolver->setVelocity(
scratch);
3247 m_tracerParticleSolver->interpolateVelocities();
3249 while (
amrParticles.getNumberOfValidParticlesGlobal() > 0) {
3252 for (
int lvl = 0;
lvl <= m_amr->getFinestLevel();
lvl++) {
3261#pragma omp parallel for schedule(runtime)
3291 p.weight() = m_secondaryEmission(
E,
x);
3308 m_tracerParticleSolver->
remap();
3314 this->rewindTracerParticles();
3323 MayDay::Warning(
"DischargeInceptionStepper::townsendTrackEuler - lost/gained particles!");
3327template <
typename P,
typename F,
typename C>
3331 CH_TIME(
"DischargeInceptionStepper::townsendTrackTrapezoidal");
3332 if (m_verbosity > 5) {
3333 pout() <<
"DischargeInceptionStepper::townsendTrackTrapezoidal" <<
endl;
3353 m_tracerParticleSolver->
remap();
3366 m_tracerParticleSolver->setVelocity(
scratch);
3367 m_tracerParticleSolver->interpolateVelocities();
3369 while (
amrParticles.getNumberOfValidParticlesGlobal() > 0) {
3372 for (
int lvl = 0;
lvl <= m_amr->getFinestLevel();
lvl++) {
3381#pragma omp parallel for schedule(runtime)
3408 p.weight() = m_secondaryEmission(
E,
x);
3433 m_tracerParticleSolver->
remap();
3437 for (
int lvl = 0;
lvl <= m_amr->getFinestLevel();
lvl++) {
3443#pragma omp parallel for schedule(runtime)
3479 p.weight() = m_secondaryEmission(
E,
oldPos);
3496 m_tracerParticleSolver->
remap();
3503 this->rewindTracerParticles();
3512 MayDay::Warning(
"DischargeInceptionStepper::townsendTrackTrapezoidal - lost/gained particles!");
3516template <
typename P,
typename F,
typename C>
3520 CH_TIME(
"DischargeInceptionStepper::computeRdot");
3521 if (m_verbosity > 5) {
3522 pout() <<
"DischargeInceptionStepper::computeRdot" <<
endl;
3535 for (
int lvl = 0;
lvl <= m_amr->getFinestLevel();
lvl++) {
3546#pragma omp parallel for schedule(runtime) reduction(+ : Rdot)
3569 const Real E =
EE.vectorLength();
3573 const Real k = m_detachmentRate(
E,
pos);
3590 const Real E =
EE.vectorLength();
3596 const Real k = m_detachmentRate(
E,
pos);
3618template <
typename P,
typename F,
typename C>
3622 CH_TIME(
"DischargeInceptionStepper::rewindTracerParticles");
3624 pout() <<
"DischargeInceptionStepper::rewindTracerParticles" <<
endl;
3635#pragma omp parallel for schedule(runtime)
3642 p.position() = p.template
vect<0>();
3650template <
typename P,
typename F,
typename C>
3654 CH_TIME(
"DischargeInceptionStepper::resetTracerParticles");
3656 pout() <<
"DischargeInceptionStepper::resetTracerParticles" <<
endl;
3667#pragma omp parallel for schedule(runtime)
3680template <
typename P,
typename F,
typename C>
3684 CH_TIME(
"DischargeInceptionStepper::computeBackgroundIonizationStationary");
3686 pout() <<
"DischargeInceptionStepper::computeBackgroundIonizationStationary" <<
endl;
3689 CH_assert(m_inceptionIntegralPlus.size() == m_inceptionIntegralMinu.size());
3690 CH_assert(m_inceptionIntegralPlus.size() == m_KPlusValues.size());
3691 CH_assert(m_inceptionIntegralMinu.size() == m_KMinuValues.size());
3693 m_backgroundIonizationStationary.resize(0);
3700 for (
size_t i = 0;
i < m_voltageSweeps.size();
i++) {
3719#pragma omp parallel for schedule(runtime)
3735 const Real E =
EE.vectorLength();
3743 const Real E =
EE.vectorLength();
3760template <
typename P,
typename F,
typename C>
3764 CH_TIME(
"DischargeInceptionStepper::computeDetachmentStationary");
3766 pout() <<
"DischargeInceptionStepper::computeDetachmentStationary" <<
endl;
3769 CH_assert(m_inceptionIntegralPlus.size() == m_inceptionIntegralMinu.size());
3770 CH_assert(m_inceptionIntegralPlus.size() == m_KPlusValues.size());
3771 CH_assert(m_inceptionIntegralMinu.size() == m_KMinuValues.size());
3773 m_detachmentStationary.resize(0);
3780 for (
size_t i = 0;
i < m_voltageSweeps.size();
i++) {
3799#pragma omp parallel for schedule(runtime)
3818 const Real E =
EE.vectorLength();
3827 const Real E =
EE.vectorLength();
3848template <
typename P,
typename F,
typename C>
3852 CH_TIME(
"DischargeInceptionStepper::computeFieldEmissionStationary");
3854 pout() <<
"DischargeInceptionStepper::computeFieldEmissionStationary" <<
endl;
3857 CH_assert(m_inceptionIntegralPlus.size() == m_inceptionIntegralMinu.size());
3858 CH_assert(m_inceptionIntegralPlus.size() == m_KPlusValues.size());
3859 CH_assert(m_inceptionIntegralMinu.size() == m_KMinuValues.size());
3861 m_emissionRatesPlus.resize(0);
3862 m_emissionRatesMinu.resize(0);
3864 const int numVoltages = m_inceptionIntegralPlus.size();
3873 for (
size_t i = 0;
i < m_voltageSweeps.size();
i++) {
3898#pragma omp parallel for schedule(runtime)
3948template <
typename P,
typename F,
typename C>
3953 CH_TIME(
"DischargeInceptionStepper::computeFieldEmission");
3954 if (m_verbosity > 5) {
3955 pout() <<
"DischargeInceptionStepper::computeFieldEmission" <<
endl;
3967 for (
int lvl = 0;
lvl <= m_amr->getFinestLevel();
lvl++) {
3975#pragma omp parallel for schedule(runtime)
3993 const Real E =
EE.vectorLength();
4007template <
typename P,
typename F,
typename C>
4014 CH_TIME(
"DischargeInceptionStepper::evaluateFunction");
4015 if (m_verbosity > 5) {
4016 pout() <<
"DischargeInceptionStepper::evaluateFunction" <<
endl;
4019 for (
int lvl = 0;
lvl <= m_amr->getFinestLevel();
lvl++) {
4024template <
typename P,
typename F,
typename C>
4029 const int a_level)
const noexcept
4031 CH_TIME(
"DischargeInceptionStepper::evaluateFunction(level)");
4032 if (m_verbosity > 5) {
4033 pout() <<
"DischargeInceptionStepper::evaluateFunction(level)" <<
endl;
4053#pragma omp parallel for schedule(runtime)
4072 const Real E =
EE.vectorLength();
4080 const Real E =
EE.vectorLength();
4094template <
typename P,
typename F,
typename C>
4098 CH_TIME(
"DischargeInceptionStepper::computeInceptionVoltageVolume");
4100 pout() <<
"DischargeInceptionStepper::computeInceptionVoltageVolume" <<
endl;
4108 if (m_inceptionIntegralPlus.size() < 2) {
4109 DataOps::setValue(m_inceptionVoltagePlus, std::numeric_limits<Real>::quiet_NaN());
4110 DataOps::setValue(m_inceptionVoltageMinu, std::numeric_limits<Real>::quiet_NaN());
4112 MayDay::Warning(
"DischargeInceptionStepper::computeInceptionVoltageVolume -- not enough voltages for estimating "
4113 "inception voltage");
4116 constexpr int comp = 0;
4128 for (
size_t i = 0;
i < K.size() - 1;
i++) {
4134 else if (K[
i] ==
Kinc) {
4142 for (
size_t i = 0;
i <
T.size() - 1;
i++) {
4143 if (
T[
i] <= 1.0 &&
T[
i + 1] > 1) {
4148 else if (
T[
i] == 1.0) {
4158 Uinc = std::numeric_limits<Real>::quiet_NaN();
4181 for (
size_t i = 0;
i < K.size() - 1;
i++) {
4190 for (
size_t i = 0;
i <
T.size() - 1;
i++) {
4191 if (
T[
i] <= 1.0 &&
T[
i + 1] >= 1) {
4201 Uinc = std::numeric_limits<Real>::quiet_NaN();
4223#pragma omp parallel for schedule(runtime)
4252 for (
int i = 0;
i < m_voltageSweeps.size();
i++) {
4272 for (
size_t i = 0;
i < m_voltageSweeps.size();
i++) {
4283 if (m_fullIntegration) {
4310 for (
size_t i = 0;
i < m_voltageSweeps.size();
i++) {
4321 if (m_fullIntegration) {
4355template <
typename P,
typename F,
typename C>
4359 CH_TIME(
"DischargeInceptionStepper::computeMinimumInceptionVoltage");
4360 if (m_verbosity > 5) {
4361 pout() <<
"DischargeInceptionStepper::computeMinimumInceptionVoltage" <<
endl;
4368 UxInc.first = std::numeric_limits<Real>::max();
4371 for (
int lvl = 0;
lvl <= m_amr->getFinestLevel();
lvl++) {
4379#pragma omp parallel for schedule(runtime) reduction(pairmin : UxInc)
4430template <
typename P,
typename F,
typename C>
4434 CH_TIME(
"DischargeInceptionStepper::computeCriticalVolumeStationary");
4436 pout() <<
"DischargeInceptionStepper::computeCriticalVolumeStationary" <<
endl;
4439 CH_assert(m_inceptionIntegralPlus.size() == m_inceptionIntegralMinu.size());
4440 CH_assert(m_inceptionIntegralPlus.size() == m_KPlusValues.size());
4441 CH_assert(m_inceptionIntegralMinu.size() == m_KMinuValues.size());
4443 m_criticalVolumePlus.resize(0);
4444 m_criticalVolumeMinu.resize(0);
4446 const int numVoltages = m_inceptionIntegralPlus.size();
4464#pragma omp parallel for schedule(runtime) reduction(+ : criticalVolumePlus, criticalVolumeMinu)
4521template <
typename P,
typename F,
typename C>
4525 CH_TIME(
"DischargeInceptionStepper::computeCriticalVolumeTransient");
4527 pout() <<
"DischargeInceptionStepper::computeCriticalVolumeTransient" <<
endl;
4544#pragma omp parallel for schedule(runtime) reduction(+ : Vcr)
4585template <
typename P,
typename F,
typename C>
4589 CH_TIME(
"DischargeInceptionStepper::computeCriticalAreaStationary");
4591 pout() <<
"DischargeInceptionStepper::computeCriticalAreaStationary" <<
endl;
4594 CH_assert(m_inceptionIntegralPlus.size() == m_inceptionIntegralMinu.size());
4595 CH_assert(m_inceptionIntegralPlus.size() == m_KPlusValues.size());
4596 CH_assert(m_inceptionIntegralMinu.size() == m_KMinuValues.size());
4598 m_criticalAreaPlus.resize(0);
4599 m_criticalAreaMinu.resize(0);
4601 const int numVoltages = m_inceptionIntegralPlus.size();
4619#pragma omp parallel for schedule(runtime) reduction(+ : criticalAreaPlus, criticalAreaMinu)
4657template <
typename P,
typename F,
typename C>
4661 CH_TIME(
"DischargeInceptionStepper::computeCriticalAreaTransient");
4663 pout() <<
"DischargeInceptionStepper::computeCriticalAreaTransient" <<
endl;
4680#pragma omp parallel for schedule(runtime) reduction(+ : Acr)
4708template <
typename P,
typename F,
typename C>
4712 CH_TIME(
"DischargeInceptionStepper::computeIonizationVolumeStationary");
4714 pout() <<
"DischargeInceptionStepper::computeIonizationVolumeStationary" <<
endl;
4717 CH_assert(m_inceptionIntegralPlus.size() == m_inceptionIntegralMinu.size());
4718 CH_assert(m_inceptionIntegralPlus.size() == m_KPlusValues.size());
4719 CH_assert(m_inceptionIntegralMinu.size() == m_KMinuValues.size());
4721 m_ionizationVolume.resize(0);
4723 const int numVoltages = m_inceptionIntegralPlus.size();
4730 for (
size_t i = 0;
i < m_voltageSweeps.size();
i++) {
4749#pragma omp parallel for schedule(runtime) reduction(+ : ionizationVolume)
4764 const Real E =
EE.vectorLength();
4780 const Real E =
EE.vectorLength();
4806template <
typename P,
typename F,
typename C>
4810 CH_TIME(
"DischargeInceptionStepper::computeIonizationVolumeTransient");
4811 if (m_verbosity > 5) {
4812 pout() <<
"DischargeInceptionStepper::computeIonizationVolumeTransient" <<
endl;
4822 for (
int lvl = 0;
lvl <= m_amr->getFinestLevel(); ++
lvl) {
4835#pragma omp parallel for schedule(runtime) reduction(+ : Vion)
4851 const Real E =
EE.vectorLength();
4866 const Real E =
EE.vectorLength();
4888template <
typename P,
typename F,
typename C>
4892 CH_TIME(
"DischargeInceptionStepper::writeReportStationary");
4894 pout() <<
"DischargeInceptionStepper::writeReportStationary" <<
endl;
4897 const auto UIncPlus = this->computeMinimumInceptionVoltage(m_inceptionVoltagePlus);
4898 const auto UIncMinu = this->computeMinimumInceptionVoltage(m_inceptionVoltageMinu);
4900 const auto streamerUIncPlus = this->computeMinimumInceptionVoltage(m_streamerInceptionVoltagePlus);
4901 const auto streamerUIncMinu = this->computeMinimumInceptionVoltage(m_streamerInceptionVoltageMinu);
4903 const auto townsendUIncPlus = this->computeMinimumInceptionVoltage(m_townsendInceptionVoltagePlus);
4904 const auto townsendUIncMinu = this->computeMinimumInceptionVoltage(m_townsendInceptionVoltageMinu);
4919 output <<
"# Could not compute inception voltage\n";
4922 if(m_fullIntegration){
4923 output <<
"# Minimum inception voltage(+) = " <<
UIncPlus.first <<
",\t x = " <<
UIncPlus.second <<
"\n";
4924 output <<
"# Minimum inception voltage(-) = " <<
UIncMinu.first <<
",\t x = " <<
UIncMinu.second <<
"\n";
4933 output <<
"# Minimum inception voltage(+) >= " <<
UIncPlus.first <<
",\t x = " <<
UIncPlus.second <<
"\n";
4934 output <<
"# Minimum inception voltage(-) >= " <<
UIncMinu.first <<
",\t x = " <<
UIncMinu.second <<
"\n";
4975 for (
int i = 0;
i < m_voltageSweeps.size();
i++) {
4999template <
typename P,
typename F,
typename C>
5003 CH_TIME(
"DischargeInceptionStepper::writeReportTransient");
5005 pout() <<
"DischargeInceptionStepper::writeReportTransient" <<
endl;
5028 for (
size_t i = 0;
i < m_Rdot.size() - 1;
i++) {
5029 const Real t = m_Rdot[
i].first;
5030 const Real dt = m_Rdot[
i + 1].first - m_Rdot[
i].first;
5031 const Real prob = m_inceptionProbability[
i].second;
5036 dProb.emplace_back(0.0);
5040 for (
size_t i = 0;
i < m_Rdot.size() - 1;
i++) {
5041 const Real t1 = m_Rdot[
i].first;
5042 const Real t2 = m_Rdot[
i + 1].first;
5044 const Real prob = m_inceptionProbability[
i].second;
5049 for (
int i = 0;
i <
tau.size();
i++) {
5050 const Real prob = m_inceptionProbability[
i].second;
5052 tau[
i] =
prob > 0.0 ?
tau[
i] /
prob : std::numeric_limits<Real>::infinity();
5055 for (
size_t i = 0;
i < m_Rdot.size();
i++) {
5079template <
typename P,
typename F,
typename C>
5086 CH_TIME(
"DischargeInceptionStepper::particleOutsideGrid");
5087 if (m_verbosity > 5) {
5088 pout() <<
"DischargeInceptionStepper::particleOutsideGrid" <<
endl;
5103template <
typename P,
typename F,
typename C>
5108 CH_TIME(
"DischargeInceptionStepper::particleInsideEB");
5109 if (m_verbosity > 5) {
5110 pout() <<
"DischargeInceptionStepper::particleInsideEB" <<
endl;
5119template <
typename P,
typename F,
typename C>
5123 CH_TIME(
"DischargeInceptionStepper::computeIonVelocity");
5124 if (m_verbosity > 5) {
5125 pout() <<
"DischargeInceptionStepper::computeIonVelocity" <<
endl;
5141 for (
int lvl = 0;
lvl <= m_amr->getFinestLevel();
lvl++) {
5147#pragma omp parallel for schedule(runtime)
5159 const Real E =
EE.vectorLength();
5166 const Real E =
EE.vectorLength();
5168 MU(
vof, 0) = m_ionMobility(
E);
5181 m_amr->arithmeticAverage(
vel, m_realm, m_phase);
5182 m_amr->interpGhostPwl(
vel, m_realm, m_phase);
5185template <
typename P,
typename F,
typename C>
5189 CH_TIME(
"DischargeInceptionStepper::computeIonDiffusion");
5190 if (m_verbosity > 5) {
5191 pout() <<
"DischargeInceptionStepper::computeIonDiffusion" <<
endl;
5206 for (
int lvl = 0;
lvl <= m_amr->getFinestLevel();
lvl++) {
5212#pragma omp parallel for schedule(runtime)
5224 const Real E =
EE.vectorLength();
5231 const Real E =
EE.vectorLength();
5233 dCo(
vof, 0) = m_ionDiffusion(
E);
5245 m_amr->arithmeticAverage(
diffCoCell, m_realm, m_phase);
5246 m_amr->interpGhostPwl(
diffCoCell, m_realm, m_phase);
5257 m_amr->getDomains(),
5261 Average::Arithmetic);
5264template <
typename P,
typename F,
typename C>
5271 CH_TIME(
"DischargeInceptionStepper::superposition(full)");
5280 m_amr->arithmeticAverage(
a_sumField, m_realm, m_phase);
5281 m_amr->interpGhostPwl(
a_sumField, m_realm, m_phase);
5285template <
typename P,
typename F,
typename C>
5289 CH_TIME(
"DischargeInceptionStepper::superposition(short)");
5294template <
typename P,
typename F,
typename C>
5300 CH_TIME(
"DischargeInceptionStepper::getMaxValueAndLocation");
5301 if (m_verbosity > 5) {
5302 pout() <<
"DischargeInceptionStepper::getMaxValueAndLocation" <<
endl;
5305 a_maxVal = -std::numeric_limits<Real>::max();
5308 for (
int lvl = 0;
lvl <= m_amr->getFinestLevel();
lvl++) {
5319#pragma omp parallel for schedule(runtime)
5362template <
typename P,
typename F,
typename C>
5372 CH_TIMERS(
"DischargeInceptionStepper::writeData");
5373 CH_TIMER(
"DischargeInceptionStepper::writeData::allocate",
t1);
5374 CH_TIMER(
"DischargeInceptionStepper::writeData::local_copy",
t2);
5375 CH_TIMER(
"DischargeInceptionStepper::writeData::interp_ghost",
t3);
5376 CH_TIMER(
"DischargeInceptionStepper::writeData::interp_centroid",
t4);
5377 CH_TIMER(
"DischargeInceptionStepper::writeData::final_copy",
t5);
5378 if (m_verbosity > 5) {
5379 pout() <<
"DischargeInceptionStepper::writeData" <<
endl;
5420template <
typename P,
typename F,
typename C>
5424 CH_TIMERS(
"DischargeInceptionStepper::getElectricField");
5426 return &m_homogeneousFieldGas;
5429template <
typename P,
typename F,
typename C>
5433 CH_TIME(
"DischargeInceptionStepper::getCriticalField");
5435 pout() <<
"DischargeInceptionStepper::getCriticalField" <<
endl;
5448 return std::pow(10.0, p);
5451#include <CD_NamespaceFooter.H>
Simple species for DischargeInception test problem.
TimeStepper class for evaluating the streamer inception criterion.
Mode
For specifying whether the module is run in stationary or transient mode.
Definition CD_DischargeInceptionStepper.H:55
Declaration of various useful OpenMP-related utilities.
Agglomeration of some useful algebraic/polynomial routines.
Declaration of various useful units.
static void scale(MFAMRCellData &a_lhs, const Real &a_scale) noexcept
Scale data by factor.
Definition CD_DataOps.cpp:2398
static void getMaxMinNorm(Real &a_max, Real &a_min, EBAMRCellData &data)
Get maximum and minimum value of normed data.
Definition CD_DataOps.cpp:1797
static void compute(EBAMRCellData &a_data, const std::function< Real(const Real a_cellValue)> &a_func) noexcept
Compute a new value given the old cell value.
Definition CD_DataOps.cpp:480
static void floor(EBAMRCellData &a_lhs, const Real a_value)
Floor values in data holder. This sets all values below a_value to a_value.
Definition CD_DataOps.cpp:1394
static void squareRoot(EBAMRFluxData &a_lhs)
Compute the square root of the input data.
Definition CD_DataOps.cpp:3289
static void getMaxMin(Real &max, Real &min, EBAMRCellData &a_data, const int a_comp)
Get maximum and minimum value of specified component.
Definition CD_DataOps.cpp:1651
static void multiply(EBAMRCellData &a_lhs, const EBAMRCellData &a_rhs)
Multiply data holder by another data holder.
Definition CD_DataOps.cpp:2156
static void kappaScale(EBAMRCellData &a_data) noexcept
Scale data by volume fraction.
Definition CD_DataOps.cpp:2058
static void incr(MFAMRCellData &a_lhs, const MFAMRCellData &a_rhs, const Real a_scale) noexcept
Function which increments data in the form a_lhs = a_lhs + a_rhs*a_scale for all components.
Definition CD_DataOps.cpp:801
static void setCoveredValue(EBAMRCellData &a_lhs, const int a_comp, const Real a_value)
Set value in covered cells. Does specified component.
Definition CD_DataOps.cpp:2552
static void setValue(LevelData< MFInterfaceFAB< T > > &a_lhs, const T &a_value)
Set value in an MFInterfaceFAB data holder.
Definition CD_DataOpsImplem.H:23
static void dotProduct(MFAMRCellData &a_result, const MFAMRCellData &a_data1, const MFAMRCellData &a_data2)
Compote the cell-wise dot product between two data holders.
Definition CD_DataOps.cpp:533
static void averageCellToFace(EBAMRFluxData &a_faceData, const EBAMRCellData &a_cellData, const Vector< ProblemDomain > &a_domains)
Average all components of the cell-centered data to faces.
Definition CD_DataOps.cpp:153
static void copy(MFAMRCellData &a_dst, const MFAMRCellData &a_src)
Copy data from one data holder to another.
Definition CD_DataOps.cpp:1132
static void multiplyScalar(EBAMRCellData &a_lhs, const EBAMRCellData &a_rhs)
Multiply data holder by another data holder.
Definition CD_DataOps.cpp:2253
Type
Type of interpolation methods supported. PWC = Piecewise constant, ignoring the embedded boundary....
Definition CD_EBCoarseToFineInterp.H:42
static bool ebIntersectionBisect(const RefCountedPtr< BaseIF > &a_impFunc, const RealVect &a_oldPos, const RealVect &a_newPos, const Real &a_bisectStep, Real &a_s)
Compute the intersection point between a particle path and an implicit function using a bisection alg...
Definition CD_ParticleOpsImplem.H:177
static void copyDestructive(ParticleContainer< P > &a_dst, ParticleContainer< P > &a_src) noexcept
Copy all the particles from the a_src to a_dst. This destroys the source particles.
Definition CD_ParticleOpsImplem.H:295
static bool domainIntersection(const RealVect &a_oldPos, const RealVect &a_newPos, const RealVect &a_probLo, const RealVect &a_probHi, Real &a_s)
Compute the intersection point between a particle path and a domain side.
Definition CD_ParticleOpsImplem.H:131
Advection and diffused species for DischargeInceptionStepper.
Definition CD_DischargeInceptionSpecies.H:27
Class for streamer inception integral evaluations.
Definition CD_DischargeInceptionStepper.H:80
virtual const std::function< Real(const Real &E, const RealVect &x)> & getAlpha() const noexcept
Get ionization coefficient.
Definition CD_DischargeInceptionStepperImplem.H:2034
void parseRuntimeOptions() override
Parse runtime options.
Definition CD_DischargeInceptionStepperImplem.H:387
virtual const EBAMRCellData * getElectricField() const noexcept
Get the electric field.
Definition CD_DischargeInceptionStepperImplem.H:5422
void parseMode() noexcept
Parse simulation mode.
Definition CD_DischargeInceptionStepperImplem.H:417
void computeIonVelocity(const Real &a_voltage) noexcept
Set the negative ion velocity. Note.
Definition CD_DischargeInceptionStepperImplem.H:5121
virtual void setIonMobility(const std::function< Real(const Real E)> &a_mobility) noexcept
Set the negative ion mobility (field-dependent)
Definition CD_DischargeInceptionStepperImplem.H:1985
virtual void writeReportStationary() const noexcept
Print report to the terminal.
Definition CD_DischargeInceptionStepperImplem.H:4890
virtual Real advance(const Real a_dt) override
Advancement method. Swaps between various kernels.
Definition CD_DischargeInceptionStepperImplem.H:1572
virtual void townsendTrackTrapezoidal(const Real &a_voltage) noexcept
Track particles (positive ions) using a trapezoidal rule and check if the collide with a cathode.
Definition CD_DischargeInceptionStepperImplem.H:3329
virtual void seedUniformParticles() noexcept
Distribute particles in every grid cell.
Definition CD_DischargeInceptionStepperImplem.H:2107
virtual void resetTracerParticles() noexcept
Reset particles.
Definition CD_DischargeInceptionStepperImplem.H:3652
virtual void setIonDensity(const std::function< Real(const RealVect x)> &a_density) noexcept
Set the negative ion density.
Definition CD_DischargeInceptionStepperImplem.H:1973
virtual void computeCriticalVolumeStationary() noexcept
Compute the critical volume of the K values for each voltage.
Definition CD_DischargeInceptionStepperImplem.H:4432
virtual void postRegrid() override
Perform post-regrid operations.
Definition CD_DischargeInceptionStepperImplem.H:1924
virtual void inceptionIntegrateTrapezoidal(const Real &a_voltage) noexcept
K integral: Add integration parts after particles move.
Definition CD_DischargeInceptionStepperImplem.H:2772
virtual void setBackgroundRate(const std::function< Real(const Real &E, const RealVect &x)> &a_backgroundRate) noexcept
Set the background ionization rate (e.g. from cosmic radiation etc).
Definition CD_DischargeInceptionStepperImplem.H:2048
void computeIonDiffusion(const Real &a_voltage) noexcept
Set the negative ion diffusion coefficient.
Definition CD_DischargeInceptionStepperImplem.H:5187
virtual std::pair< Real, RealVect > computeMinimumInceptionVoltage(const EBAMRCellData &a_Uinc) const noexcept
Compute the minimum inception voltage and the starting electron position.
Definition CD_DischargeInceptionStepperImplem.H:4357
virtual void computeTownsendCriterionStationary() noexcept
Solve for the Townsend criterion for each particle in each voltage.
Definition CD_DischargeInceptionStepperImplem.H:3029
virtual void synchronizeSolverTimes(const int a_step, const Real a_time, const Real a_dt) override
Synchronize solver times and time steps.
Definition CD_DischargeInceptionStepperImplem.H:1770
virtual void inceptionIntegrateEuler(const Real &a_voltage) noexcept
Integrate the inception integral using the Euler rule.
Definition CD_DischargeInceptionStepperImplem.H:2600
virtual void computeInceptionVoltageVolume() noexcept
Interpolate between K values to find voltage giving K_inception and store values in m_inceptionVoltag...
Definition CD_DischargeInceptionStepperImplem.H:4096
virtual Real computeIonizationVolumeTransient(const Real &a_voltage) const noexcept
Compute the ionization volume for each voltage.
Definition CD_DischargeInceptionStepperImplem.H:4808
virtual void computeFieldEmission(EBAMRCellData &a_emissionRate, const Real &a_voltage) const noexcept
Compute field emission rates.
Definition CD_DischargeInceptionStepperImplem.H:3950
virtual int getNumberOfPlotVariables() const override
Get the number of plot variables for this time stepper.
Definition CD_DischargeInceptionStepperImplem.H:670
virtual Real computeCriticalVolumeTransient() const noexcept
Compute the critical volume of the K values for each voltage.
Definition CD_DischargeInceptionStepperImplem.H:4523
void registerOperators() override
Register operators.
Definition CD_DischargeInceptionStepperImplem.H:358
virtual void getMaxValueAndLocation(Real &a_maxVal, RealVect &a_maxPos, const EBAMRCellData &a_data) const noexcept
Get the maximum value and location corresponding to the maximum value in the input data holder.
Definition CD_DischargeInceptionStepperImplem.H:5296
virtual void evaluateFunction(EBAMRCellData &a_data, const Real &a_voltage, const std::function< Real(const Real E, const RealVect x)> &a_func) const noexcept
Evaluate a function f = f(E, x) in a volume.
Definition CD_DischargeInceptionStepperImplem.H:4009
void allocate() override
Allocate storage for solvers and time stepper.
Definition CD_DischargeInceptionStepperImplem.H:171
virtual Vector< std::string > getTransientPlotVariableNames() const noexcept
Get plot variable names for transient mode.
Definition CD_DischargeInceptionStepperImplem.H:1008
virtual Mode getMode() const noexcept
Get the solver mode.
Definition CD_DischargeInceptionStepperImplem.H:2100
void parseInceptionAlgorithm() noexcept
Parse the inception algorithm.
Definition CD_DischargeInceptionStepperImplem.H:476
virtual ~DischargeInceptionStepper()
Destructor.
Definition CD_DischargeInceptionStepperImplem.H:111
void solvePoisson() noexcept
Solve the Poisson equation.
Definition CD_DischargeInceptionStepperImplem.H:249
virtual void setAlpha(const std::function< Real(const Real &E, const RealVect &x)> &a_alpha) noexcept
Set the ionization coefficient.
Definition CD_DischargeInceptionStepperImplem.H:2009
virtual void computeInceptionIntegral(EBAMRCellData &a_inceptionIntegral, const Real a_voltage) noexcept
Compute the inception integral for the input voltage.
Definition CD_DischargeInceptionStepperImplem.H:2415
virtual void regrid(const int a_lmin, const int a_oldFinestLevel, const int a_newFinestLevel) override
Time stepper regrid method.
Definition CD_DischargeInceptionStepperImplem.H:1861
bool particleOutsideGrid(const RealVect &a_pos, const RealVect &a_probLo, const RealVect &a_probHi) const noexcept
Check if particle is outside grid boundaries.
Definition CD_DischargeInceptionStepperImplem.H:5081
virtual void writeReportTransient() const noexcept
Print report to the terminal.
Definition CD_DischargeInceptionStepperImplem.H:5001
virtual void rewindTracerParticles() noexcept
Move particles back to their original position.
Definition CD_DischargeInceptionStepperImplem.H:3620
virtual void townsendTrackEuler(const Real &a_voltage) noexcept
Track particles (positive ions) using an Euler rule and check if the collide with a cathode.
Definition CD_DischargeInceptionStepperImplem.H:3216
virtual void writePlotData(LevelData< EBCellFAB > &a_output, int &a_icomp, const std::string a_outputRealm, const int a_level) const override
Write plot data to output holder.
Definition CD_DischargeInceptionStepperImplem.H:1073
void superposition(EBAMRCellData &a_sumField, const MFAMRCellData &a_inhomogeneousField, const MFAMRCellData &a_homogeneousField, const Real a_voltage) const noexcept
Calculate the total electric field = inhomogeneous + V * homogeneous.
Definition CD_DischargeInceptionStepperImplem.H:5266
void parseOptions()
Parse options.
Definition CD_DischargeInceptionStepperImplem.H:372
void setupSolvers() override
Instantiate the tracer particle solver.
Definition CD_DischargeInceptionStepperImplem.H:121
virtual void setEta(const std::function< Real(const Real &E, const RealVect &x)> &a_eta) noexcept
Set the attachment coefficient.
Definition CD_DischargeInceptionStepperImplem.H:2022
virtual void writePlotDataTransient(LevelData< EBCellFAB > &a_output, int &a_icomp, const std::string a_outputRealm, const int a_level) const noexcept
Write plot data for the 'transient' mode.
Definition CD_DischargeInceptionStepperImplem.H:1315
virtual Vector< std::string > getStationaryPlotVariableNames() const noexcept
Get plot variable names for stationary mode.
Definition CD_DischargeInceptionStepperImplem.H:863
virtual void setDetachmentRate(const std::function< Real(const Real &E, const RealVect &x)> &a_detachmentRate) noexcept
Set the detachment rate for negative ions.
Definition CD_DischargeInceptionStepperImplem.H:2061
virtual void computeTownsendCriterionTransient(const Real &a_voltage) noexcept
Solve for the Townsend criterion for each particle in each voltage.
Definition CD_DischargeInceptionStepperImplem.H:3163
virtual void computeIonizationVolumeStationary() noexcept
Compute the ionization volume for each voltage.
Definition CD_DischargeInceptionStepperImplem.H:4710
virtual void computeFieldEmissionStationary() noexcept
Compute field emission rates.
Definition CD_DischargeInceptionStepperImplem.H:3850
void parseOutput() noexcept
Parse output settings.
Definition CD_DischargeInceptionStepperImplem.H:462
virtual void computeInceptionIntegralStationary() noexcept
Solve streamer inception integral for each particle in each voltage and store K values in m_inception...
Definition CD_DischargeInceptionStepperImplem.H:2470
virtual Real computeCriticalAreaTransient() const noexcept
Compute the critical area of the K values for each voltage.
Definition CD_DischargeInceptionStepperImplem.H:4659
virtual Real getCriticalField() const noexcept
Get the breakdown field.
Definition CD_DischargeInceptionStepperImplem.H:5431
virtual Vector< std::string > getPlotVariableNames() const override
Get plot variable names.
Definition CD_DischargeInceptionStepperImplem.H:807
virtual void computeDetachmentStationary() noexcept
Compute the detachment ionization rate for all voltages.
Definition CD_DischargeInceptionStepperImplem.H:3762
virtual void writeData(LevelData< EBCellFAB > &a_output, int &a_comp, const EBAMRCellData &a_data, const std::string a_outputRealm, const int a_level, const bool a_interpToCentroids, const bool a_interpGhost) const noexcept
Write data to output. Convenience function used for IO.
Definition CD_DischargeInceptionStepperImplem.H:5364
void parseVoltages() noexcept
Parse voltage levels.
Definition CD_DischargeInceptionStepperImplem.H:442
virtual void interpolateGradAlphaToParticles() noexcept
Interpolate alpha/|grad(alpha)| onto some scratch particle storage.
Definition CD_DischargeInceptionStepperImplem.H:2397
virtual void setIonDiffusion(const std::function< Real(const Real E)> &a_diffCo) noexcept
Set the negative ion diffusion coefficient (field-dependent)
Definition CD_DischargeInceptionStepperImplem.H:1997
void postInitialize() override
Perform any post-initialization steps.
Definition CD_DischargeInceptionStepperImplem.H:2315
virtual void setSigma(const std::function< Real(const RealVect &x)> &a_sigma) noexcept
Set surface charge distribution.
Definition CD_DischargeInceptionStepperImplem.H:1961
void parseTransportAlgorithm() noexcept
Parse the transport algorithm.
Definition CD_DischargeInceptionStepperImplem.H:533
virtual void seedIonizationParticles(const Real a_voltage) noexcept
Add particles to every cell where alpha - eta > 0.0.
Definition CD_DischargeInceptionStepperImplem.H:2184
DischargeInceptionStepper()
Default constructor.
Definition CD_DischargeInceptionStepperImplem.H:37
void parsePlotVariables() noexcept
Parse plot variables.
Definition CD_DischargeInceptionStepperImplem.H:573
void initialData() override
Fill problem with initial data.
Definition CD_DischargeInceptionStepperImplem.H:237
virtual const std::function< Real(const Real &E, const RealVect &x)> & getEta() const noexcept
Get attachment coefficient.
Definition CD_DischargeInceptionStepperImplem.H:2041
virtual void setSecondaryEmission(const std::function< Real(const Real &E, const RealVect &x)> &a_coeff) noexcept
Set the secondary emission coefficient.
Definition CD_DischargeInceptionStepperImplem.H:2087
virtual Real computeDt() override
Compute a time step to be used by Driver.
Definition CD_DischargeInceptionStepperImplem.H:1485
virtual void preRegrid(const int a_lmin, const int a_oldFinestLevel) override
Perform pre-regrid operations.
Definition CD_DischargeInceptionStepperImplem.H:1841
virtual void printStepReport() override
Print a step report. Used in transient simulations.
Definition CD_DischargeInceptionStepperImplem.H:1788
virtual void setRho(const std::function< Real(const RealVect &x)> &a_rho) noexcept
Set space charge distribution.
Definition CD_DischargeInceptionStepperImplem.H:1949
virtual void writePlotDataStationary(LevelData< EBCellFAB > &a_output, int &a_icomp, const std::string a_outputRealm, const int a_level) const noexcept
Write plot data for the 'stationary' mode.
Definition CD_DischargeInceptionStepperImplem.H:1116
void parseVerbosity() noexcept
Parse class verbosity.
Definition CD_DischargeInceptionStepperImplem.H:402
void registerRealms() override
Register realms. Primal is the only realm we need.
Definition CD_DischargeInceptionStepperImplem.H:346
virtual void computeBackgroundIonizationStationary() noexcept
Compute the background ionization rate for all voltages.
Definition CD_DischargeInceptionStepperImplem.H:3682
virtual void computeInceptionIntegralTransient(const Real &a_voltage) noexcept
Solve streamer inception integral.
Definition CD_DischargeInceptionStepperImplem.H:2565
virtual void setVoltageCurve(const std::function< Real(const Real &a_time)> &a_voltageCurve) noexcept
Set the voltage curve (used for transient mode)
Definition CD_DischargeInceptionStepperImplem.H:1937
virtual void computeCriticalAreaStationary() noexcept
Compute the critical area of the K values for each voltage.
Definition CD_DischargeInceptionStepperImplem.H:4587
virtual void advanceIons(const Real a_dt) noexcept
Advance negative ions.
Definition CD_DischargeInceptionStepperImplem.H:1684
bool particleInsideEB(const RealVect a_pos) const noexcept
Check if particle is inside electrode.
Definition CD_DischargeInceptionStepperImplem.H:5105
virtual Real computeRdot(const Real &a_voltage) const noexcept
Compute integral_Vcr(dne/dt * (1 - eta/alpha) dV)
Definition CD_DischargeInceptionStepperImplem.H:3518
virtual void setFieldEmission(const std::function< Real(const Real &E, const RealVect &x)> &a_currentDensity) noexcept
Set the field emission current.
Definition CD_DischargeInceptionStepperImplem.H:2074
static const std::string Primal
Identifier for perimal realm.
Definition CD_Realm.H:38
Class which is used for run-time monitoring of events.
Definition CD_Timer.H:31
Base class for a tracer particle solver. This solver can advance particles in a pre-defined velocity ...
Definition CD_TracerParticleSolver.H:37
virtual void remap()
Remap particles.
Definition CD_TracerParticleSolverImplem.H:338
void parsePlotVariables()
Parse plot variables.
Definition CD_TracerParticleSolverImplem.H:147
phase::which_phase m_phase
Phase where this solver lives.
Definition CD_TracerParticleSolver.H:360
TracerParticleSolver()
Default constructor.
Definition CD_TracerParticleSolverImplem.H:25
virtual void setTime(const int a_step, const Real a_time, const Real a_dt)
Set the time for this solver.
Definition CD_TracerParticleSolverImplem.H:256
std::string m_realm
Realm where this solver lives.
Definition CD_TracerParticleSolver.H:345
virtual ParticleContainer< P > & getParticles()
Get all particles.
Definition CD_TracerParticleSolverImplem.H:662
void parseVerbosity()
Parse solver verbosity.
Definition CD_TracerParticleSolverImplem.H:162
int m_verbosity
Verbosity level.
Definition CD_TracerParticleSolver.H:380
RefCountedPtr< AmrMesh > m_amr
Handle to AMR mesh.
Definition CD_TracerParticleSolver.H:320
virtual Vector< std::string > getPlotVariableNames() const
Get plot variable names.
Definition CD_TracerParticleSolverImplem.H:481
Real m_dt
Time step.
Definition CD_TracerParticleSolver.H:365
virtual void allocate()
Allocate storage for this solver.
Definition CD_TracerParticleSolverImplem.H:194
int m_timeStep
Time step.
Definition CD_TracerParticleSolver.H:375
virtual void interpolateVelocities()
Interpolate particles velocities.
Definition CD_TracerParticleSolverImplem.H:392
Real m_time
Time.
Definition CD_TracerParticleSolver.H:370
virtual int getNumberOfPlotVariables() const
Get the number of plot variables.
Definition CD_TracerParticleSolverImplem.H:460
ALWAYS_INLINE void loop(const Box &a_computeBox, Functor &&kernel, const IntVect &a_stride=IntVect::Unit)
Launch a C++ kernel over a regular grid.
Definition CD_BoxLoopsImplem.H:20
RealVect position(const Location::Cell a_location, const VolIndex &a_vof, const EBISBox &a_ebisbox, const Real &a_dx)
Compute the position (ignoring the "origin) of a Vof.
Definition CD_LocationImplem.H:20
Real max(const Real &a_input) noexcept
Get the maximum of the input, reduced over MPI ranks (in the Chombo communicator)
Definition CD_ParallelOpsImplem.H:176
Real min(const Real &a_input) noexcept
Get the minimum of the input, reduced over MPI ranks (in the Chombo communicator)
Definition CD_ParallelOpsImplem.H:58
Real sum(const Real &a_value) noexcept
Compute the sum across all MPI ranks.
Definition CD_ParallelOpsImplem.H:353
Real brentSolve(const Real a_point1, const Real a_point2, const std::function< Real(const Real x)> a_func) noexcept
Compute the root of a function between two points. This is a 1D problem.
Definition CD_PolyUtils.cpp:168
constexpr Real Qe
Elementary charge.
Definition CD_Units.H:34