当我指定ADCIRC应该编写一个netCDF热启动文件时,它在较小的测试网格(30k节点)下可以正常工作,但在较大的网格(1M节点)上出现分段违规的情况而失败。我正在使用英特尔编译器。但是,当我使用gfortran和gcc编译器时,ADCIRC成功为两个网格写入了热启动文件。
答:这是intel fortran处理堆栈和堆上的数组的方式的问题。您应该使用以下编译器标志重新编译ADCIRC和netCDF fortran库:“ –heap-arrays 8192”,其中“ 8192”是“ ulimit -s”的输出。这将迫使intel编译器将数组创建的某些情况放在堆而不是堆栈上。您看到的导致崩溃的大型阵列(即,超过2M个元素)正在耗尽机器的堆栈空间。
必须在ADCIRC构建过程以及netCDF库的构建过程中添加此编译器标志。如果netcdf-fortran库不是使用此标志构建的,则故障仍然可能发生。这是因为在netcdf库中创建了一个隐式数组,因此我们无法单独使用ADCIRC来解决该问题,除非建议netcdf-fortran库也与该标志一起重新编译。
阵列大小可能因机器而异,也可能不会发生,具体取决于所使用的英特尔版本或netcdf的构建方式。(此外,Outlook将扩展名更改为.f90,但应为.F90)