Statistiques
| Révision :

root / src / lapack / double / dlascl.f @ 2

Historique | Voir | Annoter | Télécharger (7,76 ko)

1
      SUBROUTINE DLASCL( TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO )
2
*
3
*  -- LAPACK auxiliary routine (version 3.2) --
4
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
5
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
6
*     November 2006
7
*
8
*     .. Scalar Arguments ..
9
      CHARACTER          TYPE
10
      INTEGER            INFO, KL, KU, LDA, M, N
11
      DOUBLE PRECISION   CFROM, CTO
12
*     ..
13
*     .. Array Arguments ..
14
      DOUBLE PRECISION   A( LDA, * )
15
*     ..
16
*
17
*  Purpose
18
*  =======
19
*
20
*  DLASCL multiplies the M by N real matrix A by the real scalar
21
*  CTO/CFROM.  This is done without over/underflow as long as the final
22
*  result CTO*A(I,J)/CFROM does not over/underflow. TYPE specifies that
23
*  A may be full, upper triangular, lower triangular, upper Hessenberg,
24
*  or banded.
25
*
26
*  Arguments
27
*  =========
28
*
29
*  TYPE    (input) CHARACTER*1
30
*          TYPE indices the storage type of the input matrix.
31
*          = 'G':  A is a full matrix.
32
*          = 'L':  A is a lower triangular matrix.
33
*          = 'U':  A is an upper triangular matrix.
34
*          = 'H':  A is an upper Hessenberg matrix.
35
*          = 'B':  A is a symmetric band matrix with lower bandwidth KL
36
*                  and upper bandwidth KU and with the only the lower
37
*                  half stored.
38
*          = 'Q':  A is a symmetric band matrix with lower bandwidth KL
39
*                  and upper bandwidth KU and with the only the upper
40
*                  half stored.
41
*          = 'Z':  A is a band matrix with lower bandwidth KL and upper
42
*                  bandwidth KU.
43
*
44
*  KL      (input) INTEGER
45
*          The lower bandwidth of A.  Referenced only if TYPE = 'B',
46
*          'Q' or 'Z'.
47
*
48
*  KU      (input) INTEGER
49
*          The upper bandwidth of A.  Referenced only if TYPE = 'B',
50
*          'Q' or 'Z'.
51
*
52
*  CFROM   (input) DOUBLE PRECISION
53
*  CTO     (input) DOUBLE PRECISION
54
*          The matrix A is multiplied by CTO/CFROM. A(I,J) is computed
55
*          without over/underflow if the final result CTO*A(I,J)/CFROM
56
*          can be represented without over/underflow.  CFROM must be
57
*          nonzero.
58
*
59
*  M       (input) INTEGER
60
*          The number of rows of the matrix A.  M >= 0.
61
*
62
*  N       (input) INTEGER
63
*          The number of columns of the matrix A.  N >= 0.
64
*
65
*  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
66
*          The matrix to be multiplied by CTO/CFROM.  See TYPE for the
67
*          storage type.
68
*
69
*  LDA     (input) INTEGER
70
*          The leading dimension of the array A.  LDA >= max(1,M).
71
*
72
*  INFO    (output) INTEGER
73
*          0  - successful exit
74
*          <0 - if INFO = -i, the i-th argument had an illegal value.
75
*
76
*  =====================================================================
77
*
78
*     .. Parameters ..
79
      DOUBLE PRECISION   ZERO, ONE
80
      PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )
81
*     ..
82
*     .. Local Scalars ..
83
      LOGICAL            DONE
84
      INTEGER            I, ITYPE, J, K1, K2, K3, K4
85
      DOUBLE PRECISION   BIGNUM, CFROM1, CFROMC, CTO1, CTOC, MUL, SMLNUM
86
*     ..
87
*     .. External Functions ..
88
      LOGICAL            LSAME, DISNAN
89
      DOUBLE PRECISION   DLAMCH
