This commit is contained in:
张壹 2025-02-16 20:02:31 +08:00
parent fb4ffd2acd
commit 91830b3fdd
4 changed files with 250 additions and 23 deletions

View File

@ -23,7 +23,7 @@ add_example(windowfunc_ex OFF)
add_example(legendre_ex OFF)
add_example(refellipsoid_ex OFF)
add_example(kde_ex OFF)
add_example(meshio_ex OFF)
add_example(meshio_ex ON)
add_example(autodiff_ex OFF)
add_example(multinary_ex OFF)
add_example(text_io_ex OFF)

View File

@ -33,23 +33,25 @@ using namespace gctl;
int main(int argc, char const *argv[]) try
{
mesh_io mshio;
mshio.read_gmsh_v2_ascii("tmp/example2");
mshio.read_gmsh_v2_ascii("tmp/test");
mshio.info();
/*
array<vertex2dc> nodes;
array<triangle2d> tris;
//array<vertex3dc*> orinode_ptrs;
//array<meshio_element*> oriele_ptrs;
mshio.select_elements("Survey");
array<vertex3dc> nodes;
array<triangle> tris;
mshio.select_elements("Bz (pT)", NodeData);
mshio.export_to(tris, nodes);
gmshio tmp_out;
tmp_out.init_file("tmp", Output);
tmp_out.set_packed(NotPacked, Output);
tmp_out.save_mesh(tris, nodes);
*/
meshio_data &d = mshio.get_data("Bz (pT)", NodeData);
array<double> dat = d.val;
mesh_io mshio2;
mshio2.import_from(tris, nodes);
mshio2.select_elements();
mshio2.add_data("Bz (pT)", dat, NodeData, OverWrite);
mshio2.save_gmsh_v2_ascii("tmp");
mshio2.info();
/*
mshio.read_tetgen_ascii("tmp/ex1.1");
mshio.edit_group(Disable, GeometryTag, 5);

View File

@ -567,6 +567,78 @@ void gctl::mesh_io::select_elements(std::string phys_name)
return;
}
void gctl::mesh_io::select_elements(std::string dat_name, mesh_data_type_e dtype)
{
if (!selected_nodes_.empty()) selected_nodes_.clear();
if (!selected_elems_.empty()) selected_elems_.clear();
if (!selected_groups_.empty()) selected_groups_.clear();
int d_id = if_saved_data(dat_name, dtype);
if (d_id == DEFAULT_INVALID_TAG) throw std::runtime_error("[gctl::mesh_io::select_elements] Data not found.");
if (dtype == ElemData)
{
int vnum;
meshio_element *e_ptr;
for (size_t i = 0; i < datas_[d_id].tar_ptrs.size(); i++)
{
e_ptr = reinterpret_cast<meshio_element*>(datas_[d_id].tar_ptrs[i]);
if (e_ptr->enabled)
{
selected_elems_.push_back(e_ptr);
vnum = elem_size(e_ptr->type);
for (size_t v = 0; v < vnum; v++)
{
selected_nodes_.push_back(e_ptr->vert_ptrs[v]);
}
}
}
std::vector<vertex3dc*>::iterator pos;
std::sort(selected_nodes_.begin(), selected_nodes_.end()); //排序
pos = std::unique(selected_nodes_.begin(), selected_nodes_.end()); //获取重复序列开始的位置
selected_nodes_.erase(pos, selected_nodes_.end()); //删除重复点
}
else // NodeData
{
vertex3dc *v_ptr;
std::unordered_set<vertex3dc*> nodes_set;
for (size_t i = 0; i < datas_[d_id].tar_ptrs.size(); i++)
{
v_ptr = reinterpret_cast<vertex3dc*>(datas_[d_id].tar_ptrs[i]);
if (v_ptr->id != DEFAULT_INVALID_TAG)
{
selected_nodes_.push_back(v_ptr);
nodes_set.insert(v_ptr);
}
}
int vnum;
bool skip_ele;
for (size_t i = 0; i < elems_.size(); i++)
{
if (elems_[i].enabled)
{
skip_ele = false;
vnum = elem_size(elems_[i].type);
for (size_t v = 0; v < vnum; v++)
{
if (nodes_set.count(elems_[i].vert_ptrs[v]) <= 0)
{
skip_ele = true;
break;
}
}
if (skip_ele) break;
else selected_elems_.push_back(elems_.get(i));
}
}
}
return;
}
size_t gctl::mesh_io::node_size()
{
return selected_nodes_.size();
@ -579,10 +651,14 @@ size_t gctl::mesh_io::element_size()
const gctl::array<int> &gctl::mesh_io::node_tags()
{
selected_node_tag_.resize(selected_nodes_.size());
for (size_t i = 0; i < selected_node_tag_.size(); i++)
selected_node_tag_.resize(selected_nodes_.size(), DEFAULT_INVALID_TAG);
if (!nodes_tag_.empty())
{
selected_node_tag_[i] = nodes_tag_[selected_nodes_[i]->id];
for (size_t i = 0; i < selected_node_tag_.size(); i++)
{
selected_node_tag_[i] = nodes_tag_[selected_nodes_[i]->id];
}
}
return selected_node_tag_;
}

View File

@ -28,6 +28,8 @@
#ifndef _GCTL_MESH_IO_H
#define _GCTL_MESH_IO_H
#include <unordered_set>
// library's head files
#include "../core.h"
#include "../geometry.h"
@ -283,6 +285,14 @@ namespace gctl
*/
void select_elements(std::string phys_name);
/**
* @brief
*
* @param datname
* @param dtype
*/
void select_elements(std::string dat_name, mesh_data_type_e dtype);
/**
* @brief 使select_elements函数选择
*
@ -298,14 +308,14 @@ namespace gctl
size_t element_size();
/**
* @brief
* @brief -9999
*
* @return
*/
const array<int> &node_tags();
/**
* @brief
* @brief -9999
*
* @return
*/
@ -319,7 +329,7 @@ namespace gctl
void get_gmsh_physical_groups(std::vector<gmsh_physical_group> &g_groups);
/**
* @brief
* @brief
*
* @param tag_type
*/
@ -336,7 +346,7 @@ namespace gctl
int if_saved_data(std::string name, mesh_data_type_e type);
/**
* @brief
* @brief
*
* @param name
* @param type
@ -423,7 +433,7 @@ namespace gctl
void save_data_to_xyz(std::string filename, std::string dataname = "null", coordinate_system_e out_coor = Cartesian, double refr = GCTL_Earth_Radius, double refR = GCTL_Earth_Radius);
/**
* @brief
* @brief
*
* @tparam T
* @param elems
@ -433,7 +443,7 @@ namespace gctl
void export_to(array<T> &elems, array<vertex3dc> &nodes);
/**
* @brief
* @brief
*
* @tparam T
* @param elems
@ -447,6 +457,31 @@ namespace gctl
template <typename T>
void export_to(array<T> &elems, array<vertex2dc> &nodes, int x_id = 0, int y_id = 1);
/**
* @brief
*
* @tparam T
* @param elems
* @param nodes
*/
template <typename T>
void import_from(const array<T> &elems, const array<vertex3dc> &nodes);
/**
* @brief
*
* @tparam T
* @param elems
* @param nodes
* @param x_id x坐标到三维坐标系统的索引0
* @param y_id y坐标到三维坐标系统的索引1
*
* @note (x,y)(x,y,z){0,1}(x,y)(x,y,0)
* {1,0}(x,y)(y,x,0){0,2}(x,y)(x,0,z){1,2}(x,y)(0,y,z)
*/
template <typename T>
void import_from(const array<T> &elems, const array<vertex2dc> &nodes, int x_id = 0, int y_id = 1);
protected:
bool initialized_; // 类型是否已经初始化完成
@ -557,6 +592,120 @@ namespace gctl
node_map.clear();
return;
}
template <typename T>
void gctl::mesh_io::import_from(const array<T> &elems, const array<vertex3dc> &nodes)
{
reset(); // 重置网格数据
const std::type_info &tinfo = typeid(T);
element_type_enum oe_type = match_type(tinfo);
int vnum = elem_size(oe_type);
valid_node_size_ = nodes.size();
valid_elem_size_ = elems.size();
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;
}
elems_.resize(valid_elem_size_);
for (size_t i = 0; i < valid_elem_size_; i++)
{
elems_[i].id = i;
elems_[i].type = oe_type;
elems_[i].vert_ptrs.resize(vnum);
for (size_t v = 0; v < vnum; v++)
{
elems_[i].vert_ptrs[v] = nodes_.get(elems[i].vert[v]->id);
}
}
// 所有单元体都属于同一个组
valid_group_size_ = 1;
groups_.resize(1);
groups_[0].enabled = true;
groups_[0].type = oe_type;
groups_[0].phys_group = 0; // 默认组别为0
groups_[0].geom_group = 0; // 默认组别为0
groups_[0].part_group = 3;
for (size_t i = 0; i < elems_.size(); i++)
{
groups_[0].elem_ptrs.push_back(elems_.get(i));
}
groups_[0].enable_elements();
initialized_ = true;
return;
}
template <typename T>
void gctl::mesh_io::import_from(const array<T> &elems, const array<vertex2dc> &nodes, int x_id, int y_id)
{
reset(); // 重置网格数据
const std::type_info &tinfo = typeid(T);
element_type_enum oe_type = match_type(tinfo);
int vnum = elem_size(oe_type);
valid_node_size_ = nodes.size();
valid_elem_size_ = elems.size();
int xyz_ref[3];
nodes_.resize(valid_node_size_);
for (size_t i = 0; i < valid_node_size_; i++)
{
nodes_[i].id = i;
xyz_ref[0] = 0.0;
xyz_ref[1] = 0.0;
xyz_ref[2] = 0.0;
xyz_ref[x_id] = nodes[i].x;
xyz_ref[y_id] = nodes[i].y;
nodes_[i].x = xyz_ref[0];
nodes_[i].y = xyz_ref[1];
nodes_[i].z = xyz_ref[2];
}
elems_.resize(valid_elem_size_);
for (size_t i = 0; i < valid_elem_size_; i++)
{
elems_[i].id = i;
elems_[i].type = oe_type;
elems_[i].vert_ptrs.resize(vnum);
for (size_t v = 0; v < vnum; v++)
{
elems_[i].vert_ptrs[v] = nodes_.get(elems[i].vert[v]->id);
}
}
// 所有单元体都属于同一个组
valid_group_size_ = 1;
groups_.resize(1);
groups_[0].enabled = true;
groups_[0].type = oe_type;
groups_[0].phys_group = 0; // 默认组别为0
groups_[0].geom_group = 0; // 默认组别为0
groups_[0].part_group = 3;
for (size_t i = 0; i < elems_.size(); i++)
{
groups_[0].elem_ptrs.push_back(elems_.get(i));
}
groups_[0].enable_elements();
initialized_ = true;
return;
}
};
#endif // _GCTL_MESH_IO_H