Inhaltsverzeichnis

Variables

This chapter is describing the available variables and their basis.

material properties

moment of inertia $$ Iy = pi \frac{(Do^4 - Di^4)}{64} $$ $$ Iz = Iy $$

torsional constant in cm⁴ $$ J = pi \frac{(Do^4 - Di^4)}{32} $$

cross-sectional area in cm² $$ A = ((pi * (Do*0.5)^2) - (pi * (Di*0.5)^2)) $$

weight of profile in kg/m $$ kg_A = A*d * 0.1 $$

$$ ir = sqrt(\frac{Iy}{A}) $$

derived from PyNite

  1. L = truss_member.L()
  2. T = truss_member.T()

This basic forces are evaluated at 11 positions within each member for every calculated frame.

  1. axial = []
  2. moment_y = []
  3. moment_z = []
  4. shear_y = []
  5. shear_z = []
  6. torque = []
  7.  
  8. for i in range(11): # get the forces at 11 positions and
  9. x = L/10*i
  10.  
  11. axial_pos = truss_member.axial(x) * (-1) # Druckkraft minus
  12. axial.append(axial_pos)
  13.  
  14. moment_y_pos = truss_member.moment("My", x)
  15. moment_y.append(moment_y_pos)
  16.  
  17. moment_z_pos = truss_member.moment("Mz", x)
  18. moment_z.append(moment_z_pos)
  19.  
  20. shear_y_pos = truss_member.shear("Fy", x)
  21. shear_y.append(shear_y_pos)
  22.  
  23. shear_z_pos = truss_member.shear("Fz", x)
  24. shear_z.append(shear_z_pos)
  25.  
  26. torque_pos = truss_member.torque(x)
  27. torque.append(torque_pos)
  28.  
  29. member["axial"][frame] = axial
  30. member["moment_y"][frame] = moment_y
  31. member["moment_z"][frame] = moment_z
  32. member["shear_y"][frame] = shear_y
  33. member["shear_z"][frame] = shear_z
  34. member["torque"][frame] = torque

buckling

  1. # for round sections
  2. member["ir"][frame] = sqrt(J/A)
  3.  
  4. # modulus from the moments of area
  5. member["Wy"][frame] = member["Iy"][frame]/(Do/2)
  6.  
  7. # polar modulus of torsion
  8. member["WJ"][frame] = J/(Do/2)

calculation of the longitudinal stresses

  1. long_stress = []
  2. for i in range(11): # get the stresses at 11 positions and
  3. moment_h = sqrt(moment_y[i]**2+moment_z[i]**2)
  4. if axial[i] > 0:
  5. s = axial[i]/A + moment_h/member["Wy"][frame]
  6. else:
  7. s = axial[i]/A - moment_h/member["Wy"][frame]
  8. long_stress.append(s)
  9.  
  10. # get max stress of the beam
  11. # (can be positive or negative)
  12. member["long_stress"][frame] = long_stress
  13. member["max_long_stress"][frame] = basics.return_max_diff_to_zero(long_stress)

calculation of the shear stresses from shear force (always positive)

  1. tau_shear = []
  2. shear_h = []
  3. for i in range(11): # get the stresses at 11 positions and
  4. # shear_h
  5. s_h = sqrt(shear_y[i]**2+shear_z[i]**2)
  6. shear_h.append(s_h)
  7.  
  8. tau = 1.333 * s_h/A # for pipes
  9. tau_shear.append(tau)
  10.  
  11. member["shear_h"][frame] = shear_h
  12.  
  13. # get max shear stress of shear force of the beam
  14. # shear stress is mostly small compared to longitudinal
  15. # in common architectural usage and only importand with short beam lenght
  16. member["tau_shear"][frame] = tau_shear
  17. member["max_tau_shear"][frame] = max(tau_shear)

