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 "EoS/EoS.hpp"
16 : : #include "Vector.hpp"
17 : :
18 : : namespace inciter {
19 : :
20 : : std::vector< std::string >
21 : 0 : MultiMatFieldNames( std::size_t nmat )
22 : : // *****************************************************************************
23 : : // Return multi-material field names to be output to file
24 : : //! \param[in] nmat Number of materials in system
25 : : //! \return Vector of strings labelling fields output in file
26 : : // *****************************************************************************
27 : : {
28 : : std::vector< std::string > n;
29 : :
30 [ - - ]: 0 : for (std::size_t k=0; k<nmat; ++k)
31 [ - - ][ - - ]: 0 : n.push_back( "volfrac"+std::to_string(k+1)+"_numerical" );
[ - - ][ - - ]
[ - - ][ - - ]
[ - - ]
32 [ - - ]: 0 : for (std::size_t k=0; k<nmat; ++k)
33 [ - - ][ - - ]: 0 : n.push_back( "density"+std::to_string(k+1)+"_numerical" );
[ - - ][ - - ]
[ - - ][ - - ]
[ - - ]
34 [ - - ]: 0 : n.push_back( "density_numerical" );
35 [ - - ]: 0 : n.push_back( "x-velocity_numerical" );
36 [ - - ]: 0 : n.push_back( "y-velocity_numerical" );
37 [ - - ]: 0 : n.push_back( "z-velocity_numerical" );
38 [ - - ]: 0 : for (std::size_t k=0; k<nmat; ++k)
39 [ - - ][ - - ]: 0 : n.push_back( "pressure"+std::to_string(k+1)+"_numerical" );
[ - - ][ - - ]
[ - - ][ - - ]
[ - - ]
40 [ - - ]: 0 : n.push_back( "pressure_numerical" );
41 [ - - ]: 0 : for (std::size_t k=0; k<nmat; ++k)
42 [ - - ][ - - ]: 0 : n.push_back( "soundspeed"+std::to_string(k+1) );
[ - - ][ - - ]
43 [ - - ]: 0 : n.push_back( "total_energy_density_numerical" );
44 [ - - ]: 0 : n.push_back( "material_indicator" );
45 [ - - ]: 0 : n.push_back( "timestep" );
46 : :
47 : 0 : return n;
48 : : }
49 : :
50 : : std::vector< std::vector< tk::real > >
51 : 0 : MultiMatFieldOutput(
52 : : ncomp_t,
53 : : std::size_t nmat,
54 : : ncomp_t offset,
55 : : std::size_t nunk,
56 : : std::size_t rdof,
57 : : const std::vector< tk::real >&,
58 : : const std::array< std::vector< tk::real >, 3 >&,
59 : : const tk::Fields& U,
60 : : const tk::Fields& P )
61 : : // *****************************************************************************
62 : : // Return field output going to file
63 : : //! \param[in] nmat Number of materials in systen
64 : : //! \param[in] offset System offset specifying the position of the system of
65 : : //! PDEs among other systems
66 : : //! \param[in] nunk Number of unknowns to extract
67 : : //! \param[in] rdof Number of reconstructed degrees of freedom
68 : : //! \param[in] U Solution vector at recent time step
69 : : //! \param[in] P Vector of primitive quantities at recent time step
70 : : //! \return Vector of vectors to be output to file
71 : : // *****************************************************************************
72 : : {
73 : : // field-output vector with:
74 : : // - nmat volume fractions
75 : : // - nmat material densities
76 : : // - 1 bulk density
77 : : // - 3 velocity components
78 : : // - nmat material pressures
79 : : // - 1 bulk pressure
80 : : // - nmat material sound-speeds
81 : : // - 1 bulk total energy density
82 : : // - 1 material indicator
83 : : // - 1 time-step
84 : : // leading to a size of 4*nmat+8
85 : : std::vector< std::vector< tk::real > >
86 [ - - ][ - - ]: 0 : out( 4*nmat+8, std::vector< tk::real >( nunk ) );
87 : :
88 : : //// mesh node coordinates
89 : : //const auto& x = coord[0];
90 : : //const auto& y = coord[1];
91 : : //const auto& z = coord[2];
92 : :
93 : : // material volume-fractions
94 [ - - ]: 0 : for (std::size_t k=0; k<nmat; ++k) {
95 [ - - ]: 0 : for (std::size_t i=0; i<nunk; ++i)
96 : 0 : out[k][i] = U(i, volfracDofIdx(nmat, k, rdof, 0), offset);
97 : : }
98 : :
99 : : // material densities
100 [ - - ]: 0 : for (std::size_t k=0; k<nmat; ++k) {
101 [ - - ]: 0 : for (std::size_t i=0; i<nunk; ++i) {
102 [ - - ]: 0 : out[nmat+k][i] = U(i, densityDofIdx(nmat, k, rdof, 0), offset) /
103 [ - - ]: 0 : std::max(1e-16, U(i, volfracDofIdx(nmat, k, rdof, 0), offset));
104 : : }
105 : : }
106 : :
107 : : // bulk density
108 [ - - ]: 0 : for (std::size_t i=0; i<nunk; ++i) {
109 [ - - ]: 0 : for (std::size_t k=0; k<nmat; ++k)
110 : 0 : out[2*nmat][i] += U(i, densityDofIdx(nmat, k, rdof, 0), offset);
111 : : }
112 : :
113 : : // velocity components
114 [ - - ]: 0 : for (std::size_t i=0; i<nunk; ++i) {
115 : 0 : out[2*nmat+1][i] = P(i, velocityDofIdx(nmat, 0, rdof, 0), offset);
116 : 0 : out[2*nmat+2][i] = P(i, velocityDofIdx(nmat, 1, rdof, 0), offset);
117 : 0 : out[2*nmat+3][i] = P(i, velocityDofIdx(nmat, 2, rdof, 0), offset);
118 : : }
119 : :
120 : : // material pressures
121 [ - - ]: 0 : for (std::size_t k=0; k<nmat; ++k) {
122 [ - - ]: 0 : for (std::size_t i=0; i<nunk; ++i) {
123 : 0 : out[2*nmat+4+k][i] =
124 : 0 : P(i, pressureDofIdx(nmat, k, rdof, 0), offset) /
125 [ - - ]: 0 : std::max(1e-16, U(i, volfracDofIdx(nmat, k, rdof, 0), offset));
126 : : }
127 : : }
128 : :
129 : : // bulk pressure
130 [ - - ]: 0 : for (std::size_t i=0; i<nunk; ++i) {
131 [ - - ]: 0 : for (std::size_t k=0; k<nmat; ++k)
132 : 0 : out[3*nmat+4][i] += P(i, pressureDofIdx(nmat, k, rdof, 0), offset);
133 : : }
134 : :
135 : : // material sound speeds
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[3*nmat+5+k][i] =
139 [ - - ][ - - ]: 0 : eos_soundspeed< tag::multimat >( 0,
140 [ - - ]: 0 : std::max(1e-16, U(i, densityDofIdx(nmat,k,rdof,0), offset)),
141 : : P(i, pressureDofIdx(nmat,k,rdof,0), offset),
142 : : U(i, volfracDofIdx(nmat,k,rdof,0), offset), k );
143 : : }
144 : : }
145 : :
146 : : // bulk total energy density
147 [ - - ]: 0 : for (std::size_t i=0; i<nunk; ++i) {
148 [ - - ]: 0 : for (std::size_t k=0; k<nmat; ++k)
149 : 0 : out[4*nmat+5][i] += U(i, energyDofIdx(nmat, k, rdof, 0), offset);
150 : : }
151 : :
152 : : // material indicator
153 [ - - ]: 0 : for (std::size_t i=0; i<nunk; ++i) {
154 : 0 : out[4*nmat+6][i] = 0.0;
155 [ - - ]: 0 : for (std::size_t k=0; k<nmat; ++k) {
156 : 0 : out[4*nmat+6][i] += U(i, volfracDofIdx(nmat,k,rdof,0), offset)
157 : 0 : * static_cast< tk::real >(k+1);
158 : : }
159 : : }
160 : :
161 : : // time-step
162 : : //for (std::size_t i=0; i<nunk; ++i) {
163 : : // // advection velocity
164 : : // auto u = U(i, velocityDofIdx(nmat,0,rdof,0), offset);
165 : : // auto v = U(i, velocityDofIdx(nmat,1,rdof,0), offset);
166 : : // auto w = U(i, velocityDofIdx(nmat,2,rdof,0), offset);
167 : :
168 : : // auto vn = std::sqrt(tk::dot({{u, v, w}}, {{u, v, w}}));
169 : :
170 : : // // acoustic speed
171 : : // auto a = 0.0;
172 : : // for (std::size_t k=0; k<nmat; ++k)
173 : : // {
174 : : // if (U(i, volfracDofIdx(nmat,k,rdof,0), offset) > 1.0e-04) {
175 : : // a = std::max( a, eos_soundspeed< tag::multimat >( 0,
176 : : // U(i, densityDofIdx(nmat,k,rdof,0), offset),
177 : : // P(i, pressureDofIdx(nmat,k,rdof,0), offset),
178 : : // U(i, volfracDofIdx(nmat,k,rdof,0), offset), k ) );
179 : : // }
180 : : // }
181 : :
182 : : // out[4*nmat+7][i] = geoElem(i,4,0) / (std::fabs(vn) + a);
183 : : //}
184 : :
185 : 0 : return out;
186 : : }
187 : :
188 [ - - ]: 0 : std::vector< std::string > MultiMatHistNames()
189 : : // *****************************************************************************
190 : : // Return time history field names to be output to file
191 : : //! \note Every time history point will output these fields.
192 : : //! \return Vector of strings labelling time history fields output in file
193 : : // *****************************************************************************
194 : : {
195 : : std::vector< std::string > n;
196 : :
197 [ - - ]: 0 : n.push_back( "density" );
198 [ - - ]: 0 : n.push_back( "x-velocity" );
199 [ - - ]: 0 : n.push_back( "y-velocity" );
200 [ - - ]: 0 : n.push_back( "z-velocity" );
201 [ - - ]: 0 : n.push_back( "energy" );
202 [ - - ]: 0 : n.push_back( "pressure" );
203 : :
204 : 0 : return n;
205 : : }
206 : :
207 : : } //inciter::
|