update mesh_io
This commit is contained in:
parent
91830b3fdd
commit
6c7ec61fca
@ -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();
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user