Uploaded by Илана Королева

Development of a Polygonal Finite Element Solver

advertisement
Development of a Polygonal Finite Element Solver and
Its Application to Fracture Problems
A thesis submitted to the Graduate School of the University of Cincinnati in partial
fulfillment of the requirements for the degree of
Master of Science
In the Department of Mechanical and Materials
Engineering of the College of Engineering and Applied
Science
July 2017
By
Mithil Kamble
Bachelor of Technology, VJTI, Mumbai University
2011
Committee Chair: Yijun Liu, PhD
Abstract
This study develops a polygonal finite element solver for 2-D crack propagation simulation along
with a meshing algorithm which creates necessary polygonal mesh.
The work starts with a brief literature review of historical development of computational fracture
mechanics. After reviewing multiple methods employed for modeling fracture problems,
Wachspress formulation is selected for constructing the polygonal finite element solver. Polygonal
interpolants are developed using Wachspress’ framework and validated using published results. A
polygonal meshing algorithm is also developed since conventional finite element meshers do not
support domain meshing using higher order polygons. The meshing algorithm is then used to create
the mesh and input files for the polygonal finite element solver.
The polygonal solver is validated using conventional patch tests. The accuracy and convergence
of the method is assessed using classical solid mechanics problems with known analytical
solutions. Next, ability to include cracks geometrically is added to the meshing algorithm. The
polygonal solver is updated with crack tracking and remeshing capability. A fracture problem is
solved using the developed subroutines.
i
ii
Acknowledgements
I would like to express my gratitude to Dr. Yijun Liu whose patient guidance and mentoring has
made this thesis possible. He has always been very supportive and encouraging throughout my
journey in the University of Cincinnati.
A special thanks to Dr. Vemaganti whose various courses provided me insights which have proved
be very helpful. I would also like to thank Dr. Woo Kyun Kim for agreeing to be on the defense
committee.
I would be remiss to not mention all my friends from the CAE Research Lab, Yoshisu Dojo and
Cincinnati who have had to suffer my sense of humor (or lack thereof). I have always found a
listening ear and a helping hand in them whenever it was needed.
I dedicate this thesis to my parents. None of this would be possible without their silent sacrifices.
iii
Table of Contents
1
Introduction ............................................................................................................................. 1
1.1
Background and Motivation ............................................................................................. 1
1.2
Computational Fracture Mechanics ................................................................................. 2
1.3
Crack Propagation Modeling Techniques ........................................................................ 3
1.3.1 Extended FEM (X-FEM) ............................................................................................... 3
1.3.2 Cohesive Zone Model .................................................................................................... 3
1.3.3 Scaled Boundary FEM (SBFEM) .................................................................................. 4
1.3.4 Polygonal FEM (PolyFEM) ........................................................................................... 4
2
1.4
Historical Review of Polygonal Finite Elements ............................................................. 5
1.5
Thesis Organization.......................................................................................................... 6
Shape Functions for Polygonal FEA....................................................................................... 7
2.1
Background ...................................................................................................................... 7
2.2
Development of Polygonal Shape Functions ................................................................... 8
2.3
Essential Properties of Shape Functions .......................................................................... 8
2.4
Barycentric Coordinates and Wachspress Shape Functions .......................................... 10
2.5
Improvements by Dasgupta ............................................................................................ 12
2.6
Algorithm to Calculate Wachspress Shape Functions ................................................... 14
iv
3
2.7
Validation of Formulation .............................................................................................. 15
2.8
Numerical Integration .................................................................................................... 18
Meshing Algorithm for Polygonal Meshes ........................................................................... 19
3.1
Background .................................................................................................................... 19
3.2
Meshing Algorithm ........................................................................................................ 20
3.2.1
Internal Nodes ......................................................................................................... 21
3.2.2
Boundary Nodes...................................................................................................... 22
3.2.3
Corner Nodes .......................................................................................................... 24
3.2.4
Special Case: Transition Nodes .............................................................................. 26
3.2.5
Creating Final Mesh ................................................................................................ 28
3.3
4
5
Polygonal Mesh Results ................................................................................................. 29
Numerical Verification ......................................................................................................... 31
4.1
Background .................................................................................................................... 31
4.2
Patch Test ....................................................................................................................... 32
4.3
First Benchmark Problem: Cantilever Timoshenko Beam ............................................ 35
4.4
Second Benchmark Problem: Circular Hole in a Plate .................................................. 40
4.5
Comments on the Results ............................................................................................... 45
Crack Propagation ................................................................................................................. 47
5.1
Background .................................................................................................................... 47
v
6
7
8
5.2
Including a Crack in the Polygonal Mesh ...................................................................... 48
5.3
Stress Intensity Factor .................................................................................................... 50
5.4
Crack Propagation Results ............................................................................................. 53
Discussion and Conclusion ................................................................................................... 56
6.1
A Summary of the Work ................................................................................................ 56
6.2
Comments on the Meshing Algorithm ........................................................................... 56
6.3
PolyFEA Accuracy and Convergence ............................................................................ 57
6.4
Domains with Multiple Cracks ...................................................................................... 58
6.5
Concluding Remarks ...................................................................................................... 59
Appendix ............................................................................................................................... 60
7.1
Polygonal Meshing Algorithm ....................................................................................... 60
7.2
Mesh Modification to Insert a Crack.............................................................................. 77
Bibliography ......................................................................................................................... 83
vi
List of Figures
Figure 2.1: (a) Adjoint of a polygon (b) Meyers expressed Wachspress Shape Functions in terms of areas formed by
nodes and internal points ............................................................................................................................................10
Figure 2.2: Numbering convention for nodes and sides of a polygon ..........................................................................14
Figure 2.3: Standard polygons used to derive shape functions ...................................................................................15
Figure 2.4: 3D plots of (a) P5 element, (b)-(f) shape functions 𝑁1- 𝑁5 .......................................................................16
Figure 2.5: Figure 2.4: 3D plots of (a) H6 element, (b)-(g) shape functions 𝑁1- 𝑁6....................................................17
Figure 2.6: Using triangular gaussian quadrature for integration ..............................................................................18
Figure 3.1: In a structured mesh, number of neighboring nodes is limited to six (as is the case with node 5) ............20
Figure 3.2: Centroids of original elements serve as nodes ...........................................................................................21
Figure 3.3: New nodes are created along the boundary to form pentagons ...............................................................23
Fig 3.4: Figure 3.4: Pentagon is formed around corner nodes with three neighbors...................................................24
Figure 3.5: Quadrilateral is formed around corner nodes with three neighbors .........................................................24
Figure 3.6: An ABAQUS mesh of a quarter model of plate with a hole contains a ‘transition node’ along .................26
Figure 3.7: A hexagon is formed around a transition node .........................................................................................26
Figure 3.8: The final mesh is a combination of quadrilateral, pentagonal and hexagonal elements ..........................28
Figure 3.9: Polygonal mesh of a plate with a hole with 81 and 8385 elements respectively ......................................29
Figure 3.10: Polygonal mesh of a beam with 63, 276 and 1111 elements respectively ..............................................30
Figure 4.1: Patch test problem configuration ..............................................................................................................32
Figure 4.2: Element patches used for testing (a) T3, (b) Q4, (c) P5 and (d) H6 elements ............................................33
Figure 4.3Representative displacement and stress contours obtained from the patch tests ......................................33
Figure 4.4: Timoshenko beam problem configuration .................................................................................................35
Figure 4.5: Polygonal meshes of the beam with mixed polygonal elements ...............................................................36
Figure 4.6: Contour plots axial stress σ_xx for mixed polygonal meshes ....................................................................37
vii
Figure 4.7: Convergence of maximum vertical displacement ......................................................................................38
Figure 4.8: Convergence of maximum σ_xx .................................................................................................................39
Figure 4.9: Convergence of L2-norm of relative error for u_y......................................................................................39
Figure 4.10: Circular hole in a plate, problem configuration .......................................................................................40
Figure 4.11: Polygonal meshes of the plate with mixed polygonal elements ..............................................................41
Figure 4.12: Magnified view of σ_xx contour around the hole ....................................................................................42
Figure 4.13: Convergence of maximum σ_xx ...............................................................................................................44
Figure 4.14: Convergence of L2-norm of relative error for σ_xx ..................................................................................44
Figure 4.15: Smoothening stress contours ...................................................................................................................45
Figure 5.1: Mode-I center crack propagation problem configuration .........................................................................47
Figure 5.2: (a) Crack propagation as modeled in modified natural (b): Modified polygonal mesh with seam which
would work for linear convex polygons (solid dots are overlapping nodes, whereas terminal dots are crack tips) ....48
Figure 5.3: Polygonal mesh created for crack propagation problem. The mesh is sufficiently refined around the crack
tip and along the expected propagation path. ............................................................................................................49
Figure 5.4: Crack tip coordinate system and nodes used to calculate SIF....................................................................50
Figure 5.5: Mesh transition during at successive steps during crack propagation ......................................................53
Figure 5.6: σ_yy contours Crack propagation at various loading steps .......................................................................54
Figure 6.1: A domain containing multiple randomly oriented cracks (Liu, 2017) juxtaposed with a structured focused
mesh created for a center crack problem in this study ................................................................................................58
viii
List of Tables
Table 4.1: L2-norm of the relative errors for the solutions obtained from the patch tests .........................................34
Table 4.2: % absolute errors in maximum u_y for Timoshenko beam problem ..........................................................38
Table 4.3: % absolute errors in maximum σ_xx ...........................................................................................................43
Table 5.1: Table developed by Isida to calculate SIF in finite plates ............................................................................52
ix
1 Introduction
1.1 Background and Motivation
Galileo Galilei’s diary reveals he conducted an experiment to test strength of iron wires of different
lengths in 16th century [1]. Although his observations revealing inverse relation between length of
the wire and its length carrying capacity would have to wait for a few centuries before being
understood completely, his experiment shows that researchers have tried to quantify strength of
engineering materials for a very long time. Newton’s achievement in the field of calculus spurred
research activity in the field of continuum mechanics. Classical solid mechanics framework
developed in a century after Newton forms the backbone of current understanding of strength of
materials.
Fracture mechanics has always been of great interest to researchers who try to quantify strength of
materials. Failure of various structures due to fracture has incurred loss of several billion dollars
in the USA alone [3] . Apart from the structural integrity perspective, understanding crack
propagation is vital for various conventional energy industries which use hydraulic fracturing [4].
Since the advent of computational solid mechanics techniques in the last century, fracture
mechanics has received even greater attention. With increasing computational abilities of local
computers and clusters, simulating complex crack problems which find applications in many
engineering fields is now possible.
The long-term objective of this study is to develop a capability to simulate crack propagation in
domain containing multiple randomly oriented cracks.
1
1.2 Computational Fracture Mechanics
Various approaches to model fracture mechanics problems at various time and length scales have
been proposed over the years. Many of the approaches employ finite element algorithm to simulate
crack propagation which was conceived in 1950s [4] and gained traction in 1970s. The approaches
to model fracture behavior can be broadly categorized in two groups based on representation of
the cracks in domains [5].
The first group consists of methods which model cracks geometrically in the model. In this group,
the crack propagation can either be prescribed or arbitrary. Often the crack is modeled as edges of
elements in finite element simulations, it is an instance of prescribed crack propagation model.
Arbitrary crack propagation is supported in several recent approaches like meshless methods [7],
boundary element methods [8] and adaptive finite element methods [9]. Arbitrary crack
propagation methods have gained popularity recently due to increased computational capabilities
[10].
In the second broad category, the cracks are not represented geometrically but rather through
modification of constitutive relation or kinematic relation. Representing crack through constitutive
relations became popular after inception of smeared crack approach where softening parameters
are included in constitutive relation to represent the weakening of material due to cracks [10].
Recent developments in this category include representation of crack propagation using evolving
phase fields [11]. Kinematic representation of crack can be done in finite element methods by
modifying the shape function formulation. Extended finite element method is an instance of
kinematic representation where enrichment function is added to interpolants to represent a crack
[12].
2
In the following section, we briefly discuss various fracture modeling methods considered for this
study.
1.3 Crack Propagation Modeling Techniques
1.3.1 Extended FEM (X-FEM)
Belytschko et al [13] proposed a technique called X-FEM wherein crack could be
represented independently of the mesh. The crack tip elements are enriched with special
functions which can capture singular stress fields around the crack tip. Discontinuity in the
displacement field is captured by level set method.
X-FEM has gained popularity due to elegant way of representing crack which completely
avoids computationally expensive remeshing. However, the method becomes
computationally expensive for multiple crack propagation problems as multiple level sets
are required to track each crack separately.
1.3.2 Cohesive Zone Model
Cohesive zone models were first conceptualized by Dugdale [14]. In this approach, a layer
of cohesive elements is inserted along the propagation path. A traction separation governs
the cohesive element behavior where traction reaches a peak during loading and reduces
beyond peak gradually to zero, representing weakening of material and complete
separation due to presence of crack.
Cohesive zone model allows for arbitrary crack propagation without modifying underlying
formulation like X-FEM or mesh like adaptive techniques. However, the crack always
3
propagates along element edges only. Hence cohesive model would have to be sufficiently
refined to simulate propagation of multiple cracks.
1.3.3 Scaled Boundary FEM (SBFEM)
Scaled boundary finite element method proposed by Song et al [15] offers computational
advantage by reducing a spatial dimension of the problem. It offers semi-analytical solution
which is continuous along the radial direction. This enables SBFEM to capture singular
fields around crack tip with a relatively coarse mesh.
SBFEM stiffness matrices are dense and involve analytical equations. The expressions to
retrieve stress and strain are complex compared to other methods like X-FEM or
conventional FEM.
1.3.4 Polygonal FEM (PolyFEM)
Wachspress’ work in 1970s exploring properties of barycentric coordinates in 1970s [16]
paved the way for development of polygonal finite element methods. Wachspress
generalized barycentric coordinates for polygons and polyhedrons are essentially finite
element interpolants [17] which can reproduce high gradient stress fields accurately.
As the remeshing algorithm is not constrained by the order of element after it is split, the
remeshing algorithm can be greatly simplified. Moreover, polygonal shape functions can
be directly implemented in conventional finite element algorithms. Therefore, PolyFEM
presents a promising prospect for simulating multiple crack propagation problems.
4
1.4 Historical Review of PolyFEM
In the last decade generalized barycentric coordinates have received attention initially due to their
application in computer graphics [17]. Soon they were employed in finite elements as interpolants.
Wachspress presented rational shape functions in his seminal work [16] which eventually started
a spur of research activity and many equivalent formulations like Floater’s mean value coordinates
[18], Sibson coordinates [19], Laplace coordinates [20] were presented. With continued research
interest over past two decades, PolyFEM is a well-established field which fiends application in
topology optimization, mesh generation and fracture mechanics [17]. Voronoi cell finite element
method was one of the earliest efforts to extend polygonal interpolants to finite element framework
[21] .
We select PolyFEM to explore crack propagation problem principally due to flexibility of
remeshing algorithm and its ability to seamlessly merge with existing finite element framework.
PolyFEM interpolants, once derived, can be integrated like conventional finite element
interpolants to derive strain displacement matrices and assembled in global stiffness matrix. This
provides us with an opportunity to start with a routine finite element code and incrementally add
increasingly higher order polygons to the solver without altering underlying framework.
For the present work, we used Wachspress rational shape functions for linear, convex polygons
due to the simplicity of formulation. Dasgupta [22] has improved on the original Wachspress
formulation, greatly simplifying the original expression by reducing it to an iterative process of
linear equation multiplication. The details of the formulations will be discussed in the next chapter.
5
1.5 Thesis Organization
After this brief review, we proceed to the formulation, development and validation of a polygonal
finite element solver along with complimenting meshing algorithm. The developed solver would
be eventually used to simulate a crack propagation problem.
Following is a brief description of each of the chapters
Chapter 2 contains underlying mathematical formulation of Wachspress shape functions

