/********************************************************
* ██████╗ ██████╗████████╗██╗
* ██╔════╝ ██╔════╝╚══██╔══╝██║
* ██║ ███╗██║ ██║ ██║
* ██║ ██║██║ ██║ ██║
* ╚██████╔╝╚██████╗ ██║ ███████╗
* ╚═════╝ ╚═════╝ ╚═╝ ╚══════╝
* Geophysical Computational Tools & Library (GCTL)
*
* Copyright (c) 2023 Yi Zhang (yizhang-geo@zju.edu.cn)
*
* GCTL is distributed under a dual licensing scheme. You can redistribute
* it and/or modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation, either version 2
* of the License, or (at your option) any later version. You should have
* received a copy of the GNU Lesser General Public License along with this
* program. If not, see .
*
* If the terms and conditions of the LGPL v.2. would prevent you from using
* the GCTL, please consider the option to obtain a commercial license for a
* fee. These licenses are offered by the GCTL's original author. As a rule,
* licenses are provided "as-is", unlimited in time for a one time fee. Please
* send corresponding requests to: yizhang-geo@zju.edu.cn. Please do not forget
* to include some description of your company and the realm of its activities.
* Also add information on how to contact you by electronic and paper mail.
******************************************************/
#include "mesh.h"
gctl::base_mesh::base_mesh()
{
initialized = false;
//std::clog << "A new mesh object is created." << std::endl;
}
gctl::base_mesh::~base_mesh()
{
clear();
//std::clog << "A mesh object is destroyed." << std::endl;
}
void gctl::base_mesh::clear()
{
meshdata *data_ptr;
if (!saved_data.empty())
{
for (iter = saved_data.begin(); iter != saved_data.end(); ++iter)
{
data_ptr = *iter;
meshdata::destroy(data_ptr);
}
saved_data.clear();
}
initialized = false;
return;
}
bool gctl::base_mesh::initiated() const
{
return initialized;
}
bool gctl::base_mesh::saved(std::string datname) const
{
if (saved_data.empty())
{
return false;
}
else
{
meshdata *data_ptr = nullptr;
// 这里我们需要使用常量迭代器
std::list::const_iterator c_iter;
for (c_iter = saved_data.begin(); c_iter != saved_data.end(); ++c_iter)
{
data_ptr = *c_iter;
if (data_ptr->get_datname() == datname)
{
return true;
}
}
return false;
}
}
gctl::meshdata *gctl::base_mesh::get_data(std::string datname) const
{
if (saved_data.empty())
{
throw std::runtime_error("[gctl::base_mesh] No data saved.");
}
meshdata *curr_data = nullptr;
std::list::const_iterator c_iter;
for (c_iter = saved_data.begin(); c_iter != saved_data.end(); ++c_iter)
{
curr_data = *c_iter;
if (curr_data->get_datname() == datname)
{
return curr_data;
}
}
throw gctl::runtime_error("[gctl::base_mesh] No data found by the name: " + datname);
}
void gctl::base_mesh::get_all_data(array& out_list) const
{
if (saved_data.empty())
{
throw runtime_error("[gctl::base_mesh] No data saved.");
}
int c_count = 0;
out_list.resize(saved_data.size());
meshdata *curr_data = nullptr;
std::list::const_iterator c_iter;
for (c_iter = saved_data.begin(); c_iter != saved_data.end(); ++c_iter)
{
curr_data = *c_iter;
out_list[c_count] = curr_data;
c_count++;
}
return;
}
void *gctl::base_mesh::get_datval(std::string datname) const
{
meshdata *curr_data = get_data(datname);
return curr_data->get_datval_ptr();
}
void gctl::base_mesh::remove_data(std::string datname)
{
if (saved_data.empty())
{
throw runtime_error("[gctl::base_mesh] No data saved.");
}
meshdata *curr_data;
for (iter = saved_data.begin(); iter != saved_data.end(); ++iter)
{
curr_data = *iter;
if (curr_data->get_datname() == datname)
{
meshdata::destroy(curr_data);
iter = saved_data.erase(iter);
//std::clog << "Meshdata: " << datname << " is destroyed." << std::endl;
break;
}
}
return;
}
void gctl::base_mesh::show_info(std::ostream &os) const
{
if (meshtype == REGULAR_MESH) os << "Mesh: Regular | ";
if (meshtype == LINEAR_MESH) os << "Mesh: Linear | ";
if (meshtype == TRI_TET_MESH) os << "Mesh: Unstructured | ";
if (meshtype == REGULAR_MESH_SPH) os << "Mesh: Regular (spherical) | ";
if (meshtype == LINEAR_MESH_SPH) os << "Mesh: Linear (spherical) | ";
if (meshtype == TRI_TET_MESH_SPH) os << "Mesh: Unstructured (spherical) | ";
if (meshtype == REGULAR_GRID) os << "Mesh: Grid | ";
if (meshdim == MESH_2D) os << "2D" << std::endl;
else if (meshdim == MESH_3D) os << "3D" << std::endl;
os << "Name: " << meshname << std::endl;
os << "Info: " << meshinfo << std::endl;
show_mesh_dimension(os);
meshdata *curr_data;
std::list::const_iterator c_iter;
for (c_iter = saved_data.begin(); c_iter != saved_data.end(); ++c_iter)
{
curr_data = *c_iter;
curr_data->show_info();
}
return;
}
void gctl::base_mesh::rename_data(std::string oldname, std::string newname)
{
meshdata *curr_data = get_data(oldname);
curr_data->set_datname(newname);
return;
}
gctl::mesh_type_e gctl::base_mesh::get_meshtype() const
{
if (!initialized)
{
throw std::runtime_error("[gctl::base_mesh] Mesh not initialized.");
}
return meshtype;
}
gctl::mesh_dim_e gctl::base_mesh::get_meshdim() const
{
if (!initialized)
{
throw std::runtime_error("[gctl::base_mesh] Mesh not initialized.");
}
return meshdim;
}
int gctl::base_mesh::get_nodenum() const
{
if (!initialized)
{
throw std::runtime_error("[gctl::base_mesh] Mesh not initialized.");
}
return node_num;
}
int gctl::base_mesh::get_elenum() const
{
if (!initialized)
{
throw std::runtime_error("[gctl::base_mesh] Mesh not initialized.");
}
return ele_num;
}
int gctl::base_mesh::get_datanum() const
{
if (!initialized)
{
throw std::runtime_error("[gctl::base_mesh] Mesh not initialized.");
}
return saved_data.size();
}
std::string gctl::base_mesh::get_meshname() const
{
if (!initialized)
{
throw std::runtime_error("[gctl::base_mesh] Mesh not initialized.");
}
return meshname;
}
void gctl::base_mesh::set_meshname(std::string in_name)
{
if (!initialized)
{
throw std::runtime_error("[gctl::base_mesh] Mesh not initialized.");
}
if (in_name.empty())
{
throw std::runtime_error("[gctl::base_mesh] The input name is empty.");
}
meshname = in_name;
return;
}
std::string gctl::base_mesh::get_meshinfo() const
{
if (!initialized)
{
throw std::runtime_error("[gctl::base_mesh] Mesh not initialized.");
}
return meshinfo;
}
void gctl::base_mesh::set_meshinfo(std::string in_info)
{
if (!initialized)
{
throw std::runtime_error("[gctl::base_mesh] Mesh not initialized.");
}
if (in_info == "")
{
throw runtime_error("[gctl::base_mesh] The input info. is empty.");
}
meshinfo = in_info;
return;
}
gctl::meshdata *gctl::base_mesh::add_data(std::string in_name, mesh_data_type_e in_type, bool if_output, double init_val)
{
if (!initialized)
{
throw std::runtime_error("[gctl::base_mesh] Mesh not initialized.");
}
meshdata *data_ptr;
if(saved(in_name))
{
data_ptr = get_data(in_name);
if (data_ptr->get_valtype() != Scalar || data_ptr->get_dattype() != in_type)
{
throw gctl::runtime_error("[gctl::base_mesh] A data object is already created with a different data or value type by the name:" + in_name);
}
// 存在一个同名 同数据类型 同赋值类型的数据 则将其数据设置为初始值
array* val_ptr = (array*) data_ptr->get_datval_ptr();
val_ptr->assign_all(init_val);
return data_ptr;
}
if (in_type == NodeData)
{
data_ptr = meshdata_scalar::create(in_name, in_type, node_num, if_output, init_val);
}
else if (in_type == ElemData || in_type == ElemData2D || in_type == ElemData3D)
{
data_ptr = meshdata_scalar::create(in_name, in_type, ele_num, if_output, init_val);
}
saved_data.push_back(data_ptr);
return data_ptr;
}
gctl::meshdata *gctl::base_mesh::add_data(std::string in_name, mesh_data_type_e in_type, bool if_output, gctl::point3dc init_val)
{
if (!initialized)
{
throw std::runtime_error("[gctl::base_mesh] Mesh not initialized.");
}
meshdata *data_ptr;
if(saved(in_name))
{
data_ptr = get_data(in_name);
if (data_ptr->get_valtype() != Scalar || data_ptr->get_dattype() != in_type)
{
throw gctl::runtime_error("[gctl::base_mesh] A data object is already created with a different data or value type by the name:" + in_name);
}
// 存在一个同名 同数据类型 同赋值类型的数据 则将其数据设置为初始值
array* val_ptr = (array*) data_ptr->get_datval_ptr();
val_ptr->assign_all(init_val);
return data_ptr;
}
if (in_type == NodeData)
{
data_ptr = meshdata_vector::create(in_name, in_type, node_num, if_output, init_val);
}
else if (in_type == ElemData || in_type == ElemData2D || in_type == ElemData3D)
{
data_ptr = meshdata_vector::create(in_name, in_type, ele_num, if_output, init_val);
}
saved_data.push_back(data_ptr);
return data_ptr;
}
gctl::meshdata *gctl::base_mesh::add_data(std::string in_name, mesh_data_type_e in_type, bool if_output, gctl::tensor init_val)
{
if (!initialized)
{
throw std::runtime_error("[gctl::base_mesh] Mesh not initialized.");
}
meshdata *data_ptr;
if(saved(in_name))
{
data_ptr = get_data(in_name);
if (data_ptr->get_valtype() != Scalar || data_ptr->get_dattype() != in_type)
{
throw gctl::runtime_error("[gctl::base_mesh] A data object is already created with a different data or value type by the name:" + in_name);
}
// 存在一个同名 同数据类型 同赋值类型的数据 则将其数据设置为初始值
array* val_ptr = (array*) data_ptr->get_datval_ptr();
val_ptr->assign_all(init_val);
return data_ptr;
}
if (in_type == NodeData)
{
data_ptr = meshdata_tensor::create(in_name, in_type, node_num, if_output, init_val);
}
else if (in_type == ElemData || in_type == ElemData2D || in_type == ElemData3D)
{
data_ptr = meshdata_tensor::create(in_name, in_type, ele_num, if_output, init_val);
}
saved_data.push_back(data_ptr);
return data_ptr;
}
gctl::meshdata *gctl::base_mesh::add_data(std::string in_name, mesh_data_type_e in_type, bool if_output, mesh_data_value_e val_type)
{
if (!initialized)
{
throw std::runtime_error("[gctl::base_mesh] Mesh not initialized.");
}
meshdata *data_ptr;
if(saved(in_name))
{
data_ptr = get_data(in_name);
if (data_ptr->get_valtype() != Scalar || data_ptr->get_dattype() != in_type)
{
throw gctl::runtime_error("[gctl::base_mesh] A data object is already created with a different data or value type by the name:" + in_name);
}
return data_ptr;
}
if (val_type == Scalar && in_type == NodeData)
{
data_ptr = meshdata_scalar::create(in_name, in_type, node_num, if_output, 0.0);
}
else if (val_type == Scalar && in_type == ElemData)
{
data_ptr = meshdata_scalar::create(in_name, in_type, ele_num, if_output, 0.0);
}
else if (val_type == Vector && in_type == NodeData)
{
point3dc init_val = {0.0, 0.0, 0.0};
data_ptr = meshdata_vector::create(in_name, in_type, node_num, if_output, init_val);
}
else if (val_type == Vector && in_type == ElemData)
{
point3dc init_val = {0.0, 0.0, 0.0};
data_ptr = meshdata_vector::create(in_name, in_type, ele_num, if_output, init_val);
}
else if (val_type == Tensor && in_type == NodeData)
{
tensor init_val = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
data_ptr = meshdata_tensor::create(in_name, in_type, node_num, if_output, init_val);
}
else if (val_type == Tensor && in_type == ElemData)
{
tensor init_val = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
data_ptr = meshdata_tensor::create(in_name, in_type, ele_num, if_output, init_val);
}
saved_data.push_back(data_ptr);
return data_ptr;
}
void gctl::base_mesh::init(std::string in_name, std::string in_info, int xnum, int ynum,
double xmin, double ymin, double dx, double dy)
{
throw runtime_error("[gctl::base_mesh] Invalid mesh type for calling this function.");
return;
}
void gctl::base_mesh::init(std::string in_name, std::string in_info, int xbnum, int ybnum, int zbnum,
double xmin, double ymin, double zmin, double xsize, double ysize, double zsize)
{
throw runtime_error("[gctl::base_mesh] Invalid mesh type for calling this function.");
return;
}
void gctl::base_mesh::init(std::string in_name, std::string in_info, double lon_min, double lat_min,
double rad_min, double lon_size, double lat_size, double rad_size, int lon_bnum, int lat_bnum, int rad_bnum)
{
throw runtime_error("[gctl::base_mesh] Invalid mesh type for calling this function.");
return;
}
void gctl::base_mesh::init(std::string in_name, std::string in_info, double xmin, double ymin,
const gctl::array &xsizes, const gctl::array &ysizes)
{
throw runtime_error("[gctl::base_mesh] Invalid mesh type for calling this function.");
return;
}
void gctl::base_mesh::init(std::string in_name, std::string in_info, double xmin, double ymin,
double zmin, const gctl::array &xsizes, const gctl::array &ysizes,
const gctl::array &zsizes)
{
throw runtime_error("[gctl::base_mesh] Invalid mesh type for calling this function.");
return;
}
void gctl::base_mesh::init(std::string in_name, std::string in_info, const gctl::array &in_nodes,
const gctl::array &in_triangles)
{
throw runtime_error("[gctl::base_mesh] Invalid mesh type for calling this function.");
return;
}
void gctl::base_mesh::init(std::string in_name, std::string in_info, const gctl::array &in_nodes,
const gctl::array &in_tets)
{
throw runtime_error("[gctl::base_mesh] Invalid mesh type for calling this function.");
return;
}
void gctl::base_mesh::show_mesh_dimension(std::ostream &os) const
{
return;
}
void gctl::base_mesh::save_gmsh(std::string filename, index_packed_e packed)
{
throw runtime_error("[gctl::base_mesh] Invalid mesh type for calling this function.");
return;
}
void gctl::base_mesh::save_gmsh(std::string filename, mesh_data_type_e d_type, output_type_e out_mode, index_packed_e packed)
{
if (out_mode == OverWrite) save_gmsh(filename, packed);
std::ofstream outfile;
gctl::open_outfile(outfile, filename, ".msh", std::ios::out|std::ios::app);
meshdata *curr_data;
for (iter = saved_data.begin(); iter != saved_data.end(); ++iter)
{
curr_data = *iter;
if (curr_data->get_dattype() == d_type && d_type == NodeData &&
curr_data->get_valtype() == Scalar && curr_data->get_output())
{
gctl::array *data_ptr = (gctl::array*) curr_data->get_datval_ptr();
gctl::save_gmsh_data(outfile, curr_data->get_datname(), *data_ptr, gctl::NodeData, packed);
}
else if (curr_data->get_dattype() == d_type && d_type == ElemData &&
curr_data->get_valtype() == Scalar && curr_data->get_output())
{
gctl::array *data_ptr = (gctl::array*) curr_data->get_datval_ptr();
gctl::save_gmsh_data(outfile, curr_data->get_datname(), *data_ptr, gctl::ElemData, packed);
}
else if (curr_data->get_dattype() == d_type && d_type == NodeData &&
curr_data->get_valtype() == Vector && curr_data->get_output())
{
gctl::array *data_ptr = (gctl::array*) curr_data->get_datval_ptr();
gctl::save_gmsh_data(outfile, curr_data->get_datname(), *data_ptr, gctl::NodeData, packed);
}
else if (curr_data->get_dattype() == d_type && d_type == ElemData &&
curr_data->get_valtype() == Vector && curr_data->get_output())
{
gctl::array *data_ptr = (gctl::array*) curr_data->get_datval_ptr();
gctl::save_gmsh_data(outfile, curr_data->get_datname(), *data_ptr, gctl::ElemData, packed);
}
}
outfile.close();
return;
}
void gctl::base_mesh::save_gmsh(std::string filename, std::string datname, output_type_e out_mode, index_packed_e packed)
{
meshdata *curr_data = get_data(datname);
if (!curr_data->get_output())
{
throw gctl::runtime_error("[gctl::base_mesh] Output is disabled for the data:" + datname);
}
if (out_mode == OverWrite) save_gmsh(filename, packed);
std::ofstream outfile;
gctl::open_outfile(outfile, filename, ".msh", std::ios::out|std::ios::app);
if (curr_data->get_valtype() == Scalar)
{
gctl::array *data_ptr = (gctl::array*) curr_data->get_datval_ptr();
if (curr_data->get_dattype() == NodeData)
{
gctl::save_gmsh_data(outfile, curr_data->get_datname(), *data_ptr, gctl::NodeData, packed);
}
else if (curr_data->get_dattype() == ElemData)
{
gctl::save_gmsh_data(outfile, curr_data->get_datname(), *data_ptr, gctl::ElemData, packed);
}
}
else if (curr_data->get_valtype() == Vector)
{
gctl::array *data_ptr = (gctl::array*) curr_data->get_datval_ptr();
if (curr_data->get_dattype() == NodeData)
{
gctl::save_gmsh_data(outfile, curr_data->get_datname(), *data_ptr, gctl::NodeData, packed);
}
else if (curr_data->get_dattype() == ElemData)
{
gctl::save_gmsh_data(outfile, curr_data->get_datname(), *data_ptr, gctl::ElemData, packed);
}
}
else if (curr_data->get_valtype() == Tensor)
{
gctl::array *data_ptr = (gctl::array*) curr_data->get_datval_ptr();
if (curr_data->get_dattype() == NodeData)
{
array v(data_ptr->size());
for (size_t i = 0; i < v.size(); i++)
{
v[i] = data_ptr->at(i).val[0][0];
}
gctl::save_gmsh_data(outfile, curr_data->get_datname() + "_Txx", v, gctl::NodeData, packed);
for (size_t i = 0; i < v.size(); i++)
{
v[i] = data_ptr->at(i).val[0][1];
}
gctl::save_gmsh_data(outfile, curr_data->get_datname() + "_Txy", v, gctl::NodeData, packed);
for (size_t i = 0; i < v.size(); i++)
{
v[i] = data_ptr->at(i).val[0][2];
}
gctl::save_gmsh_data(outfile, curr_data->get_datname() + "_Txz", v, gctl::NodeData, packed);
for (size_t i = 0; i < v.size(); i++)
{
v[i] = data_ptr->at(i).val[1][1];
}
gctl::save_gmsh_data(outfile, curr_data->get_datname() + "_Tyy", v, gctl::NodeData, packed);
for (size_t i = 0; i < v.size(); i++)
{
v[i] = data_ptr->at(i).val[1][2];
}
gctl::save_gmsh_data(outfile, curr_data->get_datname() + "_Tyz", v, gctl::NodeData, packed);
for (size_t i = 0; i < v.size(); i++)
{
v[i] = data_ptr->at(i).val[2][2];
}
gctl::save_gmsh_data(outfile, curr_data->get_datname() + "_Tzz", v, gctl::NodeData, packed);
}
else if (curr_data->get_dattype() == ElemData)
{
array v(data_ptr->size());
for (size_t i = 0; i < v.size(); i++)
{
v[i] = data_ptr->at(i).val[0][0];
}
gctl::save_gmsh_data(outfile, curr_data->get_datname() + "_Txx", v, gctl::ElemData, packed);
for (size_t i = 0; i < v.size(); i++)
{
v[i] = data_ptr->at(i).val[0][1];
}
gctl::save_gmsh_data(outfile, curr_data->get_datname() + "_Txy", v, gctl::ElemData, packed);
for (size_t i = 0; i < v.size(); i++)
{
v[i] = data_ptr->at(i).val[0][2];
}
gctl::save_gmsh_data(outfile, curr_data->get_datname() + "_Txz", v, gctl::ElemData, packed);
for (size_t i = 0; i < v.size(); i++)
{
v[i] = data_ptr->at(i).val[1][1];
}
gctl::save_gmsh_data(outfile, curr_data->get_datname() + "_Tyy", v, gctl::ElemData, packed);
for (size_t i = 0; i < v.size(); i++)
{
v[i] = data_ptr->at(i).val[1][2];
}
gctl::save_gmsh_data(outfile, curr_data->get_datname() + "_Tyz", v, gctl::ElemData, packed);
for (size_t i = 0; i < v.size(); i++)
{
v[i] = data_ptr->at(i).val[2][2];
}
gctl::save_gmsh_data(outfile, curr_data->get_datname() + "_Tzz", v, gctl::ElemData, packed);
}
}
outfile.close();
return;
}
void gctl::base_mesh::load_data_cloud(const array &in_posi, const array &in_val,
double search_xlen, double search_ylen, double search_deg, std::string datname, mesh_data_type_e d_type)
{
throw runtime_error("[gctl::base_mesh] Invalid mesh type for calling this function.");
return;
}
void gctl::base_mesh::load_data_cloud(const array &in_posi, const array &in_val,
double search_xlen, double search_ylen, double search_deg, std::string datname, mesh_data_type_e d_type)
{
throw runtime_error("[gctl::base_mesh] Invalid mesh type for calling this function.");
return;
}
void gctl::base_mesh::extract_points(std::string datname, const array &in_posi, array &out_val)
{
throw runtime_error("[gctl::base_mesh] Invalid mesh type for calling this function.");
return;
}
void gctl::base_mesh::extract_points(std::string datname, const array &in_posi, array &out_val)
{
throw runtime_error("[gctl::base_mesh] Invalid mesh type for calling this function.");
return;
}
void gctl::base_mesh::extract_profile(std::string datname, const point2dc &start_p, const point2dc &end_p, int size_p,
array &out_posi, array &out_val)
{
throw runtime_error("[gctl::base_mesh] Invalid mesh type for calling this function.");
return;
}
void gctl::base_mesh::extract_profile(std::string datname, const point3dc &start_p, const point3dc &end_p, int size_p,
double dh, array &out_posi, array &out_val)
{
throw runtime_error("[gctl::base_mesh] Invalid mesh type for calling this function.");
return;
}
void gctl::base_mesh::edit_data(std::string datname, physical_type_e p_type, value_operator_e v_type, std::string para_str, double in_val)
{
throw runtime_error("[gctl::base_mesh] Invalid mesh type for calling this function.");
return;
}
void gctl::base_mesh::edit_data(std::string datname, physical_type_e p_type, value_operator_e v_type, std::string para_str, point3dc in_val)
{
throw runtime_error("[gctl::base_mesh] Invalid mesh type for calling this function.");
return;
}
void gctl::base_mesh::edit_data(std::string datname, physical_type_e p_type, value_operator_e v_type, std::string para_str, tensor in_val)
{
throw runtime_error("[gctl::base_mesh] Invalid mesh type for calling this function.");
return;
}
void gctl::base_mesh::purge_data(std::string datname, double in_val)
{
throw runtime_error("[gctl::base_mesh] Invalid mesh type for calling this function.");
return;
}
void gctl::base_mesh::purge_data(std::string datname, point3dc in_val)
{
throw runtime_error("[gctl::base_mesh] Invalid mesh type for calling this function.");
return;
}
void gctl::base_mesh::purge_data(std::string datname, tensor in_val)
{
throw runtime_error("[gctl::base_mesh] Invalid mesh type for calling this function.");
return;
}
/**
* 以下是类的私有函数,可以简单一些
*/
void gctl::base_mesh::init(mesh_type_e in_type, mesh_dim_e in_dim, std::string in_name, std::string in_info)
{
if (in_name == "")
{
throw std::runtime_error("[gctl::base_mesh] The input name is empty.");
}
if (in_info == "")
{
throw std::runtime_error("[gctl::base_mesh] The input info. is empty.");
}
meshname = in_name;
meshinfo = in_info;
meshtype = in_type;
meshdim = in_dim;
return;
}
void gctl::base_mesh::load_headinfo(std::ifstream &infile, mesh_type_e expected_type, mesh_dim_e expected_dim)
{
// 读入网格头信息
infile.read((char*)&meshtype, sizeof(int));
infile.read((char*)&meshdim, sizeof(int));
if (meshdim != expected_dim || meshtype != expected_type)
{
infile.close();
throw std::runtime_error("[gctl::base_mesh] Invalid input mesh type.");
}
int info_size;
infile.read((char*)&info_size, sizeof(int));
meshname.resize(info_size);
infile.read((char*)meshname.c_str(), info_size);
infile.read((char*)&info_size, sizeof(int));
meshinfo.resize(info_size);
infile.read((char*)meshinfo.c_str(), info_size);
return;
}
void gctl::base_mesh::load_datablock(std::ifstream &infile)
{
meshdata *new_data;
int in_num, info_size;
mesh_data_type_e in_dattype;
mesh_data_value_e in_valtype;
std::string in_name;
infile.read((char*)&in_num, sizeof(int));
for (int i = 0; i < in_num; i++)
{
// 首先读入三个整形和数据名称
infile.read((char*)&in_dattype, sizeof(int));
infile.read((char*)&in_valtype, sizeof(int));
infile.read((char*)&info_size, sizeof(int));
in_name.resize(info_size);
infile.read((char*)in_name.c_str(), info_size);
new_data = add_data(in_name, in_dattype, true, in_valtype);
new_data->load_binary(infile);
}
return;
}
void gctl::base_mesh::save_headinfo(std::ofstream &outfile)
{
// 首先输出网格的类型和维度
outfile.write((char*)&meshtype, sizeof(int));
outfile.write((char*)&meshdim, sizeof(int));
// 输出网格名称与信息
int info_size = meshname.size();
outfile.write((char*)&info_size, sizeof(int));
outfile.write((char*)meshname.c_str(), info_size);
info_size = meshinfo.size();
outfile.write((char*)&info_size, sizeof(int));
outfile.write((char*)meshinfo.c_str(), info_size);
return;
}
void gctl::base_mesh::save_datablock(std::ofstream &outfile)
{
// 统计输出的模型数量
int out_num = 0;
meshdata *curr_data = nullptr;
for (iter = saved_data.begin(); iter != saved_data.end(); ++iter)
{
curr_data = *iter;
if (curr_data->get_output())
{
out_num++;
}
}
outfile.write((char*)&out_num, sizeof(int));
for (iter = saved_data.begin(); iter != saved_data.end(); ++iter)
{
curr_data = *iter;
if (curr_data->get_output())
{
curr_data->save_binary(outfile);
}
}
return;
}