LAPACK 3.3.1 Linear Algebra PACKage

# stfsm.f

Go to the documentation of this file.
```00001       SUBROUTINE STFSM( TRANSR, SIDE, UPLO, TRANS, DIAG, M, N, ALPHA, A,
00002      \$                  B, LDB )
00003 *
00004 *  -- LAPACK routine (version 3.3.1)                                    --
00005 *
00006 *  -- Contributed by Fred Gustavson of the IBM Watson Research Center --
00007 *  -- April 2011                                                      --
00008 *
00009 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
00010 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
00011 *
00012 *     ..
00013 *     .. Scalar Arguments ..
00014       CHARACTER          TRANSR, DIAG, SIDE, TRANS, UPLO
00015       INTEGER            LDB, M, N
00016       REAL               ALPHA
00017 *     ..
00018 *     .. Array Arguments ..
00019       REAL               A( 0: * ), B( 0: LDB-1, 0: * )
00020 *     ..
00021 *
00022 *  Purpose
00023 *  =======
00024 *
00025 *  Level 3 BLAS like routine for A in RFP Format.
00026 *
00027 *  STFSM  solves the matrix equation
00028 *
00029 *     op( A )*X = alpha*B  or  X*op( A ) = alpha*B
00030 *
00031 *  where alpha is a scalar, X and B are m by n matrices, A is a unit, or
00032 *  non-unit,  upper or lower triangular matrix  and  op( A )  is one  of
00033 *
00034 *     op( A ) = A   or   op( A ) = A**T.
00035 *
00036 *  A is in Rectangular Full Packed (RFP) Format.
00037 *
00038 *  The matrix X is overwritten on B.
00039 *
00040 *  Arguments
00041 *  ==========
00042 *
00043 *  TRANSR  (input) CHARACTER*1
00044 *          = 'N':  The Normal Form of RFP A is stored;
00045 *          = 'T':  The Transpose Form of RFP A is stored.
00046 *
00047 *  SIDE    (input) CHARACTER*1
00048 *           On entry, SIDE specifies whether op( A ) appears on the left
00049 *           or right of X as follows:
00050 *
00051 *              SIDE = 'L' or 'l'   op( A )*X = alpha*B.
00052 *
00053 *              SIDE = 'R' or 'r'   X*op( A ) = alpha*B.
00054 *
00055 *           Unchanged on exit.
00056 *
00057 *  UPLO    (input) CHARACTER*1
00058 *           On entry, UPLO specifies whether the RFP matrix A came from
00059 *           an upper or lower triangular matrix as follows:
00060 *           UPLO = 'U' or 'u' RFP A came from an upper triangular matrix
00061 *           UPLO = 'L' or 'l' RFP A came from a  lower triangular matrix
00062 *
00063 *           Unchanged on exit.
00064 *
00065 *  TRANS   (input) CHARACTER*1
00066 *           On entry, TRANS  specifies the form of op( A ) to be used
00067 *           in the matrix multiplication as follows:
00068 *
00069 *              TRANS  = 'N' or 'n'   op( A ) = A.
00070 *
00071 *              TRANS  = 'T' or 't'   op( A ) = A'.
00072 *
00073 *           Unchanged on exit.
00074 *
00075 *  DIAG    (input) CHARACTER*1
00076 *           On entry, DIAG specifies whether or not RFP A is unit
00077 *           triangular as follows:
00078 *
00079 *              DIAG = 'U' or 'u'   A is assumed to be unit triangular.
00080 *
00081 *              DIAG = 'N' or 'n'   A is not assumed to be unit
00082 *                                  triangular.
00083 *
00084 *           Unchanged on exit.
00085 *
00086 *  M       (input) INTEGER
00087 *           On entry, M specifies the number of rows of B. M must be at
00088 *           least zero.
00089 *           Unchanged on exit.
00090 *
00091 *  N       (input) INTEGER
00092 *           On entry, N specifies the number of columns of B.  N must be
00093 *           at least zero.
00094 *           Unchanged on exit.
00095 *
00096 *  ALPHA   (input) REAL
00097 *           On entry,  ALPHA specifies the scalar  alpha. When  alpha is
00098 *           zero then  A is not referenced and  B need not be set before
00099 *           entry.
00100 *           Unchanged on exit.
00101 *
00102 *  A       (input) REAL array, dimension (NT)
00103 *           NT = N*(N+1)/2. On entry, the matrix A in RFP Format.
00104 *           RFP Format is described by TRANSR, UPLO and N as follows:
00105 *           If TRANSR='N' then RFP A is (0:N,0:K-1) when N is even;
00106 *           K=N/2. RFP A is (0:N-1,0:K) when N is odd; K=N/2. If
00107 *           TRANSR = 'T' then RFP is the transpose of RFP A as
00108 *           defined when TRANSR = 'N'. The contents of RFP A are defined
00109 *           by UPLO as follows: If UPLO = 'U' the RFP A contains the NT
00110 *           elements of upper packed A either in normal or
00111 *           transpose Format. If UPLO = 'L' the RFP A contains
00112 *           the NT elements of lower packed A either in normal or
00113 *           transpose Format. The LDA of RFP A is (N+1)/2 when
00114 *           TRANSR = 'T'. When TRANSR is 'N' the LDA is N+1 when N is
00115 *           even and is N when is odd.
00116 *           See the Note below for more details. Unchanged on exit.
00117 *
00118 *  B       (input/output) REAL array,  DIMENSION (LDB,N)
00119 *           Before entry,  the leading  m by n part of the array  B must
00120 *           contain  the  right-hand  side  matrix  B,  and  on exit  is
00121 *           overwritten by the solution matrix  X.
00122 *
00123 *  LDB     (input) INTEGER
00124 *           On entry, LDB specifies the first dimension of B as declared
00125 *           in  the  calling  (sub)  program.   LDB  must  be  at  least
00126 *           max( 1, m ).
00127 *           Unchanged on exit.
00128 *
00129 *  Further Details
00130 *  ===============
00131 *
00132 *  We first consider Rectangular Full Packed (RFP) Format when N is
00133 *  even. We give an example where N = 6.
00134 *
00135 *      AP is Upper             AP is Lower
00136 *
00137 *   00 01 02 03 04 05       00
00138 *      11 12 13 14 15       10 11
00139 *         22 23 24 25       20 21 22
00140 *            33 34 35       30 31 32 33
00141 *               44 45       40 41 42 43 44
00142 *                  55       50 51 52 53 54 55
00143 *
00144 *
00145 *  Let TRANSR = 'N'. RFP holds AP as follows:
00146 *  For UPLO = 'U' the upper trapezoid A(0:5,0:2) consists of the last
00147 *  three columns of AP upper. The lower triangle A(4:6,0:2) consists of
00148 *  the transpose of the first three columns of AP upper.
00149 *  For UPLO = 'L' the lower trapezoid A(1:6,0:2) consists of the first
00150 *  three columns of AP lower. The upper triangle A(0:2,0:2) consists of
00151 *  the transpose of the last three columns of AP lower.
00152 *  This covers the case N even and TRANSR = 'N'.
00153 *
00154 *         RFP A                   RFP A
00155 *
00156 *        03 04 05                33 43 53
00157 *        13 14 15                00 44 54
00158 *        23 24 25                10 11 55
00159 *        33 34 35                20 21 22
00160 *        00 44 45                30 31 32
00161 *        01 11 55                40 41 42
00162 *        02 12 22                50 51 52
00163 *
00164 *  Now let TRANSR = 'T'. RFP A in both UPLO cases is just the
00165 *  transpose of RFP A above. One therefore gets:
00166 *
00167 *
00168 *           RFP A                   RFP A
00169 *
00170 *     03 13 23 33 00 01 02    33 00 10 20 30 40 50
00171 *     04 14 24 34 44 11 12    43 44 11 21 31 41 51
00172 *     05 15 25 35 45 55 22    53 54 55 22 32 42 52
00173 *
00174 *
00175 *  We then consider Rectangular Full Packed (RFP) Format when N is
00176 *  odd. We give an example where N = 5.
00177 *
00178 *     AP is Upper                 AP is Lower
00179 *
00180 *   00 01 02 03 04              00
00181 *      11 12 13 14              10 11
00182 *         22 23 24              20 21 22
00183 *            33 34              30 31 32 33
00184 *               44              40 41 42 43 44
00185 *
00186 *
00187 *  Let TRANSR = 'N'. RFP holds AP as follows:
00188 *  For UPLO = 'U' the upper trapezoid A(0:4,0:2) consists of the last
00189 *  three columns of AP upper. The lower triangle A(3:4,0:1) consists of
00190 *  the transpose of the first two columns of AP upper.
00191 *  For UPLO = 'L' the lower trapezoid A(0:4,0:2) consists of the first
00192 *  three columns of AP lower. The upper triangle A(0:1,1:2) consists of
00193 *  the transpose of the last two columns of AP lower.
00194 *  This covers the case N odd and TRANSR = 'N'.
00195 *
00196 *         RFP A                   RFP A
00197 *
00198 *        02 03 04                00 33 43
00199 *        12 13 14                10 11 44
00200 *        22 23 24                20 21 22
00201 *        00 33 34                30 31 32
00202 *        01 11 44                40 41 42
00203 *
00204 *  Now let TRANSR = 'T'. RFP A in both UPLO cases is just the
00205 *  transpose of RFP A above. One therefore gets:
00206 *
00207 *           RFP A                   RFP A
00208 *
00209 *     02 12 22 00 01             00 10 20 30 40 50
00210 *     03 13 23 33 11             33 11 21 31 41 51
00211 *     04 14 24 34 44             43 44 22 32 42 52
00212 *
00213 *  Reference
00214 *  =========
00215 *
00216 *  =====================================================================
00217 *
00218 *     ..
00219 *     .. Parameters ..
00220       REAL               ONE, ZERO
00221       PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
00222 *     ..
00223 *     .. Local Scalars ..
00224       LOGICAL            LOWER, LSIDE, MISODD, NISODD, NORMALTRANSR,
00225      \$                   NOTRANS
00226       INTEGER            M1, M2, N1, N2, K, INFO, I, J
00227 *     ..
00228 *     .. External Functions ..
00229       LOGICAL            LSAME
00230       EXTERNAL           LSAME
00231 *     ..
00232 *     .. External Subroutines ..
00233       EXTERNAL           SGEMM, STRSM, XERBLA
00234 *     ..
00235 *     .. Intrinsic Functions ..
00236       INTRINSIC          MAX, MOD
00237 *     ..
00238 *     .. Executable Statements ..
00239 *
00240 *     Test the input parameters.
00241 *
00242       INFO = 0
00243       NORMALTRANSR = LSAME( TRANSR, 'N' )
00244       LSIDE = LSAME( SIDE, 'L' )
00245       LOWER = LSAME( UPLO, 'L' )
00246       NOTRANS = LSAME( TRANS, 'N' )
00247       IF( .NOT.NORMALTRANSR .AND. .NOT.LSAME( TRANSR, 'T' ) ) THEN
00248          INFO = -1
00249       ELSE IF( .NOT.LSIDE .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
00250          INFO = -2
00251       ELSE IF( .NOT.LOWER .AND. .NOT.LSAME( UPLO, 'U' ) ) THEN
00252          INFO = -3
00253       ELSE IF( .NOT.NOTRANS .AND. .NOT.LSAME( TRANS, 'T' ) ) THEN
00254          INFO = -4
00255       ELSE IF( .NOT.LSAME( DIAG, 'N' ) .AND. .NOT.LSAME( DIAG, 'U' ) )
00256      \$         THEN
00257          INFO = -5
00258       ELSE IF( M.LT.0 ) THEN
00259          INFO = -6
00260       ELSE IF( N.LT.0 ) THEN
00261          INFO = -7
00262       ELSE IF( LDB.LT.MAX( 1, M ) ) THEN
00263          INFO = -11
00264       END IF
00265       IF( INFO.NE.0 ) THEN
00266          CALL XERBLA( 'STFSM ', -INFO )
00267          RETURN
00268       END IF
00269 *
00270 *     Quick return when ( (N.EQ.0).OR.(M.EQ.0) )
00271 *
00272       IF( ( M.EQ.0 ) .OR. ( N.EQ.0 ) )
00273      \$   RETURN
00274 *
00275 *     Quick return when ALPHA.EQ.(0D+0)
00276 *
00277       IF( ALPHA.EQ.ZERO ) THEN
00278          DO 20 J = 0, N - 1
00279             DO 10 I = 0, M - 1
00280                B( I, J ) = ZERO
00281    10       CONTINUE
00282    20    CONTINUE
00283          RETURN
00284       END IF
00285 *
00286       IF( LSIDE ) THEN
00287 *
00288 *        SIDE = 'L'
00289 *
00290 *        A is M-by-M.
00291 *        If M is odd, set NISODD = .TRUE., and M1 and M2.
00292 *        If M is even, NISODD = .FALSE., and M.
00293 *
00294          IF( MOD( M, 2 ).EQ.0 ) THEN
00295             MISODD = .FALSE.
00296             K = M / 2
00297          ELSE
00298             MISODD = .TRUE.
00299             IF( LOWER ) THEN
00300                M2 = M / 2
00301                M1 = M - M2
00302             ELSE
00303                M1 = M / 2
00304                M2 = M - M1
00305             END IF
00306          END IF
00307 *
00308          IF( MISODD ) THEN
00309 *
00310 *           SIDE = 'L' and N is odd
00311 *
00312             IF( NORMALTRANSR ) THEN
00313 *
00314 *              SIDE = 'L', N is odd, and TRANSR = 'N'
00315 *
00316                IF( LOWER ) THEN
00317 *
00318 *                 SIDE  ='L', N is odd, TRANSR = 'N', and UPLO = 'L'
00319 *
00320                   IF( NOTRANS ) THEN
00321 *
00322 *                    SIDE  ='L', N is odd, TRANSR = 'N', UPLO = 'L', and
00323 *                    TRANS = 'N'
00324 *
00325                      IF( M.EQ.1 ) THEN
00326                         CALL STRSM( 'L', 'L', 'N', DIAG, M1, N, ALPHA,
00327      \$                              A, M, B, LDB )
00328                      ELSE
00329                         CALL STRSM( 'L', 'L', 'N', DIAG, M1, N, ALPHA,
00330      \$                              A( 0 ), M, B, LDB )
00331                         CALL SGEMM( 'N', 'N', M2, N, M1, -ONE, A( M1 ),
00332      \$                              M, B, LDB, ALPHA, B( M1, 0 ), LDB )
00333                         CALL STRSM( 'L', 'U', 'T', DIAG, M2, N, ONE,
00334      \$                              A( M ), M, B( M1, 0 ), LDB )
00335                      END IF
00336 *
00337                   ELSE
00338 *
00339 *                    SIDE  ='L', N is odd, TRANSR = 'N', UPLO = 'L', and
00340 *                    TRANS = 'T'
00341 *
00342                      IF( M.EQ.1 ) THEN
00343                         CALL STRSM( 'L', 'L', 'T', DIAG, M1, N, ALPHA,
00344      \$                              A( 0 ), M, B, LDB )
00345                      ELSE
00346                         CALL STRSM( 'L', 'U', 'N', DIAG, M2, N, ALPHA,
00347      \$                              A( M ), M, B( M1, 0 ), LDB )
00348                         CALL SGEMM( 'T', 'N', M1, N, M2, -ONE, A( M1 ),
00349      \$                              M, B( M1, 0 ), LDB, ALPHA, B, LDB )
00350                         CALL STRSM( 'L', 'L', 'T', DIAG, M1, N, ONE,
00351      \$                              A( 0 ), M, B, LDB )
00352                      END IF
00353 *
00354                   END IF
00355 *
00356                ELSE
00357 *
00358 *                 SIDE  ='L', N is odd, TRANSR = 'N', and UPLO = 'U'
00359 *
00360                   IF( .NOT.NOTRANS ) THEN
00361 *
00362 *                    SIDE  ='L', N is odd, TRANSR = 'N', UPLO = 'U', and
00363 *                    TRANS = 'N'
00364 *
00365                      CALL STRSM( 'L', 'L', 'N', DIAG, M1, N, ALPHA,
00366      \$                           A( M2 ), M, B, LDB )
00367                      CALL SGEMM( 'T', 'N', M2, N, M1, -ONE, A( 0 ), M,
00368      \$                           B, LDB, ALPHA, B( M1, 0 ), LDB )
00369                      CALL STRSM( 'L', 'U', 'T', DIAG, M2, N, ONE,
00370      \$                           A( M1 ), M, B( M1, 0 ), LDB )
00371 *
00372                   ELSE
00373 *
00374 *                    SIDE  ='L', N is odd, TRANSR = 'N', UPLO = 'U', and
00375 *                    TRANS = 'T'
00376 *
00377                      CALL STRSM( 'L', 'U', 'N', DIAG, M2, N, ALPHA,
00378      \$                           A( M1 ), M, B( M1, 0 ), LDB )
00379                      CALL SGEMM( 'N', 'N', M1, N, M2, -ONE, A( 0 ), M,
00380      \$                           B( M1, 0 ), LDB, ALPHA, B, LDB )
00381                      CALL STRSM( 'L', 'L', 'T', DIAG, M1, N, ONE,
00382      \$                           A( M2 ), M, B, LDB )
00383 *
00384                   END IF
00385 *
00386                END IF
00387 *
00388             ELSE
00389 *
00390 *              SIDE = 'L', N is odd, and TRANSR = 'T'
00391 *
00392                IF( LOWER ) THEN
00393 *
00394 *                 SIDE  ='L', N is odd, TRANSR = 'T', and UPLO = 'L'
00395 *
00396                   IF( NOTRANS ) THEN
00397 *
00398 *                    SIDE  ='L', N is odd, TRANSR = 'T', UPLO = 'L', and
00399 *                    TRANS = 'N'
00400 *
00401                      IF( M.EQ.1 ) THEN
00402                         CALL STRSM( 'L', 'U', 'T', DIAG, M1, N, ALPHA,
00403      \$                              A( 0 ), M1, B, LDB )
00404                      ELSE
00405                         CALL STRSM( 'L', 'U', 'T', DIAG, M1, N, ALPHA,
00406      \$                              A( 0 ), M1, B, LDB )
00407                         CALL SGEMM( 'T', 'N', M2, N, M1, -ONE,
00408      \$                              A( M1*M1 ), M1, B, LDB, ALPHA,
00409      \$                              B( M1, 0 ), LDB )
00410                         CALL STRSM( 'L', 'L', 'N', DIAG, M2, N, ONE,
00411      \$                              A( 1 ), M1, B( M1, 0 ), LDB )
00412                      END IF
00413 *
00414                   ELSE
00415 *
00416 *                    SIDE  ='L', N is odd, TRANSR = 'T', UPLO = 'L', and
00417 *                    TRANS = 'T'
00418 *
00419                      IF( M.EQ.1 ) THEN
00420                         CALL STRSM( 'L', 'U', 'N', DIAG, M1, N, ALPHA,
00421      \$                              A( 0 ), M1, B, LDB )
00422                      ELSE
00423                         CALL STRSM( 'L', 'L', 'T', DIAG, M2, N, ALPHA,
00424      \$                              A( 1 ), M1, B( M1, 0 ), LDB )
00425                         CALL SGEMM( 'N', 'N', M1, N, M2, -ONE,
00426      \$                              A( M1*M1 ), M1, B( M1, 0 ), LDB,
00427      \$                              ALPHA, B, LDB )
00428                         CALL STRSM( 'L', 'U', 'N', DIAG, M1, N, ONE,
00429      \$                              A( 0 ), M1, B, LDB )
00430                      END IF
00431 *
00432                   END IF
00433 *
00434                ELSE
00435 *
00436 *                 SIDE  ='L', N is odd, TRANSR = 'T', and UPLO = 'U'
00437 *
00438                   IF( .NOT.NOTRANS ) THEN
00439 *
00440 *                    SIDE  ='L', N is odd, TRANSR = 'T', UPLO = 'U', and
00441 *                    TRANS = 'N'
00442 *
00443                      CALL STRSM( 'L', 'U', 'T', DIAG, M1, N, ALPHA,
00444      \$                           A( M2*M2 ), M2, B, LDB )
00445                      CALL SGEMM( 'N', 'N', M2, N, M1, -ONE, A( 0 ), M2,
00446      \$                           B, LDB, ALPHA, B( M1, 0 ), LDB )
00447                      CALL STRSM( 'L', 'L', 'N', DIAG, M2, N, ONE,
00448      \$                           A( M1*M2 ), M2, B( M1, 0 ), LDB )
00449 *
00450                   ELSE
00451 *
00452 *                    SIDE  ='L', N is odd, TRANSR = 'T', UPLO = 'U', and
00453 *                    TRANS = 'T'
00454 *
00455                      CALL STRSM( 'L', 'L', 'T', DIAG, M2, N, ALPHA,
00456      \$                           A( M1*M2 ), M2, B( M1, 0 ), LDB )
00457                      CALL SGEMM( 'T', 'N', M1, N, M2, -ONE, A( 0 ), M2,
00458      \$                           B( M1, 0 ), LDB, ALPHA, B, LDB )
00459                      CALL STRSM( 'L', 'U', 'N', DIAG, M1, N, ONE,
00460      \$                           A( M2*M2 ), M2, B, LDB )
00461 *
00462                   END IF
00463 *
00464                END IF
00465 *
00466             END IF
00467 *
00468          ELSE
00469 *
00470 *           SIDE = 'L' and N is even
00471 *
00472             IF( NORMALTRANSR ) THEN
00473 *
00474 *              SIDE = 'L', N is even, and TRANSR = 'N'
00475 *
00476                IF( LOWER ) THEN
00477 *
00478 *                 SIDE  ='L', N is even, TRANSR = 'N', and UPLO = 'L'
00479 *
00480                   IF( NOTRANS ) THEN
00481 *
00482 *                    SIDE  ='L', N is even, TRANSR = 'N', UPLO = 'L',
00483 *                    and TRANS = 'N'
00484 *
00485                      CALL STRSM( 'L', 'L', 'N', DIAG, K, N, ALPHA,
00486      \$                           A( 1 ), M+1, B, LDB )
00487                      CALL SGEMM( 'N', 'N', K, N, K, -ONE, A( K+1 ),
00488      \$                           M+1, B, LDB, ALPHA, B( K, 0 ), LDB )
00489                      CALL STRSM( 'L', 'U', 'T', DIAG, K, N, ONE,
00490      \$                           A( 0 ), M+1, B( K, 0 ), LDB )
00491 *
00492                   ELSE
00493 *
00494 *                    SIDE  ='L', N is even, TRANSR = 'N', UPLO = 'L',
00495 *                    and TRANS = 'T'
00496 *
00497                      CALL STRSM( 'L', 'U', 'N', DIAG, K, N, ALPHA,
00498      \$                           A( 0 ), M+1, B( K, 0 ), LDB )
00499                      CALL SGEMM( 'T', 'N', K, N, K, -ONE, A( K+1 ),
00500      \$                           M+1, B( K, 0 ), LDB, ALPHA, B, LDB )
00501                      CALL STRSM( 'L', 'L', 'T', DIAG, K, N, ONE,
00502      \$                           A( 1 ), M+1, B, LDB )
00503 *
00504                   END IF
00505 *
00506                ELSE
00507 *
00508 *                 SIDE  ='L', N is even, TRANSR = 'N', and UPLO = 'U'
00509 *
00510                   IF( .NOT.NOTRANS ) THEN
00511 *
00512 *                    SIDE  ='L', N is even, TRANSR = 'N', UPLO = 'U',
00513 *                    and TRANS = 'N'
00514 *
00515                      CALL STRSM( 'L', 'L', 'N', DIAG, K, N, ALPHA,
00516      \$                           A( K+1 ), M+1, B, LDB )
00517                      CALL SGEMM( 'T', 'N', K, N, K, -ONE, A( 0 ), M+1,
00518      \$                           B, LDB, ALPHA, B( K, 0 ), LDB )
00519                      CALL STRSM( 'L', 'U', 'T', DIAG, K, N, ONE,
00520      \$                           A( K ), M+1, B( K, 0 ), LDB )
00521 *
00522                   ELSE
00523 *
00524 *                    SIDE  ='L', N is even, TRANSR = 'N', UPLO = 'U',
00525 *                    and TRANS = 'T'
00526                      CALL STRSM( 'L', 'U', 'N', DIAG, K, N, ALPHA,
00527      \$                           A( K ), M+1, B( K, 0 ), LDB )
00528                      CALL SGEMM( 'N', 'N', K, N, K, -ONE, A( 0 ), M+1,
00529      \$                           B( K, 0 ), LDB, ALPHA, B, LDB )
00530                      CALL STRSM( 'L', 'L', 'T', DIAG, K, N, ONE,
00531      \$                           A( K+1 ), M+1, B, LDB )
00532 *
00533                   END IF
00534 *
00535                END IF
00536 *
00537             ELSE
00538 *
00539 *              SIDE = 'L', N is even, and TRANSR = 'T'
00540 *
00541                IF( LOWER ) THEN
00542 *
00543 *                 SIDE  ='L', N is even, TRANSR = 'T', and UPLO = 'L'
00544 *
00545                   IF( NOTRANS ) THEN
00546 *
00547 *                    SIDE  ='L', N is even, TRANSR = 'T', UPLO = 'L',
00548 *                    and TRANS = 'N'
00549 *
00550                      CALL STRSM( 'L', 'U', 'T', DIAG, K, N, ALPHA,
00551      \$                           A( K ), K, B, LDB )
00552                      CALL SGEMM( 'T', 'N', K, N, K, -ONE,
00553      \$                           A( K*( K+1 ) ), K, B, LDB, ALPHA,
00554      \$                           B( K, 0 ), LDB )
00555                      CALL STRSM( 'L', 'L', 'N', DIAG, K, N, ONE,
00556      \$                           A( 0 ), K, B( K, 0 ), LDB )
00557 *
00558                   ELSE
00559 *
00560 *                    SIDE  ='L', N is even, TRANSR = 'T', UPLO = 'L',
00561 *                    and TRANS = 'T'
00562 *
00563                      CALL STRSM( 'L', 'L', 'T', DIAG, K, N, ALPHA,
00564      \$                           A( 0 ), K, B( K, 0 ), LDB )
00565                      CALL SGEMM( 'N', 'N', K, N, K, -ONE,
00566      \$                           A( K*( K+1 ) ), K, B( K, 0 ), LDB,
00567      \$                           ALPHA, B, LDB )
00568                      CALL STRSM( 'L', 'U', 'N', DIAG, K, N, ONE,
00569      \$                           A( K ), K, B, LDB )
00570 *
00571                   END IF
00572 *
00573                ELSE
00574 *
00575 *                 SIDE  ='L', N is even, TRANSR = 'T', and UPLO = 'U'
00576 *
00577                   IF( .NOT.NOTRANS ) THEN
00578 *
00579 *                    SIDE  ='L', N is even, TRANSR = 'T', UPLO = 'U',
00580 *                    and TRANS = 'N'
00581 *
00582                      CALL STRSM( 'L', 'U', 'T', DIAG, K, N, ALPHA,
00583      \$                           A( K*( K+1 ) ), K, B, LDB )
00584                      CALL SGEMM( 'N', 'N', K, N, K, -ONE, A( 0 ), K, B,
00585      \$                           LDB, ALPHA, B( K, 0 ), LDB )
00586                      CALL STRSM( 'L', 'L', 'N', DIAG, K, N, ONE,
00587      \$                           A( K*K ), K, B( K, 0 ), LDB )
00588 *
00589                   ELSE
00590 *
00591 *                    SIDE  ='L', N is even, TRANSR = 'T', UPLO = 'U',
00592 *                    and TRANS = 'T'
00593 *
00594                      CALL STRSM( 'L', 'L', 'T', DIAG, K, N, ALPHA,
00595      \$                           A( K*K ), K, B( K, 0 ), LDB )
00596                      CALL SGEMM( 'T', 'N', K, N, K, -ONE, A( 0 ), K,
00597      \$                           B( K, 0 ), LDB, ALPHA, B, LDB )
00598                      CALL STRSM( 'L', 'U', 'N', DIAG, K, N, ONE,
00599      \$                           A( K*( K+1 ) ), K, B, LDB )
00600 *
00601                   END IF
00602 *
00603                END IF
00604 *
00605             END IF
00606 *
00607          END IF
00608 *
00609       ELSE
00610 *
00611 *        SIDE = 'R'
00612 *
00613 *        A is N-by-N.
00614 *        If N is odd, set NISODD = .TRUE., and N1 and N2.
00615 *        If N is even, NISODD = .FALSE., and K.
00616 *
00617          IF( MOD( N, 2 ).EQ.0 ) THEN
00618             NISODD = .FALSE.
00619             K = N / 2
00620          ELSE
00621             NISODD = .TRUE.
00622             IF( LOWER ) THEN
00623                N2 = N / 2
00624                N1 = N - N2
00625             ELSE
00626                N1 = N / 2
00627                N2 = N - N1
00628             END IF
00629          END IF
00630 *
00631          IF( NISODD ) THEN
00632 *
00633 *           SIDE = 'R' and N is odd
00634 *
00635             IF( NORMALTRANSR ) THEN
00636 *
00637 *              SIDE = 'R', N is odd, and TRANSR = 'N'
00638 *
00639                IF( LOWER ) THEN
00640 *
00641 *                 SIDE  ='R', N is odd, TRANSR = 'N', and UPLO = 'L'
00642 *
00643                   IF( NOTRANS ) THEN
00644 *
00645 *                    SIDE  ='R', N is odd, TRANSR = 'N', UPLO = 'L', and
00646 *                    TRANS = 'N'
00647 *
00648                      CALL STRSM( 'R', 'U', 'T', DIAG, M, N2, ALPHA,
00649      \$                           A( N ), N, B( 0, N1 ), LDB )
00650                      CALL SGEMM( 'N', 'N', M, N1, N2, -ONE, B( 0, N1 ),
00651      \$                           LDB, A( N1 ), N, ALPHA, B( 0, 0 ),
00652      \$                           LDB )
00653                      CALL STRSM( 'R', 'L', 'N', DIAG, M, N1, ONE,
00654      \$                           A( 0 ), N, B( 0, 0 ), LDB )
00655 *
00656                   ELSE
00657 *
00658 *                    SIDE  ='R', N is odd, TRANSR = 'N', UPLO = 'L', and
00659 *                    TRANS = 'T'
00660 *
00661                      CALL STRSM( 'R', 'L', 'T', DIAG, M, N1, ALPHA,
00662      \$                           A( 0 ), N, B( 0, 0 ), LDB )
00663                      CALL SGEMM( 'N', 'T', M, N2, N1, -ONE, B( 0, 0 ),
00664      \$                           LDB, A( N1 ), N, ALPHA, B( 0, N1 ),
00665      \$                           LDB )
00666                      CALL STRSM( 'R', 'U', 'N', DIAG, M, N2, ONE,
00667      \$                           A( N ), N, B( 0, N1 ), LDB )
00668 *
00669                   END IF
00670 *
00671                ELSE
00672 *
00673 *                 SIDE  ='R', N is odd, TRANSR = 'N', and UPLO = 'U'
00674 *
00675                   IF( NOTRANS ) THEN
00676 *
00677 *                    SIDE  ='R', N is odd, TRANSR = 'N', UPLO = 'U', and
00678 *                    TRANS = 'N'
00679 *
00680                      CALL STRSM( 'R', 'L', 'T', DIAG, M, N1, ALPHA,
00681      \$                           A( N2 ), N, B( 0, 0 ), LDB )
00682                      CALL SGEMM( 'N', 'N', M, N2, N1, -ONE, B( 0, 0 ),
00683      \$                           LDB, A( 0 ), N, ALPHA, B( 0, N1 ),
00684      \$                           LDB )
00685                      CALL STRSM( 'R', 'U', 'N', DIAG, M, N2, ONE,
00686      \$                           A( N1 ), N, B( 0, N1 ), LDB )
00687 *
00688                   ELSE
00689 *
00690 *                    SIDE  ='R', N is odd, TRANSR = 'N', UPLO = 'U', and
00691 *                    TRANS = 'T'
00692 *
00693                      CALL STRSM( 'R', 'U', 'T', DIAG, M, N2, ALPHA,
00694      \$                           A( N1 ), N, B( 0, N1 ), LDB )
00695                      CALL SGEMM( 'N', 'T', M, N1, N2, -ONE, B( 0, N1 ),
00696      \$                           LDB, A( 0 ), N, ALPHA, B( 0, 0 ), LDB )
00697                      CALL STRSM( 'R', 'L', 'N', DIAG, M, N1, ONE,
00698      \$                           A( N2 ), N, B( 0, 0 ), LDB )
00699 *
00700                   END IF
00701 *
00702                END IF
00703 *
00704             ELSE
00705 *
00706 *              SIDE = 'R', N is odd, and TRANSR = 'T'
00707 *
00708                IF( LOWER ) THEN
00709 *
00710 *                 SIDE  ='R', N is odd, TRANSR = 'T', and UPLO = 'L'
00711 *
00712                   IF( NOTRANS ) THEN
00713 *
00714 *                    SIDE  ='R', N is odd, TRANSR = 'T', UPLO = 'L', and
00715 *                    TRANS = 'N'
00716 *
00717                      CALL STRSM( 'R', 'L', 'N', DIAG, M, N2, ALPHA,
00718      \$                           A( 1 ), N1, B( 0, N1 ), LDB )
00719                      CALL SGEMM( 'N', 'T', M, N1, N2, -ONE, B( 0, N1 ),
00720      \$                           LDB, A( N1*N1 ), N1, ALPHA, B( 0, 0 ),
00721      \$                           LDB )
00722                      CALL STRSM( 'R', 'U', 'T', DIAG, M, N1, ONE,
00723      \$                           A( 0 ), N1, B( 0, 0 ), LDB )
00724 *
00725                   ELSE
00726 *
00727 *                    SIDE  ='R', N is odd, TRANSR = 'T', UPLO = 'L', and
00728 *                    TRANS = 'T'
00729 *
00730                      CALL STRSM( 'R', 'U', 'N', DIAG, M, N1, ALPHA,
00731      \$                           A( 0 ), N1, B( 0, 0 ), LDB )
00732                      CALL SGEMM( 'N', 'N', M, N2, N1, -ONE, B( 0, 0 ),
00733      \$                           LDB, A( N1*N1 ), N1, ALPHA, B( 0, N1 ),
00734      \$                           LDB )
00735                      CALL STRSM( 'R', 'L', 'T', DIAG, M, N2, ONE,
00736      \$                           A( 1 ), N1, B( 0, N1 ), LDB )
00737 *
00738                   END IF
00739 *
00740                ELSE
00741 *
00742 *                 SIDE  ='R', N is odd, TRANSR = 'T', and UPLO = 'U'
00743 *
00744                   IF( NOTRANS ) THEN
00745 *
00746 *                    SIDE  ='R', N is odd, TRANSR = 'T', UPLO = 'U', and
00747 *                    TRANS = 'N'
00748 *
00749                      CALL STRSM( 'R', 'U', 'N', DIAG, M, N1, ALPHA,
00750      \$                           A( N2*N2 ), N2, B( 0, 0 ), LDB )
00751                      CALL SGEMM( 'N', 'T', M, N2, N1, -ONE, B( 0, 0 ),
00752      \$                           LDB, A( 0 ), N2, ALPHA, B( 0, N1 ),
00753      \$                           LDB )
00754                      CALL STRSM( 'R', 'L', 'T', DIAG, M, N2, ONE,
00755      \$                           A( N1*N2 ), N2, B( 0, N1 ), LDB )
00756 *
00757                   ELSE
00758 *
00759 *                    SIDE  ='R', N is odd, TRANSR = 'T', UPLO = 'U', and
00760 *                    TRANS = 'T'
00761 *
00762                      CALL STRSM( 'R', 'L', 'N', DIAG, M, N2, ALPHA,
00763      \$                           A( N1*N2 ), N2, B( 0, N1 ), LDB )
00764                      CALL SGEMM( 'N', 'N', M, N1, N2, -ONE, B( 0, N1 ),
00765      \$                           LDB, A( 0 ), N2, ALPHA, B( 0, 0 ),
00766      \$                           LDB )
00767                      CALL STRSM( 'R', 'U', 'T', DIAG, M, N1, ONE,
00768      \$                           A( N2*N2 ), N2, B( 0, 0 ), LDB )
00769 *
00770                   END IF
00771 *
00772                END IF
00773 *
00774             END IF
00775 *
00776          ELSE
00777 *
00778 *           SIDE = 'R' and N is even
00779 *
00780             IF( NORMALTRANSR ) THEN
00781 *
00782 *              SIDE = 'R', N is even, and TRANSR = 'N'
00783 *
00784                IF( LOWER ) THEN
00785 *
00786 *                 SIDE  ='R', N is even, TRANSR = 'N', and UPLO = 'L'
00787 *
00788                   IF( NOTRANS ) THEN
00789 *
00790 *                    SIDE  ='R', N is even, TRANSR = 'N', UPLO = 'L',
00791 *                    and TRANS = 'N'
00792 *
00793                      CALL STRSM( 'R', 'U', 'T', DIAG, M, K, ALPHA,
00794      \$                           A( 0 ), N+1, B( 0, K ), LDB )
00795                      CALL SGEMM( 'N', 'N', M, K, K, -ONE, B( 0, K ),
00796      \$                           LDB, A( K+1 ), N+1, ALPHA, B( 0, 0 ),
00797      \$                           LDB )
00798                      CALL STRSM( 'R', 'L', 'N', DIAG, M, K, ONE,
00799      \$                           A( 1 ), N+1, B( 0, 0 ), LDB )
00800 *
00801                   ELSE
00802 *
00803 *                    SIDE  ='R', N is even, TRANSR = 'N', UPLO = 'L',
00804 *                    and TRANS = 'T'
00805 *
00806                      CALL STRSM( 'R', 'L', 'T', DIAG, M, K, ALPHA,
00807      \$                           A( 1 ), N+1, B( 0, 0 ), LDB )
00808                      CALL SGEMM( 'N', 'T', M, K, K, -ONE, B( 0, 0 ),
00809      \$                           LDB, A( K+1 ), N+1, ALPHA, B( 0, K ),
00810      \$                           LDB )
00811                      CALL STRSM( 'R', 'U', 'N', DIAG, M, K, ONE,
00812      \$                           A( 0 ), N+1, B( 0, K ), LDB )
00813 *
00814                   END IF
00815 *
00816                ELSE
00817 *
00818 *                 SIDE  ='R', N is even, TRANSR = 'N', and UPLO = 'U'
00819 *
00820                   IF( NOTRANS ) THEN
00821 *
00822 *                    SIDE  ='R', N is even, TRANSR = 'N', UPLO = 'U',
00823 *                    and TRANS = 'N'
00824 *
00825                      CALL STRSM( 'R', 'L', 'T', DIAG, M, K, ALPHA,
00826      \$                           A( K+1 ), N+1, B( 0, 0 ), LDB )
00827                      CALL SGEMM( 'N', 'N', M, K, K, -ONE, B( 0, 0 ),
00828      \$                           LDB, A( 0 ), N+1, ALPHA, B( 0, K ),
00829      \$                           LDB )
00830                      CALL STRSM( 'R', 'U', 'N', DIAG, M, K, ONE,
00831      \$                           A( K ), N+1, B( 0, K ), LDB )
00832 *
00833                   ELSE
00834 *
00835 *                    SIDE  ='R', N is even, TRANSR = 'N', UPLO = 'U',
00836 *                    and TRANS = 'T'
00837 *
00838                      CALL STRSM( 'R', 'U', 'T', DIAG, M, K, ALPHA,
00839      \$                           A( K ), N+1, B( 0, K ), LDB )
00840                      CALL SGEMM( 'N', 'T', M, K, K, -ONE, B( 0, K ),
00841      \$                           LDB, A( 0 ), N+1, ALPHA, B( 0, 0 ),
00842      \$                           LDB )
00843                      CALL STRSM( 'R', 'L', 'N', DIAG, M, K, ONE,
00844      \$                           A( K+1 ), N+1, B( 0, 0 ), LDB )
00845 *
00846                   END IF
00847 *
00848                END IF
00849 *
00850             ELSE
00851 *
00852 *              SIDE = 'R', N is even, and TRANSR = 'T'
00853 *
00854                IF( LOWER ) THEN
00855 *
00856 *                 SIDE  ='R', N is even, TRANSR = 'T', and UPLO = 'L'
00857 *
00858                   IF( NOTRANS ) THEN
00859 *
00860 *                    SIDE  ='R', N is even, TRANSR = 'T', UPLO = 'L',
00861 *                    and TRANS = 'N'
00862 *
00863                      CALL STRSM( 'R', 'L', 'N', DIAG, M, K, ALPHA,
00864      \$                           A( 0 ), K, B( 0, K ), LDB )
00865                      CALL SGEMM( 'N', 'T', M, K, K, -ONE, B( 0, K ),
00866      \$                           LDB, A( ( K+1 )*K ), K, ALPHA,
00867      \$                           B( 0, 0 ), LDB )
00868                      CALL STRSM( 'R', 'U', 'T', DIAG, M, K, ONE,
00869      \$                           A( K ), K, B( 0, 0 ), LDB )
00870 *
00871                   ELSE
00872 *
00873 *                    SIDE  ='R', N is even, TRANSR = 'T', UPLO = 'L',
00874 *                    and TRANS = 'T'
00875 *
00876                      CALL STRSM( 'R', 'U', 'N', DIAG, M, K, ALPHA,
00877      \$                           A( K ), K, B( 0, 0 ), LDB )
00878                      CALL SGEMM( 'N', 'N', M, K, K, -ONE, B( 0, 0 ),
00879      \$                           LDB, A( ( K+1 )*K ), K, ALPHA,
00880      \$                           B( 0, K ), LDB )
00881                      CALL STRSM( 'R', 'L', 'T', DIAG, M, K, ONE,
00882      \$                           A( 0 ), K, B( 0, K ), LDB )
00883 *
00884                   END IF
00885 *
00886                ELSE
00887 *
00888 *                 SIDE  ='R', N is even, TRANSR = 'T', and UPLO = 'U'
00889 *
00890                   IF( NOTRANS ) THEN
00891 *
00892 *                    SIDE  ='R', N is even, TRANSR = 'T', UPLO = 'U',
00893 *                    and TRANS = 'N'
00894 *
00895                      CALL STRSM( 'R', 'U', 'N', DIAG, M, K, ALPHA,
00896      \$                           A( ( K+1 )*K ), K, B( 0, 0 ), LDB )
00897                      CALL SGEMM( 'N', 'T', M, K, K, -ONE, B( 0, 0 ),
00898      \$                           LDB, A( 0 ), K, ALPHA, B( 0, K ), LDB )
00899                      CALL STRSM( 'R', 'L', 'T', DIAG, M, K, ONE,
00900      \$                           A( K*K ), K, B( 0, K ), LDB )
00901 *
00902                   ELSE
00903 *
00904 *                    SIDE  ='R', N is even, TRANSR = 'T', UPLO = 'U',
00905 *                    and TRANS = 'T'
00906 *
00907                      CALL STRSM( 'R', 'L', 'N', DIAG, M, K, ALPHA,
00908      \$                           A( K*K ), K, B( 0, K ), LDB )
00909                      CALL SGEMM( 'N', 'N', M, K, K, -ONE, B( 0, K ),
00910      \$                           LDB, A( 0 ), K, ALPHA, B( 0, 0 ), LDB )
00911                      CALL STRSM( 'R', 'U', 'T', DIAG, M, K, ONE,
00912      \$                           A( ( K+1 )*K ), K, B( 0, 0 ), LDB )
00913 *
00914                   END IF
00915 *
00916                END IF
00917 *
00918             END IF
00919 *
00920          END IF
00921       END IF
00922 *
00923       RETURN
00924 *
00925 *     End of STFSM
00926 *
00927       END
```