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

3.3 KiB

GCTL Linear Mesh 2D 文档

简介

linear_mesh_2d.h 定义了GCTL网格库中的二维线性网格类 linear_mesh_2d,用于创建和管理二维非结构化线性网格。该类支持不规则分布的网格点,适用于复杂几何形状的离散化。

类继承

linear_mesh_2d 继承自 base_mesh 基类,实现了所有虚函数,并添加了二维线性网格特有的功能。

主要API

初始化

// 初始化二维线性网格
void init(std::string name,                // 网格名称
          std::string info,                // 网格信息
          const array<point2dc> &nodes,    // 节点坐标数组
          const array<int2> &elements);    // 单元连接关系数组

网格信息

// 获取节点坐标
void get_node_coord(int node_idx,          // 节点索引
                   double &x, double &y) const;

// 获取单元节点索引
void get_elem_nodes(int elem_idx,          // 单元索引
                   int &n1, int &n2) const;

// 获取单元中心坐标
void get_elem_center(int elem_idx,         // 单元索引
                    double &x, double &y) const;

// 获取单元长度
double get_elem_length(int elem_idx) const;

网格查询

// 查找包含指定点的单元
bool find_element(double x, double y,      // 目标点坐标
                 int &elem_idx) const;     // 返回单元索引

// 获取节点相邻的单元
array<int> get_node_elements(int node_idx) const;

// 获取单元相邻的单元
array<int> get_elem_neighbors(int elem_idx) 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;

使用示例

// 创建节点坐标数组
array<point2dc> nodes;
nodes.push_back(point2dc(0.0, 0.0));
nodes.push_back(point2dc(1.0, 0.0));
nodes.push_back(point2dc(1.0, 1.0));
nodes.push_back(point2dc(0.0, 1.0));

// 创建单元连接关系
array<int2> elements;
elements.push_back(int2(0, 1));  // 第一条边
elements.push_back(int2(1, 2));  // 第二条边
elements.push_back(int2(2, 3));  // 第三条边
elements.push_back(int2(3, 0));  // 第四条边

// 创建线性网格
gctl::linear_mesh_2d mesh2d;
mesh2d.init("boundary", "2D boundary mesh", nodes, elements);

// 获取单元信息
double length = mesh2d.get_elem_length(0);  // 获取第一条边的长度

// 查找包含特定点的单元
int elem_idx;
if (mesh2d.find_element(0.5, 0.5, elem_idx)) {
    // 找到包含点(0.5,0.5)的单元
}

// 添加数据并保存
mesh2d.add_data(gctl::NodeData, gctl::Scalar, "displacement", 0.0);
mesh2d.save_gmsh("boundary.msh", gctl::Packed);

注意事项

  1. 线性网格主要用于表示一维结构(如边界)在二维空间中的分布
  2. 每个单元由两个节点定义,表示一条线段
  3. 节点和单元的编号从0开始
  4. 支持不规则分布的节点,适合复杂几何形状
  5. 提供了网格拓扑关系查询功能(节点相邻单元、单元相邻单元等)
  6. 支持Gmsh和二进制格式的文件操作
  7. 适用于边界元素法、有限元法等数值计算