dune-pdelab  2.5-dev
jacobianresidualengine.hh
Go to the documentation of this file.
1 #ifndef DUNE_PDELAB_GRIDOPERATOR_ONESTEP_JACOBIANRESIDUALENGINE_HH
2 #define DUNE_PDELAB_GRIDOPERATOR_ONESTEP_JACOBIANRESIDUALENGINE_HH
3 
4 #include <cassert>
5 
7 
8 namespace Dune{
9  namespace PDELab{
10 
18  template<typename OSLA>
21  {
22  public:
24  typedef OSLA OneStepLocalAssembler;
25 
26  template<typename TrialConstraintsContainer, typename TestConstraintsContainer>
27  bool needsConstraintsCaching(const TrialConstraintsContainer& cu, const TestConstraintsContainer& cv) const
28  {
29  return cu.containsNonDirichletConstraints() or cv.containsNonDirichletConstraints();
30  }
31 
33  typedef typename OSLA::Real Real;
34 
35  typedef OSLA LocalAssembler;
36  typedef typename LocalAssembler::LocalPreStageAssemblerEngine PreStageEngine;
37  typedef typename LocalAssembler::LocalResidualAssemblerEngine ResidualEngine;
38  typedef typename LocalAssembler::LocalAssemblerDT1::LocalJacobianAssemblerEngine JacobianEngine;
39 
47  (LocalAssembler & local_assembler_)
48  : la(local_assembler_),
49  prestage_engine(nullptr),
50  jacobian_engine(nullptr)
51  {}
52 
53  void setLocalPreStageEngine(PreStageEngine & prestage_engine_)
54  {
55  prestage_engine = & prestage_engine_;
56  }
57 
58  void setLocalJacobianEngine(JacobianEngine & jacobian_engine_)
59  {
60  jacobian_engine = & jacobian_engine_;
61  }
62 
65  bool requireSkeleton() const
66  {
67  return prestage_engine->requireSkeleton() or jacobian_engine->requireSkeleton();
68  }
70  {
71  return prestage_engine->requireSkeletonTwoSided() or jacobian_engine->requireSkeletonTwoSided();
72  }
73  bool requireUVVolume() const
74  {
75  return prestage_engine->requireUVVolume() or jacobian_engine->requireUVVolume();
76  }
77  bool requireVVolume() const
78  {
79  return prestage_engine->requireVVolume() or jacobian_engine->requireVVolume();
80  }
81  bool requireUVSkeleton() const
82  {
83  return prestage_engine->requireUVSkeleton() or jacobian_engine->requireUVSkeleton();
84  }
85  bool requireVSkeleton() const
86  {
87  return prestage_engine->requireVSkeleton() or jacobian_engine->requireVSkeleton();
88  }
89  bool requireUVBoundary() const
90  {
91  return prestage_engine->requireUVBoundary() or jacobian_engine->requireUVBoundary();
92  }
93  bool requireVBoundary() const
94  {
95  return prestage_engine->requireVBoundary() or jacobian_engine->requireVBoundary();
96  }
98  {
99  return prestage_engine->requireUVVolumePostSkeleton() or jacobian_engine->requireUVVolumePostSkeleton();
100  }
102  {
103  return prestage_engine->requireVVolumePostSkeleton() or jacobian_engine->requireVVolumePostSkeleton();
104  }
105 
107 
109  const LocalAssembler & localAssembler() const
110  {
111  return la;
112  }
113 
117  template<typename EG, typename LFSU, typename LFSV>
118  void onBindLFSUV(const EG & eg, const LFSU & lfsu, const LFSV & lfsv)
119  {
120  if (prestage_engine->requireUVVolume() or prestage_engine->requireVVolume())
121  prestage_engine->onBindLFSUV(eg,lfsu,lfsv);
122  if (jacobian_engine->requireUVVolume() or jacobian_engine->requireVVolume())
123  jacobian_engine->onBindLFSUV(eg,lfsu,lfsv);
124  }
125 
126  template<typename EG, typename LFSV>
127  void onBindLFSV(const EG & eg, const LFSV & lfsv)
128  {
129  if (prestage_engine->requireUVVolume() or prestage_engine->requireVVolume())
130  prestage_engine->onBindLFSV(eg,lfsv);
131  if (jacobian_engine->requireUVVolume() or jacobian_engine->requireVVolume())
132  jacobian_engine->onBindLFSV(eg,lfsv);
133  }
134 
135  template<typename IG, typename LFSU, typename LFSV>
136  void onBindLFSUVInside(const IG & ig, const LFSU & lfsu, const LFSV & lfsv)
137  {
138  if (prestage_engine->requireUVVolume() or prestage_engine->requireVVolume())
139  prestage_engine->onBindLFSUVInside(ig,lfsu,lfsv);
140  if (jacobian_engine->requireUVVolume() or jacobian_engine->requireVVolume())
141  jacobian_engine->onBindLFSUVInside(ig,lfsu,lfsv);
142  }
143 
144  template<typename IG, typename LFSU_S, typename LFSV_S, typename LFSU_N, typename LFSV_N>
145  void onBindLFSUVOutside(const IG & ig,
146  const LFSU_S & lfsus, const LFSV_S & lfsvs,
147  const LFSU_N & lfsun, const LFSV_N & lfsvn)
148  {
149  if (prestage_engine->requireSkeleton())
150  prestage_engine->onBindLFSUVOutside(ig,lfsus,lfsvs,lfsun,lfsvn);
151  if (jacobian_engine->requireSkeleton())
152  jacobian_engine->onBindLFSUVOutside(ig,lfsus,lfsvs,lfsun,lfsvn);
153  }
154 
155  template<typename IG, typename LFSV>
156  void onBindLFSVInside(const IG & ig, const LFSV & lfsv)
157  {
158  if (prestage_engine->requireUVVolume() or prestage_engine->requireVVolume())
159  prestage_engine->onBindLFSVInside(ig,lfsv);
160  if (jacobian_engine->requireUVVolume() or jacobian_engine->requireVVolume())
161  jacobian_engine->onBindLFSVInside(ig,lfsv);
162  }
163 
164  template<typename IG, typename LFSV_S, typename LFSV_N>
165  void onBindLFSVOutside(const IG & ig,
166  const LFSV_S & lfsvs,
167  const LFSV_N & lfsvn)
168  {
169  if (prestage_engine->requireSkeleton())
170  prestage_engine->onBindLFSVOutside(ig,lfsvs,lfsvn);
171  if (jacobian_engine->requireSkeleton())
172  jacobian_engine->onBindLFSVOutside(ig,lfsvs,lfsvn);
173  }
174 
176 
180  template<typename EG, typename LFSV>
181  void onUnbindLFSV(const EG & eg, const LFSV & lfsv)
182  {
183  if (prestage_engine->requireUVVolume() or prestage_engine->requireVVolume())
184  prestage_engine->onUnbindLFSV(eg,lfsv);
185  if (jacobian_engine->requireUVVolume() or jacobian_engine->requireVVolume())
186  jacobian_engine->onUnbindLFSV(eg,lfsv);
187  }
188 
189  template<typename IG, typename LFSV>
190  void onUnbindLFSVInside(const IG & ig, const LFSV & lfsv)
191  {
192  if (prestage_engine->requireUVVolume() or prestage_engine->requireVVolume())
193  prestage_engine->onUnbindLFSVInside(ig,lfsv);
194  if (jacobian_engine->requireUVVolume() or jacobian_engine->requireVVolume())
195  jacobian_engine->onUnbindLFSVInside(ig,lfsv);
196  }
197 
198  template<typename IG, typename LFSV_S, typename LFSV_N>
199  void onUnbindLFSVOutside(const IG & ig,
200  const LFSV_S & lfsvs,
201  const LFSV_N & lfsvn)
202  {
203  if (prestage_engine->requireSkeleton())
204  prestage_engine->onUnbindLFSVOutside(ig,lfsvs,lfsvn);
205  if (jacobian_engine->requireSkeleton())
206  jacobian_engine->onUnbindLFSVOutside(ig,lfsvs,lfsvn);
207  }
208 
209  template<typename EG, typename LFSU, typename LFSV>
210  void onUnbindLFSUV(const EG& eg, const LFSU& lfsu, const LFSV& lfsv)
211  {
212  if (prestage_engine->requireUVVolume() or prestage_engine->requireVVolume())
213  prestage_engine->onUnbindLFSUV(eg,lfsu,lfsv);
214  if (jacobian_engine->requireUVVolume() or jacobian_engine->requireVVolume())
215  jacobian_engine->onUnbindLFSUV(eg,lfsu,lfsv);
216  }
217 
218  template<typename IG, typename LFSU, typename LFSV>
219  void onUnbindLFSUVInside(const IG& ig, const LFSU& lfsu, const LFSV& lfsv)
220  {
221  if (prestage_engine->requireUVVolume() or prestage_engine->requireVVolume())
222  prestage_engine->onUnbindLFSUVInside(ig,lfsu,lfsv);
223  if (jacobian_engine->requireUVVolume() or jacobian_engine->requireVVolume())
224  jacobian_engine->onUnbindLFSUVInside(ig,lfsu,lfsv);
225  }
226 
227  template<typename IG, typename LFSU_S, typename LFSV_S, typename LFSU_N, typename LFSV_N>
228  void onUnbindLFSUVOutside(const IG& ig,
229  const LFSU_S& lfsu_s, const LFSV_S& lfsv_s,
230  const LFSU_N& lfsu_n, const LFSV_N& lfsv_n)
231  {
232  if (prestage_engine->requireSkeleton())
233  prestage_engine->onUnbindLFSUVOutside(ig,lfsu_s,lfsv_s,lfsu_n,lfsv_n);
234  if (jacobian_engine->requireSkeleton())
235  jacobian_engine->onUnbindLFSUVOutside(ig,lfsu_s,lfsv_s,lfsu_n,lfsv_n);
236  }
237 
238 
240 
243  template<typename LFSU>
244  void loadCoefficientsLFSUInside(const LFSU & lfsu_s)
245  {
246  if (prestage_engine->requireUVVolume())
247  prestage_engine->loadCoefficientsLFSUInside(lfsu_s);
248  if (jacobian_engine->requireUVVolume())
249  jacobian_engine->loadCoefficientsLFSUInside(lfsu_s);
250  }
251 
252  template<typename LFSU>
253  void loadCoefficientsLFSUOutside(const LFSU & lfsu_n)
254  {
255  if (prestage_engine->requireUVSkeleton())
256  prestage_engine->loadCoefficientsLFSUOutside(lfsu_n);
257  if (jacobian_engine->requireUVSkeleton())
258  jacobian_engine->loadCoefficientsLFSUOutside(lfsu_n);
259  }
260 
261  template<typename LFSU>
262  void loadCoefficientsLFSUCoupling(const LFSU & lfsu_c)
263  {
264  prestage_engine->loadCoefficientsLFSUCoupling(lfsu_c);
265  jacobian_engine->loadCoefficientsLFSUCoupling(lfsu_c);
266  }
268 
271 
272  void preAssembly()
273  {
274  prestage_engine->preAssembly();
275  jacobian_engine->preAssembly();
276  }
277 
278  template<typename GFSU, typename GFSV>
279  void postAssembly(const GFSU& gfsu, const GFSV& gfsv)
280  {
281  prestage_engine->postAssembly(gfsu,gfsv);
282  jacobian_engine->postAssembly(gfsu,gfsv);
283  }
284 
286 
289 
290  template<typename EG>
291  bool assembleCell(const EG & eg)
292  {
293  const bool abort_a = prestage_engine->assembleCell(eg);
294  const bool abort_c = jacobian_engine->assembleCell(eg);
295  return abort_a and abort_c;
296  }
297 
298  template<typename EG, typename LFSU, typename LFSV>
299  void assembleUVVolume(const EG & eg, const LFSU & lfsu, const LFSV & lfsv)
300  {
301  if (prestage_engine->requireUVVolume())
302  prestage_engine->assembleUVVolume(eg,lfsu,lfsv);
303  la.setWeight(-1.0);
304  prestage_engine->setTimeInLastStage();
305  if (jacobian_engine->requireUVVolume())
306  jacobian_engine->assembleUVVolume(eg,lfsu,lfsv);
307  }
308 
309  template<typename EG, typename LFSV>
310  void assembleVVolume(const EG & eg, const LFSV & lfsv)
311  {
312  if (prestage_engine->requireVVolume())
313  prestage_engine->assembleVVolume(eg,lfsv);
314  la.setWeight(-1.0);
315  prestage_engine->setTimeInLastStage();
316  if (jacobian_engine->requireVVolume())
317  jacobian_engine->assembleVVolume(eg,lfsv);
318  }
319 
320  template<typename IG, typename LFSU_S, typename LFSV_S, typename LFSU_N, typename LFSV_N>
321  void assembleUVSkeleton(const IG & ig, const LFSU_S & lfsu_s, const LFSV_S & lfsv_s,
322  const LFSU_N & lfsu_n, const LFSV_N & lfsv_n)
323  {
324  if (prestage_engine->requireUVSkeleton())
325  prestage_engine->assembleUVSkeleton(ig,lfsu_s,lfsv_s,lfsu_n,lfsv_n);
326  la.setWeight(-1.0);
327  if (jacobian_engine->requireUVSkeleton())
328  jacobian_engine->assembleUVSkeleton(ig,lfsu_s,lfsv_s,lfsu_n,lfsv_n);
329  }
330 
331  template<typename IG, typename LFSV_S, typename LFSV_N>
332  void assembleVSkeleton(const IG & ig, const LFSV_S & lfsv_s, const LFSV_N & lfsv_n)
333  {
334  if (prestage_engine->requireVSkeleton())
335  prestage_engine->assembleVSkeleton(ig,lfsv_s,lfsv_n);
336  la.setWeight(-1.0);
337  if (jacobian_engine->requireVSkeleton())
338  jacobian_engine->assembleVSkeleton(ig,lfsv_s,lfsv_n);
339  }
340 
341  template<typename IG, typename LFSU, typename LFSV>
342  void assembleUVBoundary(const IG & ig, const LFSU & lfsu_s, const LFSV & lfsv_s)
343  {
344  if (prestage_engine->requireUVBoundary())
345  prestage_engine->assembleUVBoundary(ig,lfsu_s,lfsv_s);
346  la.setWeight(-1.0);
347  if (jacobian_engine->requireUVBoundary())
348  jacobian_engine->assembleUVBoundary(ig,lfsu_s,lfsv_s);
349  }
350 
351  template<typename IG, typename LFSV>
352  void assembleVBoundary(const IG & ig, const LFSV & lfsv_s)
353  {
354  if (prestage_engine->requireVBoundary())
355  prestage_engine->assembleVBoundary(ig,lfsv_s);
356  la.setWeight(-1.0);
357  if (jacobian_engine->requireVBoundary())
358  jacobian_engine->assembleVBoundary(ig,lfsv_s);
359  }
360 
361  template<typename IG, typename LFSU_S, typename LFSV_S, typename LFSU_N, typename LFSV_N,
362  typename LFSU_C, typename LFSV_C>
364  const LFSU_S & lfsu_s, const LFSV_S & lfsv_s,
365  const LFSU_N & lfsu_n, const LFSV_N & lfsv_n,
366  const LFSU_C & lfsu_coupling, const LFSV_C & lfsv_coupling)
367  {
368  prestage_engine->assembleUVEnrichedCoupling(ig,lfsu_s,lfsv_s,lfsu_n,lfsv_n,lfsu_coupling,lfsv_coupling);
369  la.setWeight(-1.0);
370  jacobian_engine->assembleUVEnrichedCoupling(ig,lfsu_s,lfsv_s,lfsu_n,lfsv_n,lfsu_coupling,lfsv_coupling);
371  }
372 
373  template<typename IG, typename LFSV_S, typename LFSV_N, typename LFSV_C>
374  void assembleVEnrichedCoupling(const IG & ig,
375  const LFSV_S & lfsv_s,
376  const LFSV_N & lfsv_n,
377  const LFSV_C & lfsv_coupling)
378  {
379  prestage_engine->assembleVEnrichedCoupling(ig,lfsv_s,lfsv_n,lfsv_coupling);
380  la.setWeight(-1.0);
381  jacobian_engine->assembleVEnrichedCoupling(ig,lfsv_s,lfsv_n,lfsv_coupling);
382  }
383 
384  template<typename EG, typename LFSU, typename LFSV>
385  void assembleUVVolumePostSkeleton(const EG & eg, const LFSU & lfsu, const LFSV & lfsv)
386  {
387  if (prestage_engine->requireUVVolumePostSkeleton())
388  prestage_engine->assembleUVVolumePostSkeleton(eg,lfsu,lfsv);
389  la.setWeight(-1.0);
390  if (jacobian_engine->requireUVVolumePostSkeleton())
391  jacobian_engine->assembleUVVolumePostSkeleton(eg,lfsu,lfsv);
392  }
393 
394  template<typename EG, typename LFSV>
395  void assembleVVolumePostSkeleton(const EG & eg, const LFSV & lfsv)
396  {
397  if (prestage_engine->requireVVolumePostSkeleton())
398  prestage_engine->assembleVVolumePostSkeleton(eg,lfsv);
399  la.setWeight(-1.0);
400  if (jacobian_engine->requireVVolumePostSkeleton())
401  jacobian_engine->assembleVVolumePostSkeleton(eg,lfsv);
402  }
403 
405 
406  private:
407 
410  LocalAssembler & la;
411 
412  PreStageEngine * prestage_engine;
413  JacobianEngine * jacobian_engine;
414 
415  }; // End of class OneStepJacobianResidualAssemblerEngine
416 
417  }
418 }
419 #endif // DUNE_PDELAB_GRIDOPERATOR_ONESTEP_JACOBIANRESIDUALENGINE_HH
OneStepExplicitLocalJacobianResidualAssemblerEngine(LocalAssembler &local_assembler_)
Constructor.
Definition: jacobianresidualengine.hh:47
OSLA::Real Real
The type for real numbers.
Definition: jacobianresidualengine.hh:33
const IG & ig
Definition: constraints.hh:148
void assembleUVEnrichedCoupling(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s, const LFSU_N &lfsu_n, const LFSV_N &lfsv_n, const LFSU_C &lfsu_coupling, const LFSV_C &lfsv_coupling)
Definition: jacobianresidualengine.hh:363
OSLA LocalAssembler
Definition: jacobianresidualengine.hh:35
void assembleVBoundary(const IG &ig, const LFSV &lfsv_s)
Definition: jacobianresidualengine.hh:352
void assembleVSkeleton(const IG &ig, const LFSV_S &lfsv_s, const LFSV_N &lfsv_n)
Definition: jacobianresidualengine.hh:332
OSLA OneStepLocalAssembler
The type of the wrapping local assembler.
Definition: jacobianresidualengine.hh:24
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)
Definition: jacobianresidualengine.hh:321
void onUnbindLFSUV(const EG &eg, const LFSU &lfsu, const LFSV &lfsv)
Definition: jacobianresidualengine.hh:210
bool requireUVVolume() const
Definition: jacobianresidualengine.hh:73
bool requireUVVolumePostSkeleton() const
Definition: jacobianresidualengine.hh:97
bool assembleCell(const EG &eg)
Definition: jacobianresidualengine.hh:291
void onUnbindLFSV(const EG &eg, const LFSV &lfsv)
Definition: jacobianresidualengine.hh:181
void postAssembly(const GFSU &gfsu, const GFSV &gfsv)
Definition: jacobianresidualengine.hh:279
void assembleUVVolume(const EG &eg, const LFSU &lfsu, const LFSV &lfsv)
Definition: jacobianresidualengine.hh:299
bool requireSkeleton() const
Definition: jacobianresidualengine.hh:65
const LocalAssembler & localAssembler() const
Public access to the wrapping local assembler.
Definition: jacobianresidualengine.hh:109
void onBindLFSV(const EG &eg, const LFSV &lfsv)
Definition: jacobianresidualengine.hh:127
void onUnbindLFSVOutside(const IG &ig, const LFSV_S &lfsvs, const LFSV_N &lfsvn)
Definition: jacobianresidualengine.hh:199
void assembleUVVolumePostSkeleton(const EG &eg, const LFSU &lfsu, const LFSV &lfsv)
Definition: jacobianresidualengine.hh:385
For backward compatibility – Do not use this!
Definition: adaptivity.hh:27
void setLocalPreStageEngine(PreStageEngine &prestage_engine_)
Definition: jacobianresidualengine.hh:53
void onUnbindLFSUVInside(const IG &ig, const LFSU &lfsu, const LFSV &lfsv)
Definition: jacobianresidualengine.hh:219
LocalAssembler::LocalPreStageAssemblerEngine PreStageEngine
Definition: jacobianresidualengine.hh:36
void loadCoefficientsLFSUInside(const LFSU &lfsu_s)
Definition: jacobianresidualengine.hh:244
LocalAssembler::LocalResidualAssemblerEngine ResidualEngine
Definition: jacobianresidualengine.hh:37
bool requireUVBoundary() const
Definition: jacobianresidualengine.hh:89
void setLocalJacobianEngine(JacobianEngine &jacobian_engine_)
Definition: jacobianresidualengine.hh:58
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)
Definition: jacobianresidualengine.hh:228
void onBindLFSUV(const EG &eg, const LFSU &lfsu, const LFSV &lfsv)
Definition: jacobianresidualengine.hh:118
The local assembler engine for DUNE grids which assembles the residual vector.
Definition: jacobianresidualengine.hh:19
void assembleVVolume(const EG &eg, const LFSV &lfsv)
Definition: jacobianresidualengine.hh:310
void onBindLFSVInside(const IG &ig, const LFSV &lfsv)
Definition: jacobianresidualengine.hh:156
LocalAssembler::LocalAssemblerDT1::LocalJacobianAssemblerEngine JacobianEngine
Definition: jacobianresidualengine.hh:38
bool requireSkeletonTwoSided() const
Definition: jacobianresidualengine.hh:69
void onBindLFSVOutside(const IG &ig, const LFSV_S &lfsvs, const LFSV_N &lfsvn)
Definition: jacobianresidualengine.hh:165
void preAssembly()
Definition: jacobianresidualengine.hh:272
bool needsConstraintsCaching(const TrialConstraintsContainer &cu, const TestConstraintsContainer &cv) const
Definition: jacobianresidualengine.hh:27
void onBindLFSUVOutside(const IG &ig, const LFSU_S &lfsus, const LFSV_S &lfsvs, const LFSU_N &lfsun, const LFSV_N &lfsvn)
Definition: jacobianresidualengine.hh:145
bool requireUVSkeleton() const
Definition: jacobianresidualengine.hh:81
void loadCoefficientsLFSUCoupling(const LFSU &lfsu_c)
Definition: jacobianresidualengine.hh:262
bool requireVSkeleton() const
Definition: jacobianresidualengine.hh:85
bool requireVBoundary() const
Definition: jacobianresidualengine.hh:93
void assembleVVolumePostSkeleton(const EG &eg, const LFSV &lfsv)
Definition: jacobianresidualengine.hh:395
Base class for LocalAssemblerEngine implementations to avoid boilerplate code.
Definition: localassemblerenginebase.hh:21
void loadCoefficientsLFSUOutside(const LFSU &lfsu_n)
Definition: jacobianresidualengine.hh:253
void onUnbindLFSVInside(const IG &ig, const LFSV &lfsv)
Definition: jacobianresidualengine.hh:190
void assembleUVBoundary(const IG &ig, const LFSU &lfsu_s, const LFSV &lfsv_s)
Definition: jacobianresidualengine.hh:342
void onBindLFSUVInside(const IG &ig, const LFSU &lfsu, const LFSV &lfsv)
Definition: jacobianresidualengine.hh:136
bool requireVVolumePostSkeleton() const
Definition: jacobianresidualengine.hh:101
bool requireVVolume() const
Definition: jacobianresidualengine.hh:77
void assembleVEnrichedCoupling(const IG &ig, const LFSV_S &lfsv_s, const LFSV_N &lfsv_n, const LFSV_C &lfsv_coupling)
Definition: jacobianresidualengine.hh:374