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

106 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# GCTL Regular Mesh 3D 文档
## 简介
`regular_mesh_3d.h` 定义了GCTL网格库中的三维规则网格类 `regular_mesh_3d`,用于创建和管理三维结构化网格。该类专门处理三维空间中的规则网格,提供了完整的三维网格操作功能。
## 类继承
`regular_mesh_3d` 继承自 `base_mesh` 基类,实现了所有虚函数,并添加了三维规则网格特有的功能。
## 主要API
### 初始化
```cpp
// 初始化三维规则网格
void init(std::string name, // 网格名称
std::string info, // 网格信息
int nx, int ny, int nz, // x、y和z方向的网格数
double x0, double y0, double z0, // 起始点坐标
double x1, double y1, double z1, // 终止点坐标
double dx = 0.0, // x方向网格间距0表示自动计算
double dy = 0.0, // y方向网格间距0表示自动计算
double dz = 0.0); // z方向网格间距0表示自动计算
```
### 网格信息
```cpp
// 获取网格点数
void get_mesh_num(int &nx, int &ny, int &nz) const;
// 获取网格范围
void get_mesh_range(double &x0, double &y0, double &z0, // 起点坐标
double &x1, double &y1, double &z1) const; // 终点坐标
// 获取网格间距
void get_mesh_step(double &dx, double &dy, double &dz) const;
```
### 网格操作
```cpp
// 获取指定位置的网格点坐标
void get_node_coord(int i, int j, int k, // 节点索引
double &x, double &y, double &z) const;
// 获取指定位置的单元中心坐标
void get_elem_center(int i, int j, int k, // 单元索引
double &x, double &y, double &z) const;
// 获取指定坐标所在的网格单元索引
bool get_elem_index(double x, double y, double z, // 坐标
int &i, int &j, int &k) 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
// 创建三维规则网格
gctl::regular_mesh_3d mesh3d;
mesh3d.init("mesh3d", "3D regular mesh",
50, 50, 50, // 50x50x50网格
0.0, 0.0, 0.0, // 起点(0,0,0)
1.0, 1.0, 1.0); // 终点(1,1,1)
// 获取网格信息
int nx, ny, nz;
mesh3d.get_mesh_num(nx, ny, nz);
double dx, dy, dz;
mesh3d.get_mesh_step(dx, dy, dz);
// 获取特定位置的坐标
double x, y, z;
mesh3d.get_node_coord(25, 25, 25, x, y, z); // 获取中心点坐标
// 查找特定坐标所在的单元
int i, j, k;
if (mesh3d.get_elem_index(0.5, 0.5, 0.5, i, j, k)) {
// 找到包含点(0.5,0.5,0.5)的单元
}
// 添加数据并保存
mesh3d.add_data(gctl::NodeData, gctl::Scalar, "pressure", 0.0);
mesh3d.save_gmsh("volume.msh", gctl::Packed);
```
## 注意事项
1. 网格间距可以自动计算或手动指定
2. 提供了三维空间中坐标与网格索引之间的转换功能
3. 所有索引都是从0开始计数
4. 网格点和单元的编号是规则的遵循x-y-z优先顺序
5. 支持Gmsh和二进制格式的文件操作
6. 内存占用随网格规模的立方增长,使用大规模网格时需注意内存管理