ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Warp 网格生成工具指南:warp.fem.utils 的 grid_to_tris / grid_to_quads / grid_to_tets / grid_to_hexes 拓扑转换全解析

Warp 网格生成工具指南:warp.fem.utils 的 grid_to_tris / grid_to_quads / grid_to_tets / grid_to_hexes 拓扑转换全解析 Warp 网格生成工具指南warp.fem.utils 的 grid_to_tris / grid_to_quads / grid_to_tets / grid_to_hexes 拓扑转换全解析【免费下载链接】warpA Python framework for GPU-accelerated simulation, robotics, and machine learning.项目地址: https://gitcode.com/GitHub_Trending/warp/warp本文面向使用 NVIDIA Warp 进行 GPU 加速仿真、机器人学与机器学习研究的开发者完整讲解 FEM 工具箱中 warp.fem.utils 模块提供的四类网格拓扑生成函数二维的grid_to_tris、grid_to_quads与三维的grid_to_tets、grid_to_hexes。你将掌握它们各自的输入输出约定、顶点编号规律、方向/朝向保证以及如何把生成的拓扑与warp.fem的几何类Trimesh2D、Tetmesh、Hexmesh等衔接起来构建可求解的有限元问题。模块定位从规则网格到有限元网格warp.fem.utils是 Warp FEM 工具箱的实用工具模块其 API 参考文档见 docs/api_reference/warp_fem_utils.rst。该模块的核心职责正如其模块 docstring 所述converting dense grid topologies to mesh topologies——把稠密规则网格dense grid的拓扑转换为显式的网格拓扑包括三角形triangle、四面体tetrahedral、四边形quadrilateral和六面体hexahedral四种网格。它只暴露四个函数全部从内部实现模块再导出见 warp/fem/utils.pyfrom warp._src.fem.utils import grid_to_quads as grid_to_quads from warp._src.fem.utils import grid_to_tris as grid_to_tris from warp._src.fem.utils import grid_to_tets as grid_to_tets from warp._src.fem.utils import grid_to_hexes as grid_to_hexes真正实现位于 warp/_src/fem/utils.py四个函数都是纯 NumPy 实现、无 GPU 依赖在任何设备CPU/CUDA上调用都会返回同样的整数顶点索引数组。使用前需显式导入 FEM 模块这也是warp.fem包的整体约定见 warp/fem/init.py 的 Usage 说明import warp as wp import warp.fem from warp.fem.utils import grid_to_tris, grid_to_quads, grid_to_tets, grid_to_hexesgrid_to_tris将 2D 网格单元一分为二def grid_to_tris(Nx: int, Ny: int):功能把尺寸为Nx × Ny的稠密 2D 网格的每个单元cell沿对角线划分为两个三角形得到一个三角形网格拓扑。参数Nx网格沿x维度的分辨率单元数Ny网格沿y维度的分辨率单元数返回值形状为(2 * Nx * Ny, 3)的整数数组每行是一个三角形的三个顶点索引。顶点总数为(Nx1) * (Ny1)。朝向保证文档明确约定假设y是移动最快的索引方向fastest moving index direction时生成的三角形按逆时针counter-clockwise定向。也就是说顶点索引按(Ny1)*cx cy的方式线性化cx、cy为单元坐标其中cy变化最快。实现要点见 warp/_src/fem/utils.py 第 339-367 行实现先通过np.meshgrid(np.arange(Nx), np.arange(Ny), indexingij)生成单元坐标再对每个单元构造六个局部顶点偏移[(Ny1)*cxcy, (Ny1)*(cx1)cy, (Ny1)*(cx1)(cy1), (Ny1)*cxcy, (Ny1)*(cx1)(cy1), (Ny1)*cx(cy1)]即每单元两个三角形左下→右下→右上以及左下→右上→左上最后reshape((-1, 3))展平。每单元两个三角形的局部索引依次为[0,1,2]和[0,2,3]。完整实操示例生成三角形网格并构造 Trimesh2D参考仓库测试 warp/tests/fem/test_fem_geometry.py 中_gen_trimesh的写法import numpy as np import warp as wp import warp.fem as fem from warp.fem.utils import grid_to_tris Nx, Ny 4, 3 # 1. 生成顶点坐标(Nx1)*(Ny1) 个规则排布的 2D 点 x np.linspace(0.0, 1.0, Nx 1) y np.linspace(0.0, 1.0, Ny 1) positions np.transpose(np.meshgrid(x, y, indexingij), axes(1, 2, 0)).reshape(-1, 2) # 2. 生成三角形顶点索引(2*Nx*Ny, 3) vidx grid_to_tris(Nx, Ny) assert vidx.shape (2 * Nx * Ny, 3) # 3. 包装成 Warp 数组并构造 FEM 几何 pos_arr wp.array(positions, dtypewp.vec2) tri_arr wp.array(vidx, dtypeint) geo fem.Trimesh2D(tri_vertex_indicestri_arr, positionspos_arr)fem.Trimesh2D的构造签名见 warp/_src/fem/geometry/trimesh.py为Trimesh2D(tri_vertex_indices, positions, build_bvhFalse, temporary_storeNone, cell_envNone, env_countNone)其中positions为wp.vec2数组对 2D 三角网格或wp.vec3数组对Trimesh3D。grid_to_quads直接复用网格单元作为四边形def grid_to_quads(Nx: int, Ny: int):功能从稠密 2D 网格直接构造四边形网格拓扑——不需要细分每个网格单元本身就是一个四边形。参数Nx网格沿x维度的分辨率单元数Ny网格沿y维度的分辨率单元数返回值形状为(Nx * Ny, 4)的整数数组每行是一个四边形的四个顶点索引。朝向保证生成的四边形按逆时针编号。每个单元的四个局部顶点依次为左下[0,0]、右下[1,0]、右上[1,1]、左上[0,1]见 warp/_src/fem/utils.py 第 468-499 行全局索引按(Ny1)*cx cy线性化。完整实操示例生成四边形网格并构造 Quadmesh2D参考测试_gen_quadmeshimport numpy as np import warp as wp import warp.fem as fem from warp.fem.utils import grid_to_quads N 4 # 每个方向 4 个单元 x np.linspace(0.0, 1.0, N 1) y np.linspace(0.0, 1.0, N 1) positions np.transpose(np.meshgrid(x, y, indexingij), axes(1, 2, 0)).reshape(-1, 2) vidx grid_to_quads(N, N) assert vidx.shape (N * N, 4) geo fem.Quadmesh2D( quad_vertex_indiceswp.array(vidx, dtypeint), positionswp.array(positions, dtypewp.vec2), )仓库还提供Quadmesh3D用于三维曲面四边形网格见 warp/_src/fem/geometry/quadmesh.py。grid_to_tets每个 3D 网格单元分解为 5 个四面体def grid_to_tets(Nx: int, Ny: int, Nz: int):功能把尺寸为Nx × Ny × Nz的稠密 3D 网格的每个单元分解为5 个四面体得到四面体网格拓扑。参数Nx网格沿x维度的分辨率Ny网格沿y维度的分辨率Nz网格沿z维度的分辨率返回值形状为(5 * Nx * Ny * Nz, 4)的整数数组每行是一个四面体的四个顶点索引。顶点总数为(Nx1) * (Ny1) * (Nz1)。朝向保证假设z是移动最快的索引方向生成的四面体具有正体积positive volume。实现要点warp/_src/fem/utils.py 第 370-465 行先给每个单元的 8 个角点计算全局索引按(Ny1)*(Nz1)*cx (Nz1)*cy cz线性化基础分解模板为tet_vidx [[0,1,2,4], [3,2,1,7], [5,1,7,4], [6,7,4,2], [4,1,2,7]]这是标准的立方体 5 四面体剖分每个四面体对应立方体的一个顶点/边组合关键细节为避免相邻单元共享面时产生不一致的方向实现引入了棋盘式对称翻转checkerboard symmetry flip——对每个单元按(cx % 2, cy % 2, cz % 2)的奇偶性对局部坐标做异或XOR翻转从而保证相邻单元界面处四面体的共享三角面方向一致。完整实操示例生成四面体网格并构造 Tetmesh参考测试_gen_tetmesh与fem.Tetmesh构造签名见 warp/_src/fem/geometry/tetmesh.py参数为tet_vertex_indices, positions, build_bvhFalse, temporary_storeNone, cell_envNone, env_countNoneimport numpy as np import warp as wp import warp.fem as fem from warp.fem.utils import grid_to_tets Nx, Ny, Nz 3, 3, 3 x np.linspace(0.0, 1.0, Nx 1) y np.linspace(0.0, 1.0, Ny 1) z np.linspace(0.0, 1.0, Nz 1) positions np.transpose(np.meshgrid(x, y, z, indexingij), axes(1, 2, 3, 0)).reshape(-1, 3) vidx grid_to_tets(Nx, Ny, Nz) assert vidx.shape (5 * Nx * Ny * Nz, 4) geo fem.Tetmesh( tet_vertex_indiceswp.array(vidx, dtypeint), positionswp.array(positions, dtypewp.vec3), )grid_to_hexes直接复用 3D 网格单元作为六面体def grid_to_hexes(Nx: int, Ny: int, Nz: int):功能从稠密 3D 网格直接构造六面体网格拓扑——每个网格单元就是一个六面体无需分解。参数Nx网格沿x维度的分辨率Ny网格沿y维度的分辨率Nz网格沿z维度的分辨率返回值形状为(Nx * Ny * Nz, 8)的整数数组每行是一个六面体的八个顶点索引。编号约定假设z是移动最快的索引方向按常规约定编号——底部四个顶点逆时针然后顶部四个顶点逆时针见 warp/_src/fem/utils.py 第 502-539 行。局部顶点模板为[0,0,0], [1,0,0], [1,1,0], [0,1,0], # 底部逆时针 [0,0,1], [1,0,1], [1,1,1], [0,1,1] # 顶部逆时针全局索引按(Nz1)*(Ny1)*cx (Nz1)*cy cz线性化。完整实操示例生成六面体网格并构造 Hexmesh参考测试_gen_hexmeshimport numpy as np import warp as wp import warp.fem as fem from warp.fem.utils import grid_to_hexes N 3 x np.linspace(0.0, 1.0, N 1) y np.linspace(0.0, 1.0, N 1) z np.linspace(0.0, 1.0, N 1) positions np.transpose(np.meshgrid(x, y, z, indexingij), axes(1, 2, 3, 0)).reshape(-1, 3) vidx grid_to_hexes(N, N, N) assert vidx.shape (N * N * N, 8) geo fem.Hexmesh( hex_vertex_indiceswp.array(vidx, dtypeint), positionswp.array(positions, dtypewp.vec3), )函数速查表函数输入分辨率输出形状每单元元素数朝向/方向保证grid_to_tris(Nx, Ny)2DNx×Ny(2*Nx*Ny, 3)2 个三角形逆时针y为最快索引方向grid_to_quads(Nx, Ny)2DNx×Ny(Nx*Ny, 4)1 个四边形逆时针编号grid_to_tets(Nx, Ny, Nz)3DNx×Ny×Nz(5*Nx*Ny*Nz, 4)5 个四面体正体积z为最快索引方向含棋盘式对称翻转grid_to_hexes(Nx, Ny, Nz)3DNx×Ny×Nz(Nx*Ny*Nz, 8)1 个六面体底部逆时针、顶部逆时针z为最快索引方向注意所有函数接受的Nx/Ny/Nz是单元数量而非顶点数量生成的顶点总数分别是(Nx1)(Ny1)2D和(Nx1)(Ny1)(Nz1)3D。在 Warp FEM 工作流中的典型用法在 warp/examples/fem/utils.py 中四个函数被封装为gen_trimesh、gen_quadmesh、gen_tetmesh、gen_hexmesh它们统一负责在指定包围盒内生成规则顶点 调用对应 grid 函数生成拓扑并返回(wp.array 顶点, wp.array 索引)元组例如def gen_trimesh(res, bounds_lo: wp.vec2 | None None, bounds_hi: wp.vec2 | None None): # 默认包围盒 [0,1]×[0,1] Nx, Ny res[0], res[1] x np.linspace(bounds_lo[0], bounds_hi[0], Nx 1) y np.linspace(bounds_lo[1], bounds_hi[1], Ny 1) positions np.transpose(np.meshgrid(x, y, indexingij), axes(1, 2, 0)).reshape(-1, 2) vidx fem.utils.grid_to_tris(Nx, Ny) return wp.array(positions, dtypewp.vec2), wp.array(vidx, dtypeint)gen_quadmesh、gen_tetmesh、gen_hexmesh结构完全一致分别以wp.vec2/wp.vec3为顶点类型。这套工具函数被大量 FEM 示例与测试复用——例如 warp/tests/fem/test_fem_field.py 与 warp/tests/fem/test_fem_geometry.py 中的_gen_trimesh、_gen_quadmesh、_gen_tetmesh、_gen_hexmesh均直接调用这四个函数。建议的完整流水线生成顶点与拓扑 →wp.array上载到目标设备wp.array(..., device...)→ 构造fem.Trimesh2D/Quadmesh2D/Tetmesh/Hexmesh几何对象 → 通过fem.make_polynomial_space或fem.make_collocated_function_space建立函数空间 → 用fem.integrand定义被积函数 →fem.integrate组装刚度矩阵/载荷向量。底层实现中的隐藏细节朝向一致性是硬保证grid_to_tris与grid_to_quads的逆时针约定、grid_to_tets的正体积保证直接决定了有限元积分时fem.measure(domain, s)返回的单元度量面积/体积的符号正确性。若网格方向不一致装配出的线性系统符号会出错。四面体分解的棋盘翻转grid_to_tets中按单元坐标奇偶性对局部角点做 XOR 翻转warp/_src/fem/utils.py 第 428-444 行避免相邻单元在共享面上出现四面体方向冲突这是规则网格四面体化的经典技巧。内部复用这四个函数不仅是用户 API也被 Warp 内部用于高阶形函数的节点三角化/四面体化——例如square_shape_function.py中element_node_triangulation调用grid_to_tris(self.ORDER, self.ORDER)cube_shape_function.py中element_node_tets调用grid_to_tets(self.ORDER, self.ORDER, self.ORDER)见 warp/_src/fem/space/shape/square_shape_function.py 与 warp/_src/fem/space/shape/cube_shape_function.py用于构建 VTK 可视化单元与节点网格。纯 NumPy、同步执行四个函数在主机端即时计算并返回 NumPy 数组不涉及 GPU 启动因此对任意网格分辨率都能在毫秒级完成拓扑构建。小结warp.fem.utils的四个grid_to_*函数是 Warp FEM 中从规则网格出发构建显式网格的标准入口二维场景用grid_to_tris细分为三角形配合Trimesh2D或grid_to_quads配合Quadmesh2D三维场景用grid_to_tets每单元 5 个四面体配合Tetmesh或grid_to_hexes配合Hexmesh。理解它们的方向约定逆时针、正体积与最快索引方向约定是确保后续有限元装配正确的前提。更多用法可参考 docs/api_reference/warp_fem_utils.rst、warp/examples/fem/utils.py 以及 warp/tests/fem/test_fem_geometry.py 中的完整测试。【免费下载链接】warpA Python framework for GPU-accelerated simulation, robotics, and machine learning.项目地址: https://gitcode.com/GitHub_Trending/warp/warp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表