Annotation of rpl/lapack/lapack/zhfrk.f, revision 1.7
1.7 ! bertrand 1: *> \brief \b ZHFRK
! 2: *
! 3: * =========== DOCUMENTATION ===========
! 4: *
! 5: * Online html documentation available at
! 6: * http://www.netlib.org/lapack/explore-html/
! 7: *
! 8: *> \htmlonly
! 9: *> Download ZHFRK + dependencies
! 10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zhfrk.f">
! 11: *> [TGZ]</a>
! 12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zhfrk.f">
! 13: *> [ZIP]</a>
! 14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zhfrk.f">
! 15: *> [TXT]</a>
! 16: *> \endhtmlonly
! 17: *
! 18: * Definition:
! 19: * ===========
! 20: *
! 21: * SUBROUTINE ZHFRK( TRANSR, UPLO, TRANS, N, K, ALPHA, A, LDA, BETA,
! 22: * C )
! 23: *
! 24: * .. Scalar Arguments ..
! 25: * DOUBLE PRECISION ALPHA, BETA
! 26: * INTEGER K, LDA, N
! 27: * CHARACTER TRANS, TRANSR, UPLO
! 28: * ..
! 29: * .. Array Arguments ..
! 30: * COMPLEX*16 A( LDA, * ), C( * )
! 31: * ..
! 32: *
! 33: *
! 34: *> \par Purpose:
! 35: * =============
! 36: *>
! 37: *> \verbatim
! 38: *>
! 39: *> Level 3 BLAS like routine for C in RFP Format.
! 40: *>
! 41: *> ZHFRK performs one of the Hermitian rank--k operations
! 42: *>
! 43: *> C := alpha*A*A**H + beta*C,
! 44: *>
! 45: *> or
! 46: *>
! 47: *> C := alpha*A**H*A + beta*C,
! 48: *>
! 49: *> where alpha and beta are real scalars, C is an n--by--n Hermitian
! 50: *> matrix and A is an n--by--k matrix in the first case and a k--by--n
! 51: *> matrix in the second case.
! 52: *> \endverbatim
! 53: *
! 54: * Arguments:
! 55: * ==========
! 56: *
! 57: *> \param[in] TRANSR
! 58: *> \verbatim
! 59: *> TRANSR is CHARACTER*1
! 60: *> = 'N': The Normal Form of RFP A is stored;
! 61: *> = 'C': The Conjugate-transpose Form of RFP A is stored.
! 62: *> \endverbatim
! 63: *>
! 64: *> \param[in] UPLO
! 65: *> \verbatim
! 66: *> UPLO is CHARACTER*1
! 67: *> On entry, UPLO specifies whether the upper or lower
! 68: *> triangular part of the array C is to be referenced as
! 69: *> follows:
! 70: *>
! 71: *> UPLO = 'U' or 'u' Only the upper triangular part of C
! 72: *> is to be referenced.
! 73: *>
! 74: *> UPLO = 'L' or 'l' Only the lower triangular part of C
! 75: *> is to be referenced.
! 76: *>
! 77: *> Unchanged on exit.
! 78: *> \endverbatim
! 79: *>
! 80: *> \param[in] TRANS
! 81: *> \verbatim
! 82: *> TRANS is CHARACTER*1
! 83: *> On entry, TRANS specifies the operation to be performed as
! 84: *> follows:
! 85: *>
! 86: *> TRANS = 'N' or 'n' C := alpha*A*A**H + beta*C.
! 87: *>
! 88: *> TRANS = 'C' or 'c' C := alpha*A**H*A + beta*C.
! 89: *>
! 90: *> Unchanged on exit.
! 91: *> \endverbatim
! 92: *>
! 93: *> \param[in] N
! 94: *> \verbatim
! 95: *> N is INTEGER
! 96: *> On entry, N specifies the order of the matrix C. N must be
! 97: *> at least zero.
! 98: *> Unchanged on exit.
! 99: *> \endverbatim
! 100: *>
! 101: *> \param[in] K
! 102: *> \verbatim
! 103: *> K is INTEGER
! 104: *> On entry with TRANS = 'N' or 'n', K specifies the number
! 105: *> of columns of the matrix A, and on entry with
! 106: *> TRANS = 'C' or 'c', K specifies the number of rows of the
! 107: *> matrix A. K must be at least zero.
! 108: *> Unchanged on exit.
! 109: *> \endverbatim
! 110: *>
! 111: *> \param[in] ALPHA
! 112: *> \verbatim
! 113: *> ALPHA is DOUBLE PRECISION
! 114: *> On entry, ALPHA specifies the scalar alpha.
! 115: *> Unchanged on exit.
! 116: *> \endverbatim
! 117: *>
! 118: *> \param[in] A
! 119: *> \verbatim
! 120: *> A is COMPLEX*16 array of DIMENSION (LDA,ka)
! 121: *> where KA
! 122: *> is K when TRANS = 'N' or 'n', and is N otherwise. Before
! 123: *> entry with TRANS = 'N' or 'n', the leading N--by--K part of
! 124: *> the array A must contain the matrix A, otherwise the leading
! 125: *> K--by--N part of the array A must contain the matrix A.
! 126: *> Unchanged on exit.
! 127: *> \endverbatim
! 128: *>
! 129: *> \param[in] LDA
! 130: *> \verbatim
! 131: *> LDA is INTEGER
! 132: *> On entry, LDA specifies the first dimension of A as declared
! 133: *> in the calling (sub) program. When TRANS = 'N' or 'n'
! 134: *> then LDA must be at least max( 1, n ), otherwise LDA must
! 135: *> be at least max( 1, k ).
! 136: *> Unchanged on exit.
! 137: *> \endverbatim
! 138: *>
! 139: *> \param[in] BETA
! 140: *> \verbatim
! 141: *> BETA is DOUBLE PRECISION
! 142: *> On entry, BETA specifies the scalar beta.
! 143: *> Unchanged on exit.
! 144: *> \endverbatim
! 145: *>
! 146: *> \param[in,out] C
! 147: *> \verbatim
! 148: *> C is COMPLEX*16 array, dimension (N*(N+1)/2)
! 149: *> On entry, the matrix A in RFP Format. RFP Format is
! 150: *> described by TRANSR, UPLO and N. Note that the imaginary
! 151: *> parts of the diagonal elements need not be set, they are
! 152: *> assumed to be zero, and on exit they are set to zero.
! 153: *> \endverbatim
! 154: *
! 155: * Authors:
! 156: * ========
! 157: *
! 158: *> \author Univ. of Tennessee
! 159: *> \author Univ. of California Berkeley
! 160: *> \author Univ. of Colorado Denver
! 161: *> \author NAG Ltd.
! 162: *
! 163: *> \date November 2011
! 164: *
! 165: *> \ingroup complex16OTHERcomputational
! 166: *
! 167: * =====================================================================
1.1 bertrand 168: SUBROUTINE ZHFRK( TRANSR, UPLO, TRANS, N, K, ALPHA, A, LDA, BETA,
1.6 bertrand 169: $ C )
1.1 bertrand 170: *
1.7 ! bertrand 171: * -- LAPACK computational routine (version 3.4.0) --
1.1 bertrand 172: * -- LAPACK is a software package provided by Univ. of Tennessee, --
173: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
1.7 ! bertrand 174: * November 2011
1.1 bertrand 175: *
176: * .. Scalar Arguments ..
177: DOUBLE PRECISION ALPHA, BETA
178: INTEGER K, LDA, N
179: CHARACTER TRANS, TRANSR, UPLO
180: * ..
181: * .. Array Arguments ..
182: COMPLEX*16 A( LDA, * ), C( * )
183: * ..
184: *
1.6 bertrand 185: * =====================================================================
1.1 bertrand 186: *
187: * .. Parameters ..
188: DOUBLE PRECISION ONE, ZERO
189: COMPLEX*16 CZERO
190: PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 )
191: PARAMETER ( CZERO = ( 0.0D+0, 0.0D+0 ) )
192: * ..
193: * .. Local Scalars ..
194: LOGICAL LOWER, NORMALTRANSR, NISODD, NOTRANS
195: INTEGER INFO, NROWA, J, NK, N1, N2
196: COMPLEX*16 CALPHA, CBETA
197: * ..
198: * .. External Functions ..
199: LOGICAL LSAME
200: EXTERNAL LSAME
201: * ..
202: * .. External Subroutines ..
203: EXTERNAL XERBLA, ZGEMM, ZHERK
204: * ..
205: * .. Intrinsic Functions ..
206: INTRINSIC MAX, DCMPLX
207: * ..
208: * .. Executable Statements ..
209: *
210: *
211: * Test the input parameters.
212: *
213: INFO = 0
214: NORMALTRANSR = LSAME( TRANSR, 'N' )
215: LOWER = LSAME( UPLO, 'L' )
216: NOTRANS = LSAME( TRANS, 'N' )
217: *
218: IF( NOTRANS ) THEN
219: NROWA = N
220: ELSE
221: NROWA = K
222: END IF
223: *
224: IF( .NOT.NORMALTRANSR .AND. .NOT.LSAME( TRANSR, 'C' ) ) THEN
225: INFO = -1
226: ELSE IF( .NOT.LOWER .AND. .NOT.LSAME( UPLO, 'U' ) ) THEN
227: INFO = -2
228: ELSE IF( .NOT.NOTRANS .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN
229: INFO = -3
230: ELSE IF( N.LT.0 ) THEN
231: INFO = -4
232: ELSE IF( K.LT.0 ) THEN
233: INFO = -5
234: ELSE IF( LDA.LT.MAX( 1, NROWA ) ) THEN
235: INFO = -8
236: END IF
237: IF( INFO.NE.0 ) THEN
238: CALL XERBLA( 'ZHFRK ', -INFO )
239: RETURN
240: END IF
241: *
242: * Quick return if possible.
243: *
244: * The quick return case: ((ALPHA.EQ.0).AND.(BETA.NE.ZERO)) is not
245: * done (it is in ZHERK for example) and left in the general case.
246: *
247: IF( ( N.EQ.0 ) .OR. ( ( ( ALPHA.EQ.ZERO ) .OR. ( K.EQ.0 ) ) .AND.
1.6 bertrand 248: $ ( BETA.EQ.ONE ) ) )RETURN
1.1 bertrand 249: *
250: IF( ( ALPHA.EQ.ZERO ) .AND. ( BETA.EQ.ZERO ) ) THEN
251: DO J = 1, ( ( N*( N+1 ) ) / 2 )
252: C( J ) = CZERO
253: END DO
254: RETURN
255: END IF
256: *
257: CALPHA = DCMPLX( ALPHA, ZERO )
258: CBETA = DCMPLX( BETA, ZERO )
259: *
260: * C is N-by-N.
261: * If N is odd, set NISODD = .TRUE., and N1 and N2.
262: * If N is even, NISODD = .FALSE., and NK.
263: *
264: IF( MOD( N, 2 ).EQ.0 ) THEN
265: NISODD = .FALSE.
266: NK = N / 2
267: ELSE
268: NISODD = .TRUE.
269: IF( LOWER ) THEN
270: N2 = N / 2
271: N1 = N - N2
272: ELSE
273: N1 = N / 2
274: N2 = N - N1
275: END IF
276: END IF
277: *
278: IF( NISODD ) THEN
279: *
280: * N is odd
281: *
282: IF( NORMALTRANSR ) THEN
283: *
284: * N is odd and TRANSR = 'N'
285: *
286: IF( LOWER ) THEN
287: *
288: * N is odd, TRANSR = 'N', and UPLO = 'L'
289: *
290: IF( NOTRANS ) THEN
291: *
292: * N is odd, TRANSR = 'N', UPLO = 'L', and TRANS = 'N'
293: *
294: CALL ZHERK( 'L', 'N', N1, K, ALPHA, A( 1, 1 ), LDA,
1.6 bertrand 295: $ BETA, C( 1 ), N )
1.1 bertrand 296: CALL ZHERK( 'U', 'N', N2, K, ALPHA, A( N1+1, 1 ), LDA,
1.6 bertrand 297: $ BETA, C( N+1 ), N )
1.1 bertrand 298: CALL ZGEMM( 'N', 'C', N2, N1, K, CALPHA, A( N1+1, 1 ),
1.6 bertrand 299: $ LDA, A( 1, 1 ), LDA, CBETA, C( N1+1 ), N )
1.1 bertrand 300: *
301: ELSE
302: *
303: * N is odd, TRANSR = 'N', UPLO = 'L', and TRANS = 'C'
304: *
305: CALL ZHERK( 'L', 'C', N1, K, ALPHA, A( 1, 1 ), LDA,
1.6 bertrand 306: $ BETA, C( 1 ), N )
1.1 bertrand 307: CALL ZHERK( 'U', 'C', N2, K, ALPHA, A( 1, N1+1 ), LDA,
1.6 bertrand 308: $ BETA, C( N+1 ), N )
1.1 bertrand 309: CALL ZGEMM( 'C', 'N', N2, N1, K, CALPHA, A( 1, N1+1 ),
1.6 bertrand 310: $ LDA, A( 1, 1 ), LDA, CBETA, C( N1+1 ), N )
1.1 bertrand 311: *
312: END IF
313: *
314: ELSE
315: *
316: * N is odd, TRANSR = 'N', and UPLO = 'U'
317: *
318: IF( NOTRANS ) THEN
319: *
320: * N is odd, TRANSR = 'N', UPLO = 'U', and TRANS = 'N'
321: *
322: CALL ZHERK( 'L', 'N', N1, K, ALPHA, A( 1, 1 ), LDA,
1.6 bertrand 323: $ BETA, C( N2+1 ), N )
1.1 bertrand 324: CALL ZHERK( 'U', 'N', N2, K, ALPHA, A( N2, 1 ), LDA,
1.6 bertrand 325: $ BETA, C( N1+1 ), N )
1.1 bertrand 326: CALL ZGEMM( 'N', 'C', N1, N2, K, CALPHA, A( 1, 1 ),
1.6 bertrand 327: $ LDA, A( N2, 1 ), LDA, CBETA, C( 1 ), N )
1.1 bertrand 328: *
329: ELSE
330: *
331: * N is odd, TRANSR = 'N', UPLO = 'U', and TRANS = 'C'
332: *
333: CALL ZHERK( 'L', 'C', N1, K, ALPHA, A( 1, 1 ), LDA,
1.6 bertrand 334: $ BETA, C( N2+1 ), N )
1.1 bertrand 335: CALL ZHERK( 'U', 'C', N2, K, ALPHA, A( 1, N2 ), LDA,
1.6 bertrand 336: $ BETA, C( N1+1 ), N )
1.1 bertrand 337: CALL ZGEMM( 'C', 'N', N1, N2, K, CALPHA, A( 1, 1 ),
1.6 bertrand 338: $ LDA, A( 1, N2 ), LDA, CBETA, C( 1 ), N )
1.1 bertrand 339: *
340: END IF
341: *
342: END IF
343: *
344: ELSE
345: *
346: * N is odd, and TRANSR = 'C'
347: *
348: IF( LOWER ) THEN
349: *
350: * N is odd, TRANSR = 'C', and UPLO = 'L'
351: *
352: IF( NOTRANS ) THEN
353: *
354: * N is odd, TRANSR = 'C', UPLO = 'L', and TRANS = 'N'
355: *
356: CALL ZHERK( 'U', 'N', N1, K, ALPHA, A( 1, 1 ), LDA,
1.6 bertrand 357: $ BETA, C( 1 ), N1 )
1.1 bertrand 358: CALL ZHERK( 'L', 'N', N2, K, ALPHA, A( N1+1, 1 ), LDA,
1.6 bertrand 359: $ BETA, C( 2 ), N1 )
1.1 bertrand 360: CALL ZGEMM( 'N', 'C', N1, N2, K, CALPHA, A( 1, 1 ),
1.6 bertrand 361: $ LDA, A( N1+1, 1 ), LDA, CBETA,
362: $ C( N1*N1+1 ), N1 )
1.1 bertrand 363: *
364: ELSE
365: *
366: * N is odd, TRANSR = 'C', UPLO = 'L', and TRANS = 'C'
367: *
368: CALL ZHERK( 'U', 'C', N1, K, ALPHA, A( 1, 1 ), LDA,
1.6 bertrand 369: $ BETA, C( 1 ), N1 )
1.1 bertrand 370: CALL ZHERK( 'L', 'C', N2, K, ALPHA, A( 1, N1+1 ), LDA,
1.6 bertrand 371: $ BETA, C( 2 ), N1 )
1.1 bertrand 372: CALL ZGEMM( 'C', 'N', N1, N2, K, CALPHA, A( 1, 1 ),
1.6 bertrand 373: $ LDA, A( 1, N1+1 ), LDA, CBETA,
374: $ C( N1*N1+1 ), N1 )
1.1 bertrand 375: *
376: END IF
377: *
378: ELSE
379: *
380: * N is odd, TRANSR = 'C', and UPLO = 'U'
381: *
382: IF( NOTRANS ) THEN
383: *
384: * N is odd, TRANSR = 'C', UPLO = 'U', and TRANS = 'N'
385: *
386: CALL ZHERK( 'U', 'N', N1, K, ALPHA, A( 1, 1 ), LDA,
1.6 bertrand 387: $ BETA, C( N2*N2+1 ), N2 )
1.1 bertrand 388: CALL ZHERK( 'L', 'N', N2, K, ALPHA, A( N1+1, 1 ), LDA,
1.6 bertrand 389: $ BETA, C( N1*N2+1 ), N2 )
1.1 bertrand 390: CALL ZGEMM( 'N', 'C', N2, N1, K, CALPHA, A( N1+1, 1 ),
1.6 bertrand 391: $ LDA, A( 1, 1 ), LDA, CBETA, C( 1 ), N2 )
1.1 bertrand 392: *
393: ELSE
394: *
395: * N is odd, TRANSR = 'C', UPLO = 'U', and TRANS = 'C'
396: *
397: CALL ZHERK( 'U', 'C', N1, K, ALPHA, A( 1, 1 ), LDA,
1.6 bertrand 398: $ BETA, C( N2*N2+1 ), N2 )
1.1 bertrand 399: CALL ZHERK( 'L', 'C', N2, K, ALPHA, A( 1, N1+1 ), LDA,
1.6 bertrand 400: $ BETA, C( N1*N2+1 ), N2 )
1.1 bertrand 401: CALL ZGEMM( 'C', 'N', N2, N1, K, CALPHA, A( 1, N1+1 ),
1.6 bertrand 402: $ LDA, A( 1, 1 ), LDA, CBETA, C( 1 ), N2 )
1.1 bertrand 403: *
404: END IF
405: *
406: END IF
407: *
408: END IF
409: *
410: ELSE
411: *
412: * N is even
413: *
414: IF( NORMALTRANSR ) THEN
415: *
416: * N is even and TRANSR = 'N'
417: *
418: IF( LOWER ) THEN
419: *
420: * N is even, TRANSR = 'N', and UPLO = 'L'
421: *
422: IF( NOTRANS ) THEN
423: *
424: * N is even, TRANSR = 'N', UPLO = 'L', and TRANS = 'N'
425: *
426: CALL ZHERK( 'L', 'N', NK, K, ALPHA, A( 1, 1 ), LDA,
1.6 bertrand 427: $ BETA, C( 2 ), N+1 )
1.1 bertrand 428: CALL ZHERK( 'U', 'N', NK, K, ALPHA, A( NK+1, 1 ), LDA,
1.6 bertrand 429: $ BETA, C( 1 ), N+1 )
1.1 bertrand 430: CALL ZGEMM( 'N', 'C', NK, NK, K, CALPHA, A( NK+1, 1 ),
1.6 bertrand 431: $ LDA, A( 1, 1 ), LDA, CBETA, C( NK+2 ),
432: $ N+1 )
1.1 bertrand 433: *
434: ELSE
435: *
436: * N is even, TRANSR = 'N', UPLO = 'L', and TRANS = 'C'
437: *
438: CALL ZHERK( 'L', 'C', NK, K, ALPHA, A( 1, 1 ), LDA,
1.6 bertrand 439: $ BETA, C( 2 ), N+1 )
1.1 bertrand 440: CALL ZHERK( 'U', 'C', NK, K, ALPHA, A( 1, NK+1 ), LDA,
1.6 bertrand 441: $ BETA, C( 1 ), N+1 )
1.1 bertrand 442: CALL ZGEMM( 'C', 'N', NK, NK, K, CALPHA, A( 1, NK+1 ),
1.6 bertrand 443: $ LDA, A( 1, 1 ), LDA, CBETA, C( NK+2 ),
444: $ N+1 )
1.1 bertrand 445: *
446: END IF
447: *
448: ELSE
449: *
450: * N is even, TRANSR = 'N', and UPLO = 'U'
451: *
452: IF( NOTRANS ) THEN
453: *
454: * N is even, TRANSR = 'N', UPLO = 'U', and TRANS = 'N'
455: *
456: CALL ZHERK( 'L', 'N', NK, K, ALPHA, A( 1, 1 ), LDA,
1.6 bertrand 457: $ BETA, C( NK+2 ), N+1 )
1.1 bertrand 458: CALL ZHERK( 'U', 'N', NK, K, ALPHA, A( NK+1, 1 ), LDA,
1.6 bertrand 459: $ BETA, C( NK+1 ), N+1 )
1.1 bertrand 460: CALL ZGEMM( 'N', 'C', NK, NK, K, CALPHA, A( 1, 1 ),
1.6 bertrand 461: $ LDA, A( NK+1, 1 ), LDA, CBETA, C( 1 ),
462: $ N+1 )
1.1 bertrand 463: *
464: ELSE
465: *
466: * N is even, TRANSR = 'N', UPLO = 'U', and TRANS = 'C'
467: *
468: CALL ZHERK( 'L', 'C', NK, K, ALPHA, A( 1, 1 ), LDA,
1.6 bertrand 469: $ BETA, C( NK+2 ), N+1 )
1.1 bertrand 470: CALL ZHERK( 'U', 'C', NK, K, ALPHA, A( 1, NK+1 ), LDA,
1.6 bertrand 471: $ BETA, C( NK+1 ), N+1 )
1.1 bertrand 472: CALL ZGEMM( 'C', 'N', NK, NK, K, CALPHA, A( 1, 1 ),
1.6 bertrand 473: $ LDA, A( 1, NK+1 ), LDA, CBETA, C( 1 ),
474: $ N+1 )
1.1 bertrand 475: *
476: END IF
477: *
478: END IF
479: *
480: ELSE
481: *
482: * N is even, and TRANSR = 'C'
483: *
484: IF( LOWER ) THEN
485: *
486: * N is even, TRANSR = 'C', and UPLO = 'L'
487: *
488: IF( NOTRANS ) THEN
489: *
490: * N is even, TRANSR = 'C', UPLO = 'L', and TRANS = 'N'
491: *
492: CALL ZHERK( 'U', 'N', NK, K, ALPHA, A( 1, 1 ), LDA,
1.6 bertrand 493: $ BETA, C( NK+1 ), NK )
1.1 bertrand 494: CALL ZHERK( 'L', 'N', NK, K, ALPHA, A( NK+1, 1 ), LDA,
1.6 bertrand 495: $ BETA, C( 1 ), NK )
1.1 bertrand 496: CALL ZGEMM( 'N', 'C', NK, NK, K, CALPHA, A( 1, 1 ),
1.6 bertrand 497: $ LDA, A( NK+1, 1 ), LDA, CBETA,
498: $ C( ( ( NK+1 )*NK )+1 ), NK )
1.1 bertrand 499: *
500: ELSE
501: *
502: * N is even, TRANSR = 'C', UPLO = 'L', and TRANS = 'C'
503: *
504: CALL ZHERK( 'U', 'C', NK, K, ALPHA, A( 1, 1 ), LDA,
1.6 bertrand 505: $ BETA, C( NK+1 ), NK )
1.1 bertrand 506: CALL ZHERK( 'L', 'C', NK, K, ALPHA, A( 1, NK+1 ), LDA,
1.6 bertrand 507: $ BETA, C( 1 ), NK )
1.1 bertrand 508: CALL ZGEMM( 'C', 'N', NK, NK, K, CALPHA, A( 1, 1 ),
1.6 bertrand 509: $ LDA, A( 1, NK+1 ), LDA, CBETA,
510: $ C( ( ( NK+1 )*NK )+1 ), NK )
1.1 bertrand 511: *
512: END IF
513: *
514: ELSE
515: *
516: * N is even, TRANSR = 'C', and UPLO = 'U'
517: *
518: IF( NOTRANS ) THEN
519: *
520: * N is even, TRANSR = 'C', UPLO = 'U', and TRANS = 'N'
521: *
522: CALL ZHERK( 'U', 'N', NK, K, ALPHA, A( 1, 1 ), LDA,
1.6 bertrand 523: $ BETA, C( NK*( NK+1 )+1 ), NK )
1.1 bertrand 524: CALL ZHERK( 'L', 'N', NK, K, ALPHA, A( NK+1, 1 ), LDA,
1.6 bertrand 525: $ BETA, C( NK*NK+1 ), NK )
1.1 bertrand 526: CALL ZGEMM( 'N', 'C', NK, NK, K, CALPHA, A( NK+1, 1 ),
1.6 bertrand 527: $ LDA, A( 1, 1 ), LDA, CBETA, C( 1 ), NK )
1.1 bertrand 528: *
529: ELSE
530: *
531: * N is even, TRANSR = 'C', UPLO = 'U', and TRANS = 'C'
532: *
533: CALL ZHERK( 'U', 'C', NK, K, ALPHA, A( 1, 1 ), LDA,
1.6 bertrand 534: $ BETA, C( NK*( NK+1 )+1 ), NK )
1.1 bertrand 535: CALL ZHERK( 'L', 'C', NK, K, ALPHA, A( 1, NK+1 ), LDA,
1.6 bertrand 536: $ BETA, C( NK*NK+1 ), NK )
1.1 bertrand 537: CALL ZGEMM( 'C', 'N', NK, NK, K, CALPHA, A( 1, NK+1 ),
1.6 bertrand 538: $ LDA, A( 1, 1 ), LDA, CBETA, C( 1 ), NK )
1.1 bertrand 539: *
540: END IF
541: *
542: END IF
543: *
544: END IF
545: *
546: END IF
547: *
548: RETURN
549: *
550: * End of ZHFRK
551: *
552: END
CVSweb interface <joel.bertrand@systella.fr>