00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011
00012
00013
00014
00015 #ifndef _EBQUADCFINTERP_H_
00016 #define _EBQUADCFINTERP_H_
00017
00018 #include "REAL.H"
00019 #include "FArrayBox.H"
00020 #include "LevelData.H"
00021 #include "DisjointBoxLayout.H"
00022 #include "EBIndexSpace.H"
00023 #include "EBISLayout.H"
00024 #include "EBCellFAB.H"
00025 #include "Interval.H"
00026 #include "Stencils.H"
00027 #include "QuadCFInterp.H"
00028 #include "BaseIVFAB.H"
00029 #include "CornerCopier.H"
00030 #include "VoFIterator.H"
00031 #include "EBCFData.H"
00032 #include "NamespaceHeader.H"
00033
00034
00035
00036
00037
00038
00039
00040 class EBQuadCFInterp: public QuadCFInterp
00041 {
00042 public:
00043
00044
00045
00046
00047 EBQuadCFInterp();
00048
00049
00050 virtual ~EBQuadCFInterp();
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 EBQuadCFInterp(const DisjointBoxLayout& a_dblFine,
00069 const DisjointBoxLayout& a_dblCoar,
00070 const EBISLayout& a_ebislFine,
00071 const EBISLayout& a_ebislCoar,
00072 const ProblemDomain& a_domainCoar,
00073 const int& a_nref,
00074 const int& a_nvar,
00075 const LayoutData<IntVectSet>& a_cfivs,
00076 const EBIndexSpace* const a_ebisPtr = Chombo_EBIS::instance(),
00077 bool a_doEBCFCrossing = true);
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094 void define(const DisjointBoxLayout& a_dblFine,
00095 const DisjointBoxLayout& a_dblCoar,
00096 const EBISLayout& a_ebislFine,
00097 const EBISLayout& a_ebislCoar,
00098 const ProblemDomain& a_domainCoar,
00099 const int& a_nref,
00100 const int& a_nvar,
00101 const LayoutData<IntVectSet>& a_cfivs,
00102 const EBIndexSpace* const a_ebisPtr = Chombo_EBIS::instance(),
00103 bool a_doEBCFCrossing = true);
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123 void
00124 interpolate(LevelData<EBCellFAB>& a_fineData,
00125 const LevelData<EBCellFAB>& a_coarData,
00126 const Interval& a_variables,
00127 bool a_doOnlyRegularInterp = false);
00128
00129 bool isDefined() const;
00130
00131
00132
00133
00134
00135 void interpEBCFCrossing(LevelData<EBCellFAB>& a_fineData,
00136 const LevelData<EBCellFAB>& a_coarData,
00137 const Interval& a_variables);
00138
00139
00140
00141
00142
00143
00144 void interpEBCFCorners(LevelData<EBCellFAB>& a_fineData,
00145 const LevelData<EBCellFAB>& a_coarData,
00146 const Interval& a_variables);
00147
00148
00149 RefCountedPtr<EBCFData> getEBCFData() const
00150 {return m_ebcfdata;}
00151
00152 protected:
00153
00154
00155
00156
00157
00158
00159
00160 bool getEBCFIVS(const LayoutData<IntVectSet>& a_cfivs);
00161
00162
00163
00164
00165
00166
00167 void buildEBCFStencils();
00168
00169
00170
00171
00172
00173
00174 void buildEBCFCornerStencils(const LayoutData<IntVectSet>& a_cfivs);
00175
00176
00177
00178 RefCountedPtr<EBCFData> m_ebcfdata;
00179
00180
00181 LevelData<EBCellFAB> m_ebBufferCoarsenedFine;
00182
00183 LayoutData<BaseIVFAB<VoFStencil> > m_coarStencilLo[SpaceDim];
00184 LayoutData<BaseIVFAB<VoFStencil> > m_coarStencilHi[SpaceDim];
00185
00186
00187
00188
00189
00190 LayoutData<BaseIVFAB<VoFStencil> > m_fineStencilLo[SpaceDim];
00191 LayoutData<BaseIVFAB<VoFStencil> > m_fineStencilHi[SpaceDim];
00192 LayoutData<BaseIVFAB<VoFStencil> > m_stencilCorners;
00193 LayoutData<BaseIVFAB<VoFStencil> > m_stencilEdges;
00194
00195
00196 LayoutData<IntVectSet> m_ebcfivsLo[SpaceDim];
00197 LayoutData<IntVectSet> m_ebcfivsHi[SpaceDim];
00198
00199 int
00200 getPhiStarStencil(VoFStencil& a_stencil,
00201 const VolIndex& a_ghostVoFFine,
00202 const VolIndex& a_ghostVoFCoar,
00203 const EBISBox& a_ebisBoxCoar,
00204 int a_idir, Side::LoHiSide a_sd,
00205 int a_refRat);
00206
00207 int
00208 getStencils(VoFStencil& a_fineStencil,
00209 VoFStencil& a_coarStencil,
00210 const VolIndex& a_ghostVoFFine,
00211 const VolIndex& a_ghostVoFCoar,
00212 const EBISBox& a_ebisBoxFine,
00213 const EBISBox& a_ebisBoxCoar,
00214 int a_idir, Side::LoHiSide a_sd,
00215 int a_refRat);
00216
00217
00218
00219 CornerCopier m_cornerCopier;
00220
00221
00222 IntVectSet m_excludeIVSCoar;
00223
00224 bool m_doEBCFCrossing;
00225 int m_refRat;
00226 static IntVect s_ivDebFine;
00227 static IntVect s_ivDebCoar;
00228 ProblemDomain m_domainFine, m_domainCoar;
00229 private:
00230
00231
00232 EBQuadCFInterp(const EBQuadCFInterp& ebcin)
00233 {
00234 MayDay::Error("ebqcfi 2 invalid operator");
00235 }
00236 void operator=(const EBQuadCFInterp& fabin)
00237 {
00238 MayDay::Error("ebqcfi 3 invalid operator");
00239 }
00240 };
00241
00242 #include "NamespaceFooter.H"
00243 #endif