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 : : }
|