13#ifndef CD_FIELDSTEPPERIMPLEM_H
14#define CD_FIELDSTEPPERIMPLEM_H
26#include <CD_NamespaceHeader.H>
29 namespace Electrostatics {
34 CH_TIME(
"FieldStepper::FieldStepper");
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);
61 const Real d = (
x - c).dotProduct(
x - c);
62 return a *
exp(-
d / (2 *
r *
r));
65 m_rhoDielectric = m_rhoGas;
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;
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);
124 m_sigma->
setName(
"Surface charge");
127 m_sigma->setVerbosity(m_verbosity);
134 CH_TIME(
"FieldStepper::registerOperators");
135 if (m_verbosity > 5) {
136 pout() <<
"FieldStepper<T>::registerOperators" <<
endl;
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;
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;
212 m_fieldSolver->computeElectricField();
219 CH_TIME(
"FieldStepper::postInitialize");
220 if (m_verbosity > 5) {
221 pout() <<
"FieldStepper<T>::postInitialize" <<
endl;
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;
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;
304 CH_TIME(
"FieldStepper::getPlotVariableNames");
305 if (m_verbosity > 5) {
306 pout() <<
"FieldStepper<T>::getPlotVariableNames" <<
endl;
311 plotVars.append(m_fieldSolver->getPlotVariableNames());
312 plotVars.append(m_sigma->getPlotVariableNames());
324 CH_TIME(
"FieldStepper::writePlotData");
325 if (m_verbosity > 5) {
326 pout() <<
"FieldStepper<T>::writePlotData" <<
endl;
341 CH_TIME(
"FieldStepper::synchronizeSolverTimes");
342 if (m_verbosity > 5) {
343 pout() <<
"FieldStepper<T>::synchronizeSolverTimes" <<
endl;
357 CH_TIME(
"FieldStepper::preRegrid");
358 if (m_verbosity > 5) {
359 pout() <<
"FieldStepper<T>::preRegrid" <<
endl;
370 CH_TIME(
"FieldStepper::regrid");
371 if (m_verbosity > 5) {
372 pout() <<
"FieldStepper<T>::regrid" <<
endl;
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;
415 CH_TIME(
"FieldStepper::loadBalanceBoxes");
416 if (m_verbosity > 5) {
417 pout() <<
"FieldStepper<T>::loadBalanceBoxes" <<
endl;
431 m_amr->regridOperators(
a_lmin);
453 CH_TIME(
"FieldStepper::setRho");
454 if (m_verbosity > 5) {
455 pout() <<
"FieldStepper<T>::setRho" <<
endl;
462 m_rhoDielectric =
a_rho;
470 CH_TIME(
"FieldStepper::setSigma");
471 if (m_verbosity > 5) {
472 pout() <<
"FieldStepper<T>::setSigma" <<
endl;
475 m_surfaceChargeDensity =
a_sigma;
480#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:226
Class for holding computational loads.
Definition CD_Loads.H:31
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:450
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:468
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
Base class for a tracer particle solver. This solver can advance particles in a pre-defined velocity ...
Definition CD_TracerParticleSolver.H:38
virtual void setRealm(const std::string &a_realm)
Set the solver realm.
Definition CD_TracerParticleSolverImplem.H:233
virtual void registerOperators() const
Register operators needed for AMR core functionality.
Definition CD_TracerParticleSolverImplem.H:177
virtual void setName(const std::string &a_name) noexcept
Set the solver name.
Definition CD_TracerParticleSolverImplem.H:209
TracerParticleSolver()
Default constructor.
Definition CD_TracerParticleSolverImplem.H:26
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:257
virtual void preRegrid(const int a_lbase, const int a_oldFinestLevel)
Perform pre-regrid operations.
Definition CD_TracerParticleSolverImplem.H:307
virtual void setPhase(const phase::which_phase &a_phase)
Set the solver phase.
Definition CD_TracerParticleSolverImplem.H:245
virtual void allocate()
Allocate storage for this solver.
Definition CD_TracerParticleSolverImplem.H:195
virtual void regrid(const int a_lmin, const int a_oldFinestLevel, const int a_newFinestLevel)
Regrid this solver.
Definition CD_TracerParticleSolverImplem.H:322
virtual void parseOptions()
Parse solver options.
Definition CD_TracerParticleSolverImplem.H:63
virtual int getNumberOfPlotVariables() const
Get the number of plot variables.
Definition CD_TracerParticleSolverImplem.H:461
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