Skip to content

Commit c38dcd6

Browse files
committed
test masked sum
1 parent 243ea6f commit c38dcd6

File tree

1 file changed

+34
-0
lines changed

1 file changed

+34
-0
lines changed

test/intrinsics/test_intrinsics.fypp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,21 @@ subroutine test_sum(error)
3737
${t1}$, allocatable :: x(:)
3838
${t1}$, parameter :: total_sum = 4*atan(1._${k1}$), tolerance = epsilon(1._${k1}$)*100
3939
${t1}$ :: xsum(ncalc), meanval(ncalc), err(ncalc)
40+
logical, allocatable :: mask(:), nmask(:)
4041

4142
allocate(x(n))
4243
do i = 1, n
4344
x(i) = 8*atan(1._${k1}$)*(real(i,kind=${k1}$)-0.5_${k1}$)/real(n,kind=${k1}$)**2
4445
end do
46+
allocate(mask(n),source=.false.); mask(1:n:2) = .true.
47+
allocate(nmask(n)); nmask = .not.mask
4548
! scramble array
4649
do i = 1, n
4750
call random_number(u)
4851
j = 1 + floor(n*u)
4952
call swap( x(i), x(j) )
53+
call swap( mask(i), mask(j) )
54+
call swap( nmask(i), nmask(j) )
5055
end do
5156

5257
err(:) = 0._${k1}$
@@ -60,6 +65,18 @@ subroutine test_sum(error)
6065

6166
call check(error, all(err(:)<tolerance) , "real sum is not accurate" )
6267
if (allocated(error)) return
68+
69+
err(:) = 0._${k1}$
70+
do iter = 1, niter
71+
xsum(1) = sum(x,mask)+sum(x,nmask) ! compiler intrinsic
72+
xsum(2) = fsum_kahan(x,mask)+fsum_kahan(x,nmask) ! chunked Kahan summation
73+
xsum(3) = fsum(x,mask)+fsum(x,nmask) ! chunked summation
74+
err(1:ncalc) = err(1:ncalc) + abs(1._${k1}$-xsum(1:ncalc)/total_sum)
75+
end do
76+
err(1:ncalc) = err(1:ncalc) / niter
77+
78+
call check(error, all(err(:)<tolerance) , "masked real sum is not accurate" )
79+
if (allocated(error)) return
6380
end block
6481
#:endfor
6582

@@ -69,18 +86,23 @@ subroutine test_sum(error)
6986
real(${k1}$), parameter :: total_sum = 4*atan(1._${k1}$), tolerance = epsilon(1._${k1}$)*100
7087
real(${k1}$) :: err(ncalc)
7188
${t1}$ :: xsum(ncalc), meanval(ncalc)
89+
logical, allocatable :: mask(:), nmask(:)
7290

7391
allocate(x(n))
7492
do i = 1, n
7593
x(i) = complex(&
7694
8*atan(1._${k1}$)*(real(i,kind=${k1}$)-0.5_${k1}$)/real(2*n,kind=${k1}$)**2,&
7795
8*atan(1._${k1}$)*(real(i+n,kind=${k1}$)-0.5_${k1}$)/real(2*n,kind=${k1}$)**2)
7896
end do
97+
allocate(mask(n),source=.false.); mask(1:n:2) = .true.
98+
allocate(nmask(n)); nmask = .not.mask
7999
! scramble array
80100
do i = 1, n
81101
call random_number(u)
82102
j = 1 + floor(n*u)
83103
call swap( x(i), x(j) )
104+
call swap( mask(i), mask(j) )
105+
call swap( nmask(i), nmask(j) )
84106
end do
85107

86108
err(:) = 0._${k1}$
@@ -94,6 +116,18 @@ subroutine test_sum(error)
94116

95117
call check(error, all(err(:)<tolerance) , "complex sum is not accurate" )
96118
if (allocated(error)) return
119+
120+
err(:) = 0._${k1}$
121+
do iter = 1, niter
122+
xsum(1) = sum(x,mask)+sum(x,nmask) ! compiler intrinsic
123+
xsum(2) = fsum_kahan(x,mask)+fsum_kahan(x,nmask) ! chunked Kahan summation
124+
xsum(3) = fsum(x,mask)+fsum(x,nmask) ! chunked summation
125+
err(1:ncalc) = err(1:ncalc) + abs(1._${k1}$-(xsum(1:ncalc)%re+xsum(1:ncalc)%im)/total_sum)
126+
end do
127+
err(1:ncalc) = err(1:ncalc) / niter
128+
129+
call check(error, all(err(:)<tolerance) , "complex masked sum is not accurate" )
130+
if (allocated(error)) return
97131
end block
98132
#:endfor
99133

0 commit comments

Comments
 (0)