12#ifndef CD_FieldStepperImplem_H
13#define CD_FieldStepperImplem_H
25#include <CD_NamespaceHeader.H>
28 namespace Electrostatics {
33 CH_TIME(
"FieldStepper::FieldStepper");
51 pp.get(
"load_balance", m_loadBalance);
52 pp.get(
"box_sorting",
str);
53 pp.get(
"realm", m_realm);
54 pp.get(
"verbosity", m_verbosity);
60 const Real d = (
x - c).dotProduct(
x - c);
61 return a *
exp(-
d / (2 *
r *
r));
64 m_rhoDielectric = m_rhoGas;
70 m_boxSort = BoxSorting::None;
73 m_boxSort = BoxSorting::Std;
75 else if (
str ==
"shuffle") {
76 m_boxSort = BoxSorting::Shuffle;
78 else if (
str ==
"morton") {
79 m_boxSort = BoxSorting::Morton;
81 else if (
str ==
"hilbert") {
82 m_boxSort = BoxSorting::Hilbert;
85 MayDay::Error(
"FieldStepper::FieldStepper - unknown box sorting method requested for argument 'BoxSorting'");
92 CH_TIME(
"FieldStepper::~FieldStepper");
99 CH_TIME(
"FieldStepper::setupSolvers");
100 if (m_verbosity > 5) {
101 pout() <<
"FieldStepper<T>::setupSolvers" <<
endl;
111 m_fieldSolver->parseOptions();
112 m_fieldSolver->setAmr(m_amr);
113 m_fieldSolver->setComputationalGeometry(m_computationalGeometry);
114 m_fieldSolver->setVoltage(
voltage);
115 m_fieldSolver->setRealm(m_realm);
116 m_fieldSolver->setTime(0, 0.0, 0.0);
117 m_fieldSolver->setVerbosity(m_verbosity);
123 m_sigma->
setName(
"Surface charge");
126 m_sigma->setVerbosity(m_verbosity);
133 CH_TIME(
"FieldStepper::registerOperators");
134 if (m_verbosity > 5) {
135 pout() <<
"FieldStepper<T>::registerOperators" <<
endl;
146 CH_TIME(
"FieldStepper::registerRealms");
147 if (m_verbosity > 5) {
148 pout() <<
"FieldStepper<T>::registerRealms" <<
endl;
151 m_amr->registerRealm(m_realm);
158 CH_TIME(
"FieldStepper::allocate");
159 if (m_verbosity > 5) {
160 pout() <<
"FieldStepper<T>::allocate" <<
endl;
171 CH_TIME(
"FieldStepper::getPotential");
172 if (m_verbosity > 5) {
173 pout() <<
"FieldStepper<T>::getPotential" <<
endl;
176 return m_fieldSolver->getPotential();
183 CH_TIME(
"FieldStepper::initialData");
184 if (m_verbosity > 5) {
185 pout() <<
"FieldStepper<T>::initialData" <<
endl;
193 CH_TIME(
"FieldStepper::solvePoisson");
194 if (m_verbosity > 5) {
195 pout() <<
"FieldStepper<T>::solvePoisson" <<
endl;
211 m_fieldSolver->computeElectricField();
218 CH_TIME(
"FieldStepper::postInitialize");
219 if (m_verbosity > 5) {
220 pout() <<
"FieldStepper<T>::postInitialize" <<
endl;
230 m_sigma->resetElectrodes(
sigma, 0.0);
231 m_fieldSolver->setRho(m_rhoGas);
234 this->solvePoisson();
241 CH_TIME(
"FieldStepper::advance");
242 if (m_verbosity > 5) {
243 pout() <<
"FieldStepper<T>::advance" <<
endl;
246 MayDay::Error(
"FieldStepper<T>::advance - callling this is an error. Please set Driver.max_steps = 0");
248 return std::numeric_limits<Real>::max();
256 CH_TIME(
"FieldStepper::writeCheckpointData");
257 if (m_verbosity > 5) {
258 pout() <<
"FieldStepper<T>::writeCheckpointData" <<
endl;
268 CH_TIME(
"FieldStepper::readCheckpointData");
269 if (m_verbosity > 5) {
270 pout() <<
"FieldStepper<T>::readCheckpointData" <<
endl;
273 MayDay::Error(
"FieldStepper<T>::readCheckpointData - checkpointing not supported for this module");
281 CH_TIME(
"FieldStepper::getNumberOfPlotVariables");
282 if (m_verbosity > 5) {
283 pout() <<
"FieldStepper<T>::getNumberOfPlotVariables" <<
endl;
298 CH_TIME(
"FieldStepper::getPlotVariableNames");
299 if (m_verbosity > 5) {
300 pout() <<
"FieldStepper<T>::getPlotVariableNames" <<
endl;
305 plotVars.append(m_fieldSolver->getPlotVariableNames());
306 plotVars.append(m_sigma->getPlotVariableNames());
318 CH_TIME(
"FieldStepper::writePlotData");
319 if (m_verbosity > 5) {
320 pout() <<
"FieldStepper<T>::writePlotData" <<
endl;
335 CH_TIME(
"FieldStepper::synchronizeSolverTimes");
336 if (m_verbosity > 5) {
337 pout() <<
"FieldStepper<T>::synchronizeSolverTimes" <<
endl;
351 CH_TIME(
"FieldStepper::preRegrid");
352 if (m_verbosity > 5) {
353 pout() <<
"FieldStepper<T>::preRegrid" <<
endl;
364 CH_TIME(
"FieldStepper::regrid");
365 if (m_verbosity > 5) {
366 pout() <<
"FieldStepper<T>::regrid" <<
endl;
380 CH_TIME(
"FieldStepper::postRegrid");
381 if (m_verbosity > 5) {
382 pout() <<
"FieldStepper<T>::postRegrid" <<
endl;
385 this->solvePoisson();
392 CH_TIME(
"FieldStepper::loadBalanceThisRealm");
393 if (m_verbosity > 5) {
394 pout() <<
"FieldStepper<T>::loadBalanceThisRealm" <<
endl;
397 return (
a_realm == m_realm) && m_loadBalance;
409 CH_TIME(
"FieldStepper::loadBalanceBoxes");
410 if (m_verbosity > 5) {
411 pout() <<
"FieldStepper<T>::loadBalanceBoxes" <<
endl;
425 m_amr->regridOperators(
a_lmin);
445 const phase::which_phase
a_phase)
noexcept
447 CH_TIME(
"FieldStepper::setRho");
448 if (m_verbosity > 5) {
449 pout() <<
"FieldStepper<T>::setRho" <<
endl;
455 else if (
a_phase == phase::solid) {
456 m_rhoDielectric =
a_rho;
464 CH_TIME(
"FieldStepper::setSigma");
465 if (m_verbosity > 5) {
466 pout() <<
"FieldStepper<T>::setSigma" <<
endl;
469 m_surfaceChargeDensity =
a_sigma;
474#include <CD_NamespaceFooter.H>
Agglomeration of useful data operations.
TimeStepper class for only solving the Poisson equation (with surface charge)
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 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:35
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:225
Class for holding computational loads.
Definition CD_Loads.H:30
Implementation of TimeStepper for solving electrostatic problems. The template parameter is the Field...
Definition CD_FieldStepper.H:36
void setRho(const std::function< Real(const RealVect &a_pos)> &a_rho, const phase::which_phase a_phase) noexcept
Set space charge.
Definition CD_FieldStepperImplem.H:444
void writePlotData(LevelData< EBCellFAB > &a_output, int &a_icomp, const std::string a_outputRealm, const int a_level) const override
Write plot data to file.
Definition CD_FieldStepperImplem.H:313
void preRegrid(const int a_lbase, const int a_finestLevel) override
Perform pre-regrid operations.
Definition CD_FieldStepperImplem.H:349
Vector< std::string > getPlotVariableNames() const override
Get plot variable names.
Definition CD_FieldStepperImplem.H:296
void initialData() override
Set initial data – this sets the space and surface charges.
Definition CD_FieldStepperImplem.H:181
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:362
void setSigma(const std::function< Real(const RealVect &a_pos)> &a_sigma) noexcept
Set surface charge.
Definition CD_FieldStepperImplem.H:462
void solvePoisson()
Internal routine for solving the Poisson equation.
Definition CD_FieldStepperImplem.H:191
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:402
void postInitialize() override
Post-initialization routine. This solves the Poisson equation.
Definition CD_FieldStepperImplem.H:216
int getNumberOfPlotVariables() const override
Get number of plot variables.
Definition CD_FieldStepperImplem.H:279
void registerRealms() override
Register simulation realms to be used for this simulation module.
Definition CD_FieldStepperImplem.H:144
void allocate() override
Allocation method – allocates memory and internal data for solvers.
Definition CD_FieldStepperImplem.H:156
void registerOperators() override
Register operators for this simulation module.
Definition CD_FieldStepperImplem.H:131
void synchronizeSolverTimes(const int a_step, const Real a_time, const Real a_dt) override
Synchronzie solver times and time steps.
Definition CD_FieldStepperImplem.H:333
virtual ~FieldStepper()
Destructor (does nothing)
Definition CD_FieldStepperImplem.H:90
void postRegrid() override
Perform post-regrid operations – this will resolve the Poisson equation.
Definition CD_FieldStepperImplem.H:378
MFAMRCellData & getPotential()
Get the potential.
Definition CD_FieldStepperImplem.H:169
FieldStepper()
Constructor – parses some input options.
Definition CD_FieldStepperImplem.H:31
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:390
Real advance(const Real a_dt) override
Perform a single time step with step a_dt.
Definition CD_FieldStepperImplem.H:239
void setupSolvers() override
Solver setup routine. This instantiates the FieldSolver and parses input options.
Definition CD_FieldStepperImplem.H:97
Base class for a tracer particle solver. This solver can advance particles in a pre-defined velocity ...
Definition CD_TracerParticleSolver.H:37
virtual void setRealm(const std::string &a_realm)
Set the solver realm.
Definition CD_TracerParticleSolverImplem.H:232
virtual void registerOperators() const
Register operators needed for AMR core functionality.
Definition CD_TracerParticleSolverImplem.H:176
virtual void setName(const std::string &a_name) noexcept
Set the solver name.
Definition CD_TracerParticleSolverImplem.H:208
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
virtual void preRegrid(const int a_lbase, const int a_oldFinestLevel)
Perform pre-regrid operations.
Definition CD_TracerParticleSolverImplem.H:306
virtual void setPhase(const phase::which_phase &a_phase)
Set the solver phase.
Definition CD_TracerParticleSolverImplem.H:244
virtual void allocate()
Allocate storage for this solver.
Definition CD_TracerParticleSolverImplem.H:194
virtual void regrid(const int a_lmin, const int a_oldFinestLevel, const int a_newFinestLevel)
Regrid this solver.
Definition CD_TracerParticleSolverImplem.H:321
virtual void parseOptions()
Parse solver options.
Definition CD_TracerParticleSolverImplem.H:62
virtual int getNumberOfPlotVariables() const
Get the number of plot variables.
Definition CD_TracerParticleSolverImplem.H:460
Name containing various physics models for running chombo-discharge code.
Definition CD_AdvectionDiffusion.H:15