From: Michael A. K. <ma...@ll...> - 2001-10-26 14:10:03
|
The error occurs in the determination of LWORK for both DGEEV and ZGEEV. When determining LWORK, if JOBVR is V, the LDVR must be >= N. This requires moving the (LET ((XXX ...)) to below the CASE statement for the JOB type. Diffs are as follows: -------------- snip, snip, snip -------------------- diff -e geev.lisp ~/fopen/geev.lisp 386,405c (let* ((ldvr (if (equal jobvr "V") n 1)) (xxx (allocate-complex-store ldvr))) (multiple-value-bind (store-a store-w store-vl store-vr work info) (zgeev jobvl jobvr n ; N xxx ; A n ; LDA xxx ; W xxx ; VL 1 ; LDVL xxx ; VR ldvr ; LDVR work ; WORK -1 ; LWORK xxx ; RWORK 0 ) ; INFO (declare (ignore store-a store-w store-vl store-vr info)) ;; The desired size in in work[0], which we convert to an ;; integer. (ceiling (aref work 0))))))) . 375,376c (let ((work (allocate-complex-store 1))) . 247,266c (let* ((ldvr (if (equal jobvr "V") n 1)) (xxx (allocate-complex-store ldvr))) (multiple-value-bind (store-a store-wr store-wi store-vl store-vr work info) (dgeev jobvl jobvr n ; N xxx ; A n ; LDA xxx ; WR xxx ; WI xxx ; VL 1 ; LDVL xxx ; VR ldvr ; LDVR work ; WORK -1 ; LWORK 0 ) ; INFO (declare (ignore store-a store-wr store-wi store-vl store-vr)) (assert (zerop info)) (ceiling (realpart (aref work 0)))))))) . 236,237c (let ((work (allocate-real-store 1))) . |