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;
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<double> dat = d.val;
//meshio_data &d = mshio.get_data("Bz (pT)", NodeData);
//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;
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();

View File

@ -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<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);
@ -663,7 +663,7 @@ const gctl::array<int> &gctl::mesh_io::node_tags()
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());
@ -813,6 +813,49 @@ gctl::meshio_data *gctl::mesh_io::get_data_ptr(std::string name, mesh_data_type_
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,
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> 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> 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;

View File

@ -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<int> &node_tags();
const array<int> &selected_node_tags();
/**
* @brief -9999
*
* @return
*/
const array<int> &element_tags(element_tag_enum tag_type);
const array<int> &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<double> get_selected_data(std::string name, mesh_data_type_e type);
/**
* @brief
*
@ -440,7 +450,7 @@ namespace gctl
* @param nodes
*/
template <typename T>
void export_to(array<T> &elems, array<vertex3dc> &nodes);
void export_selected_to(array<T> &elems, array<vertex3dc> &nodes);
/**
* @brief
@ -455,7 +465,7 @@ namespace gctl
* {1,0}yox平面{0,2}xoz平面{1,2}yoz平面
*/
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
@ -518,7 +528,7 @@ namespace gctl
};
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);
element_type_enum oe_type = match_type(tinfo);
@ -554,7 +564,7 @@ namespace gctl
}
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);
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;
}
};