00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011
00012
00013
00014
00015 #ifndef AMRNODELEVELMG_H
00016 #define AMRNODELEVELMG_H
00017
00018 #include <stdlib.h>
00019 #include <iostream>
00020 #include "SPACE.H"
00021 #include <math.h>
00022 #include "REAL.H"
00023 #include "IntVect.H"
00024 #include "ProblemDomain.H"
00025 #include "NodeFArrayBox.H"
00026 #include "DisjointBoxLayout.H"
00027 #include "LevelData.H"
00028 #include "BaseFab.H"
00029 #include "NodeLevelMG.H"
00030 #include "NodeMGInterp.H"
00031
00032 #include "UsingNamespace.H"
00033
00034
00035
00036
00037 class AMRNodeSolver;
00038
00040 class AMRNodeLevelMG
00046 {
00047 public:
00048 friend class AMRNodeSolver;
00049
00054
00056
00058 AMRNodeLevelMG();
00059
00061
00064 AMRNodeLevelMG(const AMRNodeSolver* const a_parent,
00065 int a_level,
00066 const NodeLevelOp* const a_opin);
00067
00069
00071 ~AMRNodeLevelMG();
00072
00074
00079 void define(
00080 const AMRNodeSolver* const a_parent,
00082 int a_level,
00084 const NodeLevelOp* const a_opin);
00085
00092
00094
00097 bool isDefined() const;
00098
00100
00102 Real computeResidualNorm(
00103 int a_normType) const;
00104
00111
00113
00116 void setnumSmoothUp(int a_numSmoothUp);
00117
00119
00122 void setnumSmoothDown(int a_numSmoothDown);
00123
00125
00128 void setVerbose(bool a_verbose);
00129
00136
00138
00150 void applyAMROperator(
00151 LevelData<NodeFArrayBox>& a_Lofphi,
00153 Vector<LevelData<NodeFArrayBox> *>& a_phiLevel);
00154
00156
00168 void applyAMRGradient(
00169 LevelData<NodeFArrayBox>& a_gradPhi,
00171 Vector<LevelData<NodeFArrayBox> *>& a_phiLevel);
00172
00174
00180 void computeAMRResidual(
00181 Vector<LevelData<NodeFArrayBox> *>& a_phiLevel,
00183 const Vector<LevelData<NodeFArrayBox> *>& a_rhsLevel);
00184
00186
00198 void upSweep(
00199 Vector<LevelData<NodeFArrayBox> *>& a_phiLevel,
00201 const Vector<LevelData<NodeFArrayBox> *>& a_rhsLevel);
00202
00204
00228 void downSweep(
00229 Vector<LevelData<NodeFArrayBox> *>& a_phiLevel,
00231 const Vector<LevelData<NodeFArrayBox> *>& a_rhsLevel);
00232
00235 protected:
00236
00239 Real computeNorm(
00240 const LevelData<NodeFArrayBox>& a_mfinput,
00242 int a_normType) const;
00243
00246 void smooth(
00247 LevelData<NodeFArrayBox>& a_phi,
00249 const LevelData<NodeFArrayBox>& a_rhs);
00250
00253 void projectFineInterior(LevelData<NodeFArrayBox>& a_phi,
00254 const LevelData<NodeFArrayBox>& a_phiFine);
00255
00258 void clearMemory();
00259
00262 void setDefaultValues();
00263
00266 const AMRNodeSolver* m_parent;
00267
00270 NodeLevelMG m_levelMG;
00271
00274 NodeMGInterp m_mginterp;
00275
00278 bool m_isDefined;
00279
00282 bool m_verbose;
00283
00286 DisjointBoxLayout m_coarsenedGrids;
00287
00290 LevelData<NodeFArrayBox> m_resid;
00291
00292
00293
00296 LevelData<NodeFArrayBox> m_corr;
00297
00300 LevelData<NodeFArrayBox> m_dcorr;
00301
00304 LevelData<NodeFArrayBox> m_LofPhi;
00305
00308 LevelData<NodeFArrayBox> m_phiSave;
00309
00312 LevelData<NodeFArrayBox> m_residCoarsened;
00313
00316 int m_level;
00317
00320 Real m_dx;
00321
00324 NodeLevelOp* m_levelOpPtr;
00325
00328 NodeCoarseAverage m_averageOp;
00329
00332 ProblemDomain m_domain;
00333
00336 DisjointBoxLayout m_finerGrids;
00337
00340 DisjointBoxLayout m_coarsenedFineGrids;
00341
00344 LayoutData< Vector<IntVectSet> > m_IVSV;
00345
00348 LayoutData< Vector<IntVectSet> > m_IVSVext;
00349
00352 LayoutData< Vector<IntVectSet> > m_IVSVcoarsened;
00353
00356 LayoutData< Vector<IntVectSet> > m_IVSVcoarsenedFine;
00357
00358 private:
00359
00360 AMRNodeLevelMG& operator = (const AMRNodeLevelMG&);
00361 AMRNodeLevelMG(const AMRNodeLevelMG&);
00362
00363 };
00364
00365 #endif