forrtl: severe (27): too many records in I/O statement, unit -5, file Internal Formatted Write

在运行mpirun时遇到'forrtl: severe (27): too many records in I/O statement, unit -5, file Internal Formatted Write'错误。错误与AMG迭代求解器和内核数量相关。建议尝试使用AMG-MF迭代求解器或禁用超线程,或者切换到稀疏求解器来解决问题。" 110841359,10294400,MATLAB绘制带有置信区间的折线图教程,"['MATLAB编程', '图形绘制', '统计图表']

参考:

https://stackoverflow.com/questions/31360099/unclear-cause-of-too-many-records-in-i-o-statement-error

https://knowledge.autodesk.com/support/simulation-mechanical/troubleshooting/caas/sfdcarticles/sfdcarticles/Forrtl-severe-27-too-many-records-in-I-O-statement-unit-5-file-Internal-Formatted-Write.html

 

[theo@localhost run7(nws=20_nonc)(2)]$ mpirun -np 2 ./padcirc
 INFO: Searching for ADCIRC subdomain directories:
 INFO: Looking for './PE0000/fort.14' ...
 INFO: File './PE0000/fort.14' was found!
 INFO: The search for the subdomain directory was completed successfully.
 INFO: The ROOTDIR is  '.'.
 INFO: The INPUTDIR is './PE0000'.
 INFO: The GBLINPUTDIR is '.'.
 INFO: The GLOBALDIR is '.'.
 INFO: The LOCALDIR is './PE0000'.
forrtl: severe (27): too many records in I/O statement, unit -5, file Internal Formatted Write

 

Primary job  terminated normally, but 1 process returned
a non-zero exit code. Per user-direction, the job has been aborted.
--------------------------------------------------------------------------
--------------------------------------------------------------------------
mpirun detected that one or more processes exited with non-zero status, thus causing
the job to be terminated. The first process to do so was:

  Process name: [[30302,1],0]
  Exit code:    27

 

 

[theo @ localhost run7(nws = 20_nonc)(2)] $ mpirun -np 2 ./padcirc
信息:搜索ADCIRC子域目录:
INFO:寻找'./PE0000/fort.14'...
信息:找到文件“ ./PE0000/fort.14”!
信息:搜索子域目录已成功完成。
信息:ROOTDIR为“。”。
信息:INPUTDIR是'./PE0000'。
信息:GBLINPUTDIR为“。”。
信息:GLOBALDIR为“。”。
信息:LOCALDIR是'./PE0000'。
forrtl:严重(27):I / O语句,单位-5,文件内部格式写的记录过多
Image PC常规线源

 

主作业正常终止,但是返回了1个进程
非零退出代码。 按照用户方向,作业已中止。
-------------------------------------------------- ------------------------
-------------------------------------------------- ------------------------
mpirun检测到一个或多个进程以非零状态退出,从而导致
要终止的工作。 这样做的第一个过程是:

   流程名称:[[30302,1],0]
   退出代码:27

 

 

解:

由于原因与AMG迭代求解器和内核数有关,因此有多种解决方案。

  1. 如果可用,请使用AMG-MF迭代求解器。“分析参数->解法->解算器类型->迭代(AMG-MF)”
  2. 如果计算机的内核数少于33,但是超线程导致计算机的内核数超过32,请禁用超线程。(这需要重新启动计算机并更改BIOS设置。)
  3. 使用稀疏求解器。“分析参数->解法->解算器类型->稀疏”

 

