我有一个围绕许多子例程编写的旧Fortran 77代码,每个子例程都在一个单独的文件中,并且它们广泛使用COMMON
语句。我已经分析了代码,在我发现的18个总包含文件中,有两个是声明最大静态数组的重击者。
例如,我的global.par
参数文件定义了
C keep nodes/elements below 400000 / 600000 to prevent relocation
C truncated to fit compiler error
INTEGER MAXNODES
PARAMETER ( MAXNODES = 1000000 )
INTEGER MAXELEMS
PARAMETER ( MAXELEMS = 4000000 )
然后这个参数文件我现在包含两个重写的包含文件,我把它变成了模块。但是,在声明静态数组(例如
)方面,这些新模块文件中的每一个都执行与以前相同的所有操作 C this module file name is aa_module.f
MODULE AA
IMPLICIT NONE
INCLUDE 'global.par'
REAL NODES (3, MAXNODES)
REAL NODES2 (3, MAXNODES)
INTEGER EL1 (12, MAXELEMS)
INTEGER EL2 (12, MAXELEMS)
C and so on, many more arrays based around MAXNODES & MAXELEMS
END MODULE AA
当我编译并链接程序时,如果我保留MAXNODES
和MAXELEMS
小的东西就行了。但我需要处理大型模型,所以当我抬起这些值时,我仍然会得到消息
重定位被截断以适合:对于符号的R_X86_64_32S ...在AA_module.o的COMMON部分中定义。
最佳解决方案是什么?我对Fortran的了解有限。
如果我创建一个名为Init_big_arrays
的新子例程,并且ALLOCATE
运行时模块AA中的所有数组都将解决此问题,请记住还有16个左右的其他包含根据{{1}}文件中的参数声明一堆静态整数和实数数组的文件,但其中最差的是global.par
和INTEGER ID(256,256)
?