The R Project SVN R

Rev

Rev 18608 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 18608 Rev 23175
Line 316... Line 316...
316
   20 do 30 i = 1,n
316
   20 do 30 i = 1,n
317
        zx(i) = dcmplx(da,0.0d0)*zx(i)
317
        zx(i) = dcmplx(da,0.0d0)*zx(i)
318
   30 continue
318
   30 continue
319
      return
319
      return
320
      end
320
      end
321
      SUBROUTINE ZGEMM ( TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB,
-
 
322
     $                   BETA, C, LDC )
-
 
323
*     .. Scalar Arguments ..
-
 
324
      CHARACTER*1        TRANSA, TRANSB
-
 
325
      INTEGER            M, N, K, LDA, LDB, LDC
-
 
326
      COMPLEX*16         ALPHA, BETA
-
 
327
*     .. Array Arguments ..
-
 
328
      COMPLEX*16         A( LDA, * ), B( LDB, * ), C( LDC, * )
-
 
329
*     ..
-
 
330
*
-
 
331
*  Purpose
-
 
332
*  =======
-
 
333
*
-
 
334
*  ZGEMM  performs one of the matrix-matrix operations
-
 
335
*
-
 
336
*     C := alpha*op( A )*op( B ) + beta*C,
-
 
337
*
-
 
338
*  where  op( X ) is one of
-
 
339
*
-
 
340
*     op( X ) = X   or   op( X ) = X'   or   op( X ) = conjg( X' ),
-
 
341
*
-
 
342
*  alpha and beta are scalars, and A, B and C are matrices, with op( A )
-
 
343
*  an m by k matrix,  op( B )  a  k by n matrix and  C an m by n matrix.
-
 
344
*
-
 
345
*  Parameters
-
 
346
*  ==========
-
 
347
*
-
 
348
*  TRANSA - CHARACTER*1.
-
 
349
*           On entry, TRANSA specifies the form of op( A ) to be used in
-
 
350
*           the matrix multiplication as follows:
-
 
351
*
-
 
352
*              TRANSA = 'N' or 'n',  op( A ) = A.
-
 
353
*
-
 
354
*              TRANSA = 'T' or 't',  op( A ) = A'.
-
 
355
*
-
 
