1
1
#:include "common.fypp"
2
2
#:set R_KINDS_TYPES = list(zip(REAL_KINDS, REAL_TYPES, REAL_SUFFIX))
3
3
#:set C_KINDS_TYPES = list(zip(CMPLX_KINDS, CMPLX_TYPES, CMPLX_SUFFIX))
4
- #:set RANKS = range(2, 2)
4
+ #:set RC_KINDS_TYPES = R_KINDS_TYPES + C_KINDS_TYPES
5
+
6
+ #:def cnjg(type,expression)
7
+ #:if 'complex' in type
8
+ conjg(${expression}$)
9
+ #:else
10
+ ${expression}$
11
+ #:endif
12
+ #:enddef
13
+
14
+ ! This module is based on https://github.com/jalvesz/fast_math
5
15
module stdlib_intrinsics
16
+ !!Replacement for certain Fortran intrinsic functions offering either faster and/or more accurate implementations.
17
+ !! ([Specification](../page/specs/stdlib_intrinsics.html))
6
18
use stdlib_kinds
7
19
implicit none
8
20
private
9
21
10
22
interface fsum
11
- #:for rk, rt in REAL_KINDS_TYPES
12
- module procedure :: fsum_1d_${rk }$
13
- module procedure :: fsum_1d_${rk }$_mask
23
+ #:for rk, rt, rs in RC_KINDS_TYPES
24
+ module procedure :: fsum_1d_${rs }$
25
+ module procedure :: fsum_1d_${rs }$_mask
14
26
#:endfor
15
27
end interface
16
28
public :: fsum
17
29
18
30
interface fsum_kahan
19
- #:for rk, rt in REAL_KINDS_TYPES
20
- module procedure :: fsum_kahan_1d_${rk }$
21
- module procedure :: fsum_kahan_1d_${rk }$_mask
31
+ #:for rk, rt, rs in RC_KINDS_TYPES
32
+ module procedure :: fsum_kahan_1d_${rs }$
33
+ module procedure :: fsum_kahan_1d_${rs }$_mask
22
34
#:endfor
23
35
end interface
24
36
public :: fsum_kahan
25
37
38
+ interface fprod
39
+ #:for rk, rt, rs in RC_KINDS_TYPES
40
+ module procedure :: fprod_${rs}$
41
+ #:endfor
42
+ end interface
43
+ public :: fprod
44
+
45
+ interface fprod_kahan
46
+ #:for rk, rt, rs in RC_KINDS_TYPES
47
+ module procedure :: fprod_kahan_${rs}$
48
+ #:endfor
49
+ end interface
50
+ public :: fprod_kahan
51
+
26
52
interface vkahan
27
- #:for rk, rt in REAL_KINDS_TYPES
28
- module procedure :: vkahan_${rk }$
29
- module procedure :: vkahan_m_${rk }$
53
+ #:for rk, rt, rs in RC_KINDS_TYPES
54
+ module procedure :: vkahan_${rs }$
55
+ module procedure :: vkahan_m_${rs }$
30
56
#:endfor
31
57
end interface
32
58
@@ -40,7 +66,7 @@ module stdlib_intrinsics
40
66
41
67
contains
42
68
43
- #:for k1, t1, s1 in R_KINDS_TYPES
69
+ #:for k1, t1, s1 in RC_KINDS_TYPES
44
70
pure function fsum_1d_${s1}$(a) result(s)
45
71
${t1}$, intent(in) :: a(:)
46
72
${t1}$ :: s
@@ -85,7 +111,7 @@ pure function fsum_1d_${s1}$_mask(a,mask) result(s)
85
111
end function
86
112
#:endfor
87
113
88
- #:for k1, t1, s1 in R_KINDS_TYPES
114
+ #:for k1, t1, s1 in RC_KINDS_TYPES
89
115
pure function fsum_kahan_1d_${s1}$(a) result(s)
90
116
${t1}$, intent(in) :: a(:)
91
117
${t1}$ :: s
@@ -132,7 +158,55 @@ pure function fsum_kahan_1d_${s1}$_mask(a,mask) result(s)
132
158
end function
133
159
#:endfor
134
160
135
- #:for k1, t1, s1 in R_KINDS_TYPES
161
+ #:for k1, t1, s1 in RC_KINDS_TYPES
162
+ pure function fprod_${s1}$(a,b) result(p)
163
+ ${t1}$, intent(in) :: a(:)
164
+ ${t1}$, intent(in) :: b(:)
165
+ ${t1}$ :: p
166
+ ${t1}$ :: abatch(chunk)
167
+ integer :: i, dr, rr
168
+ ! -----------------------------
169
+ dr = size(a)/chunk
170
+ rr = size(a) - dr*chunk
171
+
172
+ abatch = zero_${s1}$
173
+ do i = 1, dr
174
+ abatch(1:chunk) = abatch(1:chunk) + a(chunk*i-chunk+1:chunk*i)*${cnjg(t1,'b(chunk*i-chunk+1:chunk*i)')}$
175
+ end do
176
+ abatch(1:rr) = abatch(1:rr) + a(size(a)-rr+1:size(a))*${cnjg(t1,'b(size(a)-rr+1:size(a))')}$
177
+
178
+ p = zero_${s1}$
179
+ do i = 1, chunk/2
180
+ p = p + abatch(i)+abatch(chunk/2+i)
181
+ end do
182
+ end function
183
+
184
+ pure function fprod_kahan_${s1}$(a,b) result(p)
185
+ ${t1}$, intent(in) :: a(:)
186
+ ${t1}$, intent(in) :: b(:)
187
+ ${t1}$ :: p
188
+ ${t1}$ :: pbatch(chunk)
189
+ ${t1}$ :: cbatch(chunk)
190
+ integer :: i, dr, rr
191
+ ! -----------------------------
192
+ dr = size(a)/(chunk)
193
+ rr = size(a) - dr*chunk
194
+ pbatch = zero_${s1}$
195
+ cbatch = zero_${s1}$
196
+ do i = 1, dr
197
+ call vkahan( a(chunk*i-chunk+1:chunk*i)*${cnjg(t1,'b(chunk*i-chunk+1:chunk*i)')}$ , pbatch(1:chunk) , cbatch(1:chunk) )
198
+ end do
199
+ call vkahan( a(size(a)-rr+1:size(a))*${cnjg(t1,'b(size(a)-rr+1:size(a))')}$ , pbatch(1:rr) , cbatch(1:rr) )
200
+
201
+ p = zero_${s1}$
202
+ do i = 1,chunk
203
+ call vkahan( pbatch(i) , p , cbatch(i) )
204
+ end do
205
+ end function
206
+
207
+ #:endfor
208
+
209
+ #:for k1, t1, s1 in RC_KINDS_TYPES
136
210
elemental subroutine vkahan_${s1}$(a,s,c)
137
211
${t1}$, intent(in) :: a
138
212
${t1}$, intent(inout) :: s
0 commit comments