90
      EXTERNAL           LSAME, DLAMCH, DISNAN
91
*     ..
92
*     .. Intrinsic Functions ..
93
      INTRINSIC          ABS, MAX, MIN
94
*     ..
95
*     .. External Subroutines ..
96
      EXTERNAL           XERBLA
97
*     ..
98
*     .. Executable Statements ..
99
*
100
*     Test the input arguments
101
*
102
      INFO = 0
103
*
104
      IF( LSAME( TYPE, 'G' ) ) THEN
105
         ITYPE = 0
106
      ELSE IF( LSAME( TYPE, 'L' ) ) THEN
107
         ITYPE = 1
108
      ELSE IF( LSAME( TYPE, 'U' ) ) THEN
109
         ITYPE = 2
110
      ELSE IF( LSAME( TYPE, 'H' ) ) THEN
111
         ITYPE = 3
112
      ELSE IF( LSAME( TYPE, 'B' ) ) THEN
113
         ITYPE = 4
114
      ELSE IF( LSAME( TYPE, 'Q' ) ) THEN
115
         ITYPE = 5
116
      ELSE IF( LSAME( TYPE, 'Z' ) ) THEN
117
         ITYPE = 6
118
      ELSE
119
         ITYPE = -1
120
      END IF
121
*
122
      IF( ITYPE.EQ.-1 ) THEN
123
         INFO = -1
124
      ELSE IF( CFROM.EQ.ZERO .OR. DISNAN(CFROM) ) THEN
125
         INFO = -4
126
      ELSE IF( DISNAN(CTO) ) THEN
127
         INFO = -5
128
      ELSE IF( M.LT.0 ) THEN
129
         INFO = -6
130
      ELSE IF( N.LT.0 .OR. ( ITYPE.EQ.4 .AND. N.NE.M ) .OR.
131
     $         ( ITYPE.EQ.5 .AND. N.NE.M ) ) THEN
132
         INFO = -7
133
      ELSE IF( ITYPE.LE.3 .AND. LDA.LT.MAX( 1, M ) ) THEN
134
         INFO = -9
135
      ELSE IF( ITYPE.GE.4 ) THEN
136
         IF( KL.LT.0 .OR. KL.GT.MAX( M-1, 0 ) ) THEN
137
            INFO = -2
138
         ELSE IF( KU.LT.0 .OR. KU.GT.MAX( N-1, 0 ) .OR.
139
     $            ( ( ITYPE.EQ.4 .OR. ITYPE.EQ.5 ) .AND. KL.NE.KU ) )
140
     $             THEN
141
            INFO = -3
142
         ELSE IF( ( ITYPE.EQ.4 .AND. LDA.LT.KL+1 ) .OR.
143
     $            ( ITYPE.EQ.5 .AND. LDA.LT.KU+1 ) .OR.
144
     $            ( ITYPE.EQ.6 .AND. LDA.LT.2*KL+KU+1 ) ) THEN
145
            INFO = -9
146
         END IF
147
      END IF
148
*
149
      IF( INFO.NE.0 ) THEN
150
         CALL XERBLA( 'DLASCL', -INFO )
151
         RETURN
152
      END IF
153
*
154
*     Quick return if possible
155
*
156
      IF( N.EQ.0 .OR. M.EQ.0 )
157
     $   RETURN
158
*
159
*     Get machine parameters
160
*
161
      SMLNUM = DLAMCH( 'S' )
162
      BIGNUM = ONE / SMLNUM
163
*
164
      CFROMC = CFROM
165
      CTOC = CTO
166
*
167
   10 CONTINUE
168
      CFROM1 = CFROMC*SMLNUM
169
      IF( CFROM1.EQ.CFROMC ) THEN
170
!        CFROMC is an inf.  Multiply by a correctly signed zero for
171
!        finite CTOC, or a NaN if CTOC is infinite.
172
         MUL = CTOC / CFROMC
173
         DONE = .TRUE.
