102 RCP<const Thyra::LinearOpWithSolveFactoryBase<Scalar> > W_factory =
104 RCP<Thyra::LinearOpBase<Scalar> > matrix = this->
create_W_op();
111 RCP<Thyra::MultiVectorBase<Scalar> > multivec =
112 Teuchos::rcp_dynamic_cast<Thyra::MultiVectorBase<Scalar> >(matrix,
115 RCP<Thyra::VectorBase<Scalar> > vec = Thyra::createMember(
x_space_);
117 Thyra::DetachedVectorView<Scalar> vec_view(*vec);
121 V_V(multivec->col(0).ptr(), *vec);
123 Thyra::DetachedVectorView<Scalar> vec_view(*vec);
127 V_V(multivec->col(1).ptr(), *vec);
130 RCP<Thyra::LinearOpWithSolveBase<Scalar> > W =
131 Thyra::linearOpWithSolve<Scalar>(*W_factory, matrix);
174 const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
175 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
179 "Error, setupInOutArgs_ must be called first!\n");
181 const RCP<const Thyra::VectorBase<Scalar> > x_in =
182 inArgs.get_x().assert_not_null();
183 Thyra::ConstDetachedVectorView<Scalar> x_in_view(*x_in);
188 const RCP<const Thyra::VectorBase<Scalar> > p_in =
189 inArgs.get_p(0).assert_not_null();
190 Thyra::ConstDetachedVectorView<Scalar> p_in_view(*p_in);
191 epsilon = p_in_view[0];
194 Scalar beta = inArgs.get_beta();
196 const RCP<Thyra::VectorBase<Scalar> > f_out = outArgs.get_f();
197 const RCP<Thyra::LinearOpBase<Scalar> > W_out = outArgs.get_W_op();
198 RCP<Thyra::MultiVectorBase<Scalar> > DfDp_out;
200 Thyra::ModelEvaluatorBase::Derivative<Scalar> DfDp = outArgs.get_DfDp(0);
201 DfDp_out = DfDp.getMultiVector();
204 if (inArgs.get_x_dot().is_null()) {
206 if (!is_null(f_out)) {
207 Thyra::DetachedVectorView<Scalar> f_out_view(*f_out);
208 f_out_view[0] = x_in_view[1];
210 ((1.0 - x_in_view[0] * x_in_view[0]) * x_in_view[1] - x_in_view[0]) /
213 if (!is_null(W_out)) {
214 RCP<Thyra::MultiVectorBase<Scalar> > matrix =
215 Teuchos::rcp_dynamic_cast<Thyra::MultiVectorBase<Scalar> >(W_out,
217 Thyra::DetachedMultiVectorView<Scalar> matrix_view(*matrix);
218 matrix_view(0, 0) = 0.0;
219 matrix_view(0, 1) = +beta;
220 matrix_view(1, 0) = -beta * (2.0 * x_in_view[0] * x_in_view[1] + 1.0) /
222 matrix_view(1, 1) = beta * (1.0 - x_in_view[0] * x_in_view[0]) /
226 if (!is_null(DfDp_out)) {
227 Thyra::DetachedMultiVectorView<Scalar> DfDp_out_view(*DfDp_out);
228 DfDp_out_view(0, 0) = 0.0;
229 DfDp_out_view(1, 0) =
230 -((1.0 - x_in_view[0] * x_in_view[0]) * x_in_view[1] - x_in_view[0]) /
236 RCP<const Thyra::VectorBase<Scalar> > x_dot_in;
237 x_dot_in = inArgs.get_x_dot().assert_not_null();
238 Scalar alpha = inArgs.get_alpha();
239 if (!is_null(f_out)) {
240 Thyra::DetachedVectorView<Scalar> f_out_view(*f_out);
241 Thyra::ConstDetachedVectorView<Scalar> x_dot_in_view(*x_dot_in);
242 f_out_view[0] = x_dot_in_view[0] - x_in_view[1];
245 ((1.0 - x_in_view[0] * x_in_view[0]) * x_in_view[1] - x_in_view[0]) /
248 if (!is_null(W_out)) {
249 RCP<Thyra::MultiVectorBase<Scalar> > matrix =
250 Teuchos::rcp_dynamic_cast<Thyra::MultiVectorBase<Scalar> >(W_out,
252 Thyra::DetachedMultiVectorView<Scalar> matrix_view(*matrix);
253 matrix_view(0, 0) = alpha;
254 matrix_view(0, 1) = -beta;
255 matrix_view(1, 0) = beta * (2.0 * x_in_view[0] * x_in_view[1] + 1.0) /
257 matrix_view(1, 1) = alpha - beta * (1.0 - x_in_view[0] * x_in_view[0]) /
261 if (!is_null(DfDp_out)) {
262 Thyra::DetachedMultiVectorView<Scalar> DfDp_out_view(*DfDp_out);
263 DfDp_out_view(0, 0) = 0.0;
264 DfDp_out_view(1, 0) =
265 ((1.0 - x_in_view[0] * x_in_view[0]) * x_in_view[1] - x_in_view[0]) /
315 Thyra::ModelEvaluatorBase::InArgsSetup<Scalar> inArgs;
316 inArgs.setModelEvalDescription(this->description());
317 inArgs.setSupports(Thyra::ModelEvaluatorBase::IN_ARG_t);
318 inArgs.setSupports(Thyra::ModelEvaluatorBase::IN_ARG_x);
319 inArgs.setSupports(Thyra::ModelEvaluatorBase::IN_ARG_beta);
320 inArgs.setSupports(Thyra::ModelEvaluatorBase::IN_ARG_x_dot);
321 inArgs.setSupports(Thyra::ModelEvaluatorBase::IN_ARG_alpha);
330 Thyra::ModelEvaluatorBase::OutArgsSetup<Scalar> outArgs;
331 outArgs.setModelEvalDescription(this->description());
332 outArgs.setSupports(Thyra::ModelEvaluatorBase::OUT_ARG_f);
333 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);
347 const RCP<Thyra::VectorBase<Scalar> > x_ic = createMember(
x_space_);
349 Thyra::DetachedVectorView<Scalar> x_ic_view(*x_ic);
355 const RCP<Thyra::VectorBase<Scalar> > p_ic = createMember(
p_space_);
357 Thyra::DetachedVectorView<Scalar> p_ic_view(*p_ic);
362 const RCP<Thyra::VectorBase<Scalar> > x_dot_ic = createMember(
x_space_);
364 Thyra::DetachedVectorView<Scalar> x_dot_ic_view(*x_dot_ic);
365 x_dot_ic_view[0] =
x1_ic_;