Tempus  Version of the Day
Time Integration
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Tempus_IntegratorPseudoTransientForwardSensitivity_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_IntegratorPseudoTransientForwardSensitivity_impl_hpp
10 #define Tempus_IntegratorPseudoTransientForwardSensitivity_impl_hpp
11 
12 #include "Thyra_DefaultMultiVectorProductVector.hpp"
13 #include "Thyra_VectorStdOps.hpp"
14 #include "Thyra_MultiVectorStdOps.hpp"
15 
17 
18 namespace Tempus {
19 
20 template <class Scalar>
25  const Teuchos::RCP<IntegratorBasic<Scalar>> &fwd_integrator,
26  const Teuchos::RCP<IntegratorBasic<Scalar>> &sens_integrator,
27  const bool reuse_solver, const bool force_W_update)
28  : model_(model),
29  sens_model_(sens_model),
30  state_integrator_(fwd_integrator),
31  sens_integrator_(sens_integrator),
32  reuse_solver_(reuse_solver),
33  force_W_update_(force_W_update),
34  stepMode_(SensitivityStepMode::Forward)
35 {
36 }
37 
38 template <class Scalar>
41  : reuse_solver_(false),
42  force_W_update_(false),
43  stepMode_(SensitivityStepMode::Forward)
44 {
45  state_integrator_ = createIntegratorBasic<Scalar>();
46  sens_integrator_ = createIntegratorBasic<Scalar>();
47 }
48 
49 template <class Scalar>
51 {
52  using Teuchos::RCP;
53  using Thyra::VectorBase;
54 
55  // Run state integrator and get solution
56  stepMode_ = SensitivityStepMode::Forward;
57  bool state_status = state_integrator_->advanceTime();
58 
59  // Set solution in sensitivity ME
60  sens_model_->setForwardSolutionState(state_integrator_->getCurrentState());
61 
62  // Reuse state solver if requested
63  if (reuse_solver_ &&
64  state_integrator_->getStepper()->getSolver() != Teuchos::null) {
65  sens_model_->setSolver(state_integrator_->getStepper()->getSolver(),
66  force_W_update_);
67  }
68 
69  // Run sensitivity integrator
71  bool sens_status = sens_integrator_->advanceTime();
72 
73  buildSolutionHistory();
74 
75  return state_status && sens_status;
76 }
77 
78 template <class Scalar>
80  const Scalar timeFinal)
81 {
82  TEMPUS_FUNC_TIME_MONITOR_DIFF(
83  "Tempus::IntegratorPseudoTransientForwardSensitivity::advanceTime()",
84  TEMPUS_PTFS_AT);
85 
86  using Teuchos::RCP;
87  using Thyra::VectorBase;
88 
89  // Run state integrator and get solution
90  bool state_status = true;
91  {
92  TEMPUS_FUNC_TIME_MONITOR_DIFF(
93  "Tempus::IntegratorPseudoTransientForwardSensitivity::advanceTime::"
94  "state",
95  TEMPUS_PTFS_AT_FWD);
96  state_status = state_integrator_->advanceTime(timeFinal);
97  }
98 
99  // Set solution in sensitivity ME
100  sens_model_->setForwardSolutionState(state_integrator_->getCurrentState());
101 
102  // Reuse state solver if requested
103  if (reuse_solver_ &&
104  state_integrator_->getStepper()->getSolver() != Teuchos::null) {
105  sens_model_->setSolver(state_integrator_->getStepper()->getSolver(),
106  force_W_update_);
107  }
108 
109  // Run sensitivity integrator
110  bool sens_status = true;
111  {
112  TEMPUS_FUNC_TIME_MONITOR_DIFF(
113  "Tempus::IntegratorPseudoTransientForwardSensitivity::advanceTime::"
114  "sensitivity",
115  TEMPUS_PTFS_AT_SEN);
116  sens_status = sens_integrator_->advanceTime(timeFinal);
117  }
118 
119  buildSolutionHistory();
120 
121  return state_status && sens_status;
122 }
123 
124 template <class Scalar>
126 {
127  return solutionHistory_->getCurrentTime();
128 }
129 
130 template <class Scalar>
132 {
133  return solutionHistory_->getCurrentIndex();
134 }
135 
136 template <class Scalar>
138 {
139  Status state_status = state_integrator_->getStatus();
140  Status sens_status = sens_integrator_->getStatus();
141  if (state_status == FAILED || sens_status == FAILED) return FAILED;
142  if (state_status == WORKING || sens_status == WORKING) return WORKING;
143  return PASSED;
144 }
145 
146 template <class Scalar>
148  const Status st)
149 {
150  state_integrator_->setStatus(st);
151  sens_integrator_->setStatus(st);
152 }
153 
154 template <class Scalar>
157 {
158  return state_integrator_->getStepper();
159 }
160 
161 template <class Scalar>
164 {
165  return state_integrator_->getStepper();
166 }
167 
168 template <class Scalar>
171 {
172  return sens_integrator_->getStepper();
173 }
174 
175 template <class Scalar>
178 {
179  return solutionHistory_;
180 }
181 
182 template <class Scalar>
185  const
186 {
187  return state_integrator_->getSolutionHistory();
188 }
189 
190 template <class Scalar>
193  const
194 {
195  return sens_integrator_->getSolutionHistory();
196 }
197 
198 template <class Scalar>
201  Scalar>::getNonConstSolutionHistory()
202 {
203  return solutionHistory_;
204 }
205 
206 template <class Scalar>
209 {
210  return state_integrator_->getTimeStepControl();
211 }
212 
213 template <class Scalar>
216  Scalar>::getNonConstTimeStepControl()
217 {
218  return state_integrator_->getNonConstTimeStepControl();
219 }
220 
221 template <class Scalar>
224  Scalar>::getStateNonConstTimeStepControl()
225 {
226  return state_integrator_->getNonConstTimeStepControl();
227 }
228 
229 template <class Scalar>
232  Scalar>::getSensNonConstTimeStepControl()
233 {
234  return sens_integrator_->getNonConstTimeStepControl();
235 }
236 
237 template <class Scalar>
240 {
241  return state_integrator_->getObserver();
242 }
243 
244 template <class Scalar>
247 {
248  state_integrator_->setObserver(obs);
249  sens_integrator_->setObserver(obs);
250 }
251 
252 template <class Scalar>
255  Scalar t0, Teuchos::RCP<const Thyra::VectorBase<Scalar>> x0,
257  Teuchos::RCP<const Thyra::VectorBase<Scalar>> xdotdot0,
260  Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>> DxdotdotDp0)
261 {
262  using Teuchos::RCP;
263  using Teuchos::rcp_dynamic_cast;
264  using Thyra::assign;
265  using Thyra::createMember;
268 
269  //
270  // Create and initialize product X, Xdot, Xdotdot
271 
272  RCP<const VectorSpaceBase<Scalar>> space = sens_model_->get_x_space();
273  RCP<DMVPV> X = rcp_dynamic_cast<DMVPV>(createMember(space));
274  RCP<DMVPV> Xdot = rcp_dynamic_cast<DMVPV>(createMember(space));
275  RCP<DMVPV> Xdotdot = rcp_dynamic_cast<DMVPV>(createMember(space));
276  const Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
277 
278  // x
279  if (DxDp0 == Teuchos::null)
280  assign(X->getNonconstMultiVector().ptr(), zero);
281  else
282  assign(X->getNonconstMultiVector().ptr(), *DxDp0);
283 
284  // xdot
285  if (DxdotDp0 == Teuchos::null)
286  assign(Xdot->getNonconstMultiVector().ptr(), zero);
287  else
288  assign(Xdot->getNonconstMultiVector().ptr(), *DxdotDp0);
289 
290  // xdotdot
291  if (DxdotDp0 == Teuchos::null)
292  assign(Xdotdot->getNonconstMultiVector().ptr(), zero);
293  else
294  assign(Xdotdot->getNonconstMultiVector().ptr(), *DxdotdotDp0);
295 
296  state_integrator_->initializeSolutionHistory(t0, x0, xdot0, xdotdot0);
297  sens_integrator_->initializeSolutionHistory(t0, X, Xdot, Xdotdot);
298 }
299 
300 template <class Scalar>
303 {
304  return state_integrator_->getX();
305 }
306 
307 template <class Scalar>
310 {
311  using Teuchos::RCP;
312  using Teuchos::rcp_dynamic_cast;
314 
315  RCP<const DMVPV> X = rcp_dynamic_cast<const DMVPV>(sens_integrator_->getX());
316  return X->getMultiVector();
317 }
318 
319 template <class Scalar>
322 {
323  return state_integrator_->getXDot();
324 }
325 
326 template <class Scalar>
329 {
330  using Teuchos::RCP;
331  using Teuchos::rcp_dynamic_cast;
333 
334  RCP<const DMVPV> Xdot =
335  rcp_dynamic_cast<const DMVPV>(sens_integrator_->getXDot());
336  return Xdot->getMultiVector();
337 }
338 
339 template <class Scalar>
342 {
343  return state_integrator_->getXDotDot();
344 }
345 
346 template <class Scalar>
349 {
350  using Teuchos::RCP;
351  using Teuchos::rcp_dynamic_cast;
353 
354  RCP<const DMVPV> Xdotdot =
355  rcp_dynamic_cast<const DMVPV>(sens_integrator_->getXDotDot());
356  return Xdotdot->getMultiVector();
357 }
358 
359 template <class Scalar>
362 {
363  typedef Thyra::ModelEvaluatorBase MEB;
364 
365  // Compute g which is computed by response 1 of the
366  // sensitivity model evaluator
367  MEB::InArgs<Scalar> inargs = sens_model_->getNominalValues();
368  MEB::OutArgs<Scalar> outargs = sens_model_->createOutArgs();
369  inargs.set_t(sens_integrator_->getTime());
370  inargs.set_x(sens_integrator_->getX());
371  if (inargs.supports(MEB::IN_ARG_x_dot))
372  inargs.set_x_dot(sens_integrator_->getXDot());
373  if (inargs.supports(MEB::IN_ARG_x_dot_dot))
374  inargs.set_x_dot_dot(sens_integrator_->getXDotDot());
375 
377  Thyra::createMember(sens_model_->get_g_space(1));
378  outargs.set_g(1, g);
379 
380  sens_model_->evalModel(inargs, outargs);
381  return g;
382 }
383 
384 template <class Scalar>
387 {
388  typedef Thyra::ModelEvaluatorBase MEB;
390 
391  // Compute final dg/dp which is computed by response 0 of the
392  // sensitivity model evaluator
393  MEB::InArgs<Scalar> inargs = sens_model_->getNominalValues();
394  MEB::OutArgs<Scalar> outargs = sens_model_->createOutArgs();
395  inargs.set_t(sens_integrator_->getTime());
396  inargs.set_x(sens_integrator_->getX());
397  if (inargs.supports(MEB::IN_ARG_x_dot))
398  inargs.set_x_dot(sens_integrator_->getXDot());
399  if (inargs.supports(MEB::IN_ARG_x_dot_dot))
400  inargs.set_x_dot_dot(sens_integrator_->getXDotDot());
401 
403  Thyra::createMember(sens_model_->get_g_space(0));
404  Teuchos::RCP<DMVPV> dgdp = Teuchos::rcp_dynamic_cast<DMVPV>(G);
405  outargs.set_g(0, G);
406 
407  sens_model_->evalModel(inargs, outargs);
408  return dgdp->getMultiVector();
409 }
410 
411 template <class Scalar>
413  const
414 {
415  std::string name = "Tempus::IntegratorPseudoTransientForwardSensitivity";
416  return (name);
417 }
418 
419 template <class Scalar>
421  Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
422 {
423  auto l_out = Teuchos::fancyOStream(out.getOStream());
424  Teuchos::OSTab ostab(*l_out, 2, this->description());
425  l_out->setOutputToRootOnly(0);
426 
427  *l_out << description() << "::describe" << std::endl;
428  state_integrator_->describe(*l_out, verbLevel);
429  sens_integrator_->describe(*l_out, verbLevel);
430 }
431 
432 template <class Scalar>
435 {
436  return stepMode_;
437 }
438 
439 template <class Scalar>
441 {
443  using Teuchos::RCP;
444  using Teuchos::rcp;
445  using Teuchos::rcp_dynamic_cast;
446  using Thyra::assign;
447  using Thyra::createMembers;
449  using Thyra::multiVectorProductVector;
450  using Thyra::VectorBase;
453 
454  // TODO: get the solution history PL or create it
455 
456  // Create combined solution histories, first for the states with zero
457  // sensitivities and then for the sensitivities with frozen states
458  RCP<ParameterList> shPL;
459  // Teuchos::sublist(state_integrator_->getIntegratorParameterList(), "Solution
460  // History", true);
461  solutionHistory_ = createSolutionHistoryPL<Scalar>(shPL);
462 
463  const int num_param = rcp_dynamic_cast<const DMVPV>(sens_integrator_->getX())
464  ->getMultiVector()
465  ->domain()
466  ->dim();
467  RCP<const VectorSpaceBase<Scalar>> x_space = model_->get_x_space();
468  RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar>> prod_space =
469  Thyra::multiVectorProductVectorSpace(x_space, num_param + 1);
470  const Teuchos::Range1D rng(1, num_param);
471  const Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
472 
473  RCP<const SolutionHistory<Scalar>> state_solution_history =
474  state_integrator_->getSolutionHistory();
475  int num_states = state_solution_history->getNumStates();
476  for (int i = 0; i < num_states; ++i) {
477  RCP<const SolutionState<Scalar>> state = (*state_solution_history)[i];
478 
479  // X
480  RCP<MultiVectorBase<Scalar>> x_mv = createMembers(x_space, num_param + 1);
481  assign(x_mv->col(0).ptr(), *(state->getX()));
482  assign(x_mv->subView(rng).ptr(), zero);
483  RCP<VectorBase<Scalar>> x = multiVectorProductVector(prod_space, x_mv);
484 
485  // X-Dot
486  RCP<VectorBase<Scalar>> x_dot;
487  if (state->getXDot() != Teuchos::null) {
488  RCP<MultiVectorBase<Scalar>> x_dot_mv =
489  createMembers(x_space, num_param + 1);
490  assign(x_dot_mv->col(0).ptr(), *(state->getXDot()));
491  assign(x_dot_mv->subView(rng).ptr(), zero);
492  x_dot = multiVectorProductVector(prod_space, x_dot_mv);
493  }
494 
495  // X-Dot-Dot
496  RCP<VectorBase<Scalar>> x_dot_dot;
497  if (state->getXDotDot() != Teuchos::null) {
498  RCP<MultiVectorBase<Scalar>> x_dot_dot_mv =
499  createMembers(x_space, num_param + 1);
500  assign(x_dot_dot_mv->col(0).ptr(), *(state->getXDotDot()));
501  assign(x_dot_dot_mv->subView(rng).ptr(), zero);
502  x_dot_dot = multiVectorProductVector(prod_space, x_dot_dot_mv);
503  }
504 
505  RCP<SolutionState<Scalar>> prod_state = state->clone();
506  prod_state->setX(x);
507  prod_state->setXDot(x_dot);
508  prod_state->setXDotDot(x_dot_dot);
509  solutionHistory_->addState(prod_state);
510  }
511 
512  RCP<const VectorBase<Scalar>> frozen_x =
513  state_solution_history->getCurrentState()->getX();
514  RCP<const VectorBase<Scalar>> frozen_x_dot =
515  state_solution_history->getCurrentState()->getXDot();
516  RCP<const VectorBase<Scalar>> frozen_x_dot_dot =
517  state_solution_history->getCurrentState()->getXDotDot();
518  RCP<const SolutionHistory<Scalar>> sens_solution_history =
519  sens_integrator_->getSolutionHistory();
520  num_states = sens_solution_history->getNumStates();
521  for (int i = 0; i < num_states; ++i) {
522  RCP<const SolutionState<Scalar>> state = (*sens_solution_history)[i];
523 
524  // X
525  RCP<MultiVectorBase<Scalar>> x_mv = createMembers(x_space, num_param + 1);
526  RCP<const MultiVectorBase<Scalar>> dxdp =
527  rcp_dynamic_cast<const DMVPV>(state->getX())->getMultiVector();
528  assign(x_mv->col(0).ptr(), *(frozen_x));
529  assign(x_mv->subView(rng).ptr(), *dxdp);
530  RCP<VectorBase<Scalar>> x = multiVectorProductVector(prod_space, x_mv);
531 
532  // X-Dot
533  RCP<VectorBase<Scalar>> x_dot;
534  if (state->getXDot() != Teuchos::null) {
535  RCP<MultiVectorBase<Scalar>> x_dot_mv =
536  createMembers(x_space, num_param + 1);
537  RCP<const MultiVectorBase<Scalar>> dxdotdp =
538  rcp_dynamic_cast<const DMVPV>(state->getXDot())->getMultiVector();
539  assign(x_dot_mv->col(0).ptr(), *(frozen_x_dot));
540  assign(x_dot_mv->subView(rng).ptr(), *dxdotdp);
541  x_dot = multiVectorProductVector(prod_space, x_dot_mv);
542  }
543 
544  // X-Dot-Dot
545  RCP<VectorBase<Scalar>> x_dot_dot;
546  if (state->getXDotDot() != Teuchos::null) {
547  RCP<MultiVectorBase<Scalar>> x_dot_dot_mv =
548  createMembers(x_space, num_param + 1);
549  RCP<const MultiVectorBase<Scalar>> dxdotdotdp =
550  rcp_dynamic_cast<const DMVPV>(state->getXDotDot())->getMultiVector();
551  assign(x_dot_dot_mv->col(0).ptr(), *(frozen_x_dot_dot));
552  assign(x_dot_dot_mv->subView(rng).ptr(), *dxdotdotdp);
553  x_dot_dot = multiVectorProductVector(prod_space, x_dot_dot_mv);
554  }
555 
556  RCP<SolutionState<Scalar>> prod_state = state->clone();
557  prod_state->setX(x);
558  prod_state->setXDot(x_dot);
559  prod_state->setXDotDot(x_dot_dot);
560  solutionHistory_->addState(prod_state, false);
561  }
562 }
563 
565 template <class Scalar>
570  const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>> &sens_residual_model,
571  const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>> &sens_solve_model)
572 {
573  auto fwd_integrator = createIntegratorBasic<Scalar>(pList, model);
575  Teuchos::RCP<IntegratorBasic<Scalar>> sens_integrator;
576 
577  {
581  fwd_integrator->getValidParameters();
584  pl->setParameters(*integrator_pl);
585  pl->sublist("Sensitivities").setParameters(*sensitivity_pl);
586  pl->sublist("Sensitivities").set("Reuse State Linear Solver", false);
587  pl->sublist("Sensitivities").set("Force W Update", false);
588  pl->sublist("Sensitivities").set("Cache Matrices", false);
589  pList->setParametersNotAlreadySet(*pl);
590  }
591 
592  bool reuse_solver =
593  pList->sublist("Sensitivities").get("Reuse State Linear Solver", false);
594  bool force_W_update =
595  pList->sublist("Sensitivities").get("Force W Update", false);
596  bool cache_matrices =
597  pList->sublist("Sensitivities").get("Cache Matrices", false);
598 
599  {
600  Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
601  if (pList != Teuchos::null) {
602  *pl = pList->sublist("Sensitivities");
603  }
604  pl->remove("Reuse State Linear Solver");
605  pl->remove("Force W Update");
606  pl->remove("Cache Matrices");
607  sens_model = wrapStaggeredFSAModelEvaluator(
608  model, sens_residual_model, sens_solve_model, cache_matrices, pl);
609  sens_integrator = createIntegratorBasic<Scalar>(pList, sens_model);
610  }
611 
613  integrator = Teuchos::rcp(
615  model, sens_model, fwd_integrator, sens_integrator, reuse_solver,
616  force_W_update));
617 
618  return (integrator);
619 }
620 
622 template <class Scalar>
625 {
627  integrator = Teuchos::rcp(
629  return (integrator);
630 }
631 
632 } // namespace Tempus
633 #endif // Tempus_IntegratorPseudoTransientForwardSensitivity_impl_hpp
virtual Teuchos::RCP< Stepper< Scalar > > getStepper() const override
Get the Stepper.
Teuchos::RCP< Tempus::IntegratorPseudoTransientForwardSensitivity< Scalar > > createIntegratorPseudoTransientForwardSensitivity(Teuchos::RCP< Teuchos::ParameterList > pList, const Teuchos::RCP< Thyra::ModelEvaluator< Scalar >> &model, const Teuchos::RCP< Thyra::ModelEvaluator< Scalar >> &sens_residual_model, const Teuchos::RCP< Thyra::ModelEvaluator< Scalar >> &sens_solve_model)
Nonmember constructor.
T & get(const std::string &name, T def_value)
Teuchos::RCP< SensitivityModelEvaluatorBase< Scalar > > wrapStaggeredFSAModelEvaluator(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model, const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &sens_residual_model, const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &sens_solve_model, const bool is_pseudotransient, const Teuchos::RCP< const Teuchos::ParameterList > &pList=Teuchos::null)
virtual Teuchos::RCP< const SolutionHistory< Scalar > > getSolutionHistory() const override
Get the SolutionHistory.
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getDxDp() const
virtual void initializeSolutionHistory(Scalar t0, Teuchos::RCP< const Thyra::VectorBase< Scalar >> x0, Teuchos::RCP< const Thyra::VectorBase< Scalar >> xdot0=Teuchos::null, Teuchos::RCP< const Thyra::VectorBase< Scalar >> xdotdot0=Teuchos::null, Teuchos::RCP< const Thyra::MultiVectorBase< Scalar >> DxDp0=Teuchos::null, Teuchos::RCP< const Thyra::MultiVectorBase< Scalar >> DxdotDp0=Teuchos::null, Teuchos::RCP< const Thyra::MultiVectorBase< Scalar >> DxdotdotDp0=Teuchos::null)
Set the initial state from Thyra::VectorBase(s)
virtual Teuchos::RCP< TimeStepControl< Scalar > > getNonConstTimeStepControl() override
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getG() const
Return response function g.
virtual bool advanceTime()
Advance the solution to timeMax, and return true if successful.
bool remove(std::string const &name, bool throwIfNotExists=true)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
virtual void setObserver(Teuchos::RCP< IntegratorObserver< Scalar >> obs=Teuchos::null)
Set the Observer.
SensitivityStepMode getStepMode() const
What mode the current time integration step is in.
Status
Status for the Integrator, the Stepper and the SolutionState.
IntegratorObserver class for time integrators.
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getDgDp() const
Return forward sensitivity stored in Jacobian format.
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getXDotDot() const
Get current the second time derivative of the solution, xdotdot.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const override
RCP< const MultiVectorBase< Scalar > > getMultiVector() const
virtual Teuchos::RCP< IntegratorObserver< Scalar > > getObserver()
Get the Observer.
ParameterList & setParameters(const ParameterList &source)
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getDXDotDp() const
RCP< std::basic_ostream< char_type, traits_type > > getOStream()
Time integrator suitable for pseudotransient forward sensitivity analysis.
ParameterList & setParametersNotAlreadySet(const ParameterList &source)
virtual RCP< const VectorSpaceBase< Scalar > > domain() const
ParameterList & sublist(const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
virtual Teuchos::RCP< const TimeStepControl< Scalar > > getTimeStepControl() const override
Get the TimeStepControl.
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getDXDotDotDp() const
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getXDot() const
Get current the time derivative of the solution, xdot.
A ModelEvaluator decorator for sensitivity analysis.
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getX() const
Get current the solution, x.