Branch data Line data Source code
1 : : // ***************************************************************************** 2 : : /*! 3 : : \file src/DiffEq/Position/ConfigurePosition.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 Register and compile configuration on the position SDE 9 : : \details Register and compile configuration on the position SDE. 10 : : */ 11 : : // ***************************************************************************** 12 : : 13 : : #include <set> 14 : : #include <map> 15 : : #include <vector> 16 : : #include <string> 17 : : #include <utility> 18 : : 19 : : #include <brigand/algorithms/for_each.hpp> 20 : : 21 : : #include "Tags.hpp" 22 : : #include "CartesianProduct.hpp" 23 : : #include "DiffEqFactory.hpp" 24 : : #include "Walker/Options/DiffEq.hpp" 25 : : #include "Walker/Options/InitPolicy.hpp" 26 : : 27 : : #include "ConfigurePosition.hpp" 28 : : #include "Position.hpp" 29 : : #include "PositionCoeffPolicy.hpp" 30 : : 31 : : #include "CoupledEq.hpp" 32 : : 33 : : namespace walker { 34 : : 35 : : void 36 : 323 : registerPosition( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ) 37 : : // ***************************************************************************** 38 : : // Register position SDE into DiffEq factory 39 : : //! \param[in,out] f Differential equation factory to register to 40 : : //! \param[in,out] t Counters for equation types registered 41 : : // ***************************************************************************** 42 : : { 43 : : // Construct vector of vectors for all possible policies for equation 44 : : using PositionPolicies = 45 : : tk::cartesian_product< InitPolicies, PositionCoeffPolicies >; 46 : : // Register SDE for all combinations of policies 47 : : brigand::for_each< PositionPolicies >( 48 : 323 : registerDiffEq< Position >( f, ctr::DiffEqType::POSITION, t ) ); 49 : 323 : } 50 : : 51 : : std::vector< std::pair< std::string, std::string > > 52 : 6 : infoPosition( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ) 53 : : // ***************************************************************************** 54 : : // Return information on the position SDE 55 : : //! \param[inout] cnt std::map of counters for all differential equation types 56 : : //! \return vector of string pairs describing the SDE configuration 57 : : // ***************************************************************************** 58 : : { 59 : : using eq = tag::position; 60 : : 61 [ + - ]: 6 : auto c = ++cnt[ ctr::DiffEqType::POSITION ]; // count eqs 62 : : --c; // used to index vectors starting with 0 63 : : 64 : : std::vector< std::pair< std::string, std::string > > nfo; 65 : : 66 [ + - ][ + - ]: 12 : nfo.emplace_back( ctr::DiffEq().name( ctr::DiffEqType::POSITION ), "" ); 67 : : 68 [ + - ]: 6 : nfo.emplace_back( "kind", "deterministic" ); 69 [ + - ]: 6 : nfo.emplace_back( "dependent variable", std::string( 1, 70 [ + - ][ + - ]: 6 : g_inputdeck.get< tag::param, eq, tag::depvar >()[c] ) ); 71 : 6 : nfo.emplace_back( "start offset in particle array", std::to_string( 72 [ + - ]: 6 : g_inputdeck.get< tag::component >().offset< eq >(c) ) ); 73 [ + - ]: 6 : auto ncomp = g_inputdeck.get< tag::component, eq >()[c]; 74 [ + - ]: 6 : nfo.emplace_back( "number of components", std::to_string( ncomp ) ); 75 : : 76 : : coupledInfo< eq, tag::velocity, tag::velocity_id > 77 [ + - ][ + - ]: 12 : ( c, "velocity", nfo ); [ + - ] 78 : : 79 [ + - ]: 6 : nfo.emplace_back( "initialization policy", ctr::InitPolicy().name( 80 [ + - ]: 12 : g_inputdeck.get< tag::param, eq, tag::initpolicy >()[c] ) ); 81 [ + - ]: 6 : nfo.emplace_back( "coefficients policy", ctr::CoeffPolicy().name( 82 [ + - ]: 12 : g_inputdeck.get< tag::param, eq, tag::coeffpolicy >()[c] ) ); 83 [ + - ]: 6 : auto solve = g_inputdeck.get< tag::param, eq, tag::solve >()[c]; 84 [ + - ][ + - ]: 12 : nfo.emplace_back( "solve for", ctr::Depvar().name( solve ) ); 85 : : 86 [ + - ]: 12 : nfo.emplace_back( "random number generator", tk::ctr::RNG().name( 87 [ + - ]: 12 : g_inputdeck.get< tag::param, eq, tag::rng >()[c] ) ); 88 : : 89 : 6 : return nfo; 90 : : } 91 : : 92 : : } // walker::