小编Mec*_*Eng的帖子

Fortran execute_command_line运行时错误,取决于内存消耗

尝试使用Fortran中的execute_command_line内部函数创建目录时遇到运行时错误。Ifort(18.0.3 20180410)和gfortran(4.8.5)均会发生错误。这是一个最小的示例,该示例因我使用的任何编译标志而失败:

PROGRAM directory_test

    IMPLICIT NONE

    INTEGER :: cstat, estat, i, j
    CHARACTER(LEN=100) :: cmsg

    REAL, DIMENSION(:,:), ALLOCATABLE :: field
    INTEGER, PARAMETER :: fieldsize = 80000

    allocate(field(fieldsize,fieldsize))
    do j=1, fieldsize
        do i=1, fieldsize
            field(i,j) = real(i+j)
        end do
    end do

    call execute_command_line('mkdir -p newdir', WAIT=.true., EXITSTAT=estat, CMDSTAT=cstat, CMDMSG=cmsg)

    write(*,*) 'estat: ', estat
    write(*,*) 'cstat: ', cstat
    write(*,*) 'cmsg:  ', cmsg

END PROGRAM directory_test
Run Code Online (Sandbox Code Playgroud)

输出ifort:
estat:0
cstat:124
cmsg:提供给EXECUTE_COMMAND_LINE的命令无效

输出gfortran:
estat:-520880432
cstat:1
cmsg:无法获得命令语言解释器的终止状态

要注意的是:只要数组大小足够小,程序就可以正常运行。对我来说,阈值大约是所用物理内存的一半(如果您想尝试代码,请调整“ fieldsize”的值)。如果数组大于该数组,则会发生错误。如果数组较小,则代码将正确执行,并创建目录。我用来测试的机器都具有2个物理CPU和128GB-256GB的RAM。
我究竟做错了什么?

操作系统:Linux,Opensuse 42.3
shell:bash
文件系统:Ext4

编辑:问题不仅仅限于“ …

bash fortran runtime-error

5
推荐指数
1
解决办法
245
查看次数

将 3D 坐标转换为空间填充曲线的索引(Peano、Hilbert...)

虽然将 3D 坐标转换为 z 顺序曲线相对简单(Fortran 中的高效 z 顺序转换),但我很难理解使用不同空间填充曲线(例如 Peano 或 Hilbert)的数学原理。任何关于执行转换的实际代码如何看起来的提示将不胜感激。目标是拥有一个子例程,该子例程将 xyz 坐标作为输入,并进行任何必要的归一化,并返回空间填充曲线的索引。

子程序(x,y,z,空间填充索引)

与此相关的是:我读到有很多方法可以在 3D 空间中定义希尔伯特曲线,就局部性而言,哪种方法最好?如果这个问题有一个明确的答案的话……

该应用程序将对笛卡尔计算网格中的单元进行重新排序,目的是在单元访问其邻居单元时增加缓存命中率。

3d hilbert-curve space-filling-curve

2
推荐指数
1
解决办法
1869
查看次数