Simplified bolt connection with beam element and rigid constraints

I am currently reworking a more stable model that could serve as a reference.

that’s the problems, bolt interaction is complex so it cannot be simplify. Some simplifictaion model approach is usefull and reasonable well but not too simpler.

You have basically three options to model the bolts:

  1. Simplified solids (cylinders) with contact
  • most robust (in terms of avoiding issues and CalculiX’s limitations)
  • most accurate, can account for any kind of behavior
  • quite easy to define - once you draw and mesh one, you can copy the others
  • can be easily preloaded
  • can be easily checked for forces (using Section print)
  • need nonlinear contact (problematic for convergence)
  1. Beams attached via coupling or rigid body constraints
  • most accurate 1D elements
  • can be preloaded, but this will remove them from the model
  • forces can be obtained with
*EL FILE, SECTION FORCES, OUTPUT=2D
S, NOE
  • most tedious to define
  • may not work well (or at all, especially in ccx 2.23) with rigid body constraints
  1. Springs attached via coupling or rigid body constraints
  • quite easy to define if you know the stiffness (spring constant)
  • least accurate 1D elements
  • preload can be applied only indirectly as initial displacement
  • you would need a few of them - one per direction
  • forces can’t be obtained directly (only with some tricks based on e.g. strain energy)

I think that you should try more than one approach to see what suits you best.

I skipped even more simplified approaches with no elements at all (just rigid body or coupling constraints) because they are only used to obtain forces without actually modeling the bolts themselves.

below my schematic model of possible approach to capture all physical bolt response i.e clamping, bolt shear and bending, plate hole bearing, prestressed and axial tension only, output bolt forces also. As can be seen look complex even using beam element and named simplification, schematic model is appropiates for shell part only.

i don’t know about feasibility to implement due to complexity of mesh dependent, but capability to modeling 1D element by two nodes or multiple (master and slave nodes) can help much in this task.

.

Source of the above diagram (without the colorful lines): http://www.icmas.eu/Journal_archive_files/Vol_5_No_3_PDF/167-172_Piscan.pdf

