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' - 'xcte-ycte': to a 90° connection - 'ycte-xcte': to a 90° connection Returns ------- kt, kr : tuple A tuple with both values. Note ---- Theoretically, the penalty stiffnesses kt and kr can be arbitrarily high in order to impose the energy penalty. However, the use of high values is associated with numerical instabilities such that one should choose the penalty stiffnesses that are just high enough to impose the proper penalties, but not excessively high. In the current study it is proposed to calculate kt and kr based on laminate properties of the panels being connected, instead of using fixed high values, a common practice in the literature. [castro2017AssemblyModels] """ 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 elif connection_type.lower() == 'xcte-ycte': kt = 4*A11_p1*A22_p2 / ((A11_p1+A22_p2)*(hp1+hp2)) kr = 4*D11_p1*D22_p2 / ((D11_p1+D22_p2)*(hp1+hp2)) return kt, kr elif connection_type.lower() == 'ycte-xcte': kt = 4*A22_p1*A11_p2 / ((A22_p1+A11_p2)*(hp1+hp2)) kr = 4*D22_p1*D11_p2 / ((D22_p1+D11_p2)*(hp1+hp2)) return kt, kr