diff --git a/data/foreign-array.lisp b/data/foreign-array.lisp index df72f9140c62b2d6778dd3bee17b769b19a8884d..93f4b78c53e7dccdaa1a650a57642fd7dc25c4ab 100644 --- a/data/foreign-array.lisp +++ b/data/foreign-array.lisp @@ -1,6 +1,6 @@ ;; Foreign arrays (usually in C) ;; Liam Healy 2008-12-28 10:44:22EST foreign-array.lisp -;; Time-stamp: <2008-12-29 14:34:24EST foreign-array.lisp> +;; Time-stamp: <2009-01-04 21:42:09EST foreign-array.lisp> ;; $Id: $ (in-package :gsl) @@ -42,7 +42,8 @@ ;;; Allowable keys: :dimensions, :initial-contents, :initial-element. (defmethod initialize-instance :after - ((object foreign-array) &rest initargs &key dimensions initial-contents initial-element) + ((object foreign-array) &rest initargs + &key dimensions initial-contents initial-element) (declare (ignore dimensions initial-contents initial-element)) (with-slots (cl-array dimensions original-array offset total-size) object (let ((ffa (apply #'make-ffa (element-type object) initargs))) diff --git a/eigensystems.lisp b/eigensystems.lisp index 180972b09bca86b77c7bd2d38de356a7cdbee097..bfa82642e81ef64238773aa3861438cc405f3e92 100644 --- a/eigensystems.lisp +++ b/eigensystems.lisp @@ -1,6 +1,6 @@ ;; Eigenvectors and eigenvalues ;; Liam Healy, Sun May 21 2006 - 19:52 -;; Time-stamp: <2008-12-26 18:57:10EST eigensystems.lisp> +;; Time-stamp: <2009-01-04 21:27:10EST eigensystems.lisp> ;; $Id$ (in-package :gsl) @@ -43,9 +43,19 @@ ;;;; Eigenvalues and eigenvectors ;;;;**************************************************************************** -(defmfun eigenvalues ((A matrix) eigenvalues ws) +(defmfun eigenvalues + ((A matrix) + &optional + (eigenvalues + (make-marray + (element-type A) + :dimensions (first (dimensions A)))) + (ws + (if (eq (class-of A) 'complex-double-float) + (make-eigen-herm (first (dimensions A))) + (make-eigen-symm (first (dimensions A)))))) (double-float "gsl_eigen_symm" - complex-double-float "gsl_eigen_herm") + complex-double-float "gsl_eigen_herm") (((mpointer A) :pointer) ((mpointer eigenvalues) :pointer) ((mpointer ws) :pointer)) :definition :generic @@ -63,9 +73,23 @@ referenced. The eigenvalues are stored in the vector eigenvalues and are unordered.") -(defmfun eigenvalues-eigenvectors ((A matrix) eigenvalues eigenvectors ws) +(defmfun eigenvalues-eigenvectors + ((A matrix) + &optional + (eigenvalues + (make-marray + (element-type A) + :dimensions (first (dimensions A)))) + (eigenvectors + (make-marray + (element-type A) + :dimensions (dimensions A))) + (ws + (if (eq (class-of A) 'complex-double-float) + (make-eigen-hermv (first (dimensions A))) + (make-eigen-symmv (first (dimensions A)))))) (double-float "gsl_eigen_symmv" - complex-double-float "gsl_eigen_hermv") + complex-double-float "gsl_eigen_hermv") (((mpointer A) :pointer) ((mpointer eigenvalues) :pointer) ((mpointer eigenvectors) :pointer) ((mpointer ws) :pointer)) :definition :generic @@ -118,11 +142,11 @@ (defun eigenvalue-eigenvectors-example () (let ((evecs (make-marray 'double-float :dimensions '(3 3))) - (evals (make-marray 'double-float :dimensions 3)) - (ws (make-eigen-symmv 3)) - (mat #m((20.0d0 -10.0d0 0.0d0) - (-10.0d0 30.0d0 0.0d0) - (0.0d0 0.0d0 40.0d0)))) + (evals (make-marray 'double-float :dimensions 3)) + (ws (make-eigen-symmv 3)) + (mat #m((20.0d0 -10.0d0 0.0d0) + (-10.0d0 30.0d0 0.0d0) + (0.0d0 0.0d0 40.0d0)))) (eigenvalues-eigenvectors mat evals evecs ws) (values (cl-array evals) (cl-array evecs)))) diff --git a/gsll.asd b/gsll.asd index ce6f4437c1fb919b6f11e79d4328d2e401d7c32d..d5f91dea420724bf2b3cea031e7bb42f59e1ac78 100644 --- a/gsll.asd +++ b/gsll.asd @@ -1,6 +1,6 @@ ;; Definition of GSLL system ;; Liam Healy -;; Time-stamp: <2009-01-03 14:10:02EST gsll.asd> +;; Time-stamp: <2009-01-04 21:44:14EST gsll.asd> ;; $Id$ (asdf:defsystem "gsll" @@ -35,7 +35,7 @@ :components ((:file "foreign-friendly") (:file "foreign-array" :depends-on (foreign-friendly)) - (:file "marray" :depends-on (foreign-friendly)) + (:file "marray" :depends-on (foreign-array)) (:file "vector" :depends-on (marray)) (:file "matrix" :depends-on (marray vector)) (:file "maref" :depends-on (marray vector matrix))