@@ -22,10 +22,12 @@ subroutine collect_logicalloc(testsuite)
22
22
new_unittest(" trueloc-all" , test_trueloc_all), &
23
23
new_unittest(" trueloc-where" , test_trueloc_where), &
24
24
new_unittest(" trueloc-merge" , test_trueloc_merge), &
25
+ new_unittest(" trueloc-pack" , test_trueloc_pack), &
25
26
new_unittest(" falseloc-empty" , test_falseloc_empty), &
26
27
new_unittest(" falseloc-all" , test_falseloc_all), &
27
28
new_unittest(" falseloc-where" , test_falseloc_where), &
28
- new_unittest(" falseloc-merge" , test_falseloc_merge) &
29
+ new_unittest(" falseloc-merge" , test_falseloc_merge), &
30
+ new_unittest(" falseloc-pack" , test_falseloc_pack) &
29
31
]
30
32
end subroutine collect_logicalloc
31
33
@@ -136,6 +138,42 @@ subroutine test_trueloc_merge(error)
136
138
call report(" trueloc" , tl, " merge" , tm)
137
139
end subroutine test_trueloc_merge
138
140
141
+ subroutine test_trueloc_pack (error )
142
+ ! > Error handling
143
+ type (error_type), allocatable , intent (out ) :: error
144
+
145
+ integer :: ndim
146
+ real , allocatable :: avec(:), bvec(:), cvec(:)
147
+ real (dp) :: tl, tp
148
+
149
+ tl = 0.0_dp
150
+ tp = 0.0_dp
151
+ do ndim = 100 , 12000 , 100
152
+ allocate (avec(ndim))
153
+
154
+ call random_number (avec)
155
+ avec(:) = avec - 0.5
156
+
157
+ bvec = avec
158
+ tl = tl - timing()
159
+ bvec(trueloc(bvec > 0 )) = 0.0
160
+ tl = tl + timing()
161
+
162
+ cvec = avec
163
+ tp = tp - timing()
164
+ block
165
+ integer :: i
166
+ cvec(pack ([(i, i= 1 , size (cvec))], cvec > 0 )) = 0.0
167
+ end block
168
+ tp = tp + timing()
169
+
170
+ call check(error, all (bvec == cvec))
171
+ deallocate (avec, bvec, cvec)
172
+ if (allocated (error)) exit
173
+ end do
174
+ call report(" trueloc" , tl, " pack" , tp)
175
+ end subroutine test_trueloc_pack
176
+
139
177
subroutine test_falseloc_empty (error )
140
178
! > Error handling
141
179
type (error_type), allocatable , intent (out ) :: error
@@ -243,6 +281,42 @@ subroutine test_falseloc_merge(error)
243
281
call report(" falseloc" , tl, " merge" , tm)
244
282
end subroutine test_falseloc_merge
245
283
284
+ subroutine test_falseloc_pack (error )
285
+ ! > Error handling
286
+ type (error_type), allocatable , intent (out ) :: error
287
+
288
+ integer :: ndim
289
+ real , allocatable :: avec(:), bvec(:), cvec(:)
290
+ real (dp) :: tl, tp
291
+
292
+ tl = 0.0_dp
293
+ tp = 0.0_dp
294
+ do ndim = 100 , 12000 , 100
295
+ allocate (avec(ndim))
296
+
297
+ call random_number (avec)
298
+ avec(:) = avec - 0.5
299
+
300
+ bvec = avec
301
+ tl = tl - timing()
302
+ bvec(falseloc(bvec > 0 )) = 0.0
303
+ tl = tl + timing()
304
+
305
+ cvec = avec
306
+ tp = tp - timing()
307
+ block
308
+ integer :: i
309
+ cvec(pack ([(i, i= 1 , size (cvec))], cvec < 0 )) = 0.0
310
+ end block
311
+ tp = tp + timing()
312
+
313
+ call check(error, all (bvec == cvec))
314
+ deallocate (avec, bvec, cvec)
315
+ if (allocated (error)) exit
316
+ end do
317
+ call report(" falseloc" , tl, " pack" , tp)
318
+ end subroutine test_falseloc_pack
319
+
246
320
subroutine report (l1 , t1 , l2 , t2 )
247
321
character (len=* ), intent (in ) :: l1, l2
248
322
real (dp), intent (in ) :: t1, t2
0 commit comments