From ebe8829cd97806472fec5c2280207f77d2b79345 Mon Sep 17 00:00:00 2001 From: Charles Pelletier Date: Mon, 24 Aug 2026 15:02:48 +0000 Subject: [PATCH 1/5] fix levtype for time-mean snow depth (235078/237078/238078/239078) sfc -> sol The sfc->sol levtype fix in fixMapToSol() covered the instantaneous snow depth (228141) but not its statistically processed variants produced by statistics-mtg2 (average->235078, max->237078, min->238078, stddev->239078). As a result the monthly-averaged snow depth kept the wrong levtype and did not encode/archive. Add the four time-processed params to the rule. --- src/multio/mars2mars/Rules.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/multio/mars2mars/Rules.cc b/src/multio/mars2mars/Rules.cc index c44ee2a35..48bee8fb3 100644 --- a/src/multio/mars2mars/Rules.cc +++ b/src/multio/mars2mars/Rules.cc @@ -169,7 +169,7 @@ auto fixMapToSol() { return rule( all(OneOf{&dm::FullMarsRecord::levtype, {dm::LevType::SFC}}, Has{&dm::FullMarsRecord::levelist}, NoneOf{&dm::FullMarsRecord::levelist, {0}}, - matchParams(33, 238, 228038, 228141, 235080, 237080, 238080, 239080, 260360, 262000, 262024, 260199)), // + matchParams(33, 238, 228038, 228141, 235078, 237078, 238078, 239078, 235080, 237080, 238080, 239080, 260360, 262000, 262024, 260199)), // setKey(&dm::FullMarsRecord::levtype, dm::LevType::SOL)); // } From 6b0064171e57ba96768237bdc38404360143eb2e Mon Sep 17 00:00:00 2001 From: Charles Pelletier Date: Wed, 26 Aug 2026 14:49:31 +0000 Subject: [PATCH 2/5] Add statistical mappings for 228038 --- src/multio/mars2mars/Rules.cc | 2 +- .../mars2mars/test_multio_mars2mars_mappings.cc | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/multio/mars2mars/Rules.cc b/src/multio/mars2mars/Rules.cc index 48bee8fb3..6314f989f 100644 --- a/src/multio/mars2mars/Rules.cc +++ b/src/multio/mars2mars/Rules.cc @@ -169,7 +169,7 @@ auto fixMapToSol() { return rule( all(OneOf{&dm::FullMarsRecord::levtype, {dm::LevType::SFC}}, Has{&dm::FullMarsRecord::levelist}, NoneOf{&dm::FullMarsRecord::levelist, {0}}, - matchParams(33, 238, 228038, 228141, 235078, 237078, 238078, 239078, 235080, 237080, 238080, 239080, 260360, 262000, 262024, 260199)), // + matchParams(33, 238, 228038, 228141, 235078, 237078, 238078, 239078, 235080, 237080, 238080, 239080, 235406, 237406, 238406, 239406, 260360, 262000, 262024, 260199)), // setKey(&dm::FullMarsRecord::levtype, dm::LevType::SOL)); // } diff --git a/tests/multio/mars2mars/test_multio_mars2mars_mappings.cc b/tests/multio/mars2mars/test_multio_mars2mars_mappings.cc index 898db8f44..1a41afe72 100644 --- a/tests/multio/mars2mars/test_multio_mars2mars_mappings.cc +++ b/tests/multio/mars2mars/test_multio_mars2mars_mappings.cc @@ -466,7 +466,7 @@ CASE("Test mapToSol") { using namespace multio::mars2mars; using namespace multio::datamod; - std::vector paramIds{{33, 238, 228038, 260360, 262000, 262024, 260199}}; + std::vector paramIds{{33, 238, 228038, 235406, 237406, 238406, 239406, 260360, 262000, 262024, 260199}}; for (auto paramId : paramIds) { FullMarsRecord mars; @@ -481,6 +481,18 @@ CASE("Test mapToSol") { EXPECT(res); EXPECT(mars.levtype.get() == LevType::SOL); } + + FullMarsRecord levelZeroMars; + MiscRecord levelZeroMisc; + + levelZeroMars.param.set(235406); + levelZeroMars.levtype.set(LevType::SFC); + levelZeroMars.levelist.set(0); + + auto levelZeroResult = mars2mars::applyMappings(mars2mars::allRules(), levelZeroMars, levelZeroMisc); + + EXPECT(!levelZeroResult); + EXPECT(levelZeroMars.levtype.get() == LevType::SFC); }; From fc5f7fcb58cf8dd9bca46b2ec1e8c72b49b55ca3 Mon Sep 17 00:00:00 2001 From: Charles Pelletier Date: Thu, 27 Aug 2026 11:53:06 +0000 Subject: [PATCH 3/5] Update fixMapToSol with snow temperature --- src/multio/mars2mars/Rules.cc | 2 +- tests/multio/mars2mars/test_multio_mars2mars_mappings.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/multio/mars2mars/Rules.cc b/src/multio/mars2mars/Rules.cc index 6314f989f..5f6f10edb 100644 --- a/src/multio/mars2mars/Rules.cc +++ b/src/multio/mars2mars/Rules.cc @@ -169,7 +169,7 @@ auto fixMapToSol() { return rule( all(OneOf{&dm::FullMarsRecord::levtype, {dm::LevType::SFC}}, Has{&dm::FullMarsRecord::levelist}, NoneOf{&dm::FullMarsRecord::levelist, {0}}, - matchParams(33, 238, 228038, 228141, 235078, 237078, 238078, 239078, 235080, 237080, 238080, 239080, 235406, 237406, 238406, 239406, 260360, 262000, 262024, 260199)), // + matchParams(33, 238, 228038, 228141, 235078, 237078, 238078, 239078, 235080, 237080, 238080, 239080, 235238, 237238, 238238, 239238, 235406, 237406, 238406, 239406, 260360, 262000, 262024, 260199)), // setKey(&dm::FullMarsRecord::levtype, dm::LevType::SOL)); // } diff --git a/tests/multio/mars2mars/test_multio_mars2mars_mappings.cc b/tests/multio/mars2mars/test_multio_mars2mars_mappings.cc index 1a41afe72..33ce018ed 100644 --- a/tests/multio/mars2mars/test_multio_mars2mars_mappings.cc +++ b/tests/multio/mars2mars/test_multio_mars2mars_mappings.cc @@ -466,7 +466,7 @@ CASE("Test mapToSol") { using namespace multio::mars2mars; using namespace multio::datamod; - std::vector paramIds{{33, 238, 228038, 235406, 237406, 238406, 239406, 260360, 262000, 262024, 260199}}; + std::vector paramIds{{33, 238, 228038, 235238, 237238, 238238, 239238, 235406, 237406, 238406, 239406, 260360, 262000, 262024, 260199}}; for (auto paramId : paramIds) { FullMarsRecord mars; From d18aa2181e9bbb04474940c063835346fb576b8f Mon Sep 17 00:00:00 2001 From: Charles Pelletier Date: Fri, 28 Aug 2026 13:28:16 +0000 Subject: [PATCH 4/5] Ensure clean merge into develop --- src/multio/mars2mars/Rules.cc | 12 +++++++++++- .../mars2mars/test_multio_mars2mars_mappings.cc | 4 +++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/multio/mars2mars/Rules.cc b/src/multio/mars2mars/Rules.cc index 5f6f10edb..8a99c794c 100644 --- a/src/multio/mars2mars/Rules.cc +++ b/src/multio/mars2mars/Rules.cc @@ -169,10 +169,19 @@ auto fixMapToSol() { return rule( all(OneOf{&dm::FullMarsRecord::levtype, {dm::LevType::SFC}}, Has{&dm::FullMarsRecord::levelist}, NoneOf{&dm::FullMarsRecord::levelist, {0}}, - matchParams(33, 238, 228038, 228141, 235078, 237078, 238078, 239078, 235080, 237080, 238080, 239080, 235238, 237238, 238238, 239238, 235406, 237406, 238406, 239406, 260360, 262000, 262024, 260199)), // + matchParams(33, 238, 228038, 228141, 235080, 237080, 238080, 239080, 260360, 262000, 262024, 260199)), // setKey(&dm::FullMarsRecord::levtype, dm::LevType::SOL)); // } +auto fixSnowMapToSol() { + return rule( + all(OneOf{&dm::FullMarsRecord::levtype, {dm::LevType::SFC}}, Has{&dm::FullMarsRecord::levelist}, + NoneOf{&dm::FullMarsRecord::levelist, {0}}, + matchParams(235078, 237078, 238078, 239078, 235238, 237238, 238238, 239238, + 235406, 237406, 238406, 239406)), // + setKey(&dm::FullMarsRecord::levtype, dm::LevType::SOL)); +} + auto fixRunOffWaterParam205() { return rule(all(matchParams(205)), // @@ -662,6 +671,7 @@ const RuleList& fixIFSOutput() { fixHeightAboveGround10m(), // fixHeightAboveSea(), // fixMapToSol(), // + fixSnowMapToSol(), // fixWindspeedU100m(), // fixWindspeedU200m(), // fixWindspeedV100m(), // diff --git a/tests/multio/mars2mars/test_multio_mars2mars_mappings.cc b/tests/multio/mars2mars/test_multio_mars2mars_mappings.cc index 33ce018ed..c8ffabfa1 100644 --- a/tests/multio/mars2mars/test_multio_mars2mars_mappings.cc +++ b/tests/multio/mars2mars/test_multio_mars2mars_mappings.cc @@ -466,7 +466,9 @@ CASE("Test mapToSol") { using namespace multio::mars2mars; using namespace multio::datamod; - std::vector paramIds{{33, 238, 228038, 235238, 237238, 238238, 239238, 235406, 237406, 238406, 239406, 260360, 262000, 262024, 260199}}; + std::vector paramIds{{33, 238, 228038, 228141, 235078, 237078, 238078, 239078, 235080, 237080, + 238080, 239080, 235238, 237238, 238238, 239238, 235406, 237406, 238406, + 239406, 260360, 262000, 262024, 260199}}; for (auto paramId : paramIds) { FullMarsRecord mars; From 37e006ba83e4cb30bbee44381692d4200a98c27a Mon Sep 17 00:00:00 2001 From: Charles Pelletier Date: Thu, 10 Sep 2026 12:34:44 +0000 Subject: [PATCH 5/5] Update mars2mars mapping test to cover all sfc->sol mapped variables --- .../test_multio_mars2mars_mappings.cc | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/tests/multio/mars2mars/test_multio_mars2mars_mappings.cc b/tests/multio/mars2mars/test_multio_mars2mars_mappings.cc index c8ffabfa1..b213134d2 100644 --- a/tests/multio/mars2mars/test_multio_mars2mars_mappings.cc +++ b/tests/multio/mars2mars/test_multio_mars2mars_mappings.cc @@ -484,17 +484,19 @@ CASE("Test mapToSol") { EXPECT(mars.levtype.get() == LevType::SOL); } - FullMarsRecord levelZeroMars; - MiscRecord levelZeroMisc; + for (auto paramId : paramIds) { + FullMarsRecord levelZeroMars; + MiscRecord levelZeroMisc; - levelZeroMars.param.set(235406); - levelZeroMars.levtype.set(LevType::SFC); - levelZeroMars.levelist.set(0); + levelZeroMars.param.set(paramId); + levelZeroMars.levtype.set(LevType::SFC); + levelZeroMars.levelist.set(0); - auto levelZeroResult = mars2mars::applyMappings(mars2mars::allRules(), levelZeroMars, levelZeroMisc); + auto levelZeroResult = mars2mars::applyMappings(mars2mars::allRules(), levelZeroMars, levelZeroMisc); - EXPECT(!levelZeroResult); - EXPECT(levelZeroMars.levtype.get() == LevType::SFC); + EXPECT(!levelZeroResult); + EXPECT(levelZeroMars.levtype.get() == LevType::SFC); + } };