00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011
00012
00013 #ifndef _EBLEVELGODUNOV_H_
00014 #define _EBLEVELGODUNOV_H_
00015
00016 #include "EBCellFAB.H"
00017 #include "DisjointBoxLayout.H"
00018 #include "LevelData.H"
00019 #include "PiecewiseLinearFillPatch.H"
00020 #include "EBPWLFillPatch.H"
00021 #include "EBFluxRegister.H"
00022 #include "ProblemDomain.H"
00023 #include "EBPatchGodunovFactory.H"
00024 #include "EBLevelRedist.H"
00025 #include "NamespaceHeader.H"
00026
00028
00030 class EBLevelGodunov
00031 {
00032 public:
00034
00037 EBLevelGodunov();
00038
00040
00044 ~EBLevelGodunov();
00045
00047
00056 void define(const DisjointBoxLayout& a_thisDBL,
00057 const DisjointBoxLayout& a_coarDBL,
00058 const EBISLayout& a_thisEBISL,
00059 const EBISLayout& a_coarEBISL,
00060 const ProblemDomain& a_DProblem,
00061 const int& a_nRefine,
00062 const RealVect& a_dx,
00063 const bool& a_useMassRedist,
00064 const bool& a_doSmushing,
00065 const bool& a_doRZCoords,
00066 const bool& a_hasSourceTerm,
00067 const EBPatchGodunovFactory* const a_patchGodunov,
00068 const bool& a_hasCoarser,
00069 const bool& a_hasFiner);
00070
00072 void floorConserved(LevelData<EBCellFAB>& a_consState,
00073 Real a_time, Real a_dt);
00074
00076
00088 Real step(LevelData<EBCellFAB>& a_consState,
00089 LevelData<BaseIVFAB<Real> >& a_massDiff,
00090 EBFluxRegister& a_fineFluxRegister,
00091 EBFluxRegister& a_coarFluxRegister,
00092 const LevelData<EBCellFAB>& a_consStateCoarseOld,
00093 const LevelData<EBCellFAB>& a_consStateCoarseNew,
00094 const Real& a_time,
00095 const Real& a_TCold,
00096 const Real& a_TCNew,
00097 const Real& a_dt);
00098
00099 void
00100 getDrhoDtOverRho(LevelData<EBCellFAB>& a_drhoDt,
00101 const LevelData<EBCellFAB>& a_rhoNew,
00102 const LevelData<EBCellFAB>& a_rhoOld,
00103 const Real& a_dt);
00104
00106 Real getMaxWaveSpeed(const LevelData<EBCellFAB>& a_state);
00107
00108 bool isDefined() const;
00109
00110
00111 protected:
00112 void fillConsState(LevelData<EBCellFAB>& a_consState,
00113 const LevelData<EBCellFAB>& a_consStateCoarseOld,
00114 const LevelData<EBCellFAB>& a_consStateCoarseNew,
00115 const Real& a_time,
00116 const Real& a_coarTimeOld,
00117 const Real& a_coarTimeNew);
00118
00119 void computeFlattening(Real a_time, Real a_dt,
00120 LevelData<EBCellFAB>& a_consState);
00121
00122 void doRegularUpdate(EBFluxRegister& a_fineFluxRegister,
00123 EBFluxRegister& a_coarFluxRegister,
00124 Real a_time, Real a_dt,
00125 LevelData<EBCellFAB>& a_consState);
00126
00127 Real doIrregularUpdate(EBFluxRegister& a_fineFluxRegister,
00128 EBFluxRegister& a_coarFluxRegister,
00129 LevelData<BaseIVFAB<Real> >& a_massDiff,
00130 Real a_time, Real a_dt,
00131 LevelData<EBCellFAB>& a_consState);
00132
00133
00134
00135 LayoutData<IntVectSet> m_irregSetsSmall;
00136
00137
00138 LayoutData<IntVectSet> m_irregSetsGrown[SpaceDim];
00139
00140 LevelData<BaseIFFAB<Real> > m_fluxInterpolants[SpaceDim];
00141 LevelData<BaseIVFAB<Real> > m_nonConsDivergence;
00142 LevelData<BaseIVFAB<Real> > m_ebIrregFaceFlux;
00143 LayoutData<IntVectSet> m_cfIVS;
00144 bool m_hasCoarser;
00145 bool m_hasFiner;
00146 DisjointBoxLayout m_thisGrids;
00147 DisjointBoxLayout m_coarGrids;
00148 EBISLayout m_thisEBISL;
00149 EBISLayout m_coarEBISL;
00150 bool m_isDefined;
00151 EBPatchGodunov* m_ebPatchGodunov;
00152 RealVect m_dx;
00153 ProblemDomain m_domain;
00154 int m_refRatCrse;
00155 int m_nCons;
00156 int m_nFlux;
00157 int m_nGhost;
00158 EBPWLFillPatch m_patcher;
00159 bool m_useMassRedist;
00160 EBLevelRedist m_ebLevelRedist;
00161 static int s_timestep;
00162 bool m_doSmushing;
00163 bool m_doRZCoords;
00164 bool m_hasSourceTerm;
00165 LevelData<EBCellFAB> m_flattening;
00166 private:
00167
00168 void operator=(const EBLevelGodunov& a_input)
00169 {
00170 MayDay::Error("invalid operator");
00171 }
00172 EBLevelGodunov(const EBLevelGodunov& a_input)
00173 {
00174 MayDay::Error("invalid operator");
00175 }
00176 };
00177
00178 #include "NamespaceFooter.H"
00179 #endif