DUNE-FEM (unstable)

powerlocalrestrictprolong.hh
1#ifndef DUNE_FEM_SPACE_COMBINEDSPACE_POWERLOCALRESTRICPROLONG_HH
2#define DUNE_FEM_SPACE_COMBINEDSPACE_POWERLOCALRESTRICPROLONG_HH
3
4#include <algorithm>
5
7
8#include <dune/fem/function/localfunction/const.hh>
9#include <dune/fem/function/localfunction/localfunction.hh>
10#include <dune/fem/space/common/localrestrictprolong.hh>
11#include <dune/fem/storage/subvector.hh>
12
13namespace Dune
14{
15
16 namespace Fem
17 {
18
19 // PowerLocalRestricProlong
20 // ------------------------
21
22 template< class DiscreteFunctionSpace, int N >
23 class PowerLocalRestrictProlong
24 {
25 typedef PowerLocalRestrictProlong< DiscreteFunctionSpace, N > ThisType;
26
27 // type of contained DefaultLocalRestrictProlong
28 typedef DefaultLocalRestrictProlong< DiscreteFunctionSpace > LocalRestrictProlongType;
29
30 public:
31 // type of DomainField
32 typedef typename LocalRestrictProlongType::DomainFieldType DomainFieldType;
33
34 PowerLocalRestrictProlong ( const DiscreteFunctionSpace &space )
35 : localRestrictProlong_( space )
36 {}
37
38 void setFatherChildWeight ( const DomainFieldType &weight )
39 {
40 localRestrictProlong_.setFatherChildWeight( weight );
41 }
42
44 template< class LFFather, class LFSon, class LocalGeometry >
45 void restrictLocal ( LFFather &lfFather, const LFSon &lfSon,
46 const LocalGeometry &geometryInFather, bool initialize ) const
47 {
48 typedef SubVector< const typename LFSon::LocalDofVectorType, OffsetSubMapper > SubDofVectorTypeSon;
49 typedef SubVector< typename LFFather::LocalDofVectorType, OffsetSubMapper > SubDofVectorTypeFather;
50
51 typedef typename LFSon::BasisFunctionSetType::ScalarBasisFunctionSetType SubSonBasisFunctionSetType;
52 typedef typename LFFather::BasisFunctionSetType::ScalarBasisFunctionSetType SubFatherBasisFunctionSetType;
53
54 SubFatherBasisFunctionSetType subFatherBasisFunctionSet = lfFather.basisFunctionSet().scalarBasisFunctionSet();
55 SubSonBasisFunctionSetType subSonBasisFunctionSet = lfSon.basisFunctionSet().scalarBasisFunctionSet();
56
57 for( std::size_t i = 0; i < N; ++i )
58 {
59 std::size_t sonBasisSetSize = subSonBasisFunctionSet.size();
60 std::size_t fatherBasisSetsize = subFatherBasisFunctionSet.size();
61
62 SubDofVectorTypeSon sonSubDofVector( lfSon.localDofVector(), OffsetSubMapper( sonBasisSetSize, sonBasisSetSize * i ) );
63 SubDofVectorTypeFather fatherSubDofVector( lfFather.localDofVector(),
64 OffsetSubMapper( fatherBasisSetsize, fatherBasisSetsize * i ) );
65
66 BasicConstLocalFunction< SubSonBasisFunctionSetType, SubDofVectorTypeSon > subLFSon( subSonBasisFunctionSet, sonSubDofVector );
67 LocalFunction< SubFatherBasisFunctionSetType, SubDofVectorTypeFather > subLFFather( subFatherBasisFunctionSet,
68 fatherSubDofVector );
69
70 localRestrictProlong_.restrictLocal( subLFFather, subLFSon, geometryInFather, initialize );
71 }
72 }
73
74
75 template< class LFFather, class LFSon, class LocalGeometry >
76 void prolongLocal ( const LFFather &lfFather, LFSon &lfSon,
77 const LocalGeometry &geometryInFather, bool initialize ) const
78 {
79 typedef SubVector< typename LFSon::LocalDofVectorType, OffsetSubMapper > SubDofVectorTypeSon;
80 typedef SubVector< const typename LFFather::LocalDofVectorType, OffsetSubMapper > SubDofVectorTypeFather;
81
82 typedef typename LFSon::BasisFunctionSetType::ScalarBasisFunctionSetType SubSonBasisFunctionSetType;
83 typedef typename LFFather::BasisFunctionSetType::ScalarBasisFunctionSetType SubFatherBasisFunctionSetType;
84
85 SubSonBasisFunctionSetType subSonBasisFunctionSet = lfSon.basisFunctionSet().scalarBasisFunctionSet();
86 SubFatherBasisFunctionSetType subFatherBasisFunctionSet = lfFather.basisFunctionSet().scalarBasisFunctionSet();
87
88 for( std::size_t i = 0; i < N; ++i )
89 {
90 std::size_t sonBasisSetSize = subSonBasisFunctionSet.size();
91 std::size_t fatherBasisSetsize = subFatherBasisFunctionSet.size();
92
93 SubDofVectorTypeSon sonSubDofVector( lfSon.localDofVector(), OffsetSubMapper( sonBasisSetSize, sonBasisSetSize * i ) );
94 SubDofVectorTypeFather fatherSubDofVector( lfFather.localDofVector(),
95 OffsetSubMapper( fatherBasisSetsize, fatherBasisSetsize * i ) );
96
97 LocalFunction< SubSonBasisFunctionSetType, SubDofVectorTypeSon > subLFSon( subSonBasisFunctionSet, sonSubDofVector );
98 BasicConstLocalFunction< SubFatherBasisFunctionSetType, SubDofVectorTypeFather > subLFFather( subFatherBasisFunctionSet,
99 fatherSubDofVector );
100
101 localRestrictProlong_.prolongLocal( subLFFather, subLFSon, geometryInFather, initialize );
102 }
103 }
104
105 template <class LFFather>
106 void restrictFinalize ( LFFather &lfFather ) const
107 {
108 DUNE_THROW(Dune::NotImplemented,"PowerLocalRestrictProlong::restrictFinalize is missing!");
109 }
110
111 bool needCommunication () const
112 {
113 return localRestrictProlong_.needCommunication();
114 }
115
116 private:
117 LocalRestrictProlongType localRestrictProlong_;
118 };
119
120 } // namespace Fem
121
122} // namespace Dune
123
124#endif // #ifndef DUNE_FEM_SPACE_COMBINEDSPACE_POWERLOCALRESTRICPROLONG_HH
discrete function space
Default exception for dummy implementations.
Definition: exceptions.hh:263
A few common exception classes.
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
Dune namespace.
Definition: alignedallocator.hh:13
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Nov 13, 23:29, 2024)