3 #ifndef DUNE_GEOMETRY_GENERICGEOMETRY_CORNERMAPPING_HH
4 #define DUNE_GEOMETRY_GENERICGEOMETRY_CORNERMAPPING_HH
9 #include <dune/common/unused.hh>
14 namespace GenericGeometry
20 template<
class CT,
unsigned int dim,
unsigned int dimW >
28 template<
class Topology,
class Traits,
bool affine,
unsigned int offset = 0 >
31 template<
class Traits,
bool affine,
unsigned int offset >
37 static const unsigned int dim = Topology::dimension;
38 static const unsigned int dimW = Traits::dimWorld;
45 static const bool alwaysAffine =
true;
47 template<
class CoordStorage >
51 return coords[ offset ];
54 template<
class CoordStorage >
60 DUNE_UNUSED_PARAMETER(x);
62 for(
unsigned int i = 0; i < dimW; ++i )
63 p[ i ] = factor * y[ i ];
66 template<
class CoordStorage >
73 for(
unsigned int i = 0; i < dimW; ++i )
74 p[ i ] += factor * y[ i ];
77 template<
class CoordStorage >
83 DUNE_UNUSED_PARAMETER(coords);
84 DUNE_UNUSED_PARAMETER(x);
85 DUNE_UNUSED_PARAMETER(factor);
86 DUNE_UNUSED_PARAMETER(J);
90 template<
class CoordStorage >
96 DUNE_UNUSED_PARAMETER(coords);
97 DUNE_UNUSED_PARAMETER(x);
98 DUNE_UNUSED_PARAMETER(factor);
99 DUNE_UNUSED_PARAMETER(J);
105 template<
class BaseTopology,
class Traits,
bool affine,
unsigned int offset >
113 <
BaseTopology, Traits, affine, offset + BaseTopology::numCorners >
117 static const unsigned int dim = Topology::dimension;
118 static const unsigned int dimW = Traits::dimWorld;
125 static const bool alwaysAffine = ((dim < 2) || affine);
127 template<
class CoordStorage >
130 return BottomMapping::origin( coords );
133 template<
class CoordStorage >
141 BottomMapping::phi_set( coords, x, factor * cxn, p );
142 TopMapping::phi_add( coords, x, factor * xn, p );
145 template<
class CoordStorage >
153 BottomMapping::phi_add( coords, x, factor * cxn, p );
154 TopMapping::phi_add( coords, x, factor * xn, p );
157 template<
class CoordStorage >
164 bool isAffine =
true;
168 BottomMapping::Dphi_set( coords, x, factor * cxn, J );
169 TopMapping::Dphi_add( coords, x, factor * xn, J );
174 isAffine &= BottomMapping::Dphi_set( coords, x, factor, J );
175 isAffine &= TopMapping::Dphi_set( coords, x, factor, Jtop );
178 for(
unsigned int i = 0; i < dim-1; ++i )
181 norm += Jtop[ i ].two_norm2();
182 J[ i ].axpy( xn, Jtop[ i ] );
184 isAffine &= (norm < 1e-12);
186 BottomMapping::phi_set( coords, x, -factor, J[ dim-1 ] );
187 TopMapping::phi_add( coords, x, factor, J[ dim-1 ] );
191 template<
class CoordStorage >
198 bool isAffine =
true;
202 BottomMapping::Dphi_add( coords, x, factor * cxn, J );
203 TopMapping::Dphi_add( coords, x, factor * xn, J );
208 isAffine &= BottomMapping::Dphi_set( coords, x,
FieldType( 1 ), Jbottom );
209 isAffine &= TopMapping::Dphi_set( coords, x,
FieldType( 1 ), Jtop );
212 for(
unsigned int i = 0; i < dim-1; ++i )
214 Jtop[ i ] -= Jbottom[ i ];
215 norm += Jtop[ i ].two_norm2();
216 J[ i ].axpy( factor, Jbottom[ i ] );
217 J[ i ].axpy( factor*xn, Jtop[ i ] );
219 isAffine &= (norm < 1e-12);
221 BottomMapping::phi_add( coords, x, -factor, J[ dim-1 ] );
222 TopMapping::phi_add( coords, x, factor, J[ dim-1 ] );
228 template<
class BaseTopology,
class Traits,
bool affine,
unsigned int offset >
236 <
Point, Traits, affine, offset + BaseTopology::numCorners >
240 static const unsigned int dim = Topology::dimension;
241 static const unsigned int dimW = Traits::dimWorld;
248 static const bool alwaysAffine = (BottomMapping::alwaysAffine || affine);
250 template<
class CoordStorage >
253 return BottomMapping::origin( coords );
256 template<
class CoordStorage >
268 BottomMapping::phi_set( coords, x, factor, p );
269 for(
unsigned int i = 0; i < dimW; ++i )
270 p[ i ] += (factor * xn) * (top[ i ] - bottom[ i ]);
274 TopMapping::phi_set( coords, x, factor * xn, p );
280 for(
unsigned int i = 0; i < dim-1; ++i )
281 xb[ i ] = icxn * x[ i ];
283 BottomMapping::phi_add( coords, xb, factor * cxn, p );
288 template<
class CoordStorage >
300 BottomMapping::phi_add( coords, x, factor, p );
301 for(
unsigned int i = 0; i < dimW; ++i )
302 p[ i ] += (factor * xn) * (top[ i ] - bottom[ i ]);
306 TopMapping::phi_add( coords, x, factor * xn, p );
312 for(
unsigned int i = 0; i < dim-1; ++i )
313 xb[ i ] = icxn * x[ i ];
315 BottomMapping::phi_add( coords, xb, factor * cxn, p );
320 template<
class CoordStorage >
333 isAffine = BottomMapping::Dphi_set( coords, x, factor, J );
334 for(
unsigned int i = 0; i < dimW; ++i )
335 q[ i ] = factor * (top[ i ] - bottom[ i ]);
343 for(
unsigned int i = 0; i < dim-1; ++i )
344 xb[ i ] = icxn * x[ i ];
345 isAffine = BottomMapping::Dphi_set( coords, xb, factor, J );
347 TopMapping::phi_set( coords, x, factor, q );
348 BottomMapping::phi_add( coords, xb, -factor, q );
350 for(
unsigned int j = 0; j < dim-1; ++j )
352 for(
unsigned int i = 0; i < dimW; ++i )
353 q[ i ] += J[ j ][ i ] * xb[ j ];
359 template<
class CoordStorage >
372 isAffine = BottomMapping::Dphi_add( coords, x, factor, J );
373 for(
unsigned int i = 0; i < dimW; ++i )
374 q[ i ] += factor * (top[ i ] - bottom[ i ]);
382 for(
unsigned int i = 0; i < dim-1; ++i )
383 xb[ i ] = icxn * x[ i ];
384 isAffine = BottomMapping::Dphi_add( coords, xb, factor, J );
386 TopMapping::phi_add( coords, x, factor, q );
387 BottomMapping::phi_add( coords, xb, -factor, q );
389 for(
unsigned int j = 0; j < dim-1; ++j )
391 for(
unsigned int i = 0; i < dimW; ++i )
392 q[ i ] += J[ j ][ i ] * xb[ j ];
404 template<
class Mapping,
unsigned int codim >
413 const unsigned int i_;
417 : mapping_( mapping ), i_( i )
423 = ReferenceElement::template subNumbering< codim, dimension - codim >( i_, j );
424 return mapping_.
corner( k );
437 template<
class CoordTraits,
class Topology,
unsigned int dimW >
443 static const unsigned int size = Topology::numCorners;
449 template<
class SubTopology >
455 template<
class CoordVector >
458 for(
unsigned int i = 0; i <
size; ++i )
459 coords_[ i ] = coords[ i ];
480 template<
class CoordTraits,
class Topology,
unsigned int dimW >
486 static const unsigned int size = Topology::numCorners;
492 template<
class SubTopology >
498 template<
class CoordVector >
501 for(
unsigned int i = 0; i <
size; ++i )
502 coords_[ i ] = &(coords[ i ]);
507 return *(coords_[ i ]);
524 template<
class CoordTraits,
class Topo,
unsigned int dimW,
525 class CStorage = CoordStorage< CoordTraits, Topo, dimW >,
526 bool affine =
false >
547 template<
unsigned int codim,
unsigned int i >
551 typedef typename CStorage::template SubStorage< Topology >::type
CornerStorage;
561 template<
class CoordVector >
582 template<
unsigned int codim,
unsigned int i >
587 return Trace( CoordVector( *
this, i ) );
598 #endif // #ifndef DUNE_GEOMETRY_GENERICGEOMETRY_CORNERMAPPING_HH
static const unsigned int dimWorld
Definition: geometrytraits.hh:57
Traits::FieldType FieldType
Definition: cornermapping.hh:120
SubTopologyImpl< Topology, Topology::dimension, codim, i >::type type
Definition: subtopologies.hh:269
CornerMapping(const CoordVector &coords)
Definition: cornermapping.hh:562
static const unsigned int dimension
Definition: genericgeometry/referenceelements.hh:31
static bool Dphi_add(const CoordStorage &coords, const LocalCoordinate &x, const FieldType &factor, JacobianTransposedType &J)
Definition: cornermapping.hh:91
bool jacobianTransposed(const LocalCoordinate &x, JacobianTransposedType &JT) const
Definition: cornermapping.hh:576
Definition: genericgeometry/referenceelements.hh:28
SubTopology< codim, i >::Trace trace() const
Definition: cornermapping.hh:583
Traits::LocalCoordinate LocalCoordinate
Definition: cornermapping.hh:540
CoordTraits::template Matrix< dimension, dimWorld >::type JacobianTransposedType
Definition: geometrytraits.hh:66
Definition: topologytypes.hh:57
Definition: cornermapping.hh:450
Traits::LocalCoordinate LocalCoordinate
Definition: cornermapping.hh:121
Definition: cornermapping.hh:493
Traits::FieldType FieldType
Definition: cornermapping.hh:40
Traits::LocalCoordinate LocalCoordinate
Definition: cornermapping.hh:244
static const unsigned int size
Definition: cornermapping.hh:486
static const unsigned int dimWorld
Definition: cornermapping.hh:537
CoordTraits::template Vector< dimWorld >::type GlobalCoordinate
Definition: cornermapping.hh:490
static const unsigned int dimension
Definition: geometrytraits.hh:56
static const unsigned int dimWorld
Definition: cornermapping.hh:445
CStorage CornerStorage
Definition: cornermapping.hh:533
static const GlobalCoordinate & origin(const CoordStorage &coords)
Definition: cornermapping.hh:48
static const GlobalCoordinate & origin(const CoordStorage &coords)
Definition: cornermapping.hh:128
CStorage::template SubStorage< Topology >::type CornerStorage
Definition: cornermapping.hh:551
static const GlobalCoordinate & origin(const CoordStorage &coords)
Definition: cornermapping.hh:251
Definition: cornermapping.hh:481
CornerMapping< CoordTraits, Topology, dimWorld, CornerStorage, affine > Trace
Definition: cornermapping.hh:552
static void phi_set(const CoordStorage &coords, const LocalCoordinate &x, const FieldType &factor, GlobalCoordinate &p)
Definition: cornermapping.hh:257
static const bool alwaysAffine
Definition: cornermapping.hh:559
static const unsigned int size
Definition: cornermapping.hh:443
static void phi_add(const CoordStorage &coords, const LocalCoordinate &x, const FieldType &factor, GlobalCoordinate &p)
Definition: cornermapping.hh:67
static bool Dphi_set(const CoordStorage &coords, const LocalCoordinate &x, const FieldType &factor, JacobianTransposedType &J)
Definition: cornermapping.hh:321
CoordTraits::template Vector< dimWorld >::type GlobalCoordinate
Definition: geometrytraits.hh:61
const GlobalCoordinate & operator[](unsigned int j) const
Definition: cornermapping.hh:420
static bool Dphi_add(const CoordStorage &coords, const LocalCoordinate &x, const FieldType &factor, JacobianTransposedType &J)
Definition: cornermapping.hh:360
static bool Dphi_set(const CoordStorage &coords, const LocalCoordinate &x, const FieldType &factor, JacobianTransposedType &J)
Definition: cornermapping.hh:78
const GlobalCoordinate & operator[](unsigned int i) const
Definition: cornermapping.hh:462
Traits::GlobalCoordinate GlobalCoordinate
Definition: cornermapping.hh:541
Traits::GlobalCoordinate GlobalCoordinate
Definition: cornermapping.hh:122
Definition: cornermapping.hh:405
static bool Dphi_set(const CoordStorage &coords, const LocalCoordinate &x, const FieldType &factor, JacobianTransposedType &J)
Definition: cornermapping.hh:158
Traits::FieldType FieldType
Definition: cornermapping.hh:539
CoordStorage(const CoordVector &coords)
Definition: cornermapping.hh:456
static void phi_set(const CoordStorage &coords, const LocalCoordinate &x, const FieldType &factor, GlobalCoordinate &p)
Definition: cornermapping.hh:55
Definition: topologytypes.hh:41
Traits::JacobianTransposedType JacobianTransposedType
Definition: cornermapping.hh:43
Traits::GlobalCoordinate GlobalCoordinate
Definition: mapping.hh:45
CoordStorage< CoordTraits, SubTopology, dimWorld > type
Definition: cornermapping.hh:452
Traits::FieldType FieldType
Definition: cornermapping.hh:243
interface for a mapping
Definition: mapping.hh:30
CoordTraits::template Vector< dimWorld >::type GlobalCoordinate
Definition: cornermapping.hh:447
static void phi_add(const CoordStorage &coords, const LocalCoordinate &x, const FieldType &factor, GlobalCoordinate &p)
Definition: cornermapping.hh:289
MappingTraits< CoordTraits, Topology::dimension, dimW > Traits
Definition: cornermapping.hh:534
Traits::JacobianTransposedType JacobianTransposedType
Definition: cornermapping.hh:543
static void phi_set(const CoordStorage &coords, const LocalCoordinate &x, const FieldType &factor, GlobalCoordinate &p)
Definition: cornermapping.hh:134
static void phi_add(const CoordStorage &coords, const LocalCoordinate &x, const FieldType &factor, GlobalCoordinate &p)
Definition: cornermapping.hh:146
Implements some reference element functionality needed by the generic geometries. ...
static bool Dphi_add(const CoordStorage &coords, const LocalCoordinate &x, const FieldType &factor, JacobianTransposedType &J)
Definition: cornermapping.hh:192
Default mapping traits using Dune::FieldVector and Dune::FieldMatrix.
Definition: cornermapping.hh:21
implementation of GenericGeometry::Mapping for first order lagrange type reference mappings...
Definition: cornermapping.hh:527
CoordTraits::template Vector< dimension >::type LocalCoordinate
Definition: geometrytraits.hh:60
const GlobalCoordinate & corner(int i) const
Definition: cornermapping.hh:566
SubMappingCoords(const Mapping &mapping, unsigned int i)
Definition: cornermapping.hh:416
void global(const LocalCoordinate &x, GlobalCoordinate &y) const
Definition: cornermapping.hh:571
Traits::JacobianType JacobianType
Definition: cornermapping.hh:542
const GlobalCoordinate & corner(int i) const
Definition: mapping.hh:76
GenericGeometry::ReferenceElement< Topology, FieldType > ReferenceElement
Definition: cornermapping.hh:545
CornerStorage coords_
Definition: cornermapping.hh:591
Traits::JacobianTransposedType JacobianTransposedType
Definition: cornermapping.hh:246
CoordPointerStorage(const CoordVector &coords)
Definition: cornermapping.hh:499
Definition: topologytypes.hh:74
Definition: topologytypes.hh:26
Topo Topology
Definition: cornermapping.hh:532
Traits::JacobianTransposedType JacobianTransposedType
Definition: cornermapping.hh:123
Traits::GlobalCoordinate GlobalCoordinate
Definition: cornermapping.hh:42
Traits::LocalCoordinate LocalCoordinate
Definition: cornermapping.hh:41
CoordTraits::ctype FieldType
Definition: geometrytraits.hh:59
static const unsigned int dimWorld
Definition: cornermapping.hh:488
Definition: cornermapping.hh:438
GenericGeometry::SubTopology< Topo, codim, i >::type Topology
Definition: cornermapping.hh:550
CoordPointerStorage< CoordTraits, SubTopology, dimWorld > type
Definition: cornermapping.hh:495
const GlobalCoordinate & operator[](unsigned int i) const
Definition: cornermapping.hh:505
Definition: cornermapping.hh:548
Traits::GlobalCoordinate GlobalCoordinate
Definition: cornermapping.hh:245
Definition: cornermapping.hh:29
CoordTraits::template Matrix< dimWorld, dimension >::type JacobianType
Definition: geometrytraits.hh:64
static const unsigned int dimension
Definition: cornermapping.hh:536