postshesh的python包装器——基于opencascade的高阶曲线网格生成器

PostMesh的Python项目详细描述


后置网格

^ {STR 1 } PASMesh < /强>是基于C++、Cython和Python API的OpenCaseD的一个基于实体力学的后验高阶曲线网格生成器。它的主要目标是充当cad模型和高阶有限元格式之间的桥梁。因此,它可以作为一个插件与各种编译和解释的代码基础。

理念

postmesh是一种后验曲线网格生成器,它需要预先生成一个线性网格。然后将高阶节点放置在线性网格上,用cad库计算这些节点到精确边界的投影,然后作为dirichlet边界条件输入到线性、线性或非线性固体力学问题中。

构建要求

PostMesh取决于以下第三方库:

  • GNU make-生成过程
  • {STR 1 } $ C++ 11兼容编译器<强> -rValk引用、变量模板、lambdas等
  • OpenCascade-cad处理
  • Eigen-矩阵运算和simd矢量化
  • Cython-cython绑定
  • NumPy-python接口

在基于unix的系统上安装这些依赖项是非常简单的。要在基于debian的系统上构建opencascade,请执行apt-get install liboce-*和macos brew install oce。注意,EigenOpenCascade头和库(在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}}

免责声明

后期网格不直接生成曲面体网格,而只生成曲面网格。如前所述,前一步可以通过依赖于固体力学解算器来实现。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java为什么单元测试中的“验证”在不同实例的情况下不返回“不同参数”错误?   java如何从具有相同类名的div中选择元素(Selenium)   Java制作纸牌游戏,有关于类的问题吗   bluej在Java中使用变异器和访问器设置颜色和圆半径   java准确定位异常错误的最佳方法是什么?   使用多个监视器时的java设置对话框位置   java如何在不使用JavascriptExecutor的情况下在网页中向下/向上滚动   java在for循环中将大小设置为n   java为什么akka需要不可变的消息   java LdapInvalidDnException:意外标记:   java如果字符串的第一个字母不是一个,如何大写?   使用htmlunit的java html内容提取   java从CDI托管bean获取方法的注释   java有办法在运行时检查post请求参数的大小吗   java我可以将实体注入托管Bean并直接持久化吗?