Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/Main/WalkerPrint.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 Walker-specific pretty printer functionality
9 : : \details Walker-specific pretty printer functionality.
10 : : */
11 : : // *****************************************************************************
12 : :
13 : : #include <regex>
14 : :
15 : : #include "Exception.hpp"
16 : : #include "Tags.hpp"
17 : : #include "StatCtr.hpp"
18 : : #include "WalkerPrint.hpp"
19 : : #include "DiffEq.hpp"
20 : : #include "Options/PDFCentering.hpp"
21 : : #include "Options/PDFFile.hpp"
22 : : #include "Options/PDFPolicy.hpp"
23 : : #include "Options/TxtFloatFormat.hpp"
24 : :
25 : : using walker::WalkerPrint;
26 : :
27 : : namespace walker {
28 : :
29 : : extern std::vector< DiffEq > g_diffeqs;
30 : :
31 : : } // walker::
32 : :
33 : : void
34 : 74 : WalkerPrint::inthead( const std::string& t,
35 : : const std::string& name,
36 : : const std::string& legend,
37 : : const std::string& head ) const
38 : : // *****************************************************************************
39 : : // Print time integration header
40 : : //! \param[in] t Section title
41 : : //! \param[in] name Section name
42 : : //! \param[in] legend Legend to print
43 : : //! \param[in] head Head to append
44 : : // *****************************************************************************
45 : : {
46 [ + - ]: 74 : section( t, name );
47 [ + - ]: 74 : std::string l( legend );
48 [ + - ][ + - ]: 74 : l = std::regex_replace( l, std::regex("\n"), "\n" + m_item_indent );
[ + - ]
49 [ + - ][ + - ]: 74 : raw( m_item_indent + l + head );
[ + - ]
50 : 74 : }
51 : :
52 : : void
53 : 74 : WalkerPrint::statistics( const std::string& t ) const
54 : : // *****************************************************************************
55 : : // Print statistics and PDFs
56 : : //! \param[in] t Section title
57 : : // *****************************************************************************
58 : : {
59 [ + + ][ + - ]: 76 : if ( !g_inputdeck.get< tag::stat >().empty() ||
60 [ + - ]: 2 : !g_inputdeck.get< tag::pdf >().empty() )
61 : : {
62 : 74 : section( t );
63 [ + - ][ + - ]: 74 : stats( "Estimated statistical moments" );
64 [ + - ][ + - ]: 74 : pdfs( "Estimated PDFs", tk::ctr::pdf );
65 : : }
66 : 74 : }
67 : :
68 : : void
69 : 74 : WalkerPrint::diffeqs( const std::string& t, const std::vector< std::vector<
70 : : std::pair< std::string, std::string > > >& info ) const
71 : : // *****************************************************************************
72 : : // Print configuration of a stack of differential equations
73 : : //! \param[in] t Title to use
74 : : //! \param[in] info Info vector to use
75 : : // *****************************************************************************
76 : : {
77 [ + - ]: 74 : if ( !info.empty() ) {
78 [ + - ]: 148 : std::stringstream ss;
79 [ + - ][ + - ]: 74 : ss << t << " (" << g_diffeqs.size() << ")";
[ + - ][ + - ]
80 [ + - ][ + - ]: 74 : section( ss.str() );
81 [ + + ]: 160 : for (std::size_t e=0; e<info.size(); ++e) {
82 [ + - ]: 86 : subsection( info[e][0].first );
83 [ + + ]: 1056 : for (std::size_t l=1; l<info[e].size(); ++l)
84 : 2910 : m_stream << m_item_name_value_fmt % m_item_indent
85 [ + - ][ + - ]: 970 : % info[e][l].first % info[e][l].second;
[ + - ][ + - ]
86 [ + + ][ + - ]: 86 : if (e < info.size()-1) endsubsection();
87 : : }
88 : : }
89 : 74 : }
90 : :
91 : : void
92 : 74 : WalkerPrint::stats( const std::string& msg ) const
93 : : // *****************************************************************************
94 : : // Echo statistics container contents if differs from default
95 : : //! \param[in] msg Message to print
96 : : // *****************************************************************************
97 : : {
98 [ - + ][ - - ]: 74 : Assert( !msg.empty(), "Empty message size in WalkerPrint::stats()." );
[ - - ][ - - ]
99 : 74 : const auto& c = g_inputdeck.get< tag::stat >();
100 : :
101 [ + + ][ + - ]: 74 : if (!c.empty() && c != g_inputdeck_defaults.get< tag::stat >()) {
[ + - ][ + + ]
102 [ + - ][ + - ]: 72 : m_stream << m_item_name_fmt % m_item_indent % msg;
[ + - ]
103 [ + + ][ + - ]: 1316 : for (const auto& v : c) m_stream << v << ' ';
[ + - ]
104 [ + - ]: 72 : m_stream << '\n';
105 : : }
106 : :
107 : : // Output options and settings affecting statistics output
108 [ + - ]: 74 : tk::ctr::TxtFloatFormat fl;
109 [ + - ][ + - ]: 74 : item( "Stats " + fl.group(),
110 [ + - ]: 74 : fl.name( g_inputdeck.get< tag::flformat, tag::stat >() ) );
111 [ + - ][ + - ]: 74 : item( "Stats text precision, digits",
112 : 74 : g_inputdeck.get< tag::prec, tag::stat >() );
113 : 74 : }
114 : :
115 : : void
116 : 74 : WalkerPrint::pdfs( const std::string& msg,
117 : : std::function<
118 : : std::ostream& ( std::ostream&,
119 : : const std::vector< tk::ctr::Term >&,
120 : : const std::vector< tk::real >&,
121 : : const std::string&,
122 : : const std::vector< tk::real >& ext ) > op )
123 : : const
124 : : // *****************************************************************************
125 : : // Echo pdfs container contents if differs from default applying op.
126 : : //! \param[in] msg Message to print
127 : : //! \param[in] op Functor to use
128 : : //! \details See src/Control/StatCtr.h for the definition of functions that may
129 : : //! be passed in as op. Currently, the only example is tk::ctr::pdf.
130 : : // *****************************************************************************
131 : : {
132 [ - + ][ - - ]: 74 : Assert( !msg.empty(), "Empty message size in WalkerPrint::vec()." );
[ - - ][ - - ]
133 : :
134 : 74 : const auto& c = g_inputdeck.get< tag::pdf >();
135 : 74 : const auto& b = g_inputdeck.get< tag::discr, tag::binsize >();
136 : 74 : const auto& n = g_inputdeck.get< tag::cmd, tag::io, tag::pdfnames >();
137 : 74 : const auto& x = g_inputdeck.get< tag::discr, tag::extent >();
138 : :
139 [ + - ][ + - ]: 74 : Assert( (c.size() == b.size()) &&
[ + - ][ - - ]
[ - - ][ - - ]
140 : : (c.size() == n.size()) &&
141 : : (c.size() == x.size()),
142 : : "Number of PDFs, number of binsizes vector, number of PDF names, and "
143 : : "number of extents vector must all equal in WalkerPrint::pdfs()." );
144 : :
145 [ + + ][ + - ]: 74 : if (!c.empty() && c != g_inputdeck_defaults.get< tag::pdf >()) {
[ + + ]
146 : 13 : m_stream << m_item_name_fmt % m_item_indent % msg;
147 [ + + ]: 35 : for (std::size_t i=0; i<c.size(); ++i) {
148 : 22 : op( m_stream, c[i], b[i], n[i], x[i] );
149 : : }
150 : 13 : m_stream << '\n';
151 : : }
152 : :
153 : : // Output options and settings affecting PDF output
154 [ + + ]: 74 : if (!c.empty()) {
155 [ + - ]: 26 : tk::ctr::PDFFile f;
156 [ + - ]: 13 : item( f.group(),
157 [ + - ]: 13 : f.name( g_inputdeck.get< tag::selected, tag::filetype >() ) );
158 [ + - ]: 26 : tk::ctr::PDFPolicy p;
159 [ + - ]: 13 : item( p.group(),
160 [ + - ]: 13 : p.name( g_inputdeck.get< tag::selected, tag::pdfpolicy >() ) );
161 [ + - ]: 26 : tk::ctr::PDFCentering e;
162 [ + - ]: 13 : item( e.group(),
163 [ + - ]: 13 : e.name( g_inputdeck.get< tag::selected, tag::pdfctr >() ) );
164 [ + - ]: 13 : tk::ctr::TxtFloatFormat fl;
165 [ + - ][ + - ]: 13 : item( "PDF text " + fl.group(),
166 [ + - ]: 13 : fl.name( g_inputdeck.get< tag::flformat, tag::pdf >() ) );
167 [ + - ][ + - ]: 13 : item( "PDF text precision, digits",
168 : 13 : g_inputdeck.get< tag::prec, tag::pdf >() );
169 : : }
170 : 74 : }
|