Branch data Line data Source code
1 : : // ***************************************************************************** 2 : : /*! 3 : : \file src/IO/ExodusIIMeshWriter.hpp 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 ExodusII mesh-based data writer 9 : : \details ExodusII mesh-based data writer class declaration. 10 : : */ 11 : : // ***************************************************************************** 12 : : #ifndef ExodusIIMeshWriter_h 13 : : #define ExodusIIMeshWriter_h 14 : : 15 : : #include <cstddef> 16 : : #include <iosfwd> 17 : : #include <vector> 18 : : #include <map> 19 : : 20 : : #include "Types.hpp" 21 : : #include "UnsMesh.hpp" 22 : : 23 : : namespace tk { 24 : : 25 : : class UnsMesh; 26 : : 27 : : //! ExodusII writer constructor modes 28 : : enum class ExoWriter { CREATE, OPEN }; 29 : : 30 : : //! ExodusII mesh-based data writer 31 : : //! \details Mesh writer class facilitating writing a mesh and associated 32 : : //! mesh-based field data to a file in ExodusII format. 33 : : //! \see http://sourceforge.net/projects/exodusii 34 : : class ExodusIIMeshWriter { 35 : : 36 : : public: 37 : : //! Constructor: create/open ExodusII file 38 : : explicit ExodusIIMeshWriter( const std::string& filename, 39 : : ExoWriter mode, 40 : : int cpuwordsize = sizeof(double), 41 : : int iowordsize = sizeof(double) ); 42 : : 43 : : //! Destructor 44 : : ~ExodusIIMeshWriter() noexcept; 45 : : 46 : : //! Write ExodusII mesh file taking a tk::UnsMesh object 47 : : void writeMesh( const UnsMesh& mesh ) const; 48 : : 49 : : //! Write ExodusII mesh file taking inputs to a tk::UnsMesh object 50 : : void writeMesh( const std::vector< std::size_t >& tetinp, 51 : : const UnsMesh::Coords& coord, 52 : : const std::map< int, std::vector< std::size_t > >& bface, 53 : : const std::vector< std::size_t >& triinp ) const; 54 : : 55 : : //! Write ExodusII mesh file taking inputs to a tk::UnsMesh object 56 : : void writeMesh( const std::vector< std::size_t >& tetinp, 57 : : const UnsMesh::Coords& coord, 58 : : const std::map< int, std::vector< std::size_t > >& bnode ) 59 : : const; 60 : : 61 : : //! Write ExodusII mesh file taking inputs to a tk::UnsMesh object 62 : : //! \tparam nnode 3 or 4, indicating a triangle or tetrahedron mesh 63 : : //! \param[in] inpoel Element connectivity 64 : : //! \param[in] coord Node coordinates 65 : : template< std::size_t nnode > 66 : 894 : void writeMesh( const std::vector< std::size_t >& inpoel, 67 : : const UnsMesh::Coords& coord ) const 68 : : { 69 : : if (nnode == 4) 70 [ + - ]: 882 : writeMesh( tk::UnsMesh( inpoel, coord ) ); 71 : : else if (nnode == 3) 72 [ + - ][ + - ]: 12 : writeMesh( tk::UnsMesh( coord, inpoel ) ); 73 : 894 : } 74 : : 75 : : //! Write time stamp to ExodusII file 76 : : void writeTimeStamp( uint64_t it, tk::real time ) const; 77 : : 78 : : //! Write time values to ExodusII file 79 : : void writeTimeValues( const std::vector< tk::real >& tv ) const; 80 : : 81 : : //! Write the names of nodal output variables to ExodusII file 82 : : void writeNodeVarNames( const std::vector< std::string >& nv ) const; 83 : : 84 : : //! Write the names of element output variables to ExodusII file 85 : : void writeElemVarNames( const std::vector< std::string >& ev ) const; 86 : : 87 : : //! \brief Write multiple node scalar fields to ExodusII file at multiple 88 : : //! time steps 89 : : void writeNodeScalars( 90 : : const std::vector< std::vector< std::vector< tk::real > > >& var ) const; 91 : : 92 : : //! Write node scalar field to ExodusII file 93 : : void writeNodeScalar( uint64_t it, 94 : : int varid, 95 : : const std::vector< tk::real >& var ) const; 96 : : 97 : : //! \brief Write multiple element scalar fields to ExodusII file at multiple 98 : : //! time steps 99 : : void writeElemScalars( 100 : : const std::vector< std::vector< std::vector< tk::real > > >& var ) const; 101 : : 102 : : //! Write elem scalar field to ExodusII file 103 : : void writeElemScalar( uint64_t it, 104 : : int varid, 105 : : const std::vector< tk::real >& var ) const; 106 : : 107 : : //! Write header without mesh, function overloading 108 : : void writeHeader( const char* title, int64_t ndim, int64_t nnodes, 109 : : int64_t nelem, int64_t nblk, int64_t node_set, 110 : : int64_t side_set ) const; 111 : : 112 : : //! Write nodes without mesh, function overloading. 113 : : void writeNodes( const std::vector< tk::real >& x, 114 : : const std::vector< tk::real >& y, 115 : : const std::vector< tk::real >& z ) const; 116 : : 117 : : //! Write element block to ExodusII file 118 : : void writeElemBlock( int& elclass, 119 : : int64_t nnpe, 120 : : const std::string& eltype, 121 : : const std::vector< std::size_t >& inpoel ) const; 122 : : 123 : : private: 124 : : //! Write ExodusII header 125 : : void writeHeader( const UnsMesh& mesh ) const; 126 : : 127 : : //! Write nodes coordinates to ExodusII file 128 : : void writeNodes( const UnsMesh& mesh ) const; 129 : : 130 : : //! Write element conectivity to ExodusII file 131 : : void writeElements( const UnsMesh& mesh ) const; 132 : : 133 : : //! Write side sets and their face connectivity to ExodusII file 134 : : void writeSidesets( const UnsMesh& mesh ) const; 135 : : 136 : : //! Write side sets and their node list to ExodusII file 137 : : void writeNodesets( const UnsMesh& mesh ) const; 138 : : 139 : : const std::string m_filename; //!< File name 140 : : int m_outFile; //!< ExodusII file handle 141 : : }; 142 : : 143 : : } // tk:: 144 : : 145 : : #endif // ExodusIIMeshWriter_h