00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 #ifndef _AMRLEVELMHD_H_
00053 #define _AMRLEVELMHD_H_
00054
00055 #include "FArrayBox.H"
00056 #include "LevelData.H"
00057 #include "AMRLevel.H"
00058 #include "CoarseAverage.H"
00059 #include "FineInterp.H"
00060 #include "LevelFluxRegister.H"
00061 #include "LevelSolver.H"
00062 #include "PoissonOp.H"
00063 #include "Box.H"
00064 #include "IntVectSet.H"
00065 #include "Vector.H"
00066 #include "DisjointBoxLayout.H"
00067
00068 #include "LevelGodunov.H"
00069 #include "PhysIBC.H"
00070
00072
00074 class AMRLevelMHD: public AMRLevel
00075 {
00076 public:
00078
00080 AMRLevelMHD();
00081
00083
00085 virtual ~AMRLevelMHD();
00086
00088
00090 void defineParams(const Real& a_cfl,
00091 const Real& a_domainLength,
00092 const int& a_verbosity,
00093 const Real& a_refineThresh,
00094 const int& a_tagBufferSize,
00095 const Real& a_initialDtMultiplier,
00096 const GodunovPhysics* const a_godunovPhysics,
00097 const int& a_normalPredOrder,
00098 const bool& a_useFourthOrderSlopes,
00099 const bool& a_usePrimLimiting,
00100 const bool& a_useCharLimiting,
00101 const bool& a_useFlattening,
00102 const bool& a_useArtificialViscosity,
00103 const Real& a_artificialViscosity,
00104 const bool& a_doFilterBField);
00105
00107
00109 virtual void define(AMRLevel* a_coarserLevelPtr,
00110 const Box& a_problemDomain,
00111 int a_level,
00112 int a_refRatio);
00113
00115
00117 virtual void define(AMRLevel* a_coarserLevelPtr,
00118 const ProblemDomain& a_problemDomain,
00119 int a_level,
00120 int a_refRatio);
00121
00123
00125 virtual Real advance();
00126
00128
00130 virtual void postTimeStep();
00131
00133
00135 virtual void tagCells(IntVectSet& a_tags);
00136
00138
00140 virtual void tagCellsInit(IntVectSet& a_tags);
00141
00143
00145 virtual void regrid(const Vector<Box>& a_newGrids);
00146
00148
00150 virtual void initialGrid(const Vector<Box>& a_newGrids);
00151
00153
00155 virtual void initialData();
00156
00158
00160 virtual void postInitialize();
00161
00162 #ifdef CH_USE_HDF5
00163
00164
00166 virtual void writeCheckpointHeader(HDF5Handle& a_handle) const;
00167
00169
00171 virtual void writeCheckpointLevel(HDF5Handle& a_handle) const;
00172
00174
00176 virtual void readCheckpointHeader(HDF5Handle& a_handle);
00177
00179
00181 virtual void readCheckpointLevel(HDF5Handle& a_handle);
00182
00184
00186 virtual void writePlotHeader(HDF5Handle& a_handle) const;
00187
00189
00191 virtual void writePlotLevel(HDF5Handle& a_handle) const;
00192 #endif
00193
00195
00197 virtual Real computeDt();
00198
00200
00202 virtual Real computeInitialDt();
00203
00205 const LevelData<FArrayBox>& getStateNew() const;
00206
00208 const LevelData<FArrayBox>& getStateOld() const;
00209
00211 bool allDefined() const;
00212
00213
00214 protected:
00215
00216 DisjointBoxLayout loadBalance(const Vector<Box>& a_grids);
00217
00218
00219 void levelSetup();
00220
00221
00222 void DivergenceB(LevelData<FArrayBox>& a_divb,
00223 const LayoutData<FluxBox>& a_WHalf);
00224
00225
00226 void ProjectBField(LayoutData<FluxBox>& a_WHalf,
00227 const LevelData<FArrayBox>& a_phi);
00228
00229
00230 void FilterBFieldOld(LevelData<FArrayBox> &a_U);
00231
00232
00233 void FilterBField(LevelData<FArrayBox>& a_U,
00234 LevelFluxRegister& a_finerFluxRegister,
00235 LevelFluxRegister& a_coarserFluxRegister);
00236
00237
00238 AMRLevelMHD* getCoarserLevel() const;
00239
00240
00241 AMRLevelMHD* getFinerLevel() const;
00242
00243
00244 LevelData<FArrayBox> m_UOld,m_UNew;
00245
00246
00247 LevelData<FArrayBox> m_Phi;
00248
00249
00250 LevelData<FArrayBox> m_flux[CH_SPACEDIM];
00251
00252
00253 LayoutData<FluxBox> m_whalf;
00254
00255
00256 LevelData<FArrayBox> m_source;
00257
00258
00259 LevelData<FArrayBox> m_rhs;
00260
00261 Real m_cfl;
00262
00263
00264 Real m_dx;
00265
00266
00267 FineInterp m_fineInterp;
00268
00269
00270 CoarseAverage m_coarseAverage;
00271
00272
00273 Real m_dtNew;
00274
00275
00276 int m_numStates;
00277
00278
00279 int m_numPrims;
00280
00281
00282 int m_numFluxes;
00283
00284
00285 Vector<string> m_stateNames;
00286
00287
00288 Vector<string> m_plotNames;
00289
00290
00291 int m_numGhost;
00292
00293
00294 Real m_domainLength;
00295
00296
00297 LevelGodunov m_levelGodunov;
00298
00299
00300 LevelSolver m_levelSolver;
00301
00302
00303 LevelFluxRegister m_fluxRegister;
00304
00305
00306 GodunovPhysics* m_gdnvPhysics;
00307
00308
00309 PoissonOp m_poissonOp;
00310
00311 int m_normalPredOrder;
00312
00313
00314 bool m_useFourthOrderSlopes;
00315
00316
00317 bool m_usePrimLimiting;
00318 bool m_useCharLimiting;
00319
00320
00321 bool m_useFlattening;
00322
00323
00324 bool m_useArtificialViscosity;
00325 Real m_artificialViscosity;
00326
00327
00328 bool m_doFilterBField;
00329
00330
00331 Real m_refineThresh;
00332
00333
00334 int m_tagBufferSize;
00335
00336
00337 bool m_hasCoarser;
00338 bool m_hasFiner;
00339
00340
00341 DisjointBoxLayout m_grids;
00342
00343
00344 bool m_paramsDefined;
00345
00346
00347 private:
00348
00349 void operator=(const AMRLevelMHD& a_input)
00350 {
00351 MayDay::Error("invalid operator");
00352 }
00353
00354
00355 AMRLevelMHD(const AMRLevelMHD& a_input)
00356 {
00357 MayDay::Error("invalid operator");
00358 }
00359 };
00360
00361 #endif