update mesh_io

This commit is contained in:
张壹 2025-01-23 10:07:17 +08:00
parent 3a22285275
commit a927a93997
2 changed files with 68 additions and 63 deletions

View File

@ -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<vertex3dc*>(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<meshio_element*>(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<double> &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<double> &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<double> &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<double> &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<double> &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<double> &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<double> &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<double> &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<double> &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<double> &data
int d_id = if_saved_data(name, ElemData);
if (d_id != -1)
{
array<meshio_element*> more_elem_ptrs(e, nullptr);
array<void*> more_elem_ptrs(e, nullptr);
array<double> more_val(e, 0.0);
e = 0;
@ -1012,7 +1010,7 @@ void gctl::mesh_io::add_element_data(std::string name, const array<double> &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<double> &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<double> &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<meshio_element*> more_elem_ptrs(e, nullptr);
array<void*> more_elem_ptrs(e, nullptr);
array<double> 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<meshio_element*> more_elem_ptrs(e, nullptr);
array<void*> more_elem_ptrs(e, nullptr);
array<double> 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<vertex3dc*>(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<vertex3dc*>(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<meshio_element*>(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<meshio_element*>(datas_[i].tar_ptrs[a])->id;
d_ok = reinterpret_cast<meshio_element*>(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<vertex3dc*>(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<vertex3dc*>(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<meshio_element*>(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<meshio_element*>(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<vertex3dc*>(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<meshio_element*>(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;

View File

@ -125,9 +125,8 @@ namespace gctl
array<std::string> str_tag; // 字符串类型的标签(默认为一个,即为数据的名称)
array<double> real_tag; // 实数类型的标签默认为一个等于0.0
array<int> int_tag; // 整数类型的标签(最少三个,最后一个为数据的长度)
array<vertex3dc*> vert_ptrs; // 两者只能存在一个
array<meshio_element*> elem_ptrs; // 两者只能存在一个
array<double> val; // 数据值
array<void*> tar_ptrs; // 数据连接的对象指针数组 具体类型为vertex3dc*或meshio_element*
array<double> val; // 数据值(目前仅支持标量数据,后续再添加对矢量数据的支持)
meshio_data();