allocatable array assignment error

allocatable array assignment error

dan0112的头像

Hi

the following program displays behavior that I don't understand.

module type_mod 
    type mytype 
        real, dimension(:,:,:,:,:,:), allocatable:: a 
        contains 
            procedure :: allocate 
    end type mytype 
    contains 
    subroutine allocate(this,n1, n4) 
        class(mytype), intent(inout):: this 
        integer , intent(in) :: n1, n4 
        integer, parameter :: n2= 5, n3=5 
        if (.not. allocated(this%a)) allocate(this%a(n1,n2,n3,n4,10,10)) 
    end subroutine allocate 
end module type_mod 
program main 
    use type_mod 
    implicit none 
    type(mytype) :: t 
    real, allocatable :: a2(:,:,:,:) 
    integer:: n1, n2, n3,n4, i, case 
    call t%allocate(5,5) 
    t%a=10.0 
    n1=size(t%a,1); n2=size(t%a,3); n3=size(t%a,4); n4=size(t%a,6) 
    allocate(a2(n1,n2,n3,n4)) 
    i=2 
    case =2 
    select case (case) 
    case(1) 
        a2= t%a(:,2,:,:,i,:)  ! this works 
    case(2) 
        a2= 1.0*t%a(:,2,:,:,i,:) ! this does NOT work 
    case(3) 
        a2(:,:,:,:)= 1.0*t%a(:,2,:,:,i,:) ! this works 
    end select 
    print*, n1,n2,n3,n4 
    print*, shape(a2) 
    print*, a2(1,2,3,4) 
end program main 
 

Compile with bounds checking, allowing for Fortran 2003 reallocation of allocatable arrays on assignment, e.g.:
ifort -g -check bounds -assume realloc_lhs -o "main.o" "../main.f90" 
 

Output is:

           5           5           5          10
           5           1           5           5
forrtl: severe (408): fort: (2): Subscript #2 of the array A2 has value 2 which is greater than the upper bound of 1

Traceback indicates the line containing  print*, a2(1,2,3,4) as the source of the violation.

If you set case=1 or case=3, I get the expected output:

           5           5           5          10
           5           5           5          10
   10.00000

*The question*: Why do I get the error in case=2 ?

*More information*: Not allowing for the Fortran 2003 reallocation on assignment yields the expected results in all cases. Turning off bounds checking yields somewhat strangely:

           5           5           5          10
           5           1           5          10
   10.00000

Thanks in advance!

Daniel

PS: I am using Intel composer_xe_2013.0.079 on Ubuntu 12.04

8 帖子 / 0 new
最新文章
如需更全面地了解编译器优化,请参阅优化注意事项.
Steve Lionel (Intel)的头像

Thanks for the interesting test case. I can reproduce the problem and have escalated it as issue DPD200238279. I will update this thread with any progress.

Steve
dan0112的头像

The guys at the comp.lang.fortran (CLF) newsgroup think this is a compiler bug. They provided a much simpler program that displays the same error:


program main

  implicit none
  real, allocatable:: a(:,:)

  real, allocatable :: a2(:)
  allocate(a(5,6))

  a =10.0
  a2 = 1.0 * a(2,:)
  print "('shape of ',A,T30,*(I2,:,','))",  &

      'a(2,:))', shape(a(2,:))

  print "('shape of ',A,T30,*(I2,:,','))",  &

      '1.0 * a(2,:)', shape(1.0 * a(2,:))

  print "('shape of ',A,T30,*(I2,:,','))",  &

      'a2', shape(a2)

  print *, a2(6)

end program main


>ifort /check:all /warn:all /standard-semantics "2012-11-08 danielh.f90" && "2012-11-08 danielh.exe"
Intel(R) Visual Fortran Compiler XE for applications running on IA-32, Version 13.0.1.119 Build 20121008

...

shape of a(2,:))              6

shape of 1.0 * a(2,:)         6

shape of a2                   1

forrtl: severe (408): fort: (2): Subscript #1 of the array A2 has value 6 which is greater than the upper bound of 1

dan0112的头像

I have reproduced the error on ifort version 12.1.2 also

Steve Lionel (Intel)的头像

I have no doubt it's a compiler bug. Thanks for the simpler example.

Steve
Steve Lionel (Intel)的头像

We have a fix for this, but it's fairly complex and it will have to wait for a major release later this year. The problem occurs when you have an assignment of the form:

A = B(:,:,3,:) + 1

where the subscripts of B are colons except for one that is a scalar, and the array section is combined with an arithmetic operator. In this case, the shape of the section is not properly computed for the purpose of the automatic reallocation of the left side.

A workaround is to split the operation in two, such as:

A = B(:,3,:,:)
A = A + 1

We have confirmed that our fix handles both test programs, and appreciate your bringing this to our attention. We're somewhat astonished that this hasn't been reported before - the bug has been there for many years.

Steve
jimdempseyatthecove的头像

Steve,

Would

A = (B(:,:,3,:)) + 1

work as well?

Jim Dempsey

Blog: The Parallel Void

www.quickthreadprogramming.com
Steve Lionel (Intel)的头像

As far as I know, no, that would not work.

Steve

登陆并发表评论。