tmp
This commit is contained in:
parent
4f76487bc8
commit
2a4f54cf33
@ -78,6 +78,16 @@ gctl::meshdata &gctl::base_mesh::get_data(std::string datname)
|
||||
return datalist_[data_index(datname)];
|
||||
}
|
||||
|
||||
const gctl::meshdata &gctl::base_mesh::get_data(std::string datname) const
|
||||
{
|
||||
return datalist_[data_index(datname)];
|
||||
}
|
||||
|
||||
gctl::meshdata *gctl::base_mesh::get_data_ptr(std::string datname)
|
||||
{
|
||||
return &datalist_[data_index(datname)];
|
||||
}
|
||||
|
||||
void gctl::base_mesh::remove_data(std::string datname)
|
||||
{
|
||||
int idx = data_index(datname);
|
||||
|
@ -151,7 +151,7 @@ namespace gctl
|
||||
void set_meshinfo(std::string in_info);
|
||||
|
||||
/**
|
||||
* @brief 添加网格数据。
|
||||
* @brief 添加网格数据,并返回数据对象的引用。
|
||||
*
|
||||
* @param in_loctype 网格数据类型(块体或顶点数据)
|
||||
* @param in_valtype 网格数据值类型
|
||||
@ -160,13 +160,13 @@ namespace gctl
|
||||
* @param if_output 数据是否可用于输出
|
||||
* @param nan_val 数据无效值标记
|
||||
*
|
||||
* @return 数据对象
|
||||
* @return 数据对象的引用(非常量的)
|
||||
*/
|
||||
meshdata &add_data(mesh_data_type_e in_loctype, mesh_data_value_e in_valtype, std::string name,
|
||||
double init_val, bool if_output = true, double nan_val = GCTL_BDL_MAX);
|
||||
|
||||
/**
|
||||
* @brief 添加网格数据。
|
||||
* @brief 添加网格数据,并返回数据对象的引用。
|
||||
*
|
||||
* @param in_loctype 网格数据类型(块体或顶点数据)
|
||||
* @param name 数据名称
|
||||
@ -174,13 +174,13 @@ namespace gctl
|
||||
* @param if_output 数据是否可用于输出
|
||||
* @param nan_val 数据无效值标记
|
||||
*
|
||||
* @return 数据对象
|
||||
* @return 数据对象的引用(非常量的)
|
||||
*/
|
||||
meshdata &add_data(mesh_data_type_e in_loctype, std::string name, const array<double> &init_arr,
|
||||
bool if_output = true, double nan_val = GCTL_BDL_MAX);
|
||||
|
||||
/**
|
||||
* @brief 添加网格数据。
|
||||
* @brief 添加网格数据,并返回数据对象的引用。
|
||||
*
|
||||
* @param in_loctype 网格数据类型(块体或顶点数据)
|
||||
* @param name 数据名称
|
||||
@ -188,13 +188,13 @@ namespace gctl
|
||||
* @param if_output 数据是否可用于输出
|
||||
* @param nan_val 数据无效值标记
|
||||
*
|
||||
* @return 数据对象
|
||||
* @return 数据对象的引用(非常量的)
|
||||
*/
|
||||
meshdata &add_data(mesh_data_type_e in_loctype, std::string name, const array<point3dc> &init_arr,
|
||||
bool if_output = true, double nan_val = GCTL_BDL_MAX);
|
||||
|
||||
/**
|
||||
* @brief 添加网格数据。
|
||||
* @brief 添加网格数据,并返回数据对象的引用。
|
||||
*
|
||||
* @param in_loctype 网格数据类型(块体或顶点数据)
|
||||
* @param name 数据名称
|
||||
@ -202,19 +202,35 @@ namespace gctl
|
||||
* @param if_output 数据是否可用于输出
|
||||
* @param nan_val 数据无效值标记
|
||||
*
|
||||
* @return 数据对象
|
||||
* @return 数据对象的引用(非常量的)
|
||||
*/
|
||||
meshdata &add_data(mesh_data_type_e in_loctype, std::string name, const array<tensor> &init_arr,
|
||||
bool if_output = true, double nan_val = GCTL_BDL_MAX);
|
||||
|
||||
/**
|
||||
* @brief 返回对应名称的数据对象指针。
|
||||
* @brief 返回对应名称的数据对象引用。
|
||||
*
|
||||
* @param datname 数据名
|
||||
* @return 数据指针
|
||||
* @return 数据对象的引用(非常量的)
|
||||
*/
|
||||
meshdata &get_data(std::string datname);
|
||||
|
||||
/**
|
||||
* @brief 返回对应名称的数据对象常量引用。
|
||||
*
|
||||
* @param datname 数据名
|
||||
* @return 数据对象的引用(常量的)
|
||||
*/
|
||||
const meshdata &get_data(std::string datname) const;
|
||||
|
||||
/**
|
||||
* @brief 返回对应名称的数据对象指针。
|
||||
*
|
||||
* @param datname 数据名
|
||||
* @return 数据对象的指针
|
||||
*/
|
||||
meshdata *get_data_ptr(std::string datname);
|
||||
|
||||
/**
|
||||
* @brief 删除对应名称的数据对象。
|
||||
*
|
||||
@ -242,7 +258,7 @@ namespace gctl
|
||||
void save_gmsh_withdata(std::string filename, std::string datname, output_type_e out_mode, index_packed_e packed = Packed);
|
||||
|
||||
/**
|
||||
* @brief (基类虚函数)保存网格到Gmsh文件。
|
||||
* @brief (基类纯虚函数)保存网格到Gmsh文件。
|
||||
*
|
||||
* @param filename 文件名
|
||||
* @param packed 索引是否为紧凑(从0开始)
|
||||
@ -250,7 +266,7 @@ namespace gctl
|
||||
virtual void save_gmsh(std::string filename, index_packed_e packed = Packed) = 0;
|
||||
|
||||
/**
|
||||
* @brief 显示网格的维度信息
|
||||
* @brief (基类纯虚函数)显示网格的维度信息
|
||||
*
|
||||
*/
|
||||
virtual void show_mesh_dimension(std::ostream &os) const = 0;
|
||||
|
@ -190,7 +190,7 @@ void gctl::regular_grid::clear_regular_grid()
|
||||
|
||||
int gctl::regular_grid::view(std::string datname)
|
||||
{
|
||||
meshdata data = get_data(datname);
|
||||
meshdata &data = get_data(datname);
|
||||
|
||||
plt.range(rg_xmin, rg_xmin + (rg_xnum - 1)*rg_dx, rg_ymin, rg_ymin + (rg_ynum - 1)*rg_dy);
|
||||
plt.demension(rg_xnum, rg_ynum);
|
||||
@ -422,36 +422,34 @@ void gctl::regular_grid::save_netcdf_grid(std::string filename, mesh_data_type_e
|
||||
check_initiated(); // check to see if the mesh is not initiated
|
||||
|
||||
bool if_append = false;
|
||||
meshdata curr_data;
|
||||
for (size_t i = 0; i < datalist_.size(); i++)
|
||||
{
|
||||
curr_data = datalist_[i];
|
||||
if (curr_data.loctype_ == d_type && d_type == NodeData &&
|
||||
curr_data.valtype_ == Scalar && curr_data.output_ok_)
|
||||
if (datalist_[i].loctype_ == d_type && d_type == NodeData &&
|
||||
datalist_[i].valtype_ == Scalar && datalist_[i].output_ok_)
|
||||
{
|
||||
if (!if_append)
|
||||
{
|
||||
gctl::save_netcdf_grid(filename, curr_data.datval_, rg_xnum, rg_ynum, rg_xmin,
|
||||
rg_dx, rg_ymin, rg_dy, xname, yname, curr_data.name_);
|
||||
gctl::save_netcdf_grid(filename, datalist_[i].datval_, rg_xnum, rg_ynum, rg_xmin,
|
||||
rg_dx, rg_ymin, rg_dy, xname, yname, datalist_[i].name_);
|
||||
if_append = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
gctl::append_netcdf_grid(filename, curr_data.datval_, xname, yname, curr_data.name_);
|
||||
gctl::append_netcdf_grid(filename, datalist_[i].datval_, xname, yname, datalist_[i].name_);
|
||||
}
|
||||
}
|
||||
else if (curr_data.loctype_ == d_type && d_type == ElemData &&
|
||||
curr_data.valtype_ == Scalar && curr_data.output_ok_)
|
||||
else if (datalist_[i].loctype_ == d_type && d_type == ElemData &&
|
||||
datalist_[i].valtype_ == Scalar && datalist_[i].output_ok_)
|
||||
{
|
||||
if (!if_append)
|
||||
{
|
||||
gctl::save_netcdf_grid(filename, curr_data.datval_, rg_xnum-1, rg_ynum-1, rg_xmin+0.5*rg_dx,
|
||||
rg_dx, rg_ymin+0.5*rg_dy, rg_dy, xname, yname, curr_data.name_);
|
||||
gctl::save_netcdf_grid(filename, datalist_[i].datval_, rg_xnum-1, rg_ynum-1, rg_xmin+0.5*rg_dx,
|
||||
rg_dx, rg_ymin+0.5*rg_dy, rg_dy, xname, yname, datalist_[i].name_);
|
||||
if_append = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
gctl::append_netcdf_grid(filename, curr_data.datval_, xname, yname, curr_data.name_);
|
||||
gctl::append_netcdf_grid(filename, datalist_[i].datval_, xname, yname, datalist_[i].name_);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -461,7 +459,7 @@ void gctl::regular_grid::save_netcdf_grid(std::string filename, mesh_data_type_e
|
||||
void gctl::regular_grid::save_netcdf_grid(std::string filename, std::string datname,
|
||||
std::string xname, std::string yname)
|
||||
{
|
||||
meshdata curr_data = get_data(datname);
|
||||
meshdata &curr_data = get_data(datname);
|
||||
|
||||
if (!curr_data.output_ok_)
|
||||
{
|
||||
@ -593,7 +591,7 @@ void gctl::regular_grid::load_surfer_grid(std::string filename, std::string datn
|
||||
|
||||
void gctl::regular_grid::save_surfer_grid(std::string filename, std::string datname, surfer_file_type_e grid_type)
|
||||
{
|
||||
meshdata curr_data = get_data(datname);
|
||||
meshdata &curr_data = get_data(datname);
|
||||
|
||||
if (!curr_data.output_ok_)
|
||||
{
|
||||
@ -673,13 +671,10 @@ void gctl::regular_grid::save_gmsh(std::string filename, std::string datname, ou
|
||||
|
||||
void gctl::regular_grid::save_text(std::string filename, const array<std::string> &datname)
|
||||
{
|
||||
mesh_data_type_e d_type;
|
||||
meshdata curr_data = get_data(datname[0]);
|
||||
d_type = curr_data.loctype_;
|
||||
for (size_t i = 1; i < datname.size(); i++)
|
||||
meshdata &curr_data = get_data(datname[0]);
|
||||
for (size_t i = 1; i < datalist_.size(); i++)
|
||||
{
|
||||
curr_data = get_data(datname[i]);
|
||||
if (d_type != curr_data.loctype_)
|
||||
if (curr_data.loctype_ != datalist_[i].loctype_)
|
||||
{
|
||||
throw std::runtime_error("[gctl::regular_grid] multiple data location types found.");
|
||||
}
|
||||
@ -700,10 +695,9 @@ void gctl::regular_grid::save_text(std::string filename, const array<std::string
|
||||
for (size_t i = 0; i < node_num_; i++)
|
||||
{
|
||||
ofile << nodes[i].x << " " << nodes[i].y;
|
||||
for (size_t n = 0; n < datname.size(); n++)
|
||||
for (size_t n = 0; n < datalist_.size(); n++)
|
||||
{
|
||||
curr_data = get_data(datname[n]);
|
||||
ofile << " " << curr_data.datval_[i];
|
||||
ofile << " " << datalist_[n].datval_[i];
|
||||
}
|
||||
ofile << "\n";
|
||||
}
|
||||
@ -713,10 +707,9 @@ void gctl::regular_grid::save_text(std::string filename, const array<std::string
|
||||
for (size_t i = 0; i < ele_num_; i++)
|
||||
{
|
||||
ofile << 0.5*(elements[i].dl->x + elements[i].ur->x) << " " << 0.5*(elements[i].dl->y + elements[i].ur->y);
|
||||
for (size_t n = 0; n < datname.size(); n++)
|
||||
for (size_t n = 0; n < datalist_.size(); n++)
|
||||
{
|
||||
curr_data = get_data(datname[n]);
|
||||
ofile << " " << curr_data.datval_[i];
|
||||
ofile << " " << datalist_[n].datval_[i];
|
||||
}
|
||||
ofile << "\n";
|
||||
}
|
||||
@ -767,7 +760,7 @@ void gctl::regular_grid::load_data_cloud(const array<point2dc> &in_posi, const a
|
||||
in_val.get(), in_posi.size(), search_xlen, search_ylen, search_deg);
|
||||
|
||||
// create a new data object
|
||||
meshdata curr_data = add_data(d_type, Scalar, datname, 0.0, true, GCTL_BDL_MAX);
|
||||
meshdata &curr_data = add_data(d_type, Scalar, datname, 0.0, true, GCTL_BDL_MAX);
|
||||
for (int i = 0; i < curr_data.datval_.size(); i++)
|
||||
{
|
||||
curr_data.datval_[i] = inte_data->at(i);
|
||||
@ -785,7 +778,7 @@ void gctl::regular_grid::extract_points(std::string datname, const array<point2d
|
||||
throw std::runtime_error("[gctl::regular_grid] The input array is empty.");
|
||||
}
|
||||
|
||||
meshdata curr_data = get_data(datname);
|
||||
meshdata &curr_data = get_data(datname);
|
||||
mesh_data_value_e value_type = curr_data.valtype_;
|
||||
mesh_data_type_e data_type = curr_data.loctype_;
|
||||
if(value_type != Scalar)
|
||||
@ -879,7 +872,7 @@ void gctl::regular_grid::extract_profile(std::string datname, const point2dc &st
|
||||
|
||||
void gctl::regular_grid::gradient(std::string datname, std::string gradname, gradient_type_e d_type, int order)
|
||||
{
|
||||
meshdata curr_data = get_data(datname);
|
||||
meshdata &curr_data = get_data(datname);
|
||||
mesh_data_value_e value_type = curr_data.valtype_;
|
||||
mesh_data_type_e data_type = curr_data.loctype_;
|
||||
|
||||
@ -894,24 +887,21 @@ void gctl::regular_grid::gradient(std::string datname, std::string gradname, gra
|
||||
}
|
||||
|
||||
// 检查是否存在与梯度数据同名的数据 若有则检查是否需要重新建立数据
|
||||
meshdata new_data;
|
||||
mesh_data_value_e value_type2;
|
||||
mesh_data_type_e data_type2;
|
||||
if (saved(gradname))
|
||||
{
|
||||
new_data = get_data(gradname);
|
||||
value_type2 = new_data.valtype_;
|
||||
data_type2 = new_data.loctype_;
|
||||
meshdata &check_data = get_data(gradname);
|
||||
mesh_data_value_e value_type2 = check_data.valtype_;
|
||||
mesh_data_type_e data_type2 = check_data.loctype_;
|
||||
// 删除原有数据
|
||||
if (value_type2 != value_type || data_type2 != data_type)
|
||||
{
|
||||
// 删除原有数据
|
||||
remove_data(gradname);
|
||||
// 新建数据
|
||||
new_data = add_data(data_type, Scalar, gradname, 0.0, true, GCTL_BDL_MAX);
|
||||
}
|
||||
add_data(data_type, Scalar, gradname, 0.0, true, GCTL_BDL_MAX);
|
||||
}
|
||||
else new_data = add_data(data_type, Scalar, gradname, 0.0, true, GCTL_BDL_MAX);
|
||||
else add_data(data_type, Scalar, gradname, 0.0, true, GCTL_BDL_MAX);
|
||||
|
||||
meshdata &new_data = get_data(gradname);
|
||||
if (data_type == NodeData && d_type == Dx)
|
||||
{
|
||||
difference_2d(curr_data.datval_, new_data.datval_, rg_ynum, rg_xnum, rg_dx, Dx, order);
|
||||
@ -933,11 +923,11 @@ void gctl::regular_grid::gradient(std::string datname, std::string gradname, gra
|
||||
|
||||
void gctl::regular_grid::sum(std::string newname, std::string datname, std::string datname2)
|
||||
{
|
||||
meshdata data_1 = get_data(datname);
|
||||
meshdata &data_1 = get_data(datname);
|
||||
mesh_data_value_e value_type1 = data_1.valtype_;
|
||||
mesh_data_type_e data_type1 = data_1.loctype_;
|
||||
|
||||
meshdata data_2 = get_data(datname2);
|
||||
meshdata &data_2 = get_data(datname2);
|
||||
mesh_data_value_e value_type2 = data_2.valtype_;
|
||||
mesh_data_type_e data_type2 = data_2.loctype_;
|
||||
|
||||
@ -946,7 +936,7 @@ void gctl::regular_grid::sum(std::string newname, std::string datname, std::stri
|
||||
throw std::runtime_error("[gctl::regular_grid] Can't preform the process.");
|
||||
}
|
||||
|
||||
meshdata new_data = add_data(data_type1, value_type1, newname, 0.0, true, GCTL_BDL_MAX);
|
||||
meshdata &new_data = add_data(data_type1, value_type1, newname, 0.0, true, GCTL_BDL_MAX);
|
||||
|
||||
for (size_t i = 0; i < new_data.datval_.size(); i++)
|
||||
{
|
||||
@ -957,11 +947,11 @@ void gctl::regular_grid::sum(std::string newname, std::string datname, std::stri
|
||||
|
||||
void gctl::regular_grid::diff(std::string newname, std::string datname, std::string datname2)
|
||||
{
|
||||
meshdata data_1 = get_data(datname);
|
||||
meshdata &data_1 = get_data(datname);
|
||||
mesh_data_value_e value_type1 = data_1.valtype_;
|
||||
mesh_data_type_e data_type1 = data_1.loctype_;
|
||||
|
||||
meshdata data_2 = get_data(datname2);
|
||||
meshdata &data_2 = get_data(datname2);
|
||||
mesh_data_value_e value_type2 = data_2.valtype_;
|
||||
mesh_data_type_e data_type2 = data_2.loctype_;
|
||||
|
||||
@ -970,7 +960,7 @@ void gctl::regular_grid::diff(std::string newname, std::string datname, std::str
|
||||
throw std::runtime_error("[gctl::regular_grid] Can't preform the process.");
|
||||
}
|
||||
|
||||
meshdata new_data = add_data(data_type1, value_type1, newname, 0.0, true, GCTL_BDL_MAX);
|
||||
meshdata &new_data = add_data(data_type1, value_type1, newname, 0.0, true, GCTL_BDL_MAX);
|
||||
|
||||
for (size_t i = 0; i < new_data.datval_.size(); i++)
|
||||
{
|
||||
@ -981,11 +971,11 @@ void gctl::regular_grid::diff(std::string newname, std::string datname, std::str
|
||||
|
||||
void gctl::regular_grid::boolean(std::string newname, std::string datname, std::string maskname, bool reverse)
|
||||
{
|
||||
meshdata data_1 = get_data(datname);
|
||||
meshdata &data_1 = get_data(datname);
|
||||
mesh_data_value_e value_type1 = data_1.valtype_;
|
||||
mesh_data_type_e data_type1 = data_1.loctype_;
|
||||
|
||||
meshdata data_2 = get_data(maskname);
|
||||
meshdata &data_2 = get_data(maskname);
|
||||
mesh_data_value_e value_type2 = data_2.valtype_;
|
||||
mesh_data_type_e data_type2 = data_2.loctype_;
|
||||
|
||||
@ -994,7 +984,7 @@ void gctl::regular_grid::boolean(std::string newname, std::string datname, std::
|
||||
throw std::runtime_error("[gctl::regular_grid] Can't preform the process.");
|
||||
}
|
||||
|
||||
meshdata new_data = add_data(data_type1, value_type1, newname, 0.0, true, GCTL_BDL_MAX);
|
||||
meshdata &new_data = add_data(data_type1, value_type1, newname, 0.0, true, GCTL_BDL_MAX);
|
||||
|
||||
if (!reverse)
|
||||
{
|
||||
@ -1035,7 +1025,7 @@ void gctl::regular_grid::function(std::string expression_str, std::string newnam
|
||||
if (!parser.compile(expression_str, expression)) throw std::runtime_error("[gctl::function] Fail to compile the math expression.");
|
||||
|
||||
if (!saved(newname)) add_data(NodeData, Scalar, newname, 0.0, true, GCTL_BDL_MAX);
|
||||
meshdata curr_data = get_data(newname);
|
||||
meshdata &curr_data = get_data(newname);
|
||||
|
||||
if (curr_data.loctype_ == NodeData)
|
||||
{
|
||||
@ -1078,22 +1068,22 @@ void gctl::regular_grid::calculator(std::string expression_str, const array<std:
|
||||
exprtk::parser<double> parser;
|
||||
if (!parser.compile(expression_str, expression)) throw std::runtime_error("[gctl::regular_grid] Fail to compile the math expression.");
|
||||
|
||||
array<meshdata> datas(var.size());
|
||||
array<meshdata*> datas_ptr(var.size());
|
||||
mesh_data_value_e val_type1, val_type2;
|
||||
mesh_data_type_e data_type1, data_type2;
|
||||
|
||||
// Remeber we put the output at the first place.
|
||||
for (size_t i = 1; i < var.size(); i++)
|
||||
{
|
||||
datas[i] = get_data(data_list[i]);
|
||||
datas_ptr[i] = get_data_ptr(data_list[i]);
|
||||
}
|
||||
|
||||
val_type1 = datas[1].valtype_;
|
||||
data_type1= datas[1].loctype_;
|
||||
val_type1 = datas_ptr[1]->valtype_;
|
||||
data_type1= datas_ptr[1]->loctype_;
|
||||
for (size_t i = 2; i < var.size(); i++)
|
||||
{
|
||||
val_type2 = datas[i].valtype_;
|
||||
data_type2= datas[i].loctype_;
|
||||
val_type2 = datas_ptr[i]->valtype_;
|
||||
data_type2= datas_ptr[i]->loctype_;
|
||||
if (val_type1 != val_type2 || data_type1 != data_type2)
|
||||
{
|
||||
throw std::runtime_error("[gctl::regular_grid] Can't preform the calculation on selected data.");
|
||||
@ -1101,22 +1091,24 @@ void gctl::regular_grid::calculator(std::string expression_str, const array<std:
|
||||
}
|
||||
|
||||
|
||||
if (!saved(data_list[0])) datas[0] = add_data(data_type1, val_type1, data_list[0], 0.0, true, GCTL_BDL_MAX);
|
||||
val_type2 = datas[0].valtype_;
|
||||
data_type2= datas[0].loctype_;
|
||||
if (!saved(data_list[0])) add_data(data_type1, val_type1, data_list[0], 0.0, true, GCTL_BDL_MAX);
|
||||
|
||||
datas_ptr[0] = get_data_ptr(data_list[0]);
|
||||
val_type2 = datas_ptr[0]->valtype_;
|
||||
data_type2= datas_ptr[0]->loctype_;
|
||||
if (val_type1 != val_type2 || data_type1 != data_type2)
|
||||
{
|
||||
throw std::runtime_error("[gctl::regular_grid] Can't preform the calculation on selected data.");
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < datas[0].datval_.size(); i++)
|
||||
for (size_t i = 0; i < datas_ptr[0]->datval_.size(); i++)
|
||||
{
|
||||
for (size_t v = 0; v < var.size(); v++)
|
||||
{
|
||||
var[v] = datas[v].datval_[i];
|
||||
var[v] = datas_ptr[v]->datval_[i];
|
||||
}
|
||||
|
||||
datas[0].datval_[i] = expression.value();
|
||||
datas_ptr[0]->datval_[i] = expression.value();
|
||||
}
|
||||
return;
|
||||
}
|
||||
@ -1127,7 +1119,7 @@ void gctl::regular_grid::calculator(std::string expression_str, const array<std:
|
||||
|
||||
void gctl::regular_grid::wavelet(std::string datname, std::string wavename, int order, bool summary)
|
||||
{
|
||||
meshdata curr_data = get_data(datname);
|
||||
meshdata &curr_data = get_data(datname);
|
||||
mesh_data_value_e value_type = curr_data.valtype_;
|
||||
mesh_data_type_e data_type = curr_data.loctype_;
|
||||
|
||||
@ -1163,7 +1155,7 @@ void gctl::regular_grid::wavelet(std::string datname, std::string wavename, int
|
||||
wavecoeffs[i] = coeff_copy[i];
|
||||
}
|
||||
|
||||
meshdata new_data = add_data(data_type, value_type, datname+"_A"+std::to_string(wt->J), 0.0, true, GCTL_BDL_MAX);
|
||||
meshdata &new_data = add_data(data_type, value_type, datname+"_A"+std::to_string(wt->J), 0.0, true, GCTL_BDL_MAX);
|
||||
idwt2(wt, wavecoeffs, new_data.datval_.get());
|
||||
|
||||
int coeff_idx;
|
||||
|
@ -48,91 +48,310 @@ namespace gctl
|
||||
/**
|
||||
* 以下为mesh类型的虚函数实现
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief (基类纯虚函数的具体实现)保存网格到Gmsh文件。
|
||||
*
|
||||
* @param filename 文件名
|
||||
* @param packed 索引是否为紧凑(从0开始)
|
||||
*/
|
||||
void save_gmsh(std::string filename, index_packed_e packed = Packed);
|
||||
|
||||
void init(std::string in_name, std::string in_info, int xnum, int ynum,
|
||||
double xmin, double ymin, double dx, double dy);
|
||||
|
||||
/**
|
||||
* @brief (基类纯虚函数的具体实现)显示网格的维度信息
|
||||
*/
|
||||
void show_mesh_dimension(std::ostream &os) const;
|
||||
|
||||
/**
|
||||
* @brief (基类纯虚函数的具体实现)读入二进制网格文件
|
||||
*
|
||||
* @param filename 文件名
|
||||
*/
|
||||
void load_binary(std::string filename);
|
||||
|
||||
/**
|
||||
* @brief (基类纯虚函数的具体实现)写入二进制网格文件
|
||||
*
|
||||
* @param filename 文件名
|
||||
*/
|
||||
void save_binary(std::string filename);
|
||||
|
||||
/**
|
||||
* 以下为regular_grid的专有函数
|
||||
*/
|
||||
|
||||
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();
|
||||
|
||||
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;
|
||||
int get_ydim() const;
|
||||
double get_xmin() const;
|
||||
double get_ymin() const;
|
||||
double get_dx() const;
|
||||
double get_dy() const;
|
||||
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);
|
||||
|
||||
void save_gmsh(std::string filename, index_packed_e packed = Packed);
|
||||
/**
|
||||
* @brief 保存规则网格数据到Gmsh文件中
|
||||
*
|
||||
* @param filename 文件名
|
||||
* @param out_mode 输出模式
|
||||
* @param packed 索引是否为紧凑(从0开始)
|
||||
*/
|
||||
void save_gmsh(std::string filename, output_type_e out_mode, index_packed_e packed = Packed);
|
||||
|
||||
/**
|
||||
* @brief 保存规则网格数据到Gmsh文件中
|
||||
*
|
||||
* @param filename 文件名
|
||||
* @param datname 数据名称
|
||||
* @param out_mode 输出模式
|
||||
* @param packed 索引是否为紧凑(从0开始)
|
||||
*/
|
||||
void save_gmsh(std::string filename, std::string datname, output_type_e out_mode, index_packed_e packed = Packed);
|
||||
|
||||
/**
|
||||
* @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为节点位置(x,y)的函数
|
||||
*
|
||||
* @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;
|
||||
double rg_xmin, rg_ymin;
|
||||
double rg_dx, rg_dy;
|
||||
int rg_xnum, rg_ynum; ///< 规则网格的x方向单元数量和y方向单元数量
|
||||
double rg_xmin, rg_ymin; ///< 规则网格的x方向最小值和y方向最小值
|
||||
double rg_dx, rg_dy; ///< 规则网格的x方向单元长度和y方向单元长度
|
||||
|
||||
#ifdef GCTL_GRAPHIC_MATHGL
|
||||
mathgl_dens plt;
|
||||
mathgl_dens plt; ///< mathgl绘图对象
|
||||
#endif // GCTL_GRAPHIC_MATHGL
|
||||
|
||||
#ifdef GCTL_GRAPHIC_GMT
|
||||
gmt_JX_single pic;
|
||||
gmt_JX_single pic; ///< gmt绘图对象
|
||||
#endif // GCTL_GRAPHIC_GMT
|
||||
|
||||
array<vertex2dc> nodes;
|
||||
array<rectangle2d> elements;
|
||||
array<vertex2dc> nodes; ///< 规则网格的节点数组
|
||||
array<rectangle2d> elements; ///< 规则网格的单元数组
|
||||
};
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user