TEUCHOS_UNIT_TEST( Rythmos_ForwardSensitivityExplicitModelEvaluator, args ) { RCP<ForwardSensitivityExplicitModelEvaluator<double> > model = forwardSensitivityExplicitModelEvaluator<double>(); RCP<SinCosModel> innerModel = sinCosModel(); { RCP<ParameterList> pl = Teuchos::parameterList(); pl->set("Accept model parameters",true); pl->set("Implicit model formulation",false); innerModel->setParameterList(pl); } model->initializeStructure(innerModel, 0 ); typedef Thyra::ModelEvaluatorBase MEB; { MEB::InArgs<double> inArgs = model->createInArgs(); TEST_EQUALITY_CONST( inArgs.supports(MEB::IN_ARG_t), true ); TEST_EQUALITY_CONST( inArgs.supports(MEB::IN_ARG_x), true ); TEST_EQUALITY_CONST( inArgs.supports(MEB::IN_ARG_x_dot), false ); TEST_EQUALITY_CONST( inArgs.supports(MEB::IN_ARG_alpha), false ); TEST_EQUALITY_CONST( inArgs.supports(MEB::IN_ARG_beta), true ); } { MEB::OutArgs<double> outArgs = model->createOutArgs(); TEST_EQUALITY_CONST( outArgs.supports(MEB::OUT_ARG_f), true ); TEST_EQUALITY_CONST( outArgs.supports(MEB::OUT_ARG_W_op), false ); TEST_EQUALITY_CONST( outArgs.supports(MEB::OUT_ARG_W), false ); } }
void assertValidModel( const StepperBase<Scalar>& stepper, const Thyra::ModelEvaluator<Scalar>& model ) { typedef Thyra::ModelEvaluatorBase MEB; TEUCHOS_ASSERT(stepper.acceptsModel()); const MEB::InArgs<Scalar> inArgs = model.createInArgs(); const MEB::OutArgs<Scalar> outArgs = model.createOutArgs(); //TEUCHOS_ASSERT(inArgs.supports(MEB::IN_ARG_t)); TEUCHOS_ASSERT(inArgs.supports(MEB::IN_ARG_x)); TEUCHOS_ASSERT(outArgs.supports(MEB::OUT_ARG_f)); if (stepper.isImplicit()) { // implicit stepper TEUCHOS_ASSERT( inArgs.supports(MEB::IN_ARG_x_dot) ); TEUCHOS_ASSERT( inArgs.supports(MEB::IN_ARG_alpha) ); TEUCHOS_ASSERT( inArgs.supports(MEB::IN_ARG_beta) ); TEUCHOS_ASSERT( outArgs.supports(MEB::OUT_ARG_W) ); } //else { // explicit stepper // TEUCHOS_ASSERT( !inArgs.supports(MEB::IN_ARG_x_dot) ); // TEUCHOS_ASSERT( !inArgs.supports(MEB::IN_ARG_alpha) ); // TEUCHOS_ASSERT( !inArgs.supports(MEB::IN_ARG_beta) ); // TEUCHOS_ASSERT( !outArgs.supports(MEB::OUT_ARG_W) ); //} }
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); } // For model evaluators whose state function f(x, x_dot, t) describes // an implicit ODE, and which accept an optional x_dot input argument, // make sure the latter is set to null in order to request the evaluation // of a state function corresponding to the explicit ODE formulation // x_dot = f(x, t) if (inArgs.supports(MEB::IN_ARG_x_dot)) { inArgs.set_x_dot(Teuchos::null); } outArgs.set_f(Teuchos::rcp(&*f_out,false)); model.evalModel(inArgs,outArgs); }
Thyra::ModelEvaluatorBase::InArgs<Scalar> ForwardSensitivityExplicitModelEvaluator<Scalar>::createInArgs() const { TEUCHOS_ASSERT( !is_null(stateModel_) ); typedef Thyra::ModelEvaluatorBase MEB; MEB::InArgs<Scalar> stateModelInArgs = stateModel_->createInArgs(); MEB::InArgsSetup<Scalar> inArgs; inArgs.setModelEvalDescription(this->description()); inArgs.setSupports( MEB::IN_ARG_x ); inArgs.setSupports( MEB::IN_ARG_t ); inArgs.setSupports( MEB::IN_ARG_beta, stateModelInArgs.supports(MEB::IN_ARG_beta) ); return inArgs; }
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); }
void ForwardSensitivityExplicitModelEvaluator<Scalar>::computeDerivativeMatrices( const Thyra::ModelEvaluatorBase::InArgs<Scalar> &point ) const { TEUCHOS_ASSERT( !is_null(stateModel_) ); typedef Thyra::ModelEvaluatorBase MEB; typedef Teuchos::VerboseObjectTempState<MEB> VOTSME; Teuchos::RCP<Teuchos::FancyOStream> out = this->getOStream(); Teuchos::EVerbosityLevel verbLevel = this->getVerbLevel(); MEB::InArgs<Scalar> inArgs = stateBasePoint_; MEB::OutArgs<Scalar> outArgs = stateModel_->createOutArgs(); if (is_null(DfDx_)) { DfDx_ = stateModel_->create_W_op(); } if (inArgs.supports(MEB::IN_ARG_beta)) { inArgs.set_beta(1.0); } outArgs.set_W_op(DfDx_); if (is_null(DfDp_)) { DfDp_ = Thyra::create_DfDp_mv( *stateModel_,p_index_, MEB::DERIV_MV_BY_COL ).getMultiVector(); } outArgs.set_DfDp( p_index_, MEB::Derivative<Scalar>(DfDp_,MEB::DERIV_MV_BY_COL) ); VOTSME stateModel_outputTempState(stateModel_,out,verbLevel); stateModel_->evalModel(inArgs,outArgs); }
void DiagonalImplicitRKModelEvaluator<Scalar>::evalModelImpl( const Thyra::ModelEvaluatorBase::InArgs<Scalar>& inArgs_stage, const Thyra::ModelEvaluatorBase::OutArgs<Scalar>& outArgs_stage ) const { typedef ScalarTraits<Scalar> ST; typedef Thyra::ModelEvaluatorBase MEB; typedef typename Thyra::ModelEvaluatorBase::InArgs<Scalar>::ScalarMag TScalarMag; TEUCHOS_TEST_FOR_EXCEPTION( !isInitialized_, std::logic_error, "Error! initializeDIRKModel must be called before evalModel\n" ); TEUCHOS_TEST_FOR_EXCEPTION( !setTimeStepPointCalled_, std::logic_error, "Error! setTimeStepPoint must be called before evalModel" ); TEUCHOS_TEST_FOR_EXCEPTION( currentStage_ == -1, std::logic_error, "Error! setCurrentStage must be called before evalModel" ); THYRA_MODEL_EVALUATOR_DECORATOR_EVAL_MODEL_GEN_BEGIN( "Rythmos::DiagonalImplicitRKModelEvaluator",inArgs_stage,outArgs_stage,daeModel_ ); // // A) Unwrap the inArgs and outArgs // const RCP<const Thyra::VectorBase<Scalar> > x_in = inArgs_stage.get_x(); const RCP<Thyra::VectorBase<Scalar> > f_out = outArgs_stage.get_f(); const RCP<Thyra::LinearOpBase<Scalar> > W_op_out = outArgs_stage.get_W_op(); // // B) Assemble f_out and W_op_out for given stage // MEB::InArgs<Scalar> daeInArgs = daeModel_->createInArgs(); MEB::OutArgs<Scalar> daeOutArgs = daeModel_->createOutArgs(); const RCP<Thyra::VectorBase<Scalar> > x_i = createMember(daeModel_->get_x_space()); daeInArgs.setArgs(basePoint_); // B.1) Setup the DAE's inArgs for stage f(currentStage_) ... V_V(stage_derivatives_->getNonconstVectorBlock(currentStage_).ptr(),*x_in); assembleIRKState( currentStage_, dirkButcherTableau_->A(), delta_t_, *x_old_, *stage_derivatives_, outArg(*x_i) ); daeInArgs.set_x( x_i ); daeInArgs.set_x_dot( x_in ); daeInArgs.set_t( t_old_ + dirkButcherTableau_->c()(currentStage_) * delta_t_ ); daeInArgs.set_alpha(ST::one()); daeInArgs.set_beta( delta_t_ * dirkButcherTableau_->A()(currentStage_,currentStage_) ); if (daeInArgs.supports(MEB::IN_ARG_step_size)) { TScalarMag scaled_dt; if (currentStage_ == 0 && dirkButcherTableau_->A()(currentStage_,currentStage_) == 0) { scaled_dt = Scalar( delta_t_ /dirkButcherTableau_->numStages() ); } else { scaled_dt = dirkButcherTableau_->c()(currentStage_) * delta_t_; } daeInArgs.set_step_size( scaled_dt ); } if (daeInArgs.supports(MEB::IN_ARG_stage_number)) { daeInArgs.set_stage_number( dirkButcherTableau_->c()(currentStage_) ); } // B.2) Setup the DAE's outArgs for stage f(i) ... if (!is_null(f_out)) daeOutArgs.set_f( f_out ); if (!is_null(W_op_out)) daeOutArgs.set_W_op(W_op_out); // B.3) Compute f_out(i) and/or W_op_out ... daeModel_->evalModel( daeInArgs, daeOutArgs ); daeOutArgs.set_f(Teuchos::null); daeOutArgs.set_W_op(Teuchos::null); THYRA_MODEL_EVALUATOR_DECORATOR_EVAL_MODEL_END(); }