00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef Rythmos_FORWARDEULER_STEPPER_H
00030 #define Rythmos_FORWARDEULER_STEPPER_H
00031
00032 #include "Rythmos_Stepper.hpp"
00033 #include "Teuchos_RefCountPtr.hpp"
00034 #include "Thyra_VectorBase.hpp"
00035 #include "Thyra_ModelEvaluator.hpp"
00036 #include "Thyra_ModelEvaluatorHelpers.hpp"
00037
00038 namespace Rythmos {
00039
00041 template<class Scalar>
00042 class ForwardEulerStepper : virtual public Stepper<Scalar>
00043 {
00044 public:
00045
00046 typedef typename Teuchos::ScalarTraits<Scalar>::magnitudeType ScalarMag;
00047
00049 ForwardEulerStepper();
00050 ForwardEulerStepper(const Teuchos::RefCountPtr<const Thyra::ModelEvaluator<Scalar> > &model);
00051
00053 ~ForwardEulerStepper();
00054
00056 Scalar TakeStep(Scalar dt);
00057
00059 Scalar TakeStep();
00060
00062 Teuchos::RefCountPtr<const Thyra::VectorBase<Scalar> > get_solution() const;
00063
00065 Teuchos::RefCountPtr<const Thyra::VectorBase<Scalar> > get_residual() const;
00066
00068 std::string description() const;
00069
00071 std::ostream& describe(
00072 std::ostream &out
00073 ,const Teuchos::EVerbosityLevel verbLevel
00074 ,const std::string leadingIndent
00075 ,const std::string indentSpacer
00076 ) const;
00077
00080 bool SetPoints(
00081 const std::vector<Scalar>& time_list
00082 ,const std::vector<Teuchos::RefCountPtr<Thyra::VectorBase<Scalar> > >& x_list
00083 ,const std::vector<Teuchos::RefCountPtr<Thyra::VectorBase<Scalar> > >& xdot_list);
00084
00086 bool GetPoints(
00087 const std::vector<Scalar>& time_list
00088 ,std::vector<Teuchos::RefCountPtr<Thyra::VectorBase<Scalar> > >* x_list
00089 ,std::vector<Teuchos::RefCountPtr<Thyra::VectorBase<Scalar> > >* xdot_list
00090 ,std::vector<ScalarMag>* accuracy_list) const;
00091
00093 bool SetRange(
00094 const Scalar& time_lower
00095 ,const Scalar& time_upper
00096 ,const InterpolationBuffer<Scalar> & IB);
00097
00099 bool GetNodes(std::vector<Scalar>* time_list) const;
00100
00102 bool RemoveNodes(std::vector<Scalar>& time_list) const;
00103
00105 int GetOrder() const;
00106
00107
00108
00109 private:
00110
00111 Teuchos::RefCountPtr<const Thyra::ModelEvaluator<Scalar> > model_;
00112 Teuchos::RefCountPtr<Thyra::VectorBase<Scalar> > solution_vector_;
00113 Teuchos::RefCountPtr<Thyra::VectorBase<Scalar> > residual_vector_;
00114 Scalar t_;
00115
00116 };
00117
00118 template<class Scalar>
00119 ForwardEulerStepper<Scalar>::ForwardEulerStepper(const Teuchos::RefCountPtr<const Thyra::ModelEvaluator<Scalar> > &model)
00120 {
00121 typedef Teuchos::ScalarTraits<Scalar> ST;
00122 model_ = model;
00123 t_ = ST::zero();
00124 solution_vector_ = model_->getNominalValues().get_x()->clone_v();
00125 residual_vector_ = Thyra::createMember(model_->get_f_space());
00126 }
00127
00128 template<class Scalar>
00129 ForwardEulerStepper<Scalar>::ForwardEulerStepper()
00130 {
00131 }
00132
00133 template<class Scalar>
00134 ForwardEulerStepper<Scalar>::~ForwardEulerStepper()
00135 {
00136 }
00137
00138 template<class Scalar>
00139 Scalar ForwardEulerStepper<Scalar>::TakeStep()
00140 {
00141
00142 typedef Teuchos::ScalarTraits<Scalar> ST;
00143 return(-ST::one());
00144 }
00145
00146 template<class Scalar>
00147 Scalar ForwardEulerStepper<Scalar>::TakeStep(Scalar dt)
00148 {
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160 Thyra::eval_f<Scalar>(*model_,*solution_vector_,t_+dt,&*residual_vector_);
00161
00162
00163 Thyra::Vp_StV(&*solution_vector_,dt,*residual_vector_);
00164 t_ += dt;
00165
00166 return(dt);
00167 }
00168
00169 template<class Scalar>
00170 Teuchos::RefCountPtr<const Thyra::VectorBase<Scalar> > ForwardEulerStepper<Scalar>::get_solution() const
00171 {
00172 return(solution_vector_);
00173 }
00174
00175 template<class Scalar>
00176 Teuchos::RefCountPtr<const Thyra::VectorBase<Scalar> > ForwardEulerStepper<Scalar>::get_residual() const
00177 {
00178 return(residual_vector_);
00179 }
00180
00181 template<class Scalar>
00182 std::string ForwardEulerStepper<Scalar>::description() const
00183 {
00184 std::string name = "Rythmos::ForwardEulerStepper";
00185 return(name);
00186 }
00187
00188 template<class Scalar>
00189 std::ostream& ForwardEulerStepper<Scalar>::describe(
00190 std::ostream &out
00191 ,const Teuchos::EVerbosityLevel verbLevel
00192 ,const std::string leadingIndent
00193 ,const std::string indentSpacer
00194 ) const
00195 {
00196 if (verbLevel == Teuchos::VERB_EXTREME)
00197 {
00198 out << description() << "::describe" << std::endl;
00199 out << "model_ = " << std::endl;
00200 out << model_->describe(out,verbLevel,leadingIndent,indentSpacer) << std::endl;
00201 out << "solution_vector_ = " << std::endl;
00202 out << solution_vector_->describe(out,verbLevel,leadingIndent,indentSpacer) << std::endl;
00203 out << "residual_vector_ = " << std::endl;
00204 out << residual_vector_->describe(out,verbLevel,leadingIndent,indentSpacer) << std::endl;
00205 }
00206 return(out);
00207 }
00208
00209 template<class Scalar>
00210 bool ForwardEulerStepper<Scalar>::SetPoints(
00211 const std::vector<Scalar>& time_list
00212 ,const std::vector<Teuchos::RefCountPtr<Thyra::VectorBase<Scalar> > >& x_list
00213 ,const std::vector<Teuchos::RefCountPtr<Thyra::VectorBase<Scalar> > >& xdot_list)
00214 {
00215 return(false);
00216 }
00217
00218 template<class Scalar>
00219 bool ForwardEulerStepper<Scalar>::GetPoints(
00220 const std::vector<Scalar>& time_list
00221 ,std::vector<Teuchos::RefCountPtr<Thyra::VectorBase<Scalar> > >* x_list
00222 ,std::vector<Teuchos::RefCountPtr<Thyra::VectorBase<Scalar> > >* xdot_list
00223 ,std::vector<ScalarMag>* accuracy_list) const
00224 {
00225 return(false);
00226 }
00227
00228 template<class Scalar>
00229 bool ForwardEulerStepper<Scalar>::SetRange(
00230 const Scalar& time_lower
00231 ,const Scalar& time_upper
00232 ,const InterpolationBuffer<Scalar>& IB)
00233 {
00234 return(false);
00235 }
00236
00237 template<class Scalar>
00238 bool ForwardEulerStepper<Scalar>::GetNodes(std::vector<Scalar>* time_list) const
00239 {
00240 return(false);
00241 }
00242
00243 template<class Scalar>
00244 bool ForwardEulerStepper<Scalar>::RemoveNodes(std::vector<Scalar>& time_list) const
00245 {
00246 return(false);
00247 }
00248
00249 template<class Scalar>
00250 int ForwardEulerStepper<Scalar>::GetOrder() const
00251 {
00252 return(1);
00253 }
00254
00255
00256 }
00257
00258 #endif //Rythmos_FORWARDEULER_STEPPER_H