Abaqus 中利用 Fortran Module 在不同子程序間傳遞參數

士盟科技-部落格圖片

在 Abaqus 二次開發中,常需在同一模型內同時使用多個 Fortran 子程序。本文示範如何利用 Fortran Module,實現 UMAT 與 DLOAD 之間共用彈性模數參數,包含完整程式碼架構與基本說明,方便工程師直接重現與延伸至其他子程序組合。

為何需要在子程序間傳遞參數

在 Abaqus 中,可透過多種 Fortran 子程序實作材料本構、荷載、邊界條件與單元技術等功能,例如 DLOAD、DFLUX、DISP、MPC、UMAT 與 UEL 等。同一模型若同時需要多個子程序,Abaqus 一般只允許提交一個 Fortran 原始碼檔,因此必須在同一檔案中整合多個子程序,並在必要時建立彼此間的參數傳遞機制。

通常 UMAT(材料本構)與 DLOAD(荷載定義)在同一模型中可以獨立運作,互不影響。但若實務需求要求荷載必須依材料參數或計算結果變動,就需要讓這兩個子程序之間建立明確的資料共享關係。

本文示例設定如下情境:
UMAT 的輸入參數彈性模數為 E,DLOAD 需在模型上施加一個壓力荷載,其數值與 E 完全相同。這個例子本身不一定必須使用子程序才能完成,但非常適合作為說明「如何在 UMAT 與 DLOAD 之間傳遞參數」的教學案例。

使用 Fortran Module 的設計概念

在 Fortran 中,若要在不同子程序之間共享變數,常見作法包括 Common 區塊與 Module。本文僅介紹 Module 的方式;實際上,現代 Fortran 更倡導使用 Module 來封裝變數、常數、型別與過程,同一 Module 在多個子程序中使用時,當中的變數可以在這些子程序間共享。

因此,本例採用一個 Module 來承載 UMAT 與 DLOAD 之間要共享的變數。

具體做法是:
在 Module 中定義一個實數變數 force1,UMAT 將材料彈性模數 E 指定給 force1,而 DLOAD 則將要施加的壓力荷載 F 設為 force1,即等於 E。

Abaqus - Fortran Module 本文圖像版權歸原作者所有,本圖僅用於技術說明與資訊分享。

範例程式碼與關鍵參數說明

以下為依示例邏輯重現 UMAT 與 DLOAD 之間參數共享的主要步驟,實際模型與檔案可由原文作者提供的下載連結取得。[資料來源]

1. 建立 Fortran Module

● 在 Fortran 檔案開頭定義一個 Module,例如 module mod_a,於其中宣告欲共享之變數,例如 real(8):: force1,並以 end module mod_a 結束。

2. 在 UMAT 中引用 Module 並寫入共享變數

● 定義 UMAT 子程序,包含 STRESS、STATEV、DDSDDE、PROPS 等標準引數,並引入 INCLUDE 'ABA_PARAM.INC'。

● 在 UMAT 內先使用 use mod_a 匯入Module,以便讀寫 Module 中的變數 force1。

● 將材料彈性模數 EMOD=PROPS(1) 讀出,並指定 force1=EMOD,將該值寫入共享變數。

● 其餘程式碼依線彈性材料邏輯,建立彈性矩陣 DDSDDE 並計算 STRESS,示例中採用 NDI、NTENS、ENU 等標準參數與迴圈結構。

3. 在 DLOAD 中引用 Module 並讀取共享變數

● 定義 DLOAD 子程序,包括 F、KSTEP、KINC、TIME、COORDS 等標準引數,同樣引入 INCLUDE 'ABA_PARAM.INC'

● 在 DLOAD 內部,同樣使用 USE mod_a 來存取 force1。

● 直接設定 F=force1,令施加之壓力荷載大小,等同於先前在 UMAT 中寫入的將 UMAT、 EMOD 值,因此完成了「由 UMAT 將 E 傳遞給 DLOAD」的需求。

4. DLOAD 與 Module 整合於同一 Fortran 檔

● 確保 Module、UMAT、DLOAD 均位於同一 Fortran 原始檔(例如 a.f),並在 Abaqus 分析提交時,指定此檔案作為子程序來源。

5. 建立 Abaqus 模型並指定子程序

● 在 Abaqus 模型中,使用 UMAT 定義材料本構,並在荷載定義中指定使用 DLOAD 子程序。

● 以相同的材料參數(包含 PROPS(1)=E )及分析設定,分別比較「使用上述子程序」與「不透過子程序、直接以相同值定義壓力」之結果。

6. 驗證結果一致性

● 示範中兩種方式的計算結果完全一致,可視為 Module 參數傳遞方式的驗證案例。

● 實務應用時,建議針對自有模型執行類似對照,以確認自行擴充之邏輯正確性。

實務應用要點與建議

從這個範例,可以歸納出幾個在Abaqus二次開發上,具有參考價值的實務重點:

● 當同一模型中需要多個不同類型子程序組合,且它們之間存在參數或邏輯關聯時,可以考慮將共用資訊集中定義在 Fortran Module 中,讓各子程序透過「use」關鍵字讀寫同一組變數,而不必在各子程序中重複計算或手動同步。

● Module 形式相較 Common 區塊更符合現代 Fortran 的設計建議,也較有利於後續維護與擴充。

● 文中示例已透過「有無子程序傳遞」結果對比,證明此方法在範例模型中可行,實務上若要套用至其他更複雜的模型與專案,仍建議先以簡化模型進行驗證後,再整合進正式分析流程。

● 本文僅示範寫入固定的 EMOD,對時間或步驟相關量的實作並無說明;因此在多步驟或隨時間更新的分析中,建議自行結合 TIME、KSTEP、KINC、STATEV 等機制設計更新流程,並透過測試驗證實際可行性。

資料來源:
 Abaqus中任意两个Fortran 子程序之间的参数传递-附源码与模型|微信公眾號

關鍵字 : Fortran Module、二次開發、彈性模數、材料本構