9 #ifndef Tempus_IntegratorPseudoTransientForwardSensitivity_impl_hpp
10 #define Tempus_IntegratorPseudoTransientForwardSensitivity_impl_hpp
12 #include "Thyra_DefaultMultiVectorProductVector.hpp"
13 #include "Thyra_VectorStdOps.hpp"
14 #include "Thyra_MultiVectorStdOps.hpp"
20 template <
class Scalar>
27 const bool reuse_solver,
const bool force_W_update)
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),
38 template <
class Scalar>
41 : reuse_solver_(false),
42 force_W_update_(false),
49 template <
class Scalar>
57 bool state_status = state_integrator_->advanceTime();
60 sens_model_->setForwardSolutionState(state_integrator_->getCurrentState());
64 state_integrator_->getStepper()->getSolver() != Teuchos::null) {
65 sens_model_->setSolver(state_integrator_->getStepper()->getSolver(),
71 bool sens_status = sens_integrator_->advanceTime();
73 buildSolutionHistory();
75 return state_status && sens_status;
78 template <
class Scalar>
80 const Scalar timeFinal)
82 TEMPUS_FUNC_TIME_MONITOR_DIFF(
83 "Tempus::IntegratorPseudoTransientForwardSensitivity::advanceTime()",
90 bool state_status =
true;
92 TEMPUS_FUNC_TIME_MONITOR_DIFF(
93 "Tempus::IntegratorPseudoTransientForwardSensitivity::advanceTime::"
96 state_status = state_integrator_->advanceTime(timeFinal);
100 sens_model_->setForwardSolutionState(state_integrator_->getCurrentState());
104 state_integrator_->getStepper()->getSolver() != Teuchos::null) {
105 sens_model_->setSolver(state_integrator_->getStepper()->getSolver(),
110 bool sens_status =
true;
112 TEMPUS_FUNC_TIME_MONITOR_DIFF(
113 "Tempus::IntegratorPseudoTransientForwardSensitivity::advanceTime::"
116 sens_status = sens_integrator_->advanceTime(timeFinal);
119 buildSolutionHistory();
121 return state_status && sens_status;
124 template <
class Scalar>
127 return solutionHistory_->getCurrentTime();
130 template <
class Scalar>
133 return solutionHistory_->getCurrentIndex();
136 template <
class Scalar>
139 Status state_status = state_integrator_->getStatus();
140 Status sens_status = sens_integrator_->getStatus();
146 template <
class Scalar>
150 state_integrator_->setStatus(st);
151 sens_integrator_->setStatus(st);
154 template <
class Scalar>
158 return state_integrator_->getStepper();
161 template <
class Scalar>
165 return state_integrator_->getStepper();
168 template <
class Scalar>
172 return sens_integrator_->getStepper();
175 template <
class Scalar>
179 return solutionHistory_;
182 template <
class Scalar>
187 return state_integrator_->getSolutionHistory();
190 template <
class Scalar>
195 return sens_integrator_->getSolutionHistory();
198 template <
class Scalar>
201 Scalar>::getNonConstSolutionHistory()
203 return solutionHistory_;
206 template <
class Scalar>
210 return state_integrator_->getTimeStepControl();
213 template <
class Scalar>
216 Scalar>::getNonConstTimeStepControl()
221 template <
class Scalar>
224 Scalar>::getStateNonConstTimeStepControl()
229 template <
class Scalar>
232 Scalar>::getSensNonConstTimeStepControl()
237 template <
class Scalar>
241 return state_integrator_->getObserver();
244 template <
class Scalar>
248 state_integrator_->setObserver(obs);
249 sens_integrator_->setObserver(obs);
252 template <
class Scalar>
263 using Teuchos::rcp_dynamic_cast;
265 using Thyra::createMember;
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));
279 if (DxDp0 == Teuchos::null)
280 assign(X->getNonconstMultiVector().ptr(), zero);
282 assign(X->getNonconstMultiVector().ptr(), *DxDp0);
285 if (DxdotDp0 == Teuchos::null)
286 assign(Xdot->getNonconstMultiVector().ptr(), zero);
288 assign(Xdot->getNonconstMultiVector().ptr(), *DxdotDp0);
291 if (DxdotDp0 == Teuchos::null)
292 assign(Xdotdot->getNonconstMultiVector().ptr(), zero);
294 assign(Xdotdot->getNonconstMultiVector().ptr(), *DxdotdotDp0);
296 state_integrator_->initializeSolutionHistory(t0, x0, xdot0, xdotdot0);
297 sens_integrator_->initializeSolutionHistory(t0, X, Xdot, Xdotdot);
300 template <
class Scalar>
304 return state_integrator_->getX();
307 template <
class Scalar>
312 using Teuchos::rcp_dynamic_cast;
315 RCP<const DMVPV> X = rcp_dynamic_cast<
const DMVPV>(sens_integrator_->getX());
319 template <
class Scalar>
323 return state_integrator_->getXDot();
326 template <
class Scalar>
331 using Teuchos::rcp_dynamic_cast;
334 RCP<const DMVPV> Xdot =
335 rcp_dynamic_cast<
const DMVPV>(sens_integrator_->getXDot());
339 template <
class Scalar>
343 return state_integrator_->getXDotDot();
346 template <
class Scalar>
351 using Teuchos::rcp_dynamic_cast;
354 RCP<const DMVPV> Xdotdot =
355 rcp_dynamic_cast<
const DMVPV>(sens_integrator_->getXDotDot());
359 template <
class Scalar>
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());
377 Thyra::createMember(sens_model_->get_g_space(1));
380 sens_model_->evalModel(inargs, outargs);
384 template <
class Scalar>
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());
403 Thyra::createMember(sens_model_->get_g_space(0));
407 sens_model_->evalModel(inargs, outargs);
408 return dgdp->getMultiVector();
411 template <
class Scalar>
415 std::string name =
"Tempus::IntegratorPseudoTransientForwardSensitivity";
419 template <
class Scalar>
423 auto l_out = Teuchos::fancyOStream(out.
getOStream());
425 l_out->setOutputToRootOnly(0);
427 *l_out << description() <<
"::describe" << std::endl;
428 state_integrator_->describe(*l_out, verbLevel);
429 sens_integrator_->describe(*l_out, verbLevel);
432 template <
class Scalar>
439 template <
class Scalar>
445 using Teuchos::rcp_dynamic_cast;
447 using Thyra::createMembers;
449 using Thyra::multiVectorProductVector;
458 RCP<ParameterList> shPL;
461 solutionHistory_ = createSolutionHistoryPL<Scalar>(shPL);
463 const int num_param = rcp_dynamic_cast<
const DMVPV>(sens_integrator_->getX())
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);
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];
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);
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);
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);
505 RCP<SolutionState<Scalar>> prod_state = state->clone();
507 prod_state->setXDot(x_dot);
508 prod_state->setXDotDot(x_dot_dot);
509 solutionHistory_->addState(prod_state);
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];
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);
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);
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);
556 RCP<SolutionState<Scalar>> prod_state = state->clone();
558 prod_state->setXDot(x_dot);
559 prod_state->setXDotDot(x_dot_dot);
560 solutionHistory_->addState(prod_state,
false);
565 template <
class Scalar>
573 auto fwd_integrator = createIntegratorBasic<Scalar>(pList, model);
581 fwd_integrator->getValidParameters();
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);
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);
601 if (pList != Teuchos::null) {
602 *pl = pList->
sublist(
"Sensitivities");
604 pl->
remove(
"Reuse State Linear Solver");
605 pl->
remove(
"Force W Update");
606 pl->
remove(
"Cache Matrices");
608 model, sens_residual_model, sens_solve_model, cache_matrices, pl);
609 sens_integrator = createIntegratorBasic<Scalar>(pList, sens_model);
615 model, sens_model, fwd_integrator, sens_integrator, reuse_solver,
622 template <
class Scalar>
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.
virtual void setStatus(const Status st) override
Set Status.
Teuchos::RCP< const SolutionHistory< Scalar > > getSensSolutionHistory() const
virtual Status getStatus() const override
Get Status.
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 int getIndex() const override
Get current index.
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
static Teuchos::RCP< const Teuchos::ParameterList > getValidParameters()
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getG() const
Return response function g.
Teuchos::RCP< IntegratorBasic< Scalar > > state_integrator_
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.
Teuchos::RCP< const SolutionHistory< Scalar > > getStateSolutionHistory() const
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
std::string description() const override
RCP< const MultiVectorBase< Scalar > > getMultiVector() const
virtual Teuchos::RCP< IntegratorObserver< Scalar > > getObserver()
Get the Observer.
virtual Scalar getTime() const override
Get current time.
ParameterList & setParameters(const ParameterList &source)
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getDXDotDp() const
RCP< std::basic_ostream< char_type, traits_type > > getOStream()
IntegratorPseudoTransientForwardSensitivity()
Destructor.
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="")
Teuchos::RCP< Stepper< Scalar > > getSensStepper() const
void buildSolutionHistory()
virtual Teuchos::RCP< const TimeStepControl< Scalar > > getTimeStepControl() const override
Get the TimeStepControl.
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getDXDotDotDp() const
Teuchos::RCP< IntegratorBasic< Scalar > > sens_integrator_
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.
Teuchos::RCP< Stepper< Scalar > > getStateStepper() const