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_IMPLICITBDF_STEPPER_STEP_CONTROL_DECL_H
00030 #define Rythmos_IMPLICITBDF_STEPPER_STEP_CONTROL_DECL_H
00031
00032 #include "Rythmos_ErrWtVecCalcAcceptingStepControlStrategyBase.hpp"
00033
00034 namespace Rythmos {
00035
00037 enum BDFactionFlag { ACTION_UNSET, ACTION_LOWER, ACTION_MAINTAIN, ACTION_RAISE };
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 template<class Scalar>
00055 class ImplicitBDFStepperStepControl
00056 : virtual public ErrWtVecCalcAcceptingStepControlStrategyBase<Scalar>
00057 {
00058 public:
00059
00060 typedef typename Teuchos::ScalarTraits<Scalar>::magnitudeType ScalarMag;
00061
00065 void setRequestedStepSize(const StepperBase<Scalar>& stepper, const Scalar& stepSize, const StepSizeType& stepSizeType);
00066
00068 void nextStepSize(const StepperBase<Scalar>& stepper, Scalar* stepSize, StepSizeType* stepSizeType, int* order);
00069
00071 void setCorrection(
00072 const StepperBase<Scalar>& stepper
00073 ,const RCP<const Thyra::VectorBase<Scalar> >& soln
00074 ,const RCP<const Thyra::VectorBase<Scalar> >& ee
00075 ,int solveStatus
00076 );
00077
00079 bool acceptStep(const StepperBase<Scalar>& stepper, Scalar* LETValue);
00080
00082 void completeStep(const StepperBase<Scalar>& stepper);
00083
00085 AttemptedStepStatusFlag rejectStep(const StepperBase<Scalar>& stepper);
00086
00088 StepControlStrategyState getCurrentState();
00089
00091 int getMaxOrder() const;
00092
00094 void setStepControlData(const StepperBase<Scalar>& stepper);
00095
00097 bool supportsCloning() const;
00098
00100 RCP<StepControlStrategyBase<Scalar> > cloneStepControlStrategyAlgorithm() const;
00101
00103
00106
00108 void setErrWtVecCalc(const RCP<ErrWtVecCalcBase<Scalar> >& errWtVecCalc);
00109
00111 RCP<const ErrWtVecCalcBase<Scalar> > getErrWtVecCalc() const;
00112
00114
00115 ImplicitBDFStepperStepControl();
00116
00120 void describe(
00121 Teuchos::FancyOStream &out,
00122 const Teuchos::EVerbosityLevel verbLevel
00123 ) const;
00125
00129 void setParameterList(RCP<Teuchos::ParameterList> const& paramList);
00130
00132 RCP<Teuchos::ParameterList> getParameterList();
00133
00135 RCP<Teuchos::ParameterList> unsetParameterList();
00136
00138 RCP<const Teuchos::ParameterList> getValidParameters() const;
00139
00141
00143 void initialize(const StepperBase<Scalar>& stepper);
00144
00145
00146 private:
00147
00148
00149
00150 void defaultInitializeAllData_();
00151
00152 StepControlStrategyState stepControlState_;
00153
00154 RCP<ErrWtVecCalcBase<Scalar> > errWtVecCalc_;
00155
00156 Scalar hh_;
00157 int numberOfSteps_;
00158 StepSizeType stepSizeType_;
00159 int maxOrder_;
00160 int nef_;
00161 bool midStep_;
00162
00163 RCP<const Thyra::VectorBase<Scalar> > ee_;
00164 RCP<Thyra::VectorBase<Scalar> > errWtVec_;
00165 RCP<Thyra::VectorBase<Scalar> > delta_;
00166
00167 bool checkReduceOrderCalled_;
00168
00169 RCP<Teuchos::ParameterList> parameterList_;
00170
00171 Scalar time_;
00172
00173 ScalarMag relErrTol_;
00174 ScalarMag absErrTol_;
00175 Scalar usedStep_;
00176 int currentOrder_;
00177 int usedOrder_;
00178 int nscsco_;
00179 Array<Scalar> alpha_;
00180
00181 Array<Scalar> sigma_;
00182 Array<Scalar> gamma_;
00183
00184 Array<Scalar> beta_;
00185 Array<Scalar> psi_;
00186
00187 Scalar alpha_s_;
00188 Scalar alpha_0_;
00189 Scalar cj_ ;
00190 Scalar ck_ ;
00191 Scalar ck_enorm_;
00192
00193 bool constantStepSize_;
00194 Scalar Ek_;
00195 Scalar Ekm1_;
00196 Scalar Ekm2_;
00197 Scalar Ekp1_;
00198 Scalar Est_;
00199 Scalar Tk_;
00200 Scalar Tkm1_;
00201 Scalar Tkm2_;
00202 Scalar Tkp1_;
00203 int newOrder_;
00204 int oldOrder_;
00205 bool initialPhase_;
00206 Scalar stopTime_;
00207
00208
00209 Scalar h0_safety_;
00210 Scalar h0_max_factor_;
00211 Scalar h_phase0_incr_;
00212 Scalar h_max_inv_;
00213 Scalar Tkm1_Tk_safety_;
00214 Scalar Tkp1_Tk_safety_;
00215 Scalar r_factor_;
00216 Scalar r_safety_;
00217 Scalar r_fudge_;
00218 Scalar r_min_;
00219 Scalar r_max_;
00220 Scalar r_hincr_test_;
00221 Scalar r_hincr_;
00222 int max_LET_fail_;
00223 Scalar minTimeStep_;
00224 Scalar maxTimeStep_;
00225
00226 int newtonConvergenceStatus_;
00227
00228
00229
00230 Scalar wRMSNorm_(
00231 const Thyra::VectorBase<Scalar>& weight,
00232 const Thyra::VectorBase<Scalar>& vector
00233 ) const;
00234
00235 Scalar checkReduceOrder_(const StepperBase<Scalar>& stepper);
00236
00237 void getFirstTimeStep_(const StepperBase<Scalar>& stepper);
00238
00239 void setStepControlState_(StepControlStrategyState state);
00240
00241 void updateCoeffs_();
00242
00243 void setDefaultMagicNumbers_(Teuchos::ParameterList &magicNumberList);
00244
00245 };
00246
00247 }
00248
00249 #endif // Rythmos_IMPLICITBDF_STEPPER_STEP_CONTROL_DECL_H
00250