diff --git a/src/multio/tools/utils/distGrib1ToGrib2ProcessFiles.cc b/src/multio/tools/utils/distGrib1ToGrib2ProcessFiles.cc index bd5265b4c..90acaab45 100644 --- a/src/multio/tools/utils/distGrib1ToGrib2ProcessFiles.cc +++ b/src/multio/tools/utils/distGrib1ToGrib2ProcessFiles.cc @@ -152,6 +152,7 @@ FileOutcome processOneFile(int rank, const std::string& file, const grib2MarsMis case MessageDisposition::SkipInvalidMessage: case MessageDisposition::SkipDiscipline192: case MessageDisposition::SkipTimespanNonPositive: + case MessageDisposition::ComplexExclusion: bumpOutcome(outcome, extractionOutcome.code); break; case MessageDisposition::FailToExtract: diff --git a/src/multio/tools/utils/grib2MarsMisc.cc b/src/multio/tools/utils/grib2MarsMisc.cc index 714140a4f..f1b262eb9 100644 --- a/src/multio/tools/utils/grib2MarsMisc.cc +++ b/src/multio/tools/utils/grib2MarsMisc.cc @@ -465,7 +465,7 @@ namespace extract { void handlePackingType(metkit::codes::CodesHandle& h, const std::string& packingType, dm::FullMarsRecord& mars) { const static std::unordered_map packingMap{ - {"grid_simple", "simple"}, {"grid_complex", "complex"}, {"spectral_complex", "complex"}, + {"grid_simple", "ccsds"}, {"grid_complex", "complex"}, {"spectral_complex", "complex"}, {"grid_ccsds", "ccsds"}, {"grid_ieee", "ccsds"}, {"grid_second_order", "ccsds"}}; const auto packingTypeVal = packingMap.find(packingType); @@ -911,6 +911,12 @@ MessageDisposition classifyTimespanNonPositive(const TimeSpanEqualToZeroHandling return MessageDisposition::FailToExtract; } +MessageDisposition classifyComplexExclusion() { + return MessageDisposition::ComplexExclusion; +} + + + ExtractionOutcome makeOutcome(MessageDisposition disposition, ExtractionOutcomeCode code, std::string reason, std::string detail = {}) { return ExtractionOutcome{disposition, code, std::move(reason), std::move(detail)}; @@ -1222,6 +1228,18 @@ Grib2MarsMiscResult grib2MarsMisc(const eckit::message::Message& msg, const Grib std::string{"timespan="} + std::to_string(marsConfig.getLong("timespan")))); } + + if (marsConfig.has("param") && marsConfig.has("levtype") && marsConfig.has("levelist") ) { + if ( marsConfig.getLong("param") == 152 && marsConfig.getString("levtype") == "ml" && marsConfig.getLong("levelist") == 100000 ) { + const auto disposition = classifyComplexExclusion(); + const auto code = (disposition == MessageDisposition::ComplexExclusion) + ? ExtractionOutcomeCode::ExtractFailedComplexExclusion + : ExtractionOutcomeCode::ExtractFailedUnknownException; + return makeResult(makeOutcome(disposition, code, "complex-exclusion", + std::string{"param="} + std::to_string(marsConfig.getLong("param")))); + } + } + return makeResult( makeOutcome(MessageDisposition::Encode, ExtractionOutcomeCode::ReadyToEncode, "ready-to-encode"), ExtractedMsg{marsConfig, miscConfig, std::move(values)}); diff --git a/src/multio/tools/utils/grib2MarsMisc.h b/src/multio/tools/utils/grib2MarsMisc.h index 8b5f2f989..f06290699 100644 --- a/src/multio/tools/utils/grib2MarsMisc.h +++ b/src/multio/tools/utils/grib2MarsMisc.h @@ -94,6 +94,7 @@ enum class MessageDisposition FailToExtract, FailToEncode, FailToArchive, + ComplexExclusion, }; enum class ExtractionOutcomeCode : std::uint8_t @@ -126,6 +127,7 @@ enum class ExtractionOutcomeCode : std::uint8_t EncodeFailedMars2Grib, ArchiveFailedSinkWrite, ExtractFailedUnknownException, + ExtractFailedComplexExclusion, }; struct ExtractionOutcome {