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 =
323 MatrixHelper::template xTRightInvA< mydimension, coorddimension >(
jacobianTransposed( x ), dglobal, dx );
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::template rightInvA< mydimension, coorddimension >( jt,
static_cast< Base &
>( *
this ) );
499 detInv_ = MatrixHelper::template sqrtDetAAT< mydimension, coorddimension >( 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_ )
612 MatrixHelper::template xTRightInvA< mydimension, coorddimension >( jacobianTransposed_,
global -
corner( 0 ),
local );
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 >
A unique label for each type of element that can occur in a grid.
An implementation of the Geometry interface for affine geometries.
Definition affinegeometry.hh:21
Class providing access to the singletons of the reference elements.
Definition referenceelements.hh:170
typename Container::ReferenceElement ReferenceElement
The reference element type.
Definition referenceelements.hh:188
default traits class for MultiLinearGeometry
Definition multilineargeometry.hh:39
Impl::FieldMatrixHelper< ct > MatrixHelper
helper structure containing some matrix routines
Definition multilineargeometry.hh:58
static ct tolerance()
tolerance to numerical algorithms
Definition multilineargeometry.hh:61
template specifying the storage for the corners
Definition multilineargeometry.hh:129
std::vector< FieldVector< ct, cdim > > Type
Definition multilineargeometry.hh:130
will there be only one geometry type for a dimension?
Definition multilineargeometry.hh:148
static const unsigned int topologyId
Definition multilineargeometry.hh:150
static const bool v
Definition multilineargeometry.hh:149
generic geometry implementation based on corner coordinates
Definition multilineargeometry.hh:181
static void global(TopologyId topologyId, std::integral_constant< int, dim >, CornerIterator &cit, const ctype &df, const LocalCoordinate &x, const ctype &rf, GlobalCoordinate &y)
Definition multilineargeometry.hh:749
static const int mydimension
geometry dimension
Definition multilineargeometry.hh:189
Dune::GeometryType type() const
obtain the name of the reference element
Definition multilineargeometry.hh:269
Traits::MatrixHelper MatrixHelper
Definition multilineargeometry.hh:225
FieldVector< ctype, coorddimension > GlobalCoordinate
type of global coordinates
Definition multilineargeometry.hh:196
static void jacobianTransposed(TopologyId topologyId, std::integral_constant< int, 0 >, CornerIterator &cit, const ctype &df, const LocalCoordinate &x, const ctype &rf, FieldMatrix< ctype, rows, cdim > &jt)
Definition multilineargeometry.hh:896
JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const
obtain the transposed of the Jacobian
Definition multilineargeometry.hh:377
ReferenceElement refElement() const
Definition multilineargeometry.hh:425
GlobalCoordinate global(const LocalCoordinate &local) const
evaluate the mapping
Definition multilineargeometry.hh:290
GlobalCoordinate center() const
obtain the centroid of the mapping's image
Definition multilineargeometry.hh:282
GlobalCoordinate corner(int i) const
obtain coordinates of the i-th corner
Definition multilineargeometry.hh:275
Dune::ReferenceElements< ctype, mydimension > ReferenceElements
Definition multilineargeometry.hh:214
ct ctype
coordinate type
Definition multilineargeometry.hh:186
static void jacobianTransposed(TopologyId topologyId, std::integral_constant< int, dim >, CornerIterator &cit, const ctype &df, const LocalCoordinate &x, const ctype &rf, FieldMatrix< ctype, rows, cdim > &jt)
Definition multilineargeometry.hh:794
static const int coorddimension
coordinate dimension
Definition multilineargeometry.hh:191
int corners() const
obtain number of corners of the corresponding reference element
Definition multilineargeometry.hh:272
TopologyId topologyId() const
Definition multilineargeometry.hh:430
friend ReferenceElement referenceElement(const MultiLinearGeometry &geometry)
Definition multilineargeometry.hh:395
LocalCoordinate local(const GlobalCoordinate &globalCoord) const
evaluate the inverse mapping
Definition multilineargeometry.hh:312
static void global(TopologyId topologyId, std::integral_constant< int, 0 >, CornerIterator &cit, const ctype &df, const LocalCoordinate &x, const ctype &rf, GlobalCoordinate &y)
Definition multilineargeometry.hh:780
Volume volume() const
obtain the volume of the mapping's image
Definition multilineargeometry.hh:363
FieldVector< ctype, mydimension > LocalCoordinate
type of local coordinates
Definition multilineargeometry.hh:194
MultiLinearGeometry(const ReferenceElement &refElement, const Corners &corners)
constructor
Definition multilineargeometry.hh:239
static bool affine(TopologyId topologyId, std::integral_constant< int, 0 >, CornerIterator &cit, JacobianTransposed &jt)
Definition multilineargeometry.hh:937
std::conditional< hasSingleGeometryType, std::integral_constant< unsignedint, Traits::templatehasSingleGeometryType< mydimension >::topologyId >, unsignedint >::type TopologyId
Definition multilineargeometry.hh:226
ctype Volume
type of volume
Definition multilineargeometry.hh:198
static bool affine(TopologyId topologyId, std::integral_constant< int, dim >, CornerIterator &cit, JacobianTransposed &jt)
Definition multilineargeometry.hh:908
JacobianInverse jacobianInverse(const LocalCoordinate &local) const
Obtain the Jacobian's inverse.
Definition multilineargeometry.hh:418
MultiLinearGeometry(Dune::GeometryType gt, const Corners &corners)
constructor
Definition multilineargeometry.hh:255
FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed
type of jacobian transposed
Definition multilineargeometry.hh:201
ReferenceElements::ReferenceElement ReferenceElement
type of reference element
Definition multilineargeometry.hh:219
JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate &local) const
obtain the transposed of the Jacobian's inverse
Definition multilineargeometry.hh:738
FieldMatrix< ctype, coorddimension, mydimension > Jacobian
Type for the Jacobian matrix.
Definition multilineargeometry.hh:207
bool affine() const
is this mapping affine?
Definition multilineargeometry.hh:262
FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse
Type for the inverse Jacobian matrix.
Definition multilineargeometry.hh:210
bool affine(JacobianTransposed &jacobianT) const
Definition multilineargeometry.hh:458
Volume integrationElement(const LocalCoordinate &local) const
obtain the integration element
Definition multilineargeometry.hh:350
Jacobian jacobian(const LocalCoordinate &local) const
Obtain the Jacobian.
Definition multilineargeometry.hh:407
Definition multilineargeometry.hh:488
void setup(const JacobianTransposed &jt)
Definition multilineargeometry.hh:492
ctype det() const
Definition multilineargeometry.hh:502
ctype detInv() const
Definition multilineargeometry.hh:503
void setupDeterminant(const JacobianTransposed &jt)
Definition multilineargeometry.hh:497
Implement a MultiLinearGeometry with additional caching.
Definition multilineargeometry.hh:526
GlobalCoordinate global(const LocalCoordinate &local) const
evaluate the mapping
Definition multilineargeometry.hh:580
Base::ReferenceElement ReferenceElement
Definition multilineargeometry.hh:534
bool affine() const
is this mapping affine?
Definition multilineargeometry.hh:567
CachedMultiLinearGeometry(const ReferenceElement &referenceElement, const CornerStorage &cornerStorage)
Definition multilineargeometry.hh:551
ReferenceElement refElement() const
Definition multilineargeometry.hh:425
LocalCoordinate local(const GlobalCoordinate &global) const
evaluate the inverse mapping
Definition multilineargeometry.hh:604
Base::MatrixHelper MatrixHelper
Definition multilineargeometry.hh:531
Base::LocalCoordinate LocalCoordinate
Definition multilineargeometry.hh:541
JacobianInverse jacobianInverse(const LocalCoordinate &local) const
Obtain the Jacobian's inverse.
Definition multilineargeometry.hh:713
JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const
obtain the transposed of the Jacobian
Definition multilineargeometry.hh:666
GlobalCoordinate corner(int i) const
obtain coordinates of the i-th corner
Definition multilineargeometry.hh:275
Volume volume() const
obtain the volume of the mapping's image
Definition multilineargeometry.hh:649
CachedMultiLinearGeometry(Dune::GeometryType gt, const CornerStorage &cornerStorage)
Definition multilineargeometry.hh:559
ctype integrationElement(const LocalCoordinate &local) const
obtain the integration element
Definition multilineargeometry.hh:633
Base::ctype ctype
Definition multilineargeometry.hh:536
Jacobian jacobian(const LocalCoordinate &local) const
Obtain the Jacobian.
Definition multilineargeometry.hh:702
Base::JacobianInverseTransposed JacobianInverseTransposed
Definition multilineargeometry.hh:546
Base::JacobianTransposed JacobianTransposed
Definition multilineargeometry.hh:545
Base::JacobianInverse JacobianInverse
Definition multilineargeometry.hh:548
Base::Jacobian Jacobian
Definition multilineargeometry.hh:547
Base::Volume Volume
Definition multilineargeometry.hh:543
Base::GlobalCoordinate GlobalCoordinate
Definition multilineargeometry.hh:542
GlobalCoordinate center() const
obtain the centroid of the mapping's image
Definition multilineargeometry.hh:572
JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate &local) const
obtain the transposed of the Jacobian's inverse
Definition multilineargeometry.hh:680
Unique label for each type of entities that can occur in DUNE grids.
Definition type.hh:126