update mesh_io

This commit is contained in:
张壹 2025-02-17 11:50:14 +08:00
parent 91830b3fdd
commit 6c7ec61fca
3 changed files with 112 additions and 17 deletions

View File

@ -40,15 +40,19 @@ int main(int argc, char const *argv[]) try
array<triangle> tris; array<triangle> tris;
mshio.select_elements("Bz (pT)", NodeData); mshio.select_elements("Bz (pT)", NodeData);
mshio.export_to(tris, nodes); mshio.export_selected_to(tris, nodes);
meshio_data &d = mshio.get_data("Bz (pT)", NodeData); //meshio_data &d = mshio.get_data("Bz (pT)", NodeData);
array<double> dat = d.val; //array<double> dat = d.val;
array<double> dat1 = mshio.get_selected_data("Bx (pT)", NodeData);
array<double> dat2 = mshio.get_selected_data("By (pT)", NodeData);
array<double> dat3 = mshio.get_selected_data("Bz (pT)", NodeData);
mesh_io mshio2; mesh_io mshio2;
mshio2.import_from(tris, nodes); mshio2.import_from(tris, nodes);
mshio2.select_elements(); mshio2.add_data("Bx (pT)", dat1, NodeData, OverWrite);
mshio2.add_data("Bz (pT)", dat, NodeData, OverWrite); mshio2.add_data("By (pT)", dat2, NodeData, OverWrite);
mshio2.add_data("Bz (pT)", dat3, NodeData, OverWrite);
mshio2.save_gmsh_v2_ascii("tmp"); mshio2.save_gmsh_v2_ascii("tmp");
mshio2.info(); mshio2.info();

View File

