Win + Linux ABAQUS UMAT / DEBUG

分享一下在Windows以及Linux上的ABAQUS UMAT開發(fā)及調(diào)試的一點點心得。
1 平臺及版本:
Win 10 + Vs 2022 + Intel Fortran 2022 + ABAQUS 2019
Ubuntu 18 + GCC 7.5 + ABAQUS 2019
2 UMAT語法及平臺特性:
Fortran:
subroutine umat(stress,statev,ddsdde,sse,spd,scd,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ?rpl,ddsddt,drplde,drpldt,?stran,dstran,time,
? ? ? ? ? ? ? ? ? ? ? ? ? ?dtime,temp,dtemp,predef,dpred,cmname,
? ? ? ? ? ? ? ? ? ? ? ? ? ?ndi,nshr,ntens,nstatv,props,nprops,coords,drot,pnewdt,
? ? ? ? ? ? ? ? ? ? ? ? ? ?celent,dfgrd0,dfgrd1,noel,npt,layer,kspt,kstep,kinc)
C++:
extern "C"?
void umat_(double *stress, double *statev, double *ddsdde, double *sse, double *spd,
? ? ? ? ? ? ? ? ? ?double *scd, double *rpl, double *ddsddt, double *drplde, double *drpldt,
? ? ? ? ? ? ? ? ? ?double *stran, double *dstran, double *time, double *dtime, double *temp,
? ? ? ? ? ? ? ? ? ?double *dtemp, double *predef, double *dpred, char *cmname, int *ndi,
? ? ? ? ? ? ? ? ? ?int *nshr, int *ntens, int *nstatv, double *props, int *nprops,?
? ? ? ? ? ? ? ? ? ?double *coords, double *drot, double *pnewdt, double *celent, double *dfgrd0,?
? ? ? ? ? ? ? ? ? ?double *dfgrd1, int *noel, int *npt, int *layer, int *kspt,?
? ? ? ? ? ? ? ? ? ?int *kstep, int *kinc)

無論在Fotran還是C++,umat各個參數(shù)以指針形式讀寫。
需要注意的是,考慮到c++的mangling技術(shù)的使用,在某些系統(tǒng)中,UMAT的大小寫以及symbol可能不同。
以Ubuntu18為例,UMAT實際的名字為umat_。
若要甄別umat在編譯后的symbol名字,建議使用如下操作:
對一個簡單的fortran umat文件進(jìn)行編譯:
gfortran -c test.o umat_example.for
導(dǎo)出symbol :
nm test.o > symbol.log
從而準(zhǔn)確獲取umat的symbol。
注:C++版本umat也可應(yīng)用于Windows系統(tǒng)。
3?UMAT編譯及其鏈接:
對于給定的umat.f, umat.for或者umat.cpp,abaqus分兩步對其操作。
第一步編譯:將源碼編譯為obj或者o文件。

第二部鏈接:將obj或者o文件與ABAQUS內(nèi)置動態(tài)鏈接庫鏈接,形成stadardU.dll

在abaqus實際運算階段,standard.exe將鏈接到新生成的standardU.dll,以此來完成最終操作。

如上編譯+鏈接的邏輯,允許我們可以寫多種語言版本的umat。
若選擇c++版本,則可手動利用msvc-cl/clang/GCC完成對cpp文件的編譯,僅在鏈接階段提供給ABAQUS。
若選擇fortran版本,則可直接提供.for源代碼,將編譯和鏈接都交給ABAQUS來完成。
4?UMAT Debug:
雖然PRINT大法直觀且易于實現(xiàn),但某些時候可能需要更為細(xì)致的debug。
Windows上可以利用VS + Intel Fortran完成調(diào)試,
Linux上可利用gdb調(diào)試,不過此部分內(nèi)容尚未測試,可能會在稍后開展。
本此測試選取較新的vs 2022 以及oneapi 2022對abaqus 2019進(jìn)行debug。
關(guān)于版本的選取,尚無更多建議,但是提醒大家較老的vs可能存在debug symbol未加載的情況。
Release vs Debug
Release與Debug相對,為代碼編譯及鏈接的狀態(tài)描述。
若代碼為Release模式,則代碼內(nèi)部無調(diào)試信息,且代碼的執(zhí)行經(jīng)過編譯器優(yōu)化。
若代碼為Debug模式,在代碼編譯及鏈接過程中,編譯器會額外加入調(diào)試信息,允許用戶以多種形式對代碼進(jìn)行測試,包括但不限于,查看變量取值,查看段錯誤等。
在編譯階段:intel fortran編譯器 ifort 允許用戶輸入 /Zi 和 /debug來啟用debug調(diào)試。
/Zi: 允許調(diào)試信息與代碼單獨存在,調(diào)試信息文件可能為vc xx.pdb形式,xx為數(shù)字編號,屈居于vs版本。
/debug: 允許編譯器額外增加調(diào)試信息。
在鏈接階段:microsfot 鏈接器 link 允許用戶輸入 /debug 來啟用debug調(diào)試。
ABAQUS的編譯及鏈接:
ABAQUS的編譯與鏈接配置,路徑為:
C:\Program Files\Dassault Systemes\SimulationServices\V6R2019x\win_b64\SMA\site
文件名為win86_64.env (windows)?或者 lnx86_64.env (linux)。

用戶可將該配置拷貝至當(dāng)前工作目錄下的 abaqus_v6.env用于覆蓋原設(shè)置。
5?UMAT VS Debug:
假設(shè)用戶有如下inp文件以及umat:

若要開始DEBUG,可能需要在umat.for適當(dāng)位置加入, read(*,*)variables
通過IO讀寫,來阻塞umat以及standard.exe,便于vs attach到對應(yīng)進(jìn)程。
在開始菜單打開intel oneapi內(nèi)置的 intel oneapi prompt x64 (這是一個配置好的命令行)
切換到當(dāng)前工作路徑,并執(zhí)行如下操作
abaqus job=model user=umat.for verbose=3 int
verbose=3?為了最大化顯示abaqus操作記錄,便于正確分析是否umat已被編譯。
int 為了使得命令行可與abaqus進(jìn)行io通信,利用阻塞來開始abaqus debug。
圖6中那個 block 字樣是我自己寫的,你們可以替換為任意字樣。
若standard.exe發(fā)生阻塞

此時利用vs打開umat.for,準(zhǔn)備attach到進(jìn)程


當(dāng)attach成功后,在umat.for合理位置打入斷點。
在intel prompt中隨意輸入一個數(shù)字,取消阻塞。
在 step into/step over按鈕中,開始你的debug歷程吧。

例子中,使用了Elastic umat材料。
模量為10000,可見 locals 已經(jīng)成功捕捉到了該變量。
6?小結(jié):
umat 在c++版本中,可能名字為 umat_
umat在win中的編譯器默認(rèn)為 ifort,鏈接器為 msvc-link
umat在linux中編譯器為 gcc/g++/gfortran,鏈接器為 ld
用戶可編寫cpp或者for文件,可任意選擇在編譯或者鏈接期,將umat傳輸給ABAQUS
DEBUG過程中,合理的IO阻塞允許VS方便的調(diào)試umat。
最后,vs ifort 以及abaqus版本之間的適配:
對于 abaqus 2017 及以后的版本,不推薦使用 vs 2013?及以前的版本。
謝絕任何方式的轉(zhuǎn)載,謝謝!
能力所限,可能文中會存在錯誤和不當(dāng)之處,敬請包涵!
請多多提出指正、疑問或者建議,非常感謝!