使用面向对象语法将python包装到gmsh文件
py2gmsh的Python项目详细描述
py2gmsh公司
python包装器创建具有面向对象语法的gmsh文件。
包装器与.geo文件的实际gmsh语法最为接近,使用 增加了方便的工具、面向对象的语法以便于操作和 额外功能。
安装
当pip出现在python安装中时,只需:
pip install py2gmsh
用法
创建一个简单的地理文件
下面的示例演示如何使用语法创建简单的几何图形 接近.geo文件中使用的
frompy2gmshimport(Mesh,Entity,Field)# create Mesh class instancemy_mesh=Mesh()# create pointsp1=Entity.Point([0.,0.,0.])# add point to meshmy_mesh.addEntity(p1)#create more pointsp2=Entity.Point([1.,0.,0.])my_mesh.addEntity(p2)p3=Entity.Point([1.,1.,0.])my_mesh.addEntity(p3)# entities can also directly be added to a mesh:p4=Entity.Point([0.,1.,0.],mesh=my_mesh)# create curvesl1=Entity.Curve([p1,p2])l2=Entity.Curve([p2,p3])l3=Entity.Curve([p3,p4])l4=Entity.Curve([p4,p1])# entities can also be added in a batchmy_mesh.addEntities([l1,l2,l3,l4])# create curveloopll1=Entity.CurveLoop([l1,l2,l3,l4],mesh=my_mesh)# create surfaces1=Entity.PlaneSurface([ll1],mesh=my_mesh)# create fieldsf1=Field.MathEval(mesh=my_mesh)grading=1.1he=0.005f1.F='(abs(y-0.5)*({grading}-1)+{he})/{grading}'.format(grading=grading,he=he)# create minimum fieldfmin=Field.Min(mesh=my_mesh)fmin.FieldsList=[f1]# could add more fields in the list if necessary# set the background field as minimum fieldmy_mesh.setBackgroundField(fmin)# set max element sizemy_mesh.Options.Mesh.CharacteristicLengthMax=0.1# adding Coherence optionmy_mesh.Coherence=True# write the geofilemy_mesh.writeGeo('my_mesh.geo')
.geo文件my_mesh.geo
可以在gmsh图形用户界面中直接打开,以便进行可视化和网格划分或者,运行gmsh以创建.msh文件会为my_mesh.msh提供以下结果:
>> gmsh my_mesh.geo -2 -o my_mesh.msh
(!)对于使用nodeslist、verticeslist、edgeslist、faceslist的字段,
regionslist或fieldslist,列表必须是实体实例的列表,而不是
实体编号的,例如f2.NodesList = [p1, p2, p3]
。使用IField的字段,
fieldx,fieldy,fieldz还必须指向一个字段实例,而不是它的编号,
例如f2.IField = f1
。
使用物理组
物理组用于用组号和名称标记某些实体 (可选)
# creating physical groups and associating them with a mesh instanceg1=Entity.PhysicalGroup(nb=1,name='group1')g2=Entity.PhysicalGroup(nb=2,name='group2')my_mesh.addEntites([g1,g2])# adding existing entities to different physical groupsg1.addEntity(p1)g1.addEntity(p2)g1.addEntity(l1)g1.addEntity(l2)g2.addEntities([p3,p4,l3,l4])# write the geofile after changesmesh.writeGeo('my_mesh.geo')
修改常规网格选项
所有GMSH选项(常规、几何、网格)都可以使用与直接在地理文件中写入相同的语法编写。 可用选项的完整列表位于py2gmsh/options.py中
# mesh optionsmy_mesh.options.Mesh.Algorithm=...my_mesh.options.Mesh.Format=...# general optionsmy_mesh.options.General.Color=...my_mesh.options.Geometry.OffsetX=...# geometry optionsmy_mesh.options.Geometry.Tolerance=...# write the geofile after changesmesh.writeGeo('my_mesh.geo')
从网格实例访问实体
实体可以通过其索引从网格实例检索
my_mesh.points[4]# <-- returns Point instance number 4my_mesh.getPointsFromIndex(4)# <-- same as abovemy_mesh.getPointsFromIndex([1,2,3,4])# <-- returns list of Point instances# other functionsmy_mesh.getCurvesFromIndex(...)my_mesh.getSurfacesFromIndex(...)my_mesh.getSurfaceLoopsFromIndex(...)my_mesh.getVolumesFromIndex(...)my_mesh.getFieldsFromIndex(...)my_mesh.getGroupsFromIndex(...)
这可用于创建其他实体,例如:
ll1=Entity.CurveLoop(my_mesh.getCurvesFromIndex([1,2,3,4]))my_mesh.addEntity(ll1)
将几何体对象转换为网格实例
某些对象可以直接转换为py2gmsh.Mesh.Mesh
实例例如,这已用于使用https://github.com/erdc/proteus域的语法转换几何图形。
frompy2gmshimportgeometry2gmshmy_mesh=geometry2mesh(my_geometry)
几何变量my_geometry
必须是包含以下属性的对象(例如类):
entity | shape | opt | type |
---|---|---|---|
vertices | (np, 3) | no | array of point coordinates |
vertexFlags | (np) | yes | array of point physical group numbers |
segments | (ns, 2) | yes | array of curves |
segmentFlags | (ns) | yes | array of segment physical group numbers |
facets | (nf, nsf, npf) | yes | array of surfaces (loop of point numbers) |
facetFlags | (nf) | yes | array of facets physical groups |
volumes | (nv, nsv, nfv) | yes | array of volumes (list of facets) |
regionFlags | (nv) | yes | array of volume physical group numbers |
boundaryTags | dict | yes | dictionary of physical groups {'name': number} |
holes_ind | (nh) | yes | list of holes index (facets in 2D / volumes in 3D) |
np:点数; ns:段数; nf:面数; nsf:子面数; npf:每面点数; nv:卷数; nsv:子卷数; NFV:每个卷的面数; nh:孔数
opt:可选。可选参数可以为空(例如空列表),但必须存在于几何体对象中