1 /*--------------------------------------------------------------
3 BLAS/LAPACK-like subroutines used by the integration algorithms
4 It is recommended to replace them by calls to the optimized
5 BLAS/LAPACK library for your machine
7 (C) Adrian Sandu, Aug. 2004
9 --------------------------------------------------------------*/
11 #define ZERO (KPP_REAL)0.0
12 #define ONE (KPP_REAL)1.0
13 #define HALF (KPP_REAL)0.5
14 #define TWO (KPP_REAL)2.0
15 #define MOD(A,B) (int)((A)%(B))
17 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
18 void WCOPY(int N
, KPP_REAL X
[], int incX
, KPP_REAL Y
[], int incY
)
19 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20 copies a vector, x, to a vector, y: y <- x
23 replace this by the function from the optimized BLAS implementation:
24 CALL SCOPY(N,X,1,Y,1) or CALL DCOPY(N,X,1,Y,1)
25 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
32 for ( i
= 0; i
< M
; i
++ )
36 for ( i
= M
; i
<N
; i
+=8 ) {
47 } /* end function WCOPY */
50 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
51 void WAXPY(int N
, KPP_REAL Alpha
,
52 KPP_REAL X
[], int incX
,
53 KPP_REAL Y
[], int incY
)
54 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
55 constant times a vector plus a vector: y <- y + Alpha*x
58 replace this by the function from the optimized BLAS implementation:
59 CALL SAXPY(N,Alpha,X,1,Y,1) or CALL DAXPY(N,Alpha,X,1,Y,1)
60 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
64 if (Alpha
== ZERO
) return;
69 for ( i
= 0; i
< M
; i
++ )
70 Y
[i
] = Y
[i
] + Alpha
*X
[i
];
74 for ( i
= M
; i
< N
; i
+= 4 ) {
75 Y
[i
] = Y
[i
] + Alpha
*X
[i
];
76 Y
[i
+ 1] = Y
[i
+ 1] + Alpha
*X
[i
+ 1];
77 Y
[i
+ 2] = Y
[i
+ 2] + Alpha
*X
[i
+ 2];
78 Y
[i
+ 3] = Y
[i
+ 3] + Alpha
*X
[i
+ 3];
81 } /* end function WAXPY */
85 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
86 void WSCAL(int N
, KPP_REAL Alpha
, KPP_REAL X
[], int incX
)
87 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
88 constant times a vector: x(1:N) <- Alpha*x(1:N)
91 replace this by the function from the optimized BLAS implementation:
92 CALL SSCAL(N,Alpha,X,1) or CALL DSCAL(N,Alpha,X,1)
93 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
97 if (Alpha
== ONE
) return;
103 for ( i
= 0; i
< M
; i
++ ) X
[i
] = -X
[i
];
106 for ( i
= 0; i
< M
; i
++ ) X
[i
] = ZERO
;
108 for ( i
= 0; i
< M
; i
++ ) X
[i
] = Alpha
*X
[i
];
114 for ( i
= M
; i
<N
; i
+=5 ) {
116 X
[i
+ 1] = -X
[i
+ 1];
117 X
[i
+ 2] = -X
[i
+ 2];
118 X
[i
+ 3] = -X
[i
+ 3];
119 X
[i
+ 4] = -X
[i
+ 4];
123 for ( i
= M
; i
< N
; i
+= 5 ) {
131 for ( i
= M
; i
< N
; i
+= 5 ) {
133 X
[i
+ 1] = Alpha
*X
[i
+ 1];
134 X
[i
+ 2] = Alpha
*X
[i
+ 2];
135 X
[i
+ 3] = Alpha
*X
[i
+ 3];
136 X
[i
+ 4] = Alpha
*X
[i
+ 4];
140 } /* end function WSCAL */
143 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
144 KPP_REAL
WLAMCH_ADD( KPP_REAL A
, KPP_REAL B
)
147 } /* end function WLAMCH_ADD */
149 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
150 KPP_REAL
WLAMCH( char C
)
151 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
152 returns epsilon machine
154 replace this by the function from the optimized LAPACK implementation:
155 CALL SLAMCH('E') or CALL DLAMCH('E')
156 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
161 static char First
= 1;
166 for ( i
= 17; i
<= 80; i
++ ) {
168 Sum
= WLAMCH_ADD(ONE
,Eps
);
169 if (Sum
<= ONE
) break;
172 printf("\nERROR IN WLAMCH. Very small EPS = %g\n",Eps
);
173 return (double)2.2e-16;
180 } /* end function WLAMCH */