[Gsll-devel] ODE apply-step: argument passing problem
Mirko Vukovic
mirko.vukovic at gmail.com
Mon Nov 30 13:30:15 UTC 2009
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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/gsll-devel/attachments/20091130/9cd45acc/attachment.html>
More information about the gsll-devel
mailing list