From abda7d85798833908353002958b97f16f7b99727 Mon Sep 17 00:00:00 2001 From: vnamdeo Date: Wed, 13 Aug 2025 14:40:52 +0530 Subject: [PATCH 01/17] New VM example on NRC Piping Benchmarks: NUREG/CR-1677 --- examples/verif-manual/vm-nr1677-01-1a.py | 401 +++++++++++++++++++++++ 1 file changed, 401 insertions(+) create mode 100644 examples/verif-manual/vm-nr1677-01-1a.py diff --git a/examples/verif-manual/vm-nr1677-01-1a.py b/examples/verif-manual/vm-nr1677-01-1a.py new file mode 100644 index 000000000..2cc0aa3cc --- /dev/null +++ b/examples/verif-manual/vm-nr1677-01-1a.py @@ -0,0 +1,401 @@ +# Copyright (C) 2022 - 2025 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +r""".. _ref_VM-NR6645-01-1-a: + +NRC Piping Benchmarks: NUREG/CR-1677: Volume 1, Benchmark Problem No. 1 +----------------------------------------------------------------------- +Problem description: + - The example problem contains Mechanical APDL solutions to NRC piping + benchmark problems taken from publications NUREG/CR-1677, Volumes 1. + The piping benchmark solutions given in NRC publications were obtained + by using a computer program EPIPE which is a modification of the widely + available program SAP IV specifically prepared to perform piping analyses. + + - The dynamic loading in this problem is induced by uniform earthquake + type excitation in the three spatial directions. The solutions are + determined by using the response spectrum method. + +Reference: + - P.Bezler, M. Hartzman & M. Reich,"Dynamic Analysis of Uniform Support + Motion Response Spectrum Method", (NUREG/CR-1677), Brookhaven National + Laboratory, August 1980, Problem 1, Pages 24-47. + +Analysis type(s): + - Modal Analysis ``ANTYPE=2`` + - Spectral Analysis ``ANTYPE=8`` + +Element type(s): + - Structural Mass Element (MASS21) + - 3-D 3-Node Pipe Element (PIPE289) + - 3-D 3-Node Elbow Element (ELBOW290) + +Model description: + - The model consists of a piping system with straight pipes and elbows. + - The system is subjected to uniform support motion in three spatial directions. + - The model is meshed using PIPE289 and ELBOW290 elements for the piping components + and MASS21 elements for point mass representation. + +Postprocessing: + - Frequencies obtained from modal solution. + - Maximum nodal displacements and rotations are extracted. + - Element forces and moments are calculated for specific elements. + - Reaction forces from the spectrum solution are obtained. +""" # noqa:E501 + +# Import the MAPDL module +# Ensure you have the ansys-mapdl-core package installed +# pip install ansys-mapdl-core +from ansys.mapdl.core import launch_mapdl + +# Launch MAPDL with a specific log level and print command output +# Adjust the loglevel and print_com parameters as needed +# Here, we set loglevel to "WARNING" to reduce verbosity and print_com to True to see commands +mapdl = launch_mapdl(loglevel="WARNING", print_com=True) + +mapdl.title("NRC Piping Benchmark Problems, Volume 1, Problem 1") + +# Clear any previous data in MAPDL +mapdl.clear() + +mapdl.prep7(mute=True) + +# PIPE289 using cubic shape function and Thick pipe theory. +# The pipe289 element is a 3-node pipe element with cubic shape functions. +# It is used to model straight pipes with bending and torsional effects. +mapdl.et(1, "pipe289") +mapdl.keyopt(1, 4, 2) + +# ELBOW290 using cubic shape function and number of Fourier terms = 6. +# The elbow290 element is a 3-node elbow element with cubic shape functions. +# It is used to model the bending of pipes at elbows. +mapdl.et(2, "elbow290", "", 6) + +# MASS21, 3-D Mass without Rotary Inertia +mapdl.et(3, "mass21") +mapdl.keyopt(3, 3, 2) + +# Real Constants +mapdl.sectype(1, "pipe") +mapdl.secdata(7.289, 0.241, 24) + +# Keypoints +mapdl.k(1, 0.0, 0.0, 0.0) +mapdl.k(2, 0.0, 54.45, 0.0) +mapdl.k(3, 0.0, 108.9, 0.0) +mapdl.k(4, 10.632, 134.568, 0.0) +mapdl.k(5, 36.3, 145.2, 0.0) +mapdl.k(6, 54.15, 145.2, 0.0) +mapdl.k(7, 72.0, 145.2, 0.0) +mapdl.k(8, 97.668, 145.2, 10.632) +mapdl.k(9, 108.3, 145.2, 36.3) +mapdl.k(10, 108.3, 145.2, 56.80) +mapdl.k(11, 108.3, 145.2, 77.3) + +mapdl.k(12, 2.7631, 122.79, 0) +mapdl.k(13, 22.408, 142.44, 0) +mapdl.k(14, 85.9, 145, 2.76) +mapdl.k(15, 106, 145, 22.4) + +# Straight Pipe (Tangent Elements) +mapdl.type(1) +mapdl.mat(1) +mapdl.secnum(1) +mapdl.real(1) + +mapdl.l(1, 2) +mapdl.l(2, 3) +mapdl.l(5, 6) +mapdl.l(6, 7) +mapdl.l(9, 10) +mapdl.l(10, 11) # Line number 6 + +# Bend Pipe Elements +mapdl.run("larch,3,4,12") # Line number 7 +mapdl.run("larch,4,5,13") +mapdl.run("larch,7,8,14") +mapdl.run("larch,8,9,15") # line number 10 + +mapdl.mp("ex", 1, 24e6) +mapdl.mp("nuxy", 1, 0.3) + +# Meshing for Straight pipe +mapdl.type(1) +mapdl.secnum(1) +mapdl.mat(1) + +mapdl.lsel("s", "line", "", 1, 6) +mapdl.allsel("below", "line") +mapdl.lesize("all", "", "", 2) +mapdl.lmesh("all") +mapdl.allsel("all", "all") + +# Meshing for bend pipe +mapdl.type(2) +mapdl.secnum(1) +mapdl.mat(1) + +mapdl.lsel("s", "", "", 7, 14) +mapdl.allsel("below", "line") +mapdl.lesize("all", "", "", 2) +mapdl.lmesh("all") +mapdl.allsel("all", "all") + +# Real constants for mass element +mapdl.r(12, 0.03988) +mapdl.r(13, 0.05032) +mapdl.r(14, 0.02088) +mapdl.r(15, 0.01698) +mapdl.r(16, 0.01307) +mapdl.r(17, 0.01698) +mapdl.r(18, 0.01044) +mapdl.r(19, 0.01795) +mapdl.r(20, 0.01501) + +# Mass Elements +mapdl.type(3) +mapdl.real(12) +mapdl.e(2) + +mapdl.real(13) +mapdl.e(6) + +mapdl.real(14) +mapdl.e(28) + +mapdl.real(15) +mapdl.e(10) + +mapdl.real(16) +mapdl.e(11) + +mapdl.real(17) +mapdl.e(15) + +mapdl.real(18) +mapdl.e(35) + +mapdl.real(19) +mapdl.e(19) + +mapdl.real(20) +mapdl.e(20) + +# Using ELBOW, to convert some PIPE289 into ELBOW290 +mapdl.elbow("on", "", "", "sect") + +mapdl.allsel("all", "all") +mapdl.eshape(scale="1.0", key="1") +mapdl.replot() +mapdl.eplot() + +# Constraints +mapdl.dk(1, "all", 0) +mapdl.dk(11, "all", 0) + +mapdl.allsel("all", "all") +mapdl.finish() +mapdl.save() + +# Solution Controls for Modal Solve +mapdl.slashsolu() +mapdl.antype("modal") + +# LANB mode extraction method +mapdl.modopt("lanb", 5) +mapdl.mxpand("", "", "", "yes") + +mapdl.solve() +mapdl.finish() +mapdl.save() + +mapdl.post1() + +# Frequencies from Modal solve +freq_list = mapdl.set("list") +print("Frequencies from Modal solve:", freq_list) + +mapdl.finish() + +# Solution Controls for Spectrum Solve +mapdl.slashsolu() + +# Perform Spectrum Analysis +mapdl.antype("spectr") + +# Single Point Excitation Response Spectrum +mapdl.spopt("sprs") + +# specify constant damping ratio for all modes +mapdl.dmprat(0.02) + +# Group Modes based on significance level +mapdl.grp(0.001) + +# Seismic Acceleration Response Loading +mapdl.svtyp(2) + +# Excitation along X direction +mapdl.sed(1) +mapdl.freq() +mapdl.freq(3.1, 4, 5, 5.81, 7.1, 8.77, 10.99, 14.08, 17.24) +mapdl.freq(25, 28.5, 30, 34.97, 55, 80, 140, 162, 588.93) +mapdl.sv(0.02, 400, 871, 871, 700, 1188, 1188, 440, 775, 775) +mapdl.sv(0.02, 533.2, 467.2, 443.6, 380, 289, 239.4, 192.6, 184.1, 145) +mapdl.solve() + +# Excitation along Y direction +mapdl.sed("", 1) +mapdl.freq() +mapdl.freq(3.1, 4, 5, 5.81, 7.1, 8.77, 10.99, 14.08, 17.24) +mapdl.freq(25, 28.5, 30, 34.97, 55, 80, 140, 162, 588.93) +mapdl.sv(0.02, 266.7, 580.7, 580.7, 466.7, 792, 792, 293.3, 516.7, 516.7) +mapdl.sv(0.02, 355.5, 311.5, 295.7, 253.3, 192.7, 159.6, 128.4, 122.7, 96.7) +mapdl.solve() + +# Excitation along Z direction +mapdl.sed("", "", 1) +mapdl.freq() +mapdl.freq(3.1, 4, 5, 5.81, 7.1, 8.77, 10.99, 14.08, 17.24) +mapdl.freq(25, 28.5, 30, 34.97, 55, 80, 140, 162, 588.93) +mapdl.sv(0.02, 400, 871, 871, 700, 1188, 1188, 440, 775, 775) +mapdl.sv(0.02, 533.2, 467.2, 443.6, 380, 289, 239.4, 192.6, 184.1, 145) + +mapdl.solve() +mapdl.finish() + +mapdl.post1() +mcom_file = mapdl.input("", "mcom") + +mapdl.get("AdisX", "NODE", 10, "U", "X") +mapdl.get("AdisY", "NODE", 36, "U", "Y") +mapdl.get("AdisZ", "NODE", 28, "U", "Z") +mapdl.get("ArotX", "NODE", 9, "ROT", "X") +mapdl.get("ArotY", "NODE", 18, "ROT", "Y") +mapdl.get("ArotZ", "NODE", 9, "ROT", "Z") + +# Maximum nodal displacements and rotations obtained from spectrum solution +adisx = mapdl.starstatus("AdisX") +adisy = mapdl.starstatus("AdisY") +adisz = mapdl.starstatus("AdisZ") +arotx = mapdl.starstatus("ArotX") +aroty = mapdl.starstatus("ArotY") +arotz = mapdl.starstatus("ArotZ") + +print("Maximum nodal displacements and rotations obtained from spectrum solution:") +print( + f"AdisX: {adisx},\n AdisY: {adisy},\n AdisZ: {adisz}\n" + f"ArotX: {arotx},\n ArotY: {aroty},\n ArotZ: {arotz}" +) + +# Element Forces and Moments obtained from spectrum solution for Node "I" + +# Element results extraction for element #12 (Pipe289 elements) + +mapdl.esel("s", "elem", "", 12) +mapdl.etable("pxi_12", "smisc", 1) +mapdl.etable("vyi_12", "smisc", 6) +mapdl.etable("vzi_12", "smisc", 5) +mapdl.etable("txi_12", "smisc", 4) +mapdl.etable("myi_12", "smisc", 2) +mapdl.etable("mzi_12", "smisc", 3) +mapdl.esel("all") + +# Element results extraction for element #14 (Elbow 290 elements) + +mapdl.esel("s", "elem", "", 14) + +mapdl.etable("pxi_14", "smisc", 1) +mapdl.etable("vyi_14", "smisc", 6) +mapdl.etable("vzi_14", "smisc", 5) +mapdl.etable("txi_14", "smisc", 4) +mapdl.etable("myi_14", "smisc", 2) +mapdl.etable("mzi_14", "smisc", 3) +mapdl.esel("all") + +# Element Forces and Moments obtained from spectrum solution for Node "J" + +# Element results extraction for element #12 (Pipe289 elements) + +mapdl.esel("s", "elem", "", 12) + +mapdl.etable("pxj_12", "smisc", 14) +mapdl.etable("vyj_12", "smisc", 19) +mapdl.etable("vzj_12", "smisc", 18) +mapdl.etable("txj_12", "smisc", 17) +mapdl.etable("myj_12", "smisc", 15) +mapdl.etable("mzj_12", "smisc", 16) +mapdl.esel("all") + +# Element results extraction for element #14 (Elbow 290 elements) + +mapdl.esel("s", "elem", "", 14) + +mapdl.etable("pxj_14", "smisc", 36) +mapdl.etable("vyj_14", "smisc", 41) +mapdl.etable("vzj_14", "smisc", 40) +mapdl.etable("txj_14", "smisc", 39) +mapdl.etable("myj_14", "smisc", 37) +mapdl.etable("mzj_14", "smisc", 38) +mapdl.esel("all") + +mapdl.allsel("all") +mapdl.run("/GOPR") + +# Element forces and moments at element 12, node "i" + +elem_forces_12i = mapdl.pretab( + "pxi_12", "vyi_12", "vzi_12", "txi_12", "myi_12", "mzi_12" +) +print("Element forces and moments at element 12, node i:", elem_forces_12i) + +# Element forces and moments at element 12, node "j" + +elem_forces_12j = mapdl.pretab( + "pxj_12", "vyj_12", "vzj_12", "txj_12", "myj_12", "mzj_12" +) +print("Element forces and moments at element 12, node j:", elem_forces_12j) + +# Element forces and moments at element 14, node "i" + +elem_forces_14i = mapdl.pretab( + "pxi_14", "vyi_14", "vzi_14", "txi_14", "myi_14", "mzi_14" +) +print("Element forces and moments at element 14, node i:", elem_forces_14i) + +# Element forces and moments at element 14, node "j" + +elem_forces_14j = mapdl.pretab( + "pxj_14", "vyj_14", "vzj_14", "txj_14", "myj_14", "mzj_14" +) +print("Element forces and moments at element 14, node i:", elem_forces_14j) + +# Reaction forces from spectrum solution + +reaction_force = mapdl.prrsol() +print("Reaction forces:", reaction_force) + +mapdl.finish() + +# Stop MAPDL. + +mapdl.exit() From 07e61180cc05b8d2be9ca8942066b0deee384612 Mon Sep 17 00:00:00 2001 From: vnamdeo Date: Thu, 21 Aug 2025 20:59:20 +0530 Subject: [PATCH 02/17] added more description and static image --- doc/source/_static/vm-nr1677-01-1a_setup.png | Bin 0 -> 27229 bytes examples/verif-manual/vm-nr1677-01-1a.py | 130 +++++++++++++++---- 2 files changed, 102 insertions(+), 28 deletions(-) create mode 100644 doc/source/_static/vm-nr1677-01-1a_setup.png diff --git a/doc/source/_static/vm-nr1677-01-1a_setup.png b/doc/source/_static/vm-nr1677-01-1a_setup.png new file mode 100644 index 0000000000000000000000000000000000000000..1adf262546eacb983433820eb9e2a4827a6c9277 GIT binary patch literal 27229 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 Date: Fri, 22 Aug 2025 16:05:51 +0530 Subject: [PATCH 03/17] Update examples/verif-manual/vm-nr1677-01-1a.py minor correction in the description Co-authored-by: German <28149841+germa89@users.noreply.github.com> --- examples/verif-manual/vm-nr1677-01-1a.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/verif-manual/vm-nr1677-01-1a.py b/examples/verif-manual/vm-nr1677-01-1a.py index 1286ffc6c..62da04f14 100644 --- a/examples/verif-manual/vm-nr1677-01-1a.py +++ b/examples/verif-manual/vm-nr1677-01-1a.py @@ -25,7 +25,8 @@ NRC Piping Benchmarks: NUREG/CR-1677: Volume 1, Benchmark Problem No. 1 ----------------------------------------------------------------------- Problem description: - - The example problem contains Mechanical APDL solutions to NRC piping + - The example problem contains Mechanical APDL solutions to + Nuclear Regulatory Commission piping benchmark problems taken from publications NUREG/CR-1677, Volumes 1. - The piping benchmark solutions given in NRC publications were obtained From 9374f4552824055d8d57772611c444c33e4d0457 Mon Sep 17 00:00:00 2001 From: Vikas Namdeo <126097319+vnamdeo@users.noreply.github.com> Date: Fri, 22 Aug 2025 16:07:01 +0530 Subject: [PATCH 04/17] Update examples/verif-manual/vm-nr1677-01-1a.py minor correction in the title Co-authored-by: German <28149841+germa89@users.noreply.github.com> --- examples/verif-manual/vm-nr1677-01-1a.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/verif-manual/vm-nr1677-01-1a.py b/examples/verif-manual/vm-nr1677-01-1a.py index 62da04f14..6f997b644 100644 --- a/examples/verif-manual/vm-nr1677-01-1a.py +++ b/examples/verif-manual/vm-nr1677-01-1a.py @@ -22,8 +22,8 @@ r""".. _ref_VM-NR6645-01-1-a: -NRC Piping Benchmarks: NUREG/CR-1677: Volume 1, Benchmark Problem No. 1 ------------------------------------------------------------------------ +Nuclear Regulatory Commission Piping Benchmarks +----------------------------------------------- Problem description: - The example problem contains Mechanical APDL solutions to Nuclear Regulatory Commission piping From 4610510a426ff934e815caecaf535f2f50be9f50 Mon Sep 17 00:00:00 2001 From: Vikas Namdeo <126097319+vnamdeo@users.noreply.github.com> Date: Fri, 22 Aug 2025 16:07:36 +0530 Subject: [PATCH 05/17] Update examples/verif-manual/vm-nr1677-01-1a.py Co-authored-by: German <28149841+germa89@users.noreply.github.com> --- examples/verif-manual/vm-nr1677-01-1a.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/verif-manual/vm-nr1677-01-1a.py b/examples/verif-manual/vm-nr1677-01-1a.py index 6f997b644..6688cfefc 100644 --- a/examples/verif-manual/vm-nr1677-01-1a.py +++ b/examples/verif-manual/vm-nr1677-01-1a.py @@ -51,10 +51,10 @@ - 3-D 3-Node Pipe Element (``PIPE289``) - 3-D 3-Node Elbow Element (``ELBOW290``) -.. image:: ../_static/vm-nr1677-01-1a_setup.png +.. figure: ../_static/vm-nr1677-01-1a_setup.png :align: center :figclass: align-center - :width: 200 + :width: 500 :alt: vm-nr1677-01-1a Finite Element Model of NRC Piping Benchmark Problems, Volume 1, Problem 1 From ce8f7f5e444726a0b4a0549236535a5ac3d98dcd Mon Sep 17 00:00:00 2001 From: Vikas Namdeo <126097319+vnamdeo@users.noreply.github.com> Date: Fri, 22 Aug 2025 16:07:58 +0530 Subject: [PATCH 06/17] Update examples/verif-manual/vm-nr1677-01-1a.py Co-authored-by: German <28149841+germa89@users.noreply.github.com> --- examples/verif-manual/vm-nr1677-01-1a.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/verif-manual/vm-nr1677-01-1a.py b/examples/verif-manual/vm-nr1677-01-1a.py index 6688cfefc..94057bff0 100644 --- a/examples/verif-manual/vm-nr1677-01-1a.py +++ b/examples/verif-manual/vm-nr1677-01-1a.py @@ -81,9 +81,10 @@ # Here, we set loglevel to "WARNING" to reduce verbosity and print_com to True to see commands mapdl = launch_mapdl(loglevel="WARNING", print_com=True) -""" -Preprocessing: Modeling of NRC Piping Benchmark Problems using Pipe289 and Elbow290 elements ---------------------------------------------------------------------------------------------- +# ############################################################################### +# Preprocessing: Modeling of NRC Piping Benchmark Problems using ``PIPE289`` and ``ELBOW290`` elements +# ----------------------------------------------------------------------------------------------------- +# """ # Clear any previous data in MAPDL From e4b556831ac2417ad89c6710f0910fca519dd47e Mon Sep 17 00:00:00 2001 From: Vikas Namdeo <126097319+vnamdeo@users.noreply.github.com> Date: Fri, 22 Aug 2025 16:08:37 +0530 Subject: [PATCH 07/17] Update examples/verif-manual/vm-nr1677-01-1a.py adding native larc API of PyMAPDL Co-authored-by: German <28149841+germa89@users.noreply.github.com> --- examples/verif-manual/vm-nr1677-01-1a.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/verif-manual/vm-nr1677-01-1a.py b/examples/verif-manual/vm-nr1677-01-1a.py index 94057bff0..23b688c6f 100644 --- a/examples/verif-manual/vm-nr1677-01-1a.py +++ b/examples/verif-manual/vm-nr1677-01-1a.py @@ -148,10 +148,10 @@ # Bend Pipe Elements -mapdl.run("larch,3,4,12") # Line number 7 -mapdl.run("larch,4,5,13") -mapdl.run("larch,7,8,14") -mapdl.run("larch,8,9,15") # line number 10 +mapdl.larc(3,4,12) # Line number 7 +mapdl.larc(4,5,13) +mapdl.larc(7,8,14) +mapdl.larc(8,9,15) # line number 10 # Define Material Properties From 7e61aed5519690376f6ad38643f97bafa2ad5fcc Mon Sep 17 00:00:00 2001 From: Vikas Namdeo <126097319+vnamdeo@users.noreply.github.com> Date: Fri, 22 Aug 2025 16:11:01 +0530 Subject: [PATCH 08/17] Update examples/verif-manual/vm-nr1677-01-1a.py Co-authored-by: German <28149841+germa89@users.noreply.github.com> --- examples/verif-manual/vm-nr1677-01-1a.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/examples/verif-manual/vm-nr1677-01-1a.py b/examples/verif-manual/vm-nr1677-01-1a.py index 23b688c6f..a76e393d9 100644 --- a/examples/verif-manual/vm-nr1677-01-1a.py +++ b/examples/verif-manual/vm-nr1677-01-1a.py @@ -275,8 +275,11 @@ # Frequencies from Modal solve -freq_list = mapdl.set("list") -print("Frequencies from Modal solve:", freq_list) +freq_list = mapdl.set("list").to_list() + +print("Frequencies from Modal solve:") +for set, time_freq, load_step, substep, cumulative in freq_list: + print(f" - {time_freq:0.3f} Hz") mapdl.finish() From 09a5588122c59e4803f2d8959b803952080702bf Mon Sep 17 00:00:00 2001 From: Vikas Namdeo <126097319+vnamdeo@users.noreply.github.com> Date: Fri, 22 Aug 2025 16:12:54 +0530 Subject: [PATCH 09/17] Update examples/verif-manual/vm-nr1677-01-1a.py Co-authored-by: German <28149841+germa89@users.noreply.github.com> --- examples/verif-manual/vm-nr1677-01-1a.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/examples/verif-manual/vm-nr1677-01-1a.py b/examples/verif-manual/vm-nr1677-01-1a.py index a76e393d9..41456f720 100644 --- a/examples/verif-manual/vm-nr1677-01-1a.py +++ b/examples/verif-manual/vm-nr1677-01-1a.py @@ -313,11 +313,15 @@ # Excitation along X direction mapdl.sed(1) -mapdl.freq() -mapdl.freq(3.1, 4, 5, 5.81, 7.1, 8.77, 10.99, 14.08, 17.24) -mapdl.freq(25, 28.5, 30, 34.97, 55, 80, 140, 162, 588.93) -mapdl.sv(0.02, 400, 871, 871, 700, 1188, 1188, 440, 775, 775) -mapdl.sv(0.02, 533.2, 467.2, 443.6, 380, 289, 239.4, 192.6, 184.1, 145) +mapdl.freq() # Erase frequency values + +frequencies = [3.1, 4, 5, 5.81, 7.1, 8.77, 10.99, 14.08, 17.24, 25, 28.5, 30, 34.97, 55, 80, 140, 162, 588.93] +spectrum_values = [0.02, 400, 871, 871, 700, 1188, 1188, 440, 775, 775, 0.02, 533.2, 467.2, 443.6, 380, 289, 239.4, 192.6, 184.1, 145] + +for freq, spec in zip(frequencies, spectrum_values): + mapdl.freq(freq) + mapdl.sv(spec) + mapdl.solve() # Excitation along Y direction From b4bd16c262ae6641ff4f2a050e787057f7532083 Mon Sep 17 00:00:00 2001 From: Vikas Namdeo <126097319+vnamdeo@users.noreply.github.com> Date: Fri, 22 Aug 2025 16:13:54 +0530 Subject: [PATCH 10/17] Update examples/verif-manual/vm-nr1677-01-1a.py Co-authored-by: German <28149841+germa89@users.noreply.github.com> --- examples/verif-manual/vm-nr1677-01-1a.py | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/examples/verif-manual/vm-nr1677-01-1a.py b/examples/verif-manual/vm-nr1677-01-1a.py index 41456f720..6d6734974 100644 --- a/examples/verif-manual/vm-nr1677-01-1a.py +++ b/examples/verif-manual/vm-nr1677-01-1a.py @@ -361,22 +361,12 @@ mapdl.post1() mcom_file = mapdl.input("", "mcom") -mapdl.get("AdisX", "NODE", 10, "U", "X") -mapdl.get("AdisY", "NODE", 36, "U", "Y") -mapdl.get("AdisZ", "NODE", 28, "U", "Z") -mapdl.get("ArotX", "NODE", 9, "ROT", "X") -mapdl.get("ArotY", "NODE", 18, "ROT", "Y") -mapdl.get("ArotZ", "NODE", 9, "ROT", "Z") - -############################################################################### -# Maximum nodal displacements and rotations obtained from spectrum solution - -adisx = mapdl.starstatus("AdisX") -adisy = mapdl.starstatus("AdisY") -adisz = mapdl.starstatus("AdisZ") -arotx = mapdl.starstatus("ArotX") -aroty = mapdl.starstatus("ArotY") -arotz = mapdl.starstatus("ArotZ") +AdisX = mapdl.get("AdisX", "NODE", 10, "U", "X") +AdisY = mapdl.get("AdisY", "NODE", 36, "U", "Y") +AdisZ = mapdl.get("AdisZ", "NODE", 28, "U", "Z") +ArotX = mapdl.get("ArotX", "NODE", 9, "ROT", "X") +ArotY = mapdl.get("ArotY", "NODE", 18, "ROT", "Y") +ArotZ = mapdl.get("ArotZ", "NODE", 9, "ROT", "Z") print("Maximum nodal displacements and rotations obtained from spectrum solution:") print( From 10e3c1abec1bc1030379b6ab6e72ed94a10ce5df Mon Sep 17 00:00:00 2001 From: Vikas Namdeo <126097319+vnamdeo@users.noreply.github.com> Date: Fri, 22 Aug 2025 16:14:32 +0530 Subject: [PATCH 11/17] Update examples/verif-manual/vm-nr1677-01-1a.py Co-authored-by: German <28149841+germa89@users.noreply.github.com> --- examples/verif-manual/vm-nr1677-01-1a.py | 49 +++++++++--------------- 1 file changed, 19 insertions(+), 30 deletions(-) diff --git a/examples/verif-manual/vm-nr1677-01-1a.py b/examples/verif-manual/vm-nr1677-01-1a.py index 6d6734974..3216e4131 100644 --- a/examples/verif-manual/vm-nr1677-01-1a.py +++ b/examples/verif-manual/vm-nr1677-01-1a.py @@ -427,36 +427,25 @@ mapdl.run("/GOPR") ############################################################################### -# Element forces and moments at element 12, node "i" - -elem_forces_12i = mapdl.pretab( - "pxi_12", "vyi_12", "vzi_12", "txi_12", "myi_12", "mzi_12" -) -print("Element forces and moments at element 12, node i:", elem_forces_12i) - -############################################################################### -# Element forces and moments at element 12, node "j" - -elem_forces_12j = mapdl.pretab( - "pxj_12", "vyj_12", "vzj_12", "txj_12", "myj_12", "mzj_12" -) -print("Element forces and moments at element 12, node j:", elem_forces_12j) - -############################################################################### -# Element forces and moments at element 14, node "i" - -elem_forces_14i = mapdl.pretab( - "pxi_14", "vyi_14", "vzi_14", "txi_14", "myi_14", "mzi_14" -) -print("Element forces and moments at element 14, node i:", elem_forces_14i) - -############################################################################### -# Element forces and moments at element 14, node "j" - -elem_forces_14j = mapdl.pretab( - "pxj_14", "vyj_14", "vzj_14", "txj_14", "myj_14", "mzj_14" -) -print("Element forces and moments at element 14, node i:", elem_forces_14j) +# Printing element values +# ======================= +# +for node, element in zip([12, 14], ["Pipe289", "Elbow290"]): + # Element forces and moments at element, node "i" + values_i = ["Node i"] + for each in [f"pxi_{node}", f"vyi_{node}", f"vzi_{node}", f"txi_{node}", f"myi_{node}", f"mzi_{node}"]: + values_i.append(mapdl.get_array("ELEM", "", "ETAB", each)[node-1]) + + # Element forces and moments atf element , node "j" + values_j = ["Node j"] + for each in [f"pxj_{node}", f"vyj_{node}", f"vzj_{node}", f"txj_{node}", f"myj_{node}", f"mzj_{node}"]: + values_j.append(mapdl.get_array("ELEM", "", "ETAB", each)[node-1]) + + print(f"\n\nElement forces and moments at element {node} ({element})") + print("===================================================") + + headers = ["Node", "Axial force", "Shear force Y", "Shear force Z", "Torque", "Moment Y", "Moment Z"] + print(tabulate([values_i, values_j], headers=headers)) ############################################################################### # Reaction forces from spectrum solution From 31274a5d2d14a21fdbb254ec44b397cd5b3d12cf Mon Sep 17 00:00:00 2001 From: Vikas Namdeo <126097319+vnamdeo@users.noreply.github.com> Date: Fri, 22 Aug 2025 16:14:58 +0530 Subject: [PATCH 12/17] Update examples/verif-manual/vm-nr1677-01-1a.py Co-authored-by: German <28149841+germa89@users.noreply.github.com> --- examples/verif-manual/vm-nr1677-01-1a.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/examples/verif-manual/vm-nr1677-01-1a.py b/examples/verif-manual/vm-nr1677-01-1a.py index 3216e4131..9267e3e6b 100644 --- a/examples/verif-manual/vm-nr1677-01-1a.py +++ b/examples/verif-manual/vm-nr1677-01-1a.py @@ -451,7 +451,12 @@ # Reaction forces from spectrum solution reaction_force = mapdl.prrsol() -print("Reaction forces:", reaction_force) +headers = reaction_force.get_columns() +values = reaction_force.to_list() + +print("\n\nReaction forces") +print("===============") +print(tabulate(values, headers=headers)) mapdl.finish() From 9d4744d12d7e48b369c2872847a0a32e71924f91 Mon Sep 17 00:00:00 2001 From: Vikas Namdeo <126097319+vnamdeo@users.noreply.github.com> Date: Fri, 22 Aug 2025 16:15:29 +0530 Subject: [PATCH 13/17] Update examples/verif-manual/vm-nr1677-01-1a.py Co-authored-by: German <28149841+germa89@users.noreply.github.com> --- examples/verif-manual/vm-nr1677-01-1a.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/verif-manual/vm-nr1677-01-1a.py b/examples/verif-manual/vm-nr1677-01-1a.py index 9267e3e6b..ae36665d9 100644 --- a/examples/verif-manual/vm-nr1677-01-1a.py +++ b/examples/verif-manual/vm-nr1677-01-1a.py @@ -62,7 +62,7 @@ - The model consists of a piping system with straight pipes and elbows. - The system is subjected to uniform support motion in three spatial directions. - The model is meshed using ``PIPE289`` and ``ELBOW290`` elements for the piping components - and MASS21 elements for point mass representation. + and ``MASS21`` elements for point mass representation. Postprocessing: - Frequencies obtained from modal solution. From b782fe9845ee5f07633a5f2261f96f22451bb9c0 Mon Sep 17 00:00:00 2001 From: Vikas Namdeo <126097319+vnamdeo@users.noreply.github.com> Date: Fri, 22 Aug 2025 16:16:50 +0530 Subject: [PATCH 14/17] Update examples/verif-manual/vm-nr1677-01-1a.py Co-authored-by: German <28149841+germa89@users.noreply.github.com> --- examples/verif-manual/vm-nr1677-01-1a.py | 81 +++++++++++------------- 1 file changed, 36 insertions(+), 45 deletions(-) diff --git a/examples/verif-manual/vm-nr1677-01-1a.py b/examples/verif-manual/vm-nr1677-01-1a.py index ae36665d9..f43e02026 100644 --- a/examples/verif-manual/vm-nr1677-01-1a.py +++ b/examples/verif-manual/vm-nr1677-01-1a.py @@ -377,51 +377,42 @@ ############################################################################### # Element Forces and Moments obtained from spectrum solution for Node "I" -# Element results extraction for element #12 (Pipe289 elements) -mapdl.esel("s", "elem", "", 12) -mapdl.etable("pxi_12", "smisc", 1) -mapdl.etable("vyi_12", "smisc", 6) -mapdl.etable("vzi_12", "smisc", 5) -mapdl.etable("txi_12", "smisc", 4) -mapdl.etable("myi_12", "smisc", 2) -mapdl.etable("mzi_12", "smisc", 3) -mapdl.esel("all") - -# Element results extraction for element #14 (Elbow 290 elements) -mapdl.esel("s", "elem", "", 14) - -mapdl.etable("pxi_14", "smisc", 1) -mapdl.etable("vyi_14", "smisc", 6) -mapdl.etable("vzi_14", "smisc", 5) -mapdl.etable("txi_14", "smisc", 4) -mapdl.etable("myi_14", "smisc", 2) -mapdl.etable("mzi_14", "smisc", 3) -mapdl.esel("all") - -############################################################################### -# Element Forces and Moments obtained from spectrum solution for Node "J" - -# Element results extraction for element #12 (Pipe289 elements) -mapdl.esel("s", "elem", "", 12) - -mapdl.etable("pxj_12", "smisc", 14) -mapdl.etable("vyj_12", "smisc", 19) -mapdl.etable("vzj_12", "smisc", 18) -mapdl.etable("txj_12", "smisc", 17) -mapdl.etable("myj_12", "smisc", 15) -mapdl.etable("mzj_12", "smisc", 16) -mapdl.esel("all") - -# Element results extraction for element #14 (Elbow 290 elements) -mapdl.esel("s", "elem", "", 14) - -mapdl.etable("pxj_14", "smisc", 36) -mapdl.etable("vyj_14", "smisc", 41) -mapdl.etable("vzj_14", "smisc", 40) -mapdl.etable("txj_14", "smisc", 39) -mapdl.etable("myj_14", "smisc", 37) -mapdl.etable("mzj_14", "smisc", 38) -mapdl.esel("all") +elems = [12, 14] +# Output labels +# px = axial force +# vy = shear y-direction +# vz = shear z-direction +# tx = axial torque +# my = moment y-direction +# mz = moment z-direction +labels = ['px', 'vy', 'vz', 'tx', 'my', 'mz'] + +# SMISC mapping +# To obtain the SMISC values for each element +SMISC = { + # Element number 12 + 12: { + # Obtained from the Element reference for PIPE289 + 'i': [ 1, 6, 5, 4, 2, 3], + 'j': [14, 19, 18, 17, 15, 16], + }, + # Element number 14 + 14: { + # Obtained from the Element reference for ELBOW290 + 'i': [1, 6, 5, 4, 2, 3], + 'j': [36, 41, 40, 39, 37, 38], + + } +} + +for elem in elems: + mapdl.esel("s", "elem", "", elem) + + for node in ["i", "j"]: + for label, id_ in zip(labels, SMISC[elem][node]): + + label_ = f"{label}{node}_{elem}" + mapdl.etable(label_, "smisc", id_) mapdl.allsel("all") mapdl.run("/GOPR") From a4c58dba5aac80724b074ad8b967d447dee03f15 Mon Sep 17 00:00:00 2001 From: Vikas Namdeo <126097319+vnamdeo@users.noreply.github.com> Date: Fri, 22 Aug 2025 16:16:50 +0530 Subject: [PATCH 15/17] Modified to incorporate feeback and added target results --- examples/verif-manual/vm-nr1677-01-1a.py | 461 +++++++++++++++-------- 1 file changed, 314 insertions(+), 147 deletions(-) diff --git a/examples/verif-manual/vm-nr1677-01-1a.py b/examples/verif-manual/vm-nr1677-01-1a.py index ae36665d9..4c395ff24 100644 --- a/examples/verif-manual/vm-nr1677-01-1a.py +++ b/examples/verif-manual/vm-nr1677-01-1a.py @@ -20,22 +20,29 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -r""".. _ref_VM-NR6645-01-1-a: +r""".. _ref_VM-NR1677-01-1: Nuclear Regulatory Commission Piping Benchmarks ----------------------------------------------- Problem description: - The example problem contains Mechanical APDL solutions to - Nuclear Regulatory Commission piping - benchmark problems taken from publications NUREG/CR-1677, Volumes 1. + Nuclear Regulatory Commission (NRC) piping benchmark problems + taken from publications NUREG/CR-1677, Volumes 1, Problem 1. - The piping benchmark solutions given in NRC publications were obtained by using a computer program EPIPE which is a modification of the widely available program SAP IV specifically prepared to perform piping analyses. - - The dynamic loading in this problem is induced by uniform earthquake - type excitation in the three spatial directions. The solutions are - determined by using the response spectrum method. + - This benchmark problem contains three straight sections, two bends, + and two fixed anchors. The total mass of the system is represented + by structural mass element (MASS21) specified at individual nodes. + + - Modal and response spectrum analysis is performed on the piping model. + Frequencies obtained from modal solve and the nodal/element solution + obtained from spectrum solve are compared against reference results. + + - For response spectrum analysis, acceleration response spectrum + curve defined by ``SV`` and ``FREQ`` commands. Reference: - P.Bezler, M. Hartzman & M. Reich,"Dynamic Analysis of Uniform Support @@ -55,14 +62,15 @@ :align: center :figclass: align-center :width: 500 - :alt: vm-nr1677-01-1a Finite Element Model of NRC Piping Benchmark Problems, Volume 1, Problem 1 + :alt: vm-nr1677-01-1a: FE Model of Benchmark Problem Model description: - The model consists of a piping system with straight pipes and elbows. - - The system is subjected to uniform support motion in three spatial directions. - - The model is meshed using ``PIPE289`` and ``ELBOW290`` elements for the piping components - and ``MASS21`` elements for point mass representation. + - The system is subjected to uniform support motion in three spatial + directions. + - The model is meshed using ``PIPE289`` and ``ELBOW290`` elements for + the piping components and ``MASS21`` elements for point mass representation. Postprocessing: - Frequencies obtained from modal solution. @@ -76,16 +84,21 @@ "" # Import the MAPDL module from ansys.mapdl.core import launch_mapdl +import numpy as np +from tabulate import tabulate # Launch MAPDL with a specific log level and print command output # Here, we set loglevel to "WARNING" to reduce verbosity and print_com to True to see commands mapdl = launch_mapdl(loglevel="WARNING", print_com=True) -# ############################################################################### -# Preprocessing: Modeling of NRC Piping Benchmark Problems using ``PIPE289`` and ``ELBOW290`` elements -# ----------------------------------------------------------------------------------------------------- -# """ +Preprocessing: Modeling of NRC Piping Benchmark Problems using ``PIPE289`` and ``ELBOW290`` elements +----------------------------------------------------------------------------------------------------- + +""" + +############################################################################### +# Specify material properties, real constants and Element types # Clear any previous data in MAPDL @@ -95,6 +108,11 @@ mapdl.prep7(mute=True) +# Define Material Properties for pipe elements in :math:``psi`` + +mapdl.mp("ex", 1, 24e6) +mapdl.mp("nuxy", 1, 0.3) + # PIPE289 using cubic shape function and Thick pipe theory. mapdl.et(1, "pipe289") @@ -104,15 +122,30 @@ mapdl.et(2, "elbow290", "", 6) +# Real Constants for straight and bend pipe elements in :math:``in`` + +mapdl.sectype(1, "pipe") +mapdl.secdata(7.289, 0.241, 24) + # MASS21, 3-D Mass without Rotary Inertia mapdl.et(3, "mass21") mapdl.keyopt(3, 3, 2) -# Real Constants +# Define real constants for mass elements, 3-D mass in :math:``lb-sec^2/in`` -mapdl.sectype(1, "pipe") -mapdl.secdata(7.289, 0.241, 24) +mapdl.r(12, 0.03988) # Mass @ node 2 +mapdl.r(13, 0.05032) # Mass @ node 6 +mapdl.r(14, 0.02088) # Mass @ node 28 +mapdl.r(15, 0.01698) # Mass @ node 10 +mapdl.r(16, 0.01307) # Mass @ node 11 +mapdl.r(17, 0.01698) # Mass @ node 15 +mapdl.r(18, 0.01044) # Mass @ node 35 +mapdl.r(19, 0.01795) # Mass @ node 19 +mapdl.r(20, 0.01501) # Mass @ node 20 + +############################################################################### +# Geometry modeling of nuclear piping system # Define Keypoints @@ -133,11 +166,7 @@ mapdl.k(14, 85.9, 145, 2.76) mapdl.k(15, 106, 145, 22.4) -# Straight Pipe (Tangent Elements) -mapdl.type(1) -mapdl.mat(1) -mapdl.secnum(1) -mapdl.real(1) +# Straight Pipe system mapdl.l(1, 2) mapdl.l(2, 3) @@ -146,23 +175,22 @@ mapdl.l(9, 10) mapdl.l(10, 11) # Line number 6 -# Bend Pipe Elements - -mapdl.larc(3,4,12) # Line number 7 -mapdl.larc(4,5,13) -mapdl.larc(7,8,14) -mapdl.larc(8,9,15) # line number 10 +# Bend Pipe system -# Define Material Properties +mapdl.larc(3, 4, 12) # Line number 7 +mapdl.larc(4, 5, 13) +mapdl.larc(7, 8, 14) +mapdl.larc(8, 9, 15) # line number 10 -mapdl.mp("ex", 1, 24e6) -mapdl.mp("nuxy", 1, 0.3) +############################################################################### +# Meshing of nuclear piping system using pipe and elbow elements # Meshing for straight pipe using PIPE289 elements mapdl.type(1) -mapdl.secnum(1) mapdl.mat(1) +mapdl.secnum(1) +mapdl.real(1) mapdl.lsel("s", "line", "", 1, 6) mapdl.allsel("below", "line") @@ -182,64 +210,61 @@ mapdl.lmesh("all") mapdl.allsel("all", "all") -# Real constants for mass element - -mapdl.r(12, 0.03988) -mapdl.r(13, 0.05032) -mapdl.r(14, 0.02088) -mapdl.r(15, 0.01698) -mapdl.r(16, 0.01307) -mapdl.r(17, 0.01698) -mapdl.r(18, 0.01044) -mapdl.r(19, 0.01795) -mapdl.r(20, 0.01501) +############################################################################### +# The total system mass of nuclear piping system is represented by structural +# mass element ``MASS21`` specified at individual nodes. -# Mass Elements +# Specify mass elements with real constants at respective nodes mapdl.type(3) mapdl.real(12) -mapdl.e(2) +mapdl.e(2) # Mass element at node 2 mapdl.real(13) -mapdl.e(6) +mapdl.e(6) # Mass element at node 6 mapdl.real(14) -mapdl.e(28) +mapdl.e(28) # Mass element at node 28 mapdl.real(15) -mapdl.e(10) +mapdl.e(10) # Mass element at node 10 mapdl.real(16) -mapdl.e(11) +mapdl.e(11) # Mass element at node 11 mapdl.real(17) -mapdl.e(15) +mapdl.e(15) # Mass element at node 15 mapdl.real(18) -mapdl.e(35) +mapdl.e(35) # Mass element at node 35 mapdl.real(19) -mapdl.e(19) +mapdl.e(19) # Mass element at node 19 mapdl.real(20) -mapdl.e(20) +mapdl.e(20) # Mass element at node 20 -# Using ELBOW, to convert some PIPE289 into ELBOW290 +############################################################################### +# Using ``ELBOW``, to convert some ``PIPE289`` into ``ELBOW290`` mapdl.elbow("on", "", "", "sect") - mapdl.allsel("all", "all") -# Display the model +############################################################################### +# Display the nuclear piping system model mapdl.eplot() +############################################################################### # Define constraints mapdl.dk(1, "all", 0) mapdl.dk(11, "all", 0) - mapdl.allsel("all", "all") + +############################################################################### +# Finish preprocessing aspects of nuclear piping system. + mapdl.finish() ############################################################################### @@ -311,41 +336,58 @@ # Seismic Acceleration Response Loading mapdl.svtyp(2) +############################################################################### +# Solve the spectrum analysis along X direction +# --------------------------------------------- # Excitation along X direction + mapdl.sed(1) -mapdl.freq() # Erase frequency values -frequencies = [3.1, 4, 5, 5.81, 7.1, 8.77, 10.99, 14.08, 17.24, 25, 28.5, 30, 34.97, 55, 80, 140, 162, 588.93] -spectrum_values = [0.02, 400, 871, 871, 700, 1188, 1188, 440, 775, 775, 0.02, 533.2, 467.2, 443.6, 380, 289, 239.4, 192.6, 184.1, 145] +mapdl.freq() # Erase frequency values -for freq, spec in zip(frequencies, spectrum_values): - mapdl.freq(freq) - mapdl.sv(spec) +mapdl.freq(3.1, 4, 5, 5.81, 7.1, 8.77, 10.99, 14.08, 17.24) +mapdl.freq(25, 28.5, 30, 34.97, 55, 80, 140, 162, 588.93) +mapdl.sv(0.02, 400, 871, 871, 700, 1188, 1188, 440, 775, 775) +mapdl.sv(0.02, 533.2, 467.2, 443.6, 380, 289, 239.4, 192.6, 184.1, 145) mapdl.solve() +############################################################################### +# Solve the spectrum analysis along Y direction +# --------------------------------------------- # Excitation along Y direction + mapdl.sed("", 1) -mapdl.freq() + +mapdl.freq() # Erase frequency values + mapdl.freq(3.1, 4, 5, 5.81, 7.1, 8.77, 10.99, 14.08, 17.24) mapdl.freq(25, 28.5, 30, 34.97, 55, 80, 140, 162, 588.93) mapdl.sv(0.02, 266.7, 580.7, 580.7, 466.7, 792, 792, 293.3, 516.7, 516.7) mapdl.sv(0.02, 355.5, 311.5, 295.7, 253.3, 192.7, 159.6, 128.4, 122.7, 96.7) + mapdl.solve() +############################################################################### +# Solve the spectrum analysis along Z direction +# --------------------------------------------- + # Excitation along Z direction + mapdl.sed("", "", 1) -mapdl.freq() + +mapdl.freq() # Erase frequency values + mapdl.freq(3.1, 4, 5, 5.81, 7.1, 8.77, 10.99, 14.08, 17.24) mapdl.freq(25, 28.5, 30, 34.97, 55, 80, 140, 162, 588.93) mapdl.sv(0.02, 400, 871, 871, 700, 1188, 1188, 440, 775, 775) mapdl.sv(0.02, 533.2, 467.2, 443.6, 380, 289, 239.4, 192.6, 184.1, 145) +mapdl.solve() + ############################################################################### -# Solve the spectrum analysis -# --------------------------- +# Finish the spectrum analysis -mapdl.solve() mapdl.finish() ############################################################################### @@ -359,110 +401,235 @@ # solution are also extracted. mapdl.post1() -mcom_file = mapdl.input("", "mcom") -AdisX = mapdl.get("AdisX", "NODE", 10, "U", "X") -AdisY = mapdl.get("AdisY", "NODE", 36, "U", "Y") -AdisZ = mapdl.get("AdisZ", "NODE", 28, "U", "Z") -ArotX = mapdl.get("ArotX", "NODE", 9, "ROT", "X") -ArotY = mapdl.get("ArotY", "NODE", 18, "ROT", "Y") -ArotZ = mapdl.get("ArotZ", "NODE", 9, "ROT", "Z") +mcom_file = mapdl.input("", "mcom") -print("Maximum nodal displacements and rotations obtained from spectrum solution:") -print( - f"AdisX: {adisx},\n AdisY: {adisy},\n AdisZ: {adisz}\n" - f"ArotX: {arotx},\n ArotY: {aroty},\n ArotZ: {arotz}" -) +adisx = mapdl.get("AdisX", "NODE", 10, "U", "X") +adisy = mapdl.get("AdisY", "NODE", 36, "U", "Y") +adisz = mapdl.get("AdisZ", "NODE", 28, "U", "Z") +arotx = mapdl.get("ArotX", "NODE", 9, "ROT", "X") +aroty = mapdl.get("ArotY", "NODE", 18, "ROT", "Y") +arotz = mapdl.get("ArotZ", "NODE", 9, "ROT", "Z") ############################################################################### # Element Forces and Moments obtained from spectrum solution for Node "I" -# Element results extraction for element #12 (Pipe289 elements) -mapdl.esel("s", "elem", "", 12) -mapdl.etable("pxi_12", "smisc", 1) -mapdl.etable("vyi_12", "smisc", 6) -mapdl.etable("vzi_12", "smisc", 5) -mapdl.etable("txi_12", "smisc", 4) -mapdl.etable("myi_12", "smisc", 2) -mapdl.etable("mzi_12", "smisc", 3) -mapdl.esel("all") - -# Element results extraction for element #14 (Elbow 290 elements) -mapdl.esel("s", "elem", "", 14) - -mapdl.etable("pxi_14", "smisc", 1) -mapdl.etable("vyi_14", "smisc", 6) -mapdl.etable("vzi_14", "smisc", 5) -mapdl.etable("txi_14", "smisc", 4) -mapdl.etable("myi_14", "smisc", 2) -mapdl.etable("mzi_14", "smisc", 3) -mapdl.esel("all") - -############################################################################### -# Element Forces and Moments obtained from spectrum solution for Node "J" - -# Element results extraction for element #12 (Pipe289 elements) -mapdl.esel("s", "elem", "", 12) - -mapdl.etable("pxj_12", "smisc", 14) -mapdl.etable("vyj_12", "smisc", 19) -mapdl.etable("vzj_12", "smisc", 18) -mapdl.etable("txj_12", "smisc", 17) -mapdl.etable("myj_12", "smisc", 15) -mapdl.etable("mzj_12", "smisc", 16) -mapdl.esel("all") - -# Element results extraction for element #14 (Elbow 290 elements) -mapdl.esel("s", "elem", "", 14) - -mapdl.etable("pxj_14", "smisc", 36) -mapdl.etable("vyj_14", "smisc", 41) -mapdl.etable("vzj_14", "smisc", 40) -mapdl.etable("txj_14", "smisc", 39) -mapdl.etable("myj_14", "smisc", 37) -mapdl.etable("mzj_14", "smisc", 38) -mapdl.esel("all") +elems = [12, 14] + +# Output labels +# px = section axial force at node I and J. +# vy = section shear forces along Y direction at node I and J. +# vz = section shear forces along Z direction at node I and J. +# tx = section torsional moment at node I and J +# my = section bending moments along Y direction at node I and J. +# mz = section bending moments along Z direction at node I and J. +labels = ["px", "vy", "vz", "tx", "my", "mz"] + +# SMISC mapping +# To obtain the SMISC values for each element +SMISC = { + # Element number 12 + 12: { + # Obtained from the Element reference for PIPE289 + "i": [1, 6, 5, 4, 2, 3], + "j": [14, 19, 18, 17, 15, 16], + }, + # Element number 14 + 14: { + # Obtained from the Element reference for ELBOW290 + "i": [1, 6, 5, 4, 2, 3], + "j": [36, 41, 40, 39, 37, 38], + }, +} + +for elem in elems: + mapdl.esel("s", "elem", "", elem) + + for node in ["i", "j"]: + for label, id_ in zip(labels, SMISC[elem][node]): + + label_ = f"{label}{node}_{elem}" + mapdl.etable(label_, "smisc", id_) mapdl.allsel("all") mapdl.run("/GOPR") ############################################################################### -# Printing element values +# Reaction forces from spectrum solution + +reaction_force = mapdl.prrsol() + +############################################################################### +# Finish postprocessing of response spectrum analysis. + +mapdl.finish() + +############################################################################### +# Verify the results +# ------------------ + +############################################################################### +# Frequencies Obtained from Modal Solution # ======================= # -for node, element in zip([12, 14], ["Pipe289", "Elbow290"]): - # Element forces and moments at element, node "i" - values_i = ["Node i"] - for each in [f"pxi_{node}", f"vyi_{node}", f"vzi_{node}", f"txi_{node}", f"myi_{node}", f"mzi_{node}"]: - values_i.append(mapdl.get_array("ELEM", "", "ETAB", each)[node-1]) +# The results obtained from the modal solution are compared against target values. +# The target values are defined based on the reference results from the NRC publication. + +# Set target values +target_freq = np.array([28.515, 56.441, 82.947, 144.140, 166.260]) # in Hz + +# Fill result values +sim_freq_res = [freq[1] for freq in freq_list] + +# Store ratio +value_ratio = [] +for i in range(len(target_freq)): + con = sim_freq_res[i] / target_freq[i] + value_ratio.append(np.abs(con)) - # Element forces and moments atf element , node "j" - values_j = ["Node j"] - for each in [f"pxj_{node}", f"vyj_{node}", f"vzj_{node}", f"txj_{node}", f"myj_{node}", f"mzj_{node}"]: - values_j.append(mapdl.get_array("ELEM", "", "ETAB", each)[node-1]) +print("Frequencies Obtained Modal Solution \n") - print(f"\n\nElement forces and moments at element {node} ({element})") - print("===================================================") +# Prepare data for tabulation +data_freq = [ + [i + 1, target_freq[i], sim_freq_res[i], value_ratio[i]] + for i in range(len(target_freq)) +] + +# Define headers +headers = ["Mode", "Target", "Mechanical APDL", "Ratio"] + +# Print table +print( + f"""------------------- VM-NR1677-01-1-a.1 RESULTS COMPARISON --------------------- +{tabulate(data_freq, headers=headers, tablefmt="grid")} +""" +) + +"" +# Set target values +target_res = np.array( + [7.830e-03, 2.648e-03, 1.748e-02, 1.867e-04, 2.123e-04, 7.217e-05] +) + +# Fill result values +# adisx, adisy, adisz, arotx, aroty, arotz = 7.8e-03, 2.6e-03, 1.75e-02, 1.9e-04, 2.1e-04, 7.2e-05 +sim_res = np.array([adisx, adisy, adisz, arotx, aroty, arotz]) + +# Output labels +labels = [ + "UX at node10", + "UY at node36", + "UZ at node28", + "ROTX at node9", + "ROTY at node18", + "ROTZ at node9", +] + +# Store ratio +value_ratio = [] +for i in range(len(target_res)): + con = sim_res[i] / target_res[i] + value_ratio.append(np.abs(con)) + +print("Maximum nodal displacements and rotations obtained from spectrum solution:") - headers = ["Node", "Axial force", "Shear force Y", "Shear force Z", "Torque", "Moment Y", "Moment Z"] - print(tabulate([values_i, values_j], headers=headers)) +# Prepare data for tabulation +data_freq = [ + [labels[i], target_res[i], sim_res[i], value_ratio[i]] + for i in range(len(target_res)) +] + +# Define headers +headers = ["Result Node", "Target", "Mechanical APDL", "Ratio"] + +# Print table +print( + f""" +{tabulate(data_freq, headers=headers, tablefmt="grid")} +""" +) ############################################################################### -# Reaction forces from spectrum solution +# Element forces and moments obtained from spectrum solution for specific elements +# ======================= +# -reaction_force = mapdl.prrsol() -headers = reaction_force.get_columns() -values = reaction_force.to_list() +# For Node# 12: + +# Set target values +target_elem_12i_res = np.array([24.019, 7.514, 34.728, 123.39, 2131.700, 722.790]) +target_elem_12j_res = np.array([24.018, 7.514, 34.728, 123.39, 2442.700, 786.730]) + +# Fill result values +# sim_elem_12i_res = np.array([pxi_12, vyi_12, vzi_12, txi_12, myi_12, mzi_12]) +# sim_elem_12j_res = np.array([pxj_12, vyj_12, vzj_12, txj_12, myj_12, mzj_12]) + +# For Node# 14: + +# Set target values +target_elem_14i_res = np.array([5.1505, 7.2868, 7.9178, 450.42, 675.58, 314.970]) +target_elem_14j_res = np.array([6.006, 6.6138, 7.9146, 157.85, 858.09, 302.940]) +# Fill result values +# sim_elem_14i_res = np.array([pxi_14, vyi_14, vzi_14, txi_14, myi_14, mzi_14]) +# sim_elem_14j_res = np.array([pxj_14, vyj_14, vzj_14, txj_14, myj_14, mzj_14]) + +# output labels +labels_I = ["PX(I)", "VY(I)", "VZ(I)", "TX(I)", "MY(I)", "MZ(I)"] +labels_J = ["PX(J)", "VY(J)", "VZ(J)", "TX(J)", "MY(J)", "MZ(J)"] + +for node, element in zip([12, 14], ["Pipe289", "Elbow290"]): + # Element forces and moments at element, node "i" + values_i = ["Node i"] + for each in [ + f"pxi_{node}", + f"vyi_{node}", + f"vzi_{node}", + f"txi_{node}", + f"myi_{node}", + f"mzi_{node}", + ]: + values_i.append(mapdl.get_array("ELEM", "", "ETAB", each)[node - 1]) + + # Element forces and moments at element , node "j" + values_j = ["Node j"] + for each in [ + f"pxj_{node}", + f"vyj_{node}", + f"vzj_{node}", + f"txj_{node}", + f"myj_{node}", + f"mzj_{node}", + ]: + values_j.append(mapdl.get_array("ELEM", "", "ETAB", each)[node - 1]) + + print(f"\n\nElement forces and moments at element {node} ({element})") + print("===================================================") + + headers = [ + "Node", + "Axial force", + "Shear force Y", + "Shear force Z", + "Torque", + "Moment Y", + "Moment Z", + ] + print(tabulate([values_i, values_j], headers=headers)) + +############################################################################### +# Reaction forces +# ======================= +# print("\n\nReaction forces") print("===============") -print(tabulate(values, headers=headers)) -mapdl.finish() +headers = reaction_force.get_columns() +values = reaction_force.to_list() + +print(tabulate(values, headers=headers)) ################################################################################ # Stop MAPDL. mapdl.exit() - -"" From 3e3b13b54a4cd7e500a1eb31032b1dc69cb0f5b1 Mon Sep 17 00:00:00 2001 From: German <28149841+germa89@users.noreply.github.com> Date: Mon, 25 Aug 2025 17:52:31 +0200 Subject: [PATCH 16/17] refactor: target values and output formatting for element forces and moments --- examples/verif-manual/vm-nr1677-01-1a.py | 97 +++++++++++------------- 1 file changed, 45 insertions(+), 52 deletions(-) diff --git a/examples/verif-manual/vm-nr1677-01-1a.py b/examples/verif-manual/vm-nr1677-01-1a.py index 08654b299..916d34865 100644 --- a/examples/verif-manual/vm-nr1677-01-1a.py +++ b/examples/verif-manual/vm-nr1677-01-1a.py @@ -556,65 +556,58 @@ # For Node# 12: # Set target values -target_elem_12i_res = np.array([24.019, 7.514, 34.728, 123.39, 2131.700, 722.790]) -target_elem_12j_res = np.array([24.018, 7.514, 34.728, 123.39, 2442.700, 786.730]) +TARGET = { + 12: { + "i": np.array([24.019, 7.514, 34.728, 123.39, 2131.700, 722.790]), + "j": np.array([24.018, 7.514, 34.728, 123.39, 2442.700, 786.730]) + }, + 14: { + "i": np.array([5.1505, 7.2868, 7.9178, 450.42, 675.58, 314.970]), + "j": np.array([6.006, 6.6138, 7.9146, 157.85, 858.09, 302.940]) + } +} -# Fill result values -# sim_elem_12i_res = np.array([pxi_12, vyi_12, vzi_12, txi_12, myi_12, mzi_12]) -# sim_elem_12j_res = np.array([pxj_12, vyj_12, vzj_12, txj_12, myj_12, mzj_12]) +sections = [ + "Axial force", + "Shear force Y", + "Shear force Z", + "Torque", + "Moment Y", + "Moment Z", + ] -# For Node# 14: -# Set target values -target_elem_14i_res = np.array([5.1505, 7.2868, 7.9178, 450.42, 675.58, 314.970]) -target_elem_14j_res = np.array([6.006, 6.6138, 7.9146, 157.85, 858.09, 302.940]) +for node, element in zip([12, 14], ["Pipe289", "Elbow290"]): + print("\n\n===================================================") + print(f"Element forces and moments at element {node} ({element})") + print("===================================================") -# Fill result values -# sim_elem_14i_res = np.array([pxi_14, vyi_14, vzi_14, txi_14, myi_14, mzi_14]) -# sim_elem_14j_res = np.array([pxj_14, vyj_14, vzj_14, txj_14, myj_14, mzj_14]) + etab_i = [f"pxi_{node}", f"vyi_{node}", f"vzi_{node}", f"txi_{node}", f"myi_{node}", f"mzi_{node}"] + etab_j = [f"pxj_{node}", f"vyj_{node}", f"vzj_{node}", f"txj_{node}", f"myj_{node}", f"mzj_{node}"] + targets_i = TARGET[node]["i"] + targets_j = TARGET[node]["j"] -# output labels -labels_I = ["PX(I)", "VY(I)", "VZ(I)", "TX(I)", "MY(I)", "MZ(I)"] -labels_J = ["PX(J)", "VY(J)", "VZ(J)", "TX(J)", "MY(J)", "MZ(J)"] + for each_section, each_tab_i, each_tab_j, target_i, target_j in zip(sections, etab_i, etab_j, targets_i, targets_j): -for node, element in zip([12, 14], ["Pipe289", "Elbow290"]): - # Element forces and moments at element, node "i" - values_i = ["Node i"] - for each in [ - f"pxi_{node}", - f"vyi_{node}", - f"vzi_{node}", - f"txi_{node}", - f"myi_{node}", - f"mzi_{node}", - ]: - values_i.append(mapdl.get_array("ELEM", "", "ETAB", each)[node - 1]) - - # Element forces and moments at element , node "j" - values_j = ["Node j"] - for each in [ - f"pxj_{node}", - f"vyj_{node}", - f"vzj_{node}", - f"txj_{node}", - f"myj_{node}", - f"mzj_{node}", - ]: - values_j.append(mapdl.get_array("ELEM", "", "ETAB", each)[node - 1]) - - print(f"\n\nElement forces and moments at element {node} ({element})") - print("===================================================") + print(f"\n{each_section}") + print("="*len(each_section)) + + # Element forces and moments at element, node "i" + values_i = ["Node i"] + + values_i.append(mapdl.get_array("ELEM", "", "ETAB", each_tab_i)[node - 1]) + values_i.append(target_i) + values_i.append(values_i[1]/target_i) + + # Element forces and moments at element , node "j" + values_j = ["Node j"] + + values_j.append(mapdl.get_array("ELEM", "", "ETAB", each_tab_j)[node - 1]) + values_j.append(target_j) + values_j.append(values_j[1]/target_j) - headers = [ - "Node", - "Axial force", - "Shear force Y", - "Shear force Z", - "Torque", - "Moment Y", - "Moment Z", - ] - print(tabulate([values_i, values_j], headers=headers)) + headers = ["Node", "Mechanical APDL", "Target", "Ratio"] + print(tabulate([values_i, values_j], headers=headers)) ############################################################################### # Reaction forces From 691785d12e146e226a4354b1ff1fdac2f986561c Mon Sep 17 00:00:00 2001 From: German <28149841+germa89@users.noreply.github.com> Date: Tue, 26 Aug 2025 10:49:29 +0200 Subject: [PATCH 17/17] refactor: improve formatting and structure of target values and output sections --- examples/verif-manual/vm-nr1677-01-1a.py | 72 +++++++++++++++--------- 1 file changed, 44 insertions(+), 28 deletions(-) diff --git a/examples/verif-manual/vm-nr1677-01-1a.py b/examples/verif-manual/vm-nr1677-01-1a.py index 916d34865..df89b89dd 100644 --- a/examples/verif-manual/vm-nr1677-01-1a.py +++ b/examples/verif-manual/vm-nr1677-01-1a.py @@ -559,22 +559,22 @@ TARGET = { 12: { "i": np.array([24.019, 7.514, 34.728, 123.39, 2131.700, 722.790]), - "j": np.array([24.018, 7.514, 34.728, 123.39, 2442.700, 786.730]) + "j": np.array([24.018, 7.514, 34.728, 123.39, 2442.700, 786.730]), }, 14: { "i": np.array([5.1505, 7.2868, 7.9178, 450.42, 675.58, 314.970]), - "j": np.array([6.006, 6.6138, 7.9146, 157.85, 858.09, 302.940]) - } + "j": np.array([6.006, 6.6138, 7.9146, 157.85, 858.09, 302.940]), + }, } sections = [ - "Axial force", - "Shear force Y", - "Shear force Z", - "Torque", - "Moment Y", - "Moment Z", - ] + "Axial force", + "Shear force Y", + "Shear force Z", + "Torque", + "Moment Y", + "Moment Z", +] for node, element in zip([12, 14], ["Pipe289", "Elbow290"]): @@ -582,32 +582,48 @@ print(f"Element forces and moments at element {node} ({element})") print("===================================================") - etab_i = [f"pxi_{node}", f"vyi_{node}", f"vzi_{node}", f"txi_{node}", f"myi_{node}", f"mzi_{node}"] - etab_j = [f"pxj_{node}", f"vyj_{node}", f"vzj_{node}", f"txj_{node}", f"myj_{node}", f"mzj_{node}"] + etab_i = [ + f"pxi_{node}", + f"vyi_{node}", + f"vzi_{node}", + f"txi_{node}", + f"myi_{node}", + f"mzi_{node}", + ] + etab_j = [ + f"pxj_{node}", + f"vyj_{node}", + f"vzj_{node}", + f"txj_{node}", + f"myj_{node}", + f"mzj_{node}", + ] targets_i = TARGET[node]["i"] targets_j = TARGET[node]["j"] - for each_section, each_tab_i, each_tab_j, target_i, target_j in zip(sections, etab_i, etab_j, targets_i, targets_j): + for each_section, each_tab_i, each_tab_j, target_i, target_j in zip( + sections, etab_i, etab_j, targets_i, targets_j + ): + + print(f"\n{each_section}") + print("=" * len(each_section)) - print(f"\n{each_section}") - print("="*len(each_section)) + # Element forces and moments at element, node "i" + values_i = ["Node i"] - # Element forces and moments at element, node "i" - values_i = ["Node i"] - - values_i.append(mapdl.get_array("ELEM", "", "ETAB", each_tab_i)[node - 1]) - values_i.append(target_i) - values_i.append(values_i[1]/target_i) + values_i.append(mapdl.get_array("ELEM", "", "ETAB", each_tab_i)[node - 1]) + values_i.append(target_i) + values_i.append(values_i[1] / target_i) - # Element forces and moments at element , node "j" - values_j = ["Node j"] + # Element forces and moments at element , node "j" + values_j = ["Node j"] - values_j.append(mapdl.get_array("ELEM", "", "ETAB", each_tab_j)[node - 1]) - values_j.append(target_j) - values_j.append(values_j[1]/target_j) + values_j.append(mapdl.get_array("ELEM", "", "ETAB", each_tab_j)[node - 1]) + values_j.append(target_j) + values_j.append(values_j[1] / target_j) - headers = ["Node", "Mechanical APDL", "Target", "Ratio"] - print(tabulate([values_i, values_j], headers=headers)) + headers = ["Node", "Mechanical APDL", "Target", "Ratio"] + print(tabulate([values_i, values_j], headers=headers)) ############################################################################### # Reaction forces