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_;