Calculation of the torsion stresses (always positiv)

  1. tau_torsion = []
  2. for i in range(11): # get the stresses at 11 positions and
  3. tau = abs(torque[i]/member["WJ"][frame])
  4. tau_torsion.append(tau)
  5.  
  6. # get max torsion stress of the beam
  7. member["tau_torsion"][frame] = tau_torsion
  8. member["max_tau_torsion"][frame] = max(tau_torsion)
  9.  
  10. # torsion stress is mostly small compared to longitudinal
  11. # in common architectural usage
  12.  
  13. # calculation of the shear stresses form shear force and torsion
  14. # (always positiv)
  15. sum_tau = []
  16. for i in range(11): # get the stresses at 11 positions and
  17. tau = tau_shear[i] + tau_torsion[i]
  18. sum_tau.append(tau)
  19.  
  20. member["sum_tau"][frame] = sum_tau
  21. member["max_sum_tau"][frame] = max(sum_tau)

combine shear and torque

  1. sigmav = []
  2. for i in range(11): # get the stresses at 11 positions and
  3. sv = sqrt(long_stress[i]**2 + 3*sum_tau[i]**2)
  4. sigmav.append(sv)
  5.  
  6. member["sigmav"][frame] = sigmav
  1. member["max_sigmav"][frame] = max(sigmav)

check out: http://www.bs-wiki.de/mediawiki/index.php?title=Festigkeitsberechnung

  1. member["sigma"][frame] = member["long_stress"][frame]
  2. member["max_sigma"][frame] = member["max_long_stress"][frame]

overstress

  1. member["overstress"][frame] = False
  2.  
  3. # check overstress and add 1.05 savety factor
  4. safety_factor = 1.05
  5. if abs(member["max_tau_shear"][frame]) > safety_factor*member["acceptable_shear"]:
  6. member["overstress"][frame] = True
  7.  
  8. if abs(member["max_tau_torsion"][frame]) > safety_factor*member["acceptable_torsion"]:
  9. member["overstress"][frame] = True
  10.  
  11. if abs(member["max_sigmav"][frame]) > safety_factor*member["acceptable_sigmav"]:
  12. member["overstress"][frame] = True
  13.  
  14. # buckling
  15. if member["axial"][frame][0] < 0: # nur für Druckstäbe, axial kann nicht flippen?
  16. member["lamda"][frame] = L*0.5/member["ir"][frame] # für eingespannte Stäbe ist die Knicklänge 0.5 der Stablänge L, Stablänge muss in cm sein !
  17. if member["lamda"][frame] > 20: # für lamda < 20 (kurze Träger) gelten die default-Werte)
  18. kn = member["knick_model"]
  19. function_to_run = poly1d(polyfit(material.kn_lamda, kn, 6))
  20. member["acceptable_sigma_buckling"][frame] = function_to_run(member["lamda"][frame])
  21. if member["lamda"][frame] > 250: # Schlankheit zu schlank
  22. member["overstress"][frame] = True
  23. if safety_factor*abs(member["acceptable_sigma_buckling"][frame]) > abs(member["max_sigma"][frame]): # Sigma
  24. member["overstress"][frame] = True
  25.  
  26. else:
  27. member["acceptable_sigma_buckling"][frame] = member["acceptable_sigma"]
  28.  
  29. # without buckling
  30. else:
  31. member["acceptable_sigma_buckling"][frame] = member["acceptable_sigma"]
  32. member["lamda"][frame] = None # to avoid missing KeyError
  33.  
  34.  
  35. if abs(member["max_sigma"][frame]) > safety_factor*member["acceptable_sigma"]:
  36. member["overstress"][frame] = True
  37.  
  38. ===== lever arm =====
  39.  
  40. lever_arm = []
  41. moment_h = []
  42. for i in range(11):
  43. # moment_h
  44. m_h = sqrt(moment_y[i]**2+moment_z[i]**2)
  45. moment_h.append(m_h)
  46.  
  47. # to avoid division by zero
  48. if member["axial"][frame][i] < 0.1:
  49. lv = m_h / 0.1
  50. else:
  51. lv = m_h / member["axial"][frame][i]
  52.  
  53. lv = abs(lv) # absolute highest value within member
  54. lever_arm.append(lv)
  55.  
  56. member["moment_h"][frame] = moment_h
  57. member["lever_arm"][frame] = lever_arm
  58. member["max_lever_arm"][frame] = max(lever_arm)

