gctl_mesh/doc/tet_mesh.md
2025-01-13 09:15:55 +08:00

4.4 KiB

GCTL Tetrahedral Mesh 文档

简介

tet_mesh.h 定义了GCTL网格库中的四面体网格类 tet_mesh,用于创建和管理三维空间中的非结构化四面体网格。该类特别适用于复杂三维区域的离散化,支持任意形状的体积域。

类继承

tet_mesh 继承自 base_mesh 基类,实现了所有虚函数,并添加了四面体网格特有的功能。

主要API

初始化

// 初始化四面体网格
void init(std::string name,                // 网格名称
          std::string info,                // 网格信息
          const array<point3dc> &nodes,    // 节点坐标数组
          const array<int4> &elements);    // 单元连接关系数组

网格信息

// 获取节点坐标
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;           // 半径

网格查询

// 查找包含指定点的单元
bool find_element(double x, double y, double z,  // 目标点坐标
                 int &elem_idx) const;           // 返回单元索引

// 获取节点相邻的单元
array<int> get_node_elements(int node_idx) const;

// 获取单元相邻的单元
array<int> get_elem_neighbors(int elem_idx) const;

// 获取边界面
array<int3> get_boundary_faces() const;

网格质量评估

// 获取单元质量参数
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;

文件操作

// 保存为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;

使用示例

// 创建节点坐标数组
array<point3dc> 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<int4> 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<int3> boundary = mesh.get_boundary_faces();

// 添加数据并保存
mesh.add_data(gctl::NodeData, gctl::Vector, "displacement",
              array<point3dc>(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度
    • 保持适当的纵横比 </rewritten_file>