121 const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory)
123 this->checkInitialized();
127 using Teuchos::rcp_dynamic_cast;
131 using Thyra::createMember;
132 using Thyra::multiVectorProductVector;
133 using Thyra::multiVectorProductVectorSpace;
134 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
135 typedef Thyra::DefaultMultiVectorProductVectorSpace<Scalar> DMVPVS;
141 if (stateSolutionHistory_ == Teuchos::null) {
142 RCP<Teuchos::ParameterList> shPL =
143 solutionHistory->getNonconstParameterList();
146 RCP<SolutionState<Scalar> > state = solutionHistory->getCurrentState();
147 RCP<DMVPV> X, XDot, XDotDot;
148 X = rcp_dynamic_cast<DMVPV>(state->getX(),
true);
150 XDot = rcp_dynamic_cast<DMVPV>(state->getXDot(),
true);
151 if (state->getXDotDot() != Teuchos::null)
152 XDotDot = rcp_dynamic_cast<DMVPV>(state->getXDotDot(),
true);
156 RCP<VectorBase<Scalar> > x, xdot, xdotdot;
157 x = X->getNonconstMultiVector()->col(0);
158 xdot = XDot->getNonconstMultiVector()->col(0);
159 if (XDotDot != Teuchos::null)
160 xdotdot = XDotDot->getNonconstMultiVector()->col(0);
163 RCP<SolutionState<Scalar> > state_state = state->clone();
164 state_state->setX(x);
165 state_state->setXDot(xdot);
166 state_state->setXDotDot(xdotdot);
167 stateSolutionHistory_ = createSolutionHistoryPL<Scalar>(shPL);
168 stateSolutionHistory_->addState(state_state);
170 const int num_param = X->getMultiVector()->domain()->dim()-1;
171 TEUCHOS_ASSERT(num_param > 0);
172 const Teuchos::Range1D rng(1,num_param);
175 RCP<MultiVectorBase<Scalar> > dxdp, dxdotdp, dxdotdotdp;
176 dxdp = X->getNonconstMultiVector()->subView(rng);
177 dxdotdp = XDot->getNonconstMultiVector()->subView(rng);
178 if (XDotDot != Teuchos::null)
179 dxdotdotdp = XDotDot->getNonconstMultiVector()->subView(rng);
182 RCP<VectorBase<Scalar> > dxdp_vec, dxdotdp_vec, dxdotdotdp_vec;
183 RCP<const DMVPVS> prod_space =
184 multiVectorProductVectorSpace(X->getMultiVector()->range(), num_param);
185 dxdp_vec = multiVectorProductVector(prod_space, dxdp);
186 dxdotdp_vec = multiVectorProductVector(prod_space, dxdotdp);
187 if (XDotDot != Teuchos::null)
188 dxdotdotdp_vec = multiVectorProductVector(prod_space, dxdotdotdp);
191 RCP<SolutionState<Scalar> > sens_state = state->clone();
192 sens_state->setX(dxdp_vec);
193 sens_state->setXDot(dxdotdp_vec);
194 sens_state->setXDotDot(dxdotdotdp_vec);
195 sensSolutionHistory_ = createSolutionHistoryPL<Scalar>(shPL);
196 sensSolutionHistory_->addState(sens_state);
200 RCP<SolutionState<Scalar> > prod_state = solutionHistory->getWorkingState();
201 RCP<DMVPV> X, XDot, XDotDot;
202 X = rcp_dynamic_cast<DMVPV>(prod_state->getX(),
true);
203 XDot = rcp_dynamic_cast<DMVPV>(prod_state->getXDot(),
true);
204 if (prod_state->getXDotDot() != Teuchos::null)
205 XDotDot = rcp_dynamic_cast<DMVPV>(prod_state->getXDotDot(),
true);
209 stateSolutionHistory_->initWorkingState();
210 RCP<SolutionState<Scalar> > state = stateSolutionHistory_->getWorkingState();
211 state->getMetaData()->copy(prod_state->getMetaData());
212 stateStepper_->takeStep(stateSolutionHistory_);
215 assign(X->getNonconstMultiVector()->col(0).ptr(), *(state->getX()));
216 assign(XDot->getNonconstMultiVector()->col(0).ptr(), *(state->getXDot()));
217 if (XDotDot != Teuchos::null)
218 assign(XDotDot->getNonconstMultiVector()->col(0).ptr(),
219 *(state->getXDotDot()));
220 prod_state->setOrder(state->getOrder());
227 stateSolutionHistory_->promoteWorkingState();
230 fsa_model_->setForwardSolutionHistory(stateSolutionHistory_);
231 if (reuse_solver_ && stateStepper_->getSolver() != Teuchos::null)
232 fsa_model_->setSolver(stateStepper_->getSolver(), force_W_update_);
236 sensSolutionHistory_->initWorkingState();
237 RCP<SolutionState<Scalar> > sens_state =
238 sensSolutionHistory_->getWorkingState();
239 sens_state->getMetaData()->copy(prod_state->getMetaData());
240 sensitivityStepper_->takeStep(sensSolutionHistory_);
243 RCP<const MultiVectorBase<Scalar> > dxdp =
244 rcp_dynamic_cast<const DMVPV>(sens_state->getX(),
true)->getMultiVector();
245 const int num_param = dxdp->domain()->dim();
246 const Teuchos::Range1D rng(1,num_param);
247 assign(X->getNonconstMultiVector()->subView(rng).ptr(), *dxdp);
248 RCP<const MultiVectorBase<Scalar> > dxdotdp =
249 rcp_dynamic_cast<const DMVPV>(sens_state->getXDot(),
true)->getMultiVector();
250 assign(XDot->getNonconstMultiVector()->subView(rng).ptr(), *dxdotdp);
251 if (sens_state->getXDotDot() != Teuchos::null) {
252 RCP<const MultiVectorBase<Scalar> > dxdotdotdp =
253 rcp_dynamic_cast<const DMVPV>(sens_state->getXDotDot(),
true)->getMultiVector();
254 assign(XDotDot->getNonconstMultiVector()->subView(rng).ptr(), *dxdotdotdp);
256 prod_state->setOrder(std::min(state->getOrder(), sens_state->getOrder()));
263 sensSolutionHistory_->promoteWorkingState();