1 #ifndef DUNE_PDELAB_GRIDOPERATOR_ONESTEP_PRESTAGEENGINE_HH 2 #define DUNE_PDELAB_GRIDOPERATOR_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(nullptr)
74 , invalid_solutions(nullptr)
75 , const_residual_0(invalid_residual)
76 , const_residual_1(invalid_residual)
77 , solutions(invalid_solutions)
83 {
return lae0->requireSkeleton() ||
lae1->requireSkeleton(); }
90 solutions = &solutions_;
97 const_residual_0 = &const_residual_0_;
98 const_residual_1 = &const_residual_1_;
101 assert(solutions != invalid_solutions);
110 const_residual_0 = &const_residual_;
111 const_residual_1 = &const_residual_;
114 assert(solutions != invalid_solutions);
123 template<
typename LFSU>
125 template<
typename LFSU>
127 template<
typename LFSU>
136 la.la1.setTime(
la.time+
la.osp_method->d(
la.stage)*
la.dt);
146 *const_residual_0 = 0.0;
147 *const_residual_1 = 0.0;
153 do0.resize(
la.stage);
154 do1.resize(
la.stage);
155 for (
int i=0; i<
la.stage; ++i){
156 a[i] =
la.osp_method->a(
la.stage,i);
157 b[i] =
la.osp_method->b(
la.stage,i);
158 d[i] =
la.osp_method->d(i);
159 do0[i] = ( std::abs(b[i]) > 1E-6 );
160 do1[i] = ( std::abs(a[i]) > 1E-6 );
164 la.la0.preStage(
la.time+
la.osp_method->d(
la.stage)*
la.dt,
la.stage);
165 la.la1.preStage(
la.time+
la.osp_method->d(
la.stage)*
la.dt,
la.stage);
168 template<
typename GFSU,
typename GFSV>
171 lae0->postAssembly(gfsu,gfsv);
172 lae1->postAssembly(gfsu,gfsv);
179 template<
typename EG,
typename LFSU,
typename LFSV>
182 for (
int s=0;
s<
la.stage; ++
s){
184 la.la0.setTime(
la.time+d[
s]*
la.dt);
185 la.la1.setTime(
la.time+d[s]*
la.dt);
187 lae0->setSolution(*((*solutions)[s]));
188 lae1->setSolution(*((*solutions)[s]));
190 lae0->loadCoefficientsLFSUInside(lfsu);
191 lae1->loadCoefficientsLFSUInside(lfsu);
194 la.la0.setWeight(b[s]*
la.dt_factor0);
195 lae0->assembleUVVolume(eg,lfsu,lfsv);
199 la.la1.setWeight(a[s]*
la.dt_factor1);
200 lae1->assembleUVVolume(eg,lfsu,lfsv);
205 template<
typename EG,
typename LFSV>
208 for (
int s=0;
s<
la.stage; ++
s){
210 la.la0.setTime(
la.time+d[
s]*
la.dt);
211 la.la1.setTime(
la.time+d[s]*
la.dt);
214 la.la0.setWeight(b[s]*
la.dt_factor0);
215 lae0->assembleVVolume(eg,lfsv);
219 la.la1.setWeight(a[s]*
la.dt_factor1);
220 lae1->assembleVVolume(eg,lfsv);
226 template<
typename IG,
typename LFSU_S,
typename LFSV_S,
typename LFSU_N,
typename LFSV_N>
228 const LFSU_N & lfsu_n,
const LFSV_N & lfsv_n)
230 for (
int s=0;
s<
la.stage; ++
s){
232 la.la0.setTime(
la.time+d[
s]*
la.dt);
233 la.la1.setTime(
la.time+d[s]*
la.dt);
235 lae0->setSolution(*((*solutions)[s]));
236 lae1->setSolution(*((*solutions)[s]));
238 lae0->loadCoefficientsLFSUInside(lfsu_s);
239 lae1->loadCoefficientsLFSUInside(lfsu_s);
240 lae0->loadCoefficientsLFSUOutside(lfsu_n);
241 lae1->loadCoefficientsLFSUOutside(lfsu_n);
244 la.la0.setWeight(b[s]*
la.dt_factor0);
245 lae0->setSolution(*((*solutions)[s]));
246 lae0->assembleUVSkeleton(ig,lfsu_s,lfsv_s,lfsu_n,lfsv_n);
250 la.la1.setWeight(a[s]*
la.dt_factor1);
251 lae1->setSolution(*((*solutions)[s]));
252 lae1->assembleUVSkeleton(ig,lfsu_s,lfsv_s,lfsu_n,lfsv_n);
257 template<
typename IG,
typename LFSV_S,
typename LFSV_N>
260 for (
int s=0;
s<
la.stage; ++
s){
262 la.la0.setTime(
la.time+d[
s]*
la.dt);
263 la.la1.setTime(
la.time+d[s]*
la.dt);
266 la.la0.setWeight(b[s]*
la.dt_factor0);
267 lae0->assembleVSkeleton(ig,lfsv_s,lfsv_n);
271 la.la1.setWeight(a[s]*
la.dt_factor1);
272 lae1->assembleVSkeleton(ig,lfsv_s,lfsv_n);
277 template<
typename IG,
typename LFSU_S,
typename LFSV_S>
280 for (
int s=0;
s<
la.stage; ++
s){
282 la.la0.setTime(
la.time+d[
s]*
la.dt);
283 la.la1.setTime(
la.time+d[s]*
la.dt);
285 lae0->setSolution(*((*solutions)[s]));
286 lae1->setSolution(*((*solutions)[s]));
288 lae0->loadCoefficientsLFSUInside(lfsu_s);
289 lae1->loadCoefficientsLFSUInside(lfsu_s);
292 la.la0.setWeight(b[s]*
la.dt_factor0);
293 lae0->assembleUVBoundary(ig,lfsu_s,lfsv_s);
297 la.la1.setWeight(a[s]*
la.dt_factor1);
298 lae1->assembleUVBoundary(ig,lfsu_s,lfsv_s);
303 template<
typename IG,
typename LFSV_S>
306 for (
int s=0;
s<
la.stage; ++
s){
308 la.la0.setTime(
la.time+d[
s]*
la.dt);
309 la.la1.setTime(
la.time+d[s]*
la.dt);
312 la.la0.setWeight(b[s]*
la.dt_factor0);
313 lae0->assembleVBoundary(ig,lfsv_s);
317 la.la1.setWeight(a[s]*
la.dt_factor1);
318 lae1->assembleVBoundary(ig,lfsv_s);
323 template<
typename IG,
typename LFSU_S,
typename LFSV_S>
326 for (
int s=0;
s<
la.stage; ++
s){
328 la.la0.setTime(
la.time+d[
s]*
la.dt);
329 la.la1.setTime(
la.time+d[s]*
la.dt);
331 lae0->setSolution(*((*solutions)[s]));
332 lae1->setSolution(*((*solutions)[s]));
334 lae0->loadCoefficientsLFSUInside(lfsu_s);
335 lae1->loadCoefficientsLFSUInside(lfsu_s);
338 la.la0.setWeight(b[s]*
la.dt_factor0);
339 lae0->assembleUVProcessor(ig,lfsu_s,lfsv_s);
343 la.la1.setWeight(a[s]*
la.dt_factor1);
344 lae1->assembleUVProcessor(ig,lfsu_s,lfsv_s);
349 template<
typename IG,
typename LFSV_S>
352 for (
int s=0;
s<
la.stage; ++
s){
354 la.la0.setTime(
la.time+d[
s]*
la.dt);
355 la.la1.setTime(
la.time+d[s]*
la.dt);
358 la.la0.setWeight(b[s]*
la.dt_factor0);
359 lae0->assembleVProcessor(ig,lfsv_s);
363 la.la1.setWeight(a[s]*
la.dt_factor1);
364 lae1->assembleVProcessor(ig,lfsv_s);
369 template<
typename IG,
typename LFSU_S,
typename LFSV_S,
typename LFSU_N,
typename LFSV_N,
370 typename LFSU_C,
typename LFSV_C>
372 const LFSU_S & lfsu_s,
const LFSV_S & lfsv_s,
373 const LFSU_N & lfsu_n,
const LFSV_N & lfsv_n,
374 const LFSU_C & lfsu_c,
const LFSV_C & lfsv_c)
376 for (
int s=0;
s<
la.stage; ++
s){
378 la.la0.setTime(
la.time+d[
s]*
la.dt);
379 la.la1.setTime(
la.time+d[s]*
la.dt);
381 lae0->setSolution(*((*solutions)[s]));
382 lae1->setSolution(*((*solutions)[s]));
384 lae0->loadCoefficientsLFSUInside(lfsu_s);
385 lae1->loadCoefficientsLFSUInside(lfsu_s);
387 lae0->loadCoefficientsLFSUOutside(lfsu_n);
388 lae1->loadCoefficientsLFSUOutside(lfsu_n);
390 lae0->loadCoefficientsLFSUCoupling(lfsu_c);
391 lae1->loadCoefficientsLFSUCoupling(lfsu_c);
394 la.la0.setWeight(b[s]*
la.dt_factor0);
395 lae0->assembleUVEnrichedCoupling(ig,lfsu_s,lfsv_s,lfsu_n,lfsv_n,lfsu_c,lfsv_c);
399 la.la1.setWeight(a[s]*
la.dt_factor1);
400 lae1->assembleUVEnrichedCoupling(ig,lfsu_s,lfsv_s,lfsu_n,lfsv_n,lfsu_c,lfsv_c);
405 template<
typename IG,
typename LFSV_S,
typename LFSV_N,
typename LFSV_C>
407 const LFSV_S & lfsv_s,
408 const LFSV_N & lfsv_n,
409 const LFSV_C & lfsv_c)
411 for (
int s=0;
s<
la.stage; ++
s){
413 la.la0.setTime(
la.time+d[
s]*
la.dt);
414 la.la1.setTime(
la.time+d[s]*
la.dt);
417 la.la0.setWeight(b[s]*
la.dt_factor0);
418 lae0->assembleVEnrichedCoupling(ig,lfsv_s,lfsv_n,lfsv_c);
422 la.la1.setWeight(a[s]*
la.dt_factor1);
423 lae1->assembleVEnrichedCoupling(ig,lfsv_s,lfsv_n,lfsv_c);
429 template<
typename EG,
typename LFSU,
typename LFSV>
432 for (
int s=0;
s<
la.stage; ++
s){
434 la.la0.setTime(
la.time+d[
s]*
la.dt);
435 la.la1.setTime(
la.time+d[s]*
la.dt);
437 lae0->setSolution(*((*solutions)[s]));
438 lae1->setSolution(*((*solutions)[s]));
440 lae0->loadCoefficientsLFSUInside(lfsu);
441 lae1->loadCoefficientsLFSUInside(lfsu);
444 la.la0.setWeight(b[s]*
la.dt_factor0);
445 lae0->assembleUVVolumePostSkeleton(eg,lfsu,lfsv);
449 la.la1.setWeight(a[s]*
la.dt_factor1);
450 lae1->assembleUVVolumePostSkeleton(eg,lfsu,lfsv);
456 template<
typename EG,
typename LFSV>
459 for (
int s=0;
s<
la.stage; ++
s){
461 la.la0.setTime(
la.time+d[
s]*
la.dt);
462 la.la1.setTime(
la.time+d[s]*
la.dt);
465 la.la0.setWeight(b[s]*
la.dt_factor0);
466 lae0->assembleVVolumePostSkeleton(eg,lfsv);
470 la.la1.setWeight(a[s]*
la.dt_factor1);
471 lae1->assembleVVolumePostSkeleton(eg,lfsv);
480 Residual *
const invalid_residual;
483 Solutions *
const invalid_solutions;
489 Residual * const_residual_0;
490 Residual * const_residual_1;
494 const Solutions * solutions;
500 std::vector<bool> do0;
501 std::vector<bool> do1;
507 #endif // DUNE_PDELAB_GRIDOPERATOR_ONESTEP_PRESTAGEENGINE_HH void postAssembly(const GFSU &gfsu, const GFSV &gfsv)
Definition: prestageengine.hh:169
Residual::ElementType ResidualElement
Definition: prestageengine.hh:53
const IG & ig
Definition: constraints.hh:148
void setLocalAssemblerEngineDT1(LocalAssemblerEngineDT1 &lae1_)
Definition: enginebase.hh:119
const LocalAssembler & la
Definition: enginebase.hh:454
OSLA::LocalAssemblerDT1 LocalAssemblerDT1
Definition: prestageengine.hh:45
The local assembler engine for UDG sub triangulations which assembles the residual vector...
Definition: enginebase.hh:15
void assembleUVBoundary(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s)
Definition: prestageengine.hh:278
void loadCoefficientsLFSUOutside(const LFSU &lfsu_n)
Definition: prestageengine.hh:126
const std::string s
Definition: function.hh:830
The local assembler engine for one step methods which assembles the constant part of the residual vec...
Definition: prestageengine.hh:19
void assembleUVVolumePostSkeleton(const EG &eg, const LFSU &lfsu, const LFSV &lfsv)
Definition: prestageengine.hh:430
OSLA::Traits::Solution Solution
The type of the solution vector.
Definition: prestageengine.hh:56
void assembleVProcessor(const IG &ig, const LFSV_S &lfsv_s)
Definition: prestageengine.hh:350
void assembleVBoundary(const IG &ig, const LFSV_S &lfsv_s)
Definition: prestageengine.hh:304
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:371
void setLocalAssemblerEngineDT0(LocalAssemblerEngineDT0 &lae0_)
Definition: enginebase.hh:114
void setTimeInLastStage()
Definition: prestageengine.hh:134
void assembleVEnrichedCoupling(const IG &ig, const LFSV_S &lfsv_s, const LFSV_N &lfsv_n, const LFSV_C &lfsv_c)
Definition: prestageengine.hh:406
bool implicit
Definition: enginebase.hh:459
OSLA LocalAssembler
The type of the wrapping local assembler.
Definition: prestageengine.hh:40
For backward compatibility – Do not use this!
Definition: adaptivity.hh:27
OneStepLocalPreStageAssemblerEngine(LocalAssembler &la_)
Constructor.
Definition: prestageengine.hh:71
void assembleVSkeleton(const IG &ig, const LFSV_S &lfsv_s, const LFSV_N &lfsv_n)
Definition: prestageengine.hh:258
LocalAssemblerDT1::LocalResidualAssemblerEngine ResidualEngineDT1
Definition: prestageengine.hh:48
void preAssembly()
Definition: prestageengine.hh:141
void loadCoefficientsLFSUInside(const LFSU &lfsu_s)
Definition: prestageengine.hh:124
OSLA::Traits::Residual Residual
The type of the residual vector.
Definition: prestageengine.hh:52
LocalAssemblerEngineDT0 * lae0
Definition: enginebase.hh:456
void assembleUVVolume(const EG &eg, const LFSU &lfsu, const LFSV &lfsv)
Definition: prestageengine.hh:180
LocalAssemblerEngineDT1 * lae1
Definition: enginebase.hh:457
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:227
void setSolutions(const Solutions &solutions_)
Definition: prestageengine.hh:88
void setConstResidual(Residual &const_residual_)
Definition: prestageengine.hh:108
OSLA::LocalAssemblerDT0 LocalAssemblerDT0
Definition: prestageengine.hh:44
Solution::ElementType SolutionElement
Definition: prestageengine.hh:57
void assembleUVProcessor(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s)
Definition: prestageengine.hh:324
void assembleVVolume(const EG &eg, const LFSV &lfsv)
Definition: prestageengine.hh:206
std::vector< Solution * > Solutions
The type of the solution container.
Definition: prestageengine.hh:63
bool requireSkeleton() const
Definition: prestageengine.hh:82
void setConstResiduals(Residual &const_residual_0_, Residual &const_residual_1_)
Definition: prestageengine.hh:95
OSLA::Real Real
The type for real numbers.
Definition: prestageengine.hh:60
LocalAssemblerDT0::LocalResidualAssemblerEngine ResidualEngineDT0
Definition: prestageengine.hh:47
void loadCoefficientsLFSUCoupling(const LFSU &lfsu_c)
Definition: prestageengine.hh:128
void assembleVVolumePostSkeleton(const EG &eg, const LFSV &lfsv)
Definition: prestageengine.hh:457