Thyra::ModelEvaluatorBase::OutArgs<Scalar> Piro::VelocityVerletSolver<Scalar>::createOutArgsImpl() const { Thyra::ModelEvaluatorBase::OutArgsSetup<Scalar> outArgs; outArgs.setModelEvalDescription(this->description()); // One additional response slot for the solution vector outArgs.set_Np_Ng(num_p, num_g + 1); const Thyra::ModelEvaluatorBase::OutArgs<Scalar> modelOutArgs = model->createOutArgs(); if (num_p > 0) { // Only one parameter supported const int l = 0; // Computing the DxDp sensitivity for a transient problem currently requires the evaluation of // the mutilivector-based, Jacobian-oriented DfDp derivatives of the underlying transient model. const Thyra::ModelEvaluatorBase::DerivativeSupport model_dfdp_support = modelOutArgs.supports(Thyra::ModelEvaluatorBase::OUT_ARG_DfDp, l); if (!model_dfdp_support.supports(Thyra::ModelEvaluatorBase::DERIV_MV_JACOBIAN_FORM)) { // Ok to return early since only one parameter supported return outArgs; } // Solution sensitivity outArgs.setSupports( Thyra::ModelEvaluatorBase::OUT_ARG_DgDp, num_g, l, Thyra::ModelEvaluatorBase::DERIV_MV_JACOBIAN_FORM); if (num_g > 0) { // Only one response supported const int j = 0; const Thyra::ModelEvaluatorBase::DerivativeSupport model_dgdx_support = modelOutArgs.supports(Thyra::ModelEvaluatorBase::OUT_ARG_DgDx, j); if (!model_dgdx_support.none()) { const Thyra::ModelEvaluatorBase::DerivativeSupport model_dgdp_support = modelOutArgs.supports(Thyra::ModelEvaluatorBase::OUT_ARG_DgDp, j, l); // Response sensitivity Thyra::ModelEvaluatorBase::DerivativeSupport dgdp_support; if (model_dgdp_support.supports(Thyra::ModelEvaluatorBase::DERIV_MV_JACOBIAN_FORM)) { dgdp_support.plus(Thyra::ModelEvaluatorBase::DERIV_MV_JACOBIAN_FORM); } if (model_dgdp_support.supports(Thyra::ModelEvaluatorBase::DERIV_LINEAR_OP)) { dgdp_support.plus(Thyra::ModelEvaluatorBase::DERIV_LINEAR_OP); } outArgs.setSupports( Thyra::ModelEvaluatorBase::OUT_ARG_DgDp, j, l, dgdp_support); } } } return outArgs; }
Thyra::ModelEvaluatorBase::OutArgs<Scalar> Piro::RythmosSolver<Scalar>::createOutArgsImpl() const { Thyra::ModelEvaluatorBase::OutArgsSetup<Scalar> outArgs; outArgs.setModelEvalDescription(this->description()); // Ng is 1 bigger then model-Ng so that the solution vector can be an outarg outArgs.set_Np_Ng(num_p, num_g+1); Thyra::ModelEvaluatorBase::OutArgs<Scalar> model_outargs = model->createOutArgs(); for (int i=0; i<num_g; i++) for (int j=0; j<num_p; j++) if (!model_outargs.supports( Thyra::ModelEvaluatorBase::OUT_ARG_DgDp, i, j).none()) outArgs.setSupports( Thyra::ModelEvaluatorBase::OUT_ARG_DgDp, i, j, Thyra::ModelEvaluatorBase::DerivativeSupport( Thyra::ModelEvaluatorBase::DERIV_MV_BY_COL)); return outArgs; }
Thyra::ModelEvaluatorBase::OutArgs<Scalar> Piro::SteadyStateSolver<Scalar>::createOutArgsImpl() const { Thyra::ModelEvaluatorBase::OutArgsSetup<Scalar> result; result.setModelEvalDescription(this->description()); // One additional response slot for the solution vector result.set_Np_Ng(num_p_, num_g_ + 1); const Thyra::ModelEvaluatorBase::OutArgs<Scalar> modelOutArgs = model_->createOutArgs(); // Sensitivity support (Forward approach only) // Jacobian solver required for all sensitivities if (modelOutArgs.supports(Thyra::ModelEvaluatorBase::OUT_ARG_W)) { for (int l = 0; l < num_p_; ++l) { // Solution sensitivities: DxDp(l) // DfDp(l) required const Thyra::ModelEvaluatorBase::DerivativeSupport dfdp_support = modelOutArgs.supports(Thyra::ModelEvaluatorBase::OUT_ARG_DfDp, l); const bool dxdp_linOpSupport = dfdp_support.supports(Thyra::ModelEvaluatorBase::DERIV_LINEAR_OP); const bool dxdp_mvJacSupport = dfdp_support.supports(Thyra::ModelEvaluatorBase::DERIV_MV_JACOBIAN_FORM); { Thyra::ModelEvaluatorBase::DerivativeSupport dxdp_support; if (dxdp_linOpSupport) { dxdp_support.plus(Thyra::ModelEvaluatorBase::DERIV_LINEAR_OP); } if (dxdp_mvJacSupport) { dxdp_support.plus(Thyra::ModelEvaluatorBase::DERIV_MV_JACOBIAN_FORM); } result.setSupports(Thyra::ModelEvaluatorBase::OUT_ARG_DgDp, num_g_, l, dxdp_support); } // Response sensitivities: DgDp(j, l) // DxDp(l) required if (dxdp_linOpSupport || dxdp_mvJacSupport) { for (int j = 0; j < num_g_; ++j) { // DgDx(j) required const Thyra::ModelEvaluatorBase::DerivativeSupport dgdx_support = modelOutArgs.supports(Thyra::ModelEvaluatorBase::OUT_ARG_DgDx, j); const bool dgdx_linOpSupport = dgdx_support.supports(Thyra::ModelEvaluatorBase::DERIV_LINEAR_OP); const bool dgdx_mvGradSupport = dgdx_support.supports(Thyra::ModelEvaluatorBase::DERIV_MV_GRADIENT_FORM); if (dgdx_linOpSupport || dgdx_mvGradSupport) { // Dgdp(j, l) required const Thyra::ModelEvaluatorBase::DerivativeSupport dgdp_support = modelOutArgs.supports(Thyra::ModelEvaluatorBase::OUT_ARG_DgDp, j, l); Thyra::ModelEvaluatorBase::DerivativeSupport total_dgdp_support; if (dgdp_support.supports(Thyra::ModelEvaluatorBase::DERIV_LINEAR_OP) && dgdx_linOpSupport && dxdp_linOpSupport) { total_dgdp_support.plus(Thyra::ModelEvaluatorBase::DERIV_LINEAR_OP); } if (dxdp_mvJacSupport) { if (dgdp_support.supports(Thyra::ModelEvaluatorBase::DERIV_MV_JACOBIAN_FORM)) { total_dgdp_support.plus(Thyra::ModelEvaluatorBase::DERIV_MV_JACOBIAN_FORM); } if (dgdp_support.supports(Thyra::ModelEvaluatorBase::DERIV_MV_GRADIENT_FORM) && dgdx_mvGradSupport) { total_dgdp_support.plus(Thyra::ModelEvaluatorBase::DERIV_MV_GRADIENT_FORM); } } result.setSupports(Thyra::ModelEvaluatorBase::OUT_ARG_DgDp, j, l, total_dgdp_support); } } } } } return result; }
Thyra::ModelEvaluatorBase::OutArgs<ST> Albany::ModelEvaluatorT::createOutArgsImpl() const { Thyra::ModelEvaluatorBase::OutArgsSetup<ST> result; result.setModelEvalDescription(this->description()); const int n_g = app->getNumResponses(); result.set_Np_Ng(num_param_vecs+num_dist_param_vecs, n_g); result.setSupports(Thyra::ModelEvaluatorBase::OUT_ARG_f, true); result.setSupports(Thyra::ModelEvaluatorBase::OUT_ARG_W_op, true); result.set_W_properties( Thyra::ModelEvaluatorBase::DerivativeProperties( Thyra::ModelEvaluatorBase::DERIV_LINEARITY_UNKNOWN, Thyra::ModelEvaluatorBase::DERIV_RANK_FULL, true)); for (int l = 0; l < num_param_vecs; ++l) { result.setSupports( Thyra::ModelEvaluatorBase::OUT_ARG_DfDp, l, Thyra::ModelEvaluatorBase::DERIV_MV_BY_COL); } for (int i=0; i<num_dist_param_vecs; i++) result.setSupports( Thyra::ModelEvaluatorBase::OUT_ARG_DfDp, i+num_param_vecs, Thyra::ModelEvaluatorBase::DERIV_LINEAR_OP); for (int i = 0; i < n_g; ++i) { Thyra::ModelEvaluatorBase::DerivativeSupport dgdx_support; if (app->getResponse(i)->isScalarResponse()) { dgdx_support = Thyra::ModelEvaluatorBase::DERIV_TRANS_MV_BY_ROW; } else { dgdx_support = Thyra::ModelEvaluatorBase::DERIV_LINEAR_OP; } result.setSupports( Thyra::ModelEvaluatorBase::OUT_ARG_DgDx, i, dgdx_support); if(supports_xdot){ result.setSupports( Thyra::ModelEvaluatorBase::OUT_ARG_DgDx_dot, i, dgdx_support); } // AGS: x_dotdot time integrators not imlemented in Thyra ME yet //result.setSupports( // Thyra::ModelEvaluatorBase::OUT_ARG_DgDx_dotdot, i, dgdx_support); for (int l = 0; l < num_param_vecs; l++) result.setSupports( Thyra::ModelEvaluatorBase::OUT_ARG_DgDp, i, l, Thyra::ModelEvaluatorBase::DERIV_MV_BY_COL); if (app->getResponse(i)->isScalarResponse()) { for (int j=0; j<num_dist_param_vecs; j++) result.setSupports( Thyra::ModelEvaluatorBase::OUT_ARG_DgDp, i, j+num_param_vecs, Thyra::ModelEvaluatorBase::DERIV_TRANS_MV_BY_ROW); } else { for (int j=0; j<num_dist_param_vecs; j++) result.setSupports( Thyra::ModelEvaluatorBase::OUT_ARG_DgDp, i, j+num_param_vecs, Thyra::ModelEvaluatorBase::DERIV_LINEAR_OP); } } return result; }