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"
19 template<
class Scalar>
26 state_integrator_ = integratorBasic<Scalar>(inputPL, model_);
27 sens_model_ = createSensitivityModel(model_, inputPL);
28 sens_integrator_ = integratorBasic<Scalar>(inputPL, sens_model_);
31 template<
class Scalar>
35 std::string stepperType)
38 state_integrator_ = integratorBasic<Scalar>(model_, stepperType);
39 sens_model_ = createSensitivityModel(model, Teuchos::null);
40 sens_integrator_ = integratorBasic<Scalar>(sens_model_, stepperType);
43 template<
class Scalar>
47 state_integrator_ = integratorBasic<Scalar>();
48 sens_integrator_ = integratorBasic<Scalar>();
51 template<
class Scalar>
57 state_integrator_->getTimeStepControl()->getFinalTime();
58 return advanceTime(tfinal);
61 template<
class Scalar>
71 bool state_status = state_integrator_->advanceTime(timeFinal);
74 sens_model_->setForwardSolutionHistory(
75 state_integrator_->getSolutionHistory());
78 bool sens_status = sens_integrator_->advanceTime(timeFinal);
82 MEB::InArgs<Scalar> inargs = sens_model_->getNominalValues();
83 MEB::OutArgs<Scalar> outargs = sens_model_->createOutArgs();
84 inargs.set_t(sens_integrator_->getTime());
85 inargs.set_x(sens_integrator_->getX());
86 if (inargs.supports(MEB::IN_ARG_x_dot))
87 inargs.set_x_dot(sens_integrator_->getXDot());
88 if (inargs.supports(MEB::IN_ARG_x_dot_dot))
89 inargs.set_x_dot_dot(sens_integrator_->getXDotDot());
90 RCP<VectorBase<Scalar> > G = dgdp_;
91 if (G == Teuchos::null) {
92 G = Thyra::createMember(sens_model_->get_g_space(0));
93 dgdp_ = Teuchos::rcp_dynamic_cast<
DMVPV>(G);
96 sens_model_->evalModel(inargs, outargs);
98 buildSolutionHistory();
100 return state_status && sens_status;
103 template<
class Scalar>
108 return solutionHistory_->getCurrentTime();
111 template<
class Scalar>
116 return solutionHistory_->getCurrentIndex();
119 template<
class Scalar>
124 Status state_status = state_integrator_->getStatus();
125 Status sens_status = sens_integrator_->getStatus();
133 template<
class Scalar>
138 return state_integrator_->getStepper();
141 template<
class Scalar>
146 return state_integrator_->getTempusParameterList();
149 template<
class Scalar>
154 state_integrator_->setTempusParameterList(pl);
155 sens_integrator_->setTempusParameterList(pl);
158 template<
class Scalar>
163 return solutionHistory_;
166 template<
class Scalar>
171 return state_integrator_->getTimeStepControl();
174 template<
class Scalar>
179 return state_integrator_->getNonConstTimeStepControl();
182 template<
class Scalar>
193 using Teuchos::rcp_dynamic_cast;
196 using Thyra::createMember;
201 RCP< const VectorSpaceBase<Scalar> > space = sens_model_->get_x_space();
202 RCP<DMVPV> Y = rcp_dynamic_cast<
DMVPV>(createMember(space));
203 RCP<DMVPV> Ydot = rcp_dynamic_cast<
DMVPV>(createMember(space));
204 RCP<DMVPV> Ydotdot = rcp_dynamic_cast<
DMVPV>(createMember(space));
208 if (y0 == Teuchos::null)
209 assign(Y->getNonconstMultiVector().ptr(), zero);
211 assign(Y->getNonconstMultiVector().ptr(), *y0);
214 if (ydot0 == Teuchos::null)
215 assign(Ydot->getNonconstMultiVector().ptr(), zero);
217 assign(Ydot->getNonconstMultiVector().ptr(), *ydot0);
220 if (ydotdot0 == Teuchos::null)
221 assign(Ydotdot->getNonconstMultiVector().ptr(), zero);
223 assign(Ydotdot->getNonconstMultiVector().ptr(), *ydotdot0);
225 state_integrator_->initializeSolutionHistory(t0, x0, xdot0, xdotdot0);
226 sens_integrator_->initializeSolutionHistory(t0, Y, Ydot, Ydotdot);
229 template<
class Scalar>
234 return state_integrator_->getX();
237 template<
class Scalar>
242 return state_integrator_->getXDot();
245 template<
class Scalar>
250 return state_integrator_->getXDotDot();
253 template<
class Scalar>
258 return dgdp_->getMultiVector();
261 template<
class Scalar>
266 std::string name =
"Tempus::IntegratorPseudoTransientAdjointSensitivity";
270 template<
class Scalar>
277 auto out = Teuchos::fancyOStream( in_out.
getOStream() );
278 *out << description() <<
"::describe" << std::endl;
279 state_integrator_->describe(*out, verbLevel);
280 sens_integrator_->describe(*out, verbLevel);
283 template<
class Scalar>
288 state_integrator_->setParameterList(inputPL);
289 sens_integrator_->setParameterList(inputPL);
292 template<
class Scalar>
297 state_integrator_->unsetParameterList();
298 return sens_integrator_->unsetParameterList();
301 template<
class Scalar>
309 state_integrator_->getValidParameters();
318 template<
class Scalar>
323 return state_integrator_->getNonconstParameterList();
326 template <
class Scalar>
336 if (inputPL != Teuchos::null) {
337 *pl = inputPL->
sublist(
"Sensitivities");
339 const Scalar tfinal = state_integrator_->getTimeStepControl()->getFinalTime();
341 model, tfinal,
true, pl));
344 template<
class Scalar>
351 using Teuchos::rcp_dynamic_cast;
356 using Thyra::defaultProductVector;
362 RCP<ParameterList> shPL =
363 Teuchos::sublist(state_integrator_->getIntegratorParameterList(),
364 "Solution History",
true);
365 solutionHistory_ = createSolutionHistoryPL<Scalar>(shPL);
367 RCP<const VectorSpaceBase<Scalar> > x_space =
368 model_->get_x_space();
369 RCP<const VectorSpaceBase<Scalar> > adjoint_space =
370 sens_model_->get_x_space();
373 spaces[1] = adjoint_space;
374 RCP<const DPVS > prod_space = Thyra::productVectorSpace(spaces());
377 RCP<const SolutionHistory<Scalar> > state_solution_history =
378 state_integrator_->getSolutionHistory();
379 int num_states = state_solution_history->getNumStates();
380 for (
int i=0; i<num_states; ++i) {
381 RCP<const SolutionState<Scalar> > state = (*state_solution_history)[i];
384 RCP<DPV> x = defaultProductVector(prod_space);
385 assign(x->getNonconstVectorBlock(0).ptr(), *(state->getX()));
386 assign(x->getNonconstVectorBlock(1).ptr(), zero);
387 RCP<VectorBase<Scalar> > x_b = x;
390 RCP<VectorBase<Scalar> > x_dot_b;
391 if (state->getXDot() != Teuchos::null) {
392 RCP<DPV> x_dot = defaultProductVector(prod_space);
393 assign(x_dot->getNonconstVectorBlock(0).ptr(), *(state->getXDot()));
394 assign(x_dot->getNonconstVectorBlock(1).ptr(), zero);
399 RCP<VectorBase<Scalar> > x_dot_dot_b;
400 if (state->getXDotDot() != Teuchos::null) {
401 RCP<DPV> x_dot_dot = defaultProductVector(prod_space);
402 assign(x_dot_dot->getNonconstVectorBlock(0).ptr(),*(state->getXDotDot()));
403 assign(x_dot_dot->getNonconstVectorBlock(1).ptr(), zero);
404 x_dot_dot_b = x_dot_dot;
407 RCP<SolutionState<Scalar> > prod_state = state->clone();
408 prod_state->setX(x_b);
409 prod_state->setXDot(x_dot_b);
410 prod_state->setXDotDot(x_dot_dot_b);
411 solutionHistory_->addState(prod_state);
414 RCP<const VectorBase<Scalar> > frozen_x =
415 state_solution_history->getCurrentState()->getX();
416 RCP<const VectorBase<Scalar> > frozen_x_dot =
417 state_solution_history->getCurrentState()->getXDot();
418 RCP<const VectorBase<Scalar> > frozen_x_dot_dot =
419 state_solution_history->getCurrentState()->getXDotDot();
420 RCP<const SolutionHistory<Scalar> > sens_solution_history =
421 sens_integrator_->getSolutionHistory();
422 num_states = sens_solution_history->getNumStates();
423 for (
int i=0; i<num_states; ++i) {
424 RCP<const SolutionState<Scalar> > state = (*sens_solution_history)[i];
427 RCP<DPV> x = defaultProductVector(prod_space);
428 assign(x->getNonconstVectorBlock(0).ptr(), *frozen_x);
429 assign(x->getNonconstVectorBlock(1).ptr(), *(state->getX()));
430 RCP<VectorBase<Scalar> > x_b = x;
433 RCP<VectorBase<Scalar> > x_dot_b;
434 if (state->getXDot() != Teuchos::null) {
435 RCP<DPV> x_dot = defaultProductVector(prod_space);
436 assign(x_dot->getNonconstVectorBlock(0).ptr(), *frozen_x_dot);
437 assign(x_dot->getNonconstVectorBlock(1).ptr(), *(state->getXDot()));
442 RCP<VectorBase<Scalar> > x_dot_dot_b;
443 if (state->getXDotDot() != Teuchos::null) {
444 RCP<DPV> x_dot_dot = defaultProductVector(prod_space);
445 assign(x_dot_dot->getNonconstVectorBlock(0).ptr(), *frozen_x_dot_dot);
446 assign(x_dot_dot->getNonconstVectorBlock(1).ptr(),*(state->getXDotDot()));
447 x_dot_dot_b = x_dot_dot;
450 RCP<SolutionState<Scalar> > prod_state = state->clone();
451 prod_state->setX(x_b);
452 prod_state->setXDot(x_dot_b);
453 prod_state->setXDotDot(x_dot_dot_b);
454 solutionHistory_->addState(prod_state,
false);
459 template<
class Scalar>
471 template<
class Scalar>
475 std::string stepperType)
483 template<
class Scalar>
493 #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 > > getXDot() const
Get current the time derivative of the solution, xdot.
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
std::string description() const override
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getDgDp() const
Return adjoint sensitivity stored in gradient format.
Time integrator suitable for pseudotransient adjoint sensitivity analysis.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
virtual Teuchos::RCP< TimeStepControl< Scalar > > getNonConstTimeStepControl() override
Status
Status for the Integrator, the Stepper and the SolutionState.
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getXDotDot() const
Get current the second time derivative of the solution, xdotdot.
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
ParameterList & setParameters(const ParameterList &source)
Teuchos::RCP< AdjointSensitivityModelEvaluator< Scalar > > createSensitivityModel(const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &model, const Teuchos::RCP< Teuchos::ParameterList > &inputPL)
virtual Teuchos::RCP< Teuchos::ParameterList > getTempusParameterList() override
Return a copy of the Tempus ParameterList.
RCP< std::basic_ostream< char_type, traits_type > > getOStream()
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.
ParameterList & sublist(const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
virtual bool advanceTime()
Advance the solution to timeMax, and return true if successful.
void buildSolutionHistory()
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getX() const
Get current the solution, x.
virtual Status getStatus() const override
Get Status.