Tempus  Version of the Day
Time Integration
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Tempus_WrapperModelEvaluatorPairPartIMEX_StaggeredFSA_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_ModelEvaluatorPairPartIMEX_StaggeredFSA_impl_hpp
10 #define Tempus_ModelEvaluatorPairPartIMEX_StaggeredFSA_impl_hpp
11 
12 #include "Thyra_VectorStdOps.hpp"
13 #include "Thyra_MultiVectorStdOps.hpp"
14 
15 namespace Tempus {
16 
17 template <typename Scalar>
21  Scalar> >& forwardModel,
22  const bool is_pseudotransient,
24  : forwardModel_(forwardModel),
25  use_dfdp_as_tangent_(false),
26  y_tangent_index_(3)
27 {
28  using Teuchos::RCP;
29  using Teuchos::rcp;
30  using Thyra::multiVectorProductVectorSpace;
31 
32  RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
33  if (pList != Teuchos::null) *pl = *pList;
35  use_dfdp_as_tangent_ = pl->get<bool>("Use DfDp as Tangent");
36  y_tangent_index_ = pl->get<int>("Sensitivity Y Tangent Index");
37  pl->remove("Sensitivity Y Tangent Index");
38 
39  appExplicitModel_ = forwardModel_->getExplicitModel();
40  appImplicitModel_ = forwardModel_->getImplicitModel();
42  appExplicitModel_, is_pseudotransient, pl));
44  appImplicitModel_, is_pseudotransient, pl));
45 
46  const int y_param_index = forwardModel_->getParameterIndex();
47  const int sens_param_index = pl->get<int>("Sensitivity Parameter Index");
48  const int num_sens_param =
49  appImplicitModel_->get_p_space(sens_param_index)->dim();
50  RCP<const Thyra::VectorSpaceBase<Scalar> > explicit_y_space =
51  appImplicitModel_->get_p_space(y_param_index);
52  RCP<const Thyra::VectorSpaceBase<Scalar> > implicit_x_space =
53  appImplicitModel_->get_x_space();
55  multiVectorProductVectorSpace(explicit_y_space, num_sens_param);
57  multiVectorProductVectorSpace(implicit_x_space, num_sens_param);
58 
60  forwardModel_->getNumExplicitOnlyBlocks(), y_param_index);
61 }
62 
63 template <typename Scalar>
65 {
66  using Teuchos::RCP;
67  using Teuchos::rcp_dynamic_cast;
68 
69  this->useImplicitModel_ = true;
70  this->wrapperImplicitInArgs_ = this->createInArgs();
71  this->wrapperImplicitOutArgs_ = this->createOutArgs();
72  this->useImplicitModel_ = false;
73 
74  RCP<const Thyra::VectorBase<Scalar> > z =
75  this->explicitModel_->getNominalValues().get_x();
76 
77  // A Thyra::VectorSpace requirement
79  !(getIMEXVector(z)->space()->isCompatible(
80  *(this->implicitModel_->get_x_space()))),
81  std::logic_error,
82  "Error - WrapperModelEvaluatorPairIMEX_StaggeredFSA::initialize()\n"
83  << " Explicit and Implicit vector x spaces are incompatible!\n"
84  << " Explicit vector x space = "
85  << *(getIMEXVector(z)->space())
86  << "\n Implicit vector x space = "
87  << *(this->implicitModel_->get_x_space()) << "\n");
88 
89  // Valid number of blocks?
90  const RCP<const DMVPV> z_dmvpv = rcp_dynamic_cast<const DMVPV>(z, true);
91  const RCP<const Thyra::MultiVectorBase<Scalar> > z_mv =
92  z_dmvpv->getMultiVector();
93  RCP<const PMVB> zPVector = rcp_dynamic_cast<const PMVB>(z_mv);
95  zPVector == Teuchos::null, std::logic_error,
96  "Error - WrapperModelEvaluatorPairPartIMEX_StaggeredFSA::initialize()\n"
97  " was given a VectorBase that could not be cast to a\n"
98  " ProductVectorBase!\n");
99 
100  int numBlocks = zPVector->productSpace()->numBlocks();
101 
102  TEUCHOS_TEST_FOR_EXCEPTION(
103  !(0 <= this->numExplicitOnlyBlocks_ &&
104  this->numExplicitOnlyBlocks_ < numBlocks),
105  std::logic_error,
106  "Error - WrapperModelEvaluatorPairPartIMEX_StaggeredFSA::initialize()\n"
107  << "Invalid number of explicit-only blocks = "
108  << this->numExplicitOnlyBlocks_
109  << "\nShould be in the interval [0, numBlocks) = [0, "
110  << numBlocks << ")\n");
111 }
112 
113 template <typename Scalar>
116 {
117  if (this->useImplicitModel_) {
118  if (i == this->parameterIndex_)
119  return explicit_dydp_prod_space_;
120  else
121  return appImplicitModel_->get_p_space(i);
122  }
123 
124  return appExplicitModel_->get_p_space(i);
125 }
126 
127 template <typename Scalar>
130  const Teuchos::RCP<Thyra::VectorBase<Scalar> >& full) const
131 {
132  using Teuchos::RCP;
133  using Teuchos::rcp_dynamic_cast;
135  using Thyra::multiVectorProductVector;
136  using Thyra::VectorBase;
137 
138  // StaggeredFSA ME stores vectors as DMVPV's. To extract the implicit
139  // part of the vector, cast it to DMVPV, extract the multi-vector,
140  // cast it to a product multi-vector, extract the IMEX block, then
141  // create a DMVPV from it.
142 
143  if (full == Teuchos::null) return Teuchos::null;
144 
145  if (this->numExplicitOnlyBlocks_ == 0) return full;
146 
147  const RCP<DMVPV> full_dmvpv = rcp_dynamic_cast<DMVPV>(full, true);
148  const RCP<MultiVectorBase<Scalar> > full_mv =
149  full_dmvpv->getNonconstMultiVector();
150  const RCP<PMVB> blk_full_mv = rcp_dynamic_cast<PMVB>(full_mv, true);
151 
152  // special case where the implicit terms are not blocked
153  const int numBlocks = blk_full_mv->productSpace()->numBlocks();
154  const int numExplicitBlocks = this->numExplicitOnlyBlocks_;
155  if (numBlocks == numExplicitBlocks + 1) {
156  const RCP<MultiVectorBase<Scalar> > imex_mv =
157  blk_full_mv->getNonconstMultiVectorBlock(numExplicitBlocks);
158  return multiVectorProductVector(imex_dxdp_prod_space_, imex_mv);
159  }
160 
161  // Not supposed to get here, apparently
162  TEUCHOS_ASSERT(false);
163  return Teuchos::null;
164 }
165 
166 template <typename Scalar>
169  const Teuchos::RCP<const Thyra::VectorBase<Scalar> >& full) const
170 {
171  using Teuchos::RCP;
172  using Teuchos::rcp_dynamic_cast;
174  using Thyra::multiVectorProductVector;
175  using Thyra::VectorBase;
176 
177  // StaggeredFSA ME stores vectors as DMVPV's. To extract the implicit
178  // part of the vector, cast it to DMVPV, extract the multi-vector,
179  // cast it to a product multi-vector, extract the IMEX block, then
180  // create a DMVPV from it.
181 
182  if (full == Teuchos::null) return Teuchos::null;
183 
184  if (this->numExplicitOnlyBlocks_ == 0) return full;
185 
186  const RCP<const DMVPV> full_dmvpv = rcp_dynamic_cast<const DMVPV>(full, true);
187  const RCP<const MultiVectorBase<Scalar> > full_mv =
188  full_dmvpv->getMultiVector();
189  const RCP<const PMVB> blk_full_mv =
190  rcp_dynamic_cast<const PMVB>(full_mv, true);
191 
192  // special case where the implicit terms are not blocked
193  const int numBlocks = blk_full_mv->productSpace()->numBlocks();
194  const int numExplicitBlocks = this->numExplicitOnlyBlocks_;
195  if (numBlocks == numExplicitBlocks + 1) {
196  const RCP<const MultiVectorBase<Scalar> > imex_mv =
197  blk_full_mv->getMultiVectorBlock(numExplicitBlocks);
198  return multiVectorProductVector(imex_dxdp_prod_space_, imex_mv);
199  }
200 
201  // Not supposed to get here, apparently
202  TEUCHOS_ASSERT(false);
203  return Teuchos::null;
204 }
205 
206 template <typename Scalar>
209  const Teuchos::RCP<Thyra::VectorBase<Scalar> >& full) const
210 {
211  using Teuchos::RCP;
212  using Teuchos::rcp_dynamic_cast;
214  using Thyra::multiVectorProductVector;
215  using Thyra::multiVectorProductVectorSpace;
216  using Thyra::VectorBase;
217 
218  // StaggeredFSA ME stores vectors as DMVPV's. To extract the explicit
219  // part of the vector, cast it to DMVPV, extract the multi-vector,
220  // cast it to a product multi-vector, extract the explicit block, then
221  // create a DMVPV from it.
222 
223  if (full == Teuchos::null) return Teuchos::null;
224 
225  if (this->numExplicitOnlyBlocks_ == 0) return full;
226 
227  const RCP<DMVPV> full_dmvpv = rcp_dynamic_cast<DMVPV>(full, true);
228  const RCP<MultiVectorBase<Scalar> > full_mv =
229  full_dmvpv->getNonconstMultiVector();
230  const RCP<PMVB> blk_full_mv = rcp_dynamic_cast<PMVB>(full_mv, true);
231 
232  // special case where the explicit terms are not blocked
233  const int numExplicitBlocks = this->numExplicitOnlyBlocks_;
234  if (numExplicitBlocks == 1) {
235  const RCP<MultiVectorBase<Scalar> > explicit_mv =
236  blk_full_mv->getNonconstMultiVectorBlock(0);
237  return multiVectorProductVector(explicit_dydp_prod_space_, explicit_mv);
238  }
239 
240  // Not supposed to get here, apparently
241  TEUCHOS_ASSERT(false);
242  return Teuchos::null;
243 }
244 
245 template <typename Scalar>
248  const Teuchos::RCP<const Thyra::VectorBase<Scalar> >& full) const
249 {
250  using Teuchos::RCP;
251  using Teuchos::rcp_dynamic_cast;
253  using Thyra::multiVectorProductVector;
254  using Thyra::multiVectorProductVectorSpace;
255  using Thyra::VectorBase;
256 
257  // StaggeredFSA ME stores vectors as DMVPV's. To extract the explicit
258  // part of the vector, cast it to DMVPV, extract the multi-vector,
259  // cast it to a product multi-vector, extract the explicit block, then
260  // create a DMVPV from it.
261 
262  if (full == Teuchos::null) return Teuchos::null;
263 
264  if (this->numExplicitOnlyBlocks_ == 0) return full;
265 
266  const RCP<const DMVPV> full_dmvpv = rcp_dynamic_cast<const DMVPV>(full, true);
267  const RCP<const MultiVectorBase<Scalar> > full_mv =
268  full_dmvpv->getMultiVector();
269  const RCP<const PMVB> blk_full_mv =
270  rcp_dynamic_cast<const PMVB>(full_mv, true);
271 
272  // special case where the explicit terms are not blocked
273  const int numExplicitBlocks = this->numExplicitOnlyBlocks_;
274  if (numExplicitBlocks == 1) {
275  const RCP<const MultiVectorBase<Scalar> > explicit_mv =
276  blk_full_mv->getMultiVectorBlock(0);
277  return multiVectorProductVector(explicit_dydp_prod_space_, explicit_mv);
278  }
279 
280  // Not supposed to get here, apparently
281  TEUCHOS_ASSERT(false);
282  return Teuchos::null;
283 }
284 
285 template <typename Scalar>
288 {
289  return forwardModel_;
290 }
291 
292 template <typename Scalar>
296 {
297  sh_ = sh;
299  fsaExplicitModel_->setForwardSolutionHistory(sh);
300  // We handle interpolation for fsaImplicitModel in evalModelImpl()
301 }
302 
303 template <typename Scalar>
307 {
308  sh_ = Teuchos::null;
309  forward_state_ = s;
310  buildIMEXStates();
311  fsaExplicitModel_->setForwardSolutionState(s);
312  fsaImplicitModel_->setForwardSolutionState(implicit_x_state_);
313 }
314 
315 template <typename Scalar>
318  const bool force_W_update)
319 {
320  // Make sure we have the useImplicitModel_ flag set since
321  // force_W_update = true will force a model evaluation
322  bool tf = forwardModel_->getUseImplicitModel();
324  nc_forwardModel = Teuchos::rcp_const_cast<
326  nc_forwardModel->setUseImplicitModel(true);
327  fsaImplicitModel_->setSolver(solver, force_W_update);
328  nc_forwardModel->setUseImplicitModel(tf);
329 }
330 
331 template <typename Scalar>
334 {
335  using Teuchos::RCP;
336  using Teuchos::rcp_dynamic_cast;
337  using Thyra::createMember;
338 
339  Thyra::ModelEvaluatorBase::InArgs<Scalar> inArgs = Base::createInArgs();
340 
341  // Set p to be the correct product vector form for the explicit only vector y
342  if (this->useImplicitModel_ == true) {
343  if (inArgs.get_p(this->parameterIndex_) != Teuchos::null) {
344  RCP<DMVPV> dydp = rcp_dynamic_cast<DMVPV>(
345  createMember(*explicit_dydp_prod_space_), true);
346  Thyra::assign(dydp->getNonconstMultiVector().ptr(), Scalar(0.0));
347  inArgs.set_p(this->parameterIndex_, dydp);
348  }
349  }
350  return inArgs;
351 }
352 
353 template <typename Scalar>
356  const Thyra::ModelEvaluatorBase::OutArgs<Scalar>& outArgs) const
357 {
358  typedef Thyra::ModelEvaluatorBase MEB;
359  using Teuchos::Range1D;
360  using Teuchos::RCP;
361  using Teuchos::rcp_dynamic_cast;
362 
363  // Interpolate forward solution at supplied time, reusing previous
364  // interpolation if possible
365  Scalar forward_t;
366  if (sh_ != Teuchos::null) {
367  forward_t = inArgs.get_t();
368  if (t_interp_ != forward_t) {
369  if (nc_forward_state_ == Teuchos::null)
370  nc_forward_state_ = sh_->interpolateState(forward_t);
371  else
372  sh_->interpolateState(forward_t, nc_forward_state_.get());
373  forward_state_ = nc_forward_state_;
374  t_interp_ = forward_t;
375  buildIMEXStates();
376  fsaImplicitModel_->setForwardSolutionState(implicit_x_state_);
377  }
378  }
379  else {
380  TEUCHOS_ASSERT(forward_state_ != Teuchos::null);
381  forward_t = forward_state_->getTime();
382  }
383 
384  const int p_index = this->parameterIndex_;
385 
386  //
387  // From Base::evalModelImpl()
388  //
389  RCP<const Thyra::VectorBase<Scalar> > x = inArgs.get_x();
390  RCP<Thyra::VectorBase<Scalar> > x_dot =
391  Thyra::createMember(fsaImplicitModel_->get_x_space());
392  this->timeDer_->compute(x, x_dot);
393 
394  MEB::InArgs<Scalar> fsaImplicitInArgs(this->wrapperImplicitInArgs_);
395  MEB::OutArgs<Scalar> fsaImplicitOutArgs(this->wrapperImplicitOutArgs_);
396  if (fsaImplicitInArgs.supports(MEB::IN_ARG_t))
397  fsaImplicitInArgs.set_t(inArgs.get_t());
398  fsaImplicitInArgs.set_x(x);
399  fsaImplicitInArgs.set_x_dot(x_dot);
400  for (int i = 0; i < fsaImplicitModel_->Np(); ++i) {
401  // Copy over parameters except for the parameter for explicit-only vector!
402  if ((inArgs.get_p(i) != Teuchos::null) && (i != p_index))
403  fsaImplicitInArgs.set_p(i, inArgs.get_p(i));
404  }
405 
406  // p-vector for index parameterIndex_ is part of the IMEX solution vector,
407  // and therefore is an n column multi-vector where n is the number of
408  // sensitivity parameters. Pull out the sensitivity components before
409  // passing along to the ME, then use them for adding in dg/dy*dy/dp term.
410  TEUCHOS_ASSERT(explicit_y_state_ != Teuchos::null);
411  RCP<const Thyra::VectorBase<Scalar> > y = explicit_y_state_->getX();
412  RCP<const Thyra::MultiVectorBase<Scalar> > dydp;
413  if (fsaImplicitInArgs.get_p(p_index) != Teuchos::null) {
414  RCP<const Thyra::VectorBase<Scalar> > p = fsaImplicitInArgs.get_p(p_index);
415  dydp = rcp_dynamic_cast<const DMVPV>(p, true)->getMultiVector();
416  fsaImplicitInArgs.set_p(p_index, y);
417  }
418  if (use_dfdp_as_tangent_) {
419  RCP<const Thyra::VectorBase<Scalar> > dydp_vec =
420  Thyra::multiVectorProductVector(explicit_dydp_prod_space_, dydp);
421  fsaImplicitInArgs.set_p(y_tangent_index_, dydp_vec);
422  }
423 
424  fsaImplicitOutArgs.set_f(outArgs.get_f());
425  fsaImplicitOutArgs.set_W_op(outArgs.get_W_op());
426 
427  fsaImplicitModel_->evalModel(fsaImplicitInArgs, fsaImplicitOutArgs);
428 
429  // Compute derivative of implicit residual with respect to explicit only
430  // vector y, which is passed as a parameter
431  if (!use_dfdp_as_tangent_ && outArgs.get_f() != Teuchos::null) {
432  MEB::InArgs<Scalar> appImplicitInArgs =
433  appImplicitModel_->getNominalValues();
434  TEUCHOS_ASSERT(forward_state_ != Teuchos::null);
435  RCP<const Thyra::VectorBase<Scalar> > app_x = implicit_x_state_->getX();
436  RCP<const Thyra::VectorBase<Scalar> > app_x_dot =
437  implicit_x_state_->getXDot();
438  appImplicitInArgs.set_x(app_x);
439  appImplicitInArgs.set_x_dot(app_x_dot);
440  for (int i = 0; i < appImplicitModel_->Np(); ++i) {
441  if (i != p_index) appImplicitInArgs.set_p(i, inArgs.get_p(i));
442  }
443  appImplicitInArgs.set_p(p_index, y);
444  if (appImplicitInArgs.supports(MEB::IN_ARG_t))
445  appImplicitInArgs.set_t(forward_t);
446  MEB::OutArgs<Scalar> appImplicitOutArgs =
447  appImplicitModel_->createOutArgs();
448  MEB::DerivativeSupport dfdp_support =
449  appImplicitOutArgs.supports(MEB::OUT_ARG_DfDp, p_index);
451  if (dfdp_support.supports(MEB::DERIV_LINEAR_OP)) {
452  if (my_dfdp_op_ == Teuchos::null)
453  my_dfdp_op_ = appImplicitModel_->create_DfDp_op(p_index);
454  appImplicitOutArgs.set_DfDp(p_index,
455  MEB::Derivative<Scalar>(my_dfdp_op_));
456  trans = Thyra::NOTRANS;
457  }
458  else if (dfdp_support.supports(MEB::DERIV_MV_JACOBIAN_FORM)) {
459  if (my_dfdp_mv_ == Teuchos::null)
460  my_dfdp_mv_ = Thyra::createMembers(
461  appImplicitModel_->get_f_space(),
462  appImplicitModel_->get_p_space(p_index)->dim());
463  appImplicitOutArgs.set_DfDp(
464  p_index,
465  MEB::Derivative<Scalar>(my_dfdp_mv_, MEB::DERIV_MV_JACOBIAN_FORM));
466  my_dfdp_op_ = my_dfdp_mv_;
467  trans = Thyra::NOTRANS;
468  }
469  else if (dfdp_support.supports(MEB::DERIV_MV_GRADIENT_FORM)) {
470  if (my_dfdp_mv_ == Teuchos::null)
471  my_dfdp_mv_ =
472  Thyra::createMembers(appImplicitModel_->get_p_space(p_index),
473  appImplicitModel_->get_f_space()->dim());
474  appImplicitOutArgs.set_DfDp(
475  p_index,
476  MEB::Derivative<Scalar>(my_dfdp_mv_, MEB::DERIV_MV_GRADIENT_FORM));
477  my_dfdp_op_ = my_dfdp_mv_;
478  trans = Thyra::TRANS;
479  }
480  else
481  TEUCHOS_TEST_FOR_EXCEPTION(true, std::logic_error,
482  "Invalid df/dp support");
483 
484  appImplicitModel_->evalModel(appImplicitInArgs, appImplicitOutArgs);
485 
486  // Add df/dy*dy/dp term to residual
487  RCP<Thyra::MultiVectorBase<Scalar> > dfdp =
488  rcp_dynamic_cast<DMVPV>(outArgs.get_f(), true)
489  ->getNonconstMultiVector();
490  my_dfdp_op_->apply(trans, *dydp, dfdp.ptr(), Scalar(1.0), Scalar(1.0));
491  }
492 }
493 
494 template <typename Scalar>
497  const
498 {
501  Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList(*fsa_pl);
502  pl->set<int>("Sensitivity Y Tangent Index", 3);
503  return pl;
504 }
505 
506 template <typename Scalar>
508  const
509 {
510  explicit_y_state_ = Teuchos::rcp(new SolutionState<Scalar>(
511  forward_state_->getMetaData(),
512  forwardModel_->getExplicitOnlyVector(forward_state_->getX()),
513  forwardModel_->getExplicitOnlyVector(forward_state_->getXDot()),
514  forwardModel_->getExplicitOnlyVector(forward_state_->getXDotDot()),
515  forward_state_->getStepperState(), Teuchos::null));
516  implicit_x_state_ = Teuchos::rcp(new SolutionState<Scalar>(
517  forward_state_->getMetaData(),
518  forwardModel_->getIMEXVector(forward_state_->getX()),
519  forwardModel_->getIMEXVector(forward_state_->getXDot()),
520  forwardModel_->getIMEXVector(forward_state_->getXDotDot()),
521  forward_state_->getStepperState(), Teuchos::null));
522 }
523 
524 } // namespace Tempus
525 
526 #endif // Tempus_ModelEvaluatorPairPartIMEX_StaggeredFSA_impl_hpp
EOpTransp
virtual Teuchos::RCP< const ProductVectorSpaceBase< Scalar > > productSpace() const =0
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
virtual void evalModelImpl(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
virtual Teuchos::RCP< MultiVectorBase< Scalar > > getNonconstMultiVectorBlock(const int k)=0
Evaluation< VectorBase< Scalar > > get_f() const
virtual Teuchos::RCP< const MultiVectorBase< Scalar > > getMultiVectorBlock(const int k) const =0
static magnitudeType rmax()
virtual Teuchos::RCP< Thyra::VectorBase< Scalar > > getExplicitOnlyVector(const Teuchos::RCP< Thyra::VectorBase< Scalar > > &full) const
Extract explicit-only vector from a full solution vector.
virtual Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > getForwardModel() const
Get the underlying forward model.
virtual Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_p_space(int i) const
Get the p space.
virtual void setSolver(const Teuchos::RCP< Thyra::NonlinearSolverBase< Scalar > > &solver, const bool force_W_update)
Set the solver of the underlying model if you want to reuse it.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
ModelEvaluator pair for implicit and explicit (IMEX) evaulations.
WrapperModelEvaluatorPairPartIMEX_StaggeredFSA(const Teuchos::RCP< const WrapperModelEvaluatorPairPartIMEX_Basic< Scalar > > &forwardModel, const bool is_pseudotransient, const Teuchos::RCP< const Teuchos::ParameterList > &pList=Teuchos::null)
Constructor.
virtual void setForwardSolutionHistory(const Teuchos::RCP< const Tempus::SolutionHistory< Scalar > > &sh)
Set solution history from forward state evaluation (for interpolation)
RCP< const MultiVectorBase< Scalar > > getMultiVector() const
void validateParametersAndSetDefaults(ParameterList const &validParamList, int const depth=1000)
void setup(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &explicitModel, const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &implicitModel, int numExplicitOnlyBlocks=0, int parameterIndex=-1)
Setup ME when using default constructor – for derived classes.
virtual void setForwardSolutionState(const Teuchos::RCP< const Tempus::SolutionState< Scalar > > &s)
Set solution state from forward state evaluation (for frozen state)
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
virtual Teuchos::RCP< Thyra::VectorBase< Scalar > > getIMEXVector(const Teuchos::RCP< Thyra::VectorBase< Scalar > > &full) const
Extract IMEX vector from a full solution vector.
void buildIMEXStates() const
Build implicit x and end explicit y states from forward_state_.
Teuchos::RCP< const WrapperModelEvaluatorPairPartIMEX_Basic< Scalar > > forwardModel_
void set_p(int l, const RCP< const VectorBase< Scalar > > &p_l)
RCP< MultiVectorBase< Scalar > > getNonconstMultiVector()
#define TEUCHOS_ASSERT(assertion_test)
RCP< LinearOpBase< Scalar > > get_W_op() const
RCP< const VectorBase< Scalar > > get_x() const
Solution state for integrators and steppers.
RCP< const VectorBase< Scalar > > get_p(int l) const
Teuchos::Range1D Range1D