[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