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