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: Copyright (2017) Sandia Corporation
4//
5// Distributed under BSD 3-clause license (See accompanying file Copyright.txt)
6// ****************************************************************************
7// @HEADER
8
9#ifndef Thyra_ImplicitAdjointModelEvaluator_hpp
10#define Thyra_ImplicitAdjointModelEvaluator_hpp
11
12#include "Thyra_ModelEvaluatorDelegatorBase.hpp"
13#include "Thyra_DefaultScaledAdjointLinearOp.hpp"
14#include "Thyra_DefaultAdjointLinearOpWithSolve.hpp"
17
18namespace Thyra {
19
24template <typename Scalar>
26 public ModelEvaluatorDelegatorBase<Scalar>{
27public:
28
31 const RCP<const ModelEvaluator<Scalar> >& model) :
32 ModelEvaluatorDelegatorBase<Scalar>(model) {}
33
36 const RCP<ModelEvaluator<Scalar> >& model) :
37 ModelEvaluatorDelegatorBase<Scalar>(model) {}
38
40 virtual ~ImplicitAdjointModelEvaluator() = default;
41
43 RCP<LinearOpWithSolveBase<Scalar> > create_W() const {
44 return nonconstAdjointLows(this->getUnderlyingModel()->create_W());
45 }
46
48 RCP<LinearOpBase<Scalar> > create_W_op() const {
49 return nonconstAdjoint(this->getUnderlyingModel()->create_W_op());
50 }
51
53 RCP<PreconditionerBase<Scalar> > create_W_prec() const {
54 return nonconstAdjointPreconditioner(
55 this->getUnderlyingModel()->create_W_prec());
56 }
57
59 RCP<const LinearOpWithSolveFactoryBase<Scalar> > get_W_factory() const {
60 return adjointLinearOpWithSolveFactory(
61 this->getUnderlyingModel()->get_W_factory());
62 }
63
64private:
65
67 const ModelEvaluatorBase::InArgs<Scalar> &inArgs,
68 const ModelEvaluatorBase::OutArgs<Scalar> &outArgs) const
69 {
70 typedef Thyra::ModelEvaluatorBase MEB;
71 MEB::OutArgs<Scalar> model_outArgs =
72 this->getUnderlyingModel()->createOutArgs();;
73
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());
80 }
81
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());
88 }
89
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());
96 }
97
98 this->getUnderlyingModel()->evalModel(inArgs, model_outArgs);
99 }
100
101};
102
103template <typename Scalar>
104RCP<ImplicitAdjointModelEvaluator<Scalar> > implicitAdjointModelEvaluator(
105 const RCP<const ModelEvaluator<Scalar> >& model)
106{
107 return Teuchos::rcp(new ImplicitAdjointModelEvaluator<Scalar>(model));
108}
109
110template <typename Scalar>
111RCP<ImplicitAdjointModelEvaluator<Scalar> > implicitAdjointModelEvaluator(
112 const RCP<ModelEvaluator<Scalar> >& model)
113{
114 return Teuchos::rcp(new ImplicitAdjointModelEvaluator<Scalar>(model));
115}
116
117} // namespace Thyra
118
119#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)