Dan,
Sorry about the last answer, I misread your post.
If you allocate a big array in common, this forces SLINK to move all the system bits to the end of the first 2gb of memory, but if you don't then the syetem bits are spread through the first 2gb. This is illustrated in the list of largest available array in 0-2gb.
As for my earlier answer, I modified BIG.f95 on Windows 7 and it shows that yo can allocate large arrays with an address above 2gb. My changed code is listed below (hopefully in full)
John
! Program to test large arrays
module big_arrays
integer*4 n, m
real*8, dimension(:,:), allocatable :: AA, BB, CC
end module big_arrays
!
use big_arrays
!
integer*4 ii, nn, mm
real*8 x
!
! near 2gb array n = 16000
n = 16000
allocate ( aa(n,n), stat = ii)
x = dble(n)*dble(n) * 8. / 1024./1024.
write (*,fmt='(a,i0,a,i0,a,f0.2,a,i0)') ' Allocating AA(',n,',',n,'); size=',x,'gb : status = ',ii
write (*,*) 'Address = ', LOC (AA)
!
! near 1.3gb array m = 13000
m = 13000
allocate ( bb(m,m), stat = ii)
x = dble(m)*dble(m) * 8. / 1024./1024.
write (*,fmt='(a,i0,a,i0,a,f0.2,a,i0)') ' Allocating BB(',m,',',m,'); size=',x,'gb : status = ',ii
write (*,*) 'Address = ', LOC (BB)
!
! Test full arrays
call set_array (aa(1,1), n,n)
call set_array (bb(1,1), m,m)
call check_array (aa(1,1), n,n)
call check_array (bb(1,1), m,m)
!
! Now test part of arrays
nn = n/2
mm = m/2
call set_array (aa(1,1), n,nn)
call set_array (aa(1,nn+1),n,nn) ! has address > 2gb
call set_array (bb(1,1), m,mm)
call set_array (bb(1,mm+1),m,mm)
!
call check_array (aa(1,1), n,nn)
call check_array (bb(1,1), m,mm)
call check_array (aa(1,nn+1),n,nn) ! has address > 2gb
call check_array (bb(1,mm+1),m,mm)
!
deallocate (aa)
allocate ( aa(n,nn), stat = ii)
x = dble(n)*dble(nn) * 8. / 1024./1024.
write (*,fmt='(a,i0,a,i0,a,f0.2,a,i0)') ' Allocating AA(',n,',',nn,'); size=',x,'gb : status = ',ii
write (*,*) 'Address = ', LOC (AA)
!
allocate ( cc(n,nn), stat = ii)
x = dble(n)*dble(nn) * 8. / 1024./1024.
write (*,fmt='(a,i0,a,i0,a,f0.2,a,i0)') ' Allocating CC(',n,',',nn,'); size=',x,'gb : status = ',ii
write (*,*) 'Address = ', LOC (CC)
!
call set_array (aa(1,1), n,nn)
call set_array (cc(1,1),n,nn) ! has address > 2gb
call check_array (aa(1,1), n,nn)
call check_array (cc(1,1), n,nn) ! has address > 2gb
end