3 #ifndef DUNE_GRID_YASPGRIDINTERSECTION_HH
4 #define DUNE_GRID_YASPGRIDINTERSECTION_HH
18 template<
class Gr
idImp>
19 class YaspIntersection
21 enum { dim=GridImp::dimension };
22 enum { dimworld=GridImp::dimensionworld };
23 typedef typename GridImp::ctype ctype;
25 typedef typename GridImp::Traits::template Codim< 1 >::GeometryImpl GeometryImpl;
26 typedef typename GridImp::Traits::template Codim< 1 >::LocalGeometryImpl LocalGeometryImpl;
32 typedef typename GridImp::YGridLevelIterator
YGLI;
33 typedef typename GridImp::YGrid::Iterator
I;
34 typedef typename GridImp::template Codim<0>::Entity
Entity;
35 typedef typename GridImp::template Codim<0>::EntityPointer
EntityPointer;
36 typedef typename GridImp::template Codim<1>::Geometry
Geometry;
37 typedef typename GridImp::template Codim<1>::LocalGeometry
LocalGeometry;
42 std::array<int,dim>
dist{{0}};
45 dist[_dir] = 1 - 2*_face;
52 dist[_dir] += -1 + 2*_face;
65 if (_inside.
gridlevel()->mg->isPeriodic(_dir))
78 return coord > _inside.
gridlevel()->overlap[0].dataBegin()->min(_dir)
80 coord <= _inside.
gridlevel()->overlap[0].dataBegin()->max(_dir);
102 #if DUNE_GRID_EXPERIMENTAL_GRID_EXTENSIONS
103 int boundaryId()
const
117 DUNE_THROW(
GridError,
"called boundarySegmentIndex while boundary() == false");
119 const Dune::array<int, dim> & size = _inside.
gridlevel()->mg->begin()->overlap[0].dataBegin()->size();
120 const Dune::array<int, dim> & origin = _inside.
gridlevel()->mg->begin()->overlap[0].dataBegin()->origin();
121 Dune::array<int, dim> sides;
123 for (
int i=0; i<dim; i++)
126 ((_inside.
gridlevel()->mg->begin()->overlap[0].dataBegin()->origin(i)
128 (_inside.
gridlevel()->mg->begin()->overlap[0].dataBegin()->origin(i) +
129 _inside.
gridlevel()->mg->begin()->overlap[0].dataBegin()->size(i)
131 _inside.
gridlevel()->mg->levelSize(0,i)));
137 for(
int i=0; i<dim; i++)
139 pos[i] = pos[i] / (1<<_inside.
level());
140 pos[i] = pos[i] - origin[i];
143 Dune::array<int, dim> fsize;
146 for (
int k=0; k<dim; k++)
148 for (
int k=0; k<dim; k++)
149 fsize[k] = vol/size[k];
155 for (
int k=dim-1; k>=0; k--)
157 if (k == _dir)
continue;
158 index += (pos[k]) * localoffset;
159 localoffset *= size[k];
164 for (
int k=0; k<_dir; k++)
165 index += sides[k] * fsize[k];
167 index += _face * (sides[_dir]>1) * fsize[_dir];
174 FieldVector<ctype, dimworld>
outerNormal (
const FieldVector<ctype, dim-1>& local)
const
176 return _faceInfo[_count].normal;
180 FieldVector<ctype, dimworld>
unitOuterNormal (
const FieldVector<ctype, dim-1>& local)
const
182 return _faceInfo[_count].normal;
188 return _faceInfo[_count].normal;
196 FieldVector<ctype, dimworld> n = _faceInfo[_count].normal;
222 std::bitset<dim> shift;
226 Dune::FieldVector<ctype,dimworld> ll, ur;
227 for (
int i=0; i<dimworld; i++)
231 if ((i == _dir) and (_face))
240 if (_inside.
gridlevel()->mg->isPeriodic(i)) {
243 auto size = _inside.
gridlevel()->mg->domainSize()[i];
246 }
else if (coord + 1 > _inside.
gridlevel()->mg->levelSize(_inside.
gridlevel()->level(),i)) {
247 auto size = _inside.
gridlevel()->mg->domainSize()[i];
254 GeometryImpl _is_global(ll,ur,shift);
285 _inside(myself.gridlevel(),
286 myself.transformingsubiterator()),
287 _outside(myself.gridlevel(),
288 myself.transformingsubiterator()),
317 return _count == other._count && _inside.
equals(other._inside);
332 FieldVector<ctype, dimworld> normal;
333 LocalGeometryImpl geom_inside;
334 LocalGeometryImpl geom_outside;
338 static const array<faceInfo, 2*GridImp::dimension> _faceInfo;
340 static array<faceInfo, 2*dim> initFaceInfo()
342 array<faceInfo, 2*dim>
I;
347 I[2*i+1].normal = 0.0;
348 I[2*i].normal[i] = -1.0;
349 I[2*i+1].normal[i] = +1.0;
357 Dune::FieldVector<ctype, dim> ll(0.0);
358 Dune::FieldVector<ctype, dim> ur(1.0);
361 I[2*i].geom_inside = LocalGeometryImpl(ll,ur,s);
362 I[2*i+1].geom_outside = LocalGeometryImpl(ll,ur,s);
367 I[2*i].geom_outside = LocalGeometryImpl(ll,ur,s);
368 I[2*i+1].geom_inside = LocalGeometryImpl(ll,ur,s);
375 template<
class Gr
idImp>
376 const array<typename YaspIntersection<GridImp>::faceInfo, 2*GridImp::dimension>
377 YaspIntersection<GridImp>::_faceInfo =
378 YaspIntersection<GridImp>::initFaceInfo();
382 #endif // DUNE_GRID_YASPGRIDINTERSECTION_HH
bool equals(const YaspEntity &e) const
Return true when two iterators over the same grid are equal (!).
Definition: yaspgridentity.hh:309
bool boundary() const
Definition: yaspgridintersection.hh:61
bool neighbor() const
return true if neighbor across intersection exists in this processor
Definition: yaspgridintersection.hh:74
GridImp::template Codim< 0 >::Entity Entity
Definition: yaspgridintersection.hh:34
int boundarySegmentIndex() const
Definition: yaspgridintersection.hh:114
FieldVector< ctype, dimworld > integrationOuterNormal(const FieldVector< ctype, dim-1 > &local) const
Definition: yaspgridintersection.hh:194
Base class for exceptions in Dune grid modules.
Definition: exceptions.hh:16
static double dist(const double *x, const double *y)
Definition: ghmesh.cc:149
Entity outside() const
return EntityPointer to the Entity on the outside of this intersection
Definition: yaspgridintersection.hh:97
Geometry geometry() const
Definition: yaspgridintersection.hh:219
GridImp::template Codim< 1 >::Geometry Geometry
Definition: yaspgridintersection.hh:36
GridImp::template Codim< 1 >::LocalGeometry LocalGeometry
Definition: yaspgridintersection.hh:37
bool conforming() const
Yasp is always conform.
Definition: yaspgridintersection.hh:84
const YGLI & gridlevel() const
Definition: yaspgridentity.hh:390
YaspIntersection()
Definition: yaspgridintersection.hh:277
bool equals(const YaspIntersection &other) const
Definition: yaspgridintersection.hh:314
GridImp::YGrid::Iterator I
Definition: yaspgridintersection.hh:33
Entity inside() const
Definition: yaspgridintersection.hh:91
GridImp::YGridLevelIterator YGLI
Definition: yaspgridintersection.hh:32
GridImp::template Codim< 0 >::EntityPointer EntityPointer
Definition: yaspgridintersection.hh:35
GeometryType
Type representing VTK's entity geometry types.
Definition: common.hh:178
FieldVector< ctype, dimworld > centerUnitOuterNormal() const
return unit outer normal at center of intersection geometry
Definition: yaspgridintersection.hh:186
LocalGeometry geometryInInside() const
Definition: yaspgridintersection.hh:204
GeometryType type() const
obtain the type of reference element for this intersection
Definition: yaspgridintersection.hh:259
YaspIntersectionIterator enables iteration over intersections with neighboring codim 0 entities...
Definition: yaspgrid.hh:62
const I & transformingsubiterator() const
Definition: yaspgridentity.hh:389
YaspIntersection(const YaspEntity< 0, dim, GridImp > &myself, bool toend)
make intersection iterator from entity, initialize to first neighbor
Definition: yaspgridintersection.hh:284
Definition: alugrid/common/declaration.hh:18
LocalGeometry geometryInOutside() const
Definition: yaspgridintersection.hh:212
void assign(const YaspIntersection &it)
copy constructor – use default
Definition: yaspgridintersection.hh:309
int indexInOutside() const
local index of codim 1 entity in neighbor where intersection is contained in
Definition: yaspgridintersection.hh:271
FieldVector< ctype, dimworld > outerNormal(const FieldVector< ctype, dim-1 > &local) const
return unit outer normal, this should be dependent on local coordinates for higher order boundary ...
Definition: yaspgridintersection.hh:174
int level() const
level of this element
Definition: yaspgridentity.hh:254
YaspIntersection provides data about intersection with neighboring codim 0 entities.
Definition: yaspgrid.hh:63
int indexInInside() const
local index of codim 1 entity in self where intersection is contained in
Definition: yaspgridintersection.hh:265
FieldVector< ctype, dimworld > unitOuterNormal(const FieldVector< ctype, dim-1 > &local) const
return unit outer normal, this should be dependent on local coordinates for higher order boundary ...
Definition: yaspgridintersection.hh:180
void update()
Definition: yaspgridintersection.hh:39
Definition: yaspgridentity.hh:402
unsigned char uint8_t
Definition: yaspgrid.hh:15