接触計算のタイムステップを効率化する方法

Kosuke_IKEDA
Kosuke_IKEDA
Altair Employee
edited April 16 in Altair Exchange

Overview

Altairのマルチボディ解析ソフトMotionSolve/MotionViewには接触計算時に、接触計算の精度を上げるため、接触を検知したのち、タイムステップを小さくする機能があります。

ただし、一度接触を検出し、タイムステップが小さくなると、計算終了までタイムステップは小さいままです。

本記事では、接触検出の後、再度接触が発生しなくなったときに、タイムステップを元に戻す方法を紹介します。

Contactにて、Find precise contact event(デフォルト=0.01)とChange simulation max step size(デフォルト=0.0001)の二つにチェックを付けると、元のタイムステップの0.01倍の細かさで接触を検出し、その後、新しいタイムステップ0.0001で計算する設定となります。

image

下記に、接触力とタイムステップのグラフを示します。

結果、一回目の接触が発生するまではデフォルトタイムステップ0.01で計算が進み、一回目の接触を判定した以降は新しいタイムステップ0.0001で計算していることがわかります。

image

これに対し、接触が発生しない場合に、デフォルトタイムステップ0.01に戻す設定を追加します。

image

結果、下記赤線のように、接触が発生している間のみタイムステップ0.0001とし、接触が発生しない時間帯はデフォルトタイムステップ0.01で計算できます。

image

 

 

Pre-Requisite

Altair MotionView/MotionSolveのインストールは下記ご参照ください。

MotionView/MotionSolve 入門コース 総合案内 - Altair Support

本記事で使用したスクリプト、サンプルモデルは下記よりダウンロード可能です。

py_create_sensor.py

contact_precise_on_contact.zip

Usage/Installation Instructions

MotionViewのpythonAPIにより、本設定を自動で追加できます。

まずは、モデル内のコンタクトの内、最低1つに対し、Find precise contact eventとChange simulation max step sizeの設定を行ってください。

この設定が無い場合は、タイムステップを元に戻す必要はありません。

image

添付のpy_create_sensor.pyを開きます。

from hw import mview  def isValidContactSensor(o):     return o.isinstance('Contact') and o.create_hmax_sensor == True      m=mview.getModel() contactlistsen=m.getAllChildren(filter = isValidContactSensor) FM_list=['CONTACT({'+ contact.getFullName()+'.id},0,1,0)' for contact in contactlistsen] FM='+'.join(FM_list)  tpl= mview.Template(name='sensor', label='sensor contact off', active=True, type='SOLVER_INPUT') tpl.text = '<Sensor_Event id = "{THIS.id}" type = "EXPRESSION" expr = "'+FM+'" compare = "LE" value = "0." hmax = "{ana__default.DS_MotionSolve_Transient_Simopts.h_max.value}" error_tol = "0.00001"/>'  

MotionViewのPython windowを表示し、上記のコードをコピーペーストして実行します。

sensor contact offのTemplateが自動で追加されます。

image

Templateには接触力が0以下になった場合にタイムステップを0.01に戻す設定が記述されています。

<Sensor_Event id = "0" type = "EXPRESSION" expr = "CONTACT(0,0,1,0)" compare = "LE" value = "0." hmax = "0.01" error_tol = "0.00001"/>

本スクリプトは複数のコンタクトが設定されている場合も有効です。モデル内のすべてのChange simulation max step sizeが設定されたコンタクトを検出し、それらの接触力の合計値が0以下になった場合にタイムステップを0.01に戻す設定が追加されます。

image

<Sensor_Event id = "301001" type = "EXPRESSION" expr = "CONTACT(304001,0,1,0)+CONTACT(304002,0,1,0)+CONTACT(304003,0,1,0)+CONTACT(304004,0,1,0)+CONTACT(304005,0,1,0)+CONTACT(304006,0,1,0)+CONTACT(304007,0,1,0)+CONTACT(304008,0,1,0)+CONTACT(304009,0,1,0)+CONTACT(304010,0,1,0)+CONTACT(304011,0,1,0)+CONTACT(304012,0,1,0)+CONTACT(304013,0,1,0)" compare = "LE" value = "0." hmax = "0.001" error_tol = "0.00001"/>

Post-Requisite

使用製品:Altair MotionSolve/MotionView

よくあるエンジニアからの質問はこちら