1      INTEGER FUNCTION LA_WS_GELSS( VER, M, N, NRHS )
2!
3!  -- LAPACK95 interface driver routine (version 1.0) --
4!     UNI-C, Denmark; Univ. of Tennessee, USA; NAG Ltd., UK
5!     May 31, 1997
6!
7!   .. USE STATEMENTS ..
8      USE F77_LAPACK, ONLY: ILAENV_F77 => LA_ILAENV
9!     .. IMPLICIT STATEMENT ..
10      IMPLICIT NONE
11!     .. SCALAR ARGUMENTS ..
12      CHARACTER(LEN=1), INTENT(IN) :: VER
13      INTEGER, INTENT(IN) :: M, N, NRHS
14!     .. PARAMETERS ..
15      CHARACTER(LEN=5), PARAMETER :: NAME1='GELSS', NAME2='GEQRF', NAME3='ORMQR', NAME4='GEBRD', &
16                                     NAME5='ORMBR', NAME6='ORGBR', NAME7='GELQF', NAME8='ORMLQ'
17!     .. LOCAL SCALARS ..
18      INTEGER :: MNTHR, MINWRK, MAXWRK, MM, BDSPAC
19!     .. INTRINSIC FUNCTIONS ..
20      INTRINSIC MAX
21!     .. EXECUTABLE STATEMENTS ..
22      MNTHR = ILAENV_F77( 6, VER//NAME1, ' ', M, N, NRHS, -1 )
23!
24!     COMPUTE WORKSPACE
25!      (NOTE: COMMENTS IN THE CODE BEGINNING "Workspace:" DESCRIBE THE
26!       MINIMAL AMOUNT OF WORKSPACE NEEDED AT THAT POINT IN THE CODE,
27!       AS WELL AS THE PREFERRED AMOUNT FOR GOOD PERFORMANCE.
28!       NB REFERS TO THE OPTIMAL BLOCK SIZE FOR THE IMMEDIATELY
29!       FOLLOWING SUBROUTINE, AS RETURNED BY ILAENV.)
30!
31      MINWRK = 1
32      MAXWRK = 0
33      MM = M
34      IF( M.GE.N .AND. M.GE.MNTHR ) THEN
35!
36!        PATH 1A - OVERDETERMINED, WITH MANY MORE ROWS THAN COLUMNS
37!
38         MM = N
39         MAXWRK = MAX(MAXWRK,N+N*ILAENV_F77(1,VER//NAME2,' ',M,N,-1,-1))
40         MAXWRK = MAX( MAXWRK, N+NRHS*                                  &
41     &            ILAENV_F77( 1, VER//NAME3, 'LT', M, NRHS, N, -1 ) )
42      END IF
43      IF( M.GE.N ) THEN
44!
45!        PATH 1 - OVERDETERMINED OR EXACTLY DETERMINED
46!
47!        COMPUTE WORKSPACE NEEDE FOR DBDSQR
48!
49         BDSPAC = MAX( 1, 5*N-4 )
50         MAXWRK = MAX( MAXWRK, 3*N+( MM+N )*                            &
51     &            ILAENV_F77( 1, VER//NAME4, ' ', MM, N, -1, -1 ) )
52         MAXWRK = MAX( MAXWRK, 3*N+NRHS*                                &
53     &            ILAENV_F77( 1, VER//NAME5, 'QLT', MM, NRHS, N, -1 ) )
54         MAXWRK = MAX( MAXWRK, 3*N+( N-1 )*                             &
55     &            ILAENV_F77( 1, VER//NAME6, 'P', N, N, N, -1 ) )
56         MAXWRK = MAX( MAXWRK, BDSPAC )
57         MAXWRK = MAX( MAXWRK, N*NRHS )
58         MINWRK = MAX( 3*N+MM, 3*N+NRHS, BDSPAC )
59         MAXWRK = MAX( MINWRK, MAXWRK )
60      END IF
61      IF( N.GT.M ) THEN
62!
63!        COMPUTE WORKSPACE NEEDE FOR DBDSQR
64!
65         BDSPAC = MAX( 1, 5*M-4 )
66         MINWRK = MAX( 3*M+NRHS, 3*M+N, BDSPAC )
67         IF( N.GE.MNTHR ) THEN
68!
69!           PATH 2A - UNDERDETERMINED, WITH MANY MORE COLUMNS
70!           THAN ROWS
71!
72            MAXWRK = M + M*ILAENV_F77( 1,VER//NAME7,' ',M,N,-1,-1 )
73            MAXWRK = MAX( MAXWRK, M*M+4*M+2*M*                          &
74     &               ILAENV_F77( 1, VER//NAME4, ' ', M, M, -1, -1 ) )
75            MAXWRK = MAX( MAXWRK, M*M+4*M+NRHS*                         &
76     &               ILAENV_F77( 1,VER//NAME5,'QLT',M,NRHS,M,-1 ) )
77            MAXWRK = MAX( MAXWRK, M*M+4*M+( M-1 )*                      &
78     &               ILAENV_F77( 1, VER//NAME6, 'P', M, M, M, -1 ) )
79            MAXWRK = MAX( MAXWRK, M*M+M+BDSPAC )
80            IF( NRHS.GT.1 ) THEN
81               MAXWRK = MAX( MAXWRK, M*M+M+M*NRHS )
82            ELSE
83               MAXWRK = MAX( MAXWRK, M*M+2*M )
84            END IF
85            MAXWRK = MAX( MAXWRK, M+NRHS*                               &
86     &               ILAENV_F77( 1, VER//NAME8, 'LT', N, NRHS, M, -1 ) )
87         ELSE
88!
89!           PATH 2 - UNDERDETERMINED
90!
91            MAXWRK = 3*M+(N+M)*ILAENV_F77(1,VER//NAME4,' ',M,N,-1,-1)
92            MAXWRK = MAX( MAXWRK, 3*M+NRHS*                             &
93     &               ILAENV_F77( 1,VER//NAME5,'QLT',M,NRHS,M,-1 ) )
94            MAXWRK = MAX( MAXWRK, 3*M+M*                                &
95     &               ILAENV_F77( 1, VER//NAME6, 'P', M, N, M, -1 ) )
96            MAXWRK = MAX( MAXWRK, BDSPAC )
97            MAXWRK = MAX( MAXWRK, N*NRHS )
98         END IF
99      END IF
100      LA_WS_GELSS = M*M + 4*M*M + 3*N*N + NRHS*NRHS*NRHS
101!     &  MAX( MINWRK, MAXWRK )
102      END FUNCTION LA_WS_GELSS
103