Я унаследовал устаревший код Fortran 77, который теперь пытаюсь компилировать в соответствии со стандартом Fortran 2003. . Я понятия не имею о Fortran (я знаю C и Python), я собираю его по пути.
Приведенный ниже фрагмент кода вызывает ошибку компилятора (также указанную ниже). Честно говоря, от одного взгляда на этот код у меня начинает болеть голова: я действительно не понимаю, как можно было написать такую строку кода, как
A(i) = A(i) + B(q)
где и A, и B — функции. Я знаком с концепцией рекурсивных функций в C и Python, и если бы я был компилятором в описанной здесь ситуации, я бы, вероятно, пожаловался и выдал как минимум предупреждение WTF.
Я не ожидаю, что кто-то исправит этот код для меня. Я был бы более чем счастлив, если бы кто-нибудь мог объяснить мне, что (пытается) достичь строкой:
cipr(IPR_WADV, ipa_idx, ispc) = cipr(IPR_WADV, ipa_idx, ispc) + fc1(l)/dy/depth(i,j,k)
или порекомендуйте мне хорошее место, где я могу посмотреть это.
Ниже приведен фрагмент кода и соответствующая ошибка компилятора.
IF( lipr ) THEN
!-----Change from X-direction horizontal advection
l = 1
DO i=i1+1,i2-1
l = l+1
IF( ipa_cel(i,j,k) .GT. 0 ) THEN
ipa_idx = ipa_cel(i,j,k)
!-----Flux at west boundary
cipr(IPR_WADV, ipa_idx, ispc) = cipr(IPR_WADV, ipa_idx, ispc) + fc1(l)/dy/depth(i,j,k)
!-----Flux at east boundary
cipr(IPR_EADV, ipa_idx, ispc) = cipr(IPR_EADV, ipa_idx, ispc) + fc2(l)/dy/depth(i,j,k)
!-----Average volume
cipr(IPR_VOL, ipa_idx, ispc) = cipr(IPR_VOL, ipa_idx, ispc) + dx(j)*dy*depth(i,j,k)
npastep(ipa_idx,ispc) = npastep(ipa_idx,ispc) + 1
END IF
END DO
END IF
компилятор выдает это выходное сообщение как ошибку
gfortran -std=f2003 -c -g -o build/Debug/GNU-Linux-x86/xyadvec.o
xyadvec.f03 xyadvec.f03:177.42:
cipr(IPR_WADV, ipa_idx, ispc) = cipr(IPR_WADV, ipa_idx, ispc) + fc1(l
1
Error: Statement function at (1) is recursive