00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _LEVELGODUNOV_H_
00012 #define _LEVELGODUNOV_H_
00013
00014 #include "FArrayBox.H"
00015 #include "FluxBox.H"
00016 #include "DisjointBoxLayout.H"
00017 #include "LevelData.H"
00018 #include "PiecewiseLinearFillPatch.H"
00019 #include "LevelFluxRegister.H"
00020 #include "ProblemDomain.H"
00021 #include "Copier.H"
00022
00023 #include "PatchGodunov.H"
00024 #include "NamespaceHeader.H"
00025
00027
00029 class LevelGodunov
00030 {
00031 public:
00033
00036 LevelGodunov();
00037
00039
00043 ~LevelGodunov();
00044
00046
00053 void define(const DisjointBoxLayout& a_thisDisjointBoxLayout,
00054 const DisjointBoxLayout& a_coarserDisjointBoxLayout,
00055 const ProblemDomain& a_domain,
00056 const int& a_refineCoarse,
00057 const Real& a_dx,
00058 const GodunovPhysics* const a_godunovFactory,
00059 const int& a_normalPredOrder,
00060 const bool& a_useFourthOrderSlopes,
00061 const bool& a_usePrimLimiting,
00062 const bool& a_useCharLimiting,
00063 const bool& a_useFlattening,
00064 const bool& a_useArtificialViscosity,
00065 const Real& a_artificialViscosity,
00066 const bool& a_hasCoarser,
00067 const bool& a_hasFiner);
00068
00070
00084 Real step(LevelData<FArrayBox>& a_U,
00085 LevelData<FArrayBox> a_flux[CH_SPACEDIM],
00086 LevelFluxRegister& a_finerFluxRegister,
00087 LevelFluxRegister& a_coarserFluxRegister,
00088 const LevelData<FArrayBox>& a_S,
00089 const LevelData<FArrayBox>& a_UCoarseOld,
00090 const Real& a_TCoarseOld,
00091 const LevelData<FArrayBox>& a_UCoarseNew,
00092 const Real& a_TCoarseNew,
00093 const Real& a_time,
00094 const Real& a_dt);
00095
00097
00099 void computeWHalf(LayoutData<FluxBox>& a_WHalf,
00100 LevelData<FArrayBox>& a_U,
00101 const LevelData<FArrayBox>& a_S,
00102 const LevelData<FArrayBox>& a_UCoarseOld,
00103 const Real& a_TCoarseOld,
00104 const LevelData<FArrayBox>& a_UCoarseNew,
00105 const Real& a_TCoarseNew,
00106 const Real& a_time,
00107 const Real& a_dt);
00108
00110
00112 Real computeUpdate(LevelData<FArrayBox>& a_dU,
00113 LevelFluxRegister& a_finerFluxRegister,
00114 LevelFluxRegister& a_coarserFluxRegister,
00115 const LevelData<FArrayBox>& a_U,
00116 const LayoutData<FluxBox>& a_WHalf,
00117 const Real& a_time,
00118 const Real& a_dt);
00119
00121
00123 Real getMaxWaveSpeed(const LevelData<FArrayBox>& a_U);
00124
00126
00130 GodunovPhysics* getGodunovPhysicsPtr();
00131
00132
00133 const GodunovPhysics* getGodunovPhysicsPtrConst() const ;
00134
00135 void highOrderLimiter(bool a_highOrderLimiter);
00136
00137 protected:
00138
00139 DisjointBoxLayout m_grids;
00140
00141
00142 PatchGodunov m_patchGodunov;
00143
00144
00145 int m_numGhost;
00146
00147
00148 Copier m_exchangeCopier;
00149
00150
00151 LevelData<FArrayBox> m_U;
00152
00153
00154 PiecewiseLinearFillPatch m_patcher;
00155
00156
00157 Real m_dx;
00158
00159
00160 ProblemDomain m_domain;
00161
00162
00163 int m_refineCoarse;
00164
00165
00166 int m_numCons;
00167
00168
00169 int m_numFluxes;
00170
00171
00172 bool m_hasCoarser;
00173 bool m_hasFiner;
00174
00175
00176 int m_normalPredOrder;
00177
00178
00179 bool m_useFourthOrderSlopes;
00180
00181
00182 bool m_usePrimLimiting;
00183 bool m_useCharLimiting;
00184
00185
00186 bool m_useFlattening;
00187
00188
00189 bool m_useArtificialViscosity;
00190 Real m_artificialViscosity;
00191
00192
00193 bool m_isDefined;
00194
00195
00196 private:
00197
00198 void operator=(const LevelGodunov& a_input)
00199 {
00200 MayDay::Error("invalid operator");
00201 }
00202
00203
00204 LevelGodunov(const LevelGodunov& a_input)
00205 {
00206 MayDay::Error("invalid operator");
00207 }
00208 };
00209
00210 #include "NamespaceFooter.H"
00211 #endif