113
  114
  115
  116
  117
  118
  119      INTEGER            INFO, KL, KU, LDA, M, N
  120
  121
  122      INTEGER            ISEED( 4 )
  123      DOUBLE PRECISION   A( LDA, * ), D( * ), WORK( * )
  124
  125
  126
  127
  128
  129      DOUBLE PRECISION   ZERO, ONE
  130      parameter( zero = 0.0d+0, one = 1.0d+0 )
  131
  132
  133      INTEGER            I, J
  134      DOUBLE PRECISION   TAU, WA, WB, WN
  135
  136
  138
  139
  140      INTRINSIC          max, min, sign
  141
  142
  143      DOUBLE PRECISION   DNRM2
  145
  146
  147
  148
  149
  150      info = 0
  151      IF( m.LT.0 ) THEN
  152         info = -1
  153      ELSE IF( n.LT.0 ) THEN
  154         info = -2
  155      ELSE IF( kl.LT.0 .OR. kl.GT.m-1 ) THEN
  156         info = -3
  157      ELSE IF( ku.LT.0 .OR. ku.GT.n-1 ) THEN
  158         info = -4
  159      ELSE IF( lda.LT.max( 1, m ) ) THEN
  160         info = -7
  161      END IF
  162      IF( info.LT.0 ) THEN
  163         CALL xerbla( 
'DLAGGE', -info )
 
  164         RETURN
  165      END IF
  166
  167
  168
  169      DO 20 j = 1, n
  170         DO 10 i = 1, m
  171            a( i, j ) = zero
  172   10    CONTINUE
  173   20 CONTINUE
  174      DO 30 i = 1, min( m, n )
  175         a( i, i ) = d( i )
  176   30 CONTINUE
  177
  178
  179
  180      IF(( kl .EQ. 0 ).AND.( ku .EQ. 0)) RETURN
  181
  182
  183
  184      DO 40 i = min( m, n ), 1, -1
  185         IF( i.LT.m ) THEN
  186
  187
  188
  189            CALL dlarnv( 3, iseed, m-i+1, work )
 
  190            wn = 
dnrm2( m-i+1, work, 1 )
 
  191            wa = sign( wn, work( 1 ) )
  192            IF( wn.EQ.zero ) THEN
  193               tau = zero
  194            ELSE
  195               wb = work( 1 ) + wa
  196               CALL dscal( m-i, one / wb, work( 2 ), 1 )
 
  197               work( 1 ) = one
  198               tau = wb / wa
  199            END IF
  200
  201
  202
  203            CALL dgemv( 
'Transpose', m-i+1, n-i+1, one, a( i, i ), lda,
 
  204     $                  work, 1, zero, work( m+1 ), 1 )
  205            CALL dger( m-i+1, n-i+1, -tau, work, 1, work( m+1 ), 1,
 
  206     $                 a( i, i ), lda )
  207         END IF
  208         IF( i.LT.n ) THEN
  209
  210
  211
  212            CALL dlarnv( 3, iseed, n-i+1, work )
 
  213            wn = 
dnrm2( n-i+1, work, 1 )
 
  214            wa = sign( wn, work( 1 ) )
  215            IF( wn.EQ.zero ) THEN
  216               tau = zero
  217            ELSE
  218               wb = work( 1 ) + wa
  219               CALL dscal( n-i, one / wb, work( 2 ), 1 )
 
  220               work( 1 ) = one
  221               tau = wb / wa
  222            END IF
  223
  224
  225
  226            CALL dgemv( 
'No transpose', m-i+1, n-i+1, one, a( i, i ),
 
  227     $                  lda, work, 1, zero, work( n+1 ), 1 )
  228            CALL dger( m-i+1, n-i+1, -tau, work( n+1 ), 1, work, 1,
 
  229     $                 a( i, i ), lda )
  230         END IF
  231   40 CONTINUE
  232
  233
  234
  235
  236      DO 70 i = 1, max( m-1-kl, n-1-ku )
  237         IF( kl.LE.ku ) THEN
  238
  239
  240
  241            IF( i.LE.min( m-1-kl, n ) ) THEN
  242
  243
  244
  245               wn = 
