00001 SUBROUTINE DGEBAK( JOB, SIDE, N, ILO, IHI, SCALE, M, V, LDV,
00002 $ INFO )
00003
00004
00005
00006
00007
00008
00009
00010 CHARACTER JOB, SIDE
00011 INTEGER IHI, ILO, INFO, LDV, M, N
00012
00013
00014 DOUBLE PRECISION SCALE( * ), V( LDV, * )
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
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070 DOUBLE PRECISION ONE
00071 PARAMETER ( ONE = 1.0D+0 )
00072
00073
00074 LOGICAL LEFTV, RIGHTV
00075 INTEGER I, II, K
00076 DOUBLE PRECISION S
00077
00078
00079 LOGICAL LSAME
00080 EXTERNAL LSAME
00081
00082
00083 EXTERNAL DSCAL, DSWAP, XERBLA
00084
00085
00086 INTRINSIC MAX, MIN
00087
00088
00089
00090
00091
00092 RIGHTV = LSAME( SIDE, 'R' )
00093 LEFTV = LSAME( SIDE, 'L' )
00094
00095 INFO = 0
00096 IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.LSAME( JOB, 'P' ) .AND.
00097 $ .NOT.LSAME( JOB, 'S' ) .AND. .NOT.LSAME( JOB, 'B' ) ) THEN
00098 INFO = -1
00099 ELSE IF( .NOT.RIGHTV .AND. .NOT.LEFTV ) THEN
00100 INFO = -2
00101 ELSE IF( N.LT.0 ) THEN
00102 INFO = -3
00103 ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
00104 INFO = -4
00105 ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
00106 INFO = -5
00107 ELSE IF( M.LT.0 ) THEN
00108 INFO = -7
00109 ELSE IF( LDV.LT.MAX( 1, N ) ) THEN
00110 INFO = -9
00111 END IF
00112 IF( INFO.NE.0 ) THEN
00113 CALL XERBLA( 'DGEBAK', -INFO )
00114 RETURN
00115 END IF
00116
00117
00118
00119 IF( N.EQ.0 )
00120 $ RETURN
00121 IF( M.EQ.0 )
00122 $ RETURN
00123 IF( LSAME( JOB, 'N' ) )
00124 $ RETURN
00125
00126 IF( ILO.EQ.IHI )
00127 $ GO TO 30
00128
00129
00130
00131 IF( LSAME( JOB, 'S' ) .OR. LSAME( JOB, 'B' ) ) THEN
00132
00133 IF( RIGHTV ) THEN
00134 DO 10 I = ILO, IHI
00135 S = SCALE( I )
00136 CALL DSCAL( M, S, V( I, 1 ), LDV )
00137 10 CONTINUE
00138 END IF
00139
00140 IF( LEFTV ) THEN
00141 DO 20 I = ILO, IHI
00142 S = ONE / SCALE( I )
00143 CALL DSCAL( M, S, V( I, 1 ), LDV )
00144 20 CONTINUE
00145 END IF
00146
00147 END IF
00148
00149
00150
00151
00152
00153
00154 30 CONTINUE
00155 IF( LSAME( JOB, 'P' ) .OR. LSAME( JOB, 'B' ) ) THEN
00156 IF( RIGHTV ) THEN
00157 DO 40 II = 1, N
00158 I = II
00159 IF( I.GE.ILO .AND. I.LE.IHI )
00160 $ GO TO 40
00161 IF( I.LT.ILO )
00162 $ I = ILO - II
00163 K = SCALE( I )
00164 IF( K.EQ.I )
00165 $ GO TO 40
00166 CALL DSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
00167 40 CONTINUE
00168 END IF
00169
00170 IF( LEFTV ) THEN
00171 DO 50 II = 1, N
00172 I = II
00173 IF( I.GE.ILO .AND. I.LE.IHI )
00174 $ GO TO 50
00175 IF( I.LT.ILO )
00176 $ I = ILO - II
00177 K = SCALE( I )
00178 IF( K.EQ.I )
00179 $ GO TO 50
00180 CALL DSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
00181 50 CONTINUE
00182 END IF
00183 END IF
00184
00185 RETURN
00186
00187
00188
00189 END