Branch data Line data Source code
1 : : // ***************************************************************************** 2 : : /*! 3 : : \file src/Main/RNGTestDriver.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 Random number generator test suite driver 9 : : \details Random number generator test suite driver. 10 : : */ 11 : : // ***************************************************************************** 12 : : 13 : : #include "Tags.hpp" 14 : : #include "Exception.hpp" 15 : : #include "Factory.hpp" 16 : : #include "Battery.hpp" 17 : : #include "TestU01Suite.hpp" 18 : : #include "RNGTestPrint.hpp" 19 : : #include "RNGTestDriver.hpp" 20 : : #include "RNGTest/InputDeck/InputDeck.hpp" 21 : : #include "RNGTest/InputDeck/Parser.hpp" 22 : : #include "TaggedTupleDeepPrint.hpp" 23 : : #include "Writer.hpp" 24 : : 25 : : namespace rngtest { 26 : : 27 : : extern ctr::InputDeck g_inputdeck; 28 : : extern ctr::InputDeck g_inputdeck_defaults; 29 : : 30 : : } // rngtest:: 31 : : 32 : : using rngtest::RNGTestDriver; 33 : : 34 : 4 : RNGTestDriver::RNGTestDriver( const ctr::CmdLine& cmdline, int nrestart ) : 35 : 8 : m_print( cmdline.logname( 36 : 4 : g_inputdeck_defaults.get< tag::cmd, tag::io, tag::screen >(), 37 : : nrestart ), 38 : 8 : cmdline.get< tag::verbose >() ? std::cout : std::clog, 39 [ + - ][ + - ]: 8 : std::ios_base::app ) 40 : : // ***************************************************************************** 41 : : // Constructor 42 : : //! \param[in] cmdline Command line object storing data parsed from the command 43 : : //! line arguments 44 : : //! \param[in] nrestart Number of times restarted 45 : : // ***************************************************************************** 46 : : { 47 : : // All global-scope data to be migrated to all PEs initialized here 48 : : 49 : : // Parse input deck into g_inputdeck 50 [ + - ][ + - ]: 4 : m_print.item( "Control file", cmdline.get< tag::io, tag::control >() ); 51 [ + - ]: 8 : InputDeckParser inputdeckParser( m_print, cmdline, g_inputdeck ); 52 [ + - ][ + - ]: 4 : m_print.item( "Parsed control file", "success" ); 53 : : 54 [ + - ]: 4 : m_print.endpart(); 55 : : 56 : : // Output input deck object to file 57 [ + - ][ + - ]: 8 : auto logfilename = tk::rngtest_executable() + "_input.log"; 58 [ + - ]: 4 : tk::Writer log( logfilename ); 59 [ + - ][ + - ]: 4 : tk::print( log.stream(), "inputdeck", g_inputdeck ); 60 : 4 : } 61 : : 62 : : void 63 : 4 : RNGTestDriver::execute() const 64 : : // ***************************************************************************** 65 : : // Run battery 66 : : // ***************************************************************************** 67 : : { 68 [ + - ][ + - ]: 4 : m_print.part( "Factory" ); 69 : : 70 : : // Register batteries 71 : 8 : BatteryFactory bf; 72 : : using ctr::BatteryType; 73 : : // Note that TestU01Suite constructors take the BatteryType (enum class) 74 : : // value as their argument, which happens to be the same as the key in the 75 : : // factory - hence the double-specification of the battery type below. 76 : : // Record all into a factory passing the last 0 means instantiate on PE 0. 77 : : tk::recordCharmModel< Battery, TestU01Suite > 78 [ + - ]: 4 : ( bf, BatteryType::SMALLCRUSH, BatteryType::SMALLCRUSH, 0 ); 79 : : tk::recordCharmModel< Battery, TestU01Suite > 80 [ + - ]: 4 : ( bf, BatteryType::CRUSH, BatteryType::CRUSH, 0 ); 81 : : tk::recordCharmModel< Battery, TestU01Suite > 82 [ + - ]: 4 : ( bf, BatteryType::BIGCRUSH, BatteryType::BIGCRUSH, 0 ); 83 [ + - ][ + - ]: 4 : m_print.list< ctr::Battery >( "Registered batteries", bf ); 84 [ + - ]: 4 : m_print.endpart(); 85 : : 86 [ + - ][ + - ]: 4 : m_print.part( "Problem" ); 87 [ + - ]: 4 : if ( !g_inputdeck.get< tag::title >().empty() ) 88 [ + - ]: 4 : m_print.title( g_inputdeck.get< tag::title >() ); 89 : : 90 : : // Instantiate and run battery 91 [ + - ]: 4 : const auto s = bf.find( g_inputdeck.get< tag::selected, tag::battery >() ); 92 [ + - ]: 4 : if (s != end(bf)) { 93 [ + - ]: 4 : s->second(); 94 [ - - ][ - - ]: 0 : } else Throw( "Battery not found in factory" ); [ - - ] 95 : 4 : }