9#ifndef Thyra_ImplicitAdjointModelEvaluator_hpp
10#define Thyra_ImplicitAdjointModelEvaluator_hpp
12#include "Thyra_ModelEvaluatorDelegatorBase.hpp"
13#include "Thyra_DefaultScaledAdjointLinearOp.hpp"
14#include "Thyra_DefaultAdjointLinearOpWithSolve.hpp"
24template <
typename Scalar>
26 public ModelEvaluatorDelegatorBase<Scalar>{
32 ModelEvaluatorDelegatorBase<Scalar>(model) {}
37 ModelEvaluatorDelegatorBase<Scalar>(model) {}
43 RCP<LinearOpWithSolveBase<Scalar> >
create_W()
const {
44 return nonconstAdjointLows(this->getUnderlyingModel()->
create_W());
49 return nonconstAdjoint(this->getUnderlyingModel()->
create_W_op());
54 return nonconstAdjointPreconditioner(
59 RCP<const LinearOpWithSolveFactoryBase<Scalar> >
get_W_factory()
const {
60 return adjointLinearOpWithSolveFactory(
67 const ModelEvaluatorBase::InArgs<Scalar> &inArgs,
68 const ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
70 typedef Thyra::ModelEvaluatorBase MEB;
71 MEB::OutArgs<Scalar> model_outArgs =
72 this->getUnderlyingModel()->createOutArgs();;
74 if (model_outArgs.supports(MEB::OUT_ARG_W) &&
75 outArgs.get_W() != Teuchos::null) {
76 RCP<DefaultAdjointLinearOpWithSolve<Scalar> > adjoint_op =
77 Teuchos::rcp_dynamic_cast<DefaultAdjointLinearOpWithSolve<Scalar> >(
78 outArgs.get_W(),
true);
79 model_outArgs.set_W(adjoint_op->getNonconstOp());
82 if (model_outArgs.supports(MEB::OUT_ARG_W_op) &&
83 outArgs.get_W_op() != Teuchos::null) {
84 RCP<DefaultScaledAdjointLinearOp<Scalar> > adjoint_op =
85 Teuchos::rcp_dynamic_cast<DefaultScaledAdjointLinearOp<Scalar> >(
86 outArgs.get_W_op(),
true);
87 model_outArgs.set_W_op(adjoint_op->getNonconstOp());
90 if (model_outArgs.supports(MEB::OUT_ARG_W_prec) &&
91 outArgs.get_W_prec() != Teuchos::null) {
92 RCP<AdjointPreconditioner<Scalar> > adjoint_op =
93 Teuchos::rcp_dynamic_cast<AdjointPreconditioner<Scalar> >(
94 outArgs.get_W_prec(),
true);
95 model_outArgs.set_W_prec(adjoint_op->getNonconstPreconditioner());
98 this->getUnderlyingModel()->evalModel(inArgs, model_outArgs);
103template <
typename Scalar>
110template <
typename Scalar>
An implementation of AdjointModelEvaluatorBase that creates an implicit adjoint from the supplied mod...
RCP< LinearOpWithSolveBase< Scalar > > create_W() const
Create adjoint solver.
RCP< const LinearOpWithSolveFactoryBase< Scalar > > get_W_factory() const
Get adjoint solver factory.
RCP< LinearOpBase< Scalar > > create_W_op() const
Create adjoint op.
ImplicitAdjointModelEvaluator(const RCP< const ModelEvaluator< Scalar > > &model)
Constructor.
virtual ~ImplicitAdjointModelEvaluator()=default
Destructor.
ImplicitAdjointModelEvaluator(const RCP< ModelEvaluator< Scalar > > &model)
Constructor.
RCP< PreconditionerBase< Scalar > > create_W_prec() const
Create adjoint preconditioner.
void evalModelImpl(const ModelEvaluatorBase::InArgs< Scalar > &inArgs, const ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
RCP< ImplicitAdjointModelEvaluator< Scalar > > implicitAdjointModelEvaluator(const RCP< const ModelEvaluator< Scalar > > &model)