createModelメソッド
モデルオブジェクトを作成します。
このモデルはコンテナーオブジェクトです。すべてのモデリングエンティティはこのコンテナーオブジェクトに保存されます。モデルオブジェクトが、最適化を実行するために最適化エンジンに渡されます。
例
FourBarクラスのcreateModelメソッドは、make_cylinderおよびmake_jointという2つのヘルパー関数を利用して、それぞれ円筒およびジョイントを作成します。これらによってモデリングが簡素化されます。
def createModel (self):
#------------------------------------------
def make_cylinder (a, b, r, rho, label):
r2 = r*r
h2 = (a[0]-b[0])**2 + (a[1]-b[1])**2 +
(a[2]-b[2])**2
h = math.sqrt(h2)
mass = math.pi * r2 * h * rho
ixx = iyy = mass * (3 * r2 + h2) / 12
izz = mass * r2 / 2
qploc = (a+b)/2
xploc = qploc + [0,0,1]
cyl = Part (mass=mass,
ip=[ixx, iyy, izz],
label=label)
cyl.cm = Marker (body=cyl, qp=qploc, zp=b
xp=xploc, label=label + " CM")
cyl.gcm = Marker (body=cyl, qp=a, zp=b,
xp=xploc, label=label + "_Cyl CM")
cyl.gra = Graphics (type="CYLINDER",
cm=cyl.gcm, radius=r, length=h,
seg=40, label=label + " Cylinder")
cyl.req = Request (type="DISPLACEMENT",
i=cyl.cm,
comment=label + " CM displacement",
label=label + " CM displacement")
return cyl
#-----------------------------------------------
def make_joint (p2, p1, loc, loc2, jtype, pt):
if jtype == "UNIVERSAL":
ux = Vector(1,0,0) # Global X
uz = Vector(0,0,1) # Global Z
xiloc = loc + ux # Xi along global X
ziloc = loc + uz # Zi along global Z
xjloc = loc + uz # Xj along global Z
ubc = (loc-loc2).normalize()
zixbc = uz.cross (ubc).normalize ()
zjloc = pc+zixbc
mi = Marker (body=p2, qp=loc, zp=ziloc,
xp=xiloc, label="UNIV@ C I")
mj = Marker (body=p1, qp=loc, zp=zjloc,
xp=xjloc, label="UNIVL@ C J")
else:
xploc = loc + [1,0,0]
zploc = loc + [0,0,1]
mi = Marker (body=p2, qp=loc, zp=zploc,
xp=xploc, label=jtype+"@"+pt+" I")
mj = Marker (body=p1, qp=loc, zp=zploc,
xp=xploc, label=jtype+"@"+pt+" J")
joint = Joint (type=jtype, i=mi, j=mj,
label=jtype+"@"+pt)
return joint
m = Model (output="test-4bar")
units = Units (mass="KILOGRAM",
length="MILLIMETER",
time="SECOND",
force="NEWTON")
grav = Accgrav (jgrav=-9800)
H3dOutput (grasave=True)
# define the design variables
m.ax = ax = Dv (label="XA", b=self.ax,
blimit=self.ax_lim)
m.ay = ay = Dv (label="YA", b=self.ay,
blimit=self.ay_lim)
m.bx = bx = Dv (label="XB", b=self.bx,
blimit=self.bx_lim)
m.by = by = Dv (label="YB", b=self.by,
blimit=self.by_lim)
m.cx = cx = Dv (label="XC", b=self.cx,
blimit=self.cx_lim)
m.cy = cy = Dv (label="YC", b=self.cy,
blimit=self.cy_lim)
m.dx = dx = Dv (label="XD", b=self.dx,
blimit=self.dx_lim)
m.dy = dy = Dv (label="YD", b=self.dy,
blimit=self.dy_lim)
rad, rho = 10, 7.8e-6
pa = Point(ax,ay,0)
pb = Point(bx,by,0)
pc = Point(cx,cy,0)
pd = Point(dx,dy,0)
#Ground
p1 = Part (ground=True)
oxyz = Marker (body=p1, label="Global CS")
#crank, coupler, follower parts
m.crank = p2 = make_cylinder (pa, pb, rad,
rho, "Crank")
m.coupler = p3 = make_cylinder (pb, pc, rad,
rho, "Coupler")
m.follower = p4 = make_cylinder (pc, pd, rad,
rho, "Follower")
m.coupler.azMarker = Marker (part=p3,
qp=p3.cm.qp)
#Joints + motion @A to drive system
ja = make_joint (p2, p1, pa, None,
"REVOLUTE", "A")
jb = make_joint (p3, p2, pb, None,
"SPHERICAL", "B")
jc = make_joint (p4, p3, pc, pb ,
"UNIVERSAL", "C")
jd = make_joint (p1, p4, pd, None,
"REVOLUTE", "D")
m.j1mot = Motion (joint=ja, jtype="ROTATION",
dtype="DISPLACEMENT",
function="360d*time")
self.mbsModel = m
return m