113 this->checkInitialized();
117 using Teuchos::rcp_dynamic_cast;
119 using Thyra::createMember;
121 using Thyra::multiVectorProductVector;
122 using Thyra::multiVectorProductVectorSpace;
124 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
125 typedef Thyra::DefaultMultiVectorProductVectorSpace<Scalar> DMVPVS;
131 if (stateSolutionHistory_ == Teuchos::null) {
132 RCP<Teuchos::ParameterList> shPL =
133 solutionHistory->getNonconstParameterList();
136 RCP<SolutionState<Scalar> > state = solutionHistory->getCurrentState();
137 RCP<DMVPV> X, XDot, XDotDot;
138 X = rcp_dynamic_cast<DMVPV>(state->getX(),
true);
140 XDot = rcp_dynamic_cast<DMVPV>(state->getXDot(),
true);
141 if (state->getXDotDot() != Teuchos::null)
142 XDotDot = rcp_dynamic_cast<DMVPV>(state->getXDotDot(),
true);
146 RCP<VectorBase<Scalar> > x, xdot, xdotdot;
147 x = X->getNonconstMultiVector()->col(0);
148 xdot = XDot->getNonconstMultiVector()->col(0);
149 if (XDotDot != Teuchos::null)
150 xdotdot = XDotDot->getNonconstMultiVector()->col(0);
153 RCP<SolutionState<Scalar> > state_state = state->clone();
154 state_state->setX(x);
155 state_state->setXDot(xdot);
156 state_state->setXDotDot(xdotdot);
157 stateSolutionHistory_ = createSolutionHistoryPL<Scalar>(shPL);
158 stateSolutionHistory_->addState(state_state);
160 const int num_param = X->getMultiVector()->domain()->dim() - 1;
161 TEUCHOS_ASSERT(num_param > 0);
162 const Teuchos::Range1D rng(1, num_param);
165 RCP<MultiVectorBase<Scalar> > dxdp, dxdotdp, dxdotdotdp;
166 dxdp = X->getNonconstMultiVector()->subView(rng);
167 dxdotdp = XDot->getNonconstMultiVector()->subView(rng);
168 if (XDotDot != Teuchos::null)
169 dxdotdotdp = XDotDot->getNonconstMultiVector()->subView(rng);
172 RCP<VectorBase<Scalar> > dxdp_vec, dxdotdp_vec, dxdotdotdp_vec;
173 RCP<const DMVPVS> prod_space =
174 multiVectorProductVectorSpace(X->getMultiVector()->range(), num_param);
175 dxdp_vec = multiVectorProductVector(prod_space, dxdp);
176 dxdotdp_vec = multiVectorProductVector(prod_space, dxdotdp);
177 if (XDotDot != Teuchos::null)
178 dxdotdotdp_vec = multiVectorProductVector(prod_space, dxdotdotdp);
181 RCP<SolutionState<Scalar> > sens_state = state->clone();
182 sens_state->setX(dxdp_vec);
183 sens_state->setXDot(dxdotdp_vec);
184 sens_state->setXDotDot(dxdotdotdp_vec);
185 sensSolutionHistory_ = createSolutionHistoryPL<Scalar>(shPL);
186 sensSolutionHistory_->addState(sens_state);
190 RCP<SolutionState<Scalar> > prod_state = solutionHistory->getWorkingState();
191 RCP<DMVPV> X, XDot, XDotDot;
192 X = rcp_dynamic_cast<DMVPV>(prod_state->getX(),
true);
193 XDot = rcp_dynamic_cast<DMVPV>(prod_state->getXDot(),
true);
194 if (prod_state->getXDotDot() != Teuchos::null)
195 XDotDot = rcp_dynamic_cast<DMVPV>(prod_state->getXDotDot(),
true);
199 stateSolutionHistory_->initWorkingState();
200 RCP<SolutionState<Scalar> > state = stateSolutionHistory_->getWorkingState();
201 state->getMetaData()->copy(prod_state->getMetaData());
202 stateStepper_->takeStep(stateSolutionHistory_);
205 assign(X->getNonconstMultiVector()->col(0).ptr(), *(state->getX()));
206 assign(XDot->getNonconstMultiVector()->col(0).ptr(), *(state->getXDot()));
207 if (XDotDot != Teuchos::null)
208 assign(XDotDot->getNonconstMultiVector()->col(0).ptr(),
209 *(state->getXDotDot()));
210 prod_state->setOrder(state->getOrder());
217 stateSolutionHistory_->promoteWorkingState();
220 fsa_model_->setForwardSolutionHistory(stateSolutionHistory_);
221 if (reuse_solver_ && stateStepper_->getSolver() != Teuchos::null)
222 fsa_model_->setSolver(stateStepper_->getSolver(), force_W_update_);
226 sensSolutionHistory_->initWorkingState();
227 RCP<SolutionState<Scalar> > sens_state =
228 sensSolutionHistory_->getWorkingState();
229 sens_state->getMetaData()->copy(prod_state->getMetaData());
230 sensitivityStepper_->takeStep(sensSolutionHistory_);
233 RCP<const MultiVectorBase<Scalar> > dxdp =
234 rcp_dynamic_cast<const DMVPV>(sens_state->getX(),
true)->getMultiVector();
235 const int num_param = dxdp->domain()->dim();
236 const Teuchos::Range1D rng(1, num_param);
237 assign(X->getNonconstMultiVector()->subView(rng).ptr(), *dxdp);
238 RCP<const MultiVectorBase<Scalar> > dxdotdp =
239 rcp_dynamic_cast<const DMVPV>(sens_state->getXDot(),
true)
241 assign(XDot->getNonconstMultiVector()->subView(rng).ptr(), *dxdotdp);
242 if (sens_state->getXDotDot() != Teuchos::null) {
243 RCP<const MultiVectorBase<Scalar> > dxdotdotdp =
244 rcp_dynamic_cast<const DMVPV>(sens_state->getXDotDot(),
true)
246 assign(XDotDot->getNonconstMultiVector()->subView(rng).ptr(), *dxdotdotdp);
248 prod_state->setOrder(std::min(state->getOrder(), sens_state->getOrder()));
255 sensSolutionHistory_->promoteWorkingState();