專欄 | UEL用戶子程序開發步驟

作者介紹

snowwave02

博士,高級工程師

snowwave02團隊:設計仿真領域的軟件開發團隊,由軟件、機械、物理等專業人員組成,10年以上CAD/CAE軟件開發經驗,精通Abaqus二次開發,承接過多個航天、航空、船舶、機械等行業大型設計仿真類項目,具有豐富的實戰經驗。


概述

本系列文章研究成熟的有限元理論基礎及在商用有限元軟件的實現方式。

有限元的理論發展了幾十年已經相當成熟,商用有限元軟件同樣也是採用這些成熟的有限元理論,只是在實際應用過程中,商用CAE軟件在傳統的理論基礎上會做相應的修正以解決工程中遇到的不同問題,且各家軟件的修正方法都不一樣,每個主流商用軟件手冊中都會註明各個單元的理論採用了哪種理論公式,但都只是提一下用什麼方法修正,很多沒有具體的實現公式。

商用軟件對外就是一個黑盒子,除了開發人員,使用人員只能在黑盒子外猜測內部實現方式。

專欄 | UEL用戶子程序開發步驟

一方面我們查閱各個主流商用軟件的理論手冊並通過進行大量的資料查閱猜測內部修正方法,另一方面我們自己編程實現結構有限元求解器,通過自研求解器和商軟的結果比較來驗證我們的猜測,如同管中窺豹一般來研究的修正方法,從而猜測商用有限元軟件的內部計算方法。

我們關注CAE中的結構有限元,所以主要選擇了商用結構有限元軟件中文檔相對較完備的Abaqus來研究內部實現方式,同時對某些問題也會涉及其它的Nastran/Ansys等商軟。為了理解方便有很多問題在數學上其實並不嚴謹,同時由於水平有限可能有許多的理論錯誤,歡迎交流討論,也期待有更多的合作機會。


UEL用戶子程序開發步驟


用戶子程序主要是將用戶特定的材料本構模型和單元算法等公式編寫為計算機語言表示的公式,並實現和商軟求解器之間的交互迭代。

常用的商業有限元軟件都提供了用戶自定義子程序的功能,且一般都是Fortran語言開發,Fortran是上世紀70年代的語言,相對現代化的流行語言編寫,格式要求非常嚴格,編譯調試都比較繁瑣,使得開發效率低下,而且接口限制較多,除了商軟提供的功能外用戶基本沒法改動,靈活性較差。由於用戶子程序很多都涉及複雜的公式編寫,用戶除了需要紮實的理論基礎外,還需要較強的能將公式表達為Fortran語言的編程能力,這對非計算機專業出身的人來說往往在浪費了很多額外精力,使得很多理論高手都對用戶子程序望而卻步,難以入門。

在實際工作中,很多工程師用Matlab來編寫和推導公式,Matlab被認為是市面上最接近草稿紙上推導公式的一款軟件了,而且有限元在數值層面上的計算其實就是矩陣運算,所以Matlab這種數據按矩陣來組織非常適合用來開發有限元相關的程序。而現在市面上還沒有采用Matlab來開發商軟子程序的案例。iSolver是市面上第一款基於Matlab來開發商軟用戶子程序的軟件工具,支持用Matlab編寫和調試用戶子程序。iSolver子程序的接口完全按照Abaqus的標準實現,而Abaqus的子程序接口在近幾年內已經基本不再變化了,同樣的,雖然iSolver在不斷髮展,但iSolver子程序接口將維持不變,所有在iSolver上編寫的算法子程序都只要維護自己的算法部分就行,而不是維護整個有限元求解的整個過程。

前面第八、九篇介紹了UMAT用戶自定義材料的開發,這裡將介紹UEL用戶自定義單元的開發,本文首先簡單的討論了UEL的一般含義,並詳細的介紹了基於Fortran和Matlab兩種方式的UEL的開發步驟,對比發現開發步驟基本相同,同時採用Matlab更加高效和靈活。具體的開發過程可以參考下面我們的Step by Step的錄像,包括了整個的有限元基礎理論和我們對Abaqus中的單元理解:

深入淺出有限元:基礎理論->Abaqus操作->matlab編程

專欄 | UEL用戶子程序開發步驟

專欄 | UEL用戶子程序開發步驟


1.1 UEL的關鍵輸入輸出參數


UEL網上資料很多,大家可以很容易查看,但大部分資料都只是簡單提供UEL算例,這裡我們列出了UEL接口的關鍵輸入輸出參數,如下表所示:

專欄 | UEL用戶子程序開發步驟

專欄 | UEL用戶子程序開發步驟

專欄 | UEL用戶子程序開發步驟


1.2 基於Fortran的Abaqus的UEL的開發步驟

1.2.1 在inp文件中定義UEL


Abaqus中只能通過修改手動inp文件完成用戶UEL的定義,通常包含以下關鍵字及相應屬性,如圖所示:


專欄 | UEL用戶子程序開發步驟

專欄 | UEL用戶子程序開發步驟


*User element關鍵字,用於定義單元基本信息,包括以下屬性:

nodes為單元節點數;

type為單元類型,U表示為用戶自定義單元,1001表示單元類型編號,一般從1000開始;

properties為浮點數屬性個數,一般用於輸入單元對應的section數據和材料數據;

coordinates為座標維數;

variables為狀態量個數,一般求解計算過程中需要在迭代步之間傳遞的變量;

第二行開始定義節點激活的自由度;

*Uel property關鍵字,與*User element關鍵字中的properties對應,第二行開始定義具體的數據。

