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));