postshesh的python包装器——基于opencascade的高阶曲线网格生成器
PostMesh的Python项目详细描述
后置网格
^ {STR 1 } PASMesh < /强>是基于C++、Cython和Python API的OpenCaseD的一个基于实体力学的后验高阶曲线网格生成器。它的主要目标是充当cad模型和高阶有限元格式之间的桥梁。因此,它可以作为一个插件与各种编译和解释的代码基础。
理念
postmesh是一种后验曲线网格生成器,它需要预先生成一个线性网格。然后将高阶节点放置在线性网格上,用cad库计算这些节点到精确边界的投影,然后作为dirichlet边界条件输入到线性、线性或非线性固体力学问题中。
构建要求
PostMesh取决于以下第三方库:
- GNU make-生成过程
- OpenCascade-cad处理
- Eigen-矩阵运算和simd矢量化
- Cython-cython绑定
- NumPy-python接口
在基于unix的系统上安装这些依赖项是非常简单的。要在基于debian的系统上构建opencascade,请执行apt-get install liboce-*
和macos brew install oce
。注意,Eigen
和OpenCascade
头和库(在linux和macos下)的默认位置分别是/usr/local/include/eigen/
、/usr/local/include/oce/
和/usr/local/lib
。
安装
C++和Python绑定都是通过这个存储库分发的。python模块可通过pypi获得
pip install PostMeshPy
为C++API构建后置网格共享库,通常执行
git clone https://github.com/romeric/PostMesh
cd PostMesh
make
[sudo] make install
为了进一步构建C++示例,(在构建和安装多个共享库之后)执行
cd examples
make
要手动构建cython/python绑定(确保您位于postmesh目录中)
[sudo] python setup.py install
或使用pip
python setup.py build_ext
python setup.py bdist_wheel
cd ../ && pip install PostMesh/dist/*.whl
使用量
postmesh提供了一个非常直观的面向对象的api。接口的设计使C++和Python代码看起来和感觉相同。查看示例目录以开始使用postmesh。为了方便起见,这里有两个完整的例子。
< H4>一个完整的C++例子:[3]面投影用于高阶四面体单元// MAKE AN INSTANCE OF PostMeshSurfaceautocurvilinear_mesh=PostMeshSurface();// PASS MESH DATA TO PostMesh - PostMesh TAKES RAW POINTERS AS INPUT ARGUMENTScurvilinear_mesh.SetMeshElements(elements,elements_rows,elements_cols);curvilinear_mesh.SetMeshPoints(points,points_rows,points_cols);curvilinear_mesh.SetMeshEdges(edges,edges_rows,edges_cols);curvilinear_mesh.SetMeshFaces(faces,faces_rows,faces_cols);curvilinear_mesh.SetScale(scale);curvilinear_mesh.SetCondition(condition);curvilinear_mesh.SetProjectionPrecision(precision);curvilinear_mesh.ComputeProjectionCriteria();curvilinear_mesh.ScaleMesh();curvilinear_mesh.InferInterpolationPolynomialDegree();curvilinear_mesh.SetNodalSpacing(nodal_spacing,nodal_spacing_rows,nodal_spacing_cols);// READ THE GEOMETRY FROM THE IGES FILEcurvilinear_mesh.ReadIGES(iges_filename);// EXTRACT GEOMETRY INFORMATION FROM THE IGES FILEcurvilinear_mesh.GetGeomVertices();// EXTRACT TRUE BOUNDARY FACES FROM CAD FILEcurvilinear_mesh.GetGeomFaces();curvilinear_mesh.GetGeomPointsOnCorrespondingFaces();// FIRST IDENTIFY WHICH SURFACES CONTAIN WHICH FACEScurvilinear_mesh.IdentifySurfacesContainingFaces();// PROJECT ALL BOUNDARY POINTS FROM THE MESH TO THE SURFACEcurvilinear_mesh.ProjectMeshOnSurface();// PERFORM POINT INVERSION FOR THE INTERIOR POINTS (ORTHOGONAL POINT PROJECTION)// THE INPUT ARGUMENTS SPECIFY PROJECTION ON CURVE INTERSECTIONS// AND MODIFICATION OF THE LINEAR MESH IF NECESSARYcurvilinear_mesh.MeshPointInversionSurface(1,1);// OBTAIN MODIFIED MESH POINTS - THIS IS NECESSARY TO ENSURE LINEAR MESH IS ALSO CORRECTcurvilinear_mesh.ReturnModifiedMeshPoints(points);// OBTAIN DIRICHLET DATA - (THE DISPLACMENT OF BOUNDARY NODES)DirichletDataDirichlet_data=curvilinear_mesh.GetDirichletData();
一个完整的python示例:[2d]高阶三角形元素的曲线投影
尽管Python中也提供了所有C++方法,但在Python级别定义了一些方便函数,可以帮助缩短脚本
# MAKE AN INSTANCE OF PostMeshCurvecurvilinear_mesh=PostMeshCurve("tri",2)curvilinear_mesh.SetScale(scale)curvilinear_mesh.SetCondition(condition)# SET MESHcurvilinear_mesh.SetMesh(elements=elements,points=points,edges=edges,faces=np.zeros((1,4),dtype=np.uint64),spacing=nodal_spacing,scale_mesh=True)curvilinear_mesh.SetProjectionPrecision(1.0e-04)curvilinear_mesh.ComputeProjectionCriteria()curvilinear_mesh.GetBoundaryPointsOrder()# SET CAD GEOMETRYcurvilinear_mesh.SetGeometry(cad_filename)# PERFORM POINT PROJECTION AND POINT INVERSIONcurvilinear_mesh.PerformPointProjectionInversionCurve(projection_type="arc_length")# OBTAIN MODIFIED MESH POINTS - THIS IS NECESSARY TO ENSURE LINEAR MESH IS ALSO CORRECTcurvilinear_mesh.ReturnModifiedMeshPoints(points)# OBTAIN DIRICHLET DATA - (THE DISPLACMENT OF BOUNDARY NODES)Dirichlet_nodes,Dirichlet_values=curvilinear_mesh.GetDirichletData()
参考/引文
Postmesh可以引用为
@Article{Poya2016, author="Poya, Roman and Sevilla, Ruben and Gil, Antonio J.", title="A unified approach for a posteriori high-order curved mesh generation using solid mechanics", journal="Computational Mechanics", year="2016", volume="58", number="3", pages="457--490", doi={10.1007/s00466-016-1302-2}, url={https://link.springer.com/article/10.1007/s00466-016-1302-2}}
免责声明
后期网格不直接生成曲面体网格,而只生成曲面网格。如前所述,前一步可以通过依赖于固体力学解算器来实现。