- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello All,
When an allocatable derived type array (say container) is packed (using the intrinsic pack function) then the content of the resulting array (say packed_container) change when deallocating the original array. To clarify, in the following program the array packed_container is printed before and after deallocating container. Please let me know if you can reproduce the result. Up to now I don't have any suggestion for a workaround I would appreciate any help on this. Many thanks in advance.
Kostas
PS: The code and it'output follow, compiled by ifort 14.0.2.144
module my_storage_type implicit none type storage1 integer :: id=0 integer, dimension(:), allocatable :: lowkey end type storage1 end module my_storage_type program compress_test use my_storage_type implicit none type(storage1), dimension(:), allocatable :: container, cont_he integer :: i ! inits allocate(container(4)) container(1)%id = 2 allocate(container(1)%lowkey,source=(/1,2,3,4/)) container(3)%id = 5 allocate(container(3)%lowkey,source=(/5,6,7,8/)) ! ------ allocate(cont_he,source=pack(container,container%id/=0)) print *, " output before deallocating container" print *, cont_he deallocate(container) print *, " output after deallocating container" print *, cont_he end program compress_test
produces the output:
output before deallocating container
2 1 2 3 4 5
5 6 7 8
output after deallocating container
2 0 0 3 4 5
11551136 0 7 8
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
A Note
When I referred to a workaround I implied using the pack intrinsic. For example note that replacing the allocate(...,source=pack(...)) line of the code above with a "user" pack procedure such as:
allocate(cont_he(count(container%id/=0)))
cnt = 0
do i=1,size(container)
if (container(i)%id/=0) then
cnt = cnt + 1
cont_he(cnt) = container(i)
end if
end do
produces the correct result. I'm sorry, I forgot to mention this :)
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Since the problem seems to be with the PACK intrinsic, I think your only workaround is not to use said intrinsic. The code causes an ICE in gfortran 4.8, and gfortran 4.9+ doesn't seem to support SOURCE= in the allocate statement. sunf90 complains about the allocatable components in the PRINT statements, but after changing those to
print *, (cont_he(i)%id, cont_he(i)%lowkey, i = 1, SIZE(cont_he))
the code compiles just fine and produces the expected results:
...:~$ ll `which sunf90`
lrwxrwxrwx 1 root root 5 Mar 17 20:58 /opt/solarisstudio12.4/bin/sunf90 -> ./f90*
...:~$ sunf90 test_pack.f90
...:~$ ./a.out
output before deallocating container
2 1 2 3 4 5 5 6 7 8
output after deallocating container
2 1 2 3 4 5 5 6 7 8
...:~$ ll `which ifort`
-rwxr-xr-x 1 root root 4013312 Apr 25 08:19 /opt/intel/composer_xe_2013_sp1.3.174/bin/intel64/ifort*
...:~$ ifort test_pack.f90
...:~$ ./a.out
output before deallocating container
2 1 2 3 4 5
5 6 7 8
output after deallocating container
2 0 0 3 4 5
32641440 0 7 8
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks a lot John for your feedback! For now, I've coded the packing without the pack intrinsic. It's really interesting that both gfortran and ifort give the same error.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
It is a known issue in "PACK" and has been fixed in 15.0 beta compiler.
Thanks,
Xiaoping Duan
Intel Customer Support
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page