Skip to content

Commit

Permalink
1127 added calculate beam offset properties in sg module
Browse files Browse the repository at this point in the history
  • Loading branch information
tian50 committed Nov 27, 2020
1 parent 68bf22a commit e96954c
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 8 deletions.
4 changes: 4 additions & 0 deletions dakota_interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,12 @@ def process(fn_json_args):
scrnout = interface_args['scrnout']
ms = sga.solve(fn_main, analysis, ppcmd, solver, scrnout=scrnout)

if 'ref_center' in interface_args.keys():
if interface_args['ref_center'] == 'sc':
ms.offsetBeamRefCenter(ms.shear_center[1], ms.shear_center[2])

# Calculate actual responses
rc = None
for k, v in interface_args['post_process'].items():
# print('')
# print('v[0]:', v[0])
Expand Down
85 changes: 77 additions & 8 deletions sg.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ def summary(self):
print(row)


def getBeamProperty(self, label, center=None):
def getBeamProperty(self, label):
"""Get beam properties using specific labels.
Parameters
Expand Down Expand Up @@ -145,13 +145,13 @@ def getBeamProperty(self, label, center=None):
stf_r = self.stiffness_refined
cmp_r = self.compliance_refined

if type(center).__name__ == 'str':
if center == 'tc':
mm, stf_c, cmp_c, stf_r, cmp_r = calcOffsetBeamProperty(self.tension_center[1], self.tension_center[2])
elif center == 'sc':
mm, stf_c, cmp_c, stf_r, cmp_r = calcOffsetBeamProperty(self.shear_center[1], self.shear_center[2])
elif center == 'mc':
mm, stf_c, cmp_c, stf_r, cmp_r = calcOffsetBeamProperty(self.mass_center[1], self.mass_center[2])
# if type(center).__name__ == 'str':
# if center == 'tc':
# mm, stf_c, cmp_c, stf_r, cmp_r = calcOffsetBeamProperty(self.tension_center[1], self.tension_center[2])
# elif center == 'sc':
# mm, stf_c, cmp_c, stf_r, cmp_r = calcOffsetBeamProperty(self.shear_center[1], self.shear_center[2])
# elif center == 'mc':
# mm, stf_c, cmp_c, stf_r, cmp_r = calcOffsetBeamProperty(self.mass_center[1], self.mass_center[2])

# Mass
if label.startswith('ms'):
Expand Down Expand Up @@ -266,6 +266,75 @@ def calcOffsetBeamProperty(self, offset_x2=0.0, offset_x3=0.0):
return mm_o, stf_4_trf, cmp_4_trf, stf_6_trf, cmp_6_trf


def offsetBeamRefCenter(self, offset_x2, offset_x3):
"""Offset the beam reference center and recalculate beam properties.
Parameters
----------
offset_x2 : float
x2 of the offset of the new center with respect to the current one.
offset_x3 : float
x3 of the offset of the new center with respect to the current one.
"""

# offset = [0.0, offset[0], offset[1]]

# Offset mass matrix
mm_o = np.asarray(self.mass_mc)
if (offset_x2 != self.mass_center[1]) or (offset_x3 != self.mass_center[2]):
# mm_c = np.asarray(self.mass_mc)
mu = mm_o[0, 0]
mi_c = mm_o[3:, 3:]

x2 = self.mass_center[1] - offset_x2
x3 = self.mass_center[2] - offset_x3
r_tilde = np.array([
[0, -x3, x2],
[x3, 0, 0],
[-x2, 0, 0]
])

mm_o[:3, 3:] = mu * r_tilde.T
mm_o[3:, :3] = mu * r_tilde

# I_o = I_c + m * r_tilde.r_tilde^T
mm_o[3:, 3:] = mm_o[3:, 3:] + mu * np.dot(r_tilde, r_tilde.T)
self.mass_origin = mm_o
self.mass_center[1] -= offset_x2
self.mass_center[2] -= offset_x3


# Offset stiffness and compliance
trfm_4 = np.eye(4)
trfm_6 = np.eye(6)

trfm_4[2, 0] = offset_x3
trfm_4[3, 0] = -offset_x2

trfm_6[4, 0] = offset_x3
trfm_6[5, 0] = -offset_x2
trfm_6[3, 1] = -offset_x3
trfm_6[3, 2] = offset_x2

cmp_4 = np.asarray(self.compliance)
cmp_6 = np.asarray(self.compliance_refined)

self.compliance = np.dot(trfm_4.T, np.dot(cmp_4, trfm_4))
self.compliance_refined = np.dot(trfm_6.T, np.dot(cmp_6, trfm_6))

self.stiffness = np.linalg.inv(self.compliance)
self.stiffness_refined = np.linalg.inv(self.compliance_refined)

self.tension_center[1] -= offset_x2
self.tension_center[2] -= offset_x3

self.shear_center[1] -= offset_x2
self.shear_center[2] -= offset_x3

return





Expand Down

0 comments on commit e96954c

Please sign in to comment.