Fortran 2003標準でコンパイルしようとしている従来のFortran 77コードを継承しました。私は 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