package gsl

  1. Overview
  2. Docs

Source file odeiv.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
(* gsl-ocaml - OCaml interface to GSL                       *)
(* Copyright (©) 2002-2012 - Olivier Andrieu                *)
(* Distributed under the terms of the GPL version 3         *)

let () = Error.init ()

type system

external _alloc :
  (float -> float array -> float array -> unit) ->
  ?jacobian:(float -> float array -> Matrix.matrix -> float array -> unit) ->
  int ->
  system = "ml_gsl_odeiv_alloc_system"

external _free : system -> unit = "ml_gsl_odeiv_free_system"

let make_system f ?jac dim =
  let s = _alloc f ?jacobian:jac dim in
  Gc.finalise _free s;
  s

type step

type step_kind =
  | RK2
  | RK4
  | RKF45
  | RKCK
  | RK8PD
  | RK2IMP
  | RK2SIMP
  | RK4IMP
  | BSIMP
  | GEAR1
  | GEAR2

external _step_alloc : step_kind -> dim:int -> step = "ml_gsl_odeiv_step_alloc"
external _step_free : step -> unit = "ml_gsl_odeiv_step_free"

let make_step kind ~dim =
  let s = _step_alloc kind ~dim in
  Gc.finalise _step_free s;
  s

external step_reset : step -> unit = "ml_gsl_odeiv_step_reset"
external step_name : step -> string = "ml_gsl_odeiv_step_name"
external step_order : step -> int = "ml_gsl_odeiv_step_order"

external step_apply :
  step ->
  t:float ->
  h:float ->
  y:float array ->
  yerr:float array ->
  ?dydt_in:float array ->
  ?dydt_out:float array ->
  system ->
  unit = "ml_gsl_odeiv_step_apply_bc" "ml_gsl_odeiv_step_apply"

type control

external _control_free : control -> unit = "ml_gsl_odeiv_control_free"

external _control_standard_new :
  eps_abs:float -> eps_rel:float -> a_y:float -> a_dydt:float -> control
  = "ml_gsl_odeiv_control_standard_new"

external _control_y_new : eps_abs:float -> eps_rel:float -> control
  = "ml_gsl_odeiv_control_y_new"

external _control_yp_new : eps_abs:float -> eps_rel:float -> control
  = "ml_gsl_odeiv_control_yp_new"

external _control_scaled_new :
  eps_abs:float ->
  eps_rel:float ->
  a_y:float ->
  a_dydt:float ->
  scale_abs:float array ->
  control = "ml_gsl_odeiv_control_scaled_new"

let make_control_standard_new ~eps_abs ~eps_rel ~a_y ~a_dydt =
  let c = _control_standard_new ~eps_abs ~eps_rel ~a_y ~a_dydt in
  Gc.finalise _control_free c;
  c

let make_control_y_new ~eps_abs ~eps_rel =
  let c = _control_y_new ~eps_abs ~eps_rel in
  Gc.finalise _control_free c;
  c

let make_control_yp_new ~eps_abs ~eps_rel =
  let c = _control_yp_new ~eps_abs ~eps_rel in
  Gc.finalise _control_free c;
  c

let make_control_scaled_new ~eps_abs ~eps_rel ~a_y ~a_dydt ~scale_abs =
  let c = _control_scaled_new ~eps_abs ~eps_rel ~a_y ~a_dydt ~scale_abs in
  Gc.finalise _control_free c;
  c

external control_name : control -> string = "ml_gsl_odeiv_control_name"

type hadjust = HADJ_DEC | HADJ_NIL | HADJ_INC

external control_hadjust :
  control ->
  step ->
  y:float array ->
  yerr:float array ->
  dydt:float array ->
  h:float ->
  hadjust * float
  = "ml_gsl_odeiv_control_hadjust_bc" "ml_gsl_odeiv_control_hadjust"

type evolve

external _evolve_alloc : int -> evolve = "ml_gsl_odeiv_evolve_alloc"
external _evolve_free : evolve -> unit = "ml_gsl_odeiv_evolve_free"

let make_evolve dim =
  let e = _evolve_alloc dim in
  Gc.finalise _evolve_free e;
  e

external evolve_reset : evolve -> unit = "ml_gsl_odeiv_evolve_reset"

external evolve_apply :
  evolve ->
  control ->
  step ->
  system ->
  t:float ->
  t1:float ->
  h:float ->
  y:float array ->
  float * float = "ml_gsl_odeiv_evolve_apply_bc" "ml_gsl_odeiv_evolve_apply"
OCaml

Innovation. Community. Security.