# GCTL Tetrahedral Mesh 文档 ## 简介 `tet_mesh.h` 定义了GCTL网格库中的四面体网格类 `tet_mesh`,用于创建和管理三维空间中的非结构化四面体网格。该类特别适用于复杂三维区域的离散化,支持任意形状的体积域。 ## 类继承 `tet_mesh` 继承自 `base_mesh` 基类,实现了所有虚函数,并添加了四面体网格特有的功能。 ## 主要API ### 初始化 ```cpp // 初始化四面体网格 void init(std::string name, // 网格名称 std::string info, // 网格信息 const array &nodes, // 节点坐标数组 const array &elements); // 单元连接关系数组 ``` ### 网格信息 ```cpp // 获取节点坐标 void get_node_coord(int node_idx, // 节点索引 double &x, double &y, double &z) const; // 获取单元节点索引 void get_elem_nodes(int elem_idx, // 单元索引 int &n1, int &n2, int &n3, int &n4) const; // 获取单元中心坐标 void get_elem_center(int elem_idx, // 单元索引 double &x, double &y, double &z) const; // 获取单元体积 double get_elem_volume(int elem_idx) const; // 获取单元外接球信息 void get_elem_circumsphere(int elem_idx, // 单元索引 double &x, double &y, double &z, // 球心坐标 double &radius) const; // 半径 ``` ### 网格查询 ```cpp // 查找包含指定点的单元 bool find_element(double x, double y, double z, // 目标点坐标 int &elem_idx) const; // 返回单元索引 // 获取节点相邻的单元 array get_node_elements(int node_idx) const; // 获取单元相邻的单元 array get_elem_neighbors(int elem_idx) const; // 获取边界面 array get_boundary_faces() const; ``` ### 网格质量评估 ```cpp // 获取单元质量参数 double get_elem_quality(int elem_idx) const; // 获取最小二面角 double get_elem_min_dihedral_angle(int elem_idx) const; // 获取最大二面角 double get_elem_max_dihedral_angle(int elem_idx) const; // 获取纵横比 double get_elem_aspect_ratio(int elem_idx) const; ``` ### 文件操作 ```cpp // 保存为Gmsh格式 virtual void save_gmsh(std::string filename, index_packed_e packed = Packed) override; // 保存为二进制格式 virtual void save_binary(std::string filename) override; // 读取二进制格式 virtual void load_binary(std::string filename) override; ``` ## 使用示例 ```cpp // 创建节点坐标数组 array nodes; nodes.push_back(point3dc(0.0, 0.0, 0.0)); // 底面三角形的顶点 nodes.push_back(point3dc(1.0, 0.0, 0.0)); nodes.push_back(point3dc(0.0, 1.0, 0.0)); nodes.push_back(point3dc(0.0, 0.0, 1.0)); // 顶点 // 创建单元连接关系 array elements; elements.push_back(int4(0, 1, 2, 3)); // 一个四面体 // 创建四面体网格 gctl::tet_mesh mesh; mesh.init("volume", "3D tetrahedral mesh", nodes, elements); // 获取单元信息 double volume = mesh.get_elem_volume(0); // 获取四面体的体积 double quality = mesh.get_elem_quality(0); // 获取四面体的质量参数 // 获取外接球信息 double cx, cy, cz, radius; mesh.get_elem_circumsphere(0, cx, cy, cz, radius); // 查找包含特定点的单元 int elem_idx; if (mesh.find_element(0.25, 0.25, 0.25, elem_idx)) { // 找到包含点(0.25,0.25,0.25)的四面体 } // 获取边界 array boundary = mesh.get_boundary_faces(); // 添加数据并保存 mesh.add_data(gctl::NodeData, gctl::Vector, "displacement", array(nodes.size(), point3dc(0,0,0))); mesh.save_gmsh("volume.msh", gctl::Packed); ``` ## 注意事项 1. 四面体网格适用于三维区域的离散化 2. 每个单元由四个节点定义,遵循右手法则定义方向 3. 节点和单元的编号从0开始 4. 提供了完整的网格质量评估功能: - 体积 - 二面角 - 纵横比 - 质量参数 5. 支持复杂的拓扑关系查询 6. 可以自动识别和提取边界面 7. 支持Gmsh和二进制格式的文件操作 8. 适用于: - 有限元分析 - 计算流体动力学 - 结构力学 - 电磁场分析 9. 网格质量对计算精度和收敛性有重要影响,建议: - 控制最小二面角不小于10度 - 控制最大二面角不大于160度 - 保持适当的纵横比