/usr/include/dune/localfunctions/rannacherturek/rannacherturek3d/rannacherturek3dlocalbasis.hh is in libdune-localfunctions-dev 2.4.1-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
// vi: set et ts=4 sw=2 sts=2:
#ifndef DUNE_RANNACHER_TUREK_3D_LOCALBASIS_HH
#define DUNE_RANNACHER_TUREK_3D_LOCALBASIS_HH
#include <vector>
#include <dune/common/fvector.hh>
#include <dune/common/fmatrix.hh>
#include <dune/localfunctions/common/localbasis.hh>
namespace Dune
{
template< class D, class R >
class RannacherTurek3DLocalBasis
{
static const int coefficients[ 6 ][ 6 ];
public:
typedef LocalBasisTraits< D, 3, FieldVector< D, 3 >,
R, 1, FieldVector< R, 1 >,
FieldMatrix< R, 1, 3 > > Traits;
//! \brief number of shape functions
unsigned int size () const
{
return 6;
}
//! \brief evaluate all shape functions
inline void evaluateFunction ( const typename Traits::DomainType &in,
std::vector< typename Traits::RangeType > &out ) const
{
typedef typename Traits::RangeFieldType RangeFieldType;
RangeFieldType y[ 6 ] = { 1, in[ 0 ], in[ 1 ], in[ 2 ],
in[ 0 ]*in[ 0 ] - in[ 1 ]*in[ 1 ],
in[ 1 ]*in[ 1 ] - in[ 2 ]*in[ 2 ] };
out.resize( size() );
for( unsigned int i = 0; i < size(); ++i )
{
out[ i ] = RangeFieldType( 0 );
for( unsigned int j = 0; j < 6; ++j )
out[ i ] += coefficients[ i ][ j ]*y[ j ];
out[ i ] /= RangeFieldType( 3 );
}
}
//! \brief evaluate jacobian of all shape functions
inline void evaluateJacobian ( const typename Traits::DomainType &in,
std::vector< typename Traits::JacobianType > &out ) const
{
typedef typename Traits::RangeFieldType RangeFieldType;
RangeFieldType y0[ 5 ] = { 1, 0, 0, 2*in[ 0 ], 0 };
RangeFieldType y1[ 5 ] = { 0, 1, 0, -2*in[ 1 ], 2*in[ 1 ] };
RangeFieldType y2[ 5 ] = { 0, 0, 1, 0, -2*in[ 2 ] };
out.resize( size() );
for( unsigned int i = 0; i < size(); ++i )
{
out[ i ] = RangeFieldType( 0 );
for( unsigned int j = 0; j < 5; ++j )
{
out[ i ][ 0 ][ 0 ] += coefficients[ i ][ j+1 ]*y0[ j ];
out[ i ][ 0 ][ 1 ] += coefficients[ i ][ j+1 ]*y1[ j ];
out[ i ][ 0 ][ 2 ] += coefficients[ i ][ j+1 ]*y2[ j ];
}
out[ i ] /= RangeFieldType( 3 );
}
}
//! \brief polynomial order of the shape functions
unsigned int order () const
{
return 2;
}
};
// RannacherTurek3DLocalBasis::coefficients
// ----------------------------------------
template< class D, class R >
const int RannacherTurek3DLocalBasis< D, R >
::coefficients[ 6 ][ 6 ] = {{ 2, -7, 2, 2, 4, 2 },
{ -1, -1, 2, 2, 4, 2 },
{ 2, 2, -7, 2, -2, 2 },
{ -1, 2, -1, 2, -2, 2 },
{ 2, 2, 2, -7, -2, -4 },
{ -1, 2, 2, -1, -2, -4 }};
} //namespace Dune
#endif // #ifndef DUNE_RANNACHER_TUREK_3D_LOCALBASIS_HH
|