9 #ifndef Tempus_StepperStaggeredForwardSensitivity_impl_hpp
10 #define Tempus_StepperStaggeredForwardSensitivity_impl_hpp
12 #include "Tempus_config.hpp"
16 #include "Teuchos_VerboseObjectParameterListHelpers.hpp"
18 #include "Thyra_DefaultMultiVectorProductVectorSpace.hpp"
19 #include "Thyra_DefaultMultiVectorProductVector.hpp"
24 template<
class Scalar>
class StepperFactory;
27 template<
class Scalar>
30 const Teuchos::RCP<
const Thyra::ModelEvaluator<Scalar> >& appModel,
31 const Teuchos::RCP<Teuchos::ParameterList>& pList,
32 const Teuchos::RCP<Teuchos::ParameterList>& sens_pList)
35 using Teuchos::ParameterList;
38 this->setParams(pList, sens_pList);
39 this->setModel(appModel);
44 template<
class Scalar>
47 const Teuchos::RCP<
const Thyra::ModelEvaluator<Scalar> >& appModel)
51 using Teuchos::ParameterList;
54 Teuchos::RCP<Teuchos::ParameterList> spl = Teuchos::parameterList();
56 spl->remove(
"Reuse State Linear Solver");
57 spl->remove(
"Force W Update");
68 if (stateStepper_ == Teuchos::null)
69 stateStepper_ = sf->createStepper(appModel, stepperPL_);
71 stateStepper_->setModel(appModel);
72 if (sensitivityStepper_ == Teuchos::null)
73 sensitivityStepper_ = sf->createStepper(fsa_model_, stepperPL_);
75 sensitivityStepper_->setModel(fsa_model_);
79 template<
class Scalar>
82 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar> >& appModel)
84 this->setModel(appModel);
88 template<
class Scalar>
92 stateStepper_->setSolver(solverName);
93 sensitivityStepper_->setSolver(solverName);
96 template<
class Scalar>
97 Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >
101 return combined_fsa_model_;
105 template<
class Scalar>
108 Teuchos::RCP<Teuchos::ParameterList> solverPL)
110 stateStepper_->setSolver(solverPL);
111 sensitivityStepper_->setSolver(solverPL);
115 template<
class Scalar>
118 Teuchos::RCP<Thyra::NonlinearSolverBase<Scalar> > solver)
120 stateStepper_->setSolver(solver);
121 sensitivityStepper_->setSolver(solver);
125 template<
class Scalar>
133 template<
class Scalar>
140 using Teuchos::rcp_dynamic_cast;
141 using Thyra::VectorBase;
142 using Thyra::MultiVectorBase;
144 using Thyra::createMember;
145 using Thyra::multiVectorProductVector;
146 using Thyra::multiVectorProductVectorSpace;
147 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
148 typedef Thyra::DefaultMultiVectorProductVectorSpace<Scalar> DMVPVS;
154 if (stateSolutionHistory_ == Teuchos::null) {
155 RCP<Teuchos::ParameterList> shPL =
159 RCP<SolutionState<Scalar> > state =
solutionHistory->getCurrentState();
160 RCP<DMVPV> X, XDot, XDotDot;
161 X = rcp_dynamic_cast<DMVPV>(state->getX(),
true);
162 XDot = rcp_dynamic_cast<DMVPV>(state->getXDot(),
true);
163 if (state->getXDotDot() != Teuchos::null)
164 XDotDot = rcp_dynamic_cast<DMVPV>(state->getXDotDot(),
true);
168 RCP<VectorBase<Scalar> > x, xdot, xdotdot;
169 x = X->getNonconstMultiVector()->col(0);
170 xdot = XDot->getNonconstMultiVector()->col(0);
171 if (XDotDot != Teuchos::null)
172 xdotdot = XDotDot->getNonconstMultiVector()->col(0);
175 RCP<SolutionState<Scalar> > state_state =
178 state->getStepperState()->clone()));
180 stateSolutionHistory_->addState(state_state);
182 const int num_param = X->getMultiVector()->domain()->dim()-1;
183 TEUCHOS_ASSERT(num_param > 0);
184 const Teuchos::Range1D rng(1,num_param);
187 RCP<MultiVectorBase<Scalar> > dxdp, dxdotdp, dxdotdotdp;
188 dxdp = X->getNonconstMultiVector()->subView(rng);
189 dxdotdp = XDot->getNonconstMultiVector()->subView(rng);
190 if (XDotDot != Teuchos::null)
191 dxdotdotdp = XDotDot->getNonconstMultiVector()->subView(rng);
194 RCP<VectorBase<Scalar> > dxdp_vec, dxdotdp_vec, dxdotdotdp_vec;
195 RCP<const DMVPVS> prod_space =
196 multiVectorProductVectorSpace(X->getMultiVector()->range(), num_param);
197 dxdp_vec = multiVectorProductVector(prod_space, dxdp);
198 dxdotdp_vec = multiVectorProductVector(prod_space, dxdotdp);
199 if (XDotDot != Teuchos::null)
200 dxdotdotdp_vec = multiVectorProductVector(prod_space, dxdotdotdp);
203 RCP<SolutionState<Scalar> > sens_state =
205 dxdp_vec, dxdotdp_vec, dxdotdotdp_vec,
206 state->getStepperState()->clone()));
208 sensSolutionHistory_->addState(sens_state);
212 RCP<SolutionState<Scalar> > prod_state =
solutionHistory->getWorkingState();
213 RCP<DMVPV> X, XDot, XDotDot;
214 X = rcp_dynamic_cast<DMVPV>(prod_state->getX(),
true);
215 XDot = rcp_dynamic_cast<DMVPV>(prod_state->getXDot(),
true);
216 if (prod_state->getXDotDot() != Teuchos::null)
217 XDotDot = rcp_dynamic_cast<DMVPV>(prod_state->getXDotDot(),
true);
220 stateSolutionHistory_->initWorkingState();
221 RCP<SolutionState<Scalar> > state = stateSolutionHistory_->getWorkingState();
222 state->getMetaData()->copy(prod_state->getMetaData());
223 stateStepper_->takeStep(stateSolutionHistory_);
226 assign(X->getNonconstMultiVector()->col(0).ptr(), *(state->getX()));
227 assign(XDot->getNonconstMultiVector()->col(0).ptr(), *(state->getXDot()));
228 if (XDotDot != Teuchos::null)
229 assign(XDotDot->getNonconstMultiVector()->col(0).ptr(),
230 *(state->getXDotDot()));
231 prod_state->setOrder(state->getOrder());
238 stateSolutionHistory_->promoteWorkingState();
241 fsa_model_->setForwardSolutionHistory(stateSolutionHistory_);
242 if (reuse_solver_ && stateStepper_->getSolver() != Teuchos::null)
243 fsa_model_->setSolver(stateStepper_->getSolver(), force_W_update_);
246 sensSolutionHistory_->initWorkingState();
247 RCP<SolutionState<Scalar> > sens_state =
248 sensSolutionHistory_->getWorkingState();
249 sens_state->getMetaData()->copy(prod_state->getMetaData());
250 sensitivityStepper_->takeStep(sensSolutionHistory_);
253 RCP<const MultiVectorBase<Scalar> > dxdp =
254 rcp_dynamic_cast<const DMVPV>(sens_state->getX(),
true)->getMultiVector();
255 const int num_param = dxdp->domain()->dim();
256 const Teuchos::Range1D rng(1,num_param);
257 assign(X->getNonconstMultiVector()->subView(rng).ptr(), *dxdp);
258 RCP<const MultiVectorBase<Scalar> > dxdotdp =
259 rcp_dynamic_cast<const DMVPV>(sens_state->getXDot(),
true)->getMultiVector();
260 assign(XDot->getNonconstMultiVector()->subView(rng).ptr(), *dxdotdp);
261 if (sens_state->getXDotDot() != Teuchos::null) {
262 RCP<const MultiVectorBase<Scalar> > dxdotdotdp =
263 rcp_dynamic_cast<const DMVPV>(sens_state->getXDotDot(),
true)->getMultiVector();
264 assign(XDotDot->getNonconstMultiVector()->subView(rng).ptr(), *dxdotdotdp);
266 prod_state->setOrder(std::min(state->getOrder(), sens_state->getOrder()));
273 sensSolutionHistory_->promoteWorkingState();
279 template<
class Scalar>
280 Teuchos::RCP<Tempus::StepperState<Scalar> >
286 Teuchos::RCP<Tempus::StepperState<Scalar> > stepperState =
292 template<
class Scalar>
296 std::string name =
"StepperStaggeredForwardSensitivity";
301 template<
class Scalar>
304 Teuchos::FancyOStream &out,
305 const Teuchos::EVerbosityLevel verbLevel)
const
307 out << description() <<
"::describe:" << std::endl;
308 stateStepper_->describe(out, verbLevel);
310 sensitivityStepper_->describe(out, verbLevel);
314 template <
class Scalar>
317 Teuchos::RCP<Teuchos::ParameterList>
const& pList)
319 if (pList == Teuchos::null) {
321 if (stepperPL_ == Teuchos::null) stepperPL_ = this->getDefaultParameters();
330 template<
class Scalar>
331 Teuchos::RCP<const Teuchos::ParameterList>
335 return stateStepper_->getValidParameters();
339 template<
class Scalar>
340 Teuchos::RCP<Teuchos::ParameterList>
344 return stateStepper_->getDefaultParameters();
348 template <
class Scalar>
349 Teuchos::RCP<Teuchos::ParameterList>
357 template <
class Scalar>
358 Teuchos::RCP<Teuchos::ParameterList>
362 Teuchos::RCP<Teuchos::ParameterList> temp_plist = stepperPL_;
363 stepperPL_ = Teuchos::null;
368 template <
class Scalar>
371 Teuchos::RCP<Teuchos::ParameterList>
const& pList,
372 Teuchos::RCP<Teuchos::ParameterList>
const& spList)
374 if (pList == Teuchos::null)
375 stepperPL_ = this->getDefaultParameters();
379 if (spList == Teuchos::null)
380 sensPL_ = Teuchos::parameterList();
384 reuse_solver_ = sensPL_->get(
"Reuse State Linear Solver",
false);
385 force_W_update_ = sensPL_->get(
"Force W Update",
true);
392 template <
class Scalar>
393 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
398 using Teuchos::rcp_dynamic_cast;
399 typedef Thyra::DefaultMultiVectorProductVectorSpace<Scalar> DMVPVS;
401 RCP<const Thyra::VectorSpaceBase<Scalar> > x_space =
402 stateStepper_->getModel()->get_x_space();
403 RCP<const DMVPVS> dxdp_space =
404 rcp_dynamic_cast<const DMVPVS>(sensitivityStepper_->getModel()->get_x_space(),
true);
405 const int num_param = dxdp_space->numBlocks();
406 RCP<const Thyra::VectorSpaceBase<Scalar> > prod_space =
407 multiVectorProductVectorSpace(x_space, num_param+1);
413 #endif // Tempus_StepperStaggeredForwardSensitivity_impl_hpp