dnrm2( m-kl-i+1, a( kl+i, i ), 1 )
 
  246               wa = sign( wn, a( kl+i, i ) )
  247               IF( wn.EQ.zero ) THEN
  248                  tau = zero
  249               ELSE
  250                  wb = a( kl+i, i ) + wa
  251                  CALL dscal( m-kl-i, one / wb, a( kl+i+1, i ), 1 )
 
  252                  a( kl+i, i ) = one
  253                  tau = wb / wa
  254               END IF
  255
  256
  257
  258               CALL dgemv( 
'Transpose', m-kl-i+1, n-i, one,
 
  259     $                     a( kl+i, i+1 ), lda, a( kl+i, i ), 1, zero,
  260     $                     work, 1 )
  261               CALL dger( m-kl-i+1, n-i, -tau, a( kl+i, i ), 1, work, 1,
 
  262     $                    a( kl+i, i+1 ), lda )
  263               a( kl+i, i ) = -wa
  264            END IF
  265
  266            IF( i.LE.min( n-1-ku, m ) ) THEN
  267
  268
  269
  270               wn = 
dnrm2( n-ku-i+1, a( i, ku+i ), lda )
 
  271               wa = sign( wn, a( i, ku+i ) )
  272               IF( wn.EQ.zero ) THEN
  273                  tau = zero
  274               ELSE
  275                  wb = a( i, ku+i ) + wa
  276                  CALL dscal( n-ku-i, one / wb, a( i, ku+i+1 ), lda )
 
  277                  a( i, ku+i ) = one
  278                  tau = wb / wa
  279               END IF
  280
  281
  282
  283               CALL dgemv( 
'No transpose', m-i, n-ku-i+1, one,
 
  284     $                     a( i+1, ku+i ), lda, a( i, ku+i ), lda, zero,
  285     $                     work, 1 )
  286               CALL dger( m-i, n-ku-i+1, -tau, work, 1, a( i, ku+i ),
 
  287     $                    lda, a( i+1, ku+i ), lda )
  288               a( i, ku+i ) = -wa
  289            END IF
  290         ELSE
  291
  292
  293
  294
  295            IF( i.LE.min( n-1-ku, m ) ) THEN
  296
  297
  298
  299               wn = 
dnrm2( n-ku-i+1, a( i, ku+i ), lda )
 
  300               wa = sign( wn, a( i, ku+i ) )
  301               IF( wn.EQ.zero ) THEN
  302                  tau = zero
  303               ELSE
  304                  wb = a( i, ku+i ) + wa
  305                  CALL dscal( n-ku-i, one / wb, a( i, ku+i+1 ), lda )
 
  306                  a( i, ku+i ) = one
  307                  tau = wb / wa
  308               END IF
  309
  310
  311
  312               CALL dgemv( 
'No transpose', m-i, n-ku-i+1, one,
 
  313     $                     a( i+1, ku+i ), lda, a( i, ku+i ), lda, zero,
  314     $                     work, 1 )
  315               CALL dger( m-i, n-ku-i+1, -tau, work, 1, a( i, ku+i ),
 
  316     $                    lda, a( i+1, ku+i ), lda )
  317               a( i, ku+i ) = -wa
  318            END IF
  319
  320            IF( i.LE.min( m-1-kl, n ) ) THEN
  321
  322
  323
  324               wn = 
dnrm2( m-kl-i+1, a( kl+i, i ), 1 )
 
  325               wa = sign( wn, a( kl+i, i ) )
  326               IF( wn.EQ.zero ) THEN
  327                  tau = zero
  328               ELSE
  329                  wb = a( kl+i, i ) + wa
  330                  CALL dscal( m-kl-i, one / wb, a( kl+i+1, i ), 1 )
 
  331                  a( kl+i, i ) = one
  332                  tau = wb / wa
  333               END IF
  334
  335
  336
  337               CALL dgemv( 
'Transpose', m-kl-i+1, n-i, one,
 
  338     $                     a( kl+i, i+1 ), lda, a( kl+i, i ), 1, zero,
  339     $                     work, 1 )
  340               CALL dger( m-kl-i+1, n-i, -tau, a( kl+i, i ), 1, work, 1,
 
  341     $                    a( kl+i, i+1 ), lda )
  342               a( kl+i, i ) = -wa
  343            END IF
  344         END IF
  345
  346         IF (i .LE. n) THEN
  347            DO 50 j = kl + i + 1, m
  348               a( j, i ) = zero
  349   50       CONTINUE
  350         END IF
  351
  352         IF (i .LE. m) THEN
  353            DO 60 j = ku + i + 1, n
  354               a( i, j ) = zero
  355   60       CONTINUE
  356         END IF
  357   70 CONTINUE
  358      RETURN
  359
  360
  361
subroutine xerbla(srname, info)
subroutine dgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
DGEMV
subroutine dger(m, n, alpha, x, incx, y, incy, a, lda)
DGER
subroutine dlarnv(idist, iseed, n, x)
DLARNV returns a vector of random numbers from a uniform or normal distribution.
real(wp) function dnrm2(n, x, incx)
DNRM2
subroutine dscal(n, da, dx, incx)
DSCAL