def _recover_straini_rod(xb, dof_map, elem, prop): """get the static rod strain""" nid1, nid2 = elem.nodes # axial i11 = dof_map[(nid1, 1)] i12 = i11 + 1 i13 = i11 + 2 i21 = dof_map[(nid2, 1)] i22 = i21 + 1 i23 = i21 + 2 # torsion i14 = i11 + 3 i15 = i11 + 4 i16 = i11 + 5 i24 = i21 + 3 i25 = i21 + 4 i26 = i21 + 5 q_axial = np.array([ xb[i11], xb[i12], xb[i13], xb[i21], xb[i22], xb[i23], ]) q_torsion = np.array([ xb[i14], xb[i15], xb[i16], xb[i24], xb[i25], xb[i26], ]) xyz1 = elem.nodes_ref[0].get_position() xyz2 = elem.nodes_ref[1].get_position() dxyz12 = xyz1 - xyz2 Lambda = lambda1d(dxyz12, debug=False) u_axial = Lambda @ q_axial u_torsion = Lambda @ q_torsion du_axial = u_axial[0] - u_axial[1] du_torsion = u_torsion[0] - u_torsion[1] #headers = ['axial', 'SMa', 'torsion', 'SMt'] C = prop.c xyz1 = elem.nodes_ref[0].get_position() xyz2 = elem.nodes_ref[1].get_position() dxyz12 = xyz1 - xyz2 L = np.linalg.norm(dxyz12) axial_strain = du_axial / L torsional_strain = du_torsion * C / L return axial_strain, np.nan, torsional_strain, np.nan
def _recover_forcei_rod(xb, dof_map, elem, prop): # pragma: no cover """get the static rod force""" nid1, nid2 = elem.nodes # axial i11 = dof_map[(nid1, 1)] i12 = dof_map[(nid1, 2)] i13 = dof_map[(nid1, 3)] i21 = dof_map[(nid2, 1)] i22 = dof_map[(nid2, 2)] i23 = dof_map[(nid2, 3)] # torsion i14 = dof_map[(nid1, 4)] i15 = dof_map[(nid1, 5)] i16 = dof_map[(nid1, 6)] i24 = dof_map[(nid2, 4)] i25 = dof_map[(nid2, 5)] i26 = dof_map[(nid2, 6)] q_axial = np.array([xb[i11], xb[i12], xb[i13], xb[i21], xb[i22], xb[i23]]) q_torsion = np.array( [xb[i14], xb[i15], xb[i16], xb[i24], xb[i25], xb[i26]]) xyz1 = elem.nodes_ref[0].get_position() xyz2 = elem.nodes_ref[1].get_position() dxyz12 = xyz1 - xyz2 Lambda = lambda1d(dxyz12, debug=False) u_axial = Lambda @ q_axial u_torsion = Lambda @ q_torsion du_axial = u_axial[0] - u_axial[1] du_torsion = u_torsion[0] - u_torsion[1] #headers = ['axial', 'SMa', 'torsion', 'SMt'] #C = prop.c mat = prop.mid_ref L = np.linalg.norm(dxyz12) G = mat.G() J = elem.J() A = elem.Area() E = elem.E() axial_strain = du_axial / L #torsional_strain = du_torsion * C / L axial_stress = E * axial_strain #torsional_stress = G * torsional_strain axial_force = axial_stress * A torsional_moment = du_torsion * G * J / L return axial_force, torsional_moment
def _recover_straini_rod(xb, dof_map, elem, prop): """get the static rod strain""" nid1, nid2 = elem.nodes # axial i1 = dof_map[(nid1, 1)] i2 = dof_map[(nid2, 1)] q_axial = np.array([ xb[i1], xb[i1 + 1], xb[i1 + 2], xb[i2], xb[i2 + 2], xb[i2 + 2], ]) q_torsion = np.array([ xb[i1 + 3], xb[i1 + 4], xb[i1 + 5], xb[i2 + 3], xb[i2 + 4], xb[i2 + 5], ]) xyz1 = elem.nodes_ref[0].get_position() xyz2 = elem.nodes_ref[1].get_position() dxyz12 = xyz1 - xyz2 Lambda = lambda1d(dxyz12, debug=False) u_axial = Lambda @ q_axial u_torsion = Lambda @ q_torsion du_axial = u_axial[0] - u_axial[1] du_torsion = u_torsion[0] - u_torsion[1] #headers = ['axial', 'SMa', 'torsion', 'SMt'] C = prop.c xyz1 = elem.nodes_ref[0].get_position() xyz2 = elem.nodes_ref[1].get_position() dxyz12 = xyz1 - xyz2 L = np.linalg.norm(dxyz12) axial_strain = du_axial / L torsional_strain = du_torsion * C / L return axial_strain, np.nan, torsional_strain, np.nan
def _recover_forcei_rod(xb, dof_map, elem, prop): """get the static rod force""" nid1, nid2 = elem.nodes i1 = dof_map[(nid1, 1)] i2 = dof_map[(nid2, 1)] q_axial = np.array( [xb[i1], xb[i1 + 1], xb[i1 + 2], xb[i2], xb[i2 + 1], xb[i2 + 2]]) q_torsion = np.array([ xb[i1 + 3], xb[i1 + 4], xb[i1 + 5], xb[i2 + 3], xb[i2 + 4], xb[i2 + 5] ]) xyz1 = elem.nodes_ref[0].get_position() xyz2 = elem.nodes_ref[1].get_position() dxyz12 = xyz1 - xyz2 Lambda = lambda1d(dxyz12, debug=False) u_axial = Lambda @ q_axial u_torsion = Lambda @ q_torsion du_axial = u_axial[0] - u_axial[1] du_torsion = u_torsion[0] - u_torsion[1] #headers = ['axial', 'SMa', 'torsion', 'SMt'] #C = prop.c mat = prop.mid_ref L = np.linalg.norm(dxyz12) G = mat.G() J = elem.J() A = elem.Area() E = elem.E() axial_strain = du_axial / L #torsional_strain = du_torsion * C / L axial_stress = E * axial_strain #torsional_stress = G * torsional_strain axial_force = axial_stress * A torsional_moment = du_torsion * G * J / L return axial_force, torsional_moment
def _recover_stressi_ctube(xb, dof_map, elem, prop): """get the static ctube stress""" nid1, nid2 = elem.nodes # axial i11 = dof_map[(nid1, 1)] i12 = i11 + 1 i13 = i11 + 2 i21 = dof_map[(nid2, 1)] i22 = i21 + 1 i23 = i21 + 2 # torsion i14 = i11 + 3 i15 = i11 + 4 i16 = i11 + 5 i24 = i21 + 3 i25 = i21 + 4 i26 = i21 + 5 q_axial = np.array([ xb[i11], xb[i12], xb[i13], xb[i21], xb[i22], xb[i23], ]) q_torsion = np.array([ xb[i14], xb[i15], xb[i16], xb[i24], xb[i25], xb[i26], ]) xyz1 = elem.nodes_ref[0].get_position() xyz2 = elem.nodes_ref[1].get_position() dxyz12 = xyz1 - xyz2 Lambda = lambda1d(dxyz12, debug=False) u_axial = Lambda @ q_axial u_torsion = Lambda @ q_torsion du_axial = u_axial[0] - u_axial[1] du_torsion = u_torsion[0] - u_torsion[1] #headers = ['axial', 'SMa', 'torsion', 'SMt'] mat = prop.mid_ref L = np.linalg.norm(dxyz12) G = mat.G() E = elem.E() axial_strain = du_axial / L torsional_strain = du_torsion / L axial_stress = E * axial_strain torsional_stress = G * torsional_strain return axial_stress, np.nan, torsional_stress, np.nan
def _recover_straini_cbar(model: BDF, xb: NDArrayNfloat, dof_map, elem: CBAR, prop: Union[PBAR, PBARL], fdtype='float64'): """get the static bar strain""" nid1, nid2 = elem.nodes # axial i1 = dof_map[(nid1, 1)] j1 = dof_map[(nid2, 1)] q_all = np.hstack([ xb[i1:i1 + 6], xb[j1:j1 + 6], ]) print(len(xb[i1:i1 + 3], )) q_axial = np.hstack([ xb[i1:i1 + 3], xb[j1:j1 + 3], ]) print(q_axial) q_torsion = np.hstack([ xb[i1 + 3:i1 + 6], xb[j1 + 3:j1 + 6], ]) #{F} = [K]{u} nid1, nid2 = elem.nodes is_passed, Ke = ke_cbar(model, elem, fdtype=fdtype) assert is_passed pid_ref = elem.pid_ref mat = pid_ref.mid_ref #is_passed, (wa, wb, ihat, jhat, khat) = elem.get_axes(model) #T = np.vstack([ihat, jhat, khat]) #z = np.zeros((3, 3), dtype='float64') prop = elem.pid_ref #mat = prop.mid_ref I1 = prop.I11() I2 = prop.I22() A = prop.Area() J = prop.J() unused_I12 = prop.I12() Fe = Ke @ q_all (Fx1, Fy1, Fz1, Mx1, My1, Mz1, Fx2, Fy2, Fz2, Mx2, My2, Mz2) = Fe s_axial = Fx1 / A s_torsion = Mx1 / J xyz1 = elem.nodes_ref[0].get_position() xyz2 = elem.nodes_ref[1].get_position() #dxyz12 = xyz1 - xyz2 #Lambda = lambda1d(dxyz12, debug=False) #u_axial = Lambda @ q_axial #u_torsion = Lambda @ q_torsion #du_axial = u_axial[0] - u_axial[1] #du_torsion = u_torsion[0] - u_torsion[1] xyz1 = elem.nodes_ref[0].get_position() xyz2 = elem.nodes_ref[1].get_position() dxyz12 = xyz1 - xyz2 L = np.linalg.norm(dxyz12) Lambda = lambda1d(dxyz12, debug=False) u_axial = Lambda @ q_axial u_torsion = Lambda @ q_torsion du_axial = u_axial[0] - u_axial[1] du_torsion = u_torsion[0] - u_torsion[1] axial = du_axial / L # cdef = prop.get_cdef() if prop.type == 'PBARL': # these axes are backwards... # ^ y # +---|---+ # | | | # | +------> z # | | # +-------+ if prop.Type in ['ROD', 'TUBE']: R = prop.dims[0] cdef = np.array([ [R, 0.], [0., R], [-R, 0.], [0., -R], ], dtype='float64') elif prop.Type in ['BAR', 'BOX']: height, width = prop.dims cdef = np.array([ [width, height], [width, -height], [-width, -height], [-width, height], ], dtype='float64') / 2. else: raise NotImplementedError(prop.Type) elif prop.type == 'PBAR': cdef = np.array([ [prop.c1, prop.c2], [prop.d1, prop.d2], [prop.e1, prop.e2], [prop.f1, prop.f2], ], dtype='float64') else: raise NotImplementedError(prop.get_stats()) model.log.info(f'cdef: {cdef}\n') Iy = I1 Iz = I2 G = mat.G() E = mat.E() strains = [] for (T, My, Mz) in [(Mx1, My1, Mz1), (Mx2, My2, Mz2)]: for yz in cdef: y, z = yz radius = np.linalg.norm(yz) unused_torsional_stress = (T * radius) / J unused_phi = (T * L) / (G * J) stress = My * y / Iy + Mz * z / Iy strain = stress / E strains.append(strain) s1a = strains[0] s2a = strains[1] s3a = strains[2] s4a = strains[3] s1b = strains[4] s2b = strains[5] s3b = strains[6] s4b = strains[7] smaxa = max(s1a, s2a, s3a, s4a) smaxb = max(s1b, s2b, s3b, s4b) smina = min(s1a, s2a, s3a, s4a) sminb = min(s1b, s2b, s3b, s4b) MS_tension = MS_compression = np.nan out = (s1a, s2a, s3a, s4a, axial, smaxa, smina, MS_tension, s1b, s2b, s3b, s4b, sminb, sminb, MS_compression) # 15 return out