Несоответствие Фортрана в аргументе - PullRequest
0 голосов
/ 01 мая 2020

Мой компилятор показывает эту ошибку

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 )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...