DUNE-FEM (unstable)

discretefunction.hh
1 #ifndef DUNE_FEM_FUNCTION_TUPLEDISCRETEFUNCTION_DISCRETEFUNCTION_HH
2 #define DUNE_FEM_FUNCTION_TUPLEDISCRETEFUNCTION_DISCRETEFUNCTION_HH
3 
4 #include <string>
5 #include <tuple>
6 #include <utility>
7 
8 #include <dune/common/hybridutilities.hh>
9 
10 #include <dune/fem/common/stackallocator.hh>
11 #include <dune/fem/function/common/discretefunction.hh>
12 #include <dune/fem/function/common/scalarproducts.hh>
13 #include <dune/fem/function/localfunction/mutable.hh>
14 #include <dune/fem/function/tuplediscretefunction/functor.hh>
15 
16 #include <dune/fem/function/tuplediscretefunction/dofvector.hh>
17 #include <dune/fem/space/combinedspace.hh>
18 
19 namespace Dune
20 {
21 
22  namespace Fem
23  {
24 
26  template< class ... DiscreteFunctions >
27  class TupleDiscreteFunction;
28 
29  // DiscreteFunctionTraits
30  // ----------------------
31 
32  template< class ... DiscreteFunctions >
33  struct DiscreteFunctionTraits< TupleDiscreteFunction< DiscreteFunctions ... > >
34  : public DefaultDiscreteFunctionTraits<
35  TupleDiscreteFunctionSpace< typename DiscreteFunctions::DiscreteFunctionSpaceType ... >,
36  TupleDofVector< typename DiscreteFunctions::DofVectorType ... >
37  >
38  {
39  typedef TupleDiscreteFunction< DiscreteFunctions ... > DiscreteFunctionType;
40  typedef MutableLocalFunction< DiscreteFunctionType > LocalFunctionType;
41  };
42 
43 
44  // TupleDiscreteFunction
45  // ---------------------
46 
47  template< class ... DiscreteFunctions >
49  : public DiscreteFunctionDefault< TupleDiscreteFunction< DiscreteFunctions ... > >,
50  public std::tuple< DiscreteFunctions ... >
51  {
52  typedef TupleDiscreteFunction< DiscreteFunctions ... > ThisType;
54 
56 
57  typedef std::tuple< DiscreteFunctions ... > DiscreteFunctionTuple;
58 
59  static_assert( sizeof ... ( DiscreteFunctions ) > 0, "TupleDiscreteFunction needs at least one DiscreteFunction." );
60 
61  public:
62  typedef decltype ( std::index_sequence_for< DiscreteFunctions ... >() ) Sequence;
63 
64  typedef TupleDofVector< typename DiscreteFunctions::DofVectorType ... > DofVectorType;
65 
66  using BaseType::space;
67 
69  typedef TupleDiscreteFunctionSpace< typename DiscreteFunctions::DiscreteFunctionSpaceType ... > DiscreteFunctionSpaceType;
70 
72  template< int i >
74  {
75  typedef typename std::tuple_element< i, DiscreteFunctionTuple >::type Type;
76  };
77 
84  TupleDiscreteFunction ( const std::string &name,
85  const DiscreteFunctionSpaceType &dfSpace,
86  DofVectorType &dofVector )
87  : TupleDiscreteFunction ( name, dfSpace, dofVector, Sequence() ) {}
88 
94  TupleDiscreteFunction ( const std::string &name,
95  const DiscreteFunctionSpaceType &dfSpace )
96  : TupleDiscreteFunction ( name, dfSpace, Sequence() ) {}
97 
98  // copy constructor
99  TupleDiscreteFunction ( const ThisType &other )
100  : TupleDiscreteFunction ( "copy of "+other.name(), other.space(), Sequence() )
101  {
102  dofVector_ = other.dofVector();
103  }
104 
105  // move constructor
106  TupleDiscreteFunction ( ThisType&& other )
107  : BaseType ( static_cast< BaseType && >( other ) ),
108  DiscreteFunctionTuple( std::move( other ) ),
109  dofVector_( std::move( other.dofVector_ ) )
110  {}
111 
112  TupleDiscreteFunction () = delete;
113  ThisType &operator= ( const ThisType & ) = delete;
114 
115  DofVectorType &dofVector () { return dofVector_; }
116  const DofVectorType &dofVector () const { return dofVector_; }
117 
118  template< int i >
119  typename SubDiscreteFunction< i >::Type& subDiscreteFunction()
120  {
121  return std::get< i >( *this );
122  }
123 
124  template< int i >
125  const typename SubDiscreteFunction< i >::Type& subDiscreteFunction() const
126  {
127  return std::get< i >( *this );
128  }
129 
132  {
133  Hybrid::forEach( Sequence{}, [ & ]( auto i ){ std::get< i >( *this ).enableDofCompression(); } );
134  }
135 
136  protected:
137 
138  template< std::size_t ... I >
139  TupleDiscreteFunction ( const std::string &name, const DiscreteFunctionSpaceType &space, std::index_sequence< I ... > )
140  : BaseType( name, space ),
141  DiscreteFunctionTuple(
142  typename SubDiscreteFunction< I >::Type(
143  name + "_comp_" + std::to_string( I ), space.template subDiscreteFunctionSpace< I >()
144  ) ... ),
145  dofVector_( std::get< I >( *this ).dofVector() ... )
146  {}
147 
148  template< std::size_t ... I >
149  TupleDiscreteFunction ( const std::string &name, const DiscreteFunctionSpaceType &space,
150  DofVectorType &dofVector, std::index_sequence< I ... > )
151  : BaseType( name, space ),
152  DiscreteFunctionTuple(
153  typename SubDiscreteFunction< I >::Type(
154  name + "_comp_" + std::to_string( I ), space.template subDiscreteFunctionSpace< I >(),
155  std::get< I >( dofVector ) ) ... ),
156  dofVector_( dofVector )
157  {}
158 
159  DofVectorType dofVector_;
160  };
161 
162  } // namespace Fem
163 
164 } // namespace Dune
165 
166 #endif // #ifndef DUNE_FEM_FUNCTION_TUPLEDISCRETEFUNCTION_DISCRETEFUNCTION_HH
Definition: discretefunction.hh:584
const std::string & name() const
obtain the name of the discrete function
Definition: discretefunction.hh:691
const DiscreteFunctionSpaceType & space() const
obtain a reference to the corresponding DiscreteFunctionSpace
Definition: discretefunction.hh:709
Definition: scalarproducts.hh:65
forward declaration
Definition: discretefunction.hh:51
TupleDiscreteFunction(const std::string &name, const DiscreteFunctionSpaceType &dfSpace)
Constructor to use if the vector storing the dofs does not exist yet.
Definition: discretefunction.hh:94
TupleDiscreteFunctionSpace< typename DiscreteFunctions::DiscreteFunctionSpaceType ... > DiscreteFunctionSpaceType
type for the discrete function space this function lives in
Definition: discretefunction.hh:69
TupleDiscreteFunction(const std::string &name, const DiscreteFunctionSpaceType &dfSpace, DofVectorType &dofVector)
Constructor to use if the vector storing the dofs (which is a block vector) already exists.
Definition: discretefunction.hh:84
const DiscreteFunctionSpaceType & space() const
obtain a reference to the corresponding DiscreteFunctionSpace
Definition: discretefunction.hh:709
void enableDofCompression()
Enable this discrete function for dof compression, i.e. during grid changes a dof compression is done...
Definition: discretefunction.hh:131
constexpr void forEach(Range &&range, F &&f)
Range based for loop.
Definition: hybridutilities.hh:256
Dune namespace.
Definition: alignedallocator.hh:13
constexpr auto get(std::integer_sequence< T, II... >, std::integral_constant< std::size_t, pos >={})
Return the entry at position pos of the given sequence.
Definition: integersequence.hh:22
helper struct to get the type of the i-th sub function
Definition: discretefunction.hh:74
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 16, 22:29, 2024)