265 const std::array<Entry,size>& handlers)
267 using PhaseViewArray = std::array<std::string_view, numPhases>;
268 using StringViewVec = std::vector<std::string_view>;
275 [&handlers, &extractors](
auto& bd_info)
278 const auto& [key, cell] = bd_info.first;
279 const auto& handler_info =
283 [&kw_name = bd_info.first.first, &phase](
const auto& handler)
286 const auto gen_handlers =
287 std::visit(VisitorOverloadSet{
288 [](const ScalarEntry& entry)
290 return std::visit(VisitorOverloadSet{
291 [](const std::string_view& kw) -> StringViewVec
295 [](const StringViewVec& kws) -> StringViewVec
299 [](const PhaseEntry& entry)
301 return std::visit(VisitorOverloadSet{
302 [](const PhaseViewArray& data)
304 return StringViewVec{data.begin(), data.end()};
306 [](const std::array<PhaseViewArray,2>& data)
309 res.reserve(2*numPhases);
310 res.insert(res.end(),
313 res.insert(res.end(),
322 const auto found_handler =
323 std::find(gen_handlers.begin(), gen_handlers.end(), kw_name);
324 if (found_handler != gen_handlers.end()) {
325 phase = std::distance(gen_handlers.begin(), found_handler) % numPhases;
327 return found_handler != gen_handlers.end();
331 if (handler_info != handlers.end()) {
332 extractors[cell - 1].emplace_back(
334 std::visit(VisitorOverloadSet{
335 [](const ScalarEntry& e)
339 [phase](
const PhaseEntry& e) -> ScalarFunc
341 return [phase, extract = e.extract]
342 (const Context& ectx)
344 static constexpr auto phaseMap = std::array{
349 return extract(phaseMap[phase], ectx);
356 OpmLog::warning(
"Unhandled output keyword",
357 fmt::format(
"Keyword '{}' is unhandled for output "
358 "to summary file.", key));