gctl_mesh/lib/mesh/regular_grid.h
2025-01-17 16:34:58 +08:00

334 lines
11 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/********************************************************
* ██████╗ ██████╗████████╗██╗
* ██╔════╝ ██╔════╝╚══██╔══╝██║
* ██║ ███╗██║ ██║ ██║
* ██║ ██║██║ ██║ ██║
* ╚██████╔╝╚██████╗ ██║ ███████╗
* ╚═════╝ ╚═════╝ ╚═╝ ╚══════╝
* Geophysical Computational Tools & Library (GCTL)
*
* Copyright (c) 2023 Yi Zhang (yizhang-geo@zju.edu.cn)
*
* GCTL is distributed under a dual licensing scheme. You can redistribute
* it and/or modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation, either version 2
* of the License, or (at your option) any later version. You should have
* received a copy of the GNU Lesser General Public License along with this
* program. If not, see <http://www.gnu.org/licenses/>.
*
* If the terms and conditions of the LGPL v.2. would prevent you from using
* the GCTL, please consider the option to obtain a commercial license for a
* fee. These licenses are offered by the GCTL's original author. As a rule,
* licenses are provided "as-is", unlimited in time for a one time fee. Please
* send corresponding requests to: yizhang-geo@zju.edu.cn. Please do not forget
* to include some description of your company and the realm of its activities.
* Also add information on how to contact you by electronic and paper mail.
******************************************************/
#ifndef _GCTL_REGULAR_GRID_H
#define _GCTL_REGULAR_GRID_H
#include "gctl/graphic.h"
#include "mesh.h"
#ifdef GCTL_MESH_EXPRTK
#include "exprtk.hpp"
#endif // GCTL_MESH_EXPRTK
namespace gctl
{
/**
* @brief 规则网格对象
*
*/
class regular_grid : public base_mesh
{
public:
/**
* 以下为mesh类型的虚函数实现
*/
void load_gmsh(std::string filename, index_packed_e packed = Packed){}
/**
* @brief 基类纯虚函数的具体实现保存网格到Gmsh文件。
*
* @param filename 文件名
* @param packed 索引是否为紧凑从0开始
*/
void save_gmsh(std::string filename, index_packed_e packed = Packed);
/**
* @brief (基类纯虚函数的具体实现)读入二进制网格文件
*
* @param filename 文件名
*/
void load_binary(std::string filename);
/**
* @brief (基类纯虚函数的具体实现)写入二进制网格文件
*
* @param filename 文件名
*/
void save_binary(std::string filename);
/**
* @brief (基类纯虚函数的具体实现)显示网格的维度信息
*/
void show_mesh_dimension(std::ostream &os) const;
/**
* 以下为regular_grid的专有函数
*/
regular_grid(); ///< 构造函数
/**
* @brief 构造函数
*
* @param in_name 网格名称
* @param in_info 网格说明
* @param xnum 网格x方向单元数量
* @param ynum 网格y方向单元数量
* @param xmin 网格x方向最小值
* @param ymin 网格y方向最小值
* @param dx 网格x方向单元长度
* @param dy 网格y方向单元长度
*/
regular_grid(std::string in_name, std::string in_info, int xnum, int ynum,
double xmin, double ymin, double dx, double dy);
virtual ~regular_grid(); ///< 析构函数
/**
* @brief 初始化规则网格
*
* @param in_name 网格名称
* @param in_info 网格说明
* @param xnum 网格x方向单元数量
* @param ynum 网格y方向单元数量
* @param xmin 网格x方向最小值
* @param ymin 网格y方向最小值
* @param dx 网格x方向单元长度
* @param dy 网格y方向单元长度
*/
void init(std::string in_name, std::string in_info, int xnum, int ynum,
double xmin, double ymin, double dx, double dy);
/**
* @brief 清除规则网格
*/
void clear_regular_grid();
/**
* @brief 使用mathgl显示规则网格
*
* @param datname 数据名称
* @return 状态代码
*/
int view(std::string datname);
/**
* @brief 使用gmt绘制规则网格
*
* @param datname 数据名称
*/
void plot(std::string datname);
int get_xdim() const; ///< 获取规则网格的x方向单元数量
int get_ydim() const; ///< 获取规则网格的y方向单元数量
double get_xmin() const; ///< 获取规则网格的x方向最小值
double get_ymin() const; ///< 获取规则网格的y方向最小值
double get_dx() const; ///< 获取规则网格的x方向单元长度
double get_dy() const; ///< 获取规则网格的y方向单元长度
#ifdef GCTL_NETCDF
/**
* @brief 从netcdf文件中读取规则网格数据
*
* @param filename 文件名
* @param d_type 数据类型
* @param xname x坐标变量名
* @param yname y坐标变量名
* @param zname z坐标变量名
*/
void load_netcdf_grid(std::string filename, mesh_data_type_e d_type,
std::string xname = "x", std::string yname = "y", std::string zname = "null");
/**
* @brief 保存规则网格数据到netcdf文件中
*
* @param filename 文件名
* @param d_type 数据类型
* @param xname x坐标变量名
* @param yname y坐标变量名
*/
void save_netcdf_grid(std::string filename, mesh_data_type_e d_type,
std::string xname = "x", std::string yname = "y");
/**
* @brief 保存规则网格数据到netcdf文件中
*
* @param filename 文件名
* @param datname 数据名称
* @param xname x坐标变量名
* @param yname y坐标变量名
*/
void save_netcdf_grid(std::string filename, std::string datname,
std::string xname = "x", std::string yname = "y");
#endif // GCTL_NETCDF
/**
* @brief 从surfer文件中读取规则网格数据
*
* @param filename 文件名
* @param datname 数据名称
* @param d_type 数据类型
* @param grid_type 网格类型
*/
void load_surfer_grid(std::string filename, std::string datname, mesh_data_type_e d_type, surfer_file_type_e grid_type = Surfer7Grid);
/**
* @brief 保存规则网格数据到surfer文件中
*
* @param filename 文件名
* @param datname 数据名称
* @param grid_type 网格类型
*/
void save_surfer_grid(std::string filename, std::string datname, surfer_file_type_e grid_type = Surfer7Grid);
/**
* @brief 保存规则网格数据到文本文件中
*
* @param filename 文件名
* @param datname 数据名称
*/
void save_text(std::string filename, const array<std::string> &datname);
/**
* @brief 从点云数据中提取规则网格数据
*
* @param in_posi 点云位置数组
* @param in_val 点云数据数组
* @param search_xlen 搜索范围x方向长度
* @param search_ylen 搜索范围y方向长度
* @param search_deg 搜索范围角度
* @param datname 新建数据名称
* @param d_type 新建数据类型
*/
void load_data_cloud(const array<point2dc> &in_posi, const array<double> &in_val, double search_xlen,
double search_ylen, double search_deg, std::string datname, mesh_data_type_e d_type = NodeData);
/**
* @brief 从规则网格数据中提取点云数据
*
* @param datname 数据名称
* @param in_posi 点云位置数组
* @param out_val 输出的点云数据数组
*/
void extract_points(std::string datname, const array<point2dc> &in_posi, array<double> &out_val);
/**
* @brief 从规则网格数据中提取剖面数据
*
* @param datname 数据名称
* @param start_p 剖面起点
* @param end_p 剖面终点
* @param size_p 剖面点数
* @param out_posi 输出的剖面位置数组
* @param out_val 输出的剖面数据数组
*/
void extract_profile(std::string datname, const point2dc &start_p, const point2dc &end_p, int size_p,
array<point2dc> &out_posi, array<double> &out_val);
/**
* @brief 计算规则网格数据的梯度数据
*
* @param datname 数据名称
* @param gradname 梯度数据名称
* @param d_type 梯度数据类型
* @param order 梯度阶数
*/
void gradient(std::string datname, std::string gradname, gradient_type_e d_type, int order = 1);
/**
* @brief 计算两个规则网格数据的和
*
* @param newname 新数据名称
* @param datname 数据名称
* @param datname2 数据名称2
*/
void sum(std::string newname, std::string datname, std::string datname2);
/**
* @brief 计算两个规则网格数据的差
*
* @param newname 新数据名称
* @param datname 数据名称
* @param datname2 数据名称2
*/
void diff(std::string newname, std::string datname, std::string datname2);
/**
* @brief 计算规则网格数据的布尔数据
*
* @param newname 新数据名称
* @param datname 数据名称
* @param maskname 掩码数据名称
* @param reverse 是否反转掩码
*/
void boolean(std::string newname, std::string datname, std::string maskname, bool reverse = false);
#ifdef GCTL_MESH_EXPRTK
/**
* @brief 计算规则网格数据的函数值其中f为节点位置xy的函数
*
* @param expression_str 表达式字符串
* @param newname 新数据名称
* @param x_str x变量名称
* @param y_str y变量名称
* @param f_str f变量名称
*/
void function(std::string expression_str, std::string newname, std::string x_str = "x", std::string y_str = "y", std::string f_str = "f");
/**
* @brief 计算规则网格数据的函数值,计算不同网格数据合成的函数值
*
* @param expression_str 表达式字符串
* @param var_list 变量名称列表
* @param data_list 数据名称列表
*/
void calculator(std::string expression_str, const array<std::string> &var_list, const array<std::string> &data_list);
#endif // GCTL_MESH_EXPRTK
#ifdef GCTL_MESH_WAVELIB
/**
* @brief 计算规则网格数据的小波数据
*
* @param datname 数据名称
* @param wavename 小波数据名称
* @param order 小波阶数
* @param summary 是否输出小波处理摘要
*/
void wavelet(std::string datname, std::string wavename, int order, bool summary = true);
#endif // GCTL_MESH_WAVELIB
protected:
int rg_xnum, rg_ynum; ///< 规则网格的x方向单元数量和y方向单元数量
double rg_xmin, rg_ymin; ///< 规则网格的x方向最小值和y方向最小值
double rg_dx, rg_dy; ///< 规则网格的x方向单元长度和y方向单元长度
array<vertex2dc> nodes; ///< 规则网格的节点数组
array<rectangle2d> elements; ///< 规则网格的单元数组
};
}
#endif //_GCTL_REGULAR_GRID_H