我想编译一个名为MOLSCAT的计算代码,它使用NAMELIST数据作为输入文件,如Test。根据主代码,编译器读取通道5中的输入。我将输入文件放在主代码文件夹中,并在Linux版本的Simply Fortran中编译主代码。但是无论有没有输入文件,它都会给出输出
==============================================================
Generating Makefile... Okay
==============================================================
Compiling /home/farhad/Downloads/v14.f
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/home/farhad/Downloads/v14.f:2381:17:
1 PARITY(IEXCH+JLEV(2*NLEV+I)+JTOT+JZCSFL*JLEV(IOFF+I)).LE.0.D0)
1
Error: 'mask' argument of 'parity' intrinsic at (1) must be LOGICAL
- - - - - - - - -- - - - - -- - - - -- - - - - -- - -- -- - - -- - -
/home/farhad/Downloads/v14.f:10720:39:
4000 CALL CPL24(N,MXLAM,LAM,NLEV,JLEV,JLEV,J,MVALUE,VL,PRINT,LFIRST)
1
Warning: Type mismatch in argument 'atau' at (1); passed INTEGER(4) to REAL(8)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Error: Last command making (build/v14.o) returned a bad status
Error: Make execution terminated
* Failed *
有谁知道这是什么问题?
答案 0 :(得分:3)
我是MOLSCAT的作者,所以我可以就这个问题给出一些明确的答案。
首先,此查询可能引用的是1994年左右的MOLSCAT版本14,该版本确实是为FORTRAN 77编写的。我可以提供最新版本的2019.0(测试版),该版本已得到充分记录,并将(希望)发布。在2019年。它是免费的。
是的,MOLSCAT v14具有双精度函数奇偶校验,该奇偶校验采用整数参数,如果参数为奇数,则返回+ 1.d0,如果为偶数,则返回-1.d0。此后,FORTRAN引入了具有相同名称的内在函数。在当前版本中,我们已将函数PARSGN重命名。
MOLSCAT还使用一些古老的FORTRAN功能(从FORTRAN IV开始),例如在(1)或(2)处确定数组的尺寸以抑制数组绑定检查。通过将双精度数组的切片传递给将其声明为整数的例程,还可以节省存储空间。因为FORTRAN通过引用传递数组,所以它可以工作,只要编译器不对例程进行过度的狂热比较。只需忽略这些警告即可。
还有一些其他过时/过时的构造,例如计算的GOTO和算术IF。我们大部分已经在人们实际使用的代码部分中重写了它们,但是有些未使用的部分不值得花精力,但是如果用户想要重现旧作品,则不应删除。
Jeremy Hutson
达勒姆大学
J.M。Hutson@durham.ac.uk
答案 1 :(得分:1)
从错误消息中获取提示,提示通常很好。但是,错误经常级联,甚至在代码中也会导致其他问题,这可能就是您看到这么多消息的原因。我的建议是修复列出的第一个错误并尝试再次运行。
这些是您在帖子中显示的错误:
SomeColumn
并跟踪其发生的情况。另外,来NASA - Mole Scat ??
注意:啊,我现在看到:ATAU
是MOLSCAT源代码中第1169行定义的函数。它不是(当前的,2008年)Fortran标准库的parity
。它定义为:
parity
源代码与F2008标准中的内在函数之间存在名称冲突。我不知道除了在源代码中重命名函数之外,如何禁用它以兼容F77。您可以在主程序中添加一个新行:FUNCTION PARITY(I)
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
PARITY=1.D0
IF((I/2)*2-I.NE.0) PARITY=-1.D0
RETURN
END
以便使用MOLSCAT中定义的函数...有一个相关的讨论here,也许像@SteveLionel这样的人有一些输入
作为旁注,我不知道为什么这是一个有用的功能。何时会返回 external parity
?
答案 2 :(得分:0)
re:第二种类型不匹配警告。他们似乎故意将符号传递给不同的类型:
CALL CPL24(N,MXLAM,LAM,NLEV,JLEV,JLEV,J,MVALUE ....
注意位置5和6中重复的整数数组jlev
,然后是sub:
ENTRY CPL24(N,MXLAM,LAM,NLEV,JLEV,ATAU,J,MVAL ..
他们在这些位置有一个整数和真实的虚拟变量。如果不解析整个代码,我相信这是故意的,你应该忽略这个警告。
我注意到的另一件事是,他们在整个地方对数组进行了维度2
INTEGER J(N),L(N),LAM(2),JLEV(2)
INTEGER PRINT
DIMENSION ATAU(2),VL(2)
我很确定(之前已经看到过这些)这些实际上是假设的大小数组(基本上依靠旧编译器不进行边界检查)。没关系,但这意味着你将无法对此代码进行边界检查。
任何旧计时器都会猜到他们使用2
的原因?