Home | History | Annotate | Download | only in src
      1 /*
      2  * cblas_zher.c
      3  * The program is a C interface to zher.
      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_zher(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
     13                 const int N, const double alpha, const void *X, const int incX
     14                 ,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 
     23 #ifdef F77_INT
     24    F77_INT F77_N=N, F77_lda=lda, F77_incX=incX;
     25 #else
     26    #define F77_N N
     27    #define F77_lda lda
     28    #define F77_incX incx
     29 #endif
     30    int n, i, tincx, incx=incX;
     31    double *x=(double *)X, *xx=(double *)X, *tx, *st;
     32 
     33    extern int CBLAS_CallFromC;
     34    extern int RowMajorStrg;
     35    RowMajorStrg = 0;
     36 
     37    CBLAS_CallFromC = 1;
     38    if (order == CblasColMajor)
     39    {
     40       if (Uplo == CblasLower) UL = 'L';
     41       else if (Uplo == CblasUpper) UL = 'U';
     42       else
     43       {
     44          cblas_xerbla(2, "cblas_zher","Illegal Uplo setting, %d\n",Uplo );
     45          CBLAS_CallFromC = 0;
     46          RowMajorStrg = 0;
     47          return;
     48       }
     49       #ifdef F77_CHAR
     50          F77_UL = C2F_CHAR(&UL);
     51       #endif
     52 
     53       F77_zher(F77_UL, &F77_N, &alpha, X, &F77_incX, A, &F77_lda);
     54 
     55    }  else if (order == CblasRowMajor)
     56    {
     57       RowMajorStrg = 1;
     58       if (Uplo == CblasUpper) UL = 'L';
     59       else if (Uplo == CblasLower) UL = 'U';
     60       else
     61       {
     62          cblas_xerbla(2, "cblas_zher","Illegal Uplo setting, %d\n", Uplo);
     63          CBLAS_CallFromC = 0;
     64          RowMajorStrg = 0;
     65          return;
     66       }
     67       #ifdef F77_CHAR
     68          F77_UL = C2F_CHAR(&UL);
     69       #endif
     70       if (N > 0)
     71       {
     72          n = N << 1;
     73          x = malloc(n*sizeof(double));
     74          tx = x;
     75          if( incX > 0 ) {
     76             i = incX << 1 ;
     77             tincx = 2;
     78             st= x+n;
     79          } else {
     80             i = incX *(-2);
     81             tincx = -2;
     82             st = x-2;
     83             x +=(n-2);
     84          }
     85          do
     86          {
     87             *x = *xx;
     88             x[1] = -xx[1];
     89             x += tincx ;
     90             xx += i;
     91          }
     92          while (x != st);
     93          x=tx;
     94 
     95          #ifdef F77_INT
     96            F77_incX = 1;
     97          #else
     98            incx = 1;
     99          #endif
    100       }
    101       else x = (double *) X;
    102       F77_zher(F77_UL, &F77_N, &alpha, x, &F77_incX, A, &F77_lda);
    103    } else cblas_xerbla(1, "cblas_zher", "Illegal Order setting, %d\n", order);
    104    if(X!=x)
    105       free(x);
    106 
    107    CBLAS_CallFromC = 0;
    108    RowMajorStrg = 0;
    109    return;
    110 }
    111