diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 26d33521af1..00000000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 105ce2da2d6..00000000000 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 1d209eafc7f..00000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 62f867e6293..00000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/pymapdl.iml b/.idea/pymapdl.iml deleted file mode 100644 index 5195124935e..00000000000 --- a/.idea/pymapdl.iml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7f4cb..00000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/doc/source/_static/vm8_setup.png b/doc/source/_static/vm8_setup.png new file mode 100644 index 00000000000..d3087b477b4 Binary files /dev/null and b/doc/source/_static/vm8_setup.png differ diff --git a/examples/06-verif-manual/vm-008-parametric_calculation.py b/examples/06-verif-manual/vm-008-parametric_calculation.py new file mode 100644 index 00000000000..f83219551aa --- /dev/null +++ b/examples/06-verif-manual/vm-008-parametric_calculation.py @@ -0,0 +1,232 @@ +r""" +.. _ref_vm8_example: + +Parametric Calculation +---------------------- +Problem Description: + - Write a user file macro to calculate the distance ``d`` between either nodes + or keypoints in ``PREP7``. Define abbreviations for calling the macro and + verify the parametric expressions by using the macro to calculate + the distance between nodes :math:`N_1` and :math:`N_2` and + between keypoints :math:`K_3` and :math:`K_4`. + +Reference: + - None. + +Analysis Type(s): + - Parametric Arithmetic. + +Element Type: + - None. + +Geometric Properties(Coordinates): + - :math:`N_{\mathrm{1(x,y,z)}} = 1.5, 2.5, 3.5` + - :math:`N_{\mathrm{2(x,y,z)}} = -3.7, 4.6, -3` + - :math:`K_{\mathrm{3(x,y,z)}} = 100, 0, 30` + - :math:`K_{\mathrm{4(x,y,z)}} = -200,25,80` + +.. image:: ../../_static/vm8_setup.png + :width: 300 + :alt: VM8 Problem Sketch + +Analysis Assumptions and Modeling Notes: + - Instead of ``*CREATE``, ``*USE``, etc., we have created a class + ``Create`` with methods that correspond to each type of simulation. + This class gives a possibility to change coordinates and reuse it. + The simulation can be checked not just by target values, but also + with the simple distances' formula between keypoints as: + + * Calculate distance between two keypoints in the Cartesian coordinate system: + :math:`D = \sqrt[2]{(x_2 - x_1)^2 + (y_2 - y_1)^2 + (z_2 - z_1)^2}` + * Python representation of the distance formula: + .. doctest:: + + import math + # Define coordinates for keypoints K3 and K4. + x1, y1, z1 = 100, 0, 30 + x2, y2, z2 = -200, 25, 80 + dist_kp = math.sqrt((x2 - x1)**2 + (y2 - y1)**2 + (z2 - z1)**2) + print(dist_kp) + +""" + +############################################################################### +# Start MAPDL +# ~~~~~~~~~~~ +# Start MAPDL and import Numpy and Pandas libraries. + +# sphinx_gallery_thumbnail_path = '_static/vm8_setup.png' + +import numpy as np +import pandas as pd + +from ansys.mapdl.core import launch_mapdl + +# Start MAPDL. +mapdl = launch_mapdl() + + +############################################################################### +# Pre-Processing +# ~~~~~~~~~~~~~~ +# Enter verification example mode and the pre-processing routine. + +mapdl.clear() +mapdl.verify() +mapdl.prep7(mute=True) + + +############################################################################### +# Define Class +# ~~~~~~~~~~~~ +# Identifying the class ``create`` with methods ``create_kp_method`` and +# ``create_node_method`` to calculate and plot the distances between keypoints +# and nodes. + +class Create: + def __init__(self, p1, p2): + # Points Attributes. + self.p1 = p1 + self.p2 = p2 + + def kp_distances(self): + + # Define keypoints by coordinates. + kp1 = mapdl.k(npt=3, x=self.p1[0], y=self.p1[1], z=self.p1[2]) + kp2 = mapdl.k(npt=4, x=self.p2[0], y=self.p2[1], z=self.p2[2]) + + # Get the distance between keypoints. + dist_kp, kx, ky, kz = mapdl.kdist(kp1, kp2) + + # Plot keypoints. + mapdl.kplot(show_keypoint_numbering=True, + vtk=True, + background="grey", + show_bounds=True, + font_size=26) + return dist_kp + + def node_distances(self): + + # Define nodes by coordinates. + node1 = mapdl.n(node=1, x=self.p1[0], y=self.p1[1], z=self.p1[2]) + node2 = mapdl.n(node=2, x=self.p2[0], y=self.p2[1], z=self.p2[2]) + + # Get the distance between nodes. + dist_node, node_x, node_y, node_z = mapdl.ndist(node1, node2) + + # Plot nodes. + mapdl.nplot(nnum=True, + vtk=True, + color="grey", + show_bounds=True, + font_size=26) + return dist_node + + @property + def p1(self): + # Getting value + return self._p1 + + @p1.setter + def p1(self, new_value): + # Check the data type: + if not isinstance(new_value, list): + raise ValueError("The coordinates should be implemented by the list!") + # Check the quantity of items: + if len(new_value) != 3: + raise ValueError("The coordinates should have three items in the list as [X, Y, Z]") + self._p1 = new_value + + @property + def p2(self): + return self._p2 + + @p2.setter + def p2(self, new_value): + # Check the data type: + if not isinstance(new_value, list): + raise ValueError("The coordinates should be implemented by the list!") + # Check the quantity of items: + if len(new_value) != 3: + raise ValueError("The coordinates should have three items in the list as [X, Y, Z]") + self._p2 = new_value + + +############################################################################### +# Distance between keypoints +# ~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Using already created method for keypoints to get the distance between them +# and print out an output. The keypoints have got next coordinates: +# +# * :math:`K_{\mathrm{3(x,y,z)}} = 100, 0, 30` +# * :math:`K_{\mathrm{4(x,y,z)}} = -200, 25,80` + +kp1 = [100, 0, 30] +kp2 = [-200, 25, 80] +kp = Create(kp1, kp2) +kp_dist = kp.kp_distances() +print(f"Distance between keypoint is: {kp_dist:.2f}\n\n") + +# Print the list of keypoints. +print(mapdl.klist()) + + +############################################################################### +# Distance between nodes. +# ~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Using already created method for nodes to get the distance between them and +# print out an output. The nodes have got next coordinates: +# +# * :math:`N_{\mathrm{1(x,y,z)}} = 1.5, 2.5, 3.5` +# * :math:`N_{\mathrm{2(x,y,z)}} = -3.7, 4.6, -3` + +node1 = [1.5, 2.5, 3.5] +node2 = [-3.7, 4.6, -3] +nodes = Create(node1, node2) +node_dist = nodes.node_distances() +print(f"Distance between nodes is: {node_dist:.2f}\n\n") + +# Print the list of nodes. +print(mapdl.nlist()) + + +############################################################################### +# Check Results +# ~~~~~~~~~~~~~ +# Finally we have the results of the distances for both simulations, +# which can be compared with expected target values: +# +# - 1st simulation to get the distance between keypoints :math:`K_3` and :math:`K_4`, where :math:`LEN_1 = 305.16\,(in)` +# - 2nd simulation to get the distance between nodes :math:`N_1` and :math:`N_2`, where :math:`LEN_2 = 8.58\,(in)` +# +# For better representation of the results we can use ``pandas`` dataframe +# with following settings below: + +# Define the names of the rows. +row_names = ["N1 - N2 distance (LEN2)", + "K3 - K4 distance (LEN1)"] + +# Define the names of the columns. +col_names = ['Target', + 'Mechanical APDL', + 'RATIO'] + +# Define the values of the target results. +target_res = np.asarray([8.5849, 305.16]) + +# Create an array with outputs of the simulations. +simulation_res = np.asarray([node_dist, kp_dist]) + +# Identifying and filling corresponding columns. +main_columns = { + "Target": target_res, + "Mechanical APDL": simulation_res, + "Ratio": list(np.divide(simulation_res, target_res)) +} + +# Create and fill the output dataframe with pandas. +df2 = pd.DataFrame(main_columns, index=row_names).round(2) + +# Apply settings for the dataframe. +df2.head()