utilization

  1. member["utilization"][frame] = abs(member["max_long_stress"][frame] / member["acceptable_sigma_buckling"][frame])
  2.  
  3. # Einführung in die Technische Mechanik - Festigkeitslehre, H.Balke, Springer 2010
  4. normalkraft_energie=[]
  5. moment_energie=[]
  6. strain_energy = []
  7.  
  8. for i in range(10): # get the energie at 10 positions for 10 section
  9. # Berechnung der strain_energy für Normalkraft
  10. ne = (axial[i]**2)*(L/10)/(2*member["E"]*A)
  11. normalkraft_energie.append(ne)
  12.  
  13. # Berechnung der strain_energy für Moment
  14. moment_hq = moment_y[i]**2+moment_z[i]**2
  15. me = (moment_hq * L/10) / (member["E"] * member["Wy"][frame] * Do)
  16. moment_energie.append(me)
  17.  
  18. # Summe von Normalkraft und Moment-Verzerrunsenergie
  19. value = ne + me
  20. strain_energy.append(value)
  21.  
  22. member["strain_energy"][frame] = strain_energy
  23. member["normal_energy"][frame] = normalkraft_energie
  24. member["moment_energy"][frame] = moment_energie

deflection

  1. deflection = []
  2.  
  3. # --> taken from pyNite VisDeformedMember: https://github.com/JWock82/PyNite
  4. scale_factor = 10.0
  5.  
  6. cos_x = array([T[0,0:3]]) # Direction cosines of local x-axis
  7. cos_y = array([T[1,0:3]]) # Direction cosines of local y-axis
  8. cos_z = array([T[2,0:3]]) # Direction cosines of local z-axis
  9.  
  10. DY_plot = empty((0, 3))
  11. DZ_plot = empty((0, 3))
  12.  
  13. for i in range(11):
  14. # Calculate the local y-direction displacement
  15. dy_tot = truss_member.deflection('dy', L/10*i)
  16.  
  17. # Calculate the scaled displacement in global coordinates
  18. DY_plot = append(DY_plot, dy_tot*cos_y*scale_factor, axis=0)
  19.  
  20. # Calculate the local z-direction displacement
  21. dz_tot = truss_member.deflection('dz', L/10*i)
  22.  
  23. # Calculate the scaled displacement in global coordinates
  24. DZ_plot = append(DZ_plot, dz_tot*cos_z*scale_factor, axis=0)
  25.  
  26. # Calculate the local x-axis displacements at 20 points along the member's length
  27. DX_plot = empty((0, 3))
  28.  
  29. Xi = truss_member.i_node.X
  30. Yi = truss_member.i_node.Y
  31. Zi = truss_member.i_node.Z
  32.  
  33. for i in range(11):
  34. # Displacements in local coordinates
  35. dx_tot = [[Xi, Yi, Zi]] + (L/10*i + truss_member.deflection('dx', L/10*i)*scale_factor)*cos_x
  36.  
  37. # Magnified displacements in global coordinates
  38. DX_plot = append(DX_plot, dx_tot, axis=0)
  39.  
  40. # Sum the component displacements to obtain overall displacement
  41. D_plot = DY_plot + DZ_plot + DX_plot
  42.  
  43. # <-- taken from pyNite VisDeformedMember: https://github.com/JWock82/PyNite
  44.  
  45. # add to results
  46. for i in range(11):
  47. x = D_plot[i, 0] * 0.01
  48. y = D_plot[i, 1] * 0.01
  49. z = D_plot[i, 2] * 0.01
  50.  
  51. deflection.append([x,y,z])
  52.  
  53. member["deflection"][frame] = deflection