37 : model(model_), u(model.size()), f(model.size())
39 model.initialize(t,u);
118 : model(model_), u(model.size()), w(model.size()), k1(model.size()), k2(model.size())
123 model.initialize(t,u);
142 model.f(t+c2*dt,w,k2);
212 : model(model_), u(model.size()), w(model.size()), k1(model.size()), k2(model.size())
218 model.initialize(t,u);
237 model.f(t+c2*dt,w,k2);
279 time_type c2,a21,b1,b2;
308 : model(model_), u(model.size()), w(model.size()), k1(model.size()),
309 k2(model.size()), k3(model.size())
318 model.initialize(t,u);
337 model.f(t+c2*dt,w,k2);
342 model.f(t+c3*dt,w,k3);
384 time_type c2,c3,a21,a31,a32,b1,b2,b3;
412 : model(model_), u(model.size()), w(model.size()), k1(model.size()),
413 k2(model.size()), k3(model.size())
423 model.initialize(t,u);
442 model.f(t+c2*dt,w,k2);
448 model.f(t+c3*dt,w,k3);
491 time_type c2,c3,a21,a31,a32,b1,b2,b3;
519 : model(model_), u(model.size()), w(model.size()), k1(model.size()),
520 k2(model.size()), k3(model.size()), k4(model.size())
532 model.initialize(t,u);
551 model.f(t+c2*dt,w,k2);
556 model.f(t+c3*dt,w,k3);
561 model.f(t+c4*dt,w,k4);
605 time_type c2,c3,c4,a21,a32,a43,b1,b2,b3,b4;
629 : model(model_), u(model.size()), w(model.size()), ww(model.size()), k1(model.size()),
630 k2(model.size()), k3(model.size()), k4(model.size()), k5(model.size()), k6(model.size()),
631 steps(0), rejected(0)
678 model.initialize(t,u);
705 model.f(t+c2*dt,w,k2);
711 model.f(t+c3*dt,w,k3);
718 model.f(t+c4*dt,w,k4);
726 model.f(t+c5*dt,w,k5);
735 model.f(t+c6*dt,w,k6);
747 ww.update(dt*bb1,k1);
748 ww.update(dt*bb2,k2);
749 ww.update(dt*bb3,k3);
750 ww.update(dt*bb4,k4);
751 ww.update(dt*bb5,k5);
752 ww.update(dt*bb6,k6);
756 time_type error(norm(w));
757 time_type dt_opt(dt*pow(rho*TOL/error,0.2));
758 dt_opt = std::min(beta*dt,std::max(alpha*dt,dt_opt));
771 if (dt>dt_min)
step();
802 std::cout <<
"RE: steps=" << steps <<
" rejected=" << rejected << std::endl;
808 time_type TOL,rho,alpha,beta,dt_min;
809 time_type c2,c3,c4,c5,c6;
810 time_type a21,a31,a32,a41,a42,a43,a51,a52,a53,a54,a61,a62,a63,a64,a65;
811 time_type b1,b2,b3,b4,b5;
812 time_type bb1,bb2,bb3,bb4,bb5,bb6;
815 mutable size_type steps, rejected;
824 template<
class M,
class S>
838 RE (
const M& model_, S& solver_)
839 : model(model_), solver(solver_), u(model.size()),
840 wlow(model.size()), whigh(model.size()), ww(model.size()),
841 steps(0), rejected(0)
843 model.initialize(t,u);
846 for (size_type i=0; i<solver.get_order(); i++)
875 solver.set_state(t,u);
878 wlow = solver.get_state();
881 solver.set_state(t,u);
885 whigh = solver.get_state();
890 time_type error(norm(ww)/(pow(H,1.0+solver.get_order())*(1.0-1.0/two_power_m)));
891 time_type dt_opt(pow(rho*TOL/error,1.0/((time_type)solver.get_order())));
892 dt_opt = std::min(beta*dt,std::max(alpha*dt,dt_opt));
901 u /= two_power_m-1.0;
908 if (dt>dt_min)
step();
933 return solver.get_order()+1;
939 std::cout <<
"RE: steps=" << steps <<
" rejected=" << rejected << std::endl;
946 time_type two_power_m;
948 time_type TOL,rho,alpha,beta,dt_min;
949 mutable size_type steps, rejected;
962 template<
class M,
class S>
967 class NonlinearProblem
978 typename M::time_type tnew_,
typename M::time_type dt_)
979 : model(model_), yold(yold_), tnew(tnew_), dt(dt_)
983 std::size_t size ()
const 991 model.f(tnew,x,result);
1000 model.f_x(tnew,x,result);
1002 for (size_type i=0; i<model.size(); i++) result[i][i] -=
number_type(1.0);
1005 void set_tnew_dt (
typename M::time_type tnew_,
typename M::time_type dt_)
1014 typename M::time_type tnew;
1015 typename M::time_type dt;
1029 IE (
const M& model_,
const S& newton_)
1030 : verbosity(0), model(model_), newton(newton_), u(model.size()), unew(model.size())
1032 model.initialize(t,u);
1045 verbosity = verbosity_;
1052 std::cout <<
"IE: step" <<
" t=" << t <<
" dt=" << dt << std::endl;
1053 NonlinearProblem nlp(model,u,t+dt,dt);
1054 bool reduced =
false;
1059 newton.solve(nlp,unew);
1060 if (newton.has_converged())
1064 if (!reduced && dt<dtmax-1e-13)
1066 dt = std::min(2.0*dt,dtmax);
1068 std::cout <<
"IE: increasing time step to " << dt << std::endl;
1076 HDNUM_ERROR(
"time step too small in implicit Euler");
1082 nlp.set_tnew_dt(t+dt,dt);
1083 if (verbosity>0) std::cout <<
"IE: reducing time step to " << dt << std::endl;
1131 size_type verbosity;
1134 time_type t, dt, dtmax;
1135 number_type reduction;
1136 size_type linesearchsteps;
1152 template<
class M,
class S>
1173 static ButcherTableau initTableau(
const std::string method)
1175 if(method.find(
"Implicit Euler") != std::string::npos){
1176 ButcherTableau butcher(2,2,0.0);
1183 else if(method.find(
"Alexander") != std::string::npos){
1184 ButcherTableau butcher(3,3,0.0);
1185 const number_type alpha = 1. - sqrt(2.)/2.;
1186 butcher[0][0] = alpha;
1187 butcher[0][1] = alpha;
1190 butcher[1][1] = 1. - alpha;
1191 butcher[1][2] = alpha;
1193 butcher[2][1] = 1. - alpha;
1194 butcher[2][2] = alpha;
1198 else if(method.find(
"Crouzieux") != std::string::npos){
1199 ButcherTableau butcher(3,3,0.0);
1200 const number_type beta = 1./2./sqrt(3);
1201 butcher[0][0] = 0.5 + beta;
1202 butcher[0][1] = 0.5 + beta;
1204 butcher[1][0] = 0.5 - beta;
1205 butcher[1][1] = -1. / sqrt(3);
1206 butcher[1][2] = 0.5 + beta;
1208 butcher[2][1] = 0.5;
1209 butcher[2][2] = 0.5;
1213 else if(method.find(
"Midpoint Rule") != std::string::npos){
1214 ButcherTableau butcher(2,2,0.0);
1215 butcher[0][0] = 0.5;
1216 butcher[0][1] = 0.5;
1221 else if(method.find(
"Fractional Step Theta") != std::string::npos){
1222 ButcherTableau butcher(5,5,0.0);
1223 const number_type theta = 1 - sqrt(2.)/2.;
1224 const number_type alpha = 2. - sqrt(2.);
1225 const number_type beta = 1. - alpha;
1226 butcher[1][0] = theta;
1227 butcher[1][1] = beta * theta;
1228 butcher[1][2] = alpha * theta;
1230 butcher[2][0] = 1.-theta;
1231 butcher[2][1] = beta * theta;
1232 butcher[2][2] = alpha * (1.-theta);
1233 butcher[2][3] = alpha * theta;
1236 butcher[3][1] = beta * theta;
1237 butcher[3][2] = alpha * (1.-theta);
1238 butcher[3][3] = (alpha + beta) * theta;
1239 butcher[3][4] = alpha * theta;
1241 butcher[4][1] = beta * theta;
1242 butcher[4][2] = alpha * (1.-theta);
1243 butcher[4][3] = (alpha + beta) * theta;
1244 butcher[4][4] = alpha * theta;
1249 HDNUM_ERROR(
"Order not available for Runge Kutta solver.");
1253 static int initOrder(
const std::string method)
1255 if(method.find(
"Implicit Euler") != std::string::npos){
1258 else if(method.find(
"Alexander") != std::string::npos){
1261 else if(method.find(
"Crouzieux") != std::string::npos){
1264 else if(method.find(
"Midpoint Rule") != std::string::npos){
1267 else if(method.find(
"Fractional Step Theta") != std::string::npos){
1271 HDNUM_ERROR(
"Order not available for Runge Kutta solver.");
1278 class NonlinearProblem
1282 typedef typename M::size_type
size_type;
1289 typename M::time_type told_,
typename M::time_type dt_,
1290 const ButcherTableau & butcher_,
const int rk_step_,
1292 : model(model_), yold(yold_), told(told_),
1293 dt(dt_), butcher(butcher_), rk_step(rk_step_), k_old(model.size(),0)
1295 for(
int i=0; i<rk_step; ++i)
1296 k_old.update(butcher[rk_step][1+i] * dt, k_[i]);
1300 std::size_t size ()
const 1302 return model.size();
1311 current_z.
update(1.,yold);
1313 const number_type tnew = told + butcher[rk_step][0] * dt;
1316 model.f(tnew,current_z,current_k);
1317 result.
update(butcher[rk_step][rk_step+1] * dt, current_k);
1325 const number_type tnew = told + butcher[rk_step][0] * dt;
1328 current_z.
update(1.,yold);
1330 model.f_x(tnew,current_z,result);
1332 result *= dt * butcher[rk_step][rk_step+1];
1334 for (size_type i=0; i<model.size(); i++) result[i][i] -=
number_type(1.0);
1337 void set_told_dt (
typename M::time_type told_,
typename M::time_type dt_)
1346 typename M::time_type told;
1347 typename M::time_type dt;
1348 const ButcherTableau & butcher;
1357 DIRK (
const M& model_,
const S& newton_,
const ButcherTableau & butcher_,
const int order_)
1358 : verbosity(0), butcher(butcher_), model(model_), newton(newton_),
1359 u(model.size()), order(order_)
1361 model.initialize(t,u);
1367 DIRK (
const M& model_,
const S& newton_,
const std::string method)
1368 : verbosity(0), butcher(initTableau(method)), model(model_), newton(newton_), u(model.size()),
1369 order(initOrder(method))
1371 model.initialize(t,u);
1385 verbosity = verbosity_;
1392 const size_type R = butcher.colsize()-1;
1394 bool reduced =
false;
1397 std::cout <<
"DIRK: step to" <<
" t+dt=" << t+dt <<
" dt=" << dt << std::endl;
1401 bool converged =
true;
1404 std::vector< Vector<number_type> > k;
1405 for(size_type i=0; i<R; ++i) {
1407 std::cout <<
"DIRK: step nr "<< i << std::endl;
1415 NonlinearProblem nlp(model,u,t,dt,butcher,i,k);
1417 newton.solve(nlp,current_z);
1419 converged = converged && newton.has_converged();
1424 const number_type t_i = t + butcher[i][0] * dt;
1426 model.f(t_i,current_z,current_k);
1428 k.push_back( current_k );
1434 std::cout <<
"DIRK finished"<< std::endl;
1437 for(size_type i=0; i<R; ++i)
1438 u.update(dt*butcher[R][1+i],k[i]);
1441 if (!reduced && dt<dtmax-1e-13)
1443 dt = std::min(2.0*dt,dtmax);
1445 std::cout <<
"DIRK: increasing time step to " << dt << std::endl;
1453 HDNUM_ERROR(
"time step too small in implicit Euler");
1459 if (verbosity>0) std::cout <<
"DIRK: reducing time step to " << dt << std::endl;
1507 size_type verbosity;
1511 time_type t, dt, dtmax;
1512 number_type reduction;
1513 size_type linesearchsteps;
1520 template<
class T,
class N>
1521 inline void gnuplot (
const std::string& fname,
const std::vector<T> t,
const std::vector<
Vector<N> > u)
1523 std::fstream f(fname.c_str(),std::ios::out);
1524 for (
typename std::vector<T>::size_type n=0; n<t.size(); n++)
1526 f << std::scientific << std::showpoint
1527 << std::setprecision(16) << t[n];
1529 f <<
" " << std::scientific << std::showpoint
1530 << std::setprecision(u[n].precision()) << u[n][i];
1537 template<
class T,
class N>
1538 inline void gnuplot (
const std::string& fname,
const std::vector<T> t,
const std::vector<
Vector<N> > u,
const std::vector<T> dt)
1540 std::fstream f(fname.c_str(),std::ios::out);
1541 for (
typename std::vector<T>::size_type n=0; n<t.size(); n++)
1543 f << std::scientific << std::showpoint
1544 << std::setprecision(16) << t[n];
1546 f <<
" " << std::scientific << std::showpoint
1547 << std::setprecision(u[n].precision()) << u[n][i];
1548 f <<
" " << std::scientific << std::showpoint
1549 << std::setprecision(16) << dt[n];
const Vector< number_type > & get_state() const
get current state
Definition: ode.hh:1102
Implicit Euler using Newton's method to solve nonlinear system.
Definition: ode.hh:963
const Vector< number_type > & get_state() const
get current state
Definition: ode.hh:358
Implementation of a general Diagonal Implicit Runge-Kutta method.
Definition: ode.hh:1153
time_type get_time() const
get current time
Definition: ode.hh:364
const Vector< number_type > & get_state() const
get current state
Definition: ode.hh:1478
time_type get_time() const
get current time
Definition: ode.hh:163
DenseMatrix< number_type > ButcherTableau
the type of a Butcher tableau
Definition: ode.hh:1167
void set_dt(time_type dt_)
set time step for subsequent steps
Definition: ode.hh:683
time_type get_time() const
get current time
Definition: ode.hh:471
const Vector< number_type > & get_state() const
get current state
Definition: ode.hh:579
void set_TOL(time_type TOL_)
set tolerance for adaptive computation
Definition: ode.hh:689
Adaptive Runge-Kutta-Fehlberg method.
Definition: ode.hh:615
time_type get_dt() const
get dt used in last step (i.e. to compute current state)
Definition: ode.hh:1114
M::time_type time_type
export time_type
Definition: ode.hh:622
void set_dt(time_type dt_)
set time step for subsequent steps
Definition: ode.hh:128
M::time_type time_type
export time_type
Definition: ode.hh:1023
size_type get_order() const
return consistency order of the method
Definition: ode.hh:1120
DIRK(const M &model_, const S &newton_, const ButcherTableau &butcher_, const int order_)
Definition: ode.hh:1357
size_type get_order() const
return consistency order of the method
Definition: ode.hh:483
bool get_error() const
get current state
Definition: ode.hh:1089
Adaptive one-step method using Richardson extrapolation.
Definition: ode.hh:825
time_type get_dt() const
get dt used in last step (i.e. to compute current state)
Definition: ode.hh:77
void step()
do one step
Definition: ode.hh:50
M::size_type size_type
export size_type
Definition: ode.hh:829
M::size_type size_type
export size_type
Definition: ode.hh:509
void set_state(time_type t_, const Vector< number_type > &u_)
set current state
Definition: ode.hh:351
Explicit Euler method as an example for an ODE solver.
Definition: ode.hh:23
M::size_type size_type
export size_type
Definition: ode.hh:298
RKF45(const M &model_)
constructor stores reference to the model
Definition: ode.hh:628
time_type get_dt() const
get dt used in last step (i.e. to compute current state)
Definition: ode.hh:591
M::size_type size_type
export size_type
Definition: ode.hh:202
Kutta method (order 3 with 3 stages)
Definition: ode.hh:398
size_type get_order() const
return consistency order of the method
Definition: ode.hh:175
void get_info() const
print some information
Definition: ode.hh:1502
size_type get_order() const
return consistency order of the method
Definition: ode.hh:271
DIRK(const M &model_, const S &newton_, const std::string method)
Definition: ode.hh:1367
void step()
do one step
Definition: ode.hh:434
size_type get_order() const
return consistency order of the method
Definition: ode.hh:376
const Vector< number_type > & get_state() const
get current state
Definition: ode.hh:253
void set_dt(time_type dt_)
set time step for subsequent steps
Definition: ode.hh:428
M::number_type number_type
export number_type
Definition: ode.hh:114
size_type get_order() const
return consistency order of the method
Definition: ode.hh:597
M::time_type time_type
export time_type
Definition: ode.hh:405
void set_dt(time_type dt_)
set time step for subsequent steps
Definition: ode.hh:1037
void step()
do one step
Definition: ode.hh:868
time_type get_dt() const
get dt used in last step (i.e. to compute current state)
Definition: ode.hh:1490
M::size_type size_type
export size_type
Definition: ode.hh:1158
M::number_type number_type
export number_type
Definition: ode.hh:408
size_type get_order() const
return consistency order of the method
Definition: ode.hh:794
time_type get_dt() const
get dt used in last step (i.e. to compute current state)
Definition: ode.hh:925
void set_dt(time_type dt_)
set time step for subsequent steps
Definition: ode.hh:856
void set_dt(time_type dt_)
set time step for subsequent steps
Definition: ode.hh:223
ModifiedEuler(const M &model_)
constructor stores reference to the model
Definition: ode.hh:117
const Vector< number_type > & get_state() const
get current state
Definition: ode.hh:465
Heun method (order 3 with 3 stages)
Definition: ode.hh:294
Vector & update(const REAL alpha, const Vector &y)
Update vector by addition of a scaled vector (x += a y )
Definition: vector.hh:194
M::time_type time_type
export time_type
Definition: ode.hh:1161
const Vector< number_type > & get_state() const
get current state
Definition: ode.hh:65
time_type get_dt() const
get dt used in last step (i.e. to compute current state)
Definition: ode.hh:477
time_type get_time() const
get current time
Definition: ode.hh:1108
M::time_type time_type
export time_type
Definition: ode.hh:832
void set_state(time_type t_, const Vector< number_type > &u_)
set current state
Definition: ode.hh:58
time_type get_dt() const
get dt used in last step (i.e. to compute current state)
Definition: ode.hh:788
M::size_type size_type
export size_type
Definition: ode.hh:1020
bool get_error() const
get current state
Definition: ode.hh:1465
void set_state(time_type t_, const Vector< number_type > &u_)
set current state
Definition: ode.hh:150
void set_state(time_type t_, const Vector< number_type > &u_)
set current state
Definition: ode.hh:1095
void step()
do one step
Definition: ode.hh:1049
size_type get_order() const
return consistency order of the method
Definition: ode.hh:83
void step()
do one step
Definition: ode.hh:543
Modified Euler method (order 2 with 2 stages)
Definition: ode.hh:104
void step()
do one step
Definition: ode.hh:134
Heun2(const M &model_)
constructor stores reference to the model
Definition: ode.hh:211
void set_dt(time_type dt_)
set time step for subsequent steps
Definition: ode.hh:537
size_type get_order() const
return consistency order of the method
Definition: ode.hh:1496
void set_TOL(time_type TOL_)
set tolerance for adaptive computation
Definition: ode.hh:862
M::number_type number_type
export number_type
Definition: ode.hh:33
M::time_type time_type
export time_type
Definition: ode.hh:111
Newton's method with line search.
void get_info() const
print some information
Definition: ode.hh:1126
void step()
do one step
Definition: ode.hh:329
RungeKutta4(const M &model_)
constructor stores reference to the model
Definition: ode.hh:518
void set_state(time_type t_, const Vector< number_type > &u_)
set current state
Definition: ode.hh:1471
Kutta3(const M &model_)
constructor stores reference to the model
Definition: ode.hh:411
time_type get_time() const
get current time
Definition: ode.hh:1484
time_type get_time() const
get current time
Definition: ode.hh:585
RE(const M &model_, S &solver_)
constructor stores reference to the model
Definition: ode.hh:838
void step()
do one step
Definition: ode.hh:1389
M::number_type number_type
export number_type
Definition: ode.hh:515
time_type get_dt() const
get dt used in last step (i.e. to compute current state)
Definition: ode.hh:370
void set_dt(time_type dt_)
set time step for subsequent steps
Definition: ode.hh:1377
time_type get_dt() const
get dt used in last step (i.e. to compute current state)
Definition: ode.hh:169
time_type get_time() const
get current time
Definition: ode.hh:71
void set_state(time_type t_, const Vector< number_type > &u_)
set current state
Definition: ode.hh:246
void set_dt(time_type dt_)
set time step for subsequent steps
Definition: ode.hh:44
void set_dt(time_type dt_)
set time step for subsequent steps
Definition: ode.hh:323
const Vector< number_type > & get_state() const
get current state
Definition: ode.hh:157
EE(const M &model_)
constructor stores reference to the model
Definition: ode.hh:36
M::size_type size_type
export size_type
Definition: ode.hh:108
M::number_type number_type
export number_type
Definition: ode.hh:625
classical Runge-Kutta method (order 4 with 4 stages)
Definition: ode.hh:505
time_type get_time() const
get current time
Definition: ode.hh:782
void step()
do one step
Definition: ode.hh:229
time_type get_dt() const
get dt used in last step (i.e. to compute current state)
Definition: ode.hh:265
time_type get_time() const
get current time
Definition: ode.hh:919
M::number_type number_type
export number_type
Definition: ode.hh:1164
M::number_type number_type
export number_type
Definition: ode.hh:304
void set_state(time_type t_, const Vector< number_type > &u_)
set current state
Definition: ode.hh:572
M::time_type time_type
export time_type
Definition: ode.hh:301
time_type get_time() const
get current time
Definition: ode.hh:259
void get_info() const
print some information
Definition: ode.hh:937
M::time_type time_type
export time_type
Definition: ode.hh:30
void step()
do one step
Definition: ode.hh:695
void get_info() const
print some information
Definition: ode.hh:800
M::number_type number_type
export number_type
Definition: ode.hh:835
M::number_type number_type
export number_type
Definition: ode.hh:208
Definition: densematrix.hh:21
M::time_type time_type
export time_type
Definition: ode.hh:205
size_type get_order() const
return consistency order of the method
Definition: ode.hh:931
M::size_type size_type
export size_type
Definition: ode.hh:402
void set_verbosity(size_type verbosity_)
set verbosity level
Definition: ode.hh:1383
Heun method (order 2 with 2 stages)
Definition: ode.hh:198
IE(const M &model_, const S &newton_)
constructor stores reference to the model
Definition: ode.hh:1029
M::size_type size_type
export size_type
Definition: ode.hh:619
Heun3(const M &model_)
constructor stores reference to the model
Definition: ode.hh:307
const Vector< number_type > & get_state() const
get current state
Definition: ode.hh:913
std::size_t size_type
Type used for array indices.
Definition: vector.hh:32
M::time_type time_type
export time_type
Definition: ode.hh:512
const Vector< number_type > & get_state() const
get current state
Definition: ode.hh:776
M::number_type number_type
export number_type
Definition: ode.hh:1026
M::size_type size_type
export size_type
Definition: ode.hh:27
void set_state(time_type t_, const Vector< number_type > &u_)
set current state
Definition: ode.hh:458
void set_verbosity(size_type verbosity_)
set verbosity level
Definition: ode.hh:1043