Skip to content

Commit ecb7050

Browse files
committed
small reorganization
1 parent 47396ac commit ecb7050

File tree

2 files changed

+51
-48
lines changed

2 files changed

+51
-48
lines changed

src/stdlib_intrinsics_sum.fypp

Lines changed: 49 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ submodule(stdlib_intrinsics) stdlib_intrinsics_sum
1616

1717
contains
1818

19+
!================= 1D Base implementations ============
1920
#:for rk, rt, rs in RC_KINDS_TYPES
2021
pure 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
6162
end 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
64113
pure 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-
183185
end submodule stdlib_intrinsics_sum

test/intrinsics/test_intrinsics.fypp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,8 @@ subroutine test_sum(error)
129129

130130
!> sum over specific rank dim
131131
do i = 1, rank(x)
132-
call check(error, norm2( sum(x,dim=i) - fsum(x,dim=i) )<tolerance*size(x) , "KO: ndarray fsum over dim "//to_string(i) )
132+
call check(error, norm2( sum(x,dim=i) - fsum(x,dim=i) )<tolerance*size(x) ,&
133+
"KO: ndarray fsum over dim "//to_string(i) )
133134
if (allocated(error)) return
134135
end do
135136
end block ndarray

0 commit comments

Comments
 (0)