00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011
00012
00013
00014 #ifndef NODEPOISSONOP_H
00015 #define NODEPOISSONOP_H
00016
00017 #include "NodeLevelOp.H"
00018 #include <cmath>
00019 #include <cstdlib>
00020 #include "BaseFab.H"
00021 #include "NodeCFIVS.H"
00022 #include "NodeBC.H"
00023 #include "NodeQuadCFInterp.H"
00024 #include "NodeBaseBottomSmoother.H"
00025 #include "LoHiSide.H"
00026
00027 #include "UsingNamespace.H"
00028
00030 class NodePoissonOp: public NodeLevelOp
00033 {
00034 public:
00035
00040
00042
00044 NodePoissonOp();
00045
00047
00053 virtual NodeLevelOp* new_levelop() const;
00054
00056
00058 ~NodePoissonOp();
00059
00061
00065 void define(
00066 const DisjointBoxLayout& a_grids,
00068 const DisjointBoxLayout* a_gridsCoarsePtr,
00070 Real a_dx,
00072 int a_refToCoarse,
00074 const ProblemDomain& a_domain,
00076 bool a_homogeneousOnly = false,
00078 int a_ncomp = 1,
00080 bool a_verbose = false);
00081
00082
00084
00088 void define(
00089 const DisjointBoxLayout& a_grids,
00091 const DisjointBoxLayout* a_gridsCoarsePtr,
00093 Real a_dx,
00095 int a_refToCoarse,
00097 const Box& a_domain,
00099 bool a_homogeneousOnly = false,
00101 int a_ncomp = 1,
00103 bool a_verbose = false);
00104
00106
00110 void define(
00111 const NodeLevelOp* a_opfine,
00113 int a_refToFine);
00114
00121
00123
00126 virtual bool isDefined() const;
00127
00134
00135
00136
00137
00138
00140
00142 virtual void setVerbose( bool a_verbose );
00143
00145
00147 void setBottomSmoother(const NodeBaseBottomSmoother& a_bottomSmoother);
00148
00150
00152 void setDomainNodeBC(const DomainNodeBC& a_dombcin);
00153
00155
00162 void setInterpolationDegree(int a_interpolationDegree);
00163
00170
00172
00176 void CFInterp(
00177 LevelData<NodeFArrayBox>& a_phi,
00179 const LevelData<NodeFArrayBox>& a_phiCoarse,
00181 bool a_inhomogeneous);
00182
00184
00187 void homogeneousCFInterp(
00188 LevelData<NodeFArrayBox>& a_phi);
00189
00196
00198
00207 void residualI(
00208 LevelData<NodeFArrayBox>& a_resid,
00210 LevelData<NodeFArrayBox>& a_phi,
00212 const LevelData<NodeFArrayBox>* a_phiCoarsePtr,
00214 const LevelData<NodeFArrayBox>& a_rhs);
00215
00217
00226 void residualH(
00227 LevelData<NodeFArrayBox>& a_resid,
00229 LevelData<NodeFArrayBox>& a_phi,
00231 const LevelData<NodeFArrayBox>& a_rhs);
00232
00234
00243 void residualIcfHphys(
00244 LevelData<NodeFArrayBox>& a_resid,
00246 LevelData<NodeFArrayBox>& a_phi,
00248 const LevelData<NodeFArrayBox>* a_phiCoarsePtr,
00250 const LevelData<NodeFArrayBox>& a_rhs);
00251
00253
00262 void residualHcfIphys(
00263 LevelData<NodeFArrayBox>& a_resid,
00265 LevelData<NodeFArrayBox>& a_phi,
00267 const LevelData<NodeFArrayBox>& a_rhs);
00268
00275
00277
00285 void applyOpI(
00286 LevelData<NodeFArrayBox>& a_LofPhi,
00288 LevelData<NodeFArrayBox>& a_phi,
00290 const LevelData<NodeFArrayBox>* a_phiCoarsePtr);
00291
00293
00301 void applyOpH(
00302 LevelData<NodeFArrayBox>& a_LofPhi,
00304 LevelData<NodeFArrayBox>& a_phi);
00305
00307
00315 void applyOpIcfHphys(
00316 LevelData<NodeFArrayBox>& a_LofPhi,
00318 LevelData<NodeFArrayBox>& a_phi,
00320 const LevelData<NodeFArrayBox>* a_phiCoarsePtr);
00321
00323
00331 void applyOpHcfIphys(
00332 LevelData<NodeFArrayBox>& a_LofPhi,
00334 LevelData<NodeFArrayBox>& a_phi);
00335
00342
00344
00352 void gradient(
00353 LevelData<NodeFArrayBox>& a_gradPhi,
00355 LevelData<NodeFArrayBox>& a_phi,
00357 const LevelData<NodeFArrayBox>* a_phiCoarsePtr);
00358
00365
00367
00372 void smooth(
00373 LevelData<NodeFArrayBox>& a_phi,
00375 const LevelData<NodeFArrayBox>& a_rhs);
00376
00378
00382 void levelPreconditioner(
00383 LevelData<NodeFArrayBox>& a_phihat,
00385 const LevelData<NodeFArrayBox>& a_rhshat);
00386
00388
00390 void bottomSmoother(
00391 LevelData<NodeFArrayBox>& a_phi,
00393 const LevelData<NodeFArrayBox>& a_rhs);
00394
00397 protected:
00398
00401 DomainNodeBC m_dombc;
00402
00405 int m_interpolationDegree;
00406
00407
00408
00409
00410
00413 ProblemDomain m_domainInteriorNodes;
00414
00417 DisjointBoxLayout m_grids;
00418
00421 Copier m_exchangeCopier;
00422
00425 DisjointBoxLayout m_gridsCoarse;
00426
00429 int m_ncomp;
00430
00433 int m_refToCoarse;
00434
00437 Real m_dx;
00438
00441 Real m_dxCoarse;
00442
00445 bool m_isDefined;
00446
00449 bool m_isBCDefined;
00450
00453 bool m_ihcfiEnabled;
00454
00457 LayoutData<NodeCFIVS> m_loCFIVS[SpaceDim];
00458
00461 LayoutData<NodeCFIVS> m_hiCFIVS[SpaceDim];
00462
00463
00464
00465
00468 NodeQuadCFInterp m_qcfi;
00469
00472 NodeBaseBottomSmoother* m_bottomSmootherPtr;
00473
00476 LayoutData< Vector<IntVectSet> > m_IVSV;
00477
00480 LayoutData< BitSet > m_IVSVfull;
00481
00482
00483
00484
00485
00486 private:
00487
00488
00492 void setCFIVS();
00493
00497 void levelGSRB(LevelData<NodeFArrayBox>& a_phi,
00498 const LevelData<NodeFArrayBox>& a_rhs);
00499
00504 void applyOpOnly(LevelData<NodeFArrayBox>& a_LofPhi,
00505 const LevelData<NodeFArrayBox>& a_phi);
00506
00511 void gradientOnly(LevelData<NodeFArrayBox>& a_gradPhi,
00512 const LevelData<NodeFArrayBox>& a_phi);
00513
00517 void homogeneousCFInterp(FArrayBox& a_phiFab,
00518 const DataIndex& a_datInd,
00519 const int a_idir,
00520 const Side::LoHiSide a_hiorlo);
00521
00522 void clearMemory();
00523
00524 void setDefaultValues();
00525
00526 void residualDiff(LevelData<NodeFArrayBox>& a_resid,
00527 const LevelData<NodeFArrayBox>& a_rhs);
00528
00529 };
00530
00531 #endif