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 #ifndef _LevelMG_H_
00030 #define _LevelMG_H_
00031
00032 #include <iostream>
00033 #include <cmath>
00034 #include <assert.h>
00035 #include <cstdlib>
00036 #include "REAL.H"
00037 #include "IntVect.H"
00038 #include "Box.H"
00039 #include "DisjointBoxLayout.H"
00040 #include "FArrayBox.H"
00041 #include "LevelData.H"
00042 #include "CoarseAverage.H"
00043 #include "LevelOp.H"
00044 #include "ProblemDomain.H"
00045
00047
00052 class LevelMG
00053 {
00054 public:
00055
00057 bool isDefined() const;
00058
00060 LevelMG();
00061
00063 LevelMG(const DisjointBoxLayout& a_ba,
00064 const DisjointBoxLayout* a_baseBaPtr,
00065 Real a_dxLevel,
00066 int a_refRatio,
00067 const Box& a_domain,
00068 int a_nCoarserLevels,
00069 const LevelOp* const a_opin,
00070 int a_ncomp=1);
00071
00073 LevelMG(const DisjointBoxLayout& a_ba,
00074 const DisjointBoxLayout* a_baseBaPtr,
00075 Real a_dxLevel,
00076 int a_refRatio,
00077 const ProblemDomain& a_domain,
00078 int a_nCoarserLevels,
00079 const LevelOp* const a_opin,
00080 int a_ncomp=1);
00081
00083 void define(const DisjointBoxLayout& a_ba,
00084 const DisjointBoxLayout* a_baseBaPtr,
00085 Real a_dxLevel, int a_refRatio,
00086 const Box& a_domain,
00087 int a_nCoarserLevels,
00088 const LevelOp* const a_opin,
00089 int a_ncomp=1);
00090
00091
00093 void define(const DisjointBoxLayout& a_ba,
00094 const DisjointBoxLayout* a_baseBaPtr,
00095 Real a_dxLevel, int a_refRatio,
00096 const ProblemDomain& a_domain,
00097 int a_nCoarserLevels,
00098 const LevelOp* const a_opin,
00099 int a_ncomp);
00100
00102 void define(
00103 const LevelMG& L,
00104 int refCoarse,
00105 const LevelOp* const opin_a
00106 );
00107
00109 LevelMG(
00110 const LevelMG& L,
00111 int refCoarse,
00112 const LevelOp* opin_a
00113 );
00114
00115
00117 ~LevelMG();
00118
00120
00127 void mgRelax(LevelData<FArrayBox> & a_soln,
00128 const LevelData<FArrayBox> & a_rhs,
00129 bool bottomsolveflag);
00130
00132 void setnumBottomGSRB(int a_numBottomGSRB)
00133 {m_numBottomGSRB = a_numBottomGSRB;}
00134
00136 void setnumSmoothUp(int a_numSmoothUp)
00137 {m_numSmoothUp = a_numSmoothUp;}
00138
00140 void setnumSmoothDown(int a_numSmoothDown)
00141 {m_numSmoothDown = a_numSmoothDown;}
00142
00143
00144
00145 LevelOp* levelOpPtr();
00146
00147
00148 LevelMG* lCoarsePtr();
00149
00150 protected:
00151
00152 void setDefaultValues();
00153 void clearMemory();
00154 bool m_isDefined;
00155
00156
00157
00158 LevelData<FArrayBox> m_resid;
00159
00160
00161 LevelData<FArrayBox> m_crseResid;
00162
00163
00164 LevelData<FArrayBox> m_crseCorr;
00165
00166
00167 DisjointBoxLayout m_ba;
00168
00169
00170 DisjointBoxLayout m_baCoarsened;
00171
00172
00173 const DisjointBoxLayout* m_baseBaPtr;
00174
00175
00176 Real m_dxLevel;
00177
00178
00179 ProblemDomain m_domain;
00180
00181
00182 int m_nCoarserLevels;
00183
00184
00185 LevelMG* m_lCoarsePtr;
00186
00187
00188 LevelOp* m_levelopPtr;
00189
00190
00191 int m_numBottomGSRB;
00192
00193
00194 int m_numSmoothUp;
00195
00196
00197 int m_numSmoothDown;
00198
00199
00200 int m_refToCoar;
00201
00202
00203 CoarseAverage m_averageOp;
00204
00205 private:
00206
00207
00208
00209 void crseCorrect(LevelData<FArrayBox>& a_fine,
00210 const LevelData<FArrayBox>& a_crse,
00211 int a_refRat);
00212 void operator=(const LevelMG& levmgin){};
00213 LevelMG(const LevelMG& levmgin) {};
00214 };
00215
00216
00217 #endif
00218
00219