Fatigue Crack Growth Analysis in Python algorithm with Finite ...

68
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

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.

ii

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.

iv

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, 𝜎𝑚𝑎𝑥 𝜎𝑚𝑖𝑛⁄

vii

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()