Home | History | Annotate | Download | only in src
      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 enum CBLAS_ORDER order, const enum 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 {
     17    char UL;
     18 #ifdef F77_CHAR
     19    F77_CHAR F77_UL;
     20 #else
     21    #define F77_UL &UL
     22 #endif
     23 
     24 #ifdef F77_INT
     25    F77_INT F77_N=N,  F77_incX=incX, F77_incY=incY;
     26 #else
     27    #define F77_N N
     28    #define F77_incX incx
     29    #define F77_incY incy
     30 #endif
     31    int n, i, j, tincx, tincy, incx=incX, incy=incY;
     32    float *x=(float *)X, *xx=(float *)X, *y=(float *)Y,
     33          *yy=(float *)Y, *tx, *ty, *stx, *sty;
     34 
     35    extern int CBLAS_CallFromC;
     36    extern int RowMajorStrg;
     37    RowMajorStrg = 0;
     38 
     39    CBLAS_CallFromC = 1;
     40    if (order == CblasColMajor)
     41    {
     42       if (Uplo == CblasLower) UL = 'L';
     43       else if (Uplo == CblasUpper) UL = 'U';
     44       else
     45       {
     46          cblas_xerbla(2, "cblas_chpr2","Illegal Uplo setting, %d\n",Uplo );
     47          CBLAS_CallFromC = 0;
     48          RowMajorStrg = 0;
     49          return;
     50       }
     51       #ifdef F77_CHAR
     52          F77_UL = C2F_CHAR(&UL);
     53       #endif
     54 
     55       F77_chpr2(F77_UL, &F77_N, alpha, X, &F77_incX, Y, &F77_incY, Ap);
     56 
     57    }  else if (order == CblasRowMajor)
     58    {
     59       RowMajorStrg = 1;
     60       if (Uplo == CblasUpper) UL = 'L';
     61       else if (Uplo == CblasLower) UL = 'U';
     62       else
     63       {
     64          cblas_xerbla(2, "cblas_chpr2","Illegal Uplo setting, %d\n", Uplo);
     65          CBLAS_CallFromC = 0;
     66          RowMajorStrg = 0;
     67          return;
     68       }
     69       #ifdef F77_CHAR
     70          F77_UL = C2F_CHAR(&UL);
     71       #endif
     72       if (N > 0)
     73       {
     74          n = N << 1;
     75          x = malloc(n*sizeof(float));
     76          y = malloc(n*sizeof(float));
     77          tx = x;
     78          ty = y;
     79          if( incX > 0 ) {
     80             i = incX << 1 ;
     81             tincx = 2;
     82             stx= x+n;
     83          } else {
     84             i = incX *(-2);
     85             tincx = -2;
     86             stx = x-2;
     87             x +=(n-2);
     88          }
     89 
     90          if( incY > 0 ) {
     91             j = incY << 1;
     92             tincy = 2;
     93             sty= y+n;
     94          } else {
     95             j = incY *(-2);
     96             tincy = -2;
     97             sty = y-2;
     98             y +=(n-2);
     99          }
    100 
    101          do
    102          {
    103             *x = *xx;
    104             x[1] = -xx[1];
    105             x += tincx ;
    106             xx += i;
    107          }
    108          while (x != stx);
    109          do
    110          {
    111             *y = *yy;
    112             y[1] = -yy[1];
    113             y += tincy ;
    114             yy += j;
    115          }
    116          while (y != sty);
    117 
    118          x=tx;
    119          y=ty;
    120 
    121          #ifdef F77_INT
    122             F77_incX = 1;
    123             F77_incY = 1;
    124          #else
    125             incx = 1;
    126             incy = 1;
    127          #endif
    128 
    129       }  else
    130       {
    131          x = (float *) X;
    132          y = (void  *) Y;
    133       }
    134       F77_chpr2(F77_UL, &F77_N, alpha, y, &F77_incY, x, &F77_incX, Ap);
    135    } else
    136    {
    137       cblas_xerbla(1, "cblas_chpr2","Illegal Order setting, %d\n", order);
    138       CBLAS_CallFromC = 0;
    139       RowMajorStrg = 0;
    140       return;
    141    }
    142    if(X!=x)
    143       free(x);
    144    if(Y!=y)
    145       free(y);
    146    CBLAS_CallFromC = 0;
    147    RowMajorStrg = 0;
    148    return;
    149 }
    150