ユーザーサブルーチンとMotionSolve

スクリプトやDLL/SO内のユーザー作成サブルーチン、MotionSolveによって提供されるモデリングアクセスサブルーチン、MotionSolveサブルーチンインターフェース、およびMotionSolve自体の関係を下の図1に示します。



図 1. ユーザーが作成したDLL/SOまたはスクリプトとMotionSolve間のデータフロー
図1は、次のように解釈できます:
  • MotionSolveが呼び出され、モデルを含む入力XMLファイルがこれに提供されます。
  • 入力XMLファイルには、動作がユーザー定義のDLL/SOまたはスクリプトで定義される複数のモデリングステートメントを含めることができます。動作がユーザー作成DLLまたはスクリプトで定義されるモデリング要素の例を以下に示します。
    ユーザー定義のDLLとして ユーザー定義のスクリプトとして
    <Force_Scalar_TwoBody 
      Id = "30101"
      Type = "Force" 
      I_Marker_Id = "30103031" 
      J_Marker_Id = "30104041" 
      Usrsub_Param_String = "USER(50,1000)"   
      Usrsub_Dll_Name = "./Myfunction.dll" 
      Usersub_Fnc_Name = "Friction_Lugre"
    />
    <Force_Scalar_TwoBody 
      Id = "30102" 
      Type = "Force" 
      I_Marker_Id = "30103032"
      J_Marker_Id = "30104042" 
      Usrsub_Param_String = "USER(50,1000)" 
      Script_Name = "./Myfunction.pyc" 
      Usersub_Fnc_Name = "Friction_Lugre" 
      Interpreter = "Python" 
    />

    この例は、ID=30101のモデリング要素Force_Scalar_TwoBodyの動作が、ファイル./MyFunction.dll内の関数Friction_LuGreによって定義されていることをMotionSolveに伝えています。また、ID=30102のモデリング要素Force_Scalar_TwoBodyの動作が、Pythonで記述されたファイル./MyFunction.pyc内の関数Friction_LuGreによって定義されていることもMotionSolveに伝えています。

  • 入力XMLファイルには、MotionSolveにユーザーサブルーチンによって駆動するように要求する複数のコマンドを含めることもできます。動作がユーザー作成DLLまたはスクリプトで定義されるこのようなコマンドの例を以下に示します。
    ユーザー定義のDLLとして ユーザー定義のスクリプトとして
    <UserProgramControl 
      Usrsub_Param_String = "USER(0,-9810,0)" 
      Usersub_Fnc_Name = "Lane_Change" 
      Usrsub_Dll_Name = "./Myfunction.Dll" 
    />
    <UserProgramControl 
      Usrsub_Param_String = "USER(0,-9810,0)" 
      Usersub_Fnc_Name = "Lane_Change" 
      Script_Name = "./Myfunction .py" 
      Interpreter = "Python" 
    />

    この例は、MotionSolveがモデルを読み取ったら、実行制御をファイル./MyFunction.dll内の関数Lane_Changeに渡す必要があることをMotionSolveに伝えます。この関数は、右側の列に示すように、Pythonで記述することもできます。この例は、MotionSolveがモデルを読み取ったら、実行制御をPythonで記述されたファイル./MyFunction.py内の関数Lane_Changeに渡す必要があることをMotionSolveに伝えます。(Pythonスクリプトは、コンパイルされている(*.pyc)場合とコンパイルされていない(*.py)場合があります。)

  • 入力ファイルが読み込まれ処理されると、MotionSolveはシミュレーションの準備が整い、XML入力ファイル内のコマンドを実行します。これらのコマンドは、標準のコマンドにすることも、ユーザーサブルーチンで定義されたコマンドにすることもできます。標準のMotionSolve解析コマンドが出現した場合は、次のようになります:
    <Simulate
        analysis_type = "Transient"
        end_time = "2."
        print_interval = "0.01"
     />

    MotionSolveが要求された解析を実行します。また、UserProgramControlコマンドが出現した場合は、指定されたDLL/SOを読み込む(ドライバサブルーチンがコンパイルされている場合)か、Script_Nameで指定されたファイルにアクセスします。その後、Usersub_Fnc_Nameで指定された関数を呼び出して、ドライバユーザーサブルーチン内の命令を実行します。

  • 解析の過程において、MotionSolveは、すべてのモデリング要素を評価する必要があります。ユーザー作成サブルーチンを参照するモデリング要素が出現すると、MotionSolveは、ユーザー作成サブルーチンを読み込んで、サブルーチン内の命令を実行し、必要なデータを取得します。ユーザー作成サブルーチンライブラリまたはスクリプトへのパスは、usrsub_dll_nameまたはscript_nameを介したモデリングステートメントで直接指定することも、環境変数を介して指定することもできます。詳細については、MotionSolveユーザーズガイドMotionSolveの環境変数のトピックをご参照ください。