1 #ifndef DUNE_ALU2DGRID_INCLUDE_HH
2 #define DUNE_ALU2DGRID_INCLUDE_HH
4 #define ALU2DGRID_COMPATIBILITY_LEVEL 2
6 #include <alugrid_2d.h>
12 #define COMPILE_ALU2DGRID_LIB 0
14 #if COMPILE_ALU2DGRID_LIB
15 #define COMPILE_ALU2DGRID_INLINE 0
17 #define COMPILE_ALU2DGRID_INLINE 1
20 #if COMPILE_ALU2DGRID_INLINE
21 #define alu2d_inline inline
28 #ifndef ALUGRID_VERTEX_PROJECTION
29 #include <alugrid_serial.h>
32 #define ALU2DSPACE ALU2DSPACENAME ::
34 #define ALU2DSPACENAME ALU2DGrid
35 #define ALU2DDIMWORLD(dimw,eltype) < dimw,(eltype == ALU2DSPACE triangle ? 3 : 4) >
40 #define ALU2DGRID_PARALLEL 0
42 #include <dune/common/collectivecommunication.hh>
44 #if ALU2DGRID_PARALLEL
46 #warning "Using ALU2dGrid in parallel"
68 template<
int dim,
int dimw, ALU2DSPACE ElementType eltype >
69 struct ALU2dImplInterface;
71 template<
int dimw, ALU2DSPACE ElementType eltype >
72 struct ALU2dImplInterface< 0, dimw, eltype >
77 template<
int dimw, ALU2DSPACE ElementType eltype >
78 struct ALU2dImplInterface< 1, dimw, eltype >
83 template<
int dimw, ALU2DSPACE ElementType eltype >
84 struct ALU2dImplInterface< 2, dimw, eltype >
94 template<
int dimw, ALU2DSPACE ElementType eltype >
100 typedef typename ALU2dImplInterface< 2-cdim, dimw, eltype >::Type
InterfaceType;
118 typedef std::vector< int > VectorType;
122 bool valid()
const {
return valid_; }
126 bool isOnElement(
int elementIndex,
int idx,
int codim)
const
128 return marker_[codim-1][idx] == elementIndex;
131 template <
class Gr
idType>
132 void update (
const GridType & grid,
int level )
134 enum { dim = GridType::dimension };
135 static const int dimworld = GridType::dimensionworld;
136 static const ALU2DSPACE ElementType eltype = GridType::elementType;
140 typedef ALU2DSPACE Listwalkptr< ElementType > IteratorType;
143 for(
int i=0; i<2; ++i)
145 int s = grid.hierSetSize(i+1);
146 if((
int) marker_[i].size() < s ) marker_[i].resize(s);
148 size_t markerSize = marker_[i].size();
150 for(
size_t k=0; k<markerSize; ++k) marker_[i][k] = -1;
153 IteratorType iter(grid.myGrid(), level);
155 for(iter->first(); !iter->done(); iter->next())
157 ElementType & elem = iter->getitem();
158 int elIdx = elem.getIndex();
161 #if ALU2DGRID_PARALLEL
162 if( ! grid.rankManager().isValid( elIdx ,
All_Partition ) )
continue;
164 for(
int i=0; i<elem.numvertices(); ++i)
166 enum { vxCodim = 1 };
167 int vxIdx = elem.getVertex(i)->getIndex();
168 if( marker_[vxCodim][vxIdx] < 0) marker_[vxCodim][vxIdx] = elIdx;
170 enum { edgeCodim = 0 };
171 int edgeIdx = elem.edge_idx(i);
172 if( marker_[edgeCodim][edgeIdx] < 0) marker_[edgeCodim][edgeIdx] = elIdx;
179 VectorType marker_[2];
186 typedef std::vector< int > VectorType;
190 bool valid()
const {
return valid_; }
195 bool isOnElement(
int elementIndex,
int idx,
int codim)
const
199 assert( codim == 1 );
200 return marker_[idx] == elementIndex;
204 template <
class Gr
idType>
205 void update (
const GridType & grid)
207 static const int dimworld = GridType::dimensionworld;
212 typedef ALU2DSPACE Listwalkptr< ElementType > IteratorType;
216 int s = grid.hierSetSize(1);
217 if((
int) marker_.size() < s ) marker_.resize(s);
219 size_t markerSize = marker_.size();
221 for(
size_t k=0; k<markerSize; ++k) marker_[k] = -1;
226 int s = grid.hierSetSize(2);
227 if((
int) vertexLevels_.size() < s ) vertexLevels_.resize(s);
230 size_t vxSize = vertexLevels_.size();
231 for(
size_t k=0; k<vxSize; ++k) vertexLevels_[k] = -1;
234 enum { dim = GridType::dimension };
235 IteratorType iter(grid.myGrid());
237 for(iter->first(); !iter->done(); iter->next())
239 ElementType & elem = iter->getitem();
240 int elIdx = elem.getIndex();
242 #if ALU2DGRID_PARALLEL
244 if( ! grid.rankManager().isValid( elIdx ,
All_Partition ) )
continue;
246 int level = elem.level();
248 for(
int i=0; i<elem.numvertices(); ++i)
250 int vxIdx = elem.getVertex(i)->getIndex();
253 if(level > vertexLevels_[vxIdx]) vertexLevels_[vxIdx] = level;
255 int edgeIdx = elem.edge_idx(i);
256 if( marker_[edgeIdx] < 0) marker_[edgeIdx] = elIdx;
263 int levelOfVertex(
const int vxIdx)
const
266 assert( vxIdx >= 0 && vxIdx < (
int) vertexLevels_.size());
268 assert( vertexLevels_[vxIdx] >= 0 );
269 return vertexLevels_[vxIdx];
273 bool isValidVertex(
const int vxIdx)
const
276 assert( vxIdx >= 0 && vxIdx < (
int) vertexLevels_.size());
277 return (vertexLevels_[vxIdx] >= 0);
282 VectorType vertexLevels_;