138 lines
4.0 KiB
Markdown
138 lines
4.0 KiB
Markdown
# GCTL Triangle Mesh 文档
|
|
|
|
## 简介
|
|
|
|
`tri_mesh.h` 定义了GCTL网格库中的三角形网格类 `tri_mesh`,用于创建和管理二维平面上的非结构化三角形网格。该类特别适用于复杂二维区域的离散化,支持任意形状的边界。
|
|
|
|
## 类继承
|
|
|
|
`tri_mesh` 继承自 `base_mesh` 基类,实现了所有虚函数,并添加了三角形网格特有的功能。
|
|
|
|
## 主要API
|
|
|
|
### 初始化
|
|
```cpp
|
|
// 初始化三角形网格
|
|
void init(std::string name, // 网格名称
|
|
std::string info, // 网格信息
|
|
const array<point2dc> &nodes, // 节点坐标数组
|
|
const array<int3> &elements); // 单元连接关系数组
|
|
```
|
|
|
|
### 网格信息
|
|
```cpp
|
|
// 获取节点坐标
|
|
void get_node_coord(int node_idx, // 节点索引
|
|
double &x, double &y) const;
|
|
|
|
// 获取单元节点索引
|
|
void get_elem_nodes(int elem_idx, // 单元索引
|
|
int &n1, int &n2, int &n3) const;
|
|
|
|
// 获取单元中心坐标
|
|
void get_elem_center(int elem_idx, // 单元索引
|
|
double &x, double &y) const;
|
|
|
|
// 获取单元面积
|
|
double get_elem_area(int elem_idx) const;
|
|
|
|
// 获取单元外接圆信息
|
|
void get_elem_circumcircle(int elem_idx, // 单元索引
|
|
double &x, double &y, // 圆心坐标
|
|
double &radius) const; // 半径
|
|
```
|
|
|
|
### 网格查询
|
|
```cpp
|
|
// 查找包含指定点的单元
|
|
bool find_element(double x, double y, // 目标点坐标
|
|
int &elem_idx) const; // 返回单元索引
|
|
|
|
// 获取节点相邻的单元
|
|
array<int> get_node_elements(int node_idx) const;
|
|
|
|
// 获取单元相邻的单元
|
|
array<int> get_elem_neighbors(int elem_idx) const;
|
|
|
|
// 获取边界边
|
|
array<int2> get_boundary_edges() const;
|
|
```
|
|
|
|
### 网格质量评估
|
|
```cpp
|
|
// 获取单元质量参数
|
|
double get_elem_quality(int elem_idx) const;
|
|
|
|
// 获取最小内角
|
|
double get_elem_min_angle(int elem_idx) const;
|
|
|
|
// 获取最大内角
|
|
double get_elem_max_angle(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<point2dc> nodes;
|
|
nodes.push_back(point2dc(0.0, 0.0));
|
|
nodes.push_back(point2dc(1.0, 0.0));
|
|
nodes.push_back(point2dc(0.5, 0.866));
|
|
nodes.push_back(point2dc(0.5, 0.289));
|
|
|
|
// 创建单元连接关系
|
|
array<int3> elements;
|
|
elements.push_back(int3(0, 1, 3)); // 第一个三角形
|
|
elements.push_back(int3(0, 3, 2)); // 第二个三角形
|
|
elements.push_back(int3(1, 2, 3)); // 第三个三角形
|
|
|
|
// 创建三角形网格
|
|
gctl::tri_mesh mesh;
|
|
mesh.init("domain", "2D triangle mesh", nodes, elements);
|
|
|
|
// 获取单元信息
|
|
double area = mesh.get_elem_area(0); // 获取第一个三角形的面积
|
|
double quality = mesh.get_elem_quality(0); // 获取第一个三角形的质量参数
|
|
|
|
// 获取外接圆信息
|
|
double cx, cy, radius;
|
|
mesh.get_elem_circumcircle(0, cx, cy, radius);
|
|
|
|
// 查找包含特定点的单元
|
|
int elem_idx;
|
|
if (mesh.find_element(0.5, 0.5, elem_idx)) {
|
|
// 找到包含点(0.5,0.5)的三角形
|
|
}
|
|
|
|
// 获取边界
|
|
array<int2> boundary = mesh.get_boundary_edges();
|
|
|
|
// 添加数据并保存
|
|
mesh.add_data(gctl::NodeData, gctl::Scalar, "pressure", 0.0);
|
|
mesh.save_gmsh("domain.msh", gctl::Packed);
|
|
```
|
|
|
|
## 注意事项
|
|
|
|
1. 三角形网格适用于二维区域的离散化
|
|
2. 每个单元由三个节点定义,按逆时针顺序排列
|
|
3. 节点和单元的编号从0开始
|
|
4. 提供了完整的网格质量评估功能
|
|
5. 支持复杂的拓扑关系查询
|
|
6. 可以自动识别和提取边界边
|
|
7. 支持Gmsh和二进制格式的文件操作
|
|
8. 适用于有限元分析、流体动力学等数值模拟
|
|
9. 网格质量对计算结果有重要影响,建议进行质量检查 |