カスタマイズ可能なソルバーモデル

パラメトリックなオブジェクトとモデル

Python自体によって、パラメトリックモデルを作成するための機能が提供されます。次の簡単な例では、球状パートを作成します。この例ではSI単位を使用しています。
  1. 材料は鋼鉄です。密度: rho=7800 Kg/m3
  2. 球体の半径: r
  3. 球体の質量: m = (4/3) * pi * r3 * rho Kg
  4. 球体の中心の周りの慣性: Ixx = Iyy = Izz = ½ * m * r2
次のように密度 rho、半径r、および位置locで球状パートを作成するための関数sphereを作成できます。
def sphere (r, rho, loc, label): 
mass      = (4/3) * math.pi * (r**3) * rho
ixx       = iyy = izz = 0.5 * mass * r**2
sphere    = Part (mass=mass, ip=[ixx,iyy,izz], label=label)
sphere.cm = Marker (part=sphere, qp=loc, label=label + "_CM")
return sphere
次に、この関数を使用して、パラメトリックな球状PARTを次のように作成できます:
# Steel sphere of radius 0.1 m (10 cm)
r1   = 0.10
rho1 = 7800
loc1 = [0,10,-25]
sph1 = sphere (r1, rho1, loc1, "Steel-Sphere")
# Aluminum sphere of radius 0.05 m (5 cm)
r2   = 0.05
rho2 = 2700
loc2 = [23, 34, 45]
sph2 = sphere (r2, rho2, loc2, "Aluminum-Sphere")
両方の球体の質量プロパティは、それらの半径と密度についてパラメータ化されました。
重要: Python側ではこのパラメータ化が認識されていますが、MotionSolve側では認識されていません。これは、質量と慣性の式はPythonによって評価され、数値に解決されてからMotionSolveに渡されるためです。MotionSolve側でこのパラメータ化を認識させるためには、設計可能なオブジェクトを作成する必要があります。

設計可能なオブジェクトとモデル

設計可能なオブジェクトとは、MotionSolve側でパラメトリック関係が認識されているオブジェクトのことです。結果として、MotionSolveは、そのオブジェクトをパラメータ化するために使用される設計変数に関して、任意のシステム応答の感度を計算する方法も認識します。

設計可能なモデルを作成して感度解析を実行するために必要な手順は次のとおりです:
  1. 設計変数を作成します。これは、MotionSolveに最近導入された新しいオブジェクトクラスです。
  2. 設計変数を使用してモデルをパラメータ化します。
  3. モデルレベルで、応答変数を作成します。
  4. DSA(Design Sensitivity Analysis)をオンにした状態でシミュレーションを実行します。
  5. MotionSolveによって、設計変数の変化に対する応答変数の感度が計算されます。この情報は、さまざまな方法でユーザーに提供されます。
設計変数
設計変数(Dv)は、ラベルと値が格納されているオブジェクトです。ラベルはそのDvの名前であり、値はそのDvの値です。次に、設計変数の例を示します:
bx = Dv ( label="X coordinate of Point B", b=1.0/math.sqrt(2))
Dvに対しては、数値と同様に通常の数学演算を実行できます。したがって次のようになります:
>>> bx 
<msolve.Model.Dv object at 0x0000000001F0B668>
>>> a1 = bx+bx
>>> a1
1.414213562373095 # 1/sqrt(2) + 1/sqrt(2) = sqrt(2) = 1.414213562373095
>>> a3 = bx*bx
>>> a3
0.4999999999999999 # 1/sqrt(2) * 1/sqrt(2) = 1/2
MotionSolveは、bxが指し示す設計変数に変数a1およびa3が依存していることを認識しています。
したがって、この時点で設計変数を使用してパラメータ化を実行でき、MotionSolveはパラメトリック関係について認識します。次の例は、パラメトリック球体PARTSの作成方法を示しています。
注: 設計変数を使用して球体の位置をパラメータ化することもできます。次の例では、この操作を行っていません。
# Steel sphere of radius 0.1 m (10 cm)
r1   = Dv (label="Radius of sphere-1", b=0.10)
rho1 = Dv (label="Density of Steel", b=7800)
loc1 = [0,10,-25]
sph1 = sphere (r1, rho1, loc1, "Steel-Sphere")

# Aluminum sphere of radius 0.05 m (5 cm)
r2   = Dv (label="Radius of sphere-2", b=0.05)
rho2 = Dv (label="Density of Aluminum", b=2700)
loc2 = [23, 34, 45]
sph2 = sphere (r2, rho2, loc2, "Aluminum-Sphere")

MotionSolveは、sph1の質量と慣性がr1rhoに依存していることを認識しています。同様に、sph2の質量と慣性がr2rhoに依存していることも認識しています。パートsph1およびsph2は“設計可能”です。

ポイントとベクトル
MotionViewでのモデリングとパラメータ化のほとんどは、ポイントとベクトルを使用して実行されます。MotionSolve-Pythonインターフェースは、PointクラスとVectorクラスをサポートしています。これらのヘルパークラスの目的は、MotionSolveモデルを簡素化し、MotionSolveモデルでのMotionViewモデルのパラメータ化を容易に捕捉することです。
Vectorクラス
ベクトルは、大きさと方向を持つオブジェクトです。このリリースでは、ベクトルは常に全体参照フレーム内で定義されます。ベクトルは、モデル内のどのボディとも一緒に回転したり移動したりすることはありません。
ベクトルは3つの実数値のリストです。ベクトルには、他のデータタイプを指定することはできません。ベクトルでは多くのメソッドがサポートされているため、さまざまな方法でこれを使用できます。以下に、ベクトルのいくつかの組み込みメソッドを示します。
ベクトルの作成 ベクトルのコピーの作成 ベクトルへのインデックス付け
>>> u=Vector(1,2,3)
>>> u
Vector (1.0, 2.0, 3.0)
>>> v=Vector(-3,0,1)
>>> v
Vector (-3.0, 0.0, 1.0)
>>>w = u.copy()
>>> w
Vector (1.0, 2.0, 3.0)
>>> u.x 
1
>>> u.y
2
>>> u[2]
3
単項マイナス 加算 減算
>>> -u
Vector (-1.0, -2.0, -3.0)
>>> u+v 
Vector (-2.0, 2.0, 4.0)
>>> u-v
Vector (4.0, 2.0, 2.0)
2つのベクトルのドット積 2つのベクトルのクロス積 2つのベクトル間の角度
>>> u%v
0
>>> u.dot(v)
0
>>> u*v 
Vector (0.169030850946, 
-0.845154254729, 
0.507092552837)
>>> u.angle(v)
1.5707963267948966
>>> u.angle(v, degrees=True)
90.0
ベクトルの大きさ 単位ベクトルの作成 係数によるベクトルのスケーリング
>>> u.magnitude()
3.7416573867739413
>>> u.normalize()
Vector (0.267261241912, 
0.534522483825, 
0.801783725737)
>>> u*10
Vector (10.0, 20.0, 30.0)
>>> u.scale(10)
Vector (10.0, 20.0, 30.0)
Pointクラス
ポイントは、空間内の位置です。これは、3つの実数値のリストとして表されます。Pointには、他のデータタイプを指定することはできません。これらの3つの値は、他のポイントを基準にした空間内の位置の座標です。ポイントに対して操作が実行される際は常に、すべてのポイント座標が同じ座標系で表されていることを確認する必要があります。ポイントでは多くのメソッドがサポートされているため、さまざまな方法でポイントを使用できます。以下に、ポイントのいくつかの組み込みメソッドを示します。
ポイントの作成 ポイントのコピーの作成 ポイントへのインデックス付け
>>> p=Point(1,2,3)
>>> P
Point (1.0, 2.0, 3.0)
>>> q=Vector(-3,0,1)
>>> v
Point (-3.0, 0.0, 1.0)
>>>r = p.copy()
>>> r
Point (1.0, 2.0, 3.0)
>>> u.x 
1
>>> u.y
2
>>> u[2]
3
単項マイナス 加算 減算
>>> -P
Point (-1.0, -2.0, -3.0)
>>> p+q 
Point (-2.0, 2.0, 4.0)
>>> p-q
Point (4.0, 2.0, 2.0)
2つのポイント間の距離 沿った距離 スケーリング
>>> p.distanceTo(q)
4.898979485566356
>>> q.distanceTo(p)
4.898979485566356
>>> p.along(q, 10) 
Point (5.08248290464, 
-2.08248290464, 
-5.16496580928)
>>> p*10
Vector (10.0, 20.0, 30.0)
>>> p.scale(10)
Vector (10.0, 20.0, 30.0

ポイントとベクトルを使用した設計可能なエンティティ

マーカーの位置と向きをポイントとベクトルの関数にすることができるため、すべての結合を“設計可能”にできます。以下に例を示します。
>>> px = Dv (b=1)
>>> py = Dv (b=2)
>>> pz = Dv (b=3)
>>> p  = Point(px,py,pz)
>>> p
Point (1.0, 2.0, 3.0)

>>> #Create a Part
>>> p2 = Part (mass=1, ip=[1e-4,1e-4,1e-4])
>>> p2.cm = Marker (body=p2)

>>> #Create a designable Marker - its origin and orientation are designable
>>> p2.left = Marker (body=p2, qp=p, zp=p+[0,0,1], label="Left end")
>>> p2.left.qp
Point (1.0, 2.0, 3.0)

これで、これらの設計可能なMBSエンティティを使用して設計感度解析を実行できるようになりました。Pythonインターフェースは、MotionSolveモデル内のすべての適切なMotionViewパラメータ化を捕捉できます。

最後に、次の例で、PARTとMARKERの両方を設計可能にする方法を示します。
def cyl_mass_prop (l, r, rho): 
 """
   calculate mass properties of a cylinder, given
    (1) length = l
    (2) radius = r
    (3) density =rho
 """

 r2   = r*r
 l2   = l*l
 mass = math.pi * r2 * l * rho
 ixx  = iyy = mass * (3 * r2 + l2) / 12
 izz  = mass * r2 / 2
return mass, ixx, iyy, izz

# Define the design variables (Units are Kg-mm-sec-Newton)
ax  = Dv ( label="X coordinate of Point A", b=0)
ay  = Dv ( label="Y coordinate of Point A", b=0)
bx  = Dv ( label="X coordinate of Point B", b=40)
by  = Dv ( label="Y coordinate of Point B", b=200)
rad = Dv ( label="Cylinder radius", b=10)
rho = Dv ( label="Cylinder density", b=7.8E-6)

# Define the points A, B
pa  = Point (ax,ay,0) # 0, 0, 0
pb  = Point (bx,by,0) # 40, 200, 0

# Link length
lab = pa.distanceTo (pb)
# Crank: cylinder of length lab, radius=rad, density=rho
m2, ixx2, iyy2, izz2 = cyl_mass_prop (lab, rad, rho)
p2    = Part (mass=m2, ip=[ixx2, iyy2, izz2, 0, 0, 0], label="Body Crank")
qploc = (pa+pb)/2
xploc = qploc + [0,0,1]
p2.cm = Marker (body=p2, qp=qploc, zp=pb, xp=xploc, label="Crank cm marker")
上の例において:
  • パートp2は設計可能です。MotionSolveは、このパートの質量と慣性が、ポイントA(設計変数axayによって定義)とポイントB(設計変数bxbyによって定義)の位置、シリンダーの半径rad、およびシリンダーの密度rhoの関数であると認識しています。
  • 同様に、マーカーp2.cmは設計可能です。このマーカーの位置と向きは、設計変数axaybxbyによって決まります。