1 #ifndef DUNE_PDELAB_ONESTEP_PRESTAGEENGINE_HH
2 #define DUNE_PDELAB_ONESTEP_PRESTAGEENGINE_HH
18 template<
typename OSLA>
21 typename OSLA::LocalAssemblerDT0::LocalResidualAssemblerEngine,
22 typename OSLA::LocalAssemblerDT1::LocalResidualAssemblerEngine
27 typename OSLA::LocalAssemblerDT0::LocalResidualAssemblerEngine,
28 typename OSLA::LocalAssemblerDT1::LocalResidualAssemblerEngine
52 typedef typename OSLA::Traits::Residual
Residual;
56 typedef typename OSLA::Traits::Solution
Solution;
60 typedef typename OSLA::Real
Real;
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)
83 {
return lae0->requireSkeleton() ||
lae1->requireSkeleton(); }
89 solutions = &solutions_;
95 const_residual_0 = &const_residual_0_;
96 const_residual_1 = &const_residual_1_;
99 assert(solutions != invalid_solutions);
107 const_residual_0 = &const_residual_;
108 const_residual_1 = &const_residual_;
111 assert(solutions != invalid_solutions);
120 template<
typename LFSU>
122 template<
typename LFSU>
124 template<
typename LFSU>
133 la.la1.setTime(
la.time+
la.osp_method->d(
la.stage)*
la.dt);
143 *const_residual_0 = 0.0;
144 *const_residual_1 = 0.0;
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 );
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);
165 template<
typename GFSU,
typename GFSV>
168 lae0->postAssembly(gfsu,gfsv);
169 lae1->postAssembly(gfsu,gfsv);
176 template<
typename EG,
typename LFSU,
typename LFSV>
179 for (
int s=0;
s<
la.stage; ++
s){
181 la.la0.setTime(
la.time+d[
s]*
la.dt);
182 la.la1.setTime(
la.time+d[s]*
la.dt);
184 lae0->setSolution(*((*solutions)[s]));
185 lae1->setSolution(*((*solutions)[s]));
187 lae0->loadCoefficientsLFSUInside(lfsu);
188 lae1->loadCoefficientsLFSUInside(lfsu);
191 la.la0.setWeight(b[s]*
la.dt_factor0);
192 lae0->assembleUVVolume(eg,lfsu,lfsv);
196 la.la1.setWeight(a[s]*
la.dt_factor1);
197 lae1->assembleUVVolume(eg,lfsu,lfsv);
202 template<
typename EG,
typename LFSV>
205 for (
int s=0;
s<
la.stage; ++
s){
207 la.la0.setTime(
la.time+d[
s]*
la.dt);
208 la.la1.setTime(
la.time+d[s]*
la.dt);
211 la.la0.setWeight(b[s]*
la.dt_factor0);
212 lae0->assembleVVolume(eg,lfsv);
216 la.la1.setWeight(a[s]*
la.dt_factor1);
217 lae1->assembleVVolume(eg,lfsv);
223 template<
typename IG,
typename LFSU_S,
typename LFSV_S,
typename LFSU_N,
typename LFSV_N>
225 const LFSU_N & lfsu_n,
const LFSV_N & lfsv_n)
227 for (
int s=0;
s<
la.stage; ++
s){
229 la.la0.setTime(
la.time+d[
s]*
la.dt);
230 la.la1.setTime(
la.time+d[s]*
la.dt);
232 lae0->setSolution(*((*solutions)[s]));
233 lae1->setSolution(*((*solutions)[s]));
235 lae0->loadCoefficientsLFSUInside(lfsu_s);
236 lae1->loadCoefficientsLFSUInside(lfsu_s);
237 lae0->loadCoefficientsLFSUOutside(lfsu_n);
238 lae1->loadCoefficientsLFSUOutside(lfsu_n);
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);
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);
254 template<
typename IG,
typename LFSV_S,
typename LFSV_N>
257 for (
int s=0;
s<
la.stage; ++
s){
259 la.la0.setTime(
la.time+d[
s]*
la.dt);
260 la.la1.setTime(
la.time+d[s]*
la.dt);
263 la.la0.setWeight(b[s]*
la.dt_factor0);
264 lae0->assembleVSkeleton(ig,lfsv_s,lfsv_n);
268 la.la1.setWeight(a[s]*
la.dt_factor1);
269 lae1->assembleVSkeleton(ig,lfsv_s,lfsv_n);
274 template<
typename IG,
typename LFSU_S,
typename LFSV_S>
277 for (
int s=0;
s<
la.stage; ++
s){
279 la.la0.setTime(
la.time+d[
s]*
la.dt);
280 la.la1.setTime(
la.time+d[s]*
la.dt);
282 lae0->setSolution(*((*solutions)[s]));
283 lae1->setSolution(*((*solutions)[s]));
285 lae0->loadCoefficientsLFSUInside(lfsu_s);
286 lae1->loadCoefficientsLFSUInside(lfsu_s);
289 la.la0.setWeight(b[s]*
la.dt_factor0);
290 lae0->assembleUVBoundary(ig,lfsu_s,lfsv_s);
294 la.la1.setWeight(a[s]*
la.dt_factor1);
295 lae1->assembleUVBoundary(ig,lfsu_s,lfsv_s);
300 template<
typename IG,
typename LFSV_S>
303 for (
int s=0;
s<
la.stage; ++
s){
305 la.la0.setTime(
la.time+d[
s]*
la.dt);
306 la.la1.setTime(
la.time+d[s]*
la.dt);
309 la.la0.setWeight(b[s]*
la.dt_factor0);
310 lae0->assembleVBoundary(ig,lfsv_s);
314 la.la1.setWeight(a[s]*
la.dt_factor1);
315 lae1->assembleVBoundary(ig,lfsv_s);
320 template<
typename IG,
typename LFSU_S,
typename LFSV_S>
323 for (
int s=0;
s<
la.stage; ++
s){
325 la.la0.setTime(
la.time+d[
s]*
la.dt);
326 la.la1.setTime(
la.time+d[s]*
la.dt);
328 lae0->setSolution(*((*solutions)[s]));
329 lae1->setSolution(*((*solutions)[s]));
331 lae0->loadCoefficientsLFSUInside(lfsu_s);
332 lae1->loadCoefficientsLFSUInside(lfsu_s);
335 la.la0.setWeight(b[s]*
la.dt_factor0);
336 lae0->assembleUVProcessor(ig,lfsu_s,lfsv_s);
340 la.la1.setWeight(a[s]*
la.dt_factor1);
341 lae1->assembleUVProcessor(ig,lfsu_s,lfsv_s);
346 template<
typename IG,
typename LFSV_S>
349 for (
int s=0;
s<
la.stage; ++
s){
351 la.la0.setTime(
la.time+d[
s]*
la.dt);
352 la.la1.setTime(
la.time+d[s]*
la.dt);
355 la.la0.setWeight(b[s]*
la.dt_factor0);
356 lae0->assembleVProcessor(ig,lfsv_s);
360 la.la1.setWeight(a[s]*
la.dt_factor1);
361 lae1->assembleVProcessor(ig,lfsv_s);
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)
373 for (
int s=0;
s<
la.stage; ++
s){
375 la.la0.setTime(
la.time+d[
s]*
la.dt);
376 la.la1.setTime(
la.time+d[s]*
la.dt);
378 lae0->setSolution(*((*solutions)[s]));
379 lae1->setSolution(*((*solutions)[s]));
381 lae0->loadCoefficientsLFSUInside(lfsu_s);
382 lae1->loadCoefficientsLFSUInside(lfsu_s);
384 lae0->loadCoefficientsLFSUOutside(lfsu_n);
385 lae1->loadCoefficientsLFSUOutside(lfsu_n);
387 lae0->loadCoefficientsLFSUCoupling(lfsu_c);
388 lae1->loadCoefficientsLFSUCoupling(lfsu_c);
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);
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);
402 template<
typename IG,
typename LFSV_S,
typename LFSV_N,
typename LFSV_C>
404 const LFSV_S & lfsv_s,
405 const LFSV_N & lfsv_n,
406 const LFSV_C & lfsv_c)
408 for (
int s=0;
s<
la.stage; ++
s){
410 la.la0.setTime(
la.time+d[
s]*
la.dt);
411 la.la1.setTime(
la.time+d[s]*
la.dt);
414 la.la0.setWeight(b[s]*
la.dt_factor0);
415 lae0->assembleVEnrichedCoupling(ig,lfsv_s,lfsv_n,lfsv_c);
419 la.la1.setWeight(a[s]*
la.dt_factor1);
420 lae1->assembleVEnrichedCoupling(ig,lfsv_s,lfsv_n,lfsv_c);
426 template<
typename EG,
typename LFSU,
typename LFSV>
429 for (
int s=0;
s<
la.stage; ++
s){
431 la.la0.setTime(
la.time+d[
s]*
la.dt);
432 la.la1.setTime(
la.time+d[s]*
la.dt);
434 lae0->setSolution(*((*solutions)[s]));
435 lae1->setSolution(*((*solutions)[s]));
437 lae0->loadCoefficientsLFSUInside(lfsu);
438 lae1->loadCoefficientsLFSUInside(lfsu);
441 la.la0.setWeight(b[s]*
la.dt_factor0);
442 lae0->assembleUVVolumePostSkeleton(eg,lfsu,lfsv);
446 la.la1.setWeight(a[s]*
la.dt_factor1);
447 lae1->assembleUVVolumePostSkeleton(eg,lfsu,lfsv);
453 template<
typename EG,
typename LFSV>
456 for (
int s=0;
s<
la.stage; ++
s){
458 la.la0.setTime(
la.time+d[
s]*
la.dt);
459 la.la1.setTime(
la.time+d[s]*
la.dt);
462 la.la0.setWeight(b[s]*
la.dt_factor0);
463 lae0->assembleVVolumePostSkeleton(eg,lfsv);
467 la.la1.setWeight(a[s]*
la.dt_factor1);
468 lae1->assembleVVolumePostSkeleton(eg,lfsv);
477 Residual *
const invalid_residual;
480 Solutions *
const invalid_solutions;
486 Residual * const_residual_0;
487 Residual * const_residual_1;
491 const Solutions * solutions;
497 std::vector<bool> do0;
498 std::vector<bool> do1;
std::vector< Solution * > Solutions
The type of the solution container.
Definition: prestageengine.hh:63
void assembleVVolumePostSkeleton(const EG &eg, const LFSV &lfsv)
Definition: prestageengine.hh:454
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
OSLA LocalAssembler
The type of the wrapping local assembler.
Definition: prestageengine.hh:40
OSLA::LocalAssemblerDT0 LocalAssemblerDT0
Definition: prestageengine.hh:44
OSLA::Traits::Residual Residual
The type of the residual vector.
Definition: prestageengine.hh:52
void postAssembly(const GFSU &gfsu, const GFSV &gfsv)
Definition: prestageengine.hh:166
OSLA::Real Real
The type for real numbers.
Definition: prestageengine.hh:60
void setLocalAssemblerEngineDT1(LocalAssemblerEngineDT1 &lae1_)
Definition: enginebase.hh:121
void assembleUVProcessor(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s)
Definition: prestageengine.hh:321
OSLA::LocalAssemblerDT1 LocalAssemblerDT1
Definition: prestageengine.hh:45
const LocalAssembler & la
Definition: enginebase.hh:437
void loadCoefficientsLFSUOutside(const LFSU &lfsu_n)
Definition: prestageengine.hh:123
Solution::ElementType SolutionElement
Definition: prestageengine.hh:57
void assembleVSkeleton(const IG &ig, const LFSV_S &lfsv_s, const LFSV_N &lfsv_n)
Definition: prestageengine.hh:255
bool requireSkeleton() const
Definition: prestageengine.hh:82
void setConstResidual(Residual &const_residual_)
Definition: prestageengine.hh:106
void preAssembly()
Definition: prestageengine.hh:138
const IG & ig
Definition: constraints.hh:147
LocalAssemblerEngineDT0 * lae0
Definition: enginebase.hh:439
OSLA::Traits::Solution Solution
The type of the solution vector.
Definition: prestageengine.hh:56
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
The local assembler engine for one step methods which assembles the constant part of the residual vec...
Definition: prestageengine.hh:19
bool implicit
Definition: enginebase.hh:442
Residual::ElementType ResidualElement
Definition: prestageengine.hh:53
LocalAssemblerDT0::LocalResidualAssemblerEngine ResidualEngineDT0
Definition: prestageengine.hh:47
void assembleVBoundary(const IG &ig, const LFSV_S &lfsv_s)
Definition: prestageengine.hh:301
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 loadCoefficientsLFSUCoupling(const LFSU &lfsu_c)
Definition: prestageengine.hh:125
Definition: adaptivity.hh:27
void assembleUVBoundary(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s)
Definition: prestageengine.hh:275
void setLocalAssemblerEngineDT0(LocalAssemblerEngineDT0 &lae0_)
Definition: enginebase.hh:116
void assembleVEnrichedCoupling(const IG &ig, const LFSV_S &lfsv_s, const LFSV_N &lfsv_n, const LFSV_C &lfsv_c)
Definition: prestageengine.hh:403
OneStepLocalPreStageAssemblerEngine(LocalAssembler &la_)
Constructor.
Definition: prestageengine.hh:71
void setConstResiduals(Residual &const_residual_0_, Residual &const_residual_1_)
Definition: prestageengine.hh:94
LocalAssemblerEngineDT1 * lae1
Definition: enginebase.hh:440
const std::string s
Definition: function.hh:1102
void loadCoefficientsLFSUInside(const LFSU &lfsu_s)
Definition: prestageengine.hh:121
The local assembler engine for UDG sub triangulations which assembles the residual vector...
Definition: enginebase.hh:15
void assembleUVVolume(const EG &eg, const LFSU &lfsu, const LFSV &lfsv)
Definition: prestageengine.hh:177
void assembleVVolume(const EG &eg, const LFSV &lfsv)
Definition: prestageengine.hh:203
const EG & eg
Definition: constraints.hh:280
void setTimeInLastStage()
Definition: prestageengine.hh:131
LocalAssemblerDT1::LocalResidualAssemblerEngine ResidualEngineDT1
Definition: prestageengine.hh:48