29 #ifndef Rythmos_BACKWARD_EULER_STEPPER_DECL_H 30 #define Rythmos_BACKWARD_EULER_STEPPER_DECL_H 32 #include "Rythmos_SolverAcceptingStepperBase.hpp" 33 #include "Rythmos_StepControlStrategyAcceptingStepperBase.hpp" 34 #include "Rythmos_InterpolatorAcceptingObjectBase.hpp" 35 #include "Rythmos_SingleResidualModelEvaluator.hpp" 36 #include "Rythmos_MomentoBase.hpp" 38 #include "Thyra_VectorBase.hpp" 39 #include "Thyra_ModelEvaluator.hpp" 40 #include "Thyra_NonlinearSolverBase.hpp" 41 #include "Teuchos_ParameterListAcceptorDefaultBase.hpp" 52 template<
class Scalar>
55 virtual public Teuchos::ParameterListAcceptorDefaultBase
61 RCP<MomentoBase<Scalar> > clone()
const 63 RCP<BackwardEulerStepperMomento<Scalar> > m =
65 m->set_scaled_x_old(scaled_x_old_);
66 m->set_x_dot_old(x_dot_old_);
74 m->set_numSteps(numSteps_);
75 m->set_isInitialized(isInitialized_);
76 m->set_haveInitialCondition(haveInitialCondition_);
77 m->set_parameterList(parameterList_);
78 m->set_basePoint(basePoint_);
79 m->set_neModel(neModel_);
80 m->set_interpolator(interpolator_);
81 m->set_stepControl(stepControl_);
82 if (!Teuchos::is_null(this->getMyParamList())) {
83 m->setParameterList(Teuchos::parameterList(*(this->getMyParamList())));
102 void set_scaled_x_old(
const RCP<
const VectorBase<Scalar> >& scaled_x_old )
104 scaled_x_old_ = Teuchos::null;
105 if (!Teuchos::is_null(scaled_x_old)) {
106 scaled_x_old_ = scaled_x_old->clone_v();
109 RCP<VectorBase<Scalar> > get_scaled_x_old()
const 110 {
return scaled_x_old_; }
112 void set_x_dot_old(
const RCP<
const VectorBase<Scalar> >& x_dot_old )
114 x_dot_old_ = Teuchos::null;
115 if (!Teuchos::is_null(x_dot_old)) {
116 x_dot_old_ = x_dot_old->clone_v();
119 RCP<VectorBase<Scalar> > get_x_dot_old()
const 120 {
return x_dot_old_; }
122 void set_x_old(
const RCP<
const VectorBase<Scalar> >& x_old )
124 x_old_ = Teuchos::null;
125 if (!Teuchos::is_null(x_old)) {
126 x_old_ = x_old->clone_v();
129 RCP<VectorBase<Scalar> > get_x_old()
const 132 void set_x(
const RCP<
const VectorBase<Scalar> >& x )
135 if (!Teuchos::is_null(x)) {
139 RCP<VectorBase<Scalar> > get_x()
const 142 void set_dx(
const RCP<
const VectorBase<Scalar> >& dx )
145 if (!Teuchos::is_null(dx)) {
149 RCP<VectorBase<Scalar> > get_dx()
const 152 void set_x_dot(
const RCP<
const VectorBase<Scalar> >& x_dot )
154 x_dot_ = Teuchos::null;
155 if (!Teuchos::is_null(x_dot)) {
156 x_dot_ = x_dot->clone_v();
159 RCP<VectorBase<Scalar> > get_x_dot()
const 162 void set_t(
const Scalar & t)
167 void set_t_old(
const Scalar & t_old)
169 Scalar get_t_old()
const 172 void set_dt(
const Scalar & dt)
174 Scalar get_dt()
const 177 void set_numSteps(
const int & numSteps)
178 { numSteps_ = numSteps; }
179 int get_numSteps()
const 180 {
return numSteps_; }
182 void set_newtonConvergenceStatus(
const int & newtonConvergenceStatus)
183 { newtonConvergenceStatus_ = newtonConvergenceStatus; }
184 int get_newtonConvergenceStatus()
const 185 {
return newtonConvergenceStatus_; }
187 void set_isInitialized(
const bool & isInitialized)
188 { isInitialized_ = isInitialized; }
189 bool get_isInitialized()
const 190 {
return isInitialized_; }
192 void set_haveInitialCondition(
const bool & haveInitialCondition)
193 { haveInitialCondition_ = haveInitialCondition; }
194 bool get_haveInitialCondition()
const 195 {
return haveInitialCondition_; }
197 void set_parameterList(
const RCP<const ParameterList>& pl)
199 parameterList_ = Teuchos::null;
200 if (!Teuchos::is_null(pl)) {
201 parameterList_ = Teuchos::parameterList(*pl);
204 RCP<ParameterList> get_parameterList()
const 205 {
return parameterList_; }
207 void set_basePoint(Thyra::ModelEvaluatorBase::InArgs<Scalar> basePoint)
208 { basePoint_ = basePoint; };
209 Thyra::ModelEvaluatorBase::InArgs<Scalar> get_basePoint()
const 210 {
return basePoint_; }
214 neModel_ = Teuchos::null;
215 if (!Teuchos::is_null(neModel)) {
219 RCP<Rythmos::SingleResidualModelEvaluator<Scalar> > get_neModel()
const 224 interpolator_ = Teuchos::null;
225 if (!Teuchos::is_null(interpolator)) {
226 TEUCHOS_ASSERT(interpolator->supportsCloning());
227 interpolator_ = interpolator->cloneInterpolator();
230 RCP<InterpolatorBase<Scalar> > get_interpolator()
const 231 {
return interpolator_; }
235 stepControl_ = Teuchos::null;
236 if (!Teuchos::is_null(stepControl)) {
237 TEUCHOS_ASSERT(stepControl->supportsCloning());
238 stepControl_ = stepControl->cloneStepControlStrategyAlgorithm();
241 RCP<StepControlStrategyBase<Scalar> > get_stepControl()
const 242 {
return stepControl_; }
244 void setParameterList(
const RCP<ParameterList>& paramList)
245 { this->setMyParamList(paramList); }
246 RCP<const ParameterList> getValidParameters()
const 247 {
return Teuchos::null; }
250 RCP<Thyra::VectorBase<Scalar> > scaled_x_old_;
251 RCP<Thyra::VectorBase<Scalar> > x_old_;
252 RCP<Thyra::VectorBase<Scalar> > x_dot_old_;
253 RCP<Thyra::VectorBase<Scalar> > x_;
254 RCP<Thyra::VectorBase<Scalar> > x_dot_;
255 RCP<Thyra::VectorBase<Scalar> > dx_;
260 int newtonConvergenceStatus_;
262 bool haveInitialCondition_;
263 RCP<Teuchos::ParameterList> parameterList_;
264 Thyra::ModelEvaluatorBase::InArgs<Scalar> basePoint_;
265 RCP<Rythmos::SingleResidualModelEvaluator<Scalar> > neModel_;
266 RCP<InterpolatorBase<Scalar> > interpolator_;
267 RCP<StepControlStrategyBase<Scalar> > stepControl_;
282 template<
class Scalar>
291 typedef typename Teuchos::ScalarTraits<Scalar>::magnitudeType
ScalarMag;
301 const RCP<Thyra::ModelEvaluator<Scalar> >& model,
302 const RCP<Thyra::NonlinearSolverBase<Scalar> >& solver
314 RCP<InterpolatorBase<Scalar> > getNonconstInterpolator();
317 RCP<const InterpolatorBase<Scalar> > getInterpolator()
const;
320 RCP<InterpolatorBase<Scalar> > unSetInterpolator();
328 void setStepControlStrategy(
333 RCP<StepControlStrategyBase<Scalar> >
334 getNonconstStepControlStrategy();
337 RCP<const StepControlStrategyBase<Scalar> >
338 getStepControlStrategy()
const;
347 const RCP<Thyra::NonlinearSolverBase<Scalar> > &solver
351 RCP<Thyra::NonlinearSolverBase<Scalar> >
355 RCP<const Thyra::NonlinearSolverBase<Scalar> >
364 bool supportsCloning()
const;
373 RCP<StepperBase<Scalar> > cloneStepperAlgorithm()
const;
376 bool isImplicit()
const;
379 void setModel(
const RCP<
const Thyra::ModelEvaluator<Scalar> >& model);
382 void setNonconstModel(
const RCP<Thyra::ModelEvaluator<Scalar> >& model);
385 RCP<const Thyra::ModelEvaluator<Scalar> > getModel()
const;
388 RCP<Thyra::ModelEvaluator<Scalar> > getNonconstModel();
391 void setInitialCondition(
392 const Thyra::ModelEvaluatorBase::InArgs<Scalar> &initialCondition
396 Thyra::ModelEvaluatorBase::InArgs<Scalar> getInitialCondition()
const;
399 Scalar takeStep(Scalar dt, StepSizeType flag);
410 RCP<const Thyra::VectorSpaceBase<Scalar> >
415 const Array<Scalar>& time_vec,
416 const Array<RCP<
const Thyra::VectorBase<Scalar> > >& x_vec,
417 const Array<RCP<
const Thyra::VectorBase<Scalar> > >& xdot_vec
425 const Array<Scalar>& time_vec,
426 Array<RCP<
const Thyra::VectorBase<Scalar> > >* x_vec,
427 Array<RCP<
const Thyra::VectorBase<Scalar> > >* xdot_vec,
428 Array<ScalarMag>* accuracy_vec
432 void getNodes(Array<Scalar>* time_vec)
const;
435 void removeNodes(Array<Scalar>& time_vec);
438 int getOrder()
const;
446 void setParameterList(RCP<Teuchos::ParameterList>
const& paramList);
449 RCP<Teuchos::ParameterList> getNonconstParameterList();
452 RCP<Teuchos::ParameterList> unsetParameterList();
455 RCP<const Teuchos::ParameterList> getValidParameters()
const;
464 Teuchos::FancyOStream &out,
465 const Teuchos::EVerbosityLevel verbLevel
476 RCP<const MomentoBase<Scalar> > getMomento()
const;
482 const RCP<Thyra::ModelEvaluator<Scalar> >& model,
483 const RCP<Thyra::NonlinearSolverBase<Scalar> >& solver
495 bool haveInitialCondition_;
496 RCP<const Thyra::ModelEvaluator<Scalar> > model_;
497 RCP<Thyra::NonlinearSolverBase<Scalar> > solver_;
498 RCP<Thyra::VectorBase<Scalar> > x_old_;
499 RCP<Thyra::VectorBase<Scalar> > scaled_x_old_;
500 RCP<Thyra::VectorBase<Scalar> > x_dot_old_;
502 Thyra::ModelEvaluatorBase::InArgs<Scalar> basePoint_;
503 RCP<Thyra::VectorBase<Scalar> > x_;
504 RCP<Thyra::VectorBase<Scalar> > x_dot_;
505 RCP<Thyra::VectorBase<Scalar> > dx_;
512 RCP<Rythmos::SingleResidualModelEvaluator<Scalar> > neModel_;
514 RCP<Teuchos::ParameterList> parameterList_;
516 RCP<InterpolatorBase<Scalar> > interpolator_;
517 RCP<StepControlStrategyBase<Scalar> > stepControl_;
519 int newtonConvergenceStatus_;
525 void defaultInitializeAll_();
527 void checkConsistentState_();
528 void obtainPredictor_();
537 template<
class Scalar>
538 RCP<BackwardEulerStepper<Scalar> >
539 backwardEulerStepper();
546 template<
class Scalar>
547 RCP<BackwardEulerStepper<Scalar> >
548 backwardEulerStepper(
549 const RCP<Thyra::ModelEvaluator<Scalar> >& model,
550 const RCP<Thyra::NonlinearSolverBase<Scalar> >& solver
557 #endif //Rythmos_BACKWARD_EULER_STEPPER_DECL_H Simple concrete stepper subclass implementing an implicit backward Euler method.
Mix-in interface for stepper objects that accept a step control strategy object to be used for evalua...
Base strategy class for interpolation functionality.
Base class for serializing Rythmos state data.
The member functions in the StepControlStrategyBase move you between these states in the following fa...
Mix-in interface for objects that accept an interpolator object.
Teuchos::ScalarTraits< Scalar >::magnitudeType ScalarMag
Concrete momento class for the BackwardEulerStepper.
Decorator subclass for a steady-state version of a DAE for single-residual time stepper methods...
Mix-in interface all implicit stepper objects that accept a nonlinear solver to be used to compute th...
Base class for a momento object.