# seulex
## Description
The Chicken `seulex` library provides bindings to the Fortran
`SEULEX` solver for systems of stiff differential and differential
algebraic equations of the form `MY'=F(X,Y)`. SEULEX was written by
E. Hairer AND G. Wanner and stands for Semi-implicit EULer
EXtrapolation and computes its error estimates by means of polynomial
extrapolation. Extrapolation solvers can achieve good performance for
certain types of problems where high precision is required.
## Installation notes
The Chicken `seulex` library must be compiled along with the
`SEULEX` Fortran source code. Therefore, the user must have a
Fortran compiler such as gfortran or g95 installed on their system.
The following environment variables can be used to control the Fortran
compilation process:
- `FORTRAN_COMPILER` : path to Fortran compiler (default is "gfortran")
- `FORTRAN_FLAGS` : flags to be passed to the Fortran compiler (default is "-fno-automatic -fPIC -g")
- `FORTRAN_LIBS` : Fortran libraries to link to (default is "-lgfortran -lblas -llapack")
## Library procedures
(seulex-create-solver XINIT YINIT FCN [JACOBIAN] [AUTONOMOUS] [USER-DATA] [DENSITY-COMPONENTS] [RELTOL] [ABSTOL]) => SEULEX-SOLVER
Creates and initializes an object representing a problem to be solved
with the SEULEX solver.
Arguments `XINIT` and `YINIT` represent the initial conditions:
`XINIT` is a scalar value for the independent variable, and
`YINIT` is an SRFI-4 `f64vector` value containing the initial
dependent variable values.
Argument `FCN` is used to compute the right-hand side function
`F` and must be a procedure of the following form:
(LAMBDA T YY DATA)
or
(LAMBDA T YY)
depending on whether the `USER-DATA` optional argument is set, where
; `T` : real-valued independent variable
; `YY` : SRFI-4 `f64vector` with current variable values
; `DATA` : is a user data object (if set)
This procedure must return a SRFI-4 `f64vector` containing the
derivative values.
Optional keyword argument `JACOBIAN` is a procedure which will be
used to compute the partial derivatives of `F(X,Y)` with respect to
`Y`. If not given, it is computed internally by finite differences.
Optional keyword argument `AUTONOMOUS` is a boolean value that
indicates whether `F(X,Y)` is independent of `X` (autonomous) or
not (non-autonomous). The default is `#t` (autonomous).
Optional keyword argument `USER-DATA` is an object that will be
passed as an additional argument to the right-hand side function.
Optional keyword argument `DENSITY-COMPONENTS` must be an SRFI-4
`s32vector` which indicates the components for which dense output
is required.
Optional keyword arguments `RELTOL` and `ABSTOL` specify relative
and absolute error tolerance, respectively. These both default to
1e-4.
(seulex-destroy-solver SEULEX-SOLVER)
Deallocates the memory associated with the given solver.
(seulex-solve SEULEX-SOLVER T)
Integrates the system over an interval in the independent
variable. This procedure returns either when the given `T` is
reached, or when a root is found.
(seulex-yy SEULEX-SOLVER)
Returns the SRFI-4 `f64vector` value of current state values of the
system.
(seulex-nfcn SEULEX-SOLVER)
Returns the number of function evaluations done so far.
(seulex-njac SEULEX-SOLVER)
Returns the number of Jacobian function evaluations done so far.
(seulex-nstep SEULEX-SOLVER)
Returns the number of computed steps.
(seulex-ndec SEULEX-SOLVER)
Returns the number of LU decompositions.
(seulex-nsol SEULEX-SOLVER)
Returns the number of backward-forward substitutions.
## Example
>
> ;;
> ;; Hodgkin-Huxley model
> ;;
>
> (use mathh seulex srfi-4)
>
> (define neg -)
> (define pow expt)
>
> (define TEND 500.0)
>
>
> ;; Model parameters
>
> (define (I_stim t) 10)
> (define C_m 1)
> (define E_Na 50)
> (define E_K -77)
> (define E_L -54.4)
> (define gbar_Na 120)
> (define gbar_K 36)
> (define g_L 0.3)
>
> ;; Rate functions
>
> (define (amf v) (* 0.1 (/ (+ v 40) (- 1.0 (exp (/ (neg (+ v 40)) 10))))))
> (define (bmf v) (* 4.0 (exp (/ (neg (+ v 65)) 18))))
> (define (ahf v) (* 0.07 (exp (/ (neg (+ v 65)) 20))))
> (define (bhf v) (/ 1.0 (+ 1.0 (exp (/ (neg (+ v 35)) 10)))))
> (define (anf v) (* 0.01 (/ (+ v 55) (- 1 (exp (/ (neg (+ v 55)) 10))))))
> (define (bnf v) (* 0.125 (exp (/ (neg (+ v 65)) 80))))
>
> ;; State functions
>
> (define (minf v) (* 0.5 (+ 1 (tanh (/ (- v v1) v2)))))
> (define (winf v) (* 0.5 (+ 1 (tanh (/ (- v v3) v4)))))
> (define (lamw v) (* phi (cosh (/ (- v v3) (* 2 v4)))))
>
> ;; Model equations
>
> (define (rhs t yy)
>
> (let ((v (f64vector-ref yy 0))
> (m (f64vector-ref yy 1))
> (h (f64vector-ref yy 2))
> (n (f64vector-ref yy 3)))
>
> ;; transition rates at current step
> (let ((am (amf v))
> (an (anf v))
> (ah (ahf v))
> (bm (bmf v))
> (bn (bnf v))
> (bh (bhf v))
>
> (g_Na (* gbar_Na (* h (pow m 3))))
> (g_K (* gbar_K (pow n 4))))
>
> (let (
>
> ;; currents
> (I_Na (* (- v E_Na) g_Na))
> (I_K (* (- v E_K) g_K))
> (I_L (* g_L (- v E_L))))
>
> (let (
> ;; state equations
> (dm (- (* am (- 1 m)) (* bm m)))
> (dh (- (* ah (- 1 h)) (* bh h)))
> (dn (- (* an (- 1 n)) (* bn n)))
> (dv (/ (- (I_stim t) I_L I_Na I_K) C_m))
> )
>
> (f64vector dv dm dh dn)
>
> )))
> ))
>
> (let ((yy (f64vector -65 0.052 0.596 0.317)) ;; v m h n
>
> ;; Integration limits
> (t0 0.0)
> (tf TEND)
> (dt 1e-2))
>
> ;; solver initialization
> (let ((solver (seulex-create-solver
> t0 yy rhs
> abstol: 1e-4
> reltol: 1e-4)))
>
> ;; In loop, call solver, print results, and test for error.
>
> (let recur ((tnext (+ t0 dt)) (iout 1))
>
> (let ((flag (seulex-solve solver tnext)))
> (if (negative? flag) (error 'main "SEULEX solver error" flag))
>
> (print-results solver tnext)
>
> (if (< tnext tf)
> (recur (+ tnext dt) (+ 1 iout)))
> ))
>
>
> (seulex-destroy-solver solver)
>
> (define (print-results solver t)
> (let ((yy (seulex-yy solver)))
> (printf "~A ~A ~A ~A ~A~%"
> t
> (f64vector-ref yy 0)
> (f64vector-ref yy 1)
> (f64vector-ref yy 2)
> (f64vector-ref yy 3)
> )))
>
## Version History
- 1.0 Initial release
## License
>
> The SEULEX solver was written by E. HAIRER AND G. WANNER,
> UNIVERSITE DE GENEVE, DEPT. DE MATHEMATIQUES
>
> Chicken Scheme bindings for SEULEX are copyright 2011-2015 Ivan Raikov.
>
> This program is free software: you can redistribute it and/or modify
> it under the terms of the GNU General Public License as published by
> the Free Software Foundation, either version 3 of the License, or (at
> your option) any later version.
>
> This program is distributed in the hope that it will be useful, but
> WITHOUT ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> General Public License for more details.
>
> A full copy of the GPL license can be found at
> .
>