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

4.1 KiB
Raw Permalink Blame History

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);

注意事项

  1. 坐标系采用地理坐标系约定:
    • 纬度范围:-90度南极到90度北极
    • 经度范围:-180度到180度
    • 半径:从地心开始计算
  2. 提供了球面坐标和笛卡尔坐标的双重表示
  3. 网格在极点附近可能出现变形,需要特别处理
  4. 经度方向是周期性的可以处理跨越180度经线的情况
  5. 支持Gmsh和二进制格式的文件操作
  6. 适用于地球物理建模、大气科学等领域