このユーザーサブルーチンを使用すると独自の非線形方程式(多点拘束、MPC とも呼ばれます)を挿入することができます。ドライバールーチンは「nonlinmpc.f」です。方程式の新しい型に対してユーザーは FUN といった名前を定義することができます(最大80文字)。一貫性を保つためにユーザーサブルーチンは umpc_fun という名前で、「umpc_fun.f」に保存する必要があります。ファイル「nonlinmpc.f」内では以下の行
elseif(labmpc(ii)(1:4).eq.'USER') then call umpc_user(aux,aux(3*maxlenmpc+1),const, & aux(6*maxlenmpc+1),iaux,n,fmpc(ii),iit,idiscon)
を2重に定義し USER を FUN で置き換える必要があります。
非線形方程式は変位のみに対する関数であると仮定されています。従って一般的には以下の様に書き下せます。
f(u1, u2, u3,...., un) = 0 | (359) |
ここで ui は節点 ni の方向 li での変位を表します。非線形方程式はそれらを線形に近似して反復勝利を行なうことで解かれます。この線形化はユーザーによってサブルーチン内で提供される必要があります。今、中間解 を得たとしましょう。この時、上記の方程式は以下の様に線形近似できます。
(360) |
詳細については[18]を参照してください。ユーザー定義方程式を使用する場合にはその名前をキーワード *MPC の下の行で指定し、MPC の対象となる全節点のリストをその後ろに続ける必要があります。この節点リストは以下の umpc_user ルーチンのヘッダーと入出力変数の指定に従ってユーザーサブルーチンに渡されます。
subroutine umpc_user(x,u,f,a,jdof,n,force,iit,idiscon) ! ! ユーザー MPC の係数の更新 ! ! 入力: ! ! x(3,n) ユーザー MPC の節点の直交座標 ! u(3,n) ユーザー MPC の節点の実際の変位 ! jdof MPC 項の実際の自由度 ! n ユーザー MPC の項の数 ! force MPC 荷重の実際の値 ! iit イテレーション番号 ! ! 出力: ! ! f MPC の実際の値。MPC が完全に満足されている場合にはこの値はゼロ ! a(n) 線形化された MPC の係数 ! jdof MPC の項の補正された自由度 ! idiscon 0: 不連続点無し ! 1: 不連続 ! 不連続点が生成される場合は新しいインクリメントの開始時に先の結果は外挿されない !
サブルーチンは f () の値、線形化 () の係数、対象となる自由度を返します。
パラメーター idiscon を使用すると不連続点を置き換えるかどうかを指定できます。これは通常は MPC の自由度が前回の呼び出しから変わっていることを意味します。この例としてはギャップ MPC があげられます。インクリメント内で不連続点が生じると、そのインクリメントでの結果(変位...)に対しては次のインクリメントでの初期値を設定するための外挿が行なわれません。
例は次の通りです。