1.2.2 編寫


使用任意編輯器編寫.for文件,推薦使用Visual Studio Code,微軟開源的輕量化代碼編輯器,配置靈活高效:


專欄 | UEL用戶子程序開發步驟

專欄 | UEL用戶子程序開發步驟


1.2.3 編譯(可選)

Abaqus沒有自帶Fortran編譯器,所以用戶需要自己去安裝Fortran編譯器和Visual Studio Build Tools,並配置相應環境。具體配置過程與UMAT一致,可以查看我們關於環境配置的視頻。

在環境配置完成之後,打開命令提示框,輸入命令Abaqus make Library=XXX.for,即開始編譯,編譯過程中的警告和錯誤都會打印在命令提示框內。

1.2.4 運行

運行有兩種方法,第一種就是在命令提示框中輸入Abaqus job=XXX user=XXX.for,如下圖所示。

專欄 | UEL用戶子程序開發步驟

專欄 | UEL用戶子程序開發步驟

第二種就是在Abaqus中創建基於inp文件的任務,然後選擇對應的用戶子程序for文件,在任務管理器中提交運行,如圖所示。

專欄 | UEL用戶子程序開發步驟

專欄 | UEL用戶子程序開發步驟


至此,基於Fortran的UEL開發流程已經完成,但結果的正確性還需要更加細緻的驗證,為更方便的查找問題,建議先採用單個單元調試UEL,在確保單個單元正確後再將UEL用於實際問題。

1.2.5 調試(可選)

如果想要知道代碼的運行結果是否和預期的一致,一種笨辦法是用print打印到log文件中,高效的方法是採用斷點調試的方法進行運行中的調試。

專欄 | UEL用戶子程序開發步驟

Abaqus支持命令行調試,不過命令行反覆運行也比較繁瑣,用戶也可選擇用一鍵調試Abaqus的用戶子程序的DUS插件工具。DUS(Debug User Subroutine)是集成在ABAQUS/CAE中的一個插件,能夠一鍵啟動用戶配置的用戶子程序開發平臺(如Visual Studio 2008等),並進入對用戶定義子程序的單步調試模式。

專欄 | UEL用戶子程序開發步驟

專欄 | UEL用戶子程序開發步驟


1.3 基於Matlab的iSolver的UEL開發步驟

基於Matlab的Abaqus的UEL具體開發步驟和Abaqus類似,只不過某些步驟需要用到自研有限元求解器開發平臺iSolver。

1.3.1 在inp文件中定義UEL

與Abaqus相應的操作一致,如圖所示:

專欄 | UEL用戶子程序開發步驟

專欄 | UEL用戶子程序開發步驟


1.3.2 編寫

在Matlab中創建並編寫U1001.m的文件,放入Abaqus工作目錄下。該文件只包括一個U1001函數,接口和Abaqus的接口參數完全一致,功能也是計算應力應變關係和當前應力狀態等,相對Fortran,利用Matlab可以更容易的編寫計算公式,同時可以利用Matlab在矩陣計算中各種強大功能和算法庫。因為Abaqus的UEL接口和計算功能各個版本相對固定,這個matlab的UEL接口參數也相對固定,不會因為iSolver的版本不同而重新修改接口。

專欄 | UEL用戶子程序開發步驟


1.3.3 編譯(無)

由於matlab是腳本語言,不需要編譯。

1.3.4 調試(可選)

在Abaqus菜單欄的Plug-ins裡選擇iSolver插件的菜單。

專欄 | UEL用戶子程序開發步驟

專欄 | UEL用戶子程序開發步驟

點擊iSolver->Engine,按照下圖所示,在功能項Use Solver中選擇iSolver,在Source Type裡面選擇Matlab,勾選Debug。點擊Submit進行調試運行。

專欄 | UEL用戶子程序開發步驟

程序會自動打開matlab並加載U1001.m文件,手動打上斷點

專欄 | UEL用戶子程序開發步驟

點擊在Debug菜單下的Run U1001運行。

程序將在斷點處停止,且將鼠標移動到需要調試查看的參數上,能夠查看到對應的值。

專欄 | UEL用戶子程序開發步驟

專欄 | UEL用戶子程序開發步驟


按F10可以進行單步調試。

1.3.5 運行

在上述步驟的基礎上去掉勾選Debug選項,點擊Submit運行計算,此時將採用iSolver求解器聯合U1001.m進行求解分析,運行完畢點擊Result在Abaqus中查看結果。

1.4 算例

具體的殼理論和在iSolver中實現的UEL算例可以參考下面的視頻

深入淺出有限元:基礎理論->Abaqus操作->matlab編程

專欄 | UEL用戶子程序開發步驟


總結


本文首先簡單的討論了UEL的一般含義,並詳細的介紹了基於Fortran和Matlab兩種方式的UEL的開發步驟,對比發現開發步驟基本相同,但Matlab更加高效和靈活。同時,由於iSolver基本單元類型和Abaqus算法完全一致,可以發現同一個算例驗證兩者分析結果完全一致,從而證明基於Matlab的UEL的流程和結果的正確性。

UEL的開發一方面要有紮實的公式推導能力,另一方面需要基礎的編程能力和開發工具應用水平,後者不是重點,但往往浪費了大家很多的精力,善用工具方能提高效率,基於Fortran和Matlab兩種方式的UEL的開發步驟和開發工具如下表:

專欄 | UEL用戶子程序開發步驟


如果有任何其它疑問或者項目合作意向,也歡迎在技術鄰私信我們。


分享到:


相關文章: