Branch data Line data Source code
1 : : // ***************************************************************************** 2 : : /*! 3 : : \file src/Main/InciterPrint.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 Inciter-specific pretty printer functionality 9 : : \details Inciter-specific pretty printer functionality. 10 : : */ 11 : : // ***************************************************************************** 12 : : 13 : : #include <regex> 14 : : 15 : : #include <brigand/algorithms/for_each.hpp> 16 : : 17 : : #include "CGPDE.hpp" 18 : : #include "InciterPrint.hpp" 19 : : #include "Transfer.hpp" 20 : : 21 : : using inciter::InciterPrint; 22 : : 23 : : namespace inciter { 24 : : 25 : : extern std::vector< CGPDE > g_cgpde; 26 : : 27 : : } // inciter:: 28 : : 29 : : void 30 : 233 : InciterPrint::inthead( const std::string& t, 31 : : const std::string& name, 32 : : const std::string& legend, 33 : : const std::string& head ) const 34 : : // ***************************************************************************** 35 : : // Print time integration header 36 : : //! \param[in] t Section title 37 : : //! \param[in] name Section name 38 : : //! \param[in] legend Legend to print 39 : : //! \param[in] head Head to append 40 : : // ***************************************************************************** 41 : : { 42 [ + - ]: 233 : section( t, name ); 43 [ + - ]: 233 : std::string l( legend ); 44 [ + - ][ + - ]: 233 : l = std::regex_replace( l, std::regex("\n"), "\n" + m_item_indent ); [ + - ] 45 [ + - ][ + - ]: 233 : raw( m_item_indent + l + head ); [ + - ] 46 : 233 : } 47 : : 48 : : void 49 : 233 : InciterPrint::pdes( const std::string& t, const std::vector< std::vector< 50 : : std::pair< std::string, std::string > > >& info ) const 51 : : // ***************************************************************************** 52 : : // Print configuration of a stack of partial differential equations 53 : : //! \param[in] t Title to use 54 : : //! \param[in] info Info vector to use 55 : : // ***************************************************************************** 56 : : { 57 [ + - ]: 233 : if ( !info.empty() ) { 58 [ + - ]: 466 : std::stringstream ss; 59 [ + - ][ + - ]: 233 : ss << t << " (" << g_cgpde.size() << ")"; [ + - ][ + - ] 60 [ + - ][ + - ]: 233 : section( ss.str() ); 61 [ + + ]: 466 : for (std::size_t e=0; e<info.size(); ++e) { 62 [ + - ]: 233 : subsection( info[e][0].first ); 63 [ + + ]: 2518 : for (std::size_t l=1; l<info[e].size(); ++l) 64 : 6855 : m_stream << m_item_name_value_fmt % m_item_indent 65 [ + - ][ + - ]: 2285 : % info[e][l].first % info[e][l].second; [ + - ][ + - ] 66 [ - + ][ - - ]: 233 : if (e < info.size()-1) endsubsection(); 67 : : } 68 : : } 69 : 233 : } 70 : : 71 : : void 72 : 233 : InciterPrint::couple( const std::vector< Transfer >& transfer, 73 : : const std::vector< char >& depvar ) const 74 : : // ***************************************************************************** 75 : : // Print out info on solver coupling 76 : : //! \param[in] transfer List of solution transfer steps, describing coupling 77 : : //! \param[in] depvar List of dependent variables assigned to solvers 78 : : // ***************************************************************************** 79 : : { 80 [ - + ]: 233 : if (!transfer.empty()) { 81 : : 82 [ - - ]: 0 : endsubsection(); 83 [ - - ][ - - ]: 0 : subsection( "Solver coupling" ); 84 [ - - ]: 0 : std::stringstream steps; 85 : 0 : std::map< char, std::vector< char > > src, dst; 86 : : 87 [ - - ]: 0 : for (const auto& t : transfer) { 88 : 0 : auto sd = depvar[t.src]; 89 : 0 : auto dd = depvar[t.dst]; 90 [ - - ][ - - ]: 0 : steps << sd << '>' << dd << ' '; [ - - ][ - - ] 91 [ - - ][ - - ]: 0 : src[ sd ].push_back( dd ); 92 [ - - ][ - - ]: 0 : dst[ dd ].push_back( sd ); 93 : : } 94 : : 95 [ - - ][ - - ]: 0 : item( "Transfer steps (" + std::to_string(transfer.size()) + ')', [ - - ][ - - ] 96 [ - - ]: 0 : steps.str() ); 97 : : 98 [ - - ]: 0 : for (const auto& [s,m] : src) { 99 [ - - ]: 0 : std::stringstream name; 100 [ - - ][ - - ]: 0 : name << "Solver " << s << " is source to"; [ - - ] 101 [ - - ][ - - ]: 0 : item( name.str(), tk::parameters(m) ); [ - - ] 102 : : } 103 : : 104 [ - - ]: 0 : for (const auto& [d,m] : dst) { 105 [ - - ]: 0 : std::stringstream name; 106 [ - - ][ - - ]: 0 : name << "Solver " << d << " is destination to"; [ - - ] 107 [ - - ][ - - ]: 0 : item( name.str(), tk::parameters(m) ); [ - - ] 108 : : } 109 : : 110 : : } 111 : 233 : } 112 : : 113 : 42 : void InciterPrint::refvar( const std::vector< std::string >& rvar, 114 : : const std::vector< std::size_t >& refidx ) const 115 : : // ***************************************************************************** 116 : : // Print mesh refinement variables and their indices in the unknown vector 117 : : //! \param[in] rvar Refinement variable name list 118 : : //! \param[in] refidx Refinement variable index (location in data array) list 119 : : // ***************************************************************************** 120 : : { 121 [ - + ][ - - ]: 42 : Assert( rvar.size() == refidx.size(), "Size mismatch" ); [ - - ][ - - ] 122 : : 123 [ + + ]: 42 : if (rvar.empty()) return; 124 : : 125 : 66 : std::string c; 126 [ + + ]: 66 : for (std::size_t i=0; i<rvar.size(); ++i) 127 [ + - ][ + - ]: 33 : c += rvar[i] + '[' + std::to_string(refidx[i]) + "] "; [ + - ][ + - ] [ + - ] 128 [ + - ][ + - ]: 66 : auto name = kw::amr_refvar::name() + " & id(s)"; 129 [ + - ][ + - ]: 33 : name[0] = static_cast< char >( std::toupper( name[0] ) ); 130 [ + - ]: 33 : item( name, c ); 131 : : } 132 : : 133 : 25 : void InciterPrint::edgeref( const std::vector< std::size_t >& edgenodes ) const 134 : : // ***************************************************************************** 135 : : // Print initial mesh refinement edge-node pairs 136 : : // ***************************************************************************** 137 : : { 138 [ + - ]: 25 : if (edgenodes.empty()) return; 139 : : 140 : 0 : std::string c; 141 [ - - ][ - - ]: 0 : for (auto i : edgenodes) c += std::to_string(i) + ' '; [ - - ][ - - ] 142 [ - - ]: 0 : auto name = kw::amr_edgelist::name(); 143 [ - - ][ - - ]: 0 : name[0] = static_cast< char >( std::toupper( name[0] ) ); 144 [ - - ]: 0 : item( name, c ); 145 : : }