Hi,
I am trying to solve a second order ODE by calling a stepper for a number of fixed-size steps. I am getting an error about conversion to foreign type c-pointer.
I modeled my call to `apply-step' based on `apply-evolution'. Looking at the source files, that is likely not to work because `apply-evolution' uses c-pointers, and `apply-step' makes direct variable references. But I don't know how to deal with those - my C and CFFI knowledge are non-existent.
Anyway, here is a sample code that I hope someone can improve:
;;;; Example of a simple time-stepper
(defun sin-ode (time y z)
"Define ODE for a sinusoid
y''=-y
or as a system:
y'=z
z'=-y
with initial conditions:
y0=0
z0=1 "
(declare (ignore time))
(values z (- y)))
(defun sin-ode-jacobian (time y z)
(declare (ignore time y z))
(values 0d0 0d0
0d0 1d0
-1d0 0d0))
#|
(let ((time 0d0)
(delta-t 0.1d0)
(stepper-type +step-rk2+))
(let ((stepper (make-ode-stepper stepper-type 2 #'sin-ode #'sin-ode-jacobian))
(dep (make-marray 'double-float :dimensions 2))
(dydt-in (make-marray 'double-float :dimensions 2))
(dydt-out (make-marray 'double-float :dimensions 2))
(yerr (make-marray 'double-float :dimensions 2)))
(setf (maref dep 0) 0d0
(maref dep 1) 1d0)
(dotimes (i 10)
(incf time delta-t)
(apply-step stepper time dep delta-t yerr dydt-in dydt-out))))
|#
BTW, once this is working, I will submit it as a patch to the ode-examples.lisp file
Thanks,
Mirko