dune-pdelab  2.7-git
default/assembler.hh
Go to the documentation of this file.
1 #ifndef DUNE_PDELAB_GRIDOPERATOR_DEFAULT_ASSEMBLER_HH
2 #define DUNE_PDELAB_GRIDOPERATOR_DEFAULT_ASSEMBLER_HH
3 
4 #include <dune/common/typetraits.hh>
10 
11 namespace Dune{
12  namespace PDELab{
13 
21  template<typename GFSU, typename GFSV, typename CU, typename CV>
23  public:
24 
27  using EntitySet = typename GFSU::Traits::EntitySet;
28  using Element = typename EntitySet::Element;
29  using Intersection = typename EntitySet::Intersection;
31 
34  typedef GFSU TrialGridFunctionSpace;
35  typedef GFSV TestGridFunctionSpace;
37 
39  typedef typename GFSU::Traits::SizeType SizeType;
40 
43 
44  DefaultAssembler (const GFSU& gfsu_, const GFSV& gfsv_, const CU& cu_, const CV& cv_)
45  : gfsu(gfsu_)
46  , gfsv(gfsv_)
47  , cu(cu_)
48  , cv(cv_)
49  , lfsu(gfsu_)
50  , lfsv(gfsv_)
51  , lfsun(gfsu_)
52  , lfsvn(gfsv_)
53  { }
54 
55  DefaultAssembler (const GFSU& gfsu_, const GFSV& gfsv_)
56  : gfsu(gfsu_)
57  , gfsv(gfsv_)
58  , cu()
59  , cv()
60  , lfsu(gfsu_)
61  , lfsv(gfsv_)
62  , lfsun(gfsu_)
63  , lfsvn(gfsv_)
64  { }
65 
67  const GFSU& trialGridFunctionSpace() const
68  {
69  return gfsu;
70  }
71 
73  const GFSV& testGridFunctionSpace() const
74  {
75  return gfsv;
76  }
77 
78  // Assembler (const GFSU& gfsu_, const GFSV& gfsv_)
79  // : gfsu(gfsu_), gfsv(gfsv_), lfsu(gfsu_), lfsv(gfsv_),
80  // lfsun(gfsu_), lfsvn(gfsv_),
81  // sub_triangulation(ST(gfsu_.gridview(),Dune::PDELab::NoSubTriangulationImp()))
82  // { }
83 
84  template<class LocalAssemblerEngine>
85  void assemble(LocalAssemblerEngine & assembler_engine) const
86  {
87  typedef LFSIndexCache<LFSU,CU> LFSUCache;
88 
89  typedef LFSIndexCache<LFSV,CV> LFSVCache;
90 
91  const bool needs_constraints_caching = assembler_engine.needsConstraintsCaching(cu,cv);
92 
93  LFSUCache lfsu_cache(lfsu,cu,needs_constraints_caching);
94  LFSVCache lfsv_cache(lfsv,cv,needs_constraints_caching);
95  LFSUCache lfsun_cache(lfsun,cu,needs_constraints_caching);
96  LFSVCache lfsvn_cache(lfsvn,cv,needs_constraints_caching);
97 
98  // Notify assembler engine about oncoming assembly
99  assembler_engine.preAssembly();
100 
101  // Extract integration requirements from the local assembler
102  const bool require_uv_skeleton = assembler_engine.requireUVSkeleton();
103  const bool require_v_skeleton = assembler_engine.requireVSkeleton();
104  const bool require_uv_boundary = assembler_engine.requireUVBoundary();
105  const bool require_v_boundary = assembler_engine.requireVBoundary();
106  const bool require_uv_processor = assembler_engine.requireUVBoundary();
107  const bool require_v_processor = assembler_engine.requireVBoundary();
108  const bool require_uv_post_skeleton = assembler_engine.requireUVVolumePostSkeleton();
109  const bool require_v_post_skeleton = assembler_engine.requireVVolumePostSkeleton();
110  const bool require_skeleton_two_sided = assembler_engine.requireSkeletonTwoSided();
111 
112  auto entity_set = gfsu.entitySet();
113  auto& index_set = entity_set.indexSet();
114 
115  // Traverse grid view
116  for (const auto& element : elements(entity_set))
117  {
118  // Compute unique id
119  auto ids = index_set.uniqueIndex(element);
120 
121  ElementGeometry<Element> eg(element);
122 
123  if(assembler_engine.assembleCell(eg))
124  continue;
125 
126  // Bind local test function space to element
127  lfsv.bind( element );
128  lfsv_cache.update();
129 
130  // Notify assembler engine about bind
131  assembler_engine.onBindLFSV(eg,lfsv_cache);
132 
133  // Volume integration
134  assembler_engine.assembleVVolume(eg,lfsv_cache);
135 
136  // Bind local trial function space to element
137  lfsu.bind( element );
138  lfsu_cache.update();
139 
140  // Notify assembler engine about bind
141  assembler_engine.onBindLFSUV(eg,lfsu_cache,lfsv_cache);
142 
143  // Load coefficients of local functions
144  assembler_engine.loadCoefficientsLFSUInside(lfsu_cache);
145 
146  // Volume integration
147  assembler_engine.assembleUVVolume(eg,lfsu_cache,lfsv_cache);
148 
149  // Skip if no intersection iterator is needed
150  if (require_uv_skeleton || require_v_skeleton ||
151  require_uv_boundary || require_v_boundary ||
152  require_uv_processor || require_v_processor)
153  {
154  // Traverse intersections
155  unsigned int intersection_index = 0;
156  for(const auto& intersection : intersections(entity_set,element))
157  {
158 
159  IntersectionGeometry<Intersection> ig(intersection,intersection_index);
160 
161  auto intersection_data = classifyIntersection(entity_set,intersection);
162  auto intersection_type = std::get<0>(intersection_data);
163  auto& outside_element = std::get<1>(intersection_data);
164 
165  switch (intersection_type)
166  {
168  // the specific ordering of the if-statements in the old code caused periodic
169  // boundary intersection to be handled the same as skeleton intersections
171  if (require_uv_skeleton || require_v_skeleton)
172  {
173  // compute unique id for neighbor
174 
175  auto idn = index_set.uniqueIndex(outside_element);
176 
177  // Visit face if id is bigger
178  bool visit_face = ids > idn || require_skeleton_two_sided;
179 
180  // unique vist of intersection
181  if (visit_face)
182  {
183  // Bind local test space to neighbor element
184  lfsvn.bind(outside_element);
185  lfsvn_cache.update();
186 
187  // Notify assembler engine about binds
188  assembler_engine.onBindLFSVOutside(ig,lfsv_cache,lfsvn_cache);
189 
190  // Skeleton integration
191  assembler_engine.assembleVSkeleton(ig,lfsv_cache,lfsvn_cache);
192 
193  if(require_uv_skeleton){
194 
195  // Bind local trial space to neighbor element
196  lfsun.bind(outside_element);
197  lfsun_cache.update();
198 
199  // Notify assembler engine about binds
200  assembler_engine.onBindLFSUVOutside(ig,
201  lfsu_cache,lfsv_cache,
202  lfsun_cache,lfsvn_cache);
203 
204  // Load coefficients of local functions
205  assembler_engine.loadCoefficientsLFSUOutside(lfsun_cache);
206 
207  // Skeleton integration
208  assembler_engine.assembleUVSkeleton(ig,lfsu_cache,lfsv_cache,lfsun_cache,lfsvn_cache);
209 
210  // Notify assembler engine about unbinds
211  assembler_engine.onUnbindLFSUVOutside(ig,
212  lfsu_cache,lfsv_cache,
213  lfsun_cache,lfsvn_cache);
214  }
215 
216  // Notify assembler engine about unbinds
217  assembler_engine.onUnbindLFSVOutside(ig,lfsv_cache,lfsvn_cache);
218  }
219  }
220  break;
221 
223  if(require_uv_boundary || require_v_boundary )
224  {
225 
226  // Boundary integration
227  assembler_engine.assembleVBoundary(ig,lfsv_cache);
228 
229  if(require_uv_boundary){
230  // Boundary integration
231  assembler_engine.assembleUVBoundary(ig,lfsu_cache,lfsv_cache);
232  }
233  }
234  break;
235 
237  if(require_uv_processor || require_v_processor )
238  {
239 
240  // Processor integration
241  assembler_engine.assembleVProcessor(ig,lfsv_cache);
242 
243  if(require_uv_processor){
244  // Processor integration
245  assembler_engine.assembleUVProcessor(ig,lfsu_cache,lfsv_cache);
246  }
247  }
248  break;
249  } // switch
250 
251  ++intersection_index;
252  } // iit
253  } // do skeleton
254 
255  if(require_uv_post_skeleton || require_v_post_skeleton){
256  // Volume integration
257  assembler_engine.assembleVVolumePostSkeleton(eg,lfsv_cache);
258 
259  if(require_uv_post_skeleton){
260  // Volume integration
261  assembler_engine.assembleUVVolumePostSkeleton(eg,lfsu_cache,lfsv_cache);
262  }
263  }
264 
265  // Notify assembler engine about unbinds
266  assembler_engine.onUnbindLFSUV(eg,lfsu_cache,lfsv_cache);
267 
268  // Notify assembler engine about unbinds
269  assembler_engine.onUnbindLFSV(eg,lfsv_cache);
270 
271  } // it
272 
273  // Notify assembler engine that assembly is finished
274  assembler_engine.postAssembly(gfsu,gfsv);
275 
276  }
277 
278  private:
279 
280  /* global function spaces */
281  const GFSU& gfsu;
282  const GFSV& gfsv;
283 
284  typename std::conditional<
286  const CU,
287  const CU&
288  >::type cu;
289  typename std::conditional<
291  const CV,
292  const CV&
293  >::type cv;
294 
295  /* local function spaces */
298  // local function spaces in local cell
299  mutable LFSU lfsu;
300  mutable LFSV lfsv;
301  // local function spaces in neighbor
302  mutable LFSU lfsun;
303  mutable LFSV lfsvn;
304 
305  };
306 
307  }
308 }
309 #endif // DUNE_PDELAB_GRIDOPERATOR_DEFAULT_ASSEMBLER_HH
const IG & ig
Definition: constraints.hh:149
For backward compatibility – Do not use this!
Definition: adaptivity.hh:28
@ processor
processor boundary intersection (neighbor() == false && boundary() == false) or outside entity not in...
@ boundary
domain boundary intersection (neighbor() == false && boundary() == true)
@ skeleton
skeleton intersection (neighbor() == true && boundary() == false)
@ periodic
periodic boundary intersection (neighbor() == true && boundary() == true)
std::tuple< IntersectionType, typename EntitySet::Element > classifyIntersection(const EntitySet &entity_set, const Intersection &is)
Classifies the type of an intersection wrt to the passed EntitySet.
Definition: intersectiontype.hh:37
Wrap element.
Definition: geometrywrapper.hh:16
Wrap intersection.
Definition: geometrywrapper.hh:57
Definition: lfsindexcache.hh:979
The local assembler engine which handles the integration parts as provided by the global assemblers.
Definition: common/assembler.hh:33
void onUnbindLFSV(const EG &eg, const LFSV_S &lfsv_s)
void assembleUVVolume(const EG &eg, const LFSU &lfsu, const LFSV &lfsv)
void onBindLFSUV(const EG &eg, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s)
void assembleVSkeleton(const IG &ig, const LFSV_S &lfsv_s, const LFSV_N &lfsv_n)
void assembleUVProcessor(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s)
void assembleUVSkeleton(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s, const LFSU_N &lfsu_n, const LFSV_N &lfsv_n)
void loadCoefficientsLFSUInside(const LFSU_S &lfsu_s)
void assembleVProcessor(const IG &ig, const LFSV_S &lfsv_s)
void preAssembly()
Called directly before assembling.
void assembleVVolumePostSkeleton(const EG &eg, const LFSV &lfsv)
void assembleUVVolumePostSkeleton(const EG &eg, const LFSU &lfsu, const LFSV &lfsv)
void onUnbindLFSUVOutside(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s, const LFSU_N &lfsu_n, const LFSV_N &lfsv_n)
void assembleVBoundary(const IG &ig, const LFSV_S &lfsv_s)
void onBindLFSV(const EG &eg, const LFSV_S &lfsv_s)
void onBindLFSVOutside(const IG &ig, const LFSV_S &lfsv_s, const LFSV_N &lfsv_n)
void onUnbindLFSUV(const EG &eg, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s)
void assembleVVolume(const EG &eg, const LFSV &lfsv)
void onUnbindLFSVOutside(const IG &ig, const LFSV_S &lfsv_s, const LFSV_N &lfsv_n)
void postAssembly()
Called last thing after assembling.
void assembleUVBoundary(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s)
void onBindLFSUVOutside(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s, const LFSU_N &lfsu_n, const LFSV_N &lfsv_n)
void loadCoefficientsLFSUOutside(const LFSU_N &lfsu_n)
The assembler for standard DUNE grid.
Definition: default/assembler.hh:22
void assemble(LocalAssemblerEngine &assembler_engine) const
Definition: default/assembler.hh:85
typename EntitySet::Element Element
Definition: default/assembler.hh:28
const GFSU & trialGridFunctionSpace() const
Get the trial grid function space.
Definition: default/assembler.hh:67
GFSU::Traits::SizeType SizeType
Size type as used in grid function space.
Definition: default/assembler.hh:39
DefaultAssembler(const GFSU &gfsu_, const GFSV &gfsv_, const CU &cu_, const CV &cv_)
Definition: default/assembler.hh:44
GFSV TestGridFunctionSpace
Definition: default/assembler.hh:35
typename GFSU::Traits::EntitySet EntitySet
Definition: default/assembler.hh:27
const GFSV & testGridFunctionSpace() const
Get the test grid function space.
Definition: default/assembler.hh:73
DefaultAssembler(const GFSU &gfsu_, const GFSV &gfsv_)
Definition: default/assembler.hh:55
typename EntitySet::Intersection Intersection
Definition: default/assembler.hh:29
GFSU TrialGridFunctionSpace
Definition: default/assembler.hh:34
static const bool isGalerkinMethod
Static check on whether this is a Galerkin method.
Definition: default/assembler.hh:42
static const unsigned int value
Definition: gridfunctionspace/tags.hh:139