Added MACS source
[htsworkflow.git] / htswanalysis / MACS / lib / gsl / gsl-1.11 / cblas / source_gemv_r.h
1 /* blas/source_gemv_r.h
2  * 
3  * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
4  * 
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 3 of the License, or (at
8  * your option) any later version.
9  * 
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License for more details.
14  * 
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18  */
19
20 {
21   INDEX i, j;
22   INDEX lenX, lenY;
23
24   const int Trans = (TransA != CblasConjTrans) ? TransA : CblasTrans;
25
26   if (M == 0 || N == 0)
27     return;
28
29   if (alpha == 0.0 && beta == 1.0)
30     return;
31
32   if (Trans == CblasNoTrans) {
33     lenX = N;
34     lenY = M;
35   } else {
36     lenX = M;
37     lenY = N;
38   }
39
40   /* form  y := beta*y */
41   if (beta == 0.0) {
42     INDEX iy = OFFSET(lenY, incY);
43     for (i = 0; i < lenY; i++) {
44       Y[iy] = 0.0;
45       iy += incY;
46     }
47   } else if (beta != 1.0) {
48     INDEX iy = OFFSET(lenY, incY);
49     for (i = 0; i < lenY; i++) {
50       Y[iy] *= beta;
51       iy += incY;
52     }
53   }
54
55   if (alpha == 0.0)
56     return;
57
58   if ((order == CblasRowMajor && Trans == CblasNoTrans)
59       || (order == CblasColMajor && Trans == CblasTrans)) {
60     /* form  y := alpha*A*x + y */
61     INDEX iy = OFFSET(lenY, incY);
62     for (i = 0; i < lenY; i++) {
63       BASE temp = 0.0;
64       INDEX ix = OFFSET(lenX, incX);
65       for (j = 0; j < lenX; j++) {
66         temp += X[ix] * A[lda * i + j];
67         ix += incX;
68       }
69       Y[iy] += alpha * temp;
70       iy += incY;
71     }
72   } else if ((order == CblasRowMajor && Trans == CblasTrans)
73              || (order == CblasColMajor && Trans == CblasNoTrans)) {
74     /* form  y := alpha*A'*x + y */
75     INDEX ix = OFFSET(lenX, incX);
76     for (j = 0; j < lenX; j++) {
77       const BASE temp = alpha * X[ix];
78       if (temp != 0.0) {
79         INDEX iy = OFFSET(lenY, incY);
80         for (i = 0; i < lenY; i++) {
81           Y[iy] += temp * A[lda * j + i];
82           iy += incY;
83         }
84       }
85       ix += incX;
86     }
87   } else {
88     BLAS_ERROR("unrecognized operation");
89   }
90 }