Note
Go to the end to download the full example code.
Mesh13#
Mesh a heterogeneous RVE with cracks.



13 from EasyFEA import Display, ElemType, PyVista
14 from EasyFEA.Geoms import Point, Line, Domain, Circle
15
16 if __name__ == "__main__":
17 Display.Clear()
18
19 # ----------------------------------------------
20 # Configuration
21 # ----------------------------------------------
22
23 # geom
24 L = 1
25
26 # mesh
27 elemType = ElemType.TRI3
28 meshSize = L / 40
29
30 # ----------------------------------------------
31 # Functions
32 # ----------------------------------------------
33
34 def Create_Crack(
35 pt1: tuple[float, float], pt2: tuple[float, float], isOpen=True
36 ) -> Line:
37 """Creates a crack.
38
39 Parameters
40 ----------
41 pt1 : tuple[float, float]
42 Point 1 (x, y)
43 pt2 : tuple[float, float]
44 Point 2 (x, y)
45 isOpen : bool, optional
46 The crack is open, by default True
47
48 Returns
49 -------
50 Line
51 The crack
52 """
53
54 assert len(pt1) == 2, "Must give 2 coordinates"
55 assert len(pt2) == 2, "Must give 2 coordinates"
56
57 pt1 = Point(*pt1)
58 pt2 = Point(*pt2)
59
60 return Line(pt1, pt2, meshSize, isOpen)
61
62 def Create_Circle(pt: tuple[float, float], diam: float, isFilled=True) -> Circle:
63 """Creates a circle.
64
65 Parameters
66 ----------
67 pt : tuple[float, float]
68 center point (x, y)
69 diam : float
70 diameter
71 isFilled : bool, optional
72 the enclosed region is filled (solid inclusion), by default True
73
74 Returns
75 -------
76 Circle
77 The circle
78 """
79
80 assert len(pt) == 2, "Must give 2 coordinates"
81
82 center = Point(*pt)
83
84 return Circle(center, diam, meshSize / 2, isFilled=isFilled)
85
86 # ----------------------------------------------
87 # Mesh
88 # ----------------------------------------------
89
90 # contour
91 contour = Domain(Point(), Point(L, L), meshSize)
92
93 # circles
94 circle1 = Create_Circle((L / 4, L / 4), L / 10)
95 circle2 = Create_Circle((3 * L / 4, L / 4), L / 8)
96 circle3 = Create_Circle((3 * L / 4, 3 * L / 4), L / 6)
97 circle4 = Create_Circle((L / 4, 3 * L / 4), L / 5)
98 circle5 = Create_Circle((L / 2, L / 2), L / 3, isFilled=False)
99 circle6 = Create_Circle((L, L), L / 6, isFilled=False)
100
101 inclusions = [circle1, circle2, circle3, circle4, circle5]
102
103 # cracks
104 crack1 = Create_Crack((3 * L / 5, L / 10), (4 * L / 5, L / 10))
105 crack2 = Create_Crack((L / 10, L / 2), (2 * L / 10, L / 2 - L / 10))
106 crack3 = Create_Crack(
107 (8 * L / 10, 5 * L / 10), (8 * L / 10 + L / 20, 5 * L / 10 + L / 20)
108 )
109
110 cracks = [crack1, crack2, crack3]
111
112 PyVista.Plot_Geoms([contour, *inclusions, *cracks, circle6]).show()
113
114 # mesh
115 mesh = contour.Mesh_2D(inclusions, elemType, cracks, additionalSurfaces=[circle6])
116
117 # ----------------------------------------------
118 # Display
119 # ----------------------------------------------
120
121 PyVista.Plot_Mesh(mesh).show()
122 PyVista.Plot_Tags(mesh).show()
Total running time of the script: (0 minutes 5.748 seconds)