9 #ifndef Tempus_IntegratorPseudoTransientAdjointSensitivity_impl_hpp
10 #define Tempus_IntegratorPseudoTransientAdjointSensitivity_impl_hpp
12 #include "Teuchos_VerboseObjectParameterListHelpers.hpp"
13 #include "Thyra_DefaultMultiVectorProductVector.hpp"
14 #include "Thyra_VectorStdOps.hpp"
15 #include "Thyra_MultiVectorStdOps.hpp"
16 #include "NOX_Thyra.H"
20 template<
class Scalar>
23 Teuchos::RCP<Teuchos::ParameterList> inputPL,
24 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar> >& model)
27 state_integrator_ = integratorBasic<Scalar>(inputPL, model_);
28 sens_model_ = createSensitivityModel(model_, inputPL);
29 sens_integrator_ = integratorBasic<Scalar>(inputPL, sens_model_);
32 template<
class Scalar>
35 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar> >& model,
36 std::string stepperType)
39 state_integrator_ = integratorBasic<Scalar>(model_, stepperType);
40 sens_model_ = createSensitivityModel(model, Teuchos::null);
41 sens_integrator_ = integratorBasic<Scalar>(sens_model_, stepperType);
44 template<
class Scalar>
48 state_integrator_ = integratorBasic<Scalar>();
49 sens_integrator_ = integratorBasic<Scalar>();
52 template<
class Scalar>
58 state_integrator_->getTimeStepControl()->getFinalTime();
59 return advanceTime(tfinal);
62 template<
class Scalar>
68 using Thyra::VectorBase;
69 typedef Thyra::ModelEvaluatorBase MEB;
72 bool state_status = state_integrator_->advanceTime(timeFinal);
75 sens_model_->setForwardSolutionHistory(
76 state_integrator_->getSolutionHistory());
79 bool sens_status = sens_integrator_->advanceTime(timeFinal);
83 MEB::InArgs<Scalar> inargs = sens_model_->getNominalValues();
84 MEB::OutArgs<Scalar> outargs = sens_model_->createOutArgs();
85 inargs.set_t(sens_integrator_->getTime());
86 inargs.set_x(sens_integrator_->getX());
87 if (inargs.supports(MEB::IN_ARG_x_dot))
88 inargs.set_x_dot(sens_integrator_->getXdot());
89 if (inargs.supports(MEB::IN_ARG_x_dot_dot))
90 inargs.set_x_dot_dot(sens_integrator_->getXdotdot());
91 RCP<VectorBase<Scalar> > G = dgdp_;
92 if (G == Teuchos::null) {
93 G = Thyra::createMember(sens_model_->get_g_space(0));
94 dgdp_ = Teuchos::rcp_dynamic_cast<DMVPV>(G);
97 sens_model_->evalModel(inargs, outargs);
99 buildSolutionHistory();
101 return state_status && sens_status;
104 template<
class Scalar>
109 return solutionHistory_->getCurrentTime();
112 template<
class Scalar>
117 return solutionHistory_->getCurrentIndex();
120 template<
class Scalar>
125 Status state_status = state_integrator_->getStatus();
126 Status sens_status = sens_integrator_->getStatus();
134 template<
class Scalar>
135 Teuchos::RCP<Stepper<Scalar> >
139 return state_integrator_->getStepper();
142 template<
class Scalar>
143 Teuchos::RCP<Teuchos::ParameterList>
147 return state_integrator_->getTempusParameterList();
150 template<
class Scalar>
155 state_integrator_->setTempusParameterList(pl);
156 sens_integrator_->setTempusParameterList(pl);
159 template<
class Scalar>
160 Teuchos::RCP<const SolutionHistory<Scalar> >
164 return solutionHistory_;
167 template<
class Scalar>
168 Teuchos::RCP<const TimeStepControl<Scalar> >
172 return state_integrator_->getTimeStepControl();
175 template<
class Scalar>
178 Teuchos::RCP<
const Thyra::VectorBase<Scalar> > x0,
179 Teuchos::RCP<
const Thyra::VectorBase<Scalar> > xdot0,
180 Teuchos::RCP<
const Thyra::VectorBase<Scalar> > xdotdot0,
181 Teuchos::RCP<
const Thyra::MultiVectorBase<Scalar> > y0,
182 Teuchos::RCP<
const Thyra::MultiVectorBase<Scalar> > ydot0,
183 Teuchos::RCP<
const Thyra::MultiVectorBase<Scalar> > ydotdot0)
186 using Teuchos::rcp_dynamic_cast;
187 using Thyra::VectorSpaceBase;
189 using Thyra::createMember;
190 typedef Thyra::DefaultMultiVectorProductVector<Scalar>
DMVPV;
195 RCP< const VectorSpaceBase<Scalar> > space = sens_model_->get_x_space();
196 RCP<DMVPV> Y = rcp_dynamic_cast<DMVPV>(createMember(space));
197 RCP<DMVPV> Ydot = rcp_dynamic_cast<DMVPV>(createMember(space));
198 RCP<DMVPV> Ydotdot = rcp_dynamic_cast<DMVPV>(createMember(space));
199 const Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
202 if (y0 == Teuchos::null)
203 assign(Y->getNonconstMultiVector().ptr(), zero);
205 assign(Y->getNonconstMultiVector().ptr(), *y0);
208 if (ydot0 == Teuchos::null)
209 assign(Ydot->getNonconstMultiVector().ptr(), zero);
211 assign(Ydot->getNonconstMultiVector().ptr(), *ydot0);
214 if (ydotdot0 == Teuchos::null)
215 assign(Ydotdot->getNonconstMultiVector().ptr(), zero);
217 assign(Ydotdot->getNonconstMultiVector().ptr(), *ydotdot0);
219 state_integrator_->setInitialState(t0, x0, xdot0, xdotdot0);
220 sens_integrator_->setInitialState(t0, Y, Ydot, Ydotdot);
223 template<
class Scalar>
224 Teuchos::RCP<const Thyra::VectorBase<Scalar> >
228 return state_integrator_->getX();
231 template<
class Scalar>
232 Teuchos::RCP<const Thyra::VectorBase<Scalar> >
236 return state_integrator_->getXdot();
239 template<
class Scalar>
240 Teuchos::RCP<const Thyra::VectorBase<Scalar> >
244 return state_integrator_->getXdotdot();
247 template<
class Scalar>
248 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> >
252 return dgdp_->getMultiVector();
255 template<
class Scalar>
260 std::string name =
"Tempus::IntegratorPseudoTransientAdjointSensitivity";
264 template<
class Scalar>
268 Teuchos::FancyOStream &out,
269 const Teuchos::EVerbosityLevel verbLevel)
const
271 out << description() <<
"::describe" << std::endl;
272 state_integrator_->describe(out, verbLevel);
273 sens_integrator_->describe(out, verbLevel);
276 template<
class Scalar>
281 state_integrator_->setParameterList(inputPL);
282 sens_integrator_->setParameterList(inputPL);
285 template<
class Scalar>
286 Teuchos::RCP<Teuchos::ParameterList>
290 state_integrator_->unsetParameterList();
291 return sens_integrator_->unsetParameterList();
294 template<
class Scalar>
295 Teuchos::RCP<const Teuchos::ParameterList>
299 Teuchos::RCP<Teuchos::ParameterList> pl =
300 Teuchos::rcp(
new Teuchos::ParameterList);
301 Teuchos::RCP<const Teuchos::ParameterList> integrator_pl =
302 state_integrator_->getValidParameters();
303 Teuchos::RCP<const Teuchos::ParameterList> sensitivity_pl =
305 pl->setParameters(*integrator_pl);
306 pl->sublist(
"Sensitivities").setParameters(*sensitivity_pl);
311 template<
class Scalar>
312 Teuchos::RCP<Teuchos::ParameterList>
316 return state_integrator_->getNonconstParameterList();
319 template <
class Scalar>
320 Teuchos::RCP<Tempus::AdjointSensitivityModelEvaluator<Scalar> >
323 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar> >& model,
324 const Teuchos::RCP<Teuchos::ParameterList>& inputPL)
328 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
329 if (inputPL != Teuchos::null) {
330 *pl = inputPL->sublist(
"Sensitivities");
332 const Scalar tfinal = state_integrator_->getTimeStepControl()->getFinalTime();
334 model, tfinal,
true, pl));
337 template<
class Scalar>
344 using Teuchos::rcp_dynamic_cast;
345 using Teuchos::ParameterList;
346 using Thyra::VectorBase;
347 using Thyra::VectorSpaceBase;
349 using Thyra::defaultProductVector;
350 typedef Thyra::DefaultProductVector<Scalar> DPV;
351 typedef Thyra::DefaultProductVectorSpace<Scalar> DPVS;
355 RCP<ParameterList> shPL =
356 Teuchos::sublist(state_integrator_->getIntegratorParameterList(),
357 "Solution History",
true);
360 RCP<const VectorSpaceBase<Scalar> > x_space =
361 model_->get_x_space();
362 RCP<const VectorSpaceBase<Scalar> > adjoint_space =
363 sens_model_->get_x_space();
364 Teuchos::Array< RCP<const VectorSpaceBase<Scalar> > > spaces(2);
366 spaces[1] = adjoint_space;
367 RCP<const DPVS > prod_space = Thyra::productVectorSpace(spaces());
368 const Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
370 RCP<const SolutionHistory<Scalar> > state_solution_history =
371 state_integrator_->getSolutionHistory();
372 int num_states = state_solution_history->getNumStates();
373 for (
int i=0; i<num_states; ++i) {
374 RCP<const SolutionState<Scalar> > state = (*state_solution_history)[i];
377 RCP<DPV> x = defaultProductVector(prod_space);
378 assign(x->getNonconstVectorBlock(0).ptr(), *(state->getX()));
379 assign(x->getNonconstVectorBlock(1).ptr(), zero);
380 RCP<VectorBase<Scalar> > x_b = x;
383 RCP<VectorBase<Scalar> > x_dot_b;
384 if (state->getXDot() != Teuchos::null) {
385 RCP<DPV> x_dot = defaultProductVector(prod_space);
386 assign(x_dot->getNonconstVectorBlock(0).ptr(), *(state->getXDot()));
387 assign(x_dot->getNonconstVectorBlock(1).ptr(), zero);
392 RCP<VectorBase<Scalar> > x_dot_dot_b;
393 if (state->getXDotDot() != Teuchos::null) {
394 RCP<DPV> x_dot_dot = defaultProductVector(prod_space);
395 assign(x_dot_dot->getNonconstVectorBlock(0).ptr(),*(state->getXDotDot()));
396 assign(x_dot_dot->getNonconstVectorBlock(1).ptr(), zero);
397 x_dot_dot_b = x_dot_dot;
400 RCP<SolutionState<Scalar> > prod_state =
402 x_b, x_dot_b, x_dot_dot_b,
403 state->getStepperState()->clone()));
404 solutionHistory_->addState(prod_state);
407 RCP<const VectorBase<Scalar> > frozen_x =
408 state_solution_history->getCurrentState()->getX();
409 RCP<const VectorBase<Scalar> > frozen_x_dot =
410 state_solution_history->getCurrentState()->getXDot();
411 RCP<const VectorBase<Scalar> > frozen_x_dot_dot =
412 state_solution_history->getCurrentState()->getXDotDot();
413 RCP<const SolutionHistory<Scalar> > sens_solution_history =
414 sens_integrator_->getSolutionHistory();
415 num_states = sens_solution_history->getNumStates();
416 for (
int i=0; i<num_states; ++i) {
417 RCP<const SolutionState<Scalar> > state = (*sens_solution_history)[i];
420 RCP<DPV> x = defaultProductVector(prod_space);
421 assign(x->getNonconstVectorBlock(0).ptr(), *frozen_x);
422 assign(x->getNonconstVectorBlock(1).ptr(), *(state->getX()));
423 RCP<VectorBase<Scalar> > x_b = x;
426 RCP<VectorBase<Scalar> > x_dot_b;
427 if (state->getXDot() != Teuchos::null) {
428 RCP<DPV> x_dot = defaultProductVector(prod_space);
429 assign(x_dot->getNonconstVectorBlock(0).ptr(), *frozen_x_dot);
430 assign(x_dot->getNonconstVectorBlock(1).ptr(), *(state->getXDot()));
435 RCP<VectorBase<Scalar> > x_dot_dot_b;
436 if (state->getXDotDot() != Teuchos::null) {
437 RCP<DPV> x_dot_dot = defaultProductVector(prod_space);
438 assign(x_dot_dot->getNonconstVectorBlock(0).ptr(), *frozen_x_dot_dot);
439 assign(x_dot_dot->getNonconstVectorBlock(1).ptr(),*(state->getXDotDot()));
440 x_dot_dot_b = x_dot_dot;
443 RCP<SolutionState<Scalar> > prod_state =
445 x_b, x_dot_b, x_dot_dot_b,
446 state->getStepperState()->clone()));
447 solutionHistory_->addState(prod_state);
452 template<
class Scalar>
453 Teuchos::RCP<Tempus::IntegratorPseudoTransientAdjointSensitivity<Scalar> >
455 Teuchos::RCP<Teuchos::ParameterList> pList,
456 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar> >& model)
458 Teuchos::RCP<Tempus::IntegratorPseudoTransientAdjointSensitivity<Scalar> > integrator =
464 template<
class Scalar>
465 Teuchos::RCP<Tempus::IntegratorPseudoTransientAdjointSensitivity<Scalar> >
467 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar> >& model,
468 std::string stepperType)
470 Teuchos::RCP<Tempus::IntegratorPseudoTransientAdjointSensitivity<Scalar> > integrator =
476 template<
class Scalar>
477 Teuchos::RCP<Tempus::IntegratorPseudoTransientAdjointSensitivity<Scalar> >
480 Teuchos::RCP<Tempus::IntegratorPseudoTransientAdjointSensitivity<Scalar> > integrator =
486 #endif // Tempus_IntegratorPseudoTransientAdjointSensitivity_impl_hpp