From 28d4234315e6ec5a378df103687453b1fb3c911c Mon Sep 17 00:00:00 2001 From: Roger Pawlowski Date: Fri, 23 Oct 2020 14:52:30 -0600 Subject: [PATCH] LOCA: Update householder constraints for case with model evaluator decorator --- .../LOCA_Tpetra_ConstraintModelEvaluator.cpp | 10 ++++++++-- packages/nox/test/tpetra/ME_Tpetra_1DFEM_def.hpp | 4 ++-- .../nox/test/tpetra/tTpetra_1DFEM_ME_UnitTests.cpp | 4 ++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/nox/src-loca/src-tpetra/LOCA_Tpetra_ConstraintModelEvaluator.cpp b/packages/nox/src-loca/src-tpetra/LOCA_Tpetra_ConstraintModelEvaluator.cpp index a3abc5bb0e7d..7c9917279a78 100644 --- a/packages/nox/src-loca/src-tpetra/LOCA_Tpetra_ConstraintModelEvaluator.cpp +++ b/packages/nox/src-loca/src-tpetra/LOCA_Tpetra_ConstraintModelEvaluator.cpp @@ -2,6 +2,7 @@ #include "Thyra_ModelEvaluator.hpp" #include "Thyra_TpetraThyraWrappers.hpp" #include "Thyra_VectorStdOps.hpp" +#include "Thyra_DefaultScaledAdjointLinearOp.hpp" #include "NOX_Thyra_MultiVector.H" #include "NOX_Thyra_Vector.H" #include "NOX_TpetraTypedefs.hpp" @@ -71,7 +72,12 @@ namespace LOCA { i.resize(me_p_.size()); for (size_t j=0; j < numResponses; ++j) { me_g_[j] = ::Thyra::createMember(*model->get_g_space(meResponseIndices_[j]),"g_j"); - me_dgdx_[j] = Teuchos::rcp_dynamic_cast<::Thyra::MultiVectorBase>(model->create_DgDx_op(meResponseIndices_[j]),true); + me_dgdx_[j] = Teuchos::rcp_dynamic_cast<::Thyra::MultiVectorBase>(model->create_DgDx_op(meResponseIndices_[j]),false); + if (me_dgdx_[j].is_null()) { + // It might be wrapped in an Adjoint linear op for the transpose. + auto ptr = Teuchos::rcp_dynamic_cast<::Thyra::DefaultScaledAdjointLinearOp>(model->create_DgDx_op(meResponseIndices_[j]),true); + me_dgdx_[j] = Teuchos::rcp_dynamic_cast<::Thyra::MultiVectorBase>(ptr->getNonconstOp(),true); + } for (size_t l=0; l < me_p_.size(); ++l) me_dgdp_[j][l] = Teuchos::rcp_dynamic_cast<::Thyra::MultiVectorBase>(model->create_DgDp_op(meResponseIndices_[j], meParameterIndices_[l]), @@ -194,7 +200,7 @@ namespace LOCA { auto outArgs = model_->createOutArgs(); for (size_t i=0; i < me_dgdx_.size(); ++i) - outArgs.set_DgDx(meResponseIndices_[i],::Thyra::ModelEvaluatorBase::Derivative(me_dgdx_[i])); + outArgs.set_DgDx(meResponseIndices_[i],::Thyra::ModelEvaluatorBase::Derivative(me_dgdx_[i],::Thyra::ModelEvaluatorBase::DERIV_MV_GRADIENT_FORM)); model_->evalModel(inArgs,outArgs); diff --git a/packages/nox/test/tpetra/ME_Tpetra_1DFEM_def.hpp b/packages/nox/test/tpetra/ME_Tpetra_1DFEM_def.hpp index 0d7c120f6427..68ccf5e43b8d 100644 --- a/packages/nox/test/tpetra/ME_Tpetra_1DFEM_def.hpp +++ b/packages/nox/test/tpetra/ME_Tpetra_1DFEM_def.hpp @@ -125,11 +125,11 @@ EvaluatorTpetra1DFEM(const Teuchos::RCP >& comm, outArgs.setSupports(MEB::OUT_ARG_W_prec); outArgs.set_Np_Ng(Np_,Ng_); outArgs.setSupports(MEB::OUT_ARG_DfDp,2,MEB::DerivativeSupport(MEB::DERIV_MV_JACOBIAN_FORM)); - outArgs.setSupports(MEB::OUT_ARG_DgDx,4,MEB::DerivativeSupport(MEB::DERIV_MV_JACOBIAN_FORM)); + outArgs.setSupports(MEB::OUT_ARG_DgDx,4,MEB::DerivativeSupport(MEB::DERIV_MV_GRADIENT_FORM)); outArgs.setSupports(MEB::OUT_ARG_DgDp,4,2,MEB::DerivativeSupport(MEB::DERIV_MV_JACOBIAN_FORM)); outArgs.setSupports(MEB::OUT_ARG_DfDp,4,MEB::DerivativeSupport(MEB::DERIV_MV_JACOBIAN_FORM)); - outArgs.setSupports(MEB::OUT_ARG_DgDx,6,MEB::DerivativeSupport(MEB::DERIV_MV_JACOBIAN_FORM)); + outArgs.setSupports(MEB::OUT_ARG_DgDx,6,MEB::DerivativeSupport(MEB::DERIV_MV_GRADIENT_FORM)); outArgs.setSupports(MEB::OUT_ARG_DgDp,4,4,MEB::DerivativeSupport(MEB::DERIV_MV_JACOBIAN_FORM)); outArgs.setSupports(MEB::OUT_ARG_DgDp,6,2,MEB::DerivativeSupport(MEB::DERIV_MV_JACOBIAN_FORM)); outArgs.setSupports(MEB::OUT_ARG_DgDp,6,4,MEB::DerivativeSupport(MEB::DERIV_MV_JACOBIAN_FORM)); diff --git a/packages/nox/test/tpetra/tTpetra_1DFEM_ME_UnitTests.cpp b/packages/nox/test/tpetra/tTpetra_1DFEM_ME_UnitTests.cpp index f5eb8ffd6c2f..c4c0409b1b5b 100644 --- a/packages/nox/test/tpetra/tTpetra_1DFEM_ME_UnitTests.cpp +++ b/packages/nox/test/tpetra/tTpetra_1DFEM_ME_UnitTests.cpp @@ -106,7 +106,7 @@ TEUCHOS_UNIT_TEST(NOX_Tpetra_1DFEM, Responses_g4_p2) outArgs.set_g(4,::Thyra::ModelEvaluatorBase::Evaluation<::Thyra::VectorBase>(g_thyra)); outArgs.set_DfDp(2,::Thyra::ModelEvaluatorBase::Derivative(DfDp_thyra)); - outArgs.set_DgDx(4,::Thyra::ModelEvaluatorBase::Derivative(DgDx_thyra)); + outArgs.set_DgDx(4,::Thyra::ModelEvaluatorBase::Derivative(DgDx_thyra,Thyra::ModelEvaluatorBase::DERIV_MV_GRADIENT_FORM)); outArgs.set_DgDp(4,2,::Thyra::ModelEvaluatorBase::Derivative(Dg4Dp2_thyra)); outArgs.set_DgDp(4,4,::Thyra::ModelEvaluatorBase::Derivative(Dg4Dp4_thyra)); @@ -206,7 +206,7 @@ TEUCHOS_UNIT_TEST(NOX_Tpetra_1DFEM, Responses_g6_p4) outArgs.set_g(6,::Thyra::ModelEvaluatorBase::Evaluation<::Thyra::VectorBase>(g_thyra)); outArgs.set_DfDp(4,::Thyra::ModelEvaluatorBase::Derivative(DfDp4_thyra)); - outArgs.set_DgDx(6,::Thyra::ModelEvaluatorBase::Derivative(DgDx_thyra)); + outArgs.set_DgDx(6,::Thyra::ModelEvaluatorBase::Derivative(DgDx_thyra,Thyra::ModelEvaluatorBase::DERIV_MV_GRADIENT_FORM)); outArgs.set_DgDp(6,2,::Thyra::ModelEvaluatorBase::Derivative(Dg6Dp2_thyra)); outArgs.set_DgDp(6,4,::Thyra::ModelEvaluatorBase::Derivative(Dg6Dp4_thyra));