summaryrefslogtreecommitdiff
path: root/src/c/differential_calculus
diff options
context:
space:
mode:
Diffstat (limited to 'src/c/differential_calculus')
-rw-r--r--src/c/differential_calculus/includes/ode.h6
-rw-r--r--src/c/differential_calculus/interfaces/int_ode.h31
-rw-r--r--src/c/differential_calculus/ode/dodea.c32
-rw-r--r--src/c/differential_calculus/ode/dodes.c44
4 files changed, 83 insertions, 30 deletions
diff --git a/src/c/differential_calculus/includes/ode.h b/src/c/differential_calculus/includes/ode.h
index 0a870201..79962434 100644
--- a/src/c/differential_calculus/includes/ode.h
+++ b/src/c/differential_calculus/includes/ode.h
@@ -14,11 +14,11 @@
#define __ODE_H__
double dodes(double initial_value, double start_time, double end_time, \
- char *ode_function, double nequs, double eps_abs, double eps_rel, \
- double step_size);
+ int (*ode_function), char *solver_type, double nequs, double eps_abs, double eps_rel, \
+ double step_size, int *params);
void dodea(double *initial_value, double start_time, double end_time, \
- char *ode_function, double nequs, double eps_abs, double eps_rel, \
+ int (*ode_function), char *solver_type, double nequs, double eps_abs, double eps_rel, \
double step_size, int *params, double *out);
#endif /*__ODE_H__*/ \ No newline at end of file
diff --git a/src/c/differential_calculus/interfaces/int_ode.h b/src/c/differential_calculus/interfaces/int_ode.h
index 1cb64497..28f43999 100644
--- a/src/c/differential_calculus/interfaces/int_ode.h
+++ b/src/c/differential_calculus/interfaces/int_ode.h
@@ -17,11 +17,34 @@
extern "C" {
#endif
-#define d0d0d0g2oded0(in1, in2, in3, in4) dodes(in1, in2, in3, in4, 1, 1.0e-2,\
- 1.0e-2, 1.0e-6)
+#define d0d0d0fn0oded0(in1, in2, in3, func_name) dodes(in1, in2, in3, \
+ func_name, "rkf",1, 1.0e-2, 1.0e-2, 1.0e-6, NULL)
-#define d2d0d0f0oded2(in1, size1, in2, in3, func_name, out) dodea(in1, in2, in3, func_name, \
- size1[1], 1.0e-2, 1.0e-2, 1.0e-6, size1, out)
+#define d2d0d0fn0oded2(in1, size1, in2, in3, func_name, out) dodea(in1, \
+ in2, in3, func_name, "rkf",size1[1], 1.0e-2, 1.0e-2, \
+ 1.0e-6, size1, out)
+
+#define d0d0d2fn0oded2(in1, in2, in3, size3, func_name, out) dodea(in1, in2, \
+ in3, func_name, "rkf", 1, 1.0e-2, 1.0e-2, 1.0e-6, size3, out)
+
+#define d2d0d2fn0oded2(in1, size1, in2, in3, size3, func_name, out) dodea(in1, \
+ in2, in3, func_name, "rkf",size1[1], 1.0e-2, 1.0e-2, \
+ 1.0e-6, size1, out)
+
+#define g2d0d0d0fn0oded0(solvertype, typesize, in1, in2, in3, func_name) dodes(in1, in2, in3, \
+ func_name, solvertype, 1, 1.0e-2, 1.0e-2, 1.0e-6, NULL)
+
+#define g2d2d0d0fn0oded2(solvertype, typesize, in1, size1, in2, in3, func_name, out) \
+ dodea(in1, in2, in3, func_name, solvertype, size1[1], \
+ 1.0e-2, 1.0e-2, 1.0e-6, size1, out)
+
+#define g2d0d0d2fn0oded2(solvertype, typesize, in1, in2, in3, size3, func_name, out) \
+ dodea(in1, in2, in3, func_name, solvertype,1, 1.0e-2, 1.0e-2, \
+ 1.0e-6, size3, out)
+
+#define g2d2d0d2fn0oded2(solvertype, typesize, in1, size1, in2, in3, size3, func_name, out) dodea(in1, \
+ in2, in3, func_name, solvertype, size1[1], 1.0e-2, 1.0e-2, \
+ 1.0e-6, size1, out)
#ifdef __cplusplus
} /* extern "C" */
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);
diff --git a/src/c/differential_calculus/ode/dodes.c b/src/c/differential_calculus/ode/dodes.c
index ee6718bb..adef1ba7 100644
--- a/src/c/differential_calculus/ode/dodes.c
+++ b/src/c/differential_calculus/ode/dodes.c
@@ -1,13 +1,16 @@
-// Copyright (C) 2016 - IIT Bombay - FOSSEE
-//
-// This file must be used under the terms of the CeCILL.
-// This source file is licensed as described in the file COPYING, which
-// you should have received as part of this distribution. The terms
-// are also available at
-// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
-// Author: Siddhesh Wani
-// Organization: FOSSEE, IIT Bombay
-// Email: toolbox@scilab.in
+/* Copyright (C) 2016 - IIT Bombay - FOSSEE
+
+ This file must be used under the terms of the CeCILL.
+ This source file is licensed as described in the file COPYING, which
+ you should have received as part of this distribution. The terms
+ are also available at
+ http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ Author: Siddhesh Wani
+ Organization: FOSSEE, IIT Bombay
+ Email: toolbox@scilab.in
+*/
+
+/*Function for solving ODEs using GSL library*/
#include "ode.h"
#include "types.h"
@@ -17,20 +20,29 @@
double dodes(double initial_value, double start_time, double end_time, \
- char *ode_function, double nequs, double eps_abs, double eps_rel, \
- double step_size)
+ int (*ode_function), char *solver_type, double nequs, double eps_abs, \
+ double eps_rel, double step_size, int *params)
{
- double out = 0;
+ double out = 0, t = 0;
//int status;
+ out = initial_value;
+ t = start_time;
//Setup ODE related parameters
- gsl_odeiv2_system sys = {ode_function, NULL, 2, NULL};
+ gsl_odeiv2_system sys = {ode_function, NULL, nequs, NULL};
gsl_odeiv2_step *s = gsl_odeiv2_step_alloc (gsl_odeiv2_step_rkf45, nequs);
gsl_odeiv2_control *c = gsl_odeiv2_control_y_new (eps_abs, eps_rel);
gsl_odeiv2_evolve *e = gsl_odeiv2_evolve_alloc (nequs);
- gsl_odeiv2_evolve_apply_fixed_step (e, c, s, &sys, &start_time, step_size, &out);
-
+ while(t < end_time)
+ {
+ gsl_odeiv2_evolve_apply_fixed_step (e, c, s, &sys, &t, step_size, &out);
+ }
+
+ gsl_odeiv2_evolve_free (e);
+ gsl_odeiv2_control_free (c);
+ gsl_odeiv2_step_free (s);
+
return out;
}