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