chombo-discharge
Loading...
Searching...
No Matches
CD_FieldSolver.H
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2021-2026 SINTEF Energy Research
3 *
4 * SPDX-License-Identifier: GPL-3.0-or-later
5 */
6
13#ifndef CD_FIELDSOLVER_H
14#define CD_FIELDSOLVER_H
15
16// Std includes
17#include <functional>
18
19// Our includes
20#include <CD_Location.H>
22#include <CD_AmrMesh.H>
25#include <CD_DataParser.H>
26#include <CD_LookupTable1D.H>
27#include <CD_LookupTable.H>
29#include <CD_NamespaceHeader.H>
30
37{
38public:
43
48 FieldSolver(const FieldSolver& a_other) = delete;
49
54 FieldSolver(const FieldSolver&& a_other) = delete;
55
61 operator=(const FieldSolver& a_other) = delete;
62
68 operator=(const FieldSolver&& a_other) = delete;
69
73 virtual ~FieldSolver();
74
78 virtual void
80
88 virtual void
89 setSolverPermittivities(const MFAMRCellData& a_permittivityCell,
90 const MFAMRFluxData& a_permittivityFace,
91 const MFAMRIVData& a_permittivityEB);
92
99 virtual bool
100 solve(const bool a_zeroPhi = false);
101
109 virtual bool
110 solve(MFAMRCellData& a_potential, const bool a_zerophi = false);
111
121 virtual bool
122 solve(MFAMRCellData& a_phi, const MFAMRCellData& a_rho, const EBAMRIVData& a_sigma, const bool a_zerophi = false) = 0;
123
128 virtual void
130
136 virtual void
137 computeElectricField(MFAMRCellData& a_E, const MFAMRCellData& a_potential) const = 0;
138
144 virtual void
145 computeElectricField(MFAMRFluxData& a_E, const MFAMRCellData& a_potential) const = 0;
146
153 virtual void
154 computeElectricField(EBAMRCellData& a_E,
155 const phase::which_phase a_phase,
156 const MFAMRCellData& a_potential) const = 0;
157
164 virtual void
165 computeElectricField(EBAMRFluxData& a_E,
166 const phase::which_phase a_phase,
167 const MFAMRCellData& a_potential) const = 0;
168
172 virtual void
174
178 virtual void
180
184 virtual void
185 allocate();
186
193 virtual void
194 preRegrid(const int a_lbase, const int a_oldFinestLevel);
195
201 virtual void
202 computeDisplacementField(MFAMRCellData& a_displacementField, const MFAMRCellData& a_electricField);
203
207 virtual void
208 deallocate();
209
218 virtual void
219 regrid(const int a_lmin, const int a_oldFinestLevel, const int a_newFinestLevel);
220
224 virtual void
226
231 void
232 setRho(const Real a_rho);
233
238 void
239 setRho(const std::function<Real(const RealVect)>& a_rho);
240
245 void
246 setSigma(const Real a_sigma);
247
252 void
253 setSigma(const std::function<Real(const RealVect)>& a_sigma);
254
259 void
260 setComputationalGeometry(const RefCountedPtr<ComputationalGeometry>& a_computationalGeometry);
261
266 void
267 setAmr(const RefCountedPtr<AmrMesh>& a_amr);
268
273 virtual void
275
280 virtual void
282
283#ifdef CH_USE_HDF5
290 virtual void
291 writeCheckpointLevel(HDF5Handle& a_handle, const int a_level) const;
292#endif
293
294#ifdef CH_USE_HDF5
301 virtual void
302 readCheckpointLevel(HDF5Handle& a_handle, const int a_level);
303#endif
304
309 virtual void
311
320 virtual void
321 writePlotData(LevelData<EBCellFAB>& a_output,
322 int& a_comp,
323 const std::string& a_outputRealm,
324 const int a_level,
325 const bool a_forceNoInterp = false) const noexcept;
326
340 virtual void
341 writeMultifluidData(LevelData<EBCellFAB>& a_output,
342 int& a_comp,
343 const MFAMRCellData& a_data,
344 const phase::which_phase a_phase,
345 const std::string& a_outputRealm,
346 const int a_level,
347 const bool a_interp) const noexcept;
348
358 virtual void
359 writeSurfaceData(LevelData<EBCellFAB>& a_output,
360 int& a_comp,
361 const LevelData<BaseIVFAB<Real>>& a_data,
362 const std::string& a_outputRealm,
363 const int a_level) const noexcept;
364
369 void
370 setRealm(const std::string& a_realm);
371
379 void
380 setTime(const int a_timeStep, const Real a_time, const Real a_dt);
381
386 void
387 setVerbosity(const int a_verbosity);
388
395 virtual void
396 setVoltage(std::function<Real(const Real a_time)> a_voltage);
397
406 virtual void
407 setDomainSideBcFunction(const int a_dir,
408 const Side::LoHiSide a_side,
409 const ElectrostaticDomainBc::BcFunction& a_function);
410
416 virtual void
417 setElectrodeDirichletFunction(const int a_electrode, const ElectrostaticEbBc::BcFunction& a_function);
418
423 virtual int
425
430 const std::function<Real(const Real a_time)>&
431 getVoltage() const;
432
437 Real
438 getCurrentVoltage() const;
439
444 Real
445 getTime() const;
446
454 Real
456
462 Real
463 computeEnergy(const MFAMRCellData& a_electricField);
464
469 virtual Vector<std::string>
470 getPlotVariableNames() const;
471
481 virtual Vector<long long>
482 computeLoads(const DisjointBoxLayout& a_dbl, const int a_level);
483
489 void
490 setDataLocation(const Location::Cell a_dataLocation);
491
496 std::string
497 getRealm() const;
498
503 MFAMRCellData&
504 getPotential();
505
510 MFAMRCellData&
512
518 MFAMRCellData&
519 getRho();
520
525 MFAMRCellData&
526 getResidue();
527
532 MFAMRCellData&
534
539 MFAMRFluxData&
541
546 MFAMRIVData&
548
553 EBAMRIVData&
554 getSigma();
555
560 Location::Cell
562
563protected:
567 constexpr static int m_comp = 0;
568
572 constexpr static int m_nComp = 1;
573
578
583
587 std::string m_realm;
588
592 std::string m_className;
593
598
603
607 RefCountedPtr<AmrMesh> m_amr;
608
612 MFAMRCellData m_cache;
613
619 Vector<RefCountedPtr<LayoutData<VoFIterator>>> m_grownCellVofIter;
620
624 MFAMRCellData m_potential;
625
629 MFAMRCellData m_electricField;
630
634 MFAMRCellData m_rho;
635
639 EBAMRIVData m_sigma;
640
644 MFAMRCellData m_residue;
645
649 MFAMRCellData m_permittivityCell;
650
654 MFAMRFluxData m_permittivityFace;
655
659 MFAMRIVData m_permittivityEB;
660
665
670
675
680
685
690
695
700
705
710
715
719 Real m_dt;
720
724 Real m_time;
725
730
735
740
744 std::vector<std::pair<Electrode, ElectrostaticEbBc::BcFunction>> m_electrodeBcFunctions;
745
749 std::function<Real(const Real a_time)> m_voltage;
750
754 virtual void
756
760 virtual void
762
766 virtual void
768
772 virtual void
774
779 virtual void
781
786 virtual void
788
795 inline Real
796 getDielectricPermittivity(const RealVect& a_pos) const;
797
808 virtual void
809 setCellPermittivities(EBCellFAB& a_relPerm,
810 const Box& a_cellBox,
811 const EBISBox& a_ebisbox,
812 const RealVect& a_probLo,
813 const Real& a_dx,
814 VoFIterator& a_vofit);
815
826 virtual void
827 setFacePermittivities(EBFluxFAB& a_relPerm,
828 const Box& a_cellBox,
829 const EBISBox& a_ebisbox,
830 const RealVect& a_probLo,
831 const Real& a_dx,
832 std::array<FaceIterator, SpaceDim>& a_faceIter);
833
844 virtual void
845 setEbPermittivities(BaseIVFAB<Real>& a_relPerm,
846 const Box& a_cellBox,
847 const EBISBox& a_ebisbox,
848 const RealVect& a_origin,
849 const Real& a_dx,
850 VoFIterator& a_vofit);
851
859 virtual ElectrostaticDomainBc::BcType
860 parseBcString(const std::string& a_str) const;
861
868 virtual std::string
869 makeBcString(const int a_dir, const Side::LoHiSide a_side) const;
870
875 virtual void
876 fillCoveredPotential(MFAMRCellData& a_phi) const noexcept;
877};
878
879#include <CD_NamespaceFooter.H>
880
881#include <CD_FieldSolverImplem.H>
882
883#endif
Declaration of core class for handling AMR-related operations (with embedded boundaries)
Declaration of base class for defining geometries.
Declaration of various routines for simple parsing of input data.
Declaration of a class for holding function-based boundary conditions on domain edges.
Data holder for holding the voltage at electrodes.
Implementation of CD_FieldSolver.H.
Declaration of cell positions.
Declaration of a lookup table in one independent variable.
Declaration of a table for looking up coefficients etc.
File containing the declaration of TriangleCollection.
Class for handling spatial operations.
Definition CD_AmrMesh.H:45
Abstract base class for geometries.
Definition CD_ComputationalGeometry.H:39
Electrode class for encapsulating the concept of an electrical conductor.
Definition CD_Electrode.H:27
Class which maps boundary condition types to a side and direction.
Definition CD_ElectrostaticDomainBc.H:34
Class which maps boundary condition types to a side and direction.
Definition CD_ElectrostaticEbBc.H:34
Base class for electrostatic solvers.
Definition CD_FieldSolver.H:37
virtual void writeSurfaceData(LevelData< EBCellFAB > &a_output, int &a_comp, const LevelData< BaseIVFAB< Real > > &a_data, const std::string &a_outputRealm, const int a_level) const noexcept
Write surface data to volume data holder.
Definition CD_FieldSolver.cpp:1705
virtual void registerOperators()=0
Register operators for AMR. Derived classes have to implement these.
MFAMRCellData & getElectricField()
Get electric field on both phases.
Definition CD_FieldSolver.cpp:1897
void setSigma(const Real a_sigma)
Set surface charge to specified value.
Definition CD_FieldSolver.cpp:509
const std::function< Real(const Real a_time)> & getVoltage() const
Get voltage function.
Definition CD_FieldSolver.cpp:1853
FieldSolver(const FieldSolver &a_other)=delete
Disallowed copy constructor.
virtual void fillCoveredPotential(MFAMRCellData &a_phi) const noexcept
Utility routine that fills the gas-side covered cells by the potential from the closest electrode.
Definition CD_FieldSolver.cpp:1974
FieldSolver & operator=(const FieldSolver &&a_other)=delete
Disallowed move assignment operator.
bool m_plotSigma
If true, m_sigma will be added to plot files.
Definition CD_FieldSolver.H:699
void setTime(const int a_timeStep, const Real a_time, const Real a_dt)
Set time for this solver.
Definition CD_FieldSolver.cpp:603
RefCountedPtr< MultiFluidIndexSpace > m_multifluidIndexSpace
Multifluid index space.
Definition CD_FieldSolver.H:597
void setAmr(const RefCountedPtr< AmrMesh > &a_amr)
Set the amr object.
Definition CD_FieldSolver.cpp:556
Real getTime() const
Get time.
Definition CD_FieldSolver.cpp:1875
std::string m_className
Class name (i.e., "FieldSolver" for the base class)
Definition CD_FieldSolver.H:592
bool m_plotElectricFieldSolid
If true, the electric field on the inside of dielectrics will be added to plot files.
Definition CD_FieldSolver.H:684
Location::Face m_faceLocation
Flag which specifies where the permittivities are stored.
Definition CD_FieldSolver.H:582
MFAMRCellData m_electricField
Electric field. The centering of this is the same as m_dataLocation.
Definition CD_FieldSolver.H:629
virtual void setFacePermittivities(EBFluxFAB &a_relPerm, const Box &a_cellBox, const EBISBox &a_ebisbox, const RealVect &a_probLo, const Real &a_dx, std::array< FaceIterator, SpaceDim > &a_faceIter)
Set face-centered permittivities.
Definition CD_FieldSolver.cpp:1193
MFAMRCellData m_potential
State data, i.e. the potential. The centering of this is the same as m_dataLocation.
Definition CD_FieldSolver.H:624
virtual void parseRuntimeOptions()=0
Parse runtime options (for derived class)
static constexpr int m_comp
Component number where data is stored.
Definition CD_FieldSolver.H:567
bool m_isVoltageSet
Flag for checking if voltage has been set.
Definition CD_FieldSolver.H:664
Location::Cell m_dataLocation
Flag which specifies that data location.
Definition CD_FieldSolver.H:577
std::string getRealm() const
Get the Realm where this solver is registered.
Definition CD_FieldSolver.cpp:627
virtual void setDomainSideBcFunction(const int a_dir, const Side::LoHiSide a_side, const ElectrostaticDomainBc::BcFunction &a_function)
Boundary condition function on a domain side.
Definition CD_FieldSolver.cpp:822
MFAMRCellData m_cache
Cached state used for regridding.
Definition CD_FieldSolver.H:612
virtual bool solve(MFAMRCellData &a_phi, const MFAMRCellData &a_rho, const EBAMRIVData &a_sigma, const bool a_zerophi=false)=0
Solves Poisson equation onto a_phi using a_rho and a_sigma as right-hand sides.
FieldSolver(const FieldSolver &&a_other)=delete
Disallowed move constructor.
virtual void parseRegridSlopes()
Parse slope regrid.
Definition CD_FieldSolver.cpp:700
virtual Vector< long long > computeLoads(const DisjointBoxLayout &a_dbl, const int a_level)
Get computational loads for a level.
Definition CD_FieldSolver.cpp:1825
Location::Cell getDataLocation() const
Get data location.
virtual void regrid(const int a_lmin, const int a_oldFinestLevel, const int a_newFinestLevel)
Regrid method.
Definition CD_FieldSolver.cpp:445
RefCountedPtr< ComputationalGeometry > m_computationalGeometry
Computational geometry.
Definition CD_FieldSolver.H:602
MFAMRIVData m_permittivityEB
EB permittivity.
Definition CD_FieldSolver.H:659
virtual void writePlotFile()
Write plot file.
Definition CD_FieldSolver.cpp:1259
virtual void setDefaultEbBcFunctions()
Set default Dirichlet boundary conditions on the embedded boundaries.
Definition CD_FieldSolver.cpp:790
virtual int getNumberOfPlotVariables() const
Get number of output fields.
Definition CD_FieldSolver.cpp:1745
virtual void deallocate()
Deallocate internal storage.
Definition CD_FieldSolver.cpp:426
FieldSolver()
Constructor.
Definition CD_FieldSolver.cpp:34
MFAMRCellData & getPotential()
Get potential on both phases.
Definition CD_FieldSolver.cpp:1886
Real getDielectricPermittivity(const RealVect &a_pos) const
Get relative permittivity at some point in space.
Definition CD_FieldSolverImplem.H:21
void setRealm(const std::string &a_realm)
Set Realm.
Definition CD_FieldSolver.cpp:616
MFAMRFluxData m_permittivityFace
Face permittivity.
Definition CD_FieldSolver.H:654
EBAMRIVData & getSigma()
Get m_sigma.
Definition CD_FieldSolver.cpp:1919
virtual void parsePlotVariables()
Function which parses which plot variables to write to plot files.
Definition CD_FieldSolver.cpp:651
virtual void setSolverPermittivities(const MFAMRCellData &a_permittivityCell, const MFAMRFluxData &a_permittivityFace, const MFAMRIVData &a_permittivityEB)
A special routine for when solver permittivities need to change but solver does not.
Definition CD_FieldSolver.cpp:113
FieldSolver & operator=(const FieldSolver &a_other)=delete
Disallowed copy assignment operator.
virtual void computeElectricField(MFAMRCellData &a_E, const MFAMRCellData &a_potential) const =0
Compute the cell-centered electric field.
virtual void computeElectricField(MFAMRFluxData &a_E, const MFAMRCellData &a_potential) const =0
Compute the face-centered electric field.
void setVerbosity(const int a_verbosity)
Set verbosity.
Definition CD_FieldSolver.cpp:592
Real computeCapacitance()
Compute the capacitance.
Definition CD_FieldSolver.cpp:370
virtual void parseOptions()=0
Parse options (for derived class)
virtual void postCheckpoint()
Post checkpoint method.
Definition CD_FieldSolver.cpp:1389
MFAMRIVData & getPermittivityEB()
Get irregular b coefficient.
Definition CD_FieldSolver.cpp:1963
virtual void computeDisplacementField(MFAMRCellData &a_displacementField, const MFAMRCellData &a_electricField)
Compute displacement field from the electric field.
Definition CD_FieldSolver.cpp:180
std::vector< std::pair< Electrode, ElectrostaticEbBc::BcFunction > > m_electrodeBcFunctions
BC functions (Dirichlet) on the electrodes. Used to map space/time to a voltage on the electrodes.
Definition CD_FieldSolver.H:744
virtual void allocate()
Allocates internal storage for FieldSolver. Derived classes may want to overwrite.
Definition CD_FieldSolver.cpp:135
virtual void computeElectricField(EBAMRCellData &a_E, const phase::which_phase a_phase, const MFAMRCellData &a_potential) const =0
Compute the cell-centered electric field on a specific phase.
virtual void setCellPermittivities(EBCellFAB &a_relPerm, const Box &a_cellBox, const EBISBox &a_ebisbox, const RealVect &a_probLo, const Real &a_dx, VoFIterator &a_vofit)
Set cell-centered permittivities.
Definition CD_FieldSolver.cpp:1156
void setDataLocation(const Location::Cell a_dataLocation)
Set the data location for the solver.
Definition CD_FieldSolver.cpp:48
virtual void writePlotData(LevelData< EBCellFAB > &a_output, int &a_comp, const std::string &a_outputRealm, const int a_level, const bool a_forceNoInterp=false) const noexcept
Write output data to a_output.
Definition CD_FieldSolver.cpp:1398
int m_timeStep
Current time step.
Definition CD_FieldSolver.H:714
virtual Vector< std::string > getPlotVariableNames() const
Get output plot names.
Definition CD_FieldSolver.cpp:1780
virtual bool solve(const bool a_zeroPhi=false)
Solve Poisson equation using m_potential, m_rho, and m_sigma.
Definition CD_FieldSolver.cpp:83
std::string m_realm
Realm where this solver is registered.
Definition CD_FieldSolver.H:587
MFAMRCellData & getRho()
Get storage for the space charge density.
Definition CD_FieldSolver.cpp:1908
EBAMRIVData m_sigma
Storage for surface charge density.
Definition CD_FieldSolver.H:639
MFAMRCellData m_residue
Residue, e.g. used after solving Poisson equation.
Definition CD_FieldSolver.H:644
static constexpr int m_nComp
Number of components in data holders.
Definition CD_FieldSolver.H:572
Real getCurrentVoltage() const
Get current voltage.
Definition CD_FieldSolver.cpp:1864
virtual void setVoltage(std::function< Real(const Real a_time)> a_voltage)
Set potential dependence in time.
Definition CD_FieldSolver.cpp:569
virtual void setPermittivities()
Set the permittivities.
Definition CD_FieldSolver.cpp:1079
Real m_time
Current time.
Definition CD_FieldSolver.H:724
virtual void parseVerbosity()
Parse solver class verbosity.
Definition CD_FieldSolver.cpp:638
std::map< ElectrostaticDomainBc::DomainSide, ElectrostaticDomainBc::BcFunction > m_domainBcFunctions
Domain BC functions. This is used to map space/time to a voltage/field at the domain faces.
Definition CD_FieldSolver.H:739
ElectrostaticEbBc m_ebBc
Dirichlet boundary conditions on electrodes.
Definition CD_FieldSolver.H:734
Vector< RefCountedPtr< LayoutData< VoFIterator > > > m_grownCellVofIter
Pre-built VoFIterators for grown-box irregular cells (solid phase, grow=1).
Definition CD_FieldSolver.H:619
virtual void setEbPermittivities(BaseIVFAB< Real > &a_relPerm, const Box &a_cellBox, const EBISBox &a_ebisbox, const RealVect &a_origin, const Real &a_dx, VoFIterator &a_vofit)
Set EB-centered permittivities.
Definition CD_FieldSolver.cpp:1235
virtual void computeElectricField()
Compute the cell-centered electric field.
Definition CD_FieldSolver.cpp:124
void setComputationalGeometry(const RefCountedPtr< ComputationalGeometry > &a_computationalGeometry)
Set the computational geometry.
Definition CD_FieldSolver.cpp:540
MFAMRCellData & getPermittivityCell()
Get cell-centered permittivity.
Definition CD_FieldSolver.cpp:1941
RefCountedPtr< AmrMesh > m_amr
AMR - needed for pretty much everything.
Definition CD_FieldSolver.H:607
MFAMRCellData & getResidue()
Get the residue.
Definition CD_FieldSolver.cpp:1930
virtual ~FieldSolver()
Constructor.
bool m_plotPotential
If true, potential will be added to plot files.
Definition CD_FieldSolver.H:669
virtual void computeElectricField(EBAMRFluxData &a_E, const phase::which_phase a_phase, const MFAMRCellData &a_potential) const =0
Compute the face-centered electric field on a specific phase.
bool m_plotPermittivity
If true, the permittivity will be added to plot files.
Definition CD_FieldSolver.H:694
virtual void parseDomainBc()
Parse domain boundary conditions.
Definition CD_FieldSolver.cpp:837
virtual void setupSolver()=0
Set up solver routines.
virtual ElectrostaticDomainBc::BcType parseBcString(const std::string &a_str) const
Returns BC type based on string.
Definition CD_FieldSolver.cpp:746
Real computeEnergy(const MFAMRCellData &a_electricField)
Compute energy density U = 0.5*int(E.dot.D dV)
Definition CD_FieldSolver.cpp:277
void setRho(const Real a_rho)
Set space charge to constant value everywhere.
Definition CD_FieldSolver.cpp:475
bool m_plotRho
If true, space charge will be added to plot files.
Definition CD_FieldSolver.H:674
bool m_regridSlopes
Use slopes when regridding or ont.
Definition CD_FieldSolver.H:704
bool m_plotElectricField
If true, the electric field will be added to plot files.
Definition CD_FieldSolver.H:679
int m_verbosity
Verbosity for this class.
Definition CD_FieldSolver.H:709
bool m_plotResidue
If true, the residue will be added to plot files.
Definition CD_FieldSolver.H:689
virtual std::string makeBcString(const int a_dir, const Side::LoHiSide a_side) const
Shortcut for making a boundary condition string.
Definition CD_FieldSolver.cpp:713
ElectrostaticDomainBc m_domainBc
Domain boundary conditions for FieldSolver.
Definition CD_FieldSolver.H:729
std::function< Real(const Real a_time)> m_voltage
Voltage function.
Definition CD_FieldSolver.H:749
MFAMRCellData m_permittivityCell
Cell permittivity.
Definition CD_FieldSolver.H:649
virtual void setDefaultDomainBcFunctions()
Set default BC functions. This sets all the m_domainBcFunction objects to s_defaultDomainBcFunction,...
Definition CD_FieldSolver.cpp:769
virtual void preRegrid(const int a_lbase, const int a_oldFinestLevel)
Cache state before regridding.
Definition CD_FieldSolver.cpp:163
virtual void setElectrodeDirichletFunction(const int a_electrode, const ElectrostaticEbBc::BcFunction &a_function)
Set embedded boundary Dirichlet function on a specific electrode.
Definition CD_FieldSolver.cpp:581
MFAMRFluxData & getPermittivityFace()
Get face-centered permittivity.
Definition CD_FieldSolver.cpp:1952
virtual void writeMultifluidData(LevelData< EBCellFAB > &a_output, int &a_comp, const MFAMRCellData &a_data, const phase::which_phase a_phase, const std::string &a_outputRealm, const int a_level, const bool a_interp) const noexcept
Write multifluid data to single-fluid data holders.
Definition CD_FieldSolver.cpp:1441
Real m_dt
Last time step increment.
Definition CD_FieldSolver.H:719
MFAMRCellData m_rho
Storage for space charge density.
Definition CD_FieldSolver.H:634
Two-fluid index space.
Definition CD_MultiFluidIndexSpace.H:50
Namespace for encapsulating various data centerings.
Definition CD_Location.H:25
Phase names namespace.
Definition CD_MultiFluidIndexSpace.H:28
which_phase
Enumeration of supported phases.
Definition CD_MultiFluidIndexSpace.H:38