00001 SUBROUTINE SLAUUM( UPLO, N, A, LDA, INFO )
00002
00003
00004
00005
00006
00007
00008
00009 CHARACTER UPLO
00010 INTEGER INFO, LDA, N
00011
00012
00013 REAL A( LDA, * )
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 REAL ONE
00060 PARAMETER ( ONE = 1.0E+0 )
00061
00062
00063 LOGICAL UPPER
00064 INTEGER I, IB, NB
00065
00066
00067 LOGICAL LSAME
00068 INTEGER ILAENV
00069 EXTERNAL LSAME, ILAENV
00070
00071
00072 EXTERNAL SGEMM, SLAUU2, SSYRK, STRMM, XERBLA
00073
00074
00075 INTRINSIC MAX, MIN
00076
00077
00078
00079
00080
00081 INFO = 0
00082 UPPER = LSAME( UPLO, 'U' )
00083 IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
00084 INFO = -1
00085 ELSE IF( N.LT.0 ) THEN
00086 INFO = -2
00087 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
00088 INFO = -4
00089 END IF
00090 IF( INFO.NE.0 ) THEN
00091 CALL XERBLA( 'SLAUUM', -INFO )
00092 RETURN
00093 END IF
00094
00095
00096
00097 IF( N.EQ.0 )
00098 $ RETURN
00099
00100
00101
00102 NB = ILAENV( 1, 'SLAUUM', UPLO, N, -1, -1, -1 )
00103
00104 IF( NB.LE.1 .OR. NB.GE.N ) THEN
00105
00106
00107
00108 CALL SLAUU2( UPLO, N, A, LDA, INFO )
00109 ELSE
00110
00111
00112
00113 IF( UPPER ) THEN
00114
00115
00116
00117 DO 10 I = 1, N, NB
00118 IB = MIN( NB, N-I+1 )
00119 CALL STRMM( 'Right', 'Upper', 'Transpose', 'Non-unit',
00120 $ I-1, IB, ONE, A( I, I ), LDA, A( 1, I ),
00121 $ LDA )
00122 CALL SLAUU2( 'Upper', IB, A( I, I ), LDA, INFO )
00123 IF( I+IB.LE.N ) THEN
00124 CALL SGEMM( 'No transpose', 'Transpose', I-1, IB,
00125 $ N-I-IB+1, ONE, A( 1, I+IB ), LDA,
00126 $ A( I, I+IB ), LDA, ONE, A( 1, I ), LDA )
00127 CALL SSYRK( 'Upper', 'No transpose', IB, N-I-IB+1,
00128 $ ONE, A( I, I+IB ), LDA, ONE, A( I, I ),
00129 $ LDA )
00130 END IF
00131 10 CONTINUE
00132 ELSE
00133
00134
00135
00136 DO 20 I = 1, N, NB
00137 IB = MIN( NB, N-I+1 )
00138 CALL STRMM( 'Left', 'Lower', 'Transpose', 'Non-unit', IB,
00139 $ I-1, ONE, A( I, I ), LDA, A( I, 1 ), LDA )
00140 CALL SLAUU2( 'Lower', IB, A( I, I ), LDA, INFO )
00141 IF( I+IB.LE.N ) THEN
00142 CALL SGEMM( 'Transpose', 'No transpose', IB, I-1,
00143 $ N-I-IB+1, ONE, A( I+IB, I ), LDA,
00144 $ A( I+IB, 1 ), LDA, ONE, A( I, 1 ), LDA )
00145 CALL SSYRK( 'Lower', 'Transpose', IB, N-I-IB+1, ONE,
00146 $ A( I+IB, I ), LDA, ONE, A( I, I ), LDA )
00147 END IF
00148 20 CONTINUE
00149 END IF
00150 END IF
00151
00152 RETURN
00153
00154
00155
00156 END