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
00029 #ifndef _EBINDEXSPACE_H_
00030 #define _EBINDEXSPACE_H_
00031
00032 #include "REAL.H"
00033 #include "IntVect.H"
00034 #include "IntVectSet.H"
00035 #include "VolIndex.H"
00036 #include "FaceIndex.H"
00037 #include "IntVectSet.H"
00038 #include "DisjointBoxLayout.H"
00039 #include "LevelData.H"
00040 #include "EBISBox.H"
00041 #include "GeometryService.H"
00042 #include "EBISLayout.H"
00043 #include "HDF5.H"
00044
00046
00050 class EBISLevel
00051 {
00052 public:
00053
00054
00055 void coarsenVoFs(EBISLevel& a_fineEBIS);
00056
00057 void fixFineToCoarse(EBISLevel& a_fineEBIS);
00058
00059 void coarsenFaces(EBISLevel& a_fineEBIS);
00060
00061 EBISLevel();
00063
00067 EBISLevel(const Box& a_domain,
00068 const RealVect& a_origin,
00069 const Real& a_dx,
00070 const GeometryService& a_geoserver);
00071
00073
00079 EBISLevel(EBISLevel& a_finerLevel);
00080
00082 EBISLevel(HDF5Handle& handle);
00083
00085 void
00086 write(HDF5Handle& handle);
00087
00088
00090
00096 void sanityCheck();
00097
00099 void fillEBISLayout(EBISLayout& a_ebis,
00100 const DisjointBoxLayout& a_grids,
00101 const int& nghost) const;
00102 ~EBISLevel();
00103
00104 const Box& getDomain() const;
00105
00106 const DisjointBoxLayout& getGrids() const;
00107
00108 DisjointBoxLayout getIrregGrids() const;
00109
00110 const Real& getDX() const;
00111
00112 const RealVect& getOrigin() const;
00113 private:
00114
00116 DisjointBoxLayout m_grids;
00117
00119 Box m_domain;
00120
00122 RealVect m_origin;
00123
00125 Real m_dx;
00126
00128 LevelData<EBGraph> m_graph;
00129
00130 static Real s_tolerance;
00132 LevelData<EBData> m_data;
00133
00134
00135 static void
00136 makeBoxes(Vector<Box>& a_boxes,
00137 const Box& a_domain);
00138
00139
00140 void operator=(const EBISLevel& ebiin)
00141 {
00142 MayDay::Error("EBISLevel::operator= not allowed");
00143 }
00144
00145 EBISLevel(const EBISLevel& ebiin)
00146 {
00147 MayDay::Error("EBISLevel::copy constructor not allowed");
00148 }
00149 };
00150
00152
00158 class EBIndexSpace
00159 {
00160 public:
00162
00167 void
00168 define(const Box& a_domain,
00169 const RealVect& a_origin,
00170 const Real& a_dx,
00171 const GeometryService& a_geoserver,
00172 int a_nCellMax = -1,
00173 int maxCoarsenings = -1);
00174
00176 void
00177 define(HDF5Handle& handle, int maxCoarsenings = -1);
00178
00180 ~EBIndexSpace();
00181
00183 int numLevels() const;
00184
00186
00191 int getLevel(const Box& a_domain) const;
00192
00194 void fillEBISLayout(EBISLayout& a_ebis,
00195 const DisjointBoxLayout& a_grids,
00196 const Box& a_domain,
00197 const int & nghost) const;
00198
00200
00203 bool isDefined() const;
00204
00206 void clear();
00207
00208 int getNCellMax() const;
00210
00214 friend class Chombo_EBIS;
00215
00217 void
00218 write(HDF5Handle& handle);
00219
00220 DisjointBoxLayout getIrregGrids(int level) const
00221 { return m_ebisLevel[level]->getIrregGrids();}
00222
00223
00224 private:
00225
00226 EBIndexSpace();
00227
00228 int m_nCellMax;
00229 bool m_isDefined;
00230
00231 Vector<EBISLevel*> m_ebisLevel;
00232 Vector<Box> m_domainLevel;
00233 int m_nlevels;
00234 static Real s_tolerance;
00235
00236
00237 void operator=(const EBIndexSpace& ebiin)
00238 {
00239 MayDay::Error("no assignment of EBIndexSpace allowed");
00240 }
00241 EBIndexSpace(const EBIndexSpace& ebiin)
00242 {
00243 MayDay::Error("no copy construction of EBIndexSpace allowed");
00244 }
00245 };
00246
00248 class Chombo_EBIS
00249 {
00250 private:
00252
00260 static EBIndexSpace* s_instance;
00261
00262 Chombo_EBIS()
00263 {;}
00264
00265 ~Chombo_EBIS()
00266 {;}
00267 public:
00269
00276 static EBIndexSpace* instance();
00277
00278 };
00279
00280 #endif