13#ifndef CD_FIELDSTEPPERIMPLEM_H
14#define CD_FIELDSTEPPERIMPLEM_H
26#include <CD_NamespaceHeader.H>
29namespace Electrostatics {
34 CH_TIME(
"FieldStepper::FieldStepper");
38 ParmParse pp(
"FieldStepper");
42 Real blobRadius = 1.0;
43 RealVect blobCenter = RealVect::Zero;
46 Vector<Real> vec(SpaceDim);
49 pp.get(
"init_rho", rho0);
50 pp.get(
"init_sigma", sigma0);
51 pp.get(
"rho_radius", blobRadius);
52 pp.get(
"load_balance", m_loadBalance);
53 pp.get(
"box_sorting", str);
54 pp.get(
"realm", m_realm);
55 pp.get(
"verbosity", m_verbosity);
56 pp.getarr(
"rho_center", vec, 0, SpaceDim);
58 blobCenter = RealVect(D_DECL(vec[0], vec[1], vec[2]));
60 m_rhoGas = [a = rho0, c = blobCenter, r = blobRadius](
const RealVect x) -> Real {
61 const Real d = (x - c).dotProduct(x - c);
62 return a * exp(-d / (2 * r * r));
65 m_rhoDielectric = m_rhoGas;
66 m_surfaceChargeDensity = [s = sigma0](
const RealVect& x) -> Real {
71 m_boxSort = BoxSorting::None;
73 else if (str ==
"std") {
74 m_boxSort = BoxSorting::Std;
76 else if (str ==
"shuffle") {
77 m_boxSort = BoxSorting::Shuffle;
79 else if (str ==
"morton") {
80 m_boxSort = BoxSorting::Morton;
82 else if (str ==
"hilbert") {
83 m_boxSort = BoxSorting::Hilbert;
86 MayDay::Error(
"FieldStepper::FieldStepper - unknown box sorting method requested for argument 'BoxSorting'");
93 CH_TIME(
"FieldStepper::~FieldStepper");
100 CH_TIME(
"FieldStepper::setupSolvers");
101 if (m_verbosity > 5) {
102 pout() <<
"FieldStepper<T>::setupSolvers" << endl;
106 auto voltage = [](
const Real a_time) -> Real {
111 m_fieldSolver = RefCountedPtr<FieldSolver>(
new T());
112 m_fieldSolver->parseOptions();
113 m_fieldSolver->setAmr(m_amr);
114 m_fieldSolver->setComputationalGeometry(m_computationalGeometry);
115 m_fieldSolver->setVoltage(voltage);
116 m_fieldSolver->setRealm(m_realm);
117 m_fieldSolver->setTime(0, 0.0, 0.0);
118 m_fieldSolver->setVerbosity(m_verbosity);
123 m_sigma->setRealm(m_realm);
124 m_sigma->setName(
"Surface charge");
125 m_sigma->parseOptions();
126 m_sigma->setTime(0, 0.0, 0.0);
127 m_sigma->setVerbosity(m_verbosity);
134 CH_TIME(
"FieldStepper::registerOperators");
135 if (m_verbosity > 5) {
136 pout() <<
"FieldStepper<T>::registerOperators" << endl;
139 m_fieldSolver->registerOperators();
140 m_sigma->registerOperators();
147 CH_TIME(
"FieldStepper::registerRealms");
148 if (m_verbosity > 5) {
149 pout() <<
"FieldStepper<T>::registerRealms" << endl;
152 m_amr->registerRealm(m_realm);
159 CH_TIME(
"FieldStepper::allocate");
160 if (m_verbosity > 5) {
161 pout() <<
"FieldStepper<T>::allocate" << endl;
164 m_fieldSolver->allocate();
172 CH_TIME(
"FieldStepper::getPotential");
173 if (m_verbosity > 5) {
174 pout() <<
"FieldStepper<T>::getPotential" << endl;
177 return m_fieldSolver->getPotential();
184 CH_TIME(
"FieldStepper::initialData");
185 if (m_verbosity > 5) {
186 pout() <<
"FieldStepper<T>::initialData" << endl;
194 CH_TIME(
"FieldStepper::solvePoisson");
195 if (m_verbosity > 5) {
196 pout() <<
"FieldStepper<T>::solvePoisson" << endl;
200 MFAMRCellData& phi = m_fieldSolver->getPotential();
201 MFAMRCellData& rho = m_fieldSolver->getRho();
202 EBAMRIVData& sigma = m_sigma->getPhi();
205 const bool converged = m_fieldSolver->solve(phi, rho, sigma);
208 MayDay::Warning(
"FieldStepper<T>::solvePoisson - did not converge");
212 m_fieldSolver->computeElectricField();
219 CH_TIME(
"FieldStepper::postInitialize");
220 if (m_verbosity > 5) {
221 pout() <<
"FieldStepper<T>::postInitialize" << endl;
226 MFAMRCellData& state = m_fieldSolver->getPotential();
227 EBAMRIVData& sigma = m_sigma->getPhi();
231 m_surfaceChargeDensity,
236 m_sigma->resetElectrodes(sigma, 0.0);
237 m_fieldSolver->setRho(m_rhoGas);
240 this->solvePoisson();
247 CH_TIME(
"FieldStepper::advance");
248 if (m_verbosity > 5) {
249 pout() <<
"FieldStepper<T>::advance" << endl;
252 MayDay::Error(
"FieldStepper<T>::advance - calling this is an error. Please set Driver.max_steps = 0");
254 return std::numeric_limits<Real>::max();
262 CH_TIME(
"FieldStepper::writeCheckpointData");
263 if (m_verbosity > 5) {
264 pout() <<
"FieldStepper<T>::writeCheckpointData" << endl;
272FieldStepper<T>::readCheckpointData(HDF5Handle& a_handle,
const int a_lvl)
274 CH_TIME(
"FieldStepper::readCheckpointData");
275 if (m_verbosity > 5) {
276 pout() <<
"FieldStepper<T>::readCheckpointData" << endl;
279 MayDay::Error(
"FieldStepper<T>::readCheckpointData - checkpointing not supported for this module");
287 CH_TIME(
"FieldStepper::getNumberOfPlotVariables");
288 if (m_verbosity > 5) {
289 pout() <<
"FieldStepper<T>::getNumberOfPlotVariables" << endl;
294 ncomp += m_fieldSolver->getNumberOfPlotVariables();
295 ncomp += m_sigma->getNumberOfPlotVariables();
304 CH_TIME(
"FieldStepper::getPlotVariableNames");
305 if (m_verbosity > 5) {
306 pout() <<
"FieldStepper<T>::getPlotVariableNames" << endl;
309 Vector<std::string> plotVars;
311 plotVars.append(m_fieldSolver->getPlotVariableNames());
312 plotVars.append(m_sigma->getPlotVariableNames());
321 const std::string& a_outputRealm,
322 const int a_level)
const
324 CH_TIME(
"FieldStepper::writePlotData");
325 if (m_verbosity > 5) {
326 pout() <<
"FieldStepper<T>::writePlotData" << endl;
329 CH_assert(a_level >= 0);
330 CH_assert(a_level <= m_amr->getFinestLevel());
333 m_fieldSolver->writePlotData(a_output, a_icomp, a_outputRealm, a_level);
334 m_sigma->writePlotData(a_output, a_icomp, a_outputRealm, a_level);
341 CH_TIME(
"FieldStepper::synchronizeSolverTimes");
342 if (m_verbosity > 5) {
343 pout() <<
"FieldStepper<T>::synchronizeSolverTimes" << endl;
350 m_fieldSolver->setTime(a_step, a_time, a_dt);
357 CH_TIME(
"FieldStepper::preRegrid");
358 if (m_verbosity > 5) {
359 pout() <<
"FieldStepper<T>::preRegrid" << endl;
362 m_fieldSolver->preRegrid(a_lbase, a_oldFinestLevel);
363 m_sigma->preRegrid(a_lbase, a_oldFinestLevel);
370 CH_TIME(
"FieldStepper::regrid");
371 if (m_verbosity > 5) {
372 pout() <<
"FieldStepper<T>::regrid" << endl;
378 m_fieldSolver->regrid(a_lmin, a_oldFinestLevel, a_newFinestLevel);
379 m_sigma->regrid(a_lmin, a_oldFinestLevel, a_newFinestLevel);
386 CH_TIME(
"FieldStepper::postRegrid");
387 if (m_verbosity > 5) {
388 pout() <<
"FieldStepper<T>::postRegrid" << endl;
391 this->solvePoisson();
398 CH_TIME(
"FieldStepper::loadBalanceThisRealm");
399 if (m_verbosity > 5) {
400 pout() <<
"FieldStepper<T>::loadBalanceThisRealm" << endl;
403 return (a_realm == m_realm) && m_loadBalance;
409 Vector<Vector<Box>>& a_boxes,
410 const std::string& a_realm,
411 const Vector<DisjointBoxLayout>& a_grids,
413 const int a_finestLevel)
415 CH_TIME(
"FieldStepper::loadBalanceBoxes");
416 if (m_verbosity > 5) {
417 pout() <<
"FieldStepper<T>::loadBalanceBoxes" << endl;
420 CH_assert(m_loadBalance && a_realm == m_realm);
428 a_procs.resize(1 + a_finestLevel);
429 a_boxes.resize(1 + a_finestLevel);
434 m_amr->regridOperators(a_lmin);
440 for (
int lvl = 0; lvl <= a_finestLevel; lvl++) {
441 Vector<long long> boxLoads = m_fieldSolver->computeLoads(a_grids[lvl], lvl);
444 a_boxes[lvl] = a_grids[lvl].boxArray();
456 CH_TIME(
"FieldStepper::setRho");
457 if (m_verbosity > 5) {
458 pout() <<
"FieldStepper<T>::setRho" << endl;
465 m_rhoDielectric = a_rho;
473 CH_TIME(
"FieldStepper::setSigma");
474 if (m_verbosity > 5) {
475 pout() <<
"FieldStepper<T>::setSigma" << endl;
478 m_surfaceChargeDensity = a_sigma;
483#include <CD_NamespaceFooter.H>
Agglomeration of useful data operations.
Declaration of the Physics::Electrostatics::FieldStepper TimeStepper.
static void setValue(LevelData< MFInterfaceFAB< T > > &a_lhs, const T &a_value)
Set value in an MFInterfaceFAB data holder.
Definition CD_DataOpsImplem.H:24
static void makeBalance(Vector< int > &a_ranks, const Vector< T > &a_loads, const Vector< Box > &a_boxes)
Load balancing, assigning ranks to boxes.
Definition CD_LoadBalancingImplem.H:36
static void sort(Vector< Vector< Box > > &a_boxes, Vector< Vector< T > > &a_loads, const BoxSorting a_whichSorting)
Sorts boxes and loads over a hierarchy according to some sorting criterion.
Definition CD_LoadBalancingImplem.H:227
Class for holding computational loads.
Definition CD_Loads.H:31
virtual void resetLoads() noexcept
Reset loads. Sets all loads to 0.
Definition CD_Loads.cpp:55
TimeStepper for solving the electrostatic Poisson equation, optionally with surface charge.
Definition CD_FieldStepper.H:39
void setRho(const std::function< Real(const RealVect &a_pos)> &a_rho, const phase::which_phase a_phase) noexcept
Set the space charge distribution.
Definition CD_FieldStepperImplem.H:453
void preRegrid(const int a_lbase, const int a_finestLevel) override
Perform pre-regrid operations.
Definition CD_FieldStepperImplem.H:355
Vector< std::string > getPlotVariableNames() const override
Get plot variable names.
Definition CD_FieldStepperImplem.H:302
void initialData() override
Set initial data – this sets the space and surface charges.
Definition CD_FieldStepperImplem.H:182
void regrid(const int a_lmin, const int a_oldFinestLevel, const int a_newFinestLevel) override
Regrid method – regrids the potential distribution in FieldSolver (but does not solve the Poisson equ...
Definition CD_FieldStepperImplem.H:368
void setSigma(const std::function< Real(const RealVect &a_pos)> &a_sigma) noexcept
Set the surface charge distribution.
Definition CD_FieldStepperImplem.H:471
void solvePoisson()
Solve the Poisson equation and compute the electric field.
Definition CD_FieldStepperImplem.H:192
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_FieldStepperImplem.H:319
void postInitialize() override
Post-initialization routine. This solves the Poisson equation.
Definition CD_FieldStepperImplem.H:217
int getNumberOfPlotVariables() const override
Get number of plot variables contributed by this TimeStepper.
Definition CD_FieldStepperImplem.H:285
void loadBalanceBoxes(Vector< Vector< int > > &a_procs, Vector< Vector< Box > > &a_boxes, const std::string &a_realm, const Vector< DisjointBoxLayout > &a_grids, const int a_lmin, const int a_finestLevel) override
Load balance grid boxes for a specified realm.
Definition CD_FieldStepperImplem.H:408
void registerRealms() override
Register simulation realms to be used for this simulation module.
Definition CD_FieldStepperImplem.H:145
void allocate() override
Allocation method – allocates memory and internal data for solvers.
Definition CD_FieldStepperImplem.H:157
void registerOperators() override
Register operators for this simulation module.
Definition CD_FieldStepperImplem.H:132
void synchronizeSolverTimes(const int a_step, const Real a_time, const Real a_dt) override
Synchronize solver times and time steps.
Definition CD_FieldStepperImplem.H:339
virtual ~FieldStepper()
Destructor (does nothing)
Definition CD_FieldStepperImplem.H:91
void postRegrid() override
Perform post-regrid operations – this will resolve the Poisson equation.
Definition CD_FieldStepperImplem.H:384
MFAMRCellData & getPotential()
Get the electrostatic potential.
Definition CD_FieldStepperImplem.H:170
bool loadBalanceThisRealm(const std::string &a_realm) const override
Load balancing query for a specified realm. If this returns true for a_realm, load balancing routines...
Definition CD_FieldStepperImplem.H:396
FieldStepper()
Constructor – parses some input options.
Definition CD_FieldStepperImplem.H:32
Real advance(const Real a_dt) override
Perform a single time step with step a_dt.
Definition CD_FieldStepperImplem.H:245
void setupSolvers() override
Solver setup routine. This instantiates the FieldSolver and parses input options.
Definition CD_FieldStepperImplem.H:98
Surface ODE solver.
Definition CD_SurfaceODESolver.H:29
Namespace containing physics models for use with chombo-discharge.
Definition CD_AdvectionDiffusion.H:16
which_phase
Enumeration of supported phases.
Definition CD_MultiFluidIndexSpace.H:38
@ solid
Solid (dielectric) phase.
Definition CD_MultiFluidIndexSpace.H:40
@ gas
Gas phase.
Definition CD_MultiFluidIndexSpace.H:39