Branch data Line data Source code
1 : : // ***************************************************************************** 2 : : /*! 3 : : \file src/Control/Inciter/OutVar.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 Types and associated functions to deal with output variables 9 : : \details Types and associated functions to deal with output variables. 10 : : */ 11 : : // ***************************************************************************** 12 : : #ifndef OutVar_h 13 : : #define OutVar_h 14 : : 15 : : #include "Types.hpp" 16 : : #include "Centering.hpp" 17 : : 18 : : namespace inciter { 19 : : namespace ctr { 20 : : 21 : : //! Output variable 22 : : struct OutVar { 23 : : using Centering = tk::Centering; 24 : : 25 : : Centering centering; //!< Centering 26 : : std::string name; //!< Human readable name 27 : : std::string alias; //!< user specified alias to the name 28 : : tk::ncomp_t field; //!< Field ID 29 : : std::string varFnIdx; //!< Material-based physics label + material id 30 : : 31 : : //! Constructor: initialize all state data 32 : : //! \param[in] n Human readable name 33 : : //! \param[in] f Field ID 34 : : //! \param[in] c Variable centering 35 : : //! \param[in] vn Var function name 36 : 1520 : explicit OutVar( Centering c = Centering::NODE, 37 : : const std::string& n = {}, 38 : : const std::string& a = "", 39 : : tk::ncomp_t f = 0, 40 : 1520 : const std::string& vn = "null" ) : 41 [ + - ][ + - ]: 4560 : centering(c), name(n), alias(a), field(f), varFnIdx(vn) {} 42 : : 43 : : /** @name Pack/Unpack: Serialize OutVar object for Charm++ */ 44 : : ///@{ 45 : : //! Pack/Unpack serialize member function 46 : : //! \param[in,out] p Charm++'s PUP::er serializer object reference 47 : 2718 : void pup( PUP::er& p ) { 48 : 2718 : p | centering; 49 : 2718 : p | name; 50 : 2718 : p | alias; 51 : 2718 : p | field; 52 : 2718 : p | varFnIdx; 53 : 2718 : } 54 : : //! Pack/Unpack serialize operator| 55 : : //! \param[in,out] p Charm++'s PUP::er serializer object reference 56 : : //! \param[in,out] v OutVar object reference 57 [ + - ]: 2718 : friend void operator|( PUP::er& p, OutVar& v ) { v.pup(p); } 58 : : ///@} 59 : : 60 : : //! Query if outvar is a request for an analytic solution 61 : : //! \return True if outvar is a request for an analytic solution 62 : 65796 : bool analytic() const { return name.find("analytic") != std::string::npos; } 63 : : 64 : : //! Query if outvar is a request for a (multimat) primitive variable 65 : : //! \return True if outvar should be extracted from primitive variable data 66 : : //! \see deck::inciter::multimatvars 67 : 13669 : bool primitive() const { 68 : : bool is_prim(false); 69 : : 70 [ + + ]: 25411 : if (varFnIdx.find("pressure") != std::string::npos || 71 [ + + ][ + - ]: 19694 : varFnIdx.find("velocity") != std::string::npos || 72 : : varFnIdx.find("stress") != std::string::npos ) 73 : : { is_prim = true; } 74 [ + + ][ + - ]: 8196 : else if ( name.length() == 2 && 75 [ + - ]: 4342 : (name.find('u') != std::string::npos || 76 [ + - ]: 4342 : name.find('U') != std::string::npos || 77 [ - + ]: 4342 : name.find('p') != std::string::npos || 78 : 2171 : name.find('P') != std::string::npos) ) 79 : : { is_prim = true; } 80 : : 81 : 13669 : return is_prim; 82 : : } 83 : : }; 84 : : 85 : : //! \brief Pack/Unpack: Namespace-scope serialize OutVar object for Charm++ 86 : : //! \param[in,out] p Charm++'s PUP::er serializer object reference 87 : : //! \param[in,out] v OutVar object reference 88 : : inline void pup( PUP::er& p, OutVar& v ) { v.pup(p); } 89 : : 90 : : #if defined(__clang__) 91 : : #pragma clang diagnostic push 92 : : #pragma clang diagnostic ignored "-Wunused-function" 93 : : #endif 94 : : 95 : : //! Operator << for writing OutVar to output streams 96 : : //! \param[in,out] os Output stream to write to 97 : : //! \param[in] outvar OutVar to write 98 : : //! \return Updated output stream 99 [ - + ]: 608 : static std::ostream& operator<< ( std::ostream& os, const OutVar& outvar ) { 100 [ - + ]: 608 : if (outvar.name.empty()) 101 : 0 : os << outvar.field+1; 102 : : else 103 : : os << outvar.name; 104 : 608 : return os; 105 : : } 106 : : 107 : : #if defined(__clang__) 108 : : #pragma clang diagnostic pop 109 : : #endif 110 : : 111 : : } // ctr:: 112 : : } // inciter:: 113 : : 114 : : #endif // OutVar_h