27 #ifndef OPM_OUTPUT_EXTRACTORS_HPP 28 #define OPM_OUTPUT_EXTRACTORS_HPP 30 #include <opm/common/OpmLog/OpmLog.hpp> 31 #include <opm/common/utility/Visitor.hpp> 33 #include <opm/material/common/Valgrind.hpp> 42 #include <unordered_map> 47 #include <fmt/format.h> 52 template<
class TypeTag>
57 using FluidState =
typename IntensiveQuantities::FluidState;
59 static constexpr
int numPhases = FluidSystem::numPhases;
88 using ScalarFunc = std::function<Scalar(const Context&)>;
114 std::variant<AssignFunc, ScalarEntry, PhaseEntry>
data;
119 template<std::
size_t size>
123 std::vector<Entry> filtered_extractors;
124 filtered_extractors.reserve(input.size());
125 std::copy_if(std::move_iterator(input.begin()),
126 std::move_iterator(input.end()),
127 std::back_inserter(filtered_extractors),
133 return std::visit(VisitorOverloadSet{
140 return !v.data->empty();
144 return std::ranges::any_of(*v.data,
146 { return !ve.empty(); });
151 return filtered_extractors;
158 const std::vector<Entry>& extractors)
160 std::ranges::for_each(extractors,
161 [&ectx](
const auto& entry)
163 std::visit(VisitorOverloadSet{
166 auto& array = *v.data;
172 std::ranges::for_each(*v.data,
173 [phaseIdx = 0, &ectx, &v](
auto& array)
mutable 175 if (!array.empty()) {
176 array[ectx.globalDofIdx] = v.extract(phaseIdx, ectx);
177 Valgrind::CheckDefined(array[ectx.globalDofIdx]);
190 template<
class TypeTag>
196 using FluidState =
typename IntensiveQuantities::FluidState;
198 static constexpr
int numPhases = FluidSystem::numPhases;
199 static constexpr
int oilPhaseIdx = FluidSystem::oilPhaseIdx;
200 static constexpr
int gasPhaseIdx = FluidSystem::gasPhaseIdx;
201 static constexpr
int waterPhaseIdx = FluidSystem::waterPhaseIdx;
208 const FluidState&
fs;
210 const ElementContext& elemCtx;
227 std::variant<std::string_view, std::vector<std::string_view>>
kw;
236 std::variant<std::array<std::string_view, numPhases>,
237 std::array<std::array<std::string_view, numPhases>, 2>>
kw;
244 using Entry = std::variant<ScalarEntry, PhaseEntry>;
251 : data(d), extract(std::move(e))
259 using ExecMap = std::unordered_map<int, std::vector<Exec>>;
262 template<std::
size_t size>
264 const std::array<Entry,size>& handlers)
266 using PhaseViewArray = std::array<std::string_view, numPhases>;
267 using StringViewVec = std::vector<std::string_view>;
271 std::ranges::for_each(
273 [&handlers, &extractors](
auto& bd_info)
276 const auto& [key, cell] = bd_info.first;
277 const auto& handler_info =
278 std::ranges::find_if(
280 [&kw_name = bd_info.first.first, &phase](
const auto& handler)
283 const auto gen_handlers =
284 std::visit(VisitorOverloadSet{
285 [](const ScalarEntry& entry)
287 return std::visit(VisitorOverloadSet{
288 [](const std::string_view& kw) -> StringViewVec
292 [](const StringViewVec& kws) -> StringViewVec
296 [](const PhaseEntry& entry)
298 return std::visit(VisitorOverloadSet{
299 [](const PhaseViewArray& data)
301 return StringViewVec{data.begin(), data.end()};
303 [](const std::array<PhaseViewArray,2>& data)
306 res.reserve(2*numPhases);
307 res.insert(res.end(),
310 res.insert(res.end(),
319 const auto found_handler =
320 std::ranges::find(gen_handlers, kw_name);
321 if (found_handler != gen_handlers.end()) {
322 phase = std::distance(gen_handlers.begin(), found_handler) % numPhases;
324 return found_handler != gen_handlers.end();
328 if (handler_info != handlers.end()) {
329 extractors[cell - 1].emplace_back(
331 std::visit(VisitorOverloadSet{
332 [](const ScalarEntry& e)
338 return [phase, extract = e.extract]
339 (const Context& ectx)
341 static constexpr auto phaseMap = std::array{
346 return extract(phaseMap[phase], ectx);
353 OpmLog::warning(
"Unhandled output keyword",
354 fmt::format(
"Keyword '{}' is unhandled for output " 355 "to summary file.", key));
364 static void process(
const std::vector<Exec>& blockExtractors,
367 std::ranges::for_each(blockExtractors,
369 { *bdata.data = bdata.extract(ectx); });
375 #endif // OPM_OUTPUT_EXTRACTORS_HPP
Definition: alignedallocator.hh:32
typename Properties::Detail::GetPropImpl< TypeTag, Property >::type::type GetPropType
get the type alias defined in the property (equivalent to old macro GET_PROP_TYPE(...))
Definition: propertysystem.hh:233
Defines the common properties required by the porous medium multi-phase models.
Declare the properties used by the infrastructure code of the finite volume discretizations.
The Opm property system, traits with inheritance.
Defines a type tags and some fundamental properties all models.