1 #ifndef DUNE_GEOMETRY_GENERICGEOMETRY_CORNERMAPPING_HH
2 #define DUNE_GEOMETRY_GENERICGEOMETRY_CORNERMAPPING_HH
11 namespace GenericGeometry
17 template<
class CT,
unsigned int dim,
unsigned int dimW >
25 template<
class Topology,
class Traits,
bool affine,
unsigned int offset = 0 >
28 template<
class Traits,
bool affine,
unsigned int offset >
34 static const unsigned int dim = Topology::dimension;
35 static const unsigned int dimW = Traits::dimWorld;
42 static const bool alwaysAffine =
true;
44 template<
class CoordStorage >
48 return coords[ offset ];
51 template<
class CoordStorage >
58 for(
unsigned int i = 0; i < dimW; ++i )
59 p[ i ] = factor * y[ i ];
62 template<
class CoordStorage >
69 for(
unsigned int i = 0; i < dimW; ++i )
70 p[ i ] += factor * y[ i ];
73 template<
class CoordStorage >
82 template<
class CoordStorage >
93 template<
class BaseTopology,
class Traits,
bool affine,
unsigned int offset >
101 <
BaseTopology, Traits, affine, offset + BaseTopology::numCorners >
105 static const unsigned int dim = Topology::dimension;
106 static const unsigned int dimW = Traits::dimWorld;
113 static const bool alwaysAffine = ((dim < 2) || affine);
115 template<
class CoordStorage >
118 return BottomMapping::origin( coords );
121 template<
class CoordStorage >
129 BottomMapping::phi_set( coords, x, factor * cxn, p );
130 TopMapping::phi_add( coords, x, factor * xn, p );
133 template<
class CoordStorage >
141 BottomMapping::phi_add( coords, x, factor * cxn, p );
142 TopMapping::phi_add( coords, x, factor * xn, p );
145 template<
class CoordStorage >
152 bool isAffine =
true;
156 BottomMapping::Dphi_set( coords, x, factor * cxn, J );
157 TopMapping::Dphi_add( coords, x, factor * xn, J );
162 isAffine &= BottomMapping::Dphi_set( coords, x, factor, J );
163 isAffine &= TopMapping::Dphi_set( coords, x, factor, Jtop );
166 for(
unsigned int i = 0; i < dim-1; ++i )
169 norm += Jtop[ i ].two_norm2();
170 J[ i ].axpy( xn, Jtop[ i ] );
172 isAffine &= (norm < 1e-12);
174 BottomMapping::phi_set( coords, x, -factor, J[ dim-1 ] );
175 TopMapping::phi_add( coords, x, factor, J[ dim-1 ] );
179 template<
class CoordStorage >
186 bool isAffine =
true;
190 BottomMapping::Dphi_add( coords, x, factor * cxn, J );
191 TopMapping::Dphi_add( coords, x, factor * xn, J );
196 isAffine &= BottomMapping::Dphi_set( coords, x,
FieldType( 1 ), Jbottom );
197 isAffine &= TopMapping::Dphi_set( coords, x,
FieldType( 1 ), Jtop );
200 for(
unsigned int i = 0; i < dim-1; ++i )
202 Jtop[ i ] -= Jbottom[ i ];
203 norm += Jtop[ i ].two_norm2();
204 J[ i ].axpy( factor, Jbottom[ i ] );
205 J[ i ].axpy( factor*xn, Jtop[ i ] );
207 isAffine &= (norm < 1e-12);
209 BottomMapping::phi_add( coords, x, -factor, J[ dim-1 ] );
210 TopMapping::phi_add( coords, x, factor, J[ dim-1 ] );
216 template<
class BaseTopology,
class Traits,
bool affine,
unsigned int offset >
224 <
Point, Traits, affine, offset + BaseTopology::numCorners >
228 static const unsigned int dim = Topology::dimension;
229 static const unsigned int dimW = Traits::dimWorld;
236 static const bool alwaysAffine = (BottomMapping::alwaysAffine || affine);
238 template<
class CoordStorage >
241 return BottomMapping::origin( coords );
244 template<
class CoordStorage >
256 BottomMapping::phi_set( coords, x, factor, p );
257 for(
unsigned int i = 0; i < dimW; ++i )
258 p[ i ] += (factor * xn) * (top[ i ] - bottom[ i ]);
262 TopMapping::phi_set( coords, x, factor * xn, p );
268 for(
unsigned int i = 0; i < dim-1; ++i )
269 xb[ i ] = icxn * x[ i ];
271 BottomMapping::phi_add( coords, xb, factor * cxn, p );
276 template<
class CoordStorage >
288 BottomMapping::phi_add( coords, x, factor, p );
289 for(
unsigned int i = 0; i < dimW; ++i )
290 p[ i ] += (factor * xn) * (top[ i ] - bottom[ i ]);
294 TopMapping::phi_add( coords, x, factor * xn, p );
300 for(
unsigned int i = 0; i < dim-1; ++i )
301 xb[ i ] = icxn * x[ i ];
303 BottomMapping::phi_add( coords, xb, factor * cxn, p );
308 template<
class CoordStorage >
321 isAffine = BottomMapping::Dphi_set( coords, x, factor, J );
322 for(
unsigned int i = 0; i < dimW; ++i )
323 q[ i ] = factor * (top[ i ] - bottom[ i ]);
331 for(
unsigned int i = 0; i < dim-1; ++i )
332 xb[ i ] = icxn * x[ i ];
333 isAffine = BottomMapping::Dphi_set( coords, xb, factor, J );
335 TopMapping::phi_set( coords, x, factor, q );
336 BottomMapping::phi_add( coords, xb, -factor, q );
338 for(
unsigned int j = 0; j < dim-1; ++j )
340 for(
unsigned int i = 0; i < dimW; ++i )
341 q[ i ] += J[ j ][ i ] * xb[ j ];
347 template<
class CoordStorage >
360 isAffine = BottomMapping::Dphi_add( coords, x, factor, J );
361 for(
unsigned int i = 0; i < dimW; ++i )
362 q[ i ] += factor * (top[ i ] - bottom[ i ]);
370 for(
unsigned int i = 0; i < dim-1; ++i )
371 xb[ i ] = icxn * x[ i ];
372 isAffine = BottomMapping::Dphi_add( coords, xb, factor, J );
374 TopMapping::phi_add( coords, x, factor, q );
375 BottomMapping::phi_add( coords, xb, -factor, q );
377 for(
unsigned int j = 0; j < dim-1; ++j )
379 for(
unsigned int i = 0; i < dimW; ++i )
380 q[ i ] += J[ j ][ i ] * xb[ j ];
392 template<
class Mapping,
unsigned int codim >
401 const unsigned int i_;
405 : mapping_( mapping ), i_( i )
411 = ReferenceElement::template subNumbering< codim, dimension - codim >( i_, j );
412 return mapping_.
corner( k );
425 template<
class CoordTraits,
class Topology,
unsigned int dimW >
431 static const unsigned int size = Topology::numCorners;
437 template<
class SubTopology >
443 template<
class CoordVector >
446 for(
unsigned int i = 0; i <
size; ++i )
447 coords_[ i ] = coords[ i ];
468 template<
class CoordTraits,
class Topology,
unsigned int dimW >
474 static const unsigned int size = Topology::numCorners;
480 template<
class SubTopology >
486 template<
class CoordVector >
489 for(
unsigned int i = 0; i <
size; ++i )
490 coords_[ i ] = &(coords[ i ]);
495 return *(coords_[ i ]);
512 template<
class CoordTraits,
class Topo,
unsigned int dimW,
513 class CStorage = CoordStorage< CoordTraits, Topo, dimW >,
514 bool affine =
false >
535 template<
unsigned int codim,
unsigned int i >
539 typedef typename CStorage::template SubStorage< Topology >::type
CornerStorage;
549 template<
class CoordVector >
570 template<
unsigned int codim,
unsigned int i >
575 return Trace( CoordVector( *
this, i ) );
586 #endif // #ifndef DUNE_GEOMETRY_GENERICGEOMETRY_CORNERMAPPING_HH