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
00053
00054 #ifndef _AMRLEVELMG_H_
00055 #define _AMRLEVELMG_H_
00056
00057 #include "REAL.H"
00058 #include "IntVect.H"
00059 #include "Box.H"
00060 #include "FArrayBox.H"
00061 #include "LevelData.H"
00062 #include "LevelFluxRegister.H"
00063 #include "LevelMG.H"
00064 #include "MGInterp.H"
00065 #include "Copier.H"
00066
00067
00068 class AMRSolver;
00069
00071
00077 class AMRLevelMG
00078 {
00079 public:
00080 friend class AMRSolver;
00081
00083 AMRLevelMG();
00084
00086 ~AMRLevelMG();
00087
00089 AMRLevelMG(const AMRSolver* const a_parent,
00090 int a_level,
00091 const LevelOp* const a_opin,
00092 int a_ncomp=1);
00093
00095
00099 void define(const AMRSolver* const a_parent,
00100 int a_level,
00101 const LevelOp* const a_opin,
00102 int a_ncomp=1);
00103
00105 void setNumSmoothUp(int a_numSmoothUp);
00106
00108 void setNumSmoothDown(int a_numSmoothDown);
00109
00111
00117 void applyAMROperator(Vector<LevelData<FArrayBox> *>& a_phiLevel,
00118 LevelData<FArrayBox>& a_Lofphi);
00119
00121
00125 void applyAMROperatorHphys(Vector<LevelData<FArrayBox> *>& a_phiLevel,
00126 LevelData<FArrayBox>& a_LofPhi);
00127
00129 void computeAMRResidual(Vector<LevelData<FArrayBox> *>& a_phiLevel,
00130 const Vector<LevelData<FArrayBox> *>& a_rhsLevel);
00131
00133
00137 void computeAMRResidualHphys(Vector<LevelData<FArrayBox> *>& a_phiLevel,
00138 const Vector<LevelData<FArrayBox> *>& a_rhsLevel);
00139
00141 void computeAMRResidual(LevelData<FArrayBox>& a_resid,
00142 Vector<LevelData<FArrayBox>* >& a_phiLevel,
00143 const Vector<LevelData<FArrayBox>* >& a_rhsLevel);
00144
00146 void upSweep(Vector<LevelData<FArrayBox> *>& a_phiLevel,
00147 const Vector<LevelData<FArrayBox> *>& a_rhsLevel);
00148
00150 void downSweep(Vector<LevelData<FArrayBox> *>& a_phiLevel,
00151 const Vector<LevelData<FArrayBox> *>& a_rhsLevel);
00152
00154 Vector<Real> computeResidualNorm(int normType) const;
00155
00157 LevelOp* levelOpPtr() const;
00158
00160 bool isDefined() const;
00161
00163 Vector<Real> computeNorm(const LevelData<FArrayBox>& a_mfinput,
00164 int a_normType) const;
00165
00167
00172 void setConvergenceMetric(Real a_metric, int a_comp);
00173
00174 protected:
00176
00179 void smooth(LevelData<FArrayBox>& a_soln,
00180 const LevelData<FArrayBox>& a_rhs);
00181
00183
00186 void clearMemory();
00187
00189
00192 void setDefaultValues();
00193
00195
00202 void reflux(Vector<LevelData<FArrayBox> *>& a_phiLevel,
00203 LevelData<FArrayBox>& a_Lofphi);
00204
00206
00209 void initFRCoarse(Vector<LevelData<FArrayBox> *>& a_phiLevel);
00210
00212
00215 void incrementFRFine(Vector<LevelData<FArrayBox> *>& a_phiLevel);
00216
00218
00221 const AMRSolver* m_parent;
00222
00224
00227 LevelMG m_levelMG;
00228
00230
00233 MGInterp m_mginterp;
00234
00236
00239 LevelFluxRegister m_levfluxreg;
00240
00242
00245 bool m_isDefined;
00246
00248
00251 DisjointBoxLayout m_coarsenedGrids;
00252
00254
00257 LevelData<FArrayBox> m_resid;
00258
00260
00263 LevelData<FArrayBox> m_corr;
00264
00266
00269 LevelData<FArrayBox> m_dcorr;
00270
00272
00275 LevelData<FArrayBox> m_lofPhi;
00276
00278
00281 LevelData<FArrayBox> m_phiSave;
00282
00284
00287 LevelData<FArrayBox> m_resC;
00288
00290
00294 Copier m_residualCopier;
00295
00300 Copier m_fineExchangeCopier;
00301
00303
00306 int m_level;
00307
00309
00313 LevelOp* m_levelopPtr;
00314
00318 CoarseAverage m_averageOp;
00319
00323 bool m_arrayViewVerbose;
00324
00325 private:
00326 void setArrayViewVerbose(bool a_verbosity);
00327 AMRLevelMG& operator = (const AMRLevelMG&);
00328 AMRLevelMG(const AMRLevelMG&);
00329 };
00330
00331 #endif