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 #ifndef _EBLEVELFLUXREGISTER_H_
00029 #define _EBLEVELFLUXREGISTER_H_
00030 #include "REAL.H"
00031 #include "Vector.H"
00032 #include "EBCellFAB.H"
00033 #include "EBFaceFAB.H"
00034 #include "EBISLayout.H"
00035 #include "EBISBox.H"
00036 #include "IntVectSet.H"
00037 #include "CFStencil.H"
00038 #include "LoHiSide.H"
00039 #include "LevelData.H"
00040 #include "LayoutData.H"
00041
00042 class EBCoarToFineRedist;
00043 class EBCoarToCoarRedist;
00044
00046
00050 class EBFluxRegister
00051 {
00052 public:
00053
00055
00058 EBFluxRegister();
00059
00061
00065 EBFluxRegister(const DisjointBoxLayout& a_dblFine,
00066 const DisjointBoxLayout& a_dblCoar,
00067 const EBISLayout& ebislFine,
00068 const EBISLayout& ebislCoar,
00069 const Box& domainCoar,
00070 const int& nref,
00071 const int& nvar);
00072
00074 ~EBFluxRegister();
00075
00077
00080 void
00081 define(const DisjointBoxLayout& a_dblFine,
00082 const DisjointBoxLayout& a_dblCoar,
00083 const EBISLayout& ebislFine,
00084 const EBISLayout& ebislCoar,
00085 const Box& domainCoar,
00086 const int& nref,
00087 const int& nvar);
00088
00089
00091
00094 void
00095 setToZero();
00096
00098
00106 void
00107 incrementCoarseRegular(const EBFaceFAB& a_coarseFlux,
00108 const Real& a_scale,
00109 const DataIndex& a_coarseDataIndex,
00110 const Interval& a_variables,
00111 const int& a_dir);
00112
00114
00122 void
00123 incrementCoarseIrregular(const BaseIFFAB<Real>& a_coarseFlux,
00124 const Real& a_scale,
00125 const DataIndex& a_coarseDataIndex,
00126 const Interval& a_variables,
00127 const int& a_dir);
00128
00130
00136 void
00137 incrementFineRegular(const EBFaceFAB& a_fineFlux,
00138 const Real& a_scale,
00139 const DataIndex& a_fineDataIndex,
00140 const Interval& a_variables,
00141 const int& a_dir,
00142 const Side::LoHiSide& a_sd);
00143
00144
00146
00152 void
00153 incrementFineIrregular(const BaseIFFAB<Real>& a_fineFlux,
00154 const Real& a_scale,
00155 const DataIndex& a_fineDataIndex,
00156 const Interval& a_variables,
00157 const int& a_dir,
00158 const Side::LoHiSide& a_sd);
00159
00161
00166 void reflux(LevelData<EBCellFAB>& a_uCoarse,
00167 const Interval& a_variables,
00168 const Real& a_scale);
00169
00171
00175 void incrementRedistRegister(EBCoarToFineRedist& a_register,
00176 const Interval& a_variables,
00177 const Real& a_scale);
00178
00180
00184 void incrementRedistRegister(EBCoarToCoarRedist& a_register,
00185 const Interval& a_variables,
00186 const Real& a_scale);
00187
00189
00193 void incrementDensityArray(LevelData<EBCellFAB>& a_coarMass,
00194 const Interval& a_variables,
00195 const Real& a_scale);
00196
00198 bool isDefined() const;
00199
00201 void dumpCoar(const int& a_idir,
00202 const Side::LoHiSide& a_sd);
00204 void dumpFine(const int& a_idir,
00205 const Side::LoHiSide& a_sd);
00206
00208 void dumpBIVF(const BaseIVFAB<Real>& reg,
00209 const EBISBox& a_ebisBox);
00210 protected:
00211
00212 static int index(int a_dir, Side::LoHiSide a_side);
00213
00214
00215 void setDefaultValues();
00216
00217
00218
00219
00220
00221
00222
00223
00224 DisjointBoxLayout m_gridsFine;
00225
00226 DisjointBoxLayout m_gridsCoar;
00227
00228
00229 DisjointBoxLayout m_bufGridsFine[SpaceDim*2];
00230
00231 DisjointBoxLayout m_bufGridsCoar[SpaceDim*2];
00232
00233
00234 LevelData<BaseIVFAB<Real> > m_regsCoar[SpaceDim*2];
00235
00236 LevelData<BaseIVFAB<Real> > m_regsFine[SpaceDim*2];
00237
00238
00239 LevelData<BaseIVFAB<Real> > m_scratchc[SpaceDim*2];
00240
00241
00242 LayoutData<IntVectSet> m_cfivsFine[SpaceDim*2];
00243
00244 LayoutData<IntVectSet> m_cfivsCoar[SpaceDim*2];
00245
00246
00247 EBISLayout m_ebislFine;
00248
00249 EBISLayout m_ebislCoar;
00250
00251
00252 EBISLayout m_ebislBufCoar[2*SpaceDim];
00253
00254 EBISLayout m_ebislBufFine[2*SpaceDim];
00255
00256
00257 LayoutData<Vector<DataIndex> > m_coarIndexMap[SpaceDim*2];
00258
00259 bool m_isDefined;
00260 int m_nComp;
00261 int m_refRat;
00262 Box m_domainCoar;
00263
00264 private:
00265
00266
00267
00268
00269 void operator= (const EBFluxRegister&)
00270 {
00271 MayDay::Error("invalid operator");
00272 }
00273 EBFluxRegister(const EBFluxRegister&)
00274 {
00275 MayDay::Error("invalid operator");
00276 }
00277 };
00278 #endif