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 _REGHELMHOLTZOP_H_
00030 #define _REGHELMHOLTZOP_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 "FArrayBox.H"
00042 #include "Copier.H"
00043 #include "QuadCFInterp.H"
00044
00045 #include "RegCFIVS.H"
00046 #include "RegGhostBC.H"
00047
00048 #include "RegLevelOp.H"
00049 #include "GenBaseBottomSmoother.H"
00050
00052
00054 class RegHelmholtzOp: public RegLevelOp
00055 {
00056 public:
00058 RegHelmholtzOp();
00059
00061 ~RegHelmholtzOp();
00062
00064
00067 RegHelmholtzOp* newOp() const;
00068
00070 bool isDefined() const;
00071
00073
00077 void define(const DisjointBoxLayout& a_grids,
00078 const DisjointBoxLayout* a_baseBAPtr,
00079 Real a_dxLevel,
00080 int a_refRatio,
00081 const Box& a_domain,
00082 bool a_homogeneousOnly = false,
00083 int a_ncomp = 1);
00084
00086
00090 void define(const DisjointBoxLayout& a_grids,
00091 const DisjointBoxLayout* a_baseBAPtr,
00092 Real a_dxLevel,
00093 int a_refRatio,
00094 const ProblemDomain& a_domain,
00095 bool a_homogeneousOnly = false,
00096 int a_ncomp = 1);
00097
00099
00102 void define(const RegLevelOp* a_opfinePtr,
00103 int a_refToFine);
00104
00106
00109 void setHelmCoeff(Real a_helmcoeff);
00110
00112
00117 void scaleHelmCoeff(Real a_scale);
00118
00120
00123 void setAlpha(Real a_alpha);
00124
00126
00129 void scaleAlpha(Real a_scale);
00130
00132
00135 void scaleBeta(Real a_scale);
00136
00138
00144 void smooth(LevelData<FArrayBox>& a_phi,
00145 const LevelData<FArrayBox>& a_rhs);
00146
00148
00151 virtual void levelPreconditioner(LevelData<FArrayBox>& a_phihat,
00152 const LevelData<FArrayBox>& a_rhshat);
00153
00155
00159 void applyOpI(LevelData<FArrayBox>& a_phi,
00160 const LevelData<FArrayBox>* a_phicPtr,
00161 LevelData<FArrayBox>& a_LOfPhi);
00162
00164
00168 void applyOpHcfIphys(LevelData<FArrayBox>& a_phi,
00169 LevelData<FArrayBox>& a_LOfPhi);
00170
00172
00175 void applyOpIcfHphys(LevelData<FArrayBox>& a_phi,
00176 const LevelData<FArrayBox>* a_phicPtr,
00177 LevelData<FArrayBox>& a_LOfPhi);
00178
00180
00184 void applyOpH(LevelData<FArrayBox>& a_phi,
00185 LevelData<FArrayBox>& a_LOfPhi);
00186
00188 void setBottomSmoother(const GenBaseBottomSmoother<LevelData<FArrayBox> >& a_bottomSmoother);
00189
00191
00195 void bottomSmoother(LevelData<FArrayBox>& a_phi,
00196 const LevelData<FArrayBox>& a_rhs);
00197
00199
00203 void CFInterp(LevelData<FArrayBox>& a_phif,
00204 const LevelData<FArrayBox>& a_phic);
00205
00207
00209 void homogeneousCFInterp(LevelData<FArrayBox>& a_phif);
00210
00212
00214 void homogeneousCFInterp(LevelData<FArrayBox>& a_phif,
00215 const DataIndex& a_datInd,
00216 int a_idir,
00217 Side::LoHiSide a_hiorlo);
00218
00220 void setDomainGhostBC(const RegDomainGhostBC& a_dombcin);
00221
00223
00229 void getFlux(FArrayBox& a_fineFlux,
00230 const FArrayBox& a_data,
00231 const DataIndex& a_datInd,
00232 int a_dir);
00233
00234 protected:
00235
00236 RegDomainGhostBC m_domghostbc;
00237
00238
00239 ProblemDomain m_domain;
00240
00241
00242 DisjointBoxLayout m_grids;
00243
00244
00245
00246 Copier m_exchangeCopier;
00247
00248
00249
00250 DisjointBoxLayout m_baseBA;
00251
00252
00253 int m_refRatio;
00254
00255
00256 Real m_dxLevel;
00257
00258
00259 Real m_dxCrse;
00260
00261
00262 int m_ncomp;
00263
00264
00265
00266
00267
00268 QuadCFInterp m_quadCFI;
00269
00271
00272
00273 GenBaseBottomSmoother<LevelData<FArrayBox> >* m_bottomSmootherPtr;
00274
00275
00276 bool m_isDefined;
00277
00278
00279 bool m_isBCDefined;
00280
00281
00282 bool m_ihcfiEnabled;
00283
00284
00285 bool m_hcoeffDefined;
00286
00287
00288 Real m_helmCoeff;
00289
00290
00291 Real m_alphaCoeff;
00292
00293
00294 LayoutData<RegCFIVS> m_loCFIVS[SpaceDim];
00295 LayoutData<RegCFIVS> m_hiCFIVS[SpaceDim];
00296
00297 private:
00298
00299 void levelGSRB(LevelData<FArrayBox>& a_phi,
00300 const LevelData<FArrayBox>& a_rhs);
00301
00302 void interpOnIVSHomo(LevelData<FArrayBox>& a_phif,
00303 const DataIndex& a_datInd,
00304 const int a_idir,
00305 const Side::LoHiSide a_hiorlo,
00306 const IntVectSet& a_interpIVS);
00307
00308
00309
00310
00311
00312
00313
00314
00315 void clearMemory();
00316
00317 void setDefaultValues();
00318 };
00319
00320 #endif