00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011
00012
00013 #ifndef _GRAPHNODE_H_
00014 #define _GRAPHNODE_H_
00015
00016 #include "REAL.H"
00017 #include "ProblemDomain.H"
00018 #include "IntVect.H"
00019 #include "VolIndex.H"
00020 #include "FaceIndex.H"
00021 #include "Vector.H"
00022 #include "Arena.H"
00023 #include "NamespaceHeader.H"
00024
00025
00026
00027
00028
00029
00030 class GraphNodeImplem
00031 {
00032 public:
00033
00034 inline
00035 GraphNodeImplem();
00036
00037
00038 inline
00039 ~GraphNodeImplem();
00040
00041
00042 GraphNodeImplem& operator=(const GraphNodeImplem& a_impin);
00043
00044
00045 GraphNodeImplem(const GraphNodeImplem& a_impin);
00046
00047
00048 bool m_isRegular;
00049
00050
00051 bool m_isValid;
00052
00053
00054
00055
00056
00057
00058 Vector<int> m_arc[2*SpaceDim];
00059
00060
00061
00062
00063 int m_coarserNode;
00064
00065
00066 int m_nodeInd;
00067
00068
00069 Vector<VolIndex> m_finerNodes;
00070
00071
00072 inline int index(int a_idir, Side::LoHiSide a_side) const;
00073
00074
00075 int linearSize() const;
00076
00077
00078 void linearOut(void* buffer ) const;
00079
00080
00081 void linearIn(void* buffer );
00082
00083 friend class EBISLevel;
00084 };
00085
00086
00087
00088
00089
00090
00091
00092 class GraphNode
00093 {
00094 public:
00095
00096
00097
00098
00099 inline GraphNode();
00100
00101
00102
00103
00104 inline ~GraphNode();
00105
00106
00107 int size() const;
00108
00109
00110
00111
00112
00113
00114 inline void clear();
00115
00116
00117
00118
00119
00120 inline bool isCovered() const;
00121
00122
00123
00124
00125
00126 inline bool isRegular() const;
00127
00128
00129
00130
00131
00132
00133 inline bool isRegularWithSingleValuedParent() const;
00134
00135
00136
00137
00138
00139
00140 inline bool isRegularWithMultiValuedParent() const;
00141
00142
00143
00144
00145
00146 inline bool isIrregular() const;
00147
00148
00149
00150
00151
00152 inline bool hasValidCellList() const;
00153
00154
00155
00156
00157
00158
00159 inline void defineAsRegular();
00160
00161
00162
00163
00164
00165
00166 inline void defineAsCovered();
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176 Vector<FaceIndex>
00177 getFaces(const VolIndex& a_vof,
00178 const int& a_idir,
00179 const Side::LoHiSide& a_sd,
00180 const ProblemDomain& a_domain) const;
00181
00182
00183 Vector<FaceIndex>
00184 getFaces(const IntVect& a_iv,
00185 const int& a_idir,
00186 const Side::LoHiSide& a_sd,
00187 const ProblemDomain& a_domain) const;
00188
00189
00190
00191
00192
00193
00194 Vector<VolIndex>
00195 getVoFs(const IntVect& a_iv) const;
00196
00197
00198 const GraphNode& operator=(const GraphNode& ebiin);
00199
00200
00201 GraphNode(const GraphNode& ebiin);
00202
00203
00204
00205
00206
00207
00208
00209 Vector<VolIndex> refine(const VolIndex& a_coarVoF) const;
00210
00211
00212
00213
00214
00215
00216
00217 VolIndex coarsen(const VolIndex& a_fineVoF) const;
00218
00219
00220
00221
00222 void addIrregularNode(const GraphNodeImplem& a_nodein, int cellIndex);
00223
00224
00225
00226 void addIrregularNode(const GraphNodeImplem& a_nodein);
00227
00228
00229
00230
00231
00232 Vector<Vector<VolIndex> > getVoFSets(const Box& a_box) const;
00233
00234
00235 int linearSize() const;
00236
00237
00238 void linearOut(void* buffer ) const;
00239
00240
00241 void linearIn(void* buffer );
00242
00243
00244 inline void setDefaults();
00245
00246 void* alloc();
00247
00248
00249
00250
00251
00252
00253
00254 Vector<GraphNodeImplem>* m_cellList;
00255
00256 static BArena s_Arena;
00257
00258 friend class EBISLevel;
00259 };
00260
00261
00262
00263 inline GraphNode::~GraphNode()
00264 {
00265 clear();
00266 }
00267
00268
00269 inline bool GraphNode::isCovered() const
00270 {
00271 return (m_cellList == ((Vector<GraphNodeImplem>*) 0));
00272 }
00273
00274
00275 inline bool GraphNode::isRegular() const
00276 {
00277 return (isRegularWithSingleValuedParent() ||
00278 isRegularWithMultiValuedParent());
00279 }
00280
00281
00282 inline bool GraphNode::isRegularWithSingleValuedParent() const
00283 {
00284 return (m_cellList == ((Vector<GraphNodeImplem>*) 1));
00285 }
00286
00287
00288 inline bool GraphNode::isRegularWithMultiValuedParent() const
00289 {
00290 return (((m_cellList != ((Vector<GraphNodeImplem>*) 0)) &&
00291 ((*m_cellList).size() == 1) &&
00292 ((*m_cellList)[0]).m_isRegular));
00293 }
00294
00295
00296 inline bool GraphNode::hasValidCellList() const
00297 {
00298 return (!isCovered() && !isRegularWithSingleValuedParent());
00299 }
00300
00301
00302 inline bool GraphNode::isIrregular() const
00303 {
00304 return ((!isRegular()) && (!isCovered()));
00305 }
00306
00307
00308 inline void GraphNode::setDefaults()
00309 {
00310 m_cellList = (Vector<GraphNodeImplem>*)1;
00311 }
00312
00313
00314 inline GraphNode::GraphNode()
00315 {
00316 setDefaults();
00317 }
00318
00319
00320 inline void GraphNode::clear()
00321 {
00322 if (hasValidCellList())
00323 {
00324
00325 m_cellList->~Vector<GraphNodeImplem>();
00326 s_Arena.free(m_cellList);
00327 #ifdef CH_USE_MEMORY_TRACKING
00328 ch_memcount-=sizeof(Vector<GraphNodeImplem>);
00329 s_Arena.bytes -= sizeof(Vector<GraphNodeImplem>);
00330 CH_assert(s_Arena.bytes >= 0);
00331 #endif
00332 }
00333 setDefaults();
00334 }
00335
00336
00337 inline void GraphNode::defineAsRegular()
00338 {
00339 clear();
00340 m_cellList = (Vector<GraphNodeImplem>*) 1;
00341 }
00342
00343
00344 inline void GraphNode::defineAsCovered()
00345 {
00346 clear();
00347 m_cellList = (Vector<GraphNodeImplem>*) 0;
00348 }
00349
00350
00351 inline GraphNodeImplem::GraphNodeImplem()
00352 : m_isRegular(false),
00353 m_isValid(true),
00354 m_coarserNode(-1),
00355 m_nodeInd(-1)
00356 {
00357 }
00358
00359
00360 inline GraphNodeImplem::~GraphNodeImplem()
00361 {
00362 }
00363
00364
00365 inline int GraphNodeImplem::index(int a_idir,
00366 Side::LoHiSide a_sd) const
00367 {
00368 CH_assert(a_idir >= 0 && a_idir < SpaceDim);
00369 return a_idir + a_sd*CH_SPACEDIM;
00370 }
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385 #include "NamespaceFooter.H"
00386
00387 #endif