Chapter 3 discussed meshing algorithm created to form polygonal meshes

Chapter 4 validates PolyFEM algorithm with convergence study

Chapter 5 includes an example of PolyFEM application to crack propagation problem

Chapter 6 discusses results and proposes modifications for future research

Chapter 7 contains an appendix of the polygonal meshing algorithm

Chapter 8 contains Bibliography
6
2 Shape Functions for PolyFEM
2.1 Background
Courant developed a procedure to construct approximate solution on an arbitrary domain with
supports on contagious triangles [23]. Triangular shape functions can approximate fields in
problems governed by potentials in the form of Laplace equation. Furthermore, approximating
complex shapes is easy with tessellation. Hence triangular elements are still widely used despite
reported issues in the accuracy. Taig introduced quadrilateral elements with quadratic shape
functions with aim of improving accuracy [24]. These two elements have been the backbone of
commercial packages since their inception. Concentrated efforts have made codes with the
conventional elements quite efficient. However, a systematic approach to extend and
commercialize the present formulation to polygonal elements seems to be lacking despite their
unique advantages.
Polygonal elements exhibit greater accuracy over conventional elements. They are less likely to
exhibit mesh locking. Furthermore, they enable flexibility in re-meshing procedure which could
be a significant factor in large deformation and crack propagation problems. Their unique
properties have prompted renewed developmental efforts. Recently a biomechanical model of an
eye was developed using polygons with 200 sides
[24]. Apart from finite elements, the
development of polygonal elements is of interest in diverse fields like computer graphics and
geometric modeling.
7
2.2 Development of Polygonal Shape Functions
Construction of shape functions necessary to calculate fields in polygonal region was the principal
problem which prevented development of polygonal elements. Wachspress achieved a
breakthrough by presenting a framework to generate shape functions for convex polygons with
any number of sides. The method enables generation of any arbitrary complex polygon with a
single subroutine. Warren extended the methodology to handle polyhedral volumes [26].
Sibson used Sibson coordinates to formulate polygonal shape functions [19]. More recently efforts
by Floater et al [18] as well as Sukumar et al [17] have resulted in formulations using mean value
and maximum entropy coordinates. Despite simplicity of the method, Wachspress’ shape functions
have received little attention. Algebraic nature of the equations has prevented researchers, who
predominantly work with C, C++ and Fortran, from developing the polygonal codes. Dasgupta has
developed an alternate methodology to compute Wachspress shape functions and developed a code
using symbolic mathematical package [22]. We intend to develop a code using Wachspress’ shape
functions and implement in a conventional FEA code using method developed by Dasgupta.
2.3 Essential Properties of Shape Functions
Let 𝛺 → 𝑅 2 be a 2D polygonal domain defined by 𝑛 interconnected nodes and corresponding
nodal coordinates (𝑥𝑖 , 𝑦𝑖 ). The shape functions 𝑁𝑖 map the scalar function 𝑢(𝑥) within the
domain. The shape functions map the scalar field using nodal values of scalar function, 𝑢𝑖 (𝑥). For
any arbitrary point ( 𝑥 , 𝑦 ) the interpolation can be represented as,
𝑛
𝑢ℎ (𝑥) = ∑ 𝑢𝑖 (𝑥) 𝑁𝑖 (𝑥)
𝑖=1
8
(0.1)
The shape functions must possess partition of unity to ensure that 𝑁𝑖 is non-negative and the rigid
body motion is accurately represented. Therefore,
𝑛
∑ 𝑁𝑖 (𝑥) = 1
(0.2)
𝑖=1
To reproduce nodal function values exactly and ensure that the interpolated values are bound
within the minimum and maximum of the nodal values, shape functions must have Kronecker delta
property. Hence,
𝑁𝑖 (𝑥𝑗 ) = 𝛿𝑖𝑗
(0.3)
For the scheme to be convergent, it is required that the first derivative of shape functions should
be at least continuously differentiable, i.e., they should be linearly complete. This condition can
be expressed as,
𝑛
∑ 𝑁𝑖 (𝑥)𝑥𝑖 = 𝑥
(0.4)
𝑖=1
These conditions in conjunction impose constraints on the formulation which must be followed to
develop a consistent finite element framework which can produce bounded and convergent results.
9
2.4 Barycentric Coordinates and Wachspress Shape Functions
(a)
(b)
Figure 2.1: (a) Adjoint of a polygon (b) Meyers expressed Wachspress Shape Functions in terms of areas formed by
nodes and internal points
For a polygonal domain
𝛺 → 𝑅 2 with 𝑛 interconnected nodes and corresponding nodal
coordinates (𝑥𝑖 , 𝑦𝑖 ), Barycentric or area coordinates are defined using weights with 𝑤𝑖 (𝑥) defined
over the region. Essential properties of Barycentric coordinates are partition of unity, linear
completeness and Kronecker Delta property. In finite element framework, Barycentric coordinates
are equivalent to shape functions. Therefore, Barycentric coordinates can be used to construct
shape functions in Galerkin methods. Barycentric coordinates are often expressed asф𝑖 (𝑥) =
𝑤𝑖 (𝑥)
𝑛
∑𝑗=1 𝑤𝑗 (𝑥)
(0.5)
Wachspress was the first person to construct rational shape functions using Barycentric
coordinates. As the shape functions are represented in the form of division of different polynomials
10
they are called rational shape functions. Wachspress shape functions for a polygon with 𝑛 nodes
take following form,
𝑁𝑖 (𝑥) =
ℙ𝑛−2 (𝑥)
ℙ𝑛−3 (𝑥)
(0.6)
Numerator ℙ𝑛−2 (𝑥) in the equation is proportional to the product of the line equation of the edges
excluding the two edges common to the node 𝑖. The denominator ℙ𝑛−3 (𝑥) is equation of the curve
passing through external intersection points (EIP), also known as adjoint of polygon (Fig 2.1 a).
EIP are the points formed by intersection of element edges when they are extended beyond nodes.
Determining adjoint of the polygon is non-trivial and a major hurdle in the formulation of
Wachspress shape functions.
Meyer et al developed the Wachspress formula further and demonstrated that the Wachspress
shape functions can be expressed in terms of areas formed by internal points and nodes (Meyer et
al 2002). Expression for shape functions obtained by Meyer is as follows,
𝑁𝑖 (𝑥) =
𝑤
̂ 𝑖 (𝑥)
𝑛
∑𝑗=1 𝑤
̂𝑗 (𝑥)
(0.7)
𝐴(𝑝𝑖 , 𝑝𝑗 , 𝑝𝑘 )
(0.8)
where,
𝑤
̂ 𝑖 (𝑥) =
𝐴(𝑝, 𝑝𝑖 , 𝑝𝑗 )𝐴(𝑝, 𝑝𝑗 , 𝑝𝑘 )
and, 𝐴(𝑝, 𝑝𝑗 , 𝑝𝑘 ) represents area formed by triangle (𝑝, 𝑗, 𝑘) etc. (Fig 2.1 b)
11
2.5 Improvements by Dasgupta
Dasgupta recognized that by imposing the condition that shape functions should behave linearly
on the boundaries, it is possible to come up with a general formula which can be implemented in
a single subroutine to calculate shape functions for any general convex polygon. The approach
developed by Dasgupta is summarized next.
Consider a convex n-gon 𝛺 → 𝑅 2 with the origin contain within its domain. The equation of
sides 𝑖 can be denoted by 𝑙𝑖 (𝑥, 𝑦). Since the origin is contained within the polygon, the general
equation of line can be expressed as,
𝑙𝑖 = 1 − 𝑎𝑖 𝑥 − 𝑏𝑖 𝑦 = 0
where,
and,
𝑎𝑖 =
𝑦𝑖 − 𝑦𝑖−1
𝑥𝑖−1 𝑦𝑖 − 𝑥𝑖 𝑦𝑖−1
(0.9)
𝑏𝑖 =
𝑥𝑖 − 𝑥𝑖−1
𝑥𝑖−1 𝑦𝑖 − 𝑥𝑖 𝑦𝑖−1
(0.10)
It is also worth noting that the polygonal domain is defined by, 𝛺 = ∪ { 𝑙𝑖 (𝑥, 𝑦) > 0} The
numerator is proportional to product of all 𝑙𝑖 (𝑥, 𝑦) excluding the two sides which contain the
node 𝑖. This ensures that the shape function vanishes on the all the other nodes. Therefore, the
shape function 𝑁𝑖 can be expressed as,
𝑗=𝑛
𝑁𝑖 ∝ ∏ 𝑙𝑗 (𝑥, 𝑦)
𝑗 ≠𝑖
𝑗 ≠𝑖+1
Weighting function 𝜙𝑖 (𝑥, 𝑦) can be introduced to obtain the following equation,
12
(0.11)
𝑗=𝑛
(0.12)
𝑁𝑖 = 𝜙𝑖 (𝑥, 𝑦) ∏ 𝑙𝑗 (𝑥, 𝑦)
𝑗 ≠𝑖
𝑗 ≠𝑖+1
To satisfy partition of unity we would need to find out all the 𝜙𝑖 (𝑥, 𝑦). However, if we introduce
scalar weights 𝑘𝑖 such that,
(0.13)
𝜙𝑖 (𝑥, 𝑦) = 𝑘𝑖 𝜙0 (𝑥, 𝑦)
The problem is now reduced to finding a 𝜙0 (𝑥, 𝑦) and scalars 𝑘𝑖 . And we have,
𝑗=𝑛
∑ 𝑘𝑖 ∏ 𝑙𝑗 (𝑥, 𝑦)
𝑛
(
𝑗 ≠𝑖
𝑗 ≠𝑖+1
=
1
𝜙0
(0.14)
)
And the expression for the shape function is,
𝑗=𝑛
𝑘𝑖
𝑁𝑖 =
∏ 𝑙𝑗 (𝑥, 𝑦)
𝜙0
(0.15)
𝑗 ≠𝑖
𝑗 ≠𝑖+1
Dasgupta used the linear behavior of shape functions on the sides of polygon to arrive at a generic
formula which can be recursively used to calculate values of 𝑘𝑖 . The value 𝑘1 is assumed to be 1
without loss of generality. To behave linearly on the sides,
𝑎𝑖+1( 𝑥𝑖−1 − 𝑥𝑖 ) + 𝑏𝑖+1( 𝑦𝑖−1 − 𝑦𝑖 )
𝑘𝑖 = 𝑘𝑖−1 (
),
𝑎𝑖−1( 𝑥𝑖 − 𝑥𝑖−1 ) + 𝑏𝑖−1( 𝑦𝑖 − 𝑦𝑖−1 )
13
𝑘1 = 1
(0.16)
With this basic framework, it is possible to code a single subroutine which can calculate shape
functions for an arbitrary convex polygon with any number of sides.
2.6 Algorithm to Calculate Wachspress Shape Functions
In a convex n-gone, 𝑛 vertices are defined by coordinates (𝑥1, 𝑦1 ), (𝑥2, 𝑦2 ), … . (𝑥𝑛, 𝑦𝑛 ). Vertices are
numbered in counterclockwise direction. Vertices (𝑖 − 1) and 𝑖 form the edge 𝑆𝑖 . Its equation is
given by equation (2.9). The required coefficients are calculated using equations (2.10), (2.11)
and (2.17).
Figure 2.2: Numbering convention for nodes and sides of a polygon
Numerator of the shape function 𝑁𝑖 is given by,
𝑗=𝑛
𝑁𝑢𝑚𝑖 = 𝑘𝑖 ∏ 𝑙𝑗 (𝑥, 𝑦)
𝑗 ≠𝑖
𝑗 ≠𝑖+1
14
(0.17)
And 𝑘𝑖 is calculated using equation 3. When all the coefficients and weights are found, the
Wachspress shape functions can be calculated using the formula,
𝑁𝑖 (𝑥, 𝑦) =
𝑁𝑢𝑚𝑖
∑ 𝑁𝑢𝑚𝑖
(0.18)
This general formula is applicable to all general polygons with 𝑛 ≥ 3.
2.7
Validation of Formulation
Figure 2.3: Standard polygons used to derive shape functions
The Mathematica subroutine was implemented and tried with conventional elements the results
with for T3 elements reduce to conventional FEA triangular shape functions. The results for a
general triangle and a standard bilinear quadrilateral element with origin at the center match the
conventional T3 and Q4 shape functions respectively.
The results for the pentagonal and hexagonal elements cannot be verified as no parallel exists in
established FEA formulation. The expressions become increasingly involved as the number of
edges increases and it could pose a problem in efficient implementation of the code. Hence it is
15
necessary to parameterize the equations so that a standard form for each polygon can be used which
can later be mapped to physical polygon to extract the fields. Expressions for shape function and
their contour plots for standard pentagon and hexagon are given ahead.
For a pentagon with vertices at (1, 1), (0, 2), (-1, 1), (-1, -1), (-1, 1):
N1 = −
N3 = −
N5 =
(1+x)(2+x−y)(1+y)
2(−7+x2 +2y)
,
N2 =
(−1+x)(1+y)(−2+x+y)
2(−7+x2 +2y)
,
(−1+x2 )(1+y)
−7+x2 +2y
N4 = −
(−1+x)(2+x−y)(−2+x+y)
2(−7+x2 +2y)
(2.20)
(1+x)(2+x−y)(−2+x+y)
2(−7+x2 +2y)
Figure 2.4: 3D plots of (a) P5 element, (b)-(f) shape functions 𝑁1 - 𝑁5
16
For a hexagon with vertices at (1, 1), (0, 2), (-1, 1), (-1, -1), (0, -2), (-1, 1):
N1 =
N3 =
(1+x)(−2+x−y)(2+x−y)(2+x+y)
4(−12+3x2 +y2 )
,
N2 = −
(−1+x)(−2+x−y)(−2+x+y)(2+x+y)
,
4(−12+3x2 +y2 )
N5 = −
(−1+x)(1+x)(2+x−y)(−2+x+y)
2(−12+3x2 +y2 )
,
N4 =
N6 =
(−1+x)(1+x)(−2+x−y)(2+x+y)
2(−12+3x2 +y2 )
(−1+x)(−2+x−y)(2+x−y)(−2+x+y)
4(−12+3x2 +y2 )
(1+x)(2+x−y)(−2+x+y)(2+x+y)
4(−12+3x2 +y2 )
Figure 2.5: Figure 2.4: 3D plots of (a) H6 element, (b)-(g) shape functions 𝑁1 - 𝑁6
17
,
,
(0.19)
2.8
Numerical Integration
Figure 2.6: Using triangular gaussian quadrature for integration
Numerical integration over polygonal domains is a critical step in polygonal finite element
procedure. Gaussian quadrature rules for triangular domains are well developed. However, their
extension for polygons is not trivial and a general framework to numerically integrate polygonal
domains is lacking. Therefore, already existing quadrature rules are frequently used in polygonal
finite element [29].
A convex polygon can be partitioned in triangles and an affine mapping transforms the physical
element triangles into a reference triangle. Isoparametric mapping can be used to find location of
Gaussian quadrature points in the physical element. The summation of evaluated values from each
triangle yields results for polygon,
𝑛
∫ 𝑓 𝑑𝛺 = ∑ ∫ 𝑓 |J𝑖 |𝑑𝛺
𝛺
𝑖=1 𝛥𝑖
High accuracy Gaussian quadrature rules developed by Dunavant are used in this study to perform
numerical integration (Dunavant , 1985).
18
3 Meshing Algorithm for Polygonal Meshes
3.1 Background
Algorithms to create conventional triangular or quadrilateral meshes over two dimensional
domains have been well researched and adopted in commercial finite element packages. However,
due to absence of widely used polygonal finite element solvers, creating polygonal finite element
meshes remains a relatively unexplored problem. Although algorithms used in the domain of
computer graphics often use polygons for topology optimization, their utility in creating polygonal
finite element meshes is limited. A self-contained Matlab® subroutine which creates polygonal
meshes has been developed by Talischi et al [31] . The subroutine uses Voronoi diagram in
conjunction with signed distance function to create polygonal mesh over several standard twodimensional domains. However, the lack of control over maximum permissible number of polygon
edges made the code unsuitable for this study.
To overcome the limitations, a Matlab® subroutine was developed which creates linear convex
polygonal mesh (limited till hexagon) using a structured linear triangular mesh. Following subsections discuss the general algorithm implemented and present few meshes created using the
subroutine. The Matlab code has been included in the appendix for reference.
19
3.2 Meshing Algorithm
Figure 3.1: In a structured mesh, number of neighboring nodes is limited to six (as is the case with node 5)
Pre-processing algorithm:




