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
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 #ifndef _LEVELMG_H_
00055 #define _LEVELMG_H_
00056
00057 #include <iostream>
00058 #include <cmath>
00059 #include <cassert>
00060 #include <cstdlib>
00061
00062 #include "REAL.H"
00063 #include "IntVect.H"
00064 #include "Box.H"
00065 #include "DisjointBoxLayout.H"
00066 #include "FArrayBox.H"
00067 #include "LevelData.H"
00068 #include "CoarseAverage.H"
00069 #include "LevelOp.H"
00070 #include "ProblemDomain.H"
00071
00073
00078 class LevelMG
00079 {
00080 public:
00082 bool isDefined() const;
00083
00085 LevelMG();
00086
00088 LevelMG(const DisjointBoxLayout& a_ba,
00089 const DisjointBoxLayout* a_baseBaPtr,
00090 Real a_dxLevel,
00091 int a_refRatio,
00092 const Box& a_domain,
00093 int a_nCoarserLevels,
00094 const LevelOp* const a_opin,
00095 int a_ncomp=1);
00096
00098 LevelMG(const DisjointBoxLayout& a_ba,
00099 const DisjointBoxLayout* a_baseBaPtr,
00100 Real a_dxLevel,
00101 int a_refRatio,
00102 const ProblemDomain& a_domain,
00103 int a_nCoarserLevels,
00104 const LevelOp* const a_opin,
00105 int a_ncomp=1);
00106
00108 void define(const DisjointBoxLayout& a_ba,
00109 const DisjointBoxLayout* a_baseBaPtr,
00110 Real a_dxLevel,
00111 int a_refRatio,
00112 const Box& a_domain,
00113 int a_nCoarserLevels,
00114 const LevelOp* const a_opin,
00115 int a_ncomp=1);
00116
00118 void define(
00119 const DisjointBoxLayout& a_ba,
00121 const DisjointBoxLayout* a_baseBaPtr,
00123 Real a_dxLevel,
00125 int a_refRatio,
00127 const ProblemDomain& a_domain,
00129 int a_nCoarserLevels,
00131 const LevelOp* const a_opin,
00133 int a_ncomp);
00134
00136 void define(const LevelMG& a_level,
00137 int a_refCoarse,
00138 const LevelOp* const a_opin);
00139
00141 LevelMG(const LevelMG& a_level,
00142 int a_refCoarse,
00143 const LevelOp* a_opin);
00144
00146 ~LevelMG();
00147
00149
00156 void mgRelax(LevelData<FArrayBox> & a_soln,
00157 const LevelData<FArrayBox> & a_rhs,
00158 bool bottomsolveflag);
00159
00161 void setNumBottomGSRB(int a_numBottomGSRB)
00162 {
00163 m_numBottomGSRB = a_numBottomGSRB;
00164 }
00165
00167 void setNumSmoothUp(int a_numSmoothUp);
00168
00170 void setNumSmoothDown(int a_numSmoothDown);
00171
00173 LevelOp* levelOpPtr();
00174
00176 LevelMG* lCoarsePtr();
00177
00179 void setConvergenceMetric(Real a_metric, int a_comp);
00180
00181 protected:
00182 void setDefaultValues();
00183 void clearMemory();
00184
00185 bool m_isDefined;
00186
00187
00188 LevelData<FArrayBox> m_resid;
00189
00190
00191 LevelData<FArrayBox> m_crseResid;
00192
00193
00194 LevelData<FArrayBox> m_crseCorr;
00195
00196
00197 DisjointBoxLayout m_ba;
00198
00199
00200 DisjointBoxLayout m_baCoarsened;
00201
00202
00203 const DisjointBoxLayout* m_baseBaPtr;
00204
00205
00206 Real m_dxLevel;
00207
00208
00209 ProblemDomain m_domain;
00210
00211
00212 int m_nCoarserLevels;
00213
00214
00215 LevelMG* m_lCoarsePtr;
00216
00217
00218 LevelOp* m_levelopPtr;
00219
00220
00221 int m_numBottomGSRB;
00222
00223
00224 int m_numSmoothUp;
00225
00226
00227 int m_numSmoothDown;
00228
00229
00230 int m_refToCoar;
00231
00232
00233 CoarseAverage m_averageOp;
00234
00235 private:
00241 void crseCorrect(LevelData<FArrayBox>& a_fine,
00242 const LevelData<FArrayBox>& a_crse,
00243 int a_refRat);
00244
00245 void operator=(const LevelMG& a_levmgin)
00246 {
00247 }
00248
00249 LevelMG(const LevelMG& a_levmgin)
00250 {
00251 }
00252 };
00253
00254 #endif