gctl_mesh/doc/regular_mesh_3d.md

106 lines
3.4 KiB
Markdown
Raw Permalink Normal View History

2025-01-13 09:15:55 +08:00
# 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. 内存占用随网格规模的立方增长,使用大规模网格时需注意内存管理