Использование переменной счетчика в Фортране без цикла - PullRequest
0 голосов
/ 28 июня 2018

Я новичок в Фортране и привык к Matlab, поэтому у меня возникли проблемы с переносом части логики в Фортран. У меня есть следующий цикл:

subroutine B
   use data_structure 
   integer :: i, j, n 
   real :: dt, dxi, dyi 

   allocate(R(n))
   dt = 0.5*CFL*dx**2
   dxi = 1/dx
   dyi = 1/dy
   n = 0

   do j = 1,jmax 
      do i = 1, imax 
         n = n+1 
         R(n) = -rho/dt*((ustar(i+1,j)-ustar(i,j))*dxi+(vstar(i,j+1)-vstar(i,j))*dyi)
         print*, R
      end do 
   end do 
end subroutine B 

Вы видите, что я пытаюсь обновить вектор R, вручную суммируя значения n на каждой итерации. Программа запускается, но не дает мне ожидаемых результатов. Есть ли более простой способ сделать это, возможно, с помощью другого цикла do? Извините, логика того, как написать это, испортила меня. Спасибо!

1 Ответ

0 голосов
/ 28 июня 2018

Вы пропустили некоторую ключевую информацию для понимания того, что 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...