File indexing completed on 2025-02-21 10:03:51
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023 #ifndef __GSL_ODEIV2_H__
0024 #define __GSL_ODEIV2_H__
0025
0026 #include <stdio.h>
0027 #include <stdlib.h>
0028 #include <gsl/gsl_types.h>
0029
0030 #undef __BEGIN_DECLS
0031 #undef __END_DECLS
0032 #ifdef __cplusplus
0033 # define __BEGIN_DECLS extern "C" {
0034 # define __END_DECLS }
0035 #else
0036 # define __BEGIN_DECLS
0037 # define __END_DECLS
0038 #endif
0039
0040 __BEGIN_DECLS
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056 typedef struct
0057 {
0058 int (*function) (double t, const double y[], double dydt[], void *params);
0059 int (*jacobian) (double t, const double y[], double *dfdy, double dfdt[],
0060 void *params);
0061 size_t dimension;
0062 void *params;
0063 }
0064 gsl_odeiv2_system;
0065
0066
0067
0068 #define GSL_ODEIV_FN_EVAL(S,t,y,f) (*((S)->function))(t,y,f,(S)->params)
0069 #define GSL_ODEIV_JA_EVAL(S,t,y,dfdy,dfdt) (*((S)->jacobian))(t,y,dfdy,dfdt,(S)->params)
0070
0071
0072
0073 typedef struct gsl_odeiv2_step_struct gsl_odeiv2_step;
0074 typedef struct gsl_odeiv2_control_struct gsl_odeiv2_control;
0075 typedef struct gsl_odeiv2_evolve_struct gsl_odeiv2_evolve;
0076 typedef struct gsl_odeiv2_driver_struct gsl_odeiv2_driver;
0077
0078
0079
0080
0081
0082
0083
0084
0085 typedef struct
0086 {
0087 const char *name;
0088 int can_use_dydt_in;
0089 int gives_exact_dydt_out;
0090 void *(*alloc) (size_t dim);
0091 int (*apply) (void *state, size_t dim, double t, double h, double y[],
0092 double yerr[], const double dydt_in[], double dydt_out[],
0093 const gsl_odeiv2_system * dydt);
0094 int (*set_driver) (void *state, const gsl_odeiv2_driver * d);
0095 int (*reset) (void *state, size_t dim);
0096 unsigned int (*order) (void *state);
0097 void (*free) (void *state);
0098 }
0099 gsl_odeiv2_step_type;
0100
0101 struct gsl_odeiv2_step_struct
0102 {
0103 const gsl_odeiv2_step_type *type;
0104 size_t dimension;
0105 void *state;
0106 };
0107
0108
0109
0110 GSL_VAR const gsl_odeiv2_step_type *gsl_odeiv2_step_rk2;
0111 GSL_VAR const gsl_odeiv2_step_type *gsl_odeiv2_step_rk4;
0112 GSL_VAR const gsl_odeiv2_step_type *gsl_odeiv2_step_rkf45;
0113 GSL_VAR const gsl_odeiv2_step_type *gsl_odeiv2_step_rkck;
0114 GSL_VAR const gsl_odeiv2_step_type *gsl_odeiv2_step_rk8pd;
0115 GSL_VAR const gsl_odeiv2_step_type *gsl_odeiv2_step_rk2imp;
0116 GSL_VAR const gsl_odeiv2_step_type *gsl_odeiv2_step_rk4imp;
0117 GSL_VAR const gsl_odeiv2_step_type *gsl_odeiv2_step_bsimp;
0118 GSL_VAR const gsl_odeiv2_step_type *gsl_odeiv2_step_rk1imp;
0119 GSL_VAR const gsl_odeiv2_step_type *gsl_odeiv2_step_msadams;
0120 GSL_VAR const gsl_odeiv2_step_type *gsl_odeiv2_step_msbdf;
0121
0122
0123
0124 gsl_odeiv2_step *gsl_odeiv2_step_alloc (const gsl_odeiv2_step_type * T,
0125 size_t dim);
0126 int gsl_odeiv2_step_reset (gsl_odeiv2_step * s);
0127 void gsl_odeiv2_step_free (gsl_odeiv2_step * s);
0128 const char *gsl_odeiv2_step_name (const gsl_odeiv2_step * s);
0129 unsigned int gsl_odeiv2_step_order (const gsl_odeiv2_step * s);
0130 int gsl_odeiv2_step_apply (gsl_odeiv2_step * s, double t, double h,
0131 double y[], double yerr[], const double dydt_in[],
0132 double dydt_out[], const gsl_odeiv2_system * dydt);
0133 int gsl_odeiv2_step_set_driver (gsl_odeiv2_step * s,
0134 const gsl_odeiv2_driver * d);
0135
0136
0137
0138 typedef struct
0139 {
0140 const char *name;
0141 void *(*alloc) (void);
0142 int (*init) (void *state, double eps_abs, double eps_rel, double a_y,
0143 double a_dydt);
0144 int (*hadjust) (void *state, size_t dim, unsigned int ord, const double y[],
0145 const double yerr[], const double yp[], double *h);
0146 int (*errlevel) (void *state, const double y, const double dydt,
0147 const double h, const size_t ind, double *errlev);
0148 int (*set_driver) (void *state, const gsl_odeiv2_driver * d);
0149 void (*free) (void *state);
0150 }
0151 gsl_odeiv2_control_type;
0152
0153 struct gsl_odeiv2_control_struct
0154 {
0155 const gsl_odeiv2_control_type *type;
0156 void *state;
0157 };
0158
0159
0160
0161 #define GSL_ODEIV_HADJ_INC 1
0162 #define GSL_ODEIV_HADJ_NIL 0
0163 #define GSL_ODEIV_HADJ_DEC (-1)
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176 gsl_odeiv2_control *gsl_odeiv2_control_alloc (const gsl_odeiv2_control_type *
0177 T);
0178 int gsl_odeiv2_control_init (gsl_odeiv2_control * c, double eps_abs,
0179 double eps_rel, double a_y, double a_dydt);
0180 void gsl_odeiv2_control_free (gsl_odeiv2_control * c);
0181 int gsl_odeiv2_control_hadjust (gsl_odeiv2_control * c, gsl_odeiv2_step * s,
0182 const double y[], const double yerr[],
0183 const double dydt[], double *h);
0184 const char *gsl_odeiv2_control_name (const gsl_odeiv2_control * c);
0185 int gsl_odeiv2_control_errlevel (gsl_odeiv2_control * c, const double y,
0186 const double dydt, const double h,
0187 const size_t ind, double *errlev);
0188 int gsl_odeiv2_control_set_driver (gsl_odeiv2_control * c,
0189 const gsl_odeiv2_driver * d);
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210 gsl_odeiv2_control *gsl_odeiv2_control_standard_new (double eps_abs,
0211 double eps_rel,
0212 double a_y,
0213 double a_dydt);
0214 gsl_odeiv2_control *gsl_odeiv2_control_y_new (double eps_abs, double eps_rel);
0215 gsl_odeiv2_control *gsl_odeiv2_control_yp_new (double eps_abs,
0216 double eps_rel);
0217
0218
0219
0220
0221
0222
0223
0224 gsl_odeiv2_control *gsl_odeiv2_control_scaled_new (double eps_abs,
0225 double eps_rel, double a_y,
0226 double a_dydt,
0227 const double scale_abs[],
0228 size_t dim);
0229
0230
0231
0232 struct gsl_odeiv2_evolve_struct
0233 {
0234 size_t dimension;
0235 double *y0;
0236 double *yerr;
0237 double *dydt_in;
0238 double *dydt_out;
0239 double last_step;
0240 unsigned long int count;
0241 unsigned long int failed_steps;
0242 const gsl_odeiv2_driver *driver;
0243 };
0244
0245
0246
0247 gsl_odeiv2_evolve *gsl_odeiv2_evolve_alloc (size_t dim);
0248 int gsl_odeiv2_evolve_apply (gsl_odeiv2_evolve * e, gsl_odeiv2_control * con,
0249 gsl_odeiv2_step * step,
0250 const gsl_odeiv2_system * dydt, double *t,
0251 double t1, double *h, double y[]);
0252 int gsl_odeiv2_evolve_apply_fixed_step (gsl_odeiv2_evolve * e,
0253 gsl_odeiv2_control * con,
0254 gsl_odeiv2_step * step,
0255 const gsl_odeiv2_system * dydt,
0256 double *t, const double h0,
0257 double y[]);
0258 int gsl_odeiv2_evolve_reset (gsl_odeiv2_evolve * e);
0259 void gsl_odeiv2_evolve_free (gsl_odeiv2_evolve * e);
0260 int gsl_odeiv2_evolve_set_driver (gsl_odeiv2_evolve * e,
0261 const gsl_odeiv2_driver * d);
0262
0263
0264
0265
0266
0267
0268
0269 struct gsl_odeiv2_driver_struct
0270 {
0271 const gsl_odeiv2_system *sys;
0272 gsl_odeiv2_step *s;
0273 gsl_odeiv2_control *c;
0274 gsl_odeiv2_evolve *e;
0275 double h;
0276 double hmin;
0277 double hmax;
0278 unsigned long int n;
0279 unsigned long int nmax;
0280 };
0281
0282
0283
0284 gsl_odeiv2_driver *gsl_odeiv2_driver_alloc_y_new (const gsl_odeiv2_system *
0285 sys,
0286 const gsl_odeiv2_step_type *
0287 T, const double hstart,
0288 const double epsabs,
0289 const double epsrel);
0290 gsl_odeiv2_driver *gsl_odeiv2_driver_alloc_yp_new (const gsl_odeiv2_system *
0291 sys,
0292 const gsl_odeiv2_step_type
0293 * T, const double hstart,
0294 const double epsabs,
0295 const double epsrel);
0296 gsl_odeiv2_driver *gsl_odeiv2_driver_alloc_scaled_new (const gsl_odeiv2_system
0297 * sys,
0298 const
0299 gsl_odeiv2_step_type *
0300 T, const double hstart,
0301 const double epsabs,
0302 const double epsrel,
0303 const double a_y,
0304 const double a_dydt,
0305 const double
0306 scale_abs[]);
0307 gsl_odeiv2_driver *gsl_odeiv2_driver_alloc_standard_new (const
0308 gsl_odeiv2_system *
0309 sys,
0310 const
0311 gsl_odeiv2_step_type
0312 * T,
0313 const double hstart,
0314 const double epsabs,
0315 const double epsrel,
0316 const double a_y,
0317 const double a_dydt);
0318 int gsl_odeiv2_driver_set_hmin (gsl_odeiv2_driver * d, const double hmin);
0319 int gsl_odeiv2_driver_set_hmax (gsl_odeiv2_driver * d, const double hmax);
0320 int gsl_odeiv2_driver_set_nmax (gsl_odeiv2_driver * d,
0321 const unsigned long int nmax);
0322 int gsl_odeiv2_driver_apply (gsl_odeiv2_driver * d, double *t,
0323 const double t1, double y[]);
0324 int gsl_odeiv2_driver_apply_fixed_step (gsl_odeiv2_driver * d, double *t,
0325 const double h,
0326 const unsigned long int n,
0327 double y[]);
0328 int gsl_odeiv2_driver_reset (gsl_odeiv2_driver * d);
0329 int gsl_odeiv2_driver_reset_hstart (gsl_odeiv2_driver * d, const double hstart);
0330 void gsl_odeiv2_driver_free (gsl_odeiv2_driver * state);
0331
0332 __END_DECLS
0333 #endif