gpt4 book ai didi

linux - linux for ansys 中的段错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:55:50 24 4
gpt4 key购买 nike

我正在使用 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

但是当我在子例程中使用带有保存属性的静态数组运行时,代码没有问题。但这不足以容纳我计算中的所有数据。谁能帮我找出问题所在。

最佳答案

低单元号通常保留给“特殊单元”,如 STDOUTSTDERRSTDIN。不要使用这些(除非你知道你在做什么),否则可能会发生意想不到的事情。我稍微知道单元数有一些上限,但目前找不到引用。

因此,解决问题的最简单方法是向单元添加偏移量(这同样会导致大型数组出现问题),或者如果编译器支持,则使用 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

关于linux - linux for ansys 中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19263154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com