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 _REGPOISSONOP_H_
00030 #define _REGPOISSONOP_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 "LevelData.H"
00042 #include "BaseFab.H"
00043 #include "FArrayBox.H"
00044 #include "QuadCFInterp.H"
00045 #include "Copier.H"
00046
00047 #include "RegCFIVS.H"
00048 #include "RegGhostBC.H"
00049
00050 #include "RegLevelOp.H"
00051 #include "GenBaseBottomSmoother.H"
00052
00054
00056 class RegPoissonOp: public RegLevelOp
00057 {
00058 public:
00060 RegPoissonOp();
00061
00063 ~RegPoissonOp();
00064
00066
00069 virtual RegPoissonOp* newOp() const;
00070
00072 virtual bool isDefined() const;
00073
00075
00079 void define(const DisjointBoxLayout& a_grids,
00080 const DisjointBoxLayout* a_baseBAPtr,
00081 Real a_dxLevel,
00082 int a_refRatio,
00083 const Box& a_domain,
00084 bool a_homogeneousOnly = false,
00085 int a_ncomp = 1);
00086
00088
00092 void define(const DisjointBoxLayout& a_grids,
00093 const DisjointBoxLayout* a_baseBAPtr,
00094 Real a_dxLevel,
00095 int a_refRatio,
00096 const ProblemDomain& a_domain,
00097 bool a_homogeneousOnly = false,
00098 int a_ncomp = 1);
00099
00101
00105 void define(const RegLevelOp* a_opfinePtr,
00106 int a_refToFine);
00107
00109
00115 void smooth(LevelData<FArrayBox>& a_phi,
00116 const LevelData<FArrayBox>& a_rhs);
00117
00119
00122 virtual void levelPreconditioner(LevelData<FArrayBox>& a_phihat,
00123 const LevelData<FArrayBox>& a_rhshat);
00124
00126
00130 void applyOpI(LevelData<FArrayBox>& a_phi,
00131 const LevelData<FArrayBox>* a_phicPtr,
00132 LevelData<FArrayBox>& a_LOfPhi);
00133
00135
00139 void applyOpHcfIphys(LevelData<FArrayBox>& a_phi,
00140 LevelData<FArrayBox>& a_LOfPhi);
00141
00143
00146 void applyOpIcfHphys(LevelData<FArrayBox>& a_phi,
00147 const LevelData<FArrayBox>* a_phicPtr,
00148 LevelData<FArrayBox>& a_LOfPhi);
00149
00151
00155 void applyOpH(LevelData<FArrayBox>& a_phi,
00156 LevelData<FArrayBox>& a_LOfPhi);
00157
00159 void setBottomSmoother(const GenBaseBottomSmoother<LevelData<FArrayBox> >& a_bottomSmoother);
00160
00162
00166 void bottomSmoother(LevelData<FArrayBox>& a_phi,
00167 const LevelData<FArrayBox>& a_rhs);
00168
00170
00174 void CFInterp(LevelData<FArrayBox>& a_phif,
00175 const LevelData<FArrayBox>& a_phic);
00176
00178
00180 void homogeneousCFInterp(LevelData<FArrayBox>& a_phif);
00181
00183
00185 void homogeneousCFInterp(LevelData<FArrayBox>& a_phif,
00186 const DataIndex& a_datInd,
00187 int a_idir,
00188 Side::LoHiSide a_hiorlo);
00189
00191 void setDomainGhostBC(const RegDomainGhostBC& a_dombcin);
00192
00194
00200 void getFlux(FArrayBox& a_fineFlux,
00201 const FArrayBox& a_data,
00202 const DataIndex& a_datInd,
00203 int a_dir);
00204
00205 protected:
00206
00207 RegDomainGhostBC m_domghostbc;
00208
00209
00210 ProblemDomain m_domain;
00211
00212
00213 DisjointBoxLayout m_grids;
00214
00215
00216
00217 Copier m_exchangeCopier;
00218
00219
00220
00221 DisjointBoxLayout m_baseBA;
00222
00223
00224 int m_refRatio;
00225
00226
00227 Real m_dxLevel;
00228
00229
00230 Real m_dxCrse;
00231
00232
00233 int m_ncomp;
00234
00235
00236
00237
00238
00239 QuadCFInterp m_quadCFI;
00240
00242
00243
00244 GenBaseBottomSmoother<LevelData<FArrayBox> >* m_bottomSmootherPtr;
00245
00246
00247 bool m_isDefined;
00248
00249
00250 bool m_isBCDefined;
00251
00252
00253 bool m_ihcfiEnabled;
00254
00255 LayoutData<RegCFIVS> m_loCFIVS[SpaceDim];
00256 LayoutData<RegCFIVS> m_hiCFIVS[SpaceDim];
00257
00258 private:
00259
00260 void levelGSRB(LevelData<FArrayBox>& a_phi,
00261 const LevelData<FArrayBox>& a_rhs);
00262
00263 void interpOnIVSHomo(LevelData<FArrayBox>& a_phif,
00264 const DataIndex& a_datInd,
00265 const int a_idir,
00266 const Side::LoHiSide a_hiorlo,
00267 const IntVectSet& a_interpIVS);
00268
00269
00270
00271
00272
00273
00274
00275
00276 void clearMemory();
00277
00278 void setDefaultValues();
00279 };
00280
00281 #endif