Script Tip Friday - Efficiently Combining MAPDL and Mechanical Scripting
Ansys Structures
Structural analysis for every application and experience level
This Script Tip Friday is brought to you by Pernelle Marone-Hitz , who is a Lead Application Engineer here at Ansys.
Pernelle's tip today will cover how to efficiently combine MAPDL and Mechanical scripting.
Many users have developed post-processing macros based on MAPDL command snippets in Mechanical.
The usual workflow is to have the command snippet use MAPDL to extract result data and then write the results to an output text file. These scripts work fine but it is often hard to link the Mechanical model with the content of the exported file.?
In the example we’ll consider today, a model has several joints defined:?
and an APDL script has been used to extract the reaction forces and moments on these joints. (Note – other methods could have been used for extracting these results, but this is not the point of this script tip).
It is not easy to relate the joint’s name in Mechanical to the element number used by the MAPDL solver, which is what the MAPDL post-processing script is usually based on.
To alleviate this problem, Mechanical automation scripting and MAPDL scripting can be combined.
The following Mechanical Automation script will browse through the connections’ folder and insert an APDL command snippet under each joint, provided that it is not in suppressed stat
connections_folder = ExtAPI.DataModel.Project.Model.Connections
joints = connections_folder.GetChildren(DataModelObjectCategory.Joint,True)
nb_joints = 0
for j in joints:???????
???????if j.Suppressed is False:
???????????? nb_joints += 1
?????????????with Transaction():
?????????????????new_snippet = j.AddCommandSnippet()
?????????????????string1 = 'joint_'+str(nb_joints) + ' = _jid \n'
?????????????????string2 = '*DIM,joint_name_'+str(nb_joints)+',string,248 \n'
??????????????? string3 = 'joint_name_'+str(nb_joints) + '(1) = \'' + j.Name + '\'\n'
?????????????????new_snippet.AppendText(string1)
?????????????????new_snippet.AppendText(string2)
?????????????????new_snippet.AppendText(string3)
new_snippet.AppendText("nb_joints = " + str(nb_joints))
ExtAPI.DataModel.Tree.Refresh()
Each command snippet is automatically populated with a few lines of MAPDL code to store the joint element number and the joint’s name.
领英推荐
joint_1 = _jid ! Retrieve element type number that is used by MAPDL solver
*DIM,joint_name_1,string,248 ! Create an MAPDL array to store joint name
joint_name_1(1) = 'Spherical - SYS-11\Surface To SYS-11\Surface' ! Retrieve joint name from Mechanical and store it in the MAPDL array
Then, for the MAPDL post-processing macro,
?it is easy to loop over all the joints as their total number has been evaluated in the Mechanical automation script and stored in variable nb_joints. The Mechanical name of each joint is known and can be used in the MAPDL macro, and more specifically can be written in the exported file.
As an example, the MAPDL script below will extract reaction forces and moments on the “I” joint node for each joint in the model:?
/POST1 ! Enter general post-processor
?
/out,outputfile,txt ! Redirect output to outputfile.txt
/out
?
SET,LAST ! Consider last time step
ALLS ! Select all model
RSYS,solu ! Use solution coordinate system
*do,i,1,nb_joints !Loop over all joints in model
?
ESEL,S,TYPE,,joint_%i% ! Select element accounting for joint n°i
NSLE ! Select nodes attached to element
*GET,Nnumero1,NODE,,num,min ! Get “I” node of element (first node)
*GET,loc_X%i%,NODE,Nnumero1,LOC,X ! Get X location of node
*GET,loc_Y%i%,NODE,Nnumero1,LOC,Y ! Get Y location of node
*GET,loc_Z%i%,NODE,Nnumero1,LOC,Z ! Get Z location of node
*GET,staticFX%i%,elem,elnext(0),SMISC,1 ! Get FX on node
*GET,staticFY%i%,elem,elnext(0),SMISC,2 ! Get FY on node
*GET,staticFZ%i%,elem,elnext(0),SMISC,3 ! Get FZ on node
*GET,staticMX%i%,elem,elnext(0),SMISC,4 ! Get MX on node
*GET,staticMY%i%,elem,elnext(0),SMISC,5 ! Get MY on node
*GET,staticMZ%i%,elem,elnext(0),SMISC,6 ! Get MZ on node
?
/out,outputfile,txt,,append ! Append outputfile.txt and write a table with Joint Name in Mechanical and FX, FY, FZ, MX, MY, MZ reaction forces.
*vwrite,joint_name_%i%(1),joint_name_%i%(9),joint_name_%i%(17),joint_name_%i%(25),joint_name_%i%(33),joint_name_%i%(41),Nnumero1,loc_X%i%,loc_Y%i%,loc_Z%i%,staticFX%i%,staticFY%i%,staticFZ%i%,staticMX%i%,staticMY%i%,staticMZ%i%
(6(A8),F12.0,10(F12.1))
/out
*enddo
The outputfile.txt file is written in the solver’s file directory:?
and can be opened in any text editor:?
team lead, leadership, FEA simulation and its automation/programming
2 年I understand the example is a show case for apdl+python and thank you for that. Only if line to ask if this works be also possible fully with python? The joint elements numbers are accessible via ExtAPI?
Aerospace Stress Engineer | Structural Analyst FEA (ANSYS) 17+ Years of experience | FEA Trainer & Consultant | EU-Funded Projects |Elevate Your Aerospace Engineering Career with Insider Techniques
2 年Thanks for sharing, this is a very useful tip for me! I use MAPDL very often in my workflows.
Mechanical Engineer
2 年These articles are awesome!
Manager Consulting Services at ANSYS, Inc.
2 年Pernelle, thanks for sharing. This kind of combined automation is definitely something we encounter a lot. One issue that I see with your script (that I have encountered when doing this) is that it will only work when doing a complete solve, not as post only commands. When executing as post only commands the APDL parameters needed (nb_joints, etc) are not available.
Lead Aerospace Engineer
2 年Greate article ! Would be nice to see something similar applied to contact pairs?