83      SUBROUTINE stsqr01(TSSW, M, N, MB, NB, RESULT)
 
  100      REAL, 
ALLOCATABLE :: AF(:,:), Q(:,:),
 
  101     $  R(:,:), RWORK(:), WORK( : ), T(:),
 
  102     $  CF(:,:), DF(:,:), A(:,:), C(:,:), D(:,:), LQ(:,:)
 
  106      parameter( zero = 0.0, one = 1.0 )
 
  109      LOGICAL TESTZEROS, TS
 
  110      INTEGER INFO, J, K, L, LWORK, TSIZE, MNB
 
  111      REAL   ANORM, EPS, RESID, CNORM, DNORM
 
  115      REAL               TQUERY( 5 ), WORKQUERY( 1 )
 
  118      REAL     SLAMCH, SLANGE, SLANSY
 
  121      EXTERNAL slamch, 
slarnv, slange, slansy, lsame, ilaenv
 
  129      COMMON             / srnamc / srnamt
 
  132      DATA iseed / 1988, 1989, 1990, 1991 /
 
  136      ts = lsame(tssw, 
'TS')
 
  142      eps = slamch( 
'Epsilon' )
 
  150      ALLOCATE ( a(m,n), af(m,n), q(l,l), r(m,l), rwork(l),
 
  152     $           d(n,m), df(n,m), lq(l,n) )
 
  157         CALL slarnv( 2, iseed, m, a( 1, j ) )
 
  162               CALL slarnv( 2, iseed, m/2, a( m/4, j ) )
 
  166      CALL slacpy( 
'Full', m, n, a, m, af, m )
 
  172      CALL sgeqr( m, n, af, m, tquery, -1, workquery, -1, info )
 
  173      tsize = int( tquery( 1 ) )
 
  174      lwork = int( workquery( 1 ) )
 
  175      CALL sgemqr( 
'L', 
'N', m, m, k, af, m, tquery, tsize, cf, m,
 
  176     $             workquery, -1, info)
 
  177      lwork = max( lwork, int( workquery( 1 ) ) )
 
  178      CALL sgemqr( 
'L', 
'N', m, n, k, af, m, tquery, tsize, cf, m,
 
  179     $             workquery, -1, info)
 
  180      lwork = max( lwork, int( workquery( 1 ) ) )
 
  181      CALL sgemqr( 
'L', 
'T', m, n, k, af, m, tquery, tsize, cf, m,
 
  182     $             workquery, -1, info)
 
  183      lwork = max( lwork, int( workquery( 1 ) ) )
 
  184      CALL sgemqr( 
'R', 
'N', n, m, k, af, m, tquery, tsize, df, n,
 
  185     $             workquery, -1, info)
 
  186      lwork = max( lwork, int( workquery( 1 ) ) )
 
  187      CALL sgemqr( 
'R', 
'T', n, m, k, af, m, tquery, tsize, df, n,
 
  188     $             workquery, -1, info)
 
  189      lwork = max( lwork, int( workquery( 1 ) ) )
 
  190      ALLOCATE ( t( tsize ) )
 
  191      ALLOCATE ( work( lwork ) )
 
  193      CALL sgeqr( m, n, af, m, t, tsize, work, lwork, info )
 
  197      CALL slaset( 
'Full', m, m, zero, one, q, m )
 
  199      CALL sgemqr( 
'L', 
'N', m, m, k, af, m, t, tsize, q, m,
 
  200     $              work, lwork, info )
 
  204      CALL slaset( 
'Full', m, n, zero, zero, r, m )
 
  205      CALL slacpy( 
'Upper', m, n, af, m, r, m )
 
  209      CALL sgemm( 
'T', 
'N', m, n, m, -one, q, m, a, m, one, r, m )
 
  210      anorm = slange( 
'1', m, n, a, m, rwork )
 
  211      resid = slange( 
'1', m, n, r, m, rwork )
 
  212      IF( anorm.GT.zero ) 
