Note
Click here to download the full example code
Thermally Loaded Support Structure#
- Problem Description:
Find the stresses in the copper and steel wire structure shown below. The wires have a cross-sectional area of math:A. The structure is subjected to a load math:Q and a temperature rise of math:Delta T after assembly.
- Reference:
S. Timoshenko, Strength of Materials, Part I, Elementary Theory and Problems, 3rd Edition, D. Van Nostrand Co., Inc., New York, NY, 1955, pg. 30, problem 9.
- Analysis Type(s):
Static Analysis
ANTYPE=0
- Element Type(s):
3-D Spar (or Truss) Elements (LINK180)

- Material Properties
\(E_c = 16 \cdot 10^6 psi\)
\(E_s = 30 \cdot 10^6 psi\)
\(\alpha_c = 70 \cdot 10^{-7} in/in-^\circ F\)
\(\alpha_s = 92 \cdot 10^{-7} in/in-^\circ F\)
- Geometric Properties:
\(A = 0.1 in^2\)
- Loading:
\(Q = 4000 lb\)
\(\Delta T = 10 ^\circ F\)
- Analytical Equations:
The compressive force \(X\) is given by the following equation
\(X = \frac{\Delta T (\alpha_c - \alpha_s) (A_s - E_s) }{1 + \frac{1 E_s A_s}{2 E_c A_c}} + \frac{Q}{1 + \frac{2 E_c A_c}{E_s A_s}}\)
- Notes:
Length of wires (20 in.), spacing between wires (10 in.), and the reference temperature (70°F) are arbitrarily selected. The rigid lower beam is modeled by nodal coupling.
# sphinx_gallery_thumbnail_path = '_static/vm3_setup.png'
from ansys.mapdl.core import launch_mapdl
# start mapdl and clear it
mapdl = launch_mapdl()
mapdl.clear() # optional as MAPDL just started
# enter verification example mode and the pre-processing routine
mapdl.verify()
mapdl.prep7()
Out:
*****ANSYS VERIFICATION RUN ONLY*****
DO NOT USE RESULTS FOR PRODUCTION
***** ANSYS ANALYSIS DEFINITION (PREP7) *****
Define Material#
Set up the materials and their properties. We are using copper and steel here. - EX - X-direction elastic modulus - ALPX - Secant x - coefficient of thermal expansion
mapdl.antype("STATIC")
mapdl.et(1, "LINK180")
mapdl.sectype(1, "LINK")
mapdl.secdata(0.1)
mapdl.mp("EX", 1, 16e6)
mapdl.mp("ALPX", 1, 92e-7)
mapdl.mp("EX", 2, 30e6)
mapdl.mp("ALPX", 2, 70e-7)
# Define the reference temperature for the thermal strain calculations.
mapdl.tref(70)
Out:
REFERENCE TEMPERATURE= 70.000 (TUNIF= 70.000)
Define Geometry: Nodes#
Set up the nodes and elements. This creates a mesh just like in the problem setup. We create a square of nodes and use fill to add mid-point nodes to two opposite sides.
mapdl.n(1, -10)
mapdl.n(3, 10)
mapdl.fill()
mapdl.n(4, -10, -20)
mapdl.n(6, 10, -20)
mapdl.fill()
mapdl.nplot(nnum=True, cpos="xy")

