Walker test code coverage report
Current view: top level - Main - WalkerPrint.hpp (source / functions) Hit Total Coverage
Commit: test_coverage.info Lines: 48 48 100.0 %
Date: 2022-09-21 18:57:21 Functions: 8 8 100.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 56 108 51.9 %

           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

Generated by: LCOV version 1.14