From: Raymond T. <rt...@us...> - 2012-03-27 05:40:23
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "matlisp". The branch, matlisp-cffi has been updated via 45e57ae1f888c8c271a91d42b9231b99bd55691e (commit) from d54f0adc84bb64c23dbbc4bbb1c7885e8cd610e6 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 45e57ae1f888c8c271a91d42b9231b99bd55691e Author: Raymond Toy <toy...@gm...> Date: Mon Mar 26 22:39:54 2012 -0700 Add demo2 for colnew src/colnew-demo2.lisp: o Second example program for colnew. src/colnew.lisp: o Compute the dimensions of the vectors in the callbacks correctly. matlisp.asd: o Add colnew-demo2.lisp. diff --git a/matlisp.asd b/matlisp.asd index b72039e..adf4dd6 100644 --- a/matlisp.asd +++ b/matlisp.asd @@ -320,8 +320,7 @@ :components ((:file "colnew") (:file "colnew-demo1" :depends-on ("colnew")) - #+nil - (:file "colnew-demo4" :depends-on ("colnew")))))) + (:file "colnew-demo2" :depends-on ("colnew")))))) (defmethod perform ((op asdf:test-op) (c (eql (asdf:find-system :matlisp)))) (oos 'asdf:test-op 'matlisp-tests)) diff --git a/src/colnew-demo2.lisp b/src/colnew-demo2.lisp new file mode 100644 index 0000000..f358b9c --- /dev/null +++ b/src/colnew-demo2.lisp @@ -0,0 +1,145 @@ +;;; -*- Mode: lisp; Syntax: ansi-common-lisp; Package: :matlisp; Base: 10 -*- + +(in-package #:matlisp) + +(defvar *gamma* 1.1d0) +(defvar *eps* .01d0) +(defvar *dmu* *eps*) +(defvar *eps4mu* (/ (expt *eps* 4) *dmu*)) +(defvar *xt* (sqrt (/ (* 2 (- *gamma* 1)) *gamma*))) + + +(defun fsub (x z f) + (setf (fv-ref f 0) + (+ (/ (fv-ref z 0) x x) + (- (/ (fv-ref z 1) x)) + (/ (- (fv-ref z 0) + (* (fv-ref z 2) + (- 1 (/ (fv-ref z 0) + x))) + (* *gamma* x (- 1 + (* x x 0.5d0)))) + *eps4mu*))) + (setf (fv-ref f 1) + (+ (/ (fv-ref z 2) x x) + (/ (- (fv-ref z 3)) x) + (* (fv-ref z 0) + (/ (- 1 (/ (fv-ref z 0) 2 x)) + *dmu*))))) + +(defun dfsub (x z df) + (let ((nrows 2)) + (flet ((column-major-index (r c) + (+ (- r 1) + (* (- c 1) nrows)))) + (setf (fv-ref df (column-major-index 1 1)) + (+ (/ 1 x x) + (/ (+ 1 + (/ (fv-ref z 2) + x)) + *eps4mu*))) + (setf (fv-ref df (column-major-index 1 2)) + (/ -1 x)) + (setf (fv-ref df (column-major-index 1 3)) + (- (/ (- 1 (/ (fv-ref z 0) + x)) + *eps4mu*))) + (setf (fv-ref df (column-major-index 1 4)) + 0d0) + (setf (fv-ref df (column-major-index 2 1)) + (/ (- 1 + (/ (fv-ref z 0) + x)) + *dmu*)) + (setf (fv-ref df (column-major-index 2 2)) + 0d0) + (setf (fv-ref df (column-major-index 2 3)) + (/ 1 x x)) + (setf (fv-ref df (column-major-index 2 4)) + (/ -1 x))))) + +(defun gsub (i z g) + (case i + ((or 1 3) + (setf (fv-ref g 0) (fv-ref z 0))) + (2 + (setf (fv-ref g 0) (fv-ref z 2))) + (4 + (setf (fv-ref g 0) (+ (fv-ref z 3) + (* -0.3d0 (fv-ref z 2)) + 0.7d0))))) + +(defun dgsub (i z dg) + (dotimes (k 4) + (setf (fv-ref dg k) 0d0)) + (case i + ((or 1 3) + (setf (fv-ref dg 0) 1d0)) + (2 + (setf (fv-ref dg 2) 1d0)) + (4 + (setf (fv-ref dg 3) 1d0) + (setf (fv-ref dg 2) -0.3d0)))) + +(defun guess (x z dmval) + (let ((con (* *gamma* x (- 1 (* 0.5d0 x x)))) + (dcon (* *gamma* (- 1 (* 1.5d0 x x)))) + (d2con (* -3 *gamma* x))) + (cond ((<= x *xt*) + (setf (fv-ref z 0) (* 2 x)) + (setf (fv-ref z 1) 2d0) + (setf (fv-ref z 2) (+ (* -2 x) con)) + (setf (fv-ref z 3) (+ dcon -2d0)) + (setf (fv-ref dmval 1) d2con)) + (t + (setf (fv-ref z 0) 0d0) + (setf (fv-ref z 1) 0d0) + (setf (fv-ref z 2) (- con)) + (setf (fv-ref z 3) (- dcon)) + (setf (fv-ref dmval 1) (- d2con)))) + (setf (fv-ref dmval 0) 0d0))) + + +(defun colnew-prob2 () + (let* ( + (aleft 0d0) + (aright 1d0) + ;; Two differential equations + (ncomp 2) + ;; Orders of each equation + (m (make-array 2 :element-type '(signed-byte 32) + :initial-contents '(2 2))) + ;; Locations of side conditions + (zeta (make-array 4 :element-type 'double-float + :initial-contents '(0d0 0d0 1d0 1d0))) + (ipar (make-array 11 :element-type '(signed-byte 32) + :initial-element 0)) + ;; Error tolerances on u and its second derivative + (ltol (make-array 4 :element-type '(signed-byte 32) + :initial-contents '(1 2 3 4))) + (tol (make-array 4 :element-type 'double-float + :initial-contents '(1d-5 1d-5 1d-5 1d-5))) + (fspace (make-array 40000 :element-type 'double-float)) + (ispace (make-array 2500 :element-type '(signed-byte 32))) + (fixpnt (make-array 1 :element-type 'double-float))) + ;; Set up parameters of the problem. + (setf (aref ipar 0) 1) ; nonlinear problem + (setf (aref ipar 1) 4) ; 4 collocation points per subinterval + (setf (aref ipar 2) 10) ; Initial uniform mesh of 10 subintervals + (setf (aref ipar 7) 0) + (setf (aref ipar 4) 40000) ; Size of fspace + (setf (aref ipar 5) 2500) ; Size of ispace + (setf (aref ipar 6) -1) ; Full output + (setf (aref ipar 8) 1) ; Initial approx provided + (setf (aref ipar 9) 0) ; Regular problem + (setf (aref ipar 10) 0) ; No fixed points in mesh + (setf (aref ipar 3) 4) ; Tolerances on all components + + (colnew ncomp m aleft aright zeta ipar ltol tol fixpnt ispace fspace 0 + #'fsub #'dfsub #'gsub #'dgsub #'guess) + (let ((x 0d0) + (z (make-array 4 :element-type 'double-float))) + (dotimes (j 21) + (appsln x z fspace ispace) + (format t "~5,2f ~{~15,5e~}~%" x (coerce z 'list)) + (incf x 0.05d0))))) diff --git a/src/colnew.lisp b/src/colnew.lisp index d47f76c..adefa60 100644 --- a/src/colnew.lisp +++ b/src/colnew.lisp @@ -4,6 +4,10 @@ (cffi:use-foreign-library colnew) +(defun m* (ncomp m) + (loop for k from 0 below ncomp + sum (aref m k))) + (def-fortran-routine colnew :void "COLNEW" (ncomp :integer :input) @@ -20,24 +24,24 @@ (iflag :integer :output) (fsub (:callback :void (x :double-float :input) - (z (* :double-float :size (aref m 0)) :input) - (f (* :double-float :size (aref m 0)) :output))) + (z (* :double-float :size (m* ncomp m)) :input) + (f (* :double-float :size ncomp) :output))) (dfsub (:callback :void (x :double-float :input) - (z (* :double-float :size (aref m 0)) :input) - (df (* :double-float :size (aref m 0)) :output))) + (z (* :double-float :size (m* ncomp m)) :input) + (df (* :double-float :size (* ncomp (m* ncomp m))) :output))) (gsub (:callback :void (i :integer :input) - (z (* :double-float :size (aref m 0)) :input) - (g (* :double-float :size (aref m 0)) :output))) + (z (* :double-float :size (m* ncomp m)) :input) + (g (* :double-float :size (m* ncomp m)) :output))) (dgsub (:callback :void (i :integer :input) - (z (* :double-float :size (aref m 0)) :input) - (dg (* :double-float :size (aref m 0)) :output))) + (z (* :double-float :size (m* ncomp m)) :input) + (dg (* :double-float :size (expt (m* ncomp m) 2)) :output))) (guess (:callback :void (x :double-float :input) - (z (* :double-float) :output) - (dmval (* :double-float) :output)))) + (z (* :double-float :size (m* ncomp m)) :output) + (dmval (* :double-float :size ncomp) :output)))) (def-fortran-routine appsln :void ----------------------------------------------------------------------- Summary of changes: matlisp.asd | 3 +- src/colnew-demo2.lisp | 145 +++++++++++++++++++++++++++++++++++++++++++++++++ src/colnew.lisp | 24 +++++---- 3 files changed, 160 insertions(+), 12 deletions(-) create mode 100644 src/colnew-demo2.lisp hooks/post-receive -- matlisp |