Source code for compmech.panel.connections.penalty_constants
from __future__ import division, absolute_import
import compmech.composite.laminate as laminate
[docs]def calc_kt_kr(p1, p2, connection_type):
"""Calculate translation and rotation penalty constants
For details on how to derive these equations, see
[castro2017AssemblyModels]_.
Parameters
----------
p1 : :class:`.Panel`
First panel.
p2 : :class:`.Panel`
Second panel.
connection_type : str
One of the types:
- 'xcte'
- 'ycte'
- 'bot-top'
Returns
-------
kt, kr : tuple
A tuple with both values.
"""
def build_panel_lam(panel):
panel._rebuild()
if panel.lam is not None:
return
if panel.stack is None:
raise ValueError('Panel defined without stacking sequence')
if panel.plyts is None:
raise ValueError('Panel defined without ply thicknesses')
if panel.laminaprops is None:
raise ValueError('Panel defined without laminae properties')
panel.lam = laminate.read_stack(panel.stack, plyts=panel.plyts,
laminaprops=panel.laminaprops)
return
build_panel_lam(p1)
build_panel_lam(p2)
A11_p1 = p1.lam.A[0, 0]
A11_p2 = p2.lam.A[0, 0]
D11_p1 = p1.lam.D[0, 0]
D11_p2 = p2.lam.D[0, 0]
A22_p1 = p1.lam.A[1, 1]
A22_p2 = p2.lam.A[1, 1]
D22_p1 = p1.lam.D[1, 1]
D22_p2 = p2.lam.D[1, 1]
hp1 = p1.lam.t
hp2 = p2.lam.t
if connection_type.lower() == 'xcte':
kt = 4*A11_p1*A11_p2/((A11_p1 + A11_p2)*(hp1 + hp2))
kr = 4*D11_p1*D11_p2/((D11_p1 + D11_p2)*(hp1 + hp2))
return kt, kr
elif connection_type.lower() == 'ycte':
kt = 4*A22_p1*A22_p2/((A22_p1 + A22_p2)*(hp1 + hp2))
kr = 4*D22_p1*D22_p2/((D22_p1 + D22_p2)*(hp1 + hp2))
return kt, kr
elif connection_type.lower() == 'bot-top':
kt = 4*A11_p1*A11_p2/((A11_p1 + A11_p2)*(hp1 + hp2)) / min(p1.a, p1.b)
kr = None
return kt, kr