3#ifndef DUNE_GRID_YASPGRIDINTERSECTION_HH
4#define DUNE_GRID_YASPGRIDINTERSECTION_HH
18 template<
class Gr
idImp>
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<1>::Geometry
Geometry;
36 typedef typename GridImp::template Codim<1>::LocalGeometry
LocalGeometry;
41 std::array<int,dim> dist{{0}};
44 dist[_dir] = 1 - 2*_face;
51 dist[_dir] += -1 + 2*_face;
64 if (_inside.
gridlevel()->mg->isPeriodic(_dir))
77 return coord > _inside.
gridlevel()->overlap[0].dataBegin()->min(_dir)
79 coord <= _inside.
gridlevel()->overlap[0].dataBegin()->max(_dir);
101#if DUNE_GRID_EXPERIMENTAL_GRID_EXTENSIONS
104 int boundaryId()
const
116 DUNE_THROW(
GridError,
"called boundarySegmentIndex while boundary() == false");
118 const std::array<int, dim> & size = _inside.
gridlevel()->mg->begin()->overlap[0].dataBegin()->size();
119 const std::array<int, dim> & origin = _inside.
gridlevel()->mg->begin()->overlap[0].dataBegin()->origin();
120 std::array<int, dim> sides;
122 for (
int i=0; i<dim; i++)
125 ((_inside.
gridlevel()->mg->begin()->overlap[0].dataBegin()->origin(i)
127 (_inside.
gridlevel()->mg->begin()->overlap[0].dataBegin()->origin(i) +
128 _inside.
gridlevel()->mg->begin()->overlap[0].dataBegin()->size(i)
130 _inside.
gridlevel()->mg->levelSize(0,i)));
136 for(
int i=0; i<dim; i++)
138 pos[i] = pos[i] / (1<<_inside.
level());
139 pos[i] = pos[i] - origin[i];
142 std::array<int, dim> fsize;
145 for (
int k=0; k<dim; k++)
147 for (
int k=0; k<dim; k++)
148 fsize[k] = vol/size[k];
154 for (
int k=dim-1; k>=0; k--)
156 if (k == _dir)
continue;
157 index += (pos[k]) * localoffset;
158 localoffset *= size[k];
163 for (
int k=0; k<_dir; k++)
164 index += sides[k] * fsize[k];
166 index += _face * (sides[_dir]>1) * fsize[_dir];
173 FieldVector<ctype, dimworld>
outerNormal (
const FieldVector<ctype, dim-1>& local)
const
175 return _faceInfo[_count].normal;
179 FieldVector<ctype, dimworld>
unitOuterNormal (
const FieldVector<ctype, dim-1>& local)
const
181 return _faceInfo[_count].normal;
187 return _faceInfo[_count].normal;
195 FieldVector<ctype, dimworld> n = _faceInfo[_count].normal;
221 std::bitset<dim> shift;
225 Dune::FieldVector<ctype,dimworld> ll, ur;
226 for (
int i=0; i<dimworld; i++)
230 if ((i == _dir) and (_face))
239 if (_inside.
gridlevel()->mg->isPeriodic(i)) {
241 if (coordPeriodic < 0) {
242 auto size = _inside.
gridlevel()->mg->domainSize()[i];
245 }
else if (coordPeriodic + 1 > _inside.
gridlevel()->mg->levelSize(_inside.
gridlevel()->level(),i)) {
246 auto size = _inside.
gridlevel()->mg->domainSize()[i];
253 GeometryImpl _is_global(ll,ur,shift);
260 return GeometryType(GeometryType::cube, dim-1);
284 _inside(myself.gridlevel(),
285 myself.transformingsubiterator()),
286 _outside(myself.gridlevel(),
287 myself.transformingsubiterator()),
316 return _count == other._count && _inside.
equals(other._inside);
331 FieldVector<ctype, dimworld> normal;
332 LocalGeometryImpl geom_inside;
333 LocalGeometryImpl geom_outside;
337 static const std::array<faceInfo, 2*GridImp::dimension> _faceInfo;
339 static std::array<faceInfo, 2*dim> initFaceInfo()
341 std::array<faceInfo, 2*dim>
I;
346 I[2*i+1].normal = 0.0;
347 I[2*i].normal[i] = -1.0;
348 I[2*i+1].normal[i] = +1.0;
356 Dune::FieldVector<ctype, dim> ll(0.0);
357 Dune::FieldVector<ctype, dim> ur(1.0);
360 I[2*i].geom_inside = LocalGeometryImpl(ll,ur,s);
361 I[2*i+1].geom_outside = LocalGeometryImpl(ll,ur,s);
366 I[2*i].geom_outside = LocalGeometryImpl(ll,ur,s);
367 I[2*i+1].geom_inside = LocalGeometryImpl(ll,ur,s);
374 template<
class Gr
idImp>
375 const std::array<typename YaspIntersection<GridImp>::faceInfo, 2*GridImp::dimension>
376 YaspIntersection<GridImp>::_faceInfo =
377 YaspIntersection<GridImp>::initFaceInfo();
unsigned char uint8_t
Definition yaspgrid.hh:15
Include standard header files.
Definition agrid.hh:60
Base class for exceptions in Dune grid modules.
Definition exceptions.hh:18
Definition yaspgridentity.hh:239
int level() const
level of this element
Definition yaspgridentity.hh:253
const YGLI & gridlevel() const
Definition yaspgridentity.hh:389
const I & transformingsubiterator() const
Definition yaspgridentity.hh:388
bool equals(const YaspEntity &e) const
Return true when two iterators over the same grid are equal (!).
Definition yaspgridentity.hh:308
YaspIntersectionIterator enables iteration over intersections with neighboring codim 0 entities.
Definition yaspgridintersectioniterator.hh:20
YaspIntersection provides data about intersection with neighboring codim 0 entities.
Definition yaspgridintersection.hh:20
FieldVector< ctype, dimworld > centerUnitOuterNormal() const
return unit outer normal at center of intersection geometry
Definition yaspgridintersection.hh:185
bool equals(const YaspIntersection &other) const
Definition yaspgridintersection.hh:313
Entity inside() const
Definition yaspgridintersection.hh:90
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:179
Geometry geometry() const
Definition yaspgridintersection.hh:218
GridImp::template Codim< 1 >::LocalGeometry LocalGeometry
Definition yaspgridintersection.hh:36
YaspIntersection()
Definition yaspgridintersection.hh:276
int indexInOutside() const
local index of codim 1 entity in neighbor where intersection is contained in
Definition yaspgridintersection.hh:270
LocalGeometry geometryInInside() const
Definition yaspgridintersection.hh:203
int boundarySegmentIndex() const
Definition yaspgridintersection.hh:113
GridImp::template Codim< 1 >::Geometry Geometry
Definition yaspgridintersection.hh:35
bool conforming() const
Yasp is always conform.
Definition yaspgridintersection.hh:83
GridImp::template Codim< 0 >::Entity Entity
Definition yaspgridintersection.hh:34
bool neighbor() const
return true if neighbor across intersection exists in this processor
Definition yaspgridintersection.hh:73
YaspIntersection(const YaspEntity< 0, dim, GridImp > &myself, bool toend)
make intersection iterator from entity, initialize to first neighbor
Definition yaspgridintersection.hh:283
GeometryType type() const
obtain the type of reference element for this intersection
Definition yaspgridintersection.hh:258
void assign(const YaspIntersection &it)
copy constructor – use default
Definition yaspgridintersection.hh:308
int indexInInside() const
local index of codim 1 entity in self where intersection is contained in
Definition yaspgridintersection.hh:264
FieldVector< ctype, dimworld > integrationOuterNormal(const FieldVector< ctype, dim-1 > &local) const
Definition yaspgridintersection.hh:193
GridImp::YGrid::Iterator I
Definition yaspgridintersection.hh:33
LocalGeometry geometryInOutside() const
Definition yaspgridintersection.hh:211
GridImp::YGridLevelIterator YGLI
Definition yaspgridintersection.hh:32
Entity outside() const
return Entity on the outside of this intersection
Definition yaspgridintersection.hh:96
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:173
bool boundary() const
Definition yaspgridintersection.hh:60
void update()
Definition yaspgridintersection.hh:38