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