From 75488f640e0035d4abce3b936fb863ff7a712e60 Mon Sep 17 00:00:00 2001 From: AirbornePanda Date: Sat, 30 May 2026 21:21:42 +0100 Subject: [PATCH 1/5] Add files via upload --- openradioss_gui/runopenradioss.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openradioss_gui/runopenradioss.py b/openradioss_gui/runopenradioss.py index 4574832..9afdc7e 100644 --- a/openradioss_gui/runopenradioss.py +++ b/openradioss_gui/runopenradioss.py @@ -422,7 +422,7 @@ def convert_th_to_csv(self): th_to_csv_exec =os.path.join("exec","th_to_csv_"+self.arch+self.bin_extension) thtocsv_command = [ os.path.join(self.openradioss_path, th_to_csv_exec), - os.path.join(self.running_directory, th_file) ] + th_file ] # Redirect the output to the th-csv converter subprocess.run(thtocsv_command, env=self.custom_env, cwd=self.running_directory) From 5d8118ec1550e1d60bb278d444f5809c3c17ef38 Mon Sep 17 00:00:00 2001 From: AirbornePanda Date: Sat, 6 Jun 2026 14:55:07 +0100 Subject: [PATCH 2/5] Fix anim_to_vtk tensor off-diagonal output --- output_converters/anim_to_vtk/src/anim_to_vtk.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/output_converters/anim_to_vtk/src/anim_to_vtk.cpp b/output_converters/anim_to_vtk/src/anim_to_vtk.cpp index 4ac4446..fdefed9 100644 --- a/output_converters/anim_to_vtk/src/anim_to_vtk.cpp +++ b/output_converters/anim_to_vtk/src/anim_to_vtk.cpp @@ -1470,9 +1470,9 @@ void readRadiossAnim(char *fileName) } for (int iel = 0; iel < nbElts3D; iel++) { - cout << tensVal3DA[(iel * 6) + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 3 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 4 + (ietens * 6 * nbElts3D)] << "\n"; - cout << tensVal3DA[(iel * 6) + 3 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 1 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 5 + (ietens * 6 * nbElts3D)] << "\n"; - cout << tensVal3DA[(iel * 6) + 4 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 5 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 2 + (ietens * 6 * nbElts3D)] << "\n"; + cout << tensVal3DA[(iel * 6) + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 3 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 5 + (ietens * 6 * nbElts3D)] << "\n"; + cout << tensVal3DA[(iel * 6) + 3 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 1 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 4 + (ietens * 6 * nbElts3D)] << "\n"; + cout << tensVal3DA[(iel * 6) + 5 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 4 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 2 + (ietens * 6 * nbElts3D)] << "\n"; } for (int iel = 0; iel < nbEltsSPH; iel++) { @@ -1572,9 +1572,9 @@ void readRadiossAnim(char *fileName) } for (int iel = 0; iel < nbEltsSPH; iel++) { - cout << tensValSPH[(iel * 6) + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 3 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 4 + (ietens * 6 * nbEltsSPH)] << "\n"; - cout << tensValSPH[(iel * 6) + 3 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 1 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 5 + (ietens * 6 * nbEltsSPH)] << "\n"; - cout << tensValSPH[(iel * 6) + 4 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 5 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 2 + (ietens * 6 * nbEltsSPH)] << "\n"; + cout << tensValSPH[(iel * 6) + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 3 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 5 + (ietens * 6 * nbEltsSPH)] << "\n"; + cout << tensValSPH[(iel * 6) + 3 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 1 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 4 + (ietens * 6 * nbEltsSPH)] << "\n"; + cout << tensValSPH[(iel * 6) + 5 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 4 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 2 + (ietens * 6 * nbEltsSPH)] << "\n"; } cout << "\n"; } From 1a78f1935cf2a2b31ed470a4c1018787d6e8facb Mon Sep 17 00:00:00 2001 From: AirbornePanda Date: Sat, 6 Jun 2026 15:21:24 +0100 Subject: [PATCH 3/5] Document tensor stress extraction --- output_converters/anim_to_vtk/README.md | 35 +++++++++++++++++++ .../anim_to_vtk/src/anim_to_vtk.cpp | 4 +++ 2 files changed, 39 insertions(+) diff --git a/output_converters/anim_to_vtk/README.md b/output_converters/anim_to_vtk/README.md index 8d7ba45..bbeaae4 100644 --- a/output_converters/anim_to_vtk/README.md +++ b/output_converters/anim_to_vtk/README.md @@ -55,4 +55,39 @@ Following Linux bash script can be used to convert all files in a single task: ${OpenRadioss_root}/exec/anim_to_vtk_linuxa64_gf $file > ${Rootname}_${animation_number}.vtk done + +## Checking tensor stress output + +To reproduce the tensor-ordering issue, run an OpenRadioss model that requests +brick stress tensors in the Engine file, for example: + + /ANIM/BRICK/TENS/STRESS + +After the simulation writes animation files (`[Deck Rootname]A001`, +`[Deck Rootname]A002`, ...), convert one animation file to legacy VTK: + + ./anim_to_vtk_linux64_gf [Deck Rootname]A001 > [Deck Rootname]_001.vtk + +The converted file contains `TENSORS` blocks. For a 3D element stress tensor, +look for a block such as `TENSORS 3DELEM_STRESS float`. Each cell tensor is +printed as three consecutive rows. With the anim tensor component order +`xx, yy, zz, xy, yz, zx`, the expected symmetric matrix is: + + xx xy zx + xy yy yz + zx yz zz + +To print the first non-zero 3D element stress matrix from a converted file: + + awk -v tensor="3DELEM_STRESS" ' + $1 == "TENSORS" && $2 == tensor { in_tensor = 1; next } + in_tensor && NF == 3 && ($1 != 0 || $2 != 0 || $3 != 0) { + print; getline; print; getline; print; exit + } + ' [Deck Rootname]_001.vtk + +If the previous converter output showed the `yz` value in the first/third +off-diagonal positions and the `zx` value in the second/third off-diagonal +positions, the components were swapped. + In Paraview, the vtk files are bundled and can be loaded in one step. diff --git a/output_converters/anim_to_vtk/src/anim_to_vtk.cpp b/output_converters/anim_to_vtk/src/anim_to_vtk.cpp index fdefed9..56490fe 100644 --- a/output_converters/anim_to_vtk/src/anim_to_vtk.cpp +++ b/output_converters/anim_to_vtk/src/anim_to_vtk.cpp @@ -1468,6 +1468,8 @@ void readRadiossAnim(char *fileName) << "0 " << "\n"; } + // Animation tensors are stored as xx, yy, zz, xy, yz, zx. + // Legacy VTK TENSORS requires the full 3x3 symmetric matrix. for (int iel = 0; iel < nbElts3D; iel++) { cout << tensVal3DA[(iel * 6) + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 3 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 5 + (ietens * 6 * nbElts3D)] << "\n"; @@ -1570,6 +1572,8 @@ void readRadiossAnim(char *fileName) << "0 " << "\n"; } + // Animation tensors are stored as xx, yy, zz, xy, yz, zx. + // Legacy VTK TENSORS requires the full 3x3 symmetric matrix. for (int iel = 0; iel < nbEltsSPH; iel++) { cout << tensValSPH[(iel * 6) + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 3 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 5 + (ietens * 6 * nbEltsSPH)] << "\n"; From cc1c18721192acf4a7d76401ae76458ea7d7d645 Mon Sep 17 00:00:00 2001 From: AirbornePanda Date: Tue, 9 Jun 2026 00:23:06 +0100 Subject: [PATCH 4/5] Revert "Correct tensor off-diagonal ordering in anim_to_vtk output" --- output_converters/anim_to_vtk/README.md | 35 ------------------- .../anim_to_vtk/src/anim_to_vtk.cpp | 16 ++++----- 2 files changed, 6 insertions(+), 45 deletions(-) diff --git a/output_converters/anim_to_vtk/README.md b/output_converters/anim_to_vtk/README.md index bbeaae4..8d7ba45 100644 --- a/output_converters/anim_to_vtk/README.md +++ b/output_converters/anim_to_vtk/README.md @@ -55,39 +55,4 @@ Following Linux bash script can be used to convert all files in a single task: ${OpenRadioss_root}/exec/anim_to_vtk_linuxa64_gf $file > ${Rootname}_${animation_number}.vtk done - -## Checking tensor stress output - -To reproduce the tensor-ordering issue, run an OpenRadioss model that requests -brick stress tensors in the Engine file, for example: - - /ANIM/BRICK/TENS/STRESS - -After the simulation writes animation files (`[Deck Rootname]A001`, -`[Deck Rootname]A002`, ...), convert one animation file to legacy VTK: - - ./anim_to_vtk_linux64_gf [Deck Rootname]A001 > [Deck Rootname]_001.vtk - -The converted file contains `TENSORS` blocks. For a 3D element stress tensor, -look for a block such as `TENSORS 3DELEM_STRESS float`. Each cell tensor is -printed as three consecutive rows. With the anim tensor component order -`xx, yy, zz, xy, yz, zx`, the expected symmetric matrix is: - - xx xy zx - xy yy yz - zx yz zz - -To print the first non-zero 3D element stress matrix from a converted file: - - awk -v tensor="3DELEM_STRESS" ' - $1 == "TENSORS" && $2 == tensor { in_tensor = 1; next } - in_tensor && NF == 3 && ($1 != 0 || $2 != 0 || $3 != 0) { - print; getline; print; getline; print; exit - } - ' [Deck Rootname]_001.vtk - -If the previous converter output showed the `yz` value in the first/third -off-diagonal positions and the `zx` value in the second/third off-diagonal -positions, the components were swapped. - In Paraview, the vtk files are bundled and can be loaded in one step. diff --git a/output_converters/anim_to_vtk/src/anim_to_vtk.cpp b/output_converters/anim_to_vtk/src/anim_to_vtk.cpp index 56490fe..4ac4446 100644 --- a/output_converters/anim_to_vtk/src/anim_to_vtk.cpp +++ b/output_converters/anim_to_vtk/src/anim_to_vtk.cpp @@ -1468,13 +1468,11 @@ void readRadiossAnim(char *fileName) << "0 " << "\n"; } - // Animation tensors are stored as xx, yy, zz, xy, yz, zx. - // Legacy VTK TENSORS requires the full 3x3 symmetric matrix. for (int iel = 0; iel < nbElts3D; iel++) { - cout << tensVal3DA[(iel * 6) + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 3 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 5 + (ietens * 6 * nbElts3D)] << "\n"; - cout << tensVal3DA[(iel * 6) + 3 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 1 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 4 + (ietens * 6 * nbElts3D)] << "\n"; - cout << tensVal3DA[(iel * 6) + 5 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 4 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 2 + (ietens * 6 * nbElts3D)] << "\n"; + cout << tensVal3DA[(iel * 6) + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 3 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 4 + (ietens * 6 * nbElts3D)] << "\n"; + cout << tensVal3DA[(iel * 6) + 3 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 1 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 5 + (ietens * 6 * nbElts3D)] << "\n"; + cout << tensVal3DA[(iel * 6) + 4 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 5 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 2 + (ietens * 6 * nbElts3D)] << "\n"; } for (int iel = 0; iel < nbEltsSPH; iel++) { @@ -1572,13 +1570,11 @@ void readRadiossAnim(char *fileName) << "0 " << "\n"; } - // Animation tensors are stored as xx, yy, zz, xy, yz, zx. - // Legacy VTK TENSORS requires the full 3x3 symmetric matrix. for (int iel = 0; iel < nbEltsSPH; iel++) { - cout << tensValSPH[(iel * 6) + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 3 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 5 + (ietens * 6 * nbEltsSPH)] << "\n"; - cout << tensValSPH[(iel * 6) + 3 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 1 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 4 + (ietens * 6 * nbEltsSPH)] << "\n"; - cout << tensValSPH[(iel * 6) + 5 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 4 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 2 + (ietens * 6 * nbEltsSPH)] << "\n"; + cout << tensValSPH[(iel * 6) + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 3 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 4 + (ietens * 6 * nbEltsSPH)] << "\n"; + cout << tensValSPH[(iel * 6) + 3 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 1 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 5 + (ietens * 6 * nbEltsSPH)] << "\n"; + cout << tensValSPH[(iel * 6) + 4 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 5 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 2 + (ietens * 6 * nbEltsSPH)] << "\n"; } cout << "\n"; } From 9f1d3e399a73b956c9b2b5066d98da44f7c36a97 Mon Sep 17 00:00:00 2001 From: AirbornePanda Date: Tue, 9 Jun 2026 00:33:16 +0100 Subject: [PATCH 5/5] Remove tensor ordering comments --- output_converters/anim_to_vtk/src/anim_to_vtk.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/output_converters/anim_to_vtk/src/anim_to_vtk.cpp b/output_converters/anim_to_vtk/src/anim_to_vtk.cpp index 4ac4446..fdefed9 100644 --- a/output_converters/anim_to_vtk/src/anim_to_vtk.cpp +++ b/output_converters/anim_to_vtk/src/anim_to_vtk.cpp @@ -1470,9 +1470,9 @@ void readRadiossAnim(char *fileName) } for (int iel = 0; iel < nbElts3D; iel++) { - cout << tensVal3DA[(iel * 6) + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 3 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 4 + (ietens * 6 * nbElts3D)] << "\n"; - cout << tensVal3DA[(iel * 6) + 3 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 1 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 5 + (ietens * 6 * nbElts3D)] << "\n"; - cout << tensVal3DA[(iel * 6) + 4 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 5 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 2 + (ietens * 6 * nbElts3D)] << "\n"; + cout << tensVal3DA[(iel * 6) + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 3 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 5 + (ietens * 6 * nbElts3D)] << "\n"; + cout << tensVal3DA[(iel * 6) + 3 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 1 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 4 + (ietens * 6 * nbElts3D)] << "\n"; + cout << tensVal3DA[(iel * 6) + 5 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 4 + (ietens * 6 * nbElts3D)] << " " << tensVal3DA[(iel * 6) + 2 + (ietens * 6 * nbElts3D)] << "\n"; } for (int iel = 0; iel < nbEltsSPH; iel++) { @@ -1572,9 +1572,9 @@ void readRadiossAnim(char *fileName) } for (int iel = 0; iel < nbEltsSPH; iel++) { - cout << tensValSPH[(iel * 6) + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 3 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 4 + (ietens * 6 * nbEltsSPH)] << "\n"; - cout << tensValSPH[(iel * 6) + 3 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 1 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 5 + (ietens * 6 * nbEltsSPH)] << "\n"; - cout << tensValSPH[(iel * 6) + 4 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 5 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 2 + (ietens * 6 * nbEltsSPH)] << "\n"; + cout << tensValSPH[(iel * 6) + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 3 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 5 + (ietens * 6 * nbEltsSPH)] << "\n"; + cout << tensValSPH[(iel * 6) + 3 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 1 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 4 + (ietens * 6 * nbEltsSPH)] << "\n"; + cout << tensValSPH[(iel * 6) + 5 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 4 + (ietens * 6 * nbEltsSPH)] << " " << tensValSPH[(iel * 6) + 2 + (ietens * 6 * nbEltsSPH)] << "\n"; } cout << "\n"; }