[Gsll-devel] ODE apply-step: argument passing problem
Liam Healy
lhealy at common-lisp.net
Fri Dec 4 03:15:04 UTC 2009
Mirko,
Here is what I get when I trace sine-ode
0: (SIN-ODE 0.0d0 0.0d0 1.0d0)
0: SIN-ODE returned 1.0d0 -0.0d0
Y-in: 0.0100, 0.0d0, 1.0d0
dydt-in: 0.0100, 1.0d0, -0.0d0
0: (SIN-ODE 0.015d0 0.005d0 1.0d0)
0: SIN-ODE returned 1.0d0 -0.005d0
0: (SIN-ODE 0.02d0 0.01d0 0.9999d0)
0: SIN-ODE returned 0.9999d0 -0.01d0
0: (SIN-ODE 0.02d0 0.009999833333333333d0 0.99995d0)
0: SIN-ODE returned 0.99995d0 -0.009999833333333333d0
Y-out: 0.0100, 0.009999833333333333d0, 0.99995d0
dydt-out: 0.0100, 0.99995d0, -0.009999833333333333d0
Y-in: 0.0200, 0.009999833333333333d0, 0.99995d0
dydt-in: 0.0200, 0.99995d0, -0.009999833333333333d0
0: (SIN-ODE 0.025d0 0.014999583333333334d0 0.9999000008333333d0)
0: SIN-ODE returned 0.9999000008333333d0 -0.014999583333333334d0
0: (SIN-ODE 0.03d0 0.01999833335d0 0.9997500066666667d0)
0: SIN-ODE returned 0.9997500066666667d0 -0.01999833335d0
0: (SIN-ODE 0.03d0 0.019998666683333333d0 0.9998000058333055d0)
0: SIN-ODE returned 0.9998000058333055d0 -0.019998666683333333d0
Y-out: 0.0200, 0.019998666683333333d0, 0.9998000058333055d0
dydt-out: 0.0200, 0.9998000058333055d0, -0.019998666683333333d0
#<VECTOR-DOUBLE-FLOAT #(0.019998666683333333d0 0.9998000058333055d0)>
which superficially looks right to me.
On Tue, Dec 1, 2009 at 10:23 PM, Mirko Vukovic <mirko.vukovic at gmail.com> wrote:
> Hi Liam (& others)
>
> I am getting funny behavior with the ODE stepper:
>
> (As refresher, I am solving a 2nd order system that should reproduce a
> sinusoid)
>
> A trace of the dydt function (sin-ode below) shows that it is always called
> with arguments (time 0 0), even though the initial conditions are (time 0 1)
> (see the let form).
>
> It looks as if the initial conditions (stored in vector y below) are not
> passed as arguments to the dydt function (sin-ode). Or am I missing
> something?
>
> I tried both the rk2 and rk4 steppers and different step sizes.
>
> Thanks,
>
> Mirko
>
>
> Here is the source:
>
> ;;;; 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.01d0)
> (stepper-type +step-rk2+))
> (let ((stepper (make-ode-stepper stepper-type 2 #'sin-ode
> #'sin-ode-jacobian))
> (y (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 y 0) 0d0 ;; y(0)=0
> (maref y 1) 1d0);; y'(0)=1
> (multiple-value-bind (yp zp) (sin-ode time (maref y 0) (maref y 1))
> (setf (maref dydt-out 0) yp
> (maref dydt-out 1) zp))
> (dotimes (i 2)
> (incf time delta-t)
> (setf (maref dydt-in 0) (maref dydt-out 0)
> (maref dydt-in 1) (maref dydt-out 1))
> (format t "Y-in: ~12,4f, ~a, ~a~%" time (maref y 0) (maref y 1))
> (format t "dydt-in:~12,4f, ~a, ~a~%" time (maref dydt-in 0) (maref
> dydt-in 1))
> (apply-step stepper time y delta-t yerr dydt-in dydt-out)
> (format t "Y-out: ~12,4f, ~a, ~a~%" time (maref y 0) (maref y 1))
> (format t "dydt-out:~12,4f, ~a, ~a~%~%" time (maref dydt-out 0) (maref
> dydt-out 1)))
> y))
>
> |#
>
More information about the gsll-devel
mailing list