基于distmesh的高质量二维网格生成器
dmsh的Python项目详细描述
最差的网格生成器。
灵感来自distmesh,dmsh
- 很慢,
- 需要大量内存,并且
- 也不是很强壮。
在优点方面,
- 它有一个可用的界面,
- 是纯python(因此很容易在任何系统上安装),并且
- 如果它工作,它会产生相当高质量的网格。
与optimesh结合,dmsh生成 西方最高质量的二维网格。
示例
原语
importdmshgeo=dmsh.Circle([0.0,0.0],1.0)X,cells=dmsh.generate(geo,0.1)# optionally optimize the meshimportoptimeshX,cells=optimesh.cvt.quasi_newton_uniform_full(X,cells,1.0e-10,100)# and write it to a fileimportmeshiomeshio.write_points_cells("circle.vtk",X,{"triangle":cells})
geo=dmsh.Rectangle(-1.0,+2.0,-1.0,+1.0)X,cells=dmsh.generate(geo,0.1)
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)
组合
差异
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)
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)
下面的示例使用非恒定边长度;它取决于到
圆c
。
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,lambdapts:numpy.abs(c.dist(pts))/5+0.05,tol=1.0e-10)
活接头
geo=dmsh.Union([dmsh.Circle([-0.5,0.0],1.0),dmsh.Circle([+0.5,0.0],1.0)])X,cells=dmsh.generate(geo,0.15)
geo=dmsh.Union([dmsh.Rectangle(-1.0,+0.5,-1.0,+0.5),dmsh.Rectangle(-0.5,+1.0,-0.5,+1.0)])X,cells=dmsh.generate(geo,0.15)
angles=numpy.pi*numpy.array([3.0/6.0,7.0/6.0,11.0/6.0])geo=dmsh.Union([dmsh.Circle([numpy.cos(angles[0]),numpy.sin(angles[0])],1.0),dmsh.Circle([numpy.cos(angles[1]),numpy.sin(angles[1])],1.0),dmsh.Circle([numpy.cos(angles[2]),numpy.sin(angles[2])],1.0),])X,cells=dmsh.generate(geo,0.15)
交叉口
geo=dmsh.Intersection([dmsh.Circle([0.0,-0.5],1.0),dmsh.Circle([0.0,+0.5],1.0)])X,cells=dmsh.generate(geo,0.1,tol=1.0e-10)
angles=numpy.pi*numpy.array([3.0/6.0,7.0/6.0,11.0/6.0])geo=dmsh.Intersection([dmsh.Circle([numpy.cos(angles[0]),numpy.sin(angles[0])],1.5),dmsh.Circle([numpy.cos(angles[1]),numpy.sin(angles[1])],1.5),dmsh.Circle([numpy.cos(angles[2]),numpy.sin(angles[2])],1.5),])X,cells=dmsh.generate(geo,0.1,tol=1.0e-10)
下面使用HalfSpace
原语来切割圆。
geo=dmsh.Intersection([dmsh.HalfSpace(numpy.sqrt(0.5)*numpy.array([1.0,1.0]),0.0),dmsh.Circle([0.0,0.0],1.0),])X,cells=dmsh.generate(geo,0.1)
旋转、平移、缩放
geo=dmsh.Rotation(dmsh.Rectangle(-1.0,+2.0,-1.0,+1.0),0.1*numpy.pi)X,cells=dmsh.generate(geo,0.1,tol=1.0e-10)
geo=dmsh.Translation(dmsh.Rectangle(-1.0,+2.0,-1.0,+1.0),[1.0,1.0])X,cells=dmsh.generate(geo,0.1,show=show)
geo=dmsh.Scaling(dmsh.Rectangle(-1.0,+2.0,-1.0,+1.0),2.0)X,cells=dmsh.generate(geo,0.1,show=show,tol=1.0e-5)
局部细化
所有对象都可以根据到对象的距离来细化网格;
例如aPath
:
geo=dmsh.Rectangle(0.0,1.0,0.0,1.0)p1=dmsh.Path([[0.4,0.6],[0.6,0.4]])defedge_size(x):return0.03+0.1*p1.dist(x)X,cells=dmsh.generate(geo,edge_size,show=show,tol=1.0e-10)
安装
dmsh是available from the Python Package Index,所以只需键入
pip3 install dmsh --user
安装。
测试
要运行dmsh单元测试,请签出此存储库并键入
pytest
许可证
dmsh发布在MIT license下。