9 #ifndef Tempus_IntegratorForwardSensitivity_impl_hpp
10 #define Tempus_IntegratorForwardSensitivity_impl_hpp
13 #include "Thyra_DefaultMultiVectorProductVector.hpp"
14 #include "Thyra_VectorStdOps.hpp"
15 #include "Thyra_MultiVectorStdOps.hpp"
17 #include "Tempus_CombinedForwardSensitivityModelEvaluator.hpp"
22 template <
class Scalar>
29 bool use_combined_method)
31 integrator_(integrator),
32 sens_model_(sens_model),
33 sens_stepper_(sens_stepper),
34 use_combined_method_(use_combined_method)
39 template <
class Scalar>
42 integrator_ = createIntegratorBasic<Scalar>();
43 integrator_->initialize();
46 template <
class Scalar>
50 if (use_combined_method_)
51 integrator_->setModel(sens_model_);
53 integrator_->setStepper(sens_stepper_);
56 template <
class Scalar>
66 using Teuchos::rcp_dynamic_cast;
68 using Thyra::createMember;
75 RCP<const VectorSpaceBase<Scalar>> space;
76 if (use_combined_method_)
77 space = sens_model_->get_x_space();
79 space = sens_stepper_->get_x_space();
80 RCP<DMVPV> X = rcp_dynamic_cast<DMVPV>(createMember(space));
81 RCP<DMVPV> Xdot = rcp_dynamic_cast<DMVPV>(createMember(space));
82 RCP<DMVPV> Xdotdot = rcp_dynamic_cast<DMVPV>(createMember(space));
89 assign(X->getNonconstMultiVector()->col(0).ptr(), *x0);
90 if (DxDp0 == Teuchos::null)
91 assign(X->getNonconstMultiVector()->subView(rng).ptr(), zero);
93 assign(X->getNonconstMultiVector()->subView(rng).ptr(), *DxDp0);
96 if (xdot0 == Teuchos::null)
97 assign(Xdot->getNonconstMultiVector()->col(0).ptr(), zero);
99 assign(Xdot->getNonconstMultiVector()->col(0).ptr(), *xdot0);
100 if (DxdotDp0 == Teuchos::null)
101 assign(Xdot->getNonconstMultiVector()->subView(rng).ptr(), zero);
103 assign(Xdot->getNonconstMultiVector()->subView(rng).ptr(), *DxdotDp0);
106 if (xdotdot0 == Teuchos::null)
107 assign(Xdotdot->getNonconstMultiVector()->col(0).ptr(), zero);
109 assign(Xdotdot->getNonconstMultiVector()->col(0).ptr(), *xdotdot0);
110 if (DxdotDp0 == Teuchos::null)
111 assign(Xdotdot->getNonconstMultiVector()->subView(rng).ptr(), zero);
113 assign(Xdotdot->getNonconstMultiVector()->subView(rng).ptr(), *DxdotdotDp0);
115 integrator_->initializeSolutionHistory(t0, X, Xdot, Xdotdot);
118 template <
class Scalar>
123 using Teuchos::rcp_dynamic_cast;
126 RCP<const DMVPV> X = rcp_dynamic_cast<
const DMVPV>(integrator_->getX());
130 template <
class Scalar>
135 using Teuchos::rcp_dynamic_cast;
138 RCP<const DMVPV> X = rcp_dynamic_cast<
const DMVPV>(integrator_->getX());
141 return X->getMultiVector()->subView(rng);
144 template <
class Scalar>
149 using Teuchos::rcp_dynamic_cast;
152 RCP<const DMVPV> Xdot = rcp_dynamic_cast<
const DMVPV>(integrator_->getXDot());
156 template <
class Scalar>
161 using Teuchos::rcp_dynamic_cast;
164 RCP<const DMVPV> Xdot = rcp_dynamic_cast<
const DMVPV>(integrator_->getXDot());
165 const int num_param = Xdot->
getMultiVector()->domain()->dim() - 1;
167 return Xdot->getMultiVector()->subView(rng);
170 template <
class Scalar>
175 using Teuchos::rcp_dynamic_cast;
178 RCP<const DMVPV> Xdotdot =
179 rcp_dynamic_cast<
const DMVPV>(integrator_->getXDotDot());
183 template <
class Scalar>
188 using Teuchos::rcp_dynamic_cast;
191 RCP<const DMVPV> Xdotdot =
192 rcp_dynamic_cast<
const DMVPV>(integrator_->getXDotDot());
193 const int num_param = Xdotdot->
getMultiVector()->domain()->dim() - 1;
195 return Xdotdot->getMultiVector()->subView(rng);
198 template <
class Scalar>
207 if (use_combined_method_)
208 smodel = sens_model_;
210 smodel = sens_stepper_->getModel();
211 MEB::InArgs<Scalar> inargs = smodel->getNominalValues();
212 MEB::OutArgs<Scalar> outargs = smodel->createOutArgs();
213 inargs.set_t(integrator_->getTime());
214 inargs.set_x(integrator_->getX());
215 if (inargs.supports(MEB::IN_ARG_x_dot))
216 inargs.set_x_dot(integrator_->getXDot());
217 if (inargs.supports(MEB::IN_ARG_x_dot_dot))
218 inargs.set_x_dot_dot(integrator_->getXDotDot());
221 Thyra::createMember(smodel->get_g_space(1));
224 smodel->evalModel(inargs, outargs);
228 template <
class Scalar>
238 if (use_combined_method_)
239 smodel = sens_model_;
241 smodel = sens_stepper_->getModel();
242 MEB::InArgs<Scalar> inargs = smodel->getNominalValues();
243 MEB::OutArgs<Scalar> outargs = smodel->createOutArgs();
244 inargs.set_t(integrator_->getTime());
245 inargs.set_x(integrator_->getX());
246 if (inargs.supports(MEB::IN_ARG_x_dot))
247 inargs.set_x_dot(integrator_->getXDot());
248 if (inargs.supports(MEB::IN_ARG_x_dot_dot))
249 inargs.set_x_dot_dot(integrator_->getXDotDot());
252 Thyra::createMember(smodel->get_g_space(0));
256 smodel->evalModel(inargs, outargs);
257 return dgdp->getMultiVector();
260 template <
class Scalar>
263 std::string name =
"Tempus::IntegratorForwardSensitivity";
267 template <
class Scalar>
271 auto l_out = Teuchos::fancyOStream(out.
getOStream());
273 l_out->setOutputToRootOnly(0);
275 *l_out << description() <<
"::describe" << std::endl;
276 integrator_->describe(*l_out, verbLevel);
279 template <
class Scalar>
283 return sens_stepper_->getStepMode();
287 template <
class Scalar>
299 auto fwd_integrator = createIntegratorBasic<Scalar>(pList, model);
306 fwd_integrator->getValidParameters();
309 pl->setParameters(*integrator_pl);
312 spl.
set(
"Sensitivity Method",
"Combined");
313 spl.
set(
"Reuse State Linear Solver",
false);
317 auto sens_pl = Teuchos::sublist(pList,
"Sensitivities",
false);
318 std::string integratorName =
319 pList->get<std::string>(
"Integrator Name",
"Default Integrator");
320 std::string stepperName =
321 pList->sublist(integratorName).get<std::string>(
"Stepper Name");
322 auto stepper_pl = Teuchos::sublist(pList, stepperName,
true);
323 std::string sensitivity_method =
324 sens_pl->get<std::string>(
"Sensitivity Method");
325 bool use_combined_method = sensitivity_method ==
"Combined";
330 sens_pl->remove(
"Sensitivity Method");
332 if (use_combined_method) {
333 sens_pl->remove(
"Reuse State Linear Solver");
335 sens_solve_model, sens_pl);
336 fwd_integrator = createIntegratorBasic<Scalar>(pList, sens_model);
341 model, sens_residual_model, sens_solve_model, stepper_pl,
343 auto fsa_staggered_me =
345 sens_stepper->getModel());
346 fwd_integrator = createIntegratorBasic<Scalar>(pList, fsa_staggered_me);
347 fwd_integrator->setStepper(sens_stepper);
354 model, fwd_integrator, sens_model, sens_stepper,
355 use_combined_method));
360 template <
class Scalar>
370 #endif // Tempus_IntegratorForwardSensitivity_impl_hpp
Teuchos::RCP< IntegratorBasic< Scalar > > integrator_
Teuchos::RCP< IntegratorForwardSensitivity< Scalar > > createIntegratorForwardSensitivity(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 Teuchos::RCP< const Thyra::VectorBase< Scalar > > getXDotDot() const
Get current the second time derivative of the solution, xdotdot, only. This is the first block only a...
std::string description() const override
virtual void setStepper(Teuchos::RCP< Thyra::ModelEvaluator< Scalar >> model)
Set the Stepper.
SensitivityStepMode getStepMode() const
What mode the current time integration step is in.
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getDXDotDp() const
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 > > getDXDotDotDp() const
static Teuchos::RCP< const Teuchos::ParameterList > getValidParameters()
A stepper implementing staggered forward sensitivity analysis.
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getDgDp() const
Return forward sensitivity stored in Jacobian format.
IntegratorForwardSensitivity()
Destructor.
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getDxDp() const
Get the forward sensitivities .
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Teuchos::RCP< SensitivityModelEvaluatorBase< Scalar > > wrapCombinedFSAModelEvaluator(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 Teuchos::RCP< const Teuchos::ParameterList > &pList=Teuchos::null)
RCP< const MultiVectorBase< Scalar > > getMultiVector() const
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const override
ParameterList & setParameters(const ParameterList &source)
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getG() const
Return response function g.
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getX() const
Get the current solution, x, only. If looking for the solution vector and the sensitivities, use SolutionState->getX() which will return a Block MultiVector with the first block containing the current solution, x, and the remaining blocks are the forward sensitivities .
RCP< std::basic_ostream< char_type, traits_type > > getOStream()
ParameterList & setParametersNotAlreadySet(const ParameterList &source)
RCP< MultiVectorBase< Scalar > > getNonconstMultiVector()
ParameterList & sublist(const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getXDot() const
Get current the time derivative of the solution, xdot, only. This is the first block only and not the...
A ModelEvaluator decorator for sensitivity analysis.
Time integrator implementing forward sensitivity analysis.
virtual void initializeSolutionHistory(Teuchos::RCP< SolutionState< Scalar >> state=Teuchos::null)
Set the initial state which has the initial conditions.