/********************************************************
* ██████╗ ██████╗████████╗██╗
* ██╔════╝ ██╔════╝╚══██╔══╝██║
* ██║ ███╗██║ ██║ ██║
* ██║ ██║██║ ██║ ██║
* ╚██████╔╝╚██████╗ ██║ ███████╗
* ╚═════╝ ╚═════╝ ╚═╝ ╚══════╝
* 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.
******************************************************/
#ifndef _GCTL_GMSH_IO_H
#define _GCTL_GMSH_IO_H
// library's head files
#include "../core.h"
#include "../geometry.h"
#include "../utility.h"
#ifdef GCTL_EIGEN
#include "Eigen/Dense"
#endif // GCTL_EIGEN
namespace gctl
{
struct gmsh_physical_group
{
size_t dim_tag, phys_tag;
std::string name;
};
/**
* @brief Gmsh文件的IO类,主要为调用下面定义的全局函数
*/
class gmshio
{
public:
gmshio();
gmshio(std::string filename, file_direction_e f_direct);
virtual ~gmshio();
void init_file(std::string filename, file_direction_e f_direct);
void reset_file(std::string filename, file_direction_e f_direct);
void set_packed(index_packed_e is_packed, file_direction_e f_direct);
bool initialized(file_direction_e f_direct);
void read_physical_groups(array &phy_groups);
void save_physical_groups(const array &phy_groups);
int physical_name2tag(const array &phy_groups, std::string name);
template void read_node(array> &out_nodes);
template void read_node(array> &out_nodes);
template void read_element(array> &out_elements, const array> &nodes, _2i_vector *ele_tag = nullptr);
template void read_element(array> &out_elements, const array> &nodes, _2i_vector *ele_tag = nullptr);
template void read_element(array> &out_elements, const array> &nodes, _2i_vector *ele_tag = nullptr);
template void read_element(array> &out_elements, const array> &nodes, _2i_vector *ele_tag = nullptr);
template void read_element(array> &out_elements, const array> &nodes, _2i_vector *ele_tag = nullptr);
template void read_element(array> &out_elements, const array> &nodes, _2i_vector *ele_tag = nullptr);
template void read_element(array> &out_elements, const array> &nodes, _2i_vector *ele_tag = nullptr);
template void read_element(array> &out_elements, const array> &nodes, _2i_vector *ele_tag = nullptr);
template void read_element(array> &out_elements, const array> &nodes, _2i_vector *ele_tag = nullptr);
template void read_element(array> &out_elements, const array> &nodes, _2i_vector *ele_tag = nullptr);
template void read_element(array> &out_elements, const array> &nodes, _2i_vector *ele_tag = nullptr);
template void read_mesh(array> &out_elements, array> &nodes, _2i_vector *ele_tag = nullptr);
template void read_mesh(array> &out_elements, array> &nodes, _2i_vector *ele_tag = nullptr);
template void read_mesh(array> &out_elements, array> &nodes, _2i_vector *ele_tag = nullptr);
template void read_mesh(array> &out_elements, array> &nodes, _2i_vector *ele_tag = nullptr);
template void read_mesh(array> &out_elements, array> &nodes, _2i_vector *ele_tag = nullptr);
template void read_mesh(array> &out_elements, array> &nodes, _2i_vector *ele_tag = nullptr);
template void read_mesh(array> &out_elements, array> &nodes, _2i_vector *ele_tag = nullptr);
template void read_mesh(array> &out_elements, array> &nodes, _2i_vector *ele_tag = nullptr);
template void read_mesh(array> &out_elements, array> &nodes, _2i_vector *ele_tag = nullptr);
template void read_mesh(array> &out_elements, array> &nodes, _2i_vector *ele_tag = nullptr);
template void read_data(array &out_data, std::string data_name = "");
template void read_data(array &out_data, array &out_index, std::string data_name = "");
template void read_data(std::vector > &out_data, std::vector &out_name,
mesh_data_type_e d_type, std::vector > *out_index = nullptr);
template void save_mesh(const array> &element, const array> &node);
template void save_mesh(const array> &element, const array> &node);
template void save_mesh(const array> &element, const array> &node);
template void save_mesh(const array> &element, const array> &node, array *out_ele_tag = nullptr, array *out_node_tag = nullptr);
template void save_mesh(const array> &element, const array> &node, array *output_tag = nullptr);
template void save_mesh(const array> &element, const array> &node);
template void save_mesh(const array> &element, const array> &node);
template void save_mesh(const array> &element, const array> &node);
template void save_mesh(const array> &element);
template void save_data(std::string dataname, const T *in_data, size_t in_size, mesh_data_type_e datatype, const size_t *in_index = nullptr);
template void save_data(std::string dataname, const array &in_data, mesh_data_type_e datatype, const array *in_index = nullptr);
template void save_data(std::string dataname, const std::vector &in_data, mesh_data_type_e datatype, const std::vector *in_index = nullptr);
template void save_data(std::string dataname, const array> &in_data, mesh_data_type_e datatype, const array *in_index = nullptr);
template void save_data(std::string dataname, const std::vector> &in_data, mesh_data_type_e datatype, const std::vector *in_index = nullptr);
#ifdef GCTL_EIGEN
template void save_data(std::string dataname, const Eigen::Matrix &in_data, mesh_data_type_e datatype, const Eigen::Matrix *in_index = nullptr);
#endif // GCTL_EIGEN
template void element_register(const array> &element, const _2i_matrix *tag_ptr = nullptr, array *rgst_index = nullptr);
template void element_register(const array> &element, const _2i_matrix *tag_ptr = nullptr, array *rgst_index = nullptr);
template void element_register(const array> &element, const _2i_matrix *tag_ptr = nullptr, array *rgst_index = nullptr);
template void element_register(const array> &element, const _2i_matrix *tag_ptr = nullptr, array *rgst_index = nullptr);
template void element_register(const array> &element, const _2i_matrix *tag_ptr = nullptr, array *rgst_index = nullptr);
template void element_register(const array> &element, const _2i_matrix *tag_ptr = nullptr, array *rgst_index = nullptr);
template void element_register(const array> &element, const _2i_matrix *tag_ptr = nullptr, array *rgst_index = nullptr);
template void element_register(const array> &element, const _2i_matrix *tag_ptr = nullptr, array *rgst_index = nullptr);
template void element_register(const array> &element, const _2i_matrix *tag_ptr = nullptr, array *rgst_index = nullptr);
template void save_registered_mesh(const array> &node, array *phys_ptr = nullptr);
template void save_registered_mesh(const array> &node, array *phys_ptr = nullptr);
protected:
std::ifstream gmsh_in; // Input stream
std::ofstream gmsh_out; // Output stream
index_packed_e in_packed, out_packed; // Whether the input/output node indexes are starting from zero
std::vector > rgst_elem; // registered elements
};
template
void gmshio::read_node(array> &out_nodes)
{
initialized(Input);
read_gmsh_node(gmsh_in, out_nodes, in_packed);
return;
}
template
void gmshio::read_node(array> &out_nodes)
{
initialized(Input);
read_gmsh_node(gmsh_in, out_nodes, in_packed);
return;
}
template
void gmshio::read_element(array> &out_elements, const array> &nodes, _2i_vector *ele_tag)
{
initialized(Input);
read_gmsh_element(gmsh_in, out_elements, nodes, in_packed, ele_tag);
return;
}
template
void gmshio::read_element(array> &out_elements, const array> &nodes, _2i_vector *ele_tag)
{
initialized(Input);
read_gmsh_element(gmsh_in, out_elements, nodes, in_packed, ele_tag);
return;
}
template
void gmshio::read_element(array> &out_elements, const array> &nodes, _2i_vector *ele_tag)
{
initialized(Input);
read_gmsh_element(gmsh_in, out_elements, nodes, in_packed, ele_tag);
return;
}
template
void gmshio::read_element(array> &out_elements, const array> &nodes, _2i_vector *ele_tag)
{
initialized(Input);
read_gmsh_element(gmsh_in, out_elements, nodes, in_packed, ele_tag);
return;
}
template
void gmshio::read_element(array> &out_elements, const array> &nodes, _2i_vector *ele_tag)
{
initialized(Input);
read_gmsh_element(gmsh_in, out_elements, nodes, in_packed, ele_tag);
return;
}
template
void gmshio::read_element(array> &out_elements, const array> &nodes, _2i_vector *ele_tag)
{
initialized(Input);
read_gmsh_element(gmsh_in, out_elements, nodes, in_packed, ele_tag);
return;
}
template
void gmshio::read_element(array> &out_elements, const array> &nodes, _2i_vector *ele_tag)
{
initialized(Input);
read_gmsh_element(gmsh_in, out_elements, nodes, in_packed, ele_tag);
return;
}
template
void gmshio::read_element(array> &out_elements, const array> &nodes, _2i_vector *ele_tag)
{
initialized(Input);
read_gmsh_element(gmsh_in, out_elements, nodes, in_packed, ele_tag);
return;
}
template
void gmshio::read_element(array> &out_elements, const array> &nodes, _2i_vector *ele_tag)
{
initialized(Input);
read_gmsh_element(gmsh_in, out_elements, nodes, in_packed, ele_tag);
return;
}
template
void gmshio::read_element(array> &out_elements, const array> &nodes, _2i_vector *ele_tag)
{
initialized(Input);
read_gmsh_element(gmsh_in, out_elements, nodes, in_packed, ele_tag);
return;
}
template
void gmshio::read_element(array> &out_elements, const array> &nodes, _2i_vector *ele_tag)
{
initialized(Input);
read_gmsh_element(gmsh_in, out_elements, nodes, in_packed, ele_tag);
return;
}
template
void gmshio::read_mesh(array> &out_elements, array> &nodes, _2i_vector *ele_tag)
{
read_node(nodes);
read_element(out_elements, nodes, ele_tag);
return;
}
template
void gmshio::read_mesh(array> &out_elements, array> &nodes, _2i_vector *ele_tag)
{
read_node(nodes);
read_element(out_elements, nodes, ele_tag);
return;
}
template
void gmshio::read_mesh(array> &out_elements, array> &nodes, _2i_vector *ele_tag)
{
read_node(nodes);
read_element(out_elements, nodes, ele_tag);
return;
}
template
void gmshio::read_mesh(array> &out_elements, array> &nodes, _2i_vector *ele_tag)
{
read_node(nodes);
read_element(out_elements, nodes, ele_tag);
return;
}
template
void gmshio::read_mesh(array> &out_elements, array> &nodes, _2i_vector *ele_tag)
{
read_node(nodes);
read_element(out_elements, nodes, ele_tag);
return;
}
template
void gmshio::read_mesh(array> &out_elements, array> &nodes, _2i_vector *ele_tag)
{
read_node(nodes);
read_element(out_elements, nodes, ele_tag);
return;
}
template
void gmshio::read_mesh(array> &out_elements, array> &nodes, _2i_vector *ele_tag)
{
read_node(nodes);
read_element(out_elements, nodes, ele_tag);
return;
}
template
void gmshio::read_mesh(array> &out_elements, array> &nodes, _2i_vector *ele_tag)
{
read_node(nodes);
read_element(out_elements, nodes, ele_tag);
return;
}
template
void gmshio::read_mesh(array> &out_elements, array> &nodes, _2i_vector *ele_tag)
{
read_node(nodes);
read_element(out_elements, nodes, ele_tag);
return;
}
template
void gmshio::read_mesh(array> &out_elements, array> &nodes, _2i_vector *ele_tag)
{
read_node(nodes);
read_element(out_elements, nodes, ele_tag);
return;
}
template
void gmshio::read_data(array &out_data, std::string data_name)
{
initialized(Input);
read_gmsh_data(gmsh_in, out_data, data_name);
return;
}
template
void gmshio::read_data(array &out_data, array &out_index, std::string data_name)
{
initialized(Input);
read_gmsh_data(gmsh_in, out_data, out_index, data_name, in_packed);
return;
}
template
void gmshio::read_data(std::vector > &out_data, std::vector &out_name,
mesh_data_type_e d_type, std::vector > *out_index)
{
initialized(Input);
read_gmsh_data(gmsh_in, out_data, out_name, d_type, out_index, in_packed);
return;
}
template
void gmshio::save_mesh(const array> &element, const array> &node)
{
initialized(Output);
save2gmsh(gmsh_out, element, node, out_packed);
return;
}
template
void gmshio::save_mesh(const array> &element, const array> &node)
{
initialized(Output);
save2gmsh(gmsh_out, element, node, out_packed);
return;
}
template
void gmshio::save_mesh(const array> &element, const array> &node)
{
initialized(Output);
save2gmsh(gmsh_out, element, node, out_packed);
return;
}
template
void gmshio::save_mesh(const array> &element, const array> &node,
array *out_ele_tag, array *out_node_tag)
{
initialized(Output);
save2gmsh(gmsh_out, element, node, out_packed, out_ele_tag, out_node_tag);
return;
}
template
void gmshio::save_mesh(const array> &element, const array> &node, array *output_tag)
{
initialized(Output);
save2gmsh(gmsh_out, element, node, out_packed, output_tag);
return;
}
template
void gmshio::save_mesh(const array> &element, const array