dune-fem  2.8-git
restrictprolongfunction.hh
Go to the documentation of this file.
1 #ifndef DUNE_FEM_RESTRICTPROLONGFUNCTION_HH
2 #define DUNE_FEM_RESTRICTPROLONGFUNCTION_HH
3 
4 #include <dune/common/exceptions.hh>
5 
6 #include <dune/grid/common/grid.hh>
8 
9 namespace Dune
10 {
11 
12  namespace Fem
13  {
14 
22  template< class LRP >
24  {
26  typedef LRP LocalRestrictProlong;
27 
35  template< class CoarseFunction, class FineFunction >
36  void operator() ( const CoarseFunction &coarseFunction,
37  FineFunction &fineFunction ) const
38  {
39  typedef typename CoarseFunction::DiscreteFunctionSpaceType CoarseSpace;
40 
41  ConstLocalFunction< CoarseFunction > coarseLocalFunction( coarseFunction );
42  MutableLocalFunction< FineFunction > fineLocalFunction( fineFunction );
43 
44  const CoarseSpace &coarseSpace = coarseFunction.space();
45  for( const auto& entity : coarseSpace )
46  {
47  auto cg = bindGuard( coarseLocalFunction, entity );
48 
49  if( isDefinedOn( fineFunction, entity ) )
50  {
51  auto fg = bindGuard( fineLocalFunction, entity );
52  fineLocalFunction.assign( coarseLocalFunction );
53  }
54  else
55  hierarchicProlong( coarseLocalFunction, fineLocalFunction );
56  }
57  }
58 
59  private:
60  template< class CoarseLocalFunction, class FineLocalFunction >
61  void hierarchicProlong ( const CoarseLocalFunction &coarseLocalFunction,
62  FineLocalFunction &fineLocalFunction ) const
63  {
64  typedef typename CoarseLocalFunction::EntityType Entity;
65  typedef typename Entity::HierarchicIterator HierarchicIterator;
66 
67  const Entity &parent = coarseLocalFunction.entity();
68  const int childLevel = parent.level()+1;
69 
70  const HierarchicIterator hend = parent.hend( childLevel );
71  for( HierarchicIterator hit = parent.hbegin( childLevel ); hit != hend; ++hit )
72  {
73  const Entity &child = *hit;
74  if( isDefinedOn( fineLocalFunction.discreteFunction(), child ) )
75  {
76  auto guard = bindGuard( fineLocalFunction, child );
77  localRestrictProlong_.prolongLocal( coarseLocalFunction, fineLocalFunction, child.geometryInFather(), true );
78  }
79  else
80  DUNE_THROW( GridError, "Cannot prolong over more than one level." );
81  }
82  }
83 
84  template< class Function >
85  static bool isDefinedOn ( const Function &function, const typename Function::GridPartType::template Codim< 0 >::EntityType &entity )
86  {
87  typedef typename Function::GridPartType::IndexSetType IndexSet;
88  const IndexSet &indexSet = function.gridPart().indexSet();
89  return indexSet.contains( entity );
90  }
91 
92  private:
93  LocalRestrictProlong localRestrictProlong_;
94  };
95 
96 
97 
105  template< class LRP >
107  {
109  typedef LRP LocalRestrictProlong;
110 
111  public:
119  template< class FineFunction, class CoarseFunction >
120  void operator() ( const FineFunction &fineFunction,
121  CoarseFunction &coarseFunction ) const
122  {
123  typedef typename CoarseFunction::DiscreteFunctionSpaceType CoarseSpace;
124 
125  ConstLocalFunction< FineFunction > fineLocalFunction( fineFunction );
126  MutableLocalFunction< CoarseFunction > coarseLocalFunction( coarseFunction );
127 
128  const CoarseSpace &coarseSpace = coarseFunction.space();
129  for( const auto& entity : coarseSpace )
130  {
131  auto cg = bindGuard( coarseLocalFunction, entity );
132 
133  if( isDefinedOn( fineFunction, entity ) )
134  {
135  auto fg = bindGuard( fineLocalFunction, entity );
136  coarseLocalFunction.assign( fineLocalFunction );
137  }
138  else
139  hierarchicRestrict( fineLocalFunction, coarseLocalFunction );
140  }
141  }
142 
143  private:
144  template< class FineLocalFunction, class CoarseLocalFunction >
145  void hierarchicRestrict ( const FineLocalFunction &fineLocalFunction,
146  CoarseLocalFunction &coarseLocalFunction ) const
147  {
148  typedef typename CoarseLocalFunction::EntityType Entity;
149  typedef typename Entity::HierarchicIterator HierarchicIterator;
150 
151  const Entity &parent = coarseLocalFunction.entity();
152  const int childLevel = parent.level()+1;
153 
154  bool initialize = true;
155  const HierarchicIterator hend = parent.hend( childLevel );
156  for( HierarchicIterator hit = parent.hbegin( childLevel ); hit != hend; ++hit )
157  {
158  const Entity &child = *hit;
159  if( isDefinedOn( fineLocalFunction.discreteFunction(), child ) )
160  {
161  auto guard = bindGuard( fineLocalFunction, child );
162  localRestrictProlong_.restrictLocal( coarseLocalFunction, fineLocalFunction, child.geometryInFather(), initialize );
163  }
164  else
165  DUNE_THROW( GridError, "Cannot restrict over more than one level." );
166  initialize = false;
167  }
168  localRestrictProlong_.restrictFinalize(parent);
169  }
170 
171  template< class Function >
172  static bool isDefinedOn ( const Function &function, const typename Function::GridPartType::template Codim< 0 >::EntityType &entity )
173  {
174  typedef typename Function::GridPartType::IndexSetType IndexSet;
175  const IndexSet &indexSet = function.gridPart().indexSet();
176  return indexSet.contains( entity );
177  }
178 
179  private:
180  LocalRestrictProlong localRestrictProlong_;
181  };
182 
183  } // namespace Fem
184 
185 } // namespace Dune
186 
187 #endif // #ifndef DUNE_FEM_RESTRICTPROLONGFUNCTION_HH
Definition: bindguard.hh:11
typename Impl::ConstLocalFunction< GridFunction >::Type ConstLocalFunction
Definition: const.hh:517
static auto bindGuard(Object &object, Args &&... args) -> std::enable_if_t< isBindable< Object, Args... >::value, BindGuard< Object > >
Definition: bindguard.hh:67
int cg(Operator &op, Precoditioner *preconditioner, std::vector< DiscreteFunction > &tempMem, DiscreteFunction &x, const DiscreteFunction &b, const double epsilon, const int maxIterations, const int toleranceCriteria, std::ostream *os=nullptr)
Definition: cg.hh:24
void assign(const LocalFunction< BasisFunctionSet, T > &other)
assign all DoFs of this local function
Definition: localfunction.hh:189
Definition: mutable.hh:31
prolong discrete functions between grid levels
Definition: restrictprolongfunction.hh:24
void operator()(const CoarseFunction &coarseFunction, FineFunction &fineFunction) const
prolong a discrete function to finer grid level
Definition: restrictprolongfunction.hh:36
LRP LocalRestrictProlong
type of the local restriction and prolongation operator
Definition: restrictprolongfunction.hh:26
restrict discrete functions between grid levels
Definition: restrictprolongfunction.hh:107
void operator()(const FineFunction &fineFunction, CoarseFunction &coarseFunction) const
restrict a discrete function to coarser grid level
Definition: restrictprolongfunction.hh:120
LRP LocalRestrictProlong
type of the local restriction and prolongation operator
Definition: restrictprolongfunction.hh:109