UCOSUB

Modelingユーザー定義の拘束要素の拘束値とその導関数を計算します。通常、ユーザー定義の拘束は、さまざまなホロノミック拘束や非ホロノミック拘束を定義するため、組み合わせて使用されます。代表的な例は、ある粒子が別の粒子を追跡する、いわゆる“追跡曲線”拘束です。

使用

ユーザー拘束を計算するためにUCOSUBを呼び出すユーザー定義のサーフェス:

<Constraint_UserConstr
     id                  = "1"
     usrsub_param_string = "USER(1,31,301,1,350,302)"
     usrsub_dll_name     = "NULL">
</Constraint_UserConstr>

フォーマット

Fortranの呼出し構文
SUBROUTINE UCOSUB (ID, TIME, Q, PAR, NPAR, IDRSEL, IFLAG, SCALAR, ARRAY, XMATRX)
C/C++の呼出し構文
void STDCALL UCOSUB (int *id, double *time, double *q, double *par, int *npar, int *idrsel, int *iflag, double *scalar, double *vector, double *xmatrx)
Pythonの呼出し構文
def UCOSUB(id, time, q, par, npar, idrsel, iflag):
    return [scalar, vector, xmatrx]
MATLABの呼出し構文
function [scalar, vector, xmatrx] = UCOSUB(id, time, q, par, npar, idrsel, iflag)

属性

ID
[整数]
ユーザー定義の拘束要素識別子。
TIME
[倍精度]
現在のシミュレーション時間。
Q
[倍精度]
パートの主軸変数の倍精度値を含む配列。
PAR
[倍精度]
ユーザー定義のステートメントで提供されたリストにある定数引数を含む配列。
NPAR
[整数]
PAR配列のエントリの数。
IDRSEL
[整数]
出力のタイプを定義する制御値の整数の配列。1つ目の値はARRAY出力を、2つ目の値はSCALAR出力を、3つ目の値はMATRIX出力を制御します。
IFLAG
[論理]
初期化フラグ。

出力

ARRAY
[倍精度]
次のIDRSEL(2)に応じて、主軸変数に関する拘束の1次導関数と、時間と主軸変数に関する拘束の2次偏導関数のどちらかを含む30要素の配列。
IDRSEL(1)=0
評価なし。
IDRSEL(1)=1
scalar=
IDRSEL(1)=2
scalar=
IDRSEL(1)=3
scalar=
ここで、qは変数を、は拘束を、はすべての変数(q)が0に設定された場合の拘束を、tは時間を表します。
XMATRX
[倍精度]
主軸変数に関する拘束の2次導関数を返す30x30配列。これは、IDRSEL(3)によって次のように制御されます:
IDRSEL(1)=0
評価なし。
IDRSEL(1)=1
xmatrx(m,n)=
ここで、qは変数を、は拘束を、tは時間を表します。
UCOSUBの初期化中に、UCOVARおよび / またはUCOMARを呼び出して変数を宣言する必要があります。

def UCOSUB(id, time, q, par, npar, idrsel, iflag):
    ORIG_R0X = 11 
    ORIG_R0Y = 12
    ORIG_R0Z = 13

    DCMX_U1X = 111
    DCMX_U1Y = 112
    DCMX_U1Z = 113
    DCMX_U2X = 211
    DCMX_U2Y = 212
    DCMX_U2Z = 213
    DCMX_U3X = 311
    DCMX_U3Y = 312
    DCMX_U3Z = 313

    vector = 2*[0]
    xmatrx = 155*[0]
    if int(par[0])==5000000:
       imars = 2*[0]
       ivars = 2*[0]

       dir1_id     = int(par[1])
       marker1_id  = int(par[2])
       dir2_id     = int(par[3])
       marker2_id  = int(par[4])

       imars[0] = marker1_id
       imars[1] = marker2_id

       if dir1_id == 1:
           ivars[0] = ORIG_R0X
       elif dir1_id == 2:
           ivars[0] = ORIG_R0Y
       elif dir1_id == 3:
           ivars[0] = ORIG_R0Z

       if dir2_id == 1:
           ivars[1] = ORIG_R0X
       elif dir2_id == 2:
           ivars[1] = ORIG_R0Y
       elif dir2_id == 3:
           ivars[1] = ORIG_R0Z
       
       if iflag:
           nmar = 2;
           nvar = 2;
           py_ucomar(id, imars, ivars)
           return[0, vector, []]

       if idrsel[0] ==1:
           scalar = q[0] - q[1]
       else:
           scalar =0.0

       if idrsel[1] ==1:
           vector[0] =1.0
           vector[1] = -1.0
       else:
           vector[0] =0.0
           vector[1] =0.0
   return [scalar, vector, xmatrx]