Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/Main/WalkerPrint.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 Walker-specific pretty printer functionality
9 : : \details Walker-specific pretty printer functionality.
10 : : */
11 : : // *****************************************************************************
12 : : #ifndef WalkerPrint_h
13 : : #define WalkerPrint_h
14 : :
15 : : #include <functional>
16 : : #include <iostream>
17 : : #include <map>
18 : : #include <vector>
19 : : #include <string>
20 : : #include <utility>
21 : : #include <cstddef>
22 : :
23 : : #include <brigand/algorithms/for_each.hpp>
24 : :
25 : : #include "NoWarning/format.hpp"
26 : :
27 : : #include "Keywords.hpp"
28 : : #include "Print.hpp"
29 : : #include "Types.hpp"
30 : : #include "Tags.hpp"
31 : : #include "RNGPrint.hpp"
32 : : #include "ContainerUtil.hpp"
33 : : #include "Walker/Options/DiffEq.hpp"
34 : : #include "Walker/Options/InitPolicy.hpp"
35 : : #include "Walker/Options/CoeffPolicy.hpp"
36 : : #include "Walker/InputDeck/InputDeck.hpp"
37 : :
38 : : namespace tk { namespace ctr { struct Term; } }
39 : :
40 : : namespace walker {
41 : :
42 : : extern ctr::InputDeck g_inputdeck_defaults;
43 : : extern ctr::InputDeck g_inputdeck;
44 : :
45 : : //! WalkerPrint : tk::RNGPrint
46 : : class WalkerPrint : public tk::RNGPrint {
47 : :
48 : : public:
49 : : //! Constructor
50 : : //! \param[in] screen Screen output filename
51 : : //! \param[in,out] str Verbose stream
52 : : //! \param[in] mode Open mode for screen output file, see
53 : : //! http://en.cppreference.com/w/cpp/io/ios_base/openmode
54 : : //! \param[in,out] qstr Quiet stream
55 : : //! \see tk::RNGPrint::RNGPrint and tk::Print::Print
56 : 1978 : explicit WalkerPrint( const std::string& screen,
57 : : std::ostream& str = std::clog,
58 : : std::ios_base::openmode mode = std::ios_base::out,
59 : 1978 : std::ostream& qstr = std::cout ) :
60 : 1978 : RNGPrint( screen, str, mode, qstr ) {}
61 : :
62 : : //! Print section only if differs from its default
63 : : template< typename Option, typename... tags >
64 : : void Section() const {
65 : : if (g_inputdeck.get< tags... >() !=
66 : : g_inputdeck_defaults.get< tags... >() ) {
67 : : Option opt;
68 : : auto& group = opt.group();
69 : : auto& value = opt.name( g_inputdeck.get< tags... >() );
70 : : m_stream << m_section_title_value_fmt % m_section_indent
71 : : % m_section_bullet
72 : : % group
73 : : % value;
74 : : m_stream << m_section_underline_fmt
75 : : % m_section_indent
76 : : % std::string( m_section_indent.size() + 3 +
77 : : group.size() + value.size(), '-' );
78 : : }
79 : : }
80 : :
81 : : //! Print item: 'name : value' only if differs from its default
82 : : //! \param[in] name Name of item
83 : : template< typename... tags >
84 : : void Item( const std::string& name ) const {
85 : : if (g_inputdeck.get< tags... >() !=
86 : : g_inputdeck_defaults.get< tags... >() )
87 : : m_stream << m_item_name_value_fmt
88 : : % m_item_indent % name % g_inputdeck.get<tags...>();
89 : : }
90 : :
91 : : //! Print control option: 'group : option' only if differs from its default
92 : : template<typename Option, typename... tags>
93 : : void Item() const {
94 : : if (g_inputdeck.get< tags... >() !=
95 : : g_inputdeck_defaults.get< tags... >() ) {
96 : : Option opt;
97 : : m_stream << m_item_name_value_fmt
98 : : % m_item_indent % opt.group()
99 : : % opt.name( g_inputdeck.get< tags... >() );
100 : : }
101 : : }
102 : :
103 : : // Helper class for compact output of diff eq policies
104 : : class Policies {
105 : : public:
106 : : // Default constructor
107 : 1488 : explicit Policies() : init(), coef() {}
108 : : // Initializer constructor
109 : 19344 : explicit Policies( const std::string& i, const std::string& c ) :
110 [ + - ]: 19344 : init(i), coef(c) {}
111 : : // Operator += for adding up two Policies structs
112 : 19344 : Policies& operator+= ( const Policies& p ) {
113 : 19344 : init += p.init;
114 : 19344 : coef += p.coef;
115 : 19344 : return *this;
116 : : }
117 : : // Output unique policies to output stream
118 : 1488 : friend std::ostream& operator<< ( std::ostream& os, const Policies& p )
119 : : {
120 [ + - ]: 1488 : Policies copy( p ); // copy policies
121 [ + - ]: 1488 : copy.unique(); // get rid of duplicate policies
122 [ + - ][ + - ]: 1488 : os << "i:" << copy.init << ", c:" << copy.coef;
[ + - ][ + - ]
123 : 2976 : return os;
124 : : }
125 : :
126 : : private:
127 : : // Make all policies unique
128 : 1488 : void unique() {
129 : 1488 : tk::unique( init );
130 : 1488 : tk::unique( coef );
131 : 1488 : }
132 : :
133 : : std::string init;
134 : : std::string coef;
135 : : };
136 : :
137 : : //! Print equation list with policies
138 : : //! \param[in] t Section title
139 : : //! \param[in] factory Factory to get equation data from
140 : : //! \param[in] ntypes Unique equation types
141 : : template< class Factory >
142 : 93 : void eqlist( const std::string& t,
143 : : const Factory& factory,
144 : : std::size_t ntypes ) const
145 : : {
146 [ + - ]: 93 : if (!factory.empty()) {
147 [ + - ]: 93 : section( t );
148 [ + - ][ + - ]: 93 : item( "Unique equation types", ntypes );
149 [ + - ][ + - ]: 93 : item( "With all policy combinations", factory.size() );
150 [ + - ]: 93 : raw( '\n' );
151 [ + - ][ + - ]: 93 : raw( m_item_indent + "Legend: equation name : supported policies\n" );
152 [ + - ]: 93 : raw( '\n' );
153 [ + - ][ + - ]: 93 : raw( m_item_indent + "Policy codes:\n" );
154 : : static_assert( tk::HasTypedef_code_v< kw::init::info >,
155 : : "Policy code undefined for keyword" );
156 : : static_assert( tk::HasTypedef_code_v< kw::coeff::info >,
157 : : "Policy code undefined for keyword" );
158 [ + - ][ + - ]: 279 : raw( m_item_indent + " * " + *kw::init::code() + ": "
[ + - ][ + - ]
[ + - ]
159 [ + - ][ + - ]: 372 : + kw::init::name() + ":\n" );
[ + - ]
160 [ + - ]: 93 : brigand::for_each< ctr::InitPolicy::keywords >( echoPolicies(this) );
161 [ + - ][ + - ]: 279 : raw( m_item_indent + " * " + *kw::coeff::code() + ": "
[ + - ][ + - ]
[ + - ]
162 [ + - ][ + - ]: 372 : + kw::coeff::name() + ":\n" );
[ + - ]
163 [ + - ]: 93 : brigand::for_each< ctr::CoeffPolicy::keywords >( echoPolicies(this) );
164 [ + - ]: 93 : raw( '\n' );
165 : : // extract eqname and supported policies
166 [ + - ]: 186 : const auto ip = ctr::InitPolicy();
167 [ + - ]: 186 : const auto cp = ctr::CoeffPolicy();
168 : 186 : std::map< std::string, Policies > eqs; // eqname : policies
169 [ + + ]: 19437 : for (const auto& f : factory)
170 [ + - ][ + - ]: 19344 : eqs[ DiffEqName( f.first ) ] +=
[ + - ]
171 [ + - ][ + - ]: 38688 : Policies( ip.code( f.first.template get< tag::initpolicy >() ),
[ + - ]
172 : 19344 : cp.code( f.first.template get< tag::coeffpolicy >() ) );
173 : : // output eqname and supported policies
174 [ + + ]: 1581 : for (const auto& e : eqs)
175 : 4464 : m_stream << m_item_name_value_fmt % m_item_indent
176 [ + - ][ + - ]: 1488 : % e.first % e.second;
[ + - ][ + - ]
177 : : }
178 : 93 : }
179 : :
180 : : //! Print time integration header
181 : : void inthead( const std::string& t, const std::string& name,
182 : : const std::string& legend, const std::string& head ) const;
183 : :
184 : : //! Print statistics and PDFs
185 : : void statistics( const std::string& t ) const;
186 : :
187 : : //! Print configuration of a stack of differential equations
188 : : void diffeqs( const std::string& t,
189 : : const std::vector< std::vector< std::pair< std::string, std::string > > >&
190 : : info ) const;
191 : :
192 : : private:
193 : : //! Return differential equation name
194 : : //! \param[in] key Equation key
195 : : //! \return Differential equation name based on key
196 : : template< class Key >
197 : 19344 : std::string DiffEqName ( const Key& key ) const
198 [ + - ][ + - ]: 38688 : { return ctr::DiffEq().name( key.template get< tag::diffeq >() ); }
199 : :
200 : : //! Echo statistics container contents if differs from default
201 : : void stats( const std::string& msg ) const;
202 : :
203 : : //! Echo pdfs container contents if differs from default applying op
204 : : void pdfs( const std::string& msg,
205 : : std::function<
206 : : std::ostream& ( std::ostream&,
207 : : const std::vector< tk::ctr::Term >&,
208 : : const std::vector< tk::real >&,
209 : : const std::string&,
210 : : const std::vector< tk::real >& ) > op ) const;
211 : : };
212 : :
213 : : } // walker::
214 : :
215 : : #endif // WalkerPrint_h
|