This commit is contained in:
张壹 2025-01-13 12:08:35 +08:00
parent 4f76487bc8
commit 2a4f54cf33
4 changed files with 332 additions and 95 deletions

View File

@ -78,6 +78,16 @@ gctl::meshdata &gctl::base_mesh::get_data(std::string datname)
return datalist_[data_index(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) void gctl::base_mesh::remove_data(std::string datname)
{ {
int idx = data_index(datname); int idx = data_index(datname);

View File

@ -151,7 +151,7 @@ namespace gctl
void set_meshinfo(std::string in_info); void set_meshinfo(std::string in_info);
/** /**
* @brief * @brief
* *
* @param in_loctype * @param in_loctype
* @param in_valtype * @param in_valtype
@ -160,13 +160,13 @@ namespace gctl
* @param if_output * @param if_output
* @param nan_val * @param nan_val
* *
* @return * @return
*/ */
meshdata &add_data(mesh_data_type_e in_loctype, mesh_data_value_e in_valtype, std::string name, 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); double init_val, bool if_output = true, double nan_val = GCTL_BDL_MAX);
/** /**
* @brief * @brief
* *
* @param in_loctype * @param in_loctype
* @param name * @param name
@ -174,13 +174,13 @@ namespace gctl
* @param if_output * @param if_output
* @param nan_val * @param nan_val
* *
* @return * @return
*/ */
meshdata &add_data(mesh_data_type_e in_loctype, std::string name, const array<double> &init_arr, 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); bool if_output = true, double nan_val = GCTL_BDL_MAX);
/** /**
* @brief * @brief
* *
* @param in_loctype * @param in_loctype
* @param name * @param name
@ -188,13 +188,13 @@ namespace gctl
* @param if_output * @param if_output
* @param nan_val * @param nan_val
* *
* @return * @return
*/ */
meshdata &add_data(mesh_data_type_e in_loctype, std::string name, const array<point3dc> &init_arr, 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); bool if_output = true, double nan_val = GCTL_BDL_MAX);
/** /**
* @brief * @brief
* *
* @param in_loctype * @param in_loctype
* @param name * @param name
@ -202,19 +202,35 @@ namespace gctl
* @param if_output * @param if_output
* @param nan_val * @param nan_val
* *
* @return * @return
*/ */
meshdata &add_data(mesh_data_type_e in_loctype, std::string name, const array<tensor> &init_arr, 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); bool if_output = true, double nan_val = GCTL_BDL_MAX);
/** /**
* @brief * @brief
* *
* @param datname * @param datname
* @return * @return
*/ */
meshdata &get_data(std::string datname); 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 * @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); 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 filename
* @param packed 0 * @param packed 0
@ -250,7 +266,7 @@ namespace gctl
virtual void save_gmsh(std::string filename, index_packed_e packed = Packed) = 0; 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; virtual void show_mesh_dimension(std::ostream &os) const = 0;

View File