Read the input file containing structured linear triangular mesh
Store nodal coordinates and connectivity in x and node respectively
Loop through the nodes to construct num_of_neighbors and neighbor_list
Store centroidal coordinates of each element in poly_x, centroids will be nodes
in the polygonal mesh.
The meshing algorithm essentially uses centroids of the triangular elements shared by one node as
nodes of the polygonal mesh (Fig 2.1). Therefore, the maximum number of edges a polygon can
have is limited by the number of elements shared by individual nodes. In a structured triangular
mesh node shares maximum of six elements only. This automatically ensures that the polygonal
mesh generated will be limited to hexagons.
20
Forming a structured triangular mesh for most of the regular geometries is trivial and can be done
using any of the commercial finite element packages. In this study, the subroutine is designed to
read ABAQUS input file which contains a single instance of two-dimensional domain.
The subroutine runs different operations on nodes which are classified according to the number of
neighbors. Discussion on the different loops follows.
3.2.1 Internal Nodes
Figure 3.2: Centroids of original elements serve as nodes
Forming hexagons in the interior:

for k = 1: number interior_nodes
o Determine six elements which are shared by the node
o Update H6_node with the number of elements common to the node
(*no new nodes are created)
21
Nodes having six neighboring nodes are stored in the array interior_nodes. A loop runs through
the array and constructs hexagonal connectivity array H6_node by splitting elements which are
shared by the internal nodes. The element numbers of in the old mesh become node numbers in
the polygonal mesh. Most of the nodes in a large structured mesh are internal nodes, hence the
polygonal mesh created using this algorithm would be predominantly populated with hexagonal
elements.
3.2.2 Boundary Nodes
Forming pentagons along the edges:

for k = 1: number boundary_nodes
o Determine three elements which are shared by the node
o Create two new nodes at the midpoints of the element edges which lie
along the boundary
o Update poly_x with two newly created nodes
o Update P5_node with the number of elements shared by the node and
newly created node numbers
22
Figure 3.3: New nodes are created along the boundary to form pentagons
Nodes having five neighboring nodes are stored in the array boundary_nodes. Pentagons must be
formed around these nodes to form a smooth domain boundary. Each boundary node is shared by
three elements; hence three centroidal points are available to form a pentagon. The remaining two
points are obtained by splitting the two element edges which form the boundary of the domain. A
loop iterates this process and created a pentagonal nodal connectivity array P5_node.
23
3.2.3 Corner Nodes
Fig 3.4: Figure 3.4: Pentagon is formed around corner nodes with three neighbors
Figure 3.5: Quadrilateral is formed around corner nodes with three neighbors
24
Processing elements at the corners:

for k = 1: number corner_nodes
o Determine the number of neighbors the node has
if Neighbors = 2
 Identify two nodes created along corner edges of the element
while forming pentagons along the edge
 Create third node at the corner of the domain
 Update poly_x with newly created node
 Update Q4_node with the element number of the element at
the corner, identified edge nodes and newly created node
number
if Neighbors = 3
 Identify two nodes created along corner edges of the
elements while forming pentagons along the edge
 Create third node at the corner of the domain
 Update poly_x with newly created node
 Update P5_node with the number elements shared by corner
node, identified nodes and newly created node number
Nodes having three or fewer number of neighbors are stored in the array corner_nodes. The
corners would be split in either pentagons or quadrilaterals depending upon the number of
neighbors. A loop runs through the corner node array and forms appropriate polygon. As this
operation is performed after processing interior and edge nodes, no new nodes are formed. The
loop identifies nodes which were created earlier by splitting element edges which form the corners.
This avoids creation of duplicate nodes in the polygonal mesh. The corner node coordinates are
appended to poly_x to complete the re-meshing operation.
25
3.2.4 Special Case: Transition Nodes
Figure 3.6: An ABAQUS mesh of a quarter model of plate with a hole contains a ‘transition node’ along
Figure 3.7: A hexagon is formed around a transition node
26
Forming hexagons around transition nodes:

for k = 1: number transition_nodes
o Determine four elements which are shared by the node
o Identify two nodes created along boundary edges of the elements while
forming pentagons along the edge
o Update H6_node with the number elements shared by transition node,
and identified nodes
(*no new nodes are created)
Even while processing structured mesh, it is not possible to exclude all the irregularities. Especially
if the geometries include curved features like internal holes or cracks. The most common feature
of the meshes involving circular features is a line along which the diagonals of the triangular
element switch orientation. Intersection of such a line with curved boundary includes nodes which
have five neighboring nodes. A separate loop identifies such nodes and stores them in the array
transition_nodes. A loop running through this array adds hexagons to the array H6_node. Since
this is the last element formation loop to be executed, no new nodes are created here as well.
27
3.2.5 Creating Final Mesh
Figure 3.8: The final mesh is a combination of quadrilateral, pentagonal and hexagonal elements
Post-processing



