CFFSUB

ModelingForce_Contact要素の摩擦力を計算するために使用します。

使用

接触の摩擦力を実装します。

<Force_Contact
     id                  = "301001"
     num_i_graphics      = "1"
     i_graphics_id       = "90000"
     num_j_graphics      = "1"
     j_graphics_id       = "90001"
     cnf_type            = "Impact"
     stiffness           = "500."
     exponent            = "1.5"     
     damping             = "0.5"
     dmax                = "0.01"     
     cff_type            = "UserCFF"
     cff_param_string    = "USER(0.05,0.01,0.1,0.5)"
     cff_fnc_name        = "CFFSUB"
     cff_dll_name        = "NULL"      
  />

フォーマット

Fortranの呼出し構文
SUBROUTINE CFFSUB (ID, TIME, PAR, NPAR, LOCI, LOCJ, X, XDOT, NFORCE, AREA, DFLAG, IFLAG, RESULTS)
C/C++の呼出し構文
void STDCALL CFFSUB (int *id, double *time, double *par, int *npar, double *loci, double *locj, double *x, double *xdot, double *nforce, int *dflag, int *iflag, double *result)
Pythonの呼出し構文
def CFFSUB(id, time, par, npar, loci, locj, x, xdot, nforce, dflag, iflag): 
    return result
MATLABの呼出し構文
function vector = CFFSUB(id, time, par, npar, loci, locj, x, xdot, nforce, dflag, iflag)

属性

AREA
[倍精度]
接触パッチの面積。
DFLAG
[論理]
MotionSolveで偏導関数が必要な場合にtrueに設定されるブール変数。それ以外の場合はfalseに設定されます。
ID
[整数]
Force_Contact要素の識別子。
IFLAG
[論理]
MotionSolveCFFSUBが依存する関数を知る必要がある場合にtrueに設定されるブール変数。このフラグがfalseに設定されている場合は、ユーザー定義の式の値が計算されます。
LOCI
[倍精度]
I_GRAPHICS_ID上の接触ポイントにおける位置ベクトルを格納した配列。このベクトルは、I_GRAPHICS_ID参照マーカーの原点を基準として、I_GRAPHICS_ID参照マーカーの座標系に解決されています。
LOCJ
[倍精度]
J_GRAPHICS_ID上の接触ポイントにおける位置ベクトルを格納した配列。このベクトルは、J_GRAPHICS_ID参照マーカーの原点を基準として、J_GRAPHICS_ID参照マーカーの座標系に解決されています。
NFORCE
[倍精度]
法線力の値。
NPAR
[整数]
PAR配列のエントリの数。
PAR
[倍精度]
ユーザー定義のステートメントで提供されたリストにある定数引数を格納した配列。
TIME
[倍精度]
現在のシミュレーション時間。
X
[倍精度]
接触変形ベクトル。
最初の2つの要素には、Iインシデントマーカーのx軸とy軸に沿った変形が含まれます。3つ目の要素には、Iインシデントマーカーのz軸を中心とした回転変形が含まれます。
XDOT
[倍精度]
接触滑り速度ベクトル。
最初の2つの要素には、Iインシデントマーカーのx軸とy軸に沿った滑り速度が含まれます。3つ目の要素には、Iインシデントマーカーのz軸を中心とした角速度が含まれます。

出力

RESULT
[倍精度]
摩擦力ベクトルの値。
最初の2つの要素には、Iインシデントマーカーのx軸とy軸に沿った力が含まれます。3つ目の要素には、Iインシデントマーカーのz軸を中心としたトルクが含まれます。

def CFFSUB(id, time, par, npar, loci, locj, x, xdot, nforce, dflag, iflag):
    result = [0,0,0]
        mu_sta =float(par[0])
        mu_dyn = float(par[1])
        vs = float(par[2])
        vd = float(par[3])

        v = sqrt(xdot[0]*xdot[0]+xdot[1]*xdot[1])
        mu = 0.0
        if v>=vd:
            mu = mu_dyn
        elif v>vs:
            mu, errflg] = py_step(v, vs, mu_sta, vd, mu_dyn,0)
        else:
            [mu, errflg] = py_step(v, -vs, -mu_sta, vs, mu_sta,0)

                result[0] = -mu*(nforce)*xdot[0]/v
                result[1] = -mu*(nforce)*xdot[1]/v

        return result