Axisymmetric elements: radial RF picks up the hoop force of the 2° segment, so one CAX4 shows 0.38 of the reaction and free, unloaded nodes show RF

Summary

The manual defines RF as the sum of the external forces in a node, i.e. loads plus reactions: section 6.11.5 (Forces obtained by selecting RF) of the 2.23 manual says “With RF you get the sum of all external forces in a node” (see also section 7.99, *NODE PRINT). For axisymmetric elements (CAX4, CAX8, CAX8R) the radial component of RF in ccx 2.23 is not that:

  • at a node under a prescribed radial displacement, RF is a mesh-dependent fraction of the reaction: 0.381 of it on one CAX4 element, rising to 0.95 on 16 elements in the same ring;
  • at free, unloaded nodes RF is not zero.

Both the .dat file (*NODE PRINT) and the .frd file (*NODE FILE) are affected. The axial component is right. The displacements are right; only the force output is off.

The cause is the mapping of the forces from the expanded 2° segment back to the 2-D nodes: it adds the global x, y, z components of the two expansion nodes, which sit at ±1°. Their forces also contain the hoop force acting on the cut faces of the segment. The x components of those hoop forces add up instead of cancelling.

Version

ccx 2.23 (macOS arm64). Source: master 9ba5d76 (16 Oct 2026).

Already reported or fixed?

Not reported: I found no matching GitHub issue (open or closed) or pull request in Dhondtguido/CalculiX, and no calculix.discourse.group topic (searched 21 Oct 2026). Not fixed: map3dto1d2d.f is unchanged on master (9ba5d76).

Related:

Minimal input

cax_rf.inp:

** one CAX4 ring element, r 10 to 20, height 5; all nodes held axially;
** inner nodes 1 and 4 pushed out by the displacement that a pressure of 1
** on the inner face gives (cax_p.inp)
*NODE, NSET=NALL
1, 10., 0.
2, 20., 0.
3, 20., 5.
4, 10., 5.
*ELEMENT, TYPE=CAX4, ELSET=EALL
1, 1, 2, 3, 4
*NSET, NSET=INNER
1, 4
*MATERIAL, NAME=M
*ELASTIC
210000., 0.3
*SOLID SECTION, ELSET=EALL, MATERIAL=M
*BOUNDARY
NALL, 2, 2
*STEP
*STATIC
*BOUNDARY
INNER, 1, 1, 8.098171E-05
*NODE PRINT, NSET=NALL
RF
*NODE PRINT, NSET=INNER, TOTALS=ONLY
RF
*NODE FILE
RF
*END STEP

cax_p.inp is the same model under load control: the step’s *BOUNDARY card and its line INNER, 1, 1, 8.098171E-05 are replaced by

*DLOAD
1, P4, 1.
*NODE PRINT, NSET=INNER
U

How to run

ccx cax_p
ccx cax_rf

Expected

cax_p gives the inner displacement used in cax_rf:

         1  8.098171E-05  0.000000E+00  0.000000E+00
         4  8.098171E-05  0.000000E+00  0.000000E+00

The model is linear and both runs have the same stiffness, so the reaction in cax_rf equals the load of cax_p: a pressure of 1 on the inner face, 2π · 10 · 5 = 314.159 for the full circumference, or 314.159 / 180 = 1.74533 for the 2° segment. The outer nodes 2 and 3 are free and unloaded, so their RF is 0.

Actual

.dat (2° segment):

 forces (fx,fy,fz) for set NALL and time  0.1000000E+01

         1  3.326568E-01 -7.215169E-01  1.776357E-15
         2 -3.326568E-01 -3.253086E-01  1.776357E-15
         3 -3.326568E-01  3.253086E-01 -3.552714E-15
         4  3.326568E-01  7.215169E-01  1.776357E-15

 total force (fx,fy,fz) for set INNER and time  0.1000000E+01

        6.653136E-01 -1.554312E-15  3.552714E-15

.frd (360°):

 -1         1 5.98782E+01-1.29873E+02 3.23411E-13
 -1         2-5.98782E+01-5.85555E+01 3.16078E-13
 -1         3-5.98782E+01 5.85555E+01-6.43155E-13
 -1         4 5.98782E+01 1.29873E+02 3.23411E-13
  • Inner reaction: 0.6653136 instead of 1.74533 (.dat), 2 × 59.8782 = 119.756 instead of 314.159 (.frd): 0.381 of the reaction in both files.
  • Outer nodes 2 and 3 (free, unloaded): radial RF −0.3326568 (.dat) and −59.8782 (.frd) instead of 0.

The same test on the same ring with more elements in the radial direction gives an inner reaction of 0.642 (2 CAX4), 0.807 (4), 0.949 (16) of the true value; CAX8R gives 0.759, 0.868, 0.932 and 0.983 on 1, 2, 4 and 16 elements, although its inner displacement under the pressure is the same to seven digits on all four meshes. Each mesh divides the ring (r 10 to 20, height 5) into n equal elements in r: CAX4 nodes at r = 10 + 10 i / n, z = 0 and 5; CAX8R adds the midside nodes (r halfway, z = 0 and 5; r on the element edges, z = 2.5). Each mesh runs twice: first with the pressure 1, P4, 1. on the inner face of element 1, which gives the inner radial displacement u, then with u prescribed on the inner nodes (r = 10) as in cax_rf.inp, and with *NODE PRINT, NSET=INNER, TOTALS=YES / U, RF. The ratio is the total inner RF over the 2° share of the pressure load, 314.159 / 180 = 1.74533.

