161 const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
162 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
164 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
166 using Teuchos::rcp_dynamic_cast;
169 TEUCHOS_TEST_FOR_EXCEPTION(!isInitialized_, std::logic_error,
170 "Error, setupInOutArgs_ must be called first!\n");
172 const RCP<const VectorBase<Scalar> > x_in = inArgs.get_x().assert_not_null();
173 Thyra::ConstDetachedVectorView<Scalar> x_in_view(*x_in);
176 const RCP<const VectorBase<Scalar> > p_in = inArgs.get_p(0);
177 if (p_in != Teuchos::null) {
178 Thyra::ConstDetachedVectorView<Scalar> p_in_view(*p_in);
182 RCP<const MultiVectorBase<Scalar> > DxDp_in, DxdotDp_in;
183 if (inArgs.get_p(1) != Teuchos::null)
184 DxDp_in = rcp_dynamic_cast<const DMVPV>(inArgs.get_p(1))->getMultiVector();
185 if (inArgs.get_p(2) != Teuchos::null)
187 rcp_dynamic_cast<const DMVPV>(inArgs.get_p(2))->getMultiVector();
189 Scalar beta = inArgs.get_beta();
191 const RCP<VectorBase<Scalar> > f_out = outArgs.get_f();
192 const RCP<Thyra::LinearOpBase<Scalar> > W_out = outArgs.get_W_op();
193 RCP<Thyra::MultiVectorBase<Scalar> > DfDp_out;
194 Thyra::ModelEvaluatorBase::Derivative<Scalar> DfDp = outArgs.get_DfDp(0);
195 DfDp_out = DfDp.getMultiVector();
197 if (inArgs.get_x_dot().is_null()) {
199 if (!is_null(f_out)) {
200 Thyra::DetachedVectorView<Scalar> f_out_view(*f_out);
201 f_out_view[0] = x_in_view[0] * x_in_view[0] - b * b;
203 if (!is_null(W_out)) {
204 RCP<Thyra::MultiVectorBase<Scalar> > matrix =
205 Teuchos::rcp_dynamic_cast<Thyra::MultiVectorBase<Scalar> >(W_out,
207 Thyra::DetachedMultiVectorView<Scalar> matrix_view(*matrix);
208 matrix_view(0, 0) = beta * 2.0 * x_in_view[0];
210 if (!is_null(DfDp_out)) {
211 Thyra::DetachedMultiVectorView<Scalar> DfDp_out_view(*DfDp_out);
212 DfDp_out_view(0, 0) = -2.0 * b;
215 if (useDfDpAsTangent_ && !is_null(DxDp_in)) {
216 Thyra::ConstDetachedMultiVectorView<Scalar> DxDp(*DxDp_in);
217 DfDp_out_view(0, 0) += 2.0 * x_in_view[0] * DxDp(0, 0);
223 RCP<const VectorBase<Scalar> > x_dot_in;
224 x_dot_in = inArgs.get_x_dot().assert_not_null();
225 Scalar alpha = inArgs.get_alpha();
226 if (!is_null(f_out)) {
227 Thyra::DetachedVectorView<Scalar> f_out_view(*f_out);
228 Thyra::ConstDetachedVectorView<Scalar> x_dot_in_view(*x_dot_in);
229 f_out_view[0] = x_dot_in_view[0] - (x_in_view[0] * x_in_view[0] - b * b);
231 if (!is_null(W_out)) {
232 RCP<Thyra::MultiVectorBase<Scalar> > matrix =
233 Teuchos::rcp_dynamic_cast<Thyra::MultiVectorBase<Scalar> >(W_out,
235 Thyra::DetachedMultiVectorView<Scalar> matrix_view(*matrix);
236 matrix_view(0, 0) = alpha - beta * 2.0 * x_in_view[0];
238 if (!is_null(DfDp_out)) {
239 Thyra::DetachedMultiVectorView<Scalar> DfDp_out_view(*DfDp_out);
240 DfDp_out_view(0, 0) = 2.0 * b;
243 if (useDfDpAsTangent_ && !is_null(DxdotDp_in)) {
244 Thyra::ConstDetachedMultiVectorView<Scalar> DxdotDp(*DxdotDp_in);
245 DfDp_out_view(0, 0) += DxdotDp(0, 0);
247 if (useDfDpAsTangent_ && !is_null(DxDp_in)) {
248 Thyra::ConstDetachedMultiVectorView<Scalar> DxDp(*DxDp_in);
249 DfDp_out_view(0, 0) += -2.0 * x_in_view[0] * DxDp(0, 0);
255 RCP<VectorBase<Scalar> > g_out = outArgs.get_g(0);
256 if (g_out != Teuchos::null) Thyra::assign(g_out.ptr(), *x_in);
258 RCP<Thyra::MultiVectorBase<Scalar> > DgDp_out =
259 outArgs.get_DgDp(0, 0).getMultiVector();
260 if (DgDp_out != Teuchos::null) Thyra::assign(DgDp_out.ptr(), Scalar(0.0));
262 RCP<Thyra::MultiVectorBase<Scalar> > DgDx_out =
263 outArgs.get_DgDx(0).getMultiVector();
264 if (DgDx_out != Teuchos::null) {
265 Thyra::DetachedMultiVectorView<Scalar> DgDx_out_view(*DgDx_out);
266 DgDx_out_view(0, 0) = 1.0;
312 if (isInitialized_) {
318 Thyra::ModelEvaluatorBase::InArgsSetup<Scalar> inArgs;
319 inArgs.setModelEvalDescription(this->description());
320 inArgs.setSupports(Thyra::ModelEvaluatorBase::IN_ARG_t);
321 inArgs.setSupports(Thyra::ModelEvaluatorBase::IN_ARG_x);
322 inArgs.setSupports(Thyra::ModelEvaluatorBase::IN_ARG_beta);
323 inArgs.setSupports(Thyra::ModelEvaluatorBase::IN_ARG_x_dot);
324 inArgs.setSupports(Thyra::ModelEvaluatorBase::IN_ARG_alpha);
331 Thyra::ModelEvaluatorBase::OutArgsSetup<Scalar> outArgs;
332 outArgs.setModelEvalDescription(this->description());
333 outArgs.setSupports(Thyra::ModelEvaluatorBase::OUT_ARG_f);
334 outArgs.setSupports(Thyra::ModelEvaluatorBase::OUT_ARG_W_op);
335 outArgs.set_Np_Ng(Np_, Ng_);
336 outArgs.setSupports(Thyra::ModelEvaluatorBase::OUT_ARG_DfDp, 0,
337 Thyra::ModelEvaluatorBase::DERIV_MV_JACOBIAN_FORM);
338 outArgs.setSupports(Thyra::ModelEvaluatorBase::OUT_ARG_DgDx, 0,
339 Thyra::ModelEvaluatorBase::DERIV_MV_GRADIENT_FORM);
340 outArgs.setSupports(Thyra::ModelEvaluatorBase::OUT_ARG_DgDp, 0, 0,
341 Thyra::ModelEvaluatorBase::DERIV_MV_GRADIENT_FORM);
346 nominalValues_ = inArgs_;
347 nominalValues_.set_t(0.0);
348 const Teuchos::RCP<Thyra::VectorBase<Scalar> > x_ic = createMember(x_space_);
350 Thyra::DetachedVectorView<Scalar> x_ic_view(*x_ic);
353 nominalValues_.set_x(x_ic);
354 const Teuchos::RCP<Thyra::VectorBase<Scalar> > p_ic = createMember(p_space_);
356 Thyra::DetachedVectorView<Scalar> p_ic_view(*p_ic);
359 nominalValues_.set_p(0, p_ic);
361 const Teuchos::RCP<Thyra::VectorBase<Scalar> > x_dot_ic =
362 createMember(x_space_);
364 Thyra::DetachedVectorView<Scalar> x_dot_ic_view(*x_dot_ic);
365 x_dot_ic_view[0] = 0.0;
367 nominalValues_.set_x_dot(x_dot_ic);
369 isInitialized_ =
true;