42 #ifndef Thyra_TpetraExplicitAdjointModelEvaluator_hpp
43 #define Thyra_TpetraExplicitAdjointModelEvaluator_hpp
45 #include "Thyra_ModelEvaluatorDelegatorBase.hpp"
46 #include "Thyra_TpetraLinearOp.hpp"
47 #include "Tpetra_RowMatrixTransposer.hpp"
61 template <
typename Scalar,
typename LocalOrdinal,
typename GlobalOrdinal=LocalOrdinal,
typename Node=Tpetra::KokkosClassic::DefaultNode::DefaultNodeType>
97 if (thyra_fwd_op == Teuchos::null)
100 Teuchos::rcp_dynamic_cast<TLO>(thyra_fwd_op,
true);
101 RCP<TO> tpetra_fwd_op = thyra_tpetra_fwd_op->getTpetraOperator();
103 Teuchos::rcp_dynamic_cast<TCM>(tpetra_fwd_op,
true);
104 TRMT transposer(tpetra_fwd_mat);
105 RCP<TCM> tpetra_trans_mat = transposer.createTranspose();
106 return tpetraLinearOp(thyra_op->range(), thyra_op->domain(),
117 MEB::OutArgs<Scalar> model_outArgs =
119 MEB::OutArgsSetup<Scalar> outArgs;
120 outArgs.setModelEvalDescription(this->
description());
121 outArgs.setSupports(MEB::OUT_ARG_f);
122 outArgs.setSupports(MEB::OUT_ARG_W_op);
128 const ModelEvaluatorBase::InArgs<Scalar> &inArgs,
129 const ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
132 typedef TpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node> TLO;
137 MEB::OutArgs<Scalar> model_outArgs =
140 if (model_outArgs.supports(MEB::OUT_ARG_W_op) &&
141 outArgs.get_W_op() != Teuchos::null) {
143 if (thyra_fwd_op == Teuchos::null)
145 model_outArgs->set_W_op(thyra_fwd_op);
151 RCP<TLO> thyra_tpetra_fwd_op =
152 Teuchos::rcp_dynamic_cast<TLO>(thyra_fwd_op,
true);
153 RCP<TO> tpetra_fwd_op = thyra_tpetra_fwd_op->getTpetraOperator();
154 RCP<TCM> tpetra_fwd_mat =
155 Teuchos::rcp_dynamic_cast<TCM>(tpetra_fwd_op,
true);
156 TRMT transposer(tpetra_fwd_mat);
157 RCP<TCM> tpetra_trans_mat = transposer.createTranspose();
160 RCP<LOB> thyra_adj_op = outArgs.get_W_op();
161 RCP<TLO> thyra_tpetra_adj_op =
162 Teuchos::rcp_dynamic_cast<TLO>(thyra_adj_op,
true);
163 RCP<TO> tpetra_adj_op = thyra_tpetra_adj_op->getTpetraOperator();
164 RCP<TCM> tpetra_adj_mat =
165 Teuchos::rcp_dynamic_cast<TCM>(tpetra_adj_op,
true);
166 *tpetra_adj_mat = *tpetra_trans_mat;
172 template <
typename Scalar>
173 RCP<TpetraExplicitAdjointModelEvaluator<Scalar> >
174 tpetraExplicitAdjointModelEvaluator(
175 const RCP<
const ModelEvaluator<Scalar> >& model)
177 return Teuchos::rcp(
new TpetraExplicitAdjointModelEvaluator<Scalar>(model));
180 template <
typename Scalar>
181 RCP<TpetraExplicitAdjointModelEvaluator<Scalar> >
182 tpetraExplicitAdjointModelEvaluator(
183 const RCP<ModelEvaluator<Scalar> >& model)
185 return Teuchos::rcp(
new TpetraExplicitAdjointModelEvaluator<Scalar>(model));
Protected subclass of InArgs that only ModelEvaluator subclasses can access to set up the selection o...
Pure abstract base interface for evaluating a stateless "model" that can be mapped into a number of d...
virtual RCP< const ModelEvaluator< Scalar > > getUnderlyingModel() const
Concrete aggregate class for all output arguments computable by a ModelEvaluator subclass object...
void setModelEvalDescription(const std::string &modelEvalDescription)
This is a base class that delegetes almost all function to a wrapped model evaluator object...
ModelEvaluatorBase::InArgs< Scalar > createInArgs() const
RCP< LinearOpBase< Scalar > > create_W_op() const
virtual ~TpetraExplicitAdjointModelEvaluator()=default
Destructor.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
A model evaluator decorator for computing an explicit adjoint.
virtual std::string description() const
Base subclass for ModelEvaluator that defines some basic types.
ModelEvaluatorBase()
constructor
#define TEUCHOS_ASSERT(assertion_test)
Concrete Thyra::LinearOpBase subclass for Tpetra::Operator.
TpetraExplicitAdjointModelEvaluator(const RCP< const ModelEvaluator< Scalar > > &model)
Constructor.
TpetraExplicitAdjointModelEvaluator(const RCP< ModelEvaluator< Scalar > > &model)
Constructor.
Concrete aggregate class for all input arguments computable by a ModelEvaluator subclass object...