Annotation of rpl/lapack/blas/ztrsm.f, revision 1.1.1.1
1.1 bertrand 1: SUBROUTINE ZTRSM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB)
2: * .. Scalar Arguments ..
3: DOUBLE COMPLEX ALPHA
4: INTEGER LDA,LDB,M,N
5: CHARACTER DIAG,SIDE,TRANSA,UPLO
6: * ..
7: * .. Array Arguments ..
8: DOUBLE COMPLEX A(LDA,*),B(LDB,*)
9: * ..
10: *
11: * Purpose
12: * =======
13: *
14: * ZTRSM solves one of the matrix equations
15: *
16: * op( A )*X = alpha*B, or X*op( A ) = alpha*B,
17: *
18: * where alpha is a scalar, X and B are m by n matrices, A is a unit, or
19: * non-unit, upper or lower triangular matrix and op( A ) is one of
20: *
21: * op( A ) = A or op( A ) = A' or op( A ) = conjg( A' ).
22: *
23: * The matrix X is overwritten on B.
24: *
25: * Arguments
26: * ==========
27: *
28: * SIDE - CHARACTER*1.
29: * On entry, SIDE specifies whether op( A ) appears on the left
30: * or right of X as follows:
31: *
32: * SIDE = 'L' or 'l' op( A )*X = alpha*B.
33: *
34: * SIDE = 'R' or 'r' X*op( A ) = alpha*B.
35: *
36: * Unchanged on exit.
37: *
38: * UPLO - CHARACTER*1.
39: * On entry, UPLO specifies whether the matrix A is an upper or
40: * lower triangular matrix as follows:
41: *
42: * UPLO = 'U' or 'u' A is an upper triangular matrix.
43: *
44: * UPLO = 'L' or 'l' A is a lower triangular matrix.
45: *
46: * Unchanged on exit.
47: *
48: * TRANSA - CHARACTER*1.
49: * On entry, TRANSA specifies the form of op( A ) to be used in
50: * the matrix multiplication as follows:
51: *
52: * TRANSA = 'N' or 'n' op( A ) = A.
53: *
54: * TRANSA = 'T' or 't' op( A ) = A'.
55: *
56: * TRANSA = 'C' or 'c' op( A ) = conjg( A' ).
57: *
58: * Unchanged on exit.
59: *
60: * DIAG - CHARACTER*1.
61: * On entry, DIAG specifies whether or not A is unit triangular
62: * as follows:
63: *
64: * DIAG = 'U' or 'u' A is assumed to be unit triangular.
65: *
66: * DIAG = 'N' or 'n' A is not assumed to be unit
67: * triangular.
68: *
69: * Unchanged on exit.
70: *
71: * M - INTEGER.
72: * On entry, M specifies the number of rows of B. M must be at
73: * least zero.
74: * Unchanged on exit.
75: *
76: * N - INTEGER.
77: * On entry, N specifies the number of columns of B. N must be
78: * at least zero.
79: * Unchanged on exit.
80: *
81: * ALPHA - COMPLEX*16 .
82: * On entry, ALPHA specifies the scalar alpha. When alpha is
83: * zero then A is not referenced and B need not be set before
84: * entry.
85: * Unchanged on exit.
86: *
87: * A - COMPLEX*16 array of DIMENSION ( LDA, k ), where k is m
88: * when SIDE = 'L' or 'l' and is n when SIDE = 'R' or 'r'.
89: * Before entry with UPLO = 'U' or 'u', the leading k by k
90: * upper triangular part of the array A must contain the upper
91: * triangular matrix and the strictly lower triangular part of
92: * A is not referenced.
93: * Before entry with UPLO = 'L' or 'l', the leading k by k
94: * lower triangular part of the array A must contain the lower
95: * triangular matrix and the strictly upper triangular part of
96: * A is not referenced.
97: * Note that when DIAG = 'U' or 'u', the diagonal elements of
98: * A are not referenced either, but are assumed to be unity.
99: * Unchanged on exit.
100: *
101: * LDA - INTEGER.
102: * On entry, LDA specifies the first dimension of A as declared
103: * in the calling (sub) program. When SIDE = 'L' or 'l' then
104: * LDA must be at least max( 1, m ), when SIDE = 'R' or 'r'
105: * then LDA must be at least max( 1, n ).
106: * Unchanged on exit.
107: *
108: * B - COMPLEX*16 array of DIMENSION ( LDB, n ).
109: * Before entry, the leading m by n part of the array B must
110: * contain the right-hand side matrix B, and on exit is
111: * overwritten by the solution matrix X.
112: *
113: * LDB - INTEGER.
114: * On entry, LDB specifies the first dimension of B as declared
115: * in the calling (sub) program. LDB must be at least
116: * max( 1, m ).
117: * Unchanged on exit.
118: *
119: * Further Details
120: * ===============
121: *
122: * Level 3 Blas routine.
123: *
124: * -- Written on 8-February-1989.
125: * Jack Dongarra, Argonne National Laboratory.
126: * Iain Duff, AERE Harwell.
127: * Jeremy Du Croz, Numerical Algorithms Group Ltd.
128: * Sven Hammarling, Numerical Algorithms Group Ltd.
129: *
130: * =====================================================================
131: *
132: * .. External Functions ..
133: LOGICAL LSAME
134: EXTERNAL LSAME
135: * ..
136: * .. External Subroutines ..
137: EXTERNAL XERBLA
138: * ..
139: * .. Intrinsic Functions ..
140: INTRINSIC DCONJG,MAX
141: * ..
142: * .. Local Scalars ..
143: DOUBLE COMPLEX TEMP
144: INTEGER I,INFO,J,K,NROWA
145: LOGICAL LSIDE,NOCONJ,NOUNIT,UPPER
146: * ..
147: * .. Parameters ..
148: DOUBLE COMPLEX ONE
149: PARAMETER (ONE= (1.0D+0,0.0D+0))
150: DOUBLE COMPLEX ZERO
151: PARAMETER (ZERO= (0.0D+0,0.0D+0))
152: * ..
153: *
154: * Test the input parameters.
155: *
156: LSIDE = LSAME(SIDE,'L')
157: IF (LSIDE) THEN
158: NROWA = M
159: ELSE
160: NROWA = N
161: END IF
162: NOCONJ = LSAME(TRANSA,'T')
163: NOUNIT = LSAME(DIAG,'N')
164: UPPER = LSAME(UPLO,'U')
165: *
166: INFO = 0
167: IF ((.NOT.LSIDE) .AND. (.NOT.LSAME(SIDE,'R'))) THEN
168: INFO = 1
169: ELSE IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN
170: INFO = 2
171: ELSE IF ((.NOT.LSAME(TRANSA,'N')) .AND.
172: + (.NOT.LSAME(TRANSA,'T')) .AND.
173: + (.NOT.LSAME(TRANSA,'C'))) THEN
174: INFO = 3
175: ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. (.NOT.LSAME(DIAG,'N'))) THEN
176: INFO = 4
177: ELSE IF (M.LT.0) THEN
178: INFO = 5
179: ELSE IF (N.LT.0) THEN
180: INFO = 6
181: ELSE IF (LDA.LT.MAX(1,NROWA)) THEN
182: INFO = 9
183: ELSE IF (LDB.LT.MAX(1,M)) THEN
184: INFO = 11
185: END IF
186: IF (INFO.NE.0) THEN
187: CALL XERBLA('ZTRSM ',INFO)
188: RETURN
189: END IF
190: *
191: * Quick return if possible.
192: *
193: IF (M.EQ.0 .OR. N.EQ.0) RETURN
194: *
195: * And when alpha.eq.zero.
196: *
197: IF (ALPHA.EQ.ZERO) THEN
198: DO 20 J = 1,N
199: DO 10 I = 1,M
200: B(I,J) = ZERO
201: 10 CONTINUE
202: 20 CONTINUE
203: RETURN
204: END IF
205: *
206: * Start the operations.
207: *
208: IF (LSIDE) THEN
209: IF (LSAME(TRANSA,'N')) THEN
210: *
211: * Form B := alpha*inv( A )*B.
212: *
213: IF (UPPER) THEN
214: DO 60 J = 1,N
215: IF (ALPHA.NE.ONE) THEN
216: DO 30 I = 1,M
217: B(I,J) = ALPHA*B(I,J)
218: 30 CONTINUE
219: END IF
220: DO 50 K = M,1,-1
221: IF (B(K,J).NE.ZERO) THEN
222: IF (NOUNIT) B(K,J) = B(K,J)/A(K,K)
223: DO 40 I = 1,K - 1
224: B(I,J) = B(I,J) - B(K,J)*A(I,K)
225: 40 CONTINUE
226: END IF
227: 50 CONTINUE
228: 60 CONTINUE
229: ELSE
230: DO 100 J = 1,N
231: IF (ALPHA.NE.ONE) THEN
232: DO 70 I = 1,M
233: B(I,J) = ALPHA*B(I,J)
234: 70 CONTINUE
235: END IF
236: DO 90 K = 1,M
237: IF (B(K,J).NE.ZERO) THEN
238: IF (NOUNIT) B(K,J) = B(K,J)/A(K,K)
239: DO 80 I = K + 1,M
240: B(I,J) = B(I,J) - B(K,J)*A(I,K)
241: 80 CONTINUE
242: END IF
243: 90 CONTINUE
244: 100 CONTINUE
245: END IF
246: ELSE
247: *
248: * Form B := alpha*inv( A' )*B
249: * or B := alpha*inv( conjg( A' ) )*B.
250: *
251: IF (UPPER) THEN
252: DO 140 J = 1,N
253: DO 130 I = 1,M
254: TEMP = ALPHA*B(I,J)
255: IF (NOCONJ) THEN
256: DO 110 K = 1,I - 1
257: TEMP = TEMP - A(K,I)*B(K,J)
258: 110 CONTINUE
259: IF (NOUNIT) TEMP = TEMP/A(I,I)
260: ELSE
261: DO 120 K = 1,I - 1
262: TEMP = TEMP - DCONJG(A(K,I))*B(K,J)
263: 120 CONTINUE
264: IF (NOUNIT) TEMP = TEMP/DCONJG(A(I,I))
265: END IF
266: B(I,J) = TEMP
267: 130 CONTINUE
268: 140 CONTINUE
269: ELSE
270: DO 180 J = 1,N
271: DO 170 I = M,1,-1
272: TEMP = ALPHA*B(I,J)
273: IF (NOCONJ) THEN
274: DO 150 K = I + 1,M
275: TEMP = TEMP - A(K,I)*B(K,J)
276: 150 CONTINUE
277: IF (NOUNIT) TEMP = TEMP/A(I,I)
278: ELSE
279: DO 160 K = I + 1,M
280: TEMP = TEMP - DCONJG(A(K,I))*B(K,J)
281: 160 CONTINUE
282: IF (NOUNIT) TEMP = TEMP/DCONJG(A(I,I))
283: END IF
284: B(I,J) = TEMP
285: 170 CONTINUE
286: 180 CONTINUE
287: END IF
288: END IF
289: ELSE
290: IF (LSAME(TRANSA,'N')) THEN
291: *
292: * Form B := alpha*B*inv( A ).
293: *
294: IF (UPPER) THEN
295: DO 230 J = 1,N
296: IF (ALPHA.NE.ONE) THEN
297: DO 190 I = 1,M
298: B(I,J) = ALPHA*B(I,J)
299: 190 CONTINUE
300: END IF
301: DO 210 K = 1,J - 1
302: IF (A(K,J).NE.ZERO) THEN
303: DO 200 I = 1,M
304: B(I,J) = B(I,J) - A(K,J)*B(I,K)
305: 200 CONTINUE
306: END IF
307: 210 CONTINUE
308: IF (NOUNIT) THEN
309: TEMP = ONE/A(J,J)
310: DO 220 I = 1,M
311: B(I,J) = TEMP*B(I,J)
312: 220 CONTINUE
313: END IF
314: 230 CONTINUE
315: ELSE
316: DO 280 J = N,1,-1
317: IF (ALPHA.NE.ONE) THEN
318: DO 240 I = 1,M
319: B(I,J) = ALPHA*B(I,J)
320: 240 CONTINUE
321: END IF
322: DO 260 K = J + 1,N
323: IF (A(K,J).NE.ZERO) THEN
324: DO 250 I = 1,M
325: B(I,J) = B(I,J) - A(K,J)*B(I,K)
326: 250 CONTINUE
327: END IF
328: 260 CONTINUE
329: IF (NOUNIT) THEN
330: TEMP = ONE/A(J,J)
331: DO 270 I = 1,M
332: B(I,J) = TEMP*B(I,J)
333: 270 CONTINUE
334: END IF
335: 280 CONTINUE
336: END IF
337: ELSE
338: *
339: * Form B := alpha*B*inv( A' )
340: * or B := alpha*B*inv( conjg( A' ) ).
341: *
342: IF (UPPER) THEN
343: DO 330 K = N,1,-1
344: IF (NOUNIT) THEN
345: IF (NOCONJ) THEN
346: TEMP = ONE/A(K,K)
347: ELSE
348: TEMP = ONE/DCONJG(A(K,K))
349: END IF
350: DO 290 I = 1,M
351: B(I,K) = TEMP*B(I,K)
352: 290 CONTINUE
353: END IF
354: DO 310 J = 1,K - 1
355: IF (A(J,K).NE.ZERO) THEN
356: IF (NOCONJ) THEN
357: TEMP = A(J,K)
358: ELSE
359: TEMP = DCONJG(A(J,K))
360: END IF
361: DO 300 I = 1,M
362: B(I,J) = B(I,J) - TEMP*B(I,K)
363: 300 CONTINUE
364: END IF
365: 310 CONTINUE
366: IF (ALPHA.NE.ONE) THEN
367: DO 320 I = 1,M
368: B(I,K) = ALPHA*B(I,K)
369: 320 CONTINUE
370: END IF
371: 330 CONTINUE
372: ELSE
373: DO 380 K = 1,N
374: IF (NOUNIT) THEN
375: IF (NOCONJ) THEN
376: TEMP = ONE/A(K,K)
377: ELSE
378: TEMP = ONE/DCONJG(A(K,K))
379: END IF
380: DO 340 I = 1,M
381: B(I,K) = TEMP*B(I,K)
382: 340 CONTINUE
383: END IF
384: DO 360 J = K + 1,N
385: IF (A(J,K).NE.ZERO) THEN
386: IF (NOCONJ) THEN
387: TEMP = A(J,K)
388: ELSE
389: TEMP = DCONJG(A(J,K))
390: END IF
391: DO 350 I = 1,M
392: B(I,J) = B(I,J) - TEMP*B(I,K)
393: 350 CONTINUE
394: END IF
395: 360 CONTINUE
396: IF (ALPHA.NE.ONE) THEN
397: DO 370 I = 1,M
398: B(I,K) = ALPHA*B(I,K)
399: 370 CONTINUE
400: END IF
401: 380 CONTINUE
402: END IF
403: END IF
404: END IF
405: *
406: RETURN
407: *
408: * End of ZTRSM .
409: *
410: END
CVSweb interface <joel.bertrand@systella.fr>