102 RCP<const Thyra::LinearOpWithSolveFactoryBase<Scalar> > W_factory =
103 this->get_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
178 TEUCHOS_TEST_FOR_EXCEPTION(!isInitialized_, std::logic_error,
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);
186 Scalar epsilon = epsilon_;
187 if (acceptModelParams_) {
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;
199 if (acceptModelParams_) {
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]) /
309 if (isInitialized_) {
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);
322 if (acceptModelParams_) {
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);
334 if (acceptModelParams_) {
335 outArgs.set_Np_Ng(Np_, Ng_);
336 outArgs.setSupports(Thyra::ModelEvaluatorBase::OUT_ARG_DfDp, 0,
337 Thyra::ModelEvaluatorBase::DERIV_MV_JACOBIAN_FORM);
343 nominalValues_ = inArgs_;
346 nominalValues_.set_t(t0_ic_);
347 const RCP<Thyra::VectorBase<Scalar> > x_ic = createMember(x_space_);
349 Thyra::DetachedVectorView<Scalar> x_ic_view(*x_ic);
350 x_ic_view[0] = x0_ic_;
351 x_ic_view[1] = x1_ic_;
353 nominalValues_.set_x(x_ic);
354 if (acceptModelParams_) {
355 const RCP<Thyra::VectorBase<Scalar> > p_ic = createMember(p_space_);
357 Thyra::DetachedVectorView<Scalar> p_ic_view(*p_ic);
358 p_ic_view[0] = epsilon_;
360 nominalValues_.set_p(0, 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_;
366 x_dot_ic_view[1] = ((1.0 - x0_ic_ * x0_ic_) * x1_ic_ - x0_ic_) / epsilon_;
368 nominalValues_.set_x_dot(x_dot_ic);
371 isInitialized_ =
true;
376 Teuchos::RCP<Teuchos::ParameterList>
const ¶mList)
379 using Teuchos::ParameterList;
380 Teuchos::RCP<ParameterList> tmpPL =
381 Teuchos::rcp(
new ParameterList(
"VanDerPolModel"));
382 if (paramList != Teuchos::null) tmpPL = paramList;
383 tmpPL->validateParametersAndSetDefaults(*this->getValidParameters());
384 this->setMyParamList(tmpPL);
385 Teuchos::RCP<ParameterList> pl = this->getMyNonconstParamList();
386 bool acceptModelParams = get<bool>(*pl,
"Accept model parameters");
387 bool haveIC = get<bool>(*pl,
"Provide nominal values");
388 if ((acceptModelParams != acceptModelParams_) || (haveIC != haveIC_)) {
389 isInitialized_ =
false;
391 acceptModelParams_ = acceptModelParams;
393 epsilon_ = get<Scalar>(*pl,
"Coeff epsilon");
394 x0_ic_ = get<Scalar>(*pl,
"IC x0");
395 x1_ic_ = get<Scalar>(*pl,
"IC x1");
396 t0_ic_ = get<Scalar>(*pl,
"IC t0");