100  TEUCHOS_TEST_FOR_EXCEPTION(!isInitialized_, std::logic_error,
 
  101                             "Error, setupInOutArgs_ must be called first!\n");
 
  102  Thyra::ModelEvaluatorBase::InArgs<Scalar> inArgs = inArgs_;
 
  103  if (!acceptModelParams_) {
 
  106  TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(j, 0, np_);
 
  112  inArgs.set_t(exact_t);
 
  113  Teuchos::RCP<Thyra::VectorBase<Scalar> > exact_s = createMember(x_space_);
 
  115    Thyra::DetachedVectorView<Scalar> exact_s_view(*exact_s);
 
  117      exact_s_view[0] = 1.0;
 
  118      exact_s_view[1] = 0.0;
 
  121      exact_s_view[0] = (b / L) * t * cos((f / L) * t + phi);
 
  122      exact_s_view[1] = (b / L) * cos((f / L) * t + phi) -
 
  123                        (b * f * t / (L * L)) * sin((f / L) * t + phi);
 
  126      exact_s_view[0] = -(b * f * t / (L * L)) * cos((f / L) * t + phi);
 
  127      exact_s_view[1] = -(b * f / (L * L)) * cos((f / L) * t + phi) +
 
  128                        (b * f * f * t / (L * L * L)) * sin((f / L) * t + phi);
 
  131  inArgs.set_x(exact_s);
 
  132  Teuchos::RCP<Thyra::VectorBase<Scalar> > exact_s_dot = createMember(x_space_);
 
  134    Thyra::DetachedVectorView<Scalar> exact_s_dot_view(*exact_s_dot);
 
  136      exact_s_dot_view[0] = 0.0;
 
  137      exact_s_dot_view[1] = 0.0;
 
  140      exact_s_dot_view[0] = (b / L) * cos((f / L) * t + phi) -
 
  141                            (b * f * t / (L * L)) * sin((f / L) * t + phi);
 
  142      exact_s_dot_view[1] =
 
  143          -(2.0 * b * f / (L * L)) * sin((f / L) * t + phi) -
 
  144          (b * f * f * t / (L * L * L)) * cos((f / L) * t + phi);
 
  147      exact_s_dot_view[0] =
 
  148          -(b * f / (L * L)) * cos((f / L) * t + phi) +
 
  149          (b * f * f * t / (L * L * L)) * sin((f / L) * t + phi);
 
  150      exact_s_dot_view[1] =
 
  151          (2.0 * b * f * f / (L * L * L)) * sin((f / L) * t + phi) +
 
  152          (b * f * f * f * t / (L * L * L * L)) * cos((f / L) * t + phi);
 
  155  inArgs.set_x_dot(exact_s_dot);
 
 
  275    const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
 
  276    const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
 const 
  278  typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
 
  280  using Teuchos::rcp_dynamic_cast;
 
  283  TEUCHOS_TEST_FOR_EXCEPTION(!isInitialized_, std::logic_error,
 
  284                             "Error, setupInOutArgs_ must be called first!\n");
 
  286  const RCP<const VectorBase<Scalar> > x_in = inArgs.get_x().assert_not_null();
 
  287  Thyra::ConstDetachedVectorView<Scalar> x_in_view(*x_in);
 
  293  if (acceptModelParams_) {
 
  294    const RCP<const VectorBase<Scalar> > p_in =
 
  295        inArgs.get_p(0).assert_not_null();
 
  296    Thyra::ConstDetachedVectorView<Scalar> p_in_view(*p_in);
 
  302  RCP<const MultiVectorBase<Scalar> > DxDp_in, DxdotDp_in;
 
  303  if (acceptModelParams_) {
 
  304    if (inArgs.get_p(1) != Teuchos::null)
 
  306          rcp_dynamic_cast<const DMVPV>(inArgs.get_p(1))->getMultiVector();
 
  307    if (inArgs.get_p(2) != Teuchos::null)
 
  309          rcp_dynamic_cast<const DMVPV>(inArgs.get_p(2))->getMultiVector();
 
  312  Scalar beta = inArgs.get_beta();
 
  314  const RCP<VectorBase<Scalar> > f_out          = outArgs.get_f();
 
  315  const RCP<Thyra::LinearOpBase<Scalar> > W_out = outArgs.get_W_op();
 
  316  RCP<Thyra::MultiVectorBase<Scalar> > DfDp_out;
 
  317  if (acceptModelParams_) {
 
  318    Thyra::ModelEvaluatorBase::Derivative<Scalar> DfDp = outArgs.get_DfDp(0);
 
  319    DfDp_out                                           = DfDp.getMultiVector();
 
  322  if (inArgs.get_x_dot().is_null()) {
 
  324    if (!is_null(f_out)) {
 
  325      Thyra::DetachedVectorView<Scalar> f_out_view(*f_out);
 
  326      f_out_view[0] = x_in_view[1];
 
  327      f_out_view[1] = (f / L) * (f / L) * (a - x_in_view[0]);
 
  329    if (!is_null(W_out)) {
 
  330      RCP<Thyra::MultiVectorBase<Scalar> > matrix =
 
  331          Teuchos::rcp_dynamic_cast<Thyra::MultiVectorBase<Scalar> >(W_out,
 
  333      Thyra::DetachedMultiVectorView<Scalar> matrix_view(*matrix);
 
  334      matrix_view(0, 0) = 0.0;                        
 
  335      matrix_view(0, 1) = +beta;                      
 
  336      matrix_view(1, 0) = -beta * (f / L) * (f / L);  
 
  337      matrix_view(1, 1) = 0.0;                        
 
  340    if (!is_null(DfDp_out)) {
 
  341      Thyra::DetachedMultiVectorView<Scalar> DfDp_out_view(*DfDp_out);
 
  342      DfDp_out_view(0, 0) = 0.0;
 
  343      DfDp_out_view(0, 1) = 0.0;
 
  344      DfDp_out_view(0, 2) = 0.0;
 
  345      DfDp_out_view(1, 0) = (f / L) * (f / L);
 
  346      DfDp_out_view(1, 1) = (2.0 * f / (L * L)) * (a - x_in_view[0]);
 
  347      DfDp_out_view(1, 2) = -(2.0 * f * f / (L * L * L)) * (a - x_in_view[0]);
 
  350      if (useDfDpAsTangent_ && !is_null(DxDp_in)) {
 
  351        Thyra::ConstDetachedMultiVectorView<Scalar> DxDp(*DxDp_in);
 
  352        DfDp_out_view(0, 0) += DxDp(1, 0);
 
  353        DfDp_out_view(0, 1) += DxDp(1, 1);
 
  354        DfDp_out_view(0, 2) += DxDp(1, 2);
 
  355        DfDp_out_view(1, 0) += -(f / L) * (f / L) * DxDp(0, 0);
 
  356        DfDp_out_view(1, 1) += -(f / L) * (f / L) * DxDp(0, 1);
 
  357        DfDp_out_view(1, 2) += -(f / L) * (f / L) * DxDp(0, 2);
 
  363    RCP<const VectorBase<Scalar> > x_dot_in;
 
  364    x_dot_in     = inArgs.get_x_dot().assert_not_null();
 
  365    Scalar alpha = inArgs.get_alpha();
 
  366    if (!is_null(f_out)) {
 
  367      Thyra::DetachedVectorView<Scalar> f_out_view(*f_out);
 
  368      Thyra::ConstDetachedVectorView<Scalar> x_dot_in_view(*x_dot_in);
 
  369      f_out_view[0] = x_dot_in_view[0] - x_in_view[1];
 
  370      f_out_view[1] = x_dot_in_view[1] - (f / L) * (f / L) * (a - x_in_view[0]);
 
  372    if (!is_null(W_out)) {
 
  373      RCP<Thyra::MultiVectorBase<Scalar> > matrix =
 
  374          Teuchos::rcp_dynamic_cast<Thyra::MultiVectorBase<Scalar> >(W_out,
 
  376      Thyra::DetachedMultiVectorView<Scalar> matrix_view(*matrix);
 
  377      matrix_view(0, 0) = alpha;                      
 
  378      matrix_view(0, 1) = -beta;                      
 
  379      matrix_view(1, 0) = +beta * (f / L) * (f / L);  
 
  380      matrix_view(1, 1) = alpha;                      
 
  383    if (!is_null(DfDp_out)) {
 
  384      Thyra::DetachedMultiVectorView<Scalar> DfDp_out_view(*DfDp_out);
 
  385      DfDp_out_view(0, 0) = 0.0;
 
  386      DfDp_out_view(0, 1) = 0.0;
 
  387      DfDp_out_view(0, 2) = 0.0;
 
  388      DfDp_out_view(1, 0) = -(f / L) * (f / L);
 
  389      DfDp_out_view(1, 1) = -(2.0 * f / (L * L)) * (a - x_in_view[0]);
 
  390      DfDp_out_view(1, 2) = +(2.0 * f * f / (L * L * L)) * (a - x_in_view[0]);
 
  393      if (useDfDpAsTangent_ && !is_null(DxdotDp_in)) {
 
  394        Thyra::ConstDetachedMultiVectorView<Scalar> DxdotDp(*DxdotDp_in);
 
  395        DfDp_out_view(0, 0) += DxdotDp(0, 0);
 
  396        DfDp_out_view(0, 1) += DxdotDp(0, 1);
 
  397        DfDp_out_view(0, 2) += DxdotDp(0, 2);
 
  398        DfDp_out_view(1, 0) += DxdotDp(1, 0);
 
  399        DfDp_out_view(1, 1) += DxdotDp(1, 1);
 
  400        DfDp_out_view(1, 2) += DxdotDp(1, 2);
 
  402      if (useDfDpAsTangent_ && !is_null(DxDp_in)) {
 
  403        Thyra::ConstDetachedMultiVectorView<Scalar> DxDp(*DxDp_in);
 
  404        DfDp_out_view(0, 0) += -DxDp(1, 0);
 
  405        DfDp_out_view(0, 1) += -DxDp(1, 1);
 
  406        DfDp_out_view(0, 2) += -DxDp(1, 2);
 
  407        DfDp_out_view(1, 0) += (f / L) * (f / L) * DxDp(0, 0);
 
  408        DfDp_out_view(1, 1) += (f / L) * (f / L) * DxDp(0, 1);
 
  409        DfDp_out_view(1, 2) += (f / L) * (f / L) * DxDp(0, 2);
 
  415  if (acceptModelParams_) {
 
  416    RCP<VectorBase<Scalar> > g_out = outArgs.get_g(0);
 
  417    if (g_out != Teuchos::null) Thyra::assign(g_out.ptr(), *x_in);
 
  419    RCP<Thyra::MultiVectorBase<Scalar> > DgDp_out =
 
  420        outArgs.get_DgDp(0, 0).getMultiVector();
 
  421    if (DgDp_out != Teuchos::null) Thyra::assign(DgDp_out.ptr(), Scalar(0.0));
 
  423    RCP<Thyra::MultiVectorBase<Scalar> > DgDx_out =
 
  424        outArgs.get_DgDx(0).getMultiVector();
 
  425    if (DgDx_out != Teuchos::null) {
 
  426      Thyra::DetachedMultiVectorView<Scalar> DgDx_out_view(*DgDx_out);
 
  427      DgDx_out_view(0, 0) = 1.0;
 
  428      DgDx_out_view(0, 1) = 0.0;
 
  429      DgDx_out_view(1, 0) = 0.0;
 
  430      DgDx_out_view(1, 1) = 1.0;
 
 
  485  if (isInitialized_) {
 
  490  typedef Thyra::ModelEvaluatorBase MEB;
 
  493    MEB::InArgsSetup<Scalar> inArgs;
 
  494    inArgs.setModelEvalDescription(this->description());
 
  495    inArgs.setSupports(MEB::IN_ARG_t);
 
  496    inArgs.setSupports(MEB::IN_ARG_x);
 
  497    inArgs.setSupports(MEB::IN_ARG_beta);
 
  498    inArgs.setSupports(MEB::IN_ARG_x_dot);
 
  499    inArgs.setSupports(MEB::IN_ARG_alpha);
 
  500    if (acceptModelParams_) {
 
  508    MEB::OutArgsSetup<Scalar> outArgs;
 
  509    outArgs.setModelEvalDescription(this->description());
 
  510    outArgs.setSupports(MEB::OUT_ARG_f);
 
  511    outArgs.setSupports(MEB::OUT_ARG_W_op);
 
  512    if (acceptModelParams_) {
 
  513      outArgs.set_Np_Ng(Np_, Ng_);
 
  514      outArgs.setSupports(MEB::OUT_ARG_DfDp, 0, MEB::DERIV_MV_JACOBIAN_FORM);
 
  515      outArgs.setSupports(MEB::OUT_ARG_DgDp, 0, 0, MEB::DERIV_MV_JACOBIAN_FORM);
 
  516      outArgs.setSupports(MEB::OUT_ARG_DgDx, 0, MEB::DERIV_MV_GRADIENT_FORM);
 
  522  nominalValues_ = inArgs_;
 
  524    nominalValues_.set_t(t0_ic_);
 
  525    const RCP<Thyra::VectorBase<Scalar> > x_ic = createMember(x_space_);
 
  527      Thyra::DetachedVectorView<Scalar> x_ic_view(*x_ic);
 
  528      x_ic_view[0] = a_ + b_ * sin((f_ / L_) * t0_ic_ + phi_);
 
  529      x_ic_view[1] = b_ * (f_ / L_) * cos((f_ / L_) * t0_ic_ + phi_);
 
  531    nominalValues_.set_x(x_ic);
 
  532    if (acceptModelParams_) {
 
  533      const RCP<Thyra::VectorBase<Scalar> > p_ic = createMember(p_space_);
 
  535        Thyra::DetachedVectorView<Scalar> p_ic_view(*p_ic);
 
  540      nominalValues_.set_p(0, p_ic);
 
  542    const RCP<Thyra::VectorBase<Scalar> > x_dot_ic = createMember(x_space_);
 
  544      Thyra::DetachedVectorView<Scalar> x_dot_ic_view(*x_dot_ic);
 
  545      x_dot_ic_view[0] = b_ * (f_ / L_) * cos((f_ / L_) * t0_ic_ + phi_);
 
  547          -b_ * (f_ / L_) * (f_ / L_) * sin((f_ / L_) * t0_ic_ + phi_);
 
  549    nominalValues_.set_x_dot(x_dot_ic);
 
  552  isInitialized_ = 
true;
 
 
  696    const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
 
  697    const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
 const 
  700  using Teuchos::rcp_dynamic_cast;
 
  703  TEUCHOS_TEST_FOR_EXCEPTION(!this->isInitialized_, std::logic_error,
 
  704                             "Error, setupInOutArgs_ must be called first!\n");
 
  706  const RCP<const VectorBase<Scalar> > x_in = inArgs.get_x().assert_not_null();
 
  707  Thyra::ConstDetachedVectorView<Scalar> x_in_view(*x_in);
 
  713  if (this->acceptModelParams_) {
 
  714    const RCP<const VectorBase<Scalar> > p_in =
 
  715        inArgs.get_p(0).assert_not_null();
 
  716    Thyra::ConstDetachedVectorView<Scalar> p_in_view(*p_in);
 
  722  Scalar beta = inArgs.get_beta();
 
  724  const RCP<Thyra::LinearOpBase<Scalar> > W_out = outArgs.get_W_op();
 
  725  if (inArgs.get_x_dot().is_null()) {
 
  727    if (!is_null(W_out)) {
 
  728      RCP<Thyra::MultiVectorBase<Scalar> > matrix =
 
  729          Teuchos::rcp_dynamic_cast<Thyra::MultiVectorBase<Scalar> >(W_out,
 
  731      Thyra::DetachedMultiVectorView<Scalar> matrix_view(*matrix);
 
  732      matrix_view(0, 0) = 0.0;                        
 
  733      matrix_view(1, 0) = +beta;                      
 
  734      matrix_view(0, 1) = -beta * (f / L) * (f / L);  
 
  735      matrix_view(1, 1) = 0.0;                        
 
  741    RCP<const VectorBase<Scalar> > x_dot_in;
 
  742    x_dot_in     = inArgs.get_x_dot().assert_not_null();
 
  743    Scalar alpha = inArgs.get_alpha();
 
  744    if (!is_null(W_out)) {
 
  745      RCP<Thyra::MultiVectorBase<Scalar> > matrix =
 
  746          Teuchos::rcp_dynamic_cast<Thyra::MultiVectorBase<Scalar> >(W_out,
 
  748      Thyra::DetachedMultiVectorView<Scalar> matrix_view(*matrix);
 
  749      matrix_view(0, 0) = alpha;                      
 
  750      matrix_view(1, 0) = -beta;                      
 
  751      matrix_view(0, 1) = +beta * (f / L) * (f / L);  
 
  752      matrix_view(1, 1) = alpha;