@ -190,7 +190,7 @@ void gctl::regular_grid::clear_regular_grid()
int gctl::regular_grid::view(std::string datname) 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.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); 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 check_initiated(); // check to see if the mesh is not initiated
bool if_append = false; bool if_append = false;
meshdata curr_data;
for (size_t i = 0; i < datalist_.size(); i++) for (size_t i = 0; i < datalist_.size(); i++)
{ {
curr_data = datalist_[i]; if (datalist_[i].loctype_ == d_type && d_type == NodeData &&
if (curr_data.loctype_ == d_type && d_type == NodeData && datalist_[i].valtype_ == Scalar && datalist_[i].output_ok_)
curr_data.valtype_ == Scalar && curr_data.output_ok_)
{ {
if (!if_append) if (!if_append)
{ {
gctl::save_netcdf_grid(filename, curr_data.datval_, rg_xnum, rg_ynum, rg_xmin, gctl::save_netcdf_grid(filename, datalist_[i].datval_, rg_xnum, rg_ynum, rg_xmin,
rg_dx, rg_ymin, rg_dy, xname, yname, curr_data.name_); rg_dx, rg_ymin, rg_dy, xname, yname, datalist_[i].name_);
if_append = true; if_append = true;
} }
else 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 && else if (datalist_[i].loctype_ == d_type && d_type == ElemData &&
curr_data.valtype_ == Scalar && curr_data.output_ok_) datalist_[i].valtype_ == Scalar && datalist_[i].output_ok_)
{ {
if (!if_append) if (!if_append)
{ {
gctl::save_netcdf_grid(filename, curr_data.datval_, rg_xnum-1, rg_ynum-1, rg_xmin+0.5*rg_dx, 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, curr_data.name_); rg_dx, rg_ymin+0.5*rg_dy, rg_dy, xname, yname, datalist_[i].name_);
if_append = true; if_append = true;
} }
else 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, void gctl::regular_grid::save_netcdf_grid(std::string filename, std::string datname,
std::string xname, std::string yname) std::string xname, std::string yname)
{ {
meshdata curr_data = get_data(datname); meshdata &curr_data = get_data(datname);
if (!curr_data.output_ok_) 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) 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_) 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) 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]);
meshdata curr_data = get_data(datname[0]); for (size_t i = 1; i < datalist_.size(); i++)
d_type = curr_data.loctype_;
for (size_t i = 1; i < datname.size(); i++)
{ {
curr_data = get_data(datname[i]); if (curr_data.loctype_ != datalist_[i].loctype_)
if (d_type != curr_data.loctype_)
{ {
throw std::runtime_error("[gctl::regular_grid] multiple data location types found."); 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++) for (size_t i = 0; i < node_num_; i++)
{ {
ofile << nodes[i].x << " " << nodes[i].y; 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 << " " << datalist_[n].datval_[i];
ofile << " " << curr_data.datval_[i];
} }
ofile << "\n"; 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++) 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); 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 << " " << datalist_[n].datval_[i];
ofile << " " << curr_data.datval_[i];
} }
ofile << "\n"; 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); in_val.get(), in_posi.size(), search_xlen, search_ylen, search_deg);
// create a new data object // 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++) for (int i = 0; i < curr_data.datval_.size(); i++)
{ {
curr_data.datval_[i] = inte_data->at(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."); 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_value_e value_type = curr_data.valtype_;
mesh_data_type_e data_type = curr_data.loctype_; mesh_data_type_e data_type = curr_data.loctype_;
if(value_type != Scalar) 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) 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_value_e value_type = curr_data.valtype_;
mesh_data_type_e data_type = curr_data.loctype_; 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)) if (saved(gradname))
{ {
new_data = get_data(gradname); meshdata &check_data = get_data(gradname);
value_type2 = new_data.valtype_; mesh_data_value_e value_type2 = check_data.valtype_;
data_type2 = new_data.loctype_; mesh_data_type_e data_type2 = check_data.loctype_;
// 删除原有数据
if (value_type2 != value_type || data_type2 != data_type) if (value_type2 != value_type || data_type2 != data_type)
{ {
// 删除原有数据
remove_data(gradname); 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) if (data_type == NodeData && d_type == Dx)
{ {
difference_2d(curr_data.datval_, new_data.datval_, rg_ynum, rg_xnum, rg_dx, Dx, order); 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) 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_value_e value_type1 = data_1.valtype_;
mesh_data_type_e data_type1 = data_1.loctype_; 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_value_e value_type2 = data_2.valtype_;
mesh_data_type_e data_type2 = data_2.loctype_; 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."); 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++) 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) 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_value_e value_type1 = data_1.valtype_;
mesh_data_type_e data_type1 = data_1.loctype_; 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_value_e value_type2 = data_2.valtype_;
mesh_data_type_e data_type2 = data_2.loctype_; 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."); 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++) 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) 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_value_e value_type1 = data_1.valtype_;
mesh_data_type_e data_type1 = data_1.loctype_; 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_value_e value_type2 = data_2.valtype_;
mesh_data_type_e data_type2 = data_2.loctype_; 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."); 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) 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 (!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); 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) 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; exprtk::parser<double> parser;
if (!parser.compile(expression_str, expression)) throw std::runtime_error("[gctl::regular_grid] Fail to compile the math expression."); 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_value_e val_type1, val_type2;
mesh_data_type_e data_type1, data_type2; mesh_data_type_e data_type1, data_type2;
// Remeber we put the output at the first place. // Remeber we put the output at the first place.
for (size_t i = 1; i < var.size(); i++) 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_; val_type1 = datas_ptr[1]->valtype_;
data_type1= datas[1].loctype_; data_type1= datas_ptr[1]->loctype_;
for (size_t i = 2; i < var.size(); i++) for (size_t i = 2; i < var.size(); i++)
{ {
val_type2 = datas[i].valtype_; val_type2 = datas_ptr[i]->valtype_;
data_type2= datas[i].loctype_; data_type2= datas_ptr[i]->loctype_;
if (val_type1 != val_type2 || data_type1 != data_type2) if (val_type1 != val_type2 || data_type1 != data_type2)
{ {
throw std::runtime_error("[gctl::regular_grid] Can't preform the calculation on selected data."); 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); if (!saved(data_list[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_; 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) if (val_type1 != val_type2 || data_type1 != data_type2)
{ {
throw std::runtime_error("[gctl::regular_grid] Can't preform the calculation on selected data."); 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++) 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; 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) 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_value_e value_type = curr_data.valtype_;
mesh_data_type_e data_type = curr_data.loctype_; 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]; 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()); idwt2(wt, wavecoeffs, new_data.datval_.get());
int coeff_idx; int coeff_idx;

View File

@ -48,91 +48,310 @@ namespace gctl
/** /**
* mesh类型的虚函数实现 * 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; void show_mesh_dimension(std::ostream &os) const;
/**
* @brief
*
* @param filename
*/
void load_binary(std::string filename); void load_binary(std::string filename);
/**
* @brief
*
* @param filename
*/
void save_binary(std::string filename); void save_binary(std::string filename);
/** /**
* regular_grid的专有函数 * 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, regular_grid(std::string in_name, std::string in_info, int xnum, int ynum,
double xmin, double ymin, double dx, double dy); 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(); void clear_regular_grid();
/**
* @brief 使mathgl显示规则网格
*
* @param datname
* @return
*/
int view(std::string datname); int view(std::string datname);
/**
* @brief 使gmt绘制规则网格
*
* @param datname
*/
void plot(std::string datname); void plot(std::string datname);
int get_xdim() const; int get_xdim() const; ///< 获取规则网格的x方向单元数量
int get_ydim() const; int get_ydim() const; ///< 获取规则网格的y方向单元数量
double get_xmin() const; double get_xmin() const; ///< 获取规则网格的x方向最小值
double get_ymin() const; double get_ymin() const; ///< 获取规则网格的y方向最小值
double get_dx() const; double get_dx() const; ///< 获取规则网格的x方向单元长度
double get_dy() const; double get_dy() const; ///< 获取规则网格的y方向单元长度
#ifdef GCTL_NETCDF #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, 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"); 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, void save_netcdf_grid(std::string filename, mesh_data_type_e d_type,
std::string xname = "x", std::string yname = "y"); 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, void save_netcdf_grid(std::string filename, std::string datname,
std::string xname = "x", std::string yname = "y"); std::string xname = "x", std::string yname = "y");
#endif // GCTL_NETCDF #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); 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_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); 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); 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); 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, 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); 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); 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, 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); 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); 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); 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); 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); void boolean(std::string newname, std::string datname, std::string maskname, bool reverse = false);
#ifdef GCTL_MESH_EXPRTK #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"); 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); void calculator(std::string expression_str, const array<std::string> &var_list, const array<std::string> &data_list);
#endif // GCTL_MESH_EXPRTK #endif // GCTL_MESH_EXPRTK
#ifdef GCTL_MESH_WAVELIB #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); void wavelet(std::string datname, std::string wavename, int order, bool summary = true);
#endif // GCTL_MESH_WAVELIB #endif // GCTL_MESH_WAVELIB
protected: protected:
int rg_xnum, rg_ynum; int rg_xnum, rg_ynum; ///< 规则网格的x方向单元数量和y方向单元数量
double rg_xmin, rg_ymin; double rg_xmin, rg_ymin; ///< 规则网格的x方向最小值和y方向最小值
double rg_dx, rg_dy; double rg_dx, rg_dy; ///< 规则网格的x方向单元长度和y方向单元长度
#ifdef GCTL_GRAPHIC_MATHGL #ifdef GCTL_GRAPHIC_MATHGL
mathgl_dens plt; mathgl_dens plt; ///< mathgl绘图对象
#endif // GCTL_GRAPHIC_MATHGL #endif // GCTL_GRAPHIC_MATHGL
#ifdef GCTL_GRAPHIC_GMT #ifdef GCTL_GRAPHIC_GMT
gmt_JX_single pic; gmt_JX_single pic; ///< gmt绘图对象
#endif // GCTL_GRAPHIC_GMT #endif // GCTL_GRAPHIC_GMT
array<vertex2dc> nodes; array<vertex2dc> nodes; ///< 规则网格的节点数组
array<rectangle2d> elements; array<rectangle2d> elements; ///< 规则网格的单元数组
}; };
} }