dune-fem  2.4.1-rc
subfunction.hh
Go to the documentation of this file.
1 #ifndef DUNE_FEM_SUBFUNCTION_HH
2 #define DUNE_FEM_SUBFUNCTION_HH
3 
4 #include <vector>
5 
9 
10 namespace Dune
11 {
12 
13  namespace Fem
14  {
15 
19  template <class DiscreteFunctionImp>
21  {
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 (),
40  space_.communicationInterface(),
41  space_.communicationDirection() ),
42  subMapper_( dimRange, (SubMapperType *) 0 ),
43  subVector_( dimRange, (SubDofVectorType *) 0 ),
44  subDiscreteFunction_( dimRange, (SubDiscreteFunctionType *) 0 )
45  {}
46 
49  {
50  for(int i=0; i<dimRange; ++i)
51  {
52  delete subDiscreteFunction_[ i ]; subDiscreteFunction_[ i ] = 0;
53  delete subVector_[ i ]; subVector_[ i ] = 0;
54  delete subMapper_[ i ]; subMapper_[ i ] = 0;
55  }
56  }
57 
64  SubDiscreteFunctionType& subFunction(const size_t component) const
65  {
66  assert( component < dimRange );
67  if( ! subDiscreteFunction_[ component ] )
68  {
69  subMapper_[ component ] = new SubMapperType( subSpace_.mapper(), component );
70  subVector_[ component ] = new SubDofVectorType( discreteFunction_.dofStorage(),
71  *subMapper_[component] );
72  subDiscreteFunction_[ component ] =
73  new SubDiscreteFunctionType( std::string(discreteFunction_.name()+ "_sub"),
74  subSpace_, *( subVector_[ component ] ));
75  }
76  return *( subDiscreteFunction_[ component ] );
77  }
78 
79  protected:
80  DiscreteFunctionType& discreteFunction_;
81  const SpaceType& space_;
82  SubSpaceType subSpace_;
83  mutable std::vector< SubMapperType * > subMapper_;
84  mutable std::vector< SubDofVectorType * > subVector_;
85  mutable std::vector< SubDiscreteFunctionType* > subDiscreteFunction_;
86  };
87 
88  } // namespace Fem
89 
90 } // namespace Dune
91 
92 #endif // #ifndef DUNE_FEM_SUBFUNCTION_HH
DiscreteFunctionType::DofStorageType DofStorageType
Definition: subfunction.hh:27
std::vector< SubDofVectorType * > subVector_
Definition: subfunction.hh:84
Definition: vectorfunction/vectorfunction.hh:25
const SpaceType & space_
Definition: subfunction.hh:81
VectorDiscreteFunction< SubSpaceType, SubDofVectorType > SubDiscreteFunctionType
Definition: subfunction.hh:33
SubFunctionStorage(DiscreteFunctionType &discreteFunction)
constructor storing the discrete function
Definition: subfunction.hh:36
CombinedSubMapper< typename SubSpaceType::MapperType, dimRange, PointBased > SubMapperType
Definition: subfunction.hh:31
SubDiscreteFunctionType & subFunction(const size_t component) const
return a SubDiscreteFunction repsenting only one component of the original discrete function ...
Definition: subfunction.hh:64
std::vector< SubMapperType * > subMapper_
Definition: subfunction.hh:83
Fem::SubVector< DofStorageType, SubMapperType > SubDofVectorType
Definition: subfunction.hh:32
Definition: coordinate.hh:4
SubSpaceType subSpace_
Definition: subfunction.hh:82
Definition: subfunction.hh:20
Definition: subarray.hh:199
Definition: subfunction.hh:26
DiscreteFunctionType & discreteFunction_
Definition: subfunction.hh:80
Definition: combineddofstorage.hh:100
std::vector< SubDiscreteFunctionType * > subDiscreteFunction_
Definition: subfunction.hh:85
DiscreteFunctionImp DiscreteFunctionType
Definition: subfunction.hh:24
DiscreteFunctionType::DiscreteFunctionSpaceType SpaceType
Definition: subfunction.hh:25
SpaceType::template ToNewDimRange< 1 >::Type SubSpaceType
Definition: subfunction.hh:29
~SubFunctionStorage()
destructor
Definition: subfunction.hh:48