Quinoa all test code coverage report
Current view: top level - PDE/MultiMat/Problem - FieldOutput.cpp (source / functions) Hit Total Coverage
Commit: -128-NOTFOUND Lines: 68 139 48.9 %
Date: 2024-11-22 09:12:55 Functions: 4 7 57.1 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 88 352 25.0 %

           Branch data     Line data    Source code
       1                 :            : // *****************************************************************************
       2                 :            : /*!
       3                 :            :   \file      src/PDE/MultiMat/Problem/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     Field outputs for multi-material equation solver
       9                 :            :   \details   This file defines functions for field quantites to be output to
      10                 :            :     files for compressible multi-material equations.
      11                 :            : */
      12                 :            : // *****************************************************************************
      13                 :            : #include "FieldOutput.hpp"
      14                 :            : #include "MultiMat/MultiMatIndexing.hpp"
      15                 :            : #include "Vector.hpp"
      16                 :            : #include "Inciter/InputDeck/InputDeck.hpp"
      17                 :            : #include "ConfigureMultiMat.hpp"
      18                 :            : 
      19                 :            : namespace inciter {
      20                 :            : 
      21                 :            : extern ctr::InputDeck g_inputdeck;
      22                 :            : 
      23         [ +  - ]:        366 : std::map< std::string, tk::GetVarFn > MultiMatOutVarFn()
      24                 :            : // *****************************************************************************
      25                 :            : // Return a map that associates user-specified strings to functions
      26                 :            : //! \return Map that associates user-specified strings to functions that compute
      27                 :            : //!   relevant quantities to be output to file
      28                 :            : // *****************************************************************************
      29                 :            : {
      30                 :            :   std::map< std::string, tk::GetVarFn > OutFnMap;
      31                 :            : 
      32                 :            :   // Allowed strings for user-def field output vars
      33 [ +  - ][ +  - ]:        366 :   OutFnMap["density"] = multimat::bulkDensityOutVar;
      34 [ +  - ][ +  - ]:        366 :   OutFnMap["pressure"] = multimat::bulkPressureOutVar;
      35 [ +  - ][ +  - ]:        366 :   OutFnMap["specific_total_energy"] = multimat::bulkSpecificTotalEnergyOutVar;
      36 [ +  - ][ +  - ]:        366 :   OutFnMap["x-velocity"] = multimat::velocityOutVar<0>;
      37 [ +  - ][ +  - ]:        366 :   OutFnMap["y-velocity"] = multimat::velocityOutVar<1>;
      38 [ +  - ][ +  - ]:        366 :   OutFnMap["z-velocity"] = multimat::velocityOutVar<2>;
      39 [ +  - ][ +  - ]:        366 :   OutFnMap["material_indicator"] = multimat::matIndicatorOutVar;
      40                 :            :   // Cauchy stress tensor
      41 [ +  - ][ +  - ]:        366 :   OutFnMap["stress11"] = multimat::stressOutVar<0,0>;
      42 [ +  - ][ +  - ]:        366 :   OutFnMap["stress12"] = multimat::stressOutVar<0,1>;
      43 [ +  - ][ +  - ]:        366 :   OutFnMap["stress13"] = multimat::stressOutVar<0,2>;
      44 [ +  - ][ +  - ]:        366 :   OutFnMap["stress21"] = multimat::stressOutVar<1,0>;
      45 [ +  - ][ +  - ]:        366 :   OutFnMap["stress22"] = multimat::stressOutVar<1,1>;
      46 [ +  - ][ +  - ]:        366 :   OutFnMap["stress23"] = multimat::stressOutVar<1,2>;
      47 [ +  - ][ +  - ]:        366 :   OutFnMap["stress31"] = multimat::stressOutVar<2,0>;
      48 [ +  - ][ +  - ]:        366 :   OutFnMap["stress32"] = multimat::stressOutVar<2,1>;
      49 [ +  - ][ +  - ]:        366 :   OutFnMap["stress33"] = multimat::stressOutVar<2,2>;
      50                 :            :   // Inverse deformation gradient tensor
      51 [ +  - ][ +  - ]:        366 :   OutFnMap["g11"] = multimat::defGradOutVar<0,0>;
      52 [ +  - ][ +  - ]:        366 :   OutFnMap["g12"] = multimat::defGradOutVar<0,1>;
      53 [ +  - ][ +  - ]:        366 :   OutFnMap["g13"] = multimat::defGradOutVar<0,2>;
      54 [ +  - ][ +  - ]:        366 :   OutFnMap["g21"] = multimat::defGradOutVar<1,0>;
      55 [ +  - ][ +  - ]:        366 :   OutFnMap["g22"] = multimat::defGradOutVar<1,1>;
      56 [ +  - ][ +  - ]:        366 :   OutFnMap["g23"] = multimat::defGradOutVar<1,2>;
      57 [ +  - ][ +  - ]:        366 :   OutFnMap["g31"] = multimat::defGradOutVar<2,0>;
      58 [ +  - ][ +  - ]:        366 :   OutFnMap["g32"] = multimat::defGradOutVar<2,1>;
      59 [ +  - ][ +  - ]:        366 :   OutFnMap["g33"] = multimat::defGradOutVar<2,2>;
      60                 :            : 
      61                 :        366 :   return OutFnMap;
      62                 :            : }
      63                 :            : 
      64                 :            : std::vector< std::string >
      65                 :          0 : MultiMatFieldNames( std::size_t nmat )
      66                 :            : // *****************************************************************************
      67                 :            : // Return multi-material field names to be output to file
      68                 :            : //! \param[in] nmat Number of materials in system
      69                 :            : //! \return Vector of strings labelling fields output in file
      70                 :            : // *****************************************************************************
      71                 :            : {
      72                 :            :   std::vector< std::string > n;
      73                 :            : 
      74         [ -  - ]:          0 :   for (std::size_t k=0; k<nmat; ++k)
      75 [ -  - ][ -  - ]:          0 :     n.push_back( "volfrac"+std::to_string(k+1)+"_numerical" );
         [ -  - ][ -  - ]
         [ -  - ][ -  - ]
                 [ -  - ]
      76         [ -  - ]:          0 :   for (std::size_t k=0; k<nmat; ++k)
      77 [ -  - ][ -  - ]:          0 :     n.push_back( "density"+std::to_string(k+1)+"_numerical" );
         [ -  - ][ -  - ]
         [ -  - ][ -  - ]
                 [ -  - ]
      78         [ -  - ]:          0 :   n.push_back( "density_numerical" );
      79         [ -  - ]:          0 :   n.push_back( "x-velocity_numerical" );
      80         [ -  - ]:          0 :   n.push_back( "y-velocity_numerical" );
      81         [ -  - ]:          0 :   n.push_back( "z-velocity_numerical" );
      82         [ -  - ]:          0 :   for (std::size_t k=0; k<nmat; ++k)
      83 [ -  - ][ -  - ]:          0 :     n.push_back( "pressure"+std::to_string(k+1)+"_numerical" );
         [ -  - ][ -  - ]
         [ -  - ][ -  - ]
                 [ -  - ]
      84         [ -  - ]:          0 :   n.push_back( "pressure_numerical" );
      85         [ -  - ]:          0 :   for (std::size_t k=0; k<nmat; ++k)
      86 [ -  - ][ -  - ]:          0 :     n.push_back( "soundspeed"+std::to_string(k+1) );
         [ -  - ][ -  - ]
      87         [ -  - ]:          0 :   n.push_back( "total_energy_density_numerical" );
      88         [ -  - ]:          0 :   n.push_back( "material_indicator" );
      89         [ -  - ]:          0 :   n.push_back( "timestep" );
      90                 :            : 
      91                 :          0 :   return n;
      92                 :            : }
      93                 :            : 
      94                 :            : std::vector< std::vector< tk::real > >
      95                 :          0 : MultiMatFieldOutput(
      96                 :            :   ncomp_t,
      97                 :            :   std::size_t nmat,
      98                 :            :   const std::vector< EOS >& mat_blk,
      99                 :            :   std::size_t nunk,
     100                 :            :   std::size_t rdof,
     101                 :            :   const std::vector< tk::real >&,
     102                 :            :   const std::array< std::vector< tk::real >, 3 >&,
     103                 :            :   const tk::Fields& U,
     104                 :            :   const tk::Fields& P )
     105                 :            : // *****************************************************************************
     106                 :            : //  Return field output going to file
     107                 :            : //! \param[in] nmat Number of materials in systen
     108                 :            : //! \param[in] nunk Number of unknowns to extract
     109                 :            : //! \param[in] rdof Number of reconstructed degrees of freedom
     110                 :            : //! \param[in] U Solution vector at recent time step
     111                 :            : //! \param[in] P Vector of primitive quantities at recent time step
     112                 :            : //! \return Vector of vectors to be output to file
     113                 :            : // *****************************************************************************
     114                 :            : {
     115                 :            :   // field-output vector with:
     116                 :            :   // - nmat volume fractions
     117                 :            :   // - nmat material densities
     118                 :            :   // - 1 bulk density
     119                 :            :   // - 3 velocity components
     120                 :            :   // - nmat material pressures
     121                 :            :   // - 1 bulk pressure
     122                 :            :   // - nmat material sound-speeds
     123                 :            :   // - 1 bulk total energy density
     124                 :            :   // - 1 material indicator
     125                 :            :   // - 1 time-step
     126                 :            :   // leading to a size of 4*nmat+8
     127                 :            :   std::vector< std::vector< tk::real > >
     128 [ -  - ][ -  - ]:          0 :     out( 4*nmat+8, std::vector< tk::real >( nunk ) );
     129                 :            : 
     130                 :            :   //// mesh node coordinates
     131                 :            :   //const auto& x = coord[0];
     132                 :            :   //const auto& y = coord[1];
     133                 :            :   //const auto& z = coord[2];
     134                 :            : 
     135                 :            :   // material volume-fractions
     136         [ -  - ]:          0 :   for (std::size_t k=0; k<nmat; ++k) {
     137         [ -  - ]:          0 :     for (std::size_t i=0; i<nunk; ++i)
     138                 :          0 :       out[k][i] = U(i, volfracDofIdx(nmat, k, rdof, 0));
     139                 :            :   }
     140                 :            : 
     141                 :            :   // material densities
     142         [ -  - ]:          0 :   for (std::size_t k=0; k<nmat; ++k) {
     143         [ -  - ]:          0 :     for (std::size_t i=0; i<nunk; ++i) {
     144         [ -  - ]:          0 :       out[nmat+k][i] = U(i, densityDofIdx(nmat, k, rdof, 0)) /
     145         [ -  - ]:          0 :         std::max(1e-16, U(i, volfracDofIdx(nmat, k, rdof, 0)));
     146                 :            :     }
     147                 :            :   }
     148                 :            : 
     149                 :            :   // bulk density
     150         [ -  - ]:          0 :   for (std::size_t i=0; i<nunk; ++i) {
     151         [ -  - ]:          0 :     for (std::size_t k=0; k<nmat; ++k)
     152                 :          0 :       out[2*nmat][i] += U(i, densityDofIdx(nmat, k, rdof, 0));
     153                 :            :   }
     154                 :            : 
     155                 :            :   // velocity components
     156         [ -  - ]:          0 :   for (std::size_t i=0; i<nunk; ++i) {
     157                 :          0 :     out[2*nmat+1][i] = P(i, velocityDofIdx(nmat, 0, rdof, 0));
     158                 :          0 :     out[2*nmat+2][i] = P(i, velocityDofIdx(nmat, 1, rdof, 0));
     159                 :          0 :     out[2*nmat+3][i] = P(i, velocityDofIdx(nmat, 2, rdof, 0));
     160                 :            :   }
     161                 :            : 
     162                 :            :   // material pressures
     163         [ -  - ]:          0 :   for (std::size_t k=0; k<nmat; ++k) {
     164         [ -  - ]:          0 :     for (std::size_t i=0; i<nunk; ++i) {
     165                 :          0 :       out[2*nmat+4+k][i] =
     166                 :          0 :         P(i, pressureDofIdx(nmat, k, rdof, 0)) /
     167         [ -  - ]:          0 :         std::max(1e-16, U(i, volfracDofIdx(nmat, k, rdof, 0)));
     168                 :            :     }
     169                 :            :   }
     170                 :            : 
     171                 :            :   // bulk pressure
     172         [ -  - ]:          0 :   for (std::size_t i=0; i<nunk; ++i) {
     173         [ -  - ]:          0 :     for (std::size_t k=0; k<nmat; ++k)
     174                 :          0 :       out[3*nmat+4][i] += P(i, pressureDofIdx(nmat, k, rdof, 0));
     175                 :            :   }
     176                 :            : 
     177                 :            :   // material sound speeds
     178         [ -  - ]:          0 :   for (std::size_t k=0; k<nmat; ++k) {
     179         [ -  - ]:          0 :     for (std::size_t i=0; i<nunk; ++i) {
     180                 :          0 :       out[3*nmat+5+k][i] =
     181         [ -  - ]:          0 :       mat_blk[k].compute< EOS::soundspeed >(
     182         [ -  - ]:          0 :         std::max(1e-16, U(i, densityDofIdx(nmat,k,rdof,0))),
     183                 :            :         P(i, pressureDofIdx(nmat,k,rdof,0)),
     184                 :            :         U(i, volfracDofIdx(nmat,k,rdof,0)), k );
     185                 :            :     }
     186                 :            :   }
     187                 :            : 
     188                 :            :   // bulk total energy density
     189         [ -  - ]:          0 :   for (std::size_t i=0; i<nunk; ++i) {
     190         [ -  - ]:          0 :     for (std::size_t k=0; k<nmat; ++k)
     191                 :          0 :       out[4*nmat+5][i] += U(i, energyDofIdx(nmat, k, rdof, 0));
     192                 :            :   }
     193                 :            : 
     194                 :            :   // material indicator
     195         [ -  - ]:          0 :   for (std::size_t i=0; i<nunk; ++i) {
     196                 :          0 :     out[4*nmat+6][i] = 0.0;
     197         [ -  - ]:          0 :     for (std::size_t k=0; k<nmat; ++k) {
     198                 :          0 :       out[4*nmat+6][i] += U(i, volfracDofIdx(nmat,k,rdof,0))
     199                 :          0 :         * static_cast< tk::real >(k+1);
     200                 :            :     }
     201                 :            :   }
     202                 :            : 
     203                 :            :   // time-step
     204                 :            :   //for (std::size_t i=0; i<nunk; ++i) {
     205                 :            :   //  // advection velocity
     206                 :            :   //  auto u = U(i, velocityDofIdx(nmat,0,rdof,0));
     207                 :            :   //  auto v = U(i, velocityDofIdx(nmat,1,rdof,0));
     208                 :            :   //  auto w = U(i, velocityDofIdx(nmat,2,rdof,0));
     209                 :            : 
     210                 :            :   //  auto vn = std::sqrt(tk::dot({{u, v, w}}, {{u, v, w}}));
     211                 :            : 
     212                 :            :   //  // acoustic speed
     213                 :            :   //  auto a = 0.0;
     214                 :            :   //  for (std::size_t k=0; k<nmat; ++k)
     215                 :            :   //  {
     216                 :            :   //    if (U(i, volfracDofIdx(nmat,k,rdof,0)) > 1.0e-04) {
     217                 :            :   //      a = std::max( a, eos_soundspeed< tag::multimat >( 0,
     218                 :            :   //        U(i, densityDofIdx(nmat,k,rdof,0)),
     219                 :            :   //        P(i, pressureDofIdx(nmat,k,rdof,0)),
     220                 :            :   //        U(i, volfracDofIdx(nmat,k,rdof,0)), k ) );
     221                 :            :   //    }
     222                 :            :   //  }
     223                 :            : 
     224                 :            :   //  out[4*nmat+7][i] = geoElem(i,4) / (std::fabs(vn) + a);
     225                 :            :   //}
     226                 :            : 
     227                 :          0 :   return out;
     228                 :            : }
     229                 :            : 
     230         [ +  - ]:         28 : std::vector< std::string > MultiMatSurfNames()
     231                 :            : // *****************************************************************************
     232                 :            : //  Return surface field names to be output to file
     233                 :            : //! \note Every surface will output these fields.
     234                 :            : //! \return Vector of strings labelling surface fields output in file
     235                 :            : // *****************************************************************************
     236                 :            : {
     237                 :            :   std::vector< std::string > n;
     238                 :            : 
     239         [ +  - ]:         28 :   n.push_back( "density" );
     240         [ +  - ]:         28 :   n.push_back( "x-velocity" );
     241         [ +  - ]:         28 :   n.push_back( "y-velocity" );
     242         [ +  - ]:         28 :   n.push_back( "z-velocity" );
     243         [ +  - ]:         28 :   n.push_back( "specific_total_energy" );
     244         [ +  - ]:         28 :   n.push_back( "pressure" );
     245                 :            : 
     246                 :         28 :   return n;
     247                 :            : }
     248                 :            : 
     249                 :            : std::vector< std::vector< tk::real > >
     250                 :         28 : MultiMatSurfOutput(
     251                 :            :   const std::size_t nmat,
     252                 :            :   const std::size_t rdof,
     253                 :            :   const FaceData& fd,
     254                 :            :   const tk::Fields& U,
     255                 :            :   const tk::Fields& P )
     256                 :            : // *****************************************************************************
     257                 :            : //  Return element surface field output (on triangle faces) going to file
     258                 :            : //! \param[in] nmat Number of materials in this PDE system
     259                 :            : //! \param[in] rdof Maximum number of reconstructed degrees of freedom
     260                 :            : //! \param[in] fd Face connectivity and boundary conditions object
     261                 :            : //! \param[in] U Solution vector at recent time step
     262                 :            : //! \param[in] P Vector of primitives at recent time step
     263                 :            : //! \return Vector of vectors of solution on side set faces to be output to file
     264                 :            : // *****************************************************************************
     265                 :            : {
     266                 :            :   std::vector< std::vector< tk::real > > out;
     267                 :            : 
     268                 :            :   const auto& bface = fd.Bface();
     269                 :            :   const auto& esuf = fd.Esuf();
     270                 :            : 
     271                 :            :   // extract field output along side sets requested
     272         [ +  + ]:         52 :   for (auto s : g_inputdeck.get< tag::field_output, tag::sideset >()) {
     273                 :            :     // get face list for side set requested
     274                 :         24 :     auto b = bface.find(static_cast<int>(s));
     275         [ -  + ]:         24 :     if (b == end(bface)) continue;
     276                 :            :     const auto& faces = b->second;
     277         [ +  - ]:         24 :     std::vector< tk::real > surfaceSol( faces.size() );
     278         [ +  - ]:         24 :     auto i = out.size();
     279                 :            :     out.insert( end(out), 6, surfaceSol );
     280                 :            :     std::size_t j = 0;
     281         [ +  + ]:       3372 :     for (auto f : faces) {
     282                 :            :       Assert( esuf[2*f+1] == -1, "outside boundary element not -1" );
     283                 :       3348 :       std::size_t el = static_cast< std::size_t >(esuf[2*f]);
     284                 :            : 
     285                 :            :       // access solutions at boundary element
     286                 :            :       tk::real rhob(0.0), rhoE(0.0), pb(0.0);
     287         [ +  + ]:      10044 :       for (std::size_t k=0; k<nmat; ++k) {
     288                 :       6696 :         rhob += U(el, densityDofIdx(nmat,k,rdof,0));
     289                 :       6696 :         rhoE += U(el, energyDofIdx(nmat,k,rdof,0));
     290                 :       6696 :         pb += P(el, pressureDofIdx(nmat,k,rdof,0));
     291                 :            :       }
     292                 :            : 
     293                 :       3348 :       out[i+0][j] = rhob;
     294                 :       3348 :       out[i+1][j] = P(el, velocityDofIdx(nmat,0,rdof,0));
     295                 :       3348 :       out[i+2][j] = P(el, velocityDofIdx(nmat,1,rdof,0));
     296                 :       3348 :       out[i+3][j] = P(el, velocityDofIdx(nmat,2,rdof,0));
     297                 :       3348 :       out[i+4][j] = rhoE;
     298                 :       3348 :       out[i+5][j] = pb;
     299                 :       3348 :       ++j;
     300                 :            :     }
     301                 :            :   }
     302                 :            : 
     303                 :         28 :   return out;
     304                 :            : }
     305                 :            : 
     306         [ -  - ]:          0 : std::vector< std::string > MultiMatHistNames()
     307                 :            : // *****************************************************************************
     308                 :            : // Return time history field names to be output to file
     309                 :            : //! \note Every time history point will output these fields.
     310                 :            : //! \return Vector of strings labelling time history fields output in file
     311                 :            : // *****************************************************************************
     312                 :            : {
     313                 :            :   std::vector< std::string > n;
     314                 :          0 :   auto nmat = g_inputdeck.get< tag::multimat, tag::nmat >();
     315                 :            : 
     316         [ -  - ]:          0 :   n.push_back( "density" );
     317         [ -  - ]:          0 :   n.push_back( "x-velocity" );
     318         [ -  - ]:          0 :   n.push_back( "y-velocity" );
     319         [ -  - ]:          0 :   n.push_back( "z-velocity" );
     320         [ -  - ]:          0 :   n.push_back( "energy" );
     321         [ -  - ]:          0 :   n.push_back( "pressure" );
     322         [ -  - ]:          0 :   for (std::size_t k=0; k<nmat; ++k)
     323 [ -  - ][ -  - ]:          0 :     n.push_back( "volfrac"+std::to_string(k+1) );
         [ -  - ][ -  - ]
     324                 :            : 
     325                 :          0 :   return n;
     326                 :            : }
     327                 :            : 
     328                 :         33 : std::vector< std::string > MultiMatDiagNames(std::size_t nmat)
     329                 :            : // *****************************************************************************
     330                 :            : // Return diagnostic var names to be output to file
     331                 :            : //! \param[in] nmat Number of materials in systen
     332                 :            : //! \return Vector of strings labelling diagnostic fields output in file
     333                 :            : // *****************************************************************************
     334                 :            : {
     335                 :            :   std::vector< std::string > n;
     336                 :            :   const auto& solidx = g_inputdeck.get< tag::matidxmap, tag::solidx >();
     337                 :            : 
     338         [ +  + ]:        119 :   for (std::size_t k=0; k<nmat; ++k)
     339 [ +  - ][ +  - ]:        172 :     n.push_back( "f"+std::to_string(k+1) );
         [ -  + ][ -  - ]
     340         [ +  + ]:        119 :   for (std::size_t k=0; k<nmat; ++k)
     341 [ +  - ][ +  - ]:        172 :     n.push_back( "fr"+std::to_string(k+1) );
         [ -  + ][ -  - ]
     342         [ +  - ]:         33 :   n.push_back( "fru" );
     343         [ +  - ]:         33 :   n.push_back( "frv" );
     344         [ +  - ]:         66 :   n.push_back( "frw" );
     345         [ +  + ]:        119 :   for (std::size_t k=0; k<nmat; ++k)
     346 [ +  - ][ +  - ]:        172 :     n.push_back( "fre"+std::to_string(k+1) );
         [ -  + ][ -  - ]
     347         [ +  + ]:        119 :   for (std::size_t k=0; k<nmat; ++k) {
     348         [ -  + ]:         86 :     if (solidx[k]) {
     349         [ -  - ]:          0 :       for (std::size_t i=1; i<=3; ++i)
     350         [ -  - ]:          0 :         for (std::size_t j=1; j<=3; ++j)
     351 [ -  - ][ -  - ]:          0 :           n.push_back( "g"+std::to_string(k+1)+
         [ -  - ][ -  - ]
         [ -  - ][ -  - ]
         [ -  - ][ -  - ]
                 [ -  - ]
     352 [ -  - ][ -  - ]:          0 :             "_"+std::to_string(i)+std::to_string(j) );
         [ -  - ][ -  - ]
         [ -  - ][ -  - ]
         [ -  - ][ -  - ]
     353                 :            :     }
     354                 :            :   }
     355                 :            : 
     356                 :         33 :   return n;
     357                 :            : }
     358                 :            : 
     359                 :            : } //inciter::

Generated by: LCOV version 1.14