00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _EBPOISSONOP_H__
00012 #define _EBPOISSONOP_H__
00013
00014 #include "REAL.H"
00015 #include "Box.H"
00016 #include "FArrayBox.H"
00017 #include "Vector.H"
00018 #include <map>
00019 #include "RefCountedPtr.H"
00020
00021 #include "AMRMultiGrid.H"
00022
00023 #include "EBIndexSpace.H"
00024 #include "EBCellFAB.H"
00025 #include "EBCellFactory.H"
00026
00027 #include "EBStencil.H"
00028
00029 #include "EBLevelDataOps.H"
00030 #include "BaseEBBC.H"
00031 #include "BaseDomainBC.H"
00032 #include "CFIVS.H"
00033 #include "EBFluxRegister.H"
00034 #include "EBMGAverage.H"
00035 #include "EBMGInterp.H"
00036 #include "EBCoarsen.H"
00037 #include "PolyGeom.H"
00038 #include "EBQuadCFInterp.H"
00039 #include "EBLevelGrid.H"
00040 #include "NamespaceHeader.H"
00041
00042
00043
00044
00045
00046 #define EBPOISSONOP_JACOBI_OMEGA 0.67
00047
00048
00049 #if CH_SPACEDIM==2
00050 #define EBPO_NUMSTEN 4
00051 #elif CH_SPACEDIM==3
00052 #define EBPO_NUMSTEN 8
00053 #else
00054 void THIS_IS_AN_ERROR_MESSAGE(void)
00055 {
00056 THIS_WILL_ONLY_COMPILE_WHEN_CH_SPACEDIM_IS_2_OR_3;
00057 }
00058 #endif
00059
00060
00061
00062
00063 class EBPoissonOp: public MGLevelOp<LevelData<EBCellFAB> >
00064 {
00065 public:
00066
00067 ~EBPoissonOp();
00068
00069
00070 EBPoissonOp();
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093 EBPoissonOp( const EBLevelGrid & a_eblg,
00094 const EBLevelGrid & a_eblgCoarMG,
00095 const RefCountedPtr<BaseDomainBC>& a_domainBC,
00096 const RefCountedPtr<BaseEBBC>& a_ebBC,
00097 const RealVect& a_dx,
00098 const RealVect& a_origin,
00099 const bool& a_hasMGObjects,
00100 const int& a_numPreCondIters,
00101 const int& a_relaxType,
00102 const int& a_orderEB,
00103 const Real& a_alpha,
00104 const Real& a_beta,
00105 const IntVect& a_ghostCellsPhi,
00106 const IntVect& a_ghostCellsRHS);
00107
00108
00109
00110
00111
00112
00113 virtual void residual(LevelData<EBCellFAB>& a_residual,
00114 const LevelData<EBCellFAB>& a_phi,
00115 const LevelData<EBCellFAB>& a_rhs,
00116 bool a_homogeneousPhysBC=false);
00117
00118
00119
00120
00121 virtual void preCond(LevelData<EBCellFAB>& a_opPhi,
00122 const LevelData<EBCellFAB>& a_phi);
00123
00124
00125 virtual void
00126 GSColorAllRegular(LevelData<EBCellFAB>& a_phi,
00127 const LevelData<EBCellFAB>& a_rhs,
00128 const IntVect& a_color,
00129 const Real& a_weight,
00130 const bool& a_homogeneousPhysBC);
00131
00132 virtual void
00133 GSColorAllIrregular(LevelData<EBCellFAB>& a_phi,
00134 const LevelData<EBCellFAB>& a_rhs,
00135 const IntVect& a_color,
00136 const bool& a_homogeneousPhysBC,
00137 int icolor);
00138
00139
00140
00141
00142
00143
00144 virtual void applyOp(LevelData<EBCellFAB>& a_opPhi,
00145 const LevelData<EBCellFAB>& a_phi,
00146 bool a_homogeneousPhysBC,
00147 DataIterator& a_dit,
00148 bool do_exchange = true);
00149
00150 virtual void applyOp(LevelData<EBCellFAB>& a_opPhi,
00151 const LevelData<EBCellFAB>& a_phi,
00152 bool a_homogeneousPhysBC)
00153 {
00154 DataIterator dit = a_opPhi.dataIterator();
00155 applyOp(a_opPhi, a_phi, a_homogeneousPhysBC, dit, true);
00156 }
00157
00158
00159
00160
00161 virtual void create(LevelData<EBCellFAB>& a_lhs,
00162 const LevelData<EBCellFAB>& a_rhs);
00163
00164
00165
00166
00167 virtual void assign(LevelData<EBCellFAB>& a_lhs,
00168 const LevelData<EBCellFAB>& a_rhs);
00169
00170
00171
00172
00173 virtual Real dotProduct(const LevelData<EBCellFAB>& a_1,
00174 const LevelData<EBCellFAB>& a_2);
00175
00176
00177
00178
00179 virtual void incr(LevelData<EBCellFAB>& a_lhs,
00180 const LevelData<EBCellFAB>& a_x,
00181 Real a_scale);
00182
00183
00184
00185
00186 virtual void axby(LevelData<EBCellFAB>& a_lhs,
00187 const LevelData<EBCellFAB>& a_x,
00188 const LevelData<EBCellFAB>& a_y,
00189 Real a_a,
00190 Real a_b);
00191
00192
00193
00194
00195 virtual void scale(LevelData<EBCellFAB>& a_lhs,
00196 const Real& a_scale);
00197
00198
00199
00200
00201 virtual Real norm(const LevelData<EBCellFAB>& a_rhs,
00202 int a_ord);
00203
00204
00205
00206
00207 virtual void setToZero(LevelData<EBCellFAB>& a_lhs);
00208
00209
00210
00211
00212 virtual void setVal(LevelData<EBCellFAB>& a_lhs, const Real& a_value);
00213
00214
00215
00216
00217 virtual void createCoarser(LevelData<EBCellFAB>& a_coarse,
00218 const LevelData<EBCellFAB>& a_fine,
00219 bool a_ghosted);
00220
00221
00222
00223
00224 virtual void relax(LevelData<EBCellFAB>& a_e,
00225 const LevelData<EBCellFAB>& a_residual,
00226 int a_iterations);
00227
00228
00229
00230
00231
00232
00233 virtual void restrictResidual(LevelData<EBCellFAB>& a_resCoarse,
00234 LevelData<EBCellFAB>& a_phiFine,
00235 const LevelData<EBCellFAB>& a_rhsFine);
00236
00237
00238
00239
00240
00241
00242 virtual void prolongIncrement(LevelData<EBCellFAB>& a_phiThisLevel,
00243 const LevelData<EBCellFAB>& a_correctCoarse);
00244
00245
00246 static bool nextColor(IntVect& color,
00247 const IntVect& limit);
00248
00249 static int getIndex(const IntVect& a_color);
00250
00251 static IntVect getColor(const int& a_icolor);
00252
00253 void levelMulticolorGS(LevelData<EBCellFAB>& a_phi,
00254 const LevelData<EBCellFAB>& a_rhs);
00255
00256 void colorGS(LevelData<EBCellFAB>& a_phi,
00257 const LevelData<EBCellFAB>& a_rhs,
00258 const IntVect& color, int icolor);
00259
00260
00261
00262 protected:
00263
00264 void defineStencils();
00265
00266 const IntVect m_ghostCellsPhi;
00267 const IntVect m_ghostCellsRHS;
00268 Vector<IntVect> m_colors;
00269
00270
00271 EBLevelGrid m_eblg;
00272 EBLevelGrid m_eblgCoarMG;
00273
00274 RefCountedPtr<BaseDomainBC> m_domainBC;
00275 RefCountedPtr<BaseEBBC> m_ebBC;
00276
00277 RealVect m_dx;
00278
00279 RealVect m_invDx;
00280 RealVect m_invDx2;
00281 Real m_dxScale;
00282 Real m_alpha;
00283 Real m_beta;
00284 Real m_time;
00285 RealVect m_origin;
00286 int m_orderEB;
00287 int m_numPreCondIters;
00288 int m_relaxType;
00289
00290
00291
00292 LayoutData<RefCountedPtr<EBStencil> > m_opEBStencil;
00293
00294 LayoutData<RefCountedPtr<EBStencil> > m_colorEBStencil[EBPO_NUMSTEN];
00295
00296 LayoutData<RefCountedPtr<EBStencil> > m_rhsColorEBStencil[EBPO_NUMSTEN];
00297
00298 LayoutData<BaseIVFAB<Real> > m_alphaDiagWeight;
00299
00300 LayoutData<BaseIVFAB<Real> > m_betaDiagWeight;
00301
00302
00303 LayoutData<VoFIterator > m_vofItIrreg;
00304 LayoutData<VoFIterator > m_vofItIrregColor[EBPO_NUMSTEN];
00305
00306 LayoutData<VoFIterator > m_vofItIrregDomLo[SpaceDim];
00307 LayoutData<VoFIterator > m_vofItIrregDomHi[SpaceDim];
00308
00309 LayoutData<VoFIterator > m_vofItIrregColorDomLo[EBPO_NUMSTEN][SpaceDim];
00310 LayoutData<VoFIterator > m_vofItIrregColorDomHi[EBPO_NUMSTEN][SpaceDim];
00311
00312 bool m_hasMGObjects;
00313
00314 EBMGAverage m_ebAverageMG;
00315 EBMGInterp m_ebInterpMG;
00316 DisjointBoxLayout m_dblCoarMG;
00317 EBISLayout m_ebislCoarMG;
00318 ProblemDomain m_domainCoarMG;
00319
00320
00321
00322 void getJacobiRelaxCoeff(LevelData<EBCellFAB>& a_relaxCoeff);
00323
00324 private:
00325
00326
00327
00328
00329
00330 void getOpVoFStencil(VoFStencil& a_stencil,
00331 const EBISBox& a_ebisbox,
00332 const VolIndex& a_vof);
00333
00334 void getOpVoFStencil(VoFStencil& a_stencil,
00335 const int& a_dir,
00336 const Vector<VolIndex>& a_allMonotoneVoFs,
00337 const EBISBox& a_ebisbox,
00338 const VolIndex& a_vof,
00339 const bool& a_lowOrder);
00340
00341
00342 void getOpFaceStencil(VoFStencil& a_stencil,
00343 const Vector<VolIndex>& a_allMonotoneVofs,
00344 const EBISBox& a_ebisbox,
00345 const VolIndex& a_vof,
00346 int a_dir,
00347 const Side::LoHiSide& a_side,
00348 const FaceIndex& a_face,
00349 const bool& a_lowOrder);
00350
00351
00352 void levelJacobi(LevelData<EBCellFAB>& a_phi,
00353 const LevelData<EBCellFAB>& a_rhs);
00354
00355
00356
00357
00358 void applyOpRegular( int idir,
00359 Box * a_loBox,
00360 Box * a_hiBox,
00361 int * a_hasLo,
00362 int * a_hasHi,
00363 Box & a_curOpPhiBox,
00364 Box & a_curPhiBox,
00365 int a_nComps,
00366 BaseFab<Real> & a_curOpPhiFAB,
00367 const BaseFab<Real> & a_curPhiFAB,
00368 bool a_homogeneousPhysBC,
00369 const DataIndex& a_dit,
00370 const Real& a_beta);
00371
00372
00373
00374
00375 void applyOpRegularAllDirs(Box * a_loBox,
00376 Box * a_hiBox,
00377 int * a_hasLo,
00378 int * a_hasHi,
00379 Box & a_curOpPhiBox,
00380 Box & a_curPhiBox,
00381 int a_nComps,
00382 BaseFab<Real> & a_curOpPhiFAB,
00383 const BaseFab<Real> & a_curPhiFAB,
00384 bool a_homogeneousPhysBC,
00385 const DataIndex& a_dit,
00386 const Real& a_beta);
00387
00388 void applyDomainFlux(Box * a_loBox,
00389 Box * a_hiBox,
00390 int * a_hasLo,
00391 int * a_hasHi,
00392 Box & a_curPhiBox,
00393 int a_nComps,
00394 BaseFab<Real> & a_phiFAB,
00395 bool a_homogeneousPhysBC,
00396 const DataIndex& a_dit,
00397 const Real& a_beta);
00398
00399
00400
00401
00402
00403
00404 void getInvDiagRHS(LevelData<EBCellFAB>& a_lhs,
00405 const LevelData<EBCellFAB>& a_rhs);
00406
00407 private:
00408
00409 EBPoissonOp(const EBPoissonOp& a_opin)
00410 {
00411 MayDay::Error("invalid operator");
00412 }
00413
00414 void operator=(const EBPoissonOp& a_opin)
00415 {
00416 MayDay::Error("invalid operator");
00417 }
00418 };
00419
00420
00421 #include "NamespaceFooter.H"
00422 #endif