Tempus Version of the Day
Time Integration
Loading...
Searching...
No Matches
Tempus_IntegratorPseudoTransientForwardSensitivity_impl.hpp
Go to the documentation of this file.
1//@HEADER
2// *****************************************************************************
3// Tempus: Time Integration and Sensitivity Analysis Package
4//
5// Copyright 2017 NTESS and the Tempus contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8//@HEADER
9
10#ifndef Tempus_IntegratorPseudoTransientForwardSensitivity_impl_hpp
11#define Tempus_IntegratorPseudoTransientForwardSensitivity_impl_hpp
12
13#include "Thyra_DefaultMultiVectorProductVector.hpp"
14#include "Thyra_VectorStdOps.hpp"
15#include "Thyra_MultiVectorStdOps.hpp"
16
19
20namespace Tempus {
21
22template <class Scalar>
25 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>> &model,
26 const Teuchos::RCP<SensitivityModelEvaluatorBase<Scalar>> &sens_model,
27 const Teuchos::RCP<IntegratorBasic<Scalar>> &fwd_integrator,
28 const Teuchos::RCP<IntegratorBasic<Scalar>> &sens_integrator,
29 const bool reuse_solver, const bool force_W_update)
30 : model_(model),
31 sens_model_(sens_model),
32 state_integrator_(fwd_integrator),
33 sens_integrator_(sens_integrator),
34 reuse_solver_(reuse_solver),
35 force_W_update_(force_W_update),
37{
38}
39
40template <class Scalar>
50
51template <class Scalar>
53{
54 using Teuchos::RCP;
56
57 // Run state integrator and get solution
59 bool state_status = state_integrator_->advanceTime();
60
61 // Set solution in sensitivity ME
62 sens_model_->setForwardSolutionState(state_integrator_->getCurrentState());
63
64 // Reuse state solver if requested
65 if (reuse_solver_ &&
66 state_integrator_->getStepper()->getSolver() != Teuchos::null) {
67 sens_model_->setSolver(state_integrator_->getStepper()->getSolver(),
69 }
70
71 // Run sensitivity integrator
73 bool sens_status = sens_integrator_->advanceTime();
74
76
77 return state_status && sens_status;
78}
79
80template <class Scalar>
82 const Scalar timeFinal)
83{
84 TEMPUS_FUNC_TIME_MONITOR_DIFF(
85 "Tempus::IntegratorPseudoTransientForwardSensitivity::advanceTime()",
86 TEMPUS_PTFS_AT);
87
88 using Teuchos::RCP;
90
91 // Run state integrator and get solution
92 bool state_status = true;
93 {
94 TEMPUS_FUNC_TIME_MONITOR_DIFF(
95 "Tempus::IntegratorPseudoTransientForwardSensitivity::advanceTime::"
96 "state",
97 TEMPUS_PTFS_AT_FWD);
98 state_status = state_integrator_->advanceTime(timeFinal);
99 }
100
101 // Set solution in sensitivity ME
102 sens_model_->setForwardSolutionState(state_integrator_->getCurrentState());
103
104 // Reuse state solver if requested
105 if (reuse_solver_ &&
106 state_integrator_->getStepper()->getSolver() != Teuchos::null) {
107 sens_model_->setSolver(state_integrator_->getStepper()->getSolver(),
109 }
110
111 // Run sensitivity integrator
112 bool sens_status = true;
113 {
114 TEMPUS_FUNC_TIME_MONITOR_DIFF(
115 "Tempus::IntegratorPseudoTransientForwardSensitivity::advanceTime::"
116 "sensitivity",
117 TEMPUS_PTFS_AT_SEN);
118 sens_status = sens_integrator_->advanceTime(timeFinal);
119 }
120
122
123 return state_status && sens_status;
124}
125
126template <class Scalar>
128{
129 return solutionHistory_->getCurrentTime();
130}
131
132template <class Scalar>
134{
135 return solutionHistory_->getCurrentIndex();
136}
137
138template <class Scalar>
140{
141 Status state_status = state_integrator_->getStatus();
142 Status sens_status = sens_integrator_->getStatus();
143 if (state_status == FAILED || sens_status == FAILED) return FAILED;
144 if (state_status == WORKING || sens_status == WORKING) return WORKING;
145 return PASSED;
146}
147
148template <class Scalar>
150 const Status st)
151{
152 state_integrator_->setStatus(st);
153 sens_integrator_->setStatus(st);
154}
155
156template <class Scalar>
157Teuchos::RCP<Stepper<Scalar>>
162
163template <class Scalar>
164Teuchos::RCP<Stepper<Scalar>>
169
170template <class Scalar>
171Teuchos::RCP<Stepper<Scalar>>
176
177template <class Scalar>
178Teuchos::RCP<const SolutionHistory<Scalar>>
183
184template <class Scalar>
185Teuchos::RCP<const SolutionHistory<Scalar>>
191
192template <class Scalar>
193Teuchos::RCP<const SolutionHistory<Scalar>>
199
200template <class Scalar>
201Teuchos::RCP<SolutionHistory<Scalar>>
204{
205 return solutionHistory_;
206}
207
208template <class Scalar>
209Teuchos::RCP<const TimeStepControl<Scalar>>
214
215template <class Scalar>
216Teuchos::RCP<TimeStepControl<Scalar>>
219{
220 return state_integrator_->getNonConstTimeStepControl();
221}
222
223template <class Scalar>
224Teuchos::RCP<TimeStepControl<Scalar>>
227{
228 return state_integrator_->getNonConstTimeStepControl();
229}
230
231template <class Scalar>
232Teuchos::RCP<TimeStepControl<Scalar>>
235{
236 return sens_integrator_->getNonConstTimeStepControl();
237}
238
239template <class Scalar>
240Teuchos::RCP<IntegratorObserver<Scalar>>
245
246template <class Scalar>
248 Teuchos::RCP<IntegratorObserver<Scalar>> obs)
249{
250 state_integrator_->setObserver(obs);
251 sens_integrator_->setObserver(obs);
252}
253
254template <class Scalar>
257 Scalar t0, Teuchos::RCP<const Thyra::VectorBase<Scalar>> x0,
258 Teuchos::RCP<const Thyra::VectorBase<Scalar>> xdot0,
259 Teuchos::RCP<const Thyra::VectorBase<Scalar>> xdotdot0,
260 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>> DxDp0,
261 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>> DxdotDp0,
262 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>> DxdotdotDp0)
263{
264 using Teuchos::RCP;
265 using Teuchos::rcp_dynamic_cast;
266 using Thyra::assign;
267 using Thyra::createMember;
268 using Thyra::VectorSpaceBase;
269 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
270
271 //
272 // Create and initialize product X, Xdot, Xdotdot
273
274 RCP<const VectorSpaceBase<Scalar>> space = sens_model_->get_x_space();
275 RCP<DMVPV> X = rcp_dynamic_cast<DMVPV>(createMember(space));
276 RCP<DMVPV> Xdot = rcp_dynamic_cast<DMVPV>(createMember(space));
277 RCP<DMVPV> Xdotdot = rcp_dynamic_cast<DMVPV>(createMember(space));
278 const Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
279
280 // x
281 if (DxDp0 == Teuchos::null)
282 assign(X->getNonconstMultiVector().ptr(), zero);
283 else
284 assign(X->getNonconstMultiVector().ptr(), *DxDp0);
285
286 // xdot
287 if (DxdotDp0 == Teuchos::null)
288 assign(Xdot->getNonconstMultiVector().ptr(), zero);
289 else
290 assign(Xdot->getNonconstMultiVector().ptr(), *DxdotDp0);
291
292 // xdotdot
293 if (DxdotDp0 == Teuchos::null)
294 assign(Xdotdot->getNonconstMultiVector().ptr(), zero);
295 else
296 assign(Xdotdot->getNonconstMultiVector().ptr(), *DxdotdotDp0);
297
298 state_integrator_->initializeSolutionHistory(t0, x0, xdot0, xdotdot0);
299 sens_integrator_->initializeSolutionHistory(t0, X, Xdot, Xdotdot);
300}
301
302template <class Scalar>
303Teuchos::RCP<const Thyra::VectorBase<Scalar>>
308
309template <class Scalar>
310Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>>
312{
313 using Teuchos::RCP;
314 using Teuchos::rcp_dynamic_cast;
315 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
316
317 RCP<const DMVPV> X = rcp_dynamic_cast<const DMVPV>(sens_integrator_->getX());
318 return X->getMultiVector();
319}
320
321template <class Scalar>
322Teuchos::RCP<const Thyra::VectorBase<Scalar>>
327
328template <class Scalar>
329Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>>
331{
332 using Teuchos::RCP;
333 using Teuchos::rcp_dynamic_cast;
334 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
335
336 RCP<const DMVPV> Xdot =
337 rcp_dynamic_cast<const DMVPV>(sens_integrator_->getXDot());
338 return Xdot->getMultiVector();
339}
340
341template <class Scalar>
342Teuchos::RCP<const Thyra::VectorBase<Scalar>>
347
348template <class Scalar>
349Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>>
351{
352 using Teuchos::RCP;
353 using Teuchos::rcp_dynamic_cast;
354 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
355
356 RCP<const DMVPV> Xdotdot =
357 rcp_dynamic_cast<const DMVPV>(sens_integrator_->getXDotDot());
358 return Xdotdot->getMultiVector();
359}
360
361template <class Scalar>
362Teuchos::RCP<const Thyra::VectorBase<Scalar>>
364{
365 typedef Thyra::ModelEvaluatorBase MEB;
366
367 // Compute g which is computed by response 1 of the
368 // sensitivity model evaluator
369 MEB::InArgs<Scalar> inargs = sens_model_->getNominalValues();
370 MEB::OutArgs<Scalar> outargs = sens_model_->createOutArgs();
371 inargs.set_t(sens_integrator_->getTime());
372 inargs.set_x(sens_integrator_->getX());
373 if (inargs.supports(MEB::IN_ARG_x_dot))
374 inargs.set_x_dot(sens_integrator_->getXDot());
375 if (inargs.supports(MEB::IN_ARG_x_dot_dot))
376 inargs.set_x_dot_dot(sens_integrator_->getXDotDot());
377
378 Teuchos::RCP<Thyra::VectorBase<Scalar>> g =
379 Thyra::createMember(sens_model_->get_g_space(1));
380 outargs.set_g(1, g);
381
382 sens_model_->evalModel(inargs, outargs);
383 return g;
384}
385
386template <class Scalar>
387Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>>
389{
390 typedef Thyra::ModelEvaluatorBase MEB;
391 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
392
393 // Compute final dg/dp which is computed by response 0 of the
394 // sensitivity model evaluator
395 MEB::InArgs<Scalar> inargs = sens_model_->getNominalValues();
396 MEB::OutArgs<Scalar> outargs = sens_model_->createOutArgs();
397 inargs.set_t(sens_integrator_->getTime());
398 inargs.set_x(sens_integrator_->getX());
399 if (inargs.supports(MEB::IN_ARG_x_dot))
400 inargs.set_x_dot(sens_integrator_->getXDot());
401 if (inargs.supports(MEB::IN_ARG_x_dot_dot))
402 inargs.set_x_dot_dot(sens_integrator_->getXDotDot());
403
404 Teuchos::RCP<Thyra::VectorBase<Scalar>> G =
405 Thyra::createMember(sens_model_->get_g_space(0));
406 Teuchos::RCP<DMVPV> dgdp = Teuchos::rcp_dynamic_cast<DMVPV>(G);
407 outargs.set_g(0, G);
408
409 sens_model_->evalModel(inargs, outargs);
410 return dgdp->getMultiVector();
411}
412
413template <class Scalar>
415 const
416{
417 std::string name = "Tempus::IntegratorPseudoTransientForwardSensitivity";
418 return (name);
419}
420
421template <class Scalar>
423 Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
424{
425 auto l_out = Teuchos::fancyOStream(out.getOStream());
426 Teuchos::OSTab ostab(*l_out, 2, this->description());
427 l_out->setOutputToRootOnly(0);
428
429 *l_out << description() << "::describe" << std::endl;
430 state_integrator_->describe(*l_out, verbLevel);
431 sens_integrator_->describe(*l_out, verbLevel);
432}
433
434template <class Scalar>
440
441template <class Scalar>
443{
444 using Teuchos::ParameterList;
445 using Teuchos::RCP;
446 using Teuchos::rcp;
447 using Teuchos::rcp_dynamic_cast;
448 using Thyra::assign;
449 using Thyra::createMembers;
451 using Thyra::multiVectorProductVector;
452 using Thyra::VectorBase;
453 using Thyra::VectorSpaceBase;
454 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
455
456 // TODO: get the solution history PL or create it
457
458 // Create combined solution histories, first for the states with zero
459 // sensitivities and then for the sensitivities with frozen states
460 RCP<ParameterList> shPL;
461 // Teuchos::sublist(state_integrator_->getIntegratorParameterList(), "Solution
462 // History", true);
464
465 const int num_param = rcp_dynamic_cast<const DMVPV>(sens_integrator_->getX())
466 ->getMultiVector()
467 ->domain()
468 ->dim();
469 RCP<const VectorSpaceBase<Scalar>> x_space = model_->get_x_space();
470 RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar>> prod_space =
471 Thyra::multiVectorProductVectorSpace(x_space, num_param + 1);
472 const Teuchos::Range1D rng(1, num_param);
473 const Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
474
475 RCP<const SolutionHistory<Scalar>> state_solution_history =
476 state_integrator_->getSolutionHistory();
477 int num_states = state_solution_history->getNumStates();
478 for (int i = 0; i < num_states; ++i) {
479 RCP<const SolutionState<Scalar>> state = (*state_solution_history)[i];
480
481 // X
482 RCP<MultiVectorBase<Scalar>> x_mv = createMembers(x_space, num_param + 1);
483 assign(x_mv->col(0).ptr(), *(state->getX()));
484 assign(x_mv->subView(rng).ptr(), zero);
485 RCP<VectorBase<Scalar>> x = multiVectorProductVector(prod_space, x_mv);
486
487 // X-Dot
488 RCP<VectorBase<Scalar>> x_dot;
489 if (state->getXDot() != Teuchos::null) {
490 RCP<MultiVectorBase<Scalar>> x_dot_mv =
491 createMembers(x_space, num_param + 1);
492 assign(x_dot_mv->col(0).ptr(), *(state->getXDot()));
493 assign(x_dot_mv->subView(rng).ptr(), zero);
494 x_dot = multiVectorProductVector(prod_space, x_dot_mv);
495 }
496
497 // X-Dot-Dot
498 RCP<VectorBase<Scalar>> x_dot_dot;
499 if (state->getXDotDot() != Teuchos::null) {
500 RCP<MultiVectorBase<Scalar>> x_dot_dot_mv =
501 createMembers(x_space, num_param + 1);
502 assign(x_dot_dot_mv->col(0).ptr(), *(state->getXDotDot()));
503 assign(x_dot_dot_mv->subView(rng).ptr(), zero);
504 x_dot_dot = multiVectorProductVector(prod_space, x_dot_dot_mv);
505 }
506
507 RCP<SolutionState<Scalar>> prod_state = state->clone();
508 prod_state->setX(x);
509 prod_state->setXDot(x_dot);
510 prod_state->setXDotDot(x_dot_dot);
511 solutionHistory_->addState(prod_state);
512 }
513
514 RCP<const VectorBase<Scalar>> frozen_x =
515 state_solution_history->getCurrentState()->getX();
516 RCP<const VectorBase<Scalar>> frozen_x_dot =
517 state_solution_history->getCurrentState()->getXDot();
518 RCP<const VectorBase<Scalar>> frozen_x_dot_dot =
519 state_solution_history->getCurrentState()->getXDotDot();
520 RCP<const SolutionHistory<Scalar>> sens_solution_history =
521 sens_integrator_->getSolutionHistory();
522 num_states = sens_solution_history->getNumStates();
523 for (int i = 0; i < num_states; ++i) {
524 RCP<const SolutionState<Scalar>> state = (*sens_solution_history)[i];
525
526 // X
527 RCP<MultiVectorBase<Scalar>> x_mv = createMembers(x_space, num_param + 1);
528 RCP<const MultiVectorBase<Scalar>> dxdp =
529 rcp_dynamic_cast<const DMVPV>(state->getX())->getMultiVector();
530 assign(x_mv->col(0).ptr(), *(frozen_x));
531 assign(x_mv->subView(rng).ptr(), *dxdp);
532 RCP<VectorBase<Scalar>> x = multiVectorProductVector(prod_space, x_mv);
533
534 // X-Dot
535 RCP<VectorBase<Scalar>> x_dot;
536 if (state->getXDot() != Teuchos::null) {
537 RCP<MultiVectorBase<Scalar>> x_dot_mv =
538 createMembers(x_space, num_param + 1);
539 RCP<const MultiVectorBase<Scalar>> dxdotdp =
540 rcp_dynamic_cast<const DMVPV>(state->getXDot())->getMultiVector();
541 assign(x_dot_mv->col(0).ptr(), *(frozen_x_dot));
542 assign(x_dot_mv->subView(rng).ptr(), *dxdotdp);
543 x_dot = multiVectorProductVector(prod_space, x_dot_mv);
544 }
545
546 // X-Dot-Dot
547 RCP<VectorBase<Scalar>> x_dot_dot;
548 if (state->getXDotDot() != Teuchos::null) {
549 RCP<MultiVectorBase<Scalar>> x_dot_dot_mv =
550 createMembers(x_space, num_param + 1);
551 RCP<const MultiVectorBase<Scalar>> dxdotdotdp =
552 rcp_dynamic_cast<const DMVPV>(state->getXDotDot())->getMultiVector();
553 assign(x_dot_dot_mv->col(0).ptr(), *(frozen_x_dot_dot));
554 assign(x_dot_dot_mv->subView(rng).ptr(), *dxdotdotdp);
555 x_dot_dot = multiVectorProductVector(prod_space, x_dot_dot_mv);
556 }
557
558 RCP<SolutionState<Scalar>> prod_state = state->clone();
559 prod_state->setX(x);
560 prod_state->setXDot(x_dot);
561 prod_state->setXDotDot(x_dot_dot);
562 solutionHistory_->addState(prod_state, false);
563 }
564}
565
567template <class Scalar>
568Teuchos::RCP<Tempus::IntegratorPseudoTransientForwardSensitivity<Scalar>>
570 Teuchos::RCP<Teuchos::ParameterList> pList,
571 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>> &model,
572 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>> &sens_residual_model,
573 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>> &sens_solve_model)
574{
575 auto fwd_integrator = createIntegratorBasic<Scalar>(pList, model);
576 Teuchos::RCP<SensitivityModelEvaluatorBase<Scalar>> sens_model;
577 Teuchos::RCP<IntegratorBasic<Scalar>> sens_integrator;
578
579 {
580 Teuchos::RCP<Teuchos::ParameterList> pl =
581 Teuchos::rcp(new Teuchos::ParameterList);
582 Teuchos::RCP<const Teuchos::ParameterList> integrator_pl =
583 fwd_integrator->getValidParameters();
584 Teuchos::RCP<const Teuchos::ParameterList> sensitivity_pl =
586 pl->setParameters(*integrator_pl);
587 pl->sublist("Sensitivities").setParameters(*sensitivity_pl);
588 pl->sublist("Sensitivities").set("Reuse State Linear Solver", false);
589 pl->sublist("Sensitivities").set("Force W Update", false);
590 pl->sublist("Sensitivities").set("Cache Matrices", false);
591 pList->setParametersNotAlreadySet(*pl);
592 }
593
594 bool reuse_solver =
595 pList->sublist("Sensitivities").get("Reuse State Linear Solver", false);
596 bool force_W_update =
597 pList->sublist("Sensitivities").get("Force W Update", false);
598 bool cache_matrices =
599 pList->sublist("Sensitivities").get("Cache Matrices", false);
600
601 {
602 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
603 if (pList != Teuchos::null) {
604 *pl = pList->sublist("Sensitivities");
605 }
606 pl->remove("Reuse State Linear Solver");
607 pl->remove("Force W Update");
608 pl->remove("Cache Matrices");
610 model, sens_residual_model, sens_solve_model, cache_matrices, pl);
611
612 // The sensitivity integrator uses a copy of the parameters, without the
613 // objects of the forward problem that the nonlinear solver of the forward
614 // stepper stores in them (e.g., for NOX row sum scaling), which do not
615 // apply to the sensitivity problem (see removeIntegratorSolverObjects).
616 auto sensPList = Teuchos::rcp(new Teuchos::ParameterList(*pList));
618 sens_integrator = createIntegratorBasic<Scalar>(sensPList, sens_model);
619 }
620
621 Teuchos::RCP<Tempus::IntegratorPseudoTransientForwardSensitivity<Scalar>>
622 integrator = Teuchos::rcp(
624 model, sens_model, fwd_integrator, sens_integrator, reuse_solver,
625 force_W_update));
626
627 return (integrator);
628}
629
631template <class Scalar>
632Teuchos::RCP<Tempus::IntegratorPseudoTransientForwardSensitivity<Scalar>>
634{
635 Teuchos::RCP<Tempus::IntegratorPseudoTransientForwardSensitivity<Scalar>>
636 integrator = Teuchos::rcp(
638 return (integrator);
639}
640
641} // namespace Tempus
642#endif // Tempus_IntegratorPseudoTransientForwardSensitivity_impl_hpp
IntegratorObserver class for time integrators.
Time integrator suitable for pseudotransient forward sensitivity analysis.
IntegratorPseudoTransientForwardSensitivity(const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &model, const Teuchos::RCP< SensitivityModelEvaluatorBase< Scalar > > &sens_model, const Teuchos::RCP< IntegratorBasic< Scalar > > &fwd_integrator, const Teuchos::RCP< IntegratorBasic< Scalar > > &sens_integrator, const bool reuse_solver, const bool force_W_update)
Constructor with ParameterList and model, and will be fully initialized.
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getXDotDot() const
Get current the second time derivative of the solution, xdotdot.
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getG() const
Return response function g.
virtual Teuchos::RCP< TimeStepControl< Scalar > > getNonConstTimeStepControl() override
SensitivityStepMode getStepMode() const
What mode the current time integration step is in.
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< const Thyra::VectorBase< Scalar > > getX() const
Get current the solution, x.
virtual Teuchos::RCP< SolutionHistory< Scalar > > getNonConstSolutionHistory() override
Get the SolutionHistory.
virtual Teuchos::RCP< IntegratorObserver< Scalar > > getObserver()
Get the Observer.
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getDgDp() const
Return forward sensitivity stored in Jacobian format.
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getXDot() const
Get current the time derivative of the solution, xdot.
virtual Teuchos::RCP< const TimeStepControl< Scalar > > getTimeStepControl() const override
Get the TimeStepControl.
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getDXDotDp() const
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getDXDotDotDp() const
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const override
virtual Teuchos::RCP< Stepper< Scalar > > getStepper() const override
Get the Stepper.
virtual Teuchos::RCP< const SolutionHistory< Scalar > > getSolutionHistory() const override
Get the SolutionHistory.
virtual void setObserver(Teuchos::RCP< IntegratorObserver< Scalar > > obs=Teuchos::null)
Set the Observer.
virtual bool advanceTime()
Advance the solution to timeMax, and return true if successful.
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getDxDp() const
A ModelEvaluator decorator for sensitivity analysis.
Status
Status for the Integrator, the Stepper and the SolutionState.
Teuchos::RCP< SolutionHistory< Scalar > > createSolutionHistoryPL(Teuchos::RCP< Teuchos::ParameterList > pList)
Nonmember constructor from a ParameterList.
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)
Teuchos::RCP< IntegratorBasic< Scalar > > createIntegratorBasic()
Nonmember constructor.
void removeIntegratorSolverObjects(Teuchos::ParameterList &tempusPL)
Same as removeStepperSolverObjects, for the stepper of the integrator selected by Tempus parameters (...
Teuchos::RCP< Tempus::IntegratorPseudoTransientForwardSensitivity< Scalar > > createIntegratorPseudoTransientForwardSensitivity()
Nonmember constructor.