174
         CTO1 = CTOC
175
      ELSE
176
         CTO1 = CTOC / BIGNUM
177
         IF( CTO1.EQ.CTOC ) THEN
178
!           CTOC is either 0 or an inf.  In both cases, CTOC itself
179
!           serves as the correct multiplication factor.
180
            MUL = CTOC
181
            DONE = .TRUE.
182
            CFROMC = ONE
183
         ELSE IF( ABS( CFROM1 ).GT.ABS( CTOC ) .AND. CTOC.NE.ZERO ) THEN
184
            MUL = SMLNUM
185
            DONE = .FALSE.
186
            CFROMC = CFROM1
187
         ELSE IF( ABS( CTO1 ).GT.ABS( CFROMC ) ) THEN
188
            MUL = BIGNUM
189
            DONE = .FALSE.
190
            CTOC = CTO1
191
         ELSE
192
            MUL = CTOC / CFROMC
193
            DONE = .TRUE.
194
         END IF
195
      END IF
196
*
197
      IF( ITYPE.EQ.0 ) THEN
198
*
199
*        Full matrix
200
*
201
         DO 30 J = 1, N
202
            DO 20 I = 1, M
203
               A( I, J ) = A( I, J )*MUL
204
   20       CONTINUE
205
   30    CONTINUE
206
*
207
      ELSE IF( ITYPE.EQ.1 ) THEN
208
*
209
*        Lower triangular matrix
210
*
211
         DO 50 J = 1, N
212
            DO 40 I = J, M
213
               A( I, J ) = A( I, J )*MUL
214
   40       CONTINUE
215
   50    CONTINUE
216
*
217
      ELSE IF( ITYPE.EQ.2 ) THEN
218
*
219
*        Upper triangular matrix
220
*
221
         DO 70 J = 1, N
222
            DO 60 I = 1, MIN( J, M )
223
               A( I, J ) = A( I, J )*MUL
224
   60       CONTINUE
225
   70    CONTINUE
226
*
227
      ELSE IF( ITYPE.EQ.3 ) THEN
228
*
229
*        Upper Hessenberg matrix
230
*
231
         DO 90 J = 1, N
232
            DO 80 I = 1, MIN( J+1, M )
233
               A( I, J ) = A( I, J )*MUL
234
   80       CONTINUE
235
   90    CONTINUE
236
*
237
      ELSE IF( ITYPE.EQ.4 ) THEN
238
*
239
*        Lower half of a symmetric band matrix
240
*
241
         K3 = KL + 1
242
         K4 = N + 1
243
         DO 110 J = 1, N
244
            DO 100 I = 1, MIN( K3, K4-J )
245
               A( I, J ) = A( I, J )*MUL
246
  100       CONTINUE
247
  110    CONTINUE
248
*
249
      ELSE IF( ITYPE.EQ.5 ) THEN
250
*
251
*        Upper half of a symmetric band matrix
252
*
253
         K1 = KU + 2
254
         K3 = KU + 1
255
         DO 130 J = 1, N
256
            DO 120 I = MAX( K1-J, 1 ), K3
257
               A( I, J ) = A( I, J )*MUL
258
  120       CONTINUE
259
  130    CONTINUE
260
*
261
      ELSE IF( ITYPE.EQ.6 ) THEN
262
*
263
*        Band matrix
264
*
265
         K1 = KL + KU + 2
266
         K2 = KL + 1
267
         K3 = 2*KL + KU + 1
268
         K4 = KL + KU + 1 + M
269
         DO 150 J = 1, N
270
            DO 140 I = MAX( K1-J, K2 ), MIN( K3, K4-J )
271
               A( I, J ) = A( I, J )*MUL
272
  140       CONTINUE
273
  150    CONTINUE
274
*
275
      END IF
276
*
277
      IF( .NOT.DONE )
278
     $   GO TO 10
279
*
280
      RETURN
281
*
282
*     End of DLASCL
283
*
284
      END