Statically Indeterminate Reaction Force Analysis

Problem Description:
  • A cantilever beam of thickness \(t\) and length \(l\) has a depth which tapers uniformly from \(d\) at the tip to \(3d\) at the wall. It is loaded by a force \(F\) at the tip, as shown. Find the maximum bending stress at the mid-length (\(X = l\)) and the fixed end of the beam.

Reference:
  • S. H. Crandall, N. C. Dahl, An Introduction to the Mechanics of Solids, McGraw-Hill Book Co., Inc., New York, NY, 1959, pg. 342, problem 7.18.

Analysis Type(s):
  • Static Analysis ANTYPE=0

Element Type(s):
  • 2-D 4-Node Sructural Solid Elements (PLANE182)

  • 2-D 8-Node Structural Solid Elements (PLANE183)

VM5 Problem Sketch
Material Properties
  • \(E = 30 \cdot 10^6 psi\)

  • \(\nu = 0.0\)

  • \(d = 3in\)

  • \(t = 2in\)

Geometric Properties:
  • \(l = 50 in\)

  • \(d = 3 in\)

  • \(t = 2 in\)

Loading:
  • \(F = 4000 lb\)

Notes:
  • Two different solutions are obtained. The first solution uses lower order PLANE182 elements and the second solution uses higher order PLANE82 elements. The 2 inch thickness is incorporated by using the plane stress with thickness option. Poisson’s ratio is set to 0.0 to agree with beam theory.

# sphinx_gallery_thumbnail_path = '_static/vm5_setup.png'

Start MAPDL

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*****\n     DO NOT USE RESULTS FOR PRODUCTION\n\n          ***** ANSYS ANALYSIS DEFINITION (PREP7) *****'

Define Material

Set up the material using PLANE182 with a thickness of 2 (using real constants), and create a material with a Young’s modulus of 30e6, and a poisson’s ratio of 0.0 to agree with beam theory.

mapdl.antype("STATIC")
mapdl.et(1, "PLANE182", kop1=2, kop3=3)
mapdl.r(1, 2)
mapdl.mp("EX", 1, 30e6)
mapdl.mp("NUXY", 1, 0.0)

Out:

'MATERIAL          1     NUXY =   0.000000'

Define Geometry

Set up the nodes and elements. This creates a mesh just like in the problem setup.

mapdl.n(1, 25)
mapdl.n(7, 75)
mapdl.fill()
mapdl.n(8, 25, -3)
mapdl.n(14, 75, -9)
mapdl.fill()
mapdl.e(2, 1, 8, 9)
mapdl.egen(6, 1, 1)
mapdl.eplot(show_node_numbering=True, cpos="xy")
vm 005 laterally loaded tapered support structure

Out:

