gctl_mesh/doc/regular_mesh_sph_3d.md
2025-01-13 09:15:55 +08:00

115 lines
4.1 KiB
Markdown
Raw Permalink 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.

# 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. 适用于地球物理建模、大气科学等领域