これは非常に重要かつ強力なインターフェースで、使用すると独自の機械材料挙動を定義することができます。サブルーチン「umat.f」は駆動用サブルーチンで、モデルに存在する材料の種類に応じて「umat_user.f」といったユーザー定義ルーチンを呼び出します。新しい材料則を作成するには「umat_user.f」ルーチンを書き、ルーチン「umat.f」内で適切にそれを呼び出すようにしなければなりません。「umat.f」ではユーザー材料の名前が定義されます。名前は文字列で、キーワード・カード *MATERIAL に続く NAME パラメーターはこの文字列から始まらなければなりません。例えば FUNNY_MATERIAL という名前の新しい材料を定義した場合、その材料を使用するためには材料名はこの文字列で始まる必要があります。これはCalculiXでの定義済み材料の使用法とユーザー定義材料の使用法で大きく異なるところです。定義済み材料を使う場合には材料には自由に名前を付けられます。一方でユーザー定義材料を使う場合にはその名前は事前定義した文字列で始まらなければならないのです。材料名は最大80文字なので、一般的には FUNNY_MATERIAL1 、FUNNY_MATERIAL2 など複数バージョンの材料を定義する十分な自由度があります。
umat_user ルーチンのヘッダーと入出力変数は以下の通りです。
subroutine umat_user(amat,iel,iint,kode,elconloc,emec,emec0,
& beta,xokl,voj,xkl,vj,ithermal,t1l,dtime,time,ttime,
& icmd,ielas,mi,nstate_,xstateini,xstate,stre,stiff,
& iorien,pgauss,orab,pnewdt,ipkon)
!
! ユーザー定義の材料則の剛性、応力を計算
!
! icmd=3: 応力と気秋ひずみを計算
! それ以外: 機械ひずみに対する応力と剛性行列を計算
!
! 入力:
!
! amat 材料名
! iel 要素番号
! iint 積分点番号
!
! kode 材料タイプ(-100-*USER MATERIAL下で入力された定数の数):様々な数の定数を持つ材料のために使用可能
!
! elconloc(21) キーワードカード *USER MATERIAL で定義されたユーザー定義定数(最大21、実際の数は -kode-100)、実際の温度 t1l のために内挿される
!
! emec(6) インクリメント終了時のラグランジュの機械ひずみテンソル(成分の順序:11、22、33、12、13、23)(熱ひずみは引かれている)
! emec0(6) インクリメント開始時のラグランジュの機械ひずみテンソル(熱ひずみは引かれている)
! beta(6) 残余応力テンソル(*INITIAL CONDITIONS,TYPE=STRESS 下で入力された応力)
!
! xokl(3,3) インクリメント開始時の変形勾配
! voj インクリメント開始時のヤコビアン
! xkl(3,3) インクリメント終了時の変形勾配
! vj インクリメント終了時のヤコビアン
!
! ithermal 0: 熱的効果を考慮しない
! >0: 熱的効果を考慮する(キーワード *INITIAL CONDITIONS,TYPE=TEMPERATURE で有効化)
! t1l インクリメント終了時の温度
! dtime インクリメントの時間長さ
! time 現在のインクリメント終了時のステップ時間
! ttime 現在のステップ開始時の総時間
!
! icmd 3以外: 応力と剛性を計算
! 3: 応力のみを計算
! ielas 0: 弾性イテレーション無し: 不可逆な効果を許可
! 1: 弾性イテレーション、つまり不可逆な変形を不許可
!
! mi(1) モデルの要素あたりの積分点の最大数
! nstate_ モデルの状態変数の最大数
!
! xstateini(nstate_,mi(1),要素数)
! インクリメント開始時の状態変数
! xstate(nstate_,mi(1),要素数)
! インクリメント終了時の状態変数
!
! stre(6) インクリメント開始時の第2 Piola-Kirchhoff 応力
!
! iorien 考慮している積分点でにローカル座標軸系の数(ローカル座標系が適用されていない場合0)
! pgauss(3) 積分点のグローバル座標
! orab(7,*) 全ローカル座標系の記述。
! ローカル座標系が適用されている場合、ローカルテンソルに with skl(3,3) を前からかけることでグローバルテンソルを取得できます。
! skl は call transformatrix(orab(1,iorien),pgauss,skl) としてサブルーチン transformatrix を呼び出すことで決定できます。
!
!
! 出力:
!
! xstate(nstate_,mi(1),要素数)
! インクリメント終了時の更新された状態変数
! stre(6) インクリメント終了時の第2 Piola-Kirchhoff 応力
! stiff(21): インクリメント終了時の参照材料フレームでの一致接線剛性行列。
! 言い換えると、PK2 応力をラグランジュひずむテンソルで微分したもの。
! この行列は対称で、上半分だけが完全異方弾性材料(*ELASTIC,TYPE=ANISO)と同じ順序で与えられていると仮定されます。
! 行列は4次の材料テンソルの一部であること、つまりフォークト記法は使用されていないことに注意してください。
! pnewdt ルーチン内での発散によって剛性行列および/または応力を材料ルーチンが返すことができない場合にユーザーによって指定されます。
! pnewdt は次の試行で時間インクリメントにかけられる係数で0より大きく1未満でなければなりません。
! デフォルトでは-1でこれはユーザールーチンが収束したことを意味します。
! ipkon(*) ipkon(iel) は場 kon 内の要素トポロジーの最初の節点の前の位置を指します。
! ipkon(iel) が0より小さい場合にはその要素は使用されていません。
パラメーター ielas は不可逆な効果を考慮するかどうかを表します。強制変位は最初のイテレーションで大きなひずみを生み出すことがあります。このため最初のイテレーションを完全に線形なものにする、つまり材料と形状の非線形性を無効化することで準静的計算での収束性がよくなる場合が多々あります。このパラメーター ielas はそのためのフラグです。
変換のためにさらに2つのルーチンがユーザー向けに公開されています。「str2mat.f」を使うとラグランジュひずみをオイラーひずみへ、Cauchy 応力を PK2 応力へ、あるいは Kirchhoff 応力を PK2 応力へ変換することができます。ヘッダーと簡単な説明は以下の通りです。
subroutine str2mat(str,ckl,vj,cauchy)
!
! 応力を空間座標系から材料座標系へ、あるいはひずみを材料座標系から空間座標系へ変換
!
! 入力:
!
! str(6): Cauchy 応力、Kirchhoff 応力、またはラグランジュひずみ
! 成分の順序: 11,22,33,12,13,23
! ckl(3,3): 逆変形勾配
! vj: ヤコビアン行列式
! cauchy: 論理変数
! trueの場合: str は Cauchy 応力を保持
! falseの場合: str は Kirchhoff 応力、またはラグランジュひずみを保持
!
! 出力:
!
! str(6): 第2 Piola-Kirchhoff 応力(PK2)またはオイラーひずみ
!
2つ目のルーチン「stiff2mat.f」は接線剛性行列を空間座標系から材料座標系へ変換します。
subroutine stiff2mat(elas,ckl,vj,cauchy)
!
! 空間座標系での要素の剛性行列を材料座標系での要素剛性行列へ変換
!
! 入力:
!
! elas(21): 空間座標表記での剛性定数、つまり Cauchy 応力または Kirchhoff 応力のオイラーひずみ微分
! ckl(3,3): 逆変形勾配
! vj: ヤコビアン行列式
! cauchy: 論理変数
! trueの場合: elas は Cauchy 応力で記述されている
! falseの場合: elas は Kirchhoff 応力で記述されている
!
! 出力:
!
! elas(21): 材料座標表記での剛性定数、つまり第2 Piola-Kirchhoff 応力(PK2)のラグランジュひずみ微分
!