00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _LEVELFLUXREGISTER_H_
00012 #define _LEVELFLUXREGISTER_H_
00013
00014 #include "REAL.H"
00015 #include "Vector.H"
00016 #include "FArrayBox.H"
00017 #include "IntVectSet.H"
00018 #include "LoHiSide.H"
00019 #include "LevelData.H"
00020 #include "LayoutData.H"
00021 #include "ProblemDomain.H"
00022 #include "NamespaceHeader.H"
00023
00025
00029 class LevelFluxRegister
00030 {
00031 public:
00032
00034
00037 LevelFluxRegister();
00038
00040
00048 LevelFluxRegister(const DisjointBoxLayout& a_dbl,
00049 const DisjointBoxLayout& a_dblCoarse,
00050 const ProblemDomain& a_dProblem,
00051 int a_nRefine,
00052 int a_nComp,
00053 bool a_scaleFineFluxes = true);
00054
00056
00064 LevelFluxRegister(const DisjointBoxLayout& a_dbl,
00065 const DisjointBoxLayout& a_dblCoarse,
00066 const Box& a_dProblem,
00067 int a_nRefine,
00068 int a_nComp,
00069 bool a_scaleFineFluxes = true);
00070
00072 ~LevelFluxRegister();
00073
00075
00084 void define(const DisjointBoxLayout& a_dbl,
00085 const DisjointBoxLayout& a_dblCoarse,
00086 const ProblemDomain& a_dProblem,
00087 int a_nRefine,
00088 int a_nComp,
00089 bool a_scaleFineFluxes = true);
00090
00092
00101 void define(const DisjointBoxLayout& a_dbl,
00102 const DisjointBoxLayout& a_dblCoarse,
00103 const Box& a_dProblem,
00104 int a_nRefine,
00105 int a_nComp,
00106 bool a_scaleFineFluxes = true);
00107
00109
00115 void
00116 undefine();
00117
00119
00122 void setToZero();
00123
00125
00132 void incrementCoarse(
00133 FArrayBox& a_coarseFlux,
00134 Real a_scale,
00135 const DataIndex& a_coarseDataIndex,
00136 const Interval& a_srcInterval,
00137 const Interval& a_dstInterval,
00138 int a_dir);
00139
00141
00144 void incrementCoarse(
00145 FArrayBox& a_coarseFlux,
00146 Real a_scale,
00147 const DataIndex& a_coarseDataIndex,
00148 const Interval& a_srcInterval,
00149 const Interval& a_dstInterval,
00150 int a_dir,
00151 Side::LoHiSide a_sd);
00152
00154
00161 void incrementFine(
00162 FArrayBox& a_fineFlux,
00163 Real a_scale,
00164 const DataIndex& a_fineDataIndex,
00165 const Interval& a_srcInterval,
00166 const Interval& a_dstInterval,
00167 int a_dir);
00168
00170
00173 void incrementFine(
00174 FArrayBox& a_fineFlux,
00175 Real a_scale,
00176 const DataIndex& a_fineDataIndex,
00177 const Interval& a_srcInterval,
00178 const Interval& a_dstInterval,
00179 int a_dir,
00180 Side::LoHiSide a_sd);
00181
00183
00193 void reflux(
00194 LevelData<FArrayBox>& a_uCoarse,
00195 Real a_scale);
00196
00197
00199
00205 void reflux(
00206 LevelData<FArrayBox>& a_uCoarse,
00207 const Interval& a_coarse_interval,
00208 const Interval& a_flux_interval,
00209 Real a_scale);
00210
00212 void reflux(
00213 LevelData<FArrayBox>& a_uCoarse,
00214 Real a_scale,
00215 const Interval& a_coarseInterv,
00216 const Interval& a_fluxInterval,
00217 const LevelData<FArrayBox>& a_beta);
00218
00219
00220 bool hasCF(const DataIndex& a_fineDataIndex, Side::LoHiSide) const;
00221 bool hasCF(const DataIndex& a_coarseIndex) const;
00222
00224
00227 bool isDefined() const;
00228
00230 void poutCoarseRegisters() const;
00231
00233 void poutFineRegisters() const;
00234 protected:
00235
00236
00237
00238
00239 LevelData<FArrayBox> m_coarFlux;
00240 LevelData<FArrayBox> m_fineFlux;
00241
00242
00243 LayoutData< Vector<Box> > m_coarseLocations[CH_SPACEDIM*2];
00244
00245 ProblemDomain m_domain;
00246
00247 bool m_isDefined;
00248
00249 int m_nRefine;
00250
00251 bool m_scaleFineFluxes;
00252
00253 Copier m_reverseCopier;
00254
00255 private:
00256
00258 void operator= (const LevelFluxRegister&);
00260 LevelFluxRegister(const LevelFluxRegister&);
00261 };
00262 #include "NamespaceFooter.H"
00263 #endif