1#ifndef DUNE_FEM_RESTRICTPROLONGFUNCTION_HH
2#define DUNE_FEM_RESTRICTPROLONGFUNCTION_HH
4#include <dune/common/exceptions.hh>
6#include <dune/grid/common/grid.hh>
35 template<
class CoarseFunction,
class FineFunction >
37 FineFunction &fineFunction )
const
39 typedef typename CoarseFunction::DiscreteFunctionSpaceType CoarseSpace;
44 const CoarseSpace &coarseSpace = coarseFunction.space();
45 for(
const auto& entity : coarseSpace )
47 auto cg =
bindGuard( coarseLocalFunction, entity );
49 if( isDefinedOn( fineFunction, entity ) )
51 auto fg =
bindGuard( fineLocalFunction, entity );
52 fineLocalFunction.
assign( coarseLocalFunction );
55 hierarchicProlong( coarseLocalFunction, fineLocalFunction );
60 template<
class CoarseLocalFunction,
class FineLocalFunction >
61 void hierarchicProlong (
const CoarseLocalFunction &coarseLocalFunction,
62 FineLocalFunction &fineLocalFunction )
const
64 typedef typename CoarseLocalFunction::EntityType Entity;
65 typedef typename Entity::HierarchicIterator HierarchicIterator;
67 const Entity &parent = coarseLocalFunction.entity();
68 const int childLevel = parent.level()+1;
70 const HierarchicIterator hend = parent.hend( childLevel );
71 for( HierarchicIterator hit = parent.hbegin( childLevel ); hit != hend; ++hit )
73 const Entity &child = *hit;
74 if( isDefinedOn( fineLocalFunction.discreteFunction(), child ) )
76 auto guard =
bindGuard( fineLocalFunction, child );
77 localRestrictProlong_.prolongLocal( coarseLocalFunction, fineLocalFunction, child.geometryInFather(),
true );
80 DUNE_THROW( GridError,
"Cannot prolong over more than one level." );
84 template<
class Function >
85 static bool isDefinedOn (
const Function &function,
const typename Function::GridPartType::template Codim< 0 >::EntityType &entity )
87 typedef typename Function::GridPartType::IndexSetType IndexSet;
88 const IndexSet &indexSet = function.gridPart().indexSet();
89 return indexSet.contains( entity );
105 template<
class LRP >
119 template<
class FineFunction,
class CoarseFunction >
121 CoarseFunction &coarseFunction )
const
123 typedef typename CoarseFunction::DiscreteFunctionSpaceType CoarseSpace;
128 const CoarseSpace &coarseSpace = coarseFunction.space();
129 for(
const auto& entity : coarseSpace )
131 auto cg =
bindGuard( coarseLocalFunction, entity );
133 if( isDefinedOn( fineFunction, entity ) )
135 auto fg =
bindGuard( fineLocalFunction, entity );
136 coarseLocalFunction.
assign( fineLocalFunction );
139 hierarchicRestrict( fineLocalFunction, coarseLocalFunction );
144 template<
class FineLocalFunction,
class CoarseLocalFunction >
145 void hierarchicRestrict (
const FineLocalFunction &fineLocalFunction,
146 CoarseLocalFunction &coarseLocalFunction )
const
148 typedef typename CoarseLocalFunction::EntityType Entity;
149 typedef typename Entity::HierarchicIterator HierarchicIterator;
151 const Entity &parent = coarseLocalFunction.entity();
152 const int childLevel = parent.level()+1;
154 bool initialize =
true;
155 const HierarchicIterator hend = parent.hend( childLevel );
156 for( HierarchicIterator hit = parent.hbegin( childLevel ); hit != hend; ++hit )
158 const Entity &child = *hit;
159 if( isDefinedOn( fineLocalFunction.discreteFunction(), child ) )
161 auto guard =
bindGuard( fineLocalFunction, child );
162 localRestrictProlong_.restrictLocal( coarseLocalFunction, fineLocalFunction, child.geometryInFather(), initialize );
165 DUNE_THROW( GridError,
"Cannot restrict over more than one level." );
168 localRestrictProlong_.restrictFinalize(parent);
171 template<
class Function >
172 static bool isDefinedOn (
const Function &function,
const typename Function::GridPartType::template Codim< 0 >::EntityType &entity )
174 typedef typename Function::GridPartType::IndexSetType IndexSet;
175 const IndexSet &indexSet = function.gridPart().indexSet();
176 return indexSet.contains( entity );
Definition: bindguard.hh:11
typename Impl::ConstLocalFunction< GridFunction >::Type ConstLocalFunction
Definition: const.hh:604
static auto bindGuard(Object &object, Args &&... args) -> std::enable_if_t< isBindable< Object, Args... >::value, BindGuard< Object > >
Definition: bindguard.hh:67
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