[Gsll-devel] ODE apply-step: argument passing problem

Liam Healy lhealy at common-lisp.net
Tue Dec 1 00:06:03 UTC 2009


OK fixed, thanks for the report.  You might want to return a value from
your calculation, viz.

(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))
    dep))

Liam


On Mon, Nov 30, 2009 at 8:30 AM, Mirko Vukovic <mirko.vukovic at gmail.com> wrote:
> 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
>
> _______________________________________________
> Gsll-devel mailing list
> Gsll-devel at common-lisp.net
> http://common-lisp.net/cgi-bin/mailman/listinfo/gsll-devel
>
>




More information about the gsll-devel mailing list