Define Geometry: Elements#
Create two elements (using material #1) that are two sides of our square, as links. Then create a single element using material #2 between the first 2 that is parallel to them.
mapdl.e(1, 4)
mapdl.e(3, 6)
mapdl.mat(2)
mapdl.e(2, 5)
mapdl.eplot(show_node_numbering=True, cpos="xy")

Define Boundary Conditions#
Couple the degrees of freedom in y-displacement across nodes 5, 4, and 6.
Fix nodes 1, 2, and 3 in place.
Apply a force of -4000 in the y-direction to node 5
Apply a uniform temperature of 80 to the whole body
Finally, exit the post-processor.
mapdl.cp(1, "UY", 5, 4, 6)
mapdl.d(1, "ALL", "", "", 3)
mapdl.f(5, "FY", -4000)
mapdl.bfunif("TEMP", 80)
mapdl.finish()
Out:
***** ROUTINE COMPLETED ***** CP = 0.000
Solve#
Enter solution mode
Specify a timestep of 1 to be used for this load step
Solve the system.
mapdl.run("/SOLU")
mapdl.nsubst(1)
mapdl.solve()
Out:
***** ANSYS SOLVE COMMAND *****
*** NOTE *** CP = 0.000 TIME= 00:00:00
There is no title defined for this analysis.
*****ANSYS VERIFICATION RUN ONLY*****
DO NOT USE RESULTS FOR PRODUCTION
S O L U T I O N O P T I O N S
PROBLEM DIMENSIONALITY. . . . . . . . . . . . .3-D
DEGREES OF FREEDOM. . . . . . UX UY UZ
ANALYSIS TYPE . . . . . . . . . . . . . . . . .STATIC (STEADY-STATE)
GLOBALLY ASSEMBLED MATRIX . . . . . . . . . . .SYMMETRIC
*** NOTE *** CP = 0.000 TIME= 00:00:00
Present time 0 is less than or equal to the previous time. Time will
default to 1.
*** NOTE *** CP = 0.000 TIME= 00:00:00
The conditions for direct assembly have been met. No .emat or .erot
files will be produced.
L O A D S T E P O P T I O N S
LOAD STEP NUMBER. . . . . . . . . . . . . . . . 1
TIME AT END OF THE LOAD STEP. . . . . . . . . . 1.0000
NUMBER OF SUBSTEPS. . . . . . . . . . . . . . . 1
STEP CHANGE BOUNDARY CONDITIONS . . . . . . . . NO
PRINT OUTPUT CONTROLS . . . . . . . . . . . . .NO PRINTOUT
DATABASE OUTPUT CONTROLS. . . . . . . . . . . .ALL DATA WRITTEN
FOR THE LAST SUBSTEP
Range of element maximum matrix coefficients in global coordinates
Maximum = 150000 at element 0.
Minimum = 80000 at element 0.
*** ELEMENT MATRIX FORMULATION TIMES
TYPE NUMBER ENAME TOTAL CP AVE CP
1 3 LINK180 0.000 0.000000
Time at end of element matrix formulation CP = 0.
SPARSE MATRIX DIRECT SOLVER.
Number of equations = 1, Maximum wavefront = 0
Memory available (MB) = 0.0 , Memory required (MB) = 0.0
Sparse solver maximum pivot= 0 at node 0 .
Sparse solver minimum pivot= 0 at node 0 .
Sparse solver minimum pivot in absolute value= 0 at node 0 .
*** ELEMENT RESULT CALCULATION TIMES
TYPE NUMBER ENAME TOTAL CP AVE CP
1 3 LINK180 0.000 0.000000
*** NODAL LOAD CALCULATION TIMES
TYPE NUMBER ENAME TOTAL CP AVE CP
1 3 LINK180 0.000 0.000000
*** LOAD STEP 1 SUBSTEP 1 COMPLETED. CUM ITER = 1
*** TIME = 1.00000 TIME INC = 1.00000 NEW TRIANG MATRIX
Post-processing#
Access the queries functions
Find a steel node and a copper node
Then use these to get the steel and copper elements
Finally extract the stress experienced by each element
mapdl.post1()
q = mapdl.queries
steel_n = q.node(0, 0, 0)
copper_n = q.node(10, 0, 0)
steel_e = q.enearn(steel_n)
copper_e = q.enearn(copper_n)
mapdl.etable("STRS_ST", "LS", 1)
mapdl.etable("STRS_CO", "LS", 1)
stress_steel = mapdl.get("_", "ELEM", steel_e, "ETAB", "STRS_ST")
stress_copper = mapdl.get("_", "ELEM", copper_e, "ETAB", "STRS_CO")
Check Results#
Now that we have the response we can compare the values to the expected stresses of 19695 and 10152 respectively.
steel_target = 19695
steel_ratio = stress_steel / steel_target
copper_target = 10152
copper_ratio = stress_copper / copper_target
message = f"""
------------------- VM3 RESULTS COMPARISON ---------------------
| TARGET | Mechanical APDL | RATIO
----------------------------------------------------------------
Steel {steel_target} {stress_steel} {steel_ratio:.6f}
Copper {copper_target} {stress_copper} {copper_ratio:.6f}
----------------------------------------------------------------
"""
print(message)
Out:
------------------- VM3 RESULTS COMPARISON ---------------------
| TARGET | Mechanical APDL | RATIO
----------------------------------------------------------------
Steel 19695 19695.4839 1.000025
Copper 10152 10152.2581 1.000025
----------------------------------------------------------------
stop mapdl
mapdl.exit()
Total running time of the script: ( 0 minutes 0.765 seconds)