这个Fortran变量来自哪里?
有人能告诉我下面的子程序中使用的这个Fortran变量来自哪里?,fortran,fortran-common-block,Fortran,Fortran Common Block,有人能告诉我下面的子程序中使用的costh变量吗?子程序从何处获取此变量的值?它是某种错误还是内置函数 下面给出了完整的子程序 SUBROUTINE MOMENT(I,A,AP,MODE,EP,NCASC,ID) COMMON/MOM/VY(99996),VZ(99996),VX(99996) DIMENSION ERES(99996),FCT(99996) COMMON/XQANG/SUM(300,10),MDIR,COSTH EQUIVALENCE(ERES(
costh
变量吗?子程序从何处获取此变量的值?它是某种错误还是内置函数
下面给出了完整的子程序
SUBROUTINE MOMENT(I,A,AP,MODE,EP,NCASC,ID)
COMMON/MOM/VY(99996),VZ(99996),VX(99996)
DIMENSION ERES(99996),FCT(99996)
COMMON/XQANG/SUM(300,10),MDIR,COSTH
EQUIVALENCE(ERES(1),VY(1)),(FCT(1),VZ(1))
IF(ID-2)10,30,40
C INITIALIZATION
10 N=1
NN=N+NCASC-1
DO 20 J=N,NN
VY(J)=EP*MDIR
VX(J)=0.
20 VZ(J)=EP*(1-MDIR)
GO TO 60
C
C CALCULATION OF MOMENT
C
CKM 30 RN4=RANF(0.)
30 RN4=RAN(ISEED) !KM
PHI=6.28318*RN4
SOX=2.*AP*EP/(A**2*931.5)
C BUG FIX A*(AP+A)REPLACED BY A**2 12/15/82
C IF(SOX.LT.0.)WRITE(*,943)AP,EP,A
VT=SQRT(SOX)
SOX=1.-COSTH**2
IF(SOX.LT.0.)SOX=0.
SINTH=SQRT(SOX)
VZSE=VT*COSTH
VYSE=VT*SINTH*SIN(PHI)
VXSE=VT*SINTH*COS(PHI)
VZ(I)=VZ(I)+VZSE
VY(I)=VY(I)+VYSE
VX(I)=VX(I)+VXSE
VZP=VZ(I)-VZSE*(A/AP+1.)
VYP=VY(I)-VYSE*(A/AP+1.)
VXP=VX(I)-VXSE*(A/AP+1.)
VPP2=VZP*VZP+VYP*VYP+VXP*VXP
EPART=AP*VPP2*469.
SOX=0.
IF(VPP2.GT.0.0)SOX=VZP/SQRT(VPP2)
C DO NOT USE QUICK FUNCTIONS HERE
ANG=ACOS(SOX)*180./3.1415927
CALL OUTEM(2,MODE,EPART,ANG)
GO TO 60
C
C END CALCULATION
C
40 VFTS=VX(I)**2+VY(I)**2+VZ(I)**2
ERES(I)=0.5*A*VFTS*931.5
IF(VFTS.NE.0.)GO TO 50
FCT(I)=0.0
GO TO 60
50 FCT(I)=ACOS(VZ(I)/SQRT(VFTS))*180./3.1415927
60 RETURN
END
这条线
COMMON/XQANG/SUM(300,10),MDIR,COSTH
通知子程序一个名为XQANG
的公共块,该块有一个名为COSTH
的元素。在没有其他信息的情况下,并且在该年份的代码中,这很可能是一个real
变量
公共块是早期的Fortran机制,用于在程序单元之间共享变量,例如在主程序和子例程之间。在直接使用中,相同的公共块声明将出现在多个位置,具有相同的变量列表。每个声明都引用相同的变量
不过,有一个转折点,需要小心注意。公共块实际上是一个共享内存块,不要求声明的每个实例标识相同的变量。公共块的一个常见用途是在一个位置声明一个100个实数的数组,但在其他位置声明两个50个实数的数组——相同的内存,不同的变量
更好的是,它们还可以用来改变变量的类型(某种程度上)。公共块的一种用法可能包含一个占用4字节的实变量,而同一块的另一种用法可能在同一位置包含一个4字节的整数变量-相同的位,不同的解释
这些曲折是普通区块被广泛弃用的原因之一。他们不赞成的另一个原因是他们模糊了变量的共享,现在我们大多数人更喜欢通过参数列表显式地将参数传递到子程序中或从子程序中传递出去
我猜50岁以下的Fortran程序员中很少有人还在使用它们编写新代码。但是8-80的Fortran程序员仍在编写包含它们的代码。这一行
COMMON/XQANG/SUM(300,10),MDIR,COSTH
通知子程序一个名为XQANG
的公共块,该块有一个名为COSTH
的元素。在没有其他信息的情况下,并且在该年份的代码中,这很可能是一个real
变量
公共块是早期的Fortran机制,用于在程序单元之间共享变量,例如在主程序和子例程之间。在直接使用中,相同的公共块声明将出现在多个位置,具有相同的变量列表。每个声明都引用相同的变量
不过,有一个转折点,需要小心注意。公共块实际上是一个共享内存块,不要求声明的每个实例标识相同的变量。公共块的一个常见用途是在一个位置声明一个100个实数的数组,但在其他位置声明两个50个实数的数组——相同的内存,不同的变量
更好的是,它们还可以用来改变变量的类型(某种程度上)。公共块的一种用法可能包含一个占用4字节的实变量,而同一块的另一种用法可能在同一位置包含一个4字节的整数变量-相同的位,不同的解释
这些曲折是普通区块被广泛弃用的原因之一。他们不赞成的另一个原因是他们模糊了变量的共享,现在我们大多数人更喜欢通过参数列表显式地将参数传递到子程序中或从子程序中传递出去
我猜50岁以下的Fortran程序员中很少有人还在使用它们编写新代码。但是8-80的Fortran程序员仍然在编写包含它们的代码。添加
隐式无
,作为第二行代码。还要注意的是,costh
出现在第四行的common
语句中。我不希望对程序进行任何修改。因为我有一个大约100页的程序,这只是其中的一部分。我只需要知道可变成本。我的意思是:在这里搜索问题,试图理解常见的问题。试试看,我这样做了,它只是给出了要使用的变量列表。我们已经有了MDIR的价值。但是COSTH只出现在整个程序中(在这个子例程块中),不希望修改代码是您的特权,但是许多人已经成功地使用“测试工具”来验证子例程或函数是否工作。然后将代码更新为更好的实践,如模块。当一个人有一些标准的输入和输出来确定它是否按预期工作时,这是最容易做到的。添加隐式无通常是一个值得进行的第一次修改。添加IMPLICIT NONE
作为第二行查看。还要注意的是,costh
出现在第四行的common
语句中。我不希望对程序进行任何修改。因为我有一个大约100页的程序,这只是其中的一部分。我只需要知道可变成本。我的意思是:在这里搜索问题,试图理解常见的问题。试试看,我这样做了,它只是给出了要使用的变量列表。我们已经有了MDIR的价值。但是COSTH只出现在整个程序中(在这个子例程块中),不希望修改代码是您的特权,但是许多人已经成功地使用“测试工具”来验证子例程或函数是否工作。然后将代码更新为更好的实践,如模块。当一个人有一些标准的输入和输出来确定它是否按预期工作时,这是最容易做到的。添加隐式NONE通常是一个值得进行的第一次修改。COSTH仅用于此子例程。虽然此公共块也用于其他地方,但最后一个变量是CT。我应该寻找它的值吗?是的,我重复是的,得到