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 NODELEVELMG_H
00033 #define NODELEVELMG_H
00034
00035 #include <iostream>
00036 #include <cmath>
00037 #include <assert.h>
00038 #include <cstdlib>
00039 #include "REAL.H"
00040 #include "ProblemDomain.H"
00041 #include "DisjointBoxLayout.H"
00042 #include "NodeFArrayBox.H"
00043 #include "LevelData.H"
00044 #include "NodeMaskAverage.H"
00045 #include "NodeMaskLevelOp.H"
00046 #include "NodeMGInterp.H"
00047
00049
00054 class NodeLevelMG
00055 {
00056 public:
00057
00059
00061
00063 NodeLevelMG();
00064
00066
00069 NodeLevelMG(const DisjointBoxLayout& a_grids,
00070 const DisjointBoxLayout* a_gridsCoarsePtr,
00071 const ProblemDomain& a_domain,
00072 Real a_dx,
00073 int a_refToCoarse,
00074 const NodeMaskLevelOp* const a_opin,
00075 int a_nCoarserLevels);
00076
00077 NodeLevelMG(const DisjointBoxLayout& a_grids,
00078 const DisjointBoxLayout* a_gridsCoarsePtr,
00079 const Box& a_domain,
00080 Real a_dx,
00081 int a_refToCoarse,
00082 const NodeMaskLevelOp* const a_opin,
00083 int a_nCoarserLevels);
00085
00087 ~NodeLevelMG();
00088
00090
00093 NodeLevelMG(NodeLevelMG& a_L,
00094 int a_refToCoarse,
00095 const NodeMaskLevelOp* a_opin);
00096
00098
00111 void define(const DisjointBoxLayout& a_grids,
00112 const DisjointBoxLayout* a_gridsCoarsePtr,
00113 const ProblemDomain& a_domain,
00114 Real a_dx,
00115 int a_refToCoarse,
00116 const NodeMaskLevelOp* const a_opin,
00117 int a_nCoarserLevels);
00118
00119 void define(const DisjointBoxLayout& a_grids,
00120 const DisjointBoxLayout* a_gridsCoarsePtr,
00121 const Box& a_domain,
00122 Real a_dx,
00123 int a_refToCoarse,
00124 const NodeMaskLevelOp* const a_opin,
00125 int a_nCoarserLevels);
00126
00128
00135 void define(const NodeLevelMG& a_L,
00136 int a_refToCoarse,
00137 const NodeMaskLevelOp* a_opin);
00138
00140 void clear();
00141
00143
00145
00148 bool isDefined() const;
00149
00151
00153
00155 void setnumBottomGSRB(int a_numBottomGSRB);
00156
00158
00160 void setnumSmoothUp(int a_numSmoothUp);
00161
00163
00165 void setnumSmoothDown(int a_numSmoothDown);
00166
00168
00170 void setVerbose(bool a_verbose)
00171 {m_verbose = a_verbose;}
00172
00174
00176
00191 void mgRelax(LevelData<NodeFArrayBox>& a_phi,
00192 const LevelData<NodeFArrayBox>& a_rhs,
00193 bool a_bottomsolveflag);
00194
00195
00196 NodeMaskLevelOp* levelOpPtr();
00197
00198
00199 NodeLevelMG* lCoarsePtr();
00200
00201 protected:
00202
00203 void setDefaultValues();
00204 void clearMemory();
00205 bool m_isDefined;
00206
00207 bool m_verbose;
00208
00209
00210
00211 LevelData<NodeFArrayBox> m_resid;
00212
00213
00214 LevelData<NodeFArrayBox> m_crseResid;
00215
00216
00217 LevelData<NodeFArrayBox> m_crseCorr;
00218
00219
00220 DisjointBoxLayout m_grids;
00221
00222
00223 DisjointBoxLayout m_coarsenedGrids;
00224
00225
00226 const DisjointBoxLayout* m_gridsCoarsePtr;
00227
00228
00229 Real m_dx;
00230
00231
00232 ProblemDomain m_domain;
00233
00234
00235 int m_nCoarserLevels;
00236
00237
00238 NodeLevelMG* m_lCoarsePtr;
00239
00240
00241 NodeMaskLevelOp* m_levelopPtr;
00242
00243
00244 int m_numBottomGSRB;
00245
00246
00247 int m_numSmoothUp;
00248
00249
00250 int m_numSmoothDown;
00251
00252
00253 int m_refToCoarsened;
00254
00255
00256 NodeMaskAverage m_averageOp;
00257
00258
00259 NodeMGInterp m_mginterp;
00260
00261 private:
00262
00263
00264
00265 void crseCorrect(LevelData<NodeFArrayBox>& a_phi);
00266
00267 void operator=(const NodeLevelMG& a_levmgin){};
00268
00269 NodeLevelMG(const NodeLevelMG& a_levmgin) {};
00270 };
00271
00272 #endif