Combine the arrays Q4_node, P5_node and H6_node in a nodal
connectivity matrix poly_node
Arrange the nodes of all the elements in counterclockwise direction
Create text file output which will be input to the PolyFEM solver with
appropriate boundary conditions
After all the nodes have been processed all the separate connectivity are combined in the array
poly_node which is the final nodal connectivity matrix. The subroutine loops through the
polygonal elements and re-arranges the nodes in counter-clockwise direction by calculating
individual angles relative to centroid of the elements. The subroutine also has provision to impose
28
displacement boundary condition as well as traction boundary conditions at pre-specified
locations. The mesh data and boundary condition data is written to a text file which will be read
by the PolyFEM solver as input.
3.3 Polygonal Mesh Results
Following are some results created using the meshing subroutine.
Figure 3.9: Polygonal mesh of a plate with a hole with 81 and 8385 elements respectively
29
Figure 3.10: Polygonal mesh of a beam with 63, 276 and 1111 elements respectively
30
4 Numerical Verification
4.1 Background
Patch tests have been conventionally used to assess accuracy and robustness of conventional finite
element codes [32]. Taylor et al [32] have shown patch tests to be necessary and sufficient
condition to ensure convergence of the method.
However, patch test might not be an ideal criterion to ascertain accuracy of polygonal element
formulation. Polygonal shape functions are often higher order polynomials which are integrated
over non-standard areas. As the numerical integration techniques do not exist for higher polygons,
the accuracy of the results is often compromised, unless specialized quadrature rules of high order
are used. Talischi et al [34] have demonstrated that polygonal elements often do not pass the patch
test owing to quadrature errors. Therefore, we have relied on simple patch tests only to ensure
numerical accuracy of the algorithm. Standards solid mechanics problems with known analytical
solutions were used to ensure convergence of the method.
Linearly elastic material behavior has been assumed for all the analyses presented henceforth.
Young’s modulus 𝐸 is set to be unity, whereas Poisson’s ratio 𝜈 is set at 0.3. All the problems have
been solved assuming plane stress conditions.
The convergence of the solution is assessed by calculating L2-norm of relative error of nodal
solutions. Following expression is used to calculate the L2-norm,
31
∑(𝜙𝑒𝑥𝑎𝑐𝑡 − 𝜙𝑐𝑎𝑙𝑐 )2
𝐿2 − 𝑛𝑜𝑟𝑚 = √
,
∑(𝜙𝑒𝑥𝑎𝑐𝑡 )2
(4.1)
where, 𝜙 is the calculated field variable under consideration.
4.2 Patch Test
For the patch test, a bi-linear plate is constrained with a roller support and a fixed node at one edge
while applying unit normal traction on the opposite edge (Fig 4.1). The patch should exactly
reproduce unit constant stress field in the loading direction and the analytical displacement fields
defined by𝑢𝑥 = 𝑥
(4.2)
𝑢𝑦 = −𝜈𝑦
(4.3)
As the polygonal elements cannot be represented in a square, they cannot be tested individually.
Hence, triangular elements are combined with polygonal elements to form a square patch. Element
patches depicted ahead (Fig 4.2) are used to run the patch test.
Figure 4.1: Patch test problem configuration
32
(a)
(b)
(c)
(d)
Figure 4.2: Element patches used for testing (a) T3, (b) Q4, (c) P5 and (d) H6 elements
Figure 4.3Representative displacement and stress contours obtained from the patch tests
33
L2 norm of relative
L2 norm of relative
error: ux
error: uy
Linear triangular element (T3)
1.7554 e-016
6.7738 e-016
Linear quadrilateral element(Q4)
3.0361 e-014
2.6048 e-014
Linear pentagonal element (P5)
2.7378 e-007
3.2418 e-007
Linear hexagonal element (H6)
2.0819 e-014
2.4022 e-014
Patch test
Table 4.1: L2-norm of the relative errors for the solutions obtained from the patch tests
The patch tests were able to reproduce constant stress fields linerly varying displacement fields.
Table 4.1 lists the error norms for nodal displacemnts. The error norm for the patch test of
pentagonal element was relatively higher compared to the other elements. The higher error can be
attributed to asymmetric nature of the pentagoanl element.
34
4.3 First Benchmark Problem: Cantilever Timoshenko Beam
Figure 4.4: Timoshenko beam problem configuration
Cantilever beam problem is a widely used to evaluate capabilities of finite element algorithms.
Timoshenko et al [35] have provided analytical solution for two-dimensional linearly elastic beam
subjected to quadratic shear tractions at one end. For a beam of length 𝐿 and height 𝐻 the
displacement and stress fields can be expressed analytically as (Augarde, 2008),
𝑃𝑦
𝐻2
2
𝑢𝑥 = −
[(6𝐿 − 3𝑥)𝑥 + (2 + 𝜈) (𝑦 − )]
6 𝐸𝐼
4
𝑢𝑦 = −
𝑃
𝐷2 𝑥
(3𝐿 − 𝑥)𝑥 2 ]
[3𝜈𝑦 2 (𝐿 − 𝑥) + (4 + 5𝜈)
6 𝐸𝐼
4
𝜎𝑥𝑥 =
𝑃(𝐿 − 𝑥)𝑦
𝐼
𝜎𝑦𝑦 = 0
35
(4.4)
(4.5)
(4.6)
(4.7)
𝜏𝑥𝑦
𝑃 𝐻2
= − ( − 𝑦2)
2𝐼 4
(4.8)
where 𝐼 is second moment of area of the beam cross section.
PolyFEA analyses with linear triangular, linear quadrilateral and mixed polygonal elements,
including pentagons and hexagons, were run with increasing mesh refinement. To compare the
performance with conventional finite element algorithms, the same benchmark problem was
simulated in ABAQUS with linear triangular and quadrilateral elements. The polygonal meshes
used and contour plots of axial stress are depicted in the following figures (Figs 4.5 and 4.6).
Figure 4.5: Polygonal meshes of the beam with mixed polygonal elements
36
Table 4.2 shows the absolute % errors in the maximum 𝑢𝑦 values obtained from the analyses. Figs
4.7 and 4.8 show the convergence of maximum 𝜎𝑥𝑥 and 𝑢𝑦 in analyses. L2-norm of vertical
displacement is plotted for PolyFEA analyses run using different element sets (Fig 4.9).
Figure 4.6: Contour plots axial stress σ_xx for mixed polygonal meshes
37
Mesh seed
Mesh seed
Mesh seed
Mesh seed
size: 0.5
size: 0.25
size: 0.125
size: 0.0625
PolyFEA: T3 elements
38.54
14.82
4.199
0.97
PolyFEA: Q4 elements
0.46
0.23
0.17
0.17
PolyFEA: Mixed mesh
12.82
4.31
1.13
0.11
FEA: T3 elements
38.55
14.82
4.20
0.97
FEA: Q4 elements
0.46
0.23
0.18
0.18
Mesh size v/s abs % error 𝒖𝒚
Table 4.2: % absolute errors in maximum u_y for Timoshenko beam problem
Figure 4.7: Convergence of maximum vertical displacement
38
Figure 4.8: Convergence of maximum σ_xx
Figure 4.9: Convergence of L2-norm of relative error for u_y
39
4.4 Second Benchmark Problem: Circular Hole in a Plate
Figure 4.10: Circular hole in a plate, problem configuration
Next, we consider a classic solid mechanics problem of square plate with a circular hole. Existence
of a hole causes stress concentration around the hole, resulting in high gradients in the fields.
Timoshenko et al [35] have provide analytical solution for the problem. Expressions for the
displacement and stress fields in polar coordinates are given below:
𝜎𝑎 𝑟
2𝑎
2𝑎3
𝑢𝑥 (𝑟, 𝜃) = −
[ (𝜅 + 1)𝑐𝑜𝑠𝜃 +
((1 + 𝜅)𝑐𝑜𝑠𝜃 + 𝑐𝑜𝑠3𝜃) − 3 𝑐𝑜𝑠3𝜃]
8𝜇 2
𝑟
𝑟
(4.9)
𝜎𝑎 𝑟
2𝑎
2𝑎3
𝑢𝑦 (𝑟, 𝜃) = −
[ (𝜅 − 3)𝑠𝑖𝑛𝜃 +
((1 − 𝜅)𝑠𝑖𝑛𝜃 + 𝑠𝑖𝑛3𝜃) −
𝑠𝑖𝑛3𝜃] (4.10)
8𝜇 2
𝑟
𝑟3
40
𝜎𝑥𝑥 (𝑟, 𝜃) = 𝜎 − 𝜎
𝑎2 3
3𝑎4
( 𝑐𝑜𝑠2𝜃 + 𝑐𝑜𝑠4𝜃) + 𝜎 4 𝑐𝑜𝑠4𝜃
𝑟2 2
2𝑟
(4.11)
𝑎2 1
3𝑎4
𝜎𝑦𝑦 (𝑟, 𝜃) = −𝜎 2 ( 𝑐𝑜𝑠2𝜃 − 𝑐𝑜𝑠4𝜃) − 𝜎 4 𝑐𝑜𝑠4𝜃
𝑟 2
2𝑟
(4.12)
𝑎2 1
3𝑎4
(
𝑠𝑖𝑛2𝜃
+
𝑠𝑖𝑛4𝜃)
+
𝜎
𝑠𝑖𝑛4𝜃
𝑟2 2
2𝑟 4
(4.13)
𝜏𝑥𝑦 (𝑟, 𝜃) = −𝜎
Quarter model of a bilinear plate with a central hole and width to radius ratio of 20 is modeled for
this purpose. The plate is constrained with roller boundary conditions on the symmetry edges while
applying unit normal traction on the right edge. Results from five different cases with varying
mesh density (Fig 4.11) are presented ahead.
Figure 4.11: Polygonal meshes of the plate with mixed polygonal elements
41
Figure 4.12: Magnified view of σ_xx contour around the hole
42
Mesh size v/s abs %
Mesh grid:
Mesh grid:
Mesh grid:
Mesh grid:
Mesh grid:
error 𝝈𝒙𝒙
4X2
4X4
4X8
8X4
8X8
PolyFEA: T3 elements
39.33
17.00
9.67
6.33
4.00
PolyFEA: Q4 elements
19.3333
4.6667
0.3333
1.3333
1.6667
PolyFEA: Mixed Mesh
41.67
22.33
11.67
7.67
2.67
FEA: T3 elements
39.67
17.00
9.33
6.333
1.0
FEA: Q4 elements
18.67
7.33
3.67
2.0
1.67
Table 4.3: % absolute errors in maximum σ_xx
Table 4.3 shows the absolute % errors in the maximum 𝜎𝑥𝑥 values obtained from the analyses. Fig
4.13 shows the convergence of maximum 𝜎𝑥𝑥 values in analyses. L2-norm of axial stress 𝜎𝑥𝑥 is
plotted for PolyFEA analyses (Fig 4.14).
43
Figure 4.13: Convergence of maximum σ_xx
Figure 4.14: Convergence of L2-norm of relative error for σ_xx
44
4.5 Comments on the Results
PolyFEA algorithm, when used with linear triangular and quadrilateral mesh, yield results which
agree with the results obtained from ABAQUS simulations. The analyses run with P5 and H6
elements show higher errors for coarse meshes. However, they perform better with refined meshes.
This can partially be attributed to the meshing algorithm which creates polygonal meshes where
pentagonal elements are always present along boundaries. Coarse meshes have higher fraction of
pentagonal elements in the mesh. As seen in the patch tests, pentagonal elements perform poorly
owing to the inherent asymmetry. Denser meshes, owing to lower fraction of pentagonal elements,
show improved performance.
Figure 4.15: Smoothening stress contours
Stress contours obtained from mixed polygonal mesh appear to be discontinuous, especially for
coarse meshes. The lack of smoothness in the contours can be attribute to the splitting of polygons
45
in linear triangles to plot contours. The contour fields become increasingly smoother with
refinement. However, some amount of jaggedness at the scale of smallest element size is always
present. The contours can be smoothened using algorithms available in packages like Tecplot.
Hence, the discontinuity in the stress contours does not result from nodal solution, instead from
the lack of availability of packages which can interpolate field variables over polygons.
46
5 Crack Propagation
5.1 Background
In this chapter, we use the PolyFEA code developed to simulate a simple Mode-I (opening) crack
propagation problem. A subroutine is added to the meshing algorithm to represent a horizontal
crack. A simplified re-meshing algorithm, which assumes horizontal crack propagation, is added
to the PolyFEA algorithm which simulates propagation in steps of fixed crack extension length.
Figure 5.1: Mode-I center crack propagation problem configuration
47
A rectangular plate of breadth 2𝑏, height 2𝑐 and a center crack length of 2𝑎 is constrained at the
bottom edge while normal unit tension 𝜎0 is applied on the top edge. A linearly elastic material
with Young’s modulus 100 units, theoretical fracture toughness (𝐾𝐼𝐶 ) 0.4 and Poisson’s ratio 0.3
has been considered with plane stress conditions for the propagation problem. Experimental
solution for the stress intensity factor (SIF) has been compared with the calculated SIF to assess
accuracy of the solution.
5.2 Including a Crack in the Polygonal Mesh
Figure 5.2: (a) Crack propagation as modeled in modified natural (b): Modified polygonal mesh with seam which
would work for linear convex polygons (solid dots are overlapping nodes, whereas terminal dots are crack tips)
As the shape Wachspress shape functions do not included modified formulation to account for the
stress singularities present at the crack tip like XFEM (Belytschko, 1999), cracks must be
represented geometrically in the domain. Formulations like modified natural neighbor interpolants
(Khoei, 2015) and conforming finite elements (Sukumar, 2004) can handle crack propagation
through cracks where crack tip can be present inside element area (Fig 5.2 (a)).
Wachspress shape functions are constrained in the sense that they cannot interpolate fields over
concave polygons. Moreover, since linear polygonal elements are used, crack tip cannot be present
along the element edge as is the case with. To accommodate these limitations, a subroutine
modifies the polygonal mesh by splitting interior hexagonal elements in pentagons by creating a
48
seam along the crack length (Fig 5.2 (b)). Duplicate nodes with traction free boundary conditions
are created along the crack length between crack tips as specified location.
Figure 5.3: Polygonal mesh created for crack propagation problem. The mesh is sufficiently refined around the
crack tip and along the expected propagation path.
To ensure that the mesh is sufficiently refined at the crack tip and expected propagation path, a
biased structured mesh was created in the ABAQUS (Fig 5.3). It should be noted that although
this approach would work for horizontal cracks, inclined cracks would need a different treatment
or a more general meshing algorithm which can handle unstructured meshes resulting from
complex crack geometries.
49
5.3 Stress Intensity Factor
Figure 5.4: Crack tip coordinate system and nodes used to calculate SIF
Presence in cracks in linear elastic materials leads to stress concentration and 1/√𝑟 singularities
in the stress fields around the crack tips [38]. Various analytical expressions are available to
describe fields around the crack tip, most popular of them being expressions derived by
Westergaard [38], Irwin [40] and Williams [41]. The presence of singular fields and corresponding
stress concentration is effectively captured by Stress Intensity Factor (SIF) 𝐾. Therefore, SIF
accuracy is an important parameter to assess accuracy of a crack propagation algorithm.
Leading term of the William’s expansion for dispalcement expression can be used to calculate SIF
[38] -
𝐾𝐼 =
𝐾𝐼𝐼 =
𝜇
2𝜋
√
𝑢𝑦
√1 + 𝜅 𝑟
𝜇
2𝜋
𝑢𝑥
√1 + 𝜅 𝑟
50
√
(5.1)
(5.2)
where, 𝜇 is the shear modulus, whereas, 𝜅 is (3 − 4 𝜈) for plane strain and (3 − 𝜈)/(1 + 𝜈)
for plane stress problems.
The expressions are applicable only to the 𝐾 −dominated region around the crack tip as the region
away from the crack tip is governed by the boundary conditions imposed. Hence, SIF extraction
technique proposed by Chan et al (Chan, 1970) is employed. Essentially, K is calculated at the two
closest nodes to the crack (Fig 5.4) and the values are linearly extrapolated to compute value of
SIF at the crack tip.
Following expression can be used to determine to calculate the crack propagation angle with
respect to local polar coordinates (Fig 5.4) which uses relative magnitudes of SIF to determine
propagation path [38] –
𝜃 = 2 tan−1 (
𝐾𝐼 − √𝐾12 + 8𝐾𝐼𝐼2
)
4𝐾𝐼𝐼
(5.3)
However, we limit the present study to the accurate calculation of SIF and crack propagation with
minimal remeshing. As a domain with horizontal crack is being pulled with normal traction, it can
be intuitively seen that the crack will propagate in horizontal direction. Hence, the remeshing
subroutine added to PolyFEM algorithm tracks crack tip and locates the next node situated at 𝜃 =
0 and shifts the crack tip to the node while splitting the old crack tip node in two if 𝐾𝑒𝑓𝑓 is greater
than 𝐾𝐼𝐶 . Calculated 𝜃 is used to calculate the effective SIF 𝐾𝑒𝑓𝑓 using following expression [38]𝜃
𝜃
𝜃
𝐾𝑒𝑓𝑓 = 𝐾𝐼 𝑐𝑜𝑠 3 ( ) − 𝐾𝐼𝐼 𝑐𝑜𝑠 2 ( ) 𝑠𝑖𝑛 ( )
2
2
2
51
(5.4)
The 𝐾𝐼 values obtained are compared with the SIF obtained from analytical solution. Isida [43]
has derived analytical expressions for a central crack problems which account for relative length
scales of the crack and plate. The general expression for a finite plate with a central crack is
expressed as𝐾 = 𝐹 𝑇 𝜎0 √𝑎
(5.5)
For plate with 𝑎/𝑏 ratio 0.1 and 𝑐/𝑏 ratio 0.5 (Fig 5.1), the value of coefficient 𝐹 𝑇 can be readily
retrieved from the table provided by Isida (Table 5.1)
Table 5.1: Table developed by Isida to calculate SIF in finite plates
For this study, following expression of SIF is used to calculate the analytical values.
𝐾 = 1.175 𝜎0 √𝑎
52
(5.6)
5.4 Crack Propagation Results
Figure 5.5: Mesh transition during at successive steps during crack propagation
53
Figure 5.6: σ_yy contours Crack propagation at various loading steps
A polygonal mesh with 6271 nodes is used to run the crack simulation algorithm. The simulation
is completed in 18 steps and the next step results in complete rupture of the plate. Time taken to
complete the simulation with one compute node on Homer cluster was 61 minutes.
54
The time taken to solve the propagation is quite high compared to other methods like XFEM which
can solve a similar propagation problem of comparable size in a minute on a regular desktop. A
potential reason for high computation time is discussed in following chapter.
The 𝐾𝐼 values obtained differ by 30 % in the worst-case scenario and remain within 10 % for all
the remaining steps. The error in the computed values can be partially attributed to the increase in
the element size as the crack tip moves towards the domain boundary, compounded by limitations
of pentagonal elements discussed in the previous chapter. Furthermore, the linear extrapolation
could add to the error as well. A more complex method involving fitting a quadratic or cubic curve
to greater number of elements near the crack tip could help in this regard.
55
6 Discussion and Conclusion
6.1 A Summary of the Work
In this work, we started with a review of various finite element schemes best suited for crack
propagation problems. Polygonal finite element algorithm was chosen owing to greater flexibility
it offers in the remeshing algorithm. For that purpose, Wachspress shape functions were derived
for various polygons and validated.
A meshing algorithm was developed which could create a polygonal mesh using structured mesh
created by conventional finite element packages. Then, Wachspress shape functions were
implemented in a static solver for linearly elastic materials. The solver was validated using a couple
of benchmark problems. A simple remeshing algorithm was added and implemented to simulate a
horizontal central crack propagation problem.
Next, we discuss the results in the context of key features of the project. Few changes that can be
implemented in future to improve the performance and make the algorithm more general are
proposed as well.
6.2 Comments on the Meshing Algorithm
The present solver can handle structured mesh with maximum of six neighboring nodes for each
node. Polygonal solving algorithm created by Talischi et al [30] presents a more genera approach
employing Voronoi tessellation. The maximum number of edges present in a polygon cannot be
limited in a general tessellation algorithm. However, since the present study limits itself at
56
hexagonal elements, the said meshing algorithm could not be employed. Wachspress shape
functions are derived using iterative process and hence theoretically does not have an upper bound
on number of edges in a polygon [22]. Therefore, the present algorithm can be updated with higher
order interpolants, thus making use of generic meshing algorithms possible.
Another important aspect critical to meshing algorithms is node numbering scheme. Extensive
literature exists which explores various node numbering schemes with the aim of reducing
bandwidth of the global stiffness matrix viz. nested dissection scheme [44]. The present algorithm
does not seek to optimize the node numbering. The duplicate nodes added for the crack propagation
problem, often to the elements which were created earlier in the algorithm, increase the band width
of the global stiffness matrix to make it comparable to the total global node number. The increase
in memory requirement adds to the computational cost of the remeshing algorithm which explains
high computational time required to simulate a simple crack propagation problem.
6.3 PolyFEA Accuracy and Convergence
Accuracy and convergence of the PolyFEA algorithm has been demonstrated in Chapter 4 through
benchmark problems. As observed previously, although polygonal elements suffer in terms of
accuracy for coarse meshes, their performance and matches conventional finite element solvers as
the mesh is refined. This is not a shortcoming of the method but possibly that of quadrature scheme.
We have derived Wachspress shape functions using original formulation proposed by Dasgupta
[22] which involve derivatives of high degree polynomials which can induce numerical errors in
quadrature. However, recent works have shown that Wachspress interpolants and their weights
can be expressed using simpler expressions [17] . Switching to simpler definition of the shape
function can possibly lead to lower errors and faster convergence.
57
6.4 Domains with Multiple Cracks
Figure 6.1: A domain containing multiple randomly oriented cracks (Liu, 2017) juxtaposed with a structured
focused mesh created for a center crack problem in this study
The eventual aim of the present work is to develop a PolyFEA algorithm which can simulate
multiple crack propagation problems. As discussed in the previous chapter, as the polygonal shape
functions do not have a built-in ability to represent singular fields in crack tip region, the cracks
must be included as geometrical features in the domain. If domain with multiple randomly oriented
cracks is to be modeled (Fig 6.1) the present meshing algorithm poses limitations.
Modified natural neighbor shape functions which support interpolation with concave, i.e. cracked,
polygons [36] could be more suited for this purpose. Another approach could be developing
quadratic Wachspress shape functions and having quarter point elements around the crack tip.
58
6.5 Concluding Remarks
In this work, we have successfully demonstrated convergence and accuracy of PolyFEA algorithm
using Wachspress interpolants. A supplementary meshing algorithm has been created which can
be used to create meshes for domains which can be meshed using mapped meshes in commercial
finite element packages. Crack propagation ability is added to the PolyFEA solver as well to
simulate a simple propagation problem. This study and modular subroutines developed in the
process can serve as a template to implement various polygonal interpolants and solve more
general crack propagation problems in the future.
59
7 Appendix
7.1 Polygonal Meshing Algorithm
close all
clc
%-----------------------------------------------------------% Open .inp file and create input file for the PolyFEM code:
%-----------------------------------------------------------disp ('Select the ABAQUS input file to be opened \n');
input_fid = fopen( uigetfile('.inp'), 'rt' );
clc;
prompt = 'Please enter the file name for input file to be created:\n ';
fileNametext = input(prompt,'s');
fileName=[fileNametext,'.dat'];
output_fid = fopen(fileName, 'wt');
clc;
%-----------------------------------------% Determine Element and Node neighbor_list:
%-----------------------------------------i=1;
while i>0
tline = fgets(input_fid);
i = ~strncmpi(tline,'*Node',5);
end
% Node neighbor_list:
% ----------nodenum = 0;
i=1;
60
while i>0
tline = fgets(input_fid);
if(strncmpi(tline,'*Element Connectivity:',8))
break
end
nodenum = nodenum + 1;
arr = str2num(tline);
x(nodenum,1) = arr(2);
x(nodenum,2) = arr(3);
end
% Element neighbor_list:
% ---------------------elemnum = 0;
i=1;
while i>0
tline = fgets(input_fid);
if(strncmpi(tline,'*',1))
break
end
elemnum = elemnum + 1;
arr = str2num(tline);
node(elemnum,1) = arr(2);
node(elemnum,2) = arr(3);
node(elemnum,3) = arr(4);
end
% Loop through connectivity and determine neighbour list for all the nodes:
%-------------------------------------------------------------------------num_of_neighbors = zeros(nodenum,1);
neighbor_list
= zeros(nodenum,3);
for k=1:elemnum
61
for i=1:3
for j=1:3
ii = node(k,i);
jj = node(k,j);
if(i ~= j)
nbi
= num_of_neighbors(ii);
icheck = 0;
for inode=1:nbi
if(jj == neighbor_list(ii,inode))
icheck = 1;
end
end
if(icheck == 0)
num_of_neighbors(ii) = num_of_neighbors(ii) + 1;
neighbor_list(ii,num_of_neighbors(ii)) = jj;
end
end
end
end
end
%-----------------------------------------------------------% According to the number of neighboring nodes sort the nodes
% in three categories:
%
1.Interior nodes
(6 neighboring nodes)
%
2.Transition nodes (5 neighboring nodes)
%
3.Boundary nodes
(4 neighboring nodes but not adjacent
%
%
to corner nodes)
4.Corner nodes
(3 or 2 neighboring nodes)
%-----------------------------------------------------------count_interior = 0;
count_boundary = 0;
count_semiboundary = 0;
62
count_corner = 0;
count_transition = 0;
for k = 1:nodenum
if (num_of_neighbors(k) == 6)
count_interior = count_interior + 1;
interior_nodes(count_interior) = k;
elseif ((num_of_neighbors(k) == 4) && ...
~(any((num_of_neighbors(nonzeros(neighbor_list(k,:))))<4)))
count_boundary = count_boundary + 1;
boundary_nodes(count_boundary) = k;
elseif ((num_of_neighbors(k) == 4) && ...
(any((num_of_neighbors(nonzeros(neighbor_list(k,:))))<4)))
count_semiboundary = count_semiboundary + 1;
semiboundary_nodes(count_semiboundary) = k;
elseif (num_of_neighbors(k) == 5)
count_transition = count_transition + 1;
transition_nodes(count_transition) = k;
else
count_corner = count_corner + 1;
corner_nodes(count_corner) = k;
end
end
if (count_interior == 0) interior_nodes = 0 ; end
if (count_boundary == 0) boundary_nodes = 0 ; end
if (count_semiboundary == 0) semiboundary_nodes = 0 ; end
if (count_transition == 0) transition_nodes = 0 ; end
63
count_boundaryelement = 0;
for k = 1:elemnum
if (any(num_of_neighbors(nonzeros((node(k,:)))) < 6))
count_boundaryelement = count_boundaryelement + 1;
boundary_elements(count_boundaryelement) = k;
end
end
%------------------------------------------------------------% Calculate centroids of all the elements and store them as
% poly_nodes. These centroids will be nodes in the new poly% -gonal mesh:
%------------------------------------------------------------cg
= zeros(elemnum,2);
poly_x = zeros(elemnum,2);
for k = 1:elemnum
cg (k,1) = (x(node(k,1),1) + x(node(k,2),1) + x(node(k,3),1))/3.0;
cg (k,2) = (x(node(k,1),2) + x(node(k,2),2) + x(node(k,3),2))/3.0;
poly_x (k,:) = cg (k,:);
end
%------------------------------------------------------------------% Construct hexagonal mesh using the interior nodes which are
% now stored in intereior_nodes array.
%
% split_flag will be used to check and eliminate which have been
% already been split.
% (if split_flag = 3, the elemnt is completely split)
%-------------------------------------------------------------------
64
for k = 1:count_interior
j=0;
for kk = 1:elemnum
if (node(kk,1) == interior_nodes(k) || node(kk,2) == ...
interior_nodes(k) || node(kk,3) == interior_nodes(k))
j = j + 1;
H6_node (k,j) = kk;
end
if (j == 6)
break
end
end
% Rearrange nodes in CCW direction:
%---------------------------------%Step 1: Find the mean:
x1 = poly_x(H6_node(k,:),1);
y1 = poly_x(H6_node(k,:),2);
cx = mean(x1);
cy = mean(y1);
%Step 2: Find the angles:
a = atan2(y1 - cy, x1 - cx);
%Step 3: Find the correct sorted order:
[~, order] = sort(a,'ascend');
%Step 4: Reorder the coordinates:
temp = zeros(6,1);
for ii=1:6
temp(ii) = H6_node(k,order(ii));
end
H6_node(k,:) = temp(:);
65
end
H6_count = count_interior;
%------------------------------------------------------------------% Construct pentagonal mesh using the boundary nodes which are
% now stored in boundary_nodes array.
%
% split_flag will be used to check and eliminate which have been
% already been split.
% (if split_flag > 3, the elemnt is completely split)
%------------------------------------------------------------------elem_flag = zeros(elemnum,1);
flag_count = 0;
for k = 1:count_boundary
j=0;
for kk = 1:elemnum
if (node(kk,1) == boundary_nodes(k) || node(kk,2) == ...
boundary_nodes(k) || node(kk,3) == boundary_nodes(k))
j = j + 1;
P5_node (k,j) = kk;
for jj=1:3
if (node(kk,jj) ~= boundary_nodes(k))
if (any(boundary_nodes == node(kk,jj)) || ...
any(semiboundary_nodes == node(kk,jj)) || ...
any(transition_nodes == node(kk,jj)))
j = j + 1;
if (elem_flag(kk)>0)
P5_node (k,j) = elem_flag(kk);
else
flag_count = flag_count + 1;
66
elem_flag(kk) = elemnum + flag_count;
tempx = zeros(1,2);
tempx(1,1) = (x(boundary_nodes(k),1) + x(node(kk,jj),1))/2.0;
tempx(1,2) = (x(boundary_nodes(k),2) + x(node(kk,jj),2))/2.0;
poly_x (elemnum + flag_count,:) = tempx(:);
P5_node (k,j) = elemnum + flag_count;
end
end
end
end
if (j == 5)
break
end
end
end
end
%------------------------------------------------------------------% Construct pentagonal mesh using the boundary nodes which are
% adjacent to corner, now stored in semiboundary_nodes array.
%
% split_flag will be used to check and eliminate which have been
% already been split.
% (if split_flag > 3, the elemnt is completely split)
%------------------------------------------------------------------Q4_count = 0;
Q4_flag = 0;
for k = 1:count_semiboundary
j=0;
for kk = 1:elemnum
if (any(node(kk,:) == semiboundary_nodes(k)))
67
j = j + 1;
P5_node (k + count_boundary,j) = kk;
for jj=1:3
if (node(kk,jj) ~= semiboundary_nodes(k))
if ((any(corner_nodes == node(kk,jj))) || ...
(any(boundary_nodes == node(kk,jj))))
j = j + 1;
if ((elem_flag(kk)>0) && ~ismember(2,(num_of_neighbors(node(kk,:)))))
P5_node (k + count_boundary,j) = elem_flag(kk);
else
%--------------------------------------------------% Construct Q4 element at corner in case the element
% has 2 neighbors
%--------------------------------------------------if ((elem_flag(kk)>0) && ismember(2,(num_of_neighbors(node(kk,:)))))
Q4_count = Q4_count + 1;
flag_count = flag_count + 1;
Q4_node(Q4_count, 1) = elem_flag(kk);
Q4_node(Q4_count, 2) = kk;
poly_x (elemnum + flag_count,:) = x(node(kk,jj),:);
Q4_node(Q4_count, 3) = elemnum + flag_count;
Q4_flag = 1;
end
%--------------------------------------------------flag_count = flag_count + 1;
elem_flag(kk) = elemnum + flag_count;
tempx = zeros(1,2);
68
tempx(1,1) = (x(semiboundary_nodes(k),1) + x(node(kk,jj),1))/2.0;
tempx(1,2) = (x(semiboundary_nodes(k),2) + x(node(kk,jj),2))/2.0;
poly_x (elemnum + flag_count,:) = tempx(:);
P5_node (k + count_boundary,j) = elemnum + flag_count;
%--------------------------------------------------% Construct Q4 element at corner in case the element
% has 2 neighbors
%--------------------------------------------------if ((Q4_flag == 1) && ismember(2,(num_of_neighbors(node(kk,:)))))
Q4_node(Q4_count, 4) = elemnum + flag_count;
Q4_flag = 0;
end
%--------------------------------------------------end
end
end
end
if (j == 5)
break
end
end
end
end
%------------------------------------------------------------------% Construct P5 elemets mesh using the corner nodes which are now
% stored in corner_nodes array.
%-------------------------------------------------------------------
connected_elem = zeros(2,1);
iii = 0;
for k = 1:count_corner
69
if (num_of_neighbors(corner_nodes(k)) == 3)
ii = 0;
iii = iii + 1;
for kk = 1:elemnum
if (any(node(kk,:)== corner_nodes(k)))
ii = ii + 1;
connected_elem(ii) = kk;
if(ii == 2)
break;
end
end
end
P5_node(count_boundary + count_semiboundary + iii,1) = connected_elem(1);
P5_node(count_boundary + count_semiboundary + iii,2) = elem_flag(connected_elem(1));
P5_node(count_boundary + count_semiboundary + iii,3) = connected_elem(2);
P5_node(count_boundary + count_semiboundary + iii,4) = elem_flag(connected_elem(2));
flag_count = flag_count + 1;
poly_x(elemnum + flag_count,:) = x(corner_nodes(k),:);
P5_node(count_boundary + count_semiboundary + iii,5) = elemnum + flag_count;
end
end
%---------------------------------------------------------------------% Construct two H6 elemets mesh using the transition nodes which are now
% stored in transition_nodes array.
%---------------------------------------------------------------------if (count_transition>0)
for k = 1:count_transition
ii = 0;
H6_count = H6_count + 1;
70
for kk = 1:elemnum
if (any(node(kk,:)== transition_nodes(k)))
ii = ii + 1;
H6_node(H6_count, ii) = kk;
if (any(ismember((node(kk,:)), boundary_nodes)))
ii = ii + 1;
H6_node(H6_count, ii) = elem_flag(kk);
end
end
%
if(ii == 6)
%
break;
%
end
end
end
end
%------------------------------------------------------------------% Rearrange nodes in CCW direction
%------------------------------------------------------------------if(Q4_count)
for k = 1:size(Q4_node,1)
%Step 1: Find the mean:
x1 = poly_x(Q4_node(k,:),1);
y1 = poly_x(Q4_node(k,:),2);
cx = mean(x1);
cy = mean(y1);
%Step 2: Find the angles:
a = atan2(y1 - cy, x1 - cx);
%Step 3: Find the correct sorted order:
[~, order] = sort(a,'ascend');
71
%Step 4: Reorder the coordinates:
temp = zeros(1,4);
for ii=1:4
temp(ii) = Q4_node(k,order(ii));
end
Q4_node(k,:) = temp(:);
end
end
for k = 1:size(P5_node,1)
%Step 1: Find the mean:
x1 = poly_x(P5_node(k,:),1);
y1 = poly_x(P5_node(k,:),2);
cx = mean(x1);
cy = mean(y1);
%Step 2: Find the angles:
a = atan2(y1 - cy, x1 - cx);
%Step 3: Find the correct sorted order:
[~, order] = sort(a,'ascend');
%Step 4: Reorder the coordinates:
temp = zeros(1,5);
for ii=1:5
temp(ii) = P5_node(k,order(ii));
end
P5_node(k,:) = temp(:);
end
for k = 1:size(H6_node,1)
%Step 1: Find the mean:
x1 = poly_x(H6_node(k,:),1);
y1 = poly_x(H6_node(k,:),2);
cx = mean(x1);
cy = mean(y1);
72
%Step 2: Find the angles:
a = atan2(y1 - cy, x1 - cx);
%Step 3: Find the correct sorted order:
[~, order] = sort(a,'ascend');
%Step 4: Reorder the coordinates:
temp = zeros(1,6);
for ii=1:6
temp(ii) = H6_node(k,order(ii));
end
H6_node(k,:) = temp(:);
end
P5_node(:,6) = NaN;
if(Q4_count) Q4_node(:,5) = NaN;Q4_node(:,6) = NaN; end
if(Q4_count) poly_node = flipud(vertcat(H6_node,P5_node,Q4_node)); else
poly_node = flipud(vertcat(H6_node,P5_node
)); end
%-------------------------------------------------------------------------% Uncomment to insert crack
[poly_x, poly_node, H6_node, P5_node,Q4_node] = InsertHorCrack...
( poly_node,poly_x );
%-------------------------------------------------------------------------if(Q4_count) Q4_count = size(Q4_node,1); end
P5_count = size(P5_node,1);
H6_count = size(H6_node,1);
%--------------%Plot the mesh:
%--------------figure (1)
patch('Faces',poly_node,'Vertices', poly_x,'FaceColor','w','FaceAlpha',0);
hold on
grid on
grid minor
73
GridColor='r';
set(gca, 'XColor', 'k','LineWidth',1.0)
set(gca, 'YColor', 'k','LineWidth',1.0)
hold off
%*******************%*******************%*******************%**************
%*******************%*******************%*******************%**************
%*******************
% Write Input File:
%*******************
%Get material properties:
%-----------------------Young = input('Enter Young''s modulus\n');
Poisson = input('Enter Poisson''s ratio\n');
clc;
%Write File header and material properties:
%-----------------------------------------t = date;
fprintf (output_fid, '%-40s\t %10s\n','Polygonal Element Problem',t);
fprintf (output_fid, '%-12s\n','Plane Stress');
fprintf (output_fid, '%-6i\t %-6i\t %6i\t %6i\t %6i\t %20s\n',H6_count+P5_count+Q4_count,
0,Q4_count,P5_count,H6_count,...
'!Number of Total, T3, Q4, P5, H6 Elements');
fprintf (output_fid, '%-6i\t
\t\t\t\t %20s\n',length(poly_x), '!Number of Nodes');
fprintf (output_fid, '%-6f\t %6f\t\t %20s\n',Young , Poisson, '!Youngs Modulus and Poisson
Ration');
frewind(input_fid);
%Write node coordinates and connectivity:
%---------------------------------------fprintf (output_fid,'%s\n', '#Nodes:');
for i = 1:length(poly_x)
fprintf (output_fid,'%6i\t %10f\t %10f\n', i,poly_x(i,1),poly_x(i,2));
end
74
fprintf (output_fid,'%s\n', '#Elements');
for i = 1:length(poly_node)
fprintf (output_fid,'%6i\t %6i\t %6i\t %6i\t %6i\t %6i\t %6i\t\n',i, ...
poly_node(i,1),poly_node(i,2), ...
poly_node(i,3),poly_node(i,4), ...
poly_node(i,5),poly_node(i,6));
end
%----------------------%Find nodes to constrain:
%----------------------x_constrain = input('Enter X-coordinate to be symmetrically constrained\n');
y_constrain = input('Enter Y-coordinate to be symmetrically constrained\n');
encastre_x = input('Enter X coordinate to be completely constrained\n');
encastre_y = input('Enter Y coordinate to be completely constrained\n');
[ xconstrain_node, yconstrain_node, encastre_node ] = Apply_Constrains...
( poly_x, x_constrain, y_constrain, encastre_x,encastre_y);
clc;
%----------------------%Calculate nodal forces:
%----------------------choice = input('Enter 1 to continue, 2 to apply uniform load on right,3 to apply uniform load on
top\n');
if (choice == 1)
force_nodex = 0; force_nodey = 0;
%Set force node to Null value
elseif(choice == 2)
BC_dim = input('Enter xoordinate where right force is applied\n');
magnitude = input('Enter force magnitude\n');
countx=0;
[ force_nodex, force_vectorx ] = Apply_UniformLoadsX( poly_x, BC_dim, magnitude);
75
force_nodey = 0;
clc;
elseif(choice == 3)
BC_dim = input('Enter ycoordinate where top force is applied\n');
magnitude = input('Enter force magnitude\n');
county=0;
[ force_nodey, force_vectory ] = Apply_UniformLoadsY( poly_x, BC_dim, magnitude);
force_nodex = 0;
clc;
end
%---------------------------%Write Boundary Conditions:
%---------------------------fprintf (output_fid,'%s\n', '#Boundary Conditions');
zeroval = '0.d0';
for i=1:size(poly_x,1)
% If node is part of force_node, apply the force
if(find(force_nodex == i))
fprintf (output_fid,'%6i\t %6i\t %10f\t %6i\t %10f\n', ...
i,2,force_vectorx(find(force_nodex == i),1), ...
2,force_vectorx(find(force_nodex == i),2));
elseif(find(force_nodey == i))
fprintf (output_fid,'%6i\t %6i\t %10f\t %6i\t %10f\n', ...
i,2,force_vectory(find(force_nodey == i),1), ...
2,force_vectory(find(force_nodey == i),2));
% If node is part of constrain_vector, apply Displacement BC
elseif (any(xconstrain_node == i))
fprintf (output_fid,'%6i\t %6i\t %10s\t %6i\t %10s\n', ...
i,1,zeroval,2,zeroval);
elseif (any(yconstrain_node == i))
fprintf (output_fid,'%6i\t %6i\t %10s\t %6i\t %10s\n', ...
i,2,zeroval,1,zeroval);
76
elseif (any(encastre_node == i))
fprintf (output_fid,'%6i\t %6i\t %10s\t %6i\t %10s\n', ...
i,1,zeroval,1,zeroval);
% Else tractionless BC
else
fprintf (output_fid,'%6i\t %6i\t %10s\t %6i\t %10s\n', ...
i,2,zeroval,2,zeroval);
end
end
fprintf (output_fid,'%s\n', '#End of file.');
fclose (input_fid);
fclose (output_fid);
clc;
7.2 Mesh Modification to Insert a Crack
function [poly_x, poly_node,H6_node, P5_node,Q4_node] = InsertHorCrack...
( poly_node, poly_x )
%-----------------------------------------------------------------%Function inserts horizontal crack in the mesh created in the main
%polygonal mesh created by meshing algorithm:
%-----------------------------------------------------------------Crack_y = input('Enter Y coordinate where crack will be inserted\n');
tip1 = input('Enter x coordinate of tip on Left\n');
tip2 = input('Enter x coordinate of tip on Right\n');
count = 0;
Crackcount = 0;
for i = 1:length(poly_node)
upflip=0;
downflip = 0;
%Deepending on the Y-coordinate position of all the element nodes
%determine if the elements can be present around element
%------------------------------------------------------------------for j =1:6
77
if(~isnan(poly_node(i,j)))
if ((poly_x((poly_node(i,j)),2)-Crack_y)>0)
upflip = 1;
else
downflip = 1;
end
end
end
if ((upflip)&&(downflip))
count = count +1;
FirstSet(count) = i;
end
end
CrackedSet = FirstSet;
%Arrage elements from left to right:
%----------------------------------for i = 1:count
x_min(i) = poly_x(poly_node(FirstSet(i),1),1);
for j =1:6
if(~isnan(poly_node(i,j)))
if (poly_x(poly_node(FirstSet(i),j),1)<x_min(i))
x_min(i) = poly_x(poly_node(FirstSet(i),j),1);
end
end
end
end
[~,ind] = sort(x_min);
FirstSet = FirstSet(ind);
%Split H6 elements from left to right:
%------------------------------------poly_length = length(poly_x(:,1));
j = 0;
crackflip = 0;
for i = 1:count
if(~isnan(poly_node(FirstSet(i),6)))
j = j + 1;
temp_elem = poly_node(FirstSet(i),:);
[~,indy] = sort(poly_x((temp_elem),2),'descend');
indx(1) = indy(1)+1; indx(2) = indy(1)+2;
indx(3) = indy(1)-1; indx(4) = indy(1)-2;
if(indx(1)>6)
if(indx(2)>6)
if(indx(3)<1)
if(indx(4)<1)
indx(1)
indx(2)
indx(3)
indx(4)
=
=
=
=
indx(1)-6;
indx(2)-6;
indx(3)+6;
indx(4)+6;
end
end
end
end
78
side_x = [poly_x(temp_elem(indx(1)),1), poly_x(temp_elem(indx(2)),1),...
poly_x(temp_elem(indx(3)),1), poly_x(temp_elem(indx(4)),1)]' ;
if (j==1)
new_node(j,1,1) = (side_x(1)+side_x(2))*0.5;
new_node(j,1,2) = Crack_y;
poly_length = poly_length+1;
bordernode1 = poly_length;% This node will be used to split border pentagon as well
poly_x(poly_length,1) = new_node(j,1,1);
poly_x(poly_length,2) = new_node(j,1,2);
else
new_node(j,1,1) = new_node(j-1,2,1);
new_node(j,1,2) = Crack_y;
end
new_node(j,2,1) = (side_x(3)+side_x(4))*0.5;
new_node(j,2,2) = Crack_y;
poly_length = poly_length+1;
bordernode2 = poly_length;% This node will be used to split border pentagon as well
poly_x(poly_length,:) = new_node(j,2,:);
%Create duplicated nodes at crack surface
if ((new_node(j,1,1)>tip1) && (new_node(j,1,1)<tip2) &&...
(new_node(j,2,1)>tip1) && (new_node(j,2,1)<tip2))
split_P5(2*(j-1)+1,:) = [poly_length, temp_elem(indy(1)) temp_elem(indy(2))
temp_elem(indy(3)) poly_length-1-crackflip];
if (crackflip)
new_node(j,3,:) = new_node(j-1,3,:);
else
new_node(j,3,:) = new_node(j,1,:);
crackflip=1;
end
new_node(j,4,:) = new_node(j,2,:);
poly_length = poly_length+1;
poly_x(poly_length,:) = new_node(j,4,:);
split_P5(2*(j-1)+2,:) = [poly_length, temp_elem(indy(4)) temp_elem(indy(5))
temp_elem(indy(6)) poly_length-2];
crackflip = 1;
else
split_P5(2*(j-1)+1,:) = [poly_length, temp_elem(indy(1)) temp_elem(indy(2))
temp_elem(indy(3)) poly_length-1-crackflip];
split_P5(2*(j-1)+2,:) = [poly_length, temp_elem(indy(4)) temp_elem(indy(5))
temp_elem(indy(6)) poly_length-1];
79
crackflip = 0;
end
end
end
%Split P5 elements from on borders:
%--------------------------------%Left Boundary
temp_elem = poly_node(FirstSet(1),1:5);
[~,indx] = sort(poly_x((temp_elem),1),'descend');
if ((poly_x(temp_elem(indx(1)),2))<Crack_y)
side_x(1) = indx(1)-1 ;side_x(2) =
side_x(3) = indx(1)-3 ;side_x(4) =
if(side_x(1)<1) side_x(1)
if(side_x(2)<1) side_x(2)
if(side_x(3)<1) side_x(3)
if(side_x(4)<1) side_x(4)
end
indx(1)-2 ;
indx(1)-4 ;
= side_x(1)+5;
= side_x(2)+5;
= side_x(3)+5;
= side_x(4)+5;
end
end
end
end
if ((poly_x(temp_elem(indx(1)),2))>Crack_y)
side_x(1) = indx(1)+1 ;side_x(2) =
side_x(3) = indx(1)+3 ;side_x(4) =
if(side_x(1)>5) side_x(1)
if(side_x(2)>5) side_x(2)
if(side_x(3)>5) side_x(3)
if(side_x(4)>5) side_x(4)
end
indx(1)+2 ;
indx(1)+4 ;
= side_x(1)-5;
= side_x(2)-5;
= side_x(3)-5;
= side_x(4)-5;
end
end
end
end
poly_length = poly_length+1;
temp_node(1) = (poly_x(temp_elem(side_x(2)),1)+poly_x(temp_elem(side_x(3)),1))*0.5;
temp_node(2) = Crack_y;
poly_x = [poly_x;temp_node];
new_elem = [bordernode1, poly_length, temp_elem(indx(1)), temp_elem(side_x(1)),
temp_elem(side_x(2))];
split_P5 = [split_P5;new_elem];
new_elem = [bordernode1,poly_length, temp_elem(side_x(3)), temp_elem(side_x(4))];
split_Q4 = new_elem;
%Right Boundary
temp_elem = poly_node(FirstSet(end),1:5);
[~,indx] = sort(poly_x((temp_elem),1),'ascend');
if ((poly_x(temp_elem(indx(1)),2))<Crack_y)
side_x(1) = indx(1)-1 ;side_x(2) = indx(1)-2 ;
side_x(3) = indx(1)-3 ;side_x(4) = indx(1)-4 ;
if(side_x(1)<1) side_x(1) = side_x(1)+5; end
80
if(side_x(2)<1) side_x(2) = side_x(2)+5; end
if(side_x(3)<1) side_x(3) = side_x(3)+5; end
if(side_x(4)<1) side_x(4) = side_x(4)+5; end
end
if ((poly_x(temp_elem(indx(1)),2))>Crack_y)
side_x(1) = indx(1)+1 ;side_x(2) = indx(1)+2 ;
side_x(3) = indx(1)+3 ;side_x(4) = indx(1)+4 ;
if(side_x(1)>5) side_x(1) = side_x(1)-5;
if(side_x(2)>5) side_x(2) = side_x(2)-5;
if(side_x(3)>5) side_x(3) = side_x(3)-5;
if(side_x(4)>5) side_x(4) = side_x(4)-5;
end
end
end
end
end
poly_length = poly_length+1;
temp_node(1) = (poly_x(temp_elem(side_x(2)),1)+poly_x(temp_elem(side_x(3)),1))*0.5;
temp_node(2) = Crack_y;
poly_x = [poly_x;temp_node];
new_elem = [bordernode2, poly_length, temp_elem(indx(1)), temp_elem(side_x(3)),
temp_elem(side_x(4))];
split_P5 = [split_P5;new_elem];
new_elem = [bordernode2,poly_length, temp_elem(side_x(1)), temp_elem(side_x(2))];
split_Q4 = [split_Q4;new_elem];
%Arrange nodes in CCW direction:
%--------------------------------for k = 1:size(split_P5,1)
%Step 1: Find the mean:
x1 = poly_x(split_P5(k,:),1);
y1 = poly_x(split_P5(k,:),2);
cx = mean(x1);
cy = mean(y1);
%Step 2: Find the angles:
a = atan2(y1 - cy, x1 - cx);
%Step 3: Find the correct sorted order:
[~, order] = sort(a,'ascend');
%Step 4: Reorder the coordinates:
temp = zeros(1,5);
for ii=1:5
temp(ii) = split_P5(k,order(ii));
end
split_P5(k,:) = temp(:);
end
for k = 1:size(split_Q4,1)
%Step 1: Find the mean:
x1 = poly_x(split_Q4(k,:),1);
81
y1 = poly_x(split_Q4(k,:),2);
cx = mean(x1);
cy = mean(y1);
%Step 2: Find the angles:
a = atan2(y1 - cy, x1 - cx);
%Step 3: Find the correct sorted order:
[~, order] = sort(a,'ascend');
%Step 4: Reorder the coordinates:
temp = zeros(1,4);
for ii=1:4
temp(ii) = split_Q4(k,order(ii));
end
split_Q4(k,:) = temp(:);
end
figure(2)
patch('Faces',split_P5,'Vertices', poly_x,'FaceColor','w','FaceAlpha',0);
patch('Faces',split_Q4,'Vertices', poly_x,'FaceColor','w','FaceAlpha',0);
poly_node(FirstSet,:)=[];
H6_node = [];
P5_node = [];
Q4_node = [];
temp_H6 = 0;
temp_P5 = 0;
temp_Q4 = 0;
for i = 1:size(poly_node,1)
if(~isnan(poly_node(i,5)) && ~isnan(poly_node(i,6)))
temp_H6 = temp_H6 + 1;
H6_node(temp_H6,:) = poly_node(i,:);
elseif (~isnan(poly_node(i,5)) && isnan(poly_node(i,6)))
temp_P5 = temp_P5 + 1;
P5_node(temp_P5,:) = poly_node(i,:);
elseif (isnan(poly_node(i,5)))
temp_Q4 = temp_Q4 + 1;
Q4_node(temp_Q4,:) = poly_node(i,:);
end
end
split_P5(:,6) = NaN;
split_Q4(:,5) = NaN;split_Q4(:,6) = NaN;
P5_node = [P5_node; split_P5];
Q4_node = [Q4_node; split_Q4];
poly_node = flipud(vertcat(H6_node,P5_node,Q4_node));
clc;
end
82
8 Bibliography
[1]
J. R. Lund and J. P. Byrne, “Leonardo da Vinci’s tensile strength tests: implications for the
discovery of engineering mechanics,” Civil. Eng. Env. Syst, vol. 0, pp. 1–8.
[2]
J. J. Duga, W. H. Fisher, R. W. Buxbaum, A. R. Rosenfield, A. R. Buhr, E. J. Honton, and
S. C. McMillan, “The Economic Effects of Fracture in the United States - Richard Palmer
Reed - Google Books,” National Bureau of Standards, 1983. .
[3]
X. Xing-hua and S. Bao-yu, “A review of fracture rock hydraulic fracturing research,” Rock
and Soil Mechanics, 2004. .
[4]
M. J. Turner, “Stiffness and Deflection Analysis of Complex Structures,” J. Aeronaut. Sci.,
vol. 23, no. 9, pp. 805–823, Sep. 1956.
[5]
A. R. Ingraffea, Computational Fracture Mechanics, no. 2002. 2007.
[6]
G. Liu and D. Karamanlidis, “Mesh Free Methods: Moving Beyond the Finite Element
Method,” Appl. Mech. Rev., vol. 56, no. 2, p. B17, 2003.
[7]
Y. J. Liu, Y. X. Li, and W. Xie, “Modeling of multiple crack propagation in 2-D elastic
solids by the fast multipole boundary element method,” Eng. Fract. Mech., vol. 172, pp. 1–
16, 2017.
[8]
M. J. Berger and P. Colella, “Local Adaptive Mesh Refinement for Shock Hydrodynamics,”
J. Comput. Phys., vol. 82, no. 6484, 1989.
[9]
A. R. Ingraffea, Ingraffea, and A. R., “Computational Fracture Mechanics,” in Encyclopedia
of Computational Mechanics, Chichester, UK: John Wiley & Sons, Ltd, 2007.
[10] D. Krajcinovic, “Continuous Damage Mechanics Revisited: Basic Concepts and
83
Definitions,” J. Appl. Mech., vol. 52, no. 4, p. 829, Dec. 1985.
[11] M. J. Borden, C. V Verhoosel, M. A. Scott, T. J. R. Hughes, and C. M. Landis, “A phasefield description of dynamic brittle fracture,” 2012.
[12] T. Belytschko, R. Gracie, and G. Ventura, “A review of extended/generalized finite element
methods for material modeling,” Model. Simul. Mater. Sci. Eng., vol. 17, no. 4, p. 43001,
Jun. 2009.
[13] T. Belytschko and T. Black, “Elastic crack growth in finite elements,” vol. 620, no. July
1998, pp. 601–620, 1999.
[14] D. S. Dugdale, “Yielding of steel sheets containing slits,” J. Mech. Phys. Solids, vol. 8, no.
2, pp. 100–104, 1960.
[15] C. Song and J. P. Wolf, “The scaled boundary finite-element method—alias consistent
infinitesimal finite-element cell method—for elastodynamics,” Comput. Methods Appl.
Mech. Eng., vol. 147, no. 3–4, pp. 329–355, Aug. 1997.
[16] E. L. Wachspress, “A rational basis for function approximation,” Lect. Notes Math., 1971.
[17] G. Manzini, A. Russo, and N. Sukumar, “New perspectives on polygonal and polyhedral
finite element methods,” Math. Model. Methods Appl. Sci., vol. 24, no. 8, pp. 1–35, 2014.
[18] M. S. Floater, “Mean value coordinates,” Comput. Aided Geom. Des., vol. 20, no. 1, pp. 19–
27, 2003.
[19] R. Sibson, “A vector identity for the Dirichlet tessellation,” Math. Proc. Cambridge Philos.
Soc., vol. 87, no. 1, p. 151, 1980.
[20] H. Hiyoshi and K. Sugihara, “Two generalizations of an interpolant based on voronoi
84
diagrams,” Int. J. Shape Model., vol. 5, no. 2, pp. 219–231, Dec. 1999.
[21] S. Ghosh, K. Lee, and S. Moorthy, “Multiple scale analysis of heterogeneous elastic
structures using homogenization theory and voronoi cell finite element method,” Int. J.
Solids Struct., vol. 32, no. 1, pp. 27–62, Jan. 1995.
[22] G. Dasgupta, “Interpolants within convex polygons: Wachspress’ Shape Functions,” ASCE
- J. Aerosp. Eng., vol. 16, no. 1, pp. 1–8, 2003.
[23] R. Courant, “Variational Methods for the Solution of Problems of Equilibrium and
Vibrations,” Bull. Am. Math. Soc., vol. 49, no. 1, pp. 1–24, 1943.
[24] I. Taig, Structural analysis by the matrix displacement method. Warton: English Electric
Aviation Limited, 1962.
[25] M. de Berg, M. van Kreveld, M. Overmars, and O. C. Schwarzkopf, Computational
Geometry. Berlin, Heidelberg: Springer Berlin Heidelberg, 2000.
[26] J. Warren, “Barycentric Coordinates for Convex Polytopes,” vol. 6, no. July, pp. 1–14,
1996.
[27] M. S. Floater, G. Ko`s, and M. Reimers, “Mean value coordinates in 3D,” Comput. Aided
Geom. Des., vol. 22, no. 7 SPEC. ISS., pp. 623–631, 2005.
[28] M. Meyer, A. Barr, H. Lee, and M. Desbrun, “Generalized Barycentric Coordinates on
Irregular Polygons,” J. Graph. Tools, vol. 7, no. 1, pp. 13–22, 2002.
[29] N. Sukumar and a. Tabarraei, “Conforming polygonal finite elements,” Int. J. Numer.
Methods Eng., vol. 61, no. 12, pp. 2045–2066, 2004.
[30] D. A. Dunavant, “High Degree Efficient Symmetrical Gaussian Quadrature Rules For the
85
Triangles,” Int. J. Numer. Methods Eng., vol. 21, no. April 1984, 1985.
[31] C. Talischi, G. H. Paulino, A. Pereira, and I. F. M. Menezes, “PolyMesher: A generalpurpose mesh generator for polygonal elements written in Matlab,” Struct. Multidiscip.
Optim., vol. 45, no. 3, pp. 309–328, 2012.
[32] J. H. Michell, “On the Direct Determination of Stress in an Elastic Solid, with application
to the Theory of Plates,” Proc. London Math. Soc., vol. s1-31, no. 1, pp. 100–124, Apr.
1899.
[33] R. L. Taylor, J. C. Simo, O. C. Zienkiewicz, and A. C. H. Chan, “The patch test—a condition
for assessing FEM convergence,” Int. J. Numer. Methods Eng., vol. 22, no. 1, pp. 39–62,
Jan. 1986.
[34] C. Talischi and G. H. Paulino, “Addressing integration error for polygonal finite elements
through polynomial projections: A patch test connection,” Math. Model. Methods Appl. Sci.,
vol. 24, no. 8, pp. 1701–1727, Jul. 2014.
[35] S. Timoshenko, Theory of elasticity, by S. Timoshenko and J.N. Goodier, ... 2nd edition.
New York-Toronto-London: McGraw-Hill Book Co., 1951.
[36] C. E. Augarde and A. J. Deeks, “The use of Timoshenko’s exact solution for a cantilever
beam in adaptive analysis,” Finite Elem. Anal. Des., vol. 44, pp. 595–601, 2008.
[37] A. R. Khoei, R. Yasbolaghi, and S. O. R. Biabanaki, “A polygonal finite element method
for modeling crack propagation with minimum remeshing,” Int. J. Fract., vol. 194, no. 2,
pp. 123–148, 2015.
[38] T. L. (Ted L. . Anderson, Fracture mechanics : fundamentals and applications. Taylor &
Francis, 2005.
86
[39] Westergaard H.M., “Bearing Pressures and Cracks,” J. Appl. Mech., vol. 6, pp. 49–53, 1939.
[40] G. R. Irwin, “Analysis of Stresses and Strains near the End of a Crack Traversing a Plate,”
J. Appl. Mech., vol. 24, pp. 361–364, 1957.
[41] M. L. Williams, “The Bending Stress Distribution at the Base of a Stationary Crack,” J.
Appl. Mech., vol. 28, no. 1, p. 78, Mar. 1961.
[42] S. K. Chan, S. Tuba, W. K. Wilson, “On the finite element method in linear fracture
mechanics-l,” Eng. Froctwe Mech., vol. 2, 1970.
[43] M. Isida, “Effect of Width and Length on Stress Intensity Factors of Internally Cracked
Plates Under Various Boundary Conditions,” Int. J. Fract. Mech., vol. 7, no. 3, 1971.
[44] A. George, “Nested dissection of a regular finite element mesh,” SIAM J. Numer. ANAL,
vol. 10, no. 2, 1973.
87
Download