1 #ifndef RUNGEKUTTA_ODE_SOLVER_HH 2 #define RUNGEKUTTA_ODE_SOLVER_HH 13 #include <sys/times.h> 16 #include <dune/common/nullptr.hh> 36 #ifdef USE_PARDG_ODE_SOLVER 52 virtual PARDG::IterativeLinearSolver *
linearSolver(PARDG::Communicator & comm)
const 54 static const std::string methodTypeTable[] = {
"gmres",
"cg",
"bicgstab" };
55 const int method = parameter_.getEnum( keyPrefix_ +
"linearsolver", methodTypeTable, 0 );
57 PARDG::IterativeLinearSolver *solver =
nullptr;
62 if( parameter_.exists(
"fem.ode.gmrescycles" ) )
64 std::cerr <<
"WARNING: deprecated key, use '" << keyPrefix_ <<
"gmres.cycles' instead!" << std::endl;
65 cycles = parameter_.getValue<
int >(
"fem.ode.gmrescycles", 15 );
68 cycles = parameter_.getValue<
int >( keyPrefix_ +
"gmres.cycles", 15 );
69 solver =
new PARDG::GMRES( comm, cycles );
73 solver =
new PARDG::CG( comm );
77 solver =
new PARDG::BICGSTAB( comm );
81 DUNE_THROW( InvalidStateException,
"Unable to create linear solver." );
84 double tol = parameter_.getValue<
double >( keyPrefix_ +
"solver.tolerance" , 1e-8 );
85 static const std::string errorTypeTable[] = {
"absolute",
"relative" };
87 int errorType = parameter_.getEnum( keyPrefix_ +
"solver.errormeasure", errorTypeTable, 0 );
88 solver->set_tolerance(tol,(errorType==1));
90 int maxIter = parameter_.getValue<
int >( keyPrefix_ +
"solver.iterations" , 1000 );
91 solver->set_max_number_of_iterations(maxIter);
100 template <
class Operator>
104 typedef typename Operator::DestinationType DestinationType;
116 op_.setTime( this->time() );
145 template <
class Operator>
149 typedef typename Operator::DestinationType DestinationType;
181 template<
class DestinationImp>
199 comm_(
PARDG::Communicator::instance()),
201 initialized_( false ),
211 odeSolver_ = createOdeSolver();
221 if ( ! initialized_ )
224 initializeOdeSolver();
227 spaceOperator().initializeTimeStepSize( U0 );
230 timeProvider_.provideTimeStepEstimate( spaceOperator().timeStepEstimate() );
241 assert( odeSolver_ );
248 out << name() <<
", steps: " << order_;
255 virtual std::string name()
const = 0;
258 virtual PARDG::ODESolver* createOdeSolver() = 0;
261 virtual const OperatorType& spaceOperator()
const = 0;
271 PARDG::ODESolver* odeSolver_;
279 template<
class DestinationImp>
286 using BaseType :: order_;
287 using BaseType :: comm_;
288 using BaseType :: initialized_;
289 using BaseType :: timeProvider_;
290 using BaseType :: odeSolver ;
293 using BaseType :: initialize;
294 using BaseType :: solve ;
303 const int order,
bool verbose =
false) :
304 BaseType(tp, order ),
314 MonitorType& monitor )
322 DUNE_THROW(InvalidStateException,
"ExplicitOdeSolver wasn't initialized before first call!");
326 const double dt = timeProvider_.deltaT();
332 const double time = timeProvider_.time();
335 double* u = U0.leakPointer();
338 const bool convergence = odeSolver().step(time, dt, u);
341 timeProvider_.provideTimeStepEstimate( expl_.op().timeStepEstimate() );
343 assert( convergence );
346 timeProvider_.invalidateTimeStep();
347 if( comm_.id() == 0 )
348 std::cerr <<
"No Convergence of ExplicitOdeSolver! \n";
354 virtual std::string
name()
const {
return "ExplicitOdeSolver"; }
362 PARDG::ODESolver* odeSolver = 0;
365 case 1 : odeSolver =
new PARDG::ExplicitEuler(comm_, expl_);
break;
366 case 2 : odeSolver =
new PARDG::ExplicitTVD2 (comm_, expl_);
break;
367 case 3 : odeSolver =
new PARDG::ExplicitTVD3 (comm_, expl_);
break;
368 case 4 : odeSolver =
new PARDG::ExplicitRK4 (comm_, expl_);
break;
369 default : odeSolver =
new PARDG::ExplicitBulirschStoer(comm_, expl_, 7);
370 if( comm_.id() == 0 )
372 std::cerr <<
"Runge-Kutta method of this order not implemented.\n" 373 <<
"Using 7-stage Bulirsch-Stoer scheme.\n" 382 odeSolver->DynamicalObject::set_output(cout);
398 template<
class DestinationImp>
404 using BaseType :: order_;
405 using BaseType :: comm_;
406 using BaseType :: initialized_;
407 using BaseType :: timeProvider_;
408 using BaseType :: odeSolver ;
411 using BaseType :: initialize;
412 using BaseType :: solve ;
425 param_( parameter.clone() ),
426 verbose_( param_->verbose() ),
427 cfl_( param_->cflStart() ),
428 cflMax_( param_->cflMax() )
440 verbose_( param_->verbose() ),
441 cfl_( param_->cflStart() ),
442 cflMax_( param_->cflMax() )
448 delete linsolver_; linsolver_ = 0;
449 delete param_; param_ = 0;
454 virtual std::string
name()
const {
return "ImplicitOdeSolver"; }
465 linsolver_ = parameter().linearSolver( comm_ );
466 assert( linsolver_ );
468 PARDG::DIRK* odeSolver = 0;
471 case 1: odeSolver =
new PARDG::ImplicitEuler(comm_, impl_);
break;
472 case 2: odeSolver =
new PARDG::Gauss2(comm_, impl_);
break;
473 case 3: odeSolver =
new PARDG::DIRK3 (comm_, impl_);
break;
474 case 4: odeSolver =
new PARDG::DIRK34 (comm_, impl_);
break;
475 default :
if( comm_.id() == 0 )
477 std::cerr <<
"Runge-Kutta method of this order not implemented" 485 odeSolver->set_linear_solver( *linsolver_ );
486 odeSolver->set_tolerance( parameter().tolerance() );
487 odeSolver->set_max_number_of_iterations( parameter().iterations() );
494 odeSolver->IterativeSolver::set_output(cout);
495 odeSolver->DynamicalObject::set_output(cout);
496 linsolver_->IterativeSolver::set_output(cout);
503 return static_cast<PARDG::DIRK&
> (odeSolver()).number_of_iterations();
508 void solve( DestinationType& U0, MonitorType& monitor )
513 DUNE_THROW(InvalidStateException,
"ImplicitOdeSolver wasn't initialized before first call!");
516 const double dt = timeProvider_.deltaT();
518 const double time = timeProvider_.time();
521 double* u = U0.leakPointer();
523 const bool convergence =
524 odeSolver().step( time, dt, u,
534 parameter().cflFactor( impl_.op().timeStepEstimate(), spaceOperator().timeStepEstimate(),
541 if( factor < 1.0 || cfl_ <= cflMax_ )
549 DUNE_THROW( InvalidStateException,
"invalid cfl factor: " << factor );
554 timeProvider_.provideTimeStepEstimate( timeStepEstimate(cfl_) );
558 derr <<
" New cfl number is: "<< cfl_ <<
", iterations per time step(" 568 DUNE_THROW( InvalidStateException,
"Invalid cfl factor (no convergence): " << factor );
569 timeProvider_.provideTimeStepEstimate( factor * dt );
570 timeProvider_.invalidateTimeStep();
574 derr <<
"No convergence: New cfl number is " << cfl_ << std::endl;
577 linsolver_->reset_number_of_iterations();
583 return cfl*spaceOperator().timeStepEstimate();
600 template<
class DestinationImp>
606 using BaseType :: order_;
607 using BaseType :: comm_;
608 using BaseType :: initialized_;
609 using BaseType :: timeProvider_;
610 using BaseType :: odeSolver ;
611 using BaseType :: linsolver_ ;
612 using BaseType :: parameter ;
613 using BaseType :: impl_ ;
614 using BaseType :: verbose_ ;
615 using BaseType :: cfl_;
622 OperatorType& implOp,
626 BaseType( implOp, tp, order, parameter ),
638 BaseType::initializeOdeSolver();
641 expl_.op().initializeTimeStepSize( U0 );
642 impl_.op().initializeTimeStepSize( U0 );
646 parameter().initTimeStepEstimate( expl_.op().timeStepEstimate(), impl_.op().timeStepEstimate(), dtEst, cfl_ );
647 timeProvider_.provideTimeStepEstimate( dtEst );
654 virtual std::string
name()
const {
return "SemiImplicitOdeSolver"; }
662 linsolver_ = parameter().linearSolver( comm_ );
663 assert( linsolver_ );
665 PARDG::SIRK* odeSolver = 0;
668 case 1: odeSolver =
new PARDG::SemiImplicitEuler(comm_, impl_, expl_);
break;
669 case 2: odeSolver =
new PARDG::IMEX_SSP222 (comm_, impl_, expl_);
break;
670 case 3: odeSolver =
new PARDG::SIRK33 (comm_, impl_, expl_);
break;
672 case 4: odeSolver =
new PARDG::IERK45 (comm_, impl_, expl_);
break;
674 default :
if( comm_.id() == 0 )
676 std::cerr <<
"Runge-Kutta method of this order not implemented" 684 odeSolver->set_linear_solver(*linsolver_);
685 odeSolver->set_tolerance( parameter().tolerance() );
686 odeSolver->set_max_number_of_iterations( parameter().iterations() );
688 if( expl_.op().hasLimiter() )
689 odeSolver->set_expl_limiter( limiter_ );
696 odeSolver->IterativeSolver::set_output(cout);
697 odeSolver->DynamicalObject::set_output(cout);
705 return static_cast<PARDG::SIRK&
> (odeSolver()).number_of_iterations();
713 return std::min( spaceOperator().timeStepEstimate(),
714 cfl * impl_.op().timeStepEstimate() );
721 #endif // USE_PARDG_ODE_SOLVER 729 #undef USE_EXTERNAL_BLAS 730 #endif // #ifndef RUNGEKUTTA_ODE_SOLVER_HH PARDG::ODESolver & odeSolver()
return reference to ode solver
Definition: odesolver.hh:239
ODESpaceOperatorInterface for Operators that work with PARDG ODE solvers of the type where is a dis...
Definition: spaceoperatorif.hh:28
const ODEParameters & parameter() const
return reference to parameter class
Definition: odesolver.hh:457
Definition: odesolver.hh:146
const Operator & op() const
return reference to real operator
Definition: odesolver.hh:137
virtual ODEParameters * clone() const
Definition: odesolver.hh:96
PARDG::ODESolver * createOdeSolver()
create implicit ode solver
Definition: odesolver.hh:660
virtual std::string name() const
return name of ode solver
Definition: odesolver.hh:354
void initialize(const DestinationType &U0)
initialize solver
Definition: odesolver.hh:218
Interface class for ODE Solver.
Definition: odesolverinterface.hh:11
const int verbose_
Definition: odesolver.hh:589
static int rank()
Definition: mpimanager.hh:116
OperatorWrapper(Operator &op)
constructor
Definition: odesolver.hh:107
static constexpr T min(T a)
Definition: utility.hh:81
Definition: odesolver.hh:38
~ParDGOdeSolverBase()
destructor
Definition: odesolver.hh:236
BaseType::OperatorType OperatorType
Definition: odesolver.hh:296
ImplicitOdeSolver(OperatorType &op, TimeProviderBase &tp, const int order, const ParameterReader ¶meter=Parameter::container())
Definition: odesolver.hh:432
PARDGSpaceOperatorInterface< DestinationType > OperatorType
type of discretization operator
Definition: odesolver.hh:190
virtual const OperatorType & spaceOperator() const
for initialization
Definition: odesolver.hh:460
void initialize(const DestinationType &U0)
initialize solver
Definition: odesolver.hh:633
DestinationImp DestinationType
type of destination function
Definition: odesolver.hh:187
static constexpr T max(T a)
Definition: utility.hh:65
int linearSolverIterations_
Definition: odesolverinterface.hh:26
virtual int numberOfIterations()
Definition: odesolver.hh:501
OperatorWrapper< OperatorType > expl_
Definition: odesolver.hh:716
const OperatorType & spaceOperator() const
for initialization
Definition: odesolver.hh:357
bool initialized_
Definition: odesolver.hh:267
PARDG::IterativeLinearSolver * linsolver_
Definition: odesolver.hh:587
Definition: odesolver.hh:182
LimiterWrapper(Operator &op)
constructor
Definition: odesolver.hh:152
BaseType::OperatorType OperatorType
Definition: odesolver.hh:414
virtual int numberOfIterations()
Definition: odesolver.hh:703
Definition: multistep.hh:16
Definition: odesolver.hh:280
BaseType::MonitorType MonitorType
Definition: odesolver.hh:416
virtual PARDG::IterativeLinearSolver * linearSolver(PARDG::Communicator &comm) const
Definition: odesolver.hh:52
Definition: timestepcontrol.hh:24
Operator & op_
Definition: odesolver.hh:171
ODEParameters(const std::string keyPrefix, const ParameterReader ¶meter=Parameter::container())
Definition: odesolver.hh:47
void reset()
Definition: odesolverinterface.hh:34
LimiterWrapper< OperatorType > limiter_
Definition: odesolver.hh:717
OperatorWrapper< OperatorType > impl_
Definition: odesolver.hh:586
BaseType::DestinationType DestinationType
Definition: odesolver.hh:297
int maxLinearSolverIterations_
Definition: odesolverinterface.hh:28
virtual double timeStepEstimate(double cfl)
Definition: odesolver.hh:581
int dim_of_value(int i=0) const
return size of destination
Definition: odesolver.hh:130
BaseType::OperatorType OperatorType
Definition: odesolver.hh:618
Definition: odesolver.hh:101
general base for time providers
Definition: timeprovider.hh:35
const double cflMax_
Definition: odesolver.hh:591
abstract operator
Definition: operator.hh:25
const Operator & op() const
return reference to real operator
Definition: odesolver.hh:167
Definition: odesolver.hh:399
virtual double timeStepEstimate(double cfl)
Definition: odesolver.hh:709
Dune::Fem::ParameterReader parameter_
Definition: timestepcontrol.hh:40
virtual std::string name() const
return name of ode solver
Definition: odesolver.hh:454
Definition: timestepcontrol.hh:25
Definition: coordinate.hh:4
PARDG::ODESolver * createOdeSolver()
create implicit ode solver
Definition: odesolver.hh:463
ExplicitOdeSolver(OperatorType &op, TimeProviderBase &tp, const int order, bool verbose=false)
constructor
Definition: odesolver.hh:301
Operator & op_
Definition: odesolver.hh:141
void initializeOdeSolver()
Definition: odesolver.hh:206
ODEParameters(const ParameterReader ¶meter=Parameter::container())
Definition: odesolver.hh:43
const OperatorType & spaceOperator() const
for initialization
Definition: odesolver.hh:657
BaseType::DestinationType DestinationType
Definition: odesolver.hh:619
int dim_of_argument(int i=0) const
return size of argument
Definition: odesolver.hh:123
static ParameterContainer & container()
Definition: io/parameter.hh:190
BaseType::DestinationType DestinationType
Definition: odesolver.hh:415
BaseType::MonitorType MonitorType
Definition: odesolver.hh:298
const int order_
Definition: odesolver.hh:266
PARDG::ODESolver * createOdeSolver()
create explicit ode solver
Definition: odesolver.hh:360
void solve(DestinationType &U0, MonitorType &monitor)
solve system
Definition: odesolver.hh:313
ImplicitOdeSolver(OperatorType &op, TimeProviderBase &tp, const int order, const ODEParameters ¶meter)
Definition: odesolver.hh:418
static bool verbose()
obtain the cached value for fem.verbose
Definition: io/parameter.hh:444
int newtonIterations_
Definition: odesolverinterface.hh:25
double cfl_
Definition: odesolver.hh:590
OdeSolverInterface< DestinationImp >::MonitorType MonitorType
type of monitor class
Definition: odesolver.hh:193
int maxNewtonIterations_
Definition: odesolverinterface.hh:27
Definition: odesolverinterface.hh:17
const std::string keyPrefix_
Definition: timestepcontrol.hh:29
TimeProviderBase & timeProvider_
Definition: odesolver.hh:264
Definition: odesolver.hh:601
virtual ~ImplicitOdeSolver()
Definition: odesolver.hh:446
ParDGOdeSolverBase(TimeProviderBase &tp, const int order)
constructor
Definition: odesolver.hh:196
void operator()(double *)
Definition: odesolver.hh:156
PARDG::Communicator & comm_
Definition: odesolver.hh:265
void solve(DestinationType &U0, MonitorType &monitor)
solve
Definition: odesolver.hh:508
void operator()(const double *u, double *f, int i=0)
Definition: odesolver.hh:113
Definition: timestepcontrol.hh:21
virtual std::string name() const
return name of ode solver
Definition: odesolver.hh:654
const ODEParameters * param_
Definition: odesolver.hh:588
const bool verbose_
Definition: odesolver.hh:390
void operator()(const double *u, double *f)
Definition: odesolver.hh:160
#define PARDG
Definition: pardg.hh:26
SemiImplicitOdeSolver(OperatorType &explOp, OperatorType &implOp, TimeProviderBase &tp, const int order, const ODEParameters ¶meter=ODEParameters())
Definition: odesolver.hh:621
virtual ~ExplicitOdeSolver()
destructor
Definition: odesolver.hh:310
Definition: timestepcontrol.hh:25
OperatorWrapper< OperatorType > expl_
Definition: odesolver.hh:389
void description(std::ostream &out) const
print description of ODE solver to out stream
Definition: odesolver.hh:246