9 #ifndef Tempus_SolutionState_impl_hpp
10 #define Tempus_SolutionState_impl_hpp
12 #include "Thyra_VectorStdOps.hpp"
17 template<
class Scalar>
19 const Teuchos::RCP<Thyra::VectorBase<Scalar> >& x,
20 const Teuchos::RCP<Thyra::VectorBase<Scalar> >& xdot,
21 const Teuchos::RCP<Thyra::VectorBase<Scalar> >& xdotdot,
29 xdotdot_nc_ (xdotdot),
30 stepperState_ (stepperState),
31 stepperState_nc_(stepperState),
32 physicsState_ (physicsState),
33 physicsState_nc_(physicsState)
47 template<
class Scalar>
49 const Teuchos::RCP<
const Thyra::VectorBase<Scalar> >& x,
50 const Teuchos::RCP<
const Thyra::VectorBase<Scalar> >& xdot,
51 const Teuchos::RCP<
const Thyra::VectorBase<Scalar> >& xdotdot,
61 stepperState_nc_(
Teuchos::null),
74 template<
class Scalar>
77 const Teuchos::RCP<Thyra::VectorBase<Scalar> >& x,
78 const Teuchos::RCP<Thyra::VectorBase<Scalar> >& xdot,
79 const Teuchos::RCP<Thyra::VectorBase<Scalar> >& xdotdot,
82 : metaData_ (metaData),
83 metaData_nc_ (metaData),
89 xdotdot_nc_ (xdotdot),
90 stepperState_ (stepperState),
91 stepperState_nc_(stepperState),
92 physicsState_ (physicsState),
93 physicsState_nc_(physicsState)
105 template<
class Scalar>
108 const Teuchos::RCP<
const Thyra::VectorBase<Scalar> >& x,
109 const Teuchos::RCP<
const Thyra::VectorBase<Scalar> >& xdot,
110 const Teuchos::RCP<
const Thyra::VectorBase<Scalar> >& xdotdot,
113 : metaData_ (metaData),
121 stepperState_ (stepperState),
122 stepperState_nc_(
Teuchos::null),
123 physicsState_ (physicsState),
124 physicsState_nc_(
Teuchos::null)
137 template<
class Scalar>
142 const Scalar errorAbs,
143 const Scalar errorRel,
146 const int nRunningFailures,
147 const int nConsecutiveFailures,
148 const Status solutionStatus,
150 const bool outputScreen,
152 const bool isInterpolated,
153 const Scalar accuracy,
154 const Teuchos::RCP<Thyra::VectorBase<Scalar> >& x,
155 const Teuchos::RCP<Thyra::VectorBase<Scalar> >& xdot,
156 const Teuchos::RCP<Thyra::VectorBase<Scalar> >& xdotdot,
164 xdotdot_nc_ (xdotdot),
165 stepperState_ (stepperState),
166 stepperState_nc_(stepperState),
167 physicsState_ (physicsState),
168 physicsState_nc_(physicsState)
179 nConsecutiveFailures,
198 template<
class Scalar>
203 const Scalar errorAbs,
204 const Scalar errorRel,
207 const int nRunningFailures,
208 const int nConsecutiveFailures,
209 const Status solutionStatus,
211 const bool outputScreen,
213 const bool isInterpolated,
214 const Scalar accuracy,
215 const Teuchos::RCP<
const Thyra::VectorBase<Scalar> >& x,
216 const Teuchos::RCP<
const Thyra::VectorBase<Scalar> >& xdot,
217 const Teuchos::RCP<
const Thyra::VectorBase<Scalar> >& xdotdot,
226 stepperState_ (stepperState),
227 stepperState_nc_(
Teuchos::null),
228 physicsState_ (physicsState),
229 physicsState_nc_(
Teuchos::null)
240 nConsecutiveFailures,
259 template<
class Scalar>
261 const Teuchos::RCP<
const Thyra::ModelEvaluator<Scalar> >& model,
265 typedef Thyra::ModelEvaluatorBase MEB;
266 using Teuchos::rcp_const_cast;
270 metaData_ = metaData_nc_;
272 MEB::InArgs<Scalar> inArgs = model->getNominalValues();
275 x_nc_ = rcp_const_cast<Thyra::VectorBase<Scalar> > (inArgs.get_x());
282 if (inArgs.supports(MEB::IN_ARG_x_dot)) {
283 xdot_nc_ = rcp_const_cast<Thyra::VectorBase<Scalar> >(inArgs.get_x_dot());
286 xdot_nc_ = Teuchos::null;
291 if (inArgs.supports(MEB::IN_ARG_x_dot_dot)) {
293 rcp_const_cast<Thyra::VectorBase<Scalar> > (inArgs.get_x_dot_dot());
294 xdotdot_ = xdotdot_nc_;
296 xdotdot_nc_ = Teuchos::null;
297 xdotdot_ = xdotdot_nc_;
300 if (stepperState_ == Teuchos::null) {
302 stepperState_ = stepperState_nc_;
304 stepperState_nc_ = stepperState;
305 stepperState_ = stepperState;
308 if (physicsState_ == Teuchos::null) {
310 physicsState_ = physicsState_nc_;
312 physicsState_nc_ = physicsState;
313 physicsState_ = physicsState;
317 template<
class Scalar>
319 :metaData_ (ss_.metaData_),
320 metaData_nc_ (ss_.metaData_nc_),
324 xdot_nc_ (ss_.xdot_nc_),
325 xdotdot_ (ss_.xdotdot_),
326 xdotdot_nc_ (ss_.xdotdot_nc_),
327 stepperState_ (ss_.stepperState_),
328 stepperState_nc_(ss_.stepperState_nc_),
329 physicsState_ (ss_.physicsState_),
330 physicsState_nc_(ss_.physicsState_nc_)
334 template<
class Scalar>
339 RCP<SolutionStateMetaData<Scalar> > metaData_out;
340 if (!Teuchos::is_null(metaData_)) metaData_out = metaData_->clone();
342 RCP<Thyra::VectorBase<Scalar> > x_out;
343 if (!Teuchos::is_null(x_)) x_out = x_->clone_v();
345 RCP<Thyra::VectorBase<Scalar> > xdot_out;
346 if (!Teuchos::is_null(xdot_)) xdot_out = xdot_->clone_v();
348 RCP<Thyra::VectorBase<Scalar> > xdotdot_out;
349 if (!Teuchos::is_null(xdotdot_)) xdotdot_out = xdotdot_->clone_v();
351 RCP<StepperState<Scalar> > sS_out;
352 if (!Teuchos::is_null(stepperState_)) sS_out=stepperState_->clone();
354 RCP<PhysicsState<Scalar> > pS_out;
355 if (!Teuchos::is_null(physicsState_)) pS_out=physicsState_->clone();
358 metaData_out, x_out, xdot_out, xdotdot_out, sS_out, pS_out));
364 template<
class Scalar>
368 metaData_nc_->copy(ss->metaData_);
369 this->copySolutionData(ss);
373 template<
class Scalar>
377 Thyra::V_V(x_nc_.ptr(), *(ss->x_));
378 if (ss->xdot_ == Teuchos::null) xdot_nc_ = Teuchos::null;
379 else Thyra::V_V(xdot_nc_.ptr(), *(ss->xdot_));
380 if (ss->xdotdot_ == Teuchos::null) xdotdot_nc_ = Teuchos::null;
381 else Thyra::V_V(xdotdot_nc_.ptr(), *(ss->xdotdot_));
382 stepperState_nc_->copy(ss->stepperState_);
383 physicsState_nc_->copy(ss->physicsState_);
386 template<
class Scalar>
390 Teuchos::RCP<const Thyra::VectorBase<Scalar> > temp;
400 xdotdot_ = ss->xdotdot_;
403 Teuchos::RCP<Thyra::VectorBase<Scalar> > temp_nc;
409 xdot_nc_ = ss->xdot_nc_;
410 ss->xdot_nc_ = temp_nc;
412 temp_nc = xdotdot_nc_;
413 xdotdot_nc_ = ss->xdotdot_nc_;
414 ss->xdotdot_nc_ = temp_nc;
416 Teuchos::RCP<const StepperState< Scalar > > ssTemp = stepperState_;
417 stepperState_ = ss->stepperState_;
418 ss->stepperState_ = ssTemp;
420 Teuchos::RCP<StepperState< Scalar > > ssTemp_nc = stepperState_nc_;
421 stepperState_nc_ = ss->stepperState_nc_;
422 ss->stepperState_nc_ = ssTemp_nc;
424 Teuchos::RCP<const PhysicsState< Scalar > > psTemp = physicsState_;
425 physicsState_ = ss->physicsState_;
426 ss->physicsState_ = psTemp;
428 Teuchos::RCP<PhysicsState< Scalar > > psTemp_nc = physicsState_nc_;
429 physicsState_nc_ = ss->physicsState_nc_;
430 ss->physicsState_nc_ = psTemp_nc;
434 template<
class Scalar>
437 return (this->metaData_->getTime() < ss.
metaData_->getTime());
440 template<
class Scalar>
443 return (this->metaData_->getTime() <= ss.
metaData_->getTime());
446 template<
class Scalar>
449 return (this->metaData_->getTime() < t);
452 template<
class Scalar>
455 return (this->metaData_->getTime() <= t);
458 template<
class Scalar>
461 return (this->metaData_->getTime() > ss.
metaData_->getTime());
464 template<
class Scalar>
467 return (this->metaData_->getTime() >= ss.
metaData_->getTime());
470 template<
class Scalar>
473 return (this->metaData_->getTime() > t);
476 template<
class Scalar>
479 return (this->metaData_->getTime() >= t);
482 template<
class Scalar>
485 return (this->metaData_->getTime() == ss.
metaData_->getTime());
488 template<
class Scalar>
491 return (this->metaData_->getTime() == t);
494 template<
class Scalar>
497 std::string name =
"Tempus::SolutionState";
501 template<
class Scalar>
503 Teuchos::FancyOStream &out,
504 const Teuchos::EVerbosityLevel verbLevel)
const
506 if (verbLevel == Teuchos::VERB_EXTREME) {
507 out << description() <<
"::describe:" << std::endl
508 <<
"metaData = " << std::endl;
509 metaData_->describe(out,verbLevel);
510 out <<
"x = " << std::endl;
511 x_->describe(out,verbLevel);
512 if (xdot_ != Teuchos::null) {
513 out <<
"xdot_ = " << std::endl;
514 xdot_->describe(out,verbLevel);
516 if (xdotdot_ != Teuchos::null) {
517 out <<
"xdotdot = " << std::endl;
518 xdotdot_->describe(out,verbLevel);
520 if (stepperState_ != Teuchos::null) {
521 out <<
"stepperState = " << std::endl;
522 stepperState_->describe(out,verbLevel);
524 if (physicsState_ != Teuchos::null) {
525 out <<
"stepperState = " << std::endl;
526 physicsState_->describe(out,verbLevel);
532 #endif // Tempus_SolutionState_impl_hpp