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");