001:       SUBROUTINE CORE_CGESSM( M, N, K, IB, IPIV, L, LDL, A, LDA, INFO )
002: 
003: *********************************************************************
004: *     PLASMA core_blas routine (version 2.1.0)                      *
005: *     Author: Hatem Ltaief                                          *
006: *     Release Date: November, 15th 2009                             *
007: *     PLASMA is a software package provided by Univ. of Tennessee,  *
008: *     Univ. of California Berkeley and Univ. of Colorado Denver.    *
009: *********************************************************************
010: *
011: *     .. Scalar Arguments ..
012:       INTEGER            M, N, K, IB, LDL, LDA, INFO
013: *     ..
014: *     .. Array Arguments ..
015:       COMPLEX            L(LDL,*), A(LDA,*)
016:       INTEGER            IPIV( * )
017: *     ..
018: *
019: *  Purpose
020: *  =======
021: *
022: *  CORE_CGESSM applies the factor L computed by CORE_CGETRF to a
023: *  complex M-by-N tile A.
024: *
025: *  Arguments
026: *  =========
027: *
028: *  M       (input) INTEGER
029: *          The number of rows of the tile A.  M >= 0.
030: *
031: *  N       (input) INTEGER
032: *          The number of columns of the tile A.  N >= 0.
033: *
034: *  K       (input) INTEGER
035: *
036: *
037: *  IB      (input) INTEGER
038: *          The inner-blocking size.  IB >= 0.
039: *
040: *  IPIV    (input) INTEGER array, dimension (min(M,N))
041: *          as returned by CORE_CGETRF.
042: *
043: *  L       (input) COMPLEX array, dimension (LDL,NB)
044: *          The NB-by-NB lower triangular tile.
045: *
046: *  LDL     (input) INTEGER
047: *          The leading dimension of the array L.  LDL >= max(1,NB).
048: *
049: *  A       (input/output) COMPLEX array, dimension (LDA,N)
050: *          On entry, the M-by-N tile A.
051: *          On exit, updated by the application of L.
052: *
053: *  LDA     (input) INTEGER
054: *          The leading dimension of the array A.  LDA >= max(1,M).
055: *
056: *  INFO    (output) INTEGER
057: *          = 0: successful exit
058: *          < 0: if INFO = -k, the k-th argument had an illegal value
059: *
060: *  =====================================================================
061: *     ..
062: *     Internal variables ..
063:       INTEGER            I, J, SB
064: *     ..
065: *     .. Parameters ..
066:       COMPLEX   CONE, MCONE
067:       PARAMETER          ( CONE = ( 1.0E+0, 0.0E+0 ) )
068:       PARAMETER          ( MCONE = ( -1.0E+0, 0.0E+0 ) )
069: *     ..
070: *     Test the input parameters.
071:       INFO = 0
072:       IF( M.LT.0 ) THEN
073:          INFO = -1
074:       ELSE IF( N.LT.0 ) THEN
075:          INFO = -2
076:       ELSE IF( K.LT.0 ) THEN
077:          INFO = -3
078:       ELSE IF( IB.LT.0 ) THEN
079:          INFO = -4
080:       ELSE IF( LDL.LT.MAX( 1, M ) ) THEN
081:          INFO = -7
082:       ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
083:          INFO = -9
084:       END IF
085:       IF( INFO.NE.0 ) THEN
086:          CALL XERBLA( 'CORE_CGESSM', -INFO )
087:          RETURN
088:       END IF
089: *
090: *     Quick return if possible.
091: *
092:       IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 .OR. IB.EQ.0  )
093:      $   RETURN
094: *
095:       DO 10 J = 1, K, IB
096:          SB = MIN( K-J+1, IB )
097: *
098: *        Apply interchanges to columns J*IB+1:IB*( J+1 )+1.
099: *
100:          CALL CLASWP( N, A, LDA, J, J+SB-1, IPIV, 1 )
101: *
102: *        Compute block row of U.
103: *
104:          CALL CTRSM( 'Left', 'Lower', 'Notranspose', 'Unit', SB,
105:      $              N, CONE, L( J, J ), LDL,
106:      $              A( J, 1 ), LDA )
107: *
108:          IF( J+SB.LE.M ) THEN
109: *
110: *           Update trailing submatrix.
111: *
112:             CALL CGEMM( 'Notranspose', 'Notranspose', M-( J+SB-1 ),
113:      $                 N, SB, MCONE,
114:      $                 L( J+SB, J ), LDL,
115:      $                 A( J, 1 ), LDA, CONE,
116:      $                 A( J+SB, 1 ), LDA )
117:          END IF
118:    10 CONTINUE
119: *
120:       RETURN
121: *
122: *     End of CORE_CGESSM.
123: *
124:       END
125: