5 #ifndef DUNE_GEOMETRY_MULTILINEARGEOMETRY_HH 6 #define DUNE_GEOMETRY_MULTILINEARGEOMETRY_HH 14 #include <dune/common/fmatrix.hh> 15 #include <dune/common/fvector.hh> 16 #include <dune/common/typetraits.hh> 61 static ct
tolerance () {
return ct( 16 ) * std::numeric_limits< ct >::epsilon(); }
127 template<
int mydim,
int cdim >
130 typedef std::vector< FieldVector< ct, cdim > >
Type;
149 static const bool v =
false;
179 template<
class ct,
int mydim,
int cdim,
class Traits = MultiLinearGeometryTraits< ct > >
207 typedef FieldMatrix< ctype, coorddimension, mydimension >
Jacobian;
222 static const bool hasSingleGeometryType = Traits::template hasSingleGeometryType< mydimension >::v;
226 typedef typename std::conditional< hasSingleGeometryType, std::integral_constant< unsigned int, Traits::template hasSingleGeometryType< mydimension >::topologyId >,
unsigned int >
::type TopologyId;
238 template<
class Corners >
254 template<
class Corners >
277 assert( (i >= 0) && (i <
corners()) );
278 return std::cref(corners_).get()[ i ];
294 auto cit = begin(std::cref(corners_).
get());
314 const ctype tolerance = Traits::tolerance();
317 const bool affineMapping = this->
affine();
321 const GlobalCoordinate dglobal = (*this).global( x ) - globalCoord;
322 const bool invertible =
331 if ( affineMapping )
break;
332 }
while( dx.two_norm2() > tolerance );
382 auto cit = begin(std::cref(corners_).
get());
383 jacobianTransposed< false >(
topologyId(), std::integral_constant< int, mydimension >(), cit,
ctype( 1 ),
local,
ctype( 1 ), jt );
432 return topologyId( std::integral_constant< bool, hasSingleGeometryType >() );
435 template<
bool add,
int dim,
class CornerIterator >
439 template<
bool add,
class CornerIterator >
444 template<
bool add,
int rows,
int dim,
class CornerIterator >
447 const ctype &rf, FieldMatrix< ctype, rows, cdim > &jt );
448 template<
bool add,
int rows,
class CornerIterator >
451 const ctype &rf, FieldMatrix< ctype, rows, cdim > &jt );
453 template<
int dim,
class CornerIterator >
455 template<
class CornerIterator >
462 auto cit = begin(std::cref(corners_).
get());
463 return affine(
topologyId(), std::integral_constant< int, mydimension >(), cit, jacobianT );
470 static unsigned int toUnsignedInt(
unsigned int i) {
return i; }
471 template<
unsigned int v>
472 static unsigned int toUnsignedInt(std::integral_constant<unsigned int,v> ) {
return v; }
474 unsigned int topologyId ( std::integral_constant< bool, false > )
const {
return refElement().type().id(); }
477 typename Traits::template CornerStorage< mydimension, coorddimension >::Type corners_;
485 template<
class ct,
int mydim,
int cdim,
class Traits >
487 :
public FieldMatrix< ctype, coorddimension, mydimension >
489 typedef FieldMatrix< ctype, coorddimension, mydimension > Base;
494 detInv_ = MatrixHelper::rightInvA( jt, static_cast< Base & >( *
this ) );
499 detInv_ = MatrixHelper::sqrtDetAAT( jt );
523 template<
class ct,
int mydim,
int cdim,
class Traits = MultiLinearGeometryTraits< ct > >
550 template<
class CornerStorage >
553 affine_(
Base::
affine( jacobianTransposed_ ) ),
554 jacobianInverseTransposedComputed_( false ),
555 integrationElementComputed_( false )
558 template<
class CornerStorage >
560 :
Base( gt, cornerStorage ),
561 affine_(
Base::
affine( jacobianTransposed_ ) ),
562 jacobianInverseTransposedComputed_( false ),
563 integrationElementComputed_( false )
609 if( jacobianInverseTransposedComputed_ )
637 if( !integrationElementComputed_ )
640 integrationElementComputed_ =
true;
642 return jacobianInverseTransposed_.
detInv();
669 return jacobianTransposed_;
684 if( !jacobianInverseTransposedComputed_ )
686 jacobianInverseTransposed_.
setup( jacobianTransposed_ );
687 jacobianInverseTransposedComputed_ =
true;
688 integrationElementComputed_ =
true;
690 return jacobianInverseTransposed_;
725 mutable bool affine_ : 1;
727 mutable bool jacobianInverseTransposedComputed_ : 1;
728 mutable bool integrationElementComputed_ : 1;
736 template<
class ct,
int mydim,
int cdim,
class Traits >
737 inline typename MultiLinearGeometry< ct, mydim, cdim, Traits >::JacobianInverseTransposed
741 jit.
setup( jacobianTransposed( local ) );
746 template<
class ct,
int mydim,
int cdim,
class Traits >
747 template<
bool add,
int dim,
class CornerIterator >
753 const ctype xn = df*x[ dim-1 ];
756 if( Impl::isPrism( toUnsignedInt(topologyId), mydimension, mydimension-dim ) )
759 global< add >( topologyId, std::integral_constant< int, dim-1 >(), cit, df, x, rf*cxn, y );
761 global< true >( topologyId, std::integral_constant< int, dim-1 >(), cit, df, x, rf*xn, y );
765 assert( Impl::isPyramid( toUnsignedInt(topologyId), mydimension, mydimension-dim ) );
767 if( cxn > Traits::tolerance() || cxn < -Traits::tolerance() )
768 global< add >( topologyId, std::integral_constant< int, dim-1 >(), cit, df/cxn, x, rf*cxn, y );
770 global< add >( topologyId, std::integral_constant< int, dim-1 >(), cit, df, x,
ctype( 0 ), y );
772 y.axpy( rf*xn, *cit );
777 template<
class ct,
int mydim,
int cdim,
class Traits >
778 template<
bool add,
class CornerIterator >
786 for(
int i = 0; i < coorddimension; ++i )
787 y[ i ] = (add ? y[ i ] + rf*origin[ i ] : rf*origin[ i ]);
791 template<
class ct,
int mydim,
int cdim,
class Traits >
792 template<
bool add,
int rows,
int dim,
class CornerIterator >
796 const ctype &rf, FieldMatrix< ctype, rows, cdim > &jt )
798 assert( rows >= dim );
800 const ctype xn = df*x[ dim-1 ];
804 if( Impl::isPrism( toUnsignedInt(topologyId), mydimension, mydimension-dim ) )
807 jacobianTransposed< add >( topologyId, std::integral_constant< int, dim-1 >(), cit2, df, x, rf*cxn, jt );
809 jacobianTransposed< true >( topologyId, std::integral_constant< int, dim-1 >(), cit2, df, x, rf*xn, jt );
811 global< add >( topologyId, std::integral_constant< int, dim-1 >(), cit, df, x, -rf, jt[ dim-1 ] );
812 global< true >( topologyId, std::integral_constant< int, dim-1 >(), cit, df, x, rf, jt[ dim-1 ] );
816 assert( Impl::isPyramid( toUnsignedInt(topologyId), mydimension, mydimension-dim ) );
858 ctype dfcxn = (cxn > Traits::tolerance() || cxn < -Traits::tolerance()) ?
ctype(df / cxn) :
ctype(0);
863 global< add >( topologyId, std::integral_constant< int, dim-1 >(), cit, dfcxn, x, -rf, jt[ dim-1 ] );
865 jt[ dim-1 ].axpy( rf, *cit );
870 FieldMatrix<
ctype, dim-1, coorddimension > jt2;
872 jacobianTransposed< false >( topologyId, std::integral_constant< int, dim-1 >(), cit2, dfcxn, x, rf, jt2 );
876 for(
int j = 0; j < dim-1; ++j )
879 jt[ dim-1 ].axpy( dfcxn*x[ j ], jt2[ j ] );
885 jacobianTransposed< false >( topologyId, std::integral_constant< int, dim-1 >(), cit2, dfcxn, x, rf, jt );
887 for(
int j = 0; j < dim-1; ++j )
888 jt[ dim-1 ].axpy( dfcxn*x[ j ], jt[ j ] );
893 template<
class ct,
int mydim,
int cdim,
class Traits >
894 template<
bool add,
int rows,
class CornerIterator >
898 const ctype &, FieldMatrix< ctype, rows, cdim > & )
905 template<
class ct,
int mydim,
int cdim,
class Traits >
906 template<
int dim,
class CornerIterator >
911 if( !affine( topologyId, std::integral_constant< int, dim-1 >(), cit, jt ) )
915 if( Impl::isPrism( toUnsignedInt(topologyId), mydimension, mydimension-dim ) )
918 if( !affine( topologyId, std::integral_constant< int, dim-1 >(), cit, jtTop ) )
923 for(
int i = 0; i < dim-1; ++i )
924 norm += (jtTop[ i ] - jt[ i ]).two_norm2();
925 if( norm >= Traits::tolerance() )
930 jt[ dim-1 ] = orgTop - orgBottom;
934 template<
class ct,
int mydim,
int cdim,
class Traits >
935 template<
class CornerIterator >
945 #endif // #ifndef DUNE_GEOMETRY_MULTILINEARGEOMETRY_HH Base::Volume Volume
Definition: multilineargeometry.hh:543
JacobianInverse jacobianInverse(const LocalCoordinate &local) const
Obtain the Jacobian's inverse.
Definition: multilineargeometry.hh:418
Base::JacobianInverse JacobianInverse
Definition: multilineargeometry.hh:548
FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed
type of jacobian transposed
Definition: multilineargeometry.hh:201
Base::LocalCoordinate LocalCoordinate
Definition: multilineargeometry.hh:541
JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate &local) const
obtain the transposed of the Jacobian's inverse
Definition: multilineargeometry.hh:738
default traits class for MultiLinearGeometry
Definition: multilineargeometry.hh:38
Dune::GeometryType type() const
obtain the name of the reference element
Definition: multilineargeometry.hh:269
Impl::FieldMatrixHelper< ct > MatrixHelper
helper structure containing some matrix routines
Definition: multilineargeometry.hh:58
JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate &local) const
obtain the transposed of the Jacobian's inverse
Definition: multilineargeometry.hh:680
Base::ReferenceElement ReferenceElement
Definition: multilineargeometry.hh:534
CachedMultiLinearGeometry(const ReferenceElement &referenceElement, const CornerStorage &cornerStorage)
Definition: multilineargeometry.hh:551
Jacobian jacobian(const LocalCoordinate &local) const
Obtain the Jacobian.
Definition: multilineargeometry.hh:407
Base::JacobianInverseTransposed JacobianInverseTransposed
Definition: multilineargeometry.hh:546
A unique label for each type of element that can occur in a grid.
GlobalCoordinate center() const
obtain the centroid of the mapping's image
Definition: multilineargeometry.hh:282
Implement a MultiLinearGeometry with additional caching.
Definition: multilineargeometry.hh:524
will there be only one geometry type for a dimension?
Definition: multilineargeometry.hh:147
GlobalCoordinate corner(int i) const
obtain coordinates of the i-th corner
Definition: multilineargeometry.hh:275
ctype Volume
type of volume
Definition: multilineargeometry.hh:198
JacobianInverse jacobianInverse(const LocalCoordinate &local) const
Obtain the Jacobian's inverse.
Definition: multilineargeometry.hh:713
ReferenceElement refElement() const
Definition: multilineargeometry.hh:425
Base::MatrixHelper MatrixHelper
Definition: multilineargeometry.hh:531
TopologyId topologyId() const
Definition: multilineargeometry.hh:430
Volume volume() const
obtain the volume of the mapping's image
Definition: multilineargeometry.hh:363
void setup(const JacobianTransposed &jt)
Definition: multilineargeometry.hh:492
Base::Jacobian Jacobian
Definition: multilineargeometry.hh:547
static ct tolerance()
tolerance to numerical algorithms
Definition: multilineargeometry.hh:61
Jacobian jacobian(const LocalCoordinate &local) const
Obtain the Jacobian.
Definition: multilineargeometry.hh:702
Definition: multilineargeometry.hh:486
FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse
Type for the inverse Jacobian matrix.
Definition: multilineargeometry.hh:210
ctype detInv() const
Definition: multilineargeometry.hh:503
static const int coorddimension
coordinate dimension
Definition: multilineargeometry.hh:191
LocalCoordinate local(const GlobalCoordinate &globalCoord) const
evaluate the inverse mapping
Definition: multilineargeometry.hh:312
Volume volume() const
obtain the volume of the mapping's image
Definition: multilineargeometry.hh:649
int corners() const
obtain number of corners of the corresponding reference element
Definition: multilineargeometry.hh:272
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:113
FieldMatrix< ctype, coorddimension, mydimension > Jacobian
Type for the Jacobian matrix.
Definition: multilineargeometry.hh:204
Base::JacobianTransposed JacobianTransposed
Definition: multilineargeometry.hh:545
bool affine(JacobianTransposed &jacobianT) const
Definition: multilineargeometry.hh:458
static const bool v
Definition: multilineargeometry.hh:149
LocalCoordinate local(const GlobalCoordinate &global) const
evaluate the inverse mapping
Definition: multilineargeometry.hh:604
bool affine() const
is this mapping affine?
Definition: multilineargeometry.hh:262
ctype det() const
Definition: multilineargeometry.hh:502
Class providing access to the singletons of the reference elements.
Definition: affinegeometry.hh:37
friend ReferenceElement referenceElement(const MultiLinearGeometry &geometry)
Definition: multilineargeometry.hh:395
typename Container::ReferenceElement ReferenceElement
The reference element type.
Definition: referenceelements.hh:146
JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const
obtain the transposed of the Jacobian
Definition: multilineargeometry.hh:666
MultiLinearGeometry(const ReferenceElement &refElement, const Corners &corners)
constructor
Definition: multilineargeometry.hh:239
FieldVector< ctype, mydimension > LocalCoordinate
type of local coordinates
Definition: multilineargeometry.hh:194
CachedMultiLinearGeometry(Dune::GeometryType gt, const CornerStorage &cornerStorage)
Definition: multilineargeometry.hh:559
void setupDeterminant(const JacobianTransposed &jt)
Definition: multilineargeometry.hh:497
ct ctype
coordinate type
Definition: multilineargeometry.hh:186
std::conditional< hasSingleGeometryType, std::integral_constant< unsigned int, Traits::template hasSingleGeometryType< mydimension >::topologyId >, unsigned int >::type TopologyId
Definition: multilineargeometry.hh:226
GlobalCoordinate global(const LocalCoordinate &local) const
evaluate the mapping
Definition: multilineargeometry.hh:290
std::vector< FieldVector< ct, cdim > > Type
Definition: multilineargeometry.hh:130
MultiLinearGeometry(Dune::GeometryType gt, const Corners &corners)
constructor
Definition: multilineargeometry.hh:255
FieldVector< ctype, coorddimension > GlobalCoordinate
type of global coordinates
Definition: multilineargeometry.hh:196
ctype integrationElement(const LocalCoordinate &local) const
obtain the integration element
Definition: multilineargeometry.hh:633
GlobalCoordinate center() const
obtain the centroid of the mapping's image
Definition: multilineargeometry.hh:572
Volume integrationElement(const LocalCoordinate &local) const
obtain the integration element
Definition: multilineargeometry.hh:350
ReferenceElements::ReferenceElement ReferenceElement
type of reference element
Definition: multilineargeometry.hh:219
template specifying the storage for the corners
Definition: multilineargeometry.hh:128
Traits::MatrixHelper MatrixHelper
Definition: multilineargeometry.hh:225
Base::ctype ctype
Definition: multilineargeometry.hh:536
Definition: affinegeometry.hh:21
static const unsigned int topologyId
Definition: multilineargeometry.hh:150
generic geometry implementation based on corner coordinates
Definition: multilineargeometry.hh:180
GlobalCoordinate global(const LocalCoordinate &local) const
evaluate the mapping
Definition: multilineargeometry.hh:580
static const int mydimension
geometry dimension
Definition: multilineargeometry.hh:189
bool affine() const
is this mapping affine?
Definition: multilineargeometry.hh:567
JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const
obtain the transposed of the Jacobian
Definition: multilineargeometry.hh:377
Dune::ReferenceElements< ctype, mydimension > ReferenceElements
Definition: multilineargeometry.hh:214
Base::GlobalCoordinate GlobalCoordinate
Definition: multilineargeometry.hh:542