我正在使用Fortran(Intel Composer(2011.1.107))为ANSYS14.5.7编写用户子例程 我编辑了代码,将一些数据写入外部顺序文件,并将它们读取到数组中进行计算,如下所示:
c Writes the array elements into the relevent elementID file and Integration point
Do ElementNo=1,MaxEleNo
c 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属性的静态数组运行时,代码没有问题。但是,在我的计算中保存所有数据并不足够。 有人可以帮我找到可能的问题。
答案 0 :(得分:3)
低单位数通常保留用于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)' ) 10000
end program
输出结果为:
Element_ 1
Element_ 10
Element_ 100
Element_1000
Element_****
这会导致包含空格的文件名。这可能会导致错误!您可以做的是使用'( "Element_", I4.4)'
更改格式说明符以使用固定长度,这将为您提供:
Element_0001
Element_0010
Element_0100
Element_1000
Element_****
您可以看到四位数字仍然太小而无法容纳较大的元素,但不再有空格。
最后,如果您希望数字在斜线之后直接开始而没有前导零,则可以使用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)') filename
end program
结果
Element_1
Element_10
Element_100