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 "EBCellFactory.H"
00019 #include "EBLevelDataOps.H"
00020 #include "EBISLayout.H"
00021 #include "EBISBox.H"
00022 #include "IntVectSet.H"
00023 #include "CFStencil.H"
00024 #include "LoHiSide.H"
00025 #include "LevelData.H"
00026 #include "EBLevelGrid.H"
00027 #include "LayoutData.H"
00028 #include "LevelFluxRegister.H"
00029 #include "NamespaceHeader.H"
00030 class EBIndexSpace;
00031
00032
00033
00034
00035
00036
00037
00038
00039 class EBFastFR
00040 {
00041 public:
00042 static bool s_verbose;
00043
00044
00045
00046
00047 EBFastFR();
00048
00049
00050
00051
00052
00053
00054
00055 EBFastFR(const EBLevelGrid& a_eblgFine,
00056 const EBLevelGrid& a_eblgCoar,
00057 const int& a_nref,
00058 const int& a_nvar,
00059 bool a_forceNoEBCF = false);
00060
00061
00062 virtual ~EBFastFR();
00063
00064
00065
00066
00067
00068 virtual void
00069 define(const EBLevelGrid& a_eblgFine,
00070 const EBLevelGrid& a_eblgCoar,
00071 const int& a_nref,
00072 const int& a_nvar,
00073 bool a_forceNoEBCF = false);
00074
00075
00076
00077
00078
00079 virtual void
00080 setToZero();
00081
00082
00083
00084
00085
00086
00087
00088
00089 virtual void
00090 incrementCoarseBoth(const EBFaceFAB& a_coarseFlux,
00091 const Real& a_scale,
00092 const DataIndex& a_coarseDataIndex,
00093 const Interval& a_variables,
00094 const int& a_dir,
00095 const Side::LoHiSide& a_sd);
00096
00097
00098
00099 virtual void
00100 incrementFineBoth(const EBFaceFAB& a_fineFlux,
00101 const Real& a_scale,
00102 const DataIndex& a_fineDataIndex,
00103 const Interval& a_variables,
00104 const int& a_dir,
00105 const Side::LoHiSide& a_sd);
00106
00107 void
00108 compareFineSparse(const EBFaceFAB& a_fluxOld,
00109 const EBFaceFAB& a_fluxNew,
00110 const DataIndex& a_fineDatInd,
00111 const int& a_dir,
00112 const Side::LoHiSide& a_sd);
00113
00114
00115 virtual void
00116 incrementFineSparse(const EBFaceFAB& a_fineFlux,
00117 const Real& a_scale,
00118 const DataIndex& a_fineDatInd,
00119 const Interval& a_variables,
00120 const int& a_dir,
00121 const Side::LoHiSide& a_sd,
00122 bool a_doingFineRegular);
00123
00124
00125 virtual void reflux(LevelData<EBCellFAB>& a_uCoarse,
00126 const Interval& a_variables,
00127 const Real& a_scale,
00128 bool a_multByKappaOneMinusKappa = false);
00129
00130
00131 virtual void reflux(LevelData<EBCellFAB>& a_uCoarse,
00132 const Interval& a_solutionvariables,
00133 const Interval& a_fluxvariables,
00134 const Real& a_scale,
00135 bool a_multByKappaOneMinusKappa = false)
00136 {
00137 CH_assert(a_fluxvariables.size() == a_solutionvariables.size());
00138 EBCellFactory fact(m_eblgCoar.getEBISL());
00139 LevelData<EBCellFAB> diffCoar(m_eblgCoar.getDBL(), m_nComp, IntVect::Zero, fact);
00140 EBLevelDataOps::setToZero(diffCoar);
00141 reflux(diffCoar, a_fluxvariables, a_scale, a_multByKappaOneMinusKappa);
00142 for (DataIterator dit = m_eblgCoar.getDBL().dataIterator(); dit.ok(); ++dit)
00143 {
00144 int isrc = a_fluxvariables.begin();
00145 int inco = a_fluxvariables.size();
00146 int idst = a_solutionvariables.begin();
00147 a_uCoarse[dit()].plus(diffCoar[dit()], isrc, idst, inco);
00148 }
00149 }
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161 void incrementDensityArray(LevelData<EBCellFAB>& a_coarMass,
00162 const Interval& a_variables,
00163 const Real& a_scale);
00164
00165
00166 bool isDefined() const;
00167
00168 static int index(int a_dir, Side::LoHiSide a_side);
00169
00170 void incrementFineIrreg(const EBFaceFAB& a_fineFlux,
00171 const Real& a_newScale,
00172 const DataIndex& a_fineDatInd,
00173 const Interval& a_variables,
00174 const int& a_dir,
00175 const Side::LoHiSide& a_sd);
00176
00177
00178
00179
00180
00181
00182
00183
00184 void incrementCoarIrreg(const EBFaceFAB& a_coarFlux,
00185 const Real& a_scale,
00186 const DataIndex& a_coarDatInd,
00187 const Interval& a_variables,
00188 const int& a_dir,
00189 const Side::LoHiSide& a_sd);
00190
00191 void incrementFineRegul(const EBFaceFAB& a_fineFlux,
00192 const Real& a_newScale,
00193 const DataIndex& a_fineDatInd,
00194 const Interval& a_variables,
00195 const int& a_dir,
00196 const Side::LoHiSide& a_sd);
00197
00198 void incrementCoarRegul(const EBFaceFAB& a_coarFlux,
00199 const Real& a_scale,
00200 const DataIndex& a_coarDatInd,
00201 const Interval& a_variables,
00202 const int& a_dir,
00203 const Side::LoHiSide& a_sd);
00204
00205 bool hasEBCF() const
00206 {
00207 return m_hasEBCF;
00208 }
00209
00210
00211 void clear();
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225 Vector<VoFIterator>& getVoFItCoar(const DataIndex& a_dit,
00226 const int& a_idir,
00227 const Side::LoHiSide& a_sd)
00228 {
00229 int iloc = index(a_idir, a_sd);
00230 return (m_vofiCoar[iloc])[a_dit];
00231 }
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245 VoFIterator& getVoFItCoFi(const DataIndex& a_dit,
00246 const int& a_idir,
00247 const Side::LoHiSide& a_sd)
00248 {
00249 int iloc = index(a_idir, a_sd);
00250 return (m_vofiCoFi[iloc])[a_dit];
00251 }
00252
00253
00254 const EBLevelGrid& getEBLGCoFi() const
00255 {
00256 return m_eblgCoFi;
00257 }
00258
00259 protected:
00260
00261 void irregSetToZero();
00262 void defineSetsAndIterators();
00263 void defineBuffers();
00264
00265 void cacheOldSolution(const LevelData<EBCellFAB>& a_uCoar,
00266 const Interval& a_variables);
00267
00268 void restoreOldSolution(LevelData<EBCellFAB>& a_uCoar,
00269 const Interval& a_variables);
00270
00271 void irregReflux(LevelData<EBCellFAB>& a_uCoar,
00272 const Interval& a_variables,
00273 const Real& a_scale,
00274 bool a_multByKappaOneMinusKappa = false);
00275
00276 void incrementByRefluxDivergence(LevelData<EBCellFAB>& a_uCoar,
00277 LevelData<EBCellFAB>& a_fluxDiff,
00278 const Interval & a_variables,
00279 const Real & a_newScale,
00280 bool a_multByOneMinusKappa,
00281 bool a_multByKappaOneMinusKappa);
00282
00283
00284 LevelFluxRegister* m_levelFluxReg;
00285 bool m_isDefined;
00286
00287 void setDefaultValues();
00288 EBLevelGrid m_eblgFine;
00289 EBLevelGrid m_eblgCoar;
00290 EBLevelGrid m_eblgCoFi;
00291
00292 int m_refRat;
00293 int m_nComp;
00294
00295
00296
00297 Real m_nrefdmo;
00298 bool m_hasEBCF;
00299
00300
00301 bool computeHasEBCF();
00302 LayoutData< VoFIterator > m_vofiCoFi[2*SpaceDim];
00303 LayoutData< IntVectSet > m_setsCoFi[2*SpaceDim];
00304 LayoutData< Vector<IntVectSet > > m_setsCoar[2*SpaceDim];
00305 LayoutData< Vector<VoFIterator> > m_vofiCoar[2*SpaceDim];
00306
00307 Copier m_reverseCopier;
00308
00309
00310
00311 LevelData<EBCellFAB> m_saveCoar;
00312
00313
00314 LevelData<EBCellFAB> m_delUCoFi;
00315 LevelData<EBCellFAB> m_delUCoar;
00316 LevelData<EBCellFAB> m_delUDiff;
00317 private:
00318
00319
00320
00321
00322 void operator= (const EBFastFR& out)
00323 {
00324 MayDay::Error("invalid operator");
00325 }
00326 EBFastFR(const EBFastFR& out)
00327 {
00328 MayDay::Error("invalid operator");
00329 }
00330 };
00331 #include "NamespaceFooter.H"
00332 #endif