dune-fem  2.8-git
subfunction.hh
Go to the documentation of this file.
1 #ifndef DUNE_FEM_SUBFUNCTION_HH
2 #define DUNE_FEM_SUBFUNCTION_HH
3 
4 #include <memory>
5 #include <vector>
6 
10 
11 namespace Dune
12 {
13 
14  namespace Fem
15  {
16 
20  template <class DiscreteFunctionImp>
22  {
23  protected:
24  typedef DiscreteFunctionImp DiscreteFunctionType;
25  typedef typename DiscreteFunctionType :: DiscreteFunctionSpaceType SpaceType;
26  enum { dimRange = SpaceType :: dimRange };
27  typedef typename DiscreteFunctionType :: DofStorageType DofStorageType;
28  public:
29  typedef typename SpaceType :: template ToNewDimRange < 1 > :: Type SubSpaceType;
30 
34 
36  explicit SubFunctionStorage( DiscreteFunctionType& discreteFunction ) :
37  discreteFunction_( discreteFunction ),
38  space_( discreteFunction.space() ),
39  subSpace_( space_.gridPart (), space_.communicationInterface(), space_.communicationDirection() ),
40  subVector_( dimRange, nullptr ),
41  subDiscreteFunction_( dimRange, nullptr )
42  {}
43 
45 
52  SubDiscreteFunctionType& subFunction(std::size_t component) const
53  {
54  assert( component < dimRange );
55  if( ! subDiscreteFunction_[ component ] )
56  {
57  subVector_[ component ] =
58  std::make_unique< SubDofVectorType >( discreteFunction_.dofStorage(), SubMapperType( subSpace_.mapper(), component ) );
59  subDiscreteFunction_[ component ] =
60  std::make_unique< SubDiscreteFunctionType >( discreteFunction_.name()+ "_sub", subSpace_, *( subVector_[ component ] ));
61  }
62  return *( subDiscreteFunction_[ component ] );
63  }
64 
65  protected:
67  const SpaceType& space_;
69  mutable std::vector< std::unique_ptr< SubDofVectorType > > subVector_;
70  mutable std::vector< std::unique_ptr< SubDiscreteFunctionType > > subDiscreteFunction_;
71  };
72 
73  } // namespace Fem
74 
75 } // namespace Dune
76 
77 #endif // #ifndef DUNE_FEM_SUBFUNCTION_HH
Definition: bindguard.hh:11
Definition: subfunction.hh:22
SubVector< DofStorageType, SubMapperType > SubDofVectorType
Definition: subfunction.hh:32
const SpaceType & space_
Definition: subfunction.hh:67
SubSpaceType subSpace_
Definition: subfunction.hh:68
VectorDiscreteFunction< SubSpaceType, SubDofVectorType > SubDiscreteFunctionType
Definition: subfunction.hh:33
SpaceType ::template ToNewDimRange< 1 >::Type SubSpaceType
Definition: subfunction.hh:29
DiscreteFunctionType ::DofStorageType DofStorageType
Definition: subfunction.hh:27
CombinedSubMapper< typename SubSpaceType ::MapperType, dimRange, PointBased > SubMapperType
Definition: subfunction.hh:31
DiscreteFunctionType & discreteFunction_
Definition: subfunction.hh:66
DiscreteFunctionImp DiscreteFunctionType
Definition: subfunction.hh:24
@ dimRange
Definition: subfunction.hh:26
SubDiscreteFunctionType & subFunction(std::size_t component) const
return a SubDiscreteFunction repsenting only one component of the original discrete function
Definition: subfunction.hh:52
SubFunctionStorage(DiscreteFunctionType &discreteFunction)
constructor storing the discrete function
Definition: subfunction.hh:36
std::vector< std::unique_ptr< SubDofVectorType > > subVector_
Definition: subfunction.hh:69
std::vector< std::unique_ptr< SubDiscreteFunctionType > > subDiscreteFunction_
Definition: subfunction.hh:70
DiscreteFunctionType ::DiscreteFunctionSpaceType SpaceType
Definition: subfunction.hh:25
SubFunctionStorage(const SubFunctionStorage &)=delete
Definition: vectorfunction/vectorfunction.hh:42
Definition: combineddofstorage.hh:96
An implementation of DenseVector to extract a portion, not necessarly contiguos, of a vector.
Definition: subvector.hh:161