Tempus  Version of the Day
Time Integration
Tempus_StepperOperatorSplit_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_StepperOperatorSplit_decl_hpp
10 #define Tempus_StepperOperatorSplit_decl_hpp
11 
12 #include "Tempus_config.hpp"
13 #include "Tempus_Stepper.hpp"
15 
16 
17 namespace Tempus {
18 
19 /** \brief OperatorSplit stepper loops through the Stepper list.
20  *
21  * OperatorSplit stepper loops through the provided list of SubSteppers,
22  * and passes the SolutionHistory sequentially between them. This is
23  * simply a first-order splitting. It should be noted that specially
24  * constructed sequence of SubSteppers could obtain higher orders.
25  *
26  * The OperatorSplit Stepper does not have any model, but the SubSteppers
27  * do. The OperatorSplit Stepper does not have a solver either, but the
28  * SubSteppers may or may not have a solver depending if they are implicit
29  * or explicit.
30  *
31  * Operator Split is only defined for one-step methods, so multi-step
32  * methods (e.g., BDF) should not be used with StepperOperatorSplit.
33  */
34 template<class Scalar>
35 class StepperOperatorSplit : virtual public Tempus::Stepper<Scalar>
36 {
37 public:
38 
39  /// Constructor
41  std::vector<Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> > > appModels,
42  Teuchos::RCP<Teuchos::ParameterList> pList);
43 
44  /// Constructor which is setup except for models and steppers (i.e., addStepper()), and an initialize() before being used.
46 
47  /// \name Basic stepper methods
48  //@{
49  virtual void setModel(
50  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel);
51  virtual void setNonConstModel(
52  const Teuchos::RCP<Thyra::ModelEvaluator<Scalar> >& appModel);
53  virtual Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >
54  getModel();
55 
56  virtual void setSolver(std::string solverName);
57  virtual void setSolver(
58  Teuchos::RCP<Teuchos::ParameterList> solverPL=Teuchos::null);
59  virtual void setSolver(
60  Teuchos::RCP<Thyra::NonlinearSolverBase<Scalar> > solver);
61  virtual Teuchos::RCP<Thyra::NonlinearSolverBase<Scalar> > getSolver() const
62  { return Teuchos::null; }
63  virtual void setObserver(
64  Teuchos::RCP<StepperObserver<Scalar> > obs = Teuchos::null);
65  virtual void setTempState(Teuchos::RCP<Tempus::SolutionState<Scalar>> state)
66  { tempState_ = state; }
67 
68  /// Initialize during construction and after changing input parameters.
69  virtual void initialize();
70 
71  /// Take the specified timestep, dt, and return true if successful.
72  virtual void takeStep(
73  const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory);
74 
75  /// Pass initial guess to Newton solver (only relevant for explicit schemes)
76  virtual void setInitialGuess(
77  Teuchos::RCP<const Thyra::VectorBase<Scalar> > initial_guess)
78  {initial_guess_ = initial_guess;}
79 
80  virtual std::string getStepperType() const
81  { return stepperPL_->get<std::string>("Stepper Type"); }
82 
83  /// Get a default (initial) StepperState
84  virtual Teuchos::RCP<Tempus::StepperState<Scalar> > getDefaultStepperState();
85  virtual Scalar getOrder() const
86  {return stepperPL_->get<int>("Order");}
87  virtual Scalar getOrderMin() const
88  {return stepperPL_->get<int>("Minimum Order");}
89  virtual Scalar getOrderMax() const
90  {return stepperPL_->get<int>("Maximum Order");}
91  virtual Scalar getInitTimeStep(
92  const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory) const
93  {return std::numeric_limits<Scalar>::max();}
94  virtual void setOrder (Scalar ord)
95  {stepperPL_->set<int>("Order", ord);}
96  virtual void setOrderMin(Scalar ord)
97  {stepperPL_->set<int>("Minimum Order", ord);}
98  virtual void setOrderMax(Scalar ord)
99  {stepperPL_->set<int>("Maximum Order", ord);}
100 
101  virtual bool isExplicit() const
102  {
103  bool isExplicit = false;
104  typename std::vector<Teuchos::RCP<Stepper<Scalar> > >::const_iterator
105  subStepperIter = subStepperList_.begin();
106  for (; subStepperIter < subStepperList_.end(); subStepperIter++) {
107  if ( (*subStepperIter)->isExplicit() ) isExplicit = true;
108  }
109  return isExplicit;
110  }
111  virtual bool isImplicit() const
112  {
113  bool isImplicit = false;
114  typename std::vector<Teuchos::RCP<Stepper<Scalar> > >::const_iterator
115  subStepperIter = subStepperList_.begin();
116  for (; subStepperIter < subStepperList_.end(); subStepperIter++) {
117  if ( (*subStepperIter)->isImplicit() ) isImplicit = true;
118  }
119  return isImplicit;
120  }
121  virtual bool isExplicitImplicit() const
122  {return isExplicit() and isImplicit();}
123  virtual bool isOneStepMethod() const
124  {
125  bool isOneStepMethod = true;
126  typename std::vector<Teuchos::RCP<Stepper<Scalar> > >::const_iterator
127  subStepperIter = subStepperList_.begin();
128  for (; subStepperIter < subStepperList_.end(); subStepperIter++) {
129  if ( !(*subStepperIter)->isOneStepMethod() ) isOneStepMethod = false;
130  }
131  return isOneStepMethod;
132  }
133  virtual bool isMultiStepMethod() const {return !isOneStepMethod();}
134  //@}
135 
136  /// \name ParameterList methods
137  //@{
138  void setParameterList(const Teuchos::RCP<Teuchos::ParameterList> & pl);
139  Teuchos::RCP<Teuchos::ParameterList> getNonconstParameterList();
140  Teuchos::RCP<Teuchos::ParameterList> unsetParameterList();
141  Teuchos::RCP<const Teuchos::ParameterList> getValidParameters() const;
142  Teuchos::RCP<Teuchos::ParameterList> getDefaultParameters() const;
143  //@}
144 
145  /// \name Overridden from Teuchos::Describable
146  //@{
147  virtual std::string description() const;
148  virtual void describe(Teuchos::FancyOStream & out,
149  const Teuchos::EVerbosityLevel verbLevel) const;
150  //@}
151 
152  virtual std::vector<Teuchos::RCP<Stepper<Scalar> > > getStepperList() const
153  { return subStepperList_; }
154  virtual void setStepperList(std::vector<Teuchos::RCP<Stepper<Scalar> > > sl)
155  { subStepperList_ = sl; }
156  virtual void addStepper(Teuchos::RCP<Stepper<Scalar> > stepper)
157  { subStepperList_.push_back(stepper); }
158  virtual void clearStepperList() { subStepperList_.clear(); }
159  /// Take models and ParameterList and create subSteppers
160  virtual void createSubSteppers(
161  std::vector<Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> > > appModels);
162 
163 protected:
164 
165  Teuchos::RCP<Teuchos::ParameterList> stepperPL_;
166  std::vector<Teuchos::RCP<Stepper<Scalar> > > subStepperList_;
167  Teuchos::RCP<SolutionHistory<Scalar> > OpSpSolnHistory_;
168  Teuchos::RCP<SolutionState<Scalar> > tempState_;
169  Teuchos::RCP<StepperOperatorSplitObserver<Scalar> > stepperOSObserver_;
170  Teuchos::RCP<const Thyra::VectorBase<Scalar> > initial_guess_;
171 
172 };
173 
174 } // namespace Tempus
175 
176 #endif // Tempus_StepperOperatorSplit_decl_hpp
Teuchos::RCP< Teuchos::ParameterList > unsetParameterList()
virtual void setSolver(std::string solverName)
Set solver via ParameterList solver name.
Teuchos::RCP< Teuchos::ParameterList > getNonconstParameterList()
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
virtual void setInitialGuess(Teuchos::RCP< const Thyra::VectorBase< Scalar > > initial_guess)
Pass initial guess to Newton solver (only relevant for explicit schemes)
virtual Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > getModel()
virtual void addStepper(Teuchos::RCP< Stepper< Scalar > > stepper)
virtual void setObserver(Teuchos::RCP< StepperObserver< Scalar > > obs=Teuchos::null)
Set Observer.
std::vector< Teuchos::RCP< Stepper< Scalar > > > subStepperList_
virtual void setModel(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &appModel)
virtual void setNonConstModel(const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &appModel)
virtual Scalar getInitTimeStep(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory) const
virtual void createSubSteppers(std::vector< Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > > appModels)
Take models and ParameterList and create subSteppers.
virtual Teuchos::RCP< Tempus::StepperState< Scalar > > getDefaultStepperState()
Get a default (initial) StepperState.
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > &pl)
Teuchos::RCP< Teuchos::ParameterList > stepperPL_
OperatorSplit stepper loops through the Stepper list.
Thyra Base interface for time steppers.
StepperOperatorSplit()
Constructor which is setup except for models and steppers (i.e., addStepper()), and an initialize() b...
Teuchos::RCP< const Thyra::VectorBase< Scalar > > initial_guess_
Teuchos::RCP< SolutionState< Scalar > > tempState_
virtual Teuchos::RCP< Thyra::NonlinearSolverBase< Scalar > > getSolver() const
Get solver.
virtual void setTempState(Teuchos::RCP< Tempus::SolutionState< Scalar >> state)
StepperObserver class for Stepper class.
Teuchos::RCP< SolutionHistory< Scalar > > solutionHistory(Teuchos::RCP< Teuchos::ParameterList > pList=Teuchos::null)
Nonmember constructor.
virtual void setStepperList(std::vector< Teuchos::RCP< Stepper< Scalar > > > sl)
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
Teuchos::RCP< StepperOperatorSplitObserver< Scalar > > stepperOSObserver_
Teuchos::RCP< Teuchos::ParameterList > getDefaultParameters() const
Teuchos::RCP< SolutionHistory< Scalar > > OpSpSolnHistory_
virtual std::vector< Teuchos::RCP< Stepper< Scalar > > > getStepperList() const
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
virtual void takeStep(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Take the specified timestep, dt, and return true if successful.
virtual void initialize()
Initialize during construction and after changing input parameters.
Solution state for integrators and steppers. SolutionState contains the metadata for solutions and th...