Using python library mapdl extract Eequivalent stress of the result(file.rst)?

Member Posts: 7
Name Dropper First Comment
**
edited April 2024 in Structures

I used the following code to extract the equivalent stress and displacement. Currently, the displacement can correspond to the workbench data, but the equivalent stress is not. May I ask if there is a problem with my extraction code? The code is as follows:

displacement.py

  1. def extract_displacement(self: rst.Result, rsets=None):
  2. if rsets is None:
  3. rsets = range(self.nsets)
  4. elif isinstance(rsets, int):
  5. rsets = [rsets]
  6. elif not isinstance(rsets, rst.Iterable):
  7. raise TypeError("rsets must be an iterable like [0, 1, 2] or range(3)")
  8.  
  9. displacement_data = {}
  10.  
  11. for i in rsets:
  12. nnum, disp = self.nodal_displacement(i)
  13.  
  14. # total displacement
  15. total_displacement = np.sqrt(np.sum(disp ** 2, axis=1))
  16. # max and min
  17. max_displacement = np.max(total_displacement)
  18. min_displacement = np.min(total_displacement)
  19.  
  20. # x、y、z component displacement
  21. max_x = np.max(disp[:, 0])
  22. min_x = np.min(disp[:, 0])
  23. max_y = np.max(disp[:, 1])
  24. min_y = np.min(disp[:, 1])
  25. max_z = np.max(disp[:, 2])
  26. min_z = np.min(disp[:, 2])
  27.  
  28. # write to file
  29. displacement_data[i] = {
  30. "total": {
  31. "max": max_displacement,
  32. "min": min_displacement,
  33. },
  34. "x": {
  35. "max": max_x,
  36. "min": min_x,
  37. },
  38. "y": {
  39. "max": max_y,
  40. "min": min_y,
  41. },
  42. "z": {
  43. "max": max_z,
  44. "min": min_z,
  45. },
  46. }
  47.  
  48. # export displacement picture
  49. result.plot_nodal_displacement(
  50. i,
  51. screenshot='displacement_{}.png'.format(i),
  52. show_displacement=True,
  53. window_size=[800, 600],
  54. interactive=False
  55. )
  56.  
  57. with open('displacement.json', 'w') as json_file:
  58. json.dump(displacement_data, json_file, indent=4)
  59.  
  60. return

stress.py

  1. def extract_stress(self: rst.Result, rsets=None):
  2. if rsets is None:
  3. rsets = range(self.nsets)
  4. elif isinstance(rsets, int):
  5. rsets = [rsets]
  6. elif not isinstance(rsets, rst.Iterable):
  7. raise TypeError("rsets must be an iterable like [0, 1, 2] or range(3)")
  8.  
  9. stress_data = {}
  10. for i in rsets:
  11. max_sigma1 = max_sigma2 = max_sigma3 = max_sint = max_seqv = float('-inf')
  12. enum, element_stresses, enode = self.element_stress(i, principal=True)
  13.  
  14. if element_stresses is None or not any(np.isfinite(stress).any() for stress in element_stresses):
  15. print(f"No valid stress data available for result set {i}.")
  16. continue
  17.  
  18. for stress_array in element_stresses:
  19. if np.isnan(stress_array).all():
  20. continue
  21.  
  22. max_sigma1 = max(max_sigma1, np.max(stress_array[:, 0]))
  23. max_sigma2 = max(max_sigma2, np.max(stress_array[:, 1]))
  24. max_sigma3 = max(max_sigma3, np.max(stress_array[:, 2]))
  25. max_sint = max(max_sint, np.max(stress_array[:, 3]))
  26. max_seqv = max(max_seqv, np.max(stress_array[:, 4]))
  27.  
  28. # save map
  29. stress_data[i] = {
  30. "max_sigma1": max_sigma1,
  31. "max_sigma2": max_sigma2,
  32. "max_sigma3": max_sigma3,
  33. "max_sint": max_sint,
  34. "max_seqv": max_seqv
  35. }
  36.  
  37. # export stress picture
  38. for comp in ["X", "Y", "Z", "XY", "XZ", "YZ"]:
  39. self.plot_nodal_stress(
  40. i,
  41. comp=comp,
  42. screenshot='stress_{}_{}.png'.format(i, comp),
  43. show_displacement=True,
  44. window_size=[800, 600],
  45. interactive=False
  46. )
  47. # export json
  48. with open('stress.json', 'w') as json_file:
  49. json.dump(stress_data, json_file, indent=4)
  50.  
  51. return

I look forward to hearing from you. Thank you.

Answers

Welcome!

It looks like you're new here. Sign in or register to get started.