Tempus  Version of the Day
Time Integration
Tempus_StepperStaggeredForwardSensitivity_impl.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_StepperStaggeredForwardSensitivity_impl_hpp
10 #define Tempus_StepperStaggeredForwardSensitivity_impl_hpp
11 
12 #include "Tempus_config.hpp"
16 #include "Teuchos_VerboseObjectParameterListHelpers.hpp"
17 
18 #include "Thyra_DefaultMultiVectorProductVectorSpace.hpp"
19 #include "Thyra_DefaultMultiVectorProductVector.hpp"
20 
21 namespace Tempus {
22 
23 // Forward Declaration for recursive includes (this Stepper <--> StepperFactory)
24 template<class Scalar> class StepperFactory;
25 
26 // StepperStaggeredForwardSensitivity definitions:
27 template<class Scalar>
30  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel,
31  const Teuchos::RCP<Teuchos::ParameterList>& pList,
32  const Teuchos::RCP<Teuchos::ParameterList>& sens_pList)
33 {
34  using Teuchos::RCP;
35  using Teuchos::ParameterList;
36 
37  // Set all the input parameters and call initialize
38  this->setParams(pList, sens_pList);
39  this->setModel(appModel);
40  this->initialize();
41 }
42 
43 
44 template<class Scalar>
47  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel)
48 {
49  using Teuchos::RCP;
50  using Teuchos::rcp;
51  using Teuchos::ParameterList;
52 
53  // Create forward sensitivity model evaluator wrapper
54  Teuchos::RCP<Teuchos::ParameterList> spl = Teuchos::parameterList();
55  *spl = *sensPL_;
56  spl->remove("Reuse State Linear Solver");
57  spl->remove("Force W Update");
58  fsa_model_ = wrapStaggeredFSAModelEvaluator(appModel, spl);
59 
60  // Create combined FSA ME which serves as "the" ME for this stepper,
61  // so that getModel() has a ME consistent the FSA problem (including both
62  // state and sensitivity components), e.g., the integrator may call
63  // getModel()->getNominalValues(), which needs to be consistent.
64  combined_fsa_model_ = wrapCombinedFSAModelEvaluator(appModel, spl);
65 
66  // Create state and sensitivity steppers
67  RCP<StepperFactory<Scalar> > sf =Teuchos::rcp(new StepperFactory<Scalar>());
68  if (stateStepper_ == Teuchos::null)
69  stateStepper_ = sf->createStepper(appModel, stepperPL_);
70  else
71  stateStepper_->setModel(appModel);
72  if (sensitivityStepper_ == Teuchos::null)
73  sensitivityStepper_ = sf->createStepper(fsa_model_, stepperPL_);
74  else
75  sensitivityStepper_->setModel(fsa_model_);
76 }
77 
78 
79 template<class Scalar>
82  const Teuchos::RCP<Thyra::ModelEvaluator<Scalar> >& appModel)
83 {
84  this->setModel(appModel);
85 }
86 
87 
88 template<class Scalar>
90 setSolver(std::string solverName)
91 {
92  stateStepper_->setSolver(solverName);
93  sensitivityStepper_->setSolver(solverName);
94 }
95 
96 template<class Scalar>
97 Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >
100 {
101  return combined_fsa_model_;
102 }
103 
104 
105 template<class Scalar>
108  Teuchos::RCP<Teuchos::ParameterList> solverPL)
109 {
110  stateStepper_->setSolver(solverPL);
111  sensitivityStepper_->setSolver(solverPL);
112 }
113 
114 
115 template<class Scalar>
118  Teuchos::RCP<Thyra::NonlinearSolverBase<Scalar> > solver)
119 {
120  stateStepper_->setSolver(solver);
121  sensitivityStepper_->setSolver(solver);
122 }
123 
124 
125 template<class Scalar>
128 {
129  this->setSolver();
130 }
131 
132 
133 template<class Scalar>
136  const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory)
137 {
138  using Teuchos::RCP;
139  using Teuchos::rcp;
140  using Teuchos::rcp_dynamic_cast;
141  using Thyra::VectorBase;
142  using Thyra::MultiVectorBase;
143  using Thyra::assign;
144  using Thyra::createMember;
145  using Thyra::multiVectorProductVector;
146  using Thyra::multiVectorProductVectorSpace;
147  typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
148  typedef Thyra::DefaultMultiVectorProductVectorSpace<Scalar> DMVPVS;
149 
150  // Initialize state, sensitivity solution histories if necessary.
151  // We only need to split the solution history into state and sensitivity
152  // components for the first step, otherwise the state and sensitivity
153  // histories are updated from the previous step.
154  if (stateSolutionHistory_ == Teuchos::null) {
155  RCP<Teuchos::ParameterList> shPL =
156  solutionHistory->getNonconstParameterList();
157 
158  // Get product X, XDot, XDotDot
159  RCP<SolutionState<Scalar> > state = solutionHistory->getCurrentState();
160  RCP<DMVPV> X, XDot, XDotDot;
161  X = rcp_dynamic_cast<DMVPV>(state->getX(),true);
162  XDot = rcp_dynamic_cast<DMVPV>(state->getXDot(),true);
163  if (state->getXDotDot() != Teuchos::null)
164  XDotDot = rcp_dynamic_cast<DMVPV>(state->getXDotDot(),true);
165 
166  // Pull out state components (has to be non-const because of SolutionState
167  // constructor)
168  RCP<VectorBase<Scalar> > x, xdot, xdotdot;
169  x = X->getNonconstMultiVector()->col(0);
170  xdot = XDot->getNonconstMultiVector()->col(0);
171  if (XDotDot != Teuchos::null)
172  xdotdot = XDotDot->getNonconstMultiVector()->col(0);
173 
174  // Create state solution history
175  RCP<SolutionState<Scalar> > state_state =
176  rcp(new SolutionState<Scalar>(state->getMetaData()->clone(),
177  x, xdot, xdotdot,
178  state->getStepperState()->clone()));
179  stateSolutionHistory_ = rcp(new SolutionHistory<Scalar>(shPL));
180  stateSolutionHistory_->addState(state_state);
181 
182  const int num_param = X->getMultiVector()->domain()->dim()-1;
183  TEUCHOS_ASSERT(num_param > 0);
184  const Teuchos::Range1D rng(1,num_param);
185 
186  // Pull out sensitivity components
187  RCP<MultiVectorBase<Scalar> > dxdp, dxdotdp, dxdotdotdp;
188  dxdp = X->getNonconstMultiVector()->subView(rng);
189  dxdotdp = XDot->getNonconstMultiVector()->subView(rng);
190  if (XDotDot != Teuchos::null)
191  dxdotdotdp = XDotDot->getNonconstMultiVector()->subView(rng);
192 
193  // Create sensitivity product vectors
194  RCP<VectorBase<Scalar> > dxdp_vec, dxdotdp_vec, dxdotdotdp_vec;
195  RCP<const DMVPVS> prod_space =
196  multiVectorProductVectorSpace(X->getMultiVector()->range(), num_param);
197  dxdp_vec = multiVectorProductVector(prod_space, dxdp);
198  dxdotdp_vec = multiVectorProductVector(prod_space, dxdotdp);
199  if (XDotDot != Teuchos::null)
200  dxdotdotdp_vec = multiVectorProductVector(prod_space, dxdotdotdp);
201 
202  // Create sensitivity solution history
203  RCP<SolutionState<Scalar> > sens_state =
204  rcp(new SolutionState<Scalar>(state->getMetaData()->clone(),
205  dxdp_vec, dxdotdp_vec, dxdotdotdp_vec,
206  state->getStepperState()->clone()));
207  sensSolutionHistory_ = rcp(new SolutionHistory<Scalar>(shPL));
208  sensSolutionHistory_->addState(sens_state);
209  }
210 
211  // Get our working state
212  RCP<SolutionState<Scalar> > prod_state = solutionHistory->getWorkingState();
213  RCP<DMVPV> X, XDot, XDotDot;
214  X = rcp_dynamic_cast<DMVPV>(prod_state->getX(),true);
215  XDot = rcp_dynamic_cast<DMVPV>(prod_state->getXDot(),true);
216  if (prod_state->getXDotDot() != Teuchos::null)
217  XDotDot = rcp_dynamic_cast<DMVPV>(prod_state->getXDotDot(),true);
218 
219  // Take step for state equations
220  stateSolutionHistory_->initWorkingState();
221  RCP<SolutionState<Scalar> > state = stateSolutionHistory_->getWorkingState();
222  state->getMetaData()->copy(prod_state->getMetaData());
223  stateStepper_->takeStep(stateSolutionHistory_);
224 
225  // Set state components of product state
226  assign(X->getNonconstMultiVector()->col(0).ptr(), *(state->getX()));
227  assign(XDot->getNonconstMultiVector()->col(0).ptr(), *(state->getXDot()));
228  if (XDotDot != Teuchos::null)
229  assign(XDotDot->getNonconstMultiVector()->col(0).ptr(),
230  *(state->getXDotDot()));
231  prod_state->setOrder(state->getOrder());
232 
233  // If step passed promote the state, otherwise fail and stop
234  if (state->getSolutionStatus() == Status::FAILED) {
235  prod_state->setSolutionStatus(Status::FAILED);
236  return;
237  }
238  stateSolutionHistory_->promoteWorkingState();
239 
240  // Get forward state in sensitivity model evaluator
241  fsa_model_->setForwardSolutionHistory(stateSolutionHistory_);
242  if (reuse_solver_ && stateStepper_->getSolver() != Teuchos::null)
243  fsa_model_->setSolver(stateStepper_->getSolver(), force_W_update_);
244 
245  // Take step in sensitivity equations
246  sensSolutionHistory_->initWorkingState();
247  RCP<SolutionState<Scalar> > sens_state =
248  sensSolutionHistory_->getWorkingState();
249  sens_state->getMetaData()->copy(prod_state->getMetaData());
250  sensitivityStepper_->takeStep(sensSolutionHistory_);
251 
252  // Set sensitivity components of product state
253  RCP<const MultiVectorBase<Scalar> > dxdp =
254  rcp_dynamic_cast<const DMVPV>(sens_state->getX(),true)->getMultiVector();
255  const int num_param = dxdp->domain()->dim();
256  const Teuchos::Range1D rng(1,num_param);
257  assign(X->getNonconstMultiVector()->subView(rng).ptr(), *dxdp);
258  RCP<const MultiVectorBase<Scalar> > dxdotdp =
259  rcp_dynamic_cast<const DMVPV>(sens_state->getXDot(),true)->getMultiVector();
260  assign(XDot->getNonconstMultiVector()->subView(rng).ptr(), *dxdotdp);
261  if (sens_state->getXDotDot() != Teuchos::null) {
262  RCP<const MultiVectorBase<Scalar> > dxdotdotdp =
263  rcp_dynamic_cast<const DMVPV>(sens_state->getXDotDot(),true)->getMultiVector();
264  assign(XDotDot->getNonconstMultiVector()->subView(rng).ptr(), *dxdotdotdp);
265  }
266  prod_state->setOrder(std::min(state->getOrder(), sens_state->getOrder()));
267 
268  // If step passed promote the state, otherwise fail and stop
269  if (sens_state->getSolutionStatus() == Status::FAILED) {
270  prod_state->setSolutionStatus(Status::FAILED);
271  }
272  else {
273  sensSolutionHistory_->promoteWorkingState();
274  prod_state->setSolutionStatus(Status::PASSED);
275  }
276 }
277 
278 
279 template<class Scalar>
280 Teuchos::RCP<Tempus::StepperState<Scalar> >
283 {
284  // ETP: Note, maybe this should be a special stepper state that combines
285  // states from both state and sensitivity steppers?
286  Teuchos::RCP<Tempus::StepperState<Scalar> > stepperState =
287  rcp(new StepperState<Scalar>(description()));
288  return stepperState;
289 }
290 
291 
292 template<class Scalar>
294 description() const
295 {
296  std::string name = "StepperStaggeredForwardSensitivity";
297  return(name);
298 }
299 
300 
301 template<class Scalar>
304  Teuchos::FancyOStream &out,
305  const Teuchos::EVerbosityLevel verbLevel) const
306 {
307  out << description() << "::describe:" << std::endl;
308  stateStepper_->describe(out, verbLevel);
309  out << std::endl;
310  sensitivityStepper_->describe(out, verbLevel);
311 }
312 
313 
314 template <class Scalar>
317  Teuchos::RCP<Teuchos::ParameterList> const& pList)
318 {
319  if (pList == Teuchos::null) {
320  // Create default parameters if null, otherwise keep current parameters.
321  if (stepperPL_ == Teuchos::null) stepperPL_ = this->getDefaultParameters();
322  } else {
323  stepperPL_ = pList;
324  }
325  // Can not validate because of optional Parameters (e.g., Solver Name).
326  //stepperPL_->validateParametersAndSetDefaults(*this->getValidParameters());
327 }
328 
329 
330 template<class Scalar>
331 Teuchos::RCP<const Teuchos::ParameterList>
334 {
335  return stateStepper_->getValidParameters();
336 }
337 
338 
339 template<class Scalar>
340 Teuchos::RCP<Teuchos::ParameterList>
343 {
344  return stateStepper_->getDefaultParameters();
345 }
346 
347 
348 template <class Scalar>
349 Teuchos::RCP<Teuchos::ParameterList>
352 {
353  return stepperPL_;
354 }
355 
356 
357 template <class Scalar>
358 Teuchos::RCP<Teuchos::ParameterList>
361 {
362  Teuchos::RCP<Teuchos::ParameterList> temp_plist = stepperPL_;
363  stepperPL_ = Teuchos::null;
364  return temp_plist;
365 }
366 
367 
368 template <class Scalar>
371  Teuchos::RCP<Teuchos::ParameterList> const& pList,
372  Teuchos::RCP<Teuchos::ParameterList> const& spList)
373 {
374  if (pList == Teuchos::null)
375  stepperPL_ = this->getDefaultParameters();
376  else
377  stepperPL_ = pList;
378 
379  if (spList == Teuchos::null)
380  sensPL_ = Teuchos::parameterList();
381  else
382  sensPL_ = spList;
383 
384  reuse_solver_ = sensPL_->get("Reuse State Linear Solver", false);
385  force_W_update_ = sensPL_->get("Force W Update", true);
386 
387  // Can not validate because of optional Parameters (e.g., Solver Name).
388  //stepperPL_->validateParametersAndSetDefaults(*this->getValidParameters());
389 }
390 
391 
392 template <class Scalar>
393 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
395 get_x_space() const
396 {
397  using Teuchos::RCP;
398  using Teuchos::rcp_dynamic_cast;
399  typedef Thyra::DefaultMultiVectorProductVectorSpace<Scalar> DMVPVS;
400 
401  RCP<const Thyra::VectorSpaceBase<Scalar> > x_space =
402  stateStepper_->getModel()->get_x_space();
403  RCP<const DMVPVS> dxdp_space =
404  rcp_dynamic_cast<const DMVPVS>(sensitivityStepper_->getModel()->get_x_space(),true);
405  const int num_param = dxdp_space->numBlocks();
406  RCP<const Thyra::VectorSpaceBase<Scalar> > prod_space =
407  multiVectorProductVectorSpace(x_space, num_param+1);
408  return prod_space;
409 }
410 
411 } // namespace Tempus
412 
413 #endif // Tempus_StepperStaggeredForwardSensitivity_impl_hpp
Tempus::StepperState
StepperState is a simple class to hold state information about the stepper.
Definition: Tempus_StepperState.hpp:36
Tempus::StepperStaggeredForwardSensitivity::get_x_space
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_x_space() const
Definition: Tempus_StepperStaggeredForwardSensitivity_impl.hpp:395
Tempus::StepperStaggeredForwardSensitivity::setParameterList
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > &pl)
Definition: Tempus_StepperStaggeredForwardSensitivity_impl.hpp:316
Tempus::StepperStaggeredForwardSensitivity::initialize
virtual void initialize()
Initialize during construction and after changing input parameters.
Definition: Tempus_StepperStaggeredForwardSensitivity_impl.hpp:127
Tempus::StepperStaggeredForwardSensitivity::takeStep
virtual void takeStep(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Take the specified timestep, dt, and return true if successful.
Definition: Tempus_StepperStaggeredForwardSensitivity_impl.hpp:135
Tempus::solutionHistory
Teuchos::RCP< SolutionHistory< Scalar > > solutionHistory(Teuchos::RCP< Teuchos::ParameterList > pList=Teuchos::null)
Nonmember constructor.
Definition: Tempus_SolutionHistory_impl.hpp:504
Tempus::StepperStaggeredForwardSensitivity::description
virtual std::string description() const
Definition: Tempus_StepperStaggeredForwardSensitivity_impl.hpp:294
Tempus::StepperStaggeredForwardSensitivity::setSolver
virtual void setSolver(std::string solverName)
Set solver via ParameterList solver name.
Definition: Tempus_StepperStaggeredForwardSensitivity_impl.hpp:90
Tempus::StepperStaggeredForwardSensitivity::unsetParameterList
Teuchos::RCP< Teuchos::ParameterList > unsetParameterList()
Definition: Tempus_StepperStaggeredForwardSensitivity_impl.hpp:360
Tempus::wrapCombinedFSAModelEvaluator
Teuchos::RCP< SensitivityModelEvaluatorBase< Scalar > > wrapCombinedFSAModelEvaluator(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model, const Teuchos::RCP< const Teuchos::ParameterList > &pList=Teuchos::null)
Definition: Tempus_WrapCombinedFSAModelEvaluator.hpp:24
Tempus::StepperStaggeredForwardSensitivity::getNonconstParameterList
Teuchos::RCP< Teuchos::ParameterList > getNonconstParameterList()
Definition: Tempus_StepperStaggeredForwardSensitivity_impl.hpp:351
Tempus
Definition: Tempus_AdjointAuxSensitivityModelEvaluator_decl.hpp:20
Tempus::StepperStaggeredForwardSensitivity::setParams
void setParams(const Teuchos::RCP< Teuchos::ParameterList > &pl, const Teuchos::RCP< Teuchos::ParameterList > &spl)
Definition: Tempus_StepperStaggeredForwardSensitivity_impl.hpp:370
Tempus::StepperStaggeredForwardSensitivity::getValidParameters
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
Definition: Tempus_StepperStaggeredForwardSensitivity_impl.hpp:333
Tempus::StepperStaggeredForwardSensitivity::setNonConstModel
virtual void setNonConstModel(const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &appModel)
Definition: Tempus_StepperStaggeredForwardSensitivity_impl.hpp:81
Tempus::StepperStaggeredForwardSensitivity::getModel
virtual Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > getModel()
Definition: Tempus_StepperStaggeredForwardSensitivity_impl.hpp:99
Tempus::SolutionState
Solution state for integrators and steppers. SolutionState contains the metadata for solutions and th...
Definition: Tempus_SolutionState_decl.hpp:56
Tempus::StepperStaggeredForwardSensitivity::StepperStaggeredForwardSensitivity
StepperStaggeredForwardSensitivity()
Default Constructor – not allowed.
Tempus_WrapCombinedFSAModelEvaluator.hpp
Tempus::StepperStaggeredForwardSensitivity::getDefaultStepperState
virtual Teuchos::RCP< Tempus::StepperState< Scalar > > getDefaultStepperState()
Get a default (initial) StepperState.
Definition: Tempus_StepperStaggeredForwardSensitivity_impl.hpp:282
Tempus::PASSED
Definition: Tempus_Types.hpp:17
Tempus::SolutionHistory
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
Definition: Tempus_Integrator.hpp:25
Tempus_WrapStaggeredFSAModelEvaluator.hpp
Tempus::StepperFactory
Stepper factory.
Definition: Tempus_StepperBackwardEuler_impl.hpp:22
Tempus::StepperStaggeredForwardSensitivity::setModel
virtual void setModel(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &appModel)
Definition: Tempus_StepperStaggeredForwardSensitivity_impl.hpp:46
Tempus::FAILED
Definition: Tempus_Types.hpp:18
Tempus::StepperStaggeredForwardSensitivity::getDefaultParameters
Teuchos::RCP< Teuchos::ParameterList > getDefaultParameters() const
Definition: Tempus_StepperStaggeredForwardSensitivity_impl.hpp:342
Tempus_StepperFactory.hpp
Tempus::wrapStaggeredFSAModelEvaluator
Teuchos::RCP< SensitivityModelEvaluatorBase< Scalar > > wrapStaggeredFSAModelEvaluator(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model, const Teuchos::RCP< const Teuchos::ParameterList > &pList=Teuchos::null)
Definition: Tempus_WrapStaggeredFSAModelEvaluator.hpp:27
Tempus::StepperStaggeredForwardSensitivity::describe
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
Definition: Tempus_StepperStaggeredForwardSensitivity_impl.hpp:303