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:
- RF axisymmetric with OUTPUT 3D (RF axisymmetric with OUTPUT 3D): about the 2° versus 360° scale of RF, which the *NODE FILE section documents. Its last post suggests documenting the scale for *NODE PRINT too:
*NODE PRINTprints RF for the 2° segment while*NODE FILE(OUTPUT=2D) stores it for 360° (frd.cline 1524 multiplies by 180). That scale is not the error reported here; the numbers below are compared at the matching scale. - Force ouput of 2D asymmetric compression model less than experimental value (O-ring compression, CAX elements): the axial reaction looked 180 times too small, again the 2° scale. It concerns the axial component, which is right here.
- Technical Proposal: Implementation of Independent Reaction Force Output in CalculiX · Issue #146 · Dhondtguido/CalculiX · GitHub, Technical Proposal: Implementation of Independent Reaction Force Output and summary of applied and reaction forces in CalculiX · Issue #224 · Dhondtguido/CalculiX · GitHub and PR Output only reaction forces. by g0mb4 · Pull Request #154 · Dhondtguido/CalculiX · GitHub ask for a separate reaction-only output; they do not concern axisymmetric elements. In the forum thread of that pull request, Output reaction forces only - #37 by vicmw lists axisymmetric models among the cases such an output must be checked on; no axisymmetric result is reported there.
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.