|
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)))
.
|