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 #ifndef NODEMASKPOISSONOP_H
00035 #define NODEMASKPOISSONOP_H
00036
00037 #include "NodeMaskLevelOp.H"
00038 #include <cmath>
00039 #include <cstdlib>
00040 #include "BaseFab.H"
00041 #include "NodeCFIVS.H"
00042 #include "NodeBC.H"
00043 #include "NodeQuadCFInterp.H"
00044 #include "NodeMaskBaseBottomSmoother.H"
00045 #include "LoHiSide.H"
00046
00048 class NodeMaskPoissonOp: public NodeMaskLevelOp
00051 {
00052 public:
00053
00055
00056
00058
00060 NodeMaskPoissonOp();
00061
00063
00069 virtual NodeMaskLevelOp* new_levelop() const;
00070
00071
00073
00075 ~NodeMaskPoissonOp();
00076
00078
00092 void define(const DisjointBoxLayout& a_grids,
00093 const DisjointBoxLayout* a_gridsCoarsePtr,
00094 Real a_dx,
00095 int a_refToCoarse,
00096 const ProblemDomain& a_domain,
00097 bool a_homogeneousOnly=false,
00098 int a_ncomp = 1);
00099
00100 void define(const DisjointBoxLayout& a_grids,
00101 const DisjointBoxLayout* a_gridsCoarsePtr,
00102 Real a_dx,
00103 int a_refToCoarse,
00104 const Box& a_domain,
00105 bool a_homogeneousOnly=false,
00106 int a_ncomp = 1);
00107
00109
00117 void define(const NodeMaskLevelOp* a_opfine,
00118 int a_refToFine);
00119
00121
00123
00126 virtual bool isDefined() const;
00127
00129
00130
00131
00132
00133
00134
00136
00138 void setBottomSmoother(const NodeMaskBaseBottomSmoother& a_bottomSmoother);
00139
00141
00143
00152 void CFInterp(LevelData<NodeFArrayBox>& a_phi,
00153 const LevelData<NodeFArrayBox>& a_phiCoarse,
00154 bool a_inhomogeneous);
00155
00156
00158
00164 void homogeneousCFInterp(LevelData<NodeFArrayBox>& a_phi);
00165
00167
00176 void smooth(LevelData<NodeFArrayBox>& a_phi,
00177 const LevelData<NodeFArrayBox>& a_rhs);
00178
00179
00181
00193 void applyOpI(LevelData<NodeFArrayBox>& a_LofPhi,
00194 LevelData<NodeFArrayBox>& a_phi,
00195 const LevelData<NodeFArrayBox>* a_phiCoarsePtr);
00196
00197
00199
00209 void applyOpH(LevelData<NodeFArrayBox>& a_LofPhi,
00210 LevelData<NodeFArrayBox>& a_phi);
00211
00212
00214
00226 void applyOpIcfHphys(LevelData<NodeFArrayBox>& a_LofPhi,
00227 LevelData<NodeFArrayBox>& a_phi,
00228 const LevelData<NodeFArrayBox>* a_phiCoarsePtr);
00229
00231
00241 void applyOpHcfIphys(LevelData<NodeFArrayBox>& a_LofPhi,
00242 LevelData<NodeFArrayBox>& a_phi);
00243
00245
00252 void bottomSmoother(LevelData<NodeFArrayBox>& a_phi,
00253 const LevelData<NodeFArrayBox>& a_rhs);
00254
00256
00263 virtual void levelPreconditioner(LevelData<NodeFArrayBox>& a_phihat,
00264 const LevelData<NodeFArrayBox>& a_rhshat);
00265
00267
00269 void setDomainNodeBC(const DomainNodeBC& a_dombcin);
00270
00272
00280 void setInterpolationDegree(int a_interpolationDegree);
00281
00283
00297 void residualI(LevelData<NodeFArrayBox>& a_resid,
00298 LevelData<NodeFArrayBox>& a_phi,
00299 const LevelData<NodeFArrayBox>* a_phiCoarsePtr,
00300 const LevelData<NodeFArrayBox>& a_rhs);
00301
00303
00315 void residualH(LevelData<NodeFArrayBox>& a_resid,
00316 LevelData<NodeFArrayBox>& a_phi,
00317 const LevelData<NodeFArrayBox>& a_rhs);
00318
00320
00332 void residualHcfIphys(LevelData<NodeFArrayBox>& a_resid,
00333 LevelData<NodeFArrayBox>& a_phi,
00334 const LevelData<NodeFArrayBox>& a_rhs);
00335
00337
00351 void residualIcfHphys(LevelData<NodeFArrayBox>& a_resid,
00352 LevelData<NodeFArrayBox>& a_phi,
00353 const LevelData<NodeFArrayBox>* a_phiCoarsePtr,
00354 const LevelData<NodeFArrayBox>& a_rhs);
00355
00356 protected:
00357
00358
00359 DomainNodeBC m_dombc;
00360
00361
00362
00363 int m_interpolationDegree;
00364
00365
00366
00367
00368
00369
00370 ProblemDomain m_domainInteriorNodes;
00371
00372
00373 DisjointBoxLayout m_grids;
00374
00375
00376 BoxLayout m_gridsNodes;
00377
00378
00379
00380 DisjointBoxLayout m_gridsCoarse;
00381
00382
00383 int m_ncomp;
00384
00385
00386 int m_refToCoarse;
00387
00388
00389 Real m_dx;
00390
00391
00392 Real m_dxCoarse;
00393
00394
00395 bool m_isDefined;
00396
00397
00398 bool m_isBCDefined;
00399
00400
00401 bool m_ihcfiEnabled;
00402
00403
00404
00405 LayoutData<NodeCFIVS> m_loCFIVS[SpaceDim];
00406 LayoutData<NodeCFIVS> m_hiCFIVS[SpaceDim];
00407
00408
00409
00410
00411
00412 NodeQuadCFInterp m_qcfi;
00413
00414
00415 NodeMaskBaseBottomSmoother* m_bottomSmootherPtr;
00416
00417
00418 LayoutData< Vector<IntVectSet> > m_IVSV;
00419
00420
00421
00422
00423
00424 BoxLayoutData< BaseFab<int> > m_mask;
00425
00426 BoxLayoutData< BaseFab<Real> > m_coeffs;
00427
00428 private:
00429
00430
00431 void setCFIVS();
00432
00433 void getMask();
00434
00435 void levelGSRB(LevelData<NodeFArrayBox>& a_phi,
00436 const LevelData<NodeFArrayBox>& a_rhs);
00437
00438 void applyOpOnly(LevelData<NodeFArrayBox>& a_LofPhi,
00439 const LevelData<NodeFArrayBox>& a_phi);
00440
00441
00442 void homogeneousCFInterp(FArrayBox& a_phiFab,
00443 const DataIndex& a_datInd,
00444 const int a_idir,
00445 const Side::LoHiSide a_hiorlo);
00446
00447 void clearMemory();
00448
00449 void setDefaultValues();
00450
00451 void residualDiff(LevelData<NodeFArrayBox>& a_resid,
00452 const LevelData<NodeFArrayBox>& a_rhs);
00453
00454 };
00455
00456 #endif