def test_pacman(show=False): geo = dmsh.Difference( dmsh.Circle([0.0, 0.0], 1.0), dmsh.Polygon([[0.0, 0.0], [1.5, 0.4], [1.5, -0.4]]), ) X, cells = dmsh.generate(geo, 0.1, show=show, tol=1.0e-10) ref_norms = [3.0385105041432689e02, 1.3644964912810719e01, 1.0] assert_norm_equality(X.flatten(), ref_norms, 1.0e-10) return X, cells
def test_difference(show=False): geo = dmsh.Difference(dmsh.Circle([-0.5, 0.0], 1.0), dmsh.Circle([+0.5, 0.0], 1.0)) X, cells = dmsh.generate(geo, 0.1, show=show) ref_norms = [ 2.9445552442961758e+02, 1.5856356670813716e+01, 1.4999999157880513e+00 ] assert_norm_equality(X.flatten(), ref_norms, 1.0e-9) return X, cells
def test_difference(show=False): geo = dmsh.Difference(dmsh.Circle([-0.5, 0.0], 1.0), dmsh.Circle([+0.5, 0.0], 1.0)) X, cells = dmsh.generate(geo, 0.1, show=show) geo.plot() ref_norms = [2.9445555e02, 1.58563569e01, 1.499999914e00] assert_norm_equality(X.flatten(), ref_norms, 1.0e-7) return X, cells
def test_rectangle_hole2(show=False): geo = dmsh.Difference( dmsh.Rectangle(0.0, 5.0, 0.0, 5.0), dmsh.Polygon([[1, 1], [4, 1], [4, 4], [1, 4]]), ) X, cells = dmsh.generate(geo, 1.0, show=show, tol=1.0e-3, max_steps=100) ref_norms = [ 1.3990406144096474e02, 2.2917592510234346e01, 5.0000000000000000e00 ] assert_norm_equality(X.flatten(), ref_norms, 1.0e-2)
def test(show=False): geo = dmsh.Difference( dmsh.Rectangle(0.0, 5.0, 0.0, 5.0), dmsh.Polygon([[1, 1], [4, 1], [4, 4], [1, 4]]), ) X, cells = dmsh.generate(geo, 1.0, show=show, tol=1.0e-3) ref_norms = [ 1.4000000000000000e02, 2.3176757306973560e01, 5.0000000000000000e00 ] assert_norm_equality(X.flatten(), ref_norms, 1.0e-10)
def test_boundary_step2(): geo = dmsh.Difference(dmsh.Circle([-0.5, 0.0], 1.0), dmsh.Circle([+0.5, 0.0], 1.0)) np.random.seed(0) pts = np.random.uniform(-2.0, 2.0, (2, 100)) pts = geo.boundary_step(pts) # geo.plot() # import matplotlib.pyplot as plt # plt.plot(pts[0], pts[1], "xk") # plt.show() assert np.all(np.abs(geo.dist(pts)) < 1.0e-12)
def test(show=False): geo = dmsh.Difference( dmsh.Rectangle(0.0, 5.0, 0.0, 5.0), dmsh.Polygon([[1, 1], [4, 1], [4, 4], [1, 4]]), ) X, cells = dmsh.generate(geo, 1.0, show=show, tol=1.0e-3) assert_norm_equality(X.flatten(), [1.2599887992309357e02, 2.2109217065599051e01, 5.0], 1.0e-12) return
def test_rectangle_hole(): r = dmsh.Rectangle(60, 330, 380, 650) h = dmsh.Rectangle(143, 245, 440, 543) geo = dmsh.Difference(r, h) X, cells = dmsh.generate(geo, 20, tol=1.0e-5, show=False) ref_norms = [ 1.2901184909133780e05, 7.6243606395500592e03, 6.5000000000000000e02 ] assert_norm_equality(X.flatten(), ref_norms, 1.0e-10)
def test_pacman(show=False): geo = dmsh.Difference( dmsh.Circle([0.0, 0.0], 1.0), dmsh.Polygon([[0.0, 0.0], [1.5, 0.4], [1.5, -0.4]]), ) X, cells = dmsh.generate(geo, 0.1, show=show, tol=1.0e-5, max_steps=100) ref_norms = [ 3.0173012692535394e02, 1.3565685453257570e01, 9.9999999999884770e-01 ] assert_norm_equality(X.flatten(), ref_norms, 1.0e-10) return X, cells
def mesh(self) -> MeshTri: geo = dmsh.Difference( dmsh.Rectangle(0.0, self.length, 0.0, self.height), dmsh.Circle(self.centre, self.radius) ) points, triangles = dmsh.generate(geo, 0.025, tol=1e-9) m = MeshTri(points.T, triangles.T) m.define_boundary("inlet", lambda x: x[0] == .0) m.define_boundary("outlet", lambda x: x[0] == self.length) return m
def test(show=False): r = dmsh.Rectangle(-1.0, +1.0, -1.0, +1.0) c = dmsh.Circle([0.0, 0.0], 0.3) geo = dmsh.Difference(r, c) X, cells = dmsh.generate( geo, lambda pts: numpy.abs(c.dist(pts)) / 5 + 0.05, show=show, tol=1.0e-10 ) ref_norms = [2.48e02, 1.200e01, 1.0] assert_norm_equality(X.flatten(), ref_norms, 1.0e-3) return X, cells
def test_large(): # https://github.com/nschloe/dmsh/issues/11 r = dmsh.Rectangle(-10.0, +20.0, -10.0, +20.0) c = dmsh.Circle([0.0, 0.0], 3) geo = dmsh.Difference(r, c) X, cells = dmsh.generate(geo, 2.0, tol=1.0e-5, max_steps=10000) ref_norms = [ 4.6422985179724637e03, 2.4202897690682192e02, 2.0000000000000000e01 ] assert_norm_equality(X.flatten(), ref_norms, 1.0e-4)
def test_boundary_step(): geo = dmsh.Difference(dmsh.Circle([-0.5, 0.0], 1.0), dmsh.Circle([+0.5, 0.0], 1.0)) pts = np.array([ [-2.1, 0.0], [0.1, 0.0], [-1.4, 0.0], [-0.6, 0.0], ]) pts = geo.boundary_step(pts.T).T ref = np.array([[-1.5, 0.0], [-0.5, 0.0], [-1.5, 0.0], [-0.5, 0.0]]) assert np.all(np.abs(pts - ref) < 1.0e-10)
def test_large(show=False): # https://github.com/nschloe/dmsh/issues/11 r = dmsh.Rectangle(-10.0, +20.0, -10.0, +20.0) c = dmsh.Circle([0.0, 0.0], 3) geo = dmsh.Difference(r, c) X, cells = dmsh.generate(geo, 2.0, tol=1.0e-5, max_steps=100, show=show) ref_norms = [ 4.6292581642363657e03, 2.4187329297982635e02, 2.0000000000000000e01 ] assert_norm_equality(X.flatten(), ref_norms, 1.0e-4)
def test_difference(show=False): geo = dmsh.Difference(dmsh.Circle([-0.5, 0.0], 1.0), dmsh.Circle([+0.5, 0.0], 1.0)) X, cells = dmsh.generate(geo, 0.1, show=show, max_steps=100) geo.plot() ref_norms = [ 2.9409044729708609e02, 1.5855488859739937e01, 1.5000000000000000e00 ] assert_norm_equality(X.flatten(), ref_norms, 1.0e-6) return X, cells
def test(show=False): r = dmsh.Rectangle(-1.0, +1.0, -1.0, +1.0) c = dmsh.Circle([0.0, 0.0], 0.3) geo = dmsh.Difference(r, c) numpy.random.seed(0) X, cells = dmsh.generate(geo, lambda pts: numpy.abs(c.dist(pts)) / 5 + 0.05, show=show, tol=1.0e-10) ref_norms = [2.4810107884562055e02, 1.2004528988116096e01, 1.0] assert_norm_equality(X.flatten(), ref_norms, 1.0e-12) return X, cells
def polygon2geo(polygon): # exterior boundary (dmsh does not include the last point twice to close the polygon such as shapely) e = list(polygon.exterior.coords.xy) boundary_e = [[e[0][i], e[1][i]] for i in range(len(e[0]) - 1)] outer = dmsh.Polygon(boundary_e) print(boundary_e) # interior boundary inner = [] for int in polygon.interiors: h = list(int.coords.xy) boundary_h = [[h[0][i], h[1][i]] for i in range(len(h[0]) - 1)] hole = dmsh.Polygon(boundary_h) inner.append(hole) if len(inner) > 1: inner = dmsh.Union(inner) geo = dmsh.Difference(outer, inner) elif len(inner) == 1: inner = inner[0] geo = dmsh.Difference(outer, inner) else: geo = outer return geo
def test_rectangle_hole(show=False): geo = dmsh.Difference(dmsh.Rectangle(60, 330, 380, 650), dmsh.Rectangle(143, 245, 440, 543)) X, cells = dmsh.generate(geo, 20, tol=1.0e-5, show=show, flip_tol=1.0e-10, max_steps=100) ref_norms = [ 1.2931633675576400e05, 7.6377328985582844e03, 6.5000000000000000e02 ] assert_norm_equality(X.flatten(), ref_norms, 1.0e-10)
def quarter_annulus(h): disk0 = dmsh.Circle([0.0, 0.0], 0.25) disk1 = dmsh.Circle([0.0, 0.0], 1.0) diff0 = dmsh.Difference(disk1, disk0) rect = dmsh.Rectangle(0.0, 1.0, 0.0, 1.0) quarter = dmsh.Intersection([diff0, rect]) points, cells = dmsh.generate( quarter, edge_size=lambda x: h + 0.1 * numpy.abs(disk0.dist(x)), tol=1.0e-10, max_steps=max_steps, ) return points, cells
def test(show=False): r = dmsh.Rectangle(-1.0, +1.0, -1.0, +1.0) c = dmsh.Circle([0.0, 0.0], 0.3) geo = dmsh.Difference(r, c) X, cells = dmsh.generate( geo, lambda pts: np.abs(c.dist(pts)) / 5 + 0.05, show=show, tol=1.0e-10, max_steps=100, ) ref_norms = [ 2.3686099753024831e02, 1.1750558136202198e01, 1.0000000000000000e00 ] assert_norm_equality(X.flatten(), ref_norms, 1.0e-2) return X, cells
def test_quarter_annulus(): h = 0.05 disk0 = dmsh.Circle([0.0, 0.0], 0.25) disk1 = dmsh.Circle([0.0, 0.0], 1.0) diff0 = dmsh.Difference(disk1, disk0) rect = dmsh.Rectangle(0.0, 1.0, 0.0, 1.0) quarter = dmsh.Intersection([diff0, rect]) points, cells = dmsh.generate( quarter, lambda x: h + 0.1 * np.abs(disk0.dist(x)), tol=1.0e-10, max_steps=100, ) ref_norms = [ 7.7455372708027483e01, 6.5770003813066431e00, 1.0000000000000000e00 ] assert_norm_equality(points.flatten(), ref_norms, 1.0e-2) return points, cells
def coreMesh(self,eleSize): """ 核心混凝土的划分 输入: eleSize:核心区纤维单元大小 返回: coreFiberInfo:核心混凝土纤维单元列表[(xc1,yc1,area1),(xc2,yc2,area2)] """ outDNew=self.outD-self.d0*2.0 if self.inD!=None: inDNew=self.inD+self.d0*2.0 geo = dmsh.Difference(dmsh.Circle([0, 0], outDNew/2.0), dmsh.Circle([0, 0.0],inDNew/2.0)) points, elements= dmsh.generate(geo, eleSize) coreFiberInfo=self._triEleInfo(points,elements) self.ax.triplot(points[:, 0], points[:, 1], elements) else: geo = dmsh.Circle([0.0, 0.0],outDNew/2.0) points, elements = dmsh.generate(geo,eleSize) coreFiberInfo = self._triEleInfo(points, elements) self.ax.triplot(points[:, 0], points[:, 1], elements) return coreFiberInfo
def test_quarter_annulus(): h = 0.05 disk0 = dmsh.Circle([0.0, 0.0], 0.25) disk1 = dmsh.Circle([0.0, 0.0], 1.0) diff0 = dmsh.Difference(disk1, disk0) rect = dmsh.Rectangle(0.0, 1.0, 0.0, 1.0) quarter = dmsh.Intersection([diff0, rect]) points, cells = dmsh.generate( quarter, edge_size=lambda x: h + 0.1 * np.abs(disk0.dist(x)), tol=1.0e-10, max_steps=100, ) ref_norms = [ 8.0232179592990462e01, 6.6832464479565372e00, 1.0000000000000000e00 ] assert_norm_equality(points.flatten(), ref_norms, 1.0e-10) return points, cells
def coreMesh(self,eleSize,outLineList,inLineList=None): """ 核心混凝土的划分 输入: eleSize:纤维单元的边长 outLineList:外分界线节点列表[(x1,y1),(x2,y2),...,(xn,yn)] inLineList:内分界线节点列表[[(x1,y1),(x2,y2),...,(xn,yn)],[(x1,y1),(x2,y2),...,(xn,yn)]] 返回: triEleInfoList:纤维单元信息列表[(xc1,yc1,area1),(xc2,yc2,area2)] """ triEleInfoList=None if inLineList==None: geo=dmsh.Polygon(outLineList) points, elements = dmsh.generate(geo, eleSize) triEleInfoList = self._triEleInfo(points, elements) self.ax.triplot(points[:, 0], points[:, 1], elements, c=self.coreColor, linewidth=self.lineWid, zorder=0) elif len(inLineList)==1: geo = dmsh.Difference( dmsh.Polygon(outLineList), dmsh.Polygon(inLineList[0]), ) points, elements = dmsh.generate(geo, eleSize) triEleInfoList = self._triEleInfo(points, elements) self.ax.triplot(points[:,0],points[:,1],elements,c=self.coreColor,linewidth=self.lineWid, zorder=0) elif len(inLineList)==2: zhole,yhole=self._twoHoleDirect(self.inNode) list1,list2=self._twoHolePolygonDivide(outLineList, inLineList,zhole,yhole) geo1= dmsh.Polygon(list1) geo2 = dmsh.Polygon(list2) points1, elements1 = dmsh.generate(geo1, eleSize) points2, elements2 = dmsh.generate(geo2, eleSize) triEleInfoList1=self._triEleInfo(points1,elements1) triEleInfoList2 = self._triEleInfo(points2, elements2) triEleInfoList=triEleInfoList1+triEleInfoList2 self.ax.triplot(points1[:, 0], points1[:, 1], elements1,c=self.coreColor,linewidth=self.lineWid,zorder = 0) self.ax.triplot(points2[:, 0], points2[:, 1], elements2, c=self.coreColor,linewidth=self.lineWid,zorder=0) return triEleInfoList
def test_boundary_step_pacman(): geo = dmsh.Difference( dmsh.Circle([0.0, 0.0], 1.0), dmsh.Polygon([[0.0, 0.0], [1.5, 0.4], [1.5, -0.4]]), ) # np.random.seed(0) # pts = np.random.uniform(-2.0, 2.0, (2, 100)) # pts = np.array([[-2.0, 0.0]]) # pts = np.array([[-0.1, 0.0]]) # pts = np.array([[0.0, 2.0]]) # pts = np.array([[0.0, 0.9]]) # pts = np.array([[2.0, 0.1]]) # pts = np.array([[0.1, 0.1]]) # pts = np.array([[0.7, 0.1]]) pts = np.array([[0.5, 0.1]]) pts = pts.T print(pts.T.shape) pts = geo.boundary_step(pts) geo.plot() import matplotlib.pyplot as plt plt.plot(pts[0], pts[1], "xk") plt.show()
#-*-coding: UTF-8-*- import subprocess import dmsh import optimesh import meshio import matplotlib.pyplot as pt import numpy as np # p = subprocess.Popen("OpenSees.exe", stdin=subprocess.PIPE, # stdout=subprocess.PIPE, # stderr=subprocess.PIPE) # p.stdin.write("source AnJiuCableStayedBridge.tcl\n".encode()) ###################################################################################### geo = dmsh.Difference( dmsh.Polygon([[10, 10], [10, -10], [-10, -10], [-10, 10]]), dmsh.Polygon([[4, 4], [4, -4], [-4, -4], [-4, 4]]), ) points, elements = dmsh.generate(geo, 0.4) pt.triplot(points[:, 0], points[:, 1], elements) pt.show() ################################################################
geo = dmsh.Polygon( [ [0.0, 0.0], [1.1, 0.0], [1.2, 0.5], [0.7, 0.6], [2.0, 1.0], [1.0, 2.0], [0.5, 1.5], ] ) X, cells = dmsh.generate(geo, 0.1) save(X, cells, "polygon.svg") geo = dmsh.Difference(dmsh.Circle([-0.5, 0.0], 1.0), dmsh.Circle([+0.5, 0.0], 1.0)) X, cells = dmsh.generate(geo, 0.1) save(X, cells, "moon.svg") geo = dmsh.Difference( dmsh.Circle([0.0, 0.0], 1.0), dmsh.Polygon([[0.0, 0.0], [1.5, 0.4], [1.5, -0.4]]), ) X, cells = dmsh.generate(geo, 0.1, tol=1.0e-10) save(X, cells, "pacman.svg") r = dmsh.Rectangle(-1.0, +1.0, -1.0, +1.0) c = dmsh.Circle([0.0, 0.0], 0.3) geo = dmsh.Difference(r, c)