RCP<Thyra::VectorBase<Scalar> > eval_f_t( const Thyra::ModelEvaluator<Scalar>& me, Scalar t ) { typedef Teuchos::ScalarTraits<Scalar> ST; typedef Thyra::ModelEvaluatorBase MEB; MEB::InArgs<Scalar> inArgs = me.createInArgs(); inArgs.set_t(t); MEB::OutArgs<Scalar> outArgs = me.createOutArgs(); RCP<Thyra::VectorBase<Scalar> > f_out = Thyra::createMember(me.get_f_space()); V_S(outArg(*f_out),ST::zero()); outArgs.set_f(f_out); me.evalModel(inArgs,outArgs); return f_out; }
bool setDefaultInitialConditionFromNominalValues( const Thyra::ModelEvaluator<Scalar>& model, const Ptr<StepperBase<Scalar> >& stepper ) { typedef ScalarTraits<Scalar> ST; typedef Thyra::ModelEvaluatorBase MEB; if (isInitialized(*stepper)) return false; // Already has an initial condition MEB::InArgs<Scalar> initCond = model.getNominalValues(); if (!is_null(initCond.get_x())) { // IC has x, we will assume that initCont.get_t() is the valid start time. // Therefore, we just need to check that x_dot is also set or we will // create a zero x_dot #ifdef RYTHMOS_DEBUG THYRA_ASSERT_VEC_SPACES( "setInitialConditionIfExists(...)", *model.get_x_space(), *initCond.get_x()->space() ); #endif if (initCond.supports(MEB::IN_ARG_x_dot)) { if (is_null(initCond.get_x_dot())) { const RCP<Thyra::VectorBase<Scalar> > x_dot = createMember(model.get_x_space()); assign(x_dot.ptr(), ST::zero()); } else { #ifdef RYTHMOS_DEBUG THYRA_ASSERT_VEC_SPACES( "setInitialConditionIfExists(...)", *model.get_x_space(), *initCond.get_x_dot()->space() ); #endif } } stepper->setInitialCondition(initCond); return true; } // The model has not nominal values for which to set the initial // conditions so wo don't do anything! The stepper will still have not return false; }
void eval_model_explicit( const Thyra::ModelEvaluator<Scalar> &model, Thyra::ModelEvaluatorBase::InArgs<Scalar> &basePoint, const VectorBase<Scalar>& x_in, const typename Thyra::ModelEvaluatorBase::InArgs<Scalar>::ScalarMag &t_in, const Ptr<VectorBase<Scalar> >& f_out ) { typedef Thyra::ModelEvaluatorBase MEB; MEB::InArgs<Scalar> inArgs = model.createInArgs(); MEB::OutArgs<Scalar> outArgs = model.createOutArgs(); inArgs.setArgs(basePoint); inArgs.set_x(Teuchos::rcp(&x_in,false)); if (inArgs.supports(MEB::IN_ARG_t)) { inArgs.set_t(t_in); } outArgs.set_f(Teuchos::rcp(&*f_out,false)); model.evalModel(inArgs,outArgs); }
RCP<Thyra::VectorBase<Scalar> > computeArea( const Thyra::ModelEvaluator<Scalar>& me, const TimeRange<Scalar>& tr, const GaussQuadrature1D<Scalar>& gq ) { typedef Teuchos::ScalarTraits<Scalar> ST; RCP<Thyra::VectorBase<Scalar> > area = Thyra::createMember(me.get_x_space()); V_S(outArg(*area),ST::zero()); RCP<const TimeRange<Scalar> > sourceRange = gq.getRange(); RCP<const Array<Scalar> > sourcePts = gq.getPoints(); RCP<const Array<Scalar> > sourceWts = gq.getWeights(); Array<Scalar> destPts(*sourcePts); for (unsigned int i=0 ; i<sourcePts->size() ; ++i) { destPts[i] = translateTimeRange<Scalar>((*sourcePts)[i],*sourceRange,tr); } Scalar r = tr.length()/sourceRange->length(); for (unsigned int i=0 ; i<destPts.size() ; ++i) { RCP<Thyra::VectorBase<Scalar> > tmpVec = eval_f_t<Scalar>(me,destPts[i]); Vp_StV(outArg(*area),r*(*sourceWts)[i],*tmpVec); } return area; }