00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _AMRLEVELADVECTDIFFUSE_H_
00012 #define _AMRLEVELADVECTDIFFUSE_H_
00013
00014 #include "FArrayBox.H"
00015 #include "LevelData.H"
00016 #include "AMRLevel.H"
00017 #include "CoarseAverage.H"
00018 #include "FineInterp.H"
00019 #include "LevelFluxRegister.H"
00020
00021 #include "LevelAdvect.H"
00022 #include "PhysIBC.H"
00023 #include "ProblemDomain.H"
00024 #include "IntVectSet.H"
00025 #include "Vector.H"
00026 #include "RealVect.H"
00027 #include "LevelFluxRegister.H"
00028 #include "DisjointBoxLayout.H"
00029 #include "AdvectionFunctions.H"
00030 #include "BCFunc.H"
00031 #include "LevelTGA.H"
00032 #include "AMRPoissonOp.H"
00033 #include "BiCGStabSolver.H"
00034 #include "RelaxSolver.H"
00035
00036 #include "NamespaceHeader.H"
00037
00038
00039
00040
00041 class AMRLevelAdvectDiffuse : public AMRLevel
00042 {
00043 public:
00044
00045
00046 AMRLevelAdvectDiffuse()
00047 {
00048 m_isDefined = false;
00049 }
00050
00051
00052 AMRLevelAdvectDiffuse(const AdvectPhysics& a_gphys,
00053 AdvectionVelocityFunction a_advFunc,
00054 BCHolder a_bcFunc,
00055 const Real& a_cfl,
00056 const Real& a_domainLength,
00057 const Real& a_refineThresh,
00058 const int& a_tagBufferSize,
00059 const Real& a_initialDtMultiplier,
00060 const bool& a_useLimiting,
00061 const Real& a_nu)
00062 {
00063 define(a_gphys, a_advFunc, a_bcFunc, a_cfl, a_domainLength, a_refineThresh,
00064 a_tagBufferSize, a_initialDtMultiplier, a_useLimiting, a_nu);
00065 }
00066
00067 void makeDiffusiveSource(LevelData<FArrayBox>& a_diffusiveSource);
00068
00069
00070 void define(
00071 const AdvectPhysics& a_gphys,
00072
00073 AdvectionVelocityFunction a_advFunc,
00074
00075 BCHolder a_bcFunc,
00076
00077 const Real& a_cfl,
00078
00079 const Real& a_domainLength,
00080
00081 const Real& a_refineThresh,
00082
00083 const int& a_tagBufferSize,
00084
00085 const Real& a_initialDtMultiplier,
00086
00087 const bool& a_useLimiting,
00088
00089 const Real& a_nu);
00090
00091
00092 virtual ~AMRLevelAdvectDiffuse();
00093
00094
00095 virtual void define(AMRLevel* a_coarserLevelPtr,
00096 const Box& a_problemDomain,
00097 int a_level,
00098 int a_refRatio)
00099 {
00100 MayDay::Error("never called--historical");
00101 }
00102
00103
00104
00105
00106 virtual void define(
00107 AMRLevel* a_coarserLevelPtr,
00108 const ProblemDomain& a_problemDomain,
00109 int a_level,
00110 int a_refRatio);
00111
00112
00113 virtual Real advance();
00114
00115
00116 virtual void postTimeStep();
00117
00118
00119 virtual void tagCells(IntVectSet& a_tags) ;
00120
00121
00122 virtual void tagCellsInit(IntVectSet& a_tags) ;
00123
00124
00125 virtual void regrid(const Vector<Box>& a_newGrids);
00126
00127
00128 virtual void initialGrid(const Vector<Box>& a_newGrids);
00129
00130
00131 virtual void initialData();
00132
00133
00134 virtual void postInitialize();
00135
00136 #ifdef CH_USE_HDF5
00137
00138 virtual void writeCheckpointHeader(HDF5Handle& a_handle) const;
00139
00140
00141 virtual void writeCheckpointLevel(HDF5Handle& a_handle) const;
00142
00143
00144 virtual void readCheckpointHeader(HDF5Handle& a_handle);
00145
00146
00147 virtual void readCheckpointLevel(HDF5Handle& a_handle);
00148
00149
00150 virtual void writePlotHeader(HDF5Handle& a_handle) const;
00151
00152
00153 virtual void writePlotLevel(HDF5Handle& a_handle) const;
00154 #endif
00155
00156
00157 virtual Real computeDt();
00158
00159
00160 virtual Real computeInitialDt();
00161
00162
00163 LevelData<FArrayBox>& getStateNew()
00164 {
00165 return m_UNew;
00166 }
00167
00168
00169 LevelData<FArrayBox>& getStateOld()
00170 {
00171 return m_UOld;
00172 }
00173 protected:
00174 void setSolverCoef(Real a_alpha, Real a_beta);
00175 void interpolateInTime(LevelData<FArrayBox>& a_interp,
00176 const LevelData<FArrayBox>& a_old,
00177 const LevelData<FArrayBox>& a_new,
00178 Real a_time, Real a_tOld, Real a_tNew);
00179
00180 void getHierarchyAndGrids(Vector<AMRLevelAdvectDiffuse*>& a_hierarchy,
00181 Vector<DisjointBoxLayout>& a_grids,
00182 Vector<int>& a_refRat,
00183 ProblemDomain& a_lev0Dom,
00184 Real& a_lev0Dx);
00185
00186 void doImplicitReflux();
00187
00188 void printRefluxRHSMax(const std::string& a_preflix) ;
00189
00190 Real diffusiveAdvance(LevelData<FArrayBox>& a_diffusiveSource);
00191 void defineSolvers();
00192 BCHolder m_bcFunc;
00193
00194 static RefCountedPtr<LevelTGA> s_diffuseLevTGA;
00195
00196 static RefCountedPtr<AMRMultiGrid<LevelData<FArrayBox> > > s_diffuseAMRMG;
00197
00198 static RefCountedPtr<AMRLevelOpFactory<LevelData<FArrayBox> > > s_diffuseOpFact;
00199
00200 static BiCGStabSolver<LevelData<FArrayBox> > s_botSolver;
00201
00202
00203
00204 void getCoarseDataPointers(LevelData<FArrayBox>** a_coarserDataOldPtr,
00205 LevelData<FArrayBox>** a_coarserDataNewPtr,
00206 LevelFluxRegister** a_coarserFRPtr,
00207 LevelFluxRegister** a_finerFRPtr,
00208 Real& a_tCoarserOld,
00209 Real& a_tCoarserNew);
00210
00211 void fillAdvectionVelocity();
00212
00213 void levelSetup();
00214
00215
00216 AMRLevelAdvectDiffuse* getCoarserLevel() const;
00217
00218
00219 AMRLevelAdvectDiffuse* getFinerLevel() const;
00220
00221
00222 LevelData<FArrayBox> m_UOld,m_UNew,m_dU;
00223 LevelData<FluxBox> m_advVel;
00224
00225 Vector<string> m_stateNames;
00226 bool m_isDefined;
00227 Real m_cfl;
00228 Real m_domainLength;
00229 Real m_refineThresh;
00230 int m_tagBufferSize;
00231 Real m_initialDtMultiplier;
00232 bool m_useLimiting;
00233 Real m_nu;
00234 Real m_dx;
00235 RefCountedPtr<AdvectPhysics> m_advPhys;
00236 AdvectionVelocityFunction m_advFunc;
00237
00238 FineInterp m_fineInterp;
00239 CoarseAverage m_coarseAverage;
00240 Real m_dtNew;
00241 int m_numGhost;
00242 LevelAdvect m_levelGodunov;
00243 LevelFluxRegister m_fluxRegister;
00244
00245 bool m_hasCoarser;
00246 bool m_hasFiner;
00247 bool m_doImplicitReflux;
00248 bool m_hasDiffusion;
00249
00250 DisjointBoxLayout m_grids;
00251
00252 private:
00253
00254
00255 void operator=(const AMRLevelAdvectDiffuse&);
00256 AMRLevelAdvectDiffuse(const AMRLevelAdvectDiffuse&);
00257 };
00258
00259 #include "NamespaceFooter.H"
00260
00261 #endif