ARYSUB
モデリングユーザー定義の入力配列要素の値を計算します。
使用
<Reference_Array
id = "30100100"
type = "U"
num_element = "6"
usrsub_param_string = "USER(502,11401020,11701100,339.3,207)"
usrsub_dll_name = "NULL"
usrsub_fnc_name = "ARYSUB"
/>
フォーマット
- Fortranの呼出し構文
-
SUBROUTINE ARYSUB (ID, TIME, PAR, NPAR, DFLAG, IFLAG, NVALUE, VALUE)
- C/C++の呼出し構文
-
void STDCALL ARYSUB (int *id, double *time, double *par, int *npar, int *dflag, int *iflag, int *nvalue, double *value)
- Pythonの呼出し構文
-
def ARYSUB(id, time, par, npar, dflag, iflag, nvalue):
- MATLABの呼出し構文
-
function value = ARYSUB(id, time, par, npar, dflag, iflag, nvalue)
属性
- ID
- [整数]
- TIME
- [倍精度]
- PAR
- [倍精度]
- NPAR
- [整数]
- DFLAG
- [論理]
- IFLAG
- [論理]
- NVALUES
- ユーザー定義のReference_Arrayに含まれる値の数。
出力
- VALUES
- [倍精度]
例
この例では、ARYSUBを使用して、次の数学的法則に従う6つの状態依存数量を計算する方法を示します。
は、全体座標系で測定された、Jマーカーの原点からIマーカーの原点までの変位ベクトルを表す3x1マトリクスです。
は、{X}の時間導関数を表す3x1マトリクスです。
は、Jマーカーに対するIマーカーの小角回転を表す3x1マトリクスです。
地面座標系で測定された、Jマーカーに対するIマーカーの角速度を表す3x1マトリクスです。
は、PAR配列を介してARYSUBに渡される3x3対角マトリクスです。
は、エントリが変位Xのスプライン関数として定義される3x1マトリクスです。
def ARYSUB(id, time, par, npar, dflag, iflag, nvalue)
# Initialize outputs first
errflg =0
value = 6*[0.0]
# Get I/J, the spline ids and [K]/[C] matrices from PAR
Ipar = []
ipar.append(int(par[1]))
ipar.append(int(par[2]))
kx_spl_id=int(par[3])
ky_spl_id=int(par[4])
kz_spl_id=int(par[5])
ktx=par[6]
kty=par[7]
ktz=par[8]
cx=par[9]
cy=par[10]
cz=par[11]
ctx=par[12]
cty=par[13]
ctz=par[14]
# Calculate AX(I,J),AY(I,J),AZ(I,J)
[ax,errflg]=py_sysfnc("ax",ipar)
[ay,errflg]=py_sysfnc("ay",ipar)
[az,errflg]=py_sysfnc("az",ipar)
#CalculateDX(I,J,J),DY(I,J,J),DZ(I,J,J)
ipar.append(int(par[2]))
[dx,errflg]=py_sysfnc("dx",ipar)
[dy,errflg]=py_sysfnc("dy",ipar)
[dz,errflg]=py_sysfnc("dz",ipar)
#CalculateWX(I,J,J),WY(I,J,J),WZ(I,J,J)
[wx,errflg]=py_sysfnc("wx",ipar)
[wy,errflg]=py_sysfnc("wy",ipar)
[wz,errflg]=py_sysfnc("wz",ipar)
#CalculateVX(I,J,J,J),VY(I,J,J,J),VZ(I,J,J,J)
ipar.append(int(par[2]))
[vx,errflg]=py_sysfnc("vx",ipar)
[vy,errflg]=py_sysfnc("vy",ipar)
[vz,errflg]=py_sysfnc("vz",ipar)
#Calculate{F(x)}
[fx,errflg]=py_akispl(-dx,0.0,kx_spl_id,0)
[fy,errflg]=py_akispl(-dy,0.0,ky_spl_id,0)
[fz,errflg]=py_akispl(-dz,0.0,kz_spl_id,0)
#{a}
value[0]=fx-cx*vx
value[1]=fy-cy*vy
value[2]=fz-cz*vz
#{b}
value[3]=-ktx*ax-ctx*wx
value[4]=-kty*ay-cty*wy
value[5]=-ktz*az-ctz*wz
return value
コメント
- ARYSUBは、入力配列要素に対してのみ定義できます。以下に例を挙げます:type="U"が指定されたReference_Array。
- ARYSUBで定義されたReference_ArrayのIDは、Control_StateEqnまたはForce_StateEqn要素ではu_array_idとして参照できます。以下に例を挙げます:
<Control_StateEqn id = "301001" type = "USERSUB" x_array_id = "30100200" y_array_id = "30100300" u_array_id = "30100100" num_state = "2" num_output = "1" is_static_hold = "FALSE" usrsub_param_string = "USER(998,0,1,-10,.1,10,0,0,1)" usrsub_dll_name = "NULL" usrsub_fnc_name = "GSESUB" usrsub_der1_name = "GSEXX" usrsub_der2_name = "GSEXU" usrsub_der3_name = "GSEYX" /> <Force_StateEqn id = "301001" type = "USERSUB" x_array_id = "535050504" y_array_id = "535050508" u_array_id = "535050505" num_state = "2" num_output = "6" usrsub_param_string = "USER(1001,100.,0.31625,0.0004,1.,5.,5,3,0.5,0.3,0.)" usrsub_dll_name = "ms_csubdll" usrsub_fnc_name = "YFOSUB" is_static_hold = "FALSE" i_marker_id = "30101020" j_floating_marker_id= "30102020" ref_marker_id = "30102020" />