3#ifndef DUNE_POLYHEDRALGRID_GEOMETRY_HH
4#define DUNE_POLYHEDRALGRID_GEOMETRY_HH
8#include <dune/common/fmatrix.hh>
9#include <dune/grid/common/geometry.hh>
11#include <dune/geometry/referenceelements.hh>
12#include <dune/geometry/type.hh>
13#include <dune/geometry/multilineargeometry.hh>
22 template<
int,
int,
class >
class PolyhedralGridGeometry;
23 template<
int,
int,
class >
class PolyhedralGridLocalGeometry;
28 template<
int mydim,
int cdim,
class Gr
id >
31 static const int dimension = Grid::dimension;
32 static const int mydimension = mydim;
33 static const int codimension = dimension - mydimension;
35 static const int dimensionworld = Grid::dimensionworld;
36 static const int coorddimension = dimensionworld;
38 typedef typename Grid::ctype ctype;
39 typedef Dune::FieldVector< ctype, coorddimension > GlobalCoordinate;
40 typedef Dune::FieldVector< ctype, mydimension > LocalCoordinate;
42 typedef typename Grid::Traits::ExtraData ExtraData;
43 typedef typename Grid::Traits::template Codim<codimension>::EntitySeed EntitySeed;
47 :
public Dune::MultiLinearGeometryTraits< ct >
52 :
public Dune::ForwardIteratorFacade< Iterator, GlobalCoordinate, GlobalCoordinate >
56 explicit Iterator(
const Storage* ptr,
int count ) : data_( ptr ), count_( count ) {}
58 GlobalCoordinate dereference()
const {
return data_->corner( count_ ); }
59 void increment() { ++count_; }
61 bool equals(
const Iterator& other )
const {
return count_ == other.count_; }
68 Storage( ExtraData data, EntitySeed seed )
69 : data_( data ), seed_( seed )
73 : data_( data ), seed_()
76 ExtraData data()
const {
return data_; }
77 bool isValid ()
const {
return seed_.isValid(); }
79 GlobalCoordinate operator [] (
const int i)
const {
return corner( i ); }
81 Iterator begin()
const {
return Iterator(
this, 0); }
82 Iterator end ()
const {
return Iterator(
this, corners()); }
84 int corners ()
const {
return data()->corners( seed_ ); }
85 GlobalCoordinate corner (
const int i )
const {
return data()->corner( seed_, i ); }
86 GlobalCoordinate center ()
const {
return data()->centroids( seed_ ); }
88 ctype volume()
const {
return data()->volumes( seed_ ); }
90 const EntitySeed& seed ()
const {
return seed_; }
93 template <
int mdim,
int cordim>
100 typedef Dune::MultiLinearGeometry< ctype, mydimension, coorddimension, PolyhedralMultiLinearGeometryTraits<ctype> >
101 MultiLinearGeometryType;
104 CornerStorage<mydimension, coorddimension >::Type CornerStorageType;
116 using Jacobian = FieldMatrix< ctype, cdim, mydim >;
118 typedef Dune::Impl::FieldMatrixHelper< ctype > MatrixHelperType;
125 : storage_( data, seed )
127 GeometryType myType = type();
128 if( ! myType.isNone() && storage_.isValid() )
130 geometryImpl_.reset(
new MultiLinearGeometryType(myType, storage_) );
135 GeometryType type ()
const {
return data()->geometryType( storage_.seed() ); }
136 bool affine ()
const {
return (geometryImpl_) ? geometryImpl_->affine() :
false; }
138 int corners ()
const {
return storage_.corners(); }
139 GlobalCoordinate corner (
const int i )
const {
return storage_.corner( i ); }
140 GlobalCoordinate center ()
const
142 if( type().isNone() )
144 return storage_.center();
148 const auto refElem = Dune::referenceElement< ctype, mydim > ( type() );
149 return global( refElem.position(0,0) );
153 GlobalCoordinate global(
const LocalCoordinate&
local)
const
157 return geometryImpl_->global(
local );
165 LocalCoordinate
local(
const GlobalCoordinate& global)
const
169 return geometryImpl_->local( global );
173 return LocalCoordinate( 1 );
176 ctype integrationElement (
const LocalCoordinate &
local )
const
180 return geometryImpl_->integrationElement(
local );
185 ctype volume ()
const
189 return geometryImpl_->volume();
191 return storage_.volume();
198 return geometryImpl_->jacobianTransposed(
local );
201 DUNE_THROW(NotImplemented,
"jacobianTransposed not implemented");
209 return geometryImpl_->jacobianInverseTransposed(
local );
212 DUNE_THROW(NotImplemented,
"jacobianInverseTransposed not implemented");
221 return jacobianTransposed(
local).transposed();
228 return jacobianInverseTransposed(
local).transposed();
231 ExtraData data()
const {
return storage_.data(); }
234 CornerStorageType storage_;
235 std::shared_ptr< MultiLinearGeometryType > geometryImpl_;
242 template<
int mydim,
int cdim,
class Gr
id >
249 typedef typename Base::ExtraData ExtraData;
250 typedef typename Base::EntitySeed EntitySeed;
261 template<
int mydim,
int cdim,
class Gr
id >
268 typedef typename Base::ExtraData ExtraData;
Definition: geometry.hh:245
Definition: geometry.hh:264
Copyright 2019 Equinor AS.
Definition: CartesianIndexMapper.hpp:10
Definition: geometry.hh:95
Definition: geometry.hh:53
Definition: geometry.hh:50
Definition: geometry.hh:48
Definition: geometry.hh:30
FieldMatrix< ctype, mydim, cdim > JacobianInverse
type of jacobian inverse transposed
Definition: geometry.hh:113
Jacobian jacobian(const LocalCoordinate &local) const
The jacobian.
Definition: geometry.hh:219
FieldMatrix< ctype, cdim, mydim > JacobianInverseTransposed
type of jacobian inverse transposed
Definition: geometry.hh:107
FieldMatrix< ctype, cdim, mydim > Jacobian
type of jacobian transposed
Definition: geometry.hh:116
FieldMatrix< ctype, mydim, cdim > JacobianTransposed
type of jacobian transposed
Definition: geometry.hh:110
JacobianInverse jacobianInverse(const LocalCoordinate &local) const
The inverse of the jacobian.
Definition: geometry.hh:226
LocalCoordinate local(const GlobalCoordinate &global) const
Mapping from the cell to the reference domain.
Definition: geometry.hh:165