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-2025 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 : 887 : void writeMesh( const std::vector< std::size_t >& inpoel,
56 : : const UnsMesh::Coords& coord ) const
57 : : {
58 : : if (nnode == 4)
59 [ + - ][ + - ]: 838 : writeMesh( tk::UnsMesh( inpoel, coord ) );
60 : : else if (nnode == 3)
61 [ + - ][ + - ]: 49 : writeMesh( tk::UnsMesh( coord, inpoel ) );
62 : 887 : }
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
|