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_zhpr2.c 3.3 kB

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