Script Tip Friday - Efficiently Combining MAPDL and Mechanical Scripting
Come back each Friday to learn Script tips from the Ansys experts

Script Tip Friday - Efficiently Combining MAPDL and Mechanical Scripting

This Script Tip Friday is brought to you by Pernelle Marone-Hitz , who is a Lead Application Engineer here at Ansys.

No alt text provided for this image
Pernelle Marone-Hitz, Lead Application Engineer 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.

No alt text provided for this image

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:?

No alt text provided for this image

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.

No alt text provided for this image

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,

No alt text provided for this image

?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:?

No alt text provided for this image

/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:?

No alt text provided for this image

and can be opened in any text editor:?

No alt text provided for this image

Do you have a Script Tip worth sharing? Let us know in the comments and we will reach out to learn more and feature you on our next Script Tip Friday.

Pavel Urubcik

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?

回复
Dimitris Stamatelos, Ph.D

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.

Márcio Cristo

Mechanical Engineer

2 年

These articles are awesome!

James Kosloski

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.

Marcin Chilik

Lead Aerospace Engineer

2 年

Greate article ! Would be nice to see something similar applied to contact pairs?

要查看或添加评论,请登录

社区洞察

其他会员也浏览了