Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.
Announcements
Welcome to the Intel Community. If you get an answer you like, please mark it as an Accepted Solution to help others. Thank you!
26755 Discussions

## Using larger array in a Fortran subroutine Beginner
74 Views

My Fortran code is below(test.f):

```subroutine sub(n1,n2,wa)
implicit none
integer, intent(in)  :: n1, n2
real(4), intent(inout) :: wa(1_8:1_8*n1*n2)
integer(8) :: i, j, ms

print*, 'in sub, 1_8*n1*n2=', 1_8*n1*n2
print*, 'in sub, size of wa:', size(wa,kind=8)

ms=0
!\$omp parallel default(shared) private(i,j,ms)
!\$omp do
do i=1, n1
do j=1, n2
ms=(i-1)*n2+j
wa(ms)=ms*1.d0
enddo; enddo;
!\$omp end do nowait
!\$omp end parallel

print*, 'size of wa:', size(wa,kind=8)

return
end subroutine sub

program main
implicit none
integer, parameter :: n1=2**11,n2=2**20
real(4), allocatable :: wave(:)
integer :: ierr
integer(8) :: i

allocate(wave(1_8*n1*n2), stat=ierr)

!\$omp parallel default(shared) private(i)
!\$omp do
do i=1_8,1_8*n1*n2
wave(i)=0.d0
enddo
!\$omp end do nowait
!\$omp end parallel

print*, 'in main, size of wave:', size(wave,kind=8)

call sub(n1, n2, wave)

print*, wave(1_8*n1*n2)

deallocate(wave, stat=ierr)
end program main```

n1 and n2 can be larger, and make sure that n1*n2 is an long integer (>2**31-1). I just want to test how to use very large array in a subroutine.

i compile with intel fortran 2015 and run on centos 7.3.1611.

I compile with: `ifort -openmp -CB test.f`.

the array `wa` in subroutine `sub` will make an error if I use `-CB` option for checking bound of an array.

This is the error information:

in main, size of wave: 2147483648
in sub, 1_8*n1*n2= 2147483648
in sub, size of wa: 0
forrtl: severe (408): fort: (2): Subscript #1 of the array WA has
value 108003329 which is greater than the upper bound of -2147483648.

the number of value in the error information is random.

When I declare `wa` in subroutine as `real(4), intent(inout) :: wa(1)`, the program will run well.

If i complie with: gfortran gfortran -fopenmp -fbounds-check test.f, the program also run well.

Can someone tell me why?

0 Replies 