File:  [local] / rpl / lapack / lapack / dlatsqr.f
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Sat Jun 17 11:02:50 2017 UTC (6 years, 10 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Ajout des nouveaux fichiers pour lapack 3.7.0.

    1: *
    2: *  Definition:
    3: *  ===========
    4: *
    5: *       SUBROUTINE DLATSQR( M, N, MB, NB, A, LDA, T, LDT, WORK,
    6: *                           LWORK, INFO)
    7: *
    8: *       .. Scalar Arguments ..
    9: *       INTEGER           INFO, LDA, M, N, MB, NB, LDT, LWORK
   10: *       ..
   11: *       .. Array Arguments ..
   12: *       DOUBLE PRECISION  A( LDA, * ), T( LDT, * ), WORK( * )
   13: *       ..
   14: *
   15: *
   16: *> \par Purpose:
   17: *  =============
   18: *>
   19: *> \verbatim
   20: *>
   21: *> DLATSQR computes a blocked Tall-Skinny QR factorization of
   22: *> an M-by-N matrix A, where M >= N:
   23: *> A = Q * R .
   24: *> \endverbatim
   25: *
   26: *  Arguments:
   27: *  ==========
   28: *
   29: *> \param[in] M
   30: *> \verbatim
   31: *>          M is INTEGER
   32: *>          The number of rows of the matrix A.  M >= 0.
   33: *> \endverbatim
   34: *>
   35: *> \param[in] N
   36: *> \verbatim
   37: *>          N is INTEGER
   38: *>          The number of columns of the matrix A. M >= N >= 0.
   39: *> \endverbatim
   40: *>
   41: *> \param[in] MB
   42: *> \verbatim
   43: *>          MB is INTEGER
   44: *>          The row block size to be used in the blocked QR.
   45: *>          MB > N.
   46: *> \endverbatim
   47: *>
   48: *> \param[in] NB
   49: *> \verbatim
   50: *>          NB is INTEGER
   51: *>          The column block size to be used in the blocked QR.
   52: *>          N >= NB >= 1.
   53: *> \endverbatim
   54: *>
   55: *> \param[in,out] A
   56: *> \verbatim
   57: *>          A is DOUBLE PRECISION array, dimension (LDA,N)
   58: *>          On entry, the M-by-N matrix A.
   59: *>          On exit, the elements on and above the diagonal
   60: *>          of the array contain the N-by-N upper triangular matrix R;
   61: *>          the elements below the diagonal represent Q by the columns
   62: *>          of blocked V (see Further Details).
   63: *> \endverbatim
   64: *>
   65: *> \param[in] LDA
   66: *> \verbatim
   67: *>          LDA is INTEGER
   68: *>          The leading dimension of the array A.  LDA >= max(1,M).
   69: *> \endverbatim
   70: *>
   71: *> \param[out] T
   72: *> \verbatim
   73: *>          T is DOUBLE PRECISION array,
   74: *>          dimension (LDT, N * Number_of_row_blocks)
   75: *>          where Number_of_row_blocks = CEIL((M-N)/(MB-N))
   76: *>          The blocked upper triangular block reflectors stored in compact form
   77: *>          as a sequence of upper triangular blocks.
   78: *>          See Further Details below.
   79: *> \endverbatim
   80: *>
   81: *> \param[in] LDT
   82: *> \verbatim
   83: *>          LDT is INTEGER
   84: *>          The leading dimension of the array T.  LDT >= NB.
   85: *> \endverbatim
   86: *>
   87: *> \param[out] WORK
   88: *> \verbatim
   89: *>         (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
   90: *> \endverbatim
   91: *>
   92: *> \param[in] LWORK
   93: *> \verbatim
   94: *>          The dimension of the array WORK.  LWORK >= NB*N.
   95: *>          If LWORK = -1, then a workspace query is assumed; the routine
   96: *>          only calculates the optimal size of the WORK array, returns
   97: *>          this value as the first entry of the WORK array, and no error
   98: *>          message related to LWORK is issued by XERBLA.
   99: *> \endverbatim
  100: *>
  101: *> \param[out] INFO
  102: *> \verbatim
  103: *>          INFO is INTEGER
  104: *>          = 0:  successful exit
  105: *>          < 0:  if INFO = -i, the i-th argument had an illegal value
  106: *> \endverbatim
  107: *
  108: *  Authors:
  109: *  ========
  110: *
  111: *> \author Univ. of Tennessee
  112: *> \author Univ. of California Berkeley
  113: *> \author Univ. of Colorado Denver
  114: *> \author NAG Ltd.
  115: *
  116: *> \par Further Details:
  117: *  =====================
  118: *>
  119: *> \verbatim
  120: *> Tall-Skinny QR (TSQR) performs QR by a sequence of orthogonal transformations,
  121: *> representing Q as a product of other orthogonal matrices
  122: *>   Q = Q(1) * Q(2) * . . . * Q(k)
  123: *> where each Q(i) zeros out subdiagonal entries of a block of MB rows of A:
  124: *>   Q(1) zeros out the subdiagonal entries of rows 1:MB of A
  125: *>   Q(2) zeros out the bottom MB-N rows of rows [1:N,MB+1:2*MB-N] of A
  126: *>   Q(3) zeros out the bottom MB-N rows of rows [1:N,2*MB-N+1:3*MB-2*N] of A
  127: *>   . . .
  128: *>
  129: *> Q(1) is computed by GEQRT, which represents Q(1) by Householder vectors
  130: *> stored under the diagonal of rows 1:MB of A, and by upper triangular
  131: *> block reflectors, stored in array T(1:LDT,1:N).
  132: *> For more information see Further Details in GEQRT.
  133: *>
  134: *> Q(i) for i>1 is computed by TPQRT, which represents Q(i) by Householder vectors
  135: *> stored in rows [(i-1)*(MB-N)+N+1:i*(MB-N)+N] of A, and by upper triangular
  136: *> block reflectors, stored in array T(1:LDT,(i-1)*N+1:i*N).
  137: *> The last Q(k) may use fewer rows.
  138: *> For more information see Further Details in TPQRT.
  139: *>
  140: *> For more details of the overall algorithm, see the description of
  141: *> Sequential TSQR in Section 2.2 of [1].
  142: *>
  143: *> [1] “Communication-Optimal Parallel and Sequential QR and LU Factorizations,”
  144: *>     J. Demmel, L. Grigori, M. Hoemmen, J. Langou,
  145: *>     SIAM J. Sci. Comput, vol. 34, no. 1, 2012
  146: *> \endverbatim
  147: *>
  148: *  =====================================================================
  149:       SUBROUTINE DLATSQR( M, N, MB, NB, A, LDA, T, LDT, WORK,
  150:      $                    LWORK, INFO)
  151: *
  152: *  -- LAPACK computational routine (version 3.7.0) --
  153: *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
  154: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd. --
  155: *     December 2016
  156: *
  157: *     .. Scalar Arguments ..
  158:       INTEGER           INFO, LDA, M, N, MB, NB, LDT, LWORK
  159: *     ..
  160: *     .. Array Arguments ..
  161:       DOUBLE PRECISION  A( LDA, * ), WORK( * ), T(LDT, *)
  162: *     ..
  163: *
  164: *  =====================================================================
  165: *
  166: *     ..
  167: *     .. Local Scalars ..
  168:       LOGICAL    LQUERY
  169:       INTEGER    I, II, KK, CTR
  170: *     ..
  171: *     .. EXTERNAL FUNCTIONS ..
  172:       LOGICAL            LSAME
  173:       EXTERNAL           LSAME
  174: *     .. EXTERNAL SUBROUTINES ..
  175:       EXTERNAL           DGEQRT, DTPQRT, XERBLA
  176: *     .. INTRINSIC FUNCTIONS ..
  177:       INTRINSIC          MAX, MIN, MOD
  178: *     ..
  179: *     .. EXECUTABLE STATEMENTS ..
  180: *
  181: *     TEST THE INPUT ARGUMENTS
  182: *
  183:       INFO = 0
  184: *
  185:       LQUERY = ( LWORK.EQ.-1 )
  186: *
  187:       IF( M.LT.0 ) THEN
  188:         INFO = -1
  189:       ELSE IF( N.LT.0 .OR. M.LT.N ) THEN
  190:         INFO = -2
  191:       ELSE IF( MB.LE.N ) THEN
  192:         INFO = -3
  193:       ELSE IF( NB.LT.1 .OR. ( NB.GT.N .AND. N.GT.0 )) THEN
  194:         INFO = -4
  195:       ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
  196:         INFO = -5
  197:       ELSE IF( LDT.LT.NB ) THEN
  198:         INFO = -8
  199:       ELSE IF( LWORK.LT.(N*NB) .AND. (.NOT.LQUERY) ) THEN
  200:         INFO = -10
  201:       END IF
  202:       IF( INFO.EQ.0)  THEN
  203:         WORK(1) = NB*N
  204:       END IF
  205:       IF( INFO.NE.0 ) THEN
  206:         CALL XERBLA( 'DLATSQR', -INFO )
  207:         RETURN
  208:       ELSE IF (LQUERY) THEN
  209:        RETURN
  210:       END IF
  211: *
  212: *     Quick return if possible
  213: *
  214:       IF( MIN(M,N).EQ.0 ) THEN
  215:           RETURN
  216:       END IF
  217: *
  218: *     The QR Decomposition
  219: *
  220:        IF ((MB.LE.N).OR.(MB.GE.M)) THEN
  221:          CALL DGEQRT( M, N, NB, A, LDA, T, LDT, WORK, INFO)
  222:          RETURN
  223:        END IF
  224: *
  225:        KK = MOD((M-N),(MB-N))
  226:        II=M-KK+1
  227: *
  228: *      Compute the QR factorization of the first block A(1:MB,1:N)
  229: *
  230:        CALL DGEQRT( MB, N, NB, A(1,1), LDA, T, LDT, WORK, INFO )
  231: *
  232:        CTR = 1
  233:        DO I = MB+1, II-MB+N ,  (MB-N)
  234: *
  235: *      Compute the QR factorization of the current block A(I:I+MB-N,1:N)
  236: *
  237:          CALL DTPQRT( MB-N, N, 0, NB, A(1,1), LDA, A( I, 1 ), LDA,
  238:      $                 T(1, CTR * N + 1),
  239:      $                  LDT, WORK, INFO )
  240:          CTR = CTR + 1
  241:        END DO
  242: *
  243: *      Compute the QR factorization of the last block A(II:M,1:N)
  244: *
  245:        IF (II.LE.M) THEN
  246:          CALL DTPQRT( KK, N, 0, NB, A(1,1), LDA, A( II, 1 ), LDA,
  247:      $                 T(1, CTR * N + 1), LDT,
  248:      $                  WORK, INFO )
  249:        END IF
  250: *
  251:       WORK( 1 ) = N*NB
  252:       RETURN
  253: *
  254: *     End of DLATSQR
  255: *
  256:       END

CVSweb interface <joel.bertrand@systella.fr>