我正在尝试运行 Enzo Project 模拟,并按照网站上列出的步骤进行操作:https://enzo.readthedocs.io/en/latest/user_guide/bootcamp.html。我收到了一个错误,谷歌搜索并没有揭示我到底出了什么问题。这是我收到的错误:
Compiling BlockSolve.F
gfortran -c -o BlockSolve.o -fno-second-
underscore -m64 -g -DLINUX -DH5_USE_16_API -D__max_subgrids=100000 -D__max_baryons=30 -D__max_cpu_per_node=8 -D__memory_pool_size=100000 -DINITS64 -DLARGE_INTS -DCONFIG_PINT_8 -DIO_32 -DUSE_MPI -DCONFIG_PFLOAT_8 -DCONFIG_BFLOAT_8 -DUSE_HDF5_GROUPS -DTRANSFER -DNEW_GRID_IO -DFAST_SIB -DENZO_PERFORMANCE -DUSE_UUID -DSAB BlockSolve.F
BlockSolve.F:1070:11:
1070 | NB = ILAENV( 1, 'UGETRF', ' ', M, N, -1, -1 )
| 1
Error: Type mismatch in argument 'ispec' at (1); passed INTEGER(4) to INTEGER(8)
BlockSolve.F:1070:11:
1070 | NB = ILAENV( 1, 'UGETRF', ' ', M, N, -1, -1 )
| 1
Error: Type mismatch in argument 'n3' at (1); passed INTEGER(4) to INTEGER(8)
BlockSolve.F:1070:11:
1070 | NB = ILAENV( 1, 'UGETRF', ' ', M, N, -1, -1 )
| 1
Error: Type mismatch in argument 'n4' at (1); passed INTEGER(4) to INTEGER(8)
BlockSolve.F:932:30:
932 | JP = J - 1 + e_idamax( M-J+1, A( J, J ), 1 )
| 1
Error: Type mismatch in argument 'incx' at (1); passed INTEGER(4) to INTEGER(8)
BlockSolve.F:2628:18:
2628 | ILAENV = IEEECK( 0, 0._RKIND, 1._RKIND )
| 1
Error: Type mismatch in argument 'ispec' at (1); passed INTEGER(4) to INTEGER(8)
BlockSolve.F:2639:18:
2639 | ILAENV = IEEECK( 1, 0._RKIND, 1._RKIND )
| 1
Error: Type mismatch in argument 'ispec' at (1); passed INTEGER(4) to INTEGER(8)
make: *** [BlockSolve.o] Error 1
答案1
这不是 Makefile 错误。制作行为正确:它已停止构建,因为您的 BlockSolve.F Fortran 源代码中有 6 个语言错误(第 1070 行有 3 个错误,第 932、2628 和 2639 行各有一个)。
修复编译时错误,make 将继续下一阶段。
所有错误都与将 INT(4) 变量传递给需要 INT(8) 的函数相关。这可能是因为您下载的源代码适用于早期的 Fortran 标准,或者适用于与您的体系结构不同的体系结构。
您引用的文档实际上指出“这会导致不匹配:虽然 C/C++ 代码始终具有正确的位宽,但 Fortran 代码必须正确设置这些变量以确保正确的位宽。”并指出有四个变量需要正确设置(例如 MACH_FFLAGS_INTEGER_64),并且为不同的体系结构和操作系统提供了多个 makefile。
该文档还提供了一个论坛的链接enzo-users
来帮助解决此类问题。