1       SUBROUTINE ZLARCM( M, N, A, LDA, B, LDB, C, LDC, RWORK )
  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       INTEGER            LDA, LDB, LDC, M, N
 10 *     ..
 11 *     .. Array Arguments ..
 12       DOUBLE PRECISION   A( LDA, * ), RWORK( * )
 13       COMPLEX*16         B( LDB, * ), C( LDC, * )
 14 *     ..
 15 *
 16 *  Purpose
 17 *  =======
 18 *
 19 *  ZLARCM performs a very simple matrix-matrix multiplication:
 20 *           C := A * B,
 21 *  where A is M by M and real; B is M by N and complex;
 22 *  C is M by N and complex.
 23 *
 24 *  Arguments
 25 *  =========
 26 *
 27 *  M       (input) INTEGER
 28 *          The number of rows of the matrix A and of the matrix C.
 29 *          M >= 0.
 30 *
 31 *  N       (input) INTEGER
 32 *          The number of columns and rows of the matrix B and
 33 *          the number of columns of the matrix C.
 34 *          N >= 0.
 35 *
 36 *  A       (input) DOUBLE PRECISION array, dimension (LDA, M)
 37 *          A contains the M by M matrix A.
 38 *
 39 *  LDA     (input) INTEGER
 40 *          The leading dimension of the array A. LDA >=max(1,M).
 41 *
 42 *  B       (input) DOUBLE PRECISION array, dimension (LDB, N)
 43 *          B contains the M by N matrix B.
 44 *
 45 *  LDB     (input) INTEGER
 46 *          The leading dimension of the array B. LDB >=max(1,M).
 47 *
 48 *  C       (input) COMPLEX*16 array, dimension (LDC, N)
 49 *          C contains the M by N matrix C.
 50 *
 51 *  LDC     (input) INTEGER
 52 *          The leading dimension of the array C. LDC >=max(1,M).
 53 *
 54 *  RWORK   (workspace) DOUBLE PRECISION array, dimension (2*M*N)
 55 *
 56 *  =====================================================================
 57 *
 58 *     .. Parameters ..
 59       DOUBLE PRECISION   ONE, ZERO
 60       PARAMETER          ( ONE = 1.0D0, ZERO = 0.0D0 )
 61 *     ..
 62 *     .. Local Scalars ..
 63       INTEGER            I, J, L
 64 *     ..
 65 *     .. Intrinsic Functions ..
 66       INTRINSIC          DBLEDCMPLXDIMAG
 67 *     ..
 68 *     .. External Subroutines ..
 69       EXTERNAL           DGEMM
 70 *     ..
 71 *     .. Executable Statements ..
 72 *
 73 *     Quick return if possible.
 74 *
 75       IF( ( M.EQ.0 ) .OR. ( N.EQ.0 ) )
 76      $   RETURN
 77 *
 78       DO 20 J = 1, N
 79          DO 10 I = 1, M
 80             RWORK( ( J-1 )*M+I ) = DBLE( B( I, J ) )
 81    10    CONTINUE
 82    20 CONTINUE
 83 *
 84       L = M*+ 1
 85       CALL DGEMM( 'N''N', M, N, M, ONE, A, LDA, RWORK, M, ZERO,
 86      $            RWORK( L ), M )
 87       DO 40 J = 1, N
 88          DO 30 I = 1, M
 89             C( I, J ) = RWORK( L+( J-1 )*M+I-1 )
 90    30    CONTINUE
 91    40 CONTINUE
 92 *
 93       DO 60 J = 1, N
 94          DO 50 I = 1, M
 95             RWORK( ( J-1 )*M+I ) = DIMAG( B( I, J ) )
 96    50    CONTINUE
 97    60 CONTINUE
 98       CALL DGEMM( 'N''N', M, N, M, ONE, A, LDA, RWORK, M, ZERO,
 99      $            RWORK( L ), M )
100       DO 80 J = 1, N
101          DO 70 I = 1, M
102             C( I, J ) = DCMPLXDBLE( C( I, J ) ),
103      $                  RWORK( L+( J-1 )*M+I-1 ) )
104    70    CONTINUE
105    80 CONTINUE
106 *
107       RETURN
108 *
109 *     End of ZLARCM
110 *
111       END