首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >linux for ansys中的分割错误

linux for ansys中的分割错误
EN

Stack Overflow用户
提问于 2013-10-09 12:29:49
回答 1查看 688关注 0票数 1

我正在为ANSYS14.5.7编写一个使用Fortran (Intel Composer (2011.1.107))的用户子程序。我已经编辑了代码,以便将一些数据写入外部顺序文件,并将它们读取到一个数组中,如下所示:

代码语言:javascript
复制
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系统中得到以下错误:

代码语言:javascript
复制
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属性的静态数组运行时,代码没有问题。但这不足以在我的计算中保留所有数据。谁能帮我找出问题所在。

EN

回答 1

Stack Overflow用户

发布于 2013-10-09 14:37:56

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

因此,解决问题的最简单方法是向单元添加一个偏移量(这同样会导致大型数组的问题),或者使用newunit= (如果您的编译器支持它)。但是既然你在循环体的末尾关闭了文件,为什么不使用像1234这样的固定数字呢?

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

代码语言:javascript
复制
write (filename1, '( "Element_", I4)' )  ElementNo

会导致问题(对于大多数编译器)。

考虑下面这个简单的程序:

代码语言:javascript
复制
program test
  write (*, '( "Element_", I4)' )  1
  write (*, '( "Element_", I4)' )  10
  write (*, '( "Element_", I4)' )  100
  write (*, '( "Element_", I4)' )  1000
  write (*, '( "Element_", I4)' )  10000
end program

输出为:

代码语言:javascript
复制
Element_   1
Element_  10
Element_ 100
Element_1000
Element_****

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

代码语言:javascript
复制
Element_0001
Element_0010
Element_0100
Element_1000
Element_****

可以看到,四位数仍然太小,无法容纳较大的元素,但不再有空格。

最后,如果您希望数字直接在斜杠后面开始,而不是前导零,那么可以使用adjustl()trim()的组合

代码语言:javascript
复制
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

结果:

代码语言:javascript
复制
Element_1                       
Element_10                      
Element_100  
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19263154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档