1#ifndef DUNE_FEM_SPACE_BASISFUNCTIONSET_PIOLATRANSFORMATION_HH
2#define DUNE_FEM_SPACE_BASISFUNCTIONSET_PIOLATRANSFORMATION_HH
11#include <dune/fem/common/fmatrixcol.hh>
24 double determinante (
const Mat &m )
27 template<
class F,
int d,
int l >
28 double determinante (
const FieldMatrix< F, d, l > &m )
29 {
return m.determinant(); }
31 template<
class F,
int d >
32 double determinante (
const DiagonalMatrix< F, d > &m )
33 {
return m.determinant(); }
39 template<
class Geometry,
int dimRange >
40 class InversePiolaTransformation;
46 template<
class Geometry,
int dimRange >
47 class PiolaTransformation
49 typedef PiolaTransformation< Geometry, dimRange > ThisType;
54 static_assert( dimRange % dimDomain == 0,
"PiolaTransformation can only be applied if dimRange is a multiple of dimDomain." );
56 typedef typename FieldTraits< JacobianTransposed >::real_type real_type;
57 static const int blocks = dimRange / dimDomain;
60 typedef InversePiolaTransformation< Geometry, dimRange > InverseTransformationType;
62 template<
class Po
int >
63 PiolaTransformation (
const Geometry &geo,
const Point &p )
64 : gjt_( geo.jacobianTransposed( p ) ),
65 detInv_( 1.0 / determinante( gjt_ ) )
70 FieldVector< F, dimRange > apply (
const FieldVector< F, dimRange > &d )
const
72 FieldVector< F, dimRange > ret;
73 if constexpr ( dimDomain == dimRange )
79 FieldVector< F, dimDomain > arg, dest;
80 for(
int r = 0; r < blocks; ++r )
82 std::copy_n( d.begin() + r*dimDomain, dimDomain, arg.begin() );
83 gjt_.mtv( arg, dest );
84 std::copy_n( dest.begin(), dimDomain, ret.begin() + r*dimDomain );
92 FieldVector< F, dimRange > apply_t (
const FieldVector< F, dimRange > &d )
const
94 FieldVector< F, dimRange > ret;
95 if constexpr ( dimDomain == dimRange )
101 FieldVector< F, dimDomain > arg, dest;
102 for(
int r = 0; r < blocks; ++r )
104 std::copy_n( ret.begin() + r*dimDomain, dimDomain, arg.begin() );
105 gjt_.mv( arg, dest );
106 std::copy_n( dest.begin(), dimDomain, ret.begin() + r*dimDomain );
114 FieldMatrix< F, dimRange, dimDomain > apply (
const FieldMatrix< F, dimRange, dimDomain > &d )
const
116 FieldMatrix< F, dimRange, dimDomain > ret( d );
117 FieldVector< F, dimDomain > arg, dest;
119 for( std::size_t r = 0; r < dimDomain; ++r )
121 FieldMatrixColumn< FieldMatrix< F, dimRange, dimDomain > > col( ret, r );
122 for( std::size_t b = 0; b < blocks; ++b )
124 std::copy_n( col.begin() + b*dimDomain, dimDomain, arg.begin() );
125 gjt_.mtv( arg, dest );
126 std::copy_n( dest.begin(), dimDomain, col.begin() + b*dimDomain );
135 FieldMatrix< F, dimRange, dimDomain > apply_t (
const FieldMatrix< F, dimRange, dimDomain > &d )
const
137 FieldMatrix< F, dimRange, dimDomain > ret( d );
138 FieldVector< F, dimDomain > arg, dest;
139 for( std::size_t r = 0; r < dimDomain; ++r )
141 FieldMatrixColumn< FieldMatrix< F, dimRange, dimDomain > > col( ret, r );
142 for( std::size_t b = 0; b < blocks; ++b )
144 std::copy_n( col.begin() + b*dimDomain, dimDomain, arg.begin() );
145 gjt_.mv( arg, dest );
146 std::copy_n( dest.begin(), dimDomain, col.begin() + b*dimDomain );
154 JacobianTransposed gjt_;
163 template<
class Geometry,
int dimRange >
164 class InversePiolaTransformation
166 typedef InversePiolaTransformation< Geometry, dimRange > ThisType;
171 static_assert( dimRange % dimDomain == 0,
"PiolaTransformation can only be applied if dimRange is a multiple of dimDomain." );
173 typedef typename FieldTraits< JacobianInverseTransposed >::real_type real_type;
174 static const int blocks = dimRange / dimDomain;
177 typedef PiolaTransformation< Geometry, dimRange > InverseTransformationType;
179 template<
class Po
int >
180 InversePiolaTransformation (
const Geometry &geo,
const Point &p )
181 : gjit_( geo.jacobianInverseTransposed( p ) ),
182 detInv_( 1.0 / determinante( gjit_ ) )
186 FieldVector< F, dimRange > apply (
const FieldVector< F, dimRange > &d )
const
188 FieldVector< F, dimRange > ret( d );
189 FieldVector< F, dimDomain > arg, dest;
190 for( std::size_t r = 0; r < blocks; ++r )
192 std::copy_n( d.begin() + r*dimDomain, dimDomain, arg.begin() );
193 gjit_.mtv( arg, dest );
194 std::copy_n( dest.begin(), dimDomain, ret.begin() + r*dimDomain );
201 FieldVector< F, dimRange > apply_t (
const FieldVector< F, dimRange > &d )
const
203 FieldVector< F, dimRange > ret( d );
204 FieldVector< F, dimDomain > arg, dest;
205 for( std::size_t r = 0; r < blocks; ++r )
207 std::copy_n( ret.begin() + r*dimDomain, dimDomain, arg.begin() );
208 gjit_.mv( arg, dest );
209 std::copy_n( dest.begin(), dimDomain, ret.begin() + r*dimDomain );
216 FieldMatrix< F, dimRange, dimDomain > apply (
const FieldMatrix< F, dimRange, dimDomain > &d )
const
218 FieldMatrix< F, dimRange, dimDomain > ret( d );
219 FieldVector< F, dimDomain > arg, dest;
221 for( std::size_t r = 0; r < dimDomain; ++r )
223 FieldMatrixColumn< FieldMatrix< F, dimRange, dimDomain > > col( ret, r );
224 for( std::size_t b = 0; b < blocks; ++b )
226 std::copy_n( col.begin() + b*dimDomain, dimDomain, arg.begin() );
227 gjit_.mtv( arg, dest );
228 std::copy_n( dest.begin(), dimDomain, col.begin() + b*dimDomain );
237 FieldMatrix< F, dimRange, dimDomain > apply_t (
const FieldMatrix< F, dimRange, dimDomain > &d )
const
239 FieldMatrix< F, dimRange, dimDomain > ret( d );
240 FieldVector< F, dimDomain > arg, dest;
241 for( std::size_t r = 0; r < dimDomain; ++r )
243 FieldMatrixColumn< FieldMatrix< F, dimRange, dimDomain > > col( ret, r );
244 for( std::size_t b = 0; b < blocks; ++b )
246 std::copy_n( col.begin() + b*dimDomain, dimDomain, arg.begin() );
247 gjit_.mv( arg, dest );
248 std::copy_n( dest.begin(), dimDomain, col.begin() + b*dimDomain );
256 JacobianInverseTransposed gjit_;
static constexpr int dimension
The size of this vector.
Definition: fvector.hh:106
Implementation::JacobianTransposed JacobianTransposed
type of jacobian transposed
Definition: geometry.hh:131
Implementation::JacobianInverseTransposed JacobianInverseTransposed
type of jacobian inverse transposed
Definition: geometry.hh:120
This file implements a quadratic diagonal matrix of fixed size.
Implements a matrix constructed from a given type representing a field and compile-time given number ...
Implements a vector constructed from a given type representing a field and a compile-time given size.
Dune namespace.
Definition: alignedallocator.hh:13