dune-pdelab  2.5-dev
prestageengine.hh
Go to the documentation of this file.
1 #ifndef DUNE_PDELAB_GRIDOPERATOR_ONESTEP_PRESTAGEENGINE_HH
2 #define DUNE_PDELAB_GRIDOPERATOR_ONESTEP_PRESTAGEENGINE_HH
3 
5 #include <cmath>
6 #include <vector>
7 
8 namespace Dune{
9  namespace PDELab{
10 
18  template<typename OSLA>
20  : public OneStepLocalAssemblerEngineBase<OSLA,
21  typename OSLA::LocalAssemblerDT0::LocalResidualAssemblerEngine,
22  typename OSLA::LocalAssemblerDT1::LocalResidualAssemblerEngine
23  >
24  {
25 
27  typename OSLA::LocalAssemblerDT0::LocalResidualAssemblerEngine,
28  typename OSLA::LocalAssemblerDT1::LocalResidualAssemblerEngine
29  > BaseT;
30 
31  using BaseT::la;
32  using BaseT::lae0;
33  using BaseT::lae1;
34  using BaseT::implicit;
37 
38  public:
40  typedef OSLA LocalAssembler;
41 
44  typedef typename OSLA::LocalAssemblerDT0 LocalAssemblerDT0;
45  typedef typename OSLA::LocalAssemblerDT1 LocalAssemblerDT1;
46 
47  typedef typename LocalAssemblerDT0::LocalResidualAssemblerEngine ResidualEngineDT0;
48  typedef typename LocalAssemblerDT1::LocalResidualAssemblerEngine ResidualEngineDT1;
50 
52  typedef typename OSLA::Traits::Residual Residual;
53  typedef typename Residual::ElementType ResidualElement;
54 
56  typedef typename OSLA::Traits::Solution Solution;
57  typedef typename Solution::ElementType SolutionElement;
58 
60  typedef typename OSLA::Real Real;
61 
63  typedef std::vector<Solution*> Solutions;
64 
72  : BaseT(la_),
73  invalid_residual(static_cast<Residual*>(0)),
74  invalid_solutions(static_cast<Solutions*>(0)),
75  const_residual_0(invalid_residual),
76  const_residual_1(invalid_residual),
77  solutions(invalid_solutions)
78  {}
79 
82  bool requireSkeleton() const
83  { return lae0->requireSkeleton() || lae1->requireSkeleton(); }
85 
88  void setSolutions(const Solutions & solutions_){
89  solutions = &solutions_;
90  }
91 
94  void setConstResiduals(Residual & const_residual_0_, Residual & const_residual_1_){
95  const_residual_0 = &const_residual_0_;
96  const_residual_1 = &const_residual_1_;
97 
98  // Initialize the engines of the two wrapped local assemblers
99  assert(solutions != invalid_solutions);
100  setLocalAssemblerEngineDT0(la.la0.localResidualAssemblerEngine(*const_residual_0,*((*solutions)[0])));
101  setLocalAssemblerEngineDT1(la.la1.localResidualAssemblerEngine(*const_residual_1,*((*solutions)[0])));
102  }
103 
106  void setConstResidual(Residual & const_residual_){
107  const_residual_0 = &const_residual_;
108  const_residual_1 = &const_residual_;
109 
110  // Initialize the engines of the two wrapped local assemblers
111  assert(solutions != invalid_solutions);
112  setLocalAssemblerEngineDT0(la.la0.localResidualAssemblerEngine(*const_residual_0,*((*solutions)[0])));
113  setLocalAssemblerEngineDT1(la.la1.localResidualAssemblerEngine(*const_residual_1,*((*solutions)[0])));
114  }
115 
120  template<typename LFSU>
121  void loadCoefficientsLFSUInside(const LFSU & lfsu_s){}
122  template<typename LFSU>
123  void loadCoefficientsLFSUOutside(const LFSU & lfsu_n){}
124  template<typename LFSU>
125  void loadCoefficientsLFSUCoupling(const LFSU & lfsu_c){}
127 
132  {
133  la.la1.setTime(la.time+la.osp_method->d(la.stage)*la.dt);
134  }
135 
138  void preAssembly()
139  {
140  lae0->preAssembly();
141  lae1->preAssembly();
142 
143  *const_residual_0 = 0.0;
144  *const_residual_1 = 0.0;
145 
146  // Extract the coefficients of the time step scheme
147  a.resize(la.stage);
148  b.resize(la.stage);
149  d.resize(la.stage);
150  do0.resize(la.stage);
151  do1.resize(la.stage);
152  for (int i=0; i<la.stage; ++i){
153  a[i] = la.osp_method->a(la.stage,i);
154  b[i] = la.osp_method->b(la.stage,i);
155  d[i] = la.osp_method->d(i);
156  do0[i] = ( std::abs(b[i]) > 1E-6 );
157  do1[i] = ( std::abs(a[i]) > 1E-6 );
158  }
159 
160  // prepare local operators for stage
161  la.la0.preStage(la.time+la.osp_method->d(la.stage)*la.dt,la.stage);
162  la.la1.preStage(la.time+la.osp_method->d(la.stage)*la.dt,la.stage);
163  }
164 
165  template<typename GFSU, typename GFSV>
166  void postAssembly(const GFSU& gfsu, const GFSV& gfsv)
167  {
168  lae0->postAssembly(gfsu,gfsv);
169  lae1->postAssembly(gfsu,gfsv);
170  }
172 
175 
176  template<typename EG, typename LFSU, typename LFSV>
177  void assembleUVVolume(const EG & eg, const LFSU & lfsu, const LFSV & lfsv)
178  {
179  for (int s=0; s<la.stage; ++s){
180  // Reset the time in the local assembler
181  la.la0.setTime(la.time+d[s]*la.dt);
182  la.la1.setTime(la.time+d[s]*la.dt);
183 
184  lae0->setSolution(*((*solutions)[s]));
185  lae1->setSolution(*((*solutions)[s]));
186 
187  lae0->loadCoefficientsLFSUInside(lfsu);
188  lae1->loadCoefficientsLFSUInside(lfsu);
189 
190  if(do0[s]){
191  la.la0.setWeight(b[s]*la.dt_factor0);
192  lae0->assembleUVVolume(eg,lfsu,lfsv);
193  }
194 
195  if(do1[s]){
196  la.la1.setWeight(a[s]*la.dt_factor1);
197  lae1->assembleUVVolume(eg,lfsu,lfsv);
198  }
199  }
200  }
201 
202  template<typename EG, typename LFSV>
203  void assembleVVolume(const EG & eg, const LFSV & lfsv)
204  {
205  for (int s=0; s<la.stage; ++s){
206  // Reset the time in the local assembler
207  la.la0.setTime(la.time+d[s]*la.dt);
208  la.la1.setTime(la.time+d[s]*la.dt);
209 
210  if(do0[s]){
211  la.la0.setWeight(b[s]*la.dt_factor0);
212  lae0->assembleVVolume(eg,lfsv);
213  }
214 
215  if(do1[s]){
216  la.la1.setWeight(a[s]*la.dt_factor1);
217  lae1->assembleVVolume(eg,lfsv);
218  }
219 
220  }
221  }
222 
223  template<typename IG, typename LFSU_S, typename LFSV_S, typename LFSU_N, typename LFSV_N>
224  void assembleUVSkeleton(const IG & ig, const LFSU_S & lfsu_s, const LFSV_S & lfsv_s,
225  const LFSU_N & lfsu_n, const LFSV_N & lfsv_n)
226  {
227  for (int s=0; s<la.stage; ++s){
228  // Reset the time in the local assembler
229  la.la0.setTime(la.time+d[s]*la.dt);
230  la.la1.setTime(la.time+d[s]*la.dt);
231 
232  lae0->setSolution(*((*solutions)[s]));
233  lae1->setSolution(*((*solutions)[s]));
234 
235  lae0->loadCoefficientsLFSUInside(lfsu_s);
236  lae1->loadCoefficientsLFSUInside(lfsu_s);
237  lae0->loadCoefficientsLFSUOutside(lfsu_n);
238  lae1->loadCoefficientsLFSUOutside(lfsu_n);
239 
240  if(do0[s]){
241  la.la0.setWeight(b[s]*la.dt_factor0);
242  lae0->setSolution(*((*solutions)[s]));
243  lae0->assembleUVSkeleton(ig,lfsu_s,lfsv_s,lfsu_n,lfsv_n);
244  }
245 
246  if(do1[s]){
247  la.la1.setWeight(a[s]*la.dt_factor1);
248  lae1->setSolution(*((*solutions)[s]));
249  lae1->assembleUVSkeleton(ig,lfsu_s,lfsv_s,lfsu_n,lfsv_n);
250  }
251  }
252  }
253 
254  template<typename IG, typename LFSV_S, typename LFSV_N>
255  void assembleVSkeleton(const IG & ig, const LFSV_S & lfsv_s, const LFSV_N & lfsv_n)
256  {
257  for (int s=0; s<la.stage; ++s){
258  // Reset the time in the local assembler
259  la.la0.setTime(la.time+d[s]*la.dt);
260  la.la1.setTime(la.time+d[s]*la.dt);
261 
262  if(do0[s]){
263  la.la0.setWeight(b[s]*la.dt_factor0);
264  lae0->assembleVSkeleton(ig,lfsv_s,lfsv_n);
265  }
266 
267  if(do1[s]){
268  la.la1.setWeight(a[s]*la.dt_factor1);
269  lae1->assembleVSkeleton(ig,lfsv_s,lfsv_n);
270  }
271  }
272  }
273 
274  template<typename IG, typename LFSU_S, typename LFSV_S>
275  void assembleUVBoundary(const IG & ig, const LFSU_S & lfsu_s, const LFSV_S & lfsv_s)
276  {
277  for (int s=0; s<la.stage; ++s){
278  // Reset the time in the local assembler
279  la.la0.setTime(la.time+d[s]*la.dt);
280  la.la1.setTime(la.time+d[s]*la.dt);
281 
282  lae0->setSolution(*((*solutions)[s]));
283  lae1->setSolution(*((*solutions)[s]));
284 
285  lae0->loadCoefficientsLFSUInside(lfsu_s);
286  lae1->loadCoefficientsLFSUInside(lfsu_s);
287 
288  if(do0[s]){
289  la.la0.setWeight(b[s]*la.dt_factor0);
290  lae0->assembleUVBoundary(ig,lfsu_s,lfsv_s);
291  }
292 
293  if(do1[s]){
294  la.la1.setWeight(a[s]*la.dt_factor1);
295  lae1->assembleUVBoundary(ig,lfsu_s,lfsv_s);
296  }
297  }
298  }
299 
300  template<typename IG, typename LFSV_S>
301  void assembleVBoundary(const IG & ig, const LFSV_S & lfsv_s)
302  {
303  for (int s=0; s<la.stage; ++s){
304  // Reset the time in the local assembler
305  la.la0.setTime(la.time+d[s]*la.dt);
306  la.la1.setTime(la.time+d[s]*la.dt);
307 
308  if(do0[s]){
309  la.la0.setWeight(b[s]*la.dt_factor0);
310  lae0->assembleVBoundary(ig,lfsv_s);
311  }
312 
313  if(do1[s]){
314  la.la1.setWeight(a[s]*la.dt_factor1);
315  lae1->assembleVBoundary(ig,lfsv_s);
316  }
317  }
318  }
319 
320  template<typename IG, typename LFSU_S, typename LFSV_S>
321  void assembleUVProcessor(const IG & ig, const LFSU_S & lfsu_s, const LFSV_S & lfsv_s)
322  {
323  for (int s=0; s<la.stage; ++s){
324  // Reset the time in the local assembler
325  la.la0.setTime(la.time+d[s]*la.dt);
326  la.la1.setTime(la.time+d[s]*la.dt);
327 
328  lae0->setSolution(*((*solutions)[s]));
329  lae1->setSolution(*((*solutions)[s]));
330 
331  lae0->loadCoefficientsLFSUInside(lfsu_s);
332  lae1->loadCoefficientsLFSUInside(lfsu_s);
333 
334  if(do0[s]){
335  la.la0.setWeight(b[s]*la.dt_factor0);
336  lae0->assembleUVProcessor(ig,lfsu_s,lfsv_s);
337  }
338 
339  if(do1[s]){
340  la.la1.setWeight(a[s]*la.dt_factor1);
341  lae1->assembleUVProcessor(ig,lfsu_s,lfsv_s);
342  }
343  }
344  }
345 
346  template<typename IG, typename LFSV_S>
347  void assembleVProcessor(const IG & ig, const LFSV_S & lfsv_s)
348  {
349  for (int s=0; s<la.stage; ++s){
350  // Reset the time in the local assembler
351  la.la0.setTime(la.time+d[s]*la.dt);
352  la.la1.setTime(la.time+d[s]*la.dt);
353 
354  if(do0[s]){
355  la.la0.setWeight(b[s]*la.dt_factor0);
356  lae0->assembleVProcessor(ig,lfsv_s);
357  }
358 
359  if(do1[s]){
360  la.la1.setWeight(a[s]*la.dt_factor1);
361  lae1->assembleVProcessor(ig,lfsv_s);
362  }
363  }
364  }
365 
366  template<typename IG, typename LFSU_S, typename LFSV_S, typename LFSU_N, typename LFSV_N,
367  typename LFSU_C, typename LFSV_C>
369  const LFSU_S & lfsu_s, const LFSV_S & lfsv_s,
370  const LFSU_N & lfsu_n, const LFSV_N & lfsv_n,
371  const LFSU_C & lfsu_c, const LFSV_C & lfsv_c)
372  {
373  for (int s=0; s<la.stage; ++s){
374  // Reset the time in the local assembler
375  la.la0.setTime(la.time+d[s]*la.dt);
376  la.la1.setTime(la.time+d[s]*la.dt);
377 
378  lae0->setSolution(*((*solutions)[s]));
379  lae1->setSolution(*((*solutions)[s]));
380 
381  lae0->loadCoefficientsLFSUInside(lfsu_s);
382  lae1->loadCoefficientsLFSUInside(lfsu_s);
383 
384  lae0->loadCoefficientsLFSUOutside(lfsu_n);
385  lae1->loadCoefficientsLFSUOutside(lfsu_n);
386 
387  lae0->loadCoefficientsLFSUCoupling(lfsu_c);
388  lae1->loadCoefficientsLFSUCoupling(lfsu_c);
389 
390  if(do0[s]){
391  la.la0.setWeight(b[s]*la.dt_factor0);
392  lae0->assembleUVEnrichedCoupling(ig,lfsu_s,lfsv_s,lfsu_n,lfsv_n,lfsu_c,lfsv_c);
393  }
394 
395  if(do1[s]){
396  la.la1.setWeight(a[s]*la.dt_factor1);
397  lae1->assembleUVEnrichedCoupling(ig,lfsu_s,lfsv_s,lfsu_n,lfsv_n,lfsu_c,lfsv_c);
398  }
399  }
400  }
401 
402  template<typename IG, typename LFSV_S, typename LFSV_N, typename LFSV_C>
403  void assembleVEnrichedCoupling(const IG & ig,
404  const LFSV_S & lfsv_s,
405  const LFSV_N & lfsv_n,
406  const LFSV_C & lfsv_c)
407  {
408  for (int s=0; s<la.stage; ++s){
409  // Reset the time in the local assembler
410  la.la0.setTime(la.time+d[s]*la.dt);
411  la.la1.setTime(la.time+d[s]*la.dt);
412 
413  if(do0[s]){
414  la.la0.setWeight(b[s]*la.dt_factor0);
415  lae0->assembleVEnrichedCoupling(ig,lfsv_s,lfsv_n,lfsv_c);
416  }
417 
418  if(do1[s]){
419  la.la1.setWeight(a[s]*la.dt_factor1);
420  lae1->assembleVEnrichedCoupling(ig,lfsv_s,lfsv_n,lfsv_c);
421  }
422 
423  }
424  }
425 
426  template<typename EG, typename LFSU, typename LFSV>
427  void assembleUVVolumePostSkeleton(const EG & eg, const LFSU & lfsu, const LFSV & lfsv)
428  {
429  for (int s=0; s<la.stage; ++s){
430  // Reset the time in the local assembler
431  la.la0.setTime(la.time+d[s]*la.dt);
432  la.la1.setTime(la.time+d[s]*la.dt);
433 
434  lae0->setSolution(*((*solutions)[s]));
435  lae1->setSolution(*((*solutions)[s]));
436 
437  lae0->loadCoefficientsLFSUInside(lfsu);
438  lae1->loadCoefficientsLFSUInside(lfsu);
439 
440  if(do0[s]){
441  la.la0.setWeight(b[s]*la.dt_factor0);
442  lae0->assembleUVVolumePostSkeleton(eg,lfsu,lfsv);
443  }
444 
445  if(do1[s]){
446  la.la1.setWeight(a[s]*la.dt_factor1);
447  lae1->assembleUVVolumePostSkeleton(eg,lfsu,lfsv);
448  }
449 
450  }
451  }
452 
453  template<typename EG, typename LFSV>
454  void assembleVVolumePostSkeleton(const EG & eg, const LFSV & lfsv)
455  {
456  for (int s=0; s<la.stage; ++s){
457  // Reset the time in the local assembler
458  la.la0.setTime(la.time+d[s]*la.dt);
459  la.la1.setTime(la.time+d[s]*la.dt);
460 
461  if(do0[s]){
462  la.la0.setWeight(b[s]*la.dt_factor0);
463  lae0->assembleVVolumePostSkeleton(eg,lfsv);
464  }
465 
466  if(do1[s]){
467  la.la1.setWeight(a[s]*la.dt_factor1);
468  lae1->assembleVVolumePostSkeleton(eg,lfsv);
469  }
470  }
471  }
473 
474  private:
475 
477  Residual * const invalid_residual;
478 
480  Solutions * const invalid_solutions;
481 
486  Residual * const_residual_0;
487  Residual * const_residual_1;
489 
491  const Solutions * solutions;
492 
494  std::vector<Real> a;
495  std::vector<Real> b;
496  std::vector<Real> d;
497  std::vector<bool> do0;
498  std::vector<bool> do1;
499 
500  }; // End of class OneStepLocalPreStageAssemblerEngine
501 
502  }
503 }
504 #endif // DUNE_PDELAB_GRIDOPERATOR_ONESTEP_PRESTAGEENGINE_HH
OneStepLocalPreStageAssemblerEngine(LocalAssembler &la_)
Constructor.
Definition: prestageengine.hh:71
const IG & ig
Definition: constraints.hh:148
void loadCoefficientsLFSUOutside(const LFSU &lfsu_n)
Definition: prestageengine.hh:123
void preAssembly()
Definition: prestageengine.hh:138
void postAssembly(const GFSU &gfsu, const GFSV &gfsv)
Definition: prestageengine.hh:166
const LocalAssembler & la
Definition: enginebase.hh:437
void assembleUVVolume(const EG &eg, const LFSU &lfsu, const LFSV &lfsv)
Definition: prestageengine.hh:177
const std::string s
Definition: function.hh:1101
LocalAssemblerEngineDT1 * lae1
Definition: enginebase.hh:440
void assembleUVProcessor(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s)
Definition: prestageengine.hh:321
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: prestageengine.hh:224
void setSolutions(const Solutions &solutions_)
Definition: prestageengine.hh:88
void assembleVBoundary(const IG &ig, const LFSV_S &lfsv_s)
Definition: prestageengine.hh:301
void loadCoefficientsLFSUCoupling(const LFSU &lfsu_c)
Definition: prestageengine.hh:125
The local assembler engine for UDG sub triangulations which assembles the residual vector...
Definition: enginebase.hh:15
OSLA::LocalAssemblerDT0 LocalAssemblerDT0
Definition: prestageengine.hh:44
Solution::ElementType SolutionElement
Definition: prestageengine.hh:57
bool requireSkeleton() const
Definition: prestageengine.hh:82
The local assembler engine for one step methods which assembles the constant part of the residual vec...
Definition: prestageengine.hh:19
void setConstResidual(Residual &const_residual_)
Definition: prestageengine.hh:106
void setLocalAssemblerEngineDT1(LocalAssemblerEngineDT1 &lae1_)
Definition: enginebase.hh:121
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_c, const LFSV_C &lfsv_c)
Definition: prestageengine.hh:368
void assembleVVolumePostSkeleton(const EG &eg, const LFSV &lfsv)
Definition: prestageengine.hh:454
void assembleVEnrichedCoupling(const IG &ig, const LFSV_S &lfsv_s, const LFSV_N &lfsv_n, const LFSV_C &lfsv_c)
Definition: prestageengine.hh:403
bool implicit
Definition: enginebase.hh:442
OSLA LocalAssembler
The type of the wrapping local assembler.
Definition: prestageengine.hh:40
Residual::ElementType ResidualElement
Definition: prestageengine.hh:53
LocalAssemblerDT1::LocalResidualAssemblerEngine ResidualEngineDT1
Definition: prestageengine.hh:48
OSLA::LocalAssemblerDT1 LocalAssemblerDT1
Definition: prestageengine.hh:45
OSLA::Traits::Solution Solution
The type of the solution vector.
Definition: prestageengine.hh:56
void loadCoefficientsLFSUInside(const LFSU &lfsu_s)
Definition: prestageengine.hh:121
OSLA::Traits::Residual Residual
The type of the residual vector.
Definition: prestageengine.hh:52
void assembleVProcessor(const IG &ig, const LFSV_S &lfsv_s)
Definition: prestageengine.hh:347
void assembleUVVolumePostSkeleton(const EG &eg, const LFSU &lfsu, const LFSV &lfsv)
Definition: prestageengine.hh:427
For backward compatibility – Do not use this!
Definition: adaptivity.hh:27
void setLocalAssemblerEngineDT0(LocalAssemblerEngineDT0 &lae0_)
Definition: enginebase.hh:116
void assembleUVBoundary(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s)
Definition: prestageengine.hh:275
void setTimeInLastStage()
Definition: prestageengine.hh:131
void assembleVVolume(const EG &eg, const LFSV &lfsv)
Definition: prestageengine.hh:203
void setConstResiduals(Residual &const_residual_0_, Residual &const_residual_1_)
Definition: prestageengine.hh:94
void assembleVSkeleton(const IG &ig, const LFSV_S &lfsv_s, const LFSV_N &lfsv_n)
Definition: prestageengine.hh:255
LocalAssemblerDT0::LocalResidualAssemblerEngine ResidualEngineDT0
Definition: prestageengine.hh:47
std::vector< Solution * > Solutions
The type of the solution container.
Definition: prestageengine.hh:63
LocalAssemblerEngineDT0 * lae0
Definition: enginebase.hh:439
OSLA::Real Real
The type for real numbers.
Definition: prestageengine.hh:60