@@ -16,6 +16,7 @@ submodule(stdlib_intrinsics) stdlib_intrinsics_sum
1616
1717contains
1818
19+ !================= 1D Base implementations ============
1920#:for rk, rt, rs in RC_KINDS_TYPES
2021pure module function fsum_1d_${rs}$(a) result(s)
2122 ${rt}$, intent(in) :: a(:)
@@ -60,6 +61,54 @@ pure module function fsum_1d_${rs}$_mask(a,mask) result(s)
6061 end do
6162end function
6263
64+ pure module function fsum_kahan_1d_${rs}$(a) result(s)
65+ ${rt}$, intent(in) :: a(:)
66+ ${rt}$ :: s
67+ ${rt}$ :: sbatch(chunk)
68+ ${rt}$ :: cbatch(chunk)
69+ integer :: i, dr, rr
70+ ! -----------------------------
71+ dr = size(a)/(chunk)
72+ rr = size(a) - dr*chunk
73+ sbatch = zero_${rs}$
74+ cbatch = zero_${rs}$
75+ do i = 1, dr
76+ call kahan_kernel( a(chunk*i-chunk+1:chunk*i) , sbatch(1:chunk) , cbatch(1:chunk) )
77+ end do
78+ call kahan_kernel( a(size(a)-rr+1:size(a)) , sbatch(1:rr) , cbatch(1:rr) )
79+
80+ s = zero_${rs}$
81+ do i = 1,chunk
82+ call kahan_kernel( sbatch(i) , s , cbatch(i) )
83+ end do
84+ end function
85+
86+ pure module function fsum_kahan_1d_${rs}$_mask(a,mask) result(s)
87+ ${rt}$, intent(in) :: a(:)
88+ logical, intent(in) :: mask(:)
89+ ${rt}$ :: s
90+ ${rt}$ :: sbatch(chunk)
91+ ${rt}$ :: cbatch(chunk)
92+ integer :: i, dr, rr
93+ ! -----------------------------
94+ dr = size(a)/(chunk)
95+ rr = size(a) - dr*chunk
96+ sbatch = zero_${rs}$
97+ cbatch = zero_${rs}$
98+ do i = 1, dr
99+ call kahan_kernel( a(chunk*i-chunk+1:chunk*i) , sbatch(1:chunk) , cbatch(1:chunk) , mask(chunk*i-chunk+1:chunk*i) )
100+ end do
101+ call kahan_kernel( a(size(a)-rr+1:size(a)) , sbatch(1:rr) , cbatch(1:rr) , mask(size(a)-rr+1:size(a)) )
102+
103+ s = zero_${rs}$
104+ do i = 1,chunk
105+ call kahan_kernel( sbatch(i) , s , cbatch(i) )
106+ end do
107+ end function
108+ #:endfor
109+
110+ !================= N-D implementations ============
111+ #:for rk, rt, rs in RC_KINDS_TYPES
63112#:for rank in RANKS
64113pure module function fsum_${rank}$d_${rs}$( x , mask ) result( s )
65114 ${rt}$, intent(in) :: x${ranksuffix(rank)}$
@@ -133,51 +182,4 @@ end function
133182#:endfor
134183#:endfor
135184
136- #:for rk, rt, rs in RC_KINDS_TYPES
137- pure module function fsum_kahan_1d_${rs}$(a) result(s)
138- ${rt}$, intent(in) :: a(:)
139- ${rt}$ :: s
140- ${rt}$ :: sbatch(chunk)
141- ${rt}$ :: cbatch(chunk)
142- integer :: i, dr, rr
143- ! -----------------------------
144- dr = size(a)/(chunk)
145- rr = size(a) - dr*chunk
146- sbatch = zero_${rs}$
147- cbatch = zero_${rs}$
148- do i = 1, dr
149- call kahan_kernel( a(chunk*i-chunk+1:chunk*i) , sbatch(1:chunk) , cbatch(1:chunk) )
150- end do
151- call kahan_kernel( a(size(a)-rr+1:size(a)) , sbatch(1:rr) , cbatch(1:rr) )
152-
153- s = zero_${rs}$
154- do i = 1,chunk
155- call kahan_kernel( sbatch(i) , s , cbatch(i) )
156- end do
157- end function
158-
159- pure module function fsum_kahan_1d_${rs}$_mask(a,mask) result(s)
160- ${rt}$, intent(in) :: a(:)
161- logical, intent(in) :: mask(:)
162- ${rt}$ :: s
163- ${rt}$ :: sbatch(chunk)
164- ${rt}$ :: cbatch(chunk)
165- integer :: i, dr, rr
166- ! -----------------------------
167- dr = size(a)/(chunk)
168- rr = size(a) - dr*chunk
169- sbatch = zero_${rs}$
170- cbatch = zero_${rs}$
171- do i = 1, dr
172- call kahan_kernel( a(chunk*i-chunk+1:chunk*i) , sbatch(1:chunk) , cbatch(1:chunk) , mask(chunk*i-chunk+1:chunk*i) )
173- end do
174- call kahan_kernel( a(size(a)-rr+1:size(a)) , sbatch(1:rr) , cbatch(1:rr) , mask(size(a)-rr+1:size(a)) )
175-
176- s = zero_${rs}$
177- do i = 1,chunk
178- call kahan_kernel( sbatch(i) , s , cbatch(i) )
179- end do
180- end function
181- #:endfor
182-
183185end submodule stdlib_intrinsics_sum
0 commit comments