356
*              TRANSA = 'C' or 'c',  op( A ) = conjg( A' ).
-
 
357
*
-
 
358
*           Unchanged on exit.
-
 
359
*
-
 
360
*  TRANSB - CHARACTER*1.
-
 
361
*           On entry, TRANSB specifies the form of op( B ) to be used in
-
 
362
*           the matrix multiplication as follows:
-
 
363
*
-
 
364
*              TRANSB = 'N' or 'n',  op( B ) = B.
-
 
365
*
-
 
366
*              TRANSB = 'T' or 't',  op( B ) = B'.
-
 
367
*
-
 
368
*              TRANSB = 'C' or 'c',  op( B ) = conjg( B' ).
-
 
369
*
-
 
370
*           Unchanged on exit.
-
 
371
*
-
 
372
*  M      - INTEGER.
-
 
373
*           On entry,  M  specifies  the number  of rows  of the  matrix
-
 
374
*           op( A )  and of the  matrix  C.  M  must  be at least  zero.
-
 
375
*           Unchanged on exit.
-
 
376
*
-
 
377
*  N      - INTEGER.
-
 
378
*           On entry,  N  specifies the number  of columns of the matrix
-
 
379
*           op( B ) and the number of columns of the matrix C. N must be
-
 
380
*           at least zero.
-
 
381
*           Unchanged on exit.
-
 
382
*
-
 
383
*  K      - INTEGER.
-
 
384
*           On entry,  K  specifies  the number of columns of the matrix
-
 
385
*           op( A ) and the number of rows of the matrix op( B ). K must
-
 
386
*           be at least  zero.
-
 
387
*           Unchanged on exit.
-
 
388
*
-
 
389
*  ALPHA  - COMPLEX*16      .
-
 
390
*           On entry, ALPHA specifies the scalar alpha.
-
 
391
*           Unchanged on exit.
-
 
392
*
-
 
393
*  A      - COMPLEX*16       array of DIMENSION ( LDA, ka ), where ka is
-
 
394
*           k  when  TRANSA = 'N' or 'n',  and is  m  otherwise.
-
 
395
*           Before entry with  TRANSA = 'N' or 'n',  the leading  m by k
-
 
396
*           part of the array  A  must contain the matrix  A,  otherwise
-
 
397
*           the leading  k by m  part of the array  A  must contain  the
-
 
398
*           matrix A.
-
 
399
*           Unchanged on exit.
-
 
400
*
-
 
401
*  LDA    - INTEGER.
-
 
402
*           On entry, LDA specifies the first dimension of A as declared
-
 
403
*           in the calling (sub) program. When  TRANSA = 'N' or 'n' then
-
 
404
*           LDA must be at least  max( 1, m ), otherwise  LDA must be at
-
 
405
*           least  max( 1, k ).
-
 
406
*           Unchanged on exit.
-
 
407
*
-
 
408
*  B      - COMPLEX*16       array of DIMENSION ( LDB, kb ), where kb is
-
 
409
*           n  when  TRANSB = 'N' or 'n',  and is  k  otherwise.
-
 
410
*           Before entry with  TRANSB = 'N' or 'n',  the leading  k by n
-
 
411
*           part of the array  B  must contain the matrix  B,  otherwise
-
 
412
*           the leading  n by k  part of the array  B  must contain  the
-
 
413
*           matrix B.
-
 
414
*           Unchanged on exit.
-
 
415
*
-
 
416
*  LDB    - INTEGER.
-
 
417
*           On entry, LDB specifies the first dimension of B as declared
-
 
418
*           in the calling (sub) program. When  TRANSB = 'N' or 'n' then
-
 
419
*           LDB must be at least  max( 1, k ), otherwise  LDB must be at
-
 
420
*           least  max( 1, n ).
-
 
421
*           Unchanged on exit.
-
 
422
*
-
 
423
*  BETA   - COMPLEX*16      .
-
 
424
*           On entry,  BETA  specifies the scalar  beta.  When  BETA  is
-
 
425
*           supplied as zero then C need not be set on input.
-
 
426
*           Unchanged on exit.
-
 
427
*
-
 
428
*  C      - COMPLEX*16       array of DIMENSION ( LDC, n ).
-
 
429
*           Before entry, the leading  m by n  part of the array  C must
-
 
430
*           contain the matrix  C,  except when  beta  is zero, in which
-
 
431
*           case C need not be set on entry.
-
 
432
*           On exit, the array  C  is overwritten by the  m by n  matrix
-
 
433
*           ( alpha*op( A )*op( B ) + beta*C ).
-
 
434
*
-
 
435
*  LDC    - INTEGER.
-
 
436
*           On entry, LDC specifies the first dimension of C as declared
-
 
437
*           in  the  calling  (sub)  program.   LDC  must  be  at  least
-
 
438
*           max( 1, m ).
-
 
439
*           Unchanged on exit.
-
 
440
*
-
 
441
*
-
 
442
*  Level 3 Blas routine.
-
 
443
*
-
 
444
*  -- Written on 8-February-1989.
-
 
445
*     Jack Dongarra, Argonne National Laboratory.
-
 
446
*     Iain Duff, AERE Harwell.
-
 
447
*     Jeremy Du Croz, Numerical Algorithms Group Ltd.
-
 
448
*     Sven Hammarling, Numerical Algorithms Group Ltd.
-
 
449
*
-
 
450
*
-
 
451
*     .. External Functions ..
-
 
452
      LOGICAL            LSAME
-
 
453
      EXTERNAL           LSAME
-
 
454
*     .. External Subroutines ..
-
 
455
      EXTERNAL           XERBLA
-
 
456
*     .. Intrinsic Functions ..
-
 
457
      INTRINSIC          DCONJG, MAX
-
 
458
*     .. Local Scalars ..
-
 
459
      LOGICAL            CONJA, CONJB, NOTA, NOTB
-
 
460
      INTEGER            I, INFO, J, L, NCOLA, NROWA, NROWB
-
 
461
      COMPLEX*16         TEMP
-
 
462
*     .. Parameters ..
-
 
463
      COMPLEX*16         ONE
-
 
464
      PARAMETER        ( ONE  = ( 1.0D+0, 0.0D+0 ) )
-
 
465
      COMPLEX*16         ZERO
-
 
466
      PARAMETER        ( ZERO = ( 0.0D+0, 0.0D+0 ) )
-
 
467
*     ..
-
 
468
*     .. Executable Statements ..
-
 
469
*
-
 
470
*     Set  NOTA  and  NOTB  as  true if  A  and  B  respectively are not
-
 
471
*     conjugated or transposed, set  CONJA and CONJB  as true if  A  and
-
 
472
*     B  respectively are to be  transposed but  not conjugated  and set
-
 
473
*     NROWA, NCOLA and  NROWB  as the number of rows and  columns  of  A
-
 
474
*     and the number of rows of  B  respectively.
-
 
475
*
-
 
476
      NOTA  = LSAME( TRANSA, 'N' )
-
 
477
      NOTB  = LSAME( TRANSB, 'N' )
-
 
478
      CONJA = LSAME( TRANSA, 'C' )
-
 
479
      CONJB = LSAME( TRANSB, 'C' )
-
 
480
      IF( NOTA )THEN
-
 
481
         NROWA = M
-
 
482
         NCOLA = K
-
 
483
      ELSE
-
 
484
         NROWA = K
-
 
485
         NCOLA = M
-
 
486
      END IF
-
 
487
      IF( NOTB )THEN
-
 
488
         NROWB = K
-
 
489
      ELSE
-
 
490
         NROWB = N
-
 
491
      END IF
-
 
492
*
-
 
493
*     Test the input parameters.
-
 
494
*
-
 
495
      INFO = 0
-
 
496
      IF(      ( .NOT.NOTA                 ).AND.
-
 
497
     $         ( .NOT.CONJA                ).AND.
-
 
498
     $         ( .NOT.LSAME( TRANSA, 'T' ) )      )THEN
-
 
499
         INFO = 1
-
 
500
      ELSE IF( ( .NOT.NOTB                 ).AND.
-
 
501
     $         ( .NOT.CONJB                ).AND.
-
 
502
     $         ( .NOT.LSAME( TRANSB, 'T' ) )      )THEN
-
 
503
         INFO = 2
-
 
504
      ELSE IF( M  .LT.0               )THEN
-
 
505
         INFO = 3
-
 
506
      ELSE IF( N  .LT.0               )THEN
-
 
507
         INFO = 4
-
 
508
      ELSE IF( K  .LT.0               )THEN
-
 
509
         INFO = 5
-
 
510
      ELSE IF( LDA.LT.MAX( 1, NROWA ) )THEN
-
 
511
         INFO = 8
-
 
512
      ELSE IF( LDB.LT.MAX( 1, NROWB ) )THEN
-
 
513
         INFO = 10
-
 
514
      ELSE IF( LDC.LT.MAX( 1, M     ) )THEN
-
 
515
         INFO = 13
-
 
516
      END IF
-
 
517
      IF( INFO.NE.0 )THEN
-
 
518
         CALL XERBLA( 'ZGEMM ', INFO )
-
 
519
         RETURN
-
 
520
      END IF
-
 
521
*
-
 
522
*     Quick return if possible.
-
 
523
*
-
 
524
      IF( ( M.EQ.0 ).OR.( N.EQ.0 ).OR.
-
 
525
     $    ( ( ( ALPHA.EQ.ZERO ).OR.( K.EQ.0 ) ).AND.( BETA.EQ.ONE ) ) )
-
 
526
     $   RETURN
-
 
527
*
-
 
528
*     And when  alpha.eq.zero.
-
 
529
*
-
 
530
      IF( ALPHA.EQ.ZERO )THEN
-
 
531
         IF( BETA.EQ.ZERO )THEN
-
 
532
            DO 20, J = 1, N
-
 
533
               DO 10, I = 1, M
-
 
534
                  C( I, J ) = ZERO
-
 
535
   10          CONTINUE
-
 
536
   20       CONTINUE
-
 
537
         ELSE
-
 
538
            DO 40, J = 1, N
-
 
539
               DO 30, I = 1, M
-
 
540
                  C( I, J ) = BETA*C( I, J )
-
 
541
   30          CONTINUE
-
 
542
   40       CONTINUE
-
 
543
         END IF
-
 
544
         RETURN
-
 
545
      END IF
-
 
546
*
-
 
547
*     Start the operations.
-
 
548
*
-
 
549
      IF( NOTB )THEN
-
 
550
         IF( NOTA )THEN
-
 
551
*
-
 
552
*           Form  C := alpha*A*B + beta*C.
-
 
553
*
-
 
554
            DO 90, J = 1, N
-
 
555
               IF( BETA.EQ.ZERO )THEN
-
 
556
                  DO 50, I = 1, M
-
 
557
                     C( I, J ) = ZERO
-
 
558
   50             CONTINUE
-
 
559
               ELSE IF( BETA.NE.ONE )THEN
-
 
560
                  DO 60, I = 1, M
-
 
561
                     C( I, J ) = BETA*C( I, J )
-
 
562
   60             CONTINUE
-
 
563
               END IF
-
 
564
               DO 80, L = 1, K
-
 
565
                  IF( B( L, J ).NE.ZERO )THEN
-
 
566
                     TEMP = ALPHA*B( L, J )
-
 
567
                     DO 70, I = 1, M
-
 
568
                        C( I, J ) = C( I, J ) + TEMP*A( I, L )
-
 
569
   70                CONTINUE
-
 
570
                  END IF
-
 
571
   80          CONTINUE
-
 
572
   90       CONTINUE
-
 
573
         ELSE IF( CONJA )THEN
-
 
574
*
-
 
575
*           Form  C := alpha*conjg( A' )*B + beta*C.
-
 
576
*
-
 
577
            DO 120, J = 1, N
-
 
578
               DO 110, I = 1, M
-
 
579
                  TEMP = ZERO
-
 
580
                  DO 100, L = 1, K
-
 
581
                     TEMP = TEMP + DCONJG( A( L, I ) )*B( L, J )
-
 
582
  100             CONTINUE
-
 
583
                  IF( BETA.EQ.ZERO )THEN
-
 
584
                     C( I, J ) = ALPHA*TEMP
-
 
585
                  ELSE
-
 
586
                     C( I, J ) = ALPHA*TEMP + BETA*C( I, J )
-
 
587
                  END IF
-
 
588
  110          CONTINUE
-
 
589
  120       CONTINUE
-
 
590
         ELSE
-
 
591
*
-
 
592
*           Form  C := alpha*A'*B + beta*C
-
 
593
*
-
 
594
            DO 150, J = 1, N
-
 
595
               DO 140, I = 1, M
-
 
596
                  TEMP = ZERO
-
 
597
                  DO 130, L = 1, K
-
 
598
                     TEMP = TEMP + A( L, I )*B( L, J )
-
 
599
  130             CONTINUE
-
 
600
                  IF( BETA.EQ.ZERO )THEN
-
 
601
                     C( I, J ) = ALPHA*TEMP
-
 
602
                  ELSE
-
 
603
                     C( I, J ) = ALPHA*TEMP + BETA*C( I, J )
-
 
604
                  END IF
-
 
605
  140          CONTINUE
-
 
606
  150       CONTINUE
-
 
607
         END IF
-
 
608
      ELSE IF( NOTA )THEN
-
 
609
         IF( CONJB )THEN
-
 
610
*
-
 
611
*           Form  C := alpha*A*conjg( B' ) + beta*C.
-
 
612
*
-
 
613
            DO 200, J = 1, N
-
 
614
               IF( BETA.EQ.ZERO )THEN
-
 
615
                  DO 160, I = 1, M
-
 
616
                     C( I, J ) = ZERO
-
 
617
  160             CONTINUE
-
 
618
               ELSE IF( BETA.NE.ONE )THEN
-
 
619
                  DO 170, I = 1, M
-
 
620
                     C( I, J ) = BETA*C( I, J )
-
 
621
  170             CONTINUE
-
 
622
               END IF
-
 
623
               DO 190, L = 1, K
-
 
624
                  IF( B( J, L ).NE.ZERO )THEN
-
 
625
                     TEMP = ALPHA*DCONJG( B( J, L ) )
-
 
626
                     DO 180, I = 1, M
-
 
627
                        C( I, J ) = C( I, J ) + TEMP*A( I, L )
-
 
628
  180                CONTINUE
-
 
629
                  END IF
-
 
630
  190          CONTINUE
-
 
631
  200       CONTINUE
-
 
632
         ELSE
-
 
633
*
-
 
634
*           Form  C := alpha*A*B'          + beta*C
-
 
635
*
-
 
636
            DO 250, J = 1, N
-
 
637
               IF( BETA.EQ.ZERO )THEN
-
 
638
                  DO 210, I = 1, M
-
 
639
                     C( I, J ) = ZERO
-
 
640
  210             CONTINUE
-
 
641
               ELSE IF( BETA.NE.ONE )THEN
-
 
642
                  DO 220, I = 1, M
-
 
643
                     C( I, J ) = BETA*C( I, J )
-
 
644
  220             CONTINUE
-
 
645
               END IF
-
 
646
               DO 240, L = 1, K
-
 
647
                  IF( B( J, L ).NE.ZERO )THEN
-
 
648
                     TEMP = ALPHA*B( J, L )
-
 
649
                     DO 230, I = 1, M
-
 
650
                        C( I, J ) = C( I, J ) + TEMP*A( I, L )
-
 
651
  230                CONTINUE
-
 
652
                  END IF
-
 
653
  240          CONTINUE
-
 
654
  250       CONTINUE
-
 
655
         END IF
-
 
656
      ELSE IF( CONJA )THEN
-
 
657
         IF( CONJB )THEN
-
 
658
*
-
 
659
*           Form  C := alpha*conjg( A' )*conjg( B' ) + beta*C.
-
 
660
*
-
 
661
            DO 280, J = 1, N
-
 
662
               DO 270, I = 1, M
-
 
663
                  TEMP = ZERO
-
 
664
                  DO 260, L = 1, K
-
 
665
                     TEMP = TEMP +
-
 
666
     $                      DCONJG( A( L, I ) )*DCONJG( B( J, L ) )
-
 
667
  260             CONTINUE
-
 
668
                  IF( BETA.EQ.ZERO )THEN
-
 
669
                     C( I, J ) = ALPHA*TEMP
-
 
670
                  ELSE
-
 
671
                     C( I, J ) = ALPHA*TEMP + BETA*C( I, J )
-
 
672
                  END IF
-
 
673
  270          CONTINUE
-
 
674
  280       CONTINUE
-
 
675
         ELSE
-
 
676
*
-
 
677
*           Form  C := alpha*conjg( A' )*B' + beta*C
-
 
678
*
-
 
679
            DO 310, J = 1, N
-
 
680
               DO 300, I = 1, M
-
 
681
                  TEMP = ZERO
-
 
682
                  DO 290, L = 1, K
-
 
683
                     TEMP = TEMP + DCONJG( A( L, I ) )*B( J, L )
-
 
684
  290             CONTINUE
-
 
685
                  IF( BETA.EQ.ZERO )THEN
-
 
686
                     C( I, J ) = ALPHA*TEMP
-
 
687
                  ELSE
-
 
688
                     C( I, J ) = ALPHA*TEMP + BETA*C( I, J )
-
 
689
                  END IF
-
 
690
  300          CONTINUE
-
 
691
  310       CONTINUE
-
 
692
         END IF
-
 
693
      ELSE
-
 
694
         IF( CONJB )THEN
-
 
695
*
-
 
696
*           Form  C := alpha*A'*conjg( B' ) + beta*C
-
 
697
*
-
 
698
            DO 340, J = 1, N
-
 
699
               DO 330, I = 1, M
-
 
700
                  TEMP = ZERO
-
 
701
                  DO 320, L = 1, K
-
 
702
                     TEMP = TEMP + A( L, I )*DCONJG( B( J, L ) )
-
 
703
  320             CONTINUE
-
 
704
                  IF( BETA.EQ.ZERO )THEN
-
 
705
                     C( I, J ) = ALPHA*TEMP
-
 
706
                  ELSE
-
 
707
                     C( I, J ) = ALPHA*TEMP + BETA*C( I, J )
-
 
708
                  END IF
-
 
709
  330          CONTINUE
-
 
710
  340       CONTINUE
-
 
711
         ELSE
-
 
712
*
-
 
713
*           Form  C := alpha*A'*B' + beta*C
-
 
714
*
-
 
715
            DO 370, J = 1, N
-
 
716
               DO 360, I = 1, M
-
 
717
                  TEMP = ZERO
-
 
718
                  DO 350, L = 1, K
-
 
719
                     TEMP = TEMP + A( L, I )*B( J, L )
-
 
720
  350             CONTINUE
-
 
721
                  IF( BETA.EQ.ZERO )THEN
-
 
722
                     C( I, J ) = ALPHA*TEMP
-
 
723
                  ELSE
-
 
724
                     C( I, J ) = ALPHA*TEMP + BETA*C( I, J )
-
 
725
                  END IF
-
 
726
  360          CONTINUE
-
 
727
  370       CONTINUE
-
 
728
         END IF
-
 
729
      END IF
-
 
730
*
-
 
731
      RETURN
-
 
732
*
-
 
733
*     End of ZGEMM .
-
 
734
*
-
 
735
      END
-
 
736
      SUBROUTINE ZGEMV ( TRANS, M, N, ALPHA, A, LDA, X, INCX,
321
      SUBROUTINE ZGEMV ( TRANS, M, N, ALPHA, A, LDA, X, INCX,
737
     $                   BETA, Y, INCY )
322
     $                   BETA, Y, INCY )
738
*     .. Scalar Arguments ..
323
*     .. Scalar Arguments ..
739
      COMPLEX*16         ALPHA, BETA
324
      COMPLEX*16         ALPHA, BETA
740
      INTEGER            INCX, INCY, LDA, M, N
325
      INTEGER            INCX, INCY, LDA, M, N