9 #ifndef Tempus_IntegratorPseudoTransientAdjointSensitivity_impl_hpp 10 #define Tempus_IntegratorPseudoTransientAdjointSensitivity_impl_hpp 12 #include "Thyra_DefaultMultiVectorProductVector.hpp" 13 #include "Thyra_VectorStdOps.hpp" 14 #include "Thyra_MultiVectorStdOps.hpp" 20 template<
class Scalar>
23 Teuchos::RCP<Teuchos::ParameterList> inputPL,
28 adjoint_model_ = adjoint_model;
29 state_integrator_ = integratorBasic<Scalar>(inputPL, model_);
30 sens_model_ = createSensitivityModel(model_, adjoint_model_, inputPL);
31 sens_integrator_ = integratorBasic<Scalar>(inputPL, sens_model_);
34 template<
class Scalar>
39 std::string stepperType)
42 adjoint_model_ = adjoint_model;
43 state_integrator_ = integratorBasic<Scalar>(model_, stepperType);
44 sens_model_ = createSensitivityModel(model_, adjoint_model_, Teuchos::null);
45 sens_integrator_ = integratorBasic<Scalar>(sens_model_, stepperType);
48 template<
class Scalar>
51 Teuchos::RCP<Teuchos::ParameterList> inputPL,
58 template<
class Scalar>
62 std::string stepperType) :
68 template<
class Scalar>
72 state_integrator_ = integratorBasic<Scalar>();
73 sens_integrator_ = integratorBasic<Scalar>();
76 template<
class Scalar>
82 state_integrator_->getTimeStepControl()->getFinalTime();
83 return advanceTime(tfinal);
86 template<
class Scalar>
93 typedef Thyra::ModelEvaluatorBase MEB;
96 bool state_status = state_integrator_->advanceTime(timeFinal);
99 sens_model_->setForwardSolutionHistory(
100 state_integrator_->getSolutionHistory());
103 bool sens_status = sens_integrator_->advanceTime(timeFinal);
107 MEB::InArgs<Scalar> inargs = sens_model_->getNominalValues();
108 MEB::OutArgs<Scalar> outargs = sens_model_->createOutArgs();
109 inargs.set_t(sens_integrator_->getTime());
110 inargs.set_x(sens_integrator_->getX());
111 if (inargs.supports(MEB::IN_ARG_x_dot))
112 inargs.set_x_dot(sens_integrator_->getXDot());
113 if (inargs.supports(MEB::IN_ARG_x_dot_dot))
114 inargs.set_x_dot_dot(sens_integrator_->getXDotDot());
115 RCP<VectorBase<Scalar> > G = dgdp_;
116 if (G == Teuchos::null) {
117 G = Thyra::createMember(sens_model_->get_g_space(0));
118 dgdp_ = Teuchos::rcp_dynamic_cast<
DMVPV>(G);
121 sens_model_->evalModel(inargs, outargs);
123 buildSolutionHistory();
125 return state_status && sens_status;
128 template<
class Scalar>
133 return solutionHistory_->getCurrentTime();
136 template<
class Scalar>
141 return solutionHistory_->getCurrentIndex();
144 template<
class Scalar>
149 Status state_status = state_integrator_->getStatus();
150 Status sens_status = sens_integrator_->getStatus();
158 template <
class Scalar>
161 state_integrator_->setStatus(st);
162 sens_integrator_->setStatus(st);
165 template<
class Scalar>
166 Teuchos::RCP<Stepper<Scalar> >
170 return state_integrator_->getStepper();
173 template<
class Scalar>
174 Teuchos::RCP<Teuchos::ParameterList>
178 return state_integrator_->getTempusParameterList();
181 template<
class Scalar>
186 state_integrator_->setTempusParameterList(pl);
187 sens_integrator_->setTempusParameterList(pl);
190 template<
class Scalar>
191 Teuchos::RCP<const SolutionHistory<Scalar> >
195 return solutionHistory_;
198 template<
class Scalar>
199 Teuchos::RCP<SolutionHistory<Scalar> >
203 return solutionHistory_;
206 template<
class Scalar>
207 Teuchos::RCP<const TimeStepControl<Scalar> >
211 return state_integrator_->getTimeStepControl();
214 template<
class Scalar>
215 Teuchos::RCP<TimeStepControl<Scalar> >
219 return state_integrator_->getNonConstTimeStepControl();
222 template<
class Scalar>
233 using Teuchos::rcp_dynamic_cast;
234 using Thyra::VectorSpaceBase;
236 using Thyra::createMember;
241 RCP< const VectorSpaceBase<Scalar> > space = sens_model_->get_x_space();
242 RCP<DMVPV> Y = rcp_dynamic_cast<
DMVPV>(createMember(space));
243 RCP<DMVPV> Ydot = rcp_dynamic_cast<
DMVPV>(createMember(space));
244 RCP<DMVPV> Ydotdot = rcp_dynamic_cast<
DMVPV>(createMember(space));
245 const Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
248 if (y0 == Teuchos::null)
249 assign(Y->getNonconstMultiVector().ptr(), zero);
251 assign(Y->getNonconstMultiVector().ptr(), *y0);
254 if (ydot0 == Teuchos::null)
255 assign(Ydot->getNonconstMultiVector().ptr(), zero);
257 assign(Ydot->getNonconstMultiVector().ptr(), *ydot0);
260 if (ydotdot0 == Teuchos::null)
261 assign(Ydotdot->getNonconstMultiVector().ptr(), zero);
263 assign(Ydotdot->getNonconstMultiVector().ptr(), *ydotdot0);
265 state_integrator_->initializeSolutionHistory(t0, x0, xdot0, xdotdot0);
266 sens_integrator_->initializeSolutionHistory(t0, Y, Ydot, Ydotdot);
269 template<
class Scalar>
270 Teuchos::RCP<const Thyra::VectorBase<Scalar> >
274 return state_integrator_->getX();
277 template<
class Scalar>
278 Teuchos::RCP<const Thyra::VectorBase<Scalar> >
282 return state_integrator_->getXDot();
285 template<
class Scalar>
286 Teuchos::RCP<const Thyra::VectorBase<Scalar> >
290 return state_integrator_->getXDotDot();
293 template<
class Scalar>
294 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> >
298 return dgdp_->getMultiVector();
301 template<
class Scalar>
306 std::string name =
"Tempus::IntegratorPseudoTransientAdjointSensitivity";
310 template<
class Scalar>
314 Teuchos::FancyOStream &out,
315 const Teuchos::EVerbosityLevel verbLevel)
const 317 auto l_out = Teuchos::fancyOStream( out.getOStream() );
318 Teuchos::OSTab ostab(*l_out, 2, this->description());
319 l_out->setOutputToRootOnly(0);
321 *l_out << description() <<
"::describe" << std::endl;
322 state_integrator_->describe(*l_out, verbLevel);
323 sens_integrator_->describe(*l_out, verbLevel);
326 template<
class Scalar>
331 state_integrator_->setParameterList(inputPL);
332 sens_integrator_->setParameterList(inputPL);
335 template<
class Scalar>
336 Teuchos::RCP<Teuchos::ParameterList>
340 state_integrator_->unsetParameterList();
341 return sens_integrator_->unsetParameterList();
344 template<
class Scalar>
345 Teuchos::RCP<const Teuchos::ParameterList>
349 Teuchos::RCP<Teuchos::ParameterList> pl =
350 Teuchos::rcp(
new Teuchos::ParameterList);
351 Teuchos::RCP<const Teuchos::ParameterList> integrator_pl =
352 state_integrator_->getValidParameters();
353 Teuchos::RCP<const Teuchos::ParameterList> sensitivity_pl =
355 pl->setParameters(*integrator_pl);
356 pl->sublist(
"Sensitivities").setParameters(*sensitivity_pl);
361 template<
class Scalar>
362 Teuchos::RCP<Teuchos::ParameterList>
366 return state_integrator_->getNonconstParameterList();
369 template <
class Scalar>
370 Teuchos::RCP<AdjointSensitivityModelEvaluator<Scalar> >
375 const Teuchos::RCP<Teuchos::ParameterList>& inputPL)
379 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
380 if (inputPL != Teuchos::null) {
381 *pl = inputPL->sublist(
"Sensitivities");
383 const Scalar tfinal = state_integrator_->getTimeStepControl()->getFinalTime();
385 model, adjoint_model, tfinal,
true, pl));
388 template<
class Scalar>
395 using Teuchos::rcp_dynamic_cast;
396 using Teuchos::ParameterList;
398 using Thyra::VectorSpaceBase;
400 using Thyra::defaultProductVector;
401 typedef Thyra::DefaultProductVector<Scalar> DPV;
402 typedef Thyra::DefaultProductVectorSpace<Scalar> DPVS;
406 RCP<ParameterList> shPL =
407 Teuchos::sublist(state_integrator_->getIntegratorParameterList(),
408 "Solution History",
true);
409 solutionHistory_ = createSolutionHistoryPL<Scalar>(shPL);
411 RCP<const VectorSpaceBase<Scalar> > x_space =
412 model_->get_x_space();
413 RCP<const VectorSpaceBase<Scalar> > adjoint_space =
414 sens_model_->get_x_space();
415 Teuchos::Array< RCP<const VectorSpaceBase<Scalar> > > spaces(2);
417 spaces[1] = adjoint_space;
418 RCP<const DPVS > prod_space = Thyra::productVectorSpace(spaces());
419 const Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
421 RCP<const SolutionHistory<Scalar> > state_solution_history =
422 state_integrator_->getSolutionHistory();
423 int num_states = state_solution_history->getNumStates();
424 for (
int i=0; i<num_states; ++i) {
425 RCP<const SolutionState<Scalar> > state = (*state_solution_history)[i];
428 RCP<DPV> x = defaultProductVector(prod_space);
429 assign(x->getNonconstVectorBlock(0).ptr(), *(state->getX()));
430 assign(x->getNonconstVectorBlock(1).ptr(), zero);
431 RCP<VectorBase<Scalar> > x_b = x;
434 RCP<VectorBase<Scalar> > x_dot_b;
435 if (state->getXDot() != Teuchos::null) {
436 RCP<DPV> x_dot = defaultProductVector(prod_space);
437 assign(x_dot->getNonconstVectorBlock(0).ptr(), *(state->getXDot()));
438 assign(x_dot->getNonconstVectorBlock(1).ptr(), zero);
443 RCP<VectorBase<Scalar> > x_dot_dot_b;
444 if (state->getXDotDot() != Teuchos::null) {
445 RCP<DPV> x_dot_dot = defaultProductVector(prod_space);
446 assign(x_dot_dot->getNonconstVectorBlock(0).ptr(),*(state->getXDotDot()));
447 assign(x_dot_dot->getNonconstVectorBlock(1).ptr(), zero);
448 x_dot_dot_b = x_dot_dot;
451 RCP<SolutionState<Scalar> > prod_state = state->clone();
452 prod_state->setX(x_b);
453 prod_state->setXDot(x_dot_b);
454 prod_state->setXDotDot(x_dot_dot_b);
455 solutionHistory_->addState(prod_state);
458 RCP<const VectorBase<Scalar> > frozen_x =
459 state_solution_history->getCurrentState()->getX();
460 RCP<const VectorBase<Scalar> > frozen_x_dot =
461 state_solution_history->getCurrentState()->getXDot();
462 RCP<const VectorBase<Scalar> > frozen_x_dot_dot =
463 state_solution_history->getCurrentState()->getXDotDot();
464 RCP<const SolutionHistory<Scalar> > sens_solution_history =
465 sens_integrator_->getSolutionHistory();
466 num_states = sens_solution_history->getNumStates();
467 for (
int i=0; i<num_states; ++i) {
468 RCP<const SolutionState<Scalar> > state = (*sens_solution_history)[i];
471 RCP<DPV> x = defaultProductVector(prod_space);
472 assign(x->getNonconstVectorBlock(0).ptr(), *frozen_x);
473 assign(x->getNonconstVectorBlock(1).ptr(), *(state->getX()));
474 RCP<VectorBase<Scalar> > x_b = x;
477 RCP<VectorBase<Scalar> > x_dot_b;
478 if (state->getXDot() != Teuchos::null) {
479 RCP<DPV> x_dot = defaultProductVector(prod_space);
480 assign(x_dot->getNonconstVectorBlock(0).ptr(), *frozen_x_dot);
481 assign(x_dot->getNonconstVectorBlock(1).ptr(), *(state->getXDot()));
486 RCP<VectorBase<Scalar> > x_dot_dot_b;
487 if (state->getXDotDot() != Teuchos::null) {
488 RCP<DPV> x_dot_dot = defaultProductVector(prod_space);
489 assign(x_dot_dot->getNonconstVectorBlock(0).ptr(), *frozen_x_dot_dot);
490 assign(x_dot_dot->getNonconstVectorBlock(1).ptr(),*(state->getXDotDot()));
491 x_dot_dot_b = x_dot_dot;
494 RCP<SolutionState<Scalar> > prod_state = state->clone();
495 prod_state->setX(x_b);
496 prod_state->setXDot(x_dot_b);
497 prod_state->setXDotDot(x_dot_dot_b);
498 solutionHistory_->addState(prod_state,
false);
503 template<
class Scalar>
504 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar> >
506 Teuchos::RCP<Teuchos::ParameterList> pList,
509 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar> > integrator =
515 template<
class Scalar>
516 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar> >
519 std::string stepperType)
521 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar> > integrator =
527 template<
class Scalar>
528 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar> >
530 Teuchos::RCP<Teuchos::ParameterList> pList,
534 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar> > integrator =
540 template<
class Scalar>
541 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar> >
545 std::string stepperType)
547 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar> > integrator =
553 template<
class Scalar>
554 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar> >
557 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar> > integrator =
563 #endif // Tempus_IntegratorPseudoTransientAdjointSensitivity_impl_hpp static Teuchos::RCP< const Teuchos::ParameterList > getValidParameters()
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > &pl) override
virtual Scalar getTime() const override
Get current time.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const override
virtual void setTempusParameterList(Teuchos::RCP< Teuchos::ParameterList > pl) override
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getXDotDot() const
Get current the second time derivative of the solution, xdotdot.
Teuchos::RCP< Tempus::IntegratorPseudoTransientAdjointSensitivity< Scalar > > integratorPseudoTransientAdjointSensitivity(Teuchos::RCP< Teuchos::ParameterList > pList, const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &model)
Nonmember constructor.
Teuchos::RCP< Teuchos::ParameterList > unsetParameterList() override
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getDgDp() const
Return adjoint sensitivity stored in gradient format.
std::string description() const override
virtual Teuchos::RCP< SolutionHistory< Scalar > > getNonConstSolutionHistory() override
Get the SolutionHistory.
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
Time integrator suitable for pseudotransient adjoint sensitivity analysis.
Teuchos::RCP< AdjointSensitivityModelEvaluator< Scalar > > createSensitivityModel(const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &model, const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &adjoint_model, const Teuchos::RCP< Teuchos::ParameterList > &inputPL)
virtual Teuchos::RCP< TimeStepControl< Scalar > > getNonConstTimeStepControl() override
Status
Status for the Integrator, the Stepper and the SolutionState.
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 > > y0=Teuchos::null, Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > ydot0=Teuchos::null, Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > ydotdot0=Teuchos::null)
Set the initial state from Thyra::VectorBase(s)
IntegratorPseudoTransientAdjointSensitivity()
Destructor.
Teuchos::RCP< Teuchos::ParameterList > getNonconstParameterList() override
RCP< ImplicitAdjointModelEvaluator< Scalar > > implicitAdjointModelEvaluator(const RCP< const ModelEvaluator< Scalar > > &model)
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getXDot() const
Get current the time derivative of the solution, xdot.
virtual Teuchos::RCP< Teuchos::ParameterList > getTempusParameterList() override
Return a copy of the Tempus ParameterList.
virtual void setStatus(const Status st) override
Set Status.
virtual int getIndex() const override
Get current index.
virtual Teuchos::RCP< Stepper< Scalar > > getStepper() const override
Get the Stepper.
virtual Teuchos::RCP< const SolutionHistory< Scalar > > getSolutionHistory() const override
Get the SolutionHistory.
virtual Teuchos::RCP< const TimeStepControl< Scalar > > getTimeStepControl() const override
Get the TimeStepControl.
ModelEvaluator for forming adjoint sensitivity equations.
virtual bool advanceTime()
Advance the solution to timeMax, and return true if successful.
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getX() const
Get current the solution, x.
void buildSolutionHistory()
Thyra::DefaultMultiVectorProductVector< Scalar > DMVPV
virtual Status getStatus() const override
Get Status.