summaryrefslogtreecommitdiff
path: root/src/c/differential_calculus/ode/dodea.c
diff options
context:
space:
mode:
authorsiddhu89902016-06-06 09:18:33 +0530
committersiddhu89902016-06-06 09:18:33 +0530
commitc75fb67154fb5679d6ede9a52d5f5ae15600f9f9 (patch)
treec2c950617ab555a0fa74a4f7e0c592ec80bcf3bd /src/c/differential_calculus/ode/dodea.c
parent212c54043e454e41ca4b23a5b965d4dbd4b683fe (diff)
downloadscilab2c-c75fb67154fb5679d6ede9a52d5f5ae15600f9f9.tar.gz
scilab2c-c75fb67154fb5679d6ede9a52d5f5ae15600f9f9.tar.bz2
scilab2c-c75fb67154fb5679d6ede9a52d5f5ae15600f9f9.zip
File handling functions added
Diffstat (limited to 'src/c/differential_calculus/ode/dodea.c')
-rw-r--r--src/c/differential_calculus/ode/dodea.c32
1 files changed, 25 insertions, 7 deletions
diff --git a/src/c/differential_calculus/ode/dodea.c b/src/c/differential_calculus/ode/dodea.c
index ff3cbdec..1cb07fab 100644
--- a/src/c/differential_calculus/ode/dodea.c
+++ b/src/c/differential_calculus/ode/dodea.c
@@ -10,7 +10,7 @@
Email: toolbox@scilab.in
*/
-//Function for solving ODEs using GSL library
+/*Function for solving ODEs using GSL library*/
#include "ode.h"
#include "types.h"
@@ -20,21 +20,39 @@
void dodea(double *initial_value, double start_time, double end_time, \
- char *ode_function, double nequs, double eps_abs, double eps_rel, \
- double step_size, int *params, double *out)
+ int (*ode_function), char *solver_type, double nequs, double eps_abs, \
+ double eps_rel, double step_size, int *params, double *out)
{
double t = start_time;
- //Initialise output to initial state
+ gsl_odeiv2_step_type *step_type;
+
+ /*Initialise output to initial state*/
int counter = 0;
for (counter = 0; counter<nequs;counter++)
{
out[counter] = initial_value[counter];
}
- //Setup ODE related parameters
- gsl_odeiv2_system sys = {ode_function, NULL, 2, params};
+ /*Setup ODE related parameters*/
+ gsl_odeiv2_system sys = {ode_function, NULL, nequs, params};
- gsl_odeiv2_step *s = gsl_odeiv2_step_alloc (gsl_odeiv2_step_rkf45, nequs);
+ /*Select step solver*/
+ if (solver_type == "adams")
+ step_type = gsl_odeiv2_step_msadams;
+ if (solver_type == "stiff")
+ step_type = gsl_odeiv2_step_msbdf;
+ if (solver_type == "rk")
+ step_type = gsl_odeiv2_step_rk4;
+ if (solver_type == "rkf")
+ step_type = gsl_odeiv2_step_rkf45;
+ if (solver_type == "root")
+ step_type = gsl_odeiv2_step_rkck;
+ if (solver_type == "discrete")
+ step_type = gsl_odeiv2_step_rk8pd;
+ else
+ step_type = gsl_odeiv2_step_rkf45;
+
+ gsl_odeiv2_step *s = gsl_odeiv2_step_alloc (step_type, nequs);
gsl_odeiv2_control *c = gsl_odeiv2_control_y_new (eps_abs, eps_rel);
gsl_odeiv2_evolve *e = gsl_odeiv2_evolve_alloc (nequs);