Tempus  Version of the Day
Time Integration
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Tempus_WrapperModelEvaluatorPairIMEX_Basic_impl.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 Tempus_ModelEvaluatorIMEXPair_Basic_impl_hpp
10 #define Tempus_ModelEvaluatorIMEXPair_Basic_impl_hpp
11 
12 #include "Thyra_ProductVectorBase.hpp"
13 #include "Thyra_ProductVectorSpaceBase.hpp"
14 
15 namespace Tempus {
16 
17 template <typename Scalar>
19 {
20  using Teuchos::RCP;
21  using Teuchos::rcp_const_cast;
22 
24  index_ = -1;
25 
26  typedef Thyra::ModelEvaluatorBase MEB;
27  MEB::InArgs<Scalar> inArgs = implicitModel_->getNominalValues();
28  x_ = rcp_const_cast<Thyra::VectorBase<Scalar> >(inArgs.get_x());
29 
30  if (inArgs.supports(MEB::IN_ARG_x_dot)) {
31  xDot_ = rcp_const_cast<Thyra::VectorBase<Scalar> >(inArgs.get_x_dot());
32  }
33  else {
34  xDot_ = Teuchos::null;
35  }
36 
37  // A Thyra::VectorSpace requirement
39  !(explicitModel_->get_x_space()->isCompatible(
40  *(implicitModel_->get_x_space()))),
41  std::logic_error,
42  "Error - WrapperModelEvaluatorPairIMEX_Basic::initialize()\n"
43  << " Explicit and Implicit vector x spaces are incompatible!\n"
44  << " Explicit vector x space = "
45  << *(explicitModel_->get_x_space())
46  << "\n Implicit vector x space = "
47  << *(implicitModel_->get_x_space()) << "\n");
48 
49  // A Thyra::VectorSpace requirement
51  !(explicitModel_->get_f_space()->isCompatible(
52  *(implicitModel_->get_f_space()))),
53  std::logic_error,
54  "Error - WrapperModelEvaluatorPairIMEX_Basic::initialize()\n"
55  << " Explicit and Implicit vector f spaces are incompatible!\n"
56  << " Explicit vector f space = "
57  << *(explicitModel_->get_f_space())
58  << "\n Implicit vector f space = "
59  << *(implicitModel_->get_f_space()) << "\n");
60 }
61 
62 template <typename Scalar>
64  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& /* me */)
65 {
67  true, std::logic_error,
68  "Error - WrapperModelEvaluatorPairIMEX_Basic<Scalar>::setAppModel\n"
69  " should not be used. One should instead use setExplicitModel,\n"
70  " setImplicitModel, or create a new WrapperModelEvaluatorPairIMEX.\n");
71 }
72 
73 template <typename Scalar>
76 {
78  true, std::logic_error,
79  "Error - WrapperModelEvaluatorPairIMEX_Basic<Scalar>::getAppModel\n"
80  " should not be used. One should instead use getExplicitModel,\n"
81  " getImplicitModel, or directly use this WrapperModelEvaluatorPairIMEX\n"
82  " object.\n");
83 }
84 
85 template <typename Scalar>
88 {
89  return this->implicitModel_->get_x_space();
90 }
91 
92 template <typename Scalar>
95 {
96  return this->implicitModel_->get_g_space(i);
97 }
98 
99 template <typename Scalar>
102 {
103  return this->implicitModel_->get_p_space(i);
104 }
105 
106 template <typename Scalar>
109 {
110  typedef Thyra::ModelEvaluatorBase MEB;
111  MEB::InArgsSetup<Scalar> inArgs = this->createInArgs();
112  return std::move(inArgs);
113 }
114 
115 template <typename Scalar>
118 {
119  typedef Thyra::ModelEvaluatorBase MEB;
120  // MEB::InArgsSetup<Scalar> inArgs(implicitModel_->createInArgs());
121  MEB::InArgsSetup<Scalar> inArgs(implicitModel_->getNominalValues());
122 
123  inArgs.set_x(x_);
124  if (y_ != Teuchos::null) inArgs.set_p(index_, y_);
125  if (inArgs.supports(MEB::IN_ARG_x_dot)) inArgs.set_x_dot(xDot_);
126  if (inArgs.supports(MEB::IN_ARG_t)) inArgs.set_t(time_);
127  if (inArgs.supports(MEB::IN_ARG_step_size))
128  inArgs.set_step_size(p_->timeStepSize_);
129  if (inArgs.supports(MEB::IN_ARG_alpha)) inArgs.set_alpha(p_->alpha_);
130  if (inArgs.supports(MEB::IN_ARG_beta)) inArgs.set_beta(p_->beta_);
131  if (inArgs.supports(MEB::IN_ARG_stage_number))
132  inArgs.set_stage_number(p_->stageNumber_);
133 
134  inArgs.setModelEvalDescription(this->description());
135  return std::move(inArgs);
136 }
137 
138 template <typename Scalar>
141 {
142  typedef Thyra::ModelEvaluatorBase MEB;
143  MEB::OutArgsSetup<Scalar> outArgs(implicitModel_->createOutArgs());
144  outArgs.setModelEvalDescription(this->description());
145  return std::move(outArgs);
146 }
147 
148 template <typename Scalar>
151  const Thyra::ModelEvaluatorBase::OutArgs<Scalar>& outArgs) const
152 {
153  typedef Thyra::ModelEvaluatorBase MEB;
154  using Teuchos::RCP;
155 
156  RCP<const Thyra::VectorBase<Scalar> > x = inArgs.get_x();
157  RCP<Thyra::VectorBase<Scalar> > x_dot = Thyra::createMember(get_x_space());
158  timeDer_->compute(x, x_dot);
159 
160  MEB::InArgs<Scalar> appImplicitInArgs(inArgs);
161  MEB::OutArgs<Scalar> appImplicitOutArgs(outArgs);
162  appImplicitInArgs.set_x_dot(x_dot);
163 
164  implicitModel_->evalModel(appImplicitInArgs, appImplicitOutArgs);
165 }
166 
167 } // end namespace Tempus
168 
169 #endif // Tempus_ModelEvaluatorIMEXPair_Basic_impl_hpp
virtual Thyra::ModelEvaluatorBase::OutArgs< Scalar > createOutArgsImpl() const
virtual Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > getAppModel() const
Get the underlying application ModelEvaluator.
virtual Thyra::ModelEvaluatorBase::InArgs< Scalar > createInArgs() const
virtual Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_g_space(int i) const
Get the g space.
virtual void evalModelImpl(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &in, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &out) const
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
virtual Thyra::ModelEvaluatorBase::InArgs< Scalar > getNominalValues() const
virtual void initialize()
Initialize after setting member data.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
virtual void setAppModel(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &me)
Set the underlying application ModelEvaluator.
virtual Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_p_space(int i) const
Get the p space.
virtual Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_x_space() const
Get the x-solution space.
RCP< const VectorBase< Scalar > > get_x() const