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
00024
00025
00026
00027
00028
00029 class LevelFluxRegister
00030 {
00031 protected:
00032
00033
00034 enum FluxRegDefineStatus
00035 {
00036 FluxRegUndefined = 0,
00037 FluxRegDefined = (1 << 0),
00038 FluxRegFineDefined = (1 << 1),
00039 FluxRegCoarseDefined = (1 << 2),
00040 FluxRegAllDefined = (1 << 3) - 1
00041 };
00042
00043 public:
00044 static bool s_verbose;
00045
00046
00047
00048
00049 LevelFluxRegister();
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 LevelFluxRegister(const DisjointBoxLayout& a_dbl,
00061 const DisjointBoxLayout& a_dblCoarse,
00062 const ProblemDomain& a_dProblem,
00063 int a_nRefine,
00064 int a_nComp,
00065 bool a_scaleFineFluxes = true,
00066 int a_unrefinedDirection=-1);
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077 LevelFluxRegister(const DisjointBoxLayout& a_dbl,
00078 const DisjointBoxLayout& a_dblCoarse,
00079 const Box& a_dProblem,
00080 int a_nRefine,
00081 int a_nComp,
00082 bool a_scaleFineFluxes = true,
00083 int a_unrefinedDirection = -1);
00084
00085
00086 virtual ~LevelFluxRegister();
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098 virtual void define(const DisjointBoxLayout& a_dbl,
00099 const DisjointBoxLayout& a_dblCoarse,
00100 const ProblemDomain& a_dProblem,
00101 int a_nRefine,
00102 int a_nComp,
00103 bool a_scaleFineFluxes,
00104 int a_unrefinedDirection = -1);
00105
00106
00107
00108
00109
00110 virtual void define(const DisjointBoxLayout& a_dbl,
00111 const DisjointBoxLayout& a_dblCoarse,
00112 const ProblemDomain& a_dProblem,
00113 int a_nRefine,
00114 int a_nComp);
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126 virtual void define(const DisjointBoxLayout& a_dbl,
00127 const DisjointBoxLayout& a_dblCoarse,
00128 const Box& a_dProblem,
00129 int a_nRefine,
00130 int a_nComp,
00131 bool a_scaleFineFluxes = true);
00132
00133
00134
00135
00136
00137
00138
00139
00140 virtual void
00141 undefine();
00142
00143
00144
00145
00146
00147 virtual void setToZero();
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157 virtual void incrementCoarse(
00158 const FArrayBox& a_coarseFlux,
00159 Real a_scale,
00160 const DataIndex& a_coarseDataIndex,
00161 const Interval& a_srcInterval,
00162 const Interval& a_dstInterval,
00163 int a_dir);
00164
00165
00166
00167
00168
00169
00170 virtual void incrementCoarse(
00171 const FArrayBox& a_coarseFlux,
00172 Real a_scale,
00173 const DataIndex& a_coarseDataIndex,
00174 const Interval& a_srcInterval,
00175 const Interval& a_dstInterval,
00176 int a_dir,
00177 Side::LoHiSide a_sd);
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187 virtual void incrementFine(
00188 const FArrayBox& a_fineFlux,
00189 Real a_scale,
00190 const DataIndex& a_fineDataIndex,
00191 const Interval& a_srcInterval,
00192 const Interval& a_dstInterval,
00193 int a_dir);
00194
00195
00196
00197
00198
00199
00200 virtual void incrementFine(
00201 const FArrayBox& a_fineFlux,
00202 Real a_scale,
00203 const DataIndex& a_fineDataIndex,
00204 const Interval& a_srcInterval,
00205 const Interval& a_dstInterval,
00206 int a_dir,
00207 Side::LoHiSide a_sd);
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220 virtual void reflux(
00221 LevelData<FArrayBox>& a_uCoarse,
00222 Real a_scale);
00223
00224
00225
00226
00227
00228
00229
00230
00231 virtual void reflux(
00232 LevelData<FArrayBox>& a_uCoarse,
00233 const Interval& a_coarseVectorIntv,
00234 Real a_scale);
00235
00236
00237
00238
00239
00240
00241
00242
00243 virtual void reflux(
00244 LevelData<FArrayBox>& a_uCoarse,
00245 const Interval& a_coarse_interval,
00246 const Interval& a_flux_interval,
00247 Real a_scale);
00248
00249
00250 virtual void reflux(
00251 LevelData<FArrayBox>& a_uCoarse,
00252 Real a_scale,
00253 const Interval& a_coarseInterv,
00254 const Interval& a_fluxInterval,
00255 const LevelData<FArrayBox>& a_beta);
00256
00257
00258 bool hasCF(const DataIndex& a_fineDataIndex, Side::LoHiSide) const;
00259 bool hasCF(const DataIndex& a_coarseIndex) const;
00260
00261
00262
00263
00264
00265 bool isDefined() const;
00266
00267 bool isAllDefined() const;
00268
00269
00270 void poutCoarseRegisters() const;
00271
00272
00273 void poutFineRegisters() const;
00274
00275 LayoutData< Vector<Box> >& getCoarseLocations(int a_idir, Side::LoHiSide a_sd)
00276 {
00277 CH_assert(isDefined());
00278 int index = a_idir + a_sd*CH_SPACEDIM;
00279 return m_coarseLocations[index];
00280 }
00281
00282 Copier& getReverseCopier()
00283 {
00284 return m_reverseCopier;
00285 }
00286
00287 protected:
00288
00289
00290
00291
00292 LevelData<FArrayBox> m_coarFlux;
00293 LevelData<FArrayBox> m_fineFlux;
00294
00295
00296 LayoutData< Vector<Box> > m_coarseLocations[CH_SPACEDIM*2];
00297
00298 ProblemDomain m_domain;
00299
00300 int m_isDefined;
00301
00302 IntVect m_nRefine;
00303
00304 bool m_scaleFineFluxes;
00305
00306 int m_unrefinedDirection;
00307
00308 Copier m_reverseCopier;
00309
00310 bool m_noRealCoarseFineInterface;
00311 private:
00312
00313
00314 void operator= (const LevelFluxRegister&);
00315
00316 LevelFluxRegister(const LevelFluxRegister&);
00317 };
00318 #include "NamespaceFooter.H"
00319 #endif