Tempus Version of the Day
Time Integration
Loading...
Searching...
No Matches
Thyra_ImplicitAdjointModelEvaluator.hpp
Go to the documentation of this file.
1//@HEADER
2// *****************************************************************************
3// Tempus: Time Integration and Sensitivity Analysis Package
4//
5// Copyright 2017 NTESS and the Tempus contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8//@HEADER
9
10#ifndef Thyra_ImplicitAdjointModelEvaluator_hpp
11#define Thyra_ImplicitAdjointModelEvaluator_hpp
12
13#include "Thyra_ModelEvaluatorDelegatorBase.hpp"
14#include "Thyra_DefaultScaledAdjointLinearOp.hpp"
15#include "Thyra_DefaultAdjointLinearOpWithSolve.hpp"
18
19namespace Thyra {
20
25template <typename Scalar>
27 : public ModelEvaluatorDelegatorBase<Scalar> {
28 public:
31 : ModelEvaluatorDelegatorBase<Scalar>(model)
32 {
33 }
34
37 : ModelEvaluatorDelegatorBase<Scalar>(model)
38 {
39 }
40
42 virtual ~ImplicitAdjointModelEvaluator() = default;
43
45 RCP<LinearOpWithSolveBase<Scalar> > create_W() const
46 {
47 return nonconstAdjointLows(this->getUnderlyingModel()->create_W());
48 }
49
51 RCP<LinearOpBase<Scalar> > create_W_op() const
52 {
53 return nonconstAdjoint(this->getUnderlyingModel()->create_W_op());
54 }
55
57 RCP<PreconditionerBase<Scalar> > create_W_prec() const
58 {
59 return nonconstAdjointPreconditioner(
60 this->getUnderlyingModel()->create_W_prec());
61 }
62
64 RCP<const LinearOpWithSolveFactoryBase<Scalar> > get_W_factory() const
65 {
66 return adjointLinearOpWithSolveFactory(
67 this->getUnderlyingModel()->get_W_factory());
68 }
69
70 private:
71 void evalModelImpl(const ModelEvaluatorBase::InArgs<Scalar>& inArgs,
72 const ModelEvaluatorBase::OutArgs<Scalar>& outArgs) const
73 {
74 typedef Thyra::ModelEvaluatorBase MEB;
75 MEB::OutArgs<Scalar> model_outArgs =
76 this->getUnderlyingModel()->createOutArgs();
77
78 if (model_outArgs.supports(MEB::OUT_ARG_W) &&
79 outArgs.get_W() != Teuchos::null) {
80 RCP<DefaultAdjointLinearOpWithSolve<Scalar> > adjoint_op =
81 Teuchos::rcp_dynamic_cast<DefaultAdjointLinearOpWithSolve<Scalar> >(
82 outArgs.get_W(), true);
83 model_outArgs.set_W(adjoint_op->getNonconstOp());
84 }
85
86 if (model_outArgs.supports(MEB::OUT_ARG_W_op) &&
87 outArgs.get_W_op() != Teuchos::null) {
88 RCP<DefaultScaledAdjointLinearOp<Scalar> > adjoint_op =
89 Teuchos::rcp_dynamic_cast<DefaultScaledAdjointLinearOp<Scalar> >(
90 outArgs.get_W_op(), true);
91 model_outArgs.set_W_op(adjoint_op->getNonconstOp());
92 }
93
94 if (model_outArgs.supports(MEB::OUT_ARG_W_prec) &&
95 outArgs.get_W_prec() != Teuchos::null) {
96 RCP<AdjointPreconditioner<Scalar> > adjoint_op =
97 Teuchos::rcp_dynamic_cast<AdjointPreconditioner<Scalar> >(
98 outArgs.get_W_prec(), true);
99 model_outArgs.set_W_prec(adjoint_op->getNonconstPreconditioner());
100 }
101
102 this->getUnderlyingModel()->evalModel(inArgs, model_outArgs);
103 }
104};
105
106template <typename Scalar>
107RCP<ImplicitAdjointModelEvaluator<Scalar> > implicitAdjointModelEvaluator(
108 const RCP<const ModelEvaluator<Scalar> >& model)
109{
110 return Teuchos::rcp(new ImplicitAdjointModelEvaluator<Scalar>(model));
111}
112
113template <typename Scalar>
114RCP<ImplicitAdjointModelEvaluator<Scalar> > implicitAdjointModelEvaluator(
115 const RCP<ModelEvaluator<Scalar> >& model)
116{
117 return Teuchos::rcp(new ImplicitAdjointModelEvaluator<Scalar>(model));
118}
119
120} // namespace Thyra
121
122#endif
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)