Tempus Version of the Day
Time Integration
Loading...
Searching...
No Matches
Tempus_StepperIMEX_RK_Partition_decl.hpp
Go to the documentation of this file.
1// @HEADER
2// ****************************************************************************
3// Tempus: Copyright (2017) Sandia Corporation
4//
5// Distributed under BSD 3-clause license (See accompanying file Copyright.txt)
6// ****************************************************************************
7// @HEADER
8
9#ifndef Tempus_StepperIMEX_RK_Partition_decl_hpp
10#define Tempus_StepperIMEX_RK_Partition_decl_hpp
11
12#include "Tempus_config.hpp"
14#include "Tempus_StepperImplicit.hpp"
15#include "Tempus_WrapperModelEvaluatorPairPartIMEX_Basic.hpp"
16
17
18namespace Tempus {
19
319template<class Scalar>
321 virtual public Tempus::StepperRKBase<Scalar>
322{
323public:
324
330 StepperIMEX_RK_Partition(std::string stepperType = "Partitioned IMEX RK SSP2");
331
334 const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel,
335 const Teuchos::RCP<Thyra::NonlinearSolverBase<Scalar> >& solver,
336 bool useFSAL,
337 std::string ICConsistency,
338 bool ICConsistencyCheck,
339 bool zeroInitialGuess,
340 const Teuchos::RCP<StepperRKAppAction<Scalar> >& stepperRKAppAction,
341 std::string stepperType,
342 Teuchos::RCP<const RKButcherTableau<Scalar> > explicitTableau,
343 Teuchos::RCP<const RKButcherTableau<Scalar> > implicitTableau,
344 Scalar order);
345
347
348
349 virtual Teuchos::RCP<const RKButcherTableau<Scalar> > getTableau() const
350 { return getExplicitTableau(); }
351
353 virtual void setTableaus(std::string stepperType = "",
354 Teuchos::RCP<const RKButcherTableau<Scalar> > explicitTableau = Teuchos::null,
355 Teuchos::RCP<const RKButcherTableau<Scalar> > implicitTableau = Teuchos::null);
356
357 virtual void setTableausPartition(
358 Teuchos::RCP<Teuchos::ParameterList> pl,
359 std::string stepperType);
360
362 virtual Teuchos::RCP<const RKButcherTableau<Scalar> > getExplicitTableau() const
363 { return explicitTableau_; }
364
366 virtual void setExplicitTableau(
367 Teuchos::RCP<const RKButcherTableau<Scalar> > explicitTableau);
368
370 virtual Teuchos::RCP<const RKButcherTableau<Scalar> > getImplicitTableau() const
371 { return implicitTableau_; }
372
374 virtual void setImplicitTableau(
375 Teuchos::RCP<const RKButcherTableau<Scalar> > implicitTableau);
376
377 virtual void setModel(
378 const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel);
379
380 virtual Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> > getModel() const
381 { return this->wrapperModel_; }
382
383 virtual void setModelPair(
385 modelPair);
386
387 virtual void setModelPair(
388 const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& explicitModel,
389 const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& implicitModel);
390
392 virtual void initialize();
393
395 virtual void setInitialConditions (
396 const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory);
397
399 virtual void takeStep(
400 const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory);
401
402 virtual Teuchos::RCP<Tempus::StepperState<Scalar> >getDefaultStepperState();
403 virtual Scalar getOrder()const { return order_; }
404 virtual Scalar getOrderMin()const { return order_; }
405 virtual Scalar getOrderMax()const { return order_; }
406
407 virtual bool isExplicit() const {return true;}
408 virtual bool isImplicit() const {return true;}
409 virtual bool isExplicitImplicit() const
410 {return isExplicit() && isImplicit();}
411 virtual bool isOneStepMethod() const {return true;}
412 virtual bool isMultiStepMethod() const {return !isOneStepMethod();}
413 virtual OrderODE getOrderODE() const {return FIRST_ORDER_ODE;}
415
416 std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar> > >& getStageF() {return stageF_;}
417 std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar> > >& getStageGx() {return stageGx_;}
418 Teuchos::RCP<Thyra::VectorBase<Scalar> >& getXTilde() {return xTilde_;}
419
421 virtual Scalar getAlpha(const Scalar dt) const
422 {
423 const Teuchos::SerialDenseMatrix<int,Scalar> & A = implicitTableau_->A();
424 return Scalar(1.0)/(dt*A(0,0)); // Getting the first diagonal coeff!
425 }
427 virtual Scalar getBeta (const Scalar ) const { return Scalar(1.0); }
428
429 Teuchos::RCP<const Teuchos::ParameterList> getValidParameters() const;
430
432
433 virtual void describe(Teuchos::FancyOStream & out,
434 const Teuchos::EVerbosityLevel verbLevel) const;
436
437 virtual bool isValidSetup(Teuchos::FancyOStream & out) const;
438
440 const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & X,
441 const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & Y,
442 Scalar time, Scalar stepSize, Scalar stageNumber,
443 const Teuchos::RCP<Thyra::VectorBase<Scalar> > & G) const;
444
446 const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & X,
447 Scalar time, Scalar stepSize, Scalar stageNumber,
448 const Teuchos::RCP<Thyra::VectorBase<Scalar> > & F) const;
449
450 void setOrder(Scalar order) { order_ = order; }
451
452protected:
453
454 Teuchos::RCP<const RKButcherTableau<Scalar> > explicitTableau_;
455 Teuchos::RCP<const RKButcherTableau<Scalar> > implicitTableau_;
456
457 Scalar order_;
458
459 std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar> > > stageF_;
460 std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar> > > stageGx_;
461
462 Teuchos::RCP<Thyra::VectorBase<Scalar> > xTilde_;
463
464};
465
466
479template <typename Scalar>
481 : virtual public Tempus::TimeDerivative<Scalar>
482{
483public:
484
487 Scalar s, Teuchos::RCP<const Thyra::VectorBase<Scalar> > xTilde)
488 { initialize(s, xTilde); }
489
492
494 virtual void compute(
495 Teuchos::RCP<const Thyra::VectorBase<Scalar> > x,
496 Teuchos::RCP< Thyra::VectorBase<Scalar> > xDot,
497 Teuchos::RCP< Thyra::VectorBase<Scalar> > xDotDot = Teuchos::null)
498 {
499 xDotDot = Teuchos::null;
500
501 // ith stage
502 // s = 1/(dt*a_ii)
503 // xOld = solution at beginning of time step
504 // xTilde = xOld + dt*(Sum_{j=1}^{i-1} a_ij x_dot_j)
505 // xDotTilde = - (s*x_i - s*xTilde)
506 Thyra::V_StVpStV(xDot.ptr(),s_,*x,-s_,*xTilde_);
507 }
508
509 virtual void initialize(Scalar s,
510 Teuchos::RCP<const Thyra::VectorBase<Scalar> > xTilde)
511 { s_ = s; xTilde_ = xTilde; }
512
513private:
514
515 Teuchos::RCP<const Thyra::VectorBase<Scalar> > xTilde_;
516 Scalar s_; // = 1/(dt*a_ii)
517};
518
519
521// ------------------------------------------------------------------------
522template<class Scalar>
523Teuchos::RCP<StepperIMEX_RK_Partition<Scalar> >
525 const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& model,
526 std::string stepperType,
527 Teuchos::RCP<Teuchos::ParameterList> pl);
528
529
530} // namespace Tempus
531#endif // Tempus_StepperIMEX_RK_Partition_decl_hpp
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
Time-derivative interface for Partitioned IMEX RK.
Teuchos::RCP< const Thyra::VectorBase< Scalar > > xTilde_
virtual void compute(Teuchos::RCP< const Thyra::VectorBase< Scalar > > x, Teuchos::RCP< Thyra::VectorBase< Scalar > > xDot, Teuchos::RCP< Thyra::VectorBase< Scalar > > xDotDot=Teuchos::null)
Compute the time derivative.
StepperIMEX_RKPartTimeDerivative(Scalar s, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xTilde)
Constructor.
virtual void initialize(Scalar s, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xTilde)
Partitioned Implicit-Explicit Runge-Kutta (IMEX-RK) time stepper.
Teuchos::RCP< Thyra::VectorBase< Scalar > > & getXTilde()
virtual void setModelPair(const Teuchos::RCP< WrapperModelEvaluatorPairPartIMEX_Basic< Scalar > > &modelPair)
Create WrapperModelPairIMEX from user-supplied ModelEvaluator pair.
virtual Scalar getBeta(const Scalar) const
Return beta = d(x)/dx.
virtual void setTableaus(std::string stepperType="", Teuchos::RCP< const RKButcherTableau< Scalar > > explicitTableau=Teuchos::null, Teuchos::RCP< const RKButcherTableau< Scalar > > implicitTableau=Teuchos::null)
Set both the explicit and implicit tableau from ParameterList.
virtual Teuchos::RCP< Tempus::StepperState< Scalar > > getDefaultStepperState()
Provide a StepperState to the SolutionState. This Stepper does not have any special state data,...
virtual Teuchos::RCP< const RKButcherTableau< Scalar > > getExplicitTableau() const
Return explicit tableau.
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
std::vector< Teuchos::RCP< Thyra::VectorBase< Scalar > > > & getStageF()
virtual Teuchos::RCP< const RKButcherTableau< Scalar > > getImplicitTableau() const
Return implicit tableau.
virtual void setExplicitTableau(Teuchos::RCP< const RKButcherTableau< Scalar > > explicitTableau)
Set the explicit tableau from tableau.
virtual Scalar getAlpha(const Scalar dt) const
Return alpha = d(xDot)/dx.
virtual Teuchos::RCP< const RKButcherTableau< Scalar > > getTableau() const
Returns the explicit tableau!
Teuchos::RCP< Thyra::VectorBase< Scalar > > xTilde_
std::vector< Teuchos::RCP< Thyra::VectorBase< Scalar > > > & getStageGx()
Teuchos::RCP< const RKButcherTableau< Scalar > > explicitTableau_
virtual Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > getModel() const
virtual void setInitialConditions(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Set the initial conditions and make them consistent.
std::vector< Teuchos::RCP< Thyra::VectorBase< Scalar > > > stageF_
virtual void setModel(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &appModel)
Set the model.
virtual void setTableausPartition(Teuchos::RCP< Teuchos::ParameterList > pl, std::string stepperType)
virtual bool isValidSetup(Teuchos::FancyOStream &out) const
void evalImplicitModelExplicitly(const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &X, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &Y, Scalar time, Scalar stepSize, Scalar stageNumber, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &G) const
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
virtual void initialize()
Initialize during construction and after changing input parameters.
virtual void setImplicitTableau(Teuchos::RCP< const RKButcherTableau< Scalar > > implicitTableau)
Set the implicit tableau from tableau.
virtual void takeStep(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Take the specified timestep, dt, and return true if successful.
void evalExplicitModel(const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &X, Scalar time, Scalar stepSize, Scalar stageNumber, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &F) const
Teuchos::RCP< const RKButcherTableau< Scalar > > implicitTableau_
std::vector< Teuchos::RCP< Thyra::VectorBase< Scalar > > > stageGx_
Thyra Base interface for implicit time steppers.
Teuchos::RCP< WrapperModelEvaluator< Scalar > > wrapperModel_
Application Action for StepperRKBase.
Base class for Runge-Kutta methods, ExplicitRK, DIRK and IMEX.
This interface defines the time derivative connection between an implicit Stepper and WrapperModelEva...
ModelEvaluator pair for implicit and explicit (IMEX) evaulations.
Teuchos::RCP< StepperIMEX_RK_Partition< Scalar > > createStepperIMEX_RK_Partition(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model, std::string stepperType, Teuchos::RCP< Teuchos::ParameterList > pl)
Nonmember constructor - ModelEvaluator and ParameterList.
@ FIRST_ORDER_ODE
Stepper integrates first-order ODEs.