diff --git a/lib/io/mesh_io.cpp b/lib/io/mesh_io.cpp index 4c9eb85..8d3a03e 100644 --- a/lib/io/mesh_io.cpp +++ b/lib/io/mesh_io.cpp @@ -46,8 +46,7 @@ void gctl::meshio_data::clear() str_tag.clear(); real_tag.clear(); int_tag.clear(); - vert_ptrs.clear(); - elem_ptrs.clear(); + tar_ptrs.clear(); val.clear(); return; } @@ -55,11 +54,10 @@ void gctl::meshio_data::clear() bool gctl::meshio_data::pass_check() { // 检查是否同时连接了顶点和单元体 - if (vert_ptrs.empty() && elem_ptrs.empty()) return false; - if (!vert_ptrs.empty() && !elem_ptrs.empty()) return false; + if (tar_ptrs.empty()) return false; + if (int_tag[2] != val.size()) return false; + if (tar_ptrs.size() != val.size()) return false; if (str_tag.empty() || real_tag.empty() || int_tag.size() < 3) return false; - if (!vert_ptrs.empty() && (vert_ptrs.size() != val.size() || int_tag[2] != val.size())) return false; - if (!elem_ptrs.empty() && (elem_ptrs.size() != val.size() || int_tag[2] != val.size())) return false; return true; } @@ -319,7 +317,7 @@ void gctl::mesh_io::info(std::ostream &ss) ss << "nodedata: \""; for (size_t l = 0; l < datas_[d].val.size(); l++) { - if (datas_[d].vert_ptrs[l]->id != DEFAULT_INVALID_TAG) + if (reinterpret_cast(datas_[d].tar_ptrs[l])->id != DEFAULT_INVALID_TAG) { min = std::min(min, datas_[d].val[l]); max = std::max(max, datas_[d].val[l]); @@ -332,7 +330,7 @@ void gctl::mesh_io::info(std::ostream &ss) ss << "elementdata: \""; for (size_t l = 0; l < datas_[d].val.size(); l++) { - if (datas_[d].elem_ptrs[l]->enabled) + if (reinterpret_cast(datas_[d].tar_ptrs[l])->enabled) { min = std::min(min, datas_[d].val[l]); max = std::max(max, datas_[d].val[l]); @@ -558,7 +556,7 @@ void gctl::mesh_io::convert_tags_to_data(element_tag_enum tag_type) tmp_data.int_tag[2] = valid_node_size_; tmp_data.val.resize(valid_node_size_); - tmp_data.vert_ptrs.resize(valid_node_size_); + tmp_data.tar_ptrs.resize(valid_node_size_); size_t c = 0; for (size_t i = 0; i < nodes_.size(); i++) @@ -566,7 +564,7 @@ void gctl::mesh_io::convert_tags_to_data(element_tag_enum tag_type) if (nodes_[i].id != DEFAULT_INVALID_TAG) { tmp_data.val[c] = (double) nodes_tag_[i]; - tmp_data.vert_ptrs[c] = nodes_.get(i); + tmp_data.tar_ptrs[c] = nodes_.get(i); c++; } } @@ -588,7 +586,7 @@ void gctl::mesh_io::convert_tags_to_data(element_tag_enum tag_type) tmp_data.int_tag[2] = valid_elem_size_; tmp_data.val.resize(valid_elem_size_); - tmp_data.elem_ptrs.resize(valid_elem_size_); + tmp_data.tar_ptrs.resize(valid_elem_size_); size_t c = 0; for (size_t g = 0; g < groups_.size(); g++) @@ -600,7 +598,7 @@ void gctl::mesh_io::convert_tags_to_data(element_tag_enum tag_type) if (tag_type == PhysicalTag) tmp_data.val[c] = (double) groups_[g].phys_group; if (tag_type == GeometryTag) tmp_data.val[c] = (double) groups_[g].geom_group; if (tag_type == PartitionTag) tmp_data.val[c] = (double) groups_[g].part_group; - tmp_data.elem_ptrs[c] = groups_[g].elem_ptrs[e]; + tmp_data.tar_ptrs[c] = groups_[g].elem_ptrs[e]; c++; } } @@ -840,12 +838,12 @@ void gctl::mesh_io::add_node_data(std::string name, const array &data) new_data.int_tag.resize(3, 0); new_data.int_tag[1] = 1; new_data.int_tag[2] = s; - new_data.vert_ptrs.resize(s, nullptr); + new_data.tar_ptrs.resize(s, nullptr); new_data.val.resize(s); for (size_t i = 0; i < s; i++) { - new_data.vert_ptrs[i] = nodes_.get(i); + new_data.tar_ptrs[i] = nodes_.get(i); new_data.val[i] = data[i]; } @@ -868,7 +866,7 @@ void gctl::mesh_io::add_node_data(std::string name, const array &data, c if (d_id != -1) { datas_[d_id].val.resize(s); - datas_[d_id].vert_ptrs.resize(s, nullptr); + datas_[d_id].tar_ptrs.resize(s, nullptr); datas_[d_id].int_tag[2] = s; s = 0; @@ -876,7 +874,7 @@ void gctl::mesh_io::add_node_data(std::string name, const array &data, c { if (boolen[i]) { - datas_[d_id].vert_ptrs[s] = nodes_.get(i); + datas_[d_id].tar_ptrs[s] = nodes_.get(i); datas_[d_id].val[s] = data[i]; s++; } @@ -892,7 +890,7 @@ void gctl::mesh_io::add_node_data(std::string name, const array &data, c new_data.int_tag.resize(3, 0); new_data.int_tag[1] = 1; new_data.int_tag[2] = s; - new_data.vert_ptrs.resize(s, nullptr); + new_data.tar_ptrs.resize(s, nullptr); new_data.val.resize(s); s = 0; @@ -900,7 +898,7 @@ void gctl::mesh_io::add_node_data(std::string name, const array &data, c { if (boolen[i]) { - new_data.vert_ptrs[s] = nodes_.get(i); + new_data.tar_ptrs[s] = nodes_.get(i); new_data.val[s] = data[i]; s++; } @@ -924,7 +922,7 @@ void gctl::mesh_io::add_element_data(std::string name, const array &data if (d_id != -1) { datas_[d_id].int_tag[2] = e; - datas_[d_id].elem_ptrs.resize(e, nullptr); + datas_[d_id].tar_ptrs.resize(e, nullptr); datas_[d_id].val.resize(e, 0.0); e = 0; @@ -934,7 +932,7 @@ void gctl::mesh_io::add_element_data(std::string name, const array &data { for (size_t j = 0; j < groups_[i].elem_ptrs.size(); j++) { - datas_[d_id].elem_ptrs[e] = groups_[i].elem_ptrs[j]; + datas_[d_id].tar_ptrs[e] = groups_[i].elem_ptrs[j]; datas_[d_id].val[e] = data[e]; e++; } @@ -951,7 +949,7 @@ void gctl::mesh_io::add_element_data(std::string name, const array &data new_data.int_tag.resize(3, 0); new_data.int_tag[1] = 1; new_data.int_tag[2] = e; - new_data.elem_ptrs.resize(e, nullptr); + new_data.tar_ptrs.resize(e, nullptr); new_data.val.resize(e, 0.0); e = 0; @@ -961,7 +959,7 @@ void gctl::mesh_io::add_element_data(std::string name, const array &data { for (size_t j = 0; j < groups_[i].elem_ptrs.size(); j++) { - new_data.elem_ptrs[e] = groups_[i].elem_ptrs[j]; + new_data.tar_ptrs[e] = groups_[i].elem_ptrs[j]; new_data.val[e] = data[e]; e++; } @@ -991,7 +989,7 @@ void gctl::mesh_io::add_element_data(std::string name, const array &data int d_id = if_saved_data(name, ElemData); if (d_id != -1) { - array more_elem_ptrs(e, nullptr); + array more_elem_ptrs(e, nullptr); array more_val(e, 0.0); e = 0; @@ -1012,7 +1010,7 @@ void gctl::mesh_io::add_element_data(std::string name, const array &data } datas_[d_id].int_tag[2] += e; - datas_[d_id].elem_ptrs.concat(more_elem_ptrs); + datas_[d_id].tar_ptrs.concat(more_elem_ptrs); datas_[d_id].val.concat(more_val); return; } @@ -1025,7 +1023,7 @@ void gctl::mesh_io::add_element_data(std::string name, const array &data new_data.int_tag.resize(3, 0); new_data.int_tag[1] = 1; new_data.int_tag[2] = e; - new_data.elem_ptrs.resize(e, nullptr); + new_data.tar_ptrs.resize(e, nullptr); new_data.val.resize(e, 0.0); e = 0; @@ -1038,7 +1036,7 @@ void gctl::mesh_io::add_element_data(std::string name, const array &data { for (size_t j = 0; j < groups_[i].elem_ptrs.size(); j++) { - new_data.elem_ptrs[e] = groups_[i].elem_ptrs[j]; + new_data.tar_ptrs[e] = groups_[i].elem_ptrs[j]; new_data.val[e] = data[e]; e++; } @@ -1065,7 +1063,7 @@ void gctl::mesh_io::add_element_data(std::string name, std::string phys_name, co int d_id = if_saved_data(name, ElemData); if (d_id != -1) { - array more_elem_ptrs(e, nullptr); + array more_elem_ptrs(e, nullptr); array more_val(e, 0.0); e = 0; @@ -1083,7 +1081,7 @@ void gctl::mesh_io::add_element_data(std::string name, std::string phys_name, co } datas_[d_id].int_tag[2] += e; - datas_[d_id].elem_ptrs.concat(more_elem_ptrs); + datas_[d_id].tar_ptrs.concat(more_elem_ptrs); datas_[d_id].val.concat(more_val); return; } @@ -1096,7 +1094,7 @@ void gctl::mesh_io::add_element_data(std::string name, std::string phys_name, co new_data.int_tag.resize(3, 0); new_data.int_tag[1] = 1; new_data.int_tag[2] = e; - new_data.elem_ptrs.resize(e, nullptr); + new_data.tar_ptrs.resize(e, nullptr); new_data.val.resize(e, 0.0); e = 0; @@ -1106,7 +1104,7 @@ void gctl::mesh_io::add_element_data(std::string name, std::string phys_name, co { for (size_t j = 0; j < groups_[i].elem_ptrs.size(); j++) { - new_data.elem_ptrs[e] = groups_[i].elem_ptrs[j]; + new_data.tar_ptrs[e] = groups_[i].elem_ptrs[j]; new_data.val[e] = data[e]; e++; } @@ -1131,7 +1129,7 @@ void gctl::mesh_io::add_element_data(std::string name, std::string phys_name, do int d_id = if_saved_data(name, ElemData); if (d_id != -1) { - array more_elem_ptrs(e, nullptr); + array more_elem_ptrs(e, nullptr); array more_val(e, 0.0); e = 0; @@ -1149,7 +1147,7 @@ void gctl::mesh_io::add_element_data(std::string name, std::string phys_name, do } datas_[d_id].int_tag[2] += e; - datas_[d_id].elem_ptrs.concat(more_elem_ptrs); + datas_[d_id].tar_ptrs.concat(more_elem_ptrs); datas_[d_id].val.concat(more_val); return; } @@ -1162,7 +1160,7 @@ void gctl::mesh_io::add_element_data(std::string name, std::string phys_name, do new_data.int_tag.resize(3, 0); new_data.int_tag[1] = 1; new_data.int_tag[2] = e; - new_data.elem_ptrs.resize(e, nullptr); + new_data.tar_ptrs.resize(e, nullptr); new_data.val.resize(e, 0.0); e = 0; @@ -1172,7 +1170,7 @@ void gctl::mesh_io::add_element_data(std::string name, std::string phys_name, do { for (size_t j = 0; j < groups_[i].elem_ptrs.size(); j++) { - new_data.elem_ptrs[e] = groups_[i].elem_ptrs[j]; + new_data.tar_ptrs[e] = groups_[i].elem_ptrs[j]; new_data.val[e] = phys_val; e++; } @@ -1612,28 +1610,28 @@ void gctl::mesh_io::read_gmsh_v2_ascii(std::string filename, index_packed_e is_p if (tmp_data.d_type == NodeData) { - tmp_data.vert_ptrs.resize(tmp_data.int_tag.back()); + tmp_data.tar_ptrs.resize(tmp_data.int_tag.back()); tmp_data.val.resize(tmp_data.int_tag.back()); for (size_t i = 0; i < tmp_data.val.size(); i++) { getline(infile,tmp_str); str2ss(tmp_str, tmp_ss); tmp_ss >> vt_idx >> tmp_data.val[i]; - if (is_packed == Packed) tmp_data.vert_ptrs[i] = nodes_.get(vt_idx); - else tmp_data.vert_ptrs[i] = nodes_.get(vt_idx - 1); + if (is_packed == Packed) tmp_data.tar_ptrs[i] = nodes_.get(vt_idx); + else tmp_data.tar_ptrs[i] = nodes_.get(vt_idx - 1); } } else { - tmp_data.elem_ptrs.resize(tmp_data.int_tag.back()); + tmp_data.tar_ptrs.resize(tmp_data.int_tag.back()); tmp_data.val.resize(tmp_data.int_tag.back()); for (size_t i = 0; i < tmp_data.val.size(); i++) { getline(infile,tmp_str); str2ss(tmp_str, tmp_ss); tmp_ss >> vt_idx >> tmp_data.val[i]; - if (is_packed == Packed) tmp_data.elem_ptrs[i] = elems_.get(vt_idx); - else tmp_data.elem_ptrs[i] = elems_.get(vt_idx - 1); + if (is_packed == Packed) tmp_data.tar_ptrs[i] = elems_.get(vt_idx); + else tmp_data.tar_ptrs[i] = elems_.get(vt_idx - 1); } } @@ -1791,7 +1789,7 @@ void gctl::mesh_io::save_gmsh_v2_ascii(std::string filename, index_packed_e is_p d_size = 0; for (size_t n = 0; n < datas_[i].val.size(); n++) { - if (datas_[i].vert_ptrs[n]->id != DEFAULT_INVALID_TAG) d_size++; + if (reinterpret_cast(datas_[i].tar_ptrs[n])->id != DEFAULT_INVALID_TAG) d_size++; } if (d_size) @@ -1816,10 +1814,12 @@ void gctl::mesh_io::save_gmsh_v2_ascii(std::string filename, index_packed_e is_p } outfile << d_size << "\n"; + int tmp_id; for (size_t a = 0; a < datas_[i].val.size(); a++) { - if (datas_[i].vert_ptrs[a]->id != DEFAULT_INVALID_TAG && is_packed == Packed) outfile << datas_[i].vert_ptrs[a]->id << " " << std::setprecision(12) << datas_[i].val[a] << "\n"; - else if (datas_[i].vert_ptrs[a]->id != DEFAULT_INVALID_TAG) outfile << datas_[i].vert_ptrs[a]->id + 1 << " " << std::setprecision(12) << datas_[i].val[a] << "\n"; + tmp_id = reinterpret_cast(datas_[i].tar_ptrs[a])->id; + if (tmp_id != DEFAULT_INVALID_TAG && is_packed == Packed) outfile << tmp_id << " " << std::setprecision(12) << datas_[i].val[a] << "\n"; + else if (tmp_id != DEFAULT_INVALID_TAG) outfile << tmp_id + 1 << " " << std::setprecision(12) << datas_[i].val[a] << "\n"; } outfile << "$EndNodeData\n"; } @@ -1829,7 +1829,7 @@ void gctl::mesh_io::save_gmsh_v2_ascii(std::string filename, index_packed_e is_p d_size = 0; for (size_t n = 0; n < datas_[i].val.size(); n++) { - if (datas_[i].elem_ptrs[n]->enabled) d_size++; + if (reinterpret_cast(datas_[i].tar_ptrs[n])->enabled) d_size++; } if (d_size) @@ -1854,10 +1854,14 @@ void gctl::mesh_io::save_gmsh_v2_ascii(std::string filename, index_packed_e is_p } outfile << d_size << "\n"; + int tmp_id; + bool d_ok; for (size_t a = 0; a < datas_[i].val.size(); a++) { - if (datas_[i].elem_ptrs[a]->enabled && is_packed == Packed) outfile << datas_[i].elem_ptrs[a]->id << " " << std::setprecision(12) << datas_[i].val[a] << "\n"; - else if (datas_[i].elem_ptrs[a]->enabled) outfile << datas_[i].elem_ptrs[a]->id + 1 << " " << std::setprecision(12) << datas_[i].val[a] << "\n"; + tmp_id = reinterpret_cast(datas_[i].tar_ptrs[a])->id; + d_ok = reinterpret_cast(datas_[i].tar_ptrs[a])->enabled; + if (d_ok && is_packed == Packed) outfile << tmp_id << " " << std::setprecision(12) << datas_[i].val[a] << "\n"; + else if (d_ok) outfile << tmp_id + 1 << " " << std::setprecision(12) << datas_[i].val[a] << "\n"; } outfile << "$EndElementData\n"; } @@ -1927,7 +1931,7 @@ void gctl::mesh_io::save_vtk_legacy_ascii(std::string filename) d_size = 0; for (size_t n = 0; n < datas_[i].val.size(); n++) { - if (datas_[i].vert_ptrs[n]->id != DEFAULT_INVALID_TAG) d_size++; + if (reinterpret_cast(datas_[i].tar_ptrs[n])->id != DEFAULT_INVALID_TAG) d_size++; } if (d_size && d_size == valid_node_size_) @@ -1939,7 +1943,7 @@ void gctl::mesh_io::save_vtk_legacy_ascii(std::string filename) for (size_t a = 0; a < datas_[i].val.size(); a++) { - if (datas_[i].vert_ptrs[a]->id != DEFAULT_INVALID_TAG) outfile << std::setprecision(16) << datas_[i].val[a] << "\n"; + if (reinterpret_cast(datas_[i].tar_ptrs[a])->id != DEFAULT_INVALID_TAG) outfile << std::setprecision(16) << datas_[i].val[a] << "\n"; } } } @@ -1948,7 +1952,7 @@ void gctl::mesh_io::save_vtk_legacy_ascii(std::string filename) d_size = 0; for (size_t n = 0; n < datas_[i].val.size(); n++) { - if (datas_[i].elem_ptrs[n]->enabled) d_size++; + if (reinterpret_cast(datas_[i].tar_ptrs[n])->enabled) d_size++; } if (d_size && d_size == valid_elem_size_) @@ -1960,7 +1964,7 @@ void gctl::mesh_io::save_vtk_legacy_ascii(std::string filename) for (size_t a = 0; a < datas_[i].val.size(); a++) { - if (datas_[i].elem_ptrs[a]->enabled) outfile << std::setprecision(16) << datas_[i].val[a] << "\n"; + if (reinterpret_cast(datas_[i].tar_ptrs[a])->enabled) outfile << std::setprecision(16) << datas_[i].val[a] << "\n"; } } } @@ -1989,13 +1993,14 @@ void gctl::mesh_io::save_data_to_xyz(std::string filename, std::string dataname, if (datas_[i].d_type == NodeData) { - for (size_t n = 0; n < datas_[i].vert_ptrs.size(); n++) + for (size_t n = 0; n < datas_[i].tar_ptrs.size(); n++) { - if (datas_[i].vert_ptrs[n]->id != DEFAULT_INVALID_TAG) + vertex3dc* vptr = reinterpret_cast(datas_[i].tar_ptrs[n]); + if (vptr->id != DEFAULT_INVALID_TAG) { if (out_coor == Spherical) { - ps = datas_[i].vert_ptrs[n]->c2s(); + ps = vptr->c2s(); ps.rad -= ellipse_radius_2d(refR, refr, ps.lat*M_PI/180.0); ofile << ps.lon << " " << ps.lat << " " << ps.rad << " " << datas_[i].val[n] << "\n"; @@ -2007,17 +2012,18 @@ void gctl::mesh_io::save_data_to_xyz(std::string filename, std::string dataname, } else { - for (size_t e = 0; e < datas_[i].elem_ptrs.size(); e++) + for (size_t e = 0; e < datas_[i].tar_ptrs.size(); e++) { - if (datas_[i].elem_ptrs[e]->enabled) + meshio_element* mptr = reinterpret_cast(datas_[i].tar_ptrs[e]); + if (mptr->enabled) { pc = point3dc(0.0, 0.0, 0.0); - tmp_size = datas_[i].elem_ptrs[e]->vert_ptrs.size(); - for (size_t v = 0; v < datas_[i].elem_ptrs[e]->vert_ptrs.size(); v++) + tmp_size = mptr->vert_ptrs.size(); + for (size_t v = 0; v < mptr->vert_ptrs.size(); v++) { - pc.x += datas_[i].elem_ptrs[e]->vert_ptrs[v]->x; - pc.y += datas_[i].elem_ptrs[e]->vert_ptrs[v]->y; - pc.z += datas_[i].elem_ptrs[e]->vert_ptrs[v]->z; + pc.x += mptr->vert_ptrs[v]->x; + pc.y += mptr->vert_ptrs[v]->y; + pc.z += mptr->vert_ptrs[v]->z; } pc.x /= tmp_size; pc.y /= tmp_size; diff --git a/lib/io/mesh_io.h b/lib/io/mesh_io.h index 372fd98..40998c8 100644 --- a/lib/io/mesh_io.h +++ b/lib/io/mesh_io.h @@ -125,9 +125,8 @@ namespace gctl array str_tag; // 字符串类型的标签(默认为一个,即为数据的名称) array real_tag; // 实数类型的标签(默认为一个,等于0.0) array int_tag; // 整数类型的标签(最少三个,最后一个为数据的长度) - array vert_ptrs; // 两者只能存在一个 - array elem_ptrs; // 两者只能存在一个 - array val; // 数据值 + array tar_ptrs; // 数据连接的对象指针数组 具体类型为vertex3dc*或meshio_element* + array val; // 数据值(目前仅支持标量数据,后续再添加对矢量数据的支持) meshio_data();