Simplified bolt connection with beam element and rigid constraints

Hello,

I am using PrePoMax with the CalculiX solver and I would like to model a simplified bolted connection using a beam element. I do not model the bolt or washers as solids; I just want to connect two clamped surfaces.

I understand that I need to:

  • create a beam section for the bolt, and

  • connect the degrees of freedom of the surfaces to the beam nodes using *EQUATION or similar constraints.

Could you please provide a simple, detailed example model showing step-by-step how to:

  1. Create the beam section.

  2. Define reference nodes for the surfaces.

  3. Connect the surfaces to the beam nodes so that all relevant DOFs are properly transferred.

A small example file or a workflow description would be extremely helpful for understanding the correct way to implement this in PrePoMax.

Thank you very much for your help.

1 Like

Bolts are the most common topic here, so you can find many threads and examples about them. However, in PrePoMax/CalculiX, they are usually modeled using solid elements, sometimes springs or rigid links (couplings/rigid body constraints). The approach with beams is more tricky. Here are some examples:

For the other 1D element approaches see those threads:

And a video example here: https://www.youtube.com/watch?v=AiLCzKAOdx0

2 Likes

Thank you so much for your help this morning!

Here is my model :

I’ve reached the following stage in my .inp file:

**
** Heading +++++++++++++++++++++++++++++++++++++++++++++++++
**
*Heading
Hash: DNXQftHo, Date: 03/10/2026, Unit system: MM_TON_S_C
**
** Nodes +++++++++++++++++++++++++++++++++++++++++++++++++++
**
*Node
... hidden data ...
25965, 0, 0, 0
**
** Elements ++++++++++++++++++++++++++++++++++++++++++++++++
**
*Element, Type=C3D10, Elset=B
... hidden data ...
*Element, Type=C3D10, Elset=A
... hidden data ...
*Element, Type=B32, Elset=EBolt0
9614, 25964, 25965, 25966
**
** Node sets +++++++++++++++++++++++++++++++++++++++++++++++
**
*Nset, Nset=head
... hidden data ...
*Nset, Nset=nut
... hidden data ...
*Nset, Nset=Internal-1_sHead
... hidden data ...
*Nset, Nset=Internal-1_sNut
... hidden data ...
*Nset, Nset=Internal_Selection-1_Fixed-1
... hidden data ...
*Nset, Nset=force
... hidden data ...
*Nset, Nset=Internal-1_sForce
... hidden data ...
*Nset, Nset=cA
... hidden data ...
*Nset, Nset=cB
... hidden data ...
*Nset, Nset=Internal-1_sCA
... hidden data ...
*Nset, Nset=Internal-1_sCB
... hidden data ...
**
** Additional node sets ++++++++++++++++++++++++++++++++++++
**
... hidden data ...
**
** Element sets ++++++++++++++++++++++++++++++++++++++++++++
**
*Elset, Elset=Internal-1_sHead_S4
... hidden data ...
*Elset, Elset=Internal-1_sHead_S1
... hidden data ...
*Elset, Elset=Internal-1_sHead_S3
... hidden data ...
*Elset, Elset=Internal-1_sHead_S2
... hidden data ...
*Elset, Elset=Internal-1_sNut_S1
... hidden data ...
*Elset, Elset=Internal-1_sNut_S4
... hidden data ...
*Elset, Elset=Internal-1_sNut_S2
... hidden data ...
*Elset, Elset=Internal-1_sNut_S3
... hidden data ...
*Elset, Elset=Internal-1_sForce_S3
... hidden data ...
*Elset, Elset=Internal-1_sForce_S2
... hidden data ...
*Elset, Elset=Internal-1_sForce_S4
... hidden data ...
*Elset, Elset=Internal-1_sForce_S1
... hidden data ...
*Elset, Elset=Internal-1_sCA_S1
... hidden data ...
*Elset, Elset=Internal-1_sCA_S2
... hidden data ...
*Elset, Elset=Internal-1_sCA_S4
... hidden data ...
*Elset, Elset=Internal-1_sCA_S3
... hidden data ...
*Elset, Elset=Internal-1_sCB_S2
... hidden data ...
*Elset, Elset=Internal-1_sCB_S1
... hidden data ...
*Elset, Elset=Internal-1_sCB_S3
... hidden data ...
*Elset, Elset=Internal-1_sCB_S4
... hidden data ...
*Elset, Elset=Internal_Selection-1_Solid_Section-1
... hidden data ...
**
** Surfaces ++++++++++++++++++++++++++++++++++++++++++++++++
**
*Surface, Name=sHead, Type=Element
Internal-1_sHead_S4, S4
Internal-1_sHead_S1, S1
Internal-1_sHead_S3, S3
Internal-1_sHead_S2, S2
*Surface, Name=sNut, Type=Element
Internal-1_sNut_S1, S1
Internal-1_sNut_S4, S4
Internal-1_sNut_S2, S2
Internal-1_sNut_S3, S3
*Surface, Name=sForce, Type=Element
Internal-1_sForce_S3, S3
Internal-1_sForce_S2, S2
Internal-1_sForce_S4, S4
Internal-1_sForce_S1, S1
*Surface, Name=sCA, Type=Element
Internal-1_sCA_S1, S1
Internal-1_sCA_S2, S2
Internal-1_sCA_S4, S4
Internal-1_sCA_S3, S3
*Surface, Name=sCB, Type=Element
Internal-1_sCB_S2, S2
Internal-1_sCB_S1, S1
Internal-1_sCB_S3, S3
Internal-1_sCB_S4, S4
**
** Physical constants ++++++++++++++++++++++++++++++++++++++
**
**
** Coordinate systems ++++++++++++++++++++++++++++++++++++++
**
**
** Materials +++++++++++++++++++++++++++++++++++++++++++++++
**
*Material, Name=S355
*Density
7.8E-09
*Elastic
210000, 0.28
*Expansion, Zero=20
1.1E-05
*Conductivity
14
*Specific heat
440000000
**
** Sections ++++++++++++++++++++++++++++++++++++++++++++++++
**
*Solid section, Elset=Internal_Selection-1_Solid_Section-1, Material=S355
*Beam Section, elset=EBolt0, material=S355, section=CIRC
8.0
1,0,0
 ** M16

