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