// high level interface for MshLoader // // Copyright (C) 2020 Vladimir Fonov // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. #include "readMSH.h" #include "MshLoader.h" #include template IGL_INLINE bool igl::readMSH( const std::string &msh, Eigen::Matrix &X, Eigen::Matrix &Tri, Eigen::Matrix &Tet, Eigen::VectorXi &TriTag, Eigen::VectorXi &TetTag, std::vector &XFields, std::vector> &XF, std::vector &EFields, std::vector> &TriF, std::vector> &TetF) { try { igl::MshLoader _loader(msh); const int USETAG = 1; #ifndef NDEBUG std::cout<<"readMSH:Total number of nodes:" << _loader.get_nodes().size()<c_str() << ":" << _loader.get_node_fields()[i-std::begin(_loader.get_node_fields_names())].size() << std::endl; } std::cout << "readMSH:Element fields:" << std::endl; for(auto i=std::begin(_loader.get_element_fields_names()); i!=std::end(_loader.get_element_fields_names()); i++) { std::cout << i->c_str() << ":" << _loader.get_element_fields()[i-std::begin(_loader.get_element_fields_names())].size() << std::endl; } if(_loader.is_element_map_identity()) std::cout<<"readMSH:Element ids map is identity"< > node_map( _loader.get_nodes().data(), _loader.get_nodes().size()/3, 3 ); X = node_map; XFields = _loader.get_element_fields_names(); XF.resize(_loader.get_node_fields().size()); XFields = _loader.get_node_fields_names(); for(size_t i=0;i<_loader.get_node_fields().size();++i) { Eigen::Map< const Eigen::Matrix > field_map( _loader.get_node_fields()[i].data(), _loader.get_node_fields()[i].size()/_loader.get_node_fields_components()[i], _loader.get_node_fields_components()[i] ); XF[i] = field_map; } // calculate number of elements std::map element_counts; for(auto i:_loader.get_elements_types()) { auto j=element_counts.insert({i,1}); if(!j.second) (*j.first).second+=1; } #ifndef NDEBUG std::cout<<"ReadMSH: elements found"<second; if(n_tet_el_!=std::end(element_counts)) n_tet_el=n_tet_el_->second; Tri.resize(n_tri_el,3); Tet.resize(n_tet_el,4); TriTag.resize(n_tri_el); TetTag.resize(n_tet_el); size_t el_start = 0; TriF.resize(_loader.get_element_fields().size()); TetF.resize(_loader.get_element_fields().size()); for(size_t i=0;i<_loader.get_element_fields().size();++i) { TriF[i].resize(n_tri_el,_loader.get_element_fields_components()[i]); TetF[i].resize(n_tet_el,_loader.get_element_fields_components()[i]); } EFields = _loader.get_element_fields_names(); int i_tri = 0; int i_tet = 0; for(size_t i=0;i<_loader.get_elements_lengths().size();++i) { if(_loader.get_elements_types()[i]==MshLoader::ELEMENT_TRI ) { assert(_loader.get_elements_lengths()[i]==3); Tri(i_tri, 0) = _loader.get_elements()[el_start ]; Tri(i_tri, 1) = _loader.get_elements()[el_start+1]; Tri(i_tri, 2) = _loader.get_elements()[el_start+2]; TriTag(i_tri) = _loader.get_elements_tags()[1][i]; for(size_t j=0;j<_loader.get_element_fields().size();++j) for(size_t k=0;k<_loader.get_element_fields_components()[j];++k) TriF[j](i_tri,k) = _loader.get_element_fields()[j][_loader.get_element_fields_components()[j]*i+k]; ++i_tri; } else if(_loader.get_elements_types()[i]==MshLoader::ELEMENT_TET ) { assert(_loader.get_elements_lengths()[i]==4); Tet(i_tet, 0) = _loader.get_elements()[el_start ]; Tet(i_tet, 1) = _loader.get_elements()[el_start+1]; Tet(i_tet, 2) = _loader.get_elements()[el_start+2]; Tet(i_tet, 3) = _loader.get_elements()[el_start+3]; TetTag(i_tet) = _loader.get_elements_tags()[USETAG][i]; for(size_t j=0;j<_loader.get_element_fields().size();++j) for(size_t k=0;k<_loader.get_element_fields_components()[j];++k) TetF[j](i_tet,k) = _loader.get_element_fields()[j][_loader.get_element_fields_components()[j]*i+k]; ++i_tet; } else { // else: it's unsupported type of the element, ignore for now std::cerr<<"readMSH: unsupported element type: "<<_loader.get_elements_types()[i] << ", length: "<< _loader.get_elements_lengths()[i] < IGL_INLINE bool igl::readMSH( const std::string &msh, Eigen::Matrix &X, Eigen::Matrix &Tri, Eigen::Matrix &Tet, Eigen::VectorXi &TriTag, Eigen::VectorXi &TetTag) { std::vector XFields; std::vector EFields; std::vector> XF; std::vector> TriF; std::vector> TetF; return igl::readMSH(msh,X,Tri,Tet,TriTag,TetTag,XFields,XF,EFields,TriF,TetF); } template IGL_INLINE bool igl::readMSH( const std::string &msh, Eigen::Matrix &X, Eigen::Matrix &Tri, Eigen::VectorXi &TriTag) { Eigen::Matrix Tet; Eigen::VectorXi TetTag; std::vector XFields; std::vector EFields; std::vector> XF; std::vector> TriF; std::vector> TetF; return igl::readMSH(msh,X,Tri,Tet,TriTag,TetTag,XFields,XF,EFields,TriF,TetF); } template IGL_INLINE bool igl::readMSH( const std::string &msh, Eigen::Matrix &X, Eigen::Matrix &Tri) { Eigen::Matrix Tet; Eigen::VectorXi TetTag; Eigen::VectorXi TriTag; std::vector XFields; std::vector EFields; std::vector> XF; std::vector> TriF; std::vector> TetF; return igl::readMSH(msh,X,Tri,Tet,TriTag,TetTag,XFields,XF,EFields,TriF,TetF); } #ifdef IGL_STATIC_LIBRARY // Explicit template instantiation template bool igl::readMSH<1>(std::basic_string, std::allocator> const&, Eigen::Matrix&, Eigen::Matrix&, Eigen::Matrix&, Eigen::Matrix&, Eigen::Matrix&, std::vector, std::allocator>, std::allocator, std::allocator>>>&, std::vector, std::allocator>>&, std::vector, std::allocator>, std::allocator, std::allocator>>>&, std::vector, std::allocator>>&, std::vector, std::allocator>>&); template bool igl::readMSH<0>(std::basic_string, std::allocator> const&, Eigen::Matrix&, Eigen::Matrix&, Eigen::Matrix&, Eigen::Matrix&, Eigen::Matrix&, std::vector, std::allocator>, std::allocator, std::allocator>>>&, std::vector, std::allocator>>&, std::vector, std::allocator>, std::allocator, std::allocator>>>&, std::vector, std::allocator>>&, std::vector, std::allocator>>&); template bool igl::readMSH<1>(std::basic_string, std::allocator> const&, Eigen::Matrix&, Eigen::Matrix&, Eigen::Matrix&, Eigen::Matrix&, Eigen::Matrix&); template bool igl::readMSH<0>(std::basic_string, std::allocator> const&, Eigen::Matrix&, Eigen::Matrix&, Eigen::Matrix&, Eigen::Matrix&, Eigen::Matrix&); #endif