388      SUBROUTINE slaqp3rk( M, N, NRHS, IOFFSET, NB, ABSTOL,
 
  389     $                     RELTOL, KP1, MAXC2NRM, A, LDA, DONE, KB,
 
  390     $                     MAXC2NRMK, RELMAXC2NRMK, JPIV, TAU,
 
  391     $                     VN1, VN2, AUXV, F, LDF, IWORK, INFO )
 
  400      INTEGER            INFO, IOFFSET, KB, KP1, LDA, LDF, M, N,
 
  402      REAL               ABSTOL, MAXC2NRM, MAXC2NRMK, RELMAXC2NRMK,
 
  406      INTEGER            IWORK( * ), JPIV( * )
 
  407      REAL               A( LDA, * ), AUXV( * ), F( LDF, * ), TAU( * ),
 
  415      PARAMETER          ( ZERO = 0.0e+0, one = 1.0e+0 )
 
  418      INTEGER            ITEMP, J, K, MINMNFACT, MINMNUPDT,
 
  420      REAL               AIK, HUGEVAL, TEMP, TEMP2, TOL3Z
 
  426      INTRINSIC          abs, max, min, sqrt
 
  432      EXTERNAL           sisnan, slamch, isamax, snrm2
 
  443      minmnfact = min( m-ioffset, n )
 
  444      minmnupdt = min( m-ioffset, n+nrhs )
 
  445      nb = min( nb, minmnfact )
 
  446      tol3z = sqrt( slamch( 
'Epsilon' ) )
 
  447      hugeval = slamch( 
'Overflow' )
 
  456      DO WHILE ( k.LT.nb .AND. lsticc.EQ.0 )
 
  474            kp = ( k-1 ) + isamax( n-k+1, vn1( k ), 1 )
 
  479            maxc2nrmk = vn1( kp )
 
  491            IF( sisnan( maxc2nrmk ) ) 
THEN 
  508               relmaxc2nrmk = maxc2nrmk
 
  522               IF( nrhs.GT.0 .AND. kb.LT.(m-ioffset) ) 
THEN 
  523                  CALL sgemm( 
'No transpose', 
'Transpose',
 
  524     $                  m-
IF, nrhs, kb, -one, a( if+1, 1 ), lda,
 
  525     $                  f( n+1, 1 ), ldf, one, a( if+1, n+1 ), lda )
 
  545            IF( maxc2nrmk.EQ.zero ) 
THEN 
  571               IF( nrhs.GT.0 .AND. kb.LT.(m-ioffset) ) 
THEN 
  572                  CALL sgemm( 
'No transpose', 
'Transpose',
 
  573     $                  m-
IF, nrhs, kb, -one, a( if+1, 1 ), lda,
 
  574     $                  f( n+1, 1 ), ldf, one, a( if+1, n+1 ), lda )
 
  605            IF( info.EQ.0 .AND. maxc2nrmk.GT.hugeval ) 
THEN 
  606               info = n + k - 1 + kp
 
  621            relmaxc2nrmk =  maxc2nrmk / maxc2nrm
 
  623            IF( maxc2nrmk.LE.abstol .OR. relmaxc2nrmk.LE.reltol ) 
THEN 
  647               IF( kb.LT.minmnupdt ) 
THEN 
  648                  CALL sgemm( 
'No transpose', 
'Transpose',
 
  649     $                  m-
IF, n+nrhs-kb, kb,-one, a( if+1, 1 ), lda,
 
  650     $                  f( kb+1, 1 ), ldf, one, a( if+1, kb+1 ), lda )
 
  691            CALL sswap( m, a( 1, kp ), 1, a( 1, k ), 1 )
 
  692            CALL sswap( k-1, f( kp, 1 ), ldf, f( k, 1 ), ldf )
 
  696            jpiv( kp ) = jpiv( k )
 
  704            CALL sgemv( 
'No transpose', m-i+1, k-1, -one, a( i, 1 ),
 
  705     $                  lda, f( k, 1 ), ldf, one, a( i, k ), 1 )
 
  711            CALL slarfg( m-i+1, a( i, k ), a( i+1, k ), 1, tau( k ) )
 
  726         IF( sisnan( tau(k) ) ) 
THEN 
  744            relmaxc2nrmk = tau( k )
 
  758            IF( nrhs.GT.0 .AND. kb.LT.(m-ioffset) ) 
THEN 
  759               CALL sgemm( 
'No transpose', 
'Transpose',
 
  760     $               m-
IF, nrhs, kb, -one, a( if+1, 1 ), lda,
 
  761     $               f( n+1, 1 ), ldf, one, a( if+1, n+1 ), lda )
 
  785         IF( k.LT.n+nrhs ) 
THEN 
  786            CALL sgemv( 
'Transpose', m-i+1, n+nrhs-k,
 
  787     $                  tau( k ), a( i, k+1 ), lda, a( i, k ), 1,
 
  788     $                  zero, f( k+1, k ), 1 )
 
  803            CALL sgemv( 
'Transpose', m-i+1, k-1, -tau( k ),
 
  804     $                  a( i, 1 ), lda, a( i, k ), 1, zero,
 
  807            CALL sgemv( 
'No transpose', n+nrhs, k-1, one,
 
  808     $                  f( 1, 1 ), ldf, auxv( 1 ), 1, one,
 
  818         IF( k.LT.n+nrhs ) 
THEN 
  819            CALL sgemv( 
'No transpose', n+nrhs-k, k, -one,
 
  820     $                  f( k+1, 1 ), ldf, a( i, 1 ), lda, one,
 
  830         IF( k.LT.minmnfact ) 
THEN 
  833               IF( vn1( j ).NE.zero ) 
THEN 
  838                  temp = abs( a( i, j ) ) / vn1( j )
 
  839                  temp = max( zero, ( one+temp )*( one-temp ) )
 
  840                  temp2 = temp*( vn1( j ) / vn2( j ) )**2
 
  841                  IF( temp2.LE.tol3z ) 
THEN 
  850                     iwork( j-1 ) = lsticc
 
  857                     vn1( j ) = vn1( j )*sqrt( temp )
 
  886      IF( kb.LT.minmnupdt ) 
THEN 
  887         CALL sgemm( 
'No transpose', 
'Transpose',
 
  888     $         m-
IF, n+nrhs-kb, kb, -one, a( if+1, 1 ), lda,
 
  889     $         f( kb+1, 1 ), ldf, one, a( if+1, kb+1 ), lda )
 
  896      DO WHILE( lsticc.GT.0 )
 
  902         itemp = iwork( lsticc-1 )
 
  911         vn1( lsticc ) = snrm2( m-
IF, a( if+1, lsticc ), 1 )
 
  912         vn2( lsticc ) = vn1( lsticc )
 
 
subroutine slaqp3rk(m, n, nrhs, ioffset, nb, abstol, reltol, kp1, maxc2nrm, a, lda, done, kb, maxc2nrmk, relmaxc2nrmk, jpiv, tau, vn1, vn2, auxv, f, ldf, iwork, info)
SLAQP3RK computes a step of truncated QR factorization with column pivoting of a real m-by-n matrix A...