@@ -401,7 +401,7 @@ SUBROUTINE DDRVMR3( NSIZES, MM, NN, NTYPES, DOTYPE, ISEED, THRESH,
401401 CHARACTER * 3 PATH
402402 INTEGER I, IINFO, IJQ, IJU, IJVT, IL,IU, IWS, IWTMP,
403403 $ ITEMP, J, JSIZE, JTYPE, LSWORK, M, MINWRK,
404- $ MMAX, MNMAX, MNMIN, MTYPES, N, NFAIL,
404+ $ MMAX, MNMAX, MNMIN, MNTHR, MTYPES, N, NFAIL,
405405 $ NMAX, NS, NSI, NSV, NTEST
406406 DOUBLE PRECISION ANORM, DIF, DIV, OVFL, RTUNFL, ULP,
407407 $ ULPINV, UNFL, VL, VU
@@ -418,8 +418,9 @@ SUBROUTINE DDRVMR3( NSIZES, MM, NN, NTYPES, DOTYPE, ISEED, THRESH,
418418 DOUBLE PRECISION RESULT( 13 )
419419* ..
420420* .. External Functions ..
421+ INTEGER ILAENV
421422 DOUBLE PRECISION DLAMCH, DLARND, DLANGE
422- EXTERNAL DLAMCH, DLARND, DLANGE
423+ EXTERNAL ILAENV, DLAMCH, DLARND, DLANGE
423424* ..
424425* .. External Subroutines ..
425426 EXTERNAL ALASVM, DBDT01, DGEJSV, DGESDD, DGESVD,
@@ -511,6 +512,19 @@ SUBROUTINE DDRVMR3( NSIZES, MM, NN, NTYPES, DOTYPE, ISEED, THRESH,
511512 M = MM( JSIZE )
512513 N = NN( JSIZE )
513514 MNMIN = MIN ( M, N )
515+ *
516+ * Minimal workspace for DGESVDMR3, see LWORK there
517+ *
518+ IWTMP = 1
519+ IF ( MNMIN.GT. 0 ) THEN
520+ MNTHR = ILAENV( 6 , ' DGESVD' , ' VV' , M, N, 0 , 0 )
521+ IF ( MAX ( M, N ).GE. MNTHR ) THEN
522+ IWTMP = 8 * MNMIN* MNMIN + 43 * MNMIN
523+ ELSE
524+ IWTMP = MAX ( 7 * MNMIN* MNMIN + 42 * MNMIN,
525+ $ 5 * MNMIN* MNMIN + 27 * MNMIN + MAX ( M, N ) )
526+ END IF
527+ END IF
514528*
515529 IF ( NSIZES.NE. 1 ) THEN
516530 MTYPES = MIN ( MAXTYP, NTYPES )
@@ -581,6 +595,12 @@ SUBROUTINE DDRVMR3( NSIZES, MM, NN, NTYPES, DOTYPE, ISEED, THRESH,
581595* Do for minimal and adequate (for blocking) workspace
582596*
583597 DO 220 IWS = 1 , 4
598+ *
599+ LSWORK = IWTMP + ( IWS-1 )* ( LWORK- IWTMP ) / 3
600+ LSWORK = MIN ( LSWORK, LWORK )
601+ LSWORK = MAX ( LSWORK, 1 )
602+ IF ( IWS.EQ. 4 )
603+ $ LSWORK = LWORK
584604*
585605 DO 40 J = 1 , 13
586606 RESULT( J ) = - ONE
@@ -591,7 +611,7 @@ SUBROUTINE DDRVMR3( NSIZES, MM, NN, NTYPES, DOTYPE, ISEED, THRESH,
591611 CALL DLACPY( ' F' , M, N, ASAV, LDA, A, LDA )
592612 CALL DGESVDMR3( ' V' , ' V' , ' A' , M, N, A, LDA,
593613 $ VL, VU, IL, IU, NS, SSAV, USAV, LDU,
594- $ VTSAV, LDVT, WORK, LWORK , IWORK,
614+ $ VTSAV, LDVT, WORK, LSWORK , IWORK,
595615 $ IINFO )
596616 IF ( IINFO.NE. 0 ) THEN
597617 WRITE ( NOUT, FMT = 9995 )' GESVDMR3' , IINFO, M, N,
@@ -642,7 +662,7 @@ SUBROUTINE DDRVMR3( NSIZES, MM, NN, NTYPES, DOTYPE, ISEED, THRESH,
642662 CALL DLACPY( ' F' , M, N, ASAV, LDA, A, LDA )
643663 CALL DGESVDMR3( JOBU, JOBVT, RANGE, M, N, A, LDA,
644664 $ VL, VU, IL, IU, NS, S, U, LDU,
645- $ VT, LDVT, WORK, LWORK , IWORK,
665+ $ VT, LDVT, WORK, LSWORK , IWORK,
646666 $ IINFO )
647667*
648668* Compare U
@@ -704,7 +724,7 @@ SUBROUTINE DDRVMR3( NSIZES, MM, NN, NTYPES, DOTYPE, ISEED, THRESH,
704724 CALL DLACPY( ' F' , M, N, ASAV, LDA, A, LDA )
705725 CALL DGESVDMR3( ' V' , ' V' , ' I' , M, N, A, LDA,
706726 $ VL, VU, IL, IU, NSI, S, U, LDU,
707- $ VT, LDVT, WORK, LWORK , IWORK,
727+ $ VT, LDVT, WORK, LSWORK , IWORK,
708728 $ IINFO )
709729 IF ( IINFO.NE. 0 ) THEN
710730 WRITE ( NOUT, FMT = 9995 )' GESVDMR3' , IINFO, M, N,
@@ -761,7 +781,7 @@ SUBROUTINE DDRVMR3( NSIZES, MM, NN, NTYPES, DOTYPE, ISEED, THRESH,
761781 CALL DLACPY( ' F' , M, N, ASAV, LDA, A, LDA )
762782 CALL DGESVDMR3( ' V' , ' V' , ' V' , M, N, A, LDA,
763783 $ VL, VU, IL, IU, NSV, S, U, LDU,
764- $ VT, LDVT, WORK, LWORK , IWORK,
784+ $ VT, LDVT, WORK, LSWORK , IWORK,
765785 $ IINFO )
766786 IF ( IINFO.NE. 0 ) THEN
767787 WRITE ( NOUT, FMT = 9995 )' GESVDMR3' , IINFO, M, N,
0 commit comments