Branch data Line data Source code
1 : : // ***************************************************************************** 2 : : /*! 3 : : \file src/Inciter/FieldOutput.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 Extract field output for inciter 9 : : \details Extract field output for inciter. 10 : : */ 11 : : // ***************************************************************************** 12 : : 13 : : #include "FieldOutput.hpp" 14 : : #include "ContainerUtil.hpp" 15 : : 16 : : namespace inciter { 17 : : 18 : : std::vector< std::string > 19 : 9147 : numericFieldNames( tk::Centering c ) 20 : : // ***************************************************************************** 21 : : // Collect field output names from numerical solution based on user input 22 : : //! \param[in] c Extract variable names only with this centering 23 : : //! \return Output field names requested by user 24 : : // ***************************************************************************** 25 : : { 26 : : std::vector< std::string > f; 27 [ + + ]: 49008 : for (const auto& v : g_inputdeck.get< tag::cmd, tag::io, tag::outvar >()) { 28 [ + + ][ + + ]: 69265 : if (v.centering == c && !v.analytic()) { 29 [ + - ]: 23871 : std::stringstream s; 30 [ + + ][ + - ]: 23871 : if (v.alias.empty()) s << v; else s << v.alias; 31 : 23871 : f.push_back( s.str() ); 32 : : } 33 : : } 34 : : 35 : 9147 : return f; 36 : : } 37 : : 38 : : std::vector< std::vector< tk::real > > 39 : 9147 : numericFieldOutput( const tk::Fields& U, 40 : : tk::Centering c, 41 : : const tk::Fields& P ) 42 : : // ***************************************************************************** 43 : : // Collect field output from numerical solution based on user input 44 : : //! \param[in] U Solution data to extract from 45 : : //! \param[in] c Extract variables only with this centering 46 : : //! \param[in] P Optional primitive variable solution data to extract from 47 : : //! \return Output fields requested by user 48 : : // ***************************************************************************** 49 : : { 50 : : // Get offset map 51 : : const auto& offset = 52 : 9147 : g_inputdeck.get< tag::component >().offsetmap( g_inputdeck ); 53 : : 54 : : // will not use P if empty 55 [ + + ]: 9147 : const auto& p = P.empty() ? U : P; 56 : : 57 : : auto rdof = 58 [ + + ]: 9147 : c == tk::Centering::NODE ? 1 : g_inputdeck.get< tag::discr, tag::rdof >(); 59 : : 60 : : std::vector< std::vector< tk::real > > f; 61 [ + + ]: 49008 : for (const auto& v : g_inputdeck.get< tag::cmd, tag::io, tag::outvar >()) { 62 [ + + ]: 39861 : if (v.centering == c) { 63 : 29404 : auto o = tk::cref_find( offset, v.var ); 64 [ + + ]: 29404 : const auto& F = v.primitive() ? p : U; 65 [ + + ]: 29404 : if (v.name.empty()) { // depvar-based direct access 66 [ + - ]: 6078 : f.push_back( F.extract( v.field*rdof, o ) ); 67 [ + + ]: 26365 : } else if (!v.analytic()) { // human-readable non-analytic via custom fn 68 : : Assert( v.getvar, "getvar() not configured for " + v.name ); 69 [ + - ]: 41664 : f.push_back( v.getvar( F, o, rdof ) ); 70 : : } 71 : : } 72 : : } 73 : : 74 : 9147 : return f; 75 : : } 76 : : 77 : : } // inciter::