diff options
Diffstat (limited to 'packages/gsl/src/Numeric/GSL/gsl-ode.c')
-rw-r--r-- | packages/gsl/src/Numeric/GSL/gsl-ode.c | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/packages/gsl/src/Numeric/GSL/gsl-ode.c b/packages/gsl/src/Numeric/GSL/gsl-ode.c index 3f2771b..a6bdb55 100644 --- a/packages/gsl/src/Numeric/GSL/gsl-ode.c +++ b/packages/gsl/src/Numeric/GSL/gsl-ode.c | |||
@@ -23,10 +23,11 @@ int odejac (double t, const double y[], double *dfdy, double dfdt[], void *param | |||
23 | } | 23 | } |
24 | 24 | ||
25 | 25 | ||
26 | int ode(int method, double h, double eps_abs, double eps_rel, | 26 | int ode(int method, int control, double h, |
27 | double eps_abs, double eps_rel, double a_y, double a_dydt, | ||
27 | int f(double, int, const double*, int, double*), | 28 | int f(double, int, const double*, int, double*), |
28 | int jac(double, int, const double*, int, int, double*), | 29 | int jac(double, int, const double*, int, int, double*), |
29 | KRVEC(xi), KRVEC(ts), RMAT(sol)) { | 30 | KRVEC(sc), KRVEC(xi), KRVEC(ts), RMAT(sol)) { |
30 | 31 | ||
31 | const gsl_odeiv_step_type * T; | 32 | const gsl_odeiv_step_type * T; |
32 | 33 | ||
@@ -46,8 +47,16 @@ int ode(int method, double h, double eps_abs, double eps_rel, | |||
46 | } | 47 | } |
47 | 48 | ||
48 | gsl_odeiv_step * s = gsl_odeiv_step_alloc (T, xin); | 49 | gsl_odeiv_step * s = gsl_odeiv_step_alloc (T, xin); |
49 | gsl_odeiv_control * c = gsl_odeiv_control_y_new (eps_abs, eps_rel); | ||
50 | gsl_odeiv_evolve * e = gsl_odeiv_evolve_alloc (xin); | 50 | gsl_odeiv_evolve * e = gsl_odeiv_evolve_alloc (xin); |
51 | gsl_odeiv_control * c; | ||
52 | |||
53 | switch(control) { | ||
54 | case 0: { c = gsl_odeiv_control_standard_new | ||
55 | (eps_abs, eps_rel, a_y, a_dydt); break; } | ||
56 | case 1: { c = gsl_odeiv_control_scaled_new | ||
57 | (eps_abs, eps_rel, a_y, a_dydt, scp, scn); break; } | ||
58 | default: ERROR(BAD_CODE); | ||
59 | } | ||
51 | 60 | ||
52 | Tode P; | 61 | Tode P; |
53 | P.f = f; | 62 | P.f = f; |
@@ -112,10 +121,11 @@ int odejac (double t, const double y[], double *dfdy, double dfdt[], void *param | |||
112 | } | 121 | } |
113 | 122 | ||
114 | 123 | ||
115 | int ode(int method, double h, double eps_abs, double eps_rel, | 124 | int ode(int method, int control, double h, |
125 | double eps_abs, double eps_rel, double a_y, double a_dydt, | ||
116 | int f(double, int, const double*, int, double*), | 126 | int f(double, int, const double*, int, double*), |
117 | int jac(double, int, const double*, int, int, double*), | 127 | int jac(double, int, const double*, int, int, double*), |
118 | KRVEC(xi), KRVEC(ts), RMAT(sol)) { | 128 | KRVEC(sc), KRVEC(xi), KRVEC(ts), RMAT(sol)) { |
119 | 129 | ||
120 | const gsl_odeiv2_step_type * T; | 130 | const gsl_odeiv2_step_type * T; |
121 | 131 | ||
@@ -141,8 +151,15 @@ int ode(int method, double h, double eps_abs, double eps_rel, | |||
141 | 151 | ||
142 | gsl_odeiv2_system sys = {odefunc, odejac, xin, &P}; | 152 | gsl_odeiv2_system sys = {odefunc, odejac, xin, &P}; |
143 | 153 | ||
144 | gsl_odeiv2_driver * d = | 154 | gsl_odeiv2_driver * d; |
145 | gsl_odeiv2_driver_alloc_y_new (&sys, T, h, eps_abs, eps_rel); | 155 | |
156 | switch(control) { | ||
157 | case 0: { d = gsl_odeiv2_driver_alloc_standard_new | ||
158 | (&sys, T, h, eps_abs, eps_rel, a_y, a_dydt); break; } | ||
159 | case 1: { d = gsl_odeiv2_driver_alloc_scaled_new | ||
160 | (&sys, T, h, eps_abs, eps_rel, a_y, a_dydt, scp); break; } | ||
161 | default: ERROR(BAD_CODE); | ||
162 | } | ||
146 | 163 | ||
147 | double t = tsp[0]; | 164 | double t = tsp[0]; |
148 | 165 | ||