*EQUATION
2
25964,1,1.,1,1,-1.
2
25964,2,1.,1,2,-1.
2
25964,3,1.,1,3,-1.
*EQUATION
2
25966,1,1.,2,1,-1.
2
25966,2,1.,2,2,-1.
2
25966,3,1.,2,3,-1.
**
** Pre-tension sections ++++++++++++++++++++++++++++++++++++
**
**
** Constraints +++++++++++++++++++++++++++++++++++++++++++++
**
*Rigid body, Nset=Internal-1_sHead, Ref node=25964, Rot node=25965
*Rigid body, Nset=Internal-1_sNut, Ref node=25966, Rot node=25967
*Rigid body, Nset=Internal-1_sForce, Ref node=25968, Rot node=25969
**
** Surface interactions ++++++++++++++++++++++++++++++++++++
**
*Surface interaction, Name=Surface_Interaction-1
*Surface behavior, Pressure-overclosure=Linear
10000000, 2.86
*Friction
0.1
**
** Contact pairs +++++++++++++++++++++++++++++++++++++++++++
**
*Contact pair, Interaction=Surface_Interaction-1, Type=Surface to surface
sCB, sCA
**
** Amplitudes ++++++++++++++++++++++++++++++++++++++++++++++
**
**
** Initial conditions ++++++++++++++++++++++++++++++++++++++
**
**
** Steps +++++++++++++++++++++++++++++++++++++++++++++++++++
**
**
** Step-1 ++++++++++++++++++++++++++++++++++++++++++++++++++
**
*Step
*Static
**
** Controls ++++++++++++++++++++++++++++++++++++++++++++++++
**
**
** Output frequency ++++++++++++++++++++++++++++++++++++++++
**
**
** Boundary conditions +++++++++++++++++++++++++++++++++++++
**
*Boundary, op=New
** Name: Fixed-1
*Boundary
Internal_Selection-1_Fixed-1, 1, 6, 0
**
** Loads +++++++++++++++++++++++++++++++++++++++++++++++++++
**
*Cload, op=New
*Dload, op=New
** Name: Concentrated_Force-1
*Cload
25968, 3, -50000
**
** Defined fields ++++++++++++++++++++++++++++++++++++++++++
**
**
** History outputs +++++++++++++++++++++++++++++++++++++++++
**
**
** Field outputs +++++++++++++++++++++++++++++++++++++++++++
**
*Node file
RF, U
*El file
S, E, NOE
**
** End step ++++++++++++++++++++++++++++++++++++++++++++++++
**
*End step

