I would also assume that! Therefore, I integrated the following code into my program:
def perform_weld_seam_stress_verification(RFEM_app, lc_no, Node1, Node2):
"""searches for weld seam stresses in FE nodes per load case per weld seam and outputs the design value tau_parallel"""
filters_Welds = [
rfem.results.ResultsFilter(
column_id="FE_NODE_NO",
filter_expression= FENODES
)
]
Weldresults = rfem_app.get_results(
results_type=rfem.results.ResultsType.STATIC_ANALYSIS_SURFACES_BASIC_STRESSES_MESH_NODES,
filters=filters_Welds
).data
df_node1 = Weldresults[
(Weldresults["mesh_node_no"] == Node1) &
(Weldresults["loading"] == lc_no)
]
df_node2 = Weldresults[
(Weldresults["mesh_node_no"] == Node2) &
(Weldresults["loading"] == lc_no)
]
# 👉 Extract values per tag
Mesh_Node_1_tau_xy = df_node1[df_node1["tag"] == "top"]["tau_xy"].iloc[0]
Mesh_Node_1_tau_xz = df_node1[df_node1["tag"] == "middle"]["tau_xz"].iloc[0]
Mesh_Node_1_sigma_x = df_node1[df_node1["tag"] == "top"]["sigma_x"].iloc[0]
Mesh_Node_2_tau_xy = df_node2[df_node2["tag"] == "top"]["tau_xy"].iloc[0]
Mesh_Node_2_tau_xz = df_node2[df_node2["tag"] == "middle"]["tau_xz"].iloc[0]
Mesh_Node_2_sigma_x = df_node2[df_node2["tag"] == "top"]["sigma_x"].iloc[0]
tau_xy_Stresspoint_1 = calculate_average(Mesh_Node_1_tau_xy, Mesh_Node_2_tau_xy)
tau_xz_Stresspoint_1 = calculate_average(Mesh_Node_1_tau_xz, Mesh_Node_2_tau_xz)
sigma_x_Stresspoint_1 = calculate_average(Mesh_Node_1_sigma_x, Mesh_Node_2_sigma_x)
# Calculation of flank stresses
Flank_normal_stress = sigma_x_Stresspoint_1*0.70710678 + tau_xz_Stresspoint_1*0.70710678
Flank_comparative_stress = (2*(sigma_x_Stresspoint_1 ** 2 - sigma_x_Stresspoint_1 * tau_xz_Stresspoint_1 + tau_xz_Stresspoint_1 ** 2) + 3 * tau_xy_Stresspoint_1 ** 2) ** 0.5
# Utilization ratios
eta_Weld_sigma = Flank_normal_stress / sigmaw_sigma_Rd
eta_Weld_v = Flank_comparative_stress / sigmawvRd
return tau_xy_Stresspoint_1, tau_xz_Stresspoint_1, sigma_x_Stresspoint_1, Flank_normal_stress, Flank_comparative_stress, eta_Weld_sigma, eta_Weld_v
=> My FE mesh in the weld seams is always structured so that there are 2 FE nodes, i.e., Node1 and Node2, across the width of the surface, which together form 1 stress point that consequently outputs the same value as a result section would.
I fear that we might be talking past each other because it is completely clear to me that the relevant stresses cannot be directly read from the basic stresses, hence the following line of my code that determines the relevant stresses:
Calculation of flank stresses
Flank_normal_stress = sigma_x_Stresspoint_1*0.70710678 + tau_xz_Stresspoint_1*0.70710678
Flank_comparative_stress = (2*(sigma_x_Stresspoint_1 ** 2 - sigma_x_Stresspoint_1 * tau_xz_Stresspoint_1 + tau_xz_Stresspoint_1 ** 2) + 3 * tau_xy_Stresspoint_1 ** 2) ** 0.5
What concerns me here is the stress tau_parallel entering the calculation. According to both my logic and the diagram attached showing the stress components of the weld seam material:

tau_parallel would be set here as tau_xy.
=> Unfortunately, in the design details of the addon, I do not get the matching tau_parallel values corresponding to the tau_xy values from the result sections of the associated submodels (see files above).
If it should be the case that I am not allowed to use tau_xy directly as the variable tau_xy_Stresspoint_1 for calculating the relevant flank comparative stress:
Flank_comparative_stress = (2*(sigma_x_Stresspoint_1 ** 2 - sigma_x_Stresspoint_1 * tau_xz_Stresspoint_1 + tau_xz_Stresspoint_1 ** 2) + 3 * tau_xy_Stresspoint_1 ** 2) ** 0.5
Then it would be great if you could clarify how tau_parallel is not derived solely from tau_xy but depends on the other stress components, preferably with references to literature / FAQ / knowledge base articles or similar.
Edit: I am aware that the differently set tag search by layer side seems somewhat arbitrary, but ultimately it is irrelevant for the weld seams since their stresses are constant through the thickness at each FE node... please just ignore that.