/******************************************************** * ██████╗ ██████╗████████╗██╗ * ██╔════╝ ██╔════╝╚══██╔══╝██║ * ██║ ███╗██║ ██║ ██║ * ██║ ██║██║ ██║ ██║ * ╚██████╔╝╚██████╗ ██║ ███████╗ * ╚═════╝ ╚═════╝ ╚═╝ ╚══════╝ * Geophysical Computational Tools & Library (GCTL) * * Copyright (c) 2022 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 _FUNC_MSH2VTK_H #define _FUNC_MSH2VTK_H #include "iostream" #include "fstream" #include "string.h" #include "sstream" #include "stdio.h" #include "stdlib.h" #include "iomanip" #include "cmath" #include "vector" #include "map" #include "gctl/io.h" #include "gctl/utility.h" using namespace std; typedef map typesMap; struct node { int id; double x, y, z; }; typedef vector nodeArray; struct element { int id; int msh_type; int vtk_type; int msh_info_num; std::vector msh_info; std::vector nodes_index; }; typedef vector elementArray; struct elementData { std::vector ids; string name; std::vector val; }; typedef vector elementDataArray; struct nodeData { std::vector ids; string name; std::vector val; }; typedef vector nodeDataArray; class mshvtk { private: nodeArray nArray; elementArray eArray; nodeDataArray ndArray; elementDataArray edArray; typesMap msh2vtk_type; typesMap type_nodenum; typesMap::iterator itm; int nodenum; int elenum; bool nopacked; std::vector outNames; public: mshvtk(){ msh2vtk_type[1] = 3; msh2vtk_type[2] = 5; msh2vtk_type[3] = 9; msh2vtk_type[4] = 10; msh2vtk_type[5] = 12; msh2vtk_type[6] = 13; //注意三棱柱顶点序列gmsh和vtk貌似有点区别 上下底面的三角形顶点排序刚好相反 type_nodenum[1] = 2; type_nodenum[2] = 3; type_nodenum[3] = 4; type_nodenum[4] = 4; type_nodenum[5] = 8; type_nodenum[6] = 6; nopacked = false; } ~mshvtk(){} int runtine(std::string parachar); int addname(std::string onename); int readmsh(std::string inname); //注意这里的文件名都是不带.msh后缀的 int writevtk(std::string inname); //注意这里的文件名需要添加.vtk后缀 }; int mshvtk::runtine(std::string parachar) { if(readmsh(parachar)) return -1; if(writevtk(parachar)) return -1; nArray.clear(); ndArray.clear(); eArray.clear(); edArray.clear(); return 0; } int mshvtk::addname(std::string onename) { string s = "\""+onename+"\""; outNames.push_back(s); return 0; } int mshvtk::readmsh(std::string inname) { int temp_int,ele_num; node temp_node; element temp_element; nodeData temp_node_data; elementData temp_element_data; string temp_str; stringstream temp_ss; ifstream infile; gctl::open_infile(infile, inname, ".msh"); while(getline(infile,temp_str)) { if (temp_str == "$Nodes") { getline(infile,temp_str); gctl::str2ss(temp_str, temp_ss); temp_ss >> nodenum; for (int i = 0; i < nodenum; i++) { getline(infile,temp_str); gctl::str2ss(temp_str, temp_ss); temp_ss >> temp_node.id >> temp_node.x >> temp_node.y >> temp_node.z; nArray.push_back(temp_node); } } else if (temp_str == "$Elements") { getline(infile,temp_str); gctl::str2ss(temp_str, temp_ss); temp_ss >> ele_num; for (int i = 0; i < ele_num; i++) { temp_element.msh_info.clear(); temp_element.nodes_index.clear(); getline(infile,temp_str); gctl::str2ss(temp_str, temp_ss); temp_ss >> temp_element.id >> temp_element.msh_type >> temp_element.msh_info_num; for (int j = 0; j < temp_element.msh_info_num; j++) { temp_ss >> temp_int; temp_element.msh_info.push_back(temp_int); } for (int j = 0; j < type_nodenum[temp_element.msh_type]; j++) { temp_ss >> temp_int; if (nArray[0].id == 1) { temp_element.nodes_index.push_back(temp_int-1); nopacked = true; } else temp_element.nodes_index.push_back(temp_int); } temp_element.vtk_type = msh2vtk_type[temp_element.msh_type]; eArray.push_back(temp_element); } } else if (temp_str == "$ElementData") { temp_element_data.ids.clear(); temp_element_data.val.clear(); getline(infile,temp_str); gctl::str2ss(temp_str, temp_ss); temp_ss >> temp_int; for (int i = 0; i < temp_int; i++) { getline(infile,temp_str); temp_element_data.name = temp_str; } //跳过6行 for (int i = 0; i < 6; i++) getline(infile,temp_str); gctl::str2ss(temp_str, temp_ss); temp_ss >> temp_int; temp_element_data.ids.resize(temp_int); temp_element_data.val.resize(temp_int); for (int i = 0; i < temp_int; i++) { getline(infile,temp_str); gctl::str2ss(temp_str, temp_ss); temp_ss >> temp_element_data.ids[i] >> temp_element_data.val[i]; if (nopacked) temp_element_data.ids[i] -= 1; } edArray.push_back(temp_element_data); } else if (temp_str == "$NodeData") { temp_node_data.ids.clear(); temp_node_data.val.clear(); getline(infile,temp_str); gctl::str2ss(temp_str, temp_ss); temp_ss >> temp_int; for (int i = 0; i < temp_int; i++) { getline(infile,temp_str); temp_node_data.name = temp_str; } //跳过6行 for (int i = 0; i < 6; i++) getline(infile,temp_str); gctl::str2ss(temp_str, temp_ss); temp_ss >> temp_int; temp_node_data.ids.resize(temp_int); temp_node_data.val.resize(temp_int); for (int i = 0; i < temp_int; i++) { getline(infile,temp_str); gctl::str2ss(temp_str, temp_ss); temp_ss >> temp_node_data.ids[i] >> temp_node_data.val[i]; if (nopacked) temp_node_data.ids[i] -= 1; } ndArray.push_back(temp_node_data); } } infile.close(); return 0; } int mshvtk::writevtk(std::string inname) { int temp_int; string temp_dataName; int totalCellNum = 0; ofstream outfile; gctl::open_outfile(outfile,inname,".vtk"); outfile<<"# vtk DataFile Version 2.0"<