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 NodeMaskLevelOp* const a_opin);
00079
00081
00083 ~AMRNodeLevelMG();
00084
00086
00095 void define(const AMRNodeSolver* const a_parent,
00096 int a_level,
00097 const NodeMaskLevelOp* 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
00163
00165
00183 void computeAMRResidual(Vector<LevelData<NodeFArrayBox> *>& a_phiLevel,
00184 const Vector<LevelData<NodeFArrayBox> *>& a_rhsLevel);
00185
00187
00204 void upSweep(Vector<LevelData<NodeFArrayBox> *>& a_phiLevel,
00205 const Vector<LevelData<NodeFArrayBox> *>& a_rhsLevel);
00206
00208
00230 void downSweep(Vector<LevelData<NodeFArrayBox> *>& a_phiLevel,
00231 const Vector<LevelData<NodeFArrayBox> *>& a_rhsLevel);
00232
00233 protected:
00234
00235
00236 Real computeNorm(const LevelData<NodeFArrayBox>& a_mfinput,
00237 int a_normType) const;
00238
00239
00240
00241 void smooth(LevelData<NodeFArrayBox>& a_phi,
00242 const LevelData<NodeFArrayBox>& a_rhs);
00243
00244
00245 void projectFineInterior(LevelData<NodeFArrayBox>& a_phi,
00246 const LevelData<NodeFArrayBox>& a_phiFine);
00247
00248
00249 void clearMemory();
00250
00251
00252 void setDefaultValues();
00253
00254
00255 const AMRNodeSolver* m_parent;
00256
00257
00258 NodeLevelMG m_levelMG;
00259
00260
00261 NodeMGInterp m_mginterp;
00262
00263
00264 bool m_isDefined;
00265
00266 bool m_verbose;
00267
00268
00269 DisjointBoxLayout m_coarsenedGrids;
00270
00271
00272 LevelData<NodeFArrayBox> m_resid;
00273
00274
00275 LevelData<NodeFArrayBox> m_residInterior;
00276
00277
00278 LevelData<NodeFArrayBox> m_corr;
00279
00280
00281 LevelData<NodeFArrayBox> m_dcorr;
00282
00283
00284 LevelData<NodeFArrayBox> m_LofPhi;
00285
00286
00287 LevelData<NodeFArrayBox> m_phiSave;
00288
00289
00290 LevelData<NodeFArrayBox> m_residCoarsened;
00291
00292
00293 int m_level;
00294
00295
00296 Real m_dx;
00297
00298
00299 NodeMaskLevelOp* m_levelOpPtr;
00300
00301
00302 NodeMaskAverage m_averageOp;
00303
00304
00305 ProblemDomain m_domain;
00306
00307
00308 DisjointBoxLayout m_finerGrids;
00309
00310
00311 DisjointBoxLayout m_coarsenedFineGrids;
00312
00313
00314 LevelData<NodeFArrayBox> m_zeroCoarsenedFiner;
00315
00316
00317
00318 LayoutData< Vector<IntVectSet> > m_IVSV;
00319
00320 LayoutData< Vector<IntVectSet> > m_IVSVext;
00321
00322
00323 LayoutData< Vector<IntVectSet> > m_IVSVcoarsened;
00324
00325
00326 LayoutData< Vector<IntVectSet> > m_IVSVcoarsenedFine;
00327
00328 private:
00329
00330 AMRNodeLevelMG& operator = (const AMRNodeLevelMG&);
00331 AMRNodeLevelMG(const AMRNodeLevelMG&);
00332
00333 };
00334
00335 #endif