- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello,
When the code below is compiled and run I get the following error:
$ ifort -V
Intel Fortran Intel 64 Compiler XE for applications running on Intel 64, Version 12.1.1.256 Build 20111011
$ ifort -g -traceback -assume realloc_lhs test_module.f90 test_program.f90
$ ./a.out
forrtl: severe (151): allocatable array is already allocated
Image PC Routine Line Source
a.out 00000000004672CA Unknown Unknown Unknown
a.out 0000000000465DC6 Unknown Unknown Unknown
a.out 000000000043E860 Unknown Unknown Unknown
a.out 000000000042375E Unknown Unknown Unknown
a.out 00000000004099FA Unknown Unknown Unknown
a.out 0000000000402DF1 my_module_mp_arra 27 test_module.f90
a.out 0000000000404935 my_module_mp_mt_c 56 test_module.f90
a.out 0000000000404EED my_module_mp_mt_c 70 test_module.f90
a.out 00000000004051F3 MAIN__ 11 test_program.f90
a.out 0000000000402A9C Unknown Unknown Unknown
libc.so.6 00007FDB213D7C4D Unknown Unknown Unknown
a.out 0000000000402999 Unknown Unknown Unknown
The problem is that on entry to subroutine "array_to_mt", mt_var%c does not get deallocated although mt_var has intent(out).
The funny thing is that if I comment out the whole of subroutine "mt_transpose" (which is not used anywhere by the program) then the program works fine!
$ ./a.out
1.0000 0.0000 0.0000
2.5000 -3.0000 -4.0000
2.0000 0.0000 0.0000
It looks like a bug, but maybe since the code is a bit complex you can pinpoint some bad programming practice of my behalf which causes the error.
Thanks a lot,
Alexandros
When the code below is compiled and run I get the following error:
$ ifort -V
Intel Fortran Intel 64 Compiler XE for applications running on Intel 64, Version 12.1.1.256 Build 20111011
$ ifort -g -traceback -assume realloc_lhs test_module.f90 test_program.f90
$ ./a.out
forrtl: severe (151): allocatable array is already allocated
Image PC Routine Line Source
a.out 00000000004672CA Unknown Unknown Unknown
a.out 0000000000465DC6 Unknown Unknown Unknown
a.out 000000000043E860 Unknown Unknown Unknown
a.out 000000000042375E Unknown Unknown Unknown
a.out 00000000004099FA Unknown Unknown Unknown
a.out 0000000000402DF1 my_module_mp_arra 27 test_module.f90
a.out 0000000000404935 my_module_mp_mt_c 56 test_module.f90
a.out 0000000000404EED my_module_mp_mt_c 70 test_module.f90
a.out 00000000004051F3 MAIN__ 11 test_program.f90
a.out 0000000000402A9C Unknown Unknown Unknown
libc.so.6 00007FDB213D7C4D Unknown Unknown Unknown
a.out 0000000000402999 Unknown Unknown Unknown
The problem is that on entry to subroutine "array_to_mt", mt_var%c does not get deallocated although mt_var has intent(out).
The funny thing is that if I comment out the whole of subroutine "mt_transpose" (which is not used anywhere by the program) then the program works fine!
$ ./a.out
1.0000 0.0000 0.0000
2.5000 -3.0000 -4.0000
2.0000 0.0000 0.0000
It looks like a bug, but maybe since the code is a bit complex you can pinpoint some bad programming practice of my behalf which causes the error.
Thanks a lot,
Alexandros
[fortran]module my_module
implicit none
private
public :: my_type
type my_type
real, allocatable, dimension(:,:) :: c
integer, dimension(2) :: n = 0
contains
procedure :: compact => mt_compact
procedure :: copy => mt_copy
procedure, private :: array_to_mt
generic :: assignment(=) => array_to_mt
end type my_type
contains
subroutine array_to_mt (mt_var, carray)
class(my_type), intent(out) :: mt_var
real, dimension(:,:), intent(in) :: carray
allocate(mt_var%c(0:size(carray,1)-1, 0:size(carray,2)-1))
mt_var%c = carray
mt_var%n = shape(carray) - 1
end subroutine array_to_mt
type(my_type) function mt_transpose (mt_var)
class(my_type), intent(in) :: mt_var
mt_transpose = transpose(mt_var%c)
end function mt_transpose
recursive subroutine mt_compact (mt_var)
class(my_type), intent(inout) :: mt_var
integer :: n1, n2
real, allocatable, dimension(:,:) :: carray
n1 = mt_var%n(1)
n2 = mt_var%n(2)
if ( n1 > 0 .and. all( mt_var%c(n1,:) == 0. ) ) then
carray = mt_var%c(0:n1-1,:)
mt_var = carray
call mt_compact(mt_var)
else if ( n2 > 0 .and. all( mt_var%c(:,n2) == 0. ) ) then
carray = mt_var%c(:,0:n2-1)
mt_var = carray
call mt_compact(mt_var)
end if
end subroutine mt_compact
type(my_type) function mt_copy (mt_var)
class(my_type), intent(in) :: mt_var
integer :: i, j
mt_copy = mt_var ! actually some processing would take place here instead of a simple copying
call mt_copy%compact()
end function mt_copy
end module my_module[/fortran] [fortran]program test_program
use my_module
implicit none
type(my_type) :: p, q
real, dimension(3,4) :: a1 = reshape( real([ 1., 2.5, 2., 0., -3., 0., 0., -4., 0., 0., 0., 0. ]), [3, 4] )
integer :: i
p = a1
q = p%copy()
do i = 0, q%n(1)
print "(8f15.4)", q%c(i,:)
end do
end program test_program[/fortran]
1 Solution
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks for the test case. It's strange - we fixed a bug that looks just like this for 12.1, but the test program for that one now passes yet this doesn't. I have escalated this as issue DPD200176328.
Link Copied
2 Replies
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks for the test case. It's strange - we fixed a bug that looks just like this for 12.1, but the test program for that one now passes yet this doesn't. I have escalated this as issue DPD200176328.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
This has been fixed for a future version.
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page