|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- /*
- * cblas_zhpr2.c
- * The program is a C interface to zhpr2.
- *
- * Keita Teranishi 5/20/98
- *
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include "cblas.h"
- #include "cblas_f77.h"
- void cblas_zhpr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo,
- const int N,const void *alpha, const void *X,
- const int incX,const void *Y, const int incY, void *Ap)
-
- {
- char UL;
- #ifdef F77_CHAR
- F77_CHAR F77_UL;
- #else
- #define F77_UL &UL
- #endif
-
- #ifdef F77_INT
- F77_INT F77_N=N, F77_incX=incX, F77_incY=incY;
- #else
- #define F77_N N
- #define F77_incX incx
- #define F77_incY incy
- #endif
- int n, i, j, incx=incX, incy=incY;
- double *x=(double *)X, *xx=(double *)X, *y=(double *)Y,
- *yy=(double *)Y, *stx, *sty;
-
- extern int CBLAS_CallFromC;
- extern int RowMajorStrg;
- RowMajorStrg = 0;
-
- CBLAS_CallFromC = 1;
- if (layout == CblasColMajor)
- {
- if (Uplo == CblasLower) UL = 'L';
- else if (Uplo == CblasUpper) UL = 'U';
- else
- {
- cblas_xerbla(2, "cblas_zhpr2","Illegal Uplo setting, %d\n",Uplo );
- CBLAS_CallFromC = 0;
- RowMajorStrg = 0;
- return;
- }
- #ifdef F77_CHAR
- F77_UL = C2F_CHAR(&UL);
- #endif
-
- F77_zhpr2(F77_UL, &F77_N, alpha, X, &F77_incX, Y, &F77_incY, Ap);
-
- } else if (layout == CblasRowMajor)
- {
- RowMajorStrg = 1;
- if (Uplo == CblasUpper) UL = 'L';
- else if (Uplo == CblasLower) UL = 'U';
- else
- {
- cblas_xerbla(2, "cblas_zhpr2","Illegal Uplo setting, %d\n", Uplo);
- CBLAS_CallFromC = 0;
- RowMajorStrg = 0;
- return;
- }
- #ifdef F77_CHAR
- F77_UL = C2F_CHAR(&UL);
- #endif
- if (N > 0)
- {
- n = N << 1;
- x = malloc(n*sizeof(double));
- y = malloc(n*sizeof(double));
- stx = x + n;
- sty = y + n;
- if( incX > 0 )
- i = incX << 1;
- else
- i = incX *(-2);
-
- if( incY > 0 )
- j = incY << 1;
- else
- j = incY *(-2);
- do
- {
- *x = *xx;
- x[1] = -xx[1];
- x += 2;
- xx += i;
- } while (x != stx);
- do
- {
- *y = *yy;
- y[1] = -yy[1];
- y += 2;
- yy += j;
- }
- while (y != sty);
- x -= n;
- y -= n;
-
- #ifdef F77_INT
- if(incX > 0 )
- F77_incX = 1;
- else
- F77_incX = -1;
-
- if(incY > 0 )
- F77_incY = 1;
- else
- F77_incY = -1;
-
- #else
- if(incX > 0 )
- incx = 1;
- else
- incx = -1;
-
- if(incY > 0 )
- incy = 1;
- else
- incy = -1;
- #endif
-
- } else
- {
- x = (double *) X;
- y = (void *) Y;
- }
- F77_zhpr2(F77_UL, &F77_N, alpha, y, &F77_incY, x, &F77_incX, Ap);
- }
- else
- {
- cblas_xerbla(1, "cblas_zhpr2","Illegal layout setting, %d\n", layout);
- CBLAS_CallFromC = 0;
- RowMajorStrg = 0;
- return;
- }
- if(X!=x)
- free(x);
- if(Y!=y)
- free(y);
- CBLAS_CallFromC = 0;
- RowMajorStrg = 0;
- return;
- }
|