11 #ifndef _BASELEVELCRANKNICOLSON_H_ 12 #define _BASELEVELCRANKNICOLSON_H_ 25 #include "NamespaceHeader.H" 42 template <
class LevelDataType,
44 class FluxRegisterType>
65 :
BaseLevelHeatSolver<LevelDataType,FluxDataType,FluxRegisterType>(a_grids, a_refRat, a_level0Domain, a_opFact, a_solver)
107 LevelDataType& a_phiOld,
108 LevelDataType& a_src,
110 FluxRegisterType* a_fineFluxRegPtr,
111 FluxRegisterType* a_crseFluxRegPtr,
112 const LevelDataType* a_crsePhiOldPtr,
113 const LevelDataType* a_crsePhiNewPtr,
119 bool a_zeroPhi =
true,
120 bool a_rhsAlreadyKappaWeighted =
false,
121 int a_fluxStartComponent = 0)
124 int ncomp = a_phiNew.nComp();
126 Interval intervFlux(a_fluxStartComponent, a_fluxStartComponent + ncomp-1);
130 CH_assert((a_level == 0) || (a_crsePhiOldPtr != NULL));
131 CH_assert((a_level == 0) || (a_crsePhiNewPtr != NULL));
132 CH_assert(a_crseNewTime >= a_crseOldTime);
135 LevelDataType rhst, phit;
136 this->
m_ops[a_level]->create(rhst, a_src);
137 this->
m_ops[a_level]->create(phit, a_phiNew);
139 this->
m_ops[a_level]->setToZero(phit);
140 this->
m_ops[a_level]->setToZero(rhst);
143 this->
m_ops[a_level]->setToZero(a_phiNew);
146 LevelDataType coarseData;
147 if ((a_crsePhiOldPtr != NULL) && (a_level > 0))
149 this->
m_ops[a_level-1]->create(coarseData, *a_crsePhiOldPtr);
150 this->
timeInterp(coarseData, *a_crsePhiOldPtr, *a_crsePhiNewPtr,
151 a_oldTime, a_crseOldTime, a_crseNewTime, a_level-1);
156 this->
applyHelm(phit, a_phiOld, &coarseData, a_level, 0.5, a_dt,
false);
159 this->
m_ops[a_level]->incr(rhst, a_src , a_dt);
162 this->
m_ops[a_level]->diagonalScale(phit,
true);
165 if (!a_rhsAlreadyKappaWeighted)
166 this->
m_ops[a_level]->kappaScale(rhst);
169 this->
m_ops[a_level]->incr(rhst, phit, 1.0);
171 this->
solveHelm(a_phiNew, coarseData, rhst, a_level, 0.5, a_dt, a_zeroPhi);
172 this->
incrementFlux(a_flux, a_phiNew, a_level, 0.5, a_dt, -1.0,
false);
177 if ((a_fineFluxRegPtr != NULL) && (a_level < this->
m_grids.
size()-1))
182 FluxDataType& thisFlux = a_flux[dit];
183 for (
int dir=0; dir<
SpaceDim; ++dir)
185 a_fineFluxRegPtr->incrementCoarse(thisFlux[dir],
194 if ((a_crseFluxRegPtr != NULL) && (a_level > 0))
200 FluxDataType& thisFlux = a_flux[dit];
201 for (
int dir=0; dir<
SpaceDim; ++dir)
203 a_crseFluxRegPtr->incrementFine(thisFlux[dir], fluxMult, dit(),
224 #include "NamespaceFooter.H" A reference-counting handle class.
Definition: RefCountedPtr.H:66
virtual ~BaseLevelCrankNicolson()
Destructor, called after destructors of BaseLevelCrankNicolson subclasses.
Definition: BaseLevelCrankNicolson.H:70
#define CH_assert(cond)
Definition: CHArray.H:37
A class to facilitate interaction with physical boundary conditions.
Definition: ProblemDomain.H:130
Definition: BaseLevelHeatSolver.H:44
BaseLevelCrankNicolson(const Vector< DisjointBoxLayout > &a_grids, const Vector< int > &a_refRat, const ProblemDomain &a_level0Domain, RefCountedPtr< AMRLevelOpFactory< LevelDataType > > &a_opFact, const RefCountedPtr< AMRMultiGrid< LevelDataType > > &a_solver)
Definition: BaseLevelCrankNicolson.H:60
Definition: DataIterator.H:140
void applyHelm(LevelDataType &a_ans, const LevelDataType &a_phi, const LevelDataType *a_phiC, int a_level, Real a_mu, Real a_dt, bool a_homogeneousBC)
Definition: BaseLevelHeatSolver.H:294
const int SpaceDim
Definition: SPACE.H:39
void updateSoln(LevelDataType &a_phiNew, LevelDataType &a_phiOld, LevelDataType &a_src, LevelData< FluxDataType > &a_flux, FluxRegisterType *a_fineFluxRegPtr, FluxRegisterType *a_crseFluxRegPtr, const LevelDataType *a_crsePhiOldPtr, const LevelDataType *a_crsePhiNewPtr, Real a_oldTime, Real a_crseOldTime, Real a_crseNewTime, Real a_dt, int a_level, bool a_zeroPhi=true, bool a_rhsAlreadyKappaWeighted=false, int a_fluxStartComponent=0)
Definition: BaseLevelCrankNicolson.H:106
Structure for passing component ranges in code.
Definition: Interval.H:23
Vector< DisjointBoxLayout > m_grids
The disjoint box layouts at every AMR grid level.
Definition: BaseLevelHeatSolver.H:511
Definition: BoxLayoutData.H:136
BaseLevelCrankNicolson & operator=(const BaseLevelCrankNicolson &)
double Real
Definition: REAL.H:33
size_t size() const
Definition: Vector.H:177
void timeInterp(LevelDataType &a_data, const LevelDataType &a_oldData, const LevelDataType &a_newData, Real a_time, Real a_oldTime, Real a_newTime, int a_level)
Definition: BaseLevelHeatSolver.H:484
void solveHelm(LevelDataType &a_phi, LevelDataType &a_phiC, LevelDataType &a_rhs, int a_level, Real a_mu, Real a_dt, bool a_zeroPhi=true)
Definition: BaseLevelHeatSolver.H:387
Definition: AMRMultiGrid.H:231
void incrementFlux(LevelData< FluxDataType > &a_diffusiveFlux, LevelDataType &a_phi, int a_level, Real a_mu, Real a_dt, Real a_sign, bool a_setToZero)
Definition: BaseLevelHeatSolver.H:339
Vector< LevelTGAHelmOp< LevelDataType, FluxDataType > *> m_ops
Definition: BaseLevelHeatSolver.H:522
Definition: BaseLevelCrankNicolson.H:45