<think>我们正在处理一个Fortran运行时错误:错误59,即列表导向I/O语法错误,发生在unit 15上。 根据错误信息,我们可以推断问题出现在读取或写入操作中,具体是使用列表导向输入/输出(list-directed I/O)时,数据格式与程序期望的格式不匹配。 列表导向I/O使用`*`作为格式说明符,例如:`read(unit=15, *) var1, var2`。这种I/O方式根据变量的类型和顺序读取数据,但要求输入数据符合一定的语法规则。 常见错误原因: 1. 输入数据中的值数量与读取语句中的变量数量不匹配(过多或过少)。 2. 输入数据中的某个值无法转换为对应变量的类型(例如,将非数字字符串读入整数变量)。 3. 输入数据中的分隔符使用不正确。列表导向I/O允许使用空格、逗号或换行作为分隔符,但需要注意: - 字符串中的空格或逗号可能引起混淆(此时应使用带分隔符的输入或指定格式)。 - 缺失值(连续两个逗号)可能不被支持,或者需要特殊处理(取决于Fortran编译器)。 4. 输入行结束(换行)过早,而程序还在读取数据。 解决方法: 1. 检查输入文件的内容,确保每一行(或每个记录)的数据与读取语句中的变量匹配。 2. 检查输入文件是否有非法字符,特别是非数值字符出现在数值变量中。 3. 如果输入文件是程序生成的,检查写入操作是否正确,确保使用了正确的分隔符。 4. 在读取语句之前添加`ERR=`或`IOSTAT=`选项来捕获错误,并打印详细信息。 例如,使用`IOSTAT`和`IOMSG`: ```fortran integer :: ierr character(len=100) :: msg read(15, *, iostat=ierr, iomsg=msg) var1, var2, var3 if (ierr /= 0) then print*, "Read failed: ", trim(msg) ! 处理错误 end if ``` 5. 如果输入文件包含字符串且字符串中可能包含空格,考虑使用带格式的读取(formatted I/O)而不是列表导向读取。 由于错误发生在unit 15,我们需要确认该单元号对应的文件是否正确打开,以及文件指针的位置。 步骤: 1. 检查打开文件时是否指定了正确的状态(status)和访问方式(access)。 2. 确保文件没有被意外截断或损坏。 3. 使用调试工具或添加打印语句,确定读取的位置。 另外,注意Fortran中列表导向输入的特殊规则: - 输入记录(行)中的空值(两个连续逗号)可能表示跳过该值(但有些编译器可能不允许在数值变量中出现空值)。 - 斜杠(/)表示输入结束,剩余变量保持不变。 因此,请检查输入文件中是否有额外的逗号、缺失的数据或斜杠。 如果问题仍然存在,请提供具体的读取语句和输入文件片段(如果可能),以便更精确地定位问题。 由于用户没有提供具体的代码和输入文件,我们只能给出一般性建议。 根据引用[1],虽然它主要讨论性能,但我们可以注意到不同编译器可能有不同的行为,因此错误可能是特定于编译器的。建议检查编译器文档中关于列表导向I/O的具体规则。 引用[2]提到了一些调试工具(如clad),但Fortran的调试通常使用其他工具(如gdb或编译器自带调试器)。不过,我们可以通过添加详细的错误处理代码来定位问题。 因此,总结解决方案: 1. 检查输入文件内容,确保与读取语句匹配。 2. 在读取语句中添加错误处理(iostat和iomsg)。 3. 考虑使用显式格式(formatted)读取代替列表导向读取。 4. 检查编译器文档,了解列表导向I/O的具体规则。 如果用户能提供更多信息,可以进一步分析。 相关问题: §§相关问题§§ 1. Fortran中列表导向I/O和格式I/O有什么区别? 2. 如何调试Fortran的I/O错误? 3. 不同Fortran编译器在列表导向I/O处理上有哪些差异?</think>### Fortran运行时错误59:列表导向I/O语法错误分析及解决 该错误发生在文件操作(unit 15)时,表示程序在解析**列表导向输入/输出**(list-directed I/O)时遇到语法问题。列表导向I/O使用`*`作为格式说明符(如 `READ(unit=15, *)`),依赖数据本身的格式而非显式格式说明符[^1]。 #### 常见原因及解决方案: 1. **数据类型不匹配** - 问题:尝试将非数字字符读入数值变量(如 `"abc"` 读入 `INTEGER`) - 解决:检查输入文件内容,确保数值字段不含字母或特殊符号 2. **分隔符错误** - 问题:输入记录中缺少必要的分隔符(空格/逗号) - 示例错误数据:`1.23.45`(两个小数点)或 `10,20,30`(含非法逗号) - 解决:确保数值间用空格分隔:`1.23 4.5` 3. **字符串未加引号** - 问题:含空格的字符串未用引号包裹 - 示例错误数据:`Tokyo Japan`(应改为 `"Tokyo Japan"`) - 解决:为含空格/特殊字符的字符串添加引号 4. **记录长度不匹配** - 问题:输入数据项数量与READ语句变量数不一致 - 示例:`READ(15,*) a, b, c` 但输入只有两个值 - 解决:检查输入文件每行数据项数量 5. **文件结束过早** - 问题:程序尝试读取超过文件末尾的数据 - 解决:添加文件结束检查: ```fortran READ(15, *, IOSTAT=io_stat) var IF (io_stat < 0) EXIT ! 检测文件结束 ``` #### 调试步骤: 1. **检查错误位置** ```fortran CHARACTER(100) :: err_msg READ(15, *, IOSTAT=stat, IOMSG=err_msg) data IF (stat /= 0) PRINT*, "错误:", TRIM(err_msg) ``` 输出具体错误描述(如无效实数、缺失分隔符等)[^2] 2. **验证输入文件** - 用文本编辑器检查unit 15对应的文件 - 特别注意: - 数值中的双小数点(`3.14.15`) - 缺失分隔符(`100200`) - 未转义字符串(`New York` → 应改为 `"New York"`) 3. **编译器差异处理** - 某些编译器(如Intel Fortran)对空值(连续逗号)更敏感 - 可尝试显式格式替代列表导向: ```fortran ! 替代 READ(15, *) a, b READ(15, '(F8.2, I4)') a, b ! 显式指定格式 ``` > **预防建议**:在关键I/O操作中添加`ERR=label`跳转处理,避免程序崩溃: > ```fortran > READ(15, *, ERR=100) data > ... > 100 PRINT*, "I/O错误发生在第", __LINE__, "行" > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值