Вы пропустили некоторую ключевую информацию для понимания того, что B достигает.
Тем не менее, я оценил минимальное определение модуля data_structure и подпрограммы pre_b, которое перечисляет то, что потребуется, прежде чем можно будет вызвать B.
Вы также указали, что «n», размерность R - это локальное целое число в подпрограмме B. Это необходимо определить, прежде чем можно будет вызывать ALLOCATE ( R(n) )
или ALLOCATE ( R(imax*jmax) )
. Я бы отделил n и k как счетчик для R (n)
print*, i,j,R(k)
будет предпочтительной временной проверкой того, как определяется R.
module data_structure
!
! these dimensions of arrays need to be provided somewhere
integer :: imax = 100
integer :: jmax = 100
!
! these need to be defined before calling B
real :: CFL
real :: rho
real :: dx, dy
!
real, allocatable :: ustar(:,:)
real, allocatable :: vstar(:,:)
real, allocatable :: R(:)
end module data_structure
subroutine pre_B
use data_structure
!
! somewhere define inputs to subroutine B
!
imax = 11
jmax = 11
allocate ( ustar(imax+1,jmax ) )
allocate ( vstar(imax ,jmax+1) )
!
! get definition of ustar and vstar
ustar = 1.0
vstar = 1.0
!
cfl = 1.0
rho = 1.0
dx = .01
dy = .01
!
! report these values before calling B
!
end subroutine pre_B
subroutine B
use data_structure
integer :: i, j, n, k
real :: dt, dxi, dyi
n = imax*jmax ! this is needed ( n is local to subroutine B )
allocate ( R(n) )
dt = 0.5*CFL*dx**2
dxi = 1/dx
dyi = 1/dy
k = 0
do j = 1,jmax
do i = 1, imax
k = k+1
R(k) = -rho/dt*( (ustar(i+1,j)-ustar(i,j))*dxi &
+ (vstar(i,j+1)-vstar(i,j))*dyi )
print*, i,j,R(k)
end do
end do
end subroutine B