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_cher2.c 3.4 kB

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