4#ifndef DUNE_PDELAB_INSTATIONARY_EXPLICITONESTEP_HH
5#define DUNE_PDELAB_INSTATIONARY_EXPLICITONESTEP_HH
63 template<
class R,
class IGOS>
72 CFLTimeController (R cfl_, R target_,
const IGOS& igos_) : cfl(cfl_), target(target_), igos(igos_)
84 RealType suggested = cfl*igos.suggestTimestep(givendt);
85 if (time+2.0*suggested<target)
87 if (time+suggested<target)
88 return 0.5*(target-time);
108 template<
class T,
class IGOS,
class LS,
class TrlV,
class TstV = TrlV,
class TC = SimpleTimeController<T> >
111 typedef typename TrlV::ElementType Real;
112 typedef typename IGOS::template MatrixContainer<Real>::Type M;
128 "Constructor with default assigned reduction is no longer supported. "
129 "Use the new constructor by passing a suitable reduction to the linear "
130 "system. In particular, use a dummy reduction (i.e. 0.99) on systems "
131 "known to have diagonal mass matrices (e.g. FV or DG) and where the "
132 "linear solver performs a block inversion on the first iteration "
133 "(essentially any). Otherwise, specify a proper reduction suitable "
137 : method(&method_), igos(igos_), ls(ls_), verbosityLevel(1), step(1), D(igos),
142 if (igos.trialGridFunctionSpace().gridView().comm().rank()>0)
170 , ls_reduct{ ls_reduct_ }
174 "explicit one step method called with implicit scheme");
175 if (igos.trialGridFunctionSpace().gridView().comm().rank() > 0)
192 "Constructor with default assigned reduction is no longer supported. "
193 "Use the new constructor by passing a suitable reduction to the linear "
194 "system. In particular, use a dummy reduction (i.e. 0.99) on systems \n"
195 "known to have diagonal mass matrices (e.g. FV or DG) and where the \n"
196 "linear solver performs a block inversion on the first iteration \n"
197 "(essentially any). Otherwise, specify a proper reduction suitable \n"
201 : method(&method_), igos(igos_), ls(ls_), verbosityLevel(1), step(1), D(igos),
202 tc(&tc_), allocated(false), ls_reduct{0.99}
233 , ls_reduct{ ls_reduct_ }
237 "explicit one step method called with implicit scheme");
242 if (allocated)
delete tc;
248 if (igos.trialGridFunctionSpace().gridView().comm().rank()>0)
251 verbosityLevel = level;
268 void setReduction(
const double& ls_reduction_) { ls_reduct = ls_reduction_; }
292 T
apply (T time, T dt, TrlV& xold, TrlV& xnew)
294 DefaultLimiter limiter;
295 return apply(time,dt,xold,xnew,limiter);
306 template<
typename Limiter>
307 T
apply (T time, T dt, TrlV& xold, TrlV& xnew, Limiter& limiter)
312 mytag <<
"ExplicitOneStepMethod::apply(): ";
316 if(verbosityLevel>=4)
317 std::cout << mytag <<
"Creating residual vectors alpha and beta..."
319 TstV
alpha(igos.testGridFunctionSpace()),
beta(igos.testGridFunctionSpace());
320 if(verbosityLevel>=4)
322 <<
"Creating residual vectors alpha and beta... done."
325 if (verbosityLevel>=1){
326 std::ios_base::fmtflags oldflags =
std::cout.flags();
343 if(verbosityLevel>=4)
345 igos.preStep(*method,time,dt);
346 if(verbosityLevel>=4)
350 for(
unsigned r=1; r<=method->
s(); ++r)
353 stagetag <<
"stage " << r <<
": ";
354 if (verbosityLevel>=4)
357 if (verbosityLevel>=2){
358 std::ios_base::fmtflags oldflags =
std::cout.flags();
363 << time+method->
d(r)*dt
373 if (r>1) xnew = *(x[r-1]);
378 x.
push_back(
new TrlV(igos.trialGridFunctionSpace()));
392 limiter.prestage(*x[r-1]);
394 if(verbosityLevel>=4)
396 igos.explicit_jacobian_residual(r,x,D,
alpha,
beta);
397 if(verbosityLevel>=4)
398 std::cout << stagetag <<
"Assembling residual... done."
407 if (verbosityLevel>=4){
408 std::ios_base::fmtflags oldflags =
std::cout.flags();
420 if (verbosityLevel>=2 && newdt!=dt)
422 std::ios_base::fmtflags oldflags =
std::cout.flags();
433 if (verbosityLevel>=4)
435 <<
"Combining residuals with selected dt..."
438 if (verbosityLevel>=4)
440 <<
"Combining residuals with selected dt... done."
444 if (verbosityLevel>=4)
445 std::cout << stagetag <<
"Solving linear system..."
447 ls.apply(D,*x[r],
alpha,ls_reduct);
448 if (verbosityLevel>=4)
449 std::cout << stagetag <<
"Solving linear system... done."
453 limiter.poststage(*x[r]);
456 if (verbosityLevel>=4)
459 if (verbosityLevel>=4)
462 if (verbosityLevel>=4)
467 for(
unsigned i=1; i<method->
s(); ++i)
delete x[i];
470 if (verbosityLevel>=4)
473 if (verbosityLevel>=4)
488 template <
typename F>
489 T
apply (T time, T dt, TrlV& xold, F& f, TrlV& xnew)
491 DefaultLimiter limiter;
492 return apply(time,dt,xold,f,xnew,limiter);
504 template<
typename F,
typename Limiter>
505 T
apply (T time, T dt, TrlV& xold, F&f, TrlV& xnew, Limiter& limiter)
510 mytag <<
"ExplicitOneStepMethod::apply(): ";
514 if(verbosityLevel>=4)
515 std::cout << mytag <<
"Creating residual vectors alpha and beta..."
517 TstV
alpha(igos.testGridFunctionSpace()),
beta(igos.testGridFunctionSpace());
518 if(verbosityLevel>=4)
520 <<
"Creating residual vectors alpha and beta... done."
527 if(verbosityLevel>=4)
528 std::cout << mytag <<
"Creating residual vector and update for residual formulation of linear problem per stage"
530 TrlV residual(igos.testGridFunctionSpace());
531 TrlV update(igos.testGridFunctionSpace());
532 if(verbosityLevel>=4)
533 std::cout << mytag <<
"Creating residual vector and update for residual... done."
537 if (verbosityLevel>=1){
538 std::ios_base::fmtflags oldflags =
std::cout.flags();
555 if(verbosityLevel>=4)
557 igos.preStep(*method,time,dt);
558 if(verbosityLevel>=4)
562 for(
unsigned r=1; r<=method->
s(); ++r)
565 stagetag <<
"stage " << r <<
": ";
566 if (verbosityLevel>=4)
569 if (verbosityLevel>=2){
570 std::ios_base::fmtflags oldflags =
std::cout.flags();
575 << time+method->
d(r)*dt
589 x.
push_back(
new TrlV(igos.trialGridFunctionSpace()));
599 limiter.prestage(*x[r-1]);
602 TrlV
const *
const init_guess = (r==1) ? &xnew : x[r-1];
604 igos.interpolate(r,*init_guess,f,*x[r]);
606 if(verbosityLevel>=4)
608 igos.explicit_jacobian_residual(r,x,D,
alpha,
beta);
609 if(verbosityLevel>=4)
610 std::cout << stagetag <<
"Assembling residual... done."
619 if (verbosityLevel>=4){
620 std::ios_base::fmtflags oldflags =
std::cout.flags();
632 if (verbosityLevel>=2 && newdt!=dt)
634 std::ios_base::fmtflags oldflags =
std::cout.flags();
645 if (verbosityLevel>=4)
647 <<
"Combining residuals with selected dt..."
650 if (verbosityLevel>=4)
652 <<
"Combining residuals with selected dt... done."
660 native(D).mv(native(*x[r]), native(residual));
662 auto cc = igos.trialConstraints();
664 if (verbosityLevel>=4)
665 std::cout << stagetag <<
"Solving linear system..."
667 ls.apply(D, update, residual, ls_reduct);
668 if (verbosityLevel>=4)
669 std::cout << stagetag <<
"Solving linear system... done."
674 limiter.poststage(*x[r]);
677 if (verbosityLevel>=4)
680 if (verbosityLevel>=4)
683 if (verbosityLevel>=4)
688 for(
unsigned i=1; i<method->
s(); ++i)
delete x[i];
691 if (verbosityLevel>=4)
694 if (verbosityLevel>=4)
716 const TimeSteppingParameterInterface<T> *method;
722 TimeControllerInterface<T> *tc;
#define DUNE_THROW(E,...)
void set_constrained_dofs(const CG &cg, typename XG::ElementType x, XG &xg)
construct constraints from given boundary condition function
Definition constraints.hh:796
virtual bool implicit() const =0
Return true if method is implicit.
virtual std::string name() const =0
Return name of the scheme.
virtual R d(int r) const =0
Return entries of the d Vector.
virtual unsigned s() const =0
Return number of stages of the method.
std::enable_if< std::is_base_of< impl::WrapperBase, T >::value, Native< T > & >::type native(T &t)
Definition backend/interface.hh:192
For backward compatibility – Do not use this!
Base class for all PDELab exceptions.
Definition exceptions.hh:19
Insert standard boilerplate into log messages.
Definition logtag.hh:172
Controller interface for adaptive time stepping.
Definition explicitonestep.hh:27
virtual ~TimeControllerInterface()
every abstract base class has a virtual destructor
Definition explicitonestep.hh:36
virtual RealType suggestTimestep(RealType time, RealType givendt)=0
Return name of the scheme.
R RealType
Definition explicitonestep.hh:29
Default time controller; just returns given dt.
Definition explicitonestep.hh:45
virtual RealType suggestTimestep(RealType time, RealType givendt) override
Return name of the scheme.
Definition explicitonestep.hh:51
R RealType
Definition explicitonestep.hh:47
limit time step to maximum dt * CFL number
Definition explicitonestep.hh:65
void setTarget(R target_)
Definition explicitonestep.hh:75
CFLTimeController(R cfl_, R target_, const IGOS &igos_)
Definition explicitonestep.hh:72
CFLTimeController(R cfl_, const IGOS &igos_)
Definition explicitonestep.hh:69
R RealType
Definition explicitonestep.hh:67
virtual RealType suggestTimestep(RealType time, RealType givendt) override
Return name of the scheme.
Definition explicitonestep.hh:82
Do one step of an explicit time-stepping scheme.
Definition explicitonestep.hh:110
T apply(T time, T dt, TrlV &xold, F &f, TrlV &xnew, Limiter &limiter)
do one step;
Definition explicitonestep.hh:505
ExplicitOneStepMethod(const TimeSteppingParameterInterface< T > &method_, IGOS &igos_, LS &ls_, TC &tc_)
construct a new one step scheme
Definition explicitonestep.hh:200
T apply(T time, T dt, TrlV &xold, F &f, TrlV &xnew)
do one step;
Definition explicitonestep.hh:489
T apply(T time, T dt, TrlV &xold, TrlV &xnew)
do one step;
Definition explicitonestep.hh:292
ExplicitOneStepMethod(const TimeSteppingParameterInterface< T > &method_, IGOS &igos_, LS &ls_, double ls_reduct_)
Construct a new Explicit One Step Method object.
Definition explicitonestep.hh:158
T apply(T time, T dt, TrlV &xold, TrlV &xnew, Limiter &limiter)
do one step;
Definition explicitonestep.hh:307
void setMethod(const TimeSteppingParameterInterface< T > &method_)
redefine the method to be used; can be done before every step
Definition explicitonestep.hh:278
void setVerbosityLevel(int level)
change verbosity level; 0 means completely quiet
Definition explicitonestep.hh:246
void setStepNumber(int newstep)
change number of current step
Definition explicitonestep.hh:255
~ExplicitOneStepMethod()
Definition explicitonestep.hh:240
ExplicitOneStepMethod(const TimeSteppingParameterInterface< T > &method_, IGOS &igos_, LS &ls_, TC &tc_, double ls_reduct_)
Construct a new Explicit One Step Method object.
Definition explicitonestep.hh:220
ExplicitOneStepMethod(const TimeSteppingParameterInterface< T > &method_, IGOS &igos_, LS &ls_)
construct a new one step scheme
Definition explicitonestep.hh:136
void setReduction(const double &ls_reduction_)
Set the Reduction for linear system soltion.
Definition explicitonestep.hh:268
Base parameter class for time stepping scheme parameters.
Definition onestepparameter.hh:44
T setprecision(T... args)