9 #ifndef Tempus_ModelEvaluatorPairPartIMEX_Basic_impl_hpp
10 #define Tempus_ModelEvaluatorPairPartIMEX_Basic_impl_hpp
12 #include "Thyra_ProductVectorBase.hpp"
13 #include "Thyra_ProductVectorSpaceBase.hpp"
18 template <
typename Scalar>
21 : timeDer_(Teuchos::null), numExplicitOnlyBlocks_(0),
22 parameterIndex_(-1), useImplicitModel_(false)
25 template <
typename Scalar>
30 int numExplicitOnlyBlocks,
int parameterIndex)
31 : timeDer_(Teuchos::null), numExplicitOnlyBlocks_(numExplicitOnlyBlocks),
32 parameterIndex_(parameterIndex), useImplicitModel_(false)
40 template <
typename Scalar>
46 int numExplicitOnlyBlocks,
int parameterIndex)
48 timeDer_ = Teuchos::null;
49 numExplicitOnlyBlocks_ = numExplicitOnlyBlocks;
50 parameterIndex_ = parameterIndex;
51 useImplicitModel_ =
false;
52 setExplicitModel(explicitModel);
53 setImplicitModel(implicitModel);
58 template <
typename Scalar>
65 useImplicitModel_ =
true;
66 wrapperImplicitInArgs_ = this->createInArgs();
67 wrapperImplicitOutArgs_ = this->createOutArgs();
68 useImplicitModel_ =
false;
70 RCP<const Thyra::VectorBase<Scalar> > z =
71 explicitModel_->getNominalValues().get_x();
75 *(implicitModel_->get_x_space()))),
77 "Error - WrapperModelEvaluatorPairIMEX_Basic::initialize()\n"
78 " Explicit and Implicit vector x spaces are incompatible!\n"
79 " Explicit vector x space = " << *(getIMEXVector(z)->space()) <<
"\n"
80 " Implicit vector x space = " << *(implicitModel_->get_x_space())<<
"\n");
83 RCP<const Thyra::ProductVectorBase<Scalar> > zPVector =
86 "Error - WrapperModelEvaluatorPairPartIMEX_Basic::initialize()\n"
87 " was given a VectorBase that could not be cast to a\n"
88 " ProductVectorBase!\n");
90 int numBlocks = zPVector->productSpace()->numBlocks();
92 TEUCHOS_TEST_FOR_EXCEPTION( !(0 <= numExplicitOnlyBlocks_ &&
93 numExplicitOnlyBlocks_ < numBlocks),
95 "Error - WrapperModelEvaluatorPairPartIMEX_Basic::initialize()\n"
96 "Invalid number of explicit-only blocks = "<<numExplicitOnlyBlocks_<<
"\n"
97 "Should be in the interval [0, numBlocks) = [0, "<<numBlocks<<
")\n");
100 template <
typename Scalar>
107 "Error - WrapperModelEvaluatorPairPartIMEX_Basic<Scalar>::setAppModel\n"
108 " should not be used. One should instead use setExplicitModel,\n"
109 " setImplicitModel, or create a new WrapperModelEvaluatorPairPartIMEX.\n");
112 template <
typename Scalar>
118 "Error - WrapperModelEvaluatorPairPartIMEX_Basic<Scalar>::getAppModel\n"
119 " should not be used. One should instead use getExplicitModel,\n"
120 " getImplicitModel, or directly use WrapperModelEvaluatorPairPartIMEX\n"
124 template <
typename Scalar>
129 if (useImplicitModel_ ==
true)
return implicitModel_->get_x_space();
131 return explicitModel_->get_x_space();
134 template <
typename Scalar>
139 if (useImplicitModel_ ==
true)
return implicitModel_->get_g_space(i);
141 return explicitModel_->get_g_space(i);
144 template <
typename Scalar>
149 if (useImplicitModel_ ==
true)
return implicitModel_->get_p_space(i);
151 return explicitModel_->get_p_space(i);
154 template <
typename Scalar>
160 implicitModel_ = model;
163 template <
typename Scalar>
169 using Teuchos::rcp_dynamic_cast;
172 if(full == Teuchos::null) {
173 vector = Teuchos::null;
175 else if(numExplicitOnlyBlocks_ == 0) {
180 RCP<Thyra::ProductVectorBase<Scalar> > blk_full =
183 "Error - WrapperModelEvaluatorPairPartIMEX_Basic::getIMEXVector()\n"
184 " was given a VectorBase that could not be cast to a\n"
185 " ProductVectorBase!\n");
186 int numBlocks = blk_full->productSpace()->numBlocks();
189 if(numBlocks == numExplicitOnlyBlocks_+1)
190 vector = blk_full->getNonconstVectorBlock(numExplicitOnlyBlocks_);
192 TEUCHOS_TEST_FOR_EXCEPTION(
193 !( numExplicitOnlyBlocks_ == 0 || full == Teuchos::null ||
194 numBlocks == numExplicitOnlyBlocks_+1 ),
195 std::logic_error,
"Error - Invalid values!\n");
201 template <
typename Scalar>
207 using Teuchos::rcp_dynamic_cast;
210 if(full == Teuchos::null) {
211 vector = Teuchos::null;
213 else if(numExplicitOnlyBlocks_ == 0) {
220 RCP<const Thyra::ProductVectorBase<Scalar> > blk_full =
223 "Error - WrapperModelEvaluatorPairPartIMEX_Basic::getIMEXVector()\n"
224 " was given a VectorBase that could not be cast to a\n"
225 " ProductVectorBase!\n");
226 int numBlocks = blk_full->productSpace()->numBlocks();
229 if(numBlocks == numExplicitOnlyBlocks_+1)
230 vector = blk_full->getVectorBlock(numExplicitOnlyBlocks_);
232 TEUCHOS_TEST_FOR_EXCEPTION(
233 !( numExplicitOnlyBlocks_ == 0 || full == Teuchos::null ||
234 numBlocks == numExplicitOnlyBlocks_+1 ),
235 std::logic_error,
"Error - Invalid values!\n");
241 template <
typename Scalar>
248 using Teuchos::rcp_dynamic_cast;
251 if(numExplicitOnlyBlocks_ == 0 || full == Teuchos::null) {
252 vector = Teuchos::null;
254 else if(numExplicitOnlyBlocks_ == 1) {
258 RCP<Thyra::ProductVectorBase<Scalar> > blk_full =
261 "Error - WrapperModelEvaluatorPairPartIMEX_Basic::getExplicitOnlyVector\n"
262 " given a VectorBase that could not be cast to a ProductVectorBase!\n"
263 " full = " << *full <<
"\n");
265 vector = blk_full->getNonconstVectorBlock(0);
269 !( (numExplicitOnlyBlocks_ == 0 || full == Teuchos::null) ||
270 (numExplicitOnlyBlocks_ == 1) ),
271 std::logic_error,
"Error - Invalid values!\n");
276 template <
typename Scalar>
283 using Teuchos::rcp_dynamic_cast;
285 RCP<const Thyra::VectorBase<Scalar> > vector;
286 if(numExplicitOnlyBlocks_ == 0 || full == Teuchos::null) {
287 vector = Teuchos::null;
289 else if(numExplicitOnlyBlocks_ == 1) {
293 RCP<const Thyra::ProductVectorBase<Scalar> > blk_full =
296 "Error - WrapperModelEvaluatorPairPartIMEX_Basic::getExplicitOnlyVector\n"
297 " given a VectorBase that could not be cast to a ProductVectorBase!\n"
298 " full = " << *full <<
"\n");
300 vector = blk_full->getVectorBlock(0);
305 !( (numExplicitOnlyBlocks_ == 0 || full == Teuchos::null) ||
306 (numExplicitOnlyBlocks_ == 1) ),
307 std::logic_error,
"Error - Invalid values!\n");
312 template <
typename Scalar>
317 if (implicitModel_->Np() == 0) {
318 if (parameterIndex >= 0) {
322 "WrapperModelEvaluatorPairPartIMEX_Basic::setParameterIndex()");
323 *out <<
"Warning -- \n"
324 <<
" Invalid input parameter index = " << parameterIndex <<
"\n"
325 <<
" Should not be set since Np = "<<implicitModel_->Np() <<
"\n"
326 <<
" Not setting parameter index." << std::endl;
328 if (parameterIndex_ >= 0) {
332 "WrapperModelEvaluatorPairPartIMEX_Basic::setParameterIndex()");
333 *out <<
"Warning -- \n"
334 <<
" Invalid parameter index = " << parameterIndex_ <<
"\n"
335 <<
" Should not be set since Np = "<<implicitModel_->Np() <<
"\n"
336 <<
" Resetting to parameter index to unset state." << std::endl;
337 parameterIndex_ = -1;
340 if(parameterIndex >= 0) {
341 parameterIndex_ = parameterIndex;
342 }
else if (parameterIndex_ < 0) {
344 for(
int i=0; i<implicitModel_->Np(); i++) {
345 if((*implicitModel_->get_p_names(i))[0] ==
"EXPLICIT_ONLY_VECTOR") {
356 template <
typename Scalar>
361 if (useImplicitModel_ ==
true)
return implicitModel_->get_f_space();
363 return explicitModel_->get_f_space();
366 template <
typename Scalar>
372 MEB::InArgsSetup<Scalar> inArgs = this->createInArgs();
374 return std::move(inArgs);
377 template <
typename Scalar>
383 MEB::InArgs<Scalar> implicitInArgs = implicitModel_->getNominalValues();
384 MEB::InArgs<Scalar> explicitInArgs = explicitModel_->getNominalValues();
385 const int np = std::max(implicitInArgs.Np(), explicitInArgs.Np());
386 if (useImplicitModel_ ==
true) {
387 MEB::InArgsSetup<Scalar> inArgs(implicitInArgs);
388 inArgs.setModelEvalDescription(this->description());
390 return std::move(inArgs);
393 MEB::InArgsSetup<Scalar> inArgs(explicitInArgs);
394 inArgs.setModelEvalDescription(this->description());
396 return std::move(inArgs);
399 template <
typename Scalar>
405 MEB::OutArgs<Scalar> implicitOutArgs = implicitModel_->createOutArgs();
406 MEB::OutArgs<Scalar> explicitOutArgs = explicitModel_->createOutArgs();
407 const int np = std::max(implicitOutArgs.Np(), explicitOutArgs.Np());
408 if (useImplicitModel_ ==
true) {
409 MEB::OutArgsSetup<Scalar> outArgs(implicitOutArgs);
410 outArgs.setModelEvalDescription(this->description());
411 outArgs.set_Np_Ng(np,implicitOutArgs.Ng());
412 return std::move(outArgs);
415 MEB::OutArgsSetup<Scalar> outArgs(explicitOutArgs);
416 outArgs.setModelEvalDescription(this->description());
417 outArgs.set_Np_Ng(np,explicitOutArgs.Ng());
418 return std::move(outArgs);
421 template <
typename Scalar>
429 RCP<const Thyra::VectorBase<Scalar> > x = inArgs.
get_x();
430 RCP<Thyra::VectorBase<Scalar> > x_dot =
431 Thyra::createMember(implicitModel_->get_x_space());
432 timeDer_->compute(x, x_dot);
434 MEB::InArgs<Scalar> appImplicitInArgs (wrapperImplicitInArgs_);
435 MEB::OutArgs<Scalar> appImplicitOutArgs(wrapperImplicitOutArgs_);
436 appImplicitInArgs.set_x(x);
437 appImplicitInArgs.set_x_dot(x_dot);
438 for (
int i=0; i<implicitModel_->Np(); ++i) {
440 if ((inArgs.
get_p(i) != Teuchos::null) && (i != parameterIndex_))
441 appImplicitInArgs.set_p(i, inArgs.
get_p(i));
444 appImplicitOutArgs.set_f(outArgs.
get_f());
445 appImplicitOutArgs.set_W_op(outArgs.
get_W_op());
447 implicitModel_->evalModel(appImplicitInArgs,appImplicitOutArgs);
452 #endif // Tempus_ModelEvaluatorPairPartIMEX_Basic_impl_hpp
virtual Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > getAppModel() const
Get the underlying application ModelEvaluator.
virtual Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_g_space(int i) const
Get the g space.
virtual void setExplicitModel(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Evaluation< VectorBase< Scalar > > get_f() const
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 Thyra::ModelEvaluatorBase::InArgs< Scalar > createInArgs() const
virtual void setParameterIndex(int parameterIndex=-1)
Set the parameter index for explicit-only vector.
virtual void initialize()
Initialize after setting member data.
virtual Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_x_space() const
Get the x-solution space.
virtual Thyra::ModelEvaluatorBase::InArgs< Scalar > getNominalValues() const
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 Thyra::ModelEvaluatorBase::OutArgs< Scalar > createOutArgsImpl() const
virtual void setImplicitModel(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model)
basic_FancyOStream & setOutputToRootOnly(const int rootRank)
virtual void setAppModel(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &me)
Set the underlying application ModelEvaluator.
virtual Teuchos::RCP< Thyra::VectorBase< Scalar > > getIMEXVector(const Teuchos::RCP< Thyra::VectorBase< Scalar > > &full) const
Extract IMEX vector from a full solution vector.
WrapperModelEvaluatorPairPartIMEX_Basic()
Default constructor – Still requires setting the models and running initialize.
virtual Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_f_space() const
virtual Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_p_space(int i) const
Get the p space.
RCP< LinearOpBase< Scalar > > get_W_op() const
RCP< const VectorBase< Scalar > > get_x() const
virtual void evalModelImpl(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &in, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &out) const
RCP< const VectorBase< Scalar > > get_p(int l) const