4.1 KiB
4.1 KiB
GCTL Regular Mesh Spherical 3D 文档
简介
regular_mesh_sph_3d.h
定义了GCTL网格库中的三维球面规则网格类 regular_mesh_sph_3d
,用于创建和管理球面坐标系下的三维规则网格。该类特别适用于地球物理学中的球面网格计算。
类继承
regular_mesh_sph_3d
继承自 base_mesh
基类,实现了所有虚函数,并添加了球面网格特有的功能。
主要API
初始化
// 初始化三维球面规则网格
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); // 径向网格数
网格信息
// 获取网格点数
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;
网格操作
// 获取指定位置的网格点球面坐标
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; // 返回单元索引
文件操作
// 保存为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;
使用示例
// 创建三维球面规则网格
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);
注意事项
- 坐标系采用地理坐标系约定:
- 纬度范围:-90度(南极)到90度(北极)
- 经度范围:-180度到180度
- 半径:从地心开始计算
- 提供了球面坐标和笛卡尔坐标的双重表示
- 网格在极点附近可能出现变形,需要特别处理
- 经度方向是周期性的,可以处理跨越180度经线的情况
- 支持Gmsh和二进制格式的文件操作
- 适用于地球物理建模、大气科学等领域