ARYSUB

Modelingユーザー定義の入力配列要素の値を計算します。

使用

<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
[整数]
PAR配列のエントリの数。
DFLAG
[論理]
MotionSolveで偏導関数が必要な場合にtrueに設定されるブール変数。それ以外の場合はfalseに設定されます。
IFLAG
[論理]
MotionSolveARYSUBが依存する関数を知る必要がある場合にtrueに設定されるブール変数。このフラグがfalseに設定されている場合は、ユーザー定義の式の値が計算されます。
NVALUES
ユーザー定義のReference_Arrayに含まれる値の数。

出力

VALUES
[倍精度]
ユーザー定義のReference_Arrayの値を含む出力配列。

この例では、ARYSUBを使用して、次の数学的法則に従う6つの状態依存数量を計算する方法を示します。

A = F ( X ) C V B = K t Y C t ω MathType@MTEF@5@5@+= feaagKart1ev2aqatCvAUfeBSjuyZL2yd9gzLbvyNv2CaerbwvMCKf MBHbqefqvATv2CG4uz3bIuV1wyUbqedmvETj2BSbqefm0B1jxALjhi ov2DaebbnrfifHhDYfgasaacH8qrps0lbbf9q8WrFfeuY=Hhbbf9v8 qqaqFr0xc9pk0xbba9q8WqFfea0=yr0RYxir=Jbba9q8aq0=yq=He9 q8qqQ8frFve9Fve9Ff0dmeaaceGadmWadeWabiqaceabbiqafeaakq aabeqaaiaadgeacqGH9aqpcqGHsislcaWGgbWaaeWaaeaacaWGybaa caGLOaGaayzkaaGaeyOeI0Iaam4qaiaadAfaaeaacaWGcbGaeyypa0 JaeyOeI0Iaam4samaaBaaaleaacaWG0baabeaakiaadMfacqGHsisl caWGdbWaaSbaaSqaaiaadshaaeqaaOGaeqyYdChaaaa@4B8A@

X は、全体座標系で測定された、Jマーカーの原点からIマーカーの原点までの変位ベクトルを表す3x1マトリクスです。

V は、{X}の時間導関数を表す3x1マトリクスです。

Y は、Jマーカーに対するIマーカーの小角回転を表す3x1マトリクスです。

ω 地面座標系で測定された、Jマーカーに対するIマーカーの角速度を表す3x1マトリクスです。

C , K T , C T は、PAR配列を介してARYSUBに渡される3x3対角マトリクスです。

F ( X ) は、エントリが変位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

コメント

  1. ARYSUBは、入力配列要素に対してのみ定義できます。以下に例を挙げます:type="U"が指定されたReference_Array
  2. 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"
      />