Line data Source code
1 : /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 : These files are semi-automatic translations by f2c from the original netlib BLAS library.
3 : The source has been modified to (mostly) use modern C formatting, and to get rid of
4 : compiler warnings. Any errors in doing this should be blamed on the GROMACS developers, and
5 : not the reference BLAS implementation.
6 :
7 : The reference BLAS implementation is available from http://www.netlib.org/blas
8 :
9 : BLAS does not come with a formal named "license", but a general statement that
10 :
11 : "The reference BLAS is a freely-available software package. It is available from netlib
12 : via anonymous ftp and the World Wide Web. Thus, it can be included in commercial software
13 : packages (and has been). We only ask that proper credit be given to the authors."
14 :
15 : While the rest of GROMACS is LGPL, we think it's only fair to give you the same rights to
16 : our modified BLAS files as the original netlib versions, so do what you want with them.
17 : However, be warned that we have only tested that they to the right thing in the cases used
18 : in GROMACS (primarily full & sparse matrix diagonalization), so in most cases it is a much
19 : better idea to use the full reference implementation.
20 :
21 : Erik Lindahl, 2008-10-07.
22 : +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
23 : #if ! defined (__PLUMED_HAS_EXTERNAL_BLAS)
24 : #include <cmath>
25 : #include "blas.h"
26 :
27 : namespace PLMD{
28 : namespace blas{
29 : double
30 0 : PLUMED_BLAS_F77_FUNC(dasum,DASUM)(int *n__,
31 : double *dx,
32 : int *incx__)
33 : {
34 : int i__1, i__2;
35 :
36 : int i__, m, mp1;
37 : double dtemp;
38 : int nincx;
39 :
40 0 : int n = *n__;
41 0 : int incx = *incx__;
42 :
43 0 : --dx;
44 :
45 : dtemp = 0.;
46 0 : if (n <= 0 || incx <= 0) {
47 : return 0.0;
48 : }
49 0 : if (incx != 1) {
50 0 : nincx = n * incx;
51 : i__1 = nincx;
52 : i__2 = incx;
53 0 : for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) {
54 0 : dtemp += std::abs(dx[i__]);
55 : }
56 : return dtemp;
57 : }
58 :
59 0 : m = n % 6;
60 0 : if (m != 0) {
61 : i__2 = m;
62 0 : for (i__ = 1; i__ <= i__2; ++i__) {
63 0 : dtemp += std::abs(dx[i__]);
64 : }
65 0 : if (n < 6) {
66 : return dtemp;
67 : }
68 : }
69 0 : mp1 = m + 1;
70 : i__2 = n;
71 0 : for (i__ = mp1; i__ <= i__2; i__ += 6) {
72 0 : dtemp = dtemp + std::abs(dx[i__]) + std::abs(dx[i__ + 1]) +
73 0 : std::abs(dx[i__ + 2]) + std::abs(dx[i__+ 3]) + std::abs(dx[i__ + 4]) +
74 0 : std::abs(dx[i__ + 5]);
75 : }
76 : return dtemp;
77 : }
78 :
79 :
80 : }
81 : }
82 : #include "blas.h"
83 :
84 :
85 : namespace PLMD{
86 : namespace blas{
87 : void
88 1114408 : PLUMED_BLAS_F77_FUNC(daxpy,DAXPY)(int * n_arg,
89 : double * da_arg,
90 : double * dx,
91 : int * incx_arg,
92 : double * dy,
93 : int * incy_arg)
94 : {
95 : int i,ix,iy;
96 1114408 : int n=*n_arg;
97 1114408 : double da=*da_arg;
98 1114408 : int incx = *incx_arg;
99 1114408 : int incy = *incy_arg;
100 :
101 1114408 : if (n<=0)
102 : return;
103 :
104 1114408 : if(incx!=1 || incy!=1) {
105 : ix = 0;
106 : iy = 0;
107 0 : if(incx<0)
108 0 : ix = (1-n)*incx;
109 0 : if(incy<0)
110 0 : iy = (1-n)*incy;
111 :
112 0 : for(i=0;i<n;i++,ix+=incx,iy+=incy)
113 0 : dy[iy] += da*dx[ix];
114 :
115 : return;
116 :
117 : } else {
118 :
119 : /* unroll */
120 :
121 1162445 : for(i=0;i<(n-4);i+=4) {
122 48037 : dy[i] += da*dx[i];
123 48037 : dy[i+1] += da*dx[i+1];
124 48037 : dy[i+2] += da*dx[i+2];
125 48037 : dy[i+3] += da*dx[i+3];
126 : }
127 : /* continue with current value of i */
128 3900117 : for(;i<n;i++)
129 2785709 : dy[i] += da*dx[i];
130 : }
131 : }
132 : }
133 : }
134 : #include "blas.h"
135 :
136 : namespace PLMD{
137 : namespace blas{
138 : void
139 4000772 : PLUMED_BLAS_F77_FUNC(dcopy,DCOPY)(int *n__,
140 : double *dx,
141 : int *incx__,
142 : double *dy,
143 : int *incy__)
144 : {
145 : int i,ix,iy;
146 :
147 4000772 : int n= *n__;
148 4000772 : int incx = *incx__;
149 4000772 : int incy = *incy__;
150 :
151 :
152 4000772 : if(incx!=1 || incy!=1) {
153 : ix = 0;
154 : iy = 0;
155 6132 : if(incx<0)
156 0 : ix = (1-n)*(incx);
157 6132 : if(incy<0)
158 0 : iy = (1-n)*(incy);
159 :
160 1183902 : for(i=0;i<n;i++,ix+=incx,iy+=incy)
161 1177770 : dy[iy] = dx[ix];
162 :
163 : return;
164 :
165 : } else {
166 :
167 : /* unroll */
168 :
169 4101553 : for(i=0;i<(n-8);i+=8) {
170 106913 : dy[i] = dx[i];
171 106913 : dy[i+1] = dx[i+1];
172 106913 : dy[i+2] = dx[i+2];
173 106913 : dy[i+3] = dx[i+3];
174 106913 : dy[i+4] = dx[i+4];
175 106913 : dy[i+5] = dx[i+5];
176 106913 : dy[i+6] = dx[i+6];
177 106913 : dy[i+7] = dx[i+7];
178 : }
179 : /* continue with current value of i */
180 16426615 : for(;i<n;i++)
181 12431975 : dy[i] = dx[i];
182 : }
183 : }
184 : }
185 : }
186 : #include "blas.h"
187 :
188 : namespace PLMD{
189 : namespace blas{
190 : double
191 1114409 : PLUMED_BLAS_F77_FUNC(ddot,DDOT)(int *n_arg,
192 : double *dx,
193 : int *incx_arg,
194 : double *dy,
195 : int *incy_arg)
196 : {
197 : int i,ix,iy,m;
198 1114409 : int n=*n_arg;
199 1114409 : int incx = *incx_arg;
200 1114409 : int incy = *incy_arg;
201 : double t1;
202 :
203 1114409 : if(n<=0)
204 : return 0.0;
205 :
206 : t1 = 0.0;
207 :
208 1114409 : if(incx!=1 || incy!=1) {
209 : ix = 0;
210 : iy = 0;
211 0 : if(incx<0)
212 0 : ix = (1-n)*incx;
213 0 : if(incy<0)
214 0 : iy = (1-n)*incy;
215 :
216 0 : for(i=0;i<n;i++,ix+=incx,iy+=incy)
217 0 : t1 += dx[ix] * dy[iy];
218 :
219 : return t1;
220 :
221 : } else {
222 :
223 1114409 : m = n%5;
224 :
225 3899271 : for(i=0;i<m;i++)
226 2784862 : t1 += dx[i] * dy[i];
227 :
228 : /* unroll */
229 1153009 : for(i=m;i<n;i+=5)
230 38600 : t1 = t1 + dx[i] * dy[i]
231 38600 : + dx[i+1] * dy[i+1]
232 38600 : + dx[i+2] * dy[i+2]
233 38600 : + dx[i+3] * dy[i+3]
234 38600 : + dx[i+4] * dy[i+4];
235 :
236 : return t1;
237 : }
238 : }
239 :
240 :
241 : }
242 : }
243 : #include <cctype>
244 : #include <cmath>
245 :
246 : #include "real.h"
247 :
248 : #include "blas.h"
249 :
250 : namespace PLMD{
251 : namespace blas{
252 : void
253 520 : PLUMED_BLAS_F77_FUNC(dgemm,DGEMM)(const char *transa,
254 : const char *transb,
255 : int *m__,
256 : int *n__,
257 : int *k__,
258 : double *alpha__,
259 : double *a,
260 : int *lda__,
261 : double *b,
262 : int *ldb__,
263 : double *beta__,
264 : double *c,
265 : int *ldc__)
266 : {
267 520 : const char tra=std::toupper(*transa);
268 520 : const char trb=std::toupper(*transb);
269 : double temp;
270 : int i,j,l;
271 :
272 520 : int m = *m__;
273 520 : int n = *n__;
274 520 : int k = *k__;
275 520 : int lda = *lda__;
276 520 : int ldb = *ldb__;
277 520 : int ldc = *ldc__;
278 :
279 520 : double alpha = *alpha__;
280 520 : double beta = *beta__;
281 :
282 520 : if(m==0 || n==0 || (( std::abs(alpha)<PLUMED_GMX_DOUBLE_MIN || k==0) && std::abs(beta-1.0)<PLUMED_GMX_DOUBLE_EPS))
283 : return;
284 :
285 471 : if(std::abs(alpha)<PLUMED_GMX_DOUBLE_MIN) {
286 0 : if(std::abs(beta)<PLUMED_GMX_DOUBLE_MIN) {
287 0 : for(j=0;j<n;j++)
288 0 : for(i=0;i<m;i++)
289 0 : c[j*(ldc)+i] = 0.0;
290 : } else {
291 : /* nonzero beta */
292 0 : for(j=0;j<n;j++)
293 0 : for(i=0;i<m;i++)
294 0 : c[j*(ldc)+i] *= beta;
295 : }
296 0 : return;
297 : }
298 :
299 471 : if(trb=='N') {
300 354 : if(tra=='N') {
301 :
302 17396 : for(j=0;j<n;j++) {
303 17120 : if(std::abs(beta)<PLUMED_GMX_DOUBLE_MIN) {
304 934292 : for(i=0;i<m;i++)
305 924369 : c[j*(ldc)+i] = 0.0;
306 7197 : } else if(std::abs(beta-1.0)>PLUMED_GMX_DOUBLE_EPS) {
307 0 : for(i=0;i<m;i++)
308 0 : c[j*(ldc)+i] *= beta;
309 : }
310 898860 : for(l=0;l<k;l++) {
311 881740 : if( std::abs(b[ j*(ldb) + l ])>PLUMED_GMX_DOUBLE_MIN) {
312 879210 : temp = alpha * b[ j*(ldb) + l ];
313 223022936 : for(i=0;i<m;i++)
314 222143726 : c[j*(ldc)+i] += temp * a[l*(lda)+i];
315 : }
316 : }
317 : }
318 : } else {
319 : /* transpose A, but not B */
320 2290 : for(j=0;j<n;j++) {
321 599172 : for(i=0;i<m;i++) {
322 : temp = 0.0;
323 126807456 : for(l=0;l<k;l++)
324 126210496 : temp += a[i*(lda)+l] * b[j*(ldb)+l];
325 596960 : if(std::abs(beta)<PLUMED_GMX_DOUBLE_MIN)
326 0 : c[j*(ldc)+i] = alpha * temp;
327 : else
328 596960 : c[j*(ldc)+i] = alpha * temp + beta * c[j*(ldc)+i];
329 : }
330 : }
331 : }
332 : } else {
333 : /* transpose B */
334 117 : if(tra=='N') {
335 :
336 : /* transpose B, but not A */
337 :
338 24143 : for(j=0;j<n;j++) {
339 24026 : if(std::abs(beta)<PLUMED_GMX_DOUBLE_MIN) {
340 0 : for(i=0;i<m;i++)
341 0 : c[j*(ldc)+i] = 0.0;
342 24026 : } else if(std::abs(beta-1.0)>PLUMED_GMX_DOUBLE_EPS) {
343 0 : for(i=0;i<m;i++)
344 0 : c[j*(ldc)+i] *= beta;
345 : }
346 851290 : for(l=0;l<k;l++) {
347 827264 : if( std::abs(b[ l*(ldb) + j ])>PLUMED_GMX_DOUBLE_MIN) {
348 714726 : temp = alpha * b[ l*(ldb) + j ];
349 208048410 : for(i=0;i<m;i++)
350 207333684 : c[j*(ldc)+i] += temp * a[l*(lda)+i];
351 : }
352 : }
353 : }
354 :
355 : } else {
356 : /* Transpose both A and B */
357 0 : for(j=0;j<n;j++) {
358 0 : for(i=0;i<m;i++) {
359 : temp = 0.0;
360 0 : for(l=0;l<k;l++)
361 0 : temp += a[i*(lda)+l] * b[l*(ldb)+j];
362 0 : if(std::abs(beta)<PLUMED_GMX_DOUBLE_MIN)
363 0 : c[j*(ldc)+i] = alpha * temp;
364 : else
365 0 : c[j*(ldc)+i] = alpha * temp + beta * c[j*(ldc)+i];
366 : }
367 : }
368 : }
369 : }
370 : }
371 : }
372 : }
373 : #include <cctype>
374 : #include <cmath>
375 :
376 : #include "real.h"
377 :
378 : #include "blas.h"
379 :
380 : namespace PLMD{
381 : namespace blas{
382 : void
383 1131535 : PLUMED_BLAS_F77_FUNC(dgemv,DGEMV)(const char *trans,
384 : int *m__,
385 : int *n__,
386 : double *alpha__,
387 : double *a,
388 : int *lda__,
389 : double *x,
390 : int *incx__,
391 : double *beta__,
392 : double *y,
393 : int *incy__)
394 : {
395 1131535 : const char ch=std::toupper(*trans);
396 : int lenx,leny,kx,ky;
397 : int i,j,jx,jy,ix,iy;
398 : double temp;
399 :
400 1131535 : int m = *m__;
401 1131535 : int n = *n__;
402 1131535 : double alpha = *alpha__;
403 1131535 : double beta = *beta__;
404 1131535 : int incx = *incx__;
405 1131535 : int incy = *incy__;
406 1131535 : int lda = *lda__;
407 :
408 1131535 : if(n<=0 || m<=0 || (std::abs(alpha)<PLUMED_GMX_DOUBLE_MIN && std::abs(beta-1.0)<PLUMED_GMX_DOUBLE_EPS))
409 : return;
410 :
411 1131343 : if(ch=='N') {
412 : lenx = n;
413 : leny = m;
414 : } else {
415 : lenx = m;
416 : leny = n;
417 : }
418 :
419 1131343 : if(incx>0)
420 : kx = 1;
421 : else
422 0 : kx = 1 - (lenx -1)*(incx);
423 :
424 1131343 : if(incy>0)
425 : ky = 1;
426 : else
427 0 : ky = 1 - (leny -1)*(incy);
428 :
429 1131343 : if(std::abs(beta-1.0)>PLUMED_GMX_DOUBLE_EPS) {
430 1126310 : if(incy==1) {
431 1126310 : if(std::abs(beta)<PLUMED_GMX_DOUBLE_MIN)
432 2736412 : for(i=0;i<leny;i++)
433 1610102 : y[i] = 0.0;
434 : else
435 0 : for(i=0;i<leny;i++)
436 0 : y[i] *= beta;
437 : } else {
438 : /* non-unit incr. */
439 : iy = ky;
440 0 : if(std::abs(beta)<PLUMED_GMX_DOUBLE_MIN)
441 0 : for(i=0;i<leny;i++,iy+=incy)
442 0 : y[iy] = 0.0;
443 : else
444 0 : for(i=0;i<leny;i++,iy+=incy)
445 0 : y[iy] *= beta;
446 : }
447 : }
448 :
449 1131343 : if(std::abs(alpha)<PLUMED_GMX_DOUBLE_MIN)
450 : return;
451 :
452 1131343 : if(ch=='N') {
453 : jx = kx;
454 9325 : if(incy==1) {
455 474392 : for(j=1;j<=n;j++,jx+=incx)
456 465451 : if(std::abs(x[jx-1])>PLUMED_GMX_DOUBLE_MIN) {
457 465451 : temp = alpha * x[jx-1];
458 63040550 : for(i=1;i<=m;i++)
459 62575099 : y[i-1] += temp * a[(j-1)*(lda)+(i-1)];
460 : }
461 : } else {
462 : /* non-unit y incr. */
463 6720 : for(j=1;j<=n;j++,jx+=incx)
464 6336 : if(std::abs(x[jx-1])>PLUMED_GMX_DOUBLE_MIN) {
465 6336 : temp = alpha * x[jx-1];
466 : iy = ky;
467 1921920 : for(i=1;i<=m;i++,iy+=incy)
468 1915584 : y[iy-1] += temp * a[(j-1)*(lda)+(i-1)];
469 : }
470 : }
471 : } else {
472 : /* transpose */
473 : jy = ky;
474 1122018 : if(incx==1) {
475 2638116 : for(j=1;j<=n;j++,jy+=incy) {
476 : temp = 0.0;
477 60769798 : for(i=1;i<=m;i++)
478 59252944 : temp += a[(j-1)*(lda)+(i-1)] * x[i-1];
479 1516854 : y[jy-1] += alpha * temp;
480 : }
481 : } else {
482 : /* non-unit y incr. */
483 121296 : for(j=1;j<=n;j++,jy+=incy) {
484 : temp = 0.0;
485 : ix = kx;
486 3833628 : for(i=1;i<=m;i++,ix+=incx)
487 3713088 : temp += a[(j-1)*(lda)+(i-1)] * x[ix-1];
488 120540 : y[jy-1] += alpha * temp;
489 : }
490 : }
491 : }
492 : }
493 :
494 : }
495 : }
496 : #include <cmath>
497 :
498 : #include "real.h"
499 :
500 : #include "blas.h"
501 :
502 : namespace PLMD{
503 : namespace blas{
504 : void
505 1119685 : PLUMED_BLAS_F77_FUNC(dger,DGER)(int *m__,
506 : int *n__,
507 : double *alpha__,
508 : double *x,
509 : int *incx__,
510 : double *y,
511 : int *incy__,
512 : double *a,
513 : int *lda__)
514 : {
515 : int ix,kx,jy;
516 : int i,j;
517 : double temp;
518 :
519 :
520 1119685 : int m = *m__;
521 1119685 : int n = *n__;
522 1119685 : int incx = *incx__;
523 1119685 : int incy = *incy__;
524 1119685 : int lda = *lda__;
525 1119685 : double alpha = *alpha__;
526 :
527 1119685 : if(m<=0 || n<=0 || std::abs(alpha)<PLUMED_GMX_DOUBLE_MIN)
528 : return;
529 :
530 1119685 : if(incy>0)
531 : jy = 0;
532 : else
533 0 : jy = incy * (1 - n);
534 :
535 1119685 : if(incx==1) {
536 2387900 : for(j=0;j<n;j++,jy+=incy)
537 1268215 : if(std::abs(y[jy])>PLUMED_GMX_DOUBLE_MIN) {
538 1268207 : temp = alpha * y[jy];
539 6935852 : for(i=0;i<m;i++)
540 5667645 : a[j*(lda)+i] += temp*x[i];
541 : }
542 : } else {
543 : /* non-unit incx */
544 0 : if(incx>0)
545 : kx = 0;
546 : else
547 0 : kx = incx * (1 - m);
548 :
549 0 : for(j=0;j<n;j++,jy+=incy) {
550 0 : if(std::abs(y[jy])>PLUMED_GMX_DOUBLE_MIN) {
551 0 : temp = alpha * y[jy];
552 : ix = kx;
553 0 : for(i=0;i<m;i++,ix+=incx)
554 0 : a[j*(lda)+i] += temp*x[ix];
555 : }
556 : }
557 : }
558 : return;
559 : }
560 : }
561 : }
562 : #include <cmath>
563 :
564 : #include "real.h"
565 : #include "blas.h"
566 :
567 : namespace PLMD{
568 : namespace blas{
569 : double
570 1125776 : PLUMED_BLAS_F77_FUNC(dnrm2,DNRM2)(int * n__,
571 : double * x,
572 : int * incx__)
573 : {
574 : int ix,max_ix;
575 : double ssq,scale,absxi,t;
576 :
577 1125776 : int n = *n__;
578 1125776 : int incx = *incx__;
579 :
580 1125776 : if(n<1 || incx<1)
581 : return 0;
582 1125776 : else if (n==1) {
583 556841 : t = x[0];
584 556841 : if(t>=0)
585 : return t;
586 : else
587 417153 : return -t;
588 : }
589 :
590 : scale = 0.0;
591 : ssq = 1.0;
592 :
593 568935 : max_ix = 1+(n-1)*(incx);
594 3017084 : for(ix=1;ix<=max_ix;ix+=incx) {
595 2448149 : t = x[ix-1];
596 2448149 : if(std::abs(t)>PLUMED_GMX_DOUBLE_MIN) {
597 2447160 : absxi = (t>=0) ? t : (-t);
598 2447160 : if(scale<absxi) {
599 823428 : t = scale/absxi;
600 823428 : t = t*t;
601 823428 : ssq = ssq*t + 1.0;
602 : scale = absxi;
603 : } else {
604 1623732 : t = absxi/scale;
605 1623732 : ssq += t*t;
606 : }
607 : }
608 : }
609 568935 : return scale*std::sqrt(ssq);
610 :
611 : }
612 :
613 :
614 :
615 : }
616 : }
617 : #include "blas.h"
618 :
619 : namespace PLMD{
620 : namespace blas{
621 : void
622 360 : PLUMED_BLAS_F77_FUNC(drot,DROT)(int *n__,
623 : double *dx,
624 : int *incx__,
625 : double *dy,
626 : int *incy__,
627 : double *c__,
628 : double *s__)
629 : {
630 : int i,ix,iy;
631 : double dtemp;
632 :
633 360 : int n = *n__;
634 360 : int incx = *incx__;
635 360 : int incy = *incy__;
636 360 : double c = *c__;
637 360 : double s = *s__;
638 :
639 360 : if(incx!=1 || incy!=1) {
640 : ix = 0;
641 : iy = 0;
642 180 : if(incx<0)
643 0 : ix = (1-n)*(incx);
644 180 : if(incy<0)
645 0 : iy = (1-n)*(incy);
646 :
647 3136 : for(i=0;i<n;i++,ix+=incx,iy+=incy) {
648 2956 : dtemp = (c) * dx[ix] + (s) * dy[iy];
649 2956 : dy[iy] = (c) * dy[iy] - (s) * dx[ix];
650 2956 : dx[ix] = dtemp;
651 : }
652 :
653 : return;
654 :
655 : } else {
656 :
657 : /* unit increments */
658 3075 : for(i=0;i<n;i++) {
659 2895 : dtemp = (c) * dx[i] + (s) * dy[i];
660 2895 : dy[i] = (c) * dy[i] - (s) * dx[i];
661 2895 : dx[i] = dtemp;
662 : }
663 :
664 : }
665 : }
666 : }
667 : }
668 : #include "blas.h"
669 :
670 : namespace PLMD{
671 : namespace blas{
672 : void
673 1728052 : PLUMED_BLAS_F77_FUNC(dscal,DSCAL)(int * n__,
674 : double * fact__,
675 : double * dx,
676 : int * incx__)
677 : {
678 : int nincx,i;
679 :
680 1728052 : int n = *n__;
681 1728052 : double fact = *fact__;
682 1728052 : int incx = *incx__;
683 :
684 1728052 : if(n<=0 || incx<=0)
685 : return;
686 :
687 1727995 : if(incx==1) {
688 : /* Unrool factor 5 */
689 1912098 : for(i=0;i<(n-5);i+=5) {
690 186986 : dx[i] *= fact;
691 186986 : dx[i+1] *= fact;
692 186986 : dx[i+2] *= fact;
693 186986 : dx[i+3] *= fact;
694 186986 : dx[i+4] *= fact;
695 : }
696 : /* continue with current value of i */
697 5781782 : for(;i<n;i++)
698 4056670 : dx[i] *= fact;
699 :
700 : return;
701 : } else {
702 : /* inc != 1 */
703 2883 : nincx = n * (incx);
704 159270 : for (i=0;i<nincx;i+=incx)
705 156387 : dx[i] *= fact;
706 :
707 : return;
708 : }
709 :
710 : }
711 : }
712 : }
713 : #include "blas.h"
714 :
715 : namespace PLMD{
716 : namespace blas{
717 : void
718 5884 : PLUMED_BLAS_F77_FUNC(dswap,DSWAP)(int *n__,
719 : double *dx,
720 : int *incx__,
721 : double *dy,
722 : int *incy__)
723 : {
724 : int i,ix,iy;
725 : double d1,d2,d3;
726 :
727 5884 : int n = *n__;
728 5884 : int incx = *incx__;
729 5884 : int incy = *incy__;
730 :
731 5884 : if(n<=0)
732 : return;
733 :
734 5884 : if(incx==1 && incy==1) {
735 85127 : for(i=0;i<(n-3);i+=3) {
736 81866 : d1 = dx[i];
737 81866 : d2 = dx[i+1];
738 81866 : d3 = dx[i+2];
739 81866 : dx[i] = dy[i];
740 81866 : dx[i+1] = dy[i+1];
741 81866 : dx[i+2] = dy[i+2];
742 81866 : dy[i] = d1;
743 81866 : dy[i+1] = d2;
744 81866 : dy[i+2] = d3;
745 : }
746 : /* continue with last i value */
747 9150 : for(;i<n;i++) {
748 5889 : d1 = dx[i];
749 5889 : dx[i] = dy[i];
750 5889 : dy[i] = d1;
751 : }
752 :
753 : } else {
754 : ix = 0;
755 : iy = 0;
756 2623 : if(incx<0)
757 0 : ix = incx * (1 - n);
758 2623 : if(incy<0)
759 0 : iy = incy * (1 - n);
760 :
761 195103 : for(i=0;i<n;i++,ix+=incx,iy+=incy) {
762 192480 : d1 = dx[ix];
763 192480 : dx[ix] = dy[iy];
764 192480 : dy[iy] = d1;
765 : }
766 : }
767 : return;
768 : }
769 :
770 : }
771 : }
772 : #include <cctype>
773 : #include <cmath>
774 :
775 : #include "real.h"
776 : #include "blas.h"
777 :
778 : namespace PLMD{
779 : namespace blas{
780 : void
781 1114408 : PLUMED_BLAS_F77_FUNC(dsymv,DSYMV)(const char *uplo,
782 : int *n__,
783 : double *alpha__,
784 : double *a,
785 : int *lda__,
786 : double *x,
787 : int *incx__,
788 : double *beta__,
789 : double *y,
790 : int *incy__)
791 : {
792 1114408 : const char ch=std::toupper(*uplo);
793 : int kx,ky,i,j,ix,iy,jx,jy;
794 : double temp1,temp2;
795 :
796 1114408 : int n = *n__;
797 1114408 : int lda = *lda__;
798 1114408 : int incx = *incx__;
799 1114408 : int incy = *incy__;
800 1114408 : double alpha = *alpha__;
801 1114408 : double beta = *beta__;
802 :
803 1114408 : if(n<=0 || incx==0 || incy==0)
804 : return;
805 :
806 1114408 : if(incx>0)
807 : kx = 1;
808 : else
809 0 : kx = 1 - (n -1)*(incx);
810 :
811 1114408 : if(incy>0)
812 : ky = 1;
813 : else
814 0 : ky = 1 - (n -1)*(incy);
815 :
816 1114408 : if(std::abs(beta-1.0)>PLUMED_GMX_DOUBLE_EPS) {
817 1114408 : if(incy==1) {
818 1114408 : if(std::abs(beta)<PLUMED_GMX_DOUBLE_MIN)
819 4092265 : for(i=1;i<=n;i++)
820 2977857 : y[i-1] = 0.0;
821 : else
822 0 : for(i=1;i<=n;i++)
823 0 : y[i-1] *= beta;
824 : } else {
825 : /* non-unit incr. */
826 : iy = ky;
827 0 : if(std::abs(beta)<PLUMED_GMX_DOUBLE_MIN)
828 0 : for(i=1;i<=n;i++) {
829 0 : y[iy-1] = 0.0;
830 0 : iy += incy;
831 : }
832 : else
833 0 : for(i=1;i<=n;i++) {
834 0 : y[iy-1] *= beta;
835 0 : iy += incy;
836 : }
837 : }
838 : }
839 :
840 1114408 : if(std::abs(alpha)<PLUMED_GMX_DOUBLE_MIN)
841 : return;
842 :
843 1114408 : if(ch=='U') {
844 1114408 : if(incx==1 && incy==1) {
845 4092265 : for(j=1;j<=n;j++) {
846 2977857 : temp1 = alpha * x[j-1];
847 : temp2 = 0.0;
848 29707007 : for(i=1;i<j;i++) {
849 26729150 : y[i-1] += temp1*a[(j-1)*(lda)+(i-1)];
850 26729150 : temp2 += a[(j-1)*(lda)+(i-1)] * x[i-1];
851 : }
852 2977857 : y[j-1] += temp1*a[(j-1)*(lda)+(j-1)] + alpha *temp2;
853 : }
854 : } else {
855 : /* non-unit incr. */
856 : jx = kx;
857 : jy = ky;
858 0 : for(j=1;j<=n;j++) {
859 0 : temp1 = alpha * x[jx-1];
860 : temp2 = 0.0;
861 : ix = kx;
862 : iy = ky;
863 0 : for(i=1;i<j;i++) {
864 0 : y[iy-1] += temp1 * a[(j-1)*(lda)+(i-1)];
865 0 : temp2 += a[(j-1)*(lda)+(i-1)] * x[ix-1];
866 0 : ix += incx;
867 0 : iy += incy;
868 : }
869 0 : y[jy-1] += temp1*a[(j-1)*(lda)+(j-1)] + alpha*temp2;
870 0 : jx += incx;
871 0 : jy += incy;
872 : }
873 : }
874 : } else {
875 : /* lower */
876 0 : if(incx==1 && incy==1) {
877 0 : for(j=1;j<=n;j++) {
878 0 : temp1 = alpha * x[j-1];
879 : temp2 = 0.0;
880 0 : y[j-1] += temp1 * a[(j-1)*(lda)+(j-1)];
881 0 : for(i=j+1;i<=n;i++) {
882 0 : y[i-1] += temp1*a[(j-1)*(lda)+(i-1)];
883 0 : temp2 += a[(j-1)*(lda)+(i-1)] * x[i-1];
884 : }
885 0 : y[j-1] += alpha *temp2;
886 : }
887 : } else {
888 : /* non-unit incr. */
889 : jx = kx;
890 : jy = ky;
891 0 : for(j=1;j<=n;j++) {
892 0 : temp1 = alpha * x[jx-1];
893 : temp2 = 0.0;
894 0 : y[jy-1] += temp1 * a[(j-1)*(lda)+(j-1)];
895 : ix = jx;
896 : iy = jy;
897 0 : for(i=j+1;i<=n;i++) {
898 0 : ix += incx;
899 0 : iy += incy;
900 0 : y[iy-1] += temp1 * a[(j-1)*(lda)+(i-1)];
901 0 : temp2 += a[(j-1)*(lda)+(i-1)] * x[ix-1];
902 : }
903 0 : y[jy-1] += alpha*temp2;
904 0 : jx += incx;
905 0 : jy += incy;
906 : }
907 : }
908 : }
909 : return;
910 : }
911 : }
912 : }
913 : #include <cctype>
914 : #include <cmath>
915 :
916 : #include "real.h"
917 :
918 : #include "blas.h"
919 :
920 : namespace PLMD{
921 : namespace blas{
922 : void
923 1113895 : PLUMED_BLAS_F77_FUNC(dsyr2,DSYR2)(const char * uplo,
924 : int * n__,
925 : double * alpha__,
926 : double * x,
927 : int * incx__,
928 : double * y,
929 : int * incy__,
930 : double * a,
931 : int * lda__)
932 : {
933 : int kx,ky,ix,iy,jx,jy,j,i;
934 : double temp1,temp2;
935 1113895 : const char ch=std::toupper(*uplo);
936 :
937 1113895 : int n = *n__;
938 1113895 : int lda = *lda__;
939 1113895 : int incx = *incx__;
940 1113895 : int incy = *incy__;
941 1113895 : float alpha = *alpha__;
942 :
943 :
944 1113895 : if(n<=0 || std::abs(alpha)<PLUMED_GMX_DOUBLE_MIN || incx==0 || incy==0 ||
945 1113895 : (ch != 'U' && ch != 'L'))
946 : return;
947 :
948 : jx = jy = kx = ky = 0;
949 :
950 : /* init start points for non-unit increments */
951 1113895 : if(incx!=1 || incy!=1) {
952 0 : if(incx>0)
953 : kx = 1;
954 : else
955 0 : kx = 1 - (n - 1)*(incx);
956 0 : if(incy>0)
957 : ky = 1;
958 : else
959 0 : ky = 1 - (n - 1)*(incy);
960 :
961 : jx = kx;
962 : jy = ky;
963 : }
964 :
965 1113895 : if(ch == 'U') {
966 : /* Data in upper part of A */
967 1113895 : if(incx==1 && incy==1) {
968 : /* Unit increments for both x and y */
969 3949813 : for(j=1;j<=n;j++) {
970 2835918 : if( std::abs(x[j-1])>PLUMED_GMX_DOUBLE_MIN || std::abs(y[j-1])>PLUMED_GMX_DOUBLE_MIN ) {
971 2835918 : temp1 = alpha * y[j-1];
972 2835918 : temp2 = alpha * x[j-1];
973 9661631 : for(i=1;i<=j;i++)
974 6825713 : a[(j-1)*(lda)+(i-1)] += x[i-1]*temp1 + y[i-1]*temp2;
975 : }
976 : }
977 : } else {
978 :
979 : /* non-unit increments */
980 0 : for(j=1;j<=n;j++) {
981 :
982 0 : if( std::abs(x[jx-1])>PLUMED_GMX_DOUBLE_MIN || std::abs(y[jy-1])>PLUMED_GMX_DOUBLE_MIN ) {
983 0 : temp1 = alpha * y[jy-1];
984 0 : temp2 = alpha * x[jx-1];
985 : ix = kx;
986 : iy = ky;
987 0 : for(i=1;i<=j;i++) {
988 0 : a[(j-1)*(lda)+(i-1)] += x[ix-1]*temp1 + y[iy-1]*temp2;
989 0 : ix += incx;
990 0 : iy += incy;
991 : }
992 : }
993 0 : jx += incx;
994 0 : jy += incy;
995 : }
996 : }
997 : } else {
998 : /* Data in lower part of A */
999 0 : if(incx==1 && incy==1) {
1000 : /* Unit increments for both x and y */
1001 0 : for(j=1;j<=n;j++) {
1002 0 : if( std::abs(x[j-1])>PLUMED_GMX_DOUBLE_MIN || std::abs(y[j-1])>PLUMED_GMX_DOUBLE_MIN ) {
1003 0 : temp1 = alpha * y[j-1];
1004 0 : temp2 = alpha * x[j-1];
1005 0 : for(i=j;i<=n;i++)
1006 0 : a[(j-1)*(lda)+(i-1)] += x[i-1]*temp1 + y[i-1]*temp2;
1007 : }
1008 : }
1009 : } else {
1010 :
1011 : /* non-unit increments */
1012 0 : for(j=1;j<=n;j++) {
1013 :
1014 0 : if( std::abs(x[jx-1])>PLUMED_GMX_DOUBLE_MIN || std::abs(y[jy-1])>PLUMED_GMX_DOUBLE_MIN ) {
1015 0 : temp1 = alpha * y[jy-1];
1016 0 : temp2 = alpha * x[jx-1];
1017 : ix = jx;
1018 : iy = jy;
1019 0 : for(i=j;i<=n;i++) {
1020 0 : a[(j-1)*(lda)+(i-1)] += x[ix-1]*temp1 + y[iy-1]*temp2;
1021 0 : ix += incx;
1022 0 : iy += incy;
1023 : }
1024 : }
1025 0 : jx += incx;
1026 0 : jy += incy;
1027 : }
1028 : }
1029 : }
1030 :
1031 : return;
1032 : }
1033 : }
1034 : }
1035 : #include <cctype>
1036 : #include <cmath>
1037 :
1038 : #include "real.h"
1039 : #include "blas.h"
1040 :
1041 : namespace PLMD{
1042 : namespace blas{
1043 : void
1044 19 : PLUMED_BLAS_F77_FUNC(dsyr2k,DSYR2K)(const char *uplo,
1045 : const char *trans,
1046 : int *n__,
1047 : int *k__,
1048 : double *alpha__,
1049 : double *a,
1050 : int *lda__,
1051 : double *b,
1052 : int *ldb__,
1053 : double *beta__,
1054 : double *c,
1055 : int *ldc__)
1056 : {
1057 : char ch1,ch2;
1058 : int i,j,l;
1059 : double temp1,temp2;
1060 :
1061 :
1062 19 : int n = *n__;
1063 19 : int k = *k__;
1064 19 : int lda = *lda__;
1065 19 : int ldb = *ldb__;
1066 19 : int ldc = *ldc__;
1067 :
1068 19 : double alpha = *alpha__;
1069 19 : double beta = *beta__;
1070 :
1071 19 : ch1 = std::toupper(*uplo);
1072 19 : ch2 = std::toupper(*trans);
1073 :
1074 19 : if(n==0 || ( ( std::abs(alpha)<PLUMED_GMX_DOUBLE_MIN || k==0 ) && std::abs(beta-1.0)<PLUMED_GMX_DOUBLE_EPS))
1075 : return;
1076 :
1077 19 : if(std::abs(alpha)<PLUMED_GMX_DOUBLE_MIN ) {
1078 0 : if(ch1=='U') {
1079 0 : if(std::abs(beta)<PLUMED_GMX_DOUBLE_MIN)
1080 0 : for(j=1;j<=n;j++)
1081 0 : for(i=1;i<=j;i++)
1082 0 : c[(j-1)*(ldc)+(i-1)] = 0.0;
1083 : else
1084 0 : for(j=1;j<=n;j++)
1085 0 : for(i=1;i<=j;i++)
1086 0 : c[(j-1)*(ldc)+(i-1)] *= beta;
1087 : } else {
1088 : /* lower */
1089 0 : if(std::abs(beta)<PLUMED_GMX_DOUBLE_MIN)
1090 0 : for(j=1;j<=n;j++)
1091 0 : for(i=j;i<=n;i++)
1092 0 : c[(j-1)*(ldc)+(i-1)] = 0.0;
1093 : else
1094 0 : for(j=1;j<=n;j++)
1095 0 : for(i=j;i<=n;i++)
1096 0 : c[(j-1)*(ldc)+(i-1)] *= beta;
1097 : }
1098 0 : return;
1099 : }
1100 :
1101 19 : if(ch2=='N') {
1102 19 : if(ch1=='U') {
1103 5029 : for(j=1;j<=n;j++) {
1104 5010 : if(std::abs(beta)<PLUMED_GMX_DOUBLE_MIN)
1105 0 : for(i=1;i<=j;i++)
1106 0 : c[(j-1)*(ldc)+(i-1)] = 0.0;
1107 5010 : else if(std::abs(beta-1.0)>PLUMED_GMX_DOUBLE_EPS)
1108 0 : for(i=1;i<=j;i++)
1109 0 : c[(j-1)*(ldc)+(i-1)] *= beta;
1110 140280 : for(l=1;l<=k;l++) {
1111 135270 : if( std::abs(a[(l-1)*(lda)+(j-1)])>PLUMED_GMX_DOUBLE_MIN ||
1112 0 : std::abs(b[(l-1)*(ldb)+(j-1)])>PLUMED_GMX_DOUBLE_MIN) {
1113 135270 : temp1 = alpha * b[(l-1)*(ldb)+(j-1)];
1114 135270 : temp2 = alpha * a[(l-1)*(lda)+(j-1)];
1115 21195810 : for(i=1;i<=j;i++)
1116 21060540 : c[(j-1)*(ldc)+(i-1)] +=
1117 21060540 : a[(l-1)*(lda)+(i-1)] * temp1 +
1118 21060540 : b[(l-1)*(ldb)+(i-1)] * temp2;
1119 : }
1120 : }
1121 : }
1122 : } else {
1123 : /* lower */
1124 0 : for(j=1;j<=n;j++) {
1125 0 : if(std::abs(beta)<PLUMED_GMX_DOUBLE_MIN)
1126 0 : for(i=j;i<=n;i++)
1127 0 : c[(j-1)*(ldc)+(i-1)] = 0.0;
1128 0 : else if(std::abs(beta-1.0)>PLUMED_GMX_DOUBLE_EPS)
1129 0 : for(i=j;i<=n;i++)
1130 0 : c[(j-1)*(ldc)+(i-1)] *= beta;
1131 0 : for(l=1;l<=k;l++) {
1132 0 : if( std::abs(a[(l-1)*(lda)+(j-1)])>PLUMED_GMX_DOUBLE_MIN ||
1133 0 : std::abs(b[(l-1)*(ldb)+(j-1)])>PLUMED_GMX_DOUBLE_MIN) {
1134 0 : temp1 = alpha * b[(l-1)*(ldb)+(j-1)];
1135 0 : temp2 = alpha * a[(l-1)*(lda)+(j-1)];
1136 0 : for(i=j;i<=n;i++)
1137 0 : c[(j-1)*(ldc)+(i-1)] +=
1138 0 : a[(l-1)*(lda)+(i-1)] * temp1 +
1139 0 : b[(l-1)*(ldb)+(i-1)] * temp2;
1140 : }
1141 : }
1142 : }
1143 : }
1144 : } else {
1145 : /* transpose */
1146 0 : if(ch1=='U') {
1147 0 : for(j=1;j<=n;j++)
1148 0 : for(i=1;i<=j;i++) {
1149 : temp1 = 0.0;
1150 : temp2 = 0.0;
1151 0 : for (l=1;l<=k;l++) {
1152 0 : temp1 += a[(i-1)*(lda)+(l-1)] * b[(j-1)*(ldb)+(l-1)];
1153 0 : temp2 += b[(i-1)*(ldb)+(l-1)] * a[(j-1)*(lda)+(l-1)];
1154 : }
1155 0 : if(std::abs(beta)<PLUMED_GMX_DOUBLE_MIN)
1156 0 : c[(j-1)*(ldc)+(i-1)] = alpha * (temp1 + temp2);
1157 : else
1158 0 : c[(j-1)*(ldc)+(i-1)] = beta * c[(j-1)*(ldc)+(i-1)] +
1159 0 : alpha * (temp1 + temp2);
1160 : }
1161 : } else {
1162 : /* lower */
1163 0 : for(j=1;j<=n;j++)
1164 0 : for(i=j;i<=n;i++) {
1165 : temp1 = 0.0;
1166 : temp2 = 0.0;
1167 0 : for (l=1;l<=k;l++) {
1168 0 : temp1 += a[(i-1)*(lda)+(l-1)] * b[(j-1)*(ldb)+(l-1)];
1169 0 : temp2 += b[(i-1)*(ldb)+(l-1)] * a[(j-1)*(lda)+(l-1)];
1170 : }
1171 0 : if(std::abs(beta)<PLUMED_GMX_DOUBLE_MIN)
1172 0 : c[(j-1)*(ldc)+(i-1)] = alpha * (temp1 + temp2);
1173 : else
1174 0 : c[(j-1)*(ldc)+(i-1)] = beta * c[(j-1)*(ldc)+(i-1)] +
1175 0 : alpha * (temp1 + temp2);
1176 : }
1177 : }
1178 : }
1179 : return;
1180 : }
1181 : }
1182 : }
1183 : #include <cmath>
1184 :
1185 : #include "real.h"
1186 :
1187 : #include "blas.h"
1188 :
1189 : namespace PLMD{
1190 : namespace blas{
1191 : void
1192 441 : PLUMED_BLAS_F77_FUNC(dtrmm,DTRMM)(const char *side,
1193 : const char *uplo,
1194 : const char *transa,
1195 : const char *diag,
1196 : int *m__,
1197 : int *n__,
1198 : double *alpha__,
1199 : double *a,
1200 : int *lda__,
1201 : double *b,
1202 : int *ldb__)
1203 : {
1204 : int a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3;
1205 :
1206 441 : int m = *m__;
1207 441 : int n = *n__;
1208 441 : int lda = *lda__;
1209 441 : int ldb = *ldb__;
1210 441 : double alpha = *alpha__;
1211 :
1212 : /* Local variables */
1213 : int i__, j, k;
1214 : double temp;
1215 : int lside;
1216 : int upper;
1217 : int nounit;
1218 : a_dim1 = lda;
1219 441 : a_offset = 1 + a_dim1;
1220 441 : a -= a_offset;
1221 : b_dim1 = ldb;
1222 441 : b_offset = 1 + b_dim1;
1223 441 : b -= b_offset;
1224 :
1225 : /* Function Body */
1226 441 : lside = (*side=='L' || *side=='l');
1227 :
1228 441 : nounit = (*diag=='N' || *diag=='n');
1229 441 : upper = (*uplo=='U' || *uplo=='u');
1230 :
1231 441 : if (n == 0) {
1232 : return;
1233 : }
1234 441 : if (std::abs(alpha)<PLUMED_GMX_DOUBLE_MIN) {
1235 : i__1 = n;
1236 0 : for (j = 1; j <= i__1; ++j) {
1237 : i__2 = m;
1238 0 : for (i__ = 1; i__ <= i__2; ++i__) {
1239 0 : b[i__ + j * b_dim1] = 0.;
1240 : }
1241 : }
1242 : return;
1243 : }
1244 441 : if (lside) {
1245 0 : if (*transa=='N' || *transa=='n') {
1246 0 : if (upper) {
1247 : i__1 = n;
1248 0 : for (j = 1; j <= i__1; ++j) {
1249 : i__2 = m;
1250 0 : for (k = 1; k <= i__2; ++k) {
1251 0 : if (std::abs(b[k + j * b_dim1])>PLUMED_GMX_DOUBLE_MIN) {
1252 0 : temp = alpha * b[k + j * b_dim1];
1253 : i__3 = k - 1;
1254 0 : for (i__ = 1; i__ <= i__3; ++i__) {
1255 0 : b[i__ + j * b_dim1] += temp * a[i__ + k * a_dim1];
1256 : }
1257 0 : if (nounit) {
1258 0 : temp *= a[k + k * a_dim1];
1259 : }
1260 0 : b[k + j * b_dim1] = temp;
1261 : }
1262 : }
1263 : }
1264 : } else {
1265 : i__1 = n;
1266 0 : for (j = 1; j <= i__1; ++j) {
1267 0 : for (k = m; k >= 1; --k) {
1268 0 : if (std::abs(b[k + j * b_dim1])>PLUMED_GMX_DOUBLE_MIN) {
1269 0 : temp = alpha * b[k + j * b_dim1];
1270 0 : b[k + j * b_dim1] = temp;
1271 0 : if (nounit) {
1272 0 : b[k + j * b_dim1] *= a[k + k * a_dim1];
1273 : }
1274 : i__2 = m;
1275 0 : for (i__ = k + 1; i__ <= i__2; ++i__) {
1276 0 : b[i__ + j * b_dim1] += temp * a[i__ + k *
1277 0 : a_dim1];
1278 : }
1279 : }
1280 : }
1281 : }
1282 : }
1283 : } else {
1284 :
1285 0 : if (upper) {
1286 : i__1 = n;
1287 0 : for (j = 1; j <= i__1; ++j) {
1288 0 : for (i__ = m; i__ >= 1; --i__) {
1289 0 : temp = b[i__ + j * b_dim1];
1290 0 : if (nounit) {
1291 0 : temp *= a[i__ + i__ * a_dim1];
1292 : }
1293 : i__2 = i__ - 1;
1294 0 : for (k = 1; k <= i__2; ++k) {
1295 0 : temp += a[k + i__ * a_dim1] * b[k + j * b_dim1];
1296 : }
1297 0 : b[i__ + j * b_dim1] = alpha * temp;
1298 : }
1299 : }
1300 : } else {
1301 : i__1 = n;
1302 0 : for (j = 1; j <= i__1; ++j) {
1303 : i__2 = m;
1304 0 : for (i__ = 1; i__ <= i__2; ++i__) {
1305 0 : temp = b[i__ + j * b_dim1];
1306 0 : if (nounit) {
1307 0 : temp *= a[i__ + i__ * a_dim1];
1308 : }
1309 : i__3 = m;
1310 0 : for (k = i__ + 1; k <= i__3; ++k) {
1311 0 : temp += a[k + i__ * a_dim1] * b[k + j * b_dim1];
1312 : }
1313 0 : b[i__ + j * b_dim1] = alpha * temp;
1314 : }
1315 : }
1316 : }
1317 : }
1318 : } else {
1319 441 : if (*transa=='N' || *transa=='n') {
1320 :
1321 147 : if (upper) {
1322 2634 : for (j = n; j >= 1; --j) {
1323 : temp = alpha;
1324 2535 : if (nounit) {
1325 0 : temp *= a[j + j * a_dim1];
1326 : }
1327 : i__1 = m;
1328 658291 : for (i__ = 1; i__ <= i__1; ++i__) {
1329 655756 : b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1];
1330 : }
1331 : i__1 = j - 1;
1332 40262 : for (k = 1; k <= i__1; ++k) {
1333 37727 : if (std::abs(a[k + j * a_dim1])>PLUMED_GMX_DOUBLE_MIN) {
1334 37727 : temp = alpha * a[k + j * a_dim1];
1335 : i__2 = m;
1336 9987691 : for (i__ = 1; i__ <= i__2; ++i__) {
1337 9949964 : b[i__ + j * b_dim1] += temp * b[i__ + k *
1338 9949964 : b_dim1];
1339 : }
1340 : }
1341 : }
1342 : }
1343 : } else {
1344 : i__1 = n;
1345 1124 : for (j = 1; j <= i__1; ++j) {
1346 : temp = alpha;
1347 1076 : if (nounit) {
1348 0 : temp *= a[j + j * a_dim1];
1349 : }
1350 : i__2 = m;
1351 271892 : for (i__ = 1; i__ <= i__2; ++i__) {
1352 270816 : b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1];
1353 : }
1354 : i__2 = n;
1355 16778 : for (k = j + 1; k <= i__2; ++k) {
1356 15702 : if (std::abs(a[k + j * a_dim1])>PLUMED_GMX_DOUBLE_MIN) {
1357 15486 : temp = alpha * a[k + j * a_dim1];
1358 : i__3 = m;
1359 4113622 : for (i__ = 1; i__ <= i__3; ++i__) {
1360 4098136 : b[i__ + j * b_dim1] += temp * b[i__ + k *
1361 4098136 : b_dim1];
1362 : }
1363 : }
1364 : }
1365 : }
1366 : }
1367 : } else {
1368 :
1369 294 : if (upper) {
1370 : i__1 = n;
1371 4729 : for (k = 1; k <= i__1; ++k) {
1372 : i__2 = k - 1;
1373 71622 : for (j = 1; j <= i__2; ++j) {
1374 67080 : if (std::abs(a[j + k * a_dim1])>PLUMED_GMX_DOUBLE_MIN) {
1375 66959 : temp = alpha * a[j + k * a_dim1];
1376 : i__3 = m;
1377 18130215 : for (i__ = 1; i__ <= i__3; ++i__) {
1378 18063256 : b[i__ + j * b_dim1] += temp * b[i__ + k *
1379 18063256 : b_dim1];
1380 : }
1381 : }
1382 : }
1383 : temp = alpha;
1384 4542 : if (nounit) {
1385 2007 : temp *= a[k + k * a_dim1];
1386 : }
1387 4542 : if (std::abs(temp-1.0)>PLUMED_GMX_DOUBLE_EPS) {
1388 : i__2 = m;
1389 538339 : for (i__ = 1; i__ <= i__2; ++i__) {
1390 536332 : b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1];
1391 : }
1392 : }
1393 : }
1394 : } else {
1395 2787 : for (k = n; k >= 1; --k) {
1396 : i__1 = n;
1397 42458 : for (j = k + 1; j <= i__1; ++j) {
1398 39778 : if (std::abs(a[j + k * a_dim1])>PLUMED_GMX_DOUBLE_MIN) {
1399 39190 : temp = alpha * a[j + k * a_dim1];
1400 : i__2 = m;
1401 10008102 : for (i__ = 1; i__ <= i__2; ++i__) {
1402 9968912 : b[i__ + j * b_dim1] += temp * b[i__ + k *
1403 9968912 : b_dim1];
1404 : }
1405 : }
1406 : }
1407 : temp = alpha;
1408 2680 : if (nounit) {
1409 1604 : temp *= a[k + k * a_dim1];
1410 : }
1411 2680 : if (std::abs(temp-1.0)>PLUMED_GMX_DOUBLE_EPS) {
1412 : i__1 = m;
1413 391844 : for (i__ = 1; i__ <= i__1; ++i__) {
1414 390240 : b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1];
1415 : }
1416 : }
1417 : }
1418 : }
1419 : }
1420 : }
1421 :
1422 : return;
1423 :
1424 : }
1425 :
1426 :
1427 : }
1428 : }
1429 : #include <cmath>
1430 :
1431 : #include "real.h"
1432 : #include "blas.h"
1433 :
1434 : namespace PLMD{
1435 : namespace blas{
1436 : void
1437 3624 : PLUMED_BLAS_F77_FUNC(dtrmv,DTRMV)(const char *uplo,
1438 : const char *trans,
1439 : const char *diag,
1440 : int *n__,
1441 : double *a,
1442 : int *lda__,
1443 : double *x,
1444 : int *incx__)
1445 : {
1446 : int a_dim1, a_offset, i__1, i__2;
1447 :
1448 : int i__, j, ix, jx, kx;
1449 : double temp;
1450 : int nounit;
1451 :
1452 3624 : int n = *n__;
1453 3624 : int lda = *lda__;
1454 3624 : int incx = *incx__;
1455 :
1456 : a_dim1 = lda;
1457 3624 : a_offset = 1 + a_dim1;
1458 3624 : a -= a_offset;
1459 3624 : --x;
1460 :
1461 3624 : if (n == 0) {
1462 : return;
1463 : }
1464 :
1465 3483 : nounit = (*diag=='n' || *diag=='N');
1466 :
1467 3483 : if (incx <= 0) {
1468 0 : kx = 1 - (n - 1) * incx;
1469 : } else {
1470 : kx = 1;
1471 : }
1472 :
1473 3483 : if (*trans=='N' || *trans=='n') {
1474 :
1475 3483 : if (*uplo=='U' || *uplo=='u') {
1476 1950 : if (incx == 1) {
1477 : i__1 = n;
1478 31239 : for (j = 1; j <= i__1; ++j) {
1479 29289 : if (std::abs(x[j])>PLUMED_GMX_DOUBLE_MIN) {
1480 : temp = x[j];
1481 : i__2 = j - 1;
1482 318678 : for (i__ = 1; i__ <= i__2; ++i__) {
1483 289605 : x[i__] += temp * a[i__ + j * a_dim1];
1484 : }
1485 29073 : if (nounit) {
1486 29073 : x[j] *= a[j + j * a_dim1];
1487 : }
1488 : }
1489 : }
1490 : } else {
1491 : jx = kx;
1492 : i__1 = n;
1493 0 : for (j = 1; j <= i__1; ++j) {
1494 0 : if (std::abs(x[jx])>PLUMED_GMX_DOUBLE_MIN) {
1495 : temp = x[jx];
1496 : ix = kx;
1497 : i__2 = j - 1;
1498 0 : for (i__ = 1; i__ <= i__2; ++i__) {
1499 0 : x[ix] += temp * a[i__ + j * a_dim1];
1500 0 : ix += incx;
1501 : }
1502 0 : if (nounit) {
1503 0 : x[jx] *= a[j + j * a_dim1];
1504 : }
1505 : }
1506 0 : jx += incx;
1507 : }
1508 : }
1509 : } else {
1510 1533 : if (incx == 1) {
1511 25237 : for (j = n; j >= 1; --j) {
1512 23704 : if (std::abs(x[j])>PLUMED_GMX_DOUBLE_MIN) {
1513 : temp = x[j];
1514 : i__1 = j + 1;
1515 255880 : for (i__ = n; i__ >= i__1; --i__) {
1516 232176 : x[i__] += temp * a[i__ + j * a_dim1];
1517 : }
1518 23704 : if (nounit) {
1519 23704 : x[j] *= a[j + j * a_dim1];
1520 : }
1521 : }
1522 : }
1523 : } else {
1524 0 : kx += (n - 1) * incx;
1525 : jx = kx;
1526 0 : for (j = n; j >= 1; --j) {
1527 0 : if (std::abs(x[jx])>PLUMED_GMX_DOUBLE_MIN) {
1528 : temp = x[jx];
1529 : ix = kx;
1530 : i__1 = j + 1;
1531 0 : for (i__ = n; i__ >= i__1; --i__) {
1532 0 : x[ix] += temp * a[i__ + j * a_dim1];
1533 0 : ix -= incx;
1534 : }
1535 0 : if (nounit) {
1536 0 : x[jx] *= a[j + j * a_dim1];
1537 : }
1538 : }
1539 0 : jx -= incx;
1540 : }
1541 : }
1542 : }
1543 : } else {
1544 :
1545 0 : if (*uplo=='U' || *uplo=='u') {
1546 0 : if (incx == 1) {
1547 0 : for (j = n; j >= 1; --j) {
1548 0 : temp = x[j];
1549 0 : if (nounit) {
1550 0 : temp *= a[j + j * a_dim1];
1551 : }
1552 0 : for (i__ = j - 1; i__ >= 1; --i__) {
1553 0 : temp += a[i__ + j * a_dim1] * x[i__];
1554 : }
1555 0 : x[j] = temp;
1556 : }
1557 : } else {
1558 0 : jx = kx + (n - 1) * incx;
1559 0 : for (j = n; j >= 1; --j) {
1560 0 : temp = x[jx];
1561 : ix = jx;
1562 0 : if (nounit) {
1563 0 : temp *= a[j + j * a_dim1];
1564 : }
1565 0 : for (i__ = j - 1; i__ >= 1; --i__) {
1566 0 : ix -= incx;
1567 0 : temp += a[i__ + j * a_dim1] * x[ix];
1568 : }
1569 0 : x[jx] = temp;
1570 0 : jx -= incx;
1571 : }
1572 : }
1573 : } else {
1574 0 : if (incx == 1) {
1575 : i__1 = n;
1576 0 : for (j = 1; j <= i__1; ++j) {
1577 0 : temp = x[j];
1578 0 : if (nounit) {
1579 0 : temp *= a[j + j * a_dim1];
1580 : }
1581 : i__2 = n;
1582 0 : for (i__ = j + 1; i__ <= i__2; ++i__) {
1583 0 : temp += a[i__ + j * a_dim1] * x[i__];
1584 : }
1585 0 : x[j] = temp;
1586 : }
1587 : } else {
1588 : jx = kx;
1589 : i__1 = n;
1590 0 : for (j = 1; j <= i__1; ++j) {
1591 0 : temp = x[jx];
1592 : ix = jx;
1593 0 : if (nounit) {
1594 0 : temp *= a[j + j * a_dim1];
1595 : }
1596 : i__2 = n;
1597 0 : for (i__ = j + 1; i__ <= i__2; ++i__) {
1598 0 : ix += incx;
1599 0 : temp += a[i__ + j * a_dim1] * x[ix];
1600 : }
1601 0 : x[jx] = temp;
1602 0 : jx += incx;
1603 : }
1604 : }
1605 : }
1606 : }
1607 :
1608 : return;
1609 :
1610 : }
1611 :
1612 :
1613 : }
1614 : }
1615 : #include <cctype>
1616 : #include <cmath>
1617 :
1618 : #include "real.h"
1619 : #include "blas.h"
1620 :
1621 : namespace PLMD{
1622 : namespace blas{
1623 : void
1624 0 : PLUMED_BLAS_F77_FUNC(dtrsm,DTRSM)(const char * side,
1625 : const char * uplo,
1626 : const char * transa,
1627 : const char * diag,
1628 : int * m__,
1629 : int * n__,
1630 : double *alpha__,
1631 : double *a,
1632 : int * lda__,
1633 : double *b,
1634 : int * ldb__)
1635 : {
1636 0 : const char xside = std::toupper(*side);
1637 0 : const char xuplo = std::toupper(*uplo);
1638 0 : const char xtrans = std::toupper(*transa);
1639 0 : const char xdiag = std::toupper(*diag);
1640 : int i,j,k;
1641 : double temp;
1642 :
1643 :
1644 0 : int m = *m__;
1645 0 : int n = *n__;
1646 0 : int lda = *lda__;
1647 0 : int ldb = *ldb__;
1648 0 : double alpha = *alpha__;
1649 :
1650 0 : if(n<=0)
1651 : return;
1652 :
1653 0 : if(std::abs(alpha)<PLUMED_GMX_DOUBLE_MIN) {
1654 0 : for(j=0;j<n;j++)
1655 0 : for(i=0;i<m;i++)
1656 0 : b[j*(ldb)+i] = 0.0;
1657 : return;
1658 : }
1659 :
1660 0 : if(xside=='L') {
1661 : /* left side */
1662 0 : if(xtrans=='N') {
1663 : /* No transpose */
1664 0 : if(xuplo=='U') {
1665 : /* upper */
1666 0 : for(j=0;j<n;j++) {
1667 0 : if(std::abs(alpha-1.0)>PLUMED_GMX_DOUBLE_EPS) {
1668 0 : for(i=0;i<m;i++)
1669 0 : b[j*(ldb)+i] *= alpha;
1670 : }
1671 0 : for(k=m-1;k>=0;k--) {
1672 0 : if(std::abs(b[j*(ldb)+k])>PLUMED_GMX_DOUBLE_MIN) {
1673 0 : if(xdiag=='N')
1674 0 : b[j*(ldb)+k] /= a[k*(lda)+k];
1675 0 : for(i=0;i<k;i++)
1676 0 : b[j*(ldb)+i] -= b[j*(ldb)+k]*a[k*(lda)+i];
1677 : }
1678 : }
1679 : }
1680 : } else {
1681 : /* lower */
1682 0 : for(j=0;j<n;j++) {
1683 0 : if(std::abs(alpha-1.0)>PLUMED_GMX_DOUBLE_EPS)
1684 0 : for(i=0;i<m;i++)
1685 0 : b[j*(ldb)+i] *= alpha;
1686 0 : for(k=0;k<m;k++) {
1687 0 : if(std::abs(b[j*(ldb)+k])>PLUMED_GMX_DOUBLE_MIN) {
1688 0 : if(xdiag=='N')
1689 0 : b[j*(ldb)+k] /= a[k*(lda)+k];
1690 0 : for(i=k+1;i<m;i++)
1691 0 : b[j*(ldb)+i] -= b[j*(ldb)+k]*a[k*(lda)+i];
1692 : }
1693 : }
1694 : }
1695 : }
1696 : } else {
1697 : /* Transpose */
1698 0 : if(xuplo=='U') {
1699 : /* upper */
1700 0 : for(j=0;j<n;j++) {
1701 0 : for(i=0;i<m;i++) {
1702 0 : temp = alpha * b[j*(ldb)+i];
1703 0 : for(k=0;k<i;k++)
1704 0 : temp -= a[i*(lda)+k] * b[j*(ldb)+k];
1705 0 : if(xdiag=='N')
1706 0 : temp /= a[i*(lda)+i];
1707 0 : b[j*(ldb)+i] = temp;
1708 : }
1709 : }
1710 : } else {
1711 : /* lower */
1712 0 : for(j=0;j<n;j++) {
1713 0 : for(i=m-1;i>=0;i--) {
1714 0 : temp = alpha * b[j*(ldb)+i];
1715 0 : for(k=i+1;k<m;k++)
1716 0 : temp -= a[i*(lda)+k] * b[j*(ldb)+k];
1717 0 : if(xdiag=='N')
1718 0 : temp /= a[i*(lda)+i];
1719 0 : b[j*(ldb)+i] = temp;
1720 : }
1721 : }
1722 : }
1723 : }
1724 : } else {
1725 : /* right side */
1726 0 : if(xtrans=='N') {
1727 : /* No transpose */
1728 0 : if(xuplo=='U') {
1729 : /* upper */
1730 0 : for(j=0;j<n;j++) {
1731 0 : if(std::abs(alpha-1.0)>PLUMED_GMX_DOUBLE_EPS)
1732 0 : for(i=0;i<m;i++)
1733 0 : b[j*(ldb)+i] *= alpha;
1734 0 : for(k=0;k<j;k++) {
1735 0 : if(std::abs(a[j*(lda)+k])>PLUMED_GMX_DOUBLE_MIN) {
1736 0 : for(i=0;i<m;i++)
1737 0 : b[j*(ldb)+i] -= a[j*(lda)+k]*b[k*(ldb)+i];
1738 : }
1739 : }
1740 0 : if(xdiag=='N') {
1741 0 : temp = 1.0/a[j*(lda)+j];
1742 0 : for(i=0;i<m;i++)
1743 0 : b[j*(ldb)+i] *= temp;
1744 : }
1745 : }
1746 : } else {
1747 : /* lower */
1748 0 : for(j=n-1;j>=0;j--) {
1749 0 : if(std::abs(alpha)>PLUMED_GMX_DOUBLE_MIN)
1750 0 : for(i=0;i<m;i++)
1751 0 : b[j*(ldb)+i] *= alpha;
1752 0 : for(k=j+1;k<n;k++) {
1753 0 : if(std::abs(a[j*(lda)+k])>PLUMED_GMX_DOUBLE_MIN) {
1754 0 : for(i=0;i<m;i++)
1755 0 : b[j*(ldb)+i] -= a[j*(lda)+k]*b[k*(ldb)+i];
1756 : }
1757 : }
1758 0 : if(xdiag=='N') {
1759 0 : temp = 1.0/a[j*(lda)+j];
1760 0 : for(i=0;i<m;i++)
1761 0 : b[j*(ldb)+i] *= temp;
1762 : }
1763 : }
1764 : }
1765 : } else {
1766 : /* Transpose */
1767 0 : if(xuplo=='U') {
1768 : /* upper */
1769 0 : for(k=n-1;k>=0;k--) {
1770 0 : if(xdiag=='N') {
1771 0 : temp = 1.0/a[k*(lda)+k];
1772 0 : for(i=0;i<m;i++)
1773 0 : b[k*(ldb)+i] *= temp;
1774 : }
1775 0 : for(j=0;j<k;j++) {
1776 0 : if(std::abs(a[k*(lda)+j])>PLUMED_GMX_DOUBLE_MIN) {
1777 : temp = a[k*(lda)+j];
1778 0 : for(i=0;i<m;i++)
1779 0 : b[j*(ldb)+i] -= temp * b[k*(ldb)+i];
1780 : }
1781 : }
1782 0 : if(std::abs(alpha-1.0)>PLUMED_GMX_DOUBLE_EPS)
1783 0 : for(i=0;i<m;i++)
1784 0 : b[k*(ldb)+i] *= alpha;
1785 : }
1786 : } else {
1787 : /* lower */
1788 0 : for(k=0;k<n;k++) {
1789 0 : if(xdiag=='N') {
1790 0 : temp = 1.0/a[k*(lda)+k];
1791 0 : for(i=0;i<m;i++)
1792 0 : b[k*(ldb)+i] *= temp;
1793 : }
1794 0 : for(j=k+1;j<n;j++) {
1795 0 : if(std::abs(a[k*(lda)+j])>PLUMED_GMX_DOUBLE_MIN) {
1796 : temp = a[k*(lda)+j];
1797 0 : for(i=0;i<m;i++)
1798 0 : b[j*(ldb)+i] -= temp * b[k*(ldb)+i];
1799 : }
1800 : }
1801 0 : if(std::abs(alpha-1.0)>PLUMED_GMX_DOUBLE_EPS)
1802 0 : for(i=0;i<m;i++)
1803 0 : b[k*(ldb)+i] *= alpha;
1804 : }
1805 : }
1806 : }
1807 : }
1808 : }
1809 : }
1810 : }
1811 : #include <cmath>
1812 : #include "blas.h"
1813 :
1814 : namespace PLMD{
1815 : namespace blas{
1816 : int
1817 114 : PLUMED_BLAS_F77_FUNC(idamax,IDAMAX)(int *n__,
1818 : double *dx,
1819 : int *incx__)
1820 : {
1821 : int i,ix,idxmax;
1822 : double dmax,tmp;
1823 :
1824 114 : int n = *n__;
1825 114 : int incx = *incx__;
1826 :
1827 114 : if(n<1 || incx<=0)
1828 : return -1;
1829 :
1830 114 : if(n==1)
1831 : return 1;
1832 :
1833 57 : dmax = std::abs(dx[0]);
1834 : idxmax = 1;
1835 :
1836 57 : if(incx==1) {
1837 114 : for(i=1;i<n;i++) {
1838 57 : tmp = std::abs(dx[i]);
1839 57 : if(tmp>dmax) {
1840 : dmax = tmp;
1841 0 : idxmax = i+1;
1842 : }
1843 : }
1844 : } else {
1845 : /* Non-unit increments */
1846 : ix = incx; /* this is really 0 + an increment */
1847 0 : for(i=1;i<n;i++,ix+=incx) {
1848 0 : tmp = std::abs(dx[ix]);
1849 0 : if(tmp>dmax) {
1850 : dmax = tmp;
1851 0 : idxmax = ix+1;
1852 : }
1853 : }
1854 : }
1855 : return idxmax;
1856 : }
1857 : }
1858 : }
1859 : #include <cmath>
1860 : #include "blas.h"
1861 :
1862 : namespace PLMD{
1863 : namespace blas{
1864 : int
1865 0 : PLUMED_BLAS_F77_FUNC(isamax,ISAMAX)(int *n__,
1866 : float *dx,
1867 : int *incx__)
1868 : {
1869 : int i,ix,idxmax;
1870 : float dmax,tmp;
1871 :
1872 0 : int n = *n__;
1873 0 : int incx = *incx__;
1874 :
1875 0 : if(n<1 || incx<=0)
1876 : return -1;
1877 :
1878 0 : if(n==1)
1879 : return 1;
1880 :
1881 0 : dmax = std::abs(dx[0]);
1882 : idxmax = 1;
1883 :
1884 0 : if(incx==1) {
1885 0 : for(i=1;i<n;i++) {
1886 0 : tmp = std::abs(dx[i]);
1887 0 : if(tmp>dmax) {
1888 : dmax = tmp;
1889 0 : idxmax = i+1;
1890 : }
1891 : }
1892 : } else {
1893 : /* Non-unit increments */
1894 : ix = incx; /* this is really 0 + an increment */
1895 0 : for(i=1;i<n;i++,ix+=incx) {
1896 0 : tmp = std::abs(dx[ix]);
1897 0 : if(tmp>dmax) {
1898 : dmax = tmp;
1899 0 : idxmax = ix+1;
1900 : }
1901 : }
1902 : }
1903 : return idxmax;
1904 : }
1905 : }
1906 : }
1907 : #include <cmath>
1908 : #include "blas.h"
1909 :
1910 : namespace PLMD{
1911 : namespace blas{
1912 : float
1913 0 : PLUMED_BLAS_F77_FUNC(sasum,SASUM)(int *n__,
1914 : float *dx,
1915 : int *incx__)
1916 : {
1917 : int i__1, i__2;
1918 :
1919 : int i__, m, mp1;
1920 : float dtemp;
1921 : int nincx;
1922 :
1923 0 : int n = *n__;
1924 0 : int incx = *incx__;
1925 :
1926 :
1927 0 : --dx;
1928 :
1929 : dtemp = 0.;
1930 0 : if (n <= 0 || incx <= 0) {
1931 : return 0.0;
1932 : }
1933 0 : if (incx != 1) {
1934 0 : nincx = n * incx;
1935 : i__1 = nincx;
1936 : i__2 = incx;
1937 0 : for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) {
1938 0 : dtemp += std::abs(dx[i__]);
1939 : }
1940 : return dtemp;
1941 : }
1942 :
1943 0 : m = n % 6;
1944 0 : if (m != 0) {
1945 : i__2 = m;
1946 0 : for (i__ = 1; i__ <= i__2; ++i__) {
1947 0 : dtemp += std::abs(dx[i__]);
1948 : }
1949 0 : if (n < 6) {
1950 : return dtemp;
1951 : }
1952 : }
1953 0 : mp1 = m + 1;
1954 : i__2 = n;
1955 0 : for (i__ = mp1; i__ <= i__2; i__ += 6) {
1956 0 : dtemp = dtemp + std::abs(dx[i__]) + std::abs(dx[i__ + 1]) +
1957 0 : std::abs(dx[i__ + 2]) + std::abs(dx[i__+ 3]) + std::abs(dx[i__ + 4]) +
1958 0 : std::abs(dx[i__ + 5]);
1959 : }
1960 : return dtemp;
1961 : }
1962 :
1963 :
1964 : }
1965 : }
1966 : #include "blas.h"
1967 :
1968 :
1969 : namespace PLMD{
1970 : namespace blas{
1971 : void
1972 0 : PLUMED_BLAS_F77_FUNC(saxpy,SAXPY)(int * n_arg,
1973 : float * da_arg,
1974 : float * dx,
1975 : int * incx_arg,
1976 : float * dy,
1977 : int * incy_arg)
1978 : {
1979 : int i,ix,iy;
1980 0 : int n=*n_arg;
1981 0 : float da=*da_arg;
1982 0 : int incx = *incx_arg;
1983 0 : int incy = *incy_arg;
1984 :
1985 0 : if (n<=0)
1986 : return;
1987 :
1988 0 : if(incx!=1 || incy!=1) {
1989 : ix = 0;
1990 : iy = 0;
1991 0 : if(incx<0)
1992 0 : ix = (1-n)*incx;
1993 0 : if(incy<0)
1994 0 : iy = (1-n)*incy;
1995 :
1996 0 : for(i=0;i<n;i++,ix+=incx,iy+=incy)
1997 0 : dy[iy] += da*dx[ix];
1998 :
1999 : return;
2000 :
2001 : } else {
2002 :
2003 : /* unroll */
2004 :
2005 0 : for(i=0;i<(n-4);i+=4) {
2006 0 : dy[i] += da*dx[i];
2007 0 : dy[i+1] += da*dx[i+1];
2008 0 : dy[i+2] += da*dx[i+2];
2009 0 : dy[i+3] += da*dx[i+3];
2010 : }
2011 : /* continue with current value of i */
2012 0 : for(;i<n;i++)
2013 0 : dy[i] += da*dx[i];
2014 : }
2015 : }
2016 : }
2017 : }
2018 : #include "blas.h"
2019 :
2020 : namespace PLMD{
2021 : namespace blas{
2022 : void
2023 0 : PLUMED_BLAS_F77_FUNC(scopy,SCOPY)(int *n__,
2024 : float *dx,
2025 : int *incx__,
2026 : float *dy,
2027 : int *incy__)
2028 : {
2029 : int i,ix,iy;
2030 :
2031 0 : int n= *n__;
2032 0 : int incx = *incx__;
2033 0 : int incy = *incy__;
2034 :
2035 0 : if(incx!=1 || incy!=1)
2036 : {
2037 : ix = 0;
2038 : iy = 0;
2039 0 : if(incx<0)
2040 0 : ix = (1-n)*(incx);
2041 0 : if(incy<0)
2042 0 : iy = (1-n)*(incy);
2043 :
2044 0 : for(i=0;i<n;i++,ix+=incx,iy+=incy)
2045 0 : dy[iy] = dx[ix];
2046 :
2047 : return;
2048 :
2049 : } else {
2050 :
2051 : /* unroll */
2052 :
2053 0 : for(i=0;i<(n-8);i+=8) {
2054 0 : dy[i] = dx[i];
2055 0 : dy[i+1] = dx[i+1];
2056 0 : dy[i+2] = dx[i+2];
2057 0 : dy[i+3] = dx[i+3];
2058 0 : dy[i+4] = dx[i+4];
2059 0 : dy[i+5] = dx[i+5];
2060 0 : dy[i+6] = dx[i+6];
2061 0 : dy[i+7] = dx[i+7];
2062 : }
2063 : /* continue with current value of i */
2064 0 : for(;i<n;i++)
2065 0 : dy[i] = dx[i];
2066 : }
2067 : }
2068 : }
2069 : }
2070 : #include "blas.h"
2071 :
2072 :
2073 : namespace PLMD{
2074 : namespace blas{
2075 : float
2076 1 : PLUMED_BLAS_F77_FUNC(sdot,SDOT)(int *n_arg,
2077 : float *dx,
2078 : int *incx_arg,
2079 : float *dy,
2080 : int *incy_arg)
2081 : {
2082 : int i,ix,iy,m;
2083 1 : int n=*n_arg;
2084 1 : int incx = *incx_arg;
2085 1 : int incy = *incy_arg;
2086 : float t1;
2087 :
2088 1 : if(n<=0)
2089 : return 0.0;
2090 :
2091 : t1 = 0.0;
2092 :
2093 1 : if(incx!=1 || incy!=1) {
2094 : ix = 0;
2095 : iy = 0;
2096 0 : if(incx<0)
2097 0 : ix = (1-n)*incx;
2098 0 : if(incy<0)
2099 0 : iy = (1-n)*incy;
2100 :
2101 0 : for(i=0;i<n;i++,ix+=incx,iy+=incy)
2102 0 : t1 += dx[ix] * dy[iy];
2103 :
2104 : return t1;
2105 :
2106 : } else {
2107 :
2108 1 : m = n%5;
2109 :
2110 1 : for(i=0;i<m;i++)
2111 0 : t1 += dx[i] * dy[i];
2112 :
2113 : /* unroll */
2114 2 : for(i=m;i<n;i+=5)
2115 1 : t1 = t1 + dx[i] * dy[i]
2116 1 : + dx[i+1] * dy[i+1]
2117 1 : + dx[i+2] * dy[i+2]
2118 1 : + dx[i+3] * dy[i+3]
2119 1 : + dx[i+4] * dy[i+4];
2120 :
2121 : return t1;
2122 : }
2123 : }
2124 :
2125 :
2126 : }
2127 : }
2128 : #include <cctype>
2129 : #include <cmath>
2130 :
2131 : #include "real.h"
2132 : #include "blas.h"
2133 :
2134 : namespace PLMD{
2135 : namespace blas{
2136 : void
2137 0 : PLUMED_BLAS_F77_FUNC(sgemm,SGEMM)(const char *transa,
2138 : const char *transb,
2139 : int *m__,
2140 : int *n__,
2141 : int *k__,
2142 : float *alpha__,
2143 : float *a,
2144 : int *lda__,
2145 : float *b,
2146 : int *ldb__,
2147 : float *beta__,
2148 : float *c,
2149 : int *ldc__)
2150 : {
2151 0 : const char tra=std::toupper(*transa);
2152 0 : const char trb=std::toupper(*transb);
2153 : float temp;
2154 : int i,j,l;
2155 :
2156 0 : int m = *m__;
2157 0 : int n = *n__;
2158 0 : int k = *k__;
2159 0 : int lda = *lda__;
2160 0 : int ldb = *ldb__;
2161 0 : int ldc = *ldc__;
2162 :
2163 0 : float alpha = *alpha__;
2164 0 : float beta = *beta__;
2165 :
2166 0 : if(m==0 || n==0 || (( std::abs(alpha)<PLUMED_GMX_FLOAT_MIN || k==0) && std::abs(beta-1.0)<PLUMED_GMX_FLOAT_EPS))
2167 : return;
2168 :
2169 0 : if(std::abs(alpha)<PLUMED_GMX_FLOAT_MIN) {
2170 0 : if(std::abs(beta)<PLUMED_GMX_FLOAT_MIN) {
2171 0 : for(j=0;j<n;j++)
2172 0 : for(i=0;i<m;i++)
2173 0 : c[j*(ldc)+i] = 0.0;
2174 : } else {
2175 : /* nonzero beta */
2176 0 : for(j=0;j<n;j++)
2177 0 : for(i=0;i<m;i++)
2178 0 : c[j*(ldc)+i] *= beta;
2179 : }
2180 0 : return;
2181 : }
2182 :
2183 0 : if(trb=='N') {
2184 0 : if(tra=='N') {
2185 :
2186 0 : for(j=0;j<n;j++) {
2187 0 : if(std::abs(beta)<PLUMED_GMX_FLOAT_MIN) {
2188 0 : for(i=0;i<m;i++)
2189 0 : c[j*(ldc)+i] = 0.0;
2190 0 : } else if(std::abs(beta-1.0)>PLUMED_GMX_FLOAT_EPS) {
2191 0 : for(i=0;i<m;i++)
2192 0 : c[j*(ldc)+i] *= beta;
2193 : }
2194 0 : for(l=0;l<k;l++) {
2195 0 : if( std::abs(b[ j*(ldb) + l ])>PLUMED_GMX_FLOAT_MIN) {
2196 0 : temp = alpha * b[ j*(ldb) + l ];
2197 0 : for(i=0;i<m;i++)
2198 0 : c[j*(ldc)+i] += temp * a[l*(lda)+i];
2199 : }
2200 : }
2201 : }
2202 : } else {
2203 : /* transpose A, but not B */
2204 0 : for(j=0;j<n;j++) {
2205 0 : for(i=0;i<m;i++) {
2206 : temp = 0.0;
2207 0 : for(l=0;l<k;l++)
2208 0 : temp += a[i*(lda)+l] * b[j*(ldb)+l];
2209 0 : if(std::abs(beta)<PLUMED_GMX_FLOAT_MIN)
2210 0 : c[j*(ldc)+i] = alpha * temp;
2211 : else
2212 0 : c[j*(ldc)+i] = alpha * temp + beta * c[j*(ldc)+i];
2213 : }
2214 : }
2215 : }
2216 : } else {
2217 : /* transpose B */
2218 0 : if(tra=='N') {
2219 :
2220 : /* transpose B, but not A */
2221 :
2222 0 : for(j=0;j<n;j++) {
2223 0 : if(std::abs(beta)<PLUMED_GMX_FLOAT_MIN) {
2224 0 : for(i=0;i<m;i++)
2225 0 : c[j*(ldc)+i] = 0.0;
2226 0 : } else if(std::abs(beta-1.0)>PLUMED_GMX_FLOAT_EPS) {
2227 0 : for(i=0;i<m;i++)
2228 0 : c[j*(ldc)+i] *= beta;
2229 : }
2230 0 : for(l=0;l<k;l++) {
2231 0 : if( std::abs(b[ l*(ldb) + j ])>PLUMED_GMX_FLOAT_MIN) {
2232 0 : temp = alpha * b[ l*(ldb) + j ];
2233 0 : for(i=0;i<m;i++)
2234 0 : c[j*(ldc)+i] += temp * a[l*(lda)+i];
2235 : }
2236 : }
2237 : }
2238 :
2239 : } else {
2240 : /* Transpose both A and B */
2241 0 : for(j=0;j<n;j++) {
2242 0 : for(i=0;i<m;i++) {
2243 : temp = 0.0;
2244 0 : for(l=0;l<k;l++)
2245 0 : temp += a[i*(lda)+l] * b[l*(ldb)+j];
2246 0 : if(std::abs(beta)<PLUMED_GMX_FLOAT_MIN)
2247 0 : c[j*(ldc)+i] = alpha * temp;
2248 : else
2249 0 : c[j*(ldc)+i] = alpha * temp + beta * c[j*(ldc)+i];
2250 : }
2251 : }
2252 : }
2253 : }
2254 : }
2255 : }
2256 : }
2257 : #include <cctype>
2258 : #include <cmath>
2259 :
2260 : #include "real.h"
2261 : #include "blas.h"
2262 :
2263 : namespace PLMD{
2264 : namespace blas{
2265 : void
2266 0 : PLUMED_BLAS_F77_FUNC(sgemv,SGEMV)(const char *trans,
2267 : int *m__,
2268 : int *n__,
2269 : float *alpha__,
2270 : float *a,
2271 : int *lda__,
2272 : float *x,
2273 : int *incx__,
2274 : float *beta__,
2275 : float *y,
2276 : int *incy__)
2277 : {
2278 0 : const char ch=std::toupper(*trans);
2279 : int lenx,leny,kx,ky;
2280 : int i,j,jx,jy,ix,iy;
2281 : float temp;
2282 :
2283 0 : int m = *m__;
2284 0 : int n = *n__;
2285 0 : float alpha = *alpha__;
2286 0 : float beta = *beta__;
2287 0 : int incx = *incx__;
2288 0 : int incy = *incy__;
2289 0 : int lda = *lda__;
2290 :
2291 0 : if(n<=0 || m<=0 || (std::abs(alpha)<PLUMED_GMX_FLOAT_MIN && std::abs(beta-1.0)<PLUMED_GMX_FLOAT_EPS))
2292 : return;
2293 :
2294 0 : if(ch=='N') {
2295 : lenx = n;
2296 : leny = m;
2297 : } else {
2298 : lenx = m;
2299 : leny = n;
2300 : }
2301 :
2302 0 : if(incx>0)
2303 : kx = 1;
2304 : else
2305 0 : kx = 1 - (lenx -1)*(incx);
2306 :
2307 0 : if(incy>0)
2308 : ky = 1;
2309 : else
2310 0 : ky = 1 - (leny -1)*(incy);
2311 :
2312 0 : if(std::abs(beta-1.0)>PLUMED_GMX_FLOAT_EPS) {
2313 0 : if(incy==1) {
2314 0 : if(std::abs(beta)<PLUMED_GMX_FLOAT_MIN)
2315 0 : for(i=0;i<leny;i++)
2316 0 : y[i] = 0.0;
2317 : else
2318 0 : for(i=0;i<leny;i++)
2319 0 : y[i] *= beta;
2320 : } else {
2321 : /* non-unit incr. */
2322 : iy = ky;
2323 0 : if(std::abs(beta)<PLUMED_GMX_FLOAT_MIN)
2324 0 : for(i=0;i<leny;i++,iy+=incy)
2325 0 : y[iy] = 0.0;
2326 : else
2327 0 : for(i=0;i<leny;i++,iy+=incy)
2328 0 : y[iy] *= beta;
2329 : }
2330 : }
2331 :
2332 0 : if(std::abs(alpha)<PLUMED_GMX_FLOAT_MIN)
2333 : return;
2334 :
2335 0 : if(ch=='N') {
2336 : jx = kx;
2337 0 : if(incy==1) {
2338 0 : for(j=1;j<=n;j++,jx+=incx)
2339 0 : if( std::abs(x[jx-1])>PLUMED_GMX_FLOAT_MIN) {
2340 0 : temp = alpha * x[jx-1];
2341 0 : for(i=1;i<=m;i++)
2342 0 : y[i-1] += temp * a[(j-1)*(lda)+(i-1)];
2343 : }
2344 : } else {
2345 : /* non-unit y incr. */
2346 0 : for(j=1;j<=n;j++,jx+=incx)
2347 0 : if( std::abs(x[jx-1])>PLUMED_GMX_FLOAT_MIN) {
2348 0 : temp = alpha * x[jx-1];
2349 : iy = ky;
2350 0 : for(i=1;i<=m;i++,iy+=incy)
2351 0 : y[iy-1] += temp * a[(j-1)*(lda)+(i-1)];
2352 : }
2353 : }
2354 : } else {
2355 : /* transpose */
2356 : jy = ky;
2357 0 : if(incx==1) {
2358 0 : for(j=1;j<=n;j++,jy+=incy) {
2359 : temp = 0.0;
2360 0 : for(i=1;i<=m;i++)
2361 0 : temp += a[(j-1)*(lda)+(i-1)] * x[i-1];
2362 0 : y[jy-1] += alpha * temp;
2363 : }
2364 : } else {
2365 : /* non-unit y incr. */
2366 0 : for(j=1;j<=n;j++,jy+=incy) {
2367 : temp = 0.0;
2368 : ix = kx;
2369 0 : for(i=1;i<=m;i++,ix+=incx)
2370 0 : temp += a[(j-1)*(lda)+(i-1)] * x[ix-1];
2371 0 : y[jy-1] += alpha * temp;
2372 : }
2373 : }
2374 : }
2375 : }
2376 :
2377 : }
2378 : }
2379 : #include <cmath>
2380 :
2381 : #include "real.h"
2382 : #include "blas.h"
2383 :
2384 : namespace PLMD{
2385 : namespace blas{
2386 : void
2387 0 : PLUMED_BLAS_F77_FUNC(sger,SGER)(int *m__,
2388 : int *n__,
2389 : float *alpha__,
2390 : float *x,
2391 : int *incx__,
2392 : float *y,
2393 : int *incy__,
2394 : float *a,
2395 : int *lda__)
2396 : {
2397 : int ix,kx,jy;
2398 : int i,j;
2399 : float temp;
2400 :
2401 0 : int m = *m__;
2402 0 : int n = *n__;
2403 0 : int incx = *incx__;
2404 0 : int incy = *incy__;
2405 0 : int lda = *lda__;
2406 0 : float alpha = *alpha__;
2407 :
2408 0 : if(m<=0 || n<=0 || std::abs(alpha)<PLUMED_GMX_FLOAT_MIN)
2409 : return;
2410 :
2411 0 : if(incy>0)
2412 : jy = 0;
2413 : else
2414 0 : jy = incy * (1 - n);
2415 :
2416 0 : if(incx==1) {
2417 0 : for(j=0;j<n;j++,jy+=incy)
2418 0 : if(std::abs(y[jy])>PLUMED_GMX_FLOAT_MIN) {
2419 0 : temp = alpha * y[jy];
2420 0 : for(i=0;i<m;i++)
2421 0 : a[j*(lda)+i] += temp*x[i];
2422 : }
2423 : } else {
2424 : /* non-unit incx */
2425 0 : if(incx>0)
2426 : kx = 0;
2427 : else
2428 0 : kx = incx * (1 - m);
2429 :
2430 0 : for(j=0;j<n;j++,jy+=incy) {
2431 0 : if(std::abs(y[jy])>PLUMED_GMX_FLOAT_MIN) {
2432 0 : temp = alpha * y[jy];
2433 : ix = kx;
2434 0 : for(i=0;i<m;i++,ix+=incx)
2435 0 : a[j*(lda)+i] += temp*x[ix];
2436 : }
2437 : }
2438 : }
2439 : return;
2440 : }
2441 : }
2442 : }
2443 : #include <cmath>
2444 :
2445 :
2446 : #include "real.h"
2447 : #include "blas.h"
2448 :
2449 : namespace PLMD{
2450 : namespace blas{
2451 : float
2452 0 : PLUMED_BLAS_F77_FUNC(snrm2,SNRM2)(int * n__,
2453 : float * x,
2454 : int * incx__)
2455 : {
2456 : int ix,max_ix;
2457 : float ssq,scale,absxi,t;
2458 :
2459 0 : int n = *n__;
2460 0 : int incx = *incx__;
2461 :
2462 0 : if(n<1 || incx<1)
2463 : return 0;
2464 0 : else if (n==1) {
2465 0 : t = x[0];
2466 0 : if(t>=0)
2467 : return t;
2468 : else
2469 0 : return -t;
2470 : }
2471 :
2472 : scale = 0.0;
2473 : ssq = 1.0;
2474 :
2475 0 : max_ix = 1+(n-1)*(incx);
2476 0 : for(ix=1;ix<=max_ix;ix+=incx) {
2477 0 : t = x[ix-1];
2478 0 : if(std::abs(t)>PLUMED_GMX_FLOAT_MIN) {
2479 0 : absxi = (t>=0) ? t : (-t);
2480 0 : if(scale<absxi) {
2481 0 : t = scale/absxi;
2482 0 : t = t*t;
2483 0 : ssq = ssq*t + 1.0;
2484 : scale = absxi;
2485 : } else {
2486 0 : t = absxi/scale;
2487 0 : ssq += t*t;
2488 : }
2489 : }
2490 : }
2491 0 : return scale*std::sqrt(ssq);
2492 :
2493 : }
2494 :
2495 :
2496 :
2497 : }
2498 : }
2499 : #include "blas.h"
2500 :
2501 : namespace PLMD{
2502 : namespace blas{
2503 : void
2504 0 : PLUMED_BLAS_F77_FUNC(srot,SROT)(int *n__,
2505 : float *dx,
2506 : int *incx__,
2507 : float *dy,
2508 : int *incy__,
2509 : float *c__,
2510 : float *s__)
2511 : {
2512 : int i,ix,iy;
2513 : float dtemp;
2514 :
2515 0 : int n = *n__;
2516 0 : int incx = *incx__;
2517 0 : int incy = *incy__;
2518 0 : float c = *c__;
2519 0 : float s = *s__;
2520 :
2521 0 : if(incx!=1 || incy!=1) {
2522 : ix = 0;
2523 : iy = 0;
2524 0 : if(incx<0)
2525 0 : ix = (1-n)*(incx);
2526 0 : if(incy<0)
2527 0 : iy = (1-n)*(incy);
2528 :
2529 0 : for(i=0;i<n;i++,ix+=incx,iy+=incy) {
2530 0 : dtemp = (c) * dx[ix] + (s) * dy[iy];
2531 0 : dy[iy] = (c) * dy[iy] - (s) * dx[ix];
2532 0 : dx[ix] = dtemp;
2533 : }
2534 :
2535 : return;
2536 :
2537 : } else {
2538 :
2539 : /* unit increments */
2540 0 : for(i=0;i<n;i++) {
2541 0 : dtemp = (c) * dx[i] + (s) * dy[i];
2542 0 : dy[i] = (c) * dy[i] - (s) * dx[i];
2543 0 : dx[i] = dtemp;
2544 : }
2545 :
2546 : }
2547 : }
2548 : }
2549 : }
2550 : #include "blas.h"
2551 :
2552 : namespace PLMD{
2553 : namespace blas{
2554 : void
2555 0 : PLUMED_BLAS_F77_FUNC(sscal,SSCAL)(int *n__,
2556 : float *fact__,
2557 : float *dx,
2558 : int *incx__)
2559 : {
2560 : int nincx,i;
2561 :
2562 0 : int n = *n__;
2563 0 : float fact = *fact__;
2564 0 : int incx = *incx__;
2565 :
2566 0 : if(n<=0 || incx<=0)
2567 : return;
2568 :
2569 0 : if(incx==1) {
2570 : /* Unrool factor 5 */
2571 0 : for(i=0;i<(n-5);i+=5) {
2572 0 : dx[i] *= fact;
2573 0 : dx[i+1] *= fact;
2574 0 : dx[i+2] *= fact;
2575 0 : dx[i+3] *= fact;
2576 0 : dx[i+4] *= fact;
2577 : }
2578 : /* continue with current value of i */
2579 0 : for(;i<n;i++)
2580 0 : dx[i] *= fact;
2581 :
2582 : return;
2583 : } else {
2584 : /* inc != 1 */
2585 0 : nincx = n * (incx);
2586 0 : for (i=0;i<nincx;i+=incx)
2587 0 : dx[i] *= fact;
2588 :
2589 : return;
2590 : }
2591 :
2592 : }
2593 : }
2594 : }
2595 : #include "blas.h"
2596 :
2597 : namespace PLMD{
2598 : namespace blas{
2599 : void
2600 0 : PLUMED_BLAS_F77_FUNC(sswap,SSWAP)(int *n__,
2601 : float *dx,
2602 : int *incx__,
2603 : float *dy,
2604 : int *incy__)
2605 : {
2606 : int i,ix,iy;
2607 : float d1,d2,d3;
2608 :
2609 0 : int n = *n__;
2610 0 : int incx = *incx__;
2611 0 : int incy = *incy__;
2612 :
2613 0 : if(n<=0)
2614 : return;
2615 :
2616 0 : if(incx==1 && incy==1) {
2617 0 : for(i=0;i<(n-3);i+=3) {
2618 0 : d1 = dx[i];
2619 0 : d2 = dx[i+1];
2620 0 : d3 = dx[i+2];
2621 0 : dx[i] = dy[i];
2622 0 : dx[i+1] = dy[i+1];
2623 0 : dx[i+2] = dy[i+2];
2624 0 : dy[i] = d1;
2625 0 : dy[i+1] = d2;
2626 0 : dy[i+2] = d3;
2627 : }
2628 : /* continue with last i value */
2629 0 : for(;i<n;i++) {
2630 0 : d1 = dx[i];
2631 0 : dx[i] = dy[i];
2632 0 : dy[i] = d1;
2633 : }
2634 :
2635 : } else {
2636 : ix = 0;
2637 : iy = 0;
2638 0 : if(incx<0)
2639 0 : ix = incx * (1 - n);
2640 0 : if(incy<0)
2641 0 : iy = incy * (1 - n);
2642 :
2643 0 : for(i=0;i<n;i++,ix+=incx,iy+=incy) {
2644 0 : d1 = dx[ix];
2645 0 : dx[ix] = dy[iy];
2646 0 : dy[iy] = d1;
2647 : }
2648 : }
2649 : return;
2650 : }
2651 :
2652 : }
2653 : }
2654 : #include <cctype>
2655 : #include <cmath>
2656 :
2657 : #include "real.h"
2658 : #include "blas.h"
2659 :
2660 : namespace PLMD{
2661 : namespace blas{
2662 : void
2663 0 : PLUMED_BLAS_F77_FUNC(ssymv,SSYMV)(const char *uplo,
2664 : int *n__,
2665 : float *alpha__,
2666 : float *a,
2667 : int *lda__,
2668 : float *x,
2669 : int *incx__,
2670 : float *beta__,
2671 : float *y,
2672 : int *incy__)
2673 : {
2674 0 : const char ch=std::toupper(*uplo);
2675 : int kx,ky,i,j,ix,iy,jx,jy;
2676 : float temp1,temp2;
2677 :
2678 0 : int n = *n__;
2679 0 : int lda = *lda__;
2680 0 : int incx = *incx__;
2681 0 : int incy = *incy__;
2682 0 : float alpha = *alpha__;
2683 0 : float beta = *beta__;
2684 :
2685 0 : if(n<=0 || incx==0 || incy==0)
2686 : return;
2687 :
2688 0 : if(incx>0)
2689 : kx = 1;
2690 : else
2691 0 : kx = 1 - (n -1)*(incx);
2692 :
2693 0 : if(incy>0)
2694 : ky = 1;
2695 : else
2696 0 : ky = 1 - (n -1)*(incy);
2697 :
2698 0 : if(std::abs(beta-1.0)>PLUMED_GMX_FLOAT_EPS) {
2699 0 : if(incy==1) {
2700 0 : if(std::abs(beta)<PLUMED_GMX_FLOAT_MIN)
2701 0 : for(i=1;i<=n;i++)
2702 0 : y[i-1] = 0.0;
2703 : else
2704 0 : for(i=1;i<=n;i++)
2705 0 : y[i-1] *= beta;
2706 : } else {
2707 : /* non-unit incr. */
2708 : iy = ky;
2709 0 : if(std::abs(beta)<PLUMED_GMX_FLOAT_MIN)
2710 0 : for(i=1;i<=n;i++) {
2711 0 : y[iy-1] = 0.0;
2712 0 : iy += incy;
2713 : }
2714 : else
2715 0 : for(i=1;i<=n;i++) {
2716 0 : y[iy-1] *= beta;
2717 0 : iy += incy;
2718 : }
2719 : }
2720 : }
2721 :
2722 0 : if(std::abs(alpha)<PLUMED_GMX_FLOAT_MIN)
2723 : return;
2724 :
2725 0 : if(ch=='U') {
2726 0 : if(incx==1 && incy==1) {
2727 0 : for(j=1;j<=n;j++) {
2728 0 : temp1 = alpha * x[j-1];
2729 : temp2 = 0.0;
2730 0 : for(i=1;i<j;i++) {
2731 0 : y[i-1] += temp1*a[(j-1)*(lda)+(i-1)];
2732 0 : temp2 += a[(j-1)*(lda)+(i-1)] * x[i-1];
2733 : }
2734 0 : y[j-1] += temp1*a[(j-1)*(lda)+(j-1)] + alpha *temp2;
2735 : }
2736 : } else {
2737 : /* non-unit incr. */
2738 : jx = kx;
2739 : jy = ky;
2740 0 : for(j=1;j<=n;j++) {
2741 0 : temp1 = alpha * x[jx-1];
2742 : temp2 = 0.0;
2743 : ix = kx;
2744 : iy = ky;
2745 0 : for(i=1;i<j;i++) {
2746 0 : y[iy-1] += temp1 * a[(j-1)*(lda)+(i-1)];
2747 0 : temp2 += a[(j-1)*(lda)+(i-1)] * x[ix-1];
2748 0 : ix += incx;
2749 0 : iy += incy;
2750 : }
2751 0 : y[jy-1] += temp1*a[(j-1)*(lda)+(j-1)] + alpha*temp2;
2752 0 : jx += incx;
2753 0 : jy += incy;
2754 : }
2755 : }
2756 : } else {
2757 : /* lower */
2758 0 : if(incx==1 && incy==1) {
2759 0 : for(j=1;j<=n;j++) {
2760 0 : temp1 = alpha * x[j-1];
2761 : temp2 = 0.0;
2762 0 : y[j-1] += temp1 * a[(j-1)*(lda)+(j-1)];
2763 0 : for(i=j+1;i<=n;i++) {
2764 0 : y[i-1] += temp1*a[(j-1)*(lda)+(i-1)];
2765 0 : temp2 += a[(j-1)*(lda)+(i-1)] * x[i-1];
2766 : }
2767 0 : y[j-1] += alpha *temp2;
2768 : }
2769 : } else {
2770 : /* non-unit incr. */
2771 : jx = kx;
2772 : jy = ky;
2773 0 : for(j=1;j<=n;j++) {
2774 0 : temp1 = alpha * x[jx-1];
2775 : temp2 = 0.0;
2776 0 : y[jy-1] += temp1 * a[(j-1)*(lda)+(j-1)];
2777 : ix = jx;
2778 : iy = jy;
2779 0 : for(i=j+1;i<=n;i++) {
2780 0 : ix += incx;
2781 0 : iy += incy;
2782 0 : y[iy-1] += temp1 * a[(j-1)*(lda)+(i-1)];
2783 0 : temp2 += a[(j-1)*(lda)+(i-1)] * x[ix-1];
2784 : }
2785 0 : y[jy-1] += alpha*temp2;
2786 0 : jx += incx;
2787 0 : jy += incy;
2788 : }
2789 : }
2790 : }
2791 : return;
2792 : }
2793 : }
2794 : }
2795 : #include <cctype>
2796 : #include <cmath>
2797 :
2798 : #include "real.h"
2799 : #include "blas.h"
2800 :
2801 : namespace PLMD{
2802 : namespace blas{
2803 : void
2804 0 : PLUMED_BLAS_F77_FUNC(ssyr2,SSYR2)(const char * uplo,
2805 : int * n__,
2806 : float * alpha__,
2807 : float * x,
2808 : int * incx__,
2809 : float * y,
2810 : int * incy__,
2811 : float * a,
2812 : int * lda__)
2813 : {
2814 : int kx,ky,ix,iy,jx,jy,j,i;
2815 : float temp1,temp2;
2816 0 : const char ch=std::toupper(*uplo);
2817 :
2818 0 : int n = *n__;
2819 0 : int lda = *lda__;
2820 0 : int incx = *incx__;
2821 0 : int incy = *incy__;
2822 0 : float alpha = *alpha__;
2823 :
2824 0 : if(n<=0 || std::abs(alpha)<PLUMED_GMX_FLOAT_MIN || incx==0 || incy==0 ||
2825 0 : (ch != 'U' && ch != 'L'))
2826 : return;
2827 :
2828 : jx = jy = kx = ky = 0;
2829 :
2830 : /* init start points for non-unit increments */
2831 0 : if(incx!=1 || incy!=1) {
2832 0 : if(incx>0)
2833 : kx = 1;
2834 : else
2835 0 : kx = 1 - (n - 1)*(incx);
2836 0 : if(incy>0)
2837 : ky = 1;
2838 : else
2839 0 : ky = 1 - (n - 1)*(incy);
2840 :
2841 : jx = kx;
2842 : jy = ky;
2843 : }
2844 :
2845 0 : if(ch == 'U') {
2846 : /* Data in upper part of A */
2847 0 : if(incx==1 && incy==1) {
2848 : /* Unit increments for both x and y */
2849 0 : for(j=1;j<=n;j++) {
2850 0 : if( std::abs(x[j-1])>PLUMED_GMX_FLOAT_MIN || std::abs(y[j-1])>PLUMED_GMX_FLOAT_MIN ) {
2851 0 : temp1 = alpha * y[j-1];
2852 0 : temp2 = alpha * x[j-1];
2853 0 : for(i=1;i<=j;i++)
2854 0 : a[(j-1)*(lda)+(i-1)] += x[i-1]*temp1 + y[i-1]*temp2;
2855 : }
2856 : }
2857 : } else {
2858 :
2859 : /* non-unit increments */
2860 0 : for(j=1;j<=n;j++) {
2861 :
2862 0 : if( std::abs(x[jx-1])>PLUMED_GMX_FLOAT_MIN || std::abs(y[jy-1])>PLUMED_GMX_FLOAT_MIN ) {
2863 0 : temp1 = alpha * y[jy-1];
2864 0 : temp2 = alpha * x[jx-1];
2865 : ix = kx;
2866 : iy = ky;
2867 0 : for(i=1;i<=j;i++) {
2868 0 : a[(j-1)*(lda)+(i-1)] += x[ix-1]*temp1 + y[iy-1]*temp2;
2869 0 : ix += incx;
2870 0 : iy += incy;
2871 : }
2872 : }
2873 0 : jx += incx;
2874 0 : jy += incy;
2875 : }
2876 : }
2877 : } else {
2878 : /* Data in lower part of A */
2879 0 : if(incx==1 && incy==1) {
2880 : /* Unit increments for both x and y */
2881 0 : for(j=1;j<=n;j++) {
2882 0 : if( std::abs(x[j-1])>PLUMED_GMX_FLOAT_MIN || std::abs(y[j-1])>PLUMED_GMX_FLOAT_MIN ) {
2883 0 : temp1 = alpha * y[j-1];
2884 0 : temp2 = alpha * x[j-1];
2885 0 : for(i=j;i<=n;i++)
2886 0 : a[(j-1)*(lda)+(i-1)] += x[i-1]*temp1 + y[i-1]*temp2;
2887 : }
2888 : }
2889 : } else {
2890 :
2891 : /* non-unit increments */
2892 0 : for(j=1;j<=n;j++) {
2893 :
2894 0 : if( std::abs(x[jx-1])>PLUMED_GMX_FLOAT_MIN || std::abs(y[jy-1])>PLUMED_GMX_FLOAT_MIN ) {
2895 0 : temp1 = alpha * y[jy-1];
2896 0 : temp2 = alpha * x[jx-1];
2897 : ix = jx;
2898 : iy = jy;
2899 0 : for(i=j;i<=n;i++) {
2900 0 : a[(j-1)*(lda)+(i-1)] += x[ix-1]*temp1 + y[iy-1]*temp2;
2901 0 : ix += incx;
2902 0 : iy += incy;
2903 : }
2904 : }
2905 0 : jx += incx;
2906 0 : jy += incy;
2907 : }
2908 : }
2909 : }
2910 :
2911 : return;
2912 : }
2913 : }
2914 : }
2915 : #include <cctype>
2916 : #include <cmath>
2917 :
2918 : #include "real.h"
2919 : #include "blas.h"
2920 :
2921 : namespace PLMD{
2922 : namespace blas{
2923 : void
2924 0 : PLUMED_BLAS_F77_FUNC(ssyr2k,SSYR2K)(const char *uplo,
2925 : const char *trans,
2926 : int *n__,
2927 : int *k__,
2928 : float *alpha__,
2929 : float *a,
2930 : int *lda__,
2931 : float *b,
2932 : int *ldb__,
2933 : float *beta__,
2934 : float *c,
2935 : int *ldc__)
2936 : {
2937 : char ch1,ch2;
2938 : int i,j,l;
2939 : float temp1,temp2;
2940 :
2941 0 : int n = *n__;
2942 0 : int k = *k__;
2943 0 : int lda = *lda__;
2944 0 : int ldb = *ldb__;
2945 0 : int ldc = *ldc__;
2946 :
2947 0 : float alpha = *alpha__;
2948 0 : float beta = *beta__;
2949 :
2950 0 : ch1 = std::toupper(*uplo);
2951 0 : ch2 = std::toupper(*trans);
2952 :
2953 0 : if(n==0 || ( ( std::abs(alpha)<PLUMED_GMX_FLOAT_MIN || k==0 ) && std::abs(beta-1.0)<PLUMED_GMX_FLOAT_EPS))
2954 : return;
2955 :
2956 0 : if(std::abs(alpha)<PLUMED_GMX_FLOAT_MIN) {
2957 0 : if(ch1=='U') {
2958 0 : if(std::abs(beta)<PLUMED_GMX_FLOAT_MIN)
2959 0 : for(j=1;j<=n;j++)
2960 0 : for(i=1;i<=j;i++)
2961 0 : c[(j-1)*(ldc)+(i-1)] = 0.0;
2962 : else
2963 0 : for(j=1;j<=n;j++)
2964 0 : for(i=1;i<=j;i++)
2965 0 : c[(j-1)*(ldc)+(i-1)] *= beta;
2966 : } else {
2967 : /* lower */
2968 0 : if(std::abs(beta)<PLUMED_GMX_FLOAT_MIN)
2969 0 : for(j=1;j<=n;j++)
2970 0 : for(i=j;i<=n;i++)
2971 0 : c[(j-1)*(ldc)+(i-1)] = 0.0;
2972 : else
2973 0 : for(j=1;j<=n;j++)
2974 0 : for(i=j;i<=n;i++)
2975 0 : c[(j-1)*(ldc)+(i-1)] *= beta;
2976 : }
2977 0 : return;
2978 : }
2979 :
2980 0 : if(ch2=='N') {
2981 0 : if(ch1=='U') {
2982 0 : for(j=1;j<=n;j++) {
2983 0 : if(std::abs(beta)<PLUMED_GMX_FLOAT_MIN)
2984 0 : for(i=1;i<=j;i++)
2985 0 : c[(j-1)*(ldc)+(i-1)] = 0.0;
2986 0 : else if(std::abs(beta-1.0)>PLUMED_GMX_FLOAT_EPS)
2987 0 : for(i=1;i<=j;i++)
2988 0 : c[(j-1)*(ldc)+(i-1)] *= beta;
2989 0 : for(l=1;l<=k;l++) {
2990 0 : if( std::abs(a[(l-1)*(lda)+(j-1)])>PLUMED_GMX_FLOAT_MIN ||
2991 0 : std::abs(b[(l-1)*(ldb)+(j-1)])>PLUMED_GMX_FLOAT_MIN) {
2992 0 : temp1 = alpha * b[(l-1)*(ldb)+(j-1)];
2993 0 : temp2 = alpha * a[(l-1)*(lda)+(j-1)];
2994 0 : for(i=1;i<=j;i++)
2995 0 : c[(j-1)*(ldc)+(i-1)] +=
2996 0 : a[(l-1)*(lda)+(i-1)] * temp1 +
2997 0 : b[(l-1)*(ldb)+(i-1)] * temp2;
2998 : }
2999 : }
3000 : }
3001 : } else {
3002 : /* lower */
3003 0 : for(j=1;j<=n;j++) {
3004 0 : if(std::abs(beta)<PLUMED_GMX_FLOAT_MIN)
3005 0 : for(i=j;i<=n;i++)
3006 0 : c[(j-1)*(ldc)+(i-1)] = 0.0;
3007 0 : else if(std::abs(beta-1.0)>PLUMED_GMX_FLOAT_EPS)
3008 0 : for(i=j;i<=n;i++)
3009 0 : c[(j-1)*(ldc)+(i-1)] *= beta;
3010 0 : for(l=1;l<=k;l++) {
3011 0 : if( std::abs(a[(l-1)*(lda)+(j-1)])>PLUMED_GMX_FLOAT_MIN ||
3012 0 : std::abs(b[(l-1)*(ldb)+(j-1)])>PLUMED_GMX_FLOAT_MIN) {
3013 0 : temp1 = alpha * b[(l-1)*(ldb)+(j-1)];
3014 0 : temp2 = alpha * a[(l-1)*(lda)+(j-1)];
3015 0 : for(i=j;i<=n;i++)
3016 0 : c[(j-1)*(ldc)+(i-1)] +=
3017 0 : a[(l-1)*(lda)+(i-1)] * temp1 +
3018 0 : b[(l-1)*(ldb)+(i-1)] * temp2;
3019 : }
3020 : }
3021 : }
3022 : }
3023 : } else {
3024 : /* transpose */
3025 0 : if(ch1=='U') {
3026 0 : for(j=1;j<=n;j++)
3027 0 : for(i=1;i<=j;i++) {
3028 : temp1 = 0.0;
3029 : temp2 = 0.0;
3030 0 : for (l=1;l<=k;l++) {
3031 0 : temp1 += a[(i-1)*(lda)+(l-1)] * b[(j-1)*(ldb)+(l-1)];
3032 0 : temp2 += b[(i-1)*(ldb)+(l-1)] * a[(j-1)*(lda)+(l-1)];
3033 : }
3034 0 : if(std::abs(beta)<PLUMED_GMX_FLOAT_MIN)
3035 0 : c[(j-1)*(ldc)+(i-1)] = alpha * (temp1 + temp2);
3036 : else
3037 0 : c[(j-1)*(ldc)+(i-1)] = beta * c[(j-1)*(ldc)+(i-1)] +
3038 0 : alpha * (temp1 + temp2);
3039 : }
3040 : } else {
3041 : /* lower */
3042 0 : for(j=1;j<=n;j++)
3043 0 : for(i=j;i<=n;i++) {
3044 : temp1 = 0.0;
3045 : temp2 = 0.0;
3046 0 : for (l=1;l<=k;l++) {
3047 0 : temp1 += a[(i-1)*(lda)+(l-1)] * b[(j-1)*(ldb)+(l-1)];
3048 0 : temp2 += b[(i-1)*(ldb)+(l-1)] * a[(j-1)*(lda)+(l-1)];
3049 : }
3050 0 : if(std::abs(beta)<PLUMED_GMX_FLOAT_MIN)
3051 0 : c[(j-1)*(ldc)+(i-1)] = alpha * (temp1 + temp2);
3052 : else
3053 0 : c[(j-1)*(ldc)+(i-1)] = beta * c[(j-1)*(ldc)+(i-1)] +
3054 0 : alpha * (temp1 + temp2);
3055 : }
3056 : }
3057 : }
3058 : return;
3059 : }
3060 : }
3061 : }
3062 : #include <cmath>
3063 :
3064 : #include "real.h"
3065 : #include "blas.h"
3066 :
3067 : namespace PLMD{
3068 : namespace blas{
3069 : void
3070 0 : PLUMED_BLAS_F77_FUNC(strmm,STRMM)(const char *side,
3071 : const char *uplo,
3072 : const char *transa,
3073 : const char *diag,
3074 : int *m__,
3075 : int *n__,
3076 : float *alpha__,
3077 : float *a,
3078 : int *lda__,
3079 : float *b,
3080 : int *ldb__)
3081 : {
3082 : int a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3;
3083 :
3084 0 : int m = *m__;
3085 0 : int n = *n__;
3086 0 : int lda = *lda__;
3087 0 : int ldb = *ldb__;
3088 0 : float alpha = *alpha__;
3089 :
3090 : /* Local variables */
3091 : int i__, j, k;
3092 : float temp;
3093 : int lside;
3094 : int upper;
3095 : int nounit;
3096 : a_dim1 = lda;
3097 0 : a_offset = 1 + a_dim1;
3098 0 : a -= a_offset;
3099 : b_dim1 = ldb;
3100 0 : b_offset = 1 + b_dim1;
3101 0 : b -= b_offset;
3102 :
3103 : /* Function Body */
3104 0 : lside = (*side=='L' || *side=='l');
3105 :
3106 0 : nounit = (*diag=='N' || *diag=='n');
3107 0 : upper = (*uplo=='U' || *uplo=='u');
3108 :
3109 0 : if (n == 0) {
3110 : return;
3111 : }
3112 0 : if (std::abs(alpha)<PLUMED_GMX_FLOAT_MIN) {
3113 : i__1 = n;
3114 0 : for (j = 1; j <= i__1; ++j) {
3115 : i__2 = m;
3116 0 : for (i__ = 1; i__ <= i__2; ++i__) {
3117 0 : b[i__ + j * b_dim1] = 0.;
3118 : }
3119 : }
3120 : return;
3121 : }
3122 0 : if (lside) {
3123 0 : if (*transa=='N' || *transa=='n') {
3124 0 : if (upper) {
3125 : i__1 = n;
3126 0 : for (j = 1; j <= i__1; ++j) {
3127 : i__2 = m;
3128 0 : for (k = 1; k <= i__2; ++k) {
3129 0 : if ( std::abs(b[k + j * b_dim1])>PLUMED_GMX_FLOAT_MIN) {
3130 0 : temp = alpha * b[k + j * b_dim1];
3131 : i__3 = k - 1;
3132 0 : for (i__ = 1; i__ <= i__3; ++i__) {
3133 0 : b[i__ + j * b_dim1] += temp * a[i__ + k *
3134 0 : a_dim1];
3135 : }
3136 0 : if (nounit) {
3137 0 : temp *= a[k + k * a_dim1];
3138 : }
3139 0 : b[k + j * b_dim1] = temp;
3140 : }
3141 : }
3142 : }
3143 : } else {
3144 : i__1 = n;
3145 0 : for (j = 1; j <= i__1; ++j) {
3146 0 : for (k = m; k >= 1; --k) {
3147 0 : if (std::abs(b[k + j * b_dim1])>PLUMED_GMX_FLOAT_MIN) {
3148 0 : temp = alpha * b[k + j * b_dim1];
3149 0 : b[k + j * b_dim1] = temp;
3150 0 : if (nounit) {
3151 0 : b[k + j * b_dim1] *= a[k + k * a_dim1];
3152 : }
3153 : i__2 = m;
3154 0 : for (i__ = k + 1; i__ <= i__2; ++i__) {
3155 0 : b[i__ + j * b_dim1] += temp * a[i__ + k *
3156 0 : a_dim1];
3157 : }
3158 : }
3159 : }
3160 : }
3161 : }
3162 : } else {
3163 :
3164 0 : if (upper) {
3165 : i__1 = n;
3166 0 : for (j = 1; j <= i__1; ++j) {
3167 0 : for (i__ = m; i__ >= 1; --i__) {
3168 0 : temp = b[i__ + j * b_dim1];
3169 0 : if (nounit) {
3170 0 : temp *= a[i__ + i__ * a_dim1];
3171 : }
3172 : i__2 = i__ - 1;
3173 0 : for (k = 1; k <= i__2; ++k) {
3174 0 : temp += a[k + i__ * a_dim1] * b[k + j * b_dim1];
3175 : }
3176 0 : b[i__ + j * b_dim1] = alpha * temp;
3177 : }
3178 : }
3179 : } else {
3180 : i__1 = n;
3181 0 : for (j = 1; j <= i__1; ++j) {
3182 : i__2 = m;
3183 0 : for (i__ = 1; i__ <= i__2; ++i__) {
3184 0 : temp = b[i__ + j * b_dim1];
3185 0 : if (nounit) {
3186 0 : temp *= a[i__ + i__ * a_dim1];
3187 : }
3188 : i__3 = m;
3189 0 : for (k = i__ + 1; k <= i__3; ++k) {
3190 0 : temp += a[k + i__ * a_dim1] * b[k + j * b_dim1];
3191 : }
3192 0 : b[i__ + j * b_dim1] = alpha * temp;
3193 : }
3194 : }
3195 : }
3196 : }
3197 : } else {
3198 0 : if (*transa=='N' || *transa=='n') {
3199 :
3200 0 : if (upper) {
3201 0 : for (j = n; j >= 1; --j) {
3202 : temp = alpha;
3203 0 : if (nounit) {
3204 0 : temp *= a[j + j * a_dim1];
3205 : }
3206 : i__1 = m;
3207 0 : for (i__ = 1; i__ <= i__1; ++i__) {
3208 0 : b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1];
3209 : }
3210 : i__1 = j - 1;
3211 0 : for (k = 1; k <= i__1; ++k) {
3212 0 : if ( std::abs(a[k + j * a_dim1])>PLUMED_GMX_FLOAT_MIN) {
3213 0 : temp = alpha * a[k + j * a_dim1];
3214 : i__2 = m;
3215 0 : for (i__ = 1; i__ <= i__2; ++i__) {
3216 0 : b[i__ + j * b_dim1] += temp * b[i__ + k *
3217 0 : b_dim1];
3218 : }
3219 : }
3220 : }
3221 : }
3222 : } else {
3223 : i__1 = n;
3224 0 : for (j = 1; j <= i__1; ++j) {
3225 : temp = alpha;
3226 0 : if (nounit) {
3227 0 : temp *= a[j + j * a_dim1];
3228 : }
3229 : i__2 = m;
3230 0 : for (i__ = 1; i__ <= i__2; ++i__) {
3231 0 : b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1];
3232 : }
3233 : i__2 = n;
3234 0 : for (k = j + 1; k <= i__2; ++k) {
3235 0 : if ( std::abs(a[k + j * a_dim1])>PLUMED_GMX_FLOAT_MIN) {
3236 0 : temp = alpha * a[k + j * a_dim1];
3237 : i__3 = m;
3238 0 : for (i__ = 1; i__ <= i__3; ++i__) {
3239 0 : b[i__ + j * b_dim1] += temp * b[i__ + k *
3240 0 : b_dim1];
3241 : }
3242 : }
3243 : }
3244 : }
3245 : }
3246 : } else {
3247 :
3248 0 : if (upper) {
3249 : i__1 = n;
3250 0 : for (k = 1; k <= i__1; ++k) {
3251 : i__2 = k - 1;
3252 0 : for (j = 1; j <= i__2; ++j) {
3253 0 : if ( std::abs(a[j + k * a_dim1])>PLUMED_GMX_FLOAT_MIN ) {
3254 0 : temp = alpha * a[j + k * a_dim1];
3255 : i__3 = m;
3256 0 : for (i__ = 1; i__ <= i__3; ++i__) {
3257 0 : b[i__ + j * b_dim1] += temp * b[i__ + k *
3258 0 : b_dim1];
3259 : }
3260 : }
3261 : }
3262 : temp = alpha;
3263 0 : if (nounit) {
3264 0 : temp *= a[k + k * a_dim1];
3265 : }
3266 0 : if ( std::abs(temp-1.0)>PLUMED_GMX_FLOAT_EPS) {
3267 : i__2 = m;
3268 0 : for (i__ = 1; i__ <= i__2; ++i__) {
3269 0 : b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1];
3270 : }
3271 : }
3272 : }
3273 : } else {
3274 0 : for (k = n; k >= 1; --k) {
3275 : i__1 = n;
3276 0 : for (j = k + 1; j <= i__1; ++j) {
3277 0 : if ( std::abs(a[j + k * a_dim1])>PLUMED_GMX_FLOAT_MIN) {
3278 0 : temp = alpha * a[j + k * a_dim1];
3279 : i__2 = m;
3280 0 : for (i__ = 1; i__ <= i__2; ++i__) {
3281 0 : b[i__ + j * b_dim1] += temp * b[i__ + k *
3282 0 : b_dim1];
3283 : }
3284 : }
3285 : }
3286 : temp = alpha;
3287 0 : if (nounit) {
3288 0 : temp *= a[k + k * a_dim1];
3289 : }
3290 0 : if ( std::abs(temp-1.0)>PLUMED_GMX_FLOAT_EPS) {
3291 : i__1 = m;
3292 0 : for (i__ = 1; i__ <= i__1; ++i__) {
3293 0 : b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1];
3294 : }
3295 : }
3296 : }
3297 : }
3298 : }
3299 : }
3300 :
3301 : return;
3302 :
3303 : }
3304 :
3305 :
3306 : }
3307 : }
3308 : #include <cmath>
3309 :
3310 : #include "real.h"
3311 : #include "blas.h"
3312 :
3313 : namespace PLMD{
3314 : namespace blas{
3315 : void
3316 0 : PLUMED_BLAS_F77_FUNC(strmv,STRMV)(const char *uplo,
3317 : const char *trans,
3318 : const char *diag,
3319 : int *n__,
3320 : float *a,
3321 : int *lda__,
3322 : float *x,
3323 : int *incx__)
3324 : {
3325 : int a_dim1, a_offset, i__1, i__2;
3326 :
3327 : int i__, j, ix, jx, kx;
3328 : float temp;
3329 : int nounit;
3330 :
3331 0 : int n = *n__;
3332 0 : int lda = *lda__;
3333 0 : int incx = *incx__;
3334 :
3335 : a_dim1 = lda;
3336 0 : a_offset = 1 + a_dim1;
3337 0 : a -= a_offset;
3338 0 : --x;
3339 :
3340 0 : if (n == 0) {
3341 : return;
3342 : }
3343 :
3344 0 : nounit = (*diag=='n' || *diag=='N');
3345 :
3346 0 : if (incx <= 0) {
3347 0 : kx = 1 - (n - 1) * incx;
3348 : } else {
3349 : kx = 1;
3350 : }
3351 :
3352 0 : if (*trans=='N' || *trans=='n') {
3353 :
3354 0 : if (*uplo=='U' || *uplo=='u') {
3355 0 : if (incx == 1) {
3356 : i__1 = n;
3357 0 : for (j = 1; j <= i__1; ++j) {
3358 0 : if (std::abs(x[j])>PLUMED_GMX_FLOAT_MIN) {
3359 : temp = x[j];
3360 : i__2 = j - 1;
3361 0 : for (i__ = 1; i__ <= i__2; ++i__) {
3362 0 : x[i__] += temp * a[i__ + j * a_dim1];
3363 : }
3364 0 : if (nounit) {
3365 0 : x[j] *= a[j + j * a_dim1];
3366 : }
3367 : }
3368 : }
3369 : } else {
3370 : jx = kx;
3371 : i__1 = n;
3372 0 : for (j = 1; j <= i__1; ++j) {
3373 0 : if (std::abs(x[jx])>PLUMED_GMX_FLOAT_MIN) {
3374 : temp = x[jx];
3375 : ix = kx;
3376 : i__2 = j - 1;
3377 0 : for (i__ = 1; i__ <= i__2; ++i__) {
3378 0 : x[ix] += temp * a[i__ + j * a_dim1];
3379 0 : ix += incx;
3380 : }
3381 0 : if (nounit) {
3382 0 : x[jx] *= a[j + j * a_dim1];
3383 : }
3384 : }
3385 0 : jx += incx;
3386 : }
3387 : }
3388 : } else {
3389 0 : if (incx == 1) {
3390 0 : for (j = n; j >= 1; --j) {
3391 0 : if (std::abs(x[j])>PLUMED_GMX_FLOAT_MIN) {
3392 : temp = x[j];
3393 : i__1 = j + 1;
3394 0 : for (i__ = n; i__ >= i__1; --i__) {
3395 0 : x[i__] += temp * a[i__ + j * a_dim1];
3396 : }
3397 0 : if (nounit) {
3398 0 : x[j] *= a[j + j * a_dim1];
3399 : }
3400 : }
3401 : }
3402 : } else {
3403 0 : kx += (n - 1) * incx;
3404 : jx = kx;
3405 0 : for (j = n; j >= 1; --j) {
3406 0 : if (std::abs(x[jx])>PLUMED_GMX_FLOAT_MIN) {
3407 : temp = x[jx];
3408 : ix = kx;
3409 : i__1 = j + 1;
3410 0 : for (i__ = n; i__ >= i__1; --i__) {
3411 0 : x[ix] += temp * a[i__ + j * a_dim1];
3412 0 : ix -= incx;
3413 : }
3414 0 : if (nounit) {
3415 0 : x[jx] *= a[j + j * a_dim1];
3416 : }
3417 : }
3418 0 : jx -= incx;
3419 : }
3420 : }
3421 : }
3422 : } else {
3423 :
3424 0 : if (*uplo=='U' || *uplo=='u') {
3425 0 : if (incx == 1) {
3426 0 : for (j = n; j >= 1; --j) {
3427 0 : temp = x[j];
3428 0 : if (nounit) {
3429 0 : temp *= a[j + j * a_dim1];
3430 : }
3431 0 : for (i__ = j - 1; i__ >= 1; --i__) {
3432 0 : temp += a[i__ + j * a_dim1] * x[i__];
3433 : }
3434 0 : x[j] = temp;
3435 : }
3436 : } else {
3437 0 : jx = kx + (n - 1) * incx;
3438 0 : for (j = n; j >= 1; --j) {
3439 0 : temp = x[jx];
3440 : ix = jx;
3441 0 : if (nounit) {
3442 0 : temp *= a[j + j * a_dim1];
3443 : }
3444 0 : for (i__ = j - 1; i__ >= 1; --i__) {
3445 0 : ix -= incx;
3446 0 : temp += a[i__ + j * a_dim1] * x[ix];
3447 : }
3448 0 : x[jx] = temp;
3449 0 : jx -= incx;
3450 : }
3451 : }
3452 : } else {
3453 0 : if (incx == 1) {
3454 : i__1 = n;
3455 0 : for (j = 1; j <= i__1; ++j) {
3456 0 : temp = x[j];
3457 0 : if (nounit) {
3458 0 : temp *= a[j + j * a_dim1];
3459 : }
3460 : i__2 = n;
3461 0 : for (i__ = j + 1; i__ <= i__2; ++i__) {
3462 0 : temp += a[i__ + j * a_dim1] * x[i__];
3463 : }
3464 0 : x[j] = temp;
3465 : }
3466 : } else {
3467 : jx = kx;
3468 : i__1 = n;
3469 0 : for (j = 1; j <= i__1; ++j) {
3470 0 : temp = x[jx];
3471 : ix = jx;
3472 0 : if (nounit) {
3473 0 : temp *= a[j + j * a_dim1];
3474 : }
3475 : i__2 = n;
3476 0 : for (i__ = j + 1; i__ <= i__2; ++i__) {
3477 0 : ix += incx;
3478 0 : temp += a[i__ + j * a_dim1] * x[ix];
3479 : }
3480 0 : x[jx] = temp;
3481 0 : jx += incx;
3482 : }
3483 : }
3484 : }
3485 : }
3486 :
3487 : return;
3488 :
3489 : }
3490 :
3491 :
3492 : }
3493 : }
3494 : #include <cctype>
3495 : #include <cmath>
3496 :
3497 : #include "real.h"
3498 : #include "blas.h"
3499 :
3500 : namespace PLMD{
3501 : namespace blas{
3502 : void
3503 0 : PLUMED_BLAS_F77_FUNC(strsm,STRSM)(const char * side,
3504 : const char * uplo,
3505 : const char * transa,
3506 : const char * diag,
3507 : int * m__,
3508 : int * n__,
3509 : float *alpha__,
3510 : float *a,
3511 : int * lda__,
3512 : float *b,
3513 : int * ldb__)
3514 : {
3515 0 : const char xside = std::toupper(*side);
3516 0 : const char xuplo = std::toupper(*uplo);
3517 0 : const char xtrans = std::toupper(*transa);
3518 0 : const char xdiag = std::toupper(*diag);
3519 : int i,j,k;
3520 : float temp;
3521 :
3522 0 : int m = *m__;
3523 0 : int n = *n__;
3524 0 : int lda = *lda__;
3525 0 : int ldb = *ldb__;
3526 0 : float alpha = *alpha__;
3527 :
3528 0 : if(n<=0)
3529 : return;
3530 :
3531 :
3532 0 : if(std::abs(alpha)<PLUMED_GMX_FLOAT_MIN) {
3533 0 : for(j=0;j<n;j++)
3534 0 : for(i=0;i<m;i++)
3535 0 : b[j*(ldb)+i] = 0.0;
3536 : return;
3537 : }
3538 :
3539 0 : if(xside=='L') {
3540 : /* left side */
3541 0 : if(xtrans=='N') {
3542 : /* No transpose */
3543 0 : if(xuplo=='U') {
3544 : /* upper */
3545 0 : for(j=0;j<n;j++) {
3546 0 : if(std::abs(alpha-1.0)>PLUMED_GMX_FLOAT_EPS) {
3547 0 : for(i=0;i<m;i++)
3548 0 : b[j*(ldb)+i] *= alpha;
3549 : }
3550 0 : for(k=m-1;k>=0;k--) {
3551 0 : if( std::abs(b[j*(ldb)+k])>PLUMED_GMX_FLOAT_MIN) {
3552 0 : if(xdiag=='N')
3553 0 : b[j*(ldb)+k] /= a[k*(lda)+k];
3554 0 : for(i=0;i<k;i++)
3555 0 : b[j*(ldb)+i] -= b[j*(ldb)+k]*a[k*(lda)+i];
3556 : }
3557 : }
3558 : }
3559 : } else {
3560 : /* lower */
3561 0 : for(j=0;j<n;j++) {
3562 0 : if(std::abs(alpha-1.0)>PLUMED_GMX_FLOAT_EPS)
3563 0 : for(i=0;i<m;i++)
3564 0 : b[j*(ldb)+i] *= alpha;
3565 0 : for(k=0;k<m;k++) {
3566 0 : if( std::abs(b[j*(ldb)+k])>PLUMED_GMX_FLOAT_MIN) {
3567 0 : if(xdiag=='N')
3568 0 : b[j*(ldb)+k] /= a[k*(lda)+k];
3569 0 : for(i=k+1;i<m;i++)
3570 0 : b[j*(ldb)+i] -= b[j*(ldb)+k]*a[k*(lda)+i];
3571 : }
3572 : }
3573 : }
3574 : }
3575 : } else {
3576 : /* Transpose */
3577 0 : if(xuplo=='U') {
3578 : /* upper */
3579 0 : for(j=0;j<n;j++) {
3580 0 : for(i=0;i<m;i++) {
3581 0 : temp = alpha * b[j*(ldb)+i];
3582 0 : for(k=0;k<i;k++)
3583 0 : temp -= a[i*(lda)+k] * b[j*(ldb)+k];
3584 0 : if(xdiag=='N')
3585 0 : temp /= a[i*(lda)+i];
3586 0 : b[j*(ldb)+i] = temp;
3587 : }
3588 : }
3589 : } else {
3590 : /* lower */
3591 0 : for(j=0;j<n;j++) {
3592 0 : for(i=m-1;i>=0;i--) {
3593 0 : temp = alpha * b[j*(ldb)+i];
3594 0 : for(k=i+1;k<m;k++)
3595 0 : temp -= a[i*(lda)+k] * b[j*(ldb)+k];
3596 0 : if(xdiag=='N')
3597 0 : temp /= a[i*(lda)+i];
3598 0 : b[j*(ldb)+i] = temp;
3599 : }
3600 : }
3601 : }
3602 : }
3603 : } else {
3604 : /* right side */
3605 0 : if(xtrans=='N') {
3606 : /* No transpose */
3607 0 : if(xuplo=='U') {
3608 : /* upper */
3609 0 : for(j=0;j<n;j++) {
3610 0 : if(std::abs(alpha-1.0)>PLUMED_GMX_FLOAT_EPS)
3611 0 : for(i=0;i<m;i++)
3612 0 : b[j*(ldb)+i] *= alpha;
3613 0 : for(k=0;k<j;k++) {
3614 0 : if( std::abs(a[j*(lda)+k])>PLUMED_GMX_FLOAT_MIN) {
3615 0 : for(i=0;i<m;i++)
3616 0 : b[j*(ldb)+i] -= a[j*(lda)+k]*b[k*(ldb)+i];
3617 : }
3618 : }
3619 0 : if(xdiag=='N') {
3620 0 : temp = 1.0/a[j*(lda)+j];
3621 0 : for(i=0;i<m;i++)
3622 0 : b[j*(ldb)+i] *= temp;
3623 : }
3624 : }
3625 : } else {
3626 : /* lower */
3627 0 : for(j=n-1;j>=0;j--) {
3628 0 : if(std::abs(alpha-1.0)>PLUMED_GMX_FLOAT_EPS)
3629 0 : for(i=0;i<m;i++)
3630 0 : b[j*(ldb)+i] *= alpha;
3631 0 : for(k=j+1;k<n;k++) {
3632 0 : if( std::abs(a[j*(lda)+k])>PLUMED_GMX_FLOAT_MIN ) {
3633 0 : for(i=0;i<m;i++)
3634 0 : b[j*(ldb)+i] -= a[j*(lda)+k]*b[k*(ldb)+i];
3635 : }
3636 : }
3637 0 : if(xdiag=='N') {
3638 0 : temp = 1.0/a[j*(lda)+j];
3639 0 : for(i=0;i<m;i++)
3640 0 : b[j*(ldb)+i] *= temp;
3641 : }
3642 : }
3643 : }
3644 : } else {
3645 : /* Transpose */
3646 0 : if(xuplo=='U') {
3647 : /* upper */
3648 0 : for(k=n-1;k>=0;k--) {
3649 0 : if(xdiag=='N') {
3650 0 : temp = 1.0/a[k*(lda)+k];
3651 0 : for(i=0;i<m;i++)
3652 0 : b[k*(ldb)+i] *= temp;
3653 : }
3654 0 : for(j=0;j<k;j++) {
3655 0 : if( std::abs(a[k*(lda)+j])>PLUMED_GMX_FLOAT_MIN) {
3656 : temp = a[k*(lda)+j];
3657 0 : for(i=0;i<m;i++)
3658 0 : b[j*(ldb)+i] -= temp * b[k*(ldb)+i];
3659 : }
3660 : }
3661 0 : if(std::abs(alpha-1.0)>PLUMED_GMX_FLOAT_EPS)
3662 0 : for(i=0;i<m;i++)
3663 0 : b[k*(ldb)+i] *= alpha;
3664 : }
3665 : } else {
3666 : /* lower */
3667 0 : for(k=0;k<n;k++) {
3668 0 : if(xdiag=='N') {
3669 0 : temp = 1.0/a[k*(lda)+k];
3670 0 : for(i=0;i<m;i++)
3671 0 : b[k*(ldb)+i] *= temp;
3672 : }
3673 0 : for(j=k+1;j<n;j++) {
3674 0 : if( std::abs(a[k*(lda)+j])>PLUMED_GMX_FLOAT_MIN) {
3675 : temp = a[k*(lda)+j];
3676 0 : for(i=0;i<m;i++)
3677 0 : b[j*(ldb)+i] -= temp * b[k*(ldb)+i];
3678 : }
3679 : }
3680 0 : if(std::abs(alpha-1.0)>PLUMED_GMX_FLOAT_EPS)
3681 0 : for(i=0;i<m;i++)
3682 0 : b[k*(ldb)+i] *= alpha;
3683 : }
3684 : }
3685 : }
3686 : }
3687 : }
3688 : }
3689 : }
3690 : #endif
|