gctl_mesh/README.md
2025-02-03 11:09:59 +08:00

246 lines
7.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.

![logo](GCTL_logo.jpg)
# GCTL Mesh Library
GCTL Mesh是地球物理计算工具库(Geophysical Computational Tools & Library)的网格处理模块,提供了多种类型的网格实现和操作功能。
## 功能特点
- 支持多种网格类型的创建和操作
- 提供2D和3D网格的实现
- 包含规则网格和非规则网格的处理
- 支持球面网格的处理
- 支持网格数据的导入导出包括Gmsh格式和二进制格式
- 支持标量、矢量和张量数据的处理
## 代码库结构
### 核心库 (lib/)
```
lib/
├── mesh/ # 核心网格实现
│ ├── mesh.h # 网格基类
│ ├── meshdata.h # 网格数据结构
│ ├── regular_grid.h # 规则网格实现
│ ├── linear_mesh_2d.h # 2D线性网格
│ ├── linear_mesh_3d.h # 3D线性网格
│ ├── tri_mesh.h # 三角形网格
│ ├── tet_mesh.h # 四面体网格
│ └── regular_mesh_sph_3d.h # 球面网格
├── io/ # 输入输出处理
│ ├── gmsh_io.h # Gmsh格式支持
│ ├── netcdf_io.h # NetCDF格式支持
│ └── binary_io.h # 二进制格式支持
└── utils/ # 工具函数
├── math_utils.h # 数学工具
└── geo_utils.h # 几何工具
```
### 依赖关系
- `mesh.h` → 基类,定义网格接口
- `meshdata.h` → 依赖 mesh.h实现数据管理
- 具体网格类 → 继承自 mesh.h实现特定网格功能
## 实现细节
### 数据结构
#### 网格节点 (Node)
```cpp
struct Node {
int id; // 节点ID
double x, y, z; // 节点坐标
array<int> elems; // 相邻单元列表
};
```
#### 网格单元 (Element)
```cpp
struct Element {
int id; // 单元ID
array<Node*> vertices; // 顶点列表
array<Element*> neighbors; // 相邻单元
};
```
#### 数据管理 (MeshData)
```cpp
class MeshData {
string name; // 数据名称
DataType type; // 数据类型
array<double> values; // 数据值
bool output_enabled; // 输出控制
};
```
### 核心功能实现
#### 网格生成
- 规则网格:基于给定维度和间距生成
- 非规则网格:支持从外部文件导入或程序化生成
- 球面网格:基于经纬度和径向参数生成
#### 数据操作
- 插值:支持线性插值和高阶插值
- 梯度计算:支持一阶和二阶导数
- 数据过滤:支持平滑和降噪操作
#### 文件格式支持
- Gmsh格式`.msh`文件,支持网格和数据的导入导出
- NetCDF格式`.nc`文件,支持结构化数据的存储
- 二进制格式:`.bin`文件,用于高效的数据存储和读取
### 性能优化
#### 数据结构优化
- 使用连续内存存储提高访问效率
- 采用邻接表存储拓扑关系
- 使用哈希表加速查找操作
#### 算法优化
- 网格生成采用增量构建策略
- 查找操作使用空间分区技术
- 并行计算支持(可选)
## 文档
### 基础类
- [`mesh.h`](doc/mesh.md): 网格基类,定义了基本的网格接口和功能
- [`meshdata.h`](doc/meshdata.md): 网格数据结构的定义和处理
### 规则网格
- [`regular_grid.h`](doc/regular_grid.md): 通用规则网格实现支持2D和3D
- [`regular_mesh_2d.h`](doc/regular_mesh_2d.md): 二维规则网格专注于2D结构化网格
- [`regular_mesh_3d.h`](doc/regular_mesh_3d.md): 三维规则网格专注于3D结构化网格
- [`regular_mesh_sph_3d.h`](doc/regular_mesh_sph_3d.md): 三维球面规则网格,适用于地球物理建模
### 线性网格
- [`linear_mesh_2d.h`](doc/linear_mesh_2d.md): 二维线性网格用于表示2D空间中的线段
- [`linear_mesh_3d.h`](doc/linear_mesh_3d.md): 三维线性网格用于表示3D空间中的曲线
### 非规则网格
- [`tri_mesh.h`](doc/tri_mesh.md): 三角形网格用于复杂2D区域的离散化
- [`tet_mesh.h`](doc/tet_mesh.md): 四面体网格用于复杂3D区域的离散化
## 编译和安装
### 系统要求
- C++11或更高版本
- CMake 3.10或更高版本
- 可选依赖:
- NetCDF (用于NetCDF格式支持)
- MathGL (用于可视化支持)
- GMT (用于地理数据处理)
### 编译步骤
```bash
mkdir build
cd build
cmake ..
make
make install
```
### 配置选项
- `GCTL_ENABLE_NETCDF`: 启用NetCDF支持
- `GCTL_ENABLE_MATHGL`: 启用MathGL可视化
- `GCTL_ENABLE_GMT`: 启用GMT支持
- `GCTL_BUILD_EXAMPLES`: 构建示例程序
- `GCTL_BUILD_TESTS`: 构建测试程序
## 应用场景
- **规则网格**:适用于简单几何形状的离散化,如矩形/立方体区域
- **线性网格**
- 2D用于表示边界、裂缝等线性特征
- 3D用于表示输电线路、管道系统、裂缝网络等
- **三角形网格**适用于复杂2D区域的有限元分析、流体动力学等
- **四面体网格**适用于复杂3D区域的有限元分析、计算流体力学等
- **球面网格**:特别适用于地球物理学、大气科学等全球尺度的模拟
## 性能考虑
### 内存管理
- 大规模网格处理时注意内存使用
- 支持数据流式处理
- 提供内存使用估算功能
### 计算效率
- 网格操作采用高效算法
- 支持并行计算(可选)
- 提供性能分析工具
## API示例
详细的API使用示例请参考各个网格类型的文档。基本使用模式如下
```cpp
// 创建网格对象
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.save_gmsh("output.msh", gctl::OverWrite);
```
## 许可证
该项目采用双重许可证方案:
1. GNU Lesser General Public License v2或更高版本
2. 商业许可证(需单独申请)
## 联系方式
作者Yi Zhang (yizhang-geo@zju.edu.cn)
## 版权声明
Copyright (c) 2023 Yi Zhang
## 使用示例
库提供了多个完整的示例程序,展示了不同功能的使用方法:
### 基础网格操作
```cpp
// mesh_ex1.cpp - 基础网格创建和数据操作
gctl::regular_grid rgd;
rgd.init("grid-1", "null", 4, 4, 0.0, 0.0, 1.0, 1.0); // 创建4x4网格
rgd.add_data(gctl::NodeData, gctl::Scalar, "data-1", 2.5); // 添加节点数据
rgd.add_data(gctl::ElemData, gctl::Scalar, "data-2", 1.2); // 添加单元数据
```
### 文件导入导出
```cpp
// mesh_ex5.cpp - NetCDF格式文件操作
gctl::regular_grid rgd;
rgd.load_netcdf_grid("data/input.nc", gctl::ElemData, "x", "y"); // 读取网格
rgd.save_netcdf_grid("data/output.nc", "example"); // 保存网格
```
### 球面网格处理
```cpp
// mesh_ex10.cpp - 3D球面网格创建
gctl::regular_mesh_sph_3d rm_3ds;
rm_3ds.init("mesh-1", "null", 30.25, 30.25, 2005, 0.5, 0.5, 10, 40, 40, 50);
rm_3ds.add_data(gctl::ElemData, gctl::Scalar, "data-1", 2.5);
rm_3ds.save_gmsh("mesh_sample10", gctl::OverWrite, gctl::NotPacked);
```
更多示例可以在`example`目录下找到:
- `mesh_ex1.cpp`: 基础网格创建和数据操作
- `mesh_ex2.cpp`: 网格数据的导入导出
- `mesh_ex3.cpp`: 网格变换和操作
- `mesh_ex4.cpp`: 非结构化网格处理
- `mesh_ex5.cpp`: NetCDF格式文件操作
- `mesh_ex6.cpp`: 网格数据插值
- `mesh_ex7.cpp`: 网格数据统计分析
- `mesh_ex8.cpp`: 二维规则网格操作
- `mesh_ex9.cpp`: 三维规则网格操作
- `mesh_ex10.cpp`: 球面网格处理