1

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

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

4

1 回答 1

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_****

这导致一个包含空格的文件名。这可能会导致错误!您可以做的是通过 using 更改格式说明符以使用固定长度'( "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  
于 2013-10-09T06:37:56.217 回答