From 26271f7172476e98242eaffe50adc7ec69e4b71e Mon Sep 17 00:00:00 2001 From: "Liam M. Healy" <lhealy@common-lisp.net> Date: Sat, 1 Jan 2011 11:31:40 -0500 Subject: [PATCH] Methods for arithmetic functions on foreign-arrays Depend on Antik instead of GSD. Add new methods for Antik functions on foreign-arrays. This permits algebra-style computation on arrays, e.g., (in-package :antik-user) (setf grid:*default-grid-type* 'grid:foreign-array) (expt (* (rotate-3d :z #_15_deg) (rotate-3d :z #_45_deg)) -1) #m((0.5 0.8660254037844386 0.0) (-0.8660254037844385 0.5000000000000001 -0.0) (0.0 0.0 1.0)) (rotate-3d :z #_-60_deg) #m((0.5000000000000001 0.8660254037844386 0.0) (-0.8660254037844386 0.5000000000000001 0.0) (0.0 0.0 1.0)) --- antik/linear-algebra.lisp | 45 +++++++++++++++++++++++++++++++++++++++ gsll.asd | 12 +++++++---- 2 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 antik/linear-algebra.lisp diff --git a/antik/linear-algebra.lisp b/antik/linear-algebra.lisp new file mode 100644 index 00000000..2eb08c53 --- /dev/null +++ b/antik/linear-algebra.lisp @@ -0,0 +1,45 @@ +;; Define generic operators for GSL functions +;; Liam Healy 2011-01-01 09:51:47EST linear-algebra.lisp +;; Time-stamp: <2011-01-01 10:58:18EST linear-algebra.lisp> +;; $Id: $ + +(in-package :antik) + +(defmethod *i ((a grid:foreign-array) (b grid:foreign-array)) + (gsl:matrix-product a b)) + +(defmethod *i ((a grid:foreign-array) (b number)) + (gsl:scale b a)) + +(defmethod *i ((a number) (b grid:foreign-array)) + (gsl:scale a b)) + +(defmethod /i ((a grid:foreign-array) (b number)) + (gsl:scale (cl:/ b) a)) + +(defmethod +i ((a grid:foreign-array) (b grid:foreign-array)) + (gsl:elt+ a b)) + +(defmethod +i ((a grid:foreign-array) (b number)) + (gsl:elt+ a b)) + +(defmethod +i ((a number) (b grid:foreign-array)) + (gsl:elt+ b a)) + +(defmethod -i ((a grid:foreign-array) (b grid:foreign-array)) + (gsl:elt- a b)) + +(defmethod -i ((a grid:foreign-array) (b number)) + (gsl:elt+ a (cl:- b))) + +(defmethod -i ((a number) (b grid:foreign-array)) + (gsl:elt+ (- b) a)) + +(defmethod expt ((a grid:matrix) (b integer)) + (cond ((= 1 b) a) + ((plusp b) ; use addition-chain exponentiation + (* a (expt a (1- b)))) + ((minusp b) + (expt (gsl:invert-matrix a) (- b))) + ;; zero exponent; need to figure out non-square matrix + (t (grid:identity-matrix (grid:dim0 a))))) diff --git a/gsll.asd b/gsll.asd index 8eaf9bf0..d2496314 100644 --- a/gsll.asd +++ b/gsll.asd @@ -1,8 +1,8 @@ ;; Definition of GSLL system ;; Liam Healy -;; Time-stamp: <2010-08-13 11:36:52EDT gsll.asd> +;; Time-stamp: <2011-01-01 10:57:50EST gsll.asd> ;; -;; Copyright 2006, 2007, 2008, 2009, 2010 Liam M. Healy +;; Copyright 2006, 2007, 2008, 2009, 2010, 2011 Liam M. Healy ;; Distributed under the terms of the GNU General Public License ;; ;; This program is free software: you can redistribute it and/or modify @@ -30,7 +30,7 @@ :version "0" :author "Liam M. Healy" :licence "GPL v3" - :depends-on (foreign-array grid cffi cffi-grovel trivial-garbage #+fsbv fsbv) + :depends-on (antik cffi-grovel trivial-garbage #+fsbv fsbv) :components ((:module init :components @@ -266,4 +266,8 @@ :components ((cffi-grovel:grovel-file "mksa") (cffi-grovel:grovel-file "cgsm") - (:file export))))) + (:file export))) + (:module antik + :depends-on (init linear-algebra) + :components + ((:file "linear-algebra"))))) -- GitLab