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