Skip to content

Commit fb4e77d

Browse files
authored
Query correct (larger) workspace for VL=N,VR=V (Reference-LAPACK PR 1274)
1 parent a36e22c commit fb4e77d

1 file changed

Lines changed: 32 additions & 16 deletions

File tree

lapack-netlib/SRC/sggev3.f

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,13 @@
55
* Online html documentation available at
66
* http://www.netlib.org/lapack/explore-html/
77
*
8-
*> \htmlonly
98
*> Download SGGEV3 + dependencies
109
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/sggev3.f">
1110
*> [TGZ]</a>
1211
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/sggev3.f">
1312
*> [ZIP]</a>
1413
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/sggev3.f">
1514
*> [TXT]</a>
16-
*> \endhtmlonly
1715
*
1816
* Definition:
1917
* ===========
@@ -225,6 +223,7 @@
225223
SUBROUTINE SGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR,
226224
$ ALPHAI, BETA, VL, LDVL, VR, LDVR, WORK, LWORK,
227225
$ INFO )
226+
IMPLICIT NONE
228227
*
229228
* -- LAPACK driver routine --
230229
* -- LAPACK is a software package provided by Univ. of Tennessee, --
@@ -259,13 +258,16 @@ SUBROUTINE SGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR,
259258
LOGICAL LDUMMA( 1 )
260259
* ..
261260
* .. External Subroutines ..
262-
EXTERNAL SGEQRF, SGGBAK, SGGBAL, SGGHD3, SLAQZ0, SLACPY,
263-
$ SLASCL, SLASET, SORGQR, SORMQR, STGEVC
261+
EXTERNAL SGEQRF, SGGBAK, SGGBAL,
262+
$ SGGHD3, SLAQZ0, SLACPY,
263+
$ SLASCL, SLASET, SORGQR,
264+
$ SORMQR, STGEVC
264265
* ..
265266
* .. External Functions ..
266267
LOGICAL LSAME
267268
REAL SLAMCH, SLANGE, SROUNDUP_LWORK
268-
EXTERNAL LSAME, SLAMCH, SLANGE, SROUNDUP_LWORK
269+
EXTERNAL LSAME, SLAMCH, SLANGE,
270+
$ SROUNDUP_LWORK
269271
* ..
270272
* .. Intrinsic Functions ..
271273
INTRINSIC ABS, MAX, SQRT
@@ -327,18 +329,23 @@ SUBROUTINE SGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR,
327329
LWKOPT = MAX( LWKMIN, 3*N+INT( WORK( 1 ) ) )
328330
CALL SORMQR( 'L', 'T', N, N, N, B, LDB, WORK, A, LDA, WORK,
329331
$ -1, IERR )
330-
LWKOPT = MAX( LWKOPT, 3*N+INT( WORK( 1 ) ) )
331-
CALL SGGHD3( JOBVL, JOBVR, N, 1, N, A, LDA, B, LDB, VL, LDVL,
332-
$ VR, LDVR, WORK, -1, IERR )
333332
LWKOPT = MAX( LWKOPT, 3*N+INT( WORK( 1 ) ) )
334333
IF( ILVL ) THEN
335334
CALL SORGQR( N, N, N, VL, LDVL, WORK, WORK, -1, IERR )
336335
LWKOPT = MAX( LWKOPT, 3*N+INT( WORK( 1 ) ) )
336+
END IF
337+
IF( ILV ) THEN
338+
CALL SGGHD3( JOBVL, JOBVR, N, 1, N, A, LDA, B, LDB, VL,
339+
$ LDVL, VR, LDVR, WORK, -1, IERR )
340+
LWKOPT = MAX( LWKOPT, 3*N+INT( WORK( 1 ) ) )
337341
CALL SLAQZ0( 'S', JOBVL, JOBVR, N, 1, N, A, LDA, B, LDB,
338342
$ ALPHAR, ALPHAI, BETA, VL, LDVL, VR, LDVR,
339343
$ WORK, -1, 0, IERR )
340344
LWKOPT = MAX( LWKOPT, 2*N+INT( WORK( 1 ) ) )
341345
ELSE
346+
CALL SGGHD3( 'N', 'N', N, 1, N, A, LDA, B, LDB, VL, LDVL,
347+
$ VR, LDVR, WORK, -1, IERR )
348+
LWKOPT = MAX( LWKOPT, 3*N+INT( WORK( 1 ) ) )
342349
CALL SLAQZ0( 'E', JOBVL, JOBVR, N, 1, N, A, LDA, B, LDB,
343350
$ ALPHAR, ALPHAI, BETA, VL, LDVL, VR, LDVR,
344351
$ WORK, -1, 0, IERR )
@@ -431,7 +438,8 @@ SUBROUTINE SGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR,
431438
IF( ILVL ) THEN
432439
CALL SLASET( 'Full', N, N, ZERO, ONE, VL, LDVL )
433440
IF( IROWS.GT.1 ) THEN
434-
CALL SLACPY( 'L', IROWS-1, IROWS-1, B( ILO+1, ILO ), LDB,
441+
CALL SLACPY( 'L', IROWS-1, IROWS-1,
442+
$ B( ILO+1, ILO ), LDB,
435443
$ VL( ILO+1, ILO ), LDVL )
436444
END IF
437445
CALL SORGQR( IROWS, IROWS, IROWS, VL( ILO, ILO ), LDVL,
@@ -449,11 +457,16 @@ SUBROUTINE SGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR,
449457
*
450458
* Eigenvectors requested -- work on whole matrix.
451459
*
452-
CALL SGGHD3( JOBVL, JOBVR, N, ILO, IHI, A, LDA, B, LDB, VL,
453-
$ LDVL, VR, LDVR, WORK( IWRK ), LWORK+1-IWRK, IERR )
460+
CALL SGGHD3( JOBVL, JOBVR, N, ILO, IHI,
461+
$ A, LDA,
462+
$ B, LDB, VL,
463+
$ LDVL, VR, LDVR,
464+
$ WORK( IWRK ), LWORK+1-IWRK, IERR )
454465
ELSE
455-
CALL SGGHD3( 'N', 'N', IROWS, 1, IROWS, A( ILO, ILO ), LDA,
456-
$ B( ILO, ILO ), LDB, VL, LDVL, VR, LDVR,
466+
CALL SGGHD3( 'N', 'N', IROWS, 1, IROWS,
467+
$ A( ILO, ILO ), LDA,
468+
$ B( ILO, ILO ), LDB, VL,
469+
$ LDVL, VR, LDVR,
457470
$ WORK( IWRK ), LWORK+1-IWRK, IERR )
458471
END IF
459472
*
@@ -492,7 +505,8 @@ SUBROUTINE SGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR,
492505
ELSE
493506
CHTEMP = 'R'
494507
END IF
495-
CALL STGEVC( CHTEMP, 'B', LDUMMA, N, A, LDA, B, LDB, VL, LDVL,
508+
CALL STGEVC( CHTEMP, 'B', LDUMMA, N, A, LDA, B, LDB, VL,
509+
$ LDVL,
496510
$ VR, LDVR, N, IN, WORK( IWRK ), IERR )
497511
IF( IERR.NE.0 ) THEN
498512
INFO = N + 2
@@ -575,8 +589,10 @@ SUBROUTINE SGGEV3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR,
575589
110 CONTINUE
576590
*
577591
IF( ILASCL ) THEN
578-
CALL SLASCL( 'G', 0, 0, ANRMTO, ANRM, N, 1, ALPHAR, N, IERR )
579-
CALL SLASCL( 'G', 0, 0, ANRMTO, ANRM, N, 1, ALPHAI, N, IERR )
592+
CALL SLASCL( 'G', 0, 0, ANRMTO, ANRM, N, 1, ALPHAR, N,
593+
$ IERR )
594+
CALL SLASCL( 'G', 0, 0, ANRMTO, ANRM, N, 1, ALPHAI, N,
595+
$ IERR )
580596
END IF
581597
*
582598
IF( ILBSCL ) THEN

0 commit comments

Comments
 (0)