@ -639,17 +639,17 @@ void gctl::mesh_io::select_elements(std::string dat_name, mesh_data_type_e dtype
return; return;
} }
size_t gctl::mesh_io::node_size() size_t gctl::mesh_io::selected_node_size()
{ {
return selected_nodes_.size(); return selected_nodes_.size();
} }
size_t gctl::mesh_io::element_size() size_t gctl::mesh_io::selected_element_size()
{ {
return selected_elems_.size(); return selected_elems_.size();
} }
const gctl::array<int> &gctl::mesh_io::node_tags() const gctl::array<int> &gctl::mesh_io::selected_node_tags()
{ {
selected_node_tag_.resize(selected_nodes_.size(), DEFAULT_INVALID_TAG); selected_node_tag_.resize(selected_nodes_.size(), DEFAULT_INVALID_TAG);
@ -663,7 +663,7 @@ const gctl::array<int> &gctl::mesh_io::node_tags()
return selected_node_tag_; return selected_node_tag_;
} }
const gctl::array<int> &gctl::mesh_io::element_tags(element_tag_enum tag_type) const gctl::array<int> &gctl::mesh_io::selected_element_tags(element_tag_enum tag_type)
{ {
selected_elem_tag_.resize(selected_elems_.size()); selected_elem_tag_.resize(selected_elems_.size());
@ -813,6 +813,49 @@ gctl::meshio_data *gctl::mesh_io::get_data_ptr(std::string name, mesh_data_type_
return &datas_[id]; return &datas_[id];
} }
gctl::array<double> gctl::mesh_io::get_selected_data(std::string name, mesh_data_type_e type)
{
int id = if_saved_data(name, type);
if (id == -1) throw std::runtime_error("[gctl::mesh_io::get_data] Data not found.");
array<double> val;
if (datas_[id].d_type == NodeData)
{
val.resize(selected_nodes_.size(), GCTL_BDL_MAX);
vertex3dc *v_ptr;
for (size_t i = 0; i < selected_nodes_.size(); i++)
{
for (size_t j = 0; j < datas_[id].tar_ptrs.size(); j++)
{
v_ptr = reinterpret_cast<vertex3dc*>(datas_[id].tar_ptrs[j]);
if (v_ptr == selected_nodes_[i])
{
val[i] = datas_[id].val[j];
break;
}
}
}
}
else // ElemData
{
val.resize(selected_elems_.size(), GCTL_BDL_MAX);
meshio_element *e_ptr;
for (size_t i = 0; i < selected_elems_.size(); i++)
{
for (size_t j = 0; j < datas_[id].tar_ptrs.size(); j++)
{
e_ptr = reinterpret_cast<meshio_element*>(datas_[id].tar_ptrs[j]);
if (e_ptr == selected_elems_[i])
{
val[i] = datas_[id].val[j];
break;
}
}
}
}
return val;
}
void gctl::mesh_io::add_data(std::string name, const array<double> &data, void gctl::mesh_io::add_data(std::string name, const array<double> &data,
mesh_data_type_e dtype, output_type_e op) mesh_data_type_e dtype, output_type_e op)
{ {
@ -956,15 +999,18 @@ void gctl::mesh_io::read_triangle_ascii(std::string filename, index_packed_e is_
valid_group_size_ = 0; valid_group_size_ = 0;
nodes_.resize(valid_node_size_); nodes_.resize(valid_node_size_);
selected_nodes_.resize(valid_node_size_);
for (size_t i = 0; i < valid_node_size_; i++) for (size_t i = 0; i < valid_node_size_; i++)
{ {
nodes_[i].id = i; nodes_[i].id = i;
nodes_[i].x = node_2d[i].x; nodes_[i].x = node_2d[i].x;
nodes_[i].y = node_2d[i].y; nodes_[i].y = node_2d[i].y;
nodes_[i].z = 0.0; nodes_[i].z = 0.0;
selected_nodes_[i] = nodes_.get(i);
} }
elems_.resize(valid_elem_size_); elems_.resize(valid_elem_size_);
selected_elems_.resize(valid_elem_size_);
matrix<int> int_tag(valid_elem_size_, 3, DEFAULT_INVALID_TAG); matrix<int> int_tag(valid_elem_size_, 3, DEFAULT_INVALID_TAG);
for (size_t i = 0; i < valid_elem_size_; i++) for (size_t i = 0; i < valid_elem_size_; i++)
@ -979,6 +1025,7 @@ void gctl::mesh_io::read_triangle_ascii(std::string filename, index_packed_e is_
elems_[i].vert_ptrs[0] = nodes_.get(tri_2d[i].vert[0]->id); elems_[i].vert_ptrs[0] = nodes_.get(tri_2d[i].vert[0]->id);
elems_[i].vert_ptrs[1] = nodes_.get(tri_2d[i].vert[1]->id); elems_[i].vert_ptrs[1] = nodes_.get(tri_2d[i].vert[1]->id);
elems_[i].vert_ptrs[2] = nodes_.get(tri_2d[i].vert[2]->id); elems_[i].vert_ptrs[2] = nodes_.get(tri_2d[i].vert[2]->id);
selected_elems_[i] = elems_.get(i);
} }
if (!tri_attri.empty()) if (!tri_attri.empty())
@ -1043,10 +1090,12 @@ void gctl::mesh_io::read_triangle_ascii(std::string filename, index_packed_e is_
// 最后将所有的组别和单元体设置为可用 // 最后将所有的组别和单元体设置为可用
valid_group_size_ = groups_.size(); valid_group_size_ = groups_.size();
selected_groups_.resize(valid_group_size_);
for (size_t g = 0; g < groups_.size(); g++) for (size_t g = 0; g < groups_.size(); g++)
{ {
groups_[g].enabled = true; groups_[g].enabled = true;
groups_[g].enable_elements(); groups_[g].enable_elements();
selected_groups_[g] = &groups_[g];
} }
initialized_ = true; initialized_ = true;
return; return;
@ -1081,15 +1130,18 @@ void gctl::mesh_io::read_tetgen_ascii(std::string filename, index_packed_e is_pa
valid_group_size_ = 0; valid_group_size_ = 0;
nodes_.resize(valid_node_size_); nodes_.resize(valid_node_size_);
selected_nodes_.resize(valid_node_size_);
for (size_t i = 0; i < valid_node_size_; i++) for (size_t i = 0; i < valid_node_size_; i++)
{ {
nodes_[i].id = i; nodes_[i].id = i;
nodes_[i].x = node_3d[i].x; nodes_[i].x = node_3d[i].x;
nodes_[i].y = node_3d[i].y; nodes_[i].y = node_3d[i].y;
nodes_[i].z = node_3d[i].z; nodes_[i].z = node_3d[i].z;
selected_nodes_[i] = nodes_.get(i);
} }
elems_.resize(valid_elem_size_); elems_.resize(valid_elem_size_);
selected_elems_.resize(valid_elem_size_);
matrix<int> int_tag(valid_elem_size_, 3, DEFAULT_INVALID_TAG); matrix<int> int_tag(valid_elem_size_, 3, DEFAULT_INVALID_TAG);
for (size_t i = 0; i < tet_3d.size(); i++) for (size_t i = 0; i < tet_3d.size(); i++)
@ -1105,6 +1157,7 @@ void gctl::mesh_io::read_tetgen_ascii(std::string filename, index_packed_e is_pa
elems_[i].vert_ptrs[1] = nodes_.get(tet_3d[i].vert[1]->id); elems_[i].vert_ptrs[1] = nodes_.get(tet_3d[i].vert[1]->id);
elems_[i].vert_ptrs[2] = nodes_.get(tet_3d[i].vert[2]->id); elems_[i].vert_ptrs[2] = nodes_.get(tet_3d[i].vert[2]->id);
elems_[i].vert_ptrs[3] = nodes_.get(tet_3d[i].vert[3]->id); elems_[i].vert_ptrs[3] = nodes_.get(tet_3d[i].vert[3]->id);
selected_elems_[i] = elems_.get(i);
} }
int offset = tet_3d.size(); int offset = tet_3d.size();
@ -1120,6 +1173,7 @@ void gctl::mesh_io::read_tetgen_ascii(std::string filename, index_packed_e is_pa
elems_[i + offset].vert_ptrs[0] = nodes_.get(tri_3d[i].vert[0]->id); elems_[i + offset].vert_ptrs[0] = nodes_.get(tri_3d[i].vert[0]->id);
elems_[i + offset].vert_ptrs[1] = nodes_.get(tri_3d[i].vert[1]->id); elems_[i + offset].vert_ptrs[1] = nodes_.get(tri_3d[i].vert[1]->id);
elems_[i + offset].vert_ptrs[2] = nodes_.get(tri_3d[i].vert[2]->id); elems_[i + offset].vert_ptrs[2] = nodes_.get(tri_3d[i].vert[2]->id);
selected_elems_[i + offset] = elems_.get(i + offset);
} }
if (!tet_tag.empty()) if (!tet_tag.empty())
@ -1192,10 +1246,12 @@ void gctl::mesh_io::read_tetgen_ascii(std::string filename, index_packed_e is_pa
// 最后将所有的组别和单元体设置为可用 // 最后将所有的组别和单元体设置为可用
valid_group_size_ = groups_.size(); valid_group_size_ = groups_.size();
selected_groups_.resize(valid_group_size_);
for (size_t g = 0; g < groups_.size(); g++) for (size_t g = 0; g < groups_.size(); g++)
{ {
groups_[g].enabled = true; groups_[g].enabled = true;
groups_[g].enable_elements(); groups_[g].enable_elements();
selected_groups_[g] = &groups_[g];
} }
initialized_ = true; initialized_ = true;
return; return;
@ -1258,6 +1314,7 @@ void gctl::mesh_io::read_gmsh_v2_ascii(std::string filename, index_packed_e is_p
str2ss(tmp_str, tmp_ss); str2ss(tmp_str, tmp_ss);
tmp_ss >> n_size; //第一个数为顶点个数 tmp_ss >> n_size; //第一个数为顶点个数
nodes_.resize(n_size); nodes_.resize(n_size);
selected_nodes_.resize(n_size);
valid_node_size_ = n_size; valid_node_size_ = n_size;
for (int i = 0; i < n_size; i++) for (int i = 0; i < n_size; i++)
@ -1266,6 +1323,8 @@ void gctl::mesh_io::read_gmsh_v2_ascii(std::string filename, index_packed_e is_p
str2ss(tmp_str, tmp_ss); str2ss(tmp_str, tmp_ss);
tmp_ss >> nodes_[i].id >> nodes_[i].x >> nodes_[i].y >> nodes_[i].z; tmp_ss >> nodes_[i].id >> nodes_[i].x >> nodes_[i].y >> nodes_[i].z;
if (is_packed == NotPacked) nodes_[i].id -= 1; if (is_packed == NotPacked) nodes_[i].id -= 1;
selected_nodes_[i] = nodes_.get(i);
} }
break; break;
} }
@ -1284,6 +1343,7 @@ void gctl::mesh_io::read_gmsh_v2_ascii(std::string filename, index_packed_e is_p
valid_elem_size_ = i_size; valid_elem_size_ = i_size;
elems_.resize(i_size); elems_.resize(i_size);
selected_elems_.resize(i_size);
file_itag.resize(valid_elem_size_); file_itag.resize(valid_elem_size_);
for (size_t i = 0; i < i_size; i++) for (size_t i = 0; i < i_size; i++)
@ -1312,6 +1372,8 @@ void gctl::mesh_io::read_gmsh_v2_ascii(std::string filename, index_packed_e is_p
if (is_packed == Packed) elems_[i].vert_ptrs[v] = nodes_.get(vt_idx); if (is_packed == Packed) elems_[i].vert_ptrs[v] = nodes_.get(vt_idx);
else elems_[i].vert_ptrs[v] = nodes_.get(vt_idx - 1); else elems_[i].vert_ptrs[v] = nodes_.get(vt_idx - 1);
} }
selected_elems_[i] = elems_.get(i);
} }
break; break;
} }
@ -1455,10 +1517,12 @@ void gctl::mesh_io::read_gmsh_v2_ascii(std::string filename, index_packed_e is_p
// 最后将所有的组别和单元体设置为可用 // 最后将所有的组别和单元体设置为可用
valid_group_size_ = groups_.size(); valid_group_size_ = groups_.size();
selected_groups_.resize(valid_group_size_);
for (size_t g = 0; g < groups_.size(); g++) for (size_t g = 0; g < groups_.size(); g++)
{ {
groups_[g].enabled = true; groups_[g].enabled = true;
groups_[g].enable_elements(); groups_[g].enable_elements();
selected_groups_[g] = &groups_[g];
} }
initialized_ = true; initialized_ = true;
return; return;

View File

@ -298,28 +298,28 @@ namespace gctl
* *
* @return * @return
*/ */
size_t node_size(); size_t selected_node_size();
/** /**
* @brief 使select_elements函数选择 * @brief 使select_elements函数选择
* *
* @return * @return
*/ */
size_t element_size(); size_t selected_element_size();
/** /**
* @brief -9999 * @brief -9999
* *
* @return * @return
*/ */
const array<int> &node_tags(); const array<int> &selected_node_tags();
/** /**
* @brief -9999 * @brief -9999
* *
* @return * @return
*/ */
const array<int> &element_tags(element_tag_enum tag_type); const array<int> &selected_element_tags(element_tag_enum tag_type);
/** /**
* @brief gmsh格式分组表 * @brief gmsh格式分组表
@ -363,6 +363,16 @@ namespace gctl
*/ */
meshio_data *get_data_ptr(std::string name, mesh_data_type_e type); meshio_data *get_data_ptr(std::string name, mesh_data_type_e type);
/**
* @brief
*
* @param name
* @param type
*
* @return
*/
array<double> get_selected_data(std::string name, mesh_data_type_e type);
/** /**
* @brief * @brief
* *
@ -440,7 +450,7 @@ namespace gctl
* @param nodes * @param nodes
*/ */
template <typename T> template <typename T>
void export_to(array<T> &elems, array<vertex3dc> &nodes); void export_selected_to(array<T> &elems, array<vertex3dc> &nodes);
/** /**
* @brief * @brief
@ -455,7 +465,7 @@ namespace gctl
* {1,0}yox平面{0,2}xoz平面{1,2}yoz平面 * {1,0}yox平面{0,2}xoz平面{1,2}yoz平面
*/ */
template <typename T> template <typename T>
void export_to(array<T> &elems, array<vertex2dc> &nodes, int x_id = 0, int y_id = 1); void export_selected_to(array<T> &elems, array<vertex2dc> &nodes, int x_id = 0, int y_id = 1);
/** /**
* @brief * @brief
@ -518,7 +528,7 @@ namespace gctl
}; };
template <typename T> template <typename T>
void gctl::mesh_io::export_to(array<T> &elems, array<vertex3dc> &nodes) void gctl::mesh_io::export_selected_to(array<T> &elems, array<vertex3dc> &nodes)
{ {
const std::type_info &tinfo = typeid(T); const std::type_info &tinfo = typeid(T);
element_type_enum oe_type = match_type(tinfo); element_type_enum oe_type = match_type(tinfo);
@ -554,7 +564,7 @@ namespace gctl
} }
template <typename T> template <typename T>
void gctl::mesh_io::export_to(array<T> &elems, array<vertex2dc> &nodes, int x_id, int y_id) void gctl::mesh_io::export_selected_to(array<T> &elems, array<vertex2dc> &nodes, int x_id, int y_id)
{ {
const std::type_info &tinfo = typeid(T); const std::type_info &tinfo = typeid(T);
element_type_enum oe_type = match_type(tinfo); element_type_enum oe_type = match_type(tinfo);
@ -606,15 +616,18 @@ namespace gctl
valid_elem_size_ = elems.size(); valid_elem_size_ = elems.size();
nodes_.resize(valid_node_size_); nodes_.resize(valid_node_size_);
selected_nodes_.resize(valid_node_size_);
for (size_t i = 0; i < valid_node_size_; i++) for (size_t i = 0; i < valid_node_size_; i++)
{ {
nodes_[i].id = i; nodes_[i].id = i;
nodes_[i].x = nodes[i].x; nodes_[i].x = nodes[i].x;
nodes_[i].y = nodes[i].y; nodes_[i].y = nodes[i].y;
nodes_[i].z = nodes[i].z; nodes_[i].z = nodes[i].z;
selected_nodes_[i] = nodes_.get(i);
} }
elems_.resize(valid_elem_size_); elems_.resize(valid_elem_size_);
selected_elems_.resize(valid_elem_size_);
for (size_t i = 0; i < valid_elem_size_; i++) for (size_t i = 0; i < valid_elem_size_; i++)
{ {
elems_[i].id = i; elems_[i].id = i;
@ -625,6 +638,8 @@ namespace gctl
{ {
elems_[i].vert_ptrs[v] = nodes_.get(elems[i].vert[v]->id); elems_[i].vert_ptrs[v] = nodes_.get(elems[i].vert[v]->id);
} }
selected_elems_[i] = elems_.get(i);
} }
// 所有单元体都属于同一个组 // 所有单元体都属于同一个组
@ -643,6 +658,9 @@ namespace gctl
groups_[0].enable_elements(); groups_[0].enable_elements();
initialized_ = true; initialized_ = true;
selected_groups_.resize(1);
selected_groups_[0] = &groups_[0];
return; return;
} }
@ -660,6 +678,7 @@ namespace gctl
int xyz_ref[3]; int xyz_ref[3];
nodes_.resize(valid_node_size_); nodes_.resize(valid_node_size_);
selected_nodes_.resize(valid_node_size_);
for (size_t i = 0; i < valid_node_size_; i++) for (size_t i = 0; i < valid_node_size_; i++)
{ {
nodes_[i].id = i; nodes_[i].id = i;
@ -673,9 +692,12 @@ namespace gctl
nodes_[i].x = xyz_ref[0]; nodes_[i].x = xyz_ref[0];
nodes_[i].y = xyz_ref[1]; nodes_[i].y = xyz_ref[1];
nodes_[i].z = xyz_ref[2]; nodes_[i].z = xyz_ref[2];
selected_nodes_[i] = nodes_.get(i);
} }
elems_.resize(valid_elem_size_); elems_.resize(valid_elem_size_);
selected_elems_.resize(valid_elem_size_);
for (size_t i = 0; i < valid_elem_size_; i++) for (size_t i = 0; i < valid_elem_size_; i++)
{ {
elems_[i].id = i; elems_[i].id = i;
@ -686,6 +708,8 @@ namespace gctl
{ {
elems_[i].vert_ptrs[v] = nodes_.get(elems[i].vert[v]->id); elems_[i].vert_ptrs[v] = nodes_.get(elems[i].vert[v]->id);
} }
selected_elems_[i] = elems_.get(i);
} }
// 所有单元体都属于同一个组 // 所有单元体都属于同一个组
@ -704,6 +728,9 @@ namespace gctl
groups_[0].enable_elements(); groups_[0].enable_elements();
initialized_ = true; initialized_ = true;
selected_groups_.resize(1);
selected_groups_[0] = &groups_[0];
return; return;
} }
}; };