@@ -22,10 +22,12 @@ subroutine collect_logicalloc(testsuite)
2222 new_unittest(" trueloc-all" , test_trueloc_all), &
2323 new_unittest(" trueloc-where" , test_trueloc_where), &
2424 new_unittest(" trueloc-merge" , test_trueloc_merge), &
25+ new_unittest(" trueloc-pack" , test_trueloc_pack), &
2526 new_unittest(" falseloc-empty" , test_falseloc_empty), &
2627 new_unittest(" falseloc-all" , test_falseloc_all), &
2728 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) &
2931 ]
3032 end subroutine collect_logicalloc
3133
@@ -136,6 +138,42 @@ subroutine test_trueloc_merge(error)
136138 call report(" trueloc" , tl, " merge" , tm)
137139 end subroutine test_trueloc_merge
138140
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+
139177 subroutine test_falseloc_empty (error )
140178 ! > Error handling
141179 type (error_type), allocatable , intent (out ) :: error
@@ -243,6 +281,42 @@ subroutine test_falseloc_merge(error)
243281 call report(" falseloc" , tl, " merge" , tm)
244282 end subroutine test_falseloc_merge
245283
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+
246320 subroutine report (l1 , t1 , l2 , t2 )
247321 character (len=* ), intent (in ) :: l1, l2
248322 real (dp), intent (in ) :: t1, t2
0 commit comments