Tempus  Version of the Day
Time Integration
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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 
19 namespace Thyra {
20 
25 template <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:
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 
106 template <typename Scalar>
107 RCP<ImplicitAdjointModelEvaluator<Scalar> > implicitAdjointModelEvaluator(
108  const RCP<const ModelEvaluator<Scalar> >& model)
109 {
111 }
112 
113 template <typename Scalar>
114 RCP<ImplicitAdjointModelEvaluator<Scalar> > implicitAdjointModelEvaluator(
115  const RCP<ModelEvaluator<Scalar> >& model)
116 {
118 }
119 
120 } // namespace Thyra
121 
122 #endif
Concrete PreconditionerBase subclass that wraps a preconditioner operator in MultiVectorLinearOp.
RCP< PreconditionerBase< Scalar > > create_W_prec() const
Create adjoint preconditioner.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
RCP< const LinearOpWithSolveFactoryBase< Scalar > > get_W_factory() const
Get adjoint solver factory.
RCP< ImplicitAdjointModelEvaluator< Scalar > > implicitAdjointModelEvaluator(const RCP< const ModelEvaluator< Scalar > > &model)
RCP< LinearOpBase< Scalar > > create_W_op() const
Create adjoint op.
RCP< LinearOpWithSolveBase< Scalar > > get_W() const
virtual ~ImplicitAdjointModelEvaluator()=default
Destructor.
An implementation of AdjointModelEvaluatorBase that creates an implicit adjoint from the supplied mod...
RCP< PreconditionerBase< Scalar > > get_W_prec() const
RCP< LinearOpWithSolveBase< Scalar > > create_W() const
Create adjoint solver.
ImplicitAdjointModelEvaluator(const RCP< const ModelEvaluator< Scalar > > &model)
Constructor.
void evalModelImpl(const ModelEvaluatorBase::InArgs< Scalar > &inArgs, const ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
RCP< LinearOpBase< Scalar > > get_W_op() const
ImplicitAdjointModelEvaluator(const RCP< ModelEvaluator< Scalar > > &model)
Constructor.