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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /*
  2. * cblas_chpr2.c
  3. * The program is a C interface to chpr2.
  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_chpr2(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, tincx, tincy, incx=incX, incy=incY;
  30. float *x=(float *)X, *xx=(float *)X, *y=(float *)Y,
  31. *yy=(float *)Y, *tx, *ty, *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_chpr2","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_chpr2(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_chpr2","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(float));
  70. y = malloc(n*sizeof(float));
  71. tx = x;
  72. ty = y;
  73. if( incX > 0 ) {
  74. i = incX << 1 ;
  75. tincx = 2;
  76. stx= x+n;
  77. } else {
  78. i = incX *(-2);
  79. tincx = -2;
  80. stx = x-2;
  81. x +=(n-2);
  82. }
  83. if( incY > 0 ) {
  84. j = incY << 1;
  85. tincy = 2;
  86. sty= y+n;
  87. } else {
  88. j = incY *(-2);
  89. tincy = -2;
  90. sty = y-2;
  91. y +=(n-2);
  92. }
  93. do
  94. {
  95. *x = *xx;
  96. x[1] = -xx[1];
  97. x += tincx ;
  98. xx += i;
  99. }
  100. while (x != stx);
  101. do
  102. {
  103. *y = *yy;
  104. y[1] = -yy[1];
  105. y += tincy ;
  106. yy += j;
  107. }
  108. while (y != sty);
  109. x=tx;
  110. y=ty;
  111. #ifdef F77_INT
  112. F77_incX = 1;
  113. F77_incY = 1;
  114. #else
  115. incx = 1;
  116. incy = 1;
  117. #endif
  118. } else
  119. {
  120. x = (float *) X;
  121. y = (void *) Y;
  122. }
  123. F77_chpr2(F77_UL, &F77_N, alpha, y, &F77_incY, x, &F77_incX, Ap);
  124. } else
  125. {
  126. cblas_xerbla(1, "cblas_chpr2","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. }