/opt/hostedtoolcache/Python/3.8.12/x64/lib/python3.8/site-packages/pyvista/core/dataset.py:1192: PyvistaDeprecationWarning: Use of `point_arrays` is deprecated. Use `point_data` instead.
  warnings.warn(
/opt/hostedtoolcache/Python/3.8.12/x64/lib/python3.8/site-packages/pyvista/core/dataset.py:1332: PyvistaDeprecationWarning: Use of `cell_arrays` is deprecated. Use `cell_data` instead.
  warnings.warn(

[(50.0, -4.5, 98.144908855912),
 (50.0, -4.5, 0.0),
 (0.0, 1.0, 0.0)]

Define Boundary Conditions

Fix the nodes at the larger end (the “wall” end) and apply a vertical force to the whole structure.

# constrain nodes at fixed end
mapdl.nsel("S", "LOC", "X", 75)
mapdl.d("ALL", "ALL")
mapdl.nsel("ALL")
mapdl.f(1, "FY", -4000)
mapdl.finish()

Out:

'***** ROUTINE COMPLETED *****  CP =         0.000'

Solve

Enter solution mode and solve the system.

mapdl.run("/SOLU")
mapdl.solve()
mapdl.finish()

Out:

'FINISH SOLUTION PROCESSING\n\n\n ***** ROUTINE COMPLETED *****  CP =         0.000'

Post-processing

Enter post-processing. Get the stress at the fixed end and the mid point of the structure by querying the stress at nodes closest to these locations. We’ve gathered the code into a function because we’ll have use for it later.

def fetch_mid_and_end_stress(m):
    q = m.queries
    m.post1()
    end = q.node(75.0, 0.0, 0.0)
    fixed_end_stress = m.get_value("NODE", end, "S", "X")
    mid = q.node(50.0, 0.0, 0.0)
    mid_stress = m.get_value("NODE", mid, "S", "EQV")
    return fixed_end_stress, mid_stress


fixed_end_stress_182, mid_stress_182 = fetch_mid_and_end_stress(mapdl)

Plotting

View the equivalent stress, and displacement, of the cantilever with a displacement_factor of 26 to scale up the deformation to a visible amount.

result = mapdl.result
result.plot_principal_nodal_stress(
    0,
    "SEQV",
    show_edges=True,
    show_displacement=True,
    displacement_factor=26.0,
    cmap="Oranges",
    cpos="xy",
)
vm 005 laterally loaded tapered support structure

Out:

/opt/hostedtoolcache/Python/3.8.12/x64/lib/python3.8/site-packages/pyvista/core/dataset.py:1192: PyvistaDeprecationWarning: Use of `point_arrays` is deprecated. Use `point_data` instead.
  warnings.warn(
/opt/hostedtoolcache/Python/3.8.12/x64/lib/python3.8/site-packages/pyvista/core/dataset.py:1332: PyvistaDeprecationWarning: Use of `cell_arrays` is deprecated. Use `cell_data` instead.
  warnings.warn(

Redo with Plane 183

Now we need to perform the simulation again but this time using the PLANE183 element type. We additionally remove midside nodes with emid.

mapdl.prep7()
mapdl.et(1, "PLANE183", kop3=3)
mapdl.emid()
mapdl.nsel("R", "LOC", "X", 75)
mapdl.nsel("R", "LOC", "Y", -4.5)

mapdl.d("ALL", "ALL")
mapdl.nsel("ALL")
mapdl.finish()
mapdl.run("/SOLU")
mapdl.solve()
mapdl.finish()

mapdl.post1()
# reuse our function from earlier
fixed_end_stress_183, mid_stress_183 = fetch_mid_and_end_stress(mapdl)
mapdl.finish()

result = mapdl.result
result.plot_principal_nodal_stress(
    0,
    "SEQV",
    show_edges=True,
    show_displacement=True,
    displacement_factor=26.0,
    cmap="Blues",
    cpos="xy",
)
vm 005 laterally loaded tapered support structure

Out:

/opt/hostedtoolcache/Python/3.8.12/x64/lib/python3.8/site-packages/pyvista/core/dataset.py:1192: PyvistaDeprecationWarning: Use of `point_arrays` is deprecated. Use `point_data` instead.
  warnings.warn(
/opt/hostedtoolcache/Python/3.8.12/x64/lib/python3.8/site-packages/pyvista/core/dataset.py:1332: PyvistaDeprecationWarning: Use of `cell_arrays` is deprecated. Use `cell_data` instead.
  warnings.warn(

Check Results

Now that we have the stresses we can compare them to the expected values of stress at the midpoint (8333) and the fixed end (7407) for both simulations.

results_182 = f"""
-----------------  PLANE 182 RESULTS COMPARISON  ----------------
|    LABEL    |   TARGET   |   Mechanical APDL   |   RATIO
   mid stress      8333        {mid_stress_182:.2f}               {mid_stress_182 / 8333:.2f}
   end stress      7407        {fixed_end_stress_182:.2f}               {fixed_end_stress_182 / 7407:.2f}
----------------------------------------------------------------
"""

results_183 = f"""
-----------------  PLANE 183 RESULTS COMPARISON  ----------------
|    LABEL    |   TARGET   |   Mechanical APDL   |   RATIO
   mid stress      8333        {mid_stress_183:.2f}               {mid_stress_183 / 8333:.2f}
   end stress      7407        {fixed_end_stress_183:.2f}               {fixed_end_stress_183 / 7407:.2f}
----------------------------------------------------------------
"""
print(results_182)
print(results_183)

Out:

-----------------  PLANE 182 RESULTS COMPARISON  ----------------
|    LABEL    |   TARGET   |   Mechanical APDL   |   RATIO
   mid stress      8333        8163.66               0.98
   end stress      7407        7151.10               0.97
----------------------------------------------------------------


-----------------  PLANE 183 RESULTS COMPARISON  ----------------
|    LABEL    |   TARGET   |   Mechanical APDL   |   RATIO
   mid stress      8333        8363.71               1.00
   end stress      7407        7408.98               1.00
----------------------------------------------------------------

Total running time of the script: ( 0 minutes 1.245 seconds)

Gallery generated by Sphinx-Gallery