Fixing copyright issues and code contributors
[alexxy/gromacs.git] / src / gmxlib / gmx_blas / dtrmv.c
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2012,2013, by the GROMACS development team, led by
5  * David van der Spoel, Berk Hess, Erik Lindahl, and including many
6  * others, as listed in the AUTHORS file in the top-level source
7  * directory and at http://www.gromacs.org.
8  *
9  * GROMACS is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public License
11  * as published by the Free Software Foundation; either version 2.1
12  * of the License, or (at your option) any later version.
13  *
14  * GROMACS is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with GROMACS; if not, see
21  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
23  *
24  * If you want to redistribute modifications to GROMACS, please
25  * consider that scientific software is very special. Version
26  * control is crucial - bugs must be traceable. We will be happy to
27  * consider code for inclusion in the official distribution, but
28  * derived work must not be called official GROMACS. Details are found
29  * in the README & COPYING files - if they are missing, get the
30  * official version at http://www.gromacs.org.
31  *
32  * To help us fund GROMACS development, we humbly ask that you cite
33  * the research papers on the package. Check out http://www.gromacs.org.
34  */
35 #include <math.h>
36
37 #include <types/simple.h>
38 #include "gmx_blas.h"
39
40 void 
41 F77_FUNC(dtrmv,DTRMV)(const char *uplo, 
42        const char *trans,
43        const char *diag, 
44        int *n__, 
45        double *a, 
46        int *lda__, 
47        double *x, 
48        int *incx__)
49 {
50     int a_dim1, a_offset, i__1, i__2;
51
52     int i__, j, ix, jx, kx, info;
53     double temp;
54     int nounit;
55     
56     int n = *n__;
57     int lda = *lda__;
58     int incx = *incx__;
59     
60     a_dim1 = lda;
61     a_offset = 1 + a_dim1;
62     a -= a_offset;
63     --x;
64
65     info = 0;
66
67     if (n == 0) {
68         return;
69     }
70
71     nounit = (*diag=='n' || *diag=='N');
72
73     if (incx <= 0) {
74         kx = 1 - (n - 1) * incx;
75     } else {
76         kx = 1;
77     }
78
79     if (*trans=='N' || *trans=='n') {
80
81         if (*uplo=='U' || *uplo=='u') {
82             if (incx == 1) {
83                 i__1 = n;
84                 for (j = 1; j <= i__1; ++j) {
85                     if (fabs(x[j])>GMX_DOUBLE_MIN) {
86                         temp = x[j];
87                         i__2 = j - 1;
88                         for (i__ = 1; i__ <= i__2; ++i__) {
89                             x[i__] += temp * a[i__ + j * a_dim1];
90                         }
91                         if (nounit) {
92                             x[j] *= a[j + j * a_dim1];
93                         }
94                     }
95                 }
96             } else {
97                 jx = kx;
98                 i__1 = n;
99                 for (j = 1; j <= i__1; ++j) {
100                     if (fabs(x[jx])>GMX_DOUBLE_MIN) {
101                         temp = x[jx];
102                         ix = kx;
103                         i__2 = j - 1;
104                         for (i__ = 1; i__ <= i__2; ++i__) {
105                             x[ix] += temp * a[i__ + j * a_dim1];
106                             ix += incx;
107                         }
108                         if (nounit) {
109                             x[jx] *= a[j + j * a_dim1];
110                         }
111                     }
112                     jx += incx;
113                 }
114             }
115         } else {
116             if (incx == 1) {
117                 for (j = n; j >= 1; --j) {
118                     if (fabs(x[j])>GMX_DOUBLE_MIN) {
119                         temp = x[j];
120                         i__1 = j + 1;
121                         for (i__ = n; i__ >= i__1; --i__) {
122                             x[i__] += temp * a[i__ + j * a_dim1];
123                         }
124                         if (nounit) {
125                             x[j] *= a[j + j * a_dim1];
126                         }
127                     }
128                 }
129             } else {
130                 kx += (n - 1) * incx;
131                 jx = kx;
132                 for (j = n; j >= 1; --j) {
133                     if (fabs(x[jx])>GMX_DOUBLE_MIN) {
134                         temp = x[jx];
135                         ix = kx;
136                         i__1 = j + 1;
137                         for (i__ = n; i__ >= i__1; --i__) {
138                             x[ix] += temp * a[i__ + j * a_dim1];
139                             ix -= incx;
140                         }
141                         if (nounit) {
142                             x[jx] *= a[j + j * a_dim1];
143                         }
144                     }
145                     jx -= incx;
146                 }
147             }
148         }
149     } else {
150
151         if (*uplo=='U' || *uplo=='u') {
152             if (incx == 1) {
153                 for (j = n; j >= 1; --j) {
154                     temp = x[j];
155                     if (nounit) {
156                         temp *= a[j + j * a_dim1];
157                     }
158                     for (i__ = j - 1; i__ >= 1; --i__) {
159                         temp += a[i__ + j * a_dim1] * x[i__];
160                     }
161                     x[j] = temp;
162                 }
163             } else {
164                 jx = kx + (n - 1) * incx;
165                 for (j = n; j >= 1; --j) {
166                     temp = x[jx];
167                     ix = jx;
168                     if (nounit) {
169                         temp *= a[j + j * a_dim1];
170                     }
171                     for (i__ = j - 1; i__ >= 1; --i__) {
172                         ix -= incx;
173                         temp += a[i__ + j * a_dim1] * x[ix];
174                     }
175                     x[jx] = temp;
176                     jx -= incx;
177                 }
178             }
179         } else {
180             if (incx == 1) {
181                 i__1 = n;
182                 for (j = 1; j <= i__1; ++j) {
183                     temp = x[j];
184                     if (nounit) {
185                         temp *= a[j + j * a_dim1];
186                     }
187                     i__2 = n;
188                     for (i__ = j + 1; i__ <= i__2; ++i__) {
189                         temp += a[i__ + j * a_dim1] * x[i__];
190                     }
191                     x[j] = temp;
192                 }
193             } else {
194                 jx = kx;
195                 i__1 = n;
196                 for (j = 1; j <= i__1; ++j) {
197                     temp = x[jx];
198                     ix = jx;
199                     if (nounit) {
200                         temp *= a[j + j * a_dim1];
201                     }
202                     i__2 = n;
203                     for (i__ = j + 1; i__ <= i__2; ++i__) {
204                         ix += incx;
205                         temp += a[i__ + j * a_dim1] * x[ix];
206                     }
207                     x[jx] = temp;
208                     jx += incx;
209                 }
210             }
211         }
212     }
213
214     return;
215
216 }
217
218