8 double dt,
double tol,
intList *vars)
19 const double c1 = 37.0/378.0;
20 const double c2 = 0.0;
21 const double c3 = 250.0/621.0;
22 const double c4 = 125.0/594.0;
23 const double c5 = 0.0;
24 const double c6 = 512.0/1771.0;
26 const double cs1 = 2825.0/27648.0;
27 const double cs2 = 0.0;
28 const double cs3 = 18575.0/48384.0;
29 const double cs4 = 13525.0/55296.0;
30 const double cs5 = 277.0/14336.0;
31 const double cs6 = 0.25;
33 const double b21 = 0.2;
34 const double b31 = 3.0/40.0 , b32 = 9.0/40.0;
35 const double b41 = 0.3 , b42 = -0.9 , b43 = 1.2;
36 const double b51 = -11.0/54.0 , b52 = 2.5 , b53 = -70.0/27.0 , b54 = 35.0/27.0;
37 const double b61 = 1631.0/55296.0, b62 = 175.0/512.0, b63 = 575.0/13824.0, b64 = 44275.0/110592.0, b65 = 253.0/4096.0;
40 double t, tend, dt_shrink, dt_grow;
51 for (nv = 0; nv <
NVAR; nv++) v1[nv] = v0[nv];
59 FOR_EACH(nv,0,vars) v1[nv] = v0[nv] + dt*b21*k1[nv];
64 FOR_EACH(nv,0,vars) v1[nv] = v0[nv] + dt*(b31*k1[nv] + b32*k2[nv]);
70 v1[nv] = v0[nv] + dt*(b41*k1[nv] + b42*k2[nv] + b43*k3[nv]);
77 v1[nv] = v0[nv] + dt*(b51*k1[nv] + b52*k2[nv] + b53*k3[nv]
85 v1[nv] = v0[nv] + dt*(b61*k1[nv] + b62*k2[nv] + b63*k3[nv]
86 + b64*k4[nv] + b65*k5[nv]);
96 v5th[nv] = v0[nv] + dt*(c1*k1[nv] + c2*k2[nv] + c3*k3[nv]
97 + c4*k4[nv] + c5*k5[nv] + c6*k6[nv]);
103 v4th[nv] = v0[nv] + dt*(cs1*k1[nv] + cs2*k2[nv] + cs3*k3[nv]
104 + cs4*k4[nv] + cs5*k5[nv] + cs6*k6[nv]);
111 vscal[PRS] = fabs(v0[PRS]) + dt*fabs(k1[PRS]);
118 #if COOLING == MINEq && Fe_IONS > 0
119 vscal[FeI] = vscal[FeII] = vscal[FeIII] = 1.e18;
124 scrh = fabs(v5th[nv] - v4th[nv])/fabs(vscal[nv]);
125 err =
MAX(err, scrh);
132 err =
MAX(0.0, 1.e-18);
139 dt_grow = 0.9*dt*pow(err, -0.2);
140 dt_grow =
MIN(dt_grow, 5.0*dt);
145 if (fabs(t/tend - 1.0) < 1.e-9)
break;
149 if (dt > (tend - t)) dt = tend - t;
153 FOR_EACH(nv,0,vars) v0[nv] = v5th[nv];
157 print (
"! SolveODE_CK45: Number of substeps too large (%d)\n",ksub);
164 dt_shrink = 0.9*dt*pow(err, -0.25);
165 dt =
MAX(dt_shrink, 0.05*dt);
172 print (
"! SolveODE_CK45: number of substeps is %d\n", ksub);
199 for (nv = 0; nv <
NVAR; nv++) v1[nv] = v0[nv];
203 FOR_EACH(nv,0,var_list) v1[nv] = v0[nv] + 0.5*dt*k1[nv];
208 FOR_EACH(nv,0,var_list) v1[nv] = v0[nv] + 0.5*dt*k2[nv];
213 FOR_EACH(nv,0,var_list) v1[nv] = v0[nv] + 0.5*dt*k3[nv];
219 v4th[nv] = v0[nv] + dt*(k1[nv] + 2.0*(k2[nv] + k3[nv]) + k4[nv])/6.0;
227 double dt,
double tol,
intList *vars)
235 double err,
scrh, dt_grow;
244 for (nv = 0; nv <
NVAR; nv++) v1[nv] = v0[nv];
248 FOR_EACH(nv, 0, vars) v1[nv] = v0[nv] + 0.5*dt*k1[nv];
254 FOR_EACH(nv, 0, vars) v2nd[nv] = v0[nv] + dt*k2[nv];
258 FOR_EACH(nv, 0, vars) v1st[nv] = v0[nv] + dt*k1[nv];
264 vscal[PRS] = fabs(v0[PRS]) + dt*fabs(k1[PRS]);
271 scrh = fabs(v2nd[nv] - v1st[nv])/fabs(vscal[nv]);
272 err =
MAX(err, scrh);
276 if (err < 1.0)
return ( 1.0);
282 double dt,
double tol,
intList *vars)
297 double err,
scrh, dt_4, dt_6;
309 for (nv = 0; nv <
NVAR; nv++) v1[nv] = v0[nv];
313 FOR_EACH(nv,0,vars) v1[nv] = v0[nv] + dt*k1[nv];
319 FOR_EACH(nv,0,vars) v1[nv] = v0[nv] + dt_4*(k1[nv] + k2[nv]);
325 FOR_EACH(nv,0,vars) v3rd[nv] = v0[nv] + dt_6*(k1[nv] + k2[nv] + 4.0*k3[nv]);
329 FOR_EACH(nv,0,vars) v2nd[nv] = v0[nv] + 0.5*dt*(k1[nv] + k2[nv]);
335 vscal[PRS] = fabs(v0[PRS]) + dt*fabs(k1[PRS]);
342 scrh = fabs(v3rd[nv] - v2nd[nv])/fabs(vscal[nv]);
343 err =
MAX(err, scrh);
347 if (err < 1.0)
return ( 1.0);
351 #define GAM (1.0/2.0)
353 #define A31 (48.0/25.0)
354 #define A32 (6.0/25.0)
356 #define C31 (372.0/25.0)
357 #define C32 (12.0/5.0)
358 #define C41 (-112.0/125.0)
359 #define C42 (-54.0/125.0)
360 #define C43 (-2.0/5.0)
361 #define B1 (19.0/9.0)
363 #define B3 (25.0/108.0)
364 #define B4 (125.0/108.0)
365 #define E1 (17.0/54.0)
366 #define E2 (7.0/36.0)
368 #define E4 (125.0/108.0)
370 #define C1X (1.0/2.0)
371 #define C2X (-3.0/2.0)
372 #define C3X (121.0/50.0)
373 #define C4X (29.0/250.0)
375 #define A3X (3.0/5.0)
379 double dt,
double tol)
386 int i,
j,
n, nv, ksub, kfail;
388 double err,
scrh, t, tend;
390 double tsub[4096], dt_grow, dt_shrink;
391 static double **
a, **J, **J2;
392 static double *g1, *g2, *g3, *g4;
401 for (nv = 0; nv <
NVAR; nv++) v1[nv] = vbeg[nv] = v0[nv];
416 for (i = 0; i < n - 1; i++) vscal[i +
NFLX] = 1.0;
420 #if COOLING == MINEq && Fe_IONS > 0
421 vscal[FeI] = vscal[FeII] = vscal[FeIII] = 1.e18;
424 vscal[PRS] = fabs(v0[PRS]);
458 for (i = 0; i <
n; i++) {
459 for (j = 0; j <
n; j++) a[i][j] = -J[i][j];
460 a[
i][
i] += 1.0/(
GAM*dt);
466 for (i = 0; i < n - 1; i++) {
467 g1[
i] = k1[i +
NFLX];
474 for (i = 0; i < n - 1; i++) {
477 v1[PRS] = v0[PRS] +
A21*g1[n - 1];
483 for (i = 0; i < n - 1; i++) {
486 g2[n - 1] = k2[PRS] +
C21*g1[n - 1]/dt;
491 for (i = 0; i < n - 1; i++) {
494 v1[PRS] = v0[PRS] +
A31*g1[n - 1] +
A32*g2[n - 1];
500 for (i = 0; i < n - 1; i++) {
503 g3[n - 1] = k3[PRS] + (
C31*g1[n - 1] +
C32*g2[n - 1])/dt;
511 for (i = 0; i < n - 1; i++) {
514 g4[n - 1] = k3[PRS] + (
C41*g1[n - 1] +
C42*g2[n - 1] +
C43*g3[n - 1])/dt;
523 v4th[PRS] = v0[PRS] +
B1*g1[
i] +
B2*g2[
i] +
B3*g3[
i] +
B4*g4[
i];
524 err = fabs(
E1*g1[i] +
E2*g2[i] +
E3*g3[i] +
E4*g4[i])/vscal[PRS];
526 for (i = 0; i < n - 1; i++) {
529 err =
MAX(err, fabs(scrh)/vscal[i +
NFLX]);
537 err =
MAX(0.0, 1.e-18);
544 dt_grow = 0.9*dt*pow(err, -0.25);
545 dt_grow =
MIN(dt_grow, 5.0*dt);
550 if (fabs(t/tend - 1.0) < 1.e-9)
break;
554 if (dt > (tend - t)) dt = tend - t;
564 print (
"! SolveODE_ROS34: Number of substeps too large (%d)\n",ksub);
571 dt_shrink = 0.9*dt*pow(err, -1.0/3.0);
572 dt =
MAX(dt_shrink, 0.05*dt);
578 print (
"! SolveODE_ROS34: number of substeps is %d\n", ksub);
void Radiat(double *, double *)
#define FOR_EACH(nv, beg, list)
double SolveODE_CK45(double *v0, double *k1, double *v5th, double dt, double tol, intList *vars)
double SolveODE_RKF12(double *v0, double *k1, double *v2nd, double dt, double tol, intList *vars)
void LUBackSubst(double **a, int n, int *indx, double b[])
double SolveODE_RKF23(double *v0, double *k1, double *v3rd, double dt, double tol, intList *vars)
void Jacobian(real *v, real *rhs, real **dfdy)
void print(const char *fmt,...)
double SolveODE_ROS34(double *v0, double *k1, double *v4th, double dt, double tol)
#define ARRAY_1D(nx, type)
#define ARRAY_2D(nx, ny, type)
int LUDecompose(double **a, int n, int *indx, double *d)
#define QUIT_PLUTO(e_code)
double SolveODE_RK4(double *v0, double *k1, double *v4th, double dt, intList *var_list)