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