Мой компилятор показывает эту ошибку
Warning: Rank mismatch in argument ‘change’ at (1) (scalar and rank-2) [-Wargument-mismatch]
Изменение аргумента в подпрограмме solve_pos_eq, а вот код
program poisson
implicit none
integer :: ni,nj
real :: h_size
integer :: ii,jj ! For loops
real(16) :: change,accuracy
real(16),allocatable :: uij(:,:), uij_new(:,:), q_den(:,:)
write(*,*) "Enter number of cells in x and y, and cell size:"
read(*,*) ni,nj,h_size
write(*,*) "Enter desired accuracy:"
read(*,*) accuracy
allocate(uij(0:ni+1,0:nj+1))
allocate(uij_new(0:ni+1,0:nj+1))
allocate(q_den(0:ni+1,0:nj+1))
do ii=1,ni
q_den(ii,1:nj)=4.0*ii
end do
call solve_pos_eq(accuracy,h_size,ni,nj,q_den,uij_new,uij,change)
do ii=0,ni+1
write(*,'(*(es16.4e2))') uij_new(ii,:)
end do
deallocate(uij)
deallocate(uij_new)
deallocate(q_den)
stop 0
end program poisson
subroutine solve_pos_eq(accuracy,h_size,ni,nj,q_den,uij_new,change,uij)
implicit none
integer,intent(in) :: ni,nj ! input cell number in the x and y direct
real,intent(in) :: h_size
integer :: ii,jj
real(16),intent(out) :: change,accuracy
! Allocatable arrays to store potentials and charge density
real(16),intent(in) :: q_den(0:ni+1,0:nj+1)
real(16),intent(out) :: uij_new(0:ni+1,0:nj+1), uij(0:ni+1,0:nj+1)
uij=0.0
uij_new=0.0
do
change=0.0 !
do jj = 1, nj
do ii = 1,ni
uij_new(ii,jj)=0.25*( uij(ii+1,jj)+uij(ii-1,jj)+uij(ii,jj+1) &
& +uij(ii,jj-1)-16.0*atan(1.0)*q_den(ii,jj)*h_size**2 )
if (abs(uij_new(ii,jj)-uij(ii,jj)) > change) then
change=abs(uij_new(ii,jj)-uij(ii,jj))
end if
end do ! ii
end do ! jj
if (change < accuracy) then
write(*,*) "Reached required accuracy"
exit
end if
uij=uij_new
end do
return
end subroutine solve_pos_eq
Я понял, что вызов и аргументы подпрограммы не совпадают. Я должен был поменять change и uij.
вызову solve_pos_eq (точность, h_size, ni, nj, q_den, uij_new, uij, изменение )
подпрограмма solve_pos_eq (точность, h_size, щ, щ, q_den, uij_new изменение, Uij )