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; }
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; }