1 /*
2 * cblas_chemv.c
3 * The program is a C interface to chemv
4 *
5 * Keita Teranishi 5/18/98
6 *
7 */
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include "cblas.h"
11 #include "cblas_f77.h"
cblas_chemv(const enum CBLAS_ORDER order,const enum CBLAS_UPLO Uplo,const int N,const void * alpha,const void * A,const int lda,const void * X,const int incX,const void * beta,void * Y,const int incY)12 void cblas_chemv(const enum CBLAS_ORDER order,
13 const enum CBLAS_UPLO Uplo, const int N,
14 const void *alpha, const void *A, const int lda,
15 const void *X, const int incX, const void *beta,
16 void *Y, const int incY)
17 {
18 char UL;
19 #ifdef F77_CHAR
20 F77_CHAR F77_UL;
21 #else
22 #define F77_UL &UL
23 #endif
24 #ifdef F77_INT
25 F77_INT F77_N=N, F77_lda=lda, F77_incX=incX, F77_incY=incY;
26 #else
27 #define F77_N N
28 #define F77_lda lda
29 #define F77_incX incx
30 #define F77_incY incY
31 #endif
32 int n=0, i=0, incx=incX;
33 const float *xx= (float *)X, *alp= (float *)alpha, *bet = (float *)beta;
34 float ALPHA[2],BETA[2];
35 int tincY, tincx;
36 float *x=(float *)X, *y=(float *)Y, *st=0, *tx;
37 extern int CBLAS_CallFromC;
38 extern int RowMajorStrg;
39 RowMajorStrg = 0;
40
41
42 CBLAS_CallFromC = 1;
43 if (order == CblasColMajor)
44 {
45 if (Uplo == CblasUpper) UL = 'U';
46 else if (Uplo == CblasLower) UL = 'L';
47 else
48 {
49 cblas_xerbla(2, "cblas_chemv","Illegal Uplo setting, %d\n",Uplo );
50 CBLAS_CallFromC = 0;
51 RowMajorStrg = 0;
52 return;
53 }
54 #ifdef F77_CHAR
55 F77_UL = C2F_CHAR(&UL);
56 #endif
57 F77_chemv(F77_UL, &F77_N, alpha, A, &F77_lda, X, &F77_incX,
58 beta, Y, &F77_incY);
59 }
60 else if (order == CblasRowMajor)
61 {
62 RowMajorStrg = 1;
63 ALPHA[0]= *alp;
64 ALPHA[1]= -alp[1];
65 BETA[0]= *bet;
66 BETA[1]= -bet[1];
67
68 if (N > 0)
69 {
70 n = N << 1;
71 x = malloc(n*sizeof(float));
72
73 tx = x;
74 if( incX > 0 ) {
75 i = incX << 1 ;
76 tincx = 2;
77 st= x+n;
78 } else {
79 i = incX *(-2);
80 tincx = -2;
81 st = x-2;
82 x +=(n-2);
83 }
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
96 #ifdef F77_INT
97 F77_incX = 1;
98 #else
99 incx = 1;
100 #endif
101
102 if(incY > 0)
103 tincY = incY;
104 else
105 tincY = -incY;
106 y++;
107
108 i = tincY << 1;
109 n = i * N ;
110 st = y + n;
111 do {
112 *y = -(*y);
113 y += i;
114 } while(y != st);
115 y -= n;
116 } else
117 x = (float *) X;
118
119
120 if (Uplo == CblasUpper) UL = 'L';
121 else if (Uplo == CblasLower) UL = 'U';
122 else
123 {
124 cblas_xerbla(2, "cblas_chemv","Illegal Uplo setting, %d\n", Uplo);
125 CBLAS_CallFromC = 0;
126 RowMajorStrg = 0;
127 return;
128 }
129 #ifdef F77_CHAR
130 F77_UL = C2F_CHAR(&UL);
131 #endif
132 F77_chemv(F77_UL, &F77_N, ALPHA, A, &F77_lda, x, &F77_incX,
133 BETA, Y, &F77_incY);
134 }
135 else
136 {
137 cblas_xerbla(1, "cblas_chemv","Illegal Order setting, %d\n", order);
138 CBLAS_CallFromC = 0;
139 RowMajorStrg = 0;
140 return;
141 }
142 if ( order == CblasRowMajor )
143 {
144 RowMajorStrg = 1;
145 if ( X != x )
146 free(x);
147 if (N > 0)
148 {
149 do
150 {
151 *y = -(*y);
152 y += i;
153 }
154 while (y != st);
155 }
156 }
157 CBLAS_CallFromC = 0;
158 RowMajorStrg = 0;
159 return;
160 }
161