gctl_mesh/README.md
2025-01-13 00:10:04 +08:00

160 lines
4.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.

![](./doc/mesh_logo.png)
# GCTL Mesh Library
GCTL Mesh是地球物理计算工具库(Geophysical Computational Tools & Library)的网格处理模块,提供了多种类型的网格实现和操作功能。
## 功能特点
- 支持多种网格类型的创建和操作
- 提供2D和3D网格的实现
- 包含规则网格和非规则网格的处理
- 支持球面网格的处理
- 支持网格数据的导入导出包括Gmsh格式和二进制格式
- 支持标量、矢量和张量数据的处理
## 主要组件
### 基础网格类型
- `mesh.h`: 网格基类,定义了基本的网格接口和功能
- `meshdata.h`: 网格数据结构的定义和处理
### 规则网格
- `regular_grid`: 通用规则网格实现
- `regular_mesh_2d`: 二维规则网格
- `regular_mesh_3d`: 三维规则网格
- `regular_mesh_sph_3d`: 三维球面规则网格
### 线性网格
- `linear_mesh_2d`: 二维线性网格
- `linear_mesh_3d`: 三维线性网格
### 非规则网格
- `tri_mesh`: 三角形网格
- `tet_mesh`: 四面体网格
## 核心功能
### 网格数据管理
- 支持在顶点或单元上定义数据
- 支持三种数据类型:
- 标量数据 (Scalar)
- 矢量数据 (Vector)
- 张量数据 (Tensor)
- 数据操作功能:
- 添加/删除数据
- 数据导入导出
- 数据统计分析
### 网格操作
- 网格初始化和清理
- 网格信息查询(节点数、单元数等)
- 网格文件导入导出
- 支持Gmsh格式
- 支持二进制格式
- 网格数据可视化输出
### 网格类型
支持的网格维度:
- 0D网格 (MESH_0D)
- 2D网格 (MESH_2D)
- 3D网格 (MESH_3D)
支持的网格类别:
- 规则网格 (REGULAR_MESH)
- 线性网格 (LINEAR_MESH)
- 三角形/四面体网格 (TRI_TET_MESH)
- 球面规则网格 (REGULAR_MESH_SPH)
- 球面线性网格 (LINEAR_MESH_SPH)
- 球面三角形/四面体网格 (TRI_TET_MESH_SPH)
- 规则网格 (REGULAR_GRID)
## API示例
### 数据操作
```cpp
// 添加数据
meshdata &add_data(mesh_data_type_e type, // 数据位置类型(顶点/单元)
mesh_data_value_e valtype, // 数据值类型(标量/矢量/张量)
string name, // 数据名称
double init_val, // 初始值
bool if_output = true); // 是否可输出
// 获取数据
meshdata &get_data(string datname);
// 删除数据
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);
```
## 许可证
该项目采用双重许可证方案:
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`: 球面网格处理