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: 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 
18 namespace Thyra {
19 
24 template <typename Scalar>
26  public ModelEvaluatorDelegatorBase<Scalar>{
27 public:
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 
64 private:
65 
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 
103 template <typename Scalar>
104 RCP<ImplicitAdjointModelEvaluator<Scalar> > implicitAdjointModelEvaluator(
105  const RCP<const ModelEvaluator<Scalar> >& model)
106 {
108 }
109 
110 template <typename Scalar>
111 RCP<ImplicitAdjointModelEvaluator<Scalar> > implicitAdjointModelEvaluator(
112  const RCP<ModelEvaluator<Scalar> >& model)
113 {
115 }
116 
117 } // namespace Thyra
118 
119 #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.