00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _EBFASTFR_H_
00012 #define _EBFASTFR_H_
00013
00014 #include "REAL.H"
00015 #include "Vector.H"
00016 #include "EBCellFAB.H"
00017 #include "EBFaceFAB.H"
00018 #include "EBISLayout.H"
00019 #include "EBISBox.H"
00020 #include "IntVectSet.H"
00021 #include "CFStencil.H"
00022 #include "LoHiSide.H"
00023 #include "LevelData.H"
00024 #include "EBLevelGrid.H"
00025 #include "LayoutData.H"
00026 #include "LevelFluxRegister.H"
00027 #include "NamespaceHeader.H"
00028 class EBIndexSpace;
00029
00031
00037 class EBFastFR
00038 {
00039 public:
00040
00042
00045 EBFastFR();
00046
00048
00052 EBFastFR(const EBLevelGrid& a_eblgFine,
00053 const EBLevelGrid& a_eblgCoar,
00054 const int& a_nref,
00055 const int& a_nvar);
00056
00058 ~EBFastFR();
00059
00061
00064 void
00065 define(const EBLevelGrid& a_eblgFine,
00066 const EBLevelGrid& a_eblgCoar,
00067 const int& a_nref,
00068 const int& a_nvar);
00069
00071
00074 void
00075 setToZero();
00076
00077
00079 void
00080 incrementCoarseBoth(const EBFaceFAB& a_coarseFlux,
00081 const Real& a_scale,
00082 const DataIndex& a_coarseDataIndex,
00083 const Interval& a_variables,
00084 const int& a_dir,
00085 const Side::LoHiSide& a_sd);
00086
00087
00089 void
00090 incrementFineBoth(const EBFaceFAB& a_fineFlux,
00091 const Real& a_scale,
00092 const DataIndex& a_fineDataIndex,
00093 const Interval& a_variables,
00094 const int& a_dir,
00095 const Side::LoHiSide& a_sd);
00096
00097
00098
00100 void reflux(LevelData<EBCellFAB>& a_uCoarse,
00101 const Interval& a_variables,
00102 const Real& a_scale);
00103
00104
00106
00115 void incrementDensityArray(LevelData<EBCellFAB>& a_coarMass,
00116 const Interval& a_variables,
00117 const Real& a_scale);
00118
00120 bool isDefined() const;
00121
00122 protected:
00123
00124 static int index(int a_dir, Side::LoHiSide a_side);
00125
00126 void incrementFineIrreg(const EBFaceFAB& a_fineFlux,
00127 const Real& a_newScale,
00128 const DataIndex& a_fineDatInd,
00129 const Interval& a_variables,
00130 const int& a_dir,
00131 const Side::LoHiSide& a_sd);
00132
00133 void incrementCoarIrreg(const EBFaceFAB& a_coarFlux,
00134 const Real& a_scale,
00135 const DataIndex& a_coarDatInd,
00136 const Interval& a_variables,
00137 const int& a_dir,
00138 const Side::LoHiSide& a_sd);
00139
00140 void irregSetToZero();
00141
00142 void cacheOldSolution(const LevelData<EBCellFAB>& a_uCoar,
00143 const Interval& a_variables);
00144
00145 void restoreOldSolution(LevelData<EBCellFAB>& a_uCoar,
00146 const Interval& a_variables);
00147
00148 void irregReflux(LevelData<EBCellFAB>& a_uCoar,
00149 const Interval& a_variables,
00150 const Real& a_scale);
00151
00152 LevelFluxRegister m_levelFluxReg;
00153 bool m_isDefined;
00154
00155 EBLevelGrid m_eblgFine;
00156 EBLevelGrid m_eblgCoar;
00157 int m_refRat;
00158 int m_nComp;
00159
00160
00161 EBISLayout m_ebislBufCoar[2*SpaceDim];
00162
00163 EBISLayout m_ebislBufFine[2*SpaceDim];
00164
00165
00166 LayoutData<Vector<DataIndex> > m_coarIndexMap[SpaceDim*2];
00167
00168 LayoutData<bool> m_noEBCFine[SpaceDim*2];
00169 LayoutData<bool> m_noEBCCoar[SpaceDim*2];
00170
00171
00172 DisjointBoxLayout m_bufGridsFine[SpaceDim*2];
00173
00174 DisjointBoxLayout m_bufGridsCoar[SpaceDim*2];
00175
00176
00177 LevelData<BaseIVFAB<Real> > m_regsCoar[SpaceDim*2];
00178
00179 LevelData<BaseIVFAB<Real> > m_regsFine[SpaceDim*2];
00180
00181
00182 LayoutData<IntVectSet> m_cfivsFine[SpaceDim*2];
00183 LayoutData<IntVectSet> m_cfivsCoar[SpaceDim*2];
00184
00185 LayoutData<VoFIterator> m_vofitBufCoar[SpaceDim*2];
00186 LayoutData<VoFIterator> m_vofitBufFine[SpaceDim*2];
00187 LayoutData<VoFIterator> m_vofitCoar;
00188
00189
00190 LevelData<BaseIVFAB<Real> > m_scratchc[SpaceDim*2];
00191 LayoutData<BaseIVFAB<Real> > m_saveoldc;
00192
00193
00194 Real m_nrefdmo;
00195 bool m_hasEBCF;
00196 private:
00197
00198
00199
00200
00201 void operator= (const EBFastFR& out)
00202 {
00203 MayDay::Error("invalid operator");
00204 }
00205 EBFastFR(const EBFastFR& out)
00206 {
00207 MayDay::Error("invalid operator");
00208 }
00209 };
00210 #include "NamespaceFooter.H"
00211 #endif