This ccx forum topic can also be helpful regarding force distribution in a bolted joint: Pretension shear/tensile resistance - CalculiX (official versions are on www.calculix.de, the official GitHub repository is at https://github.com/Dhondtguido/CalculiX).

But I think we should now let the OP prepare some basic test model and try out the different approaches we proposed.

right, i’m reading this paper when response to discussion and used his graphics as basic. Colored line is large extension to the paper references were limited to axial response only.

it seems not convenient when simplification need to represent bolt physically, writing and reading extra keywords would like spaghetti code.

Trying out a few approaches (like the 3 I’ve mentioned) on a very simple model with two plates and one bolt can be really beneficial even just to become familiar with CalculiX syntax (needed to work with more advanced models and features not supported in PrePoMax). And to be more aware of the capabilities and limitations of these different approaches. Such simplified tests are IMO always good.

1 Like

Hi,

This is an inp of my proposal.

I have defined a Distributing coupling so you can test force or moment. The inp contains a distributed moment as example.

Beams can be B32R (Circular) or B32 (Only rectangular section supported). I’m using B32 because it benefits from additional integration points needed to get an accurate Section print result .

The bolt has a surface defined at the middle of the shank. We can compare this approach with the ones presented by FEAnalyst based on the different interpretations of the term ā€œsimplicity/accuracy ā€.

You can also check if that approach is suitable for your loading conditions. No BC on the distributing REF node or be am.

Note the beam RB rotation is sustained only by the friction on the contact area. No preload on the beam in this example

The model is NLGEOM and solved with just one time step to speed up the example. Rememeber there is no magic formula when talking about Simplified models.

All contact areas only work under compression.

1D-Simplified_Bolted_connection_II.inp (582.3 KB)

EDITED: IF YOU DO NOT EXPECT SEPARATION IN THE CONTACT AREAS OF BOLT/PLATE YOU CAN USE TIED TO CONSIDERABLY SPEED UP THE ANALISYS

This won’t work in Abaqus due to the way the surfaces are defined on beams, but here’s a visualization with beam profile rendering:

But why is so large contact stiffness and slip rate needed here ?

*SURFACE BEHAVIOR,PRESSURE-OVERCLOSURE=LINEAR
2.1E+13,1
*FRICTION
0.3,210000000000

My units are Pascals,m..It is more or less the same shape we are talking about.

Good to know the aproach is new.

Yeah, this might be one of the rare advantages of having ā€œfakeā€ beam elements. The recent version of Abaqus can also handle various kinds of contact with actual beam profiles (normally, they were approximated as circular), but via the general contact algorithm.

Thus, in Abaqus, shells are typically used for the head and nut when modeling bolts with beam elements and needing more accuracy with bolt-member contact included.

in CalculiX all six-side face of beam known before to be working with contact no matter it is tied or penalty type, maybe this is new for Abaqus.

however, modeling bolt using single element of solid may lead to problem in large deformation, contact and plasticity. I still prefer coarse mesh of quadratic solid element to model complete bolt parts, so the problem and issue can be tracing due to its general solution.

It’s much easier and pretty much natural for CalculiX to offer all sides of beam elements as surfaces because they are actual faces of solid elements. Any solver with true beam elements (whose geometry is just lines and profiles are used to determine the cross-sectional properties) needs much more effort. In such solvers, beam profiles are usually ignored or approximated as circular (with the radius of a circumscribed circle around the profile). Abaqus only recently improved that: Exact beam contact
Internally, it generates a mesh of quadrilateral surface elements and those are used for contact (similar things were done manually in the past).

Beams can be refined while keeping simlicity and economy. They can also capture bending compared with springs.

Solid bolt elements are rare and expensive but indeed the easiest to set up when no other options are implemented.

The inp shows a real working aproach. Not possible, real. One can take it, test it and validate if it suits his particular problem.

This is what happens when you talk based on papers.

it’s not from paper but referencing to my office software used SAP2000, rigid body reference point should transmit both translation and rotation. Also, modeling bolt like that is not my goals as can be read by many of comment related to bolt modeling.

You probably can’t because the surface used to stablish the contact is not exposed in the GUI. It is an internal face of the beam. I haven’t seen any other one doing this in calculix before. It was possible to acces internal faces in Prepomax at some point in the past but Matej removed that option.

I think we only discussed the availability of various beam faces on the CalculiX forum when talking about section print: How to print the section moment (SOM) at the section on a 1D beam (B32)? - CalculiX (official versions are on www.calculix.de, the official GitHub repository is at https://github.com/Dhondtguido/CalculiX).

When it comes to interior face handling by PrePoMax, here’s the related discussion: A new PrePoMax version v2.4.0 has been released - #6 by Matej

Hello everyone,

I have implemented the proposed solution and based my model on your .inp file. I used tie constraints in the bolt/plate contact areas together with B32R beam elements. However, the analysis does not seem to converge.

Could you please let me know if the modeling approach seems appropriate?

On my side, I will also try using B32 rectangular beams with contact, as you previously suggested.

**
** Heading +++++++++++++++++++++++++++++++++++++++++++++++++
**
*Heading
Hash: yfL1Wqbd, Date: 03/14/2026, Unit system: MM_TON_S_C
**
** Nodes +++++++++++++++++++++++++++++++++++++++++++++++++++
**
*Node
... hidden data ...
*NODE
** Bolt 1
93001, 0,  50,  20
93002, 0,  50,  15
93003, 0,  50,  10
93004, 0,  50,   5
93005, 0,  50,   0
93006, 0,  50,  -5
93007, 0,  50, -10
93008, 0,  50, -15
93009, 0,  50, -20

** Bolt 2
93011, 0, -50,  20
93012, 0, -50,  15
93013, 0, -50,  10
93014, 0, -50,   5
93015, 0, -50,   0
93016, 0, -50,  -5
93017, 0, -50, -10
93018, 0, -50, -15
93019, 0, -50, -20
**
** Elements ++++++++++++++++++++++++++++++++++++++++++++++++
**
*Element, Type=C3D10, Elset=B
... hidden data ...
*Element, Type=C3D10, Elset=A
... hidden data ...
*ELEMENT,TYPE=B32R,ELSET=BOLT1_HEAD
100001, 93001,93002,93003

*ELEMENT,TYPE=B32R,ELSET=BOLT1_TOLEA
100002, 93003,93004,93005

*ELEMENT,TYPE=B32R,ELSET=BOLT1_TOLEB
100003, 93005,93006,93007

*ELEMENT,TYPE=B32R,ELSET=BOLT1_NUT
100004, 93007,93008,93009


*ELEMENT,TYPE=B32R,ELSET=BOLT2_HEAD
100011, 93011,93012,93013

*ELEMENT,TYPE=B32R,ELSET=BOLT2_TOLEA
100012, 93013,93014,93015

*ELEMENT,TYPE=B32R,ELSET=BOLT2_TOLEB
100013, 93015,93016,93017

*ELEMENT,TYPE=B32R,ELSET=BOLT2_NUT
100014, 93017,93018,93019
**
** Node sets +++++++++++++++++++++++++++++++++++++++++++++++
**
*Nset, Nset=nForce
... hidden data ...
*Nset, Nset=nHead1
... hidden data ...
*Nset, Nset=nHead2
... hidden data ...
*Nset, Nset=nNut1
... hidden data ...
*Nset, Nset=nNut2
... hidden data ...
*Nset, Nset=ncA
... hidden data ...
*Nset, Nset=ncB
... hidden data ...
*Nset, Nset=nRef
... hidden data ...
*Nset, Nset=nHoleA1
... hidden data ...
*Nset, Nset=nHoleA2
... hidden data ...
*Nset, Nset=nHoleB1
... hidden data ...
*Nset, Nset=nHoleB2
... hidden data ...
*Nset, Nset=Internal-1_sHead1
... hidden data ...
*Nset, Nset=Internal-1_sHead2
... hidden data ...
*Nset, Nset=Internal-1_sNut1
... hidden data ...
*Nset, Nset=Internal-1_sNut2
... hidden data ...
*Nset, Nset=Internal-1_scA
... hidden data ...
*Nset, Nset=Internal-1_scB
... hidden data ...
*Nset, Nset=Internal-1_sRef
... hidden data ...
*Nset, Nset=Internal-1_sHoleA1
... hidden data ...
*Nset, Nset=Internal-1_sHoleA2
... hidden data ...
*Nset, Nset=Internal-1_sHoleB1
... hidden data ...
*Nset, Nset=Internal-1_sHoleB2
... hidden data ...
*Nset, Nset=Internal-1_sForce
... hidden data ...
**
** Additional node sets ++++++++++++++++++++++++++++++++++++
**
... hidden data ...
**
** Element sets ++++++++++++++++++++++++++++++++++++++++++++
**
*Elset, Elset=Internal_Selection-1_Solid_Section-1
... hidden data ...
*Elset, Elset=Internal-1_sHead1_S1
... hidden data ...
*Elset, Elset=Internal-1_sHead1_S3
... hidden data ...
*Elset, Elset=Internal-1_sHead1_S2
... hidden data ...
*Elset, Elset=Internal-1_sHead1_S4
... hidden data ...
*Elset, Elset=Internal-1_sHead2_S1
... hidden data ...
*Elset, Elset=Internal-1_sHead2_S3
... hidden data ...
*Elset, Elset=Internal-1_sHead2_S4
... hidden data ...
*Elset, Elset=Internal-1_sHead2_S2
... hidden data ...
*Elset, Elset=Internal-1_sNut1_S1
... hidden data ...
*Elset, Elset=Internal-1_sNut1_S3
... hidden data ...
*Elset, Elset=Internal-1_sNut1_S4
... hidden data ...
*Elset, Elset=Internal-1_sNut1_S2
... hidden data ...
*Elset, Elset=Internal-1_sNut2_S1
... hidden data ...
*Elset, Elset=Internal-1_sNut2_S3
... hidden data ...
*Elset, Elset=Internal-1_sNut2_S4
... hidden data ...
*Elset, Elset=Internal-1_sNut2_S2
... hidden data ...
*Elset, Elset=Internal-1_scA_S1
... hidden data ...
*Elset, Elset=Internal-1_scA_S3
... hidden data ...
*Elset, Elset=Internal-1_scA_S4
... hidden data ...
*Elset, Elset=Internal-1_scA_S2
... hidden data ...
*Elset, Elset=Internal-1_scB_S1
... hidden data ...
*Elset, Elset=Internal-1_scB_S4
... hidden data ...
*Elset, Elset=Internal-1_scB_S2
... hidden data ...
*Elset, Elset=Internal-1_scB_S3
... hidden data ...
*Elset, Elset=Internal-1_sRef_S2
... hidden data ...
*Elset, Elset=Internal-1_sRef_S4
... hidden data ...
*Elset, Elset=Internal-1_sRef_S3
... hidden data ...
*Elset, Elset=Internal-1_sRef_S1
... hidden data ...
*Elset, Elset=Internal-1_sHoleA1_S1
... hidden data ...
*Elset, Elset=Internal-1_sHoleA1_S4
... hidden data ...
*Elset, Elset=Internal-1_sHoleA1_S3
... hidden data ...
*Elset, Elset=Internal-1_sHoleA1_S2
... hidden data ...
*Elset, Elset=Internal-1_sHoleA2_S1
... hidden data ...
*Elset, Elset=Internal-1_sHoleA2_S4
... hidden data ...
*Elset, Elset=Internal-1_sHoleA2_S3
... hidden data ...
*Elset, Elset=Internal-1_sHoleA2_S2
... hidden data ...
*Elset, Elset=Internal-1_sHoleB1_S1
... hidden data ...
*Elset, Elset=Internal-1_sHoleB1_S3
... hidden data ...
*Elset, Elset=Internal-1_sHoleB1_S4
... hidden data ...
*Elset, Elset=Internal-1_sHoleB1_S2
... hidden data ...
*Elset, Elset=Internal-1_sHoleB2_S4
... hidden data ...
*Elset, Elset=Internal-1_sHoleB2_S1
... hidden data ...
*Elset, Elset=Internal-1_sHoleB2_S2
... hidden data ...
*Elset, Elset=Internal-1_sHoleB2_S3
... hidden data ...
*Elset, Elset=Internal-1_sForce_S2
... hidden data ...
*Elset, Elset=Internal-1_sForce_S3
... hidden data ...
*Elset, Elset=Internal-1_sForce_S1
... hidden data ...
*Elset, Elset=Internal-1_sForce_S4
... hidden data ...
**
** Surfaces ++++++++++++++++++++++++++++++++++++++++++++++++
**
*Surface, Name=sForce, Type=Element
Internal-1_sForce_S2, S2
Internal-1_sForce_S3, S3
Internal-1_sForce_S1, S1
Internal-1_sForce_S4, S4
*Surface, Name=sHead1, Type=Element
Internal-1_sHead1_S1, S1
Internal-1_sHead1_S3, S3
Internal-1_sHead1_S2, S2
Internal-1_sHead1_S4, S4
*Surface, Name=sHead2, Type=Element
Internal-1_sHead2_S1, S1
Internal-1_sHead2_S3, S3
Internal-1_sHead2_S4, S4
Internal-1_sHead2_S2, S2
*Surface, Name=sNut1, Type=Element
Internal-1_sNut1_S1, S1
Internal-1_sNut1_S3, S3
Internal-1_sNut1_S4, S4
Internal-1_sNut1_S2, S2
*Surface, Name=sNut2, Type=Element
Internal-1_sNut2_S1, S1
Internal-1_sNut2_S3, S3
Internal-1_sNut2_S4, S4
Internal-1_sNut2_S2, S2
*Surface, Name=scA, Type=Element
Internal-1_scA_S1, S1
Internal-1_scA_S3, S3
Internal-1_scA_S4, S4
Internal-1_scA_S2, S2
*Surface, Name=scB, Type=Element
Internal-1_scB_S1, S1
Internal-1_scB_S4, S4
Internal-1_scB_S2, S2
Internal-1_scB_S3, S3
*Surface, Name=sRef, Type=Element
Internal-1_sRef_S2, S2
Internal-1_sRef_S4, S4
Internal-1_sRef_S3, S3
Internal-1_sRef_S1, S1
*Surface, Name=sHoleA1, Type=Element
Internal-1_sHoleA1_S1, S1
Internal-1_sHoleA1_S4, S4
Internal-1_sHoleA1_S3, S3
Internal-1_sHoleA1_S2, S2
*Surface, Name=sHoleA2, Type=Element
Internal-1_sHoleA2_S1, S1
Internal-1_sHoleA2_S4, S4
Internal-1_sHoleA2_S3, S3
Internal-1_sHoleA2_S2, S2
*Surface, Name=sHoleB1, Type=Element
Internal-1_sHoleB1_S1, S1
Internal-1_sHoleB1_S3, S3
Internal-1_sHoleB1_S4, S4
Internal-1_sHoleB1_S2, S2
*Surface, Name=sHoleB2, Type=Element
Internal-1_sHoleB2_S4, S4
Internal-1_sHoleB2_S1, S1
Internal-1_sHoleB2_S2, S2
Internal-1_sHoleB2_S3, S3
*SURFACE,NAME=BOLT1_HEAD_SURF,TYPE=ELEMENT
100001,S4

*SURFACE,NAME=BOLT1_CORE_SURF,TYPE=ELEMENT
100003,S1

*SURFACE,NAME=BOLT1_NUT_SURF,TYPE=ELEMENT
100004,S6


*SURFACE,NAME=BOLT2_HEAD_SURF,TYPE=ELEMENT
100011,S4

*SURFACE,NAME=BOLT2_CORE_SURF,TYPE=ELEMENT
100013,S1

*SURFACE,NAME=BOLT2_NUT_SURF,TYPE=ELEMENT
100014,S6
**
** 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=BOLT1_HEAD,MATERIAL=S355,SECTION=CIRC
30
1,0,0

*BEAM SECTION,ELSET=BOLT1_TOLEA,MATERIAL=S355,SECTION=CIRC
16
1,0,0

*BEAM SECTION,ELSET=BOLT1_TOLEB,MATERIAL=S355,SECTION=CIRC
16
1,0,0

*BEAM SECTION,ELSET=BOLT1_NUT,MATERIAL=S355,SECTION=CIRC
30
1,0,0


*BEAM SECTION,ELSET=BOLT2_HEAD,MATERIAL=S355,SECTION=CIRC
30
1,0,0

*BEAM SECTION,ELSET=BOLT2_TOLEA,MATERIAL=S355,SECTION=CIRC
16
1,0,0

*BEAM SECTION,ELSET=BOLT2_TOLEB,MATERIAL=S355,SECTION=CIRC
16
1,0,0

*BEAM SECTION,ELSET=BOLT2_NUT,MATERIAL=S355,SECTION=CIRC
30
1,0,0
**
** Pre-tension sections ++++++++++++++++++++++++++++++++++++
**
*COUPLING,REF NODE=93003,SURFACE=sHoleA1,CONSTRAINT NAME=CP_BOLT1_A
*DISTRIBUTING
1,2,3,4,5,6

*COUPLING,REF NODE=93007,SURFACE=sHoleB1,CONSTRAINT NAME=CP_BOLT1_B
*DISTRIBUTING
1,2,3,4,5,6


*COUPLING,REF NODE=93013,SURFACE=sHoleA2,CONSTRAINT NAME=CP_BOLT2_A
*DISTRIBUTING
1,2,3,4,5,6

*COUPLING,REF NODE=93017,SURFACE=sHoleB2,CONSTRAINT NAME=CP_BOLT2_B
*DISTRIBUTING
1,2,3,4,5,6
**
** Constraints +++++++++++++++++++++++++++++++++++++++++++++
**
** Name: rbHead1: Deactivated
** Name: rbNut1: Deactivated
** Name: rbHead2: Deactivated
** Name: rbNut2: Deactivated
*TIE,NAME=TIE_HEAD1
sHead1,BOLT1_HEAD_SURF

*TIE,NAME=TIE_NUT1
sNut1,BOLT1_NUT_SURF

*TIE,NAME=TIE_HEAD2
sHead2,BOLT2_HEAD_SURF

*TIE,NAME=TIE_NUT2
sNut2,BOLT2_NUT_SURF
** Name: Tie-1: Deactivated
**
** Surface interactions ++++++++++++++++++++++++++++++++++++
**
*Surface interaction, Name=Surface_Interaction_A_B
*Surface behavior, Pressure-overclosure=Linear
210000000000, 2.86
*Friction
0.3, 210000000000
**
** Contact pairs +++++++++++++++++++++++++++++++++++++++++++
**
*Contact pair, Interaction=Surface_Interaction_A_B, Type=Surface to surface
scB, scA
**
** Amplitudes ++++++++++++++++++++++++++++++++++++++++++++++
**
**
** Initial conditions ++++++++++++++++++++++++++++++++++++++
**
**
** Steps +++++++++++++++++++++++++++++++++++++++++++++++++++
**
**
** Step-1 ++++++++++++++++++++++++++++++++++++++++++++++++++
**
*Step, Nlgeom
*Static, Solver=Pardiso
**
** Controls ++++++++++++++++++++++++++++++++++++++++++++++++
**
**
** Output frequency ++++++++++++++++++++++++++++++++++++++++
**
**
** Boundary conditions +++++++++++++++++++++++++++++++++++++
**
*Boundary, op=New
** Name: Fixed-1
*Boundary
Internal-1_sRef, 1, 6, 0
**
** Loads +++++++++++++++++++++++++++++++++++++++++++++++++++
**
*Cload, op=New
*Dload, op=New
** Name: Surface_Traction-1
*Cload
... hidden data ...
**
** Defined fields ++++++++++++++++++++++++++++++++++++++++++
**
**
** History outputs +++++++++++++++++++++++++++++++++++++++++
**
**
** Field outputs +++++++++++++++++++++++++++++++++++++++++++
**
*Node file
RF, U
*El file
S, E, NOE
*SECTION PRINT, SURFACE=BOLT1_CORE_SURF, NAME=BOLT1_FORCES
SOF,SOM

*SECTION PRINT, SURFACE=BOLT2_CORE_SURF, NAME=BOLT2_FORCES
SOF,SOM
**
** End step ++++++++++++++++++++++++++++++++++++++++++++++++
**
*End step

test_bolt_v2.pmx (3.9 MB)

If you model the head and nut as wider beams, there’s no need for distributing coupling constraints anymore - just use contact or tie constraints. Force at the top of the model can be applied directly or via rigid body constraint (if moment is needed).

If it still doesn’t work, try without Nlgeom and using displacement control instead of load control, but replacing contact with tie constraints should suffice for now.

can you please provide model including solid bolt parts? i doubt any simplification approach can capture physical behavior of bolt with reasonable results for model with large eccentricity and shear transmitted occurs.