2013-10-09 33 views
1

我正在爲ANSYS14.5.7寫一個使用Fortran(Intel Composer(2011.1.107))的用戶子程序我編輯了一些代碼,將一些數據寫入外部順序文件並將它們讀取到一個數組中用於計算如下:在linux下爲ansys分段錯誤

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 

但與代碼沒有問題,當我在運行一個靜態數組保存屬性子程序。但是,在我的計算中保存所有數據並不足夠。 有人可以幫助我找到可能的問題。

+0

哪條線在你的代碼完全對應於'817行'? –

+0

關於靜態數組的一點是沒有意義的,因爲你沒有顯示任何聲明/分配..需要更多的上下文。 – agentp

+0

HPC ==高性能計算? ==平行?如果這需要線程安全這是一個完整的其他問題,你需要澄清.. – agentp

回答

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 
+0

其實我沒有理由可以看到每個文件使用不同的單位數字,因爲你一次只有一個文件打開使用相同的號碼。 Ansys文檔應該告訴你什麼數字是允許的。不知道這是否會導致賽格故障,但我會修正它。 – agentp