2025-01-13 00:12:53 +08:00
|
|
|
|

|
2025-01-13 00:10:04 +08:00
|
|
|
|
|
|
|
|
|
# GCTL Mesh Library
|
|
|
|
|
|
|
|
|
|
GCTL Mesh是地球物理计算工具库(Geophysical Computational Tools & Library)的网格处理模块,提供了多种类型的网格实现和操作功能。
|
|
|
|
|
|
|
|
|
|
## 功能特点
|
|
|
|
|
|
|
|
|
|
- 支持多种网格类型的创建和操作
|
|
|
|
|
- 提供2D和3D网格的实现
|
|
|
|
|
- 包含规则网格和非规则网格的处理
|
|
|
|
|
- 支持球面网格的处理
|
|
|
|
|
- 支持网格数据的导入导出(包括Gmsh格式和二进制格式)
|
|
|
|
|
- 支持标量、矢量和张量数据的处理
|
|
|
|
|
|
2025-02-03 11:09:59 +08:00
|
|
|
|
## 代码库结构
|
|
|
|
|
|
|
|
|
|
### 核心库 (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`文件,用于高效的数据存储和读取
|
|
|
|
|
|
|
|
|
|
### 性能优化
|
|
|
|
|
|
|
|
|
|
#### 数据结构优化
|
|
|
|
|
- 使用连续内存存储提高访问效率
|
|
|
|
|
- 采用邻接表存储拓扑关系
|
|
|
|
|
- 使用哈希表加速查找操作
|
|
|
|
|
|
|
|
|
|
#### 算法优化
|
|
|
|
|
- 网格生成采用增量构建策略
|
|
|
|
|
- 查找操作使用空间分区技术
|
|
|
|
|
- 并行计算支持(可选)
|
|
|
|
|
|
2025-01-13 09:15:55 +08:00
|
|
|
|
## 文档
|
2025-01-13 00:10:04 +08:00
|
|
|
|
|
2025-01-13 09:15:55 +08:00
|
|
|
|
### 基础类
|
|
|
|
|
- [`mesh.h`](doc/mesh.md): 网格基类,定义了基本的网格接口和功能
|
|
|
|
|
- [`meshdata.h`](doc/meshdata.md): 网格数据结构的定义和处理
|
2025-01-13 00:10:04 +08:00
|
|
|
|
|
|
|
|
|
### 规则网格
|
2025-01-13 09:15:55 +08:00
|
|
|
|
- [`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): 三维球面规则网格,适用于地球物理建模
|
2025-01-13 00:10:04 +08:00
|
|
|
|
|
|
|
|
|
### 线性网格
|
2025-01-13 09:15:55 +08:00
|
|
|
|
- [`linear_mesh_2d.h`](doc/linear_mesh_2d.md): 二维线性网格,用于表示2D空间中的线段
|
|
|
|
|
- [`linear_mesh_3d.h`](doc/linear_mesh_3d.md): 三维线性网格,用于表示3D空间中的曲线
|
2025-01-13 00:10:04 +08:00
|
|
|
|
|
|
|
|
|
### 非规则网格
|
2025-01-13 09:15:55 +08:00
|
|
|
|
- [`tri_mesh.h`](doc/tri_mesh.md): 三角形网格,用于复杂2D区域的离散化
|
|
|
|
|
- [`tet_mesh.h`](doc/tet_mesh.md): 四面体网格,用于复杂3D区域的离散化
|
2025-01-13 00:10:04 +08:00
|
|
|
|
|
2025-02-03 11:09:59 +08:00
|
|
|
|
## 编译和安装
|
|
|
|
|
|
|
|
|
|
### 系统要求
|
|
|
|
|
- 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`: 构建测试程序
|
2025-01-13 00:10:04 +08:00
|
|
|
|
|
2025-01-13 09:15:55 +08:00
|
|
|
|
## 应用场景
|
2025-01-13 00:10:04 +08:00
|
|
|
|
|
2025-01-13 09:15:55 +08:00
|
|
|
|
- **规则网格**:适用于简单几何形状的离散化,如矩形/立方体区域
|
|
|
|
|
- **线性网格**:
|
|
|
|
|
- 2D:用于表示边界、裂缝等线性特征
|
|
|
|
|
- 3D:用于表示输电线路、管道系统、裂缝网络等
|
|
|
|
|
- **三角形网格**:适用于复杂2D区域的有限元分析、流体动力学等
|
|
|
|
|
- **四面体网格**:适用于复杂3D区域的有限元分析、计算流体力学等
|
|
|
|
|
- **球面网格**:特别适用于地球物理学、大气科学等全球尺度的模拟
|
2025-01-13 00:10:04 +08:00
|
|
|
|
|
2025-02-03 11:09:59 +08:00
|
|
|
|
## 性能考虑
|
|
|
|
|
|
|
|
|
|
### 内存管理
|
|
|
|
|
- 大规模网格处理时注意内存使用
|
|
|
|
|
- 支持数据流式处理
|
|
|
|
|
- 提供内存使用估算功能
|
|
|
|
|
|
|
|
|
|
### 计算效率
|
|
|
|
|
- 网格操作采用高效算法
|
|
|
|
|
- 支持并行计算(可选)
|
|
|
|
|
- 提供性能分析工具
|
|
|
|
|
|
2025-01-13 09:15:55 +08:00
|
|
|
|
## API示例
|
2025-01-13 00:10:04 +08:00
|
|
|
|
|
2025-01-13 09:15:55 +08:00
|
|
|
|
详细的API使用示例请参考各个网格类型的文档。基本使用模式如下:
|
2025-01-13 00:10:04 +08:00
|
|
|
|
|
|
|
|
|
```cpp
|
2025-01-13 09:15:55 +08:00
|
|
|
|
// 创建网格对象
|
|
|
|
|
gctl::regular_grid rgd;
|
|
|
|
|
rgd.init("grid-1", "test grid", 4, 4, 0.0, 0.0, 1.0, 1.0);
|
2025-01-13 00:10:04 +08:00
|
|
|
|
|
2025-01-13 09:15:55 +08:00
|
|
|
|
// 添加数据
|
|
|
|
|
rgd.add_data(gctl::NodeData, gctl::Scalar, "temperature", 25.0);
|
|
|
|
|
rgd.add_data(gctl::ElemData, gctl::Vector, "velocity", velocity_array);
|
2025-01-13 00:10:04 +08:00
|
|
|
|
|
2025-01-13 09:15:55 +08:00
|
|
|
|
// 保存网格
|
|
|
|
|
rgd.save_gmsh("output.msh", gctl::OverWrite);
|
2025-01-13 00:10:04 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 许可证
|
|
|
|
|
|
|
|
|
|
该项目采用双重许可证方案:
|
|
|
|
|
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`: 球面网格处理
|
2024-09-10 20:00:49 +08:00
|
|
|
|
|