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

114 lines
3.7 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 Grid 文档
## 简介
`regular_grid.h` 定义了GCTL网格库中的规则网格类 `regular_grid`,用于创建和管理规则网格。规则网格是最基本的网格类型,具有规则的网格点分布和单元结构。
## 类继承
`regular_grid` 继承自 `base_mesh` 基类,实现了所有虚函数,并添加了规则网格特有的功能。
## 主要API
### 初始化
```cpp
// 初始化二维规则网格
void init(std::string name, // 网格名称
std::string info, // 网格信息
int nx, int ny, // x和y方向的网格数
double x0, double y0, // 起始点坐标
double x1, double y1); // 终止点坐标
// 初始化三维规则网格
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); // 终止点坐标
```
### 网格信息
```cpp
// 获取网格维度
int get_dimension() const;
// 获取网格点数
void get_grid_num(int &nx, int &ny) const; // 2D
void get_grid_num(int &nx, int &ny, int &nz) const; // 3D
// 获取网格范围
void get_grid_range(double &x0, double &y0, // 2D起点
double &x1, double &y1) const; // 2D终点
void get_grid_range(double &x0, double &y0, double &z0, // 3D起点
double &x1, double &y1, double &z1) const; // 3D终点
```
### 网格操作
```cpp
// 获取指定位置的网格点坐标
void get_node_coord(int i, int j, // 2D索引
double &x, double &y) const;
void get_node_coord(int i, int j, int k, // 3D索引
double &x, double &y, double &z) const;
// 获取指定位置的单元中心坐标
void get_elem_center(int i, int j, // 2D索引
double &x, double &y) const;
void get_elem_center(int i, int j, int k, // 3D索引
double &x, double &y, double &z) 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;
// NetCDF格式操作
void load_netcdf_grid(std::string filename,
mesh_data_type_e loctype,
std::string xname,
std::string yname);
void save_netcdf_grid(std::string filename,
std::string title = "untitled");
```
## 使用示例
```cpp
// 创建2D规则网格
gctl::regular_grid grid2d;
grid2d.init("grid2d", "2D regular grid",
100, 100, // 100x100网格
0.0, 0.0, // 起点(0,0)
1.0, 1.0); // 终点(1,1)
// 创建3D规则网格
gctl::regular_grid grid3d;
grid3d.init("grid3d", "3D regular grid",
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;
grid3d.get_grid_num(nx, ny, nz);
// 添加数据并保存
grid3d.add_data(gctl::NodeData, gctl::Scalar, "temperature", 25.0);
grid3d.save_gmsh("output.msh", gctl::Packed);
```
## 注意事项
1. 规则网格支持2D和3D两种维度
2. 网格点和单元的编号是规则的,可以通过索引直接访问
3. 支持多种文件格式的导入导出Gmsh、二进制、NetCDF
4. 网格范围由起点和终点坐标定义,网格间距自动计算