#ifndef _HEAD_FUNC_H #define _HEAD_FUNC_H #include "iostream" #include "fstream" #include "sstream" #include "string.h" #include "cmath" #include "iomanip" #include "stdio.h" #include "stdlib.h" #include "unistd.h" #include "vector" #include "map" #include "algorithm" #include "ctime" #include "omp.h" #include "random" using namespace std; //数学常量 #define BDL_MAX 1e+30 ///< 定义变量的最大值 #define BDL_MIN -1e+30 ///< 定义变量的最小值 #define ZERO 1e-20 ///< 定义零值 //物理常量 #define Pi (4.0*atan(1.0)) ///< 圆周率 #define G0 6.67408e-3 ///< 万有引力常数。注意这里的量级本来应该是e-11,考虑到单位转换,取维度单位为m,密度单位为g/cm^3,乘以G0则重力单位即为mGal #define T0 5e+4 ///< 地磁场平均强度 //宏函数 #define MAX(a,b) (a>b?a:b) ///< 返回a与b的最大值 #define MIN(a,b) (a _1iArray; ///< 整形一维向量 typedef vector _1dArray; ///< 双精度浮点一维向量 typedef vector _1sArray; ///< 字符串一维向量 typedef vector > _2iArray; ///< 整形浮点二维向量 typedef vector > _2dArray; ///< 双精度浮点二维向量 typedef map int2intMap; ///< 整型到整形的映射 /** * @brief 点结构体 * * 直角坐标系下的一个实点,包含该点的坐标位置与点的编号。 */ struct cpoint{ int id = -1; ///< 点的索引值。初始值为-1,一般从0开始标号。 double x = BDL_MAX; ///< 点的x坐标值。 double y = BDL_MAX; ///< 点的y坐标值。 double z = BDL_MAX; ///< 点的z坐标值。 }; /** *@brief cpoint结构体的向量。 */ typedef vector cpointArray; /** * @brief 观测点结构体 * * 直角坐标系下的一个观测点。该结构体由cpoint继承而来,增加了观测点的数值val与不确定度dev。 */ struct obspoint : cpoint{ double val = BDL_MAX; ///< 标量观测值,初始值为BDL_MAX。 double dev = BDL_MAX; ///< 观测值的不确定度,初始值为BDL_MAX。 }; /** * @brief obspoint结构体的向量。 */ typedef vector obspointArray; /** * @brief 方块结构体 * * 直角坐标系下表示一个方块的结构体。 */ struct block{ int id = -1; ///< 块体的索引。初始值为-1,一般从0开始编号。 int phy_group = -1; ///< 块体所属的物理组编号。初始值为-1。 int vert[4] = {-1,-1,-1,-1}; ///< 块体的四个角点的索引值。初始值均为-1。 double xmin = BDL_MAX; ///< 块体在x坐标轴的最小值。 double xmax = BDL_MIN; ///< 块体在x坐标轴的最大值。 double ymin = BDL_MAX; ///< 块体在y坐标轴的最小值。 double ymax = BDL_MIN; ///< 块体在y坐标轴的最大值。 double zmin = BDL_MAX; ///< 块体在z坐标轴的最小值。 double zmax = BDL_MIN; ///< 块体在z坐标轴的最大值。 }; /** * @brief block结构体的向量 */ typedef vector blockArray; /*************************矢量函数********************************/ /** * @brief 矢量减法 * * @param[in] 输入向量 * @param[in] 输入向量 * * @return 两个向量的差值。 */ cpoint operator -(cpoint,cpoint); /** * @brief 矢量数乘法 * * @param[in] 输入标量值 * @param[in] 输入向量 * * @return 标量与向量的乘积 */ cpoint operator *(double,cpoint); /** * @brief 求一个矢量的模 * * @param[in] 输入向量 * * @return 向量的模 */ double modCpoint(cpoint); /** * @brief 求两个向量的夹角 * * @param[in] 输入向量 * @param[in] 输入向量 * * @return 输入向量的夹角 */ double angCpoint(cpoint,cpoint); /*************************全局函数********************************/ /** * @brief 返回反正切角 * * @param[in] 一个double类型的浮点值 * * @return 一个double类型的浮点值 */ double arctg(double); /** * @brief 将string转换为stringstream * * @param[in] 输入字符串 * * @return CString类型字符串 */ stringstream str2ss(string); /** * @brief 打开输入文件并返回执行情况 * * @param ifstream对象 * @param 文件名 * * @return 执行成功返回0,不成功则返回-1并输出错误信息。 */ int open_infile(ifstream&, const char*); /** * @brief 打开输出文件并返回执行情况 * * @param ofstream对象 * @param 文件名 * * @return 执行成功返回0,不成功则返回-1并输出错误信息。 */ int open_outfile(ofstream&, const char*); /** * @brief 规则网格内插值 * * @param[in] 输入参数 * * @return 给定点位的插值 */ double cube_interpolate(double, double, double, double, double, double, double, double, double, double); //四方块内的双线性插值 #endif