打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Linux for ansys中的分段错误

我正在使用Fortran(Intel Composer(2011.1.107))编写用于ANSYS14.5.7的usersubroutine
我已经编辑了代码,将一些数据写入外部顺序文件,并将它们读入数组以进行计算,如下所示:

c Writes the array elements into the relevent elementID file and Integration point   Do ElementNo=1,MaxEleNoc writes the file name for the relevent element   write (filename1, '( "Element_", I4)' )  ElementNo c opens the relevent file for the element data     OPEN(unit=ElementNo,status='unknown',ACCESS='APPEND' & ,file=filename1)       Write(ElementNo,fmt='(*(D))')(sthistory(ElementNo,:))   close (ElementNo)  end do  sthistory=ZERO  else  endif

运行此命令时,我从HPC系统收到此错误:

Lyra: Ansys (v14.5.7) loaded.Lyra: Intel Composer (2011.1.107) module loaded./pkg/suse11/ansys/v145/ansys/bin/ansys145: line 817: 50102 Segmentation fault           /pkg/suse11/ansys/v145/ansys/bin/linx64/ansys.e145 -np 4

但是,当我在子例程中使用带有save属性的静态数组运行时,代码没有问题.但这不足以将所有数据保存在我的计算中.
有人可以帮我找到可能的问题吗?

解决方法:

低单元号通常保留给“特殊单元”,例如STDOUT,STDERR,STDIN.不要使用这些(除非您知道自己在做什么),否则可能会发生意外情况.我有点意识到单位编号有一些上限,但是目前找不到参考.

因此,解决问题的最简单方法是在单元上添加偏移量(这又会导致大型数组出现问题),或者如果编译器支持,则使用newunit =.
但是,由于您在循环主体的末尾关闭了文件,因此不使用像1234这样的固定数字吗?

但是您的代码还有更多问题:该行

write (filename1, '( "Element_", I4)' )  ElementNo

将导致问题(对于大多数编译器).

考虑以下简单程序:

program test  write (*, '( "Element_", I4)' )  1  write (*, '( "Element_", I4)' )  10  write (*, '( "Element_", I4)' )  100  write (*, '( "Element_", I4)' )  1000  write (*, '( "Element_", I4)' )  10000end program

输出为:

Element_   1Element_  10Element_ 100Element_1000Element_****

导致文件名包含空格.这可能会导致错误!您可以做的是通过使用'((“ Element_”,I4.4)’将格式说明符更改为固定长度,这将为您提供:

Element_0001Element_0010Element_0100Element_1000Element_****

您会看到四位数仍然太小而无法容纳较大的元素,但不再有空格.

最后,如果您希望数字直接在斜杠后开始而没有前导零,则可以使用adjustl()和trim()的组合:

program test  character(len=32)  :: filename  write (filename, '(I4)')  1  filename = "Element_" // adjustl(trim(filename))  write(*,'(a)') filename  write (filename, '(I4)')  10  filename = "Element_" // adjustl(trim(filename))  write(*,'(a)') filename  write (filename, '(I4)')  100  filename = "Element_" // adjustl(trim(filename))  write(*,'(a)') filenameend program

结果是

Element_1                       Element_10                      Element_100  
来源:https://www.icode9.com/content-3-505551.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
如何用Fortran批量生成文件 - Fortran - 数据库与编程 - 百思论坛
C# 导出CSV
DNA测序峰图转化成Phred格式 | Public Library of Bioinformatics
I have a Stata, I have a Python之二——pdf转word
在struts中使用logic标签详细说明(2)
C#关于数组Console.Write("{0,4:d}",c[i,j]);是什么意思
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服