Should I enable NL geom?

Can you share the .pmx file ?

I would try without Nlgeom first. Nonlinearities (and other complex features) should be introduced gradually.

test_bolt.pmx (770.0 KB)

Since you already have rigid body constraints there, you can just try adding beam element nodes to rigid body constraint node sets. Then you won’t need *EQUATION:

test_bolt 2.pmx (779.3 KB)

I also changed the beam profile to rectangular so that two-node beam element (B31) can be used.

If you want to use a different approach, the recommended way is to use *EQUATION with distributing coupling constraints: Modeling bolt connection with preloaded beam element - #5 by FEAnalyst

first the model is unstable since one bolt only, add rotational restraint around Z axes at load nodes and below my approach by using B32R element.

p.s beam and shell element connected to rigid body not allowed in latest CalculiX solver.

2 Likes

Thank you for your time. I will study this approach.

Can you send me your .pmx file ?

As can be seen in this example, rigid body constraint can work with beam elements (at least without Nlgeom) so it’s another, very good reason to ask Guido to remove this limitation introduced in ccx 2.23: Rigid body cannot be used with shells at all in ccx 2.23 · Issue #134 · Dhondtguido/CalculiX · GitHub

1 Like

attached modified files,

test_bolt_mod.pmx (772.8 KB)

i hope so, these features keep i.e not change but i did not know exactly about the reason to remove. Maybe this modeling approach leading to many problems and raised to bunch of repetitive question since user expected to work in general case.

1 Like

Why did you create two beams in your model ? One for Ref and one for Rot ? Why did blocked the displacements U2 displacements here ?

Can you tell me what is the difference between B32 and B32R ?

R stands for reduced integration - less integration points for stress/strain calculations.

The B31 and B31R elements are expanded into C3D8I and C3D8R elements, respectively. Since the C3D8R element has only one integration point in the middle of the element, bending effect cannot be taken into account. Therefore, the B31R element should not be used for bending.

it’s for clamping to generate bending and shear transfer mechanism.

one bolt is prone in stability of model, previously i do quick checking in Z axes force loads only. Released Y translation restraint when load in this direction needed to consider.

It’s something like this, basically (of course, the red and blue lines are the two beams, offset from each other just to visualize them):

*Element, Type=B32R, Elset=EBolt
9614, 25964, 25968, 25966
*Element, Type=B32R, Elset=EBolt
9615, 25965, 25969, 25967

*Rigid body, Nset=Internal-1_sHead, Ref node=25964, Rot node=25965
*Rigid body, Nset=Internal-1_sNut, Ref node=25966, Rot node=25967
*Rigid body, Nset=Internal-1_sForce, Ref node=25968, Rot node=25969

25968, 0, 0, 0
25969, 0, 0, 0

Note the force RP nodes being moved to serve as beam midside nodes.

Unfortunately, this won’t work in ccx 2.23 (PrePoMax uses 2.23 for now anyway):

 *ERROR in gen3dmpc: nodes belonging to
        beam elements must not be
        subject to a RIGID                MPC.

so, i miss at this when nodes 25968 already used in reference point. Two extra nodes need to start after these number.

below corrected ones.

25969 is also used in the Force rigid body constraint as it’s ROT node. So shouldn’t the extra nodes be 25970 and 25971 ?

right i still missing, let me review again my modeling approach.

Then I guess we just end up with this:

test_bolt_mod 2.pmx (774.4 KB)