Using python library mapdl extract Eequivalent stress of the result(file.rst)?
Erubus
Member Posts: 7
**
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
def extract_displacement(self: rst.Result, rsets=None): if rsets is None: rsets = range(self.nsets) elif isinstance(rsets, int): rsets = [rsets] elif not isinstance(rsets, rst.Iterable): raise TypeError("rsets must be an iterable like [0, 1, 2] or range(3)") displacement_data = {} for i in rsets: nnum, disp = self.nodal_displacement(i) # total displacement total_displacement = np.sqrt(np.sum(disp ** 2, axis=1)) # max and min max_displacement = np.max(total_displacement) min_displacement = np.min(total_displacement) # x、y、z component displacement max_x = np.max(disp[:, 0]) min_x = np.min(disp[:, 0]) max_y = np.max(disp[:, 1]) min_y = np.min(disp[:, 1]) max_z = np.max(disp[:, 2]) min_z = np.min(disp[:, 2]) # write to file displacement_data[i] = { "total": { "max": max_displacement, "min": min_displacement, }, "x": { "max": max_x, "min": min_x, }, "y": { "max": max_y, "min": min_y, }, "z": { "max": max_z, "min": min_z, }, } # export displacement picture result.plot_nodal_displacement( i, screenshot='displacement_{}.png'.format(i), show_displacement=True, window_size=[800, 600], interactive=False ) with open('displacement.json', 'w') as json_file: json.dump(displacement_data, json_file, indent=4) return
stress.py
def extract_stress(self: rst.Result, rsets=None): if rsets is None: rsets = range(self.nsets) elif isinstance(rsets, int): rsets = [rsets] elif not isinstance(rsets, rst.Iterable): raise TypeError("rsets must be an iterable like [0, 1, 2] or range(3)") stress_data = {} for i in rsets: max_sigma1 = max_sigma2 = max_sigma3 = max_sint = max_seqv = float('-inf') enum, element_stresses, enode = self.element_stress(i, principal=True) if element_stresses is None or not any(np.isfinite(stress).any() for stress in element_stresses): print(f"No valid stress data available for result set {i}.") continue for stress_array in element_stresses: if np.isnan(stress_array).all(): continue max_sigma1 = max(max_sigma1, np.max(stress_array[:, 0])) max_sigma2 = max(max_sigma2, np.max(stress_array[:, 1])) max_sigma3 = max(max_sigma3, np.max(stress_array[:, 2])) max_sint = max(max_sint, np.max(stress_array[:, 3])) max_seqv = max(max_seqv, np.max(stress_array[:, 4])) # save map stress_data[i] = { "max_sigma1": max_sigma1, "max_sigma2": max_sigma2, "max_sigma3": max_sigma3, "max_sint": max_sint, "max_seqv": max_seqv } # export stress picture for comp in ["X", "Y", "Z", "XY", "XZ", "YZ"]: self.plot_nodal_stress( i, comp=comp, screenshot='stress_{}_{}.png'.format(i, comp), show_displacement=True, window_size=[800, 600], interactive=False ) # export json with open('stress.json', 'w') as json_file: json.dump(stress_data, json_file, indent=4) return
I look forward to hearing from you. Thank you.
0
Answers
-
@Erubus Averaging technique would make the difference when it comes to stress. We have an operator which gives you eqv stress same as mechanical (https://dpf.docs.pyansys.com/version/0.12/api/ansys.dpf.core.operators.result.stress_eqv_as_mechanical.html#stress-eqv-as-mechanical). This is available 2023R2 onwards.
0