範例程式碼與關鍵參數說明
以下為依示例邏輯重現 UMAT 與 DLOAD 之間參數共享的主要步驟,實際模型與檔案可由原文作者提供的下載連結取得。[資料來源]
- 建立 Fortran Module
• 在 Fortran 檔案開頭定義一個 Module,例如 module mod_a,於其中宣告欲共享之變數,例如 real(8):: force1,並以 end module mod_a 結束。
- 在 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 等標準參數與迴圈結構。
- 在 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」的需求。
• D 均位於同一 Fortran 原始檔(例如 a.f),並在 Abaqus 分析提交時,指定此檔案作為子程序來源。
- DLOAD 與 Module 整合於同一 Fortran 檔
• 確保 Module、UMAT、DLOAD 均位於同一 Fortran 原始檔(例如 a.f),並在 Abaqus 分析提交時,指定此檔案作為子程序來源。
- 建立 Abaqus 模型並指定子程序
• 在 Abaqus 模型中,使用 UMAT 定義材料本構,並在荷載定義中指定使用 DLOAD 子程序。
• 以相同的材料參數(包含 PROPS(1)=E )及分析設定,分別比較「使用上述子程序」與「不透過子程序、直接以相同值定義壓力」之結果。
- 驗證結果一致性
• 示範中兩種方式的計算結果完全一致,可視為 Module 參數傳遞方式的驗證案例。
• 實務應用時,建議針對自有模型執行類似對照,以確認自行擴充之邏輯正確性。
實務應用要點與建議
從這個範例,可以歸納出幾個在Abaqus二次開發上,具有參考價值的實務重點:
• 當同一模型中需要多個不同類型子程序組合,且它們之間存在參數或邏輯關聯時,可以考慮將共用資訊集中定義在 Fortran Module 中,讓各子程序透過「use」關鍵字讀寫同一組變數,而不必在各子程序中重複計算或手動同步。
• Module 形式相較 Common 區塊更符合現代 Fortran 的設計建議,也較有利於後續維護與擴充。
• 文中示例已透過「有無子程序傳遞」結果對比,證明此方法在範例模型中可行,實務上若要套用至其他更複雜的模型與專案,仍建議先以簡化模型進行驗證後,再整合進正式分析流程。
• 本文僅示範寫入固定的 EMOD,對時間或步驟相關量的實作並無說明;因此在多步驟或隨時間更新的分析中,建議自行結合 TIME、KSTEP、KINC、STATEV 等機制設計更新流程,並透過測試驗證實際可行性。
需要更進階的 Subroutine 協助?
從 Abaqus 使用者子程序 (User Subroutine) 到客製化介面開發,士盟科技協助企業將特殊的工程 Know-how 轉化為標準化工具。請點擊查看「二次開發」瞭解更多。
資料來源:Abaqus中任意两个Fortran 子程序之间的参数传递-附源码与模型|微信公眾號
關鍵字 : Fortran Module、二次開發、彈性模數、材料本構