资讯动态

Warp FEM 形函数空间详解:`warp.fem.space.shape` 模块 API 与实现原理

发布时间:2026/9/17 12:13:02 来源:尧图企业网站定制
Warp FEM 形函数空间详解warp.fem.space.shape模块 API 与实现原理【免费下载链接】warpA Python framework for GPU-accelerated simulation, robotics, and machine learning.项目地址: https://gitcode.com/GitHub_Trending/warp/warp本篇技术指南围绕 NVIDIA WarpGPU 加速仿真、机器人与机器学习框架有限元FEM子系统的核心模块warp.fem.space.shape展开系统讲解其在三角形、四边形、四面体与六面体立方体单元上提供的全部 40 个形函数类族从标量型多项式 Lagrange 形函数、B-spline 形函数到面向 H(curl)/H(div) 空间的 Nédélec 与 Raviart-Thomas 矢量形函数以及非协调non-conforming形函数。读完本文你将掌握每个形函数的适用单元、阶数限制、节点数量与名称编码规则理解形函数接口节点坐标、积分权重、函数值与梯度的底层实现机制并能在自己的 FEM 仿真代码中正确选用与组合这些形函数。一、模块定位有限元空间的“形状基石”warp.fem.space.shape是 Warp FEM 中定义单元element上形函数的专用模块。在有限元方法中形函数shape function决定了未知场在单个单元内部的插值方式是组装刚度矩阵、质量矩阵与载荷向量的基础。该模块对应仓库源码位置公开 API 入口warp/fem/space/shape/init.py其中所有符号均从warp._src.fem.space.shape转发文件头部注释说明在形函数 API 统一1.11之前这些导入暂时保持非弃用状态核心实现warp/_src/fem/space/shape/ 目录包含shape_function.py、triangle_shape_function.py、square_shape_function.py、cube_shape_function.py、tet_shape_function.py五个文件API 参考文档docs/api_reference/warp_fem_space_shape.rst即本文讲解的主题文档。从源码结构看形函数按参考单元几何组织为四个家族三角形Triangle、四边形/正方形Square、四面体Tetrahedron、立方体/六面体Cube另有与几何无关的ConstantShapeFunction常量形函数。这些类被上层函数空间function space消费例如 warp/_src/fem/space/function_space.py 与 warp/_src/fem/space/basis_function_space.py 中定义的空间会调用形函数的各类make_*方法生成设备端device函数。二、形函数基类接口每个形函数都必须实现的六件事所有形函数均继承自ShapeFunction基类定义于 warp/_src/fem/space/shape/shape_function.py。基类定义了统一的类属性与抽象接口理解这些接口是掌握全部 40 个类的钥匙。2.1 类属性每个形函数的“元数据”属性类型含义ORDERint定义形函数所用多项式的最高次数NODES_PER_ELEMENTint每个单元上的形函数节点数量valueShapeFunction.Value形函数的值类型标量 / 协变向量 / 逆变向量见下文scalar_typetype标量精度默认为wp.float32传wp.float64可构造双精度变体namestr属性编码所有参数单元类型、阶数、多项式族、精度的唯一名称用于生成缓存键基类还定义了VERTEX_NODE_COUNT、EDGE_NODE_COUNT、INTERIOR_NODE_COUNT等计数约定在TriangleShapeFunction、SquareShapeFunction、CubeShapeFunction、TetrahedronShapeFunction子基类中声明用于描述节点属于顶点、边还是内部区域。2.2 六个核心设备函数接口每个形函数类都必须实现以下六个make_*方法它们分别返回一个可被 Warp JIT 编译缓存的设备端函数make_node_coords_in_element()返回设备函数输入node_index_in_elt输出该节点在参考单元内的坐标make_node_quadrature_weight()返回设备函数输出该节点作为单元内部积分点时的权重节点既是插值点又是求积点即“节点积分”intrinsic quadraturemake_trace_node_quadrature_weight()返回设备函数输出该节点作为单元边界trace积分点时的权重make_element_inner_weight()返回设备函数输入坐标coords与node_index_in_elt输出该节点的形函数值make_element_inner_weight_gradient()返回设备函数输入坐标与节点索引输出形函数梯度element_vtk_cells()非抽象但各子类实现返回 VTK 单元拓扑描述用于可视化输出。此外_precision_suffix属性会在缓存键中追加_f64后缀以区分 fp32/fp64 变体见 shape_function.pymake_*返回的函数均通过cache.get_func/cache.dynamic_func注册如 shape_function.py确保同名形函数只编译一次。2.3 值类型Scalar / CovariantVector / ContravariantVector基类中的Value枚举shape_function.py将形函数划分为三类这直接决定了空间所属的 Sobolev 空间类别值类型枚举值用途典型类Scalar0标量场插值如位移、温度、压力场各 Polynomial / Bipolynomial / BSpline 类CovariantVector1切向连续矢量场用于 H(curl) 空间如电磁场各 Nédélec 类ContravariantVector2法向连续矢量场用于 H(div) 空间如通量、速度场各 Raviart-Thomas 类例如TriangleNedelecFirstKindShapeFunctions声明value ShapeFunction.Value.CovariantVectorTriangleRaviartThomasShapeFunctions声明value ShapeFunction.Value.ContravariantVector见 triangle_shape_function.py 与 triangle_shape_function.py。2.4 常量形函数ConstantShapeFunctionConstantShapeFunctionshape_function.py是单元上的常量形函数ORDER 0、NODES_PER_ELEMENT 1。它通过单元原型的instantiate_quadrature(order0, familyNone)取第一个求积点作为唯一节点的坐标形函数值恒为 1、梯度恒为 0VTK 输出为VTK_VERTEX类型。该函数常用于构造常值场或常量基的空间。三、三角形单元形函数族Triangle三角形家族基类TriangleShapeFunctiontriangle_shape_function.py定义了VERTEX/EDGE/INTERIOR三个节点类别常量并提供了参考三角形顶点坐标辅助函数。家族内共 4 个具体类3.1TrianglePolynomialShapeFunctions标准 Lagrange 多项式三角形上最常用的标量 Lagrange 形函数triangle_shape_function.py构造参数为degree与scalar_type。其节点数满足(degree 1) * (degree 2) // 2顶点/边/内部节点计数分别为VERTEX_NODE_COUNT 1、EDGE_NODE_COUNT degree - 1、INTERIOR_NODE_COUNT max(0, degree-2) * max(0, degree-1) // 2。节点排序节点编号遵循 VTK 类似约定——先顶点逆时针再边内部点最后内部点递归编号见_triangle_node_indextriangle_shape_function.py。节点坐标节点位于等分参考三角形的位置坐标为(tx/degree, ty/degree)对应的重心坐标。节点积分权重实现了内蕴求积intrinsic quadraturedegree 2使用针对 4 阶以下单项式优化的权重顶点权重0.022335964126、边权重0.310997369207degree 3P3 内蕴求积顶点1/30、边0.075、内部0.45其他阶数均匀权重1 / NODES_PER_ELEMENT。边界求积权重采用闭式 Newton–Cotes 公式如 P2 时顶点1/6、边2/3。形函数解析式对 P1/P2/P3 分别硬编码了线性、二次、三次 Lagrange 基函数及其梯度闭式表达式见 triangle_shape_function.py例如 P3 顶点基函数为0.5 * λᵢ(3λᵢ-1)(3λᵢ-2)内部节点基函数为27λ₀λ₁λ₂。名称编码Tri_P{ORDER}fp64 变体追加_f64如Tri_P2。VTK 输出P1 输出VTK_TRIANGLE类型 5高阶输出VTK_LAGRANGE_TRIANGLE类型 69并提供element_node_triangulation()将高阶单元剖分为子三角形便于可视化。3.2TriangleNonConformingPolynomialShapeFunctions非协调多项式非协调形函数triangle_shape_function.py以dP命名名称编码为Tri_dP{ORDER}。其核心思想是在参考大三角形内部嵌入一个缩小的同形三角形所有节点位于该内嵌小三角形上因此在单元边界的测度为零内嵌缩放参数a按阶数选取P1 取2/3P2 取0.7790771484375001针对 4 阶内蕴求积误差优化P3 取0.8429443359375002针对 6 阶优化节点坐标通过_small_to_big仿射变换从嵌入小三角形映射回大三角形形函数值在求值时先做逆变换BIG_TO_SMALL再调用底层TrianglePolynomialShapeFunctions的基函数梯度还需乘以1 / _tri_scale因子补偿坐标缩放make_trace_node_quadrature_weight()恒返回 0在边上测度为零这正是“非协调”的由来。3.3TriangleNedelecFirstKindShapeFunctionsH(curl) 边元一阶 Nédélec 第一类形函数triangle_shape_function.py值类型为协变向量用于电磁等 H(curl) 问题当前仅支持线性degree1其他阶数直接raise NotImplementedError(Only linear Nédélec implemented right now)每单元 3 个节点每个节点对应一条边EDGE_NODE_COUNT 1节点坐标位于对应边的中点形函数值为旋转向量(-d[1], d[0])其中d为从对向顶点到当前点的向量梯度为常量旋转矩阵[[0,-1],[1,0]]名称编码TriN1_{ORDER}。3.4TriangleRaviartThomasShapeFunctionsH(div) 面元一阶 Raviart-Thomas 形函数triangle_shape_function.py值类型为逆变向量用于通量、达西流等 H(div) 问题同样仅支持线性degree13 个边节点形函数值取从对向顶点指向当前点的向量d梯度为 2×2 单位矩阵名称编码TriRT_{ORDER}。四、四边形单元形函数族Square四边形家族基类SquareShapeFunctionsquare_shape_function.py定义了VERTEX / EDGE_X / EDGE_Y / INTERIOR四类节点。家族内共 6 个具体类。4.1SquareBipolynomialShapeFunctions张量积 LagrangeQ 元双多项式张量积形函数square_shape_function.py构造参数为degree、family一维多项式族与scalar_type节点数为(degree1)²采用一维求积节点Lobatto 型张量积布局family参数决定节点是否落在边界上is_closed(family)为真时闭型多项式族节点含边界与顶点为假时开型如 Gauss 点所有节点均为内部节点VERTEX_NODE_COUNT EDGE_NODE_COUNT 0INTERIOR_NODE_COUNT NODES_PER_ELEMENT且 trace 权重恒为 0一维节点坐标、权重与 Lagrange 缩放因子分别存储在LOBATTO_COORDS、LOBATTO_WEIGHT、LAGRANGE_SCALE常量中形函数值通过张量积形式计算对 i、j 两个方向分别累积coords[k] - LOBATTO_COORDS[k]的连乘再乘缩放因子见 square_shape_function.py名称编码Square_Q{ORDER}_{family}如Square_Q2_...VTK 输出P1 为VTK_QUAD类型 9高阶为VTK_LAGRANGE_QUADRILATERAL类型 70。4.2SquareSerendipityShapeFunctions无内部节点的 Serendipity 元Serendipity 形函数square_shape_function.py是“省去内部节点”的张量积空间变体仅支持阶数 2 与 3其他阶数抛出NotImplementedError且要求闭型多项式族family不闭则抛ValueError节点数恒为4 * degree4 个角点 每边degree-1个内部点INTERIOR_NODE_COUNT 0角点形函数是双线性基函数乘上一个修正因子P2 为cx cy - 2 LobattoCoord₁P3 为到中心圆的距离函数(cx-0.5)² (cy-0.5)² - R²其中R² 0.25 (0.5 - LobattoCoord₁)²名称编码Square_S{ORDER}_{family}。4.3SquareNonConformingPolynomialShapeFunctions内嵌三角形的非协调元与三角形 dP 元思路一致square_shape_function.py在参考正方形内内嵌最大等边三角形边长由_tri_height 0.75决定节点全部位于内嵌三角形上名称编码Square_P{ORDER}d节点坐标经TRI_TO_SQUARE仿射变换映射进正方形形函数值与梯度分别做逆变换与转置变换P2 时采用优化内蕴求积权重顶点0.18518521、边0.14814811trace 权重恒为 0。4.4SquareNedelecFirstKindShapeFunctions与SquareRaviartThomasShapeFunctions四边形上的 H(curl)/H(div) 矢量元square_shape_function.py均仅支持线性degree1每单元 4 个边节点EDGE_NODE_COUNT 1节点位于各边中点Nédélec 形函数沿切向变化w[axis] b a * coords[1-axis]a ±1、b 0/1由边类型决定梯度为仅有单个非零元的 2×2 矩阵grad[axis, 1-axis] aRaviart-Thomas 形函数沿法向w[1-axis] b a * coords[1-axis]梯度为grad[1-axis, 1-axis] a名称编码SquareN1_{ORDER}与SquareRT_{ORDER}。4.5SquareBSplineShapeFunctionsB-spline 形函数四边形 B-spline 形函数square_shape_function.py仅支持 1、2、3 阶其他阶数抛ValueError节点布局带 paddingPADDING degree // 2NODES_PER_DIM 2 * PADDING 2每单元NODES_PER_DIM²个节点一维权函数直接复用CubeBSplineShapeFunctions中的_linear/_quadratic/_cubic_bspline_weight及其梯度实现square_shape_function.py整体为张量积wx * wy名称编码SquareBSpline{ORDER}。五、四面体单元形函数族Tetrahedron四面体家族基类TetrahedronShapeFunctiontet_shape_function.py提供顶点坐标、边顶点索引等辅助。家族内共 4 个具体类。5.1TetrahedronPolynomialShapeFunctions四面体 Lagrange 多项式三维标量 Lagrange 形函数tet_shape_function.py构造参数degree与scalar_type节点数 (degree1)(degree2)(degree3)/6P1 为 4、P2 为 10、P3 为 20节点编号遵循与三角形类似的 VTK 风格约定顶点 → 边 → 面 → 内部见_tet_node_indextet_shape_function.py内蕴求积权重、边界求积权重按阶数分派形函数值/梯度对 P1/P2/P3 提供闭式实现VTK 输出P1 为VTK_TETRA高阶为VTK_LAGRANGE_TETRAHEDRON名称编码Tet_P{ORDER}name前缀为Tet对应实现见 tet_shape_function.py。5.2 其余四面体变体TetrahedronNonConformingPolynomialShapeFunctionstet_shape_function.py与三角形 dP 元同思路在四面体内部嵌入缩小同形四面体名称编码Tet_dP{ORDER}trace 权重为 0TetrahedronNedelecFirstKindShapeFunctionstet_shape_function.pyH(curl) 边元仅线性6 个边节点每边 1 个名称编码TetN1_{ORDER}TetrahedronRaviartThomasShapeFunctionstet_shape_function.pyH(div) 面元仅线性4 个面节点名称编码TetRT_{ORDER}。六、六面体单元形函数族Cube立方体/六面体家族基类CubeShapeFunctioncube_shape_function.py提供顶点坐标、边坐标、边轴与面偏移等辅助。家族内共 6 个具体类与四边形家族一一对应类说明名称编码CubeTripolynomialShapeFunctions三多项式张量积 LagrangeQ 元三维版支持family开/闭选择Cube_Q{ORDER}_{family}CubeSerendipityShapeFunctions无内部节点的 Serendipity 元仅阶 2/3Cube_S{ORDER}_{family}CubeNonConformingPolynomialShapeFunctions内嵌缩小四面体的非协调元Cube_P{ORDER}dCubeNedelecFirstKindShapeFunctionsH(curl) 边元仅线性12 个边节点CubeN1_{ORDER}CubeRaviartThomasShapeFunctionsH(div) 面元仅线性6 个面节点CubeRT_{ORDER}CubeBSplineShapeFunctions三线性/二次/三次 B-spline仅阶 1–3提供_linear/_quadratic/_cubic_bspline_weight与梯度实现供二维复用CubeBSpline{ORDER}其中CubeTripolynomialShapeFunctions的三维节点类型判别顶点/棱/面/内部实现于 cube_shape_function.pyVTK 输出支持VTK_HEXAHEDRON与VTK_LAGRANGE_HEXAHEDRONCubeNonConformingPolynomialShapeFunctions通过仿射变换内嵌缩小四面体cube_shape_function.pyCubeBSplineShapeFunctions的权重函数定义了 1–3 阶 B-spline 基及其导数cube_shape_function.py。七、快速选型参考40 个类一览下表汇总全部形函数类的单元类型、值类型与当前支持的阶数以源码为准单元标量Scalar非协调标量H(curl) 协变H(div) 逆变B-spline通用任意单元ConstantShapeFunction阶 0————三角形TrianglePolynomialShapeFunctionsP1–P3 闭式任意阶可构造TriangleNonConformingPolynomialShapeFunctionsTriangleNedelecFirstKindShapeFunctions仅阶 1TriangleRaviartThomasShapeFunctions仅阶 1—四边形SquareBipolynomialShapeFunctions任意阶family可选SquareNonConformingPolynomialShapeFunctionsSquareNedelecFirstKindShapeFunctions仅阶 1SquareRaviartThomasShapeFunctions仅阶 1SquareBSplineShapeFunctions阶 1–3四边形无内部节点SquareSerendipityShapeFunctions阶 2/3————四面体TetrahedronPolynomialShapeFunctionsP1–P3 闭式TetrahedronNonConformingPolynomialShapeFunctionsTetrahedronNedelecFirstKindShapeFunctions仅阶 1TetrahedronRaviartThomasShapeFunctions仅阶 1—六面体CubeTripolynomialShapeFunctions任意阶family可选CubeNonConformingPolynomialShapeFunctionsCubeNedelecFirstKindShapeFunctions仅阶 1CubeRaviartThomasShapeFunctions仅阶 1CubeBSplineShapeFunctions阶 1–3六面体无内部节点CubeSerendipityShapeFunctions阶 2/3————关键选型要点均有源码依据精度所有构造器第二个参数均为scalar_type传wp.float32默认或wp.float64缓存键自动区分_f64后缀阶数限制Nédélec 与 Raviart-Thomas 系列当前仅实现线性元degree ! 1直接抛NotImplementedErrorSerendipity 仅阶 2/3B-spline 仅阶 1–3非协调元在 P1–P3 有专门优化的内蕴求积权重更高阶回退到均匀权重连续性非协调dP形函数在单元边界测度为零trace 权重为 0适用于需要避免跨单元耦合的离散格式矢量元H(curl) 问题选 Nédélec 系列H(div) 问题选 Raviart-Thomas 系列二者值类型不同不能混用。八、与上层空间的衔接与验证形函数并非孤立存在而是被上层函数空间调用组装。可在以下路径继续深入函数空间实现warp/_src/fem/space/function_space.py、warp/_src/fem/space/basis_function_space.py、warp/_src/fem/space/dof_mapper.py自由度映射网格空间适配trimesh_function_space.py、tetmesh_function_space.py、quadmesh_function_space.py、hexmesh_function_space.py、grid_2d/3d_function_space.py、nanogrid_function_space.py分别将各单元家族接入三角形网格、四面体网格、四边形网格、六面体网格与规则网格顶层 FEM APIwarp/fem/space/公开入口与 warp/fem/init.py测试验证warp/tests/fem/ 目录包含对 FEM 空间与积分的系统测试可用于验证形函数实现的行为使用示例warp/examples/fem/ 提供达西流、纳维-斯托克斯、混合弹性等实际仿真示例展示了标量与矢量形函数在实际问题中的组合方式。结语warp.fem.space.shape以紧凑的接口设计覆盖了有限元中最常用的单元类型与形函数族三角形/四面体/四边形/六面体上的 Lagrange 多项式、Serendipity、B-spline、非协调元以及面向电磁与通量问题的 Nédélec / Raviart-Thomas 矢量元。理解其make_*设备函数接口、节点计数约定与名称编码规则是熟练使用 Warp FEM 构造任意阶、任意精度有限元空间的起点配合 docs/api_reference/warp_fem_space_shape.rst 中的 autosummary 索引与上文各源码文件你可以逐类确认每个形函数的确切行为与适用边界。【免费下载链接】warpA Python framework for GPU-accelerated simulation, robotics, and machine learning.项目地址: https://gitcode.com/GitHub_Trending/warp/warp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价