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 #ifndef AMRNODELEVELMG_H
00033 #define AMRNODELEVELMG_H
00034
00035 #include <stdlib.h>
00036 #include <iostream>
00037 #include <assert.h>
00038 #include <math.h>
00039 #include "REAL.H"
00040 #include "IntVect.H"
00041 #include "ProblemDomain.H"
00042 #include "NodeFArrayBox.H"
00043 #include "DisjointBoxLayout.H"
00044 #include "LevelData.H"
00045 #include "BaseFab.H"
00046 #include "NodeLevelMG.H"
00047 #include "NodeMGInterp.H"
00048
00049
00050
00051
00052 class AMRNodeSolver;
00053
00055 class AMRNodeLevelMG
00061 {
00062 public:
00063 friend class AMRNodeSolver;
00064
00066
00068
00070 AMRNodeLevelMG();
00071
00073
00076 AMRNodeLevelMG(const AMRNodeSolver* const a_parent,
00077 int a_level,
00078 const NodeLevelOp* const a_opin);
00079
00081
00083 ~AMRNodeLevelMG();
00084
00086
00095 void define(const AMRNodeSolver* const a_parent,
00096 int a_level,
00097 const NodeLevelOp* const a_opin);
00098
00100
00102
00105 bool isDefined() const;
00106
00108
00113 Real computeResidualNorm(int a_normType) const;
00114
00116
00118
00121 void setnumSmoothUp(int a_numSmoothUp);
00122
00124
00127 void setnumSmoothDown(int a_numSmoothDown);
00128
00130
00133 void setnumBottomGSRB(int a_numBottomGSRB);
00134
00136
00138 void setVerbose(bool a_verbose);
00139
00141
00143
00160 void applyAMROperator(LevelData<NodeFArrayBox>& a_Lofphi,
00161 Vector<LevelData<NodeFArrayBox> *>& a_phiLevel);
00162
00164
00182 void computeAMRResidual(Vector<LevelData<NodeFArrayBox> *>& a_phiLevel,
00183 const Vector<LevelData<NodeFArrayBox> *>& a_rhsLevel);
00184
00186
00203 void upSweep(Vector<LevelData<NodeFArrayBox> *>& a_phiLevel,
00204 const Vector<LevelData<NodeFArrayBox> *>& a_rhsLevel);
00205
00207
00229 void downSweep(Vector<LevelData<NodeFArrayBox> *>& a_phiLevel,
00230 const Vector<LevelData<NodeFArrayBox> *>& a_rhsLevel);
00231
00232 protected:
00233
00234
00235 Real computeNorm(const LevelData<NodeFArrayBox>& a_mfinput,
00236 int a_normType) const;
00237
00238
00239
00240 void smooth(LevelData<NodeFArrayBox>& a_phi,
00241 const LevelData<NodeFArrayBox>& a_rhs);
00242
00243
00244 void projectFineInterior(LevelData<NodeFArrayBox>& a_phi,
00245 const LevelData<NodeFArrayBox>& a_phiFine);
00246
00247
00248 void clearMemory();
00249
00250
00251 void setDefaultValues();
00252
00253
00254 const AMRNodeSolver* m_parent;
00255
00256
00257 NodeLevelMG m_levelMG;
00258
00259
00260 NodeMGInterp m_mginterp;
00261
00262
00263 bool m_isDefined;
00264
00265 bool m_verbose;
00266
00267
00268 DisjointBoxLayout m_coarsenedGrids;
00269
00270
00271 LevelData<NodeFArrayBox> m_resid;
00272
00273
00274 LevelData<NodeFArrayBox> m_residInterior;
00275
00276
00277 LevelData<NodeFArrayBox> m_corr;
00278
00279
00280 LevelData<NodeFArrayBox> m_dcorr;
00281
00282
00283 LevelData<NodeFArrayBox> m_LofPhi;
00284
00285
00286 LevelData<NodeFArrayBox> m_phiSave;
00287
00288
00289 LevelData<NodeFArrayBox> m_residCoarsened;
00290
00291
00292 int m_level;
00293
00294
00295 Real m_dx;
00296
00297
00298 NodeLevelOp* m_levelOpPtr;
00299
00300
00301 NodeCoarseAverage m_averageOp;
00302
00303
00304 ProblemDomain m_domain;
00305
00306
00307 DisjointBoxLayout m_finerGrids;
00308
00309
00310 DisjointBoxLayout m_coarsenedFineGrids;
00311
00312
00313 LayoutData< Vector<IntVectSet> > m_IVSV;
00314
00315 LayoutData< Vector<IntVectSet> > m_IVSVext;
00316
00317
00318 LayoutData< Vector<IntVectSet> > m_IVSVcoarsened;
00319
00320
00321 LayoutData< Vector<IntVectSet> > m_IVSVcoarsenedFine;
00322
00323 private:
00324
00325 AMRNodeLevelMG& operator = (const AMRNodeLevelMG&);
00326 AMRNodeLevelMG(const AMRNodeLevelMG&);
00327
00328 };
00329
00330 #endif