THEN 
  213         result( 1 ) = resid / (eps*max(1,m)*anorm)
 
  220      CALL slaset( 
'Full', m, m, zero, one, r, m )
 
  221      CALL ssyrk( 
'U', 
'C', m, m, -one, q, m, one, r, m )
 
  222      resid = slansy( 
'1', 
'Upper', m, r, m, rwork )
 
  223      result( 2 ) = resid / (eps*max(1,m))
 
  228         CALL slarnv( 2, iseed, m, c( 1, j ) )
 
  230      cnorm = slange( 
'1', m, n, c, m, rwork)
 
  231      CALL slacpy( 
'Full', m, n, c, m, cf, m )
 
  236      CALL sgemqr( 
'L', 
'N', m, n, k, af, m, t, tsize, cf, m,
 
  241      CALL sgemm( 
'N', 
'N', m, n, m, -one, q, m, c, m, one, cf, m )
 
  242      resid = slange( 
'1', m, n, cf, m, rwork )
 
  243      IF( cnorm.GT.zero ) 
THEN 
  244         result( 3 ) = resid / (eps*max(1,m)*cnorm)
 
  251      CALL slacpy( 
'Full', m, n, c, m, cf, m )
 
  256      CALL sgemqr( 
'L', 
'T', m, n, k, af, m, t, tsize, cf, m,
 
  261      CALL sgemm( 
'T', 
'N', m, n, m, -one, q, m, c, m, one, cf, m )
 
  262      resid = slange( 
'1', m, n, cf, m, rwork )
 
  263      IF( cnorm.GT.zero ) 
THEN 
  264         result( 4 ) = resid / (eps*max(1,m)*cnorm)
 
  272         CALL slarnv( 2, iseed, n, d( 1, j ) )
 
  274      dnorm = slange( 
'1', n, m, d, n, rwork)
 
  275      CALL slacpy( 
'Full', n, m, d, n, df, n )
 
  280      CALL sgemqr( 
'R', 
'N', n, m, k, af, m, t, tsize, df, n,
 
  285      CALL sgemm( 
'N', 
'N', n, m, m, -one, d, n, q, m, one, df, n )
 
  286      resid = slange( 
'1', n, m, df, n, rwork )
 
  287      IF( dnorm.GT.zero ) 
THEN 
  288         result( 5 ) = resid / (eps*max(1,m)*dnorm)
 
  295      CALL slacpy( 
'Full', n, m, d, n, df, n )
 
  299      CALL sgemqr( 
'R', 
'T', n, m, k, af, m, t, tsize, df, n,
 
  304      CALL sgemm( 
'N', 
'T', n, m, m, -one, d, n, q, m, one, df, n )
 
  305      resid = slange( 
'1', n, m, df, n, rwork )
 
  306      IF( cnorm.GT.zero ) 
THEN 
  307         result( 6 ) = resid / (eps*max(1,m)*dnorm)
 
  315      CALL sgelq( m, n, af, m, tquery, -1, workquery, -1, info )
 
  316      tsize = int( tquery( 1 ) )
 
  317      lwork = int( workquery( 1 ))
 
  318      CALL sgemlq( 
'R', 
'N', n, n, k, af, m, tquery, tsize, q, n,
 
  319     $              workquery, -1, info )
 
  320      lwork = max( lwork, int( workquery( 1 ) ) )
 
  321      CALL sgemlq( 
'L', 
'N', n, m, k, af, m, tquery, tsize, df, n,
 
  322     $             workquery, -1, info)
 
  323      lwork = max( lwork, int( workquery( 1 ) ) )
 
  324      CALL sgemlq( 
'L', 
'T', n, m, k, af, m, tquery, tsize, df, n,
 
  325     $             workquery, -1, info)
 
  326      lwork = max( lwork, int( workquery( 1 ) ) )
 
  327      CALL sgemlq( 
'R', 
'N', m, n, k, af, m, tquery, tsize, cf, m,
 
  328     $             workquery, -1, info)
 
  329      lwork = max( lwork, int( workquery( 1 ) ) )
 
  330      CALL sgemlq( 
'R', 
'T', m, n, k, af, m, tquery, tsize, cf, m,
 
  331     $             workquery, -1, info)
 
  332      lwork = max( lwork, int( workquery( 1 ) ) )
 
  333      ALLOCATE ( t( tsize ) )
 
  334      ALLOCATE ( work( lwork ) )
 
  336      CALL sgelq( m, n, af, m, t, tsize, work, lwork, info )
 
  341      CALL slaset( 
'Full', n, n, zero, one, q, n )
 
  343      CALL sgemlq( 
'R', 
'N', n, n, k, af, m, t, tsize, q, n,
 
  344     $              work, lwork, info )
 
  348      CALL slaset( 
'Full', m, n, zero, zero, lq, l )
 
  349      CALL slacpy( 
'Lower', m, n, af, m, lq, l )
 
  353      CALL sgemm( 
'N', 
'T', m, n, n, -one, a, m, q, n, one, lq, l )
 
  354      anorm = slange( 
'1', m, n, a, m, rwork )
 
  355      resid = slange( 
'1', m, n, lq, l, rwork )
 
  356      IF( anorm.GT.zero ) 
THEN 
  357         result( 1 ) = resid / (eps*max(1,n)*anorm)
 
  364      CALL slaset( 
'Full', n, n, zero, one, lq, l )
 
  365      CALL ssyrk( 
'U', 
'C', n, n, -one, q, n, one, lq, l )
 
  366      resid = slansy( 
'1', 
'Upper', n, lq, l, rwork )
 
  367      result( 2 ) = resid / (eps*max(1,n))
 
  372         CALL slarnv( 2, iseed, n, d( 1, j ) )
 
  374      dnorm = slange( 
'1', n, m, d, n, rwork)
 
  375      CALL slacpy( 
'Full', n, m, d, n, df, n )
 
  379      CALL sgemlq( 
'L', 
'N', n, m, k, af, m, t, tsize, df, n,
 
  384      CALL sgemm( 
'N', 
'N', n, m, n, -one, q, n, d, n, one, df, n )
 
  385      resid = slange( 
'1', n, m, df, n, rwork )
 
  386      IF( dnorm.GT.zero ) 
THEN 
  387         result( 3 ) = resid / (eps*max(1,n)*dnorm)
 
  394      CALL slacpy( 
'Full', n, m, d, n, df, n )
 
  398      CALL sgemlq( 
'L', 
'T', n, m, k, af, m, t, tsize, df, n,
 
  403      CALL sgemm( 
'T', 
'N', n, m, n, -one, q, n, d, n, one, df, n )
 
  404      resid = slange( 
'1', n, m, df, n, rwork )
 
  405      IF( dnorm.GT.zero ) 
THEN 
  406         result( 4 ) = resid / (eps*max(1,n)*dnorm)
 
  414         CALL slarnv( 2, iseed, m, c( 1, j ) )
 
  416      cnorm = slange( 
'1', m, n, c, m, rwork)
 
  417      CALL slacpy( 
'Full', m, n, c, m, cf, m )
 
  421      CALL sgemlq( 
'R', 
'N', m, n, k, af, m, t, tsize, cf, m,
 
  426      CALL sgemm( 
'N', 
'N', m, n, n, -one, c, m, q, n, one, cf, m )
 
  427      resid = slange( 
'1', n, m, df, n, rwork )
 
  428      IF( cnorm.GT.zero ) 
THEN 
  429         result( 5 ) = resid / (eps*max(1,n)*cnorm)
 
  436      CALL slacpy( 
'Full', m, n, c, m, cf, m )
 
  440      CALL sgemlq( 
'R', 
'T', m, n, k, af, m, t, tsize, cf, m,
 
  445      CALL sgemm( 
'N', 
'T', m, n, n, -one, c, m, q, n, one, cf, m )
 
  446      resid = slange( 
'1', m, n, cf, m, rwork )
 
  447      IF( cnorm.GT.zero ) 
THEN 
  448         result( 6 ) = resid / (eps*max(1,n)*cnorm)
 
  457      DEALLOCATE ( a, af, q, r, rwork, work, t, c, d, cf, df)