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
18
19namespace Tempus {
20
21template <class Scalar>
24 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>> &model,
25 const Teuchos::RCP<SensitivityModelEvaluatorBase<Scalar>> &sens_model,
26 const Teuchos::RCP<IntegratorBasic<Scalar>> &fwd_integrator,
27 const Teuchos::RCP<IntegratorBasic<Scalar>> &sens_integrator,
28 const bool reuse_solver, const bool force_W_update)
29 : model_(model),
30 sens_model_(sens_model),
31 state_integrator_(fwd_integrator),
32 sens_integrator_(sens_integrator),
33 reuse_solver_(reuse_solver),
34 force_W_update_(force_W_update),
36{
37}
38
39template <class Scalar>
41 Scalar>::IntegratorPseudoTransientForwardSensitivity()
42 : reuse_solver_(false),
43 force_W_update_(false),
45{
46 state_integrator_ = createIntegratorBasic<Scalar>();
47 sens_integrator_ = createIntegratorBasic<Scalar>();
48}
49
50template <class Scalar>
52{
53 using Teuchos::RCP;
55
56 // Run state integrator and get solution
58 bool state_status = state_integrator_->advanceTime();
59
60 // Set solution in sensitivity ME
61 sens_model_->setForwardSolutionState(state_integrator_->getCurrentState());
62
63 // Reuse state solver if requested
64 if (reuse_solver_ &&
65 state_integrator_->getStepper()->getSolver() != Teuchos::null) {
66 sens_model_->setSolver(state_integrator_->getStepper()->getSolver(),
67 force_W_update_);
68 }
69
70 // Run sensitivity integrator
72 bool sens_status = sens_integrator_->advanceTime();
73
74 buildSolutionHistory();
75
76 return state_status && sens_status;
77}
78
79template <class Scalar>
81 const Scalar timeFinal)
82{
83 TEMPUS_FUNC_TIME_MONITOR_DIFF(
84 "Tempus::IntegratorPseudoTransientForwardSensitivity::advanceTime()",
85 TEMPUS_PTFS_AT);
86
87 using Teuchos::RCP;
89
90 // Run state integrator and get solution
91 bool state_status = true;
92 {
93 TEMPUS_FUNC_TIME_MONITOR_DIFF(
94 "Tempus::IntegratorPseudoTransientForwardSensitivity::advanceTime::"
95 "state",
96 TEMPUS_PTFS_AT_FWD);
97 state_status = state_integrator_->advanceTime(timeFinal);
98 }
99
100 // Set solution in sensitivity ME
101 sens_model_->setForwardSolutionState(state_integrator_->getCurrentState());
102
103 // Reuse state solver if requested
104 if (reuse_solver_ &&
105 state_integrator_->getStepper()->getSolver() != Teuchos::null) {
106 sens_model_->setSolver(state_integrator_->getStepper()->getSolver(),
107 force_W_update_);
108 }
109
110 // Run sensitivity integrator
111 bool sens_status = true;
112 {
113 TEMPUS_FUNC_TIME_MONITOR_DIFF(
114 "Tempus::IntegratorPseudoTransientForwardSensitivity::advanceTime::"
115 "sensitivity",
116 TEMPUS_PTFS_AT_SEN);
117 sens_status = sens_integrator_->advanceTime(timeFinal);
118 }
119
120 buildSolutionHistory();
121
122 return state_status && sens_status;
123}
124
125template <class Scalar>
127{
128 return solutionHistory_->getCurrentTime();
129}
130
131template <class Scalar>
133{
134 return solutionHistory_->getCurrentIndex();
135}
136
137template <class Scalar>
139{
140 Status state_status = state_integrator_->getStatus();
141 Status sens_status = sens_integrator_->getStatus();
142 if (state_status == FAILED || sens_status == FAILED) return FAILED;
143 if (state_status == WORKING || sens_status == WORKING) return WORKING;
144 return PASSED;
145}
146
147template <class Scalar>
149 const Status st)
150{
151 state_integrator_->setStatus(st);
152 sens_integrator_->setStatus(st);
153}
154
155template <class Scalar>
156Teuchos::RCP<Stepper<Scalar>>
158{
159 return state_integrator_->getStepper();
160}
161
162template <class Scalar>
163Teuchos::RCP<Stepper<Scalar>>
165{
166 return state_integrator_->getStepper();
167}
168
169template <class Scalar>
170Teuchos::RCP<Stepper<Scalar>>
172{
173 return sens_integrator_->getStepper();
174}
175
176template <class Scalar>
177Teuchos::RCP<const SolutionHistory<Scalar>>
182
183template <class Scalar>
184Teuchos::RCP<const SolutionHistory<Scalar>>
186 const
187{
188 return state_integrator_->getSolutionHistory();
189}
190
191template <class Scalar>
192Teuchos::RCP<const SolutionHistory<Scalar>>
194 const
195{
196 return sens_integrator_->getSolutionHistory();
197}
198
199template <class Scalar>
200Teuchos::RCP<SolutionHistory<Scalar>>
202 Scalar>::getNonConstSolutionHistory()
203{
204 return solutionHistory_;
205}
206
207template <class Scalar>
208Teuchos::RCP<const TimeStepControl<Scalar>>
213
214template <class Scalar>
215Teuchos::RCP<TimeStepControl<Scalar>>
217 Scalar>::getNonConstTimeStepControl()
218{
219 return state_integrator_->getNonConstTimeStepControl();
220}
221
222template <class Scalar>
223Teuchos::RCP<TimeStepControl<Scalar>>
225 Scalar>::getStateNonConstTimeStepControl()
226{
227 return state_integrator_->getNonConstTimeStepControl();
228}
229
230template <class Scalar>
231Teuchos::RCP<TimeStepControl<Scalar>>
233 Scalar>::getSensNonConstTimeStepControl()
234{
235 return sens_integrator_->getNonConstTimeStepControl();
236}
237
238template <class Scalar>
239Teuchos::RCP<IntegratorObserver<Scalar>>
241{
242 return state_integrator_->getObserver();
243}
244
245template <class Scalar>
247 Teuchos::RCP<IntegratorObserver<Scalar>> obs)
248{
249 state_integrator_->setObserver(obs);
250 sens_integrator_->setObserver(obs);
251}
252
253template <class Scalar>
256 Scalar t0, Teuchos::RCP<const Thyra::VectorBase<Scalar>> x0,
257 Teuchos::RCP<const Thyra::VectorBase<Scalar>> xdot0,
258 Teuchos::RCP<const Thyra::VectorBase<Scalar>> xdotdot0,
259 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>> DxDp0,
260 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>> DxdotDp0,
261 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>> DxdotdotDp0)
262{
263 using Teuchos::RCP;
264 using Teuchos::rcp_dynamic_cast;
265 using Thyra::assign;
266 using Thyra::createMember;
267 using Thyra::VectorSpaceBase;
268 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
269
270 //
271 // Create and initialize product X, Xdot, Xdotdot
272
273 RCP<const VectorSpaceBase<Scalar>> space = sens_model_->get_x_space();
274 RCP<DMVPV> X = rcp_dynamic_cast<DMVPV>(createMember(space));
275 RCP<DMVPV> Xdot = rcp_dynamic_cast<DMVPV>(createMember(space));
276 RCP<DMVPV> Xdotdot = rcp_dynamic_cast<DMVPV>(createMember(space));
277 const Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
278
279 // x
280 if (DxDp0 == Teuchos::null)
281 assign(X->getNonconstMultiVector().ptr(), zero);
282 else
283 assign(X->getNonconstMultiVector().ptr(), *DxDp0);
284
285 // xdot
286 if (DxdotDp0 == Teuchos::null)
287 assign(Xdot->getNonconstMultiVector().ptr(), zero);
288 else
289 assign(Xdot->getNonconstMultiVector().ptr(), *DxdotDp0);
290
291 // xdotdot
292 if (DxdotDp0 == Teuchos::null)
293 assign(Xdotdot->getNonconstMultiVector().ptr(), zero);
294 else
295 assign(Xdotdot->getNonconstMultiVector().ptr(), *DxdotdotDp0);
296
297 state_integrator_->initializeSolutionHistory(t0, x0, xdot0, xdotdot0);
298 sens_integrator_->initializeSolutionHistory(t0, X, Xdot, Xdotdot);
299}
300
301template <class Scalar>
302Teuchos::RCP<const Thyra::VectorBase<Scalar>>
304{
305 return state_integrator_->getX();
306}
307
308template <class Scalar>
309Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>>
311{
312 using Teuchos::RCP;
313 using Teuchos::rcp_dynamic_cast;
314 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
315
316 RCP<const DMVPV> X = rcp_dynamic_cast<const DMVPV>(sens_integrator_->getX());
317 return X->getMultiVector();
318}
319
320template <class Scalar>
321Teuchos::RCP<const Thyra::VectorBase<Scalar>>
323{
324 return state_integrator_->getXDot();
325}
326
327template <class Scalar>
328Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>>
330{
331 using Teuchos::RCP;
332 using Teuchos::rcp_dynamic_cast;
333 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
334
335 RCP<const DMVPV> Xdot =
336 rcp_dynamic_cast<const DMVPV>(sens_integrator_->getXDot());
337 return Xdot->getMultiVector();
338}
339
340template <class Scalar>
341Teuchos::RCP<const Thyra::VectorBase<Scalar>>
343{
344 return state_integrator_->getXDotDot();
345}
346
347template <class Scalar>
348Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>>
350{
351 using Teuchos::RCP;
352 using Teuchos::rcp_dynamic_cast;
353 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
354
355 RCP<const DMVPV> Xdotdot =
356 rcp_dynamic_cast<const DMVPV>(sens_integrator_->getXDotDot());
357 return Xdotdot->getMultiVector();
358}
359
360template <class Scalar>
361Teuchos::RCP<const Thyra::VectorBase<Scalar>>
363{
364 typedef Thyra::ModelEvaluatorBase MEB;
365
366 // Compute g which is computed by response 1 of the
367 // sensitivity model evaluator
368 MEB::InArgs<Scalar> inargs = sens_model_->getNominalValues();
369 MEB::OutArgs<Scalar> outargs = sens_model_->createOutArgs();
370 inargs.set_t(sens_integrator_->getTime());
371 inargs.set_x(sens_integrator_->getX());
372 if (inargs.supports(MEB::IN_ARG_x_dot))
373 inargs.set_x_dot(sens_integrator_->getXDot());
374 if (inargs.supports(MEB::IN_ARG_x_dot_dot))
375 inargs.set_x_dot_dot(sens_integrator_->getXDotDot());
376
377 Teuchos::RCP<Thyra::VectorBase<Scalar>> g =
378 Thyra::createMember(sens_model_->get_g_space(1));
379 outargs.set_g(1, g);
380
381 sens_model_->evalModel(inargs, outargs);
382 return g;
383}
384
385template <class Scalar>
386Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>>
388{
389 typedef Thyra::ModelEvaluatorBase MEB;
390 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
391
392 // Compute final dg/dp which is computed by response 0 of the
393 // sensitivity model evaluator
394 MEB::InArgs<Scalar> inargs = sens_model_->getNominalValues();
395 MEB::OutArgs<Scalar> outargs = sens_model_->createOutArgs();
396 inargs.set_t(sens_integrator_->getTime());
397 inargs.set_x(sens_integrator_->getX());
398 if (inargs.supports(MEB::IN_ARG_x_dot))
399 inargs.set_x_dot(sens_integrator_->getXDot());
400 if (inargs.supports(MEB::IN_ARG_x_dot_dot))
401 inargs.set_x_dot_dot(sens_integrator_->getXDotDot());
402
403 Teuchos::RCP<Thyra::VectorBase<Scalar>> G =
404 Thyra::createMember(sens_model_->get_g_space(0));
405 Teuchos::RCP<DMVPV> dgdp = Teuchos::rcp_dynamic_cast<DMVPV>(G);
406 outargs.set_g(0, G);
407
408 sens_model_->evalModel(inargs, outargs);
409 return dgdp->getMultiVector();
410}
411
412template <class Scalar>
414 const
415{
416 std::string name = "Tempus::IntegratorPseudoTransientForwardSensitivity";
417 return (name);
418}
419
420template <class Scalar>
422 Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
423{
424 auto l_out = Teuchos::fancyOStream(out.getOStream());
425 Teuchos::OSTab ostab(*l_out, 2, this->description());
426 l_out->setOutputToRootOnly(0);
427
428 *l_out << description() << "::describe" << std::endl;
429 state_integrator_->describe(*l_out, verbLevel);
430 sens_integrator_->describe(*l_out, verbLevel);
431}
432
433template <class Scalar>
439
440template <class Scalar>
442{
443 using Teuchos::ParameterList;
444 using Teuchos::RCP;
445 using Teuchos::rcp;
446 using Teuchos::rcp_dynamic_cast;
447 using Thyra::assign;
448 using Thyra::createMembers;
450 using Thyra::multiVectorProductVector;
451 using Thyra::VectorBase;
452 using Thyra::VectorSpaceBase;
453 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
454
455 // TODO: get the solution history PL or create it
456
457 // Create combined solution histories, first for the states with zero
458 // sensitivities and then for the sensitivities with frozen states
459 RCP<ParameterList> shPL;
460 // Teuchos::sublist(state_integrator_->getIntegratorParameterList(), "Solution
461 // History", true);
462 solutionHistory_ = createSolutionHistoryPL<Scalar>(shPL);
463
464 const int num_param = rcp_dynamic_cast<const DMVPV>(sens_integrator_->getX())
465 ->getMultiVector()
466 ->domain()
467 ->dim();
468 RCP<const VectorSpaceBase<Scalar>> x_space = model_->get_x_space();
469 RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar>> prod_space =
470 Thyra::multiVectorProductVectorSpace(x_space, num_param + 1);
471 const Teuchos::Range1D rng(1, num_param);
472 const Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
473
474 RCP<const SolutionHistory<Scalar>> state_solution_history =
475 state_integrator_->getSolutionHistory();
476 int num_states = state_solution_history->getNumStates();
477 for (int i = 0; i < num_states; ++i) {
478 RCP<const SolutionState<Scalar>> state = (*state_solution_history)[i];
479
480 // X
481 RCP<MultiVectorBase<Scalar>> x_mv = createMembers(x_space, num_param + 1);
482 assign(x_mv->col(0).ptr(), *(state->getX()));
483 assign(x_mv->subView(rng).ptr(), zero);
484 RCP<VectorBase<Scalar>> x = multiVectorProductVector(prod_space, x_mv);
485
486 // X-Dot
487 RCP<VectorBase<Scalar>> x_dot;
488 if (state->getXDot() != Teuchos::null) {
489 RCP<MultiVectorBase<Scalar>> x_dot_mv =
490 createMembers(x_space, num_param + 1);
491 assign(x_dot_mv->col(0).ptr(), *(state->getXDot()));
492 assign(x_dot_mv->subView(rng).ptr(), zero);
493 x_dot = multiVectorProductVector(prod_space, x_dot_mv);
494 }
495
496 // X-Dot-Dot
497 RCP<VectorBase<Scalar>> x_dot_dot;
498 if (state->getXDotDot() != Teuchos::null) {
499 RCP<MultiVectorBase<Scalar>> x_dot_dot_mv =
500 createMembers(x_space, num_param + 1);
501 assign(x_dot_dot_mv->col(0).ptr(), *(state->getXDotDot()));
502 assign(x_dot_dot_mv->subView(rng).ptr(), zero);
503 x_dot_dot = multiVectorProductVector(prod_space, x_dot_dot_mv);
504 }
505
506 RCP<SolutionState<Scalar>> prod_state = state->clone();
507 prod_state->setX(x);
508 prod_state->setXDot(x_dot);
509 prod_state->setXDotDot(x_dot_dot);
510 solutionHistory_->addState(prod_state);
511 }
512
513 RCP<const VectorBase<Scalar>> frozen_x =
514 state_solution_history->getCurrentState()->getX();
515 RCP<const VectorBase<Scalar>> frozen_x_dot =
516 state_solution_history->getCurrentState()->getXDot();
517 RCP<const VectorBase<Scalar>> frozen_x_dot_dot =
518 state_solution_history->getCurrentState()->getXDotDot();
519 RCP<const SolutionHistory<Scalar>> sens_solution_history =
520 sens_integrator_->getSolutionHistory();
521 num_states = sens_solution_history->getNumStates();
522 for (int i = 0; i < num_states; ++i) {
523 RCP<const SolutionState<Scalar>> state = (*sens_solution_history)[i];
524
525 // X
526 RCP<MultiVectorBase<Scalar>> x_mv = createMembers(x_space, num_param + 1);
527 RCP<const MultiVectorBase<Scalar>> dxdp =
528 rcp_dynamic_cast<const DMVPV>(state->getX())->getMultiVector();
529 assign(x_mv->col(0).ptr(), *(frozen_x));
530 assign(x_mv->subView(rng).ptr(), *dxdp);
531 RCP<VectorBase<Scalar>> x = multiVectorProductVector(prod_space, x_mv);
532
533 // X-Dot
534 RCP<VectorBase<Scalar>> x_dot;
535 if (state->getXDot() != Teuchos::null) {
536 RCP<MultiVectorBase<Scalar>> x_dot_mv =
537 createMembers(x_space, num_param + 1);
538 RCP<const MultiVectorBase<Scalar>> dxdotdp =
539 rcp_dynamic_cast<const DMVPV>(state->getXDot())->getMultiVector();
540 assign(x_dot_mv->col(0).ptr(), *(frozen_x_dot));
541 assign(x_dot_mv->subView(rng).ptr(), *dxdotdp);
542 x_dot = multiVectorProductVector(prod_space, x_dot_mv);
543 }
544
545 // X-Dot-Dot
546 RCP<VectorBase<Scalar>> x_dot_dot;
547 if (state->getXDotDot() != Teuchos::null) {
548 RCP<MultiVectorBase<Scalar>> x_dot_dot_mv =
549 createMembers(x_space, num_param + 1);
550 RCP<const MultiVectorBase<Scalar>> dxdotdotdp =
551 rcp_dynamic_cast<const DMVPV>(state->getXDotDot())->getMultiVector();
552 assign(x_dot_dot_mv->col(0).ptr(), *(frozen_x_dot_dot));
553 assign(x_dot_dot_mv->subView(rng).ptr(), *dxdotdotdp);
554 x_dot_dot = multiVectorProductVector(prod_space, x_dot_dot_mv);
555 }
556
557 RCP<SolutionState<Scalar>> prod_state = state->clone();
558 prod_state->setX(x);
559 prod_state->setXDot(x_dot);
560 prod_state->setXDotDot(x_dot_dot);
561 solutionHistory_->addState(prod_state, false);
562 }
563}
564
566template <class Scalar>
567Teuchos::RCP<Tempus::IntegratorPseudoTransientForwardSensitivity<Scalar>>
569 Teuchos::RCP<Teuchos::ParameterList> pList,
570 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>> &model,
571 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>> &sens_residual_model,
572 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>> &sens_solve_model)
573{
574 auto fwd_integrator = createIntegratorBasic<Scalar>(pList, model);
575 Teuchos::RCP<SensitivityModelEvaluatorBase<Scalar>> sens_model;
576 Teuchos::RCP<IntegratorBasic<Scalar>> sens_integrator;
577
578 {
579 Teuchos::RCP<Teuchos::ParameterList> pl =
580 Teuchos::rcp(new Teuchos::ParameterList);
581 Teuchos::RCP<const Teuchos::ParameterList> integrator_pl =
582 fwd_integrator->getValidParameters();
583 Teuchos::RCP<const Teuchos::ParameterList> sensitivity_pl =
585 pl->setParameters(*integrator_pl);
586 pl->sublist("Sensitivities").setParameters(*sensitivity_pl);
587 pl->sublist("Sensitivities").set("Reuse State Linear Solver", false);
588 pl->sublist("Sensitivities").set("Force W Update", false);
589 pl->sublist("Sensitivities").set("Cache Matrices", false);
590 pList->setParametersNotAlreadySet(*pl);
591 }
592
593 bool reuse_solver =
594 pList->sublist("Sensitivities").get("Reuse State Linear Solver", false);
595 bool force_W_update =
596 pList->sublist("Sensitivities").get("Force W Update", false);
597 bool cache_matrices =
598 pList->sublist("Sensitivities").get("Cache Matrices", false);
599
600 {
601 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
602 if (pList != Teuchos::null) {
603 *pl = pList->sublist("Sensitivities");
604 }
605 pl->remove("Reuse State Linear Solver");
606 pl->remove("Force W Update");
607 pl->remove("Cache Matrices");
609 model, sens_residual_model, sens_solve_model, cache_matrices, pl);
610 sens_integrator = createIntegratorBasic<Scalar>(pList, sens_model);
611 }
612
613 Teuchos::RCP<Tempus::IntegratorPseudoTransientForwardSensitivity<Scalar>>
614 integrator = Teuchos::rcp(
616 model, sens_model, fwd_integrator, sens_integrator, reuse_solver,
617 force_W_update));
618
619 return (integrator);
620}
621
623template <class Scalar>
624Teuchos::RCP<Tempus::IntegratorPseudoTransientForwardSensitivity<Scalar>>
626{
627 Teuchos::RCP<Tempus::IntegratorPseudoTransientForwardSensitivity<Scalar>>
628 integrator = Teuchos::rcp(
630 return (integrator);
631}
632
633} // namespace Tempus
634#endif // Tempus_IntegratorPseudoTransientForwardSensitivity_impl_hpp
IntegratorObserver class for time integrators.
Time integrator suitable for pseudotransient forward sensitivity analysis.
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< 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< 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< Tempus::IntegratorPseudoTransientForwardSensitivity< Scalar > > createIntegratorPseudoTransientForwardSensitivity()
Nonmember constructor.