Fatigue Crack Growth Analysis in Python algorithm with Finite ...
-
Upload
khangminh22 -
Category
Documents
-
view
3 -
download
0
Transcript of Fatigue Crack Growth Analysis in Python algorithm with Finite ...
Fatigue Crack Growth Analysis in Python algorithm
with Finite Element Methods
Numerical Simulation of Fatigue Crack Growth
Spricktillväxt Analys i Python-algoritm med Finita Element Metoden
Hasan Majid
Faculty of Health, Science and Technology
Degree Project for Master of Science in Engineering, Mechanical Engineering
30 hp
Supervisor: Abdulbaset Mussa
Examinator: Jens Bergström
2022-01-04
i
Abstract
The goal of this thesis was to construct and develop a python-based finite element computer
program for the evaluation of fatigue crack growth rate in notched metallic rods. The simulation
was done by implementing elastic stress theory and linear elastic fracture mechanics techniques.
To assess the python script and also determine the factors affecting the growth rate of fatigue
cracks, experimental testing was performed. A metallic rod made of steel with a single crack
which was initiated with a hardness indent in the middle of the notch and fatigue crack growth
testing was performed with the help of a servo-hydraulic tensile testing machine and a camera.
The developed python script was used to perform two numerical analyzes with the help of the
software suite ABAQUS. Two methods were then implemented to determine the crack growth
rate. These methods are the Paris crack growth rate model and Walker’s crack growth rate
model.
It is concluded that the stress intensity range has a governing factor on fatigue crack growth.
ABAQUS was used to determine the stress intensity range for each specific crack geometry.
The obtained numerical results were compared with the experimental tests performed on the
steel notched test specimens in Karlstad University's mechanical laboratory and also with each
other. After analyzing the results, it was concluded that both numerical methods gave good
results in the beginning and had a similar crack growth pattern where Walker's method was
slightly better, but after the crack length exceeded about 0.5 mm, both began to deviate
significantly from the experimental results.
iii
Sammanfattning
Målet med denna avhandling var att konstruera och utveckla ett pytonbaserat datorprogram
med finita element metoden för att undersöka tillväxthastighet för utmattningssprickor i
anvisade metalliska stavar. Simuleringen görs genom att implementera elastiska spännings-
töjnings samband och linjär elastisk brottmekanik.
För att bedöma python skriptet och även bestämma de faktorer som påverkar
tillväxthastigheten för utmattningssprickor utfördes experimentell utmattningsprovning. En
provstav av stål med en singel spricka som initierades med ett hårdhetsinryckt i mitten av
staven och spricktillväxtprovning utfördes med hjälp av en servohydraulisk
dragprovningsmaskin och en kamera.
Det utvecklade python skriptet användes för att utföra två numeriska analyser med hjälp av
mjukvarupaketet ABAQUS. Två metoder implementerades sedan för att bestämma sprickans
tillväxthastighet. Dessa metoder är Paris sprick tillväxthastighets modell och Walkers sprick
tillväxthastighets modell.
Det dras slutsatsen att spänningsintensiteten har en styrande faktor för utmattningssprickans
tillväxt. ABAQUS användes för att bestämma spänningsintensiteten för varje specifik
sprickgeometri. De erhållna numeriska resultaten jämfördes med de experimentella proven
som utfördes på stål i Karlstad universitetets mekaniska laboratorium och även med varandra.
Efter att ha analyserat resultaten drogs slutsatsen att båda numeriska metoderna gav bra
resultat i början och hade ett liknande sprickväxtmönster där Walkers metod var något bättre,
men efter att spricklängden översteg cirka 0.5 mm började båda avvika avsevärt från det
experimentella resultat.
v
Nomenclature
Symbols Description
LEFM Linear Elastic Fracture Mechanics
EPFM Elastic Plastic Fracture Mechanics
𝒢 Energy release rate
𝒢𝑐 The critical energy release rate
𝑑𝑈 Change in potential energy
𝑑𝑎 Change in crack length
E Youngs modulus
v Poison’s ratio
𝐾 Stress intensity factor
𝐾𝐼 , 𝐾𝐼𝐼 , 𝐾𝐼𝐼𝐼 Mode defining the stress intensity factor
∆𝐾 Stress intensity range
𝐾𝑚𝑎𝑥 The maximum stress intensity factor
𝐾𝑚𝑖𝑛 The minimum stress intensity factor
𝐾𝑡ℎ Threshold stress intensity factor
𝐾𝑐 The critical stress intensity factor
F Geometric factor
𝜎 Stress
a Crack length
𝜎𝑥 , 𝜎𝑦 Stresses in the x and y-direction
𝜏𝑥𝑦 Shear stress relative x and y-direction
𝑟, 𝜃 polar coordinates ahead of the crack tip
𝑥, 𝑦, 𝑧 coordinates in a rectangular coordinate
system
𝒥 The non-linear elastic energy release rate
𝒥𝑐 The critical non-linear elastic energy release
rate
W Strain energy density
T Stress vector acting on the contour
𝒖 Displacement vector
𝑑𝑎/𝑑𝑁 Crack growth rate
vi
C, m Coefficients for Paris growth model
𝑎𝑖 Initial half crack height length
𝑐𝑖 Initial half crack width length
𝐶0, 𝛾 Coefficients for Walker’s growth model
R R-ratio, 𝜎𝑚𝑎𝑥 𝜎𝑚𝑖𝑛⁄
viii
Table of content
List of Figures ........................................................................................................................... x
List of Tables ............................................................................................................................ xi
1. Introduction .......................................................................................................................... 1
1.1 Overview .......................................................................................................................... 1
1.2 Aims and Objectives of the thesis .................................................................................... 2
1.3 Scope of thesis .................................................................................................................. 3
1.4 Delimitations .................................................................................................................... 3
2. Literature survey .................................................................................................................. 4
2.1 Fracture Mechanics .......................................................................................................... 4
2.2 Stress analysis of cracks ................................................................................................... 5
2.3 𝒥 - integral ........................................................................................................................ 7
2.4 Fatigue Crack Growth Model ........................................................................................... 9
2.4.1 Paris Growth Model .................................................................................................. 9
2.4.2 Walker’s Growth Model .......................................................................................... 10
3. Methods ............................................................................................................................... 12
3.1 Experimental analysis..................................................................................................... 12
3.1.1 Material ................................................................................................................... 13
3.1.2 Load and boundary conditions ................................................................................ 13
3.2 Finite element method .................................................................................................... 14
3.2.1 Python script in ABAQUS ...................................................................................... 15
3.2.2 Build the geometry including the crack. ................................................................. 15
3.2.3 Assemble and define crack. ..................................................................................... 16
3.2.4 Define the step and history output. .......................................................................... 19
3.2.5 Apply load and boundary conditions. ..................................................................... 20
3.2.6 Mesh ........................................................................................................................ 21
4. Results ................................................................................................................................. 22
4.1 Experimental .................................................................................................................. 22
4.2 Finite element method .................................................................................................... 25
4.2.1 Paris Crack Growth Model ...................................................................................... 25
4.2.2 Walker Crack Growth Model .................................................................................. 28
4.2.3 Comparison ............................................................................................................. 30
5. Discussion ............................................................................................................................ 33
ix
6. Conclusion ........................................................................................................................... 35
7. Future Work ....................................................................................................................... 35
8. References ........................................................................................................................... 36
Appendix A ............................................................................................................................. 38
x
List of Figures
Chapter 2:
Figure 2.2.1: The different modes of crack extension. ............................................................... 5
Figure 2.2.2: Illustrates the distribution of stresses in the vicinity of a crack tip. ..................... 6
Figure 2.2.3: Shows a coordinate system that is tangential and perpendicular to the crack front.
.................................................................................................................................................... 7
Figure 2.3.1: Illustrates the line contour surrounding the crack tip. .......................................... 8
Figure 2.4.1: Illustrates a typical crack growth curve on a logarithmic scale. ........................... 9
Chapter 3:
Figure 3.1.1: Illustrates the test setup where a) specimen geometry, b) measurement of crack
length with a camera system, c) crack growth from hardness impression on the bottom of the
crack, d) assumed crack geometry where 𝑎𝑖 is the crack depth and 𝑐𝑖 is half of the crack
length in the horizontal direction that goes along the surface. ................................................. 12
Figure 3.2.1: Illustrates meshing scheme around the crack tip where the yellow half-circle
represents the crack front. ........................................................................................................ 14
Figure 3.2.2.1: a) Illustrates the geometry of the structure including the crack indent, b) Zoomed
view of the crack indent in the structure with the partitions. ................................................... 16
Figure 3.2.2.2:a) and b) Illustrates the geometry of the crack with partitions where the red
illustrates the crack front. ......................................................................................................... 16
Figure 3.2.3.1: a) Illustrates the location of the crack and how small it is relative to the rest of
the structure, b) Zoomed view of the crack embedded in the structure. .................................. 17
Figure 3.2.3.2: Shows the settings used to define the crack and the crack extension direction.
.................................................................................................................................................. 18
Figure 3.2.3.3: This Shows the crack constrains configuration, where the master surface is the
interacting surface of the crack, and the slave surface is the interacting surface of the structure.
.................................................................................................................................................. 18
Figure 3.2.4.1: This shows the settings used in the created step. ............................................. 19
Figure 3.2.4.2: Shows the settings used in the created history output request. ........................ 19
Figure 3.2.5.1: Illustrates the loading and boundary conditions. ............................................. 20
Figure 3.2.6.1: The mesh used on the structure is shown. ....................................................... 21
Figure 3.2.6.2: The mesh used on the crack is shown. ............................................................. 21
xi
Chapter 4:
Figure 4.1.1: Shows the Vickers indent and the crack path along with the load direction. ..... 22
Figure 4.1.2: Shows the interior crack length vs the number of load cycles. .......................... 23
Figure 4.1.3: The crack growth rate vs stress intensity range .................................................. 24
Figure 4.2.1.1: Shows the surface crack length, 𝑐𝑖 vs number of loads cycles (Paris). .......... 27
Figure 4.2.1.2: The crack growth rate vs stress intensity range (Paris). .................................. 27
Figure 4.2.2.1: Shows the surface crack length vs the number of loads cycles (Walker). ....... 30
Figure 4.2.2.2: The crack growth rate vs stress intensity range (Walker). ............................... 30
Figure 4.2.3.1: Comparison between all analyzes for the surface crack length, 𝑐𝑖 vs load cycles.
.................................................................................................................................................. 31
Figure 4.2.3.2: The deviation in the interior crack length for Paris equation and Walker’s
equation relative experimental results ...................................................................................... 31
Figure 4.2.3.3: Comparison between all analyzes for crack growth rate vs stress intensity range.
.................................................................................................................................................. 32
List of Tables
Table 3.1.1.1: The material properties of the specimen ........................................................... 13
Table 3.1.2.1: Inputs used in the servo-hydraulic universal testing machine .......................... 14
Table 4.1.1: Results from experimental analysis ..................................................................... 22
Table 4.1.2 The stress intensity range for the experimental results ......................................... 24
Table 4.1.3: Coefficients of Paris equation .............................................................................. 25
Table 4.2.2.1: Parameters used in the crack growth calculation with respect to Walker’s
equation .................................................................................................................................... 28
Table 4.2.2.2: Results from numerical analysis with respect to Paris equation ....................... 29
1
1. Introduction
1.1 Overview
At the end of the 19th century and the beginning of the 20th century, many researchers and
engineers started noticing failures of components and structures whose service life was
considered to be significantly longer. In other words, the components and structures were
considered to fail prematurely. All components and structures are prone to breakage. They can
collapse and fail in several ways such as yielding, buckling, and brittle fracture. If defects or
stress raisers are present, crack initiation can occur. A crack can grow to a critical size where
the component or structural strength will decrease to a point where fracture is inevitable.
Fracture mechanics is the study of propagation of cracks and fracture in materials under load.
A Fracture can occur in different ways such as ductile fracture, brittle fracture, and fatigue.
Ductile and brittle fracture is due to overload where the structure is loaded beyond its ultimate
tensile strength. Ductile fracture is characterized by massive plastic deformation before
fracture, brittle fracture is the converse and is characterized by no apparent plastic deformation
before fracture. Fatigue on the other hand occurs at much lower loads, but due to the nature of
the cyclic load, local stresses may accumulate cyclic plastic deformation and cause crack
initiation.
Fatigue is the initiation and propagation of cracks in a material due to cyclic loading. The cyclic
loads are usually subcritical, and they would not cause failure normally, instead the crack will
grow a small amount with each loading cycle. It is approximated that 80% of all structural
failures are due to fatigue which makes it the most common mode of fracture. The main reason
is due to most commercial components and structures contain small flaws which lead to crack
initiation to occur. Another reason is that fatigue crack rate is a function of specific material
properties, crack length and applied load. [1]
Inspections can be made to look for cracks on whole structures or structure elements, and if a
crack is detected the component can be fixed or if necessary, replaced. To reduce the risk of
structural failure inspection intervals can be set at some fraction of the estimated fatigue life of
the structure. Fatigue life is a scientific term that relates to the number of cycles required to
grow a crack from a minimum detectable size to a critical size that cause an unstable crack
growth rate and failure is expected. The propagation of fatigue cracks has long been the subject
2
of theoretical analysis. There are several analytical models and equations available in the
literature that describe different cases of crack growth with many different geometries such as
an edge crack, center crack, and embedded penny crack. [1]
For decades, the finite element method has been assisting scientists and engineers to solve
elastic problems containing cracks. Usually, cracks are modelled as part of the structural
geometry. The behaviour of crack propagation can be calculated through the means fracture
mechanics provide. Knowledge about crack behaviour is essential to ensure the safety of
structures and to prevent failures during their service life. It is also important to adopt inspection
and maintenance schedules, so cracks get detected before it is too late. To be able to use fracture
mechanics principles to a real practical problem some properties are required for instance crack
size, the effective load and some of the mechanical properties of the material. Usually, most of
these factors are represented by the stress intensity factor.
1.2 Aims and Objectives of the thesis
The main subject of this thesis is to use the finite element method to analyze and simulate
fatigue crack growth rate. One of the main benefits of running simulations rather than physical
experiments is the capacity to generate significantly larger numbers of results for less time and
money.
A python script can be written to build a FEM model with a special calculation module. The
Python script is then executed with ABAQUS to simulate the growth of the crack using a chosen
crack growth model such as Paris’ model or Walkers model. The purpose of this study is to
develop a Python code to perform a fatigue simulation with respect to Paris law and to calculate
the crack growth rate. Further, the purpose was to compare the simulation results with
experimental results. Such a python script is already developed but is based on an older version
of ABAQUS and is soon obsolete and cannot be used with newer versions of ABAQUS. The
thesis is therefore dissected into the following stages,
• Rewrite and develop the Python script so that it is compatible with newer ABAQUS
versions, such as ABAQUS version 2020.
• Study the crack growth rate of a specific cracked specimen.
• Check the results of the study by comparison with experimental analysis.
3
• The python script simulates the growth of the crack by implementing the Paris model, write
a new script to simulate the growth of the crack by implementing Walker’s model.
• Check the results of the new study by comparison with an experimental analysis and the
study of the Paris model.
1.3 Scope of thesis
This project was carried to establish a python script to model the fatigue crack growth
phenomenon using finite element methods with the aid of fracture mechanics concepts. The
thesis begins in chapter one with an introduction of the basic fracture mechanical concepts.
Followed by a detailed literature study on fracture mechanics, fatigue crack growth theories and
finite element method. Chapter three presents the methods used to calculate the crack growth
rate and in chapter four the results are reviewed. The discussion is presented in chapter five and
finally, conclusions and suggestions for further work are presented in chapters six and seven,
respectively. The python script developed is presented in Appendix A.
1.4 Delimitations
Since the experimental testing was performed in uniaxial fatigue of a single-sided notched
cylindrical rod, the following delimitations have been made:
• Material selection will not be made since the material has already been suggested by the
experimental analysis.
• The loading and boundary conditions are set by the servo-hydraulic tensile testing machine
used in the experimental analysis.
• No study will be done regarding fatigue life.
• No design improvement will be suggested to increase or decrease the crack growth rate.
• Only one crack will be present with a specific cyclic load configuration.
• The location and size of the crack are preset by a Vickers hardness indent from the
experimental analysis.
4
2. Literature survey
2.1 Fracture Mechanics
Fracture mechanics are mainly divided into two kinds where the first kind is Linear Elastic
Fracture Mechanics (LEFM), and the second kind is Elastic-Plastic Fracture Mechanics
(EPFM). In the LEFM an assumption that small deformations and minimal yielding at the crack
tip are made while EPFM accounts for large deformations and plasticity effects. [1]
Studies on fracture mechanics which consider cracked structure can be traced back to Griffith.
In 1921 Griffith did an energy approach to fracture mechanism by analyzing brittle fracture of
glass. Griffith noted that when a stressed plate of an elastic material containing a crack, the
potential energy decreased, and the surface energy increased. Potential energy is related to the
release of stored energy and the work done by the external loads. Surface energy on the other
hand is related to the work needed to increase the surface area. He then stated that if a crack is
introduced to a stressed plate of elastic material, a balance between the increase in surface
energy and the decrease in potential energy must be achieved. In 1957 Irwin extended Griffith’s
work by analyzing fracture of metals. Irwin’s conclusion stated that the required energy to grow
a crack by an area, t(da) also called the elastic energy release rate 𝒢, equals the change in
potential energy, dU divided by the change in crack length, (da) as defined in equation (2.1.1)
below. This is the famous Irwin relationship and is the basis of LEFM. [2]
𝒢 = −𝑑𝑈
𝑑𝑎 (2.1.1)
Irwin treated the stress field by introducing a quantity known as the stress intensity factor, K
and showed that there is a relation between the elastic energy release rate, 𝒢 and the stress
intensity factor, K in the LEFM by using Young’s modulus, E and Poisson’s ratio, v. [3]
This relation is shown in equation (2.1.2).
𝒢 =𝐾2
𝐸 (2.1.2)
Where 𝐸 = {𝐸 𝑓𝑜𝑟 𝑝𝑙𝑎𝑛𝑒 𝑠𝑡𝑟𝑒𝑠𝑠𝐸
1 − 𝑣2𝑓𝑜𝑟 𝑝𝑙𝑎𝑛𝑒 𝑠𝑡𝑟𝑎𝑖𝑛
(2.1.3)
The stress intensity factor, K is a measurement to predict the stress field at a crack tip caused
by an external load or residual stresses and can be seen as the driving force of the crack. A
typical form of the stress intensity factor, K is shown in eq equation (2.1.4).
5
𝐾 = 𝐹𝜎√𝜋𝑎 (2.1.4)
Where F is a geometry factor (dimensionless), 𝜎 is the nominal stress and a is the crack length.
[4]
2.2 Stress analysis of cracks
Although the approaches of Griffith and Irwin so far provided a lot of information regarding
LEFM, there still is considerable uncertainty with respect to calculating the probability of
component fracture. A more informative and flexible approach to the fracture of defected
components can be obtained through a stress analysis based on concepts of elastic theory.
A crack can experience three modes of loading as shown in Figure 2.1.1 Mode I illustrates the
opening mode which occurs when the load is applied perpendicular to the crack plane. Mode I
is usually a result of tensile stresses and is primarily accountable for crack growth. Mode II
illustrates the sliding mode, the load acts as an in-plane shear load where the loading makes one
crack face slide relative to the other. Mode III illustrates tearing mode, Out-of-plane shear
stresses which result in displacements parallel to the crack tip edge. [5]
Subscripts I, II and III are appended to K to differentiate between the modes. In this thesis only
𝐾𝐼 is considered since only Mode-I loading is assumed to occur so 𝐾𝐼 will be written as only K
for the remainder of this thesis.
Figure 2.2.1: The different modes of crack extension. [5]
In 1962 Irwin used modifications of analytical methods described by Westergaard and obtained
solutions for crack-tip stress distributions associated with the three major modes of loading. For
6
the notation illustrated in Figure 2.2.2, he concluded that for a linear elastic material the stresses,
𝜎𝑥 , 𝜎𝑦 and 𝜏𝑥𝑦 in the vicinity of a crack tip are [3, 6]:
𝜎𝑦 =𝐾
√2𝜋𝑟cos
𝜃
2(1 + sin
𝜃
2∙ sin
3𝜃
2)
(2.2.1) 𝜎𝑥 =𝐾
√2𝜋𝑟cos
𝜃
2(1 − sin
𝜃
2∙ sin
3𝜃
2)
𝜏𝑥𝑦 =𝐾
√2𝜋𝑟(sin
𝜃
2∙ cos
𝜃
2∙ sin
3𝜃
2)
Where 𝑟 and 𝜃 represent the polar location ahead of the crack tip as illustrated in Figure 2.2.2
and K is the stress intensity factor of the crack.
Equation (2.2.1) contains a singularity of strength 1/√𝑟 in the stress field. An essential aspect
of equation (2.2.1) is that the stress distribution in the vicinity of any crack tip in a structure is
similar and only depend on distance r, angle 𝜃 and the stress intensity factor K. Where K
depends on the geometry of the cracked component and the modes the loads are applied. This
essential aspect led the way to the establishment of LEFM which postulates, for a fracture to
occur the stress intensity factor, K must reach the value of the fracture toughness of the material
assuming that the fracture toughness is a constant material property.
Figure 2.2.2: Illustrates the distribution of stresses in the vicinity of a crack tip. [5]
Irwin extended the research above which considered a two-dimensional plane problem to a
three-dimensional problem and postulated the state of plane strain and developed the plane
7
strain intensity factor for elliptical cracks under tension. In 1966 Kassir and Sih verified Irwin’s
postulate and showed that the stresses in the vicinity of a crack tip, in other words when 𝑟 → 0,
can be expressed in terms of a local coordinate system that is tangential and perpendicular to
the crack front as illustrated in Figure 2.2.3. [7]
Figure 2.2.3: Shows a coordinate system that is tangential and perpendicular to the crack front. [7]
2.3 𝒥 - integral
To characterize the strain energy release rate for EPFM when accounting for large deformation
Rice suggested using a contour integral around the crack tip a so-called 𝒥 - integral that encloses
the crack front as shown in Figure 2.3.1. The 𝒥 - integral assumes an idealized non-linear elastic
material response. The definition of 𝒥 - integral is shown in equation (2.3.1) below. [ 8, 9]
𝒥 = ∫ (𝑊dy − 𝐓𝜕𝐮
𝜕x𝑑𝑠)
𝐶
(2.3.1)
Where:
- 𝐶 describes the contour surrounding the crack tip,
- W is the strain energy density, 𝑊 = ∫ 𝜎𝑖𝑗𝑑𝜀𝑖𝑗
- 𝑻 is the stress vector that acts on the contour.
- 𝒖 is the displacement vector in the x-direction.
- ds is the increment along the contour Γ.
- x and y are cartesian coordinates as illustrated in Figure 2.3.1
8
For elastic materials, the 𝒥 - integral is path independent, i.e., 𝒥𝑐 = 𝒥c′ (see Figure 2.3.1). This
enables the 𝒥 - integral to be determined from the stress and strain distribution on some arbitrary
contour away from a crack tip instead of at the crack tip.
Figure 2.3.1: Illustrates the line contour surrounding the crack tip. [8]
The 𝒥 - integral in equation (2.3.1) is a line of surface integral defined around a contour C. It
describes the stress-strain field around the vicinity of a crack front and therefore, it must be an
energy-related quantity. Rice stated that the 𝒥 - integral along a counter surrounding the crack
tip is the change in potential energy, dU divided by the change in crack area, da. The equation
developed by Rice has the following form: [8]
𝒥 = −dU
da (2.3.2)
This means that for a linear elastic material the 𝒥 - integral is actually the energy release rate,
𝒢 and likewise, has the relationship with the stress intensity factor as following:
𝒥 =K2
𝐸(𝑝𝑙𝑎𝑛𝑒 𝑠𝑡𝑟𝑒𝑠𝑠)
𝒥 =K2
𝐸(1 − 𝑣2) (𝑝𝑙𝑎𝑛𝑒 𝑠𝑡𝑟𝑎𝑖𝑛)
(2.3.3)
By calculating the 𝒥 - integral and rearranging equation (2.3.3) it is easy to obtain the stress
intensity factor, K.
Another relation between the 𝒥 - integral and stress intensity factor, K was established by Shih
and Asaro for isotropic materials using LEFM. [10]
The relation they established is shown in equation (2.3.3).
𝒥 = 𝒢 =1
𝐸(𝐾𝐼
2 + 𝐾𝐼𝐼2) +
1
2𝐺𝐾𝐼𝐼𝐼
2 (2.3.4)
Where 𝐸 is calculated with the help of equation (2.1.3) and G is the shear modulus.
9
It is usually assumed that when the stress intensity factor, K reaches the critical stress intensity
factor, 𝐾𝑐 fracture occurs. 𝐾𝑐 depends on material properties and the geometry of the specimen.
𝐾𝑐 is not like other material properties such as elastic modulus, 𝐾𝑐 is not a constant property
instead it changes with the thickness of the structure. If the specimen is large enough so that
plane strain exists 𝐾𝑐 will converge to a minimum value called fracture toughness or the plane
strain critical stress intensity factor. This critical value model can be extended to the critical
energy release rate, 𝒢c and 𝒥c.
2.4 Fatigue Crack Growth Model
2.4.1 Paris Growth Model
Another reason for crack growth besides static loading is when a subcritical load is cyclically
applied. Even though many fatigue crack growth laws have been written, such as those
summarized by Hoeppner and Krupp (1974), it is widely known that the framework proposed
by Paris and Erdogan (1963) on fatigue fracture mechanics is a major breakthrough. [11]
Paris and Erdogan theorized that there is a relation between the crack growth rate 𝑑𝑎/𝑑𝑁 and
the stress intensity range, ∆𝐾 = 𝐾𝑚𝑎𝑥 − 𝐾𝑚𝑖𝑛 where 𝑑𝑎/𝑑𝑁 is the increased length of the crack
as a function of the number of load cycles.
A general crack growth curve is illustrated in Figure 2.4.1 where it can be observed the
experimental relation between the crack growth rate and the stress intensity factor. The crack
growth curve is divided into three regions.
Figure 2.4.1: Illustrates a typical crack growth curve on a logarithmic scale. [5]
10
The first region is the threshold region in which the crack growth is slow and ∆𝐾 approaches
the threshold value, 𝐾𝑡ℎ that indicates the crack growth cannot occur. This is because the crack
growth in the first region is dependent on the material microstructure where the cracks
propagate within the grain size and are probably stopped by the grain boundaries, inclusions,
or other reasons. The second region is the Paris region in which the slope of the crack growth
curve is approximately linear. Lastly, the unstable region where 𝐾𝑚𝑎𝑥 approaches 𝐾𝑐 resulting
in rapid unstable crack growth and fracture is imminent.
Several crack growths models have been established to define the relation between 𝑑𝑎/𝑑𝑁 and
∆𝐾 within these regions. In this thesis, the model of Paris and Erdogan will be presented.
By approximating the intermediate crack growth region (Paris region) with a power-law
relationship Paris and Erdogan could establish equation (2.4.1) which is known today by the
Paris equation.
𝑑𝑎
𝑑𝑁= 𝐶(∆𝐾)𝑚 (2.4.1)
Where C and m are material constants that are empirically determined. One disadvantage of the
Paris equation is that it applies only to one stress ratio, 𝑅 = 𝜎𝑚𝑖𝑛 𝜎𝑚𝑎𝑥⁄ , in which the maximum
and minimum stresses are defined far away from the crack tip. The stress ratio is the numerical
ratio of two specified stress values in a single stress cycle.
2.4.2 Walker’s Growth Model
In 1970 Walker [12] analyzed the impact of the R-ratio in relation to crack propagation for
aluminium alloys as a wish to improve the Paris model. He noted that by increasing the R-ratio
the growth rate will increase, which led him to extend the Paris equation and develop a new
equation addressing the R-ratio effects. Walker’s equation is given by the following
relationship:
𝑑𝑎
𝑑𝑁=
𝐶0
(1 − 𝑅)𝑚(1−𝛾)(∆𝐾)𝑚 (2.4.2)
Where 𝐶0 and m are like the material constants in Paris equation (2.4.1). 𝛾 is also a material
constant that is empirically determined by obtaining data from several R-ratios, linear
regression or trial and error. From equation (2.4.2) it is easy to observe that if 𝛾 = 1 then the
R-ratio has no effect on the data and that the resulting equation is the same as the Paris equation
(2.4.1). The stress ratio, R is normally defined as minimum stress divided by maximum stress,
11
which leads to values between −∞ and 1. If 𝑅 = −1 then the stresses are fully reversed. When
the stresses are partially reversed then the R-ratio becomes a negative value less than 1. The R-
ratio equals zero when the stress is cycled between a maximum stress and no stress (𝜎 = 0).
The R-ratio becomes a positive value less than 1 if the stress is between two tensile stresses and
lastly 𝑅 = 1 indicates that there is no variation in stress resulting in a sustained-load creep test
instead of a fatigue test.
12
3. Methods
Usually, fatigue analysis starts with an initial crack size or else a crack initiation criterion
based on stress or strain. A crack is assumed to continue to propagate until a critical value is
obtained such as 𝐾𝐶 or 𝒥𝑐 . crack growth rates can be calculated with various crack growth
models. In this thesis three methods will be presented namely an experimental analysis, Paris
crack growth model and Walker’s crack growth model.
3.1 Experimental analysis
Within the research group Materials Engineering at Karlstad University, a research project is
ongoing in which the resistance to crack initiation and crack growth in high-strength steels is
studied. One of the test setups for fatigue testing is in a servo-hydraulic tensile testing machine,
where the initiation and growth of a short crack in a designated cylindrical test rod are studied.
The crack is initiated with a hardness indent in the middle of the notch, and the growth of the
crack is measured by a camera directed towards the crack of the rod. Pictures of the length of
the crack are taken during the fatigue process, see Figure 3.1.1 below.
Figure 3.1.1: Illustrates the test setup where a) specimen geometry, b) measurement of crack length with a camera system, c)
crack growth from hardness impression on the bottom of the crack, d) assumed crack geometry where, 𝑎𝑖 is the crack depth
and 𝑐𝑖 is half of the crack length in the horizontal direction that goes along the surface.
13
The crack growth i.e., the length of the crack as a function of the number of load cycles, can
then be plotted in a diagram, see Figure 4.1.2 in the results chapter. When the load on the test
specimen is known, the crack growth rate, 𝑑𝑎/𝑑𝑁, can also be plotted against the stress
intensity, range ∆𝐾, at the crack tip. By adapting to the curve, an equation can also be estimated
that describes the crack growth rate, according to Paris' law.
3.1.1 Material
The test rod used in the experimental research is made of steel. This kind of steel has high
strength and is most often used in structures that are exposed to high stresses. Steel is a well-
known and broadly used material, especially when considering engineering, construction, and
automobile industries. In addition to its high strength, it has also other favoured properties such
as ductility and recyclability. In Table 3.1.1.1 the material properties of the steel used are tabled.
Table 3.1.1.1: The material properties of the specimen
Property Value
Young’s Modulus, E [GPa] 210
Poisson’s ratio, v [unit less] 0.3
The rod has a total length of 200 mm and a circular cross-section with diameters 16 mm in the
head and 10 mm in the waist section as shown in Figure 3.1.1 a).
3.1.2 Load and boundary conditions
The experimental analysis was performed with the help of a servo-hydraulic tensile testing
machine that is constructed with pneumatic side-action grips, as demonstrated in Figure 3.1.1,
b). The machine is constructed in such a way that its lower grip can only move vertically which
make it possible to apply tension, and the upper grip is locked in all directions. One should note
that the gripping force is very important in such tests as it can damage the gripped part and lead
to premature or delayed failures.
When it comes to the load conditions the test rod was subjected to a tension load by enforcing
displacement of the lower grip. The machine setup allows for the loads to be either between
maximum and minimum tensile stresses or between maximum compressive stress and
maximum tensile stress. The choice between which setup you choose is made with the help of
the R-ratio which can easily be set in the servo-hydraulic tensile testing machine. Table 3.1.2.1
shows the inputs used in the testing machine during the uniaxial test.
14
Table 3.1.2.1: Inputs used in the servo-hydraulic universal testing machine
Parameter Value
Frequency [Hz] 10
R-value [no unit] 0,1
Nominal stress amplitude on waist diameter 10mm [MPa] 220
Initial indent, (Vickers indent) [mm] 0.451
3.2 Finite element method
To numerically estimate the crack growth rate, an analysis was performed in the finite element
method, by using the program suite called ABAQUS. Even though the finite element method
can be traced back to 1851 and have been widely used in dealing with many problems such as
stress and strain analysis, heat transfer, electrical and magnetic fields, and fluid flow.
One of the first applications of the finite element method for analyzing fracture was developed
in 1960 by Watwood for a center cracked plate [13]. In 1971 Anderson, Garros, and Ruggles
analyzed fracture of a solid propellant rocket motor cartridge [14]. In 1970 Chan, Tuba, and
Wilson applied the finite element method to analyze compact and rotating test specimens [15].
Due to the stress singularity at the crack tip, all researchers reported that performing a FEM
analysis on fracture problems is impossible for linear elastic elements.
Consecutively, to represent the behaviour of the crack tip, energy release rate and counter
integral for J and K was analyzed. Byskov (1970) suggested the use of triangular crack tip
elements to solve the stress singularity issue [16]. Wilson (1973) suggested the use of circular
elements and Hardy (1974) developed rectangular elements to describe the crack tip. These
three different elements are described as specialized crack tip elements. [17, 18]
Instead of using the specialized elements Henshell and Shaw (1975) suggested using quadratic
elements. Their method is known as finite element with quarter points (FEQP). Usually around
the crack tip is a concentric meshing scheme as illustrated in Figure 3.2.1. [19]
Figure 3.2.1: Illustrates meshing scheme around the crack tip where the yellow half-circle represents the crack front.
15
The famous software suite for finite element analysis called ABAQUS was used to determine
the values of the stress intensity factor K, and the J-integral for a specific specimen geometry
using the quarter points meshing elements.
In general, the finite element process proceeds as follows:
1. Create and mesh a finite element model containing the crack in the geometry.
2. Apply load conditions.
3. define ∆𝐾, ∆𝒢 or ∆𝒥.
4. Define the crack extension direction.
5. Define the critical crack growth length or fracture toughness.
6. Based on a fatigue crack model define the cycles required to grow the crack this critical
length.
7. Add cycles to the preceding cycle count.
8. Repeat steps 1 to 7 until the critical value is achieved.
3.2.1 Python script in ABAQUS
ABAQUS is a commercial software package for finite element analysis and computer-aided
engineering, originally released in 1978. ABAQUS has a built-in Scripting Interface which is
an extension of the Python language and uses the syntax required by Python. There are
ABAQUS user guides manuals available for every ABAQUS version release where techniques
for combining Python statements and ABAQUS Scripting Interface commands are introduced,
and numerous examples are provided along with how to use the commands to interact
with ABAQUS. Python scripts are powerful and useful tools that accomplish tasks in ABAQUS
that would be time-consuming or practically impossible in the GUI ABAQUS/CAE
Environment. By using a script, it is easy to automate a repetitive task, vary parameters of a
simulation as part of an optimization study, extract information from large output databases,
and can even create user interfaces that customize the look and design of GUI ABAQUS/CAE.
In this thesis, the python script will perform the finite element process described earlier
followed by calculation of the crack growth rate with respect to Paris and Erdogan’s model and
Walkers extended model.
3.2.2 Build the geometry including the crack.
ABAQUS offers different ways to model a structure in this case a cylindrical rod and a crack.
Both the rod and the crack will be modelled as 3D deformable parts where the geometry of the
rod is determined by the dimensions of the cylindrical rod used in the experimental analysis.
16
However, the crack is modeled as a flat elliptical crack and the mesh around the crack tip was
modeled as an elliptical tube, as the crack grows its shape can be varied and become more
elliptical like the assumed crack geometry in the experimental analysis (Figure 3.1.1, d)).
The generated model was created with quarter symmetry to reduce computational time, the
number of elements and the number of nodes. The model created in ABAQUS including the
crack is illustrated in Figure 3.2.2.1 and Figure 3.2.2.2 respectively. The python script
associated with the model is found in Appendix A under the “Build Specimen and Crack”
section.
a) b)
Figure 3.2.2.1: a) Illustrates the geometry of the structure including the crack indent, b) Zoomed view of the crack indent in
the structure with the partitions.
To be able to efficiently and easy mesh the crack and the crack indent with a similar amount of
mesh elements both parts can be partitioned in the “Parts” section in ABAQUS. There are
different ways to partition a part in ABAQUS where in this case all partitions were made with
the partition face and partition cell tools. The python script associated with the partitions can
be found in Appendix under the “Create partition for crack tip region and define edge for crack
front”.
a)
b)
Figure 3.2.2.2:a) and b) Illustrates the mesh geometry around the crackfront with partitions where the red illustrates the crack
front.
3.2.3 Assemble and define crack.
With the assembly functionality in ABAQUS, it is easy to place the created crack geometry in
the desired location. The crack must be defined for ABAQUS to comprehend it is a crack.
17
Cracks can be defined in the interaction functionality through special → crack → create. There
are three ways to define cracks in ABAQUS, these are contour integral, XFEM and debound
using VCCT. This thesis only considers the contour integral to determine the stress intensity
factor. There are many models available to approximate the crack extension direction usually
based on stress, strain, energy, or any combination of these where suitable models should be
chosen based on loading and material conditions. In ABAQUS the user must specify the crack
extension direction at each crack-tip node-set by specifying the direction as either normal to the
crack plane or the crack extension direction, q (the q vector).
The assembly is shown in Figure 3.2.3.1 and the crack definition settings established is
illustrated in Figure 3.2.3.2 and Figure 3.2.3.3. The python script associated with them is found
in Appendix A under the “Assembly” and “define crack” sections.
a) b)
Figure 3.2.3.1: a) Illustrates the location of the mesh geometry around the crackfront and how small it is relative to the rest of
the structure, b) Zoomed view of the mesh geometry around the crackfront..
When executing the previous python script that is compatible with ABAQUS version XX into
a newer version of ABAQUS such as version 2020 an error occurs that says that the crack
propagation direction is path independent. This error message has been self-coded to alert if the
crack propagation is not reasonable. To ensure that the crack propagation is properly configured
18
in each simulation, an additional code has been written which can be found in Appendix A
under the section “addition to ensure crack extension direction is set correctly”.
Figure 3.2.3.2: Shows the settings used to define the crack and the crack extension direction.
In ABAQUS, a user must apply a constraint of type tie to obtain a surface-based Contact
Definition. Master and slave surfaces must be defined for the contact of the pair. In general,
what distinguishes the master surface from the slave surface are:
• The master surface cannot be breached by the nodes of the slave surface.
• The master surface must always be the analytically rigid surface.
Figure 3.2.3.3: This Shows the crack constrains configuration, where the master surface is the interacting surface of the crack,
and the slave surface is the interacting surface of the structure.
The tie constraint can be found in the Appendix under “Connect regions with tied contact
constraint” section.
19
3.2.4 Define the step and history output.
This part is crucial and tells ABAQUS which type of simulation is carried out and what kind of
information is requested. A step with alternative, static general, was created with a time period
equaling to 1 so that all the static load is applied instantly. History output for the crack growth
simulation was established to obtain the simulated stress intensity factor and J-integral. The
step and history output settings are illustrated in Figure 3.2.3.1 and Figure 3.2.3.2 respectively.
The python script associated with them is found in Appendix A under the “define loading step”
and “define History Output” sections.
Figure 3.2.4.1: This shows the settings used in the created step.
Figure 3.2.4.2: Shows the settings used in the created history output request.
20
3.2.5 Apply load and boundary conditions.
The load and boundary conditions were specified after completing the assembly and step parts in
ABAQUS. Figure 3.2.5.1 shows the loading and boundary conditions where the load is applied at
the top and the bottom is locked to move in all degrees of freedom. Since the model was created
with a quarter symmetry, boundary conditions had to be set to tell ABAQUS how the whole model
is shaped. The boundary condition, in this case, were symmetry and encastered conditions where
the symmetry was set in the y- and z- directions and the encastered boundary condition at the
bottom. The loading and boundary conditions are set in such a way that they result in a tensile test
configuration similar to that performed by the experimental analysis. The magnitude of the load is
determined by the experimental analysis but since the experimental analysis grips the test rod
leading to a tension force that is registered in Newtons, a calculation must be made to determine the
corresponding stress. Since the maximum force is assumed to be constant in each cycle and the
diameter of the cylindrical rod is known, it becomes very easy to determine the stress with Pascal's
pressure law. Pascal's pressure law states that the pressure, P is equal to the force, F divided by the
cross-section area, A as shown in equation (3.2. 5.1).
𝑃 =𝐹
𝐴 (3.2.5.1)
Figure 3.2.5.1: Illustrates the loading and boundary conditions.
21
The python script associated with the load and boundary conditions can be found in Appendix
A under the “define loading condition” and “apply boundary conditions”. The evaluation of the
pressure can be found at the beginning of the python scripted presented in Appendix A.
3.2.6 Mesh
As discussed earlier there are many types of mesh elements. In this thesis, the crack will have
the element shape defined by ABAQUS as wedge with a quadratic geometric order defined as
C3D15. The rest of the structure will have elements defined as Tet and also with geometric
order C3D15. The meshes are illustrated in Figure 3.2.6.1 and Figure 3.2.6.2. The python script
associated with them is presented in Appendix A under the “mesh” section.
Figure 3.2.6.1: The mesh used on the structure is shown.
For the part containing the whole structure with the crack indent, the global mesh size was set
to 15, in the crack indent and the surrounding area the mesh size was controlled by seeding the
partition edges created earlier by a fixed number to provide a specific number of mesh elements
similar to the number of mesh elements of the part containing only the crack see Figure 3.2.6.2
below. The crack part was also meshed by seeding the edges that were partitioned earlier where
the approximated element size was set to 0.0025.
Figure 3.2.6.2: The mesh used on the crack is shown.
22
4. Results
In this chapter all produced results are presented, including the results from the experimental analysis as well as
the results from the FEM simulation.
4.1 Experimental
This section presents the results of the experimental analysis. The analysis was performed with
a servo-hydraulic tensile testing machine under uniaxial constant loading conditions and room
temperature to determine the fatigue properties of the material. As mentioned in previous
chapters, before the fatigue test, the test specimen was subjected to a Microhardness Vickers
indent in the middle of the notch. The indent resembles a crack with a crack length of 0.45 mm.
The fatigue crack growth rate was examined for a specimen that was made of steel with a stress
ratio equaling 0.1. The fatigue loads were only applied in the vertical direction. The crack path is
collinear with the Vickers indent edges that point perpendicular to the load direction. In other words
the crack grows straight along the horizontal direction if the load is applied in the vertical direction
as illustrated in Figure 4.1.1 below.
Figure 4.1.1: Shows the Vickers indent and the crack path along with the load direction.
The test specimen took 51547 cycles to fracture. To tabulate the results of all these cycles would
be long and unpleasant instead a fraction of the results is tabulated in Table 4.1.2 below.
Table 4.1.1: Results from experimental analysis
Load cycles Center interior crack length, a [mm] Surface crack length, c [mm]
33600 0.25992 0.342
36000 0.29526 0.3885
36600 0.31008 0.408
37200 0.33174 0.4365
23
39000 0.36062 0.4745
39600 0.389 0.5125
40200 0.40318 0.5305
42000 0.52364 0.689
42600 0.5491 0.7225
43200 0.55518 0.7305
44400 0.684 0.9
45000 0.85842 1.1295
45600 0.94848 1.248
46200 1.01346 1.3335
47400 1.36078 1.7905
The crack length has been measured at almost regular intervals using a camera. Then a plot of the
crack length growth against the number of load cycles to get an understanding of how the crack
propagates with respect to the number of cycles. Figure 4.1.2 shows how the surface crack length
(𝑐𝑖) grows during cyclic load.
Figure 4.1.2: Shows the surface crack length vs the number of load cycles.
A nominal stress amplitude on a waist of diameter 10 mm gives a force of about 17300 N. By
modelling the specimen with the specific crack lengths registered in the experimental analysis
in ABAQUS, the stress intensity range can be determined for the specific crack lengths. The
stress intensity range for each crack length is listed in Table 4.1.3, where the greatest stress
intensity at the interior crack front position is listed.
0
0,5
1
1,5
2
0 10000 20000 30000 40000 50000Surf
ace
crac
k le
ngt
h c
, [m
m]
Number of load cycles
The surface crack length in relation to number of loads
24
Table 4.1.2 The stress intensity range for the experimental results
Center interior crack length. a
[mm]
Surface crack length. c
[mm]
Stress intensity range.
∆𝐊 [𝑴𝑷𝒂√𝒎]
0.25992 0.342 16.61938267
0.29526 0.3885 17.65650513
0.31008 0.408 18.05380872
0.33174 0.4365 18.59018575
0.36062 0.4745 18.88396837
0.389 0.5125 20.02910701
0.40318 0.5305 20.19766081
0.52364 0.689 22.85236048
0.5491 0.7225 23.31801089
0.55518 0.7305 23.44182494
0.684 0.9 25.71825568
0.85842 1.1295 28.71450025
0.94848 1.248 30.39376542
1.01346 1.3335 31.27579074
1.36078 1.7905 37.10987649
The crack growth rate, da/dN can then be plotted in relation to the stress intensity range, ∆K in
a logarithmic scale to determine the coefficients of the Paris equation. Figure 4.1.3 shows the
crack growth rate vs the stress intensity range in a logarithmic scale diagram.
Figure 4.1.3: The crack growth rate vs stress intensity range
y = 4E-13x3,8309
1E-11
1E-10
1E-09
1E-08
1 10 100
Cra
ck g
row
th r
ate,
[m
/cyc
le]
Stress intensity range, ∆K [MPa√m]
Crack growth rate in relation to stress intensity range
25
From the best-fitted equation to the data in Figure 4.1.3 above the coefficient for the Paris
equation can be obtained. The coefficients obtained are given in Table 4.1.4 and these
coefficients will be used further in the numerical analysis.
Table 4.1.3: Coefficients of Paris equation
Coefficient Value
C [𝑚 (𝑐𝑦𝑐𝑙𝑒 ∙ 𝑀𝑃𝑎√𝑚)⁄ ] 4 ∙ 10−13
m [no unit] 3.83
4.2 Finite element method
This subchapter presents the results of the numerical analysis. It consists of results from two
crack growth calculations where the first is with respect to the Paris equation and the second
is with respect to the Walker equation.
4.2.1 Paris Crack Growth Model
This section presents the results of the crack growth calculation that deals with the Paris
equation. The number of cycles is started from 33600 to achieve good results from this
numerical analysis to compare with the experimental analysis and, at the same time execute an
efficient python script. This gave an initial interior crack length of 0.25992 mm and a surface
crack length of 0.342 mm (see Figure 3.1.1 d). These crack geometry parameters resemble the
same initial crack lengths achieved in the experimental analysis. Table 4.2.1.1 shows important
parameters used in the numerical analysis.
Table 4.2.1.1:Parameters used in the crack growth calculation with respect to Paris equation.
Parameter Value
Nominal stress amplitude on waist diameter 10mm, [MPa] 220
Initial interior crack length, 𝑎0 [mm] 0.25992
Initial surface crack length, 𝑐0 [mm] 0.342
C [𝑚 (𝑐𝑦𝑐𝑙𝑒 ∙ 𝑀𝑃𝑎√𝑚)⁄ ] 4 ∙ 10−13
m [no unit] 3.83
26
In Table 4.2.1.2 the results from the numerical analysis dealing with the Paris equation are
listed.
Table 4.2.1.2: Results from numerical analysis with respect to Paris equation
𝑪𝒚𝒄𝒍𝒆𝒔
[𝐍]
∆𝑲
[𝐌𝐏𝐚√𝐦]
𝑪𝒓𝒂𝒄𝒌 𝒈𝒓𝒐𝒘𝒕𝒉 𝒓𝒂𝒕𝒆
[𝐝𝐚 𝐝𝐍⁄ ]
𝒂. 𝒄𝒓𝒂𝒄𝒌 𝒍𝒆𝒏𝒈𝒕𝒉
[𝐦𝐦]
𝒄. 𝒄𝒓𝒂𝒄𝒌 𝒍𝒆𝒏𝒈𝒕𝒉
[𝐦𝐦]
33600 16,619 1,68333E-08 0,25992 0,342
36000 17,776 1,98333E-08 0,2974 0,3824
36600 18,061 2,08333E-08 0,3078 0,3943
37200 18,307 2,33333E-08 0,3186 0,4068
39000 19,216 2,65E-08 0,3541 0,4488
39600 19,172 2,38333E-08 0,3671 0,4647
40200 19,81 3,16667E-08 0,3795 0,479
42000 20,822 3,56667E-08 0,424 0,536
42600 21,219 3,83333E-08 0,4404 0,5574
43200 21,536 4,11667E-08 0,4576 0,5804
44400 22,298 4,61667E-08 0,494 0,6298
45000 22,693 4,91667E-08 0,5143 0,6575
The crack propagation with respect to the number of load cycles can then be plotted. Figure 4.2.1.1
shows the corresponding surface crack growth during cyclic load.
27
Figure 4.2.1.1: Shows the surface crack length, 𝑐𝑖 vs number of loads cycles (Paris).
Finally, Figure 4.2.1.2 shows the crack growth rate da/dN in relation to the intensity range, ∆K
on a logarithmic scale.
Figure 4.2.1.2: The crack growth rate vs stress intensity range (Paris).
0
0,1
0,2
0,3
0,4
0,5
0,6
0,7
0,8
0 5000 10000 15000 20000 25000 30000 35000 40000 45000 50000
Cra
ck le
ngt
h [
mm
]
Load cycles
The surface crack length in relation to number of loads
y = 7E-13x3,5951
1,00E-09
1,00E-08
1,00E-07
1,00E-06
1 10 100
Cra
ck g
row
th r
ate,
[m
/cyc
le]
Stress intensity range, ∆K [MPa√m]
Crack growth rate in relation to stress intensity range
28
4.2.2 Walker Crack Growth Model
For the numerical analysis dealing with Walker’s equation the procedure for determining the
coefficients is as follows:
1. Determine m,
Since the coefficients, C and m are the Paris coefficients, by taking the mean value of
all the m values corresponding to various R-ratios.
2. Define 𝐶0 and 𝛾,
The Walker equation assumes that the coefficient m is constant and is applied for all R-
ratios. When the crack growth rate da/dN in relation to the intensity range, ∆K is plotted
for different R ratios in a logarithmic scale diagram straight lines are obtained where
only 2 lines are enough to determine the 𝐶0 and 𝛾 Coefficients. By defining C for two
different data set, two values will be obtained that will obey this equation.
C =C0
(1 − R)m(1−γ)
By solving the equation system containing two equations and two unknowns the
coefficients for Walker’s equation can be determined.
In this experiment, only tests with an R-value equal to 0.1 were performed, which made it
possible to determine the coefficients C and m for the Paris equation. Since Walker's equation
is only an improvement of the Paris equation and can be seen as the Paris equation with an extra
multiplicand, it can be assumed that C0 = C and that the m value also is the same for both cases.
Coefficient γ is usually obtained by two different results of two different R-values as described
before. γ is a constant that depends on the material and indicates how the R-value influence the
crack growth rate. Dowling stated that most metals have a typical γ-value of about 0.5, but the
γ-value can differ anywhere from around 0.3 to roughly 1.0. [20]
In this numerical analysis concerning Walker’s equation, the coefficient 𝛾 was set to 0.5 as
Dowling suggested for most metals. Table 4.2.2.1 shows important parameters used in this
numerical analysis.
Table 4.2.2.1: Parameters used in the crack growth calculation with respect to Walker’s equation
Parameter Value
Nominal stress amplitude on waist diameter 10mm, [MPa] 220
Initial interior crack length, 𝑎0 [mm] 0.25992
Initial surface crack length, 𝑐0 [mm] 0.342
C [𝑚 (𝑐𝑦𝑐𝑙𝑒 ∙ 𝑀𝑃𝑎√𝑚)⁄ ] 4 ∙ 10−13
29
m [no unit] 3.83
R-value [no unit] 0.1
𝛾 0.5
In Table 4.2.2.2 the results from the numerical analysis dealing with Walker’s equation are
listed.
Table 4.2.2.2: Results from numerical analysis with respect to Walker’s equation
𝑪𝒚𝒄𝒍𝒆𝒔
[𝐍]
∆𝑲
[𝐌𝐏𝐚√𝐦]
𝑪𝒓𝒂𝒄𝒌 𝒈𝒓𝒐𝒘𝒕𝒉 𝒓𝒂𝒕𝒆
[𝐝𝐚 𝐝𝐍⁄ ]
𝒂. 𝒄𝒓𝒂𝒄𝒌 𝒍𝒆𝒏𝒈𝒕𝒉
[𝐦𝐦]
𝒄. 𝒄𝒓𝒂𝒄𝒌 𝒍𝒆𝒏𝒈𝒕𝒉
[𝐦𝐦]
33600 16,619 2,10417E-08 0,25992 0,342
36000 17,986 2,51667E-08 0,3063 0,3925
36600 18,302 2,71667E-08 0,3194 0,4076
37200 18,681 3,05E-08 0,3334 0,4239
39000 19,688 3,53333E-08 0,3783 0,4788
39600 20,191 0,000000039 0,3954 0,5
40200 20,576 4,52222E-08 0,4136 0,5234
42000 21,926 5,3E-08 0,4758 0,6048
42600 22,367 5,7E-08 0,4993 0,6366
43200 22,795 6,40833E-08 0,5243 0,6708
44400 23,942 7,33333E-08 0,5796 0,7477
45000 24,432 0,000000079 0,6102 0,7917
Figure 4.2.2.1 shows the surface crack growth during cyclic load with respect to the Walkers model.
30
Figure 4.2.2.1: Shows the surface crack length vs the number of loads cycles (Walker).
Figure 4.2.2.2 shows the crack growth rate, da/dN in relation to the stress intensity range, ∆K on a
logarithmic scale.
Figure 4.2.2.2: The crack growth rate vs stress intensity range (Walker).
4.2.3 Comparison
In this section, two comparisons are made, where the first is with respect to the surface crack
length (c) under cyclic load and the second comparison is with respect to the relationship
between the crack growth rate and the stress intensity range for all analysis. In Figures 4.2.3.1
0
0,1
0,2
0,3
0,4
0,5
0,6
0,7
0,8
0,9
0 5000 10000 15000 20000 25000 30000 35000 40000 45000 50000
Cra
ck le
ngt
h [
mm
]
Load cycles
The surface crack length in relation to number of loads
y = 8E-13x3,5877
1,00E-09
1,00E-08
1,00E-07
1,00E-06
1 10 100
Cra
ck g
row
th r
ate,
[m
/cyc
le]
Stress intensity range, ∆K [MPa√m]
Crack growth rate in relation to stress intensity range
31
and 4.2.3.2, the results of all analyzes performed are compared and show how much they differ
in relation to each other.
Figure 4.2.3.1: Comparison between all analyzes for the surface crack length, 𝑐𝑖 vs load cycles.
From Figure 4.2.3.1 above it can be observed that the results are very close at the beginning but
deviate further and further as more cycles are applied. How much they deviate is shown in
Figure 4.2.3.2 below.
Figure 4.2.3.2: The deviation in the interior crack length for Paris equation and Walker’s equation relative experimental
results
It is obvious that the Paris equation deviates more as the number of cycles increase.
Figure 4.2.3.2 below shows the comparison between the results of the relation between the
crack growth rate and the stress intensity range.
0
0,2
0,4
0,6
0,8
1
1,2
1,4
0 10000 20000 30000 40000 50000
Cra
ck le
ngt
h [
mm
]
Load cycles
The surface crack length in relation to number of loads
Experiment length c
Paris length c
Walker length c
0
0,2
0,4
0,6
0,8
1
1,2
1,4
1,6
1,8
2
30000 35000 40000 45000 50000
Dev
iati
on
[m
m]
Cycles
The deviation in the surface crack length in relation to the experimental analysis
Experimental Analysis
Paris Model
Walker's Model
32
Figure 4.2.3.3: Comparison between all analyzes for crack growth rate vs stress intensity range.
From Figure 4.2.3.2 above, it can be observed that Paris and Walker are very close to each
other, but that Walker has an addition by including the R-ratio that makes it have a higher crack
growth rate. Both numerical methods give close results compared to the experimental analysis
in the beginning, but the more cycles are applied the more deviation occurs like the comparison
above with the surface crack length growth.
1,0E-09
1,0E-08
1,0E-07
1,0E-06
1 10 100
Cra
ck g
row
th r
ate,
[m
/cyc
le]
Stress intensity range, ∆K [MPa√m]
Crack growth rate in relation to stress intensity range
Experiment
Paris
Walker
33
5. Discussion
When it comes to cost or energy consumption the experimental analysis cost much more since
the experimental analysis requires, material. If the material does not have the right geometry, it
must be melted and reshaped. On top of that, a servo-hydra tensile testing machine is expensive
and it operates in much longer time intervals. But without the experimental data, the simulations
have no ground to stand on and are meaningless. Usually, a series of fatigue tests are made on
a material with the same geometry to obtain the fatigue strength. Fatigue strength is the highest
stress that a material can resist for a given number of cycles without fracture. If the fatigue
strength is well defined for several materials, then more accurate laws and approximations can
be developed which will make it easier and cheaper to analyze fatigue problems.
Fatigue is a very interesting topic that has an influencing factor in a lot of applications. It is
therefore understandable that much research has been spent on this topic. This thesis aims to
create a better understanding of the concept of fatigue and to try to numerically define the crack
growth rate during fatigue. The Paris model is one of the first models to describe fatigue and
crack growth rate. It is clear from all the Figures in the comparison section that the Paris model
gives quite good results in the Paris region but, something is missing in the model that causes
margins of error in relation to the experimental analysis. If one disregards certain measured
values in the experimental analysis, one can see in Figure 4.2.3.2 that all methods have
approximately the same slope, which is linear. The R-ratio has a clear influence on the result
and Walker is on the right track when he introduces it to improve the Paris model. Since
Walker's suggested equation is an improvement of the Paris equation and with R = 0 or γ = 1,
Walker's equation reduces to the Paris equation, it is understandable and expected that it has a
similar linear increase.
Walker's coefficient 𝐶0 is not the same as the Paris coefficient C, but since only one
experimental test with one R-ratio setting was performed, Walker's coefficients 𝐶0 and 𝛾 could
not be determined numerically. After discussion with the examiner and supervisor, Walkers
coefficient 𝐶0 was chosen to be approximated as the Paris coefficient C. this may have affected
the result in the negative direction and the Walker model may have given better results with
better coefficients. Since Dowling stated that most metals have a typical 𝛾-value of about 0.5,
𝛾 was chosen to be 0.5. Both 𝐶0 and 𝛾 were not determined numerically as C and m in the Paris
equation, which has a clear effect on the result as both Walker and Paris equations are sensitive
in relation to their coefficients. Better coefficients yield better results.
34
From the result, it can be concluded that both Paris and Walker's models are good but lack
something that creates margins of error. In 1967 Forman suggested a new theory to improve
the Paris and Walker model, which took to account that when the stress intensity factor
approaches the critical value there will be instability in the crack growth. [21]
In addition to Forman, there are also other researchers that tried to develop Paris and Walker's
models.
The result was good in the beginning but start to deviate a lot towards the end. Reasons, why
the result deviates, can be:
• The crack is measured incorrectly during certain cycles in the experimental analysis,
When it comes to small lengths, it is easy to take the wrong measurements, which results in
a different result. This is especially important during fatigue as the consequences are
difficult to catch up with. One should also note that in real life a crack usually doesn’t grow
in a straight line rather more small zigzags as illustrated in Figure 4.1.1.
• Machine errors,
It is assumed that a machine will perform the same process in all cycles. Small margin errors
in position or creep on the sample may give different results.
• Error measuring values,
The coefficients that are produced are very dependent on the result being completely
correct. A different set of values will give different coefficients.
• The R-ratio
The influence of mean stress, i.e. the R-value, is strong and the crack growth models used
were not able to properly catch the effect of the R-value.
35
6. Conclusion
It is no wonder why Paris law is still taught in schools today. The results showed that as long
as the crack length is lower than 0.5 mm, the result of the numerical methods was very close to
the experimentally achieved ones. This makes it also understandable why Walker and more
scientists tried to improve the Paris equation. If the test sample was within region two, the Paris
region of the crack growth chart suggested by Paris (see Figure 2.4.1) good results were
achieved. On a logarithmic scale, the Paris equation becomes linear and the crack growth rate
is linearly dependent on the stress intensity range. Paris and Walkers suggested equations
started to deviate a lot once the crack length was longer than 0.5 mm and they are also very
sensitive in respect to their coefficients.
After carrying out all the analyzes, it can be concluded that:
• Both Paris and Walkers suggested equations are good approximations for the steel specimen
with crack length less than 0.5 mm.
• The crack growth path for all methods was collinear and perpendicular to the direction of
the applied load.
• By implementing the stress ratio, Walker’s equation gave a more accurate result compared
to the Paris equation.
• Both numerical methods deviate significantly from the experimental method as the crack
length exceeded 0.5 mm.
7. Future Work
A good scientific project not only answers questions it also produces new ones. Several
interesting issues have arisen because of this work. The following topics are recommended
when it comes to further study on this subject:
• Study the fatigue crack growth by using the XFEM method in ABAQUS,
• Expand the experimental study by performing similar tests but with different R-ratios,
• Derive better Coefficients for both Paris and Walker’s models,
• Expand the numerical study by implementing another crack growth rate model such as
the model suggested by Forman,
• Perform similar simulation for other materials or geometries,
• Estimate the fatigue life,
• Expand the study by considering environmental effects such as temperature.
36
8. References
[1] K. Hellan, (1984) “Introduction to Fracture Mechanics”, McGraw-Hill, New York.
[2] A.A. Griffith, (1921) “The Phenomena of Rupture and Flows in Solids”. Phil. Trans. Royal
Soc., 221.
[3] G. R. Irwin, (1958) ”Handbuch der Physik, Vol. 6”, Springer, Berlin, 551-590.
[4] D. Broek, (1986) “Elementary Engineering Fracture Mechanics”, Dordrecht, Hingham,
MA.
[5] R.W. Hertzberg, (1989) “Deformation and Fracture Mechanics of Engineering Materials
Third edition”, John Wiley & Sons, New York.
[6] H. M. Westergaard, (1939) “Appl. Mech”, Trans. ASME, J. 49.
[7] M. K. Kassir and G. C. Sih, (1966) “Three-dimensional stress distribution around an
elliptical crack under arbitrary loadings”, Trans. ASME, Ser. E, J. Appl. Mech. JJ, 601-611.
[8] J.R. Rice, (1968) “A Path Independent Integral and the Approximate Analysis of Strain
Concentration by Notches and Cracks”, Journal of Applied Mechanics, 35, 379-386.
[9] J.D. Eshelby, (1974) “The Calculation of Energy Release Rate in Prospects of Fracture
Mechanics”, G.C. Sih et al, Noordhoff, Leyden, 69-84.
[10] C. Shih, and R. Asaro, (1988) “Elastic-Plastic Analysis of Cracks on Bimaterial Interfaces:
Part I-Small Scale Yielding”, Journal of Applied Mechanics, 299-316.
[11] P. Paris and F. Erdogan, (1963) “A Critical Analysis of Crack Propagation Laws”,
Journal of Basic Engineering, 528-533.
37
[12] K. Walker, (1970) “The Effects of Stress Ratio During Crack Propagation and Fatigue for
2024-T3 and 7075-T6 Aluminum”, Effects of Environment and Complex Load History on
Fatigue Life, ASTM STP 462, American Society for Testing and Materials, 1-14.
[13] V.B. Watwood Jr. (1970) “The Finite Element Method for Prediction of Crack Behavior”,
Nuclear Engineering and Design, 323-332.
[14] G. P. Anderson, V. L. Ruggles and G. S. Stibor, (1971) “Use of Finite Element Computer
Programs in Fracture Mechanics”, International Journal of Fracture Mechanics, 63-76.
[15] S. Chan, I. Tuba, and W. Wilson, (1970) “On the Finite Element Method in Linear
Fracture Mechanics”, Engineering Fracture Mechanics, 1-17.
[16] E. Byskov, (1970) “The Calculation of Stress Intensity Factors Using the Finite Element
Method with Cracked Elements”, International Journal of Fracture Mechanics, 159-167.
[17] W. Wilson, (1973) “Finite Element Methods for Elastic Bodies Containing Cracks”, In
Mechanics of Fracture, G. Sih, ed, Noordhoff International Publishing, Leyden.
[18] R. H. Hardy, (1974) “A High-Order Finite Element for Two-Dimensional Crack Problems
“, PhD Thesis, Georgia Institute of Technology, Atlanta, GA.
[19] R. Henshell and K. Shaw, (1975) “Crack Tip Finite Elements are Unnecessary”,
International Journal for Numerical Methods, 495-507.
[20] N.E Dowling, (1993) “Mechanical behavior of materials : engineering methods for
deformation, fracture, and fatigue”, Englewood Cliffs, N.J. :Prentice Hall
[21] R. G. Forman, V. E. Kearney and R. M. Engle, (1967) “Numerical
Analysis of Crack Propagation in Cyclic-Loaded Structures”,
Trans. ASME, Jour. Bas. Engr, vol. 89, pp.459-464
38
Appendix A
## SCRIPT FOR ANALYZING THE CRACK GROWTH RATE da/dN.
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 *
from abaqusConstants import *
from math import *
from numpy import *
from odbAccess import *
from abaqus import *
from abaqusConstants import *
from odbMaterial import *
from odbSection import *
import visualization
import os,sys
import time
jobname = 'a1b1_f40'
odbfile = jobname + '.odb'
datfile = jobname + '.dat'
comfile = jobname + '.com'
inpfile = jobname + '.inp'
msgfile = jobname + '.msg'
prtfile = jobname + '.prt'
simfile = jobname + '.sim'
stafile = jobname + '.sta'
resultfile = jobname + '.fres'
fres = open(resultfile,'w')
39
fres.write('a c N K1mid\n')
#Initial crack geometry
acrack = 0.1
ccrack = 0.1
#mesh parameters (static)
ncrelems=32
ntipelems=16
#Material properties
#Elastic
youngsmodulus=210000
poissionsratio=0.3
#Crack growth
const = 10E-12
nexp = 3
#Loading
force=40000 #total applied force
area=pi*pow(8,2)
stress=(force/2)/area
#Number of cycles in each iteration
dncyc = 500
#Total number of cycles
totncyc = 5000
ncyc = 0
R = 0.5
gamma = 0.70
k1ValHas=[]
WalkerHas=[]
acrackHas=[]
ccrackHas=[]
cycles=[]
#Main loop
40
while (ncyc<totncyc):
#while (ncyc==0): #if analysing one loading cycle for the initial a and c
#Meshing parameters
#Assign normal vector z-component for J-evaluation
diff = abs(acrack-ccrack)
eps=1.E-15
if diff<eps:
vz = 1.0
else:
vz = -1.0
rcrack = min(acrack,ccrack)/4.
rtip = rcrack/10.
ncyc = ncyc + dncyc
#Build Specimen and Crack
mdb.models['Model-1'].ConstrainedSketch(name='__profile__', sheetSize=200.0)
mdb.models['Model-1'].sketches['__profile__'].CircleByCenterPerimeter(center=(
0.0, 0.0), point1=(0.0, 8.0))
mdb.models['Model-1'].Part(dimensionality=THREE_D, name='Part-1', type=
DEFORMABLE_BODY)
mdb.models['Model-1'].parts['Part-1'].BaseSolidExtrude(depth=110.0, sketch=
mdb.models['Model-1'].sketches['__profile__'])
del mdb.models['Model-1'].sketches['__profile__']
mdb.models['Model-1'].ConstrainedSketch(name='__profile__', sheetSize=200.0)
mdb.models['Model-1'].sketches['__profile__'].ConstructionLine(point1=(0.0,
-100.0), point2=(0.0, 100.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=(5.0, 0.0), point2=(
5.0, 10.0))
mdb.models['Model-1'].sketches['__profile__'].VerticalConstraint(addUndoState=
False, entity=mdb.models['Model-1'].sketches['__profile__'].geometry[3])
mdb.models['Model-1'].sketches['__profile__'].ArcByCenterEnds(center=(25.0,
10.0), direction=CLOCKWISE, point1=(5.0, 10.0), point2=(25.0, 30.0))
mdb.models['Model-1'].sketches['__profile__'].Line(point1=(25.0, 30.0), point2=
(25.0, 0.0))
41
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=(25.0, 0.0), point2=(
5.0, 0.0))
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'].Part(dimensionality=THREE_D, name='Part-2', type=
DEFORMABLE_BODY)
mdb.models['Model-1'].parts['Part-2'].BaseSolidRevolve(angle=180.0,
flipRevolveDirection=OFF, sketch=
mdb.models['Model-1'].sketches['__profile__'])
del mdb.models['Model-1'].sketches['__profile__']
mdb.models['Model-1'].ConstrainedSketch(gridSpacing=5.61, name='__profile__',
sheetSize=224.6, transform=
mdb.models['Model-1'].parts['Part-1'].MakeSketchTransform(
sketchPlane=mdb.models['Model-1'].parts['Part-1'].faces[1],
sketchPlaneSide=SIDE1,
sketchUpEdge=mdb.models['Model-1'].parts['Part-1'].edges[0],
sketchOrientation=RIGHT, origin=(0.0, 0.0, 110.0)))
mdb.models['Model-1'].parts['Part-1'].projectReferencesOntoSketch(filter=
COPLANAR_EDGES, sketch=mdb.models['Model-1'].sketches['__profile__'])
mdb.models['Model-1'].sketches['__profile__'].rectangle(point1=(-50.0, 0.0),
point2=(50.0, 50.0))
mdb.models['Model-1'].parts['Part-1'].CutExtrude(flipExtrudeDirection=OFF,
sketch=mdb.models['Model-1'].sketches['__profile__'], sketchOrientation=
RIGHT, sketchPlane=mdb.models['Model-1'].parts['Part-1'].faces[1],
sketchPlaneSide=SIDE1, sketchUpEdge=
mdb.models['Model-1'].parts['Part-1'].edges[0])
del mdb.models['Model-1'].sketches['__profile__']
mdb.models['Model-1'].rootAssembly.DatumCsysByDefault(CARTESIAN)
mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='Part-1-1',
42
part=mdb.models['Model-1'].parts['Part-1'])
mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='Part-2-1',
part=mdb.models['Model-1'].parts['Part-2'])
mdb.models['Model-1'].rootAssembly.rotate(angle=90.0, axisDirection=(1.0, 0.0,
0.0), axisPoint=(0.0, 0.0, 0.0), instanceList=('Part-2-1', ))
mdb.models['Model-1'].rootAssembly.InstanceFromBooleanCut(cuttingInstances=(
mdb.models['Model-1'].rootAssembly.instances['Part-2-1'], ),
instanceToBeCut=mdb.models['Model-1'].rootAssembly.instances['Part-1-1'],
name='Part-3', originalInstances=SUPPRESS)
mdb.models['Model-1'].ConstrainedSketch(gridSpacing=5.55, name='__profile__',
sheetSize=222.31, transform=
mdb.models['Model-1'].parts['Part-3'].MakeSketchTransform(
sketchPlane=mdb.models['Model-1'].parts['Part-3'].faces[2],
sketchPlaneSide=SIDE1,
sketchUpEdge=mdb.models['Model-1'].parts['Part-3'].edges[7],
sketchOrientation=RIGHT, origin=(0.0, 0.0, 57.869826)))
mdb.models['Model-1'].parts['Part-3'].projectReferencesOntoSketch(filter=
COPLANAR_EDGES, sketch=mdb.models['Model-1'].sketches['__profile__'])
mdb.models['Model-1'].sketches['__profile__'].ConstructionLine(point1=(
57.869826, -5.0), point2=(57.869826, 5.0))
mdb.models['Model-1'].sketches['__profile__'].VerticalConstraint(addUndoState=
False, entity=mdb.models['Model-1'].sketches['__profile__'].geometry[10])
mdb.models['Model-1'].sketches['__profile__'].CoincidentConstraint(
addUndoState=False, entity1=
mdb.models['Model-1'].sketches['__profile__'].vertices[3], entity2=
mdb.models['Model-1'].sketches['__profile__'].geometry[10])
mdb.models['Model-1'].sketches['__profile__'].CoincidentConstraint(
addUndoState=False, entity1=
mdb.models['Model-1'].sketches['__profile__'].vertices[4], entity2=
mdb.models['Model-1'].sketches['__profile__'].geometry[10])
mdb.models['Model-1'].sketches['__profile__'].CircleByCenterPerimeter(center=(
57.869826, 10.1951885223389), point1=(57.869826, 2.00342178344727))
mdb.models['Model-1'].sketches['__profile__'].CoincidentConstraint(
addUndoState=False, entity1=
mdb.models['Model-1'].sketches['__profile__'].vertices[11], entity2=
mdb.models['Model-1'].sketches['__profile__'].geometry[6])
mdb.models['Model-1'].sketches['__profile__'].CoincidentConstraint(
addUndoState=False, entity1=
mdb.models['Model-1'].sketches['__profile__'].vertices[10], entity2=
43
mdb.models['Model-1'].sketches['__profile__'].geometry[10])
mdb.models['Model-1'].sketches['__profile__'].RadialDimension(curve=
mdb.models['Model-1'].sketches['__profile__'].geometry[11], radius=5.0,
textPoint=(42.5423380544434, 11.2636814117432))
mdb.models['Model-1'].sketches['__profile__'].ObliqueDimension(textPoint=(
51.2196385076294, 5.0), value=2.0, vertex1=
mdb.models['Model-1'].sketches['__profile__'].vertices[10], vertex2=
mdb.models['Model-1'].sketches['__profile__'].vertices[4])
mdb.models['Model-1'].parts['Part-3'].CutExtrude(flipExtrudeDirection=OFF,
sketch=mdb.models['Model-1'].sketches['__profile__'], sketchOrientation=
RIGHT, sketchPlane=mdb.models['Model-1'].parts['Part-3'].faces[2],
sketchPlaneSide=SIDE1, sketchUpEdge=
mdb.models['Model-1'].parts['Part-3'].edges[7])
del mdb.models['Model-1'].sketches['__profile__']
#Model ellipsoid for crack region
mdb.models['Model-1'].ConstrainedSketch(name='__sweep__', sheetSize=200.0)
mdb.models['Model-1'].sketches['__sweep__'].EllipseByCenterPerimeter(
axisPoint1=(acrack, 0.0), axisPoint2=(0.0, -ccrack), center=(0.0, 0.0))
mdb.models['Model-1'].ConstrainedSketch(name='__profile__', sheetSize=200.0,
transform=(1.0, -4.20972337206903e-17, 0.0, 0.0, 0.0, 1.0,
-4.20972337206903e-17, -1.0, 0.0, 1.1, -6.73555739531044e-17, 0.0))
mdb.models['Model-1'].sketches['__profile__'].ConstructionLine(point1=(-100.0,
0.0), point2=(100.0, 0.0))
mdb.models['Model-1'].sketches['__profile__'].ConstructionLine(point1=(0.0,
-100.0), point2=(0.0, 100.0))
mdb.models['Model-1'].sketches['__profile__'].CircleByCenterPerimeter(center=(
0.0, 0.0), point1=(rcrack, 0.0))
mdb.models['Model-1'].Part(dimensionality=THREE_D, name='Part-4', type=
DEFORMABLE_BODY)
mdb.models['Model-1'].parts['Part-4'].BaseSolidSweep(path=
mdb.models['Model-1'].sketches['__sweep__'], sketch=
mdb.models['Model-1'].sketches['__profile__'])
del mdb.models['Model-1'].sketches['__profile__']
del mdb.models['Model-1'].sketches['__sweep__']
#Add it to the assembly
mdb.models['Model-1'].rootAssembly.regenerate()
mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='Part-4-1',
part=mdb.models['Model-1'].parts['Part-4'])
44
mdb.models['Model-1'].rootAssembly.translate(instanceList=('Part-4-1', ),
vector=(-2.0, 0.0, 0.0))
#Boolean operations to create crack tip region and region for rest of the specimen
mdb.models['Model-1'].rootAssembly.InstanceFromBooleanCut(cuttingInstances=(
mdb.models['Model-1'].rootAssembly.instances['Part-4-1'], ),
instanceToBeCut=mdb.models['Model-1'].rootAssembly.instances['Part-3-1'],
name='Part-5', originalInstances=SUPPRESS)
mdb.models['Model-1'].rootAssembly.features['Part-5-1'].suppress()
mdb.models['Model-1'].rootAssembly.features['Part-3-1'].resume()
mdb.models['Model-1'].rootAssembly.features['Part-4-1'].resume()
mdb.models['Model-1'].rootAssembly.InstanceFromBooleanCut(cuttingInstances=(
mdb.models['Model-1'].rootAssembly.instances['Part-3-1'], ),
instanceToBeCut=mdb.models['Model-1'].rootAssembly.instances['Part-4-1'],
name='Part-6', originalInstances=SUPPRESS)
mdb.models['Model-1'].rootAssembly.features['Part-5-1'].resume()
mdb.models['Model-1'].rootAssembly.features['Part-5-1'].suppress()
mdb.models['Model-1'].rootAssembly.features['Part-4-1'].resume()
mdb.models['Model-1'].rootAssembly.InstanceFromBooleanCut(cuttingInstances=(
mdb.models['Model-1'].rootAssembly.instances['Part-6-1'], ),
instanceToBeCut=mdb.models['Model-1'].rootAssembly.instances['Part-4-1'],
name='Part-7', originalInstances=SUPPRESS)
mdb.models['Model-1'].rootAssembly.features['Part-5-1'].resume()
#Create sweep edge at top of crack tip region
mdb.models['Model-1'].ConstrainedSketch(gridSpacing=0.13, name='__profile__',
sheetSize=5.28, transform=
mdb.models['Model-1'].parts['Part-7'].MakeSketchTransform(
sketchPlane=mdb.models['Model-1'].parts['Part-7'].faces[0],
sketchPlaneSide=SIDE1,
sketchUpEdge=mdb.models['Model-1'].parts['Part-7'].edges[3],
sketchOrientation=RIGHT, origin=(-2.0, -0.0, 0.0)))
mdb.models['Model-1'].parts['Part-7'].projectReferencesOntoSketch(filter=
COPLANAR_EDGES, sketch=mdb.models['Model-1'].sketches['__profile__'])
mdb.models['Model-1'].sketches['__profile__'].EllipseByCenterPerimeter(
axisPoint1=(-acrack, 0.0), axisPoint2=(
0.0, -ccrack), center=(0.0,
0.0))
mdb.models['Model-1'].parts['Part-7'].PartitionFaceBySketchThruAll(faces=
mdb.models['Model-1'].parts['Part-7'].faces.getSequenceFromMask(('[#8 ]',
45
), ), sketch=mdb.models['Model-1'].sketches['__profile__'], sketchPlane=
mdb.models['Model-1'].parts['Part-7'].faces[0], sketchPlaneSide=SIDE1,
sketchUpEdge=mdb.models['Model-1'].parts['Part-7'].edges[3])
del mdb.models['Model-1'].sketches['__profile__']
#Create partition for crack tip region and define edge for crack front
mdb.models['Model-1'].ConstrainedSketch(gridSpacing=0.08, name='__profile__',
sheetSize=3.35, transform=
mdb.models['Model-1'].parts['Part-7'].MakeSketchTransform(
sketchPlane=mdb.models['Model-1'].parts['Part-7'].faces[3],
sketchPlaneSide=SIDE1,
sketchUpEdge=mdb.models['Model-1'].parts['Part-7'].edges[5],
sketchOrientation=RIGHT, origin=(acrack-2.0, 0.0, 0.0)))
mdb.models['Model-1'].parts['Part-7'].projectReferencesOntoSketch(filter=
COPLANAR_EDGES, sketch=mdb.models['Model-1'].sketches['__profile__'])
mdb.models['Model-1'].sketches['__profile__'].CircleByCenterPerimeter(center=(
0.0, 0.0), point1=(0.0, rtip))
mdb.models['Model-1'].parts['Part-7'].PartitionFaceBySketch(faces=
mdb.models['Model-1'].parts['Part-7'].faces.getSequenceFromMask(('[#8 ]',
), ), sketch=mdb.models['Model-1'].sketches['__profile__'], sketchUpEdge=
mdb.models['Model-1'].parts['Part-7'].edges[5])
del mdb.models['Model-1'].sketches['__profile__']
mdb.models['Model-1'].parts['Part-7'].PartitionCellBySweepEdge(cells=
mdb.models['Model-1'].parts['Part-7'].cells.getSequenceFromMask(('[#1 ]',
), ), edges=(mdb.models['Model-1'].parts['Part-7'].edges[0], ), sweepPath=
mdb.models['Model-1'].parts['Part-7'].edges[5])
mdb.models['Model-1'].parts['Part-7'].PartitionFaceByProjectingEdges(edges=
mdb.models['Model-1'].parts['Part-7'].edges.getSequenceFromMask((
'[#2000 ]', ), ), extendEdges=False, faces=
mdb.models['Model-1'].parts['Part-7'].faces.getSequenceFromMask(('[#40 ]',
), ))
#mesh the crack tip region with hex (and wedge) elements
mdb.models['Model-1'].parts['Part-7'].seedEdgeByNumber(constraint=FINER, edges=
mdb.models['Model-1'].parts['Part-7'].edges.getSequenceFromMask((
'[#1245 ]', ), ), number=ncrelems)
mdb.models['Model-1'].parts['Part-7'].seedEdgeByNumber(constraint=FINER, edges=
mdb.models['Model-1'].parts['Part-7'].edges.getSequenceFromMask((
46
'[#10000 ]', ), ), number=ncrelems)
mdb.models['Model-1'].parts['Part-7'].seedEdgeByNumber(constraint=FINER, edges=
mdb.models['Model-1'].parts['Part-7'].edges.getSequenceFromMask((
'[#ac000 ]', ), ), number=ntipelems/2)
mdb.models['Model-1'].parts['Part-7'].seedEdgeByNumber(constraint=FINER, edges=
mdb.models['Model-1'].parts['Part-7'].edges.getSequenceFromMask(('[#30 ]',
), ), number=ntipelems)
mdb.models['Model-1'].parts['Part-7'].seedEdgeBySize(constraint=FINER,
deviationFactor=0.1, edges=
mdb.models['Model-1'].parts['Part-7'].edges.getSequenceFromMask((
'[#2d00 ]', ), ), size=rtip)
try:
mdb.models['Model-1'].parts['Part-7'].setMeshControls(elemShape=WEDGE, regions=
mdb.models['Model-1'].parts['Part-7'].cells.getSequenceFromMask(('[#1 ]',
), ))
mdb.models['Model-1'].parts['Part-7'].setMeshControls(elemShape=HEX, regions=
mdb.models['Model-1'].parts['Part-7'].cells.getSequenceFromMask(('[#2 ]',
), ), technique=STRUCTURED)
except:
mdb.models['Model-1'].parts['Part-7'].setMeshControls(elemShape=WEDGE, regions=
mdb.models['Model-1'].parts['Part-7'].cells.getSequenceFromMask(('[#2 ]',
), ))
mdb.models['Model-1'].parts['Part-7'].setMeshControls(elemShape=HEX, regions=
mdb.models['Model-1'].parts['Part-7'].cells.getSequenceFromMask(('[#1 ]',
), ), technique=STRUCTURED)
mdb.models['Model-1'].parts['Part-7'].seedEdgeByNumber(constraint=FINER, edges=
mdb.models['Model-1'].parts['Part-7'].edges.getSequenceFromMask((
'[#4008a ]', ), ), number=1)
mdb.models['Model-1'].parts['Part-7'].generateMesh()
mdb.models['Model-1'].parts['Part-7'].setElementType(elemTypes=(ElemType(
elemCode=C3D20, elemLibrary=STANDARD), ElemType(elemCode=C3D15,
elemLibrary=STANDARD), ElemType(elemCode=C3D10, elemLibrary=STANDARD)),
regions=(mdb.models['Model-1'].parts['Part-7'].cells.getSequenceFromMask((
'[#3 ]', ), ), ))
#mesh the rest of the specimen with tet elements
#first partition the interface to the crack mesh to avoid to big inner elements
47
mdb.models['Model-1'].ConstrainedSketch(gridSpacing=0.06, name='__profile__',
sheetSize=2.5, transform=
mdb.models['Model-1'].parts['Part-5'].MakeSketchTransform(
sketchPlane=mdb.models['Model-1'].parts['Part-5'].faces[6],
sketchPlaneSide=SIDE1,
sketchUpEdge=mdb.models['Model-1'].parts['Part-5'].edges[7],
sketchOrientation=RIGHT, origin=(-2.0, 0.0, 0.0)))
mdb.models['Model-1'].parts['Part-5'].projectReferencesOntoSketch(filter=
COPLANAR_EDGES, sketch=mdb.models['Model-1'].sketches['__profile__'])
mdb.models['Model-1'].sketches['__profile__'].EllipseByCenterPerimeter(
axisPoint1=(-acrack, 0.0), axisPoint2=(0.0, -ccrack), center=
(0.0, 0.0))
mdb.models['Model-1'].sketches['__profile__'].EllipseByCenterPerimeter(
axisPoint1=(-acrack-rcrack/sqrt(2), 0.0), axisPoint2=(0.0, -ccrack-rcrack/sqrt(2)), center=
(0.0, 0.0))
mdb.models['Model-1'].sketches['__profile__'].EllipseByCenterPerimeter(
axisPoint1=(-acrack+rcrack/sqrt(2), 0.0), axisPoint2=(0.0, -ccrack+rcrack/sqrt(2)), center=
(0.0, 0.0))
mdb.models['Model-1'].parts['Part-5'].PartitionFaceBySketchThruAll(faces=
mdb.models['Model-1'].parts['Part-5'].faces.getSequenceFromMask(('[#1 ]',
), ), sketch=mdb.models['Model-1'].sketches['__profile__'], sketchPlane=
mdb.models['Model-1'].parts['Part-5'].faces[6], sketchPlaneSide=SIDE1,
sketchUpEdge=mdb.models['Model-1'].parts['Part-5'].edges[7])
del mdb.models['Model-1'].sketches['__profile__']
#Mesh the specimen
mdb.models['Model-1'].parts['Part-5'].seedPart(deviationFactor=0.1,
minSizeFactor=0.1, size=3.0)
mdb.models['Model-1'].parts['Part-5'].seedEdgeBySize(constraint=FINER,
deviationFactor=0.1, edges=
mdb.models['Model-1'].parts['Part-5'].edges.getSequenceFromMask((
'[#40000 ]', ), ), minSizeFactor=0.1, size=2.0)
mdb.models['Model-1'].parts['Part-5'].seedEdgeByBias(biasMethod=SINGLE,
constraint=FINER, end1Edges=
mdb.models['Model-1'].parts['Part-5'].edges.getSequenceFromMask((
'[#8000 ]', ), ), maxSize=2.5, minSize=6*rtip)
mdb.models['Model-1'].parts['Part-5'].seedEdgeByBias(biasMethod=SINGLE,
constraint=FINER, end1Edges=
48
mdb.models['Model-1'].parts['Part-5'].edges.getSequenceFromMask((
'[#20000 ]', ), ), end2Edges=
mdb.models['Model-1'].parts['Part-5'].edges.getSequenceFromMask((
'[#2000 ]', ), ), maxSize=2.0, minSize=rtip)
mdb.models['Model-1'].parts['Part-5'].seedEdgeByBias(biasMethod=SINGLE,
constraint=FINER, end1Edges=
mdb.models['Model-1'].parts['Part-5'].edges.getSequenceFromMask((
'[#20000 ]', ), ), end2Edges=
mdb.models['Model-1'].parts['Part-5'].edges.getSequenceFromMask((
'[#2000 ]', ), ), maxSize=1.5, minSize=rtip)
mdb.models['Model-1'].parts['Part-5'].seedEdgeByNumber(constraint=FINER, edges=
mdb.models['Model-1'].parts['Part-5'].edges.getSequenceFromMask(('[#295 ]',
), ), number=ncrelems)
mdb.models['Model-1'].parts['Part-5'].seedEdgeByNumber(constraint=FINER, edges=
mdb.models['Model-1'].parts['Part-5'].edges.getSequenceFromMask((
'[#1d6a ]', ), ), number=ntipelems/4)
mdb.models['Model-1'].parts['Part-5'].seedEdgeByBias(biasMethod=SINGLE,
constraint=FINER, end1Edges=
mdb.models['Model-1'].parts['Part-5'].edges.getSequenceFromMask((
'[#10000 ]', ), ), end2Edges=
mdb.models['Model-1'].parts['Part-5'].edges.getSequenceFromMask((
'[#80000 ]', ), ), maxSize=6*rtip, minSize=rtip)
mdb.models['Model-1'].parts['Part-5'].setMeshControls(elemShape=TET, regions=
mdb.models['Model-1'].parts['Part-5'].cells.getSequenceFromMask(('[#1 ]',
), ), technique=FREE)
mdb.models['Model-1'].parts['Part-5'].setElementType(elemTypes=(ElemType(
elemCode=C3D20R, elemLibrary=STANDARD), ElemType(elemCode=C3D15,
elemLibrary=STANDARD), ElemType(elemCode=C3D10, elemLibrary=STANDARD)),
regions=(mdb.models['Model-1'].parts['Part-5'].cells.getSequenceFromMask((
'[#1 ]', ), ), ))
mdb.models['Model-1'].parts['Part-5'].generateMesh()
mdb.models['Model-1'].parts['Part-5'].setElementType(elemTypes=(ElemType(
elemCode=C3D20R, elemLibrary=STANDARD), ElemType(elemCode=C3D15,
elemLibrary=STANDARD), ElemType(elemCode=C3D10, elemLibrary=STANDARD)),
regions=(mdb.models['Model-1'].parts['Part-5'].cells.getSequenceFromMask((
'[#1 ]', ), ), ))
#Assign material properties
mdb.models['Model-1'].Material(name='Steel')
49
mdb.models['Model-1'].materials['Steel'].Elastic(table=((youngsmodulus, poissionsratio), ))
mdb.models['Model-1'].HomogeneousSolidSection(material='Steel', name=
'Steelsection', thickness=None)
mdb.models['Model-1'].parts['Part-5'].Set(cells=
mdb.models['Model-1'].parts['Part-5'].cells.getSequenceFromMask(('[#1 ]',
), ), name='Set-15')
mdb.models['Model-1'].parts['Part-5'].SectionAssignment(offset=0.0,
offsetField='', offsetType=MIDDLE_SURFACE, region=
mdb.models['Model-1'].parts['Part-5'].sets['Set-15'], sectionName=
'Steelsection', thicknessAssignment=FROM_SECTION)
mdb.models['Model-1'].parts['Part-7'].Set(cells=
mdb.models['Model-1'].parts['Part-7'].cells.getSequenceFromMask(('[#3 ]',
), ), name='Set-8')
mdb.models['Model-1'].parts['Part-7'].SectionAssignment(offset=0.0,
offsetField='', offsetType=MIDDLE_SURFACE, region=
mdb.models['Model-1'].parts['Part-7'].sets['Set-8'], sectionName=
'Steelsection', thicknessAssignment=FROM_SECTION)
#Connect regions with tied contact constraint
mdb.models['Model-1'].rootAssembly.regenerate()
mdb.models['Model-1'].rootAssembly.Surface(name='m_Surf-1', side1Faces=
mdb.models['Model-1'].rootAssembly.instances['Part-7-1'].faces.getSequenceFromMask(
('[#440 ]', ), ))
mdb.models['Model-1'].rootAssembly.Surface(name='s_Surf-1', side1Faces=
mdb.models['Model-1'].rootAssembly.instances['Part-5-1'].faces.getSequenceFromMask(
('[#f ]', ), ))
mdb.models['Model-1'].Tie(adjust=ON, master=
mdb.models['Model-1'].rootAssembly.surfaces['m_Surf-1'], name=
'Constraint-1', positionToleranceMethod=COMPUTED, slave=
mdb.models['Model-1'].rootAssembly.surfaces['s_Surf-1'], thickness=ON,
tieRotations=ON)
#Apply boundary conditions
#Apply displacement boundary conditions
mdb.models['Model-1'].rootAssembly.Set(faces=
mdb.models['Model-1'].rootAssembly.instances['Part-7-1'].faces.getSequenceFromMask(
mask=('[#90 ]', ), )+\
50
mdb.models['Model-1'].rootAssembly.instances['Part-5-1'].faces.getSequenceFromMask(
mask=('[#20 ]', ), ), name='Set-1')
mdb.models['Model-1'].DisplacementBC(amplitude=UNSET, createStepName='Initial',
distributionType=UNIFORM, fieldName='', localCsys=None, name='Crackplane',
region=mdb.models['Model-1'].rootAssembly.sets['Set-1'], u1=UNSET, u2=UNSET
, u3=SET, ur1=UNSET, ur2=UNSET, ur3=UNSET)
mdb.models['Model-1'].rootAssembly.Set(faces=
mdb.models['Model-1'].rootAssembly.instances['Part-7-1'].faces.getSequenceFromMask(
mask=('[#220 ]', ), )+\
mdb.models['Model-1'].rootAssembly.instances['Part-5-1'].faces.getSequenceFromMask(
mask=('[#40 ]', ), ), name='Set-2')
mdb.models['Model-1'].DisplacementBC(amplitude=UNSET, createStepName='Initial',
distributionType=UNIFORM, fieldName='', localCsys=None, name='Symmetry',
region=mdb.models['Model-1'].rootAssembly.sets['Set-2'], u1=UNSET, u2=SET,
u3=UNSET, ur1=UNSET, ur2=UNSET, ur3=UNSET)
mdb.models['Model-1'].rootAssembly.Set(name='Set-3', vertices=
mdb.models['Model-1'].rootAssembly.instances['Part-5-1'].vertices.getSequenceFromMask(
('[#20000 ]', ), ))
mdb.models['Model-1'].DisplacementBC(amplitude=UNSET, createStepName='Initial',
distributionType=UNIFORM, fieldName='', localCsys=None, name='Translation',
region=mdb.models['Model-1'].rootAssembly.sets['Set-3'], u1=SET, u2=UNSET,
u3=UNSET, ur1=UNSET, ur2=UNSET, ur3=UNSET)
#define step
mdb.models['Model-1'].StaticStep(name='Loading', previous='Initial')
#define loading boundary condition
mdb.models['Model-1'].rootAssembly.Surface(name='Surf-3', side1Faces=
mdb.models['Model-1'].rootAssembly.instances['Part-5-1'].faces.getSequenceFromMask(
('[#400 ]', ), ))
mdb.models['Model-1'].Pressure(amplitude=UNSET, createStepName='Loading',
distributionType=UNIFORM, field='', magnitude=-stress, name='Load-1',
region=mdb.models['Model-1'].rootAssembly.surfaces['Surf-3'])
#Define crack
mdb.models['Model-1'].rootAssembly.makeIndependent(instances=(
mdb.models['Model-1'].rootAssembly.instances['Part-7-1'], ))
51
mdb.models['Model-1'].rootAssembly.engineeringFeatures.ContourIntegral(
collapsedElementAtTip=SINGLE_NODE, crackFront=Region(
edges=mdb.models['Model-1'].rootAssembly.instances['Part-7-1'].edges.getSequenceFromMask(
mask=('[#1 ]', ), )), crackNormal=((0.0, 0.0, 0.0), (0.0, 0.0, vz)),
crackTip=Region(
edges=mdb.models['Model-1'].rootAssembly.instances['Part-7-1'].edges.getSequenceFromMask(
mask=('[#1 ]', ), )), extensionDirectionMethod=CRACK_NORMAL,
midNodePosition=0.25, name='Crack-1', symmetric=ON)
#Addition to ensure the crack extension direction is correctly set
a = mdb.models['Model-1'].rootAssembly
session.viewports['Viewport: 1'].setValues(displayedObject=a)
session.viewports['Viewport: 1'].assemblyDisplay.setValues(interactions=ON,
constraints=ON, connectors=ON, engineeringFeatures=ON,
optimizationTasks=OFF, geometricRestrictions=OFF, stopConditions=OFF)
session.viewports['Viewport: 1'].view.setValues(nearPlane=192.83,
farPlane=283.889, width=91.9348, height=48.1625, cameraPosition=(103.881,
157.177, -86.5956), cameraUpVector=(-0.991432, 0.0287355, -0.127423),
cameraTarget=(-1.7555, -7.06014, 59.8157))
session.viewports['Viewport: 1'].view.setValues(nearPlane=175.449,
farPlane=298.469, width=83.6482, height=43.8214, cameraPosition=(-11.053,
4.16904, -181.563), cameraUpVector=(-0.91404, 0.132909, 0.383231),
cameraTarget=(0.997055, -3.39575, 62.0901))
session.viewports['Viewport: 1'].view.setValues(nearPlane=181.471,
farPlane=292.448, width=0.888331, height=0.465375, viewOffsetX=-1.31792,
viewOffsetY=0.0434869)
a = mdb.models['Model-1'].rootAssembly
a.engineeringFeatures.cracks['Crack-1'].setValues(
extensionDirectionMethod=CRACK_NORMAL, crackNormal=((0.0, 0.0, 0.0), (0.0,
0.0, -1.0)), crackTipSense=REVERSE)
session.viewports['Viewport: 1'].assemblyDisplay.setValues(interactions=OFF,
constraints=OFF, connectors=OFF, engineeringFeatures=OFF)
#Submit job
mdb.Job(atTime=None, contactPrint=OFF, description='', echoPrint=OFF,
explicitPrecision=SINGLE, getMemoryFromAnalysis=True, historyPrint=OFF,
memory=90, memoryUnits=PERCENTAGE, model='Model-1', modelPrint=OFF,
multiprocessingMode=DEFAULT, name=jobname, nodalOutputPrecision=SINGLE,
52
numCpus=1, numGPUs=0, queue=None, resultsFormat=ODB, scratch='', type=
ANALYSIS, userSubroutine='', waitHours=0, waitMinutes=0)
#define History Output
mdb.models['Model-1'].HistoryOutputRequest(contourIntegral='Crack-1',
contourType=K_FACTORS, createStepName='Loading', name='CrackOutput',
numberOfContours=8, rebar=EXCLUDE, sectionPoints=DEFAULT)
#Delete old odb-file if such a file exists
filelist = os.listdir(os.getcwd())
if odbfile in filelist:
os.remove(odbfile)
mdb.jobs[jobname].submit(consistencyChecking=OFF)
#Wait for completion
mdb.jobs[jobname].waitForCompletion()
#Read results file and extracts coordinates and mode I stress intensity factor
myOdb = visualization.openOdb(path=odbfile)
#Initialize result vectors
k1Val=[] #in MPamm^(1/2)
cxVal=[] #in mm
cyVal=[] #in mm
k1MidVal=[];
iMid = ncrelems+1
historyOutputKeys = myOdb.steps['Loading'].historyRegions['ElementSet ALL
ELEMENTS'].historyOutputs.keys()
for i in range(len(historyOutputKeys)):
historyOutput=historyOutputKeys[i]
if ('K1' in historyOutput) & ('Contour_8' in historyOutput):
k1 = myOdb.steps['Loading'].historyRegions['ElementSet ALL
ELEMENTS'].historyOutputs[historyOutput].data[0][1]
k1Val.append(k1)
elif ('X' in historyOutput):
53
cx = myOdb.steps['Loading'].historyRegions['ElementSet ALL
ELEMENTS'].historyOutputs[historyOutput].data[0][1]
cxVal.append(cx)
elif ('Y' in historyOutput):
cy = myOdb.steps['Loading'].historyRegions['ElementSet ALL
ELEMENTS'].historyOutputs[historyOutput].data[0][1]
cyVal.append(cy)
#store K1-values to check path independence
if ('K1' in historyOutput) & ((str(iMid)+'__Contour_6') in historyOutput):
k1 = myOdb.steps['Loading'].historyRegions['ElementSet ALL
ELEMENTS'].historyOutputs[historyOutput].data[0][1]
k1MidVal.append(k1)
elif ('K1' in historyOutput) & ((str(iMid)+'__Contour_7') in historyOutput):
k1 = myOdb.steps['Loading'].historyRegions['ElementSet ALL
ELEMENTS'].historyOutputs[historyOutput].data[0][1]
k1MidVal.append(k1)
elif ('K1' in historyOutput) & ((str(iMid)+'__Contour_8') in historyOutput):
k1 = myOdb.steps['Loading'].historyRegions['ElementSet ALL
ELEMENTS'].historyOutputs[historyOutput].data[0][1]
k1MidVal.append(k1)
#Check path independence half way along crack front
meanK1Mid = (sum(k1MidVal))/3.
kDiff = zeros((3))
for i in range(0,2):
kDiff[i]=(abs((meanK1Mid-k1MidVal[i])))/meanK1Mid
maxK1DiffLimit=0.001
if max(kDiff)>maxK1DiffLimit:
sys.exit('K1 not path independent, execution terminated')
#Perform Coordinate transformation
x2Val = [x+2 for x in cxVal] #Note: The '2' only valid for this particular specimen geometry
x1Val = [-x for x in cyVal]
#Apply crack growth law
k1mVal = [k1/sqrt(1000) for k1 in k1Val] #in MPam^(1/2)
dLmVal = [dncyc*(const*pow(k1m,nexp))/(pow((1-R),nexp*(1-gamma))) for k1m in k1mVal] #in m
54
Walker = (const*pow(max(k1mVal),nexp))/(pow((1-R),nexp*(1-gamma)))
dLVal = [1000*dLm for dLm in dLmVal] #in mm
k1ValHas.append(max(k1mVal))
WalkerHas.append(Walker)
#Compute new crack front
#Compute I matrix
alfa1 = ccrack
alfa2 = acrack
imat = zeros((2,2))
fmat = zeros((2,1))
for i in range(len(k1Val)):
x1 = x1Val[i]
x2 = x2Val[i]
dL = dLVal[i]
imat[0][0]=imat[0][0]+4*pow(x1,2)*pow(x1,2)/pow(alfa1,3)/pow(alfa1,3)/(pow(2*x1/pow(alfa1,2),2)+pow(2*x
2/pow(alfa2,2),2))
imat[0][1]=imat[0][1]+4*pow(x1,2)*pow(x2,2)/pow(alfa1,3)/pow(alfa2,3)/(pow(2*x1/pow(alfa1,2),2)+pow(2*x
2/pow(alfa2,2),2))
imat[1][0]=imat[1][0]+4*pow(x2,2)*pow(x1,2)/pow(alfa2,3)/pow(alfa1,3)/(pow(2*x1/pow(alfa1,2),2)+pow(2*x
2/pow(alfa2,2),2))
imat[1][1]=imat[1][1]+4*pow(x2,2)*pow(x2,2)/pow(alfa2,3)/pow(alfa2,3)/(pow(2*x1/pow(alfa1,2),2)+pow(2*x
2/pow(alfa2,2),2))
fmat[0]=fmat[0]+2*pow(x1,2)*dL/pow(alfa1,3)/sqrt(pow(2*x1/pow(alfa1,2),2)+pow(2*x2/pow(alfa2,2),2))
fmat[1]=fmat[1]+2*pow(x2,2)*dL/pow(alfa2,3)/sqrt(pow(2*x1/pow(alfa1,2),2)+pow(2*x2/pow(alfa2,2),2))
invimat = linalg.inv(imat)
dalfa=invimat.dot(fmat)
#update
acrack = acrack + float(dalfa[1])
55
ccrack = ccrack + float(dalfa[0])
acrackHas.append(acrack)
ccrackHas.append(ccrack)
cycles.append(ncyc)
#close odbfile
myOdb.close()
mdb.close()
#End of main loop
#print result more efficiently
print ((5*("{:<20}")).format('cycles', 'DiffK1', 'Walker' ,'acrack', 'ccrack'))
for v in range(len(k1ValHas)):
k1Values = k1ValHas[v]
WalkerValues = WalkerHas[v]
acrackValues = acrackHas[v]
ccrackValues = ccrackHas[v]
cyclesValues = cycles[v]
print ((5*("{:<20}")).format(cyclesValues, k1Values, WalkerValues, acrackValues, ccrackValues))
#outside main loop
fres.close()