cax4_2.inp: the two-element CAX4 mesh with the prescribed displacement
*NODE, NSET=NALL
1, 10, 0
2, 15, 0
3, 15, 5
4, 10, 5
5, 20, 0
6, 20, 5
*ELEMENT, TYPE=CAX4, ELSET=EALL
1, 1, 2, 3, 4
2, 2, 5, 6, 3
*NSET, NSET=INNER
1, 4
*MATERIAL, NAME=M
*ELASTIC
210000., 0.3
*SOLID SECTION, ELSET=EALL, MATERIAL=M
*BOUNDARY
NALL, 2, 2
*STEP
*STATIC
*BOUNDARY
INNER, 1, 1, 8.750486000000e-05
*NODE PRINT, NSET=INNER, TOTALS=YES
U, RF
*END STEP

Total inner RF 1.119697 = 0.64154 × 1.74533.

The axial RF is right: one CAX4 ring under an axial *CLOAD of 1000 (full circumference: 500 at each top node) has an axial RF total of −5.555556 (.dat, 2°) at its held nodes, i.e. −1000 / 180.

axial_cload.inp
*NODE, NSET=NALL
1, 10., 0.
2, 20., 0.
3, 20., 5.
4, 10., 5.
*ELEMENT, TYPE=CAX4, ELSET=EALL
1, 1, 2, 3, 4
*NSET, NSET=BOT
1, 2
*NSET, NSET=TOP
3, 4
*MATERIAL, NAME=M
*ELASTIC
210000., 0.
*SOLID SECTION, ELSET=EALL, MATERIAL=M
*BOUNDARY
BOT, 2, 2
1, 1, 1
*STEP
*STATIC
*CLOAD
TOP, 2, 500.
*NODE PRINT, NSET=BOT, TOTALS=YES
RF
*NODE PRINT, NSET=TOP
U
*END STEP

*NODE PRINT total for BOT: 2.553151E-02, −5.555556E+00, 6.661338E-16.

Where it goes wrong

*NODE FILE, OUTPUT=3D shows the forces in the expanded 2° segment. For cax_rf with *NODE FILE changed to *NODE FILE, OUTPUT=3D, the inner expansion nodes 5 and 14 (at −1°) and 7 and 16 (at +1°) carry:

 -1         5 1.66328E-01-3.60758E-01-1.54634E+01
 -1         7 1.66328E-01-3.60758E-01 1.54634E+01
 -1         8-1.66328E-01-1.62654E-01-9.52895E+00

The large z components are the hoop forces on the two cut faces of the segment. Projected on each node’s own radial direction (cos 1°, 0, ∓sin 1°), the inner nodes carry 0.166328 cos 1° + 15.4634 sin 1° = 0.436176 each: 4 × 0.436176 = 1.744705 for the segment, 314.047 for 360°, within 0.04 % of 314.159. The outer nodes carry −0.166328 cos 1° + 9.52895 sin 1° ≈ 4E-07, i.e. zero. So the expanded model has the right reaction.

src/map3dto1d2d.f (called for the forces from src/resultsprint.f line 223) maps them to the 2-D nodes by adding the components of the two expansion nodes, lines 561-571:

!                    middle nodes of quadratic 2d-elements
!                    or end nodes of linear 2d-elements
                     do l=1,3,2
                        node3d=kon(indexe+node8(l,j))
                        if(inum(node3d).ne.0) cycle
                        inum(node3d)=1
                        do k=1,nfield
                           yn(k,node2d)=yn(k,node2d)+yn(k,node3d)
                        enddo
                     enddo

For plane stress and plane strain elements the two expansion nodes are parallel copies, and this sum is right. For axisymmetric elements they are rotated by ±1° about the y axis (src/gen3dfrom2d.f lines 301-313), so x of the sum is 2 f_r cos 1° − 2 f_hoop sin 1°: the hoop force term is the error. It shrinks with the element size along r, as observed.

Fix

Possible fix (not built or tested): in map3dto1d2d.f, for axisymmetric elements, sum the expansion nodes’ forces in their own cylindrical axes, i.e. take f_x cos 1° ∓ f_z sin 1° as the radial part and f_y as the axial part, and drop the hoop part (the circumferential displacement is constrained). The same applies to the quadratic elements (lines 547-558, three nodes through the segment).

Workaround: take radial reactions of axisymmetric models from *NODE FILE, OUTPUT=3D projected on the radial direction as above, or from a load-controlled run.

Confirmed (using official ccx 2.23 build on Windows), needs a GitHub ticket.

cax_p.dat:

                        S T E P       1


                                INCREMENT     1


 displacements (vx,vy,vz) for set INNER and time  0.1000000E+01

         1  8.098171E-05  0.000000E+00  0.000000E+00
         4  8.098171E-05  0.000000E+00  0.000000E+00

 forces (fx,fy,fz) for set NALL and time  0.1000000E+01

         1  3.327075E-01 -7.216268E-01 -1.776357E-15
         2 -3.327075E-01 -3.253581E-01  1.776357E-15
         3 -3.327075E-01  3.253581E-01  1.776357E-15
         4  3.327075E-01  7.216268E-01 -5.329071E-15

 total force (fx,fy,fz) for set INNER and time  0.1000000E+01

        6.654149E-01  9.992007E-16 -7.105427E-15

Posted: Axisymmetric elements: radial RF picks up the hoop force of the 2° segment, so one CAX4 shows 0.38 of the reaction and free, unloaded nodes show RF · Issue #229 · Dhondtguido/CalculiX · GitHub

1 Like