You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

cblas_zhemv.c 3.5 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. /*
  2. * cblas_zhemv.c
  3. * The program is a C interface to zhemv
  4. *
  5. * Keita Teranishi 5/18/98
  6. *
  7. */
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include "cblas.h"
  11. #include "cblas_f77.h"
  12. void cblas_zhemv(const CBLAS_LAYOUT layout,
  13. const CBLAS_UPLO Uplo, const int N,
  14. const void *alpha, const void *A, const int lda,
  15. const void *X, const int incX, const void *beta,
  16. void *Y, const int incY)
  17. {
  18. char UL;
  19. #ifdef F77_CHAR
  20. F77_CHAR F77_UL;
  21. #else
  22. #define F77_UL &UL
  23. #endif
  24. #ifdef F77_INT
  25. F77_INT F77_N=N, F77_lda=lda, F77_incX=incX, F77_incY=incY;
  26. #else
  27. #define F77_N N
  28. #define F77_lda lda
  29. #define F77_incX incx
  30. #define F77_incY incY
  31. #endif
  32. int n, i=0, incx=incX;
  33. const double *xx= (double *)X, *alp= (double *)alpha, *bet = (double *)beta;
  34. double ALPHA[2],BETA[2];
  35. int tincY, tincx;
  36. double *x=(double *)X, *y=(double *)Y, *st=0, *tx;
  37. extern int CBLAS_CallFromC;
  38. extern int RowMajorStrg;
  39. RowMajorStrg = 0;
  40. CBLAS_CallFromC = 1;
  41. if (layout == CblasColMajor)
  42. {
  43. if (Uplo == CblasUpper) UL = 'U';
  44. else if (Uplo == CblasLower) UL = 'L';
  45. else
  46. {
  47. cblas_xerbla(2, "cblas_zhemv","Illegal Uplo setting, %d\n",Uplo );
  48. CBLAS_CallFromC = 0;
  49. RowMajorStrg = 0;
  50. return;
  51. }
  52. #ifdef F77_CHAR
  53. F77_UL = C2F_CHAR(&UL);
  54. #endif
  55. F77_zhemv(F77_UL, &F77_N, alpha, A, &F77_lda, X, &F77_incX,
  56. beta, Y, &F77_incY);
  57. }
  58. else if (layout == CblasRowMajor)
  59. {
  60. RowMajorStrg = 1;
  61. ALPHA[0]= *alp;
  62. ALPHA[1]= -alp[1];
  63. BETA[0]= *bet;
  64. BETA[1]= -bet[1];
  65. if (N > 0)
  66. {
  67. n = N << 1;
  68. x = malloc(n*sizeof(double));
  69. tx = x;
  70. if( incX > 0 ) {
  71. i = incX << 1 ;
  72. tincx = 2;
  73. st= x+n;
  74. } else {
  75. i = incX *(-2);
  76. tincx = -2;
  77. st = x-2;
  78. x +=(n-2);
  79. }
  80. do
  81. {
  82. *x = *xx;
  83. x[1] = -xx[1];
  84. x += tincx ;
  85. xx += i;
  86. }
  87. while (x != st);
  88. x=tx;
  89. #ifdef F77_INT
  90. F77_incX = 1;
  91. #else
  92. incx = 1;
  93. #endif
  94. if(incY > 0)
  95. tincY = incY;
  96. else
  97. tincY = -incY;
  98. y++;
  99. i = tincY << 1;
  100. n = i * N ;
  101. st = y + n;
  102. do {
  103. *y = -(*y);
  104. y += i;
  105. } while(y != st);
  106. y -= n;
  107. } else
  108. x = (double *) X;
  109. if (Uplo == CblasUpper) UL = 'L';
  110. else if (Uplo == CblasLower) UL = 'U';
  111. else
  112. {
  113. cblas_xerbla(2, "cblas_zhemv","Illegal Uplo setting, %d\n", Uplo);
  114. CBLAS_CallFromC = 0;
  115. RowMajorStrg = 0;
  116. return;
  117. }
  118. #ifdef F77_CHAR
  119. F77_UL = C2F_CHAR(&UL);
  120. #endif
  121. F77_zhemv(F77_UL, &F77_N, ALPHA, A, &F77_lda, x, &F77_incX,
  122. BETA, Y, &F77_incY);
  123. }
  124. else
  125. {
  126. cblas_xerbla(1, "cblas_zhemv","Illegal layout setting, %d\n", layout);
  127. CBLAS_CallFromC = 0;
  128. RowMajorStrg = 0;
  129. return;
  130. }
  131. if ( layout == CblasRowMajor )
  132. {
  133. RowMajorStrg = 1;
  134. if ( X != x )
  135. free(x);
  136. if (N > 0)
  137. {
  138. do
  139. {
  140. *y = -(*y);
  141. y += i;
  142. }
  143. while (y != st);
  144. }
  145. }
  146. CBLAS_CallFromC = 0;
  147. RowMajorStrg = 0;
  148. return;
  149. }