This commit is contained in:
张壹 2025-01-13 09:15:55 +08:00
parent 90557194e4
commit 4f76487bc8
11 changed files with 1218 additions and 37 deletions

View File

@ -13,25 +13,25 @@ GCTL Mesh是地球物理计算工具库(Geophysical Computational Tools & Librar
- 支持网格数据的导入导出包括Gmsh格式和二进制格式 - 支持网格数据的导入导出包括Gmsh格式和二进制格式
- 支持标量、矢量和张量数据的处理 - 支持标量、矢量和张量数据的处理
## 主要组件 ## 文档
### 基础网格 ### 基础类
- `mesh.h`: 网格基类,定义了基本的网格接口和功能 - [`mesh.h`](doc/mesh.md): 网格基类,定义了基本的网格接口和功能
- `meshdata.h`: 网格数据结构的定义和处理 - [`meshdata.h`](doc/meshdata.md): 网格数据结构的定义和处理
### 规则网格 ### 规则网格
- `regular_grid`: 通用规则网格实现 - [`regular_grid.h`](doc/regular_grid.md): 通用规则网格实现支持2D和3D
- `regular_mesh_2d`: 二维规则网格 - [`regular_mesh_2d.h`](doc/regular_mesh_2d.md): 二维规则网格专注于2D结构化网格
- `regular_mesh_3d`: 三维规则网格 - [`regular_mesh_3d.h`](doc/regular_mesh_3d.md): 三维规则网格专注于3D结构化网格
- `regular_mesh_sph_3d`: 三维球面规则网格 - [`regular_mesh_sph_3d.h`](doc/regular_mesh_sph_3d.md): 三维球面规则网格,适用于地球物理建模
### 线性网格 ### 线性网格
- `linear_mesh_2d`: 二维线性网格 - [`linear_mesh_2d.h`](doc/linear_mesh_2d.md): 二维线性网格用于表示2D空间中的线段
- `linear_mesh_3d`: 三维线性网格 - [`linear_mesh_3d.h`](doc/linear_mesh_3d.md): 三维线性网格用于表示3D空间中的曲线
### 非规则网格 ### 非规则网格
- `tri_mesh`: 三角形网格 - [`tri_mesh.h`](doc/tri_mesh.md): 三角形网格用于复杂2D区域的离散化
- `tet_mesh`: 四面体网格 - [`tet_mesh.h`](doc/tet_mesh.md): 四面体网格用于复杂3D区域的离散化
## 核心功能 ## 核心功能
@ -52,6 +52,7 @@ GCTL Mesh是地球物理计算工具库(Geophysical Computational Tools & Librar
- 网格文件导入导出 - 网格文件导入导出
- 支持Gmsh格式 - 支持Gmsh格式
- 支持二进制格式 - 支持二进制格式
- 支持NetCDF格式部分网格类型
- 网格数据可视化输出 - 网格数据可视化输出
### 网格类型 ### 网格类型
@ -69,36 +70,31 @@ GCTL Mesh是地球物理计算工具库(Geophysical Computational Tools & Librar
- 球面三角形/四面体网格 (TRI_TET_MESH_SPH) - 球面三角形/四面体网格 (TRI_TET_MESH_SPH)
- 规则网格 (REGULAR_GRID) - 规则网格 (REGULAR_GRID)
## 应用场景
- **规则网格**:适用于简单几何形状的离散化,如矩形/立方体区域
- **线性网格**
- 2D用于表示边界、裂缝等线性特征
- 3D用于表示输电线路、管道系统、裂缝网络等
- **三角形网格**适用于复杂2D区域的有限元分析、流体动力学等
- **四面体网格**适用于复杂3D区域的有限元分析、计算流体力学等
- **球面网格**:特别适用于地球物理学、大气科学等全球尺度的模拟
## API示例 ## API示例
### 数据操作 详细的API使用示例请参考各个网格类型的文档。基本使用模式如下
```cpp ```cpp
// 创建网格对象
gctl::regular_grid rgd;
rgd.init("grid-1", "test grid", 4, 4, 0.0, 0.0, 1.0, 1.0);
// 添加数据 // 添加数据
meshdata &add_data(mesh_data_type_e type, // 数据位置类型(顶点/单元) rgd.add_data(gctl::NodeData, gctl::Scalar, "temperature", 25.0);
mesh_data_value_e valtype, // 数据值类型(标量/矢量/张量) rgd.add_data(gctl::ElemData, gctl::Vector, "velocity", velocity_array);
string name, // 数据名称
double init_val, // 初始值
bool if_output = true); // 是否可输出
// 获取数据 // 保存网格
meshdata &get_data(string datname); rgd.save_gmsh("output.msh", gctl::OverWrite);
// 删除数据
void remove_data(string datname);
```
### 文件操作
```cpp
// 保存为Gmsh格式含数据
void save_gmsh_withdata(string filename,
output_type_e out_mode,
index_packed_e packed = Packed);
// 保存为二进制格式
void save_binary(string filename);
// 读取二进制格式
void load_binary(string filename);
``` ```
## 许可证 ## 许可证

109
doc/linear_mesh_2d.md Normal file
View File

@ -0,0 +1,109 @@
# GCTL Linear Mesh 2D 文档
## 简介
`linear_mesh_2d.h` 定义了GCTL网格库中的二维线性网格类 `linear_mesh_2d`,用于创建和管理二维非结构化线性网格。该类支持不规则分布的网格点,适用于复杂几何形状的离散化。
## 类继承
`linear_mesh_2d` 继承自 `base_mesh` 基类,实现了所有虚函数,并添加了二维线性网格特有的功能。
## 主要API
### 初始化
```cpp
// 初始化二维线性网格
void init(std::string name, // 网格名称
std::string info, // 网格信息
const array<point2dc> &nodes, // 节点坐标数组
const array<int2> &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) const;
// 获取单元中心坐标
void get_elem_center(int elem_idx, // 单元索引
double &x, double &y) const;
// 获取单元长度
double get_elem_length(int elem_idx) 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;
```
### 文件操作
```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(1.0, 1.0));
nodes.push_back(point2dc(0.0, 1.0));
// 创建单元连接关系
array<int2> elements;
elements.push_back(int2(0, 1)); // 第一条边
elements.push_back(int2(1, 2)); // 第二条边
elements.push_back(int2(2, 3)); // 第三条边
elements.push_back(int2(3, 0)); // 第四条边
// 创建线性网格
gctl::linear_mesh_2d mesh2d;
mesh2d.init("boundary", "2D boundary mesh", nodes, elements);
// 获取单元信息
double length = mesh2d.get_elem_length(0); // 获取第一条边的长度
// 查找包含特定点的单元
int elem_idx;
if (mesh2d.find_element(0.5, 0.5, elem_idx)) {
// 找到包含点(0.5,0.5)的单元
}
// 添加数据并保存
mesh2d.add_data(gctl::NodeData, gctl::Scalar, "displacement", 0.0);
mesh2d.save_gmsh("boundary.msh", gctl::Packed);
```
## 注意事项
1. 线性网格主要用于表示一维结构(如边界)在二维空间中的分布
2. 每个单元由两个节点定义,表示一条线段
3. 节点和单元的编号从0开始
4. 支持不规则分布的节点,适合复杂几何形状
5. 提供了网格拓扑关系查询功能(节点相邻单元、单元相邻单元等)
6. 支持Gmsh和二进制格式的文件操作
7. 适用于边界元素法、有限元法等数值计算

121
doc/linear_mesh_3d.md Normal file
View File

@ -0,0 +1,121 @@
# GCTL Linear Mesh 3D 文档
## 简介
`linear_mesh_3d.h` 定义了GCTL网格库中的三维线性网格类 `linear_mesh_3d`,用于创建和管理三维空间中的非结构化线性网格。该类支持不规则分布的网格点,适用于复杂三维几何结构中的线性特征离散化。
## 类继承
`linear_mesh_3d` 继承自 `base_mesh` 基类,实现了所有虚函数,并添加了三维线性网格特有的功能。
## 主要API
### 初始化
```cpp
// 初始化三维线性网格
void init(std::string name, // 网格名称
std::string info, // 网格信息
const array<point3dc> &nodes, // 节点坐标数组
const array<int2> &elements); // 单元连接关系数组
```
### 网格信息
```cpp
// 获取节点坐标
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) const;
// 获取单元中心坐标
void get_elem_center(int elem_idx, // 单元索引
double &x, double &y, double &z) const;
// 获取单元长度
double get_elem_length(int elem_idx) const;
// 获取单元方向向量
void get_elem_direction(int elem_idx, // 单元索引
double &dx, double &dy, double &dz) const;
```
### 网格查询
```cpp
// 查找最近的单元
bool find_nearest_element(double x, double y, double z, // 目标点坐标
int &elem_idx, // 返回单元索引
double &distance) const; // 返回最短距离
// 获取节点相邻的单元
array<int> get_node_elements(int node_idx) const;
// 获取单元相邻的单元
array<int> get_elem_neighbors(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<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(1.0, 1.0, 1.0));
nodes.push_back(point3dc(0.0, 1.0, 1.0));
// 创建单元连接关系
array<int2> elements;
elements.push_back(int2(0, 1)); // 第一条边
elements.push_back(int2(1, 2)); // 第二条边
elements.push_back(int2(2, 3)); // 第三条边
// 创建线性网格
gctl::linear_mesh_3d mesh3d;
mesh3d.init("curve3d", "3D curve mesh", nodes, elements);
// 获取单元信息
double length = mesh3d.get_elem_length(0); // 获取第一条边的长度
// 获取单元方向
double dx, dy, dz;
mesh3d.get_elem_direction(0, dx, dy, dz); // 获取第一条边的方向向量
// 查找最近的单元
int elem_idx;
double distance;
if (mesh3d.find_nearest_element(0.5, 0.5, 0.5, elem_idx, distance)) {
// 找到距离点(0.5,0.5,0.5)最近的单元
}
// 添加数据并保存
mesh3d.add_data(gctl::NodeData, gctl::Vector, "displacement",
array<point3dc>(nodes.size(), point3dc(0,0,0)));
mesh3d.save_gmsh("curve3d.msh", gctl::Packed);
```
## 注意事项
1. 线性网格主要用于表示一维结构(如曲线、管线)在三维空间中的分布
2. 每个单元由两个节点定义,表示一条空间线段
3. 节点和单元的编号从0开始
4. 支持不规则分布的节点,适合复杂三维曲线的离散化
5. 提供了网格拓扑关系查询功能
6. 支持计算单元的方向向量,便于处理定向问题
7. 查找最近单元功能适用于路径规划和碰撞检测
8. 支持Gmsh和二进制格式的文件操作
9. 适用于输电线路、管道系统、裂缝网络等模拟

116
doc/mesh.md Normal file
View File

@ -0,0 +1,116 @@
# GCTL Mesh 基类文档
## 简介
`mesh.h` 定义了GCTL网格库的基础类 `base_mesh`,这是所有具体网格类型的基类。它提供了网格操作的基本接口和功能实现。
## 类型定义
### 网格类型 (mesh_type_e)
```cpp
enum mesh_type_e {
UNDEFINED, // 未定义网格
REGULAR_MESH, // 规则网格
LINEAR_MESH, // 线性网格
TRI_TET_MESH, // 三角形/四面体网格
REGULAR_MESH_SPH, // 球面规则网格
LINEAR_MESH_SPH, // 球面线性网格
TRI_TET_MESH_SPH, // 球面三角形/四面体网格
REGULAR_GRID, // 规则网格
};
```
### 网格维度 (mesh_dim_e)
```cpp
enum mesh_dim_e {
MESH_0D, // 0维网格
MESH_2D, // 2维网格
MESH_3D // 3维网格
};
```
## 主要API
### 基本操作
```cpp
void clear(); // 清除所有网格数据
bool initiated() const; // 检查网格是否已初始化
void show_info(); // 显示网格与数据信息
```
### 网格信息获取
```cpp
mesh_type_e get_meshtype() const; // 获取网格类型
mesh_dim_e get_meshdim() const; // 获取网格维度
int get_nodenum() const; // 获取顶点数量
int get_elenum() const; // 获取网格单元数量
int get_datanum() const; // 获取数据对象数量
```
### 网格属性设置
```cpp
std::string get_meshname() const; // 获取网格名称
void set_meshname(std::string in_name); // 设置网格名称
std::string get_meshinfo() const; // 获取网格说明信息
void set_meshinfo(std::string in_info); // 设置网格说明信息
```
### 数据操作
```cpp
// 添加网格数据(标量初始值)
meshdata &add_data(mesh_data_type_e in_loctype, // 数据位置类型
mesh_data_value_e in_valtype, // 数据值类型
std::string name, // 数据名称
double init_val, // 初始值
bool if_output = true); // 是否可输出
// 添加网格数据(数组初始值)
meshdata &add_data(mesh_data_type_e in_loctype, // 数据位置类型
std::string name, // 数据名称
const array<double> &init_arr, // 初始值数组
bool if_output = true); // 是否可输出
// 获取数据对象
meshdata &get_data(std::string datname);
// 删除数据对象
void remove_data(std::string datname);
```
### 文件操作
```cpp
// 保存为Gmsh格式含数据
void save_gmsh_withdata(std::string filename, // 文件名
output_type_e out_mode, // 输出模式
index_packed_e packed = Packed); // 索引打包方式
// 保存为Gmsh格式指定数据
void save_gmsh_withdata(std::string filename, // 文件名
std::string datname, // 数据名称
output_type_e out_mode, // 输出模式
index_packed_e packed = Packed); // 索引打包方式
// 纯虚函数 - 需要由派生类实现
virtual void save_gmsh(std::string filename,
index_packed_e packed = Packed) = 0;
virtual void load_binary(std::string filename) = 0;
virtual void save_binary(std::string filename) = 0;
```
## 使用示例
```cpp
// 创建网格对象以regular_grid为例
gctl::regular_grid rgd;
rgd.init("grid-1", "test grid", 4, 4, 0.0, 0.0, 1.0, 1.0);
// 添加数据
rgd.add_data(gctl::NodeData, gctl::Scalar, "temperature", 25.0);
rgd.add_data(gctl::ElemData, gctl::Vector, "velocity", velocity_array);
// 显示网格信息
rgd.show_info();
// 保存网格
rgd.save_gmsh_withdata("output.msh", gctl::OverWrite);
```

116
doc/meshdata.md Normal file
View File

@ -0,0 +1,116 @@
# GCTL MeshData 文档
## 简介
`meshdata.h` 定义了GCTL网格库中的数据对象类 `meshdata`,用于在网格上存储和管理各种类型的数据(标量、矢量和张量)。
## 类型定义
### 数据值类型 (mesh_data_value_e)
```cpp
enum mesh_data_value_e {
Scalar, // 标量数据
Vector, // 矢量数据
Tensor // 张量数据
};
```
## 类成员
### 属性
```cpp
std::string name_; // 数据的名称
mesh_data_type_e loctype_; // 数据的赋值位置属性(顶点或元素)
mesh_data_value_e valtype_; // 数据的类型(标量/矢量/张量)
bool output_ok_; // 是否可输出数据
array<double> datval_; // 数据值数组
double nan_val_; // 无效数据的标记值
```
## 主要API
### 构造和初始化
```cpp
// 默认构造函数
meshdata();
// 带参数构造函数
meshdata(mesh_data_type_e in_loctype, // 数据位置类型
mesh_data_value_e in_valtype, // 数据值类型
size_t size, // 数据大小
std::string name = "untitled", // 数据名称
bool if_output = true, // 是否可输出
double nan_val = GCTL_BDL_MAX); // 无效值标记
// 创建数据对象
void create(mesh_data_type_e in_loctype, // 数据位置类型
mesh_data_value_e in_valtype, // 数据值类型
size_t size, // 数据大小
std::string name = "untitled", // 数据名称
bool if_output = true, // 是否可输出
double nan_val = GCTL_BDL_MAX); // 无效值标记
```
### 数据操作
```cpp
// 清空数据对象
void clear();
// 导出矢量数据
array<point3dc> export_vector() const;
// 导出张量数据
array<tensor> export_tensor() const;
```
### 信息显示
```cpp
// 显示数据对象的头信息
void show_info(std::ostream &os = std::clog) const;
// 显示数据统计参数
void show_stats(std::ostream &os = std::clog) const;
```
### 文件操作
```cpp
// 载入二进制文件
void load_binary(std::ifstream &infile);
// 保存二进制文件
void save_binary(std::ofstream &outfile);
```
## 使用示例
```cpp
// 创建数据对象
gctl::meshdata data(gctl::NodeData, // 节点数据
gctl::Scalar, // 标量类型
100, // 数据大小
"temperature", // 数据名称
true); // 可输出
// 显示数据信息
data.show_info();
// 显示数据统计信息
data.show_stats();
// 导出矢量数据
if (data.valtype_ == gctl::Vector) {
array<point3dc> vectors = data.export_vector();
}
// 导出张量数据
if (data.valtype_ == gctl::Tensor) {
array<tensor> tensors = data.export_tensor();
}
```
## 注意事项
1. 数据对象支持三种类型:标量、矢量和张量
2. 数据可以定义在网格的顶点或元素上
3. 数据导出时会根据数据类型自动转换为对应的格式
4. 二进制文件操作通常由网格类调用,不建议直接使用

114
doc/regular_grid.md Normal file
View File

@ -0,0 +1,114 @@
# 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. 网格范围由起点和终点坐标定义,网格间距自动计算

98
doc/regular_mesh_2d.md Normal file
View File

@ -0,0 +1,98 @@
# GCTL Regular Mesh 2D 文档
## 简介
`regular_mesh_2d.h` 定义了GCTL网格库中的二维规则网格类 `regular_mesh_2d`,用于创建和管理二维结构化网格。与`regular_grid`相比,该类更专注于二维网格的处理,提供了更多针对二维网格的专门操作。
## 类继承
`regular_mesh_2d` 继承自 `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, // 终止点坐标
double dx = 0.0, // x方向网格间距0表示自动计算
double dy = 0.0); // y方向网格间距0表示自动计算
```
### 网格信息
```cpp
// 获取网格点数
void get_mesh_num(int &nx, int &ny) const;
// 获取网格范围
void get_mesh_range(double &x0, double &y0, // 起点坐标
double &x1, double &y1) const; // 终点坐标
// 获取网格间距
void get_mesh_step(double &dx, double &dy) const;
```
### 网格操作
```cpp
// 获取指定位置的网格点坐标
void get_node_coord(int i, int j, // 节点索引
double &x, double &y) const;
// 获取指定位置的单元中心坐标
void get_elem_center(int i, int j, // 单元索引
double &x, double &y) const;
// 获取指定坐标所在的网格单元索引
bool get_elem_index(double x, double y, // 坐标
int &i, int &j) 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_2d mesh2d;
mesh2d.init("mesh2d", "2D regular mesh",
100, 100, // 100x100网格
0.0, 0.0, // 起点(0,0)
1.0, 1.0); // 终点(1,1)
// 获取网格信息
int nx, ny;
mesh2d.get_mesh_num(nx, ny);
double dx, dy;
mesh2d.get_mesh_step(dx, dy);
// 获取特定位置的坐标
double x, y;
mesh2d.get_node_coord(50, 50, x, y); // 获取中心点坐标
// 添加数据并保存
mesh2d.add_data(gctl::NodeData, gctl::Scalar, "elevation", 0.0);
mesh2d.save_gmsh("terrain.msh", gctl::Packed);
```
## 注意事项
1. 网格间距可以自动计算或手动指定
2. 提供了坐标与网格索引之间的转换功能
3. 所有索引都是从0开始计数
4. 网格点和单元的编号是规则的,遵循行优先顺序
5. 支持Gmsh和二进制格式的文件操作

106
doc/regular_mesh_3d.md Normal file
View File

@ -0,0 +1,106 @@
# 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. 内存占用随网格规模的立方增长,使用大规模网格时需注意内存管理

115
doc/regular_mesh_sph_3d.md Normal file
View File

@ -0,0 +1,115 @@
# GCTL Regular Mesh Spherical 3D 文档
## 简介
`regular_mesh_sph_3d.h` 定义了GCTL网格库中的三维球面规则网格类 `regular_mesh_sph_3d`,用于创建和管理球面坐标系下的三维规则网格。该类特别适用于地球物理学中的球面网格计算。
## 类继承
`regular_mesh_sph_3d` 继承自 `base_mesh` 基类,实现了所有虚函数,并添加了球面网格特有的功能。
## 主要API
### 初始化
```cpp
// 初始化三维球面规则网格
void init(std::string name, // 网格名称
std::string info, // 网格信息
double lat0, // 起始纬度
double lon0, // 起始经度
double r0, // 起始半径
double dlat, // 纬度间隔
double dlon, // 经度间隔
double dr, // 半径间隔
int nlat, // 纬度方向网格数
int nlon, // 经度方向网格数
int nr); // 径向网格数
```
### 网格信息
```cpp
// 获取网格点数
void get_mesh_num(int &nlat, int &nlon, int &nr) const;
// 获取网格范围
void get_mesh_range(double &lat0, double &lon0, double &r0, // 起点
double &lat1, double &lon1, double &r1) const; // 终点
// 获取网格间距
void get_mesh_step(double &dlat, double &dlon, double &dr) const;
```
### 网格操作
```cpp
// 获取指定位置的网格点球面坐标
void get_node_coord_sph(int i, int j, int k, // 节点索引
double &lat, double &lon, double &r) const;
// 获取指定位置的网格点笛卡尔坐标
void get_node_coord(int i, int j, int k, // 节点索引
double &x, double &y, double &z) const;
// 获取指定位置的单元中心球面坐标
void get_elem_center_sph(int i, int j, int k, // 单元索引
double &lat, double &lon, double &r) const;
// 获取指定位置的单元中心笛卡尔坐标
void get_elem_center(int i, int j, int k, // 单元索引
double &x, double &y, double &z) const;
// 获取指定球面坐标所在的网格单元索引
bool get_elem_index(double lat, double lon, double r, // 球面坐标
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_sph_3d mesh_sph;
mesh_sph.init("earth_mesh", "Earth model mesh",
-90.0, -180.0, 6371.0, // 起始点:南极点,经度-180度地球半径
1.0, 1.0, 10.0, // 间隔1度纬度1度经度10km深度
180, 360, 100); // 网格数180纬度360经度100层
// 获取网格信息
int nlat, nlon, nr;
mesh_sph.get_mesh_num(nlat, nlon, nr);
// 获取特定位置的坐标(球面坐标)
double lat, lon, r;
mesh_sph.get_node_coord_sph(90, 180, 0, lat, lon, r); // 获取中心点坐标
// 获取特定位置的坐标(笛卡尔坐标)
double x, y, z;
mesh_sph.get_node_coord(90, 180, 0, x, y, z);
// 添加数据并保存
mesh_sph.add_data(gctl::NodeData, gctl::Scalar, "temperature", 0.0);
mesh_sph.save_gmsh("earth_model.msh", gctl::Packed);
```
## 注意事项
1. 坐标系采用地理坐标系约定:
- 纬度范围:-90度南极到90度北极
- 经度范围:-180度到180度
- 半径:从地心开始计算
2. 提供了球面坐标和笛卡尔坐标的双重表示
3. 网格在极点附近可能出现变形,需要特别处理
4. 经度方向是周期性的可以处理跨越180度经线的情况
5. 支持Gmsh和二进制格式的文件操作
6. 适用于地球物理建模、大气科学等领域

152
doc/tet_mesh.md Normal file
View File

@ -0,0 +1,152 @@
# GCTL Tetrahedral Mesh 文档
## 简介
`tet_mesh.h` 定义了GCTL网格库中的四面体网格类 `tet_mesh`,用于创建和管理三维空间中的非结构化四面体网格。该类特别适用于复杂三维区域的离散化,支持任意形状的体积域。
## 类继承
`tet_mesh` 继承自 `base_mesh` 基类,实现了所有虚函数,并添加了四面体网格特有的功能。
## 主要API
### 初始化
```cpp
// 初始化四面体网格
void init(std::string name, // 网格名称
std::string info, // 网格信息
const array<point3dc> &nodes, // 节点坐标数组
const array<int4> &elements); // 单元连接关系数组
```
### 网格信息
```cpp
// 获取节点坐标
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; // 半径
```
### 网格查询
```cpp
// 查找包含指定点的单元
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;
```
### 网格质量评估
```cpp
// 获取单元质量参数
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;
```
### 文件操作
```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<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>

138
doc/tri_mesh.md Normal file
View File

@ -0,0 +1,138 @@
# 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. 网格质量对计算结果有重要影响,建议进行质量检查