Tempus  Version of the Day
Time Integration
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Tempus_AuxiliaryIntegralModelEvaluator_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_AuxiliaryIntegralModelEvaluator_impl_hpp
10 #define Tempus_AuxiliaryIntegralModelEvaluator_impl_hpp
11 
14 #include "Thyra_VectorStdOps.hpp"
15 
16 namespace Tempus {
17 
18 template <typename Scalar>
20  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> > &model,
21  const int g_index)
22  : model_(model),
23  g_index_(g_index),
24  t_interp_(Teuchos::ScalarTraits<Scalar>::rmax())
25 {
26  typedef Thyra::ModelEvaluatorBase MEB;
27 
28  space_ = model_->get_g_space(g_index);
29 
30  MEB::InArgs<Scalar> me_inArgs = model_->createInArgs();
31  MEB::InArgsSetup<Scalar> inArgs;
32  inArgs.setModelEvalDescription(this->description());
33  inArgs.setSupports(MEB::IN_ARG_x);
34  inArgs.setSupports(MEB::IN_ARG_t);
35  if (me_inArgs.supports(MEB::IN_ARG_x_dot))
36  inArgs.setSupports(MEB::IN_ARG_x_dot);
37  inArgs.setSupports(MEB::IN_ARG_alpha);
38  inArgs.setSupports(MEB::IN_ARG_beta);
39  inArgs.set_Np(me_inArgs.Np());
40  prototypeInArgs_ = inArgs;
41 
42  MEB::OutArgs<Scalar> me_outArgs = model_->createOutArgs();
43  MEB::OutArgsSetup<Scalar> outArgs;
44  outArgs.setModelEvalDescription(this->description());
45  outArgs.set_Np_Ng(me_inArgs.Np(), 0);
46  outArgs.setSupports(MEB::OUT_ARG_f);
47  outArgs.setSupports(MEB::OUT_ARG_W_op);
48  prototypeOutArgs_ = outArgs;
49 }
50 
51 template <typename Scalar>
54 {
55  sh_ = sh;
57  forward_state_ = Teuchos::null;
58 }
59 
60 template <typename Scalar>
63 {
64  TEUCHOS_ASSERT(p < model_->Np());
65  return model_->get_p_space(p);
66 }
67 
68 template <typename Scalar>
71 {
72  TEUCHOS_ASSERT(p < model_->Np());
73  return model_->get_p_names(p);
74 }
75 
76 template <typename Scalar>
79 {
80  return space_;
81 }
82 
83 template <typename Scalar>
86 {
87  return space_;
88 }
89 
90 template <typename Scalar>
93 {
94  return Thyra::scaledIdentity(space_, Scalar(1.0));
95 }
96 
97 template <typename Scalar>
100 {
101  return Thyra::scaledIdentitySolveFactory(space_, Scalar(1.0));
102 }
103 
104 template <typename Scalar>
107 {
108  return prototypeInArgs_;
109 }
110 
111 template <typename Scalar>
114 {
115  typedef Thyra::ModelEvaluatorBase MEB;
116  using Teuchos::RCP;
117  using Teuchos::rcp_dynamic_cast;
118 
119  MEB::InArgs<Scalar> me_nominal = model_->getNominalValues();
120  MEB::InArgs<Scalar> nominal = this->createInArgs();
121 
122  const Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
123 
124  // Set initial x, x_dot
125  RCP<Thyra::VectorBase<Scalar> > x = Thyra::createMember(*space_);
126  Thyra::assign(x.ptr(), zero);
127  nominal.set_x(x);
128 
129  if (me_nominal.supports(MEB::IN_ARG_x_dot)) {
130  RCP<Thyra::VectorBase<Scalar> > x_dot = Thyra::createMember(*space_);
131  Thyra::assign(x_dot.ptr(), zero);
132  nominal.set_x_dot(x_dot);
133  }
134 
135  const int np = model_->Np();
136  for (int i = 0; i < np; ++i) nominal.set_p(i, me_nominal.get_p(i));
137 
138  return nominal;
139 }
140 
141 template <typename Scalar>
144 {
145  return prototypeOutArgs_;
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  using Teuchos::rcp_dynamic_cast;
156 
157  // Interpolate forward solution at supplied time, reusing previous
158  // interpolation if possible
159  TEUCHOS_ASSERT(sh_ != Teuchos::null);
160  const Scalar t = inArgs.get_t();
161  if (forward_state_ == Teuchos::null || t_interp_ != t) {
162  if (forward_state_ == Teuchos::null)
163  forward_state_ = sh_->interpolateState(t);
164  else
165  sh_->interpolateState(t, forward_state_.get());
166  t_interp_ = t;
167  }
168 
169  // Residual
170  RCP<Thyra::VectorBase<Scalar> > f = outArgs.get_f();
171  if (f != Teuchos::null) {
172  MEB::InArgs<Scalar> me_inArgs = model_->getNominalValues();
173  me_inArgs.set_x(forward_state_->getX());
174  if (me_inArgs.supports(MEB::IN_ARG_x_dot))
175  me_inArgs.set_x_dot(forward_state_->getXDot());
176  if (me_inArgs.supports(MEB::IN_ARG_t)) me_inArgs.set_t(t);
177  const int np = me_inArgs.Np();
178  for (int i = 0; i < np; ++i) me_inArgs.set_p(i, inArgs.get_p(i));
179 
180  MEB::OutArgs<Scalar> me_outArgs = model_->createOutArgs();
181  me_outArgs.set_g(g_index_, f);
182 
183  model_->evalModel(me_inArgs, me_outArgs);
184 
185  // For explicit form, f = g and we are done
186  // For implicit form, f = dz/dt - g
187  if (inArgs.supports(MEB::IN_ARG_x_dot)) {
188  RCP<const Thyra::VectorBase<Scalar> > x_dot = inArgs.get_x_dot();
189  if (x_dot != Teuchos::null) Thyra::V_VmV(f.ptr(), *x_dot, *f);
190  }
191  }
192 
193  // W = alpha*df/z_dot + beta*df/dz = alpha * I
194  RCP<Thyra::LinearOpBase<Scalar> > op = outArgs.get_W_op();
195  if (op != Teuchos::null) {
196  const Scalar alpha = inArgs.get_alpha();
197  RCP<Thyra::ScaledIdentityLinearOpWithSolve<Scalar> > si_op =
198  rcp_dynamic_cast<Thyra::ScaledIdentityLinearOpWithSolve<Scalar> >(op);
199  si_op->setScale(alpha);
200  }
201 }
202 
203 } // namespace Tempus
204 
205 #endif
Implicit concrete LinearOpBase subclass that takes a flattended out multi-vector and performs a multi...
AuxiliaryIntegralModelEvaluator(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model, const int g_index)
Constructor.
Thyra::ModelEvaluatorBase::InArgs< Scalar > createInArgs() const
RCP< const VectorBase< Scalar > > get_x_dot() const
Thyra::ModelEvaluatorBase::InArgs< Scalar > prototypeInArgs_
Teuchos::RCP< const Thyra::LinearOpWithSolveFactoryBase< Scalar > > get_W_factory() const
Thyra::ModelEvaluatorBase::OutArgs< Scalar > createOutArgsImpl() const
Evaluation< VectorBase< Scalar > > get_f() const
static magnitudeType rmax()
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_f_space() const
void setForwardSolutionHistory(const Teuchos::RCP< const Tempus::SolutionHistory< Scalar > > &sh)
Set solution history from forward evaluation.
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > space_
virtual std::string description() const
Teuchos::RCP< const Teuchos::Array< std::string > > get_p_names(int p) const
void evalModelImpl(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
Thyra::ModelEvaluatorBase::OutArgs< Scalar > prototypeOutArgs_
Thyra::ModelEvaluatorBase::InArgs< Scalar > getNominalValues() const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_x_space() const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_p_space(int p) const
#define TEUCHOS_ASSERT(assertion_test)
Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > model_
bool supports(EInArgsMembers arg) const
Teuchos::RCP< Thyra::LinearOpBase< Scalar > > create_W_op() const
RCP< LinearOpBase< Scalar > > get_W_op() const
RCP< const VectorBase< Scalar > > get_p(int l) const