Bolted Connection STEEL NEW
Bolted Connection STEEL NEW
Bolted Connection STEEL NEW
M ASTER T HESIS
Author: Supervisor:
Fernando DE A BREU Dr. Bert N ORLIN
A LMEIDA
Declaration of Authorship
I, Fernando DE A BREU A LMEIDA, declare that this thesis titled, “The effect of bolt
clearance and tolerances on the shear resistance of bolted connections subjected to
uni-axial loading” and the work presented in it are my own. I confirm that:
• This work was done wholly or mainly while in candidature for a research de-
gree at this University.
• Where any part of this thesis has previously been submitted for a degree or
any other qualification at this University or any other institution, this has been
clearly stated.
• Where I have consulted the published work of others, this is always clearly
attributed.
• Where I have quoted from the work of others, the source is always given. With
the exception of such quotations, this thesis is entirely my own work.
• Where the thesis is based on work done by myself jointly with others, I have
made clear exactly what was done by others and what I have contributed my-
self.
Signed:
Date:
v
Abstract
Structural Engineering and Bridge Design
Architecture and the Built Environment
Master of Science
The effect of bolt clearance and tolerances on the shear resistance of bolted
connections subjected to uni-axial loading
by Fernando DE A BREU A LMEIDA
The aim of this thesis was to investigate the effect of clearance and tolerance in bolted
joints when there is a mismatch between the bolt holes. A parametric study with
seven different cases was analyzed in this project; four double bolt configuration
and three triple bolt configuration, with variation of the size of the bolt hole mis-
alignment, the diameter of the bolt and the thickness of the plates. All analyses were
performed with the aid of the FEM commercial software Abaqus, all the models
were modelled with 3D brick elements.
Despite bolted connections being subject of several investigations, no study about
this matter for structural engineering purposes had been performed before.
The results indicate that for connections with a low number of bolts a misalign-
ment of the bolt clearance can cause a serious reduction in the ultimate bearing ca-
pacity of a joint and it indicates that the Eurocode 1993 1-8 might be overestimating
the ultimate bearing capacity for some cases.
Acknowledgements
I would like to thank my Supervisor for his guidance and disposition to answer my
every question, to direct me to the right direction and for the proposal of the thesis
topic.
I would like to thank my family for their support throughout my entire academic
journey, for being there for me and cheering for me every step of the way.
I would like to thank the scientific community for sharing their knowledge and
providing me with the information required to complete this project.
My colleagues for the debate of ideas during the development of the project and
for the laughs shared.
Last but not least, I would like to thank my girlfriend for the support and pa-
tience.
ix
Contents
Abstract v
Acknowledgements vii
1 Introduction 1
1.1 Aim and Scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Assumptions and Limitations . . . . . . . . . . . . . . . . . . . . . . . . 2
2 Theory 5
2.1 Bolted Connections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 Steel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3 Finite Element Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4 Bolt Shear Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.5 Eurocode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3 Method 15
3.1 Analysis Procedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.2 FEM Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.2.1 Type of Analysis . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.2.2 Material Properties . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.2.3 Geometry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.2.4 Boundary Conditions and Load . . . . . . . . . . . . . . . . . . 21
3.2.5 Element Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.2.6 Mesh Size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.2.7 Interaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.2.8 Reaching convergence . . . . . . . . . . . . . . . . . . . . . . . . 25
3.3 Validation of the Model . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.4 Parametric Study . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4 Results 31
4.1 General Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.2 Bearing Resistance Curves . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Bibliography 39
A Detailed Results 41
B Developed Codes 49
xi
List of Figures
List of Tables
List of Abbreviations
List of Symbols
Chapter 1
Introduction
Steel is widely used in several different kinds of structures, both in small and large
scale, from small machinery to large infrastructure projects; it is a material that rev-
olutionized architecture, construction and manufacturing around the globe. In or-
der to assemble all those structures different parts of steel must be jointed together;
nowadays the main techniques to do so are either by using bolts, screws or by weld-
ing the different pieces together.
Even though bolted connections are commonly used in constructions, there still
are uncertainties regarding aspects that affects them, this study intends to explore
in more depth the influence of bolt clearance and mismatch of bolt holes in connec-
tions. Despite its industrial manufacturing, there are imperfections when creating
steel structures and even more in the assembly between those different structures,
leaving room for misalignment between the holes of the steel plates, as a conse-
quence, seldom all the bolts will receive the loads equally, there will always be bolts
that will receive a larger load or a smaller load, this research intents to grasp a bet-
ter understanding of the effect of this misalignment and its consequences in bolted
connections.
Currently several investigations are being performed about bolted connections,
however there is a gap in the study of the effect of bolt clearance in bolted connec-
tions, the most prominent research found was by McCarthy et al., 2002, which is
focused on composite plates for the aerospace industry. This research will focus on
the effect of bolt clearance in steel structures for the construction industry. Other
authors such as Kelly and Hallström, 2004 and Woo et al., 2017 also investigated the
effect of bolt-hole clearance, but for other plates materials (not steel) and for other
industries.
kind of bolted connections. The report focus on thicker plates that require bolt clear-
ance for assembly. The standard for bolt clearance can be found in the EN 1090-2
(Section 2.5).
This study will analyze in more depth, with the aid of FEM Analysis, the effect
of bolt clearance and the misalignment of the bolt holes (∆d) have on bolted steel
connections and how they affect the ULS of the structure. To perform this study a
3D FEM model was developed with the aid of a FEM commercial software, a total
of 81 simulations were performed to evaluate this phenomenon.
Three different models were investigated, the benchmark (single bolt configu-
ration), a double bolt configuration and a triple bolt configuration. Three different
sizes of bolts were investigated (M12, M16 and M20)1 for all three bolt configuration.
FEM is a very powerful tool to study steel structures and bolted connections,
since if properly used it can give cheap and very accurate data, it is a good alterna-
tive to expensive and time consuming experiments (Hedeyat, Afzadi, and Iranpour,
2017). Abaqus was the FEM Software used in this study. Abaqus is a software de-
veloped by Dassault Systèmes Simulia Corp and it is a very popular commercial
application with years of validation and several users around the world.
A parametric study was developed with the aid of Matlab and Python program-
ming language in order to perform the analyses and analyze them in an optimal
manner. In Section 3.4 the author briefly suggests an strategy to automatize pro-
cesses for parametric studies.
This study intends to present results about the influence of bolt clearance, tol-
erance and bolt hole mismatch in steel bolted connections, it also aims to giver the
reader of the paper a good understanding of 3D FEM modelling for such scenarios,
to illustrate ways of setting up parametric studies for further research and to provide
ways of developing the research further.
• Only slip joint type A (shear connections) with no preload on the bolt (CEN,
2005) was analyzed, therefore the effect of bolt tightening is not contemplated
in this project;
• The bolt, the washer, the head and the nut were modelled as a single smooth
element and no threaded pitch was contemplated in the analyses;
• This study did not investigate the effect of the contact angle (Figure 1.2) be-
tween the bolt and the hole diameter, it was assumed the same contact angle
for all the analyses;
• Only single shear plane (Figure 1.3) models were investigated, no double shear
planes were investigated in the study;
• To simplify the gathering of results and the FEM model, damage was not mod-
elled, however the failure was imposed with the plastic behavior of the mate-
rial, after reaching the f ub the bolt did not contributed any longer to the resis-
tance of the joint;
• The experimental data used to validate the FEM model was gathered by other
authors and they had a different type of failure (plate and not bolt) than the
one investigated in this research.
Chapter 2
Theory
More than one failure can happen at once, a plate bearing and net-section failure
can happen simultaneously in the same specimen for example.
For the purpose of this research all the bolted connections were designed to force
a shear failure of the bolt.
2.2 Steel
Steel structures are the object of study of this research, three different types steels
were used to verify and model the experiment, a cold-formed thin steel plate (G550),
and hot-formed thick steel plate (S355JR) and a medium-low carbon steel bolt.
Despite both plates being made of steel (G550 and S355JR) there are differences
in their fabrications processes that influenced their structural behavior, a hot-rolled
plate is molded in high temperatures, which allows it to have thicker plates and
more malleable shapes. While the cold-rolled plate is formed at room temperature,
by mechanically rolling over a steel plate, this process increases the overall resistance
of the material by strain-hardening, however it also makes it thinner and does not
allow make very unusual shapes of the material.
As a result of those different processes the overall behavior of the plates is quite
different from one to the other. It is clear to see the higher resistance and lower
ductility of the cold-formed plate in comparison to the hot-rolled plate in Figure 2.7.
The fabrication of a S355 plate can occur in different ways and depending of
how it is done it can have an effect on the maximum spacing of bolts allowed by
the EC 1993 1-8 and influence its maximum resistance according to the EC 1993 1-
1, the "J" letter stands for an impact test resistance of 27 Joules and the "R" letter
stands for that the impact test was conducted at a room temperature of 20o Celsius,
the fabrication of a S355JR plate is done conforming the EN 10025-2. To verify cold-
formed members one should look at the EC 1993 1-3.
According to ASTM F3125 Standard the bolts used in construction are made of
low or medium carbon steel, this composition indicates strength, hardness and other
qualities of the structural component. The bolts are graded in this paper as M12, M16
and M20, the "M" letter stands for the metric and the number stands for the diameter
of the bolt in millimeters.
8 Chapter 2. Theory
• Truss: A 2D element that can only intake axial stresses and cannot take mo-
ment into account, this element has 4 DOF;
• Beam: A 2D elements that like the can take axial stresses and moments into
account, this element has 6 DOF;
Truss and Beams elements can be quite useful for modelling frames, 2D contin-
uum element can be used no analyze a 2D solid for example; plate and shell ele-
ments can be used for slabs, membranes and more; solid elements are usually used
to model solid objects when shell or plate elements are not ideal.
For this particular type of analysis the best option is to model the experiment
with solid elements, in Section 3.2.5 the type of solid element chosen for this experi-
ment is explained in more detail.
2.4. Bolt Shear Test 9
To perform this kind of experiment usually two steel plates are clamped into the
machine and joined together by a number of bolts, the machine applies a certain
displacement per unit of time until the failure of the joint (Section 2.1). The data can
be collected directly by the machine, to have a better accuracy of the data one can
have external extensometers on the area of interest (i.e. bolts or overlapping plate)
or another kind of external monitoring of displacement, such as video.
The displacement generates an uni-axial tensile load in one of the plates that
translates into a shear load on the bolts, one of the steel plates is usually fixed while
the other one must withstand the imposed displacement (Figure 2.9).
10 Chapter 2. Theory
The FEM model (Section 3.2) developed on this study simulated this kind of
experiment.
2.5 Eurocode
The EN 3 Eurocode 1993 is the code for steel structures in Europe, as previously
stated the Eurocode has two different sections to deal with bolted connections, which
are directly related to the thickness of the steel plate, if the plate is thinner than 4 mil-
limeters, then the EC 1993 1-3 will provide the directions to design such connections,
if the plate is 4 millimeters thick or thicker then the EC 1993 1-8 will provide the di-
rections.
There are several aspects to take into account when designing bolted connec-
tions, one must mind the type of bolt that is being used, the type of load the connec-
tion is being subjected to, if the bolt spacing is adequate, if the bolt hole clearance is
following the standard and the spacing requirements.
The EC 1993 1-8 has a standard of bolt classes to use, the most used kind of bolt is
the 8.8 grade. To calculate the bolt grade resistance yield resistance one can multiply
both numbers of the class and multiply them by 10 and the result will be in Mega
Pascal, for example 8 ∗ 8 ∗ 10 = 640MPa is the yield resistance of a 8.8 bolt suggested
by the Eurocode. To calculate the ultimate resistance a similar approach can be used,
by multiplying the number before the dot by 100, for example 10 ∗ 1000 = 1000MPa
is the ultimate of a 10.9 bolt grade suggested by the Eurocode . Those values (Table
2.1) are conservative in relation to experimental data.
2.5. Eurocode 11
TABLE 2.1: Resistance values for bolts according to the EC 1993 1-8.
The EC 1993 1-8 defines minimum and maximum spacing for bolts (Table 2.2),
the maximum spacing can be quite tolerant depending on the type of the plate and
the environment of the structure. In the other hand, the minimum spacing is far less
tolerant with its requirements. All cases of the simulated bolted connections were
within the spacing boundaries given by the Eurocode (Figure 2.10), both the mini-
mum and maximum spacing. The analyses were assumed to be in a non-corrosive
environment. For the maximum spacing the Eurocode also makes a distinction of
how the steel plate was produced, the used plate is a S355JR steel, which is made
according to the EN 10025-2 and not the EN 10025-5, thus providing the following
maximum spacing.
The main investigation of this study is the effect of bolt clearance in bolted con-
nections. According to the EN 1090-2 the minimum values for the execution of
bolted connections can be seen in Table 2.3, it shows that most of the commercial
bolt diameters operates with a 2 millimeter bolt clearance, with the exception of the
12 Chapter 2. Theory
12 and 14 millimeters diameter that can be accepted as 1 millimeter and larger than
27 millimeter which operates with a 3 millimeters clearance; the code states a value
for oversized hole and when this happens the EC 1993 1-8 suggests to use a reduc-
tion factor of 0.8 for the calculation of the bearing resistance for the joint.
TABLE 2.3: Nominal Clearances for Bolts and Pins According to the
EN 1090-2.
Nominal bolt
or Normal round holes Oversized round holes
pin diameter (mm) (mm) (mm)
12 1 3
14 1 3
16 2 4
18 2 4
20 2 4
22 2 4
24 2 6
27 to 36 3 8
The Eurocode has different criteria for different types of loading and whether or
not the bolt is preloaded. In total the EC 1993 1-8 has 5 types of categories of bolted
connections, 3 for shear connections and 2 for tensions connections.
• Category B: Slip Resistant at SLS for shear connections. Preloaded 8.8 or 10.9
bolts are used.
For the analyses performed in this study a Category A type of joint was assumed.
For this scenario the EC 1993 1-8 recommends two types of verification, a shear
resistance of the bolt (Equation 2.1) and a bearing resistance (Equation 2.2).
Shear resistance per shear plane:
αv f ub A
Fv,Rd = (2.1)
γ M2
Where:
k1 αb f u dt
Fb,Rd = (2.2)
γ M2
Where:
p
• for edge bolts: k1 is the smallest of 2.8 de20 − 1.7, 1.4 d02 − 1.7 or 2.5;
p
• for inner bolts: k1 is the smallest of 1.4 d02 − 1.7 or 2.5.
Chapter 3
Method
This chapter aims to provide the reader with all the important information to under-
stand what was done in this project and give insight in how to replicate it.
For the double bolt case a hole misalignment was modelled for one of the bolts
(Figure 3.1) and as a result this bolt had to bear all the load for a displacement equal
to the ∆d which caused a precocious failure in comparison to the other bolt.
For the triple bolt case a hole misaligment was modelled in one of the edge bolts
(Figure 3.2)) and as a result this bolt had to bear all the load for a displacement equal
to the ∆d which caused a precocious failure in comparison to the other bolts.
16 Chapter 3. Method
If one does not use true stress strain Abaqus will underestimate the bearing ca-
pacity of the material and how the material deforms (Figure 3.5).
3.2. FEM Model 19
3.2.3 Geometry
Three different model shapes (Figure 3.6) were used to perform this experiment, a
single bolt configuration, a double bolt configuration and a triple bolt configuration,
in all scenarios only a single shear plane is considered.
In order to reduce the number of variables most of the parameters were created in
function of the diameter of the bolt (d) and the thickness of the plate (t), thus making
sure the tests are standardized and following the EC 1993 1-8 spacing criteria.
plate near the bolt holes) and another for the rest of the plates. The size of the area
of interest for this study varied accordingly to the diameter of the hole to make sure
the data would be reliable.
A study about the accuracy of the analysis and the time of the analysis was con-
ducted; five different mesh combinations were tested and the choice of mesh size
was based on accuracy and the time of the analysis. The combination chosen was
a seed size of 1 element per 1.0 mm in the areas of interest (bolt and the plates Sur-
rounding area of bolt) the and 1 element per 4.0 mm in the areas that were not so
interesting for the analysis, since it yielded very good results without demanding as
much time as a finer mesh configuration would (Figure 3.12).
3.2.7 Interaction
The interaction between the different parts is fundamental for the proper modelling
and it defines how the model will behave. To define the contact between surfaces
one must chose a Master and a Slave surface, this choice can impact the results and
the convergence of the analysis. As a general rule the Master surface should always
be the stiffer part and/or the part with the coarser mesh, if a load is applied in one
of two equal elements (like the plates of this study), one should choose the part that
is taking the load as the Master.
Another important factor to keep in mind when defining the Master and the
Slave surface is that the Master surface is allowed to penetrate the Slave surface, the
opposite, on the other hand, is not allowed.
For this problem there are two possible solutions in Abaqus. The first and most
popular is to use a General Contact approach, where Abaqus assumes that all parts
can touch with each other with a single friction for all parts, but it can lead to conver-
gence error when used with bolt clearances in implicit analysis, it does not allow the
user to customize different frictions for different surfaces and also demands more
computational time for an analysis.
A second approach is a Surface-to-Surface modelling, which allows the user to
select different interaction properties between surfaces and whether or not they will
interact at all. In the Surface-to-Surface approach two options can be chosen, Finite
Sliding or Small Sliding.
Small Sliding will consider the relationship between Master and Slave nodes in
the beginning of the analysis and will keep this relationship throughout the analysis
without changing it. This option can be useful when dealing with low displacement
or when disregarding clearance, but when clearance is involved this option is not
ideal and leads to convergence problems.
The other option is the Finite Sliding, which allows for larger displacements, this
option takes more computational time in comparison to the Small Sliding, since it
has an interactive calculation between the surfaces, but provides a better solution
for clearance problems. The Finite Sliding can be discretized by "Surface to Surface"
or by "Node to Surface", "Surface to Surface" is more accurate and it was the option
chosen for this experiment. For an implicit analysis the approach recommended is
the Surface-to-Surface Finite Sliding with friction.
The interaction properties between the elements were modelled with Normal
and Tangential Behavior. A study of friction (Figure 3.13) was conducted to see
which configuration would yield to more accurate results, the study showed that
when disregarding the bolt clearance, a very low friction estimates the overall be-
havior well and the final load, but overestimates the initial force in comparison to
the measured data by Konkong and Phuvoravan, 2017; a study considering the clear-
ance and with a very low friction (0.01) presents a similar behavior to the experi-
mental data, but it underestimates the force applied; a simulation considering the
bolt clearance with a higher friction (0.2, which is also the maximum feasible value
for steel) estimates the final load and entire behavior of the specimen very well and
a higher friction helps to reach convergence.
For this study the contact between elements all were modelled with a friction
coefficient of 0.2.
3.2. FEM Model 25
Another interaction used for this model was an MPC (Beam) Constraint to im-
pose a prescribed displacement in the top plate, if used properly it will render the
same results as of a load applied directly to the surface, as it can be seen in Figure
3.14.
One must keep in mind that whenever inserting friction or a dissipation energy
factor, for example, it can affect the quality of the results, so it is important to verify
how they affect the results to model them properly.
Another alternative to overcome convergence problems is using an explicit anal-
ysis, however to investigate matter with this strategy, it is advised to mind the time
of the step to make sure the analysis is working as a Quasi-static analysis and if the
release of internal and kinetic energy of the structure is working a quasi-static analy-
sis would (where the kinetic energy is less than 5% of the internal energy as a thumb
rule).
For this kind of simulation the author suggests to only use explicit analysis if one
has a lot of experimental data to properly model the behavior.
As it can be seen in Table 3.2 and Figure 3.16, the FEM model captured the behav-
ior of the experiment and estimated the final load with very good precision. These
3.3. Validation of the Model 27
results provided confidence that the outcomes of the simulations for a thicker hot-
rolled steel plate are reliable.
Chapter 4
Results
In this chapter the results obtained from the FEM analyses will be presented. The
results consists of Force X Displacement curves, comparisons between the FEM anal-
yses and the Eurocode and Ultimate Bearing Curves for different types of joint con-
figuration in relation to the bolt hole misalignment.
∆d t = 5 mm t = 10 mm t = 10 mm t = 10 mm
(mm) d = 12 mm d = 12 mm d = 16 mm d = 20 mm
0.00 100.0% 100.0% 100.0% 100.0%
0.20 98,0% 97.9% 98.5% 97.2%
0.40 96.2% 95.4% 96.8% 93.2%
0.60 94.2% 92.2% 95.2% 79.8%
0.80 90.4% 84.1% 93.1% 61.3%
1.00 86.3% 72.9% 89.1% 51.5%
1.20 78.0% 58.3% 83.1% 51.5%
1.40 70.8% 51.3% 76.1% 51.4%
1.60 59.1% 51.3% 68.1% 51.5%
1.80 50.9% 51.3% 56.5% 51.5%
2.00 50.9% 51.4% 51.2% 51.6%
32 Chapter 4. Results
∆d t = 5 mm t = 10 mm t = 10 mm
(mm) d = 12 mm d = 12 mm d = 16 mm
0.00 100.00% 100.00% 100.00%
0.20 97.71% 96.60% 95.69%
0.40 95.20% 93.61% 90.20%
0.60 92.67% 88.91% 73.94%
0.80 88.06% 78.59% 66.93%
1.00 82.15% 67.11% 66.96%
1.20 73.15% 67.04% 67.11%
1.40 66.62% 67.02% 67.08%
1.60 66.60% 66.83% 67.04%
1.80 66.69% 66.83% 66.98%
2.00 66.80% 66.92% 66.90%
Figure 4.1 helps to better understand what happened in the analyses, essentially
due to the bolt hole mismatch one of the bolts received all the load for a given ∆d,
as a consequence this bolt yielded sooner than the other one and compromised the
total bearing capacity of the joint. In the upper left picture (1) is before the load is
applied, the upper right (2) model presents the left bolt already under stress, in the
bottom left (3) model the left bolt has already failed and now the right bolt is bearing
the load, in the bottom left (4) model both bolts have failed.
The force displacement curves in Figure 4.2 explain how the bolt hole misalign-
ment affected the total bearing resistance, where once the first bolt failed the total
resistance of the joint was highly compromised. It is possible to observe how the
bolt hole misalignment can affect the overall resistance of the joint.
The Table 4.3 makes a comparison between the bearing capacity of the Eurocode
and the bearing capacity of the FEM worst case scenario (∆d = 2.0 mm), it is impor-
tant to highlight that the FEM model needs further verification regarding those val-
ues, given some assumptions and simplifications of the model the final load could be
different, however they do illustrate the possibility of the Eurocode overestimating
the ultimate bearing capacity of the joint.
2 Bolts 3 Bolts
Bolt EC (kN) FEM (kN) Diff EC (kN) FEM (kN) Diff
M12 86.9 60.3 44.1% 130.3 117.7 10.7%
M16 154.5 107.3 43.9% 231.6 209.5 10.6%
M20 241.3 167.0 44.5% - - -
Detailed results for the double bolt case with a diameter of 16 millimeters and a
thickness of 10 millimeters case can be seen on Appendix A.
34 Chapter 4. Results
Chapter 5
5.1 Discussion
As it can be seen it the results presented in Chapter 4 two main conclusions can be
drawn.
First, the misalignment of bolt holes can vastly influence the overall resistance
of a bolted connection. Even in the M12 bolt , in which the EN 1090-2 states that
a clearance of only 1 millimeter is accepted in contrast to larger bolt diameters that
require at least 2 millimeters, the bolt hole misalignment can have a huge influence
on the ULS of the joint depending on the thickness of the plate.
Both the diameter and the thickness have an effect in this phenomena, given that
the thicker the plate, the faster the resistance would diminish, whereas the inverse
occurred with the diameter, the larger the diameter the smoother was the reduction
of the strength. The EC 1993 1-8 states that if a bolt hole has an oversized clearance a
reduction factor of 0.8 should be applied to account for the oversize for the bearing
resistance for the bolt, however it does not contemplate the number of bolts, how
they are distributed in the plate (only if they are edge or inner bolts) or for the shear
resistance of the bolt.
It is important to notice that the Eurocode uses underestimated values for the f ub
of the bolt, has safety factors and the FEM analysis has some simplifications of its
own that have influenced the final bearing capacity, however when analyzing Table
4.3 one can notice that for worst case scenarios the Eurocode can be overestimating
the ULS.
The second conclusion is that the more bolts a connections has the less signifi-
cant the effect of the mismatch might be, in a scenario where there are only two bolts
bearing all the load and one fails, the resistance of the connection will suffer drasti-
cally, whereas a with a larger number of bolts, the reduction will not be as significant
since there will be a large number of bolts left to bear the load.
This research aimed to investigate the effect of bolt clearance and its mismatch on
bolted connections, the results indicates that it has a significant effect for some cases
and that the current European standard does not take the bolt hole misalignment
into account and, as such, it could be overestimating the bearing capacity of bolted
connections in some scenarios scenarios.
• Model a more detailed bolt and observe if it has any effect in the phenomena
investigated;
• Investigate how different contact angles influence the final resistance in this
scenario, however when doing so symmetry would not be possible;
• The disposition of the bolts studied was always the same, an interesting topic
of study would be the effect of bolt hole misalignment in different disposition
and in different numbers;
• Model damage behavior in the bolt material. To simplify the gathering of re-
sults and the FEM model, damage was not modelled, however the failure was
imposed with the plastic behavior of the material.
39
Bibliography
ASTM (2015). ASTM: F3125 / F3125M - 15a, Standard Specification for High Strength
Structural Bolts, Steel and Alloy Steel, Heat Treated, 120 ksi (830 MPa) and 150 ksi
(1040 MPa) Minimum Tensile Strength, Inch and Metric Dimensions. Tech. rep. ASTM.
Eurocode 3: Design of steel structures - Part 1-8: Design of joints (2005). CEN. Brussels:
CEN.
Charleux, L. (2010). Writing Python Scripts for Abaqus. URL: https://pt.scribd.com/
document/273513120/Abaqus-Scripting.
Company, Metal Supermarkets (2018a). Difference between hot rolled steel and cold rolled
steel. URL: https://www.metalsupermarkets.com/difference- between- hot-
rolled-steel-and-cold-rolled-steel/.
Company, National Material (2018b). The Differences Between Hot and Cold Rolled Steel.
URL : http://www.nationalmaterial.com/hot-and-cold-rolled-steel/.
Cook, R. D. et al. (2002). Concept and Applications of Finite Element Analysis. Wiley.
Dubina, Dan and Viorel Ungureanun (2006). Steel - A New and Traditional Material for
Building. CRC Press.
Egan, Brian, Michael A. McCarthy, and Conor T. McCarthy (2017). “Comprehensive
Composite Materials II”. In: ed. by Carl H. Zweben and Peter Beaumon. Elsevier.
Chap. 8, pp. 178–205.
Engineering, FEA CAE (2018). Element Types. URL: http://fea-cae-engineering.
com/FEA-CAE-Engineering/element_types.htm.
Hedeyat, A. A., E. A. Afzadi, and A. Iranpour (2017). “Prediction of the Bolt Fracture
in Shear Using Finite Element Method”. In: Elsevier.
Kelly, Gordon and Stefan Hallström (2004). “Bearing of carbon fibre/epoxy lami-
nates: effects of bolt-hole clearance”. In: Elsevier.
Konkong, Nirut (2017). “An Investigation on the Ultimate Strength of Cold-Formed
Steel Bolted Connections”. In: Engineering, Technology Applied Science Research,
Vol. 7.
Konkong, Nirut and Kitjapat Phuvoravan (2017). “An Analytical MEthod for Deter-
mining the Load Distribution of Single-Column Multibolt Connectio”. In: Hin-
dawi: Advances in Civil Engineering.
Krolo, Paulina, Davor Grandic, and Mladen Bulic (2016). “The Guidelines of Mod-
elling the Preloading Bolts in the Structural Connection using Finite Element
Methods”. In: Hindawi: Jornal of Computational Engineering.
Limited, New Zealand Steel (2004). G550 - General Description. Tech. rep. New Zealand
Steel Limited.
McCarthy, M. A. et al. (2002). “Bolt-hole clearance effects and strength criteria in
single-bolt, single-lap, composite bolted joints”. In: Composites Science and Tech-
nology.
Overvelde, J. T. B. (2010). Learn Abaqus script in one hour. URL: http://www.overvelde.
com/downloads/.
Ribeiro, J., A. Santiago, and C. Rigueiro (2016). “Damage model calibration and ap-
plication for S355 steel”. In: 21st European Conference on Fracture, ECF21, p. 8.
40 BIBLIOGRAPHY
Appendix A
Detailed Results
In this appendix the results for one of the cases studied can be found , a double bolt
case with a diameter of 16 millimeters and a thickness of 10 millimeters. A Force
X Displacement graph for every single ∆d, a graph combining all of the Force X
Displacement and a curve representing the ULS of the structure in comparison to
the best case scenario (∆d = 0).
The Force x Displacement data for all the analyses can be found here:
https://www.dropbox.com/s/r287xf8m8zv527y/FdAA_Excel.zip?dl=0
Appendix B
Developed Codes
For each type of simulation (Single, Double and Triple Bolt) a folder with similar
files were created. In said folder the following codes were developed:
• Main Control: A Matlab file that controlled the input parameters for the simu-
lation and executed the other files in order to perform the parametric study.
• Var: A python file with the variables that were used to creater the Abaqus File.
• All Parts: A python script that generated a CAE file with the variables from
the Var.py file and executed the analysis.
• Material: A python file with material properties that the All Parts Script read
to define the analysis material. It is easier to edit properties by doing so.
• Mesh: A python file with the mesh configuration that the All Parts Script read
to define the analysis mesh. It saves time to have it on a different file to do a
mesh study using the Graphic User Interface.
• Gather Data: A python file that opens the ODB file calculated by the All-
Parts.py and extracts the data of interest.
• Data Extraction: A Matlab file developed to extract all the calculates results in
an organized manner to Excel spreadsheets. To use this script one must use at
least a 2017 Matlab version.
The author is disponibilizing the the entirety of the files in this dropbox folder:
https://www.dropbox.com/s/zut9g48aph1kp3m/FdAA_Exjobb.zip?dl=0
MainControl.m:
%% Input Variables
% Units in N, mm
50 Appendix B. Developed Codes
Eccent = 0.0;
% Eccentricity between Bolt Holes
R_B = 6.0;
% Radius of the Bolt
%
for R_B = 6:2:10
for Eccent = 0:0.2:0.8
Clear = 2.0;
% Clearance of the Bolt
Thickness = 10.0;
% Thickness of the Plate_Top
MeshSize = 1.0;
% Size of the Mesh Around the Holes
MeshPlate = 4.0;
% Size of the Mesh on the Rest of the Plate
ElType1 = 1.0;
% 1 - C3D8, 2- C3D8R or 3 - C3D8I on the Surface with Interaction
ElPlate1 = 1.0;
% 1 - C3D8, 2- C3D8R or 3 - C3D8I on the Surface without Interaction
FrBP = 0.2;
% Friction between Bolt and Plate
FrPP = 0.2;
% Friction between Plates
PrDisp = 6.0;
% Prescribed Displacement
Analysis = 1.0;
% To run an analysis set it as 1.0
Mat = 2.0;
% It controls the materials used
% 1 - G550 Plate 8.8 Bolt
% 2 - S355 Plate 8.8 Bolt
% 3 - To be Defined
% % % % % Variables % % % % %
e1 = 6*R_B;
% Distance between Bolt and end plate (x-axis)
e2 = 8*R_B;
% Distance between Bolt and end plate (y-axis)
p1 = 10*R_B;
% Distance between Bolts
PartSpacing = 10.0;
Appendix B. Developed Codes 51
DistH1 = e1;
% Distance from the edge hole 1
DistH2 = DistH1+p1;
% Distance from the edge hole 2
Overlap = DistH1+DistH2;
% The overlap between the Plates
Length = Overlap+10*R_B;
% Length of the Plate_Top
Width = e2;
% Width of the Plate
R_HN = 2*R_B;
% Radius of the Washer
H_B = 2*Thickness;
% Height of the Bolt (thickness of the plate)
H_HN = Thickness;
% Height of the Washer (plus head and nut)
delete(’.\Var.py’);
% The . indicates that the file is located in the same directory
fid = fopen(’.\Var.py’, ’w’);
% w indicates that it is going to re-write the file
fprintf(fid,’Length = %0.12f\n’,Length);
% the n indicates that it is a number, for text use s
fprintf(fid,’Width = %0.12f\n’,Width);
fprintf(fid,’R_B = %0.12f\n’,R_B);
fprintf(fid,’Clear = %0.12f\n’,Clear);
fprintf(fid,’Thickness = %0.12f\n’,Thickness);
fprintf(fid,’DistH1 = %0.12f\n’,DistH1);
fprintf(fid,’DistH2 = %0.12f\n’,DistH2);
fprintf(fid,’Eccent = %0.12f\n’,Eccent);
fprintf(fid,’PartSpacing = %0.12f\n’,PartSpacing);
52 Appendix B. Developed Codes
fprintf(fid,’Overlap = %0.12f\n’,Overlap );
fprintf(fid,’MeshSize = %0.12f\n’,MeshSize);
fprintf(fid,’ElType1 = %0.12f\n’,ElType1);
fprintf(fid,’MeshPlate = %0.12f\n’,MeshPlate);
fprintf(fid,’ElPlate1 = %0.12f\n’,ElPlate1);
fprintf(fid,’R_HN = %0.12f\n’,R_HN);
fprintf(fid,’H_B = %0.12f\n’,H_B );
fprintf(fid,’H_HN = %0.12f\n’,H_HN );
fprintf(fid,’FrBP = %0.12f\n’,FrBP);
fprintf(fid,’FrPP = %0.12f\n’,FrPP);
fprintf(fid,’PrDisp = %0.12f\n’,PrDisp);
fprintf(fid,’Analysis = %0.12f\n’,Analysis);
fprintf(fid,’Mat = %0.12f\n’,Mat);
fclose(fid);
end
% End of the Loop for the Eccent
end
% End of the Loop for the Radius
Var.py:
Length = 192.000000000000
Width = 48.000000000000
R_B = 6.000000000000
Clear = 2.000000000000
Thickness = 10.000000000000
DistH1 = 36.000000000000
DistH2 = 96.000000000000
Eccent = 0.800000000000
PartSpacing = 15.000000000000
Overlap = 132.000000000000
MeshSize = 1.000000000000
ElType1 = 1.000000000000
MeshPlate = 4.000000000000
ElPlate1 = 1.000000000000
R_HN = 12.000000000000
H_B = 20.000000000000
H_HN = 10.000000000000
FrBP = 0.200000000000
FrPP = 0.200000000000
PrDisp = 6.000000000000
Analysis = 1.000000000000
Mat = 2.000000000000
AllParts.py:
execfile(script_path+’\Var.py’)
# Gets the address of the file and executes the right Var.py
# They all have to be in the same folder to work
54 Appendix B. Developed Codes
# os.chdir(r"C:\General_Assembly\Results")
#folder = os.path.dirname(os.path.dirname(os.path.abspath( __file__ )))
folder = os.path.dirname(os.path.abspath(script_path))
os.chdir(folder+’\Results’)
ElPlate = C3D8R
if ElPlate1 ==1:
ElPlate = C3D8
elif ElPlate1 == 3:
ElPlate = C3D8I
Length-DistH1+PartSpacing, principalPlane=YZPLANE)
mdb.models[’Model-1’].parts[’Plate_Bottom’].DatumPlaneByPrincipalPlane(offset=
Length-DistH1-PartSpacing, principalPlane=YZPLANE)
mdb.models[’Model-1’].parts[’Plate_Bottom’].DatumPlaneByPrincipalPlane(offset=
Length-DistH2+PartSpacing, principalPlane=YZPLANE)
mdb.models[’Model-1’].parts[’Plate_Bottom’].DatumPlaneByPrincipalPlane(offset=
Length-DistH2-PartSpacing, principalPlane=YZPLANE)
mdb.models[’Model-1’].parts[’Plate_Bottom’].DatumPlaneByPrincipalPlane(offset=
Length-Overlap, principalPlane=YZPLANE)
mdb.models[’Model-1’].parts[’Plate_Bottom’].PartitionCellByDatumPlane(cells=
mdb.models[’Model-1’].parts[’Plate_Bottom’].cells.getSequenceFromMask((
’[#1 ]’, ), ), datumPlane=
mdb.models[’Model-1’].parts[’Plate_Bottom’].datums[2])
mdb.models[’Model-1’].parts[’Plate_Bottom’].PartitionCellByDatumPlane(cells=
mdb.models[’Model-1’].parts[’Plate_Bottom’].cells.getSequenceFromMask((
’[#3 ]’, ), ), datumPlane=
mdb.models[’Model-1’].parts[’Plate_Bottom’].datums[7])
mdb.models[’Model-1’].parts[’Plate_Bottom’].PartitionCellByDatumPlane(cells=
mdb.models[’Model-1’].parts[’Plate_Bottom’].cells.getSequenceFromMask((
’[#5 ]’, ), ), datumPlane=
mdb.models[’Model-1’].parts[’Plate_Bottom’].datums[6])
mdb.models[’Model-1’].parts[’Plate_Bottom’].PartitionCellByDatumPlane(cells=
mdb.models[’Model-1’].parts[’Plate_Bottom’].cells.getSequenceFromMask((
’[#3 ]’, ), ), datumPlane=
mdb.models[’Model-1’].parts[’Plate_Bottom’].datums[5])
mdb.models[’Model-1’].parts[’Plate_Bottom’].PartitionCellByDatumPlane(cells=
mdb.models[’Model-1’].parts[’Plate_Bottom’].cells.getSequenceFromMask((
’[#c ]’, ), ), datumPlane=
mdb.models[’Model-1’].parts[’Plate_Bottom’].datums[4])
mdb.models[’Model-1’].parts[’Plate_Bottom’].PartitionCellByDatumPlane(cells=
mdb.models[’Model-1’].parts[’Plate_Bottom’].cells.getSequenceFromMask((
’[#3 ]’, ), ), datumPlane=
mdb.models[’Model-1’].parts[’Plate_Bottom’].datums[3])
kinematicSplit=AVERAGE_STRAIN, hourglassControl=DEFAULT,
distortionControl=DEFAULT), ElemType(elemCode=C3D6, elemLibrary=STANDARD),
ElemType(elemCode=C3D4, elemLibrary=STANDARD)), regions=(
mdb.models[’Model-1’].parts[’Plate_Bottom’].cells.getSequenceFromMask((
’[#a00 ]’, ), ), ))
mdb.models[’Model-1’].parts[’Plate_Bottom’].setElementType(elemTypes=(ElemType(
elemCode=ElType, elemLibrary=STANDARD, secondOrderAccuracy=OFF,
distortionControl=DEFAULT), ElemType(elemCode=C3D6, elemLibrary=STANDARD),
ElemType(elemCode=C3D4, elemLibrary=STANDARD)), regions=(
mdb.models[’Model-1’].parts[’Plate_Bottom’].cells.getSequenceFromMask((
’[#5ff ]’, ), ), ))
mdb.models[’Model-1’].parts[’Plate_Bottom’].setMeshControls(algorithm=
MEDIAL_AXIS, regions=
mdb.models[’Model-1’].parts[’Plate_Bottom’].cells.getSequenceFromMask((
’[#21 ]’, ), ))
mdb.models[’Model-1’].parts[’Plate_Bottom’].Set(cells=
mdb.models[’Model-1’].parts[’Plate_Bottom’].cells.getSequenceFromMask((
’[#21 ]’, ), ), name=’Set-Mesh’)
mdb.models[’Model-1’].parts[’Plate_Bottom’].seedPart(deviationFactor=0.1,
minSizeFactor=0.1, size=MeshPlate)
mdb.models[’Model-1’].parts[’Plate_Bottom’].seedEdgeBySize(constraint=FINER,
deviationFactor=0.1, edges=
mdb.models[’Model-1’].parts[’Plate_Bottom’].edges.getSequenceFromMask((
’[#6067c71 #633fe720 #80d80000 #1 ]’, ), ), minSizeFactor=0.1, size=MeshSize)
mdb.models[’Model-1’].parts[’Plate_Bottom’].generateMesh()
##
Appendix B. Developed Codes 57
mdb.models[’Model-1’].parts[’Plate_Top’].datums[4])
mdb.models[’Model-1’].parts[’Plate_Top’].PartitionCellByDatumPlane(cells=
mdb.models[’Model-1’].parts[’Plate_Top’].cells.getSequenceFromMask((
’[#14 ]’, ), ), datumPlane=
mdb.models[’Model-1’].parts[’Plate_Top’].datums[5])
mdb.models[’Model-1’].parts[’Plate_Top’].PartitionCellByDatumPlane(cells=
mdb.models[’Model-1’].parts[’Plate_Top’].cells.getSequenceFromMask((
’[#3 ]’, ), ), datumPlane=
mdb.models[’Model-1’].parts[’Plate_Top’].datums[6])
mdb.models[’Model-1’].parts[’Plate_Top’].PartitionCellByDatumPlane(cells=
mdb.models[’Model-1’].parts[’Plate_Top’].cells.getSequenceFromMask((
’[#c ]’, ), ), datumPlane=
mdb.models[’Model-1’].parts[’Plate_Top’].datums[7])
deviationFactor=0.1, edges=
mdb.models[’Model-1’].parts[’Plate_Top’].edges.getSequenceFromMask((
’[#e4c40000 #fe68181b #80d8061f #1 ]’, ), ), minSizeFactor=0.1, size=MeshSize)
mdb.models[’Model-1’].parts[’Plate_Top’].generateMesh()
mdb.models[’Model-1’].parts[’Plate_Top’].Surface(name=’Surf-TP_Top’,
side1Faces=
mdb.models[’Model-1’].parts[’Plate_Top’].faces.getSequenceFromMask((
’[#22409090 #4010502 ]’, ), ))
mdb.models[’Model-1’].parts[’Plate_Top’].Surface(name=’Surf-TP_SL’, side1Faces=
mdb.models[’Model-1’].parts[’Plate_Top’].faces.getSequenceFromMask((
’[#0 #1000000 ]’, ), ))
mdb.models[’Model-1’].parts[’Plate_Top’].Surface(name=’Surf-TP_SR’, side1Faces=
mdb.models[’Model-1’].parts[’Plate_Top’].faces.getSequenceFromMask((
’[#0 #400000 ]’, ), ))
mdb.models[’Model-1’].parts[’Plate_Top’].Surface(name=’Surf-TP_Bot’,
side1Faces=
mdb.models[’Model-1’].parts[’Plate_Top’].faces.getSequenceFromMask((
’[#81212048 #8004844 ]’, ), ))
##
# ======================= Bolt Left ========== #
# ================ Model Bolt ==================================== #
mdb.models[’Model-1’].ConstrainedSketch(name=’__profile__’, sheetSize=500.0)
mdb.models[’Model-1’].sketches[’__profile__’].ConstructionLine(point1=(0.0,
-250.0), point2=(0.0, 250.0))
mdb.models[’Model-1’].sketches[’__profile__’].FixedConstraint(entity=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[2])
mdb.models[’Model-1’].sketches[’__profile__’].Line(point1=(0.0, 0.0), point2=(
0.0, H_B+2.0*H_HN))
mdb.models[’Model-1’].sketches[’__profile__’].VerticalConstraint(addUndoState=
False, entity=mdb.models[’Model-1’].sketches[’__profile__’].geometry[3])
mdb.models[’Model-1’].sketches[’__profile__’].Line(point1=(0.0, H_B+2.0*H_HN),
point2=( R_HN, H_B+2.0*H_HN))
mdb.models[’Model-1’].sketches[’__profile__’].HorizontalConstraint(
addUndoState=False, entity=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[4])
mdb.models[’Model-1’].sketches[’__profile__’].PerpendicularConstraint(
addUndoState=False, entity1=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[3], entity2=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[4])
mdb.models[’Model-1’].sketches[’__profile__’].Line(point1=(R_HN, H_B+2.0*H_HN),
point2=( R_HN, H_B+H_HN))
60 Appendix B. Developed Codes
mdb.models[’Model-1’].sketches[’__profile__’].VerticalConstraint(addUndoState=
False, entity=mdb.models[’Model-1’].sketches[’__profile__’].geometry[5])
mdb.models[’Model-1’].sketches[’__profile__’].PerpendicularConstraint(
addUndoState=False, entity1=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[4], entity2=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[5])
mdb.models[’Model-1’].sketches[’__profile__’].Line(point1=(R_HN, H_B+H_HN),
point2=( R_B, H_B+H_HN))
mdb.models[’Model-1’].sketches[’__profile__’].HorizontalConstraint(
addUndoState=False, entity=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[6])
mdb.models[’Model-1’].sketches[’__profile__’].PerpendicularConstraint(
addUndoState=False, entity1=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[5], entity2=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[6])
mdb.models[’Model-1’].sketches[’__profile__’].Line(point1=(R_B, H_B+H_HN),
point2=( R_B, H_HN))
mdb.models[’Model-1’].sketches[’__profile__’].VerticalConstraint(addUndoState=
False, entity=mdb.models[’Model-1’].sketches[’__profile__’].geometry[7])
mdb.models[’Model-1’].sketches[’__profile__’].PerpendicularConstraint(
addUndoState=False, entity1=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[6], entity2=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[7])
mdb.models[’Model-1’].sketches[’__profile__’].Line(point1=(R_B, H_HN),
point2=( R_HN, H_HN))
mdb.models[’Model-1’].sketches[’__profile__’].HorizontalConstraint(
addUndoState=False, entity=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[8])
mdb.models[’Model-1’].sketches[’__profile__’].PerpendicularConstraint(
addUndoState=False, entity1=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[7], entity2=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[8])
mdb.models[’Model-1’].sketches[’__profile__’].Line(point1=(R_HN, H_HN),
point2=( R_HN, 0.0))
mdb.models[’Model-1’].sketches[’__profile__’].VerticalConstraint(addUndoState=
False, entity=mdb.models[’Model-1’].sketches[’__profile__’].geometry[9])
mdb.models[’Model-1’].sketches[’__profile__’].PerpendicularConstraint(
addUndoState=False, entity1=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[8], entity2=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[9])
mdb.models[’Model-1’].sketches[’__profile__’].Line(point1=(R_HN, 0.0),
point2=( 0.0, 0.0))
mdb.models[’Model-1’].sketches[’__profile__’].HorizontalConstraint(
addUndoState=False, entity=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[10])
mdb.models[’Model-1’].sketches[’__profile__’].PerpendicularConstraint(
addUndoState=False, entity1=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[9], entity2=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[10])
mdb.models[’Model-1’].Part(dimensionality=THREE_D, name=’Bolt-L’, type=
DEFORMABLE_BODY)
Appendix B. Developed Codes 61
mdb.models[’Model-1’].parts[’Bolt-L’].BaseSolidRevolve(angle=180.0,
flipRevolveDirection=OFF, sketch=
mdb.models[’Model-1’].sketches[’__profile__’])
del mdb.models[’Model-1’].sketches[’__profile__’]
mdb.models[’Model-1’].parts[’Bolt-L’].Surface(name=’Surf-BL_Shank’, side1Faces=
mdb.models[’Model-1’].parts[’Bolt-L’].faces.getSequenceFromMask((’[#200 ]’,
), ))
mdb.models[’Model-1’].parts[’Bolt-L’].Surface(name=’Surf-BL_N’, side1Faces=
mdb.models[’Model-1’].parts[’Bolt-L’].faces.getSequenceFromMask((’[#100 ]’,
), ))
mdb.models[’Model-1’].parts[’Bolt-L’].Surface(name=’Surf-BL_H’, side1Faces=
mdb.models[’Model-1’].parts[’Bolt-L’].faces.getSequenceFromMask((’[#400 ]’,
), ))
##
# ===================== Bolt Right =================== #
# ================ Model Bolt ==================================== #
mdb.models[’Model-1’].ConstrainedSketch(name=’__profile__’, sheetSize=500.0)
mdb.models[’Model-1’].sketches[’__profile__’].ConstructionLine(point1=(0.0,
-250.0), point2=(0.0, 250.0))
mdb.models[’Model-1’].sketches[’__profile__’].FixedConstraint(entity=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[2])
mdb.models[’Model-1’].sketches[’__profile__’].Line(point1=(0.0, 0.0), point2=(
0.0, H_B+2.0*H_HN))
mdb.models[’Model-1’].sketches[’__profile__’].VerticalConstraint(addUndoState=
False, entity=mdb.models[’Model-1’].sketches[’__profile__’].geometry[3])
mdb.models[’Model-1’].sketches[’__profile__’].Line(point1=(0.0, H_B+2.0*H_HN),
point2=( R_HN, H_B+2.0*H_HN))
mdb.models[’Model-1’].sketches[’__profile__’].HorizontalConstraint(
addUndoState=False, entity=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[4])
mdb.models[’Model-1’].sketches[’__profile__’].PerpendicularConstraint(
addUndoState=False, entity1=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[3], entity2=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[4])
mdb.models[’Model-1’].sketches[’__profile__’].Line(point1=(R_HN, H_B+2.0*H_HN),
point2=( R_HN, H_B+H_HN))
mdb.models[’Model-1’].sketches[’__profile__’].VerticalConstraint(addUndoState=
False, entity=mdb.models[’Model-1’].sketches[’__profile__’].geometry[5])
mdb.models[’Model-1’].sketches[’__profile__’].PerpendicularConstraint(
addUndoState=False, entity1=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[4], entity2=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[5])
mdb.models[’Model-1’].sketches[’__profile__’].Line(point1=(R_HN, H_B+H_HN),
point2=( R_B, H_B+H_HN))
mdb.models[’Model-1’].sketches[’__profile__’].HorizontalConstraint(
addUndoState=False, entity=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[6])
mdb.models[’Model-1’].sketches[’__profile__’].PerpendicularConstraint(
addUndoState=False, entity1=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[5], entity2=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[6])
mdb.models[’Model-1’].sketches[’__profile__’].Line(point1=(R_B, H_B+H_HN),
point2=( R_B, H_HN))
mdb.models[’Model-1’].sketches[’__profile__’].VerticalConstraint(addUndoState=
Appendix B. Developed Codes 63
False, entity=mdb.models[’Model-1’].sketches[’__profile__’].geometry[7])
mdb.models[’Model-1’].sketches[’__profile__’].PerpendicularConstraint(
addUndoState=False, entity1=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[6], entity2=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[7])
mdb.models[’Model-1’].sketches[’__profile__’].Line(point1=(R_B, H_HN),
point2=( R_HN, H_HN))
mdb.models[’Model-1’].sketches[’__profile__’].HorizontalConstraint(
addUndoState=False, entity=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[8])
mdb.models[’Model-1’].sketches[’__profile__’].PerpendicularConstraint(
addUndoState=False, entity1=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[7], entity2=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[8])
mdb.models[’Model-1’].sketches[’__profile__’].Line(point1=(R_HN, H_HN),
point2=( R_HN, 0.0))
mdb.models[’Model-1’].sketches[’__profile__’].VerticalConstraint(addUndoState=
False, entity=mdb.models[’Model-1’].sketches[’__profile__’].geometry[9])
mdb.models[’Model-1’].sketches[’__profile__’].PerpendicularConstraint(
addUndoState=False, entity1=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[8], entity2=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[9])
mdb.models[’Model-1’].sketches[’__profile__’].Line(point1=(R_HN, 0.0),
point2=( 0.0, 0.0))
mdb.models[’Model-1’].sketches[’__profile__’].HorizontalConstraint(
addUndoState=False, entity=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[10])
mdb.models[’Model-1’].sketches[’__profile__’].PerpendicularConstraint(
addUndoState=False, entity1=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[9], entity2=
mdb.models[’Model-1’].sketches[’__profile__’].geometry[10])
mdb.models[’Model-1’].Part(dimensionality=THREE_D, name=’Bolt-R’, type=
DEFORMABLE_BODY)
mdb.models[’Model-1’].parts[’Bolt-R’].BaseSolidRevolve(angle=180.0,
flipRevolveDirection=OFF, sketch=
mdb.models[’Model-1’].sketches[’__profile__’])
del mdb.models[’Model-1’].sketches[’__profile__’]
##
# ================= Assembly ======================== #
# ================== Assembly ============================== #
mdb.models[’Model-1’].rootAssembly.DatumCsysByDefault(CARTESIAN)
mdb.models[’Model-1’].rootAssembly.Instance(dependent=ON, name=’Bolt-L-1’,
part=mdb.models[’Model-1’].parts[’Bolt-L’])
mdb.models[’Model-1’].rootAssembly.Instance(dependent=ON, name=’Bolt-R-1’,
part=mdb.models[’Model-1’].parts[’Bolt-R’])
Appendix B. Developed Codes 65
mdb.models[’Model-1’].rootAssembly.Instance(dependent=ON, name=’Plate_Bottom-1’
, part=mdb.models[’Model-1’].parts[’Plate_Bottom’])
mdb.models[’Model-1’].rootAssembly.Instance(dependent=ON, name=’Plate_Top-1’,
part=mdb.models[’Model-1’].parts[’Plate_Top’])
# Generates Assembly
mdb.models[’Model-1’].rootAssembly.instances[’Bolt-R-1’].translate(vector=(
50.0, 0.0, 0.0))
mdb.models[’Model-1’].rootAssembly.instances[’Plate_Bottom-1’].translate(
vector=(100.0, 0.0, 0.0))
mdb.models[’Model-1’].rootAssembly.instances[’Plate_Top-1’].translate(vector=(
300.0, 0.0, 0.0))
# Plate Position
mdb.models[’Model-1’].rootAssembly.translate(instanceList=(’Plate_Top-1’, ),
vector=(-(300.0+DistH1-(100.0+Length-DistH2)), 0.0, Thickness))
# Bolts Position
mdb.models[’Model-1’].rootAssembly.rotate(angle=270.0, axisDirection=(R_HN/2.0,
0.0, 0.0), axisPoint=(-R_HN/2.0, 0.0, 0.0), instanceList=(’Bolt-L-1’,
’Bolt-R-1’))
mdb.models[’Model-1’].rootAssembly.translate(instanceList=(’Bolt-L-1’, ),
vector=(100.0+Length-DistH2-Clear/2.0, 0.0, H_B+H_HN))
mdb.models[’Model-1’].rootAssembly.translate(instanceList=(’Bolt-R-1’, ),
vector=(50.0+Length-DistH1-Clear/2.0, 0.0, H_B+H_HN))
mdb.models[’Model-1’].interactionProperties[’IntProp-PP’].TangentialBehavior(
dependencies=0, directionality=ISOTROPIC, elasticSlipStiffness=None,
formulation=PENALTY, fraction=0.005, maximumElasticSlip=FRACTION,
pressureDependency=OFF, shearStressLimit=None, slipRateDependency=OFF,
table=((FrPP, ), ), temperatureDependency=OFF)
mdb.models[’Model-1’].interactionProperties[’IntProp-PP’].NormalBehavior(
allowSeparation=ON, clearanceAtZeroContactPressure=0.0,
constraintEnforcementMethod=PENALTY, contactStiffness=DEFAULT,
contactStiffnessScaleFactor=FrPP, pressureOverclosure=HARD,
stiffnessBehavior=LINEAR)
mdb.models[’Model-1’].interactions[’Int-PP’].setValues(adjustMethod=NONE,
bondingSet=None, contactTracking=TWO_CONFIG, enforcement=SURFACE_TO_SURFACE
, initialClearance=OMIT, interactionProperty=’IntProp-PP’, sliding=FINITE,
thickness=ON)
Ti = str.replace(Ti,’.’,’-’)
Ma = str.replace(Ma,’.’,’-’)
Cl = str.replace(Cl,’.’,’-’)
RB = str.replace(RB,’.’,’-’)
EC = str.replace(EC,’.’,’-’)
"""
It allows to name the Files, it should be named in such a way that
identification is very easy
"""
job_name = ’Double_’+Ti+’_’+Ma+’_’+Cl+’_’+RB+’_’+EC
Appendix B. Developed Codes 69
Material.py:
# Created by Fernando de Abreu Almeida 27-9-2018
from part import *
from material import *
from section import *
from assembly import *
from step import *
from interaction import *
from load import *
from mesh import *
from optimization import *
from job import *
from sketch import *
from visualization import *
from connectorBehavior import *
mdb.models[’Model-1’].Material(name=’Material-Bolt’)
mdb.models[’Model-1’].materials[’Material-Bolt’].Elastic(table=((205000.0,
0.3), ))
mdb.models[’Model-1’].materials[’Material-Bolt’].Plastic(table=((930.0, 0.0), (
952.0, 0.039)))
mdb.models[’Model-1’].Material(name=’Material-Plate’)
mdb.models[’Model-1’].materials[’Material-Plate’].Elastic(table=((213000.0,
0.3), ))
mdb.models[’Model-1’].materials[’Material-Plate’].Plastic(table=((607.0, 0.0),
70 Appendix B. Developed Codes
(670.0, 0.058)))
mdb.models[’Model-1’].Material(name=’Material-Plate’)
mdb.models[’Model-1’].materials[’Material-Plate’].Elastic(table=((210000.0,
0.3), ))
mdb.models[’Model-1’].materials[’Material-Plate’].Plastic(table=((440.88,0),
(469.2,0.0178046246335067),(540.8,0.0372227104906083),(583,0.0562709054613028),
(615.6,0.0749630384734553),(638,0.0933121771416519),(660.8,0.11133068264433),
(672.6,0.129030259743731),(684.4,0.1464220024556),(696.2,0.1635164358149),
(708,0.180323554131282),(719.8,0.196852856082492),(560,0.33447423395854)))
elif Mat==3.0:
mdb.models[’Model-1’].Material(name=’Material-Bolt’)
mdb.models[’Model-1’].materials[’Material-Bolt’].Elastic(table=((205000.0,
0.3), ))
mdb.models[’Model-1’].materials[’Material-Bolt’].Plastic(table=((930.0, 0.0),
( 952.0, 0.039)))
mdb.models[’Model-1’].Material(name=’Material-Plate’)
mdb.models[’Model-1’].materials[’Material-Plate’].Elastic(table=((213000.0,
0.3), ))
mdb.models[’Model-1’].materials[’Material-Plate’].Plastic(table=((607.0, 0.0),
(670.0, 0.058)))
Mesh.py:
MeshSize = 2.5 # Size of the Mesh Around the Holes
ElType = C3D8 # C3D8, C3D8R or C3D8I on the Surface with Interaction
MeshPlate = 5.5 # Size of the Mesh on the Rest of the Plate
ElPlate = C3D8R # C3D8, C3D8R or C3D8I on the Surface with Interaction
’[#5ff ]’, ), ), ))
mdb.models[’Model-1’].parts[’Plate_Bottom’].setMeshControls(algorithm=
MEDIAL_AXIS, regions=
mdb.models[’Model-1’].parts[’Plate_Bottom’].cells.getSequenceFromMask((
’[#21 ]’, ), ))
mdb.models[’Model-1’].parts[’Plate_Bottom’].Set(cells=
mdb.models[’Model-1’].parts[’Plate_Bottom’].cells.getSequenceFromMask((
’[#21 ]’, ), ), name=’Set-Mesh’)
mdb.models[’Model-1’].parts[’Plate_Bottom’].seedPart(deviationFactor=0.1,
minSizeFactor=0.1, size=MeshPlate)
mdb.models[’Model-1’].parts[’Plate_Bottom’].seedEdgeBySize(constraint=FINER,
deviationFactor=0.1, edges=
mdb.models[’Model-1’].parts[’Plate_Bottom’].edges.getSequenceFromMask((
’[#6067c71 #633fe720 #80d80000 #1 ]’, ), ), minSizeFactor=0.1, size=MeshSize)
mdb.models[’Model-1’].parts[’Plate_Bottom’].generateMesh()
mdb.models[’Model-1’].parts[’Bolt-L’].seedPart(deviationFactor=0.1,
minSizeFactor=0.1, size=MeshSize)
mdb.models[’Model-1’].parts[’Bolt-L’].setMeshControls(algorithm=MEDIAL_AXIS,
regions=mdb.models[’Model-1’].parts[’Bolt-L’].cells.getSequenceFromMask((
’[#7 ]’, ), ))
mdb.models[’Model-1’].parts[’Bolt-L’].generateMesh()
execfile(script_path+’\Var.py’)
# Gets the address of the file and executes the right Var.py
# They all have to be in the same folder to work
# os.chdir(r"C:\General_Assembly\Results")
#folder = os.path.dirname(os.path.dirname(os.path.abspath( __file__ )))
folder = os.path.dirname(os.path.abspath(script_path))
os.chdir(folder+’\Results’)
Appendix B. Developed Codes 73
Ti = str.replace(Ti,’.’,’-’)
Ma = str.replace(Ma,’.’,’-’)
Cl = str.replace(Cl,’.’,’-’)
RB = str.replace(RB,’.’,’-’)
EC = str.replace(EC,’.’,’-’)
"""
It allows to name the Files, it should be named in such a way
that identification is very easy
"""
job_name = ’Double_’+Ti+’_’+Ma+’_’+Cl+’_’+RB+’_’+EC
odb = session.odbs[folder+’\\Results\\’+job_name+’.odb’]
session.xyDataListFromField(odb=odb, outputPosition=NODAL, variable=((’RF’,
NODAL, ((COMPONENT, ’RF1’), )), (’U’, NODAL, ((COMPONENT, ’U1’), )), ),
nodeSets=(’M_SET-1’, ))
x1 = session.xyDataObjects[’RF:RF1 PI: ASSEMBLY N: 1’]
x0 = session.xyDataObjects[’U:U1 PI: ASSEMBLY N: 1’]
session.writeXYReport(fileName=’H:/Thesis/Analysis_Result/’+job_name+’.txt’,
xyData=(x0, x1))
# One can use the same principle to take pictures and save them
# the same goes for graphs
os.chdir(’H:/Thesis/Analysis_Result’)
session.xyDataListFromField(odb=odb, outputPosition=NODAL, variable=((’RF’,
NODAL, ((COMPONENT, ’RF1’), )), (’U’, NODAL, ((COMPONENT, ’U1’), )), ),
nodeSets=(’M_SET-1’, ))
xy1 = session.xyDataObjects[’U:U1 PI: ASSEMBLY N: 1’]
74 Appendix B. Developed Codes
Delete.py:
"""
made by Fernando de Abreu Almeida 2018-10-11
Script deletes all the files that are not of interest after doing an analysis
"""
import glob
import os
tbd = [’*.com’,’*.dat’,’*.inp’,’*.ipm’,’*.lck’,’*.log’,’*.msg’,’*.prt’,
’*.sta’,’*.jnl’,’*.sim’,’*.rec’]
tbd1 = [’*.rpy’,’*.rec’,’*.txt’,’*.rpy.*’,’*.log’,’*.jnl’,’*.msg’]
DataExtraction.m:
% Use: select a directory, in this directory only Abaqus txt files must be
% present. UPDATE: extra files are allowed, avoid having other .txt files,
% besides the Abaqus Results.
% First Matlab will gather the names of every file, after it will
% gather all the relevante information (in this case Force X Displecement)
% and save it in an array for later usage.
% Matlab will create a folder with the date and time to store the .xlsx
% It also extracts all the data for an Excel Sheet.
% Matlab creates a general excel sheet and a particular one for each type
% of single bolt analysis
c = struct2cell(b);
[m,n] = size(c);
index = 1;
% Counter inside the counter to avoid size problems
empty = 1;
% Counts the number of files in the folder that are not .txt
for i=1:n
% Statement that only saves .txt text to be later on extracted
k(i) = strfind(c(1,i),’.txt’);
% Finds .txt in the variables, if there arent the cell will be empty
g = cell2mat(k(i));
if isempty(g)
empty = empty+1;
else
d(1,index)=c(1,i);
index = index+1;
end
end
[m,n] = size(d);
%% Initialize variables.
Index1 = 1;
% Index for the logical point of cells from A to Z
Index2 = 1;
% Internal Counters for the Excel extraction
Index3 = 1;
for i=1:n
% A loop for all of the files in the folder (again the folder should only contain the .
file = [directory];
% Directory where the files are located
fjoint = strcat(file,d(1,i));
% Combines the directory to the file
filename = cell2mat(fjoint);
% Transform the array into a cell for the other commands
delimiter = ’ ’;
startRow = 3;
Alphabet = [’A’ ’B’ ’C’ ’D’ ’E’ ’F’ ’G’ ’H’ ’I’ ’J’ ’K’
’L’ ’M’ ’N’ ’O’ ’P’ ’Q’ ’R’ ’S’ ’T’ ’U’ ’V’ ’W’ ’X’ ’Y’ ’Z’];
[o,p] = size(data.(e));
% O is the variable of interest
excelsheet = strcat(’H:\’,t,’\All_Files.xlsx’);
if Index1 < 26
% Inserts Data of Interest for the Cells A to Z
Alph = strcat(string(Alphabet(Index1)),’1’);
Bet = strcat(string(Alphabet(Index1)),’2:’,string(Alphabet(Index1+1)),string(o+1));
xlswrite(excelsheet ,{name},’Sheet1’,Alph);
xlswrite(excelsheet ,data.(e),’Sheet1’,Bet);
else % Inserts Data of Interest to Cells AA...
Indexx = ceil (Index3/26);
Alph = strcat(string(Alphabet(Indexx)),string(Alphabet(Index2)),’1’);
% The Cell for the Name
Bet = strcat(string(Alphabet(Indexx)),string(Alphabet(Index2)),’2:’,
string(Alphabet(Indexx)),string(Alphabet(Index2+1)),string(o+1));
% The Cells for the Data
xlswrite(excelsheet ,{name},’Sheet1’,Alph);
xlswrite(excelsheet ,data.(e),’Sheet1’,Bet);
Index2 = Index2+2;
Index3 = Index3+2;
end
Index2 = 1;
end
Index1 = Index1+2;
[mm,nn] = size(Singles);
cont = 1;
cont2 = 1;
for i=1:nn
% A loop for the number of "Single" Analysis in the Folder"
Singles(i) = erase(Singles(i),’Single’);
exsheet = strrep(Singles(i),’S’,’_’);
exsheet = strrep(exsheet,’d’,’-’);
Index1 = 1;
% Index for the logical point of cells from A to Z
Index2 = 1;
Index3 = 1;
cont2 = 1;
for j=1:n
% A loop for all the .txt files, it will read through them
% and collect the ones for the "Single Bolt"
Appendix B. Developed Codes 79
yy = strfind(f(j),Singles(i));
zz = cell2mat(yy);
e = cell2mat(d(1,j));
name = erase(e,’.txt’);
if isempty(zz)
else
Seq(cont)=f(j);
cont = cont+1;
[o,p] = size(data.(cell2mat(f(j))));
% O is the variable of interest
if Index1 < 26
% Inserts Data of Interest for the Cells A to Z
Alph = strcat(string(Alphabet(Index1)),’1’);
Bet = strcat(string(Alphabet(Index1)),’2:’,string(Alphabet(Index1+1)),string(o+1)
name2 = f(j);
xlswrite(xlsxsheet ,{name},’Sheet1’,Alph);
xlswrite(xlsxsheet ,data.(cell2mat(f(j))),’Sheet1’,Bet);
else % Inserts Data of Interest to Cells AA...
Indexx = ceil (Index3/26);
name2 = f(j);
Alph = strcat(string(Alphabet(Indexx)),string(Alphabet(Index2)),’1’);
% The Cell for the Name
Bet = strcat(string(Alphabet(Indexx)),string(Alphabet(Index2)),’2:’
,string(Alphabet(Indexx)),string(Alphabet(Index2+1)),string(o+1)); % The Cells for
xlswrite(xlsxsheet ,{name},’Sheet1’,Alph);
xlswrite(xlsxsheet ,data.(cell2mat(f(j))),’Sheet1’,Bet);
Index2 = Index2+2;
Index3 = Index3+2;
end
if Index2 > 26
% zero the Index2 so it will never go above 26
Index2 = 1;
end
Index1 = Index1+2;
xlswrite(xlsxsheet ,{name},’Max’,strcat(’A’,string(cont2)));
xlswrite(xlsxsheet ,top.(cell2mat(f(j))),’Max’,strcat(’B’,string(cont2)));
cont2 = cont2+1;
end
end % End of the loop for all the elements
end % End of the loop for the "Single Bolt"
www.kth.se