priVarsPacking.hpp
Go to the documentation of this file.
1/*
2 Copyright 2023 Total SE
3
4 This file is part of the Open Porous Media project (OPM).
5
6 OPM is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 OPM is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with OPM. If not, see <http://www.gnu.org/licenses/>.
18*/
19
20#ifndef OPM_PRIVARSPACKING_HEADER_INCLUDED
21#define OPM_PRIVARSPACKING_HEADER_INCLUDED
22
23#include <cstddef>
24
25namespace Opm {
26
27 namespace PVUtil {
28 constexpr int fbits = 4;
29
30 template <class PV>
31 std::size_t pack(const PV& privar) {
32 std::size_t m1 = static_cast<std::size_t>(privar.primaryVarsMeaningWater());
33 std::size_t m2 = static_cast<std::size_t>(privar.primaryVarsMeaningPressure());
34 std::size_t m3 = static_cast<std::size_t>(privar.primaryVarsMeaningGas());
35 std::size_t m4 = static_cast<std::size_t>(privar.primaryVarsMeaningBrine());
36 std::size_t m5 = static_cast<std::size_t>(privar.primaryVarsMeaningSolvent());
37 return m1 + (m2 << fbits*1) + (m3 << fbits*2) + (m4 << fbits*3) + (m5 << fbits*4);
38 }
39
40 template <class PV>
41 void unPack(PV& privar, const std::size_t meanings) {
42 const std::size_t filter = ((1 << fbits) - 1);
43 std::size_t m1 = (meanings >> fbits*0) & filter;
44 std::size_t m2 = (meanings >> fbits*1) & filter;
45 std::size_t m3 = (meanings >> fbits*2) & filter;
46 std::size_t m4 = (meanings >> fbits*3) & filter;
47 std::size_t m5 = (meanings >> fbits*4) & filter;
48 privar.setPrimaryVarsMeaningWater(typename PV::WaterMeaning(m1));
49 privar.setPrimaryVarsMeaningPressure(typename PV::PressureMeaning(m2));
50 privar.setPrimaryVarsMeaningGas(typename PV::GasMeaning(m3));
51 privar.setPrimaryVarsMeaningBrine(typename PV::BrineMeaning(m4));
52 privar.setPrimaryVarsMeaningSolvent(typename PV::SolventMeaning(m5));
53 }
54 } // namespace PVMeanings
55} // namespace Opm
56
57#endif // OPM_PRIVARSPACKING_HEADER_INCLUDED
constexpr int fbits
Definition: priVarsPacking.hpp:28
void unPack(PV &privar, const std::size_t meanings)
Definition: priVarsPacking.hpp:41
std::size_t pack(const PV &privar)
Definition: priVarsPacking.hpp:31
Definition: BlackoilPhases.hpp:27