gctl_mesh/doc/regular_mesh_sph_3d.md

115 lines
4.1 KiB
Markdown
Raw Normal View History

2025-01-13 09:15:55 +08:00
# 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. 适用于地球物理建模、大气科学等领域