void ScaledModelEvaluator<Scalar>::evalModelImpl( const ModelEvaluatorBase::InArgs<Scalar> &inArgs, const ModelEvaluatorBase::OutArgs<Scalar> &outArgs ) const { using Teuchos::rcp; using Teuchos::rcp_const_cast; using Teuchos::rcp_dynamic_cast; using Teuchos::OSTab; typedef ScalarTraits<Scalar> ST; typedef ModelEvaluatorBase MEB; THYRA_MODEL_EVALUATOR_DECORATOR_EVAL_MODEL_BEGIN( "Thyra::ScaledModelEvaluator",inArgs,outArgs ); thyraModel->evalModel(inArgs, outArgs); if (nonnull(f_scaling_)) { const RCP<VectorBase<Scalar> > f = outArgs.get_f(); if (nonnull(f)) { ele_wise_scale(*f_scaling_, f.ptr()); } const RCP<LinearOpBase<Scalar> > W_op = outArgs.get_W_op(); if (nonnull(W_op)) { const RCP<ScaledLinearOpBase<Scalar> > W_scaled = rcp_dynamic_cast<ScaledLinearOpBase<Scalar> >(W_op, true); W_scaled->scaleLeft(*f_scaling_); } } THYRA_MODEL_EVALUATOR_DECORATOR_EVAL_MODEL_END(); }
void DefaultModelEvaluatorWithSolveFactory<Scalar>::evalModelImpl( const ModelEvaluatorBase::InArgs<Scalar> &inArgs, const ModelEvaluatorBase::OutArgs<Scalar> &outArgs ) const { typedef ModelEvaluatorBase MEB; using Teuchos::rcp; using Teuchos::rcp_const_cast; using Teuchos::rcp_dynamic_cast; using Teuchos::OSTab; THYRA_MODEL_EVALUATOR_DECORATOR_EVAL_MODEL_BEGIN( "Thyra::DefaultModelEvaluatorWithSolveFactory",inArgs,outArgs ); Teuchos::Time timer(""); typedef Teuchos::VerboseObjectTempState<LinearOpWithSolveFactoryBase<Scalar> > VOTSLOWSF; VOTSLOWSF W_factory_outputTempState(W_factory_,out,verbLevel); // InArgs MEB::InArgs<Scalar> wrappedInArgs = thyraModel->createInArgs(); wrappedInArgs.setArgs(inArgs,true); // OutArgs MEB::OutArgs<Scalar> wrappedOutArgs = thyraModel->createOutArgs(); wrappedOutArgs.setArgs(outArgs,true); RCP<LinearOpWithSolveBase<Scalar> > W; RCP<const LinearOpBase<Scalar> > fwdW; if( outArgs.supports(MEB::OUT_ARG_W) && (W = outArgs.get_W()).get() ) { Thyra::uninitializeOp<Scalar>(*W_factory_, W.ptr(), outArg(fwdW)); { // Handle this case later if we need to! const bool both_W_and_W_op_requested = nonnull(outArgs.get_W_op()); TEUCHOS_TEST_FOR_EXCEPT(both_W_and_W_op_requested); } RCP<LinearOpBase<Scalar> > nonconst_fwdW; if(fwdW.get()) { nonconst_fwdW = rcp_const_cast<LinearOpBase<Scalar> >(fwdW); } else { nonconst_fwdW = thyraModel->create_W_op(); fwdW = nonconst_fwdW; } wrappedOutArgs.set_W_op(nonconst_fwdW); } // Do the evaluation if(out.get() && includesVerbLevel(verbLevel,Teuchos::VERB_LOW)) *out << "\nEvaluating the output functions on model \'" << thyraModel->description() << "\' ...\n"; timer.start(true); thyraModel->evalModel(wrappedInArgs,wrappedOutArgs); timer.stop(); if(out.get() && includesVerbLevel(verbLevel,Teuchos::VERB_LOW)) OSTab(out).o() << "\nTime to evaluate underlying model = " << timer.totalElapsedTime()<<" sec\n"; // Postprocess arguments if(out.get() && includesVerbLevel(verbLevel,Teuchos::VERB_LOW)) *out << "\nPost processing the output objects ...\n"; timer.start(true); if( W.get() ) { Thyra::initializeOp<Scalar>(*W_factory_, fwdW, W.ptr()); W->setVerbLevel(this->getVerbLevel()); W->setOStream(this->getOStream()); } timer.stop(); if(out.get() && includesVerbLevel(verbLevel,Teuchos::VERB_LOW)) OSTab(out).o() << "\nTime to process output objects = " << timer.totalElapsedTime()<<" sec\n"; THYRA_MODEL_EVALUATOR_DECORATOR_EVAL_MODEL_END(); }
void VanderPolModel::evalModelImpl( const ModelEvaluatorBase::InArgs<double> &inArgs, const ModelEvaluatorBase::OutArgs<double> &outArgs ) const { using Teuchos::as; using Teuchos::outArg; using Teuchos::optInArg; using Teuchos::inOutArg; using Sacado::Fad::DFad; TEST_FOR_EXCEPTION( !isInitialized_, std::logic_error, "Error, setParameterList must be called first!\n" ); const RCP<const VectorBase<double> > x_in = inArgs.get_x().assert_not_null(); Thyra::ConstDetachedVectorView<double> x_in_view( *x_in ); double t = inArgs.get_t(); double eps = epsilon_; if (acceptModelParams_) { const RCP<const VectorBase<double> > p_in = inArgs.get_p(0).assert_not_null(); Thyra::ConstDetachedVectorView<double> p_in_view( *p_in ); eps = p_in_view[0]; } RCP<const VectorBase<double> > x_dot_in; double alpha = -1.0; double beta = -1.0; if (isImplicit_) { x_dot_in = inArgs.get_x_dot().assert_not_null(); alpha = inArgs.get_alpha(); beta = inArgs.get_beta(); } const RCP<VectorBase<double> > f_out = outArgs.get_f(); const RCP<Thyra::LinearOpBase<double> > W_out = outArgs.get_W_op(); RCP<Thyra::MultiVectorBase<double> > DfDp_out; if (acceptModelParams_) { Derivative<double> DfDp = outArgs.get_DfDp(0); DfDp_out = DfDp.getMultiVector(); } // Determine how many derivatives we will compute int num_derivs = 0; if (nonnull(W_out)) { num_derivs += 2; if (isImplicit_) { num_derivs += 2; } } if (nonnull(DfDp_out)) num_derivs += 1; // Set up the FAD derivative objects int deriv_i = 0; Array<DFad<double> > x_dot_fad; int x_dot_idx_offset = 0; if (isImplicit_) { Thyra::ConstDetachedVectorView<double> x_dot_in_view( *x_dot_in ); if (nonnull(W_out)) { x_dot_idx_offset = deriv_i; x_dot_fad = convertToIndepVarFadArray<double>(x_dot_in_view.sv().values()(), num_derivs, inOutArg(deriv_i)); } else { x_dot_fad = convertToPassiveFadArray<double>(x_dot_in_view.sv().values()()); } } Array<DFad<double> > x_fad; int x_idx_offset = 0; if (nonnull(W_out)) { x_idx_offset = deriv_i; x_fad = convertToIndepVarFadArray<double>(x_in_view.sv().values()(), num_derivs, inOutArg(deriv_i)); } else { x_fad = convertToPassiveFadArray<double>(x_in_view.sv().values()()); } DFad<double> eps_fad(eps); // Default passive int eps_idx_offset = 0; if (nonnull(DfDp_out)) { eps_idx_offset = deriv_i; eps_fad = DFad<double>(num_derivs, deriv_i++, eps); } // Compute the function Array<DFad<double> > f_fad(2); this->eval_f<DFad<double> >( x_dot_fad, x_fad, eps_fad, t, f_fad ); // Extract the output if (nonnull(f_out)) { Thyra::DetachedVectorView<double> f_out_view( *f_out ); for ( int i = 0; i < as<int>(f_fad.size()); ++i ) f_out_view[i] = f_fad[i].val(); } if (nonnull(W_out)) { const RCP<Thyra::MultiVectorBase<double> > matrix = Teuchos::rcp_dynamic_cast<Thyra::MultiVectorBase<double> >(W_out, true); Thyra::DetachedMultiVectorView<double> matrix_view( *matrix ); if (isImplicit_) { for ( int i = 0; i < matrix_view.subDim(); ++i) { for ( int j = 0; j < matrix_view.numSubCols(); ++j) { matrix_view(i, j) = alpha * f_fad[i].dx(x_dot_idx_offset+j) + beta * f_fad[i].dx(x_idx_offset + j); } } } else { for ( int i = 0; i < matrix_view.subDim(); ++i) { for ( int j = 0; j < matrix_view.numSubCols(); ++j) { matrix_view(i, j) = f_fad[i].dx(x_idx_offset + j); } } } } if (nonnull(DfDp_out)) { Thyra::DetachedMultiVectorView<double> DfDp_out_view( *DfDp_out ); for ( int i = 0; i < DfDp_out_view.subDim(); ++i ) DfDp_out_view(i,0) = f_fad[i].dx(eps_idx_offset); } }