From 6c7ec61fcaacf1c9f7eae9411b96d1e9a7039259 Mon Sep 17 00:00:00 2001 From: Yi Zhang Date: Mon, 17 Feb 2025 11:50:14 +0800 Subject: [PATCH] update mesh_io --- example/meshio_ex.cpp | 14 ++++++--- lib/io/mesh_io.cpp | 72 ++++++++++++++++++++++++++++++++++++++++--- lib/io/mesh_io.h | 43 +++++++++++++++++++++----- 3 files changed, 112 insertions(+), 17 deletions(-) diff --git a/example/meshio_ex.cpp b/example/meshio_ex.cpp index 683d5ae..8dadf73 100644 --- a/example/meshio_ex.cpp +++ b/example/meshio_ex.cpp @@ -40,15 +40,19 @@ int main(int argc, char const *argv[]) try array tris; 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); - array dat = d.val; + //meshio_data &d = mshio.get_data("Bz (pT)", NodeData); + //array dat = d.val; + array dat1 = mshio.get_selected_data("Bx (pT)", NodeData); + array dat2 = mshio.get_selected_data("By (pT)", NodeData); + array dat3 = mshio.get_selected_data("Bz (pT)", NodeData); mesh_io mshio2; mshio2.import_from(tris, nodes); - mshio2.select_elements(); - mshio2.add_data("Bz (pT)", dat, NodeData, OverWrite); + mshio2.add_data("Bx (pT)", dat1, 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.info(); diff --git a/lib/io/mesh_io.cpp b/lib/io/mesh_io.cpp index 8ac24cb..2acf56a 100644 --- a/lib/io/mesh_io.cpp +++ b/lib/io/mesh_io.cpp @@ -639,17 +639,17 @@ void gctl::mesh_io::select_elements(std::string dat_name, mesh_data_type_e dtype return; } -size_t gctl::mesh_io::node_size() +size_t gctl::mesh_io::selected_node_size() { return selected_nodes_.size(); } -size_t gctl::mesh_io::element_size() +size_t gctl::mesh_io::selected_element_size() { return selected_elems_.size(); } -const gctl::array &gctl::mesh_io::node_tags() +const gctl::array &gctl::mesh_io::selected_node_tags() { selected_node_tag_.resize(selected_nodes_.size(), DEFAULT_INVALID_TAG); @@ -663,7 +663,7 @@ const gctl::array &gctl::mesh_io::node_tags() return selected_node_tag_; } -const gctl::array &gctl::mesh_io::element_tags(element_tag_enum tag_type) +const gctl::array &gctl::mesh_io::selected_element_tags(element_tag_enum tag_type) { 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]; } +gctl::array 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 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(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(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 &data, 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; nodes_.resize(valid_node_size_); + selected_nodes_.resize(valid_node_size_); for (size_t i = 0; i < valid_node_size_; i++) { nodes_[i].id = i; nodes_[i].x = node_2d[i].x; nodes_[i].y = node_2d[i].y; nodes_[i].z = 0.0; + selected_nodes_[i] = nodes_.get(i); } elems_.resize(valid_elem_size_); + selected_elems_.resize(valid_elem_size_); matrix int_tag(valid_elem_size_, 3, DEFAULT_INVALID_TAG); 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[1] = nodes_.get(tri_2d[i].vert[1]->id); elems_[i].vert_ptrs[2] = nodes_.get(tri_2d[i].vert[2]->id); + selected_elems_[i] = elems_.get(i); } 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(); + selected_groups_.resize(valid_group_size_); for (size_t g = 0; g < groups_.size(); g++) { groups_[g].enabled = true; groups_[g].enable_elements(); + selected_groups_[g] = &groups_[g]; } initialized_ = true; return; @@ -1081,15 +1130,18 @@ void gctl::mesh_io::read_tetgen_ascii(std::string filename, index_packed_e is_pa valid_group_size_ = 0; nodes_.resize(valid_node_size_); + selected_nodes_.resize(valid_node_size_); for (size_t i = 0; i < valid_node_size_; i++) { nodes_[i].id = i; nodes_[i].x = node_3d[i].x; nodes_[i].y = node_3d[i].y; nodes_[i].z = node_3d[i].z; + selected_nodes_[i] = nodes_.get(i); } elems_.resize(valid_elem_size_); + selected_elems_.resize(valid_elem_size_); matrix int_tag(valid_elem_size_, 3, DEFAULT_INVALID_TAG); 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[2] = nodes_.get(tet_3d[i].vert[2]->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(); @@ -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[1] = nodes_.get(tri_3d[i].vert[1]->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()) @@ -1192,10 +1246,12 @@ void gctl::mesh_io::read_tetgen_ascii(std::string filename, index_packed_e is_pa // 最后将所有的组别和单元体设置为可用 valid_group_size_ = groups_.size(); + selected_groups_.resize(valid_group_size_); for (size_t g = 0; g < groups_.size(); g++) { groups_[g].enabled = true; groups_[g].enable_elements(); + selected_groups_[g] = &groups_[g]; } initialized_ = true; 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); tmp_ss >> n_size; //第一个数为顶点个数 nodes_.resize(n_size); + selected_nodes_.resize(n_size); valid_node_size_ = n_size; 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); tmp_ss >> nodes_[i].id >> nodes_[i].x >> nodes_[i].y >> nodes_[i].z; if (is_packed == NotPacked) nodes_[i].id -= 1; + + selected_nodes_[i] = nodes_.get(i); } 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; elems_.resize(i_size); + selected_elems_.resize(i_size); file_itag.resize(valid_elem_size_); 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); else elems_[i].vert_ptrs[v] = nodes_.get(vt_idx - 1); } + + selected_elems_[i] = elems_.get(i); } 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(); + selected_groups_.resize(valid_group_size_); for (size_t g = 0; g < groups_.size(); g++) { groups_[g].enabled = true; groups_[g].enable_elements(); + selected_groups_[g] = &groups_[g]; } initialized_ = true; return; diff --git a/lib/io/mesh_io.h b/lib/io/mesh_io.h index 6d881ce..5832001 100644 --- a/lib/io/mesh_io.h +++ b/lib/io/mesh_io.h @@ -298,28 +298,28 @@ namespace gctl * * @return 顶点数量 */ - size_t node_size(); + size_t selected_node_size(); /** * @brief 返回已选择的单元体的数量(使用select_elements函数选择)。 * * @return 单元体数量 */ - size_t element_size(); + size_t selected_element_size(); /** * @brief 返回已选择的单元体所对应的顶点标签(默认的无效标签为-9999) * * @return 整型数组的引用。 */ - const array &node_tags(); + const array &selected_node_tags(); /** * @brief 返回已选择的单元体所对应的元素标签(默认的无效标签为-9999) * * @return 整型数组的引用。 */ - const array &element_tags(element_tag_enum tag_type); + const array &selected_element_tags(element_tag_enum tag_type); /** * @brief 获取gmsh格式分组表 @@ -363,6 +363,16 @@ namespace gctl */ meshio_data *get_data_ptr(std::string name, mesh_data_type_e type); + /** + * @brief 返回已选择顶点或单元体位置的数据值,会按照已选择顶点或者单元体索引排序。 + * + * @param name 数据名称 + * @param type 数据类型 + * + * @return 输出的数据数组 + */ + array get_selected_data(std::string name, mesh_data_type_e type); + /** * @brief 添加一个顶点数据对象。数据将依次添加到已选择的顶点位置。 * @@ -440,7 +450,7 @@ namespace gctl * @param nodes 新生成的顶点数组的引用。 */ template - void export_to(array &elems, array &nodes); + void export_selected_to(array &elems, array &nodes); /** * @brief 提取所选择的单元体到外部数组。 @@ -455,7 +465,7 @@ namespace gctl * {1,0}即为yox平面、{0,2}即为xoz平面、{1,2}即为yoz平面。 */ template - void export_to(array &elems, array &nodes, int x_id = 0, int y_id = 1); + void export_selected_to(array &elems, array &nodes, int x_id = 0, int y_id = 1); /** * @brief 导入外部单元体数组。 @@ -518,7 +528,7 @@ namespace gctl }; template - void gctl::mesh_io::export_to(array &elems, array &nodes) + void gctl::mesh_io::export_selected_to(array &elems, array &nodes) { const std::type_info &tinfo = typeid(T); element_type_enum oe_type = match_type(tinfo); @@ -554,7 +564,7 @@ namespace gctl } template - void gctl::mesh_io::export_to(array &elems, array &nodes, int x_id, int y_id) + void gctl::mesh_io::export_selected_to(array &elems, array &nodes, int x_id, int y_id) { const std::type_info &tinfo = typeid(T); element_type_enum oe_type = match_type(tinfo); @@ -606,15 +616,18 @@ namespace gctl valid_elem_size_ = elems.size(); nodes_.resize(valid_node_size_); + selected_nodes_.resize(valid_node_size_); for (size_t i = 0; i < valid_node_size_; i++) { nodes_[i].id = i; nodes_[i].x = nodes[i].x; nodes_[i].y = nodes[i].y; nodes_[i].z = nodes[i].z; + selected_nodes_[i] = nodes_.get(i); } elems_.resize(valid_elem_size_); + selected_elems_.resize(valid_elem_size_); for (size_t i = 0; i < valid_elem_size_; i++) { elems_[i].id = i; @@ -625,6 +638,8 @@ namespace gctl { 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(); initialized_ = true; + + selected_groups_.resize(1); + selected_groups_[0] = &groups_[0]; return; } @@ -660,6 +678,7 @@ namespace gctl int xyz_ref[3]; nodes_.resize(valid_node_size_); + selected_nodes_.resize(valid_node_size_); for (size_t i = 0; i < valid_node_size_; i++) { nodes_[i].id = i; @@ -673,9 +692,12 @@ namespace gctl nodes_[i].x = xyz_ref[0]; nodes_[i].y = xyz_ref[1]; nodes_[i].z = xyz_ref[2]; + + selected_nodes_[i] = nodes_.get(i); } elems_.resize(valid_elem_size_); + selected_elems_.resize(valid_elem_size_); for (size_t i = 0; i < valid_elem_size_; i++) { elems_[i].id = i; @@ -686,6 +708,8 @@ namespace gctl { 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(); initialized_ = true; + + selected_groups_.resize(1); + selected_groups_[0] = &groups_[0]; return; } };