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" 21 template <
class Scalar>
24 const Teuchos::RCP<SensitivityModelEvaluatorBase<Scalar>> &sens_model,
25 const Teuchos::RCP<IntegratorBasic<Scalar>> &fwd_integrator,
26 const Teuchos::RCP<IntegratorBasic<Scalar>> &sens_integrator,
27 const bool reuse_solver,
28 const bool force_W_update)
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)
38 template<
class Scalar>
42 force_W_update_(false)
48 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(),
70 bool sens_status = sens_integrator_->advanceTime();
72 buildSolutionHistory();
74 return state_status && sens_status;
77 template<
class Scalar>
86 bool state_status = state_integrator_->advanceTime(timeFinal);
89 sens_model_->setForwardSolutionState(state_integrator_->getCurrentState());
93 state_integrator_->getStepper()->getSolver() != Teuchos::null) {
94 sens_model_->setSolver(state_integrator_->getStepper()->getSolver(),
99 bool sens_status = sens_integrator_->advanceTime(timeFinal);
101 buildSolutionHistory();
103 return state_status && sens_status;
106 template<
class Scalar>
111 return solutionHistory_->getCurrentTime();
114 template<
class Scalar>
119 return solutionHistory_->getCurrentIndex();
122 template<
class Scalar>
127 Status state_status = state_integrator_->getStatus();
128 Status sens_status = sens_integrator_->getStatus();
136 template <
class Scalar>
139 state_integrator_->setStatus(st);
140 sens_integrator_->setStatus(st);
143 template<
class Scalar>
144 Teuchos::RCP<Stepper<Scalar> >
148 return state_integrator_->getStepper();
151 template<
class Scalar>
152 Teuchos::RCP<const SolutionHistory<Scalar> >
156 return solutionHistory_;
159 template<
class Scalar>
160 Teuchos::RCP<SolutionHistory<Scalar> >
164 return solutionHistory_;
167 template<
class Scalar>
168 Teuchos::RCP<const TimeStepControl<Scalar> >
172 return state_integrator_->getTimeStepControl();
175 template<
class Scalar>
176 Teuchos::RCP<TimeStepControl<Scalar> >
180 return state_integrator_->getNonConstTimeStepControl();
183 template<
class Scalar>
194 using Teuchos::rcp_dynamic_cast;
195 using Thyra::VectorSpaceBase;
197 using Thyra::createMember;
198 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
203 RCP< const VectorSpaceBase<Scalar> > space = sens_model_->get_x_space();
204 RCP<DMVPV> X = rcp_dynamic_cast<DMVPV>(createMember(space));
205 RCP<DMVPV> Xdot = rcp_dynamic_cast<DMVPV>(createMember(space));
206 RCP<DMVPV> Xdotdot = rcp_dynamic_cast<DMVPV>(createMember(space));
207 const Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
210 if (DxDp0 == Teuchos::null)
211 assign(X->getNonconstMultiVector().ptr(), zero);
213 assign(X->getNonconstMultiVector().ptr(), *DxDp0);
216 if (DxdotDp0 == Teuchos::null)
217 assign(Xdot->getNonconstMultiVector().ptr(), zero);
219 assign(Xdot->getNonconstMultiVector().ptr(), *DxdotDp0);
222 if (DxdotDp0 == Teuchos::null)
223 assign(Xdotdot->getNonconstMultiVector().ptr(), zero);
225 assign(Xdotdot->getNonconstMultiVector().ptr(), *DxdotdotDp0);
227 state_integrator_->initializeSolutionHistory(t0, x0, xdot0, xdotdot0);
228 sens_integrator_->initializeSolutionHistory(t0, X, Xdot, Xdotdot);
231 template<
class Scalar>
232 Teuchos::RCP<const Thyra::VectorBase<Scalar> >
237 using Teuchos::rcp_dynamic_cast;
238 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
241 rcp_dynamic_cast<
const DMVPV>(solutionHistory_->getCurrentState()->getX());
242 return X->getMultiVector()->col(0);
245 template<
class Scalar>
246 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> >
251 using Teuchos::rcp_dynamic_cast;
252 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
255 rcp_dynamic_cast<
const DMVPV>(solutionHistory_->getCurrentState()->getX());
256 const int num_param = X->getMultiVector()->domain()->dim()-1;
257 const Teuchos::Range1D rng(1,num_param);
258 return X->getMultiVector()->subView(rng);
261 template<
class Scalar>
262 Teuchos::RCP<const Thyra::VectorBase<Scalar> >
267 using Teuchos::rcp_dynamic_cast;
268 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
270 RCP<const DMVPV> Xdot =
271 rcp_dynamic_cast<
const DMVPV>(solutionHistory_->getCurrentState()->getXDot());
272 return Xdot->getMultiVector()->col(0);
275 template<
class Scalar>
276 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> >
281 using Teuchos::rcp_dynamic_cast;
282 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
284 RCP<const DMVPV> Xdot =
285 rcp_dynamic_cast<
const DMVPV>(solutionHistory_->getCurrentState()->getXDot());
286 const int num_param = Xdot->getMultiVector()->domain()->dim()-1;
287 const Teuchos::Range1D rng(1,num_param);
288 return Xdot->getMultiVector()->subView(rng);
291 template<
class Scalar>
292 Teuchos::RCP<const Thyra::VectorBase<Scalar> >
297 using Teuchos::rcp_dynamic_cast;
298 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
300 RCP<const DMVPV> Xdotdot =
301 rcp_dynamic_cast<
const DMVPV>(solutionHistory_->getCurrentState()->getXDotDot());
302 return Xdotdot->getMultiVector()->col(0);
305 template<
class Scalar>
306 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> >
311 using Teuchos::rcp_dynamic_cast;
312 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
314 RCP<const DMVPV> Xdotdot =
315 rcp_dynamic_cast<
const DMVPV>(solutionHistory_->getCurrentState()->getXDotDot());
316 const int num_param = Xdotdot->getMultiVector()->domain()->dim()-1;
317 const Teuchos::Range1D rng(1,num_param);
318 return Xdotdot->getMultiVector()->subView(rng);
321 template<
class Scalar>
326 std::string name =
"Tempus::IntegratorPseudoTransientForwardSensitivity";
330 template<
class Scalar>
334 Teuchos::FancyOStream &out,
335 const Teuchos::EVerbosityLevel verbLevel)
const 337 auto l_out = Teuchos::fancyOStream( out.getOStream() );
338 Teuchos::OSTab ostab(*l_out, 2, this->description());
339 l_out->setOutputToRootOnly(0);
341 *l_out << description() <<
"::describe" << std::endl;
342 state_integrator_->describe(*l_out, verbLevel);
343 sens_integrator_->describe(*l_out, verbLevel);
347 template<
class Scalar>
354 using Teuchos::rcp_dynamic_cast;
355 using Teuchos::ParameterList;
358 using Thyra::VectorSpaceBase;
359 using Thyra::createMembers;
360 using Thyra::multiVectorProductVector;
362 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
368 RCP<ParameterList> shPL;
370 solutionHistory_ = createSolutionHistoryPL<Scalar>(shPL);
372 const int num_param =
373 rcp_dynamic_cast<
const DMVPV>(sens_integrator_->getX())->getMultiVector()->domain()->dim();
374 RCP<const VectorSpaceBase<Scalar> > x_space = model_->get_x_space();
375 RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar> > prod_space =
376 Thyra::multiVectorProductVectorSpace(x_space, num_param+1);
377 const Teuchos::Range1D rng(1,num_param);
378 const Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
380 RCP<const SolutionHistory<Scalar> > state_solution_history =
381 state_integrator_->getSolutionHistory();
382 int num_states = state_solution_history->getNumStates();
383 for (
int i=0; i<num_states; ++i) {
384 RCP<const SolutionState<Scalar> > state = (*state_solution_history)[i];
387 RCP< MultiVectorBase<Scalar> > x_mv =
388 createMembers(x_space, num_param+1);
389 assign(x_mv->col(0).ptr(), *(state->getX()));
390 assign(x_mv->subView(rng).ptr(), zero);
391 RCP<VectorBase<Scalar> > x = multiVectorProductVector(prod_space, x_mv);
394 RCP<VectorBase<Scalar> > x_dot;
395 if (state->getXDot() != Teuchos::null) {
396 RCP< MultiVectorBase<Scalar> > x_dot_mv =
397 createMembers(x_space, num_param+1);
398 assign(x_dot_mv->col(0).ptr(), *(state->getXDot()));
399 assign(x_dot_mv->subView(rng).ptr(), zero);
400 x_dot = multiVectorProductVector(prod_space, x_dot_mv);
404 RCP<VectorBase<Scalar> > x_dot_dot;
405 if (state->getXDotDot() != Teuchos::null) {
406 RCP< MultiVectorBase<Scalar> > x_dot_dot_mv =
407 createMembers(x_space, num_param+1);
408 assign(x_dot_dot_mv->col(0).ptr(), *(state->getXDotDot()));
409 assign(x_dot_dot_mv->subView(rng).ptr(), zero);
410 x_dot_dot = multiVectorProductVector(prod_space, x_dot_dot_mv);
413 RCP<SolutionState<Scalar> > prod_state = state->clone();
415 prod_state->setXDot(x_dot);
416 prod_state->setXDotDot(x_dot_dot);
417 solutionHistory_->addState(prod_state);
420 RCP<const VectorBase<Scalar> > frozen_x =
421 state_solution_history->getCurrentState()->getX();
422 RCP<const VectorBase<Scalar> > frozen_x_dot =
423 state_solution_history->getCurrentState()->getXDot();
424 RCP<const VectorBase<Scalar> > frozen_x_dot_dot =
425 state_solution_history->getCurrentState()->getXDotDot();
426 RCP<const SolutionHistory<Scalar> > sens_solution_history =
427 sens_integrator_->getSolutionHistory();
428 num_states = sens_solution_history->getNumStates();
429 for (
int i=0; i<num_states; ++i) {
430 RCP<const SolutionState<Scalar> > state = (*sens_solution_history)[i];
433 RCP< MultiVectorBase<Scalar> > x_mv =
434 createMembers(x_space, num_param+1);
435 RCP<const MultiVectorBase<Scalar> > dxdp =
436 rcp_dynamic_cast<
const DMVPV>(state->getX())->getMultiVector();
437 assign(x_mv->col(0).ptr(), *(frozen_x));
438 assign(x_mv->subView(rng).ptr(), *dxdp);
439 RCP<VectorBase<Scalar> > x = multiVectorProductVector(prod_space, x_mv);
442 RCP<VectorBase<Scalar> > x_dot;
443 if (state->getXDot() != Teuchos::null) {
444 RCP< MultiVectorBase<Scalar> > x_dot_mv =
445 createMembers(x_space, num_param+1);
446 RCP<const MultiVectorBase<Scalar> > dxdotdp =
447 rcp_dynamic_cast<
const DMVPV>(state->getXDot())->getMultiVector();
448 assign(x_dot_mv->col(0).ptr(), *(frozen_x_dot));
449 assign(x_dot_mv->subView(rng).ptr(), *dxdotdp);
450 x_dot = multiVectorProductVector(prod_space, x_dot_mv);
454 RCP<VectorBase<Scalar> > x_dot_dot;
455 if (state->getXDotDot() != Teuchos::null) {
456 RCP< MultiVectorBase<Scalar> > x_dot_dot_mv =
457 createMembers(x_space, num_param+1);
458 RCP<const MultiVectorBase<Scalar> > dxdotdotdp =
459 rcp_dynamic_cast<
const DMVPV>(state->getXDotDot())->getMultiVector();
460 assign(x_dot_dot_mv->col(0).ptr(), *(frozen_x_dot_dot));
461 assign(x_dot_dot_mv->subView(rng).ptr(), *dxdotdotdp);
462 x_dot_dot = multiVectorProductVector(prod_space, x_dot_dot_mv);
465 RCP<SolutionState<Scalar> > prod_state = state->clone();
467 prod_state->setXDot(x_dot);
468 prod_state->setXDotDot(x_dot_dot);
469 solutionHistory_->addState(prod_state,
false);
474 template<
class Scalar>
475 Teuchos::RCP<Tempus::IntegratorPseudoTransientForwardSensitivity<Scalar> >
477 Teuchos::RCP<Teuchos::ParameterList> pList,
481 auto fwd_integrator = createIntegratorBasic<Scalar>(pList, model);
482 Teuchos::RCP<SensitivityModelEvaluatorBase<Scalar> > sens_model;
483 Teuchos::RCP<IntegratorBasic<Scalar> > sens_integrator;
486 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::rcp(
new Teuchos::ParameterList);
487 Teuchos::RCP<const Teuchos::ParameterList> integrator_pl = fwd_integrator->getValidParameters();
488 Teuchos::RCP<const Teuchos::ParameterList> sensitivity_pl =
490 pl->setParameters(*integrator_pl);
491 pl->sublist(
"Sensitivities").setParameters(*sensitivity_pl);
492 pl->sublist(
"Sensitivities").set(
"Reuse State Linear Solver",
false);
493 pl->sublist(
"Sensitivities").set(
"Force W Update",
false);
494 pList->setParametersNotAlreadySet(*pl);
497 bool reuse_solver = pList->sublist(
"Sensitivities").get(
"Reuse State Linear Solver",
false);
498 bool force_W_update = pList->sublist(
"Sensitivities").get(
"Force W Update",
false);
501 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
502 if (pList!= Teuchos::null)
504 *pl = pList->sublist(
"Sensitivities");
506 pl->remove(
"Reuse State Linear Solver");
507 pl->remove(
"Force W Update");
509 sens_integrator = createIntegratorBasic<Scalar>(pList, sens_model);
512 Teuchos::RCP<Tempus::IntegratorPseudoTransientForwardSensitivity<Scalar>> integrator =
514 model, sens_model, fwd_integrator, sens_integrator, reuse_solver, force_W_update));
521 template<
class Scalar>
522 Teuchos::RCP<Tempus::IntegratorPseudoTransientForwardSensitivity<Scalar> >
525 Teuchos::RCP<Tempus::IntegratorPseudoTransientForwardSensitivity<Scalar> > integrator =
531 #endif // Tempus_IntegratorPseudoTransientForwardSensitivity_impl_hpp virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getX() const
Get current the solution, x.
virtual Teuchos::RCP< Stepper< Scalar > > getStepper() const override
Get the Stepper.
virtual void setStatus(const Status st) override
Set Status.
virtual Status getStatus() const override
Get Status.
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getDXDotDp() const
virtual Teuchos::RCP< const SolutionHistory< Scalar > > getSolutionHistory() const override
Get the SolutionHistory.
virtual int getIndex() const override
Get current index.
Teuchos::RCP< SensitivityModelEvaluatorBase< Scalar > > wrapStaggeredFSAModelEvaluator(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model, const Teuchos::RCP< const Teuchos::ParameterList > &pList=Teuchos::null)
virtual Teuchos::RCP< TimeStepControl< Scalar > > getNonConstTimeStepControl() override
static Teuchos::RCP< const Teuchos::ParameterList > getValidParameters()
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getXDot() const
Get current the time derivative of the solution, xdot.
Teuchos::RCP< IntegratorBasic< Scalar > > state_integrator_
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getDxDp() const
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 bool advanceTime()
Advance the solution to timeMax, and return true if successful.
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getXDotDot() const
Get current the second time derivative of the solution, xdotdot.
Status
Status for the Integrator, the Stepper and the SolutionState.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const override
std::string description() const override
virtual Scalar getTime() const override
Get current time.
IntegratorPseudoTransientForwardSensitivity()
Destructor.
Time integrator suitable for pseudotransient forward sensitivity analysis.
Teuchos::RCP< Tempus::IntegratorPseudoTransientForwardSensitivity< Scalar > > createIntegratorPseudoTransientForwardSensitivity(Teuchos::RCP< Teuchos::ParameterList > pList, const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &model)
Nonmember constructor.
void buildSolutionHistory()
virtual Teuchos::RCP< const TimeStepControl< Scalar > > getTimeStepControl() const override
Get the TimeStepControl.
virtual Teuchos::RCP< SolutionHistory< Scalar > > getNonConstSolutionHistory() override
Get the SolutionHistory.
Teuchos::RCP< IntegratorBasic< Scalar > > sens_integrator_
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getDXDotDotDp() const