@@ -28,15 +28,15 @@ subroutine test_sum(error)
28
28
type(error_type), allocatable, intent(out) :: error
29
29
30
30
!> Internal parameters and variables
31
- integer, parameter :: n = 1e3, ncalc = 3, niter = 100
31
+ integer, parameter :: n = 1e3, ncalc = 3
32
32
real(sp) :: u
33
33
integer :: iter, i, j
34
34
!====================================================================================
35
35
#:for k1, t1, s1 in R_KINDS_TYPES
36
36
block
37
37
${t1}$, allocatable :: x(:)
38
38
${t1}$, parameter :: total_sum = 4*atan(1._${k1}$), tolerance = epsilon(1._${k1}$)*100
39
- ${t1}$ :: xsum(ncalc), meanval(ncalc), err(ncalc)
39
+ ${t1}$ :: xsum(ncalc), err(ncalc)
40
40
logical, allocatable :: mask(:), nmask(:)
41
41
42
42
allocate(x(n))
@@ -54,26 +54,18 @@ subroutine test_sum(error)
54
54
call swap( nmask(i), nmask(j) )
55
55
end do
56
56
57
- err(:) = 0._${k1}$
58
- do iter = 1, niter
59
- xsum(1) = sum(x) ! compiler intrinsic
60
- xsum(2) = fsum_kahan(x) ! chunked Kahan summation
61
- xsum(3) = fsum(x) ! chunked summation
62
- err(1:ncalc) = err(1:ncalc) + abs(1._${k1}$-xsum(1:ncalc)/total_sum)
63
- end do
64
- err(1:ncalc) = err(1:ncalc) / niter
57
+ xsum(1) = sum(x) ! compiler intrinsic
58
+ xsum(2) = fsum_kahan(x) ! chunked Kahan summation
59
+ xsum(3) = fsum(x) ! chunked summation
60
+ err(1:ncalc) = abs(1._${k1}$-xsum(1:ncalc)/total_sum)
65
61
66
62
call check(error, all(err(:)<tolerance) , "real sum is not accurate" )
67
63
if (allocated(error)) return
68
64
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
65
+ xsum(1) = sum(x,mask)+sum(x,nmask) ! compiler intrinsic
66
+ xsum(2) = fsum_kahan(x,mask)+fsum_kahan(x,nmask) ! chunked Kahan summation
67
+ xsum(3) = fsum(x,mask)+fsum(x,nmask) ! chunked summation
68
+ err(1:ncalc) = abs(1._${k1}$-xsum(1:ncalc)/total_sum)
77
69
78
70
call check(error, all(err(:)<tolerance) , "masked real sum is not accurate" )
79
71
if (allocated(error)) return
@@ -85,15 +77,14 @@ subroutine test_sum(error)
85
77
${t1}$, allocatable :: x(:)
86
78
real(${k1}$), parameter :: total_sum = 4*atan(1._${k1}$), tolerance = epsilon(1._${k1}$)*100
87
79
real(${k1}$) :: err(ncalc)
88
- ${t1}$ :: xsum(ncalc), meanval(ncalc)
80
+ ${t1}$ :: xsum(ncalc)
89
81
logical, allocatable :: mask(:), nmask(:)
90
82
91
83
allocate(x(n))
92
84
do i = 1, n
93
- x(i) = cmplx(&
94
- 8*atan(1._${k1}$)*(real(i,kind=${k1}$)-0.5_${k1}$)/real(2*n,kind=${k1}$)**2,&
95
- 8*atan(1._${k1}$)*(real(i+n,kind=${k1}$)-0.5_${k1}$)/real(2*n,kind=${k1}$)**2)
85
+ x(i) = (8*atan(1._${k1}$)*(real(i,kind=${k1}$)-0.5_${k1}$)/n**2)*cmplx(1._${k1}$,1._${k1}$)
96
86
end do
87
+
97
88
allocate(mask(n),source=.false.); mask(1:n:2) = .true.
98
89
allocate(nmask(n)); nmask = .not.mask
99
90
! scramble array
@@ -105,26 +96,20 @@ subroutine test_sum(error)
105
96
call swap( nmask(i), nmask(j) )
106
97
end do
107
98
108
- err(:) = 0._${k1}$
109
- do iter = 1, niter
110
- xsum(1) = sum(x) ! compiler intrinsic
111
- xsum(2) = fsum_kahan(x) ! chunked Kahan summation
112
- xsum(3) = fsum(x) ! chunked summation
113
- err(1:ncalc) = err(1:ncalc) + abs(1._${k1}$-(xsum(1:ncalc)%re+xsum(1:ncalc)%im)/total_sum)
114
- end do
115
- err(1:ncalc) = err(1:ncalc) / niter
99
+ xsum(1) = sum(x) ! compiler intrinsic
100
+ xsum(2) = fsum_kahan(x) ! chunked Kahan summation
101
+ xsum(3) = fsum(x) ! chunked summation
102
+ err(1:ncalc) = abs(1._${k1}$-(xsum(1:ncalc)%re)/total_sum)
103
+
116
104
117
105
call check(error, all(err(:)<tolerance) , "complex sum is not accurate" )
118
106
if (allocated(error)) return
119
107
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
108
+ xsum(1) = sum(x,mask)+sum(x,nmask) ! compiler intrinsic
109
+ xsum(2) = fsum_kahan(x,mask)+fsum_kahan(x,nmask) ! chunked Kahan summation
110
+ xsum(3) = fsum(x,mask)+fsum(x,nmask) ! chunked summation
111
+ err(1:ncalc) = abs(1._${k1}$-(xsum(1:ncalc)%re)/total_sum)
112
+
128
113
129
114
call check(error, all(err(:)<tolerance) , "complex masked sum is not accurate" )
130
115
if (allocated(error)) return
@@ -138,19 +123,19 @@ subroutine test_dot_product(error)
138
123
type(error_type), allocatable, intent(out) :: error
139
124
140
125
!> Internal parameters and variables
141
- integer, parameter :: n = 1e3, ncalc = 3, niter = 100
126
+ integer, parameter :: n = 1e3, ncalc = 3
142
127
real(sp) :: u
143
128
integer :: iter, i, j
144
129
!====================================================================================
145
130
#:for k1, t1, s1 in R_KINDS_TYPES
146
131
block
147
132
${t1}$, allocatable :: x(:)
148
133
${t1}$, parameter :: total_sum = 4*atan(1._${k1}$), tolerance = epsilon(1._${k1}$)*100
149
- ${t1}$ :: xsum(ncalc), meanval(ncalc), err(ncalc)
134
+ ${t1}$ :: xsum(ncalc), err(ncalc)
150
135
151
136
allocate(x(n))
152
137
do i = 1, n
153
- x(i) = sqrt( 8 *atan(1._${k1}$)*(real(i,kind=${k1}$)-0.5_${k1}$)/real(n,kind=${k1}$)**2 )
138
+ x(i) = 2* sqrt( 2 *atan(1._${k1}$)*(real(i,kind=${k1}$)-0.5_${k1}$) )/n
154
139
end do
155
140
! scramble array
156
141
do i = 1, n
@@ -159,14 +144,10 @@ subroutine test_dot_product(error)
159
144
call swap( x(i), x(j) )
160
145
end do
161
146
162
- err(:) = 0._${k1}$
163
- do iter = 1, niter
164
- xsum(1) = dot_product(x,x) ! compiler intrinsic
165
- xsum(2) = fprod_kahan(x,x) ! chunked Kahan summation
166
- xsum(3) = fprod(x,x) ! chunked summation
167
- err(1:ncalc) = err(1:ncalc) + abs(1._${k1}$-xsum(1:ncalc)/total_sum)
168
- end do
169
- err(1:ncalc) = err(1:ncalc) / niter
147
+ xsum(1) = dot_product(x,x) ! compiler intrinsic
148
+ xsum(2) = fprod_kahan(x,x) ! chunked Kahan summation
149
+ xsum(3) = fprod(x,x) ! chunked summation
150
+ err(1:ncalc) = abs(1._${k1}$-xsum(1:ncalc)/total_sum)
170
151
171
152
call check(error, all(err(:)<tolerance) , "real dot_product is not accurate" )
172
153
if (allocated(error)) return
@@ -178,13 +159,11 @@ subroutine test_dot_product(error)
178
159
${t1}$, allocatable :: x(:)
179
160
real(${k1}$), parameter :: total_sum = 4*atan(1._${k1}$), tolerance = epsilon(1._${k1}$)*100
180
161
real(${k1}$) :: err(ncalc)
181
- ${t1}$ :: xsum(ncalc), meanval(ncalc)
162
+ ${t1}$ :: xsum(ncalc)
182
163
183
164
allocate(x(n))
184
165
do i = 1, n
185
- x(i) = cmplx(&
186
- sqrt(8*atan(1._${k1}$)*(real(i,kind=${k1}$)-0.5_${k1}$)/real(2*n,kind=${k1}$)**2),&
187
- sqrt(8*atan(1._${k1}$)*(real(i+n,kind=${k1}$)-0.5_${k1}$)/real(2*n,kind=${k1}$)**2))
166
+ x(i) = ( 2*sqrt( 2*atan(1._${k1}$)*(real(i,kind=${k1}$)-0.5_${k1}$) ) / n )*cmplx(1._${k1}$,1._${k1}$)
188
167
end do
189
168
! scramble array
190
169
do i = 1, n
@@ -193,15 +172,11 @@ subroutine test_dot_product(error)
193
172
call swap( x(i), x(j) )
194
173
end do
195
174
196
- err(:) = 0._${k1}$
197
- do iter = 1, niter
198
- xsum(1) = dot_product(x,x) ! compiler intrinsic
199
- xsum(2) = fprod_kahan(x,x) ! chunked Kahan dot_product
200
- xsum(3) = fprod(x,x) ! chunked dot_product
201
- err(1:ncalc) = err(1:ncalc) + abs(1._${k1}$-(xsum(1:ncalc)%re+xsum(1:ncalc)%im)/total_sum)
202
- end do
203
- err(1:ncalc) = err(1:ncalc) / niter
204
-
175
+ xsum(1) = dot_product(x,x) ! compiler intrinsic
176
+ xsum(2) = fprod_kahan(x,x) ! chunked Kahan dot_product
177
+ xsum(3) = fprod(x,x) ! chunked dot_product
178
+ err(1:ncalc) = abs(1._${k1}$-xsum(1:ncalc)%re/(2*total_sum))
179
+
205
180
call check(error, all(err(:)<tolerance) , "complex dot_product is not accurate" )
206
181
if (allocated(error)) return
207
182
end block
0 commit comments