tmp update
This commit is contained in:
parent
4aaea1cf33
commit
e29b31efa1
@ -23,7 +23,7 @@ add_example(windowfunc_ex OFF)
|
|||||||
add_example(legendre_ex OFF)
|
add_example(legendre_ex OFF)
|
||||||
add_example(refellipsoid_ex OFF)
|
add_example(refellipsoid_ex OFF)
|
||||||
add_example(kde_ex OFF)
|
add_example(kde_ex OFF)
|
||||||
add_example(meshio_ex OFF)
|
add_example(meshio_ex ON)
|
||||||
add_example(autodiff_ex OFF)
|
add_example(autodiff_ex OFF)
|
||||||
add_example(multinary_ex OFF)
|
add_example(multinary_ex OFF)
|
||||||
add_example(text_io_ex OFF)
|
add_example(text_io_ex OFF)
|
||||||
|
@ -34,27 +34,34 @@ int main(int argc, char const *argv[]) try
|
|||||||
{
|
{
|
||||||
mesh_io mshio;
|
mesh_io mshio;
|
||||||
|
|
||||||
//mshio.read_tetgen_ascii("tmp/ex1.1");
|
|
||||||
//mshio.edit_group(Disable, GeometryTag, 5);
|
|
||||||
//mshio.edit_group(GeometryTag, 1, PhysicalTag, 1);
|
|
||||||
//mshio.edit_group(GeometryTag, 2, PhysicalTag, 2);
|
|
||||||
//mshio.edit_group(GeometryTag, 3, PhysicalTag, 3);
|
|
||||||
//mshio.edit_group(GeometryTag, 4, PhysicalTag, 4);
|
|
||||||
//mshio.edit_group(GeometryTag, 1, "Boundary");
|
|
||||||
//mshio.edit_group(GeometryTag, 2, "Body1");
|
|
||||||
//mshio.edit_group(GeometryTag, 3, "Body2");
|
|
||||||
//mshio.edit_group(GeometryTag, 4, "Body3");
|
|
||||||
//mshio.save_gmsh_v2_ascii("tmp/ex1.1");
|
|
||||||
/*
|
/*
|
||||||
|
mshio.read_tetgen_ascii("tmp/ex1.1");
|
||||||
|
mshio.edit_group(Disable, GeometryTag, 5);
|
||||||
|
mshio.edit_group(GeometryTag, 1, PhysicalTag, 1);
|
||||||
|
mshio.edit_group(GeometryTag, 2, PhysicalTag, 2);
|
||||||
|
mshio.edit_group(GeometryTag, 3, PhysicalTag, 3);
|
||||||
|
mshio.edit_group(GeometryTag, 4, PhysicalTag, 4);
|
||||||
|
mshio.edit_group(GeometryTag, 1, "Boundary");
|
||||||
|
mshio.edit_group(GeometryTag, 2, "Body1");
|
||||||
|
mshio.edit_group(GeometryTag, 3, "Body2");
|
||||||
|
mshio.edit_group(GeometryTag, 4, "Body3");
|
||||||
|
mshio.save_gmsh_v2_ascii("tmp/ex1.1");
|
||||||
|
*/
|
||||||
|
|
||||||
mshio.read_gmsh_v2_ascii("tmp/ex1.1");
|
mshio.read_gmsh_v2_ascii("tmp/ex1.1");
|
||||||
mshio.convert_tags_to_data(GeometryTag);
|
mshio.convert_tags_to_data(GeometryTag);
|
||||||
|
|
||||||
array<double> body_val(mshio.element_size("Body2"), 2.0);
|
array<double> body_val(mshio.element_size("Body2"), 2.0);
|
||||||
mshio.create_data(body_val, "BodyValue", "Body2");
|
mshio.add_element_data(body_val, "BodyValue", "Body2");
|
||||||
|
|
||||||
|
array<double> body_val2(mshio.element_size("Body3"), 1.0);
|
||||||
|
mshio.add_element_data(body_val2, "BodyValue", "Body3");
|
||||||
|
|
||||||
mshio.save_gmsh_v2_ascii("tmp/ex1.2");
|
mshio.save_gmsh_v2_ascii("tmp/ex1.2");
|
||||||
//mshio.save_vtk_legacy_ascii("tmp/ex1.1");
|
//mshio.save_vtk_legacy_ascii("tmp/ex1.1");
|
||||||
mshio.info();
|
mshio.info();
|
||||||
|
|
||||||
array<vertex3dc> nodes = mshio.get_nodes();
|
const array<vertex3dc> &nodes = mshio.get_nodes();
|
||||||
|
|
||||||
array<tetrahedron> body2_tets;
|
array<tetrahedron> body2_tets;
|
||||||
mshio.export_elements_to(body2_tets, "All");
|
mshio.export_elements_to(body2_tets, "All");
|
||||||
@ -63,8 +70,7 @@ int main(int argc, char const *argv[]) try
|
|||||||
gio.init_file("tmp.msh", Output);
|
gio.init_file("tmp.msh", Output);
|
||||||
gio.set_packed(NotPacked, Output);
|
gio.set_packed(NotPacked, Output);
|
||||||
gio.save_mesh(body2_tets, nodes);
|
gio.save_mesh(body2_tets, nodes);
|
||||||
*/
|
/*
|
||||||
|
|
||||||
mshio.read_gmsh_v2_ascii("tmp/wjb.1");
|
mshio.read_gmsh_v2_ascii("tmp/wjb.1");
|
||||||
mshio.edit_group(Disable);
|
mshio.edit_group(Disable);
|
||||||
mshio.edit_group(Enable, GeometryTag, 3);
|
mshio.edit_group(Enable, GeometryTag, 3);
|
||||||
@ -72,6 +78,7 @@ int main(int argc, char const *argv[]) try
|
|||||||
mshio.edit_group(Enable, GeometryTag, 9);
|
mshio.edit_group(Enable, GeometryTag, 9);
|
||||||
|
|
||||||
mshio.save_gmsh_v2_ascii("tmp/wjb.2");
|
mshio.save_gmsh_v2_ascii("tmp/wjb.2");
|
||||||
|
*/
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
catch(std::exception &e)
|
catch(std::exception &e)
|
||||||
|
@ -564,13 +564,12 @@ void gctl::mesh_io::convert_tags_to_data(element_tag_enum tag_type)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int t = 0;
|
|
||||||
tmp_data.enabled = true;
|
tmp_data.enabled = true;
|
||||||
tmp_data.d_type = ElemData;
|
tmp_data.d_type = ElemData;
|
||||||
|
|
||||||
if (tag_type == PhysicalTag) {tmp_data.str_tag.resize(1, "Physical Tag"); t = 0;}
|
if (tag_type == PhysicalTag) tmp_data.str_tag.resize(1, "Physical Tag");
|
||||||
else if (tag_type == GeometryTag) {tmp_data.str_tag.resize(1, "Geometry Tag"); t = 1;}
|
else if (tag_type == GeometryTag) tmp_data.str_tag.resize(1, "Geometry Tag");
|
||||||
else if (tag_type == PartitionTag) {tmp_data.str_tag.resize(1, "Partition Tag"); t = 2;}
|
else if (tag_type == PartitionTag) tmp_data.str_tag.resize(1, "Partition Tag");
|
||||||
|
|
||||||
tmp_data.real_tag.resize(1, 0.0);
|
tmp_data.real_tag.resize(1, 0.0);
|
||||||
tmp_data.int_tag.resize(3, 0);
|
tmp_data.int_tag.resize(3, 0);
|
||||||
@ -686,7 +685,7 @@ void gctl::mesh_io::export_elements_to(array<tetrahedron> &tets, std::string phy
|
|||||||
tets.resize(s);
|
tets.resize(s);
|
||||||
|
|
||||||
s = 0;
|
s = 0;
|
||||||
for (size_t i = 0; i < elems_.size(); i++)
|
for (size_t i = 0; i < groups_.size(); i++)
|
||||||
{
|
{
|
||||||
if (groups_[i].enabled && groups_[i].type == _4NodeTetrahedron &&
|
if (groups_[i].enabled && groups_[i].type == _4NodeTetrahedron &&
|
||||||
(groups_[i].name == phys_name || phys_name == "All"))
|
(groups_[i].name == phys_name || phys_name == "All"))
|
||||||
@ -722,7 +721,7 @@ void gctl::mesh_io::export_elements_to(array<tetrahedron> &tets, element_tag_enu
|
|||||||
tets.resize(s);
|
tets.resize(s);
|
||||||
|
|
||||||
s = 0;
|
s = 0;
|
||||||
for (size_t i = 0; i < elems_.size(); i++)
|
for (size_t i = 0; i < groups_.size(); i++)
|
||||||
{
|
{
|
||||||
if (groups_[i].enabled && groups_[i].type == _4NodeTetrahedron &&
|
if (groups_[i].enabled && groups_[i].type == _4NodeTetrahedron &&
|
||||||
(tag_type == PhysicalTag && groups_[i].phys_group == tag) ||
|
(tag_type == PhysicalTag && groups_[i].phys_group == tag) ||
|
||||||
@ -743,35 +742,101 @@ void gctl::mesh_io::export_elements_to(array<tetrahedron> &tets, element_tag_enu
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void gctl::mesh_io::create_node_data(const array<double> &data, std::string name)
|
int gctl::mesh_io::if_saved_data(std::string name)
|
||||||
{
|
{
|
||||||
|
for (size_t i = 0; i < datas_.size(); i++)
|
||||||
|
{
|
||||||
|
if (datas_[i].str_tag.front() == name) return i;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void gctl::mesh_io::add_node_data(const array<double> &data, std::string name)
|
||||||
|
{
|
||||||
|
size_t s = nodes_.size();
|
||||||
|
if (data.size()!= s) throw std::runtime_error("[gctl::mesh_io::create_node_data] Incompatible data size.");
|
||||||
|
|
||||||
|
int d_id = if_saved_data(name);
|
||||||
|
if (d_id != -1)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < s; i++)
|
||||||
|
{
|
||||||
|
datas_[d_id].val[i] = data[i];
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
mesh_data new_data;
|
mesh_data new_data;
|
||||||
new_data.enabled = true;
|
new_data.enabled = true;
|
||||||
new_data.d_type = NodeData;
|
new_data.d_type = NodeData;
|
||||||
new_data.str_tag.resize(1, name);
|
new_data.str_tag.resize(1, name);
|
||||||
|
new_data.real_tag.resize(1, 0.0);
|
||||||
new_data.int_tag.resize(3, 0);
|
new_data.int_tag.resize(3, 0);
|
||||||
new_data.int_tag[1] = 1;
|
new_data.int_tag[1] = 1;
|
||||||
|
new_data.int_tag[2] = s;
|
||||||
|
new_data.vert_ptrs.resize(s, nullptr);
|
||||||
|
new_data.val.resize(s);
|
||||||
|
|
||||||
size_t c = 0;
|
for (size_t i = 0; i < s; i++)
|
||||||
for (size_t i = 0; i < nodes_.size(); i++)
|
|
||||||
{
|
{
|
||||||
if (nodes_[i].id != DEFAULT_INVALID_TAG) c++;
|
new_data.vert_ptrs[i] = nodes_.get(i);
|
||||||
|
new_data.val[i] = data[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data.size() != c) throw std::runtime_error("[gctl::mesh_io::create_node_data] Incompatible data size.");
|
datas_.push_back(new_data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
new_data.int_tag[2] = c;
|
void gctl::mesh_io::add_node_data(const array<double> &data, const array<bool> &boolen, std::string name)
|
||||||
new_data.vert_ptrs.resize(c, nullptr);
|
{
|
||||||
new_data.val.resize(c);
|
size_t s = nodes_.size();
|
||||||
|
if (data.size()!= s || boolen.size() != s) throw std::runtime_error("[gctl::mesh_io::create_node_data] Incompatible data size.");
|
||||||
|
|
||||||
c = 0;
|
s = 0;
|
||||||
for (size_t i = 0; i < nodes_.size(); i++)
|
for (size_t i = 0; i < nodes_.size(); i++)
|
||||||
{
|
{
|
||||||
if (nodes_[i].id != DEFAULT_INVALID_TAG)
|
if (boolen[i]) s++;
|
||||||
|
}
|
||||||
|
|
||||||
|
int d_id = if_saved_data(name);
|
||||||
|
if (d_id != -1)
|
||||||
|
{
|
||||||
|
datas_[d_id].val.resize(s);
|
||||||
|
datas_[d_id].vert_ptrs.resize(s, nullptr);
|
||||||
|
datas_[d_id].int_tag[2] = s;
|
||||||
|
|
||||||
|
s = 0;
|
||||||
|
for (size_t i = 0; i < nodes_.size(); i++)
|
||||||
{
|
{
|
||||||
new_data.vert_ptrs[c] = nodes_.get(i);
|
if (boolen[i])
|
||||||
new_data.val[c] = data[c];
|
{
|
||||||
c++;
|
datas_[d_id].vert_ptrs[s] = nodes_.get(i);
|
||||||
|
datas_[d_id].val[s] = data[i];
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mesh_data new_data;
|
||||||
|
new_data.enabled = true;
|
||||||
|
new_data.d_type = NodeData;
|
||||||
|
new_data.str_tag.resize(1, name);
|
||||||
|
new_data.real_tag.resize(1, 0.0);
|
||||||
|
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.val.resize(s);
|
||||||
|
|
||||||
|
s = 0;
|
||||||
|
for (size_t i = 0; i < nodes_.size(); i++)
|
||||||
|
{
|
||||||
|
if (boolen[i])
|
||||||
|
{
|
||||||
|
new_data.vert_ptrs[s] = nodes_.get(i);
|
||||||
|
new_data.val[s] = data[i];
|
||||||
|
s++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -779,12 +844,13 @@ void gctl::mesh_io::create_node_data(const array<double> &data, std::string name
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void gctl::mesh_io::create_element_data(const array<double> &data, std::string name, element_type_enum e_type)
|
void gctl::mesh_io::add_element_data(const array<double> &data, std::string name, element_type_enum e_type)
|
||||||
{
|
{
|
||||||
mesh_data new_data;
|
mesh_data new_data;
|
||||||
new_data.enabled = true;
|
new_data.enabled = true;
|
||||||
new_data.d_type = ElemData;
|
new_data.d_type = ElemData;
|
||||||
new_data.str_tag.resize(1, name);
|
new_data.str_tag.resize(1, name);
|
||||||
|
new_data.real_tag.resize(1, 0.0);
|
||||||
new_data.int_tag.resize(3, 0);
|
new_data.int_tag.resize(3, 0);
|
||||||
new_data.int_tag[1] = 1;
|
new_data.int_tag[1] = 1;
|
||||||
|
|
||||||
@ -818,12 +884,13 @@ void gctl::mesh_io::create_element_data(const array<double> &data, std::string n
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void gctl::mesh_io::create_element_data(const array<double> &data, std::string name, element_tag_enum tag_type, int tag)
|
void gctl::mesh_io::add_element_data(const array<double> &data, std::string name, element_tag_enum tag_type, int tag)
|
||||||
{
|
{
|
||||||
mesh_data new_data;
|
mesh_data new_data;
|
||||||
new_data.enabled = true;
|
new_data.enabled = true;
|
||||||
new_data.d_type = ElemData;
|
new_data.d_type = ElemData;
|
||||||
new_data.str_tag.resize(1, name);
|
new_data.str_tag.resize(1, name);
|
||||||
|
new_data.real_tag.resize(1, 0.0);
|
||||||
new_data.int_tag.resize(3, 0);
|
new_data.int_tag.resize(3, 0);
|
||||||
new_data.int_tag[1] = 1;
|
new_data.int_tag[1] = 1;
|
||||||
|
|
||||||
@ -866,15 +933,8 @@ void gctl::mesh_io::create_element_data(const array<double> &data, std::string n
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void gctl::mesh_io::create_element_data(const array<double> &data, std::string name, std::string phys_name)
|
void gctl::mesh_io::add_element_data(const array<double> &data, std::string name, std::string phys_name)
|
||||||
{
|
{
|
||||||
mesh_data new_data;
|
|
||||||
new_data.enabled = true;
|
|
||||||
new_data.d_type = ElemData;
|
|
||||||
new_data.str_tag.resize(1, name);
|
|
||||||
new_data.int_tag.resize(3, 0);
|
|
||||||
new_data.int_tag[1] = 1;
|
|
||||||
|
|
||||||
size_t e = 0;
|
size_t e = 0;
|
||||||
for (size_t i = 0; i < groups_.size(); i++)
|
for (size_t i = 0; i < groups_.size(); i++)
|
||||||
{
|
{
|
||||||
@ -886,11 +946,44 @@ void gctl::mesh_io::create_element_data(const array<double> &data, std::string n
|
|||||||
|
|
||||||
if (data.size() != e) throw std::runtime_error("[gctl::mesh_io::create_element_data] Incompatible data size.");
|
if (data.size() != e) throw std::runtime_error("[gctl::mesh_io::create_element_data] Incompatible data size.");
|
||||||
|
|
||||||
|
int d_id = if_saved_data(name);
|
||||||
|
if (d_id != -1)
|
||||||
|
{
|
||||||
|
array<mesh_element*> more_elem_ptrs(e, nullptr);
|
||||||
|
array<double> more_val(e, 0.0);
|
||||||
|
|
||||||
|
e = 0;
|
||||||
|
for (size_t i = 0; i < groups_.size(); i++)
|
||||||
|
{
|
||||||
|
if (groups_[i].enabled && groups_[i].name == phys_name)
|
||||||
|
{
|
||||||
|
for (size_t j = 0; j < groups_[i].elem_ptrs.size(); j++)
|
||||||
|
{
|
||||||
|
more_elem_ptrs[e] = groups_[i].elem_ptrs[j];
|
||||||
|
more_val[e] = data[e];
|
||||||
|
e++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
datas_[d_id].int_tag[2] += e;
|
||||||
|
datas_[d_id].elem_ptrs.concat(more_elem_ptrs);
|
||||||
|
datas_[d_id].val.concat(more_val);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mesh_data new_data;
|
||||||
|
new_data.enabled = true;
|
||||||
|
new_data.d_type = ElemData;
|
||||||
|
new_data.str_tag.resize(1, name);
|
||||||
|
new_data.real_tag.resize(1, 0.0);
|
||||||
|
new_data.int_tag.resize(3, 0);
|
||||||
|
new_data.int_tag[1] = 1;
|
||||||
new_data.int_tag[2] = e;
|
new_data.int_tag[2] = e;
|
||||||
new_data.elem_ptrs.resize(e, nullptr);
|
new_data.elem_ptrs.resize(e, nullptr);
|
||||||
new_data.val.resize(e, 0.0);
|
new_data.val.resize(e, 0.0);
|
||||||
|
|
||||||
e = 0;
|
e = 0;
|
||||||
for (size_t i = 0; i < groups_.size(); i++)
|
for (size_t i = 0; i < groups_.size(); i++)
|
||||||
{
|
{
|
||||||
if (groups_[i].enabled && groups_[i].name == phys_name)
|
if (groups_[i].enabled && groups_[i].name == phys_name)
|
||||||
@ -1268,28 +1361,12 @@ void gctl::mesh_io::read_gmsh_v2_ascii(std::string filename, index_packed_e is_p
|
|||||||
elems_[i].type = elem_gmsh_type(type_code);
|
elems_[i].type = elem_gmsh_type(type_code);
|
||||||
elems_[i].vert_ptrs.resize(elem_size(elems_[i].type));
|
elems_[i].vert_ptrs.resize(elem_size(elems_[i].type));
|
||||||
|
|
||||||
if (attri_num >= 3) // default tags will be assgined to DEFAULT_INVALID_TAG
|
// we get at least three tags. see below for tag types
|
||||||
|
// default tags will be assgined to DEFAULT_INVALID_TAG
|
||||||
|
int_tag[i].resize(GCTL_MAX(3, attri_num), DEFAULT_INVALID_TAG);
|
||||||
|
for (size_t a = 0; a < attri_num; a++)
|
||||||
{
|
{
|
||||||
int_tag[i].resize(attri_num);
|
tmp_ss >> int_tag[i][a];
|
||||||
for (size_t a = 0; a < attri_num; a++)
|
|
||||||
{
|
|
||||||
tmp_ss >> int_tag[i][a];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (attri_num == 2)
|
|
||||||
{
|
|
||||||
int_tag[i].resize(3, DEFAULT_INVALID_TAG);
|
|
||||||
tmp_ss >> int_tag[i][0];
|
|
||||||
tmp_ss >> int_tag[i][1];
|
|
||||||
}
|
|
||||||
else if (attri_num == 1)
|
|
||||||
{
|
|
||||||
int_tag[i].resize(3, DEFAULT_INVALID_TAG);
|
|
||||||
tmp_ss >> int_tag[i][0];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int_tag[i].resize(3, DEFAULT_INVALID_TAG);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t v = 0; v < elems_[i].vert_ptrs.size(); v++)
|
for (size_t v = 0; v < elems_[i].vert_ptrs.size(); v++)
|
||||||
@ -1392,6 +1469,7 @@ void gctl::mesh_io::read_gmsh_v2_ascii(std::string filename, index_packed_e is_p
|
|||||||
tmp_group.elem_ptrs.push_back(elems_.get(0));
|
tmp_group.elem_ptrs.push_back(elems_.get(0));
|
||||||
groups_.push_back(tmp_group);
|
groups_.push_back(tmp_group);
|
||||||
|
|
||||||
|
// 元素类型与三个标记都一致的元素将被分到同一组
|
||||||
bool not_found;
|
bool not_found;
|
||||||
for (size_t i = 1; i < elems_.size(); i++)
|
for (size_t i = 1; i < elems_.size(); i++)
|
||||||
{
|
{
|
||||||
@ -1413,9 +1491,9 @@ void gctl::mesh_io::read_gmsh_v2_ascii(std::string filename, index_packed_e is_p
|
|||||||
{
|
{
|
||||||
tmp_group.elem_ptrs.clear();
|
tmp_group.elem_ptrs.clear();
|
||||||
tmp_group.type = elems_[i].type;
|
tmp_group.type = elems_[i].type;
|
||||||
tmp_group.phys_group = int_tag[i][0];
|
tmp_group.phys_group = int_tag[i][0]; // 物理组
|
||||||
tmp_group.geom_group = int_tag[i][1];
|
tmp_group.geom_group = int_tag[i][1]; // 几何组
|
||||||
tmp_group.part_group = int_tag[i][2];
|
tmp_group.part_group = int_tag[i][2]; // 剖分组(一般以元素的维度区分)
|
||||||
tmp_group.elem_ptrs.push_back(elems_.get(i));
|
tmp_group.elem_ptrs.push_back(elems_.get(i));
|
||||||
groups_.push_back(tmp_group);
|
groups_.push_back(tmp_group);
|
||||||
}
|
}
|
||||||
@ -1423,6 +1501,7 @@ void gctl::mesh_io::read_gmsh_v2_ascii(std::string filename, index_packed_e is_p
|
|||||||
|
|
||||||
if (!phys.empty())
|
if (!phys.empty())
|
||||||
{
|
{
|
||||||
|
// 遍历所有元素组 按物理组为标准为元素组命名 并以将元素维度赋值为剖分组
|
||||||
for (size_t g = 0; g < groups_.size(); g++)
|
for (size_t g = 0; g < groups_.size(); g++)
|
||||||
{
|
{
|
||||||
for (size_t p = 0; p < phys.size(); p++)
|
for (size_t p = 0; p < phys.size(); p++)
|
||||||
|
133
lib/io/mesh_io.h
133
lib/io/mesh_io.h
@ -93,10 +93,10 @@ namespace gctl
|
|||||||
*/
|
*/
|
||||||
enum element_tag_enum
|
enum element_tag_enum
|
||||||
{
|
{
|
||||||
PhysicalTag,
|
PhysicalTag, // 元素的物理分组标签
|
||||||
GeometryTag,
|
GeometryTag, // 元素的几何分组标签
|
||||||
PartitionTag,
|
PartitionTag, // 元素的剖分分组标签
|
||||||
NodeTag,
|
NodeTag, // 顶点的标签(仅用于输出顶点标签数据)
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -105,11 +105,11 @@ namespace gctl
|
|||||||
*/
|
*/
|
||||||
struct mesh_element
|
struct mesh_element
|
||||||
{
|
{
|
||||||
bool enabled;
|
bool enabled; // 单元体是否有效
|
||||||
int id;
|
int id; // 单元体编号
|
||||||
element_type_enum type;
|
element_type_enum type; // 单元体类型
|
||||||
array<vertex3dc*> vert_ptrs;
|
array<vertex3dc*> vert_ptrs; // 顶点指针数组
|
||||||
array<mesh_element*> neigh_ptrs;
|
array<mesh_element*> neigh_ptrs; // 相邻单元体指针数组
|
||||||
|
|
||||||
mesh_element();
|
mesh_element();
|
||||||
};
|
};
|
||||||
@ -120,14 +120,14 @@ namespace gctl
|
|||||||
*/
|
*/
|
||||||
struct mesh_data
|
struct mesh_data
|
||||||
{
|
{
|
||||||
bool enabled;
|
bool enabled; // 数据体是否有效
|
||||||
mesh_data_type_e d_type;
|
mesh_data_type_e d_type; // 数据类型
|
||||||
array<std::string> str_tag;
|
array<std::string> str_tag; // 字符串类型的标签(默认为一个,即为数据的名称)
|
||||||
array<double> real_tag;
|
array<double> real_tag; // 实数类型的标签(默认为一个,等于0.0)
|
||||||
array<int> int_tag;
|
array<int> int_tag; // 整数类型的标签(最少三个,最后一个为数据的长度)
|
||||||
array<vertex3dc*> vert_ptrs; // 两者只能存在一个
|
array<vertex3dc*> vert_ptrs; // 两者只能存在一个
|
||||||
array<mesh_element*> elem_ptrs; // 两者只能存在一个
|
array<mesh_element*> elem_ptrs; // 两者只能存在一个
|
||||||
array<double> val;
|
array<double> val; // 数据值
|
||||||
|
|
||||||
mesh_data();
|
mesh_data();
|
||||||
|
|
||||||
@ -150,13 +150,13 @@ namespace gctl
|
|||||||
*/
|
*/
|
||||||
struct mesh_element_group
|
struct mesh_element_group
|
||||||
{
|
{
|
||||||
bool enabled;
|
bool enabled; // 组是否有效
|
||||||
element_type_enum type;
|
element_type_enum type; // 组内单元体类型
|
||||||
int phys_group;
|
int phys_group; // 物理分组标签
|
||||||
int geom_group;
|
int geom_group; // 几何分组标签
|
||||||
int part_group;
|
int part_group; // 剖分分组标签
|
||||||
std::string name;
|
std::string name; // 组名
|
||||||
std::vector<mesh_element*> elem_ptrs;
|
std::vector<mesh_element*> elem_ptrs; // 组内单元体指针数组
|
||||||
|
|
||||||
mesh_element_group();
|
mesh_element_group();
|
||||||
|
|
||||||
@ -256,14 +256,14 @@ namespace gctl
|
|||||||
const array<int> &get_node_tag();
|
const array<int> &get_node_tag();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 返回顶点数组的引用。
|
* @brief 返回所有顶点数组的引用。
|
||||||
*
|
*
|
||||||
* @return 顶点数组的引用。
|
* @return 顶点数组的引用。
|
||||||
*/
|
*/
|
||||||
const array<vertex3dc> &get_nodes();
|
const array<vertex3dc> &get_nodes();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 返回单元体数组的引用。
|
* @brief 返回所有单元体数组的引用。
|
||||||
*
|
*
|
||||||
* @return 单元体数组的引用。
|
* @return 单元体数组的引用。
|
||||||
*/
|
*/
|
||||||
@ -336,40 +336,68 @@ namespace gctl
|
|||||||
void export_elements_to(array<tetrahedron> &tets, element_tag_enum tag_type, int tag);
|
void export_elements_to(array<tetrahedron> &tets, element_tag_enum tag_type, int tag);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 创建一个顶点数据对象。
|
* @brief 检查是否存在名为name的数据
|
||||||
*
|
*
|
||||||
* @param data 输入的数据数组。
|
* @param name 数据名称
|
||||||
* @param name 新建的数据名称。
|
*
|
||||||
|
* @return 存在则返回数据索引,不存在则返回-1。
|
||||||
*/
|
*/
|
||||||
void create_node_data(const array<double> &data, std::string name);
|
int if_saved_data(std::string name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 按单元体类型筛选创建一个单元体数据对象。
|
* @brief 添加一个顶点数据对象。数据将依次添加到所有顶点位置。
|
||||||
|
*
|
||||||
|
* @note 若对应名称的数据已经存在则会覆盖
|
||||||
|
*
|
||||||
|
* @param data 输入的数据数组,长度与网格所有顶点数据相同。
|
||||||
|
* @param name 新建的数据名称。
|
||||||
|
*/
|
||||||
|
void add_node_data(const array<double> &data, std::string name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 添加一个顶点数据对象。数据将依次添加到布尔为真的顶点位置。
|
||||||
|
*
|
||||||
|
* @note 若对应名称的数据已经存在则会覆盖
|
||||||
|
*
|
||||||
|
* @param data 输入的数据数组,长度与网格所有顶点数据相同。
|
||||||
|
* @param boolen 输入的布尔,只有为真元素位置的顶点数据将被保存。
|
||||||
|
* @param name 新建的数据名称。
|
||||||
|
*/
|
||||||
|
void add_node_data(const array<double> &data, const array<bool> &boolen, std::string name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 按单元体类型筛选创建一个单元体数据对象。数据将依次添加到所选元素位置。
|
||||||
|
*
|
||||||
|
* @note 若对应名称的数据已经存在则会覆盖
|
||||||
*
|
*
|
||||||
* @param data 输入的数据数组。
|
* @param data 输入的数据数组。
|
||||||
* @param name 新建数据名称。
|
* @param name 新建数据名称。
|
||||||
* @param e_type 新建数据的单元体类型(缺省值为NotSet,表示选择所有有效的单元体)。
|
* @param e_type 新建数据的单元体类型(缺省值为NotSet,表示选择所有有效的单元体)。
|
||||||
*/
|
*/
|
||||||
void create_element_data(const array<double> &data, std::string name, element_type_enum e_type = NotSet);
|
void add_element_data(const array<double> &data, std::string name, element_type_enum e_type = NotSet);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 按单元体标签值筛选创建一个单元体数据对象。
|
* @brief 按单元体标签值筛选创建一个单元体数据对象。
|
||||||
*
|
*
|
||||||
|
* @note 若对应名称的数据已经存在则会追加
|
||||||
|
*
|
||||||
* @param data 输入的数据数组。
|
* @param data 输入的数据数组。
|
||||||
* @param name 新建数据名称。
|
* @param name 新建数据名称。
|
||||||
* @param tag_type 标签类型。
|
* @param tag_type 标签类型。
|
||||||
* @param tag 标签值。
|
* @param tag 标签值。
|
||||||
*/
|
*/
|
||||||
void create_element_data(const array<double> &data, std::string name, element_tag_enum tag_type, int tag);
|
void add_element_data(const array<double> &data, std::string name, element_tag_enum tag_type, int tag);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 按单元体组的名称筛选创建一个单元体数据对象。
|
* @brief 按单元体组的名称筛选创建一个单元体数据对象。
|
||||||
*
|
*
|
||||||
|
* @note 若对应名称的数据已经存在则会追加
|
||||||
|
*
|
||||||
* @param data 输入的数据数组。
|
* @param data 输入的数据数组。
|
||||||
* @param name 新建数据名称。
|
* @param name 新建数据名称。
|
||||||
* @param phys_name 单元体组的名称。
|
* @param phys_name 单元体组的名称。
|
||||||
*/
|
*/
|
||||||
void create_element_data(const array<double> &data, std::string name, std::string phys_name);
|
void add_element_data(const array<double> &data, std::string name, std::string phys_name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 读入triangle软件输出的网格剖分文件。
|
* @brief 读入triangle软件输出的网格剖分文件。
|
||||||
@ -422,30 +450,31 @@ 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);
|
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);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool initialized_;
|
bool initialized_; // 类型是否已经初始化完成
|
||||||
|
|
||||||
|
// 有效的顶点、单元体和单元体组的数量
|
||||||
size_t valid_node_size_, valid_elem_size_, valid_group_size_;
|
size_t valid_node_size_, valid_elem_size_, valid_group_size_;
|
||||||
array<vertex3dc> nodes_;
|
array<vertex3dc> nodes_; // 网格顶点 当顶点索引为无效值时将不会被输出
|
||||||
array<mesh_element> elems_;
|
array<mesh_element> elems_; // 网格元素
|
||||||
std::vector<mesh_data> datas_;
|
std::vector<mesh_data> datas_; // 网格数据
|
||||||
std::vector<mesh_element_group> groups_;
|
std::vector<mesh_element_group> groups_; // 网格单元体组
|
||||||
array<int> nodes_tag_;
|
array<int> nodes_tag_; // 顶点标签
|
||||||
|
|
||||||
element_type_enum elem_gmshcode2type_[94];
|
element_type_enum elem_gmshcode2type_[94]; // gmsh的单元体类型数组 数组索引为gmsh的单元体类型码值
|
||||||
element_type_enum elem_vtkcode2type_[14];
|
element_type_enum elem_vtkcode2type_[14]; // vtk的单元体类型数组 数组索引为vtk的单元体类型码值
|
||||||
std::map<element_type_enum, int> elem_type2gmshcode_;
|
std::map<element_type_enum, int> elem_type2gmshcode_; // 单元体类型到gmsh类型码值的映射
|
||||||
std::map<element_type_enum, int> elem_type2vtkcode_;
|
std::map<element_type_enum, int> elem_type2vtkcode_; // 单元体类型到vtk类型码值的映射
|
||||||
std::map<element_type_enum, int> elem_type2size_;
|
std::map<element_type_enum, int> elem_type2size_; // 单元体类型到单元体顶点数量的映射
|
||||||
std::map<element_type_enum, std::string> elem_type2name_;
|
std::map<element_type_enum, std::string> elem_type2name_; // 单元体类型到单元体名称的映射
|
||||||
|
|
||||||
std::string elem_name(element_type_enum e_type);
|
std::string elem_name(element_type_enum e_type); // 获取单元体名称字符串
|
||||||
int elem_gmsh_code(element_type_enum e_type);
|
int elem_gmsh_code(element_type_enum e_type); // 获取单元体gmsh类型码值
|
||||||
int elem_vtk_code(element_type_enum e_type);
|
int elem_vtk_code(element_type_enum e_type); // 获取单元体vtk类型码值
|
||||||
int elem_size(element_type_enum e_type);
|
int elem_size(element_type_enum e_type); // 获取单元体顶点数量
|
||||||
element_type_enum elem_gmsh_type(int code);
|
element_type_enum elem_gmsh_type(int code); // 获取对应gmsh类型码的单元体类型
|
||||||
element_type_enum elem_vtk_type(int code);
|
element_type_enum elem_vtk_type(int code); // 获取对应vtk类型码的单元体类型
|
||||||
void update_indexing();
|
void update_indexing(); // 更新索引(对网格的元素进行操作后需调用)
|
||||||
void sort_groups();
|
void sort_groups(); // 对单元体组进行梳理(对网格的元素进行操作后需调用)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user