DUNE-FEM (unstable)

localfunctions.hh
1#ifndef DUNE_FEM_SHAPEFUNCTIONSET_LOCALFUNCTIONS_HH
2#define DUNE_FEM_SHAPEFUNCTIONSET_LOCALFUNCTIONS_HH
3
4// C++ includes
5#include <cstddef>
6#include <vector>
7
8// dune-common includes
10
11// dune-fem includes
12#include <dune/fem/common/coordinate.hh>
13#include <dune/fem/space/common/functionspace.hh>
14
15namespace Dune
16{
17
18 namespace Fem
19 {
20
21 // LocalFunctionsShapeFunctionSetTraits
22 // ------------------------------------
23
24 template< class LocalBasis >
25 class LocalFunctionsShapeFunctionSetTraits
26 {
27
28 typedef typename LocalBasis::Traits Traits;
29
30 public:
31 typedef typename Traits::DomainType DomainType;
32 typedef typename DomainType::value_type DomainFieldType;
33 static const int dimDomain = DomainType::dimension;
34
35 typedef typename Traits::RangeType RangeType;
36 typedef typename RangeType::value_type RangeFieldType;
37 static const int dimRange = RangeType::dimension;
38
39 typedef FunctionSpace< DomainFieldType, RangeFieldType, dimDomain, dimRange > FunctionSpaceType;
40 };
41
42
43
44 // LocalFunctionsShapeFunctionSet
45 // ------------------------------
46
47 template< class LocalBasis >
48 class LocalFunctionsShapeFunctionSet
49 {
50 // this type
51 typedef LocalFunctionsShapeFunctionSet< LocalBasis > ThisType;
52 // traits class
53 typedef LocalFunctionsShapeFunctionSetTraits< LocalBasis > Traits;
54
55 public:
56 typedef typename Traits::FunctionSpaceType FunctionSpaceType;
57 typedef typename FunctionSpaceType::DomainType DomainType;
58 typedef typename FunctionSpaceType::RangeType RangeType;
59 typedef typename FunctionSpaceType::JacobianRangeType JacobianRangeType;
60 typedef typename FunctionSpaceType::HessianRangeType HessianRangeType;
61
62 explicit LocalFunctionsShapeFunctionSet ( const LocalBasis &localBasis )
63 : localBasis_( localBasis )
64 {
65 values_.reserve( size() );
66 jacobians_.reserve( size() );
67 }
68
69 int order () const { return localBasis_.order(); }
70
71 std::size_t size () const { return localBasis_.size(); }
72
73 template< class Point, class Functor >
74 void evaluateEach ( const Point &x, Functor f ) const
75 {
76 localBasis_.evaluateFunction( coordinate( x ), values_ );
77 assert( values_.size() == size() );
78 callFunctor( values_, f );
79 }
80
81 template< class Point, class Functor >
82 void jacobianEach ( const Point &x, Functor f ) const
83 {
84 localBasis_.evaluateJacobian( coordinate( x ), jacobians_ );
85 assert( jacobians_.size() == size() );
86 callFunctor( jacobians_, f );
87 }
88
89 template< class Point, class Functor >
90 void hessianEach ( const Point &x, Functor f ) const
91 {
92 DUNE_THROW( NotImplemented, "Method hessianEach not implemented" );
93 }
94
95 private:
96 template< class T, class Functor >
97 static void callFunctor ( const std::vector< T > &v, Functor f )
98 {
99 typedef typename std::vector< T >::const_iterator Iterator;
100 std::size_t i = 0;
101 for( Iterator it = v.begin(); it != v.end(); ++it )
102 f( i++, *it );
103 }
104
105 LocalBasis localBasis_;
106 mutable std::vector< RangeType > values_;
107 mutable std::vector< JacobianRangeType > jacobians_;
108 };
109
110 } // namespace Fem
111
112} // namespace Dune
113
114#endif // #ifndef DUNE_FEM_SHAPEFUNCTIONSET_LOCALFUNCTIONS_HH
Definition: explicitfieldvector.hh:75
FunctionSpaceTraits::RangeType RangeType
Type of range vector (using type of range field) has a Dune::FieldVector type interface.
Definition: functionspaceinterface.hh:71
FunctionSpaceTraits::LinearMappingType JacobianRangeType
Intrinsic type used for the jacobian values has a Dune::FieldMatrix type interface.
Definition: functionspaceinterface.hh:75
FunctionSpaceTraits::DomainType DomainType
Type of domain vector (using type of domain field) has a Dune::FieldVector type interface.
Definition: functionspaceinterface.hh:67
A vector valued function space.
Definition: functionspace.hh:60
A few common exception classes.
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
Dune namespace.
Definition: alignedallocator.hh:13
constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
Return the size of the sequence.
Definition: integersequence.hh:75
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Nov 13, 23:29, 2024)