Branch data Line data Source code
1 : : // ***************************************************************************** 2 : : /*! 3 : : \file src/IO/NetgenMeshReader.cpp 4 : : \copyright 2012-2015 J. Bakosi, 5 : : 2016-2018 Los Alamos National Security, LLC., 6 : : 2019-2021 Triad National Security, LLC. 7 : : All rights reserved. See the LICENSE file for details. 8 : : \brief Netgen mesh reader class definition 9 : : \details Netgen mesh reader class definition. Only supports tetrahedra. 10 : : */ 11 : : // ***************************************************************************** 12 : : 13 : : #include <array> 14 : : #include <istream> 15 : : #include <string> 16 : : #include <vector> 17 : : #include <cstddef> 18 : : 19 : : #include "Types.hpp" 20 : : #include "Exception.hpp" 21 : : #include "UnsMesh.hpp" 22 : : #include "Reorder.hpp" 23 : : #include "NetgenMeshReader.hpp" 24 : : 25 : : using tk::NetgenMeshReader; 26 : : 27 : : void 28 : 1 : NetgenMeshReader::readMesh( UnsMesh& mesh ) 29 : : // ***************************************************************************** 30 : : // Read Netgen mesh 31 : : //! \param[in] mesh Unstructured mesh object 32 : : // ***************************************************************************** 33 : : { 34 : : // Read nodes 35 : 1 : readNodes( mesh ); 36 : : // Read elements 37 : 1 : readElements( mesh ); 38 : 1 : } 39 : : 40 : : void 41 : 1 : NetgenMeshReader::readNodes( UnsMesh& mesh ) 42 : : // ***************************************************************************** 43 : : // Read nodes 44 : : //! \param[in] mesh Unstructured mesh object 45 : : // ***************************************************************************** 46 : : { 47 : : int nnode; 48 [ + - ]: 1 : m_inFile >> nnode; 49 [ - + ][ - - ]: 1 : ErrChk( nnode > 0, [ - - ][ - - ] 50 : : "Number of nodes must be greater than zero in file " + m_filename ); 51 : : 52 : : // Read in node coordinates: x-coord y-coord z-coord 53 [ + + ]: 15 : for (int i=0; i<nnode; ++i) { 54 : : tk::real x, y, z; 55 [ + - ][ + - ]: 14 : m_inFile >> x >> y >> z; [ + - ] 56 [ + - ]: 14 : mesh.x().push_back( x ); 57 [ + - ]: 14 : mesh.y().push_back( y ); 58 [ + - ]: 14 : mesh.z().push_back( z ); 59 : : } 60 : : 61 : 2 : std::string s; 62 [ + - ]: 1 : getline( m_inFile, s ); // finish reading the last line 63 : 1 : } 64 : : 65 : : void 66 : 1 : NetgenMeshReader::readElements( UnsMesh& mesh ) 67 : : // ***************************************************************************** 68 : : // Read element connectivity 69 : : //! \param[in] mesh Unstructured mesh object 70 : : // ***************************************************************************** 71 : : { 72 : : int nel; 73 : : 74 : : // Read in number of tetrahedra 75 [ + - ]: 1 : m_inFile >> nel; 76 [ + - ][ + - ]: 1 : if (!m_inFile.eof()) { 77 [ - + ][ - - ]: 1 : ErrChk( nel > 0, "Number of tetrahedra (volume elements) must be greater " [ - - ][ - - ] 78 : : "than zero in file " + m_filename ); 79 : 2 : std::string s; 80 [ + - ]: 1 : getline( m_inFile, s ); // finish reading the last line 81 : : 82 : : // Read in tetrahedra element tags and connectivity 83 [ + + ]: 25 : for (int i=0; i<nel; ++i) { 84 : : int tag; 85 : : std::array< std::size_t, 4 > n; 86 : : // tag n[1-4] 87 [ + - ][ + - ]: 24 : m_inFile >> tag >> n[3] >> n[0] >> n[1] >> n[2]; [ + - ][ + - ] [ + - ] 88 [ + - ]: 24 : mesh.tetinpoel().push_back( n[0] ); 89 [ + - ]: 24 : mesh.tetinpoel().push_back( n[1] ); 90 [ + - ]: 24 : mesh.tetinpoel().push_back( n[2] ); 91 [ + - ]: 24 : mesh.tetinpoel().push_back( n[3] ); 92 : : } 93 : : 94 : : // Shift node IDs to start from zero 95 [ + - ]: 1 : shiftToZero( mesh.tetinpoel() ); 96 : : } 97 : : 98 : : // Read in number of triangles 99 [ + - ]: 1 : m_inFile >> nel; 100 [ + - ][ - + ]: 1 : if (!m_inFile.eof()) { 101 [ - - ][ - - ]: 0 : ErrChk( nel > 0, "Number of triangles (surface elements) must be greater " [ - - ][ - - ] 102 : : "than zero in file " + m_filename ); 103 : 0 : std::string s; 104 [ - - ]: 0 : getline( m_inFile, s ); // finish reading the last line 105 : : 106 : : // Read in triangle element tags and connectivity 107 [ - - ]: 0 : for (int i=0; i<nel; ++i) { 108 : : int tag; 109 : : std::array< std::size_t, 3 > n; 110 : : // tag n[1-3] 111 [ - - ][ - - ]: 0 : m_inFile >> tag >> n[0] >> n[1] >> n[2]; [ - - ][ - - ] 112 [ - - ]: 0 : mesh.triinpoel().push_back( n[0] ); 113 [ - - ]: 0 : mesh.triinpoel().push_back( n[1] ); 114 [ - - ]: 0 : mesh.triinpoel().push_back( n[2] ); 115 : : } 116 : : 117 : : // Shift node IDs to start from zero 118 [ - - ]: 0 : shiftToZero( mesh.triinpoel() ); 119 : : } 120 : 1 : }