[cl-gsl-cvs] CVS update: cl-gsl/poly.lisp

Edgar Denny edenny at common-lisp.net
Sun Mar 13 00:48:26 UTC 2005


Update of /project/cl-gsl/cvsroot/cl-gsl
In directory common-lisp.net:/tmp/cvs-serv17913

Modified Files:
	poly.lisp 
Log Message:
Added divided difference functions.

Date: Sun Mar 13 01:48:25 2005
Author: edenny

Index: cl-gsl/poly.lisp
diff -u cl-gsl/poly.lisp:1.1.1.1 cl-gsl/poly.lisp:1.2
--- cl-gsl/poly.lisp:1.1.1.1	Wed Mar  2 02:04:53 2005
+++ cl-gsl/poly.lisp	Sun Mar 13 01:48:25 2005
@@ -170,72 +170,72 @@
          (ret-val))
     (setq ret-val (gsl-poly-complex-solve a-ptr len w z-ptr))
     (gsl-poly-complex-workspace-free w)
-    (prog1
-        ;; FIXME: where is ret-val in result?
+    (multiple-value-prog1
         (values (complex-packed-array->lisp-vec z-ptr (* 2 (1- len))) ret-val)
       (uffi:free-foreign-object z-ptr))))
 
 ;; ----------------------------------------------------------------------
 
-;; (defun-foreign "gsl_poly_dd_int"
-;;     ((dd double-ptr)
-;;      (xa double-ptr)
-;;      (ya double-ptr)
-;;      (size :unsigned-long))
-;;   :int)
-
-;; (defun-foreign "gsl_poly_dd_eval"
-;;     ((dd double-ptr)
-;;      (xa double-ptr)
-;;      (size :unsigned-long)
-;;      (x :double))
-;;   :double)
-
-;; (defun-foreign "gsl_poly_dd_taylor"
-;;     ((c double-ptr)
-;;      (xp :double)
-;;      (dd double-ptr)
-;;      (xa double-ptr)
-;;      (size :unsigned-long)
-;;      (w double-ptr))
-;;   :int)
-
-
-;; (defun dd-int (xa ya)
-;;   (let* ((xa-ptr (lisp-vec->c-array xa))
-;;          (ya-ptr (lisp-vec->c-array ya))
-;;          (len (length xa))
-;;          (dd-ptr (uffi:allocate-foreign-object :double len))
-;;          (ret-val))
-;;     (setq ret-val (gsl-poly-dd-init dd-ptr xa-ptr ya-ptr len))
-
-
-
-;; Function: int gsl_poly_dd_init (double dd[], const double xa[], const double ya[], size_t size)
-;;     This function computes a divided-difference representation of the interpolating polynomial for the points (xa, ya) stored in the arrays xa and ya of length size.
-;;     On output the divided-differences of (xa,ya) are stored in the array dd, also of length size.
-
-;; Function: double gsl_poly_dd_eval (const double dd[], const double xa[], const size_t size, const double x)
-;;     This function evaluates the polynomial stored in divided-difference form in the arrays dd and xa of length size at the point x.
-
-;; Function: int gsl_poly_dd_taylor (double c[], double xp, const double dd[], const double xa[], size_t size, double w[])
-;;     This function converts the divided-difference representation of a polynomial to a Taylor expansion. The divided-difference representation is supplied in the
-;;     arrays dd and xa of length size. On output the Taylor coefficients of the polynomial expanded about the point xp are stored in the array c also of length size. A
-;;     workspace of length size must be provided in the array w.
-
-
-
+(defun-foreign "gsl_poly_dd_init"
+    ((dd double-ptr)
+     (xa double-ptr)
+     (ya double-ptr)
+     (size :unsigned-long))
+  :int)
+
+(defun dd-init (xa ya)
+  (let* ((xa-ptr (lisp-vec->c-array xa))
+         (ya-ptr (lisp-vec->c-array ya))
+         (len (length xa))
+         (dd-ptr (uffi:allocate-foreign-object :double len))
+         (ret-val))
+    (setq ret-val (gsl-poly-dd-init dd-ptr xa-ptr ya-ptr len))
+    (multiple-value-prog1
+        (values (c-array->lisp-vec dd-ptr len) ret-val)
+      (uffi:free-foreign-object xa-ptr)
+      (uffi:free-foreign-object ya-ptr)
+      (uffi:free-foreign-object dd-ptr))))
 
+;; ----------------------------------------------------------------------
 
-;; #define GSL_REAL(z)     ((z).dat[0])
-;; #define GSL_IMAG(z)     ((z).dat[1])
-;; #define GSL_COMPLEX_P(zp) ((zp)->dat)
-;; #define GSL_COMPLEX_P_REAL(zp)  ((zp)->dat[0])
-;; #define GSL_COMPLEX_P_IMAG(zp)  ((zp)->dat[1])
-;; #define GSL_COMPLEX_EQ(z1,z2) (((z1).dat[0] == (z2).dat[0]) && ((z1).dat[1] == (z2).dat[1]))
+(defun-foreign "gsl_poly_dd_eval"
+    ((dd double-ptr)
+     (xa double-ptr)
+     (size :unsigned-long)
+     (x :double))
+  :double)
+
+(defun dd-eval (dd xa x)
+  (let ((dd-ptr (lisp-vec->c-array dd))
+        (xa-ptr (lisp-vec->c-array xa))
+        (len (length dd)))
+    (prog1
+        (gsl-poly-dd-eval dd-ptr xa-ptr len x)
+      (uffi:free-foreign-object xa-ptr)
+      (uffi:free-foreign-object dd-ptr))))
 
-;; #define GSL_SET_COMPLEX(zp,x,y) do {(zp)->dat[0]=(x); (zp)->dat[1]=(y);} while(0)
-;; #define GSL_SET_REAL(zp,x) do {(zp)->dat[0]=(x);} while(0)
-;; #define GSL_SET_IMAG(zp,y) do {(zp)->dat[1]=(y);} while(0)
+;; ----------------------------------------------------------------------
 
-;; #define GSL_SET_COMPLEX_PACKED(zp,n,x,y) do {*((zp)+2*(n))=(x); *((zp)+(2*(n)+1))=(y);} while(0)
+(defun-foreign "gsl_poly_dd_taylor"
+    ((c double-ptr)
+     (xp :double)
+     (dd double-ptr)
+     (xa double-ptr)
+     (size :unsigned-long)
+     (w double-ptr))
+  :int)
+
+(defun dd-taylor (xp dd xa)
+  (let* ((dd-ptr (lisp-vec->c-array dd))
+         (xa-ptr (lisp-vec->c-array xa))
+         (len (length dd))
+         (w-ptr (uffi:allocate-foreign-object :double len))
+         (c-ptr (uffi:allocate-foreign-object :double len))
+         (ret-val))
+    (setq ret-val (gsl-poly-dd-taylor c-ptr xp dd-ptr xa-ptr len w-ptr))
+    (multiple-value-prog1
+        (values (c-array->lisp-vec c-ptr len) ret-val)
+      (uffi:free-foreign-object w-ptr)
+      (uffi:free-foreign-object xa-ptr)
+      (uffi:free-foreign-object dd-ptr)
+      (uffi:free-foreign-object c-ptr))))




More information about the Cl-gsl-cvs mailing list