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
00030 #ifndef RYTHMOS_SIMPLE_INTEGRATION_CONTROL_STRATEGY_DEF_HPP
00031 #define RYTHMOS_SIMPLE_INTEGRATION_CONTROL_STRATEGY_DEF_HPP
00032
00033 #include "Rythmos_SimpleIntegrationControlStrategy_decl.hpp"
00034 #include "Teuchos_VerboseObjectParameterListHelpers.hpp"
00035
00036
00037 namespace Rythmos {
00038
00039
00040 template<class Scalar>
00041 RCP<SimpleIntegrationControlStrategy<Scalar> >
00042 simpleIntegrationControlStrategy()
00043 {
00044 RCP<SimpleIntegrationControlStrategy<Scalar> >
00045 integrationControl = Teuchos::rcp(new SimpleIntegrationControlStrategy<Scalar>());
00046 return integrationControl;
00047 }
00048
00049
00050 template<class Scalar>
00051 RCP<SimpleIntegrationControlStrategy<Scalar> >
00052 simpleIntegrationControlStrategy( const RCP<ParameterList> ¶mList )
00053 {
00054 RCP<SimpleIntegrationControlStrategy<Scalar> >
00055 integrationControl = Teuchos::rcp(new SimpleIntegrationControlStrategy<Scalar>());
00056 integrationControl->setParameterList(paramList);
00057 return integrationControl;
00058 }
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 template<class Scalar>
00070 const std::string
00071 SimpleIntegrationControlStrategy<Scalar>::takeVariableSteps_name_
00072 = "Take Variable Steps";
00073
00074 template<class Scalar>
00075 const bool
00076 SimpleIntegrationControlStrategy<Scalar>::takeVariableSteps_default_
00077 = true;
00078
00079
00080 template<class Scalar>
00081 const std::string
00082 SimpleIntegrationControlStrategy<Scalar>::max_dt_name_
00083 = "Max dt";
00084
00085 template<class Scalar>
00086 const double
00087 SimpleIntegrationControlStrategy<Scalar>::max_dt_default_
00088 = std::numeric_limits<Scalar>::max();
00089
00090
00091 template<class Scalar>
00092 const std::string
00093 SimpleIntegrationControlStrategy<Scalar>::numTimeSteps_name_
00094 = "Number of Time Steps";
00095
00096 template<class Scalar>
00097 const int
00098 SimpleIntegrationControlStrategy<Scalar>::numTimeSteps_default_
00099 = -1;
00100
00101
00102 template<class Scalar>
00103 const std::string
00104 SimpleIntegrationControlStrategy<Scalar>::fixed_dt_name_
00105 = "Fixed dt";
00106
00107 template<class Scalar>
00108 const double
00109 SimpleIntegrationControlStrategy<Scalar>::fixed_dt_default_
00110 = -1.0;
00111
00112
00113
00114
00115
00116 template<class Scalar>
00117 SimpleIntegrationControlStrategy<Scalar>::SimpleIntegrationControlStrategy()
00118 :takeVariableSteps_(takeVariableSteps_default_),
00119 max_dt_(max_dt_default_),
00120 numTimeSteps_(numTimeSteps_default_),
00121 fixed_dt_(fixed_dt_default_)
00122 {}
00123
00124
00125
00126
00127
00128 template<class Scalar>
00129 void SimpleIntegrationControlStrategy<Scalar>::setParameterList(
00130 RCP<ParameterList> const& paramList
00131 )
00132 {
00133 using Teuchos::as;
00134 using Teuchos::get;
00135 typedef Teuchos::ScalarTraits<Scalar> ST;
00136 TEST_FOR_EXCEPT(is_null(paramList));
00137 paramList->validateParameters(*getValidParameters());
00138 this->setMyParamList(paramList);
00139 takeVariableSteps_ = paramList->get(
00140 takeVariableSteps_name_, takeVariableSteps_ );
00141 if (!takeVariableSteps_) {
00142 numTimeSteps_ = paramList->get(numTimeSteps_name_,numTimeSteps_);
00143 fixed_dt_ = paramList->get(fixed_dt_name_,fixed_dt_);
00144 TEST_FOR_EXCEPTION(
00145 numTimeSteps_ < 0 && fixed_dt_ <= ST::zero(), std::logic_error,
00146 "Error, when taking fixed steps, the user must set the parameters "
00147 "\""<<numTimeSteps_name_<<"\" > 0 or \""<<fixed_dt_name_<<"\" > 0.0!" );
00148 }
00149 else {
00150 max_dt_ = paramList->get(max_dt_name_,max_dt_);
00151 }
00152 Teuchos::readVerboseObjectSublist(&*paramList,this);
00153 }
00154
00155
00156 template<class Scalar>
00157 RCP<const ParameterList>
00158 SimpleIntegrationControlStrategy<Scalar>::getValidParameters() const
00159 {
00160 static RCP<const ParameterList> validPL;
00161 if (is_null(validPL) ) {
00162 RCP<ParameterList> pl = Teuchos::parameterList();
00163 pl->set(
00164 takeVariableSteps_name_, takeVariableSteps_default_,
00165 "Take variable time steps or fixed time steps.\n"
00166 "If set to false, then the parameter \"" + fixed_dt_name_ + "\"\n"
00167 "or \"" + numTimeSteps_name_ + "\" must be set!"
00168 );
00169 pl->set(
00170 max_dt_name_, max_dt_default_,
00171 "Gives the max size of the variable time steps. This is only read and used if\n"
00172 "\"" + takeVariableSteps_name_ + "\" is set to true."
00173 );
00174 pl->set(
00175 numTimeSteps_name_, numTimeSteps_default_,
00176 "Gives the number of fixed time steps. The actual step size gets computed\n"
00177 "on the fly given the size of the time domain.\n"
00178 "This is only read and used if \"" + takeVariableSteps_name_ + "\" is set to false\n"
00179 "and \"" + fixed_dt_name_ + "\" is set to < 0.0."
00180 );
00181 pl->set(
00182 fixed_dt_name_, fixed_dt_default_,
00183 "Gives the size of the fixed time steps. This is only read and used if\n"
00184 "\"" + takeVariableSteps_name_ + "\" is set to false."
00185 );
00186 Teuchos::setupVerboseObjectSublist(&*pl);
00187 validPL = pl;
00188 }
00189 return validPL;
00190 }
00191
00192
00193
00194
00195
00196 template<class Scalar>
00197 RCP<IntegrationControlStrategyBase<Scalar> >
00198 SimpleIntegrationControlStrategy<Scalar>::cloneIntegrationControlStrategy() const
00199 {
00200 RCP<SimpleIntegrationControlStrategy<Scalar> >
00201 integrCtrlStry = simpleIntegrationControlStrategy<Scalar>();
00202 const RCP<const ParameterList> paramList = this->getParameterList();
00203 if (!is_null(paramList))
00204 integrCtrlStry->setParameterList(Teuchos::parameterList(*paramList));
00205 integrCtrlStry->takeVariableSteps_ = takeVariableSteps_;
00206 integrCtrlStry->max_dt_ = max_dt_;
00207 integrCtrlStry->numTimeSteps_ = numTimeSteps_;
00208 integrCtrlStry->fixed_dt_ = fixed_dt_;
00209 return integrCtrlStry;
00210 }
00211
00212
00213 template<class Scalar>
00214 void
00215 SimpleIntegrationControlStrategy<Scalar>::resetIntegrationControlStrategy(
00216 const TimeRange<Scalar> &integrationTimeDomain
00217 )
00218 {
00219 typedef Teuchos::ScalarTraits<Scalar> ST;
00220 #ifdef RYTHMOS_DEBUG
00221 TEUCHOS_ASSERT(integrationTimeDomain.length() > ST::zero());
00222 #endif
00223 integrationTimeDomain_ = integrationTimeDomain;
00224 if (takeVariableSteps_) {
00225 if (max_dt_ < ST::zero()) {
00226 max_dt_ = integrationTimeDomain_.length();
00227 }
00228 }
00229 else {
00230 if (fixed_dt_ < ST::zero()) {
00231 #ifdef RYTHMOS_DEBUG
00232 TEUCHOS_ASSERT(numTimeSteps_ > 0);
00233 #endif
00234 fixed_dt_ = integrationTimeDomain_.length()/numTimeSteps_;
00235 }
00236 }
00237 }
00238
00239
00240 template<class Scalar>
00241 StepControlInfo<Scalar>
00242 SimpleIntegrationControlStrategy<Scalar>::getNextStepControlInfo(
00243 const StepperBase<Scalar> &stepper,
00244 const StepControlInfo<Scalar> &stepCtrlInfoLast,
00245 const int timeStepIter
00246 )
00247 {
00248
00249 typedef Teuchos::ScalarTraits<Scalar> ST;
00250
00251 #ifdef RYTHMOS_DEBUG
00252 TEUCHOS_ASSERT(integrationTimeDomain_.length() > ST::zero());
00253 #endif
00254
00255 StepControlInfo<Scalar> trialStepCtrlInfo;
00256
00257 if (takeVariableSteps_) {
00258 trialStepCtrlInfo.stepType = STEP_TYPE_VARIABLE;
00259 trialStepCtrlInfo.stepSize = max_dt_;
00260 }
00261 else {
00262 trialStepCtrlInfo.stepType = STEP_TYPE_FIXED;
00263 trialStepCtrlInfo.stepSize = fixed_dt_;
00264 }
00265
00266 return trialStepCtrlInfo;
00267
00268 }
00269
00270
00271
00272
00273
00274
00275
00276 #define RYTHMOS_SIMPLE_INTEGRATION_CONTROL_STRATEGY_INSTANT(SCALAR) \
00277 \
00278 template class SimpleIntegrationControlStrategy< SCALAR >; \
00279 \
00280 template RCP<SimpleIntegrationControlStrategy< SCALAR > > \
00281 simpleIntegrationControlStrategy(); \
00282 \
00283 template RCP<SimpleIntegrationControlStrategy< SCALAR > > \
00284 simpleIntegrationControlStrategy( const RCP<ParameterList> ¶mList );
00285
00286
00287 }
00288
00289
00290 #endif // RYTHMOS_SIMPLE_INTEGRATION_CONTROL_STRATEGY_DEF_HPP