diff -Nru metview-5.19.1/CMakeLists.txt metview-5.19.2/CMakeLists.txt --- metview-5.19.1/CMakeLists.txt 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/CMakeLists.txt 2023-07-15 08:28:47.000000000 +0000 @@ -6,7 +6,7 @@ #set( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake;${CMAKE_MODULE_PATH}" ) -project( MetviewMiniBundle VERSION 5.19.1 LANGUAGES C CXX ) +project( MetviewMiniBundle VERSION 5.19.2 LANGUAGES C CXX ) set(CPACK_PACKAGE_NAME Metview) # so that the source tarball will have the name 'Metview' @@ -82,11 +82,11 @@ set(FDB_DIR "/dummy/path/for/bundle") endif() - my_bundle_pkg( PROJECT eckit GIT "ssh://git@git.ecmwf.int/ecsdk/eckit" TAG 1.23.0 ) - my_bundle_pkg( PROJECT atlas GIT "ssh://git@git.ecmwf.int/atlas/atlas" TAG 0.33.0 ) - my_bundle_pkg( PROJECT mir GIT "ssh://git@git.ecmwf.int/mir/mir" TAG 1.16.5 ) + my_bundle_pkg( PROJECT eckit GIT "ssh://git@git.ecmwf.int/ecsdk/eckit" TAG 1.24.3 ) + my_bundle_pkg( PROJECT atlas GIT "ssh://git@git.ecmwf.int/atlas/atlas" TAG 0.34.0 ) + my_bundle_pkg( PROJECT mir GIT "ssh://git@git.ecmwf.int/mir/mir" TAG 1.17.2 ) my_bundle_pkg( PROJECT mars-client GIT "ssh://git@git.ecmwf.int/mars/mars-client" TAG 6.33.15 ) - my_bundle_pkg( PROJECT metview GIT "ssh://git@git.ecmwf.int/metv/metview" TAG 5.19.1 ) + my_bundle_pkg( PROJECT metview GIT "ssh://git@git.ecmwf.int/metv/metview" TAG 5.19.2 ) ecbuild_dont_pack(FILES configure.sh;ecmwf;make-tarball.sh;test-tarball.sh;configure.clang.sh;bamboo) diff -Nru metview-5.19.1/debian/changelog metview-5.19.2/debian/changelog --- metview-5.19.1/debian/changelog 2023-06-19 18:57:51.000000000 +0000 +++ metview-5.19.2/debian/changelog 2023-07-15 08:28:25.000000000 +0000 @@ -1,3 +1,10 @@ +metview (5.19.2-1) unstable; urgency=medium + + * New upstream release + * Rebase patches + + -- Alastair McKinstry Sat, 15 Jul 2023 09:28:25 +0100 + metview (5.19.1-3) unstable; urgency=medium * Move from libnercdf-legacy-cxx-dev. Closes: #1038596 diff -Nru metview-5.19.1/debian/patches/use-external-eckit-atlas.patch metview-5.19.2/debian/patches/use-external-eckit-atlas.patch --- metview-5.19.1/debian/patches/use-external-eckit-atlas.patch 2023-06-19 18:57:51.000000000 +0000 +++ metview-5.19.2/debian/patches/use-external-eckit-atlas.patch 2023-07-15 08:28:25.000000000 +0000 @@ -18,10 +18,10 @@ set(FDB_DIR "/dummy/path/for/bundle") endif() -- my_bundle_pkg( PROJECT eckit GIT "ssh://git@git.ecmwf.int/ecsdk/eckit" TAG 1.23.0 ) -- my_bundle_pkg( PROJECT atlas GIT "ssh://git@git.ecmwf.int/atlas/atlas" TAG 0.33.0 ) -+ #my_bundle_pkg( PROJECT eckit GIT "ssh://git@git.ecmwf.int/ecsdk/eckit" TAG 1.23.0 ) -+ #my_bundle_pkg( PROJECT atlas GIT "ssh://git@git.ecmwf.int/atlas/atlas" TAG 0.33.0 ) - my_bundle_pkg( PROJECT mir GIT "ssh://git@git.ecmwf.int/mir/mir" TAG 1.16.5 ) +- my_bundle_pkg( PROJECT eckit GIT "ssh://git@git.ecmwf.int/ecsdk/eckit" TAG 1.24.3 ) +- my_bundle_pkg( PROJECT atlas GIT "ssh://git@git.ecmwf.int/atlas/atlas" TAG 0.34.0 ) ++# my_bundle_pkg( PROJECT eckit GIT "ssh://git@git.ecmwf.int/ecsdk/eckit" TAG 1.24.3 ) ++# my_bundle_pkg( PROJECT atlas GIT "ssh://git@git.ecmwf.int/atlas/atlas" TAG 0.34.0 ) + my_bundle_pkg( PROJECT mir GIT "ssh://git@git.ecmwf.int/mir/mir" TAG 1.17.2 ) my_bundle_pkg( PROJECT mars-client GIT "ssh://git@git.ecmwf.int/mars/mars-client" TAG 6.33.15 ) - my_bundle_pkg( PROJECT metview GIT "ssh://git@git.ecmwf.int/metv/metview" TAG 5.19.1 ) + my_bundle_pkg( PROJECT metview GIT "ssh://git@git.ecmwf.int/metv/metview" TAG 5.19.2 ) diff -Nru metview-5.19.1/metview/CMakeLists.txt metview-5.19.2/metview/CMakeLists.txt --- metview-5.19.1/metview/CMakeLists.txt 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/metview/CMakeLists.txt 2023-07-15 08:28:47.000000000 +0000 @@ -44,7 +44,7 @@ set(ORIGINAL_INSTALL_BIN_DIR ${INSTALL_BIN_DIR}) # will restore at the end set(INSTALL_BIN_DIR "${MV_BIN_DIR}" CACHE PATH "Metview installation directory for executable files") -project(metview VERSION 5.19.1 LANGUAGES C CXX) +project(metview LANGUAGES C CXX) set(CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE OFF) diff -Nru metview-5.19.1/metview/share/metview/etc/obsgroups.def metview-5.19.2/metview/share/metview/etc/obsgroups.def --- metview-5.19.1/metview/share/metview/etc/obsgroups.def 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/metview/share/metview/etc/obsgroups.def 2023-07-15 08:28:47.000000000 +0000 @@ -64,4 +64,5 @@ 66 ; OCONV ; OCONV 67 ; MWTS3 All-sky ; MWTS3_AS 68 ; GIIRS ; GIIRS +69 ; HIRAS ; HIRAS 99 ; TEST ; TEST diff -Nru metview-5.19.1/metview/share/metview/etc/reportypes.def metview-5.19.2/metview/share/metview/etc/reportypes.def --- metview-5.19.1/metview/share/metview/etc/reportypes.def 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/metview/share/metview/etc/reportypes.def 2023-07-15 08:28:47.000000000 +0000 @@ -67,6 +67,7 @@ GOES 16 GEOS Radiances ; 4025 GOES 17 GEOS Radiances ; 4026 GOES 18 GEOS Radiances ; 4027 +METEOSAT 12 GEOS Allsky Radiances ; 4028 ERS 2 GOME O3 ; 5001 METEOSAT 8 SEVIRI O3 ; 5002 METEOSAT 9 SEVIRI O3 ; 5003 @@ -197,6 +198,7 @@ SPIRE Lemur 3U GPSRO ; 7030 Sentinel 6A GPSRO ; 7031 FY-3E GPSRO ; 7032 +PlanetiQ GPSRO ; 7033 METEOSAT 2 AMV ; 8001 METEOSAT 3 AMV ; 8002 METEOSAT 4 AMV ; 8003 @@ -492,7 +494,7 @@ METOP-C GOME-2 layer integrated mass density with averaging kernels ; 35019 METOP-C GOME-2 layer integrated mass density with averaging kernels and a priori profile ; 35020 METOP-C IASI layer volumetric mixing ratio with averaging kernels and a priori profile ; 35021 -Orbiting Carbon Observatory-2 OCO CO2 ; 35022 +OCO-2 OCO layer volumetric mixing ratio with averaging kernels and a priori profile ; 35022 NPP CRIS Radiances ; 36001 NOAA 20 CRIS Radiances ; 36002 NOAA 21 CRIS Radiances ; 36003 @@ -520,6 +522,7 @@ MeteoFrance SST ; 40003 OSTIA ; 40004 OSISAF SEA ICE ; 40005 +AVHRR CCI snow cover ; 40006 GCOM-W1 AMSR-2 Radiances All-sky ; 41001 SAPHIR All-sky ; 42001 AMSUB NOAA 15 AMSUB Radiances All-sky ; 43001 @@ -574,6 +577,8 @@ METEOSAT 11 SEVIRI Reflectances ; 64001 GOES 18 ABI Reflectances ; 64002 METEOSAT 10 SEVIRI Reflectances ; 64003 +GOES 16 ABI Reflectances ; 64004 +METEOSAT 9 SEVIRI Reflectances ; 64005 ARGO float ; 65001 Animal borne sensor ; 65002 Ocean Station Vessel On Station ; 65049 @@ -594,6 +599,8 @@ FY-3E MWTS3 Radiances All-sky ; 66001 FY-4A GIIRS Radiances ; 67001 FY-4B GIIRS Radiances ; 67002 +FY-3D HIRAS Radiances ; 68001 +FY-3E HIRAS-2 Radiances ; 68002 TEST REPORTYPE 1 ; 98001 TEST REPORTYPE 2 ; 98002 TEST REPORTYPE 3 ; 98003 diff -Nru metview-5.19.1/metview/share/metview/etc/rt_by_obsgroup.chk metview-5.19.2/metview/share/metview/etc/rt_by_obsgroup.chk --- metview-5.19.1/metview/share/metview/etc/rt_by_obsgroup.chk 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/metview/share/metview/etc/rt_by_obsgroup.chk 2023-07-15 08:28:47.000000000 +0000 @@ -11,7 +11,7 @@ %set REPORTYPE = 3001/3002/3003/3004/3005 %if (TYPE = OFB %or TYPE = MFB %or TYPE = OAI %or TYPE = SFB %or TYPE = FSOIFB %or TYPE = FCDFB) %and (OBSGROUP = GEOS ) %and %not REPORTYPE %then - %set REPORTYPE = 4002/4003/4004/4005/4006/4007/4008/4009/4010/4011/4012/4013/4014/4015/4016/4017/4018/4019/4020/4021/4022/4023/4024/4025/4026/4027 + %set REPORTYPE = 4002/4003/4004/4005/4006/4007/4008/4009/4010/4011/4012/4013/4014/4015/4016/4017/4018/4019/4020/4021/4022/4023/4024/4025/4026/4027/4028 %if (TYPE = OFB %or TYPE = MFB %or TYPE = OAI %or TYPE = SFB %or TYPE = FSOIFB %or TYPE = FCDFB) %and (OBSGROUP = RESAT ) %and %not REPORTYPE %then %set REPORTYPE = 5001/5002/5003/5004/5005/5006/5007/5008/5009/5010/5011/5012/5013/5014/5015/5016/5017/5018/5019/5020/5021/5022/5023/5024/5025/5026/5027/5028/5029/5030/5031/5032/5033/5034/5035/5036/5037/5038/5039/5040/5041/5042/5043/5044/5045/5046/5047/5048/5049/5050/5051/5052/5053/5054/5055/5056/5057/5058/5059/5060/5061/5062/5063/5064/5065/5066/5067/5068/5069/5070/5071/5072/5073/5074/5075/5076/5077/5078/5079/5080/5081/5082/5083/5084/5085/5086/5087/5088/5089/5090/5091/5092/5093/5094/5096 @@ -20,7 +20,7 @@ %set REPORTYPE = 6001/6002/6003 %if (TYPE = OFB %or TYPE = MFB %or TYPE = OAI %or TYPE = SFB %or TYPE = FSOIFB %or TYPE = FCDFB) %and (OBSGROUP = GPSRO ) %and %not REPORTYPE %then - %set REPORTYPE = 7001/7002/7003/7004/7005/7006/7007/7008/7009/7010/7011/7012/7013/7014/7015/7016/7017/7018/7019/7020/7021/7022/7023/7024/7025/7026/7027/7028/7029/7030/7031/7032 + %set REPORTYPE = 7001/7002/7003/7004/7005/7006/7007/7008/7009/7010/7011/7012/7013/7014/7015/7016/7017/7018/7019/7020/7021/7022/7023/7024/7025/7026/7027/7028/7029/7030/7031/7032/7033 %if (TYPE = OFB %or TYPE = MFB %or TYPE = OAI %or TYPE = SFB %or TYPE = FSOIFB %or TYPE = FCDFB) %and (OBSGROUP = SATOB ) %and %not REPORTYPE %then %set REPORTYPE = 8001/8002/8003/8004/8005/8006/8007/8008/8009/8010/8011/8012/8013/8014/8015/8016/8017/8018/8019/8020/8021/8022/8023/8024/8025/8026/8027/8028/8029/8030/8031/8032/8033/8034/8035/8036/8037/8038/8039/8040/8041/8042/8043/8044/8045/8046/8047/8048/8049/8050/8051/8052/8053/8054/8055/8056/8057/8058/8059/8060/8061/8062/8063/8064/8065/8066/8067 @@ -116,7 +116,7 @@ %set REPORTYPE = 39001/39002/39003/39004/39005 %if (TYPE = OFB %or TYPE = MFB %or TYPE = OAI %or TYPE = SFB %or TYPE = FSOIFB %or TYPE = FCDFB) %and (OBSGROUP = SFC_MS ) %and %not REPORTYPE %then - %set REPORTYPE = 40001/40002/40003/40004/40005 + %set REPORTYPE = 40001/40002/40003/40004/40005/40006 %if (TYPE = OFB %or TYPE = MFB %or TYPE = OAI %or TYPE = SFB %or TYPE = FSOIFB %or TYPE = FCDFB) %and (OBSGROUP = AMSR2_AS ) %and %not REPORTYPE %then %set REPORTYPE = 41001 @@ -185,7 +185,7 @@ %set REPORTYPE = 63001 %if (TYPE = OFB %or TYPE = MFB %or TYPE = OAI %or TYPE = SFB %or TYPE = FSOIFB %or TYPE = FCDFB) %and (OBSGROUP = GEOS_VIS ) %and %not REPORTYPE %then - %set REPORTYPE = 64001/64002/64003 + %set REPORTYPE = 64001/64002/64003/64004/64005 %if (TYPE = OFB %or TYPE = MFB %or TYPE = OAI %or TYPE = SFB %or TYPE = FSOIFB %or TYPE = FCDFB) %and (OBSGROUP = OCONV ) %and %not REPORTYPE %then %set REPORTYPE = 65001/65002/65049/65050/65051/65052/65053/65054/65056/65057/65061/65062/65063/65064/65083/65084/65090 @@ -196,6 +196,9 @@ %if (TYPE = OFB %or TYPE = MFB %or TYPE = OAI %or TYPE = SFB %or TYPE = FSOIFB %or TYPE = FCDFB) %and (OBSGROUP = GIIRS ) %and %not REPORTYPE %then %set REPORTYPE = 67001/67002 +%if (TYPE = OFB %or TYPE = MFB %or TYPE = OAI %or TYPE = SFB %or TYPE = FSOIFB %or TYPE = FCDFB) %and (OBSGROUP = HIRAS ) %and %not REPORTYPE %then + %set REPORTYPE = 68001/68002 + %if (TYPE = OFB %or TYPE = MFB %or TYPE = OAI %or TYPE = SFB %or TYPE = FSOIFB %or TYPE = FCDFB) %and (OBSGROUP = TEST ) %and %not REPORTYPE %then %set REPORTYPE = 98001/98002/98003/98004/98005/98006/98007/98008/98009/98010/98011/98012/98013/98014/98015/98016/98017/98018/98019/98020/98021/98022/98023/98024/98025/98026/98027/98028/98029/98030/98031/98032/98033/98034/98035/98036/98037/98038/98039/98040 diff -Nru metview-5.19.1/metview/src/DebugTools/ProcMonitor.cc metview-5.19.2/metview/src/DebugTools/ProcMonitor.cc --- metview-5.19.1/metview/src/DebugTools/ProcMonitor.cc 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/metview/src/DebugTools/ProcMonitor.cc 2023-07-15 08:28:47.000000000 +0000 @@ -28,6 +28,7 @@ #include "ProcMonitor.h" +#include #include #include "MvQPixmapCache.h" @@ -277,7 +278,8 @@ // qDebug() << "busy" << name << reqid; } else if (mode == "SERVICE") { - long reqid = atol(get_value(r, "REQ_ID", 0)); + auto v = get_value(r, "REQ_ID", 0); + long reqid = (v != nullptr)?std::atol(v):0; MvProcNode::addProcRequest(reqid, ref, name.toStdString(), r); // long reqId = atol(get_value(r, "REQ_ID", 0)); // long from = atol(get_value(r, "SOURCE_REF", 0)); diff -Nru metview-5.19.1/metview/src/Ecfile/Ecfs.cc metview-5.19.2/metview/src/Ecfile/Ecfs.cc --- metview-5.19.1/metview/src/Ecfile/Ecfs.cc 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/metview/src/Ecfile/Ecfs.cc 2023-07-15 08:28:47.000000000 +0000 @@ -26,7 +26,7 @@ { const char* path = in("FILE_NAME"); const char* domain = in("ECFS_DOMAIN"); - char buf[1024]; + char buf[1096]; char ecfs_cmd[1024]; char* tmp = marstmp(); diff -Nru metview-5.19.1/metview/src/Hovmoeller/HovHeight.cc metview-5.19.2/metview/src/Hovmoeller/HovHeight.cc --- metview-5.19.1/metview/src/Hovmoeller/HovHeight.cc 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/metview/src/Hovmoeller/HovHeight.cc 2023-07-15 08:28:47.000000000 +0000 @@ -507,7 +507,10 @@ } } else { - throw MvException(moduleLabel_ + "Invalid date/time in input data!"); + std::string msg("Trying to convert from model levels to pressure levels " + "but cannot find lnsp field for time step "); + msg += TimeKeyToUserString(timeKey); + throw MvException(moduleLabel_ + msg); } } } diff -Nru metview-5.19.1/metview/src/Hovmoeller/HovToolkit.cc metview-5.19.2/metview/src/Hovmoeller/HovToolkit.cc --- metview-5.19.1/metview/src/Hovmoeller/HovToolkit.cc 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/metview/src/Hovmoeller/HovToolkit.cc 2023-07-15 08:28:47.000000000 +0000 @@ -481,12 +481,13 @@ return; } -double HovToolkit::GetDateDif(std::string& timekey) +// step as double to help prepare for sub-hourly steps +void HovToolkit::GetComponentsFromTimeKeyf(const std::string& timekey, MvDate& date, double& step) { // Extract date information - double ddate = atof(timekey.substr(0, 8).c_str()); - double dhour = atof(timekey.substr(8, 2).c_str()); - double dmin = atof(timekey.substr(10, 2).c_str()); + int ddate = atoi(timekey.substr(0, 8).c_str()); + int dhour = atoi(timekey.substr(8, 2).c_str()); + int dmin = atoi(timekey.substr(10, 2).c_str()); double dstep = 0.; std::string strStep = timekey.substr(12, HOV_STEPSIZE); @@ -503,25 +504,57 @@ else { dstep = 0; // nothing but zeros } - - // Compute hour+min+step in fraction of days - double frac = dhour * 3600. / 86400. + dmin * 60. / 86400. + dstep * 3600. / 86400.; + step = dstep; // export to calling function // If it is a monthly mean parameter, add 1 to original date if (fmod(ddate, 100) == 0.) ddate++; + // Compute hour+min+step in fraction of days + double frac = dhour * 3600. / 86400. + dmin * 60. / 86400.; + // Compute new date MvDate ndate(ddate); ndate += frac; + date = ndate; // export to calling function +} + +double HovToolkit::GetDateDif(const std::string& timekey) +{ + // Extract date information + MvDate ddate; + double dstep; + GetComponentsFromTimeKeyf(timekey, ddate, dstep); + + // Compute step in fraction of days + double stepfrac = dstep * 3600. / 86400.; + + // Compute new date + ddate += stepfrac; // Compute the difference from the reference date MvDate ref(GetRefTime()); - double dif = ref.time_interval_hours(ndate); + double dif = ref.time_interval_hours(ddate); return dif; } +// used for generating error messages +std::string HovToolkit::TimeKeyToUserString(const std::string& timekey) +{ + // Extract date information + MvDate ddate; + double dstep; + GetComponentsFromTimeKeyf(timekey, ddate, dstep); + + char dateCStr[1024]; + ddate.Format("yyyy-mm-dd HH:MM", dateCStr); + std::string dateStr(dateCStr); + dateStr += " step " + std::to_string(int(dstep)) + "h"; // XX ASSUMES hours + + return std::string(dateStr); +} + MvDate HovToolkit::GetDate(MvField& field) { // Compute initial date diff -Nru metview-5.19.1/metview/src/Hovmoeller/HovToolkit.h metview-5.19.2/metview/src/Hovmoeller/HovToolkit.h --- metview-5.19.1/metview/src/Hovmoeller/HovToolkit.h 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/metview/src/Hovmoeller/HovToolkit.h 2023-07-15 08:28:47.000000000 +0000 @@ -94,7 +94,9 @@ double GetRefTime() { return refTime_; } void SetRefTime(double ref) { refTime_ = ref; } MvDate GetDate(MvField&); - double GetDateDif(std::string&); + void GetComponentsFromTimeKeyf(const std::string& timekey, MvDate& date, double& step); + double GetDateDif(const std::string&); + std::string TimeKeyToUserString(const std::string& timekey); bool GetTimeInfo(); void GetTimeInfoFromParam(); diff -Nru metview-5.19.1/metview/src/Macro/value.cc metview-5.19.2/metview/src/Macro/value.cc --- metview-5.19.1/metview/src/Macro/value.cc 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/metview/src/Macro/value.cc 2023-07-15 08:28:47.000000000 +0000 @@ -546,6 +546,15 @@ g2->refcnt++; g1->refcnt--; f1->file = g2; + // if no one is pointing to g1 we need to delete the object + // without removing the file from disk. Not deleting g1 will + // result in a memory leak. See: METV-3389 + if (g1->refcnt <= 0) { + // we need to pretend g1 is not temporary. Otherwise + // free_gribfile() would delete the file from disk! + g1->temp = 0; + free_gribfile(g1); + } break; // don't need to search fs1 any further } } diff -Nru metview-5.19.1/metview/VERSION metview-5.19.2/metview/VERSION --- metview-5.19.1/metview/VERSION 1970-01-01 00:00:00.000000000 +0000 +++ metview-5.19.2/metview/VERSION 2023-07-15 08:28:47.000000000 +0000 @@ -0,0 +1 @@ +5.19.2 diff -Nru metview-5.19.1/mir/CMakeLists.txt metview-5.19.2/mir/CMakeLists.txt --- metview-5.19.1/mir/CMakeLists.txt 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/CMakeLists.txt 2023-07-15 08:28:47.000000000 +0000 @@ -12,7 +12,7 @@ find_package(ecbuild 3.4 REQUIRED HINTS ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/../ecbuild) -project(mir VERSION 1.16.5 LANGUAGES CXX) +project(mir LANGUAGES CXX) set(PERSISTENT_NAMESPACE "eckit" CACHE INTERNAL "") # needed for generating .b files for persistent support set(CMAKE_CXX_STANDARD 17) diff -Nru metview-5.19.1/mir/etc/mir/classes.yaml metview-5.19.2/mir/etc/mir/classes.yaml --- metview-5.19.1/mir/etc/mir/classes.yaml 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/etc/mir/classes.yaml 2023-07-15 08:28:47.000000000 +0000 @@ -148,6 +148,10 @@ # quantity expressing the internal forces arising from deformation exerted from external forces (typical units: [Pa]) stress: {} +# fractional quantity (relative to total) in a grid-box description +tile-fraction: + interpolation: nearest-neighbour + orca.arrangement.f: orca-arrangement: F diff -Nru metview-5.19.1/mir/etc/mir/config.yaml metview-5.19.2/mir/etc/mir/config.yaml --- metview-5.19.1/mir/etc/mir/config.yaml 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/etc/mir/config.yaml 2023-07-15 08:28:47.000000000 +0000 @@ -1,8 +1,5 @@ --- -legendre-loader: mapped-memory -matrix-loader: file-io - post-process: - accuracy - bitmap diff -Nru metview-5.19.1/mir/etc/mir/parameter-class.yaml metview-5.19.2/mir/etc/mir/parameter-class.yaml --- metview-5.19.1/mir/etc/mir/parameter-class.yaml 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/etc/mir/parameter-class.yaml 2023-07-15 08:28:47.000000000 +0000 @@ -530,6 +530,7 @@ - 228246 # 100 metre U wind component - 230180 # East-West surface stress (variable resolution) - 230195 # Longitudinal component of gravity wave stress (variable resolution) +- 233000 # Time-integrated total column vertically-integrated eastward geopotential flux - 235041 # Mean eastward turbulent surface stress - 235045 # Mean eastward gravity wave surface stress - 260062 # Momentum flux, u component @@ -625,6 +626,7 @@ - 228247 # 100 metre V wind component - 230181 # North-South surface stress (variable resolution) - 230196 # Meridional component of gravity wave stress (variable resolution) +- 233001 # Time-integrated total column vertically-integrated northward geopotential flux - 235042 # Mean northward turbulent surface stress - 235046 # Mean northward gravity wave surface stress - 260063 # Momentum flux, v component @@ -887,8 +889,6 @@ - 3096 # V-component of ice drift - 3098 # Ice divergence - 3100 # Signific.height,combined wind waves+swell -- 3102 # Significant height of wind waves -- 3103 # Mean period of wind waves - 3105 # Significant height of swell waves - 3106 # Mean period of swell waves - 3108 # Primary wave mean period @@ -1684,6 +1684,10 @@ - 230082 # Accumulated Carbon Dioxide Ecosystem Respiration (variable resolution) - 230189 # Sunshine duration (variable resolution) - 230198 # Skin reservoir content (variable resolution) +- 231008 # Forecast logarithm of surface roughness length for moisture +- 232004 # Fuel load +- 233002 # Time-integrated total column vertically-integrated divergence of water geopotential flux +- 233003 # Time-integrated total column vertically-integrated divergence of geopotential flux - 235001 # Mean temperature tendency due to short-wave radiation - 235002 # Mean temperature tendency due to long-wave radiation - 235003 # Mean temperature tendency due to short-wave radiation, clear sky @@ -1715,7 +1719,6 @@ - 260071 # V-component storm motion - 260073 # Frictional velocity - 260074 # Pressure reduced to MSL -- 260075 # Geometric height - 260076 # Altimeter setting - 260077 # Thickness - 260078 # Pressure altitude @@ -1723,7 +1726,6 @@ - 260080 # 5-wave geopotential height - 260081 # Zonal flux of gravity wave stress - 260082 # Meridional flux of gravity wave stress -- 260083 # Planetary boundary layer height - 260084 # 5-wave geopotential height anomaly - 260085 # Standard deviation of sub-grid scale orography - 260101 # Cloud Ice @@ -1911,6 +1913,7 @@ - 261020 # Physiological equivalent temperature - 261021 # Saturation water vapor pressure - 261022 # Wet-bulb potential temperature +- 262143 # Sea surface height with inverse barometer correction - 300001 # Pressure - 300002 # Pressure reduced to msl - 300003 # Pressure tendency @@ -2128,6 +2131,9 @@ - 260472 # Time-mean snow depth water equivalent - 260473 # Time-mean skin temperature - 260477 # Time-mean snow melt rate in the last 24h +- 435001 # mean net ecosystem exchange flux +- 436001 # mean gross primary production flux  +- 437001 # mean ecosystem respiration flux numerics.accumulated: - 8 # Surface runoff @@ -2453,6 +2459,7 @@ - 228101 # Evaporation from bare soil - 228102 # Evaporation from open water surfaces excluding oceans - 228103 # Evaporation from vegetation transpiration +- 228109 # Accumulated mass emission of methane from Wetlands - 228129 # Surface solar radiation downward clear-sky - 228130 # Surface thermal radiation downward clear-sky - 228141 # Snow depth water equivalent @@ -2510,6 +2517,12 @@ - 231002 # Runoff water equivalent - 231003 # Snow evaporation water equivalent - 231005 # Potential evaporation +- 231010 # Surface runoff +- 231012 # Sub-surface runoff +- 233000 # Time-integrated total column vertically-integrated eastward geopotential flux +- 233001 # Time-integrated total column vertically-integrated northward geopotential flux +- 233002 # Time-integrated total column vertically-integrated divergence of water geopotential flux +- 233003 # Time-integrated total column vertically-integrated divergence of geopotential flux - 235015 # Time integral of rain flux - 235017 # Time integral of surface eastward momentum flux - 235018 # Time integral of surface northward momentum flux @@ -2557,6 +2570,9 @@ - 260645 # Time integral of total solid precipitation flux - 300065 # Wat equiv acc snow depth - 300177 # Potential sfc evaporation +- 435002 # Accumulated net ecosystem exchange flux +- 436002 # Accumulated gross primary production flux  +- 437002 # Accumulated ecosystem respiration flux numerics.vertical-integral: - 78 # Total column cloud liquid water @@ -2943,6 +2959,10 @@ - 228088 # Total column supercooled liquid water - 228089 # Total column rain water - 228090 # Total column snow water +- 233000 # Time-integrated total column vertically-integrated eastward geopotential flux +- 233001 # Time-integrated total column vertically-integrated northward geopotential flux +- 233002 # Time-integrated total column vertically-integrated divergence of water geopotential flux +- 233003 # Time-integrated total column vertically-integrated divergence of geopotential flux - 235054 # Mean vertically integrated moisture divergence - 260001 # Total column graupel - 260041 # Total column integrated rain @@ -3274,6 +3294,8 @@ - 230210 # Surface net solar radiation, clear sky (variable resolution) - 230211 # Surface net thermal radiation, clear sky (variable resolution) - 230212 # TOA incident solar radiation (variable resolution) +- 233000 # Time-integrated total column vertically-integrated eastward geopotential flux +- 233001 # Time-integrated total column vertically-integrated northward geopotential flux - 235019 # Time integral of surface latent heat evaporation flux - 235022 # Mean surface photosynthetically active radiation flux, clear sky - 235027 # Mean surface downward UV radiation flux @@ -3301,7 +3323,6 @@ - 235069 # Mean surface downward long-wave radiation flux, clear sky - 235071 # Time integral of surface latent heat sublimation flux - 260002 # Latent heat net flux -- 260003 # Sensible heat net flux - 260007 # Snow phase change heat flux - 260037 # Potential evaporation rate - 260086 # Net short-wave radiation flux (top of atmosphere) @@ -3991,6 +4012,7 @@ - 228102 # Evaporation from open water surfaces excluding oceans - 228103 # Evaporation from vegetation transpiration - 228104 # Atmosphere emission mass flux of Methane from Wetlands +- 228109 # Accumulated mass emission of methane from Wetlands - 228141 # Snow depth water equivalent - 228143 # Convective precipitation - 228144 # Snow Fall water equivalent @@ -4004,6 +4026,10 @@ - 231003 # Snow evaporation water equivalent - 231004 # Potential evaporation rate - 231005 # Potential evaporation +- 231009 # Surface runoff rate +- 231010 # Surface runoff +- 231011 # Sub-surface runoff rate +- 231012 # Sub-surface runoff - 235009 # Mean updraught mass flux - 235010 # Mean downdraught mass flux - 235013 # Mean total precipitation flux @@ -4061,7 +4087,6 @@ - 260188 # Exchange coefficient - 260218 # Estimated precipitation - 260219 # Instantaneous rain rate -- 260258 # Evaporation rate - 260259 # Evaporation - 260284 # Liquid precipitation (rainfall) - 260286 # Total precipitation (nearest grid point) @@ -4096,6 +4121,15 @@ - 300065 # Wat equiv acc snow depth - 300169 # Vert. integrated moisture flux conv. - 300178 # Runoff +- 435000 # Net ecosystem exchange flux +- 435001 # Mean net ecosystem exchange flux +- 435002 # Accumulated net ecosystem exchange flux +- 436000 # Gross primary production flux  +- 436001 # Mean gross primary production flux  +- 436002 # Accumulated gross primary production flux  +- 437000 # Ecosystem respiration flux +- 437001 # Mean ecosystem respiration flux +- 437002 # Accumulated ecosystem respiration flux rate.volume-flux: - 8 # Surface runoff @@ -4410,6 +4444,16 @@ - 162229 # Variance of relative humidity - 171157 # Relative humidity anomaly - 200157 # Relative humidity difference +- 210198 # UV visible albedo for diffuse radiation (climatological) +- 210199 # UV visible albedo for direct radiation (climatological) +- 210200 # UV visible albedo for direct radiation, geometric component (climatological) +- 210201 # UV visible albedo for direct radiation, isotropic component (climatological) +- 210202 # UV visible albedo for direct radiation, volumetric component (climatological) +- 210260 # Near IR albedo for diffuse radiation (climatological) +- 210261 # Near IR albedo for direct radiation (climatological) +- 210262 # Near IR albedo for direct radiation, geometric component (climatological) +- 210263 # Near IR albedo for direct radiation, isotropic component (climatological) +- 210264 # Near IR albedo for direct radiation, volumetric component (climatological) - 228012 # Lake shape factor - 228030 # Relative humidity with respect to water - 228031 # Relative humidity with respect to ice @@ -4417,6 +4461,7 @@ - 228041 # Soil wetness index in layer 2 - 228042 # Soil wetness index in layer 3 - 228043 # Soil wetness index in layer 4 +- 231013 # Reflectance in 0.4 micron channel - 260023 # Maximum relative humidity - 260034 # Horizontal moisture divergence - 260112 # Convective cloud efficiency @@ -4470,7 +4515,6 @@ - 200026 # Lake cover difference - 200031 # Sea-ice cover difference - 260038 # Snow cover -- 260179 # Land cover (1=land, 0=sea) - 260459 # Land-sea coverage (nearest neighbor) [land=1,sea=0] ratio.cover.cloud: @@ -4645,7 +4689,6 @@ - 215149 # Single scattering albedo at 1640 nm - 215178 # Single scattering albedo at 2130 nm - 228032 # Snow albedo -- 228033 # Fraction of stratiform precipitation cover - 228034 # Fraction of convective precipitation cover - 228091 # Canopy cover fraction - 228092 # Soil texture fraction @@ -4656,6 +4699,13 @@ - 228255 # Surface long wave-effective total cloudiness - 230050 # Large-scale precipitation fraction (variable resolution) - 230174 # Albedo (variable resolution) +- 231006 # Tile fraction +- 231007 # Tile percentage +- 232000 # Burned area +- 232001 # Burning area +- 232002 # Burnable area +- 232003 # Un-burnable area +- 232005 # Combustion completeness - 235026 # Mean large-scale precipitation fraction - 235044 # Sunshine duration fraction - 240016 # Water fraction @@ -4806,7 +4856,7 @@ - 210170 # Volcanic sulfur dioxide mass mixing ratio - 210181 # Radon - 210182 # Sulphur Hexafluoride -- 210203 # GEMS Ozone +- 210203 # Ozone mass mixing ratio (full chemistry scheme) - 210247 # Nitrate fine mode aerosol mass mixing ratio - 210248 # Nitrate coarse mode aerosol mass mixing ratio - 210249 # Ammonium aerosol mass mixing ratio @@ -5075,6 +5125,7 @@ - 228054 # Unbalanced component of specific humidity - 228055 # Unbalanced component of specific cloud liquid water content - 228056 # Unbalanced component of specific cloud ice water content +- 232006 # Fuel moisture content - 235006 # Mean specific humidity tendency due to parametrisations - 260017 # Condensate - 260018 # Cloud mixing ratio @@ -5533,6 +5584,10 @@ - 300193 # Surface zonal wind stress - 300195 # Surface meridional wind stress +tile-fraction: +- 231006 # Tile fraction +- 231007 # Tile percentage + orca.arrangement.f: - 250011 # lat_F (coordinate) FIXME - 250012 # lon_F (coordinate) FIXME diff -Nru metview-5.19.1/mir/.github/ci-config.yml metview-5.19.2/mir/.github/ci-config.yml --- metview-5.19.1/mir/.github/ci-config.yml 1970-01-01 00:00:00.000000000 +0000 +++ metview-5.19.2/mir/.github/ci-config.yml 2023-07-15 08:28:47.000000000 +0000 @@ -0,0 +1,8 @@ +dependencies: | + ecmwf/ecbuild + MathisRosenhauer/libaec@master + ecmwf/eccodes + ecmwf/eckit + ecmwf/atlas +dependency_branch: develop +parallelism_factor: 8 diff -Nru metview-5.19.1/mir/.github/ci-hpc-config.yml metview-5.19.2/mir/.github/ci-hpc-config.yml --- metview-5.19.1/mir/.github/ci-hpc-config.yml 1970-01-01 00:00:00.000000000 +0000 +++ metview-5.19.2/mir/.github/ci-hpc-config.yml 2023-07-15 08:28:47.000000000 +0000 @@ -0,0 +1,9 @@ +build: + modules: + - ninja + dependencies: + - ecmwf/ecbuild@develop + - ecmwf/eccodes@develop + - ecmwf/eckit@develop + - ecmwf/atlas@develop + parallel: 64 diff -Nru metview-5.19.1/mir/.github/workflows/ci.yml metview-5.19.2/mir/.github/workflows/ci.yml --- metview-5.19.1/mir/.github/workflows/ci.yml 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/.github/workflows/ci.yml 2023-07-15 08:28:47.000000000 +0000 @@ -15,18 +15,70 @@ # Trigger the workflow manually workflow_dispatch: ~ + # Trigger after public PR approved for CI + pull_request_target: + types: [labeled] + jobs: - # Calls a reusable CI workflow to build & test the current repository. + # Run CI including downstream packages on self-hosted runners downstream-ci: name: downstream-ci - uses: ecmwf-actions/private-downstream-ci/.github/workflows/downstream-ci.yml@main + if: ${{ !github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci' }} + uses: ecmwf-actions/downstream-ci/.github/workflows/downstream-ci.yml@main with: mir: ecmwf/mir@${{ github.event.pull_request.head.sha || github.sha }} secrets: inherit + # Run CI of private downstream packages on self-hosted runners + private-downstream-ci: + name: private-downstream-ci + needs: [downstream-ci] + if: (success() || failure()) && ${{ !github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci' }} + runs-on: ubuntu-latest + permissions: + pull-requests: write + steps: + - name: Dispatch private downstream CI + uses: ecmwf-actions/dispatch-private-downstream-ci@v1 + with: + token: ${{ secrets.GH_REPO_READ_TOKEN }} + owner: ecmwf-actions + repository: private-downstream-ci + event_type: downstream-ci + payload: '{"mir": "ecmwf/mir@${{ github.event.pull_request.head.sha || github.sha }}"}' + + # Build downstream packages on HPC downstream-ci-hpc: name: downstream-ci-hpc - uses: ecmwf-actions/private-downstream-ci/.github/workflows/downstream-ci-hpc.yml@main + if: ${{ !github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci' }} + uses: ecmwf-actions/downstream-ci/.github/workflows/downstream-ci-hpc.yml@main + with: + mir: ecmwf/mir@${{ github.event.pull_request.head.sha || github.sha }} + secrets: inherit + + # Run CI of private downstream packages on HPC + private-downstream-ci-hpc: + name: private-downstream-ci-hpc + needs: [downstream-ci-hpc] + if: (success() || failure()) && ${{ !github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci' }} + runs-on: ubuntu-latest + permissions: + pull-requests: write + steps: + - name: Dispatch private downstream CI + uses: ecmwf-actions/dispatch-private-downstream-ci@v1 + with: + token: ${{ secrets.GH_REPO_READ_TOKEN }} + owner: ecmwf-actions + repository: private-downstream-ci + event_type: downstream-ci-hpc + payload: '{"mir": "ecmwf/mir@${{ github.event.pull_request.head.sha || github.sha }}"}' + + codecov: + name: code-coverage + if: ${{ !github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci' }} + uses: ./.github/workflows/reusable-ci.yml with: mir: ecmwf/mir@${{ github.event.pull_request.head.sha || github.sha }} + codecov: true secrets: inherit diff -Nru metview-5.19.1/mir/.github/workflows/reusable-ci-hpc.yml metview-5.19.2/mir/.github/workflows/reusable-ci-hpc.yml --- metview-5.19.1/mir/.github/workflows/reusable-ci-hpc.yml 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/.github/workflows/reusable-ci-hpc.yml 2023-07-15 08:28:47.000000000 +0000 @@ -12,12 +12,12 @@ eckit: required: false type: string - metkit: - required: false - type: string atlas: required: false type: string + ecbuild: + required: false + type: string jobs: ci-hpc: @@ -28,12 +28,11 @@ build-inputs: | --package: ${{ inputs.mir || 'ecmwf/mir@develop' }} --modules: | - ecbuild ninja --dependencies: | + ${{ inputs.ecbuild || 'ecmwf/ecbuild@develop' }} ${{ inputs.eccodes || 'ecmwf/eccodes@develop' }} ${{ inputs.eckit || 'ecmwf/eckit@develop' }} - ${{ inputs.metkit || 'ecmwf/metkit@develop' }} ${{ inputs.atlas || 'ecmwf/atlas@develop' }} --parallel: 64 secrets: inherit \ No newline at end of file diff -Nru metview-5.19.1/mir/.github/workflows/reusable-ci.yml metview-5.19.2/mir/.github/workflows/reusable-ci.yml --- metview-5.19.1/mir/.github/workflows/reusable-ci.yml 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/.github/workflows/reusable-ci.yml 2023-07-15 08:28:47.000000000 +0000 @@ -9,15 +9,16 @@ eckit: required: false type: string - metkit: - required: false - type: string atlas: required: false type: string mir: required: false type: string + codecov: + required: false + type: boolean + default: false jobs: ci: @@ -26,15 +27,18 @@ with: repository: ${{ inputs.mir || 'ecmwf/mir@develop' }} name_prefix: mir- + codecov_upload: ${{ inputs.codecov }} build_package_inputs: | repository: ${{ inputs.mir || 'ecmwf/mir@develop' }} + self_coverage: true dependencies: | ecmwf/ecbuild MathisRosenhauer/libaec@master ${{ inputs.eccodes || 'ecmwf/eccodes' }} ${{ inputs.eckit || 'ecmwf/eckit' }} - ${{ inputs.metkit || 'ecmwf/metkit' }} ${{ inputs.atlas || 'ecmwf/atlas' }} dependency_branch: develop + dependency_cmake_options: | + ${{ inputs.codecov && 'ecmwf/atlas: "-DENABLE_OMP=0"' || '' }} parallelism_factor: 8 secrets: inherit diff -Nru metview-5.19.1/mir/src/mir/caching/CroppingCache.cc metview-5.19.2/mir/src/mir/caching/CroppingCache.cc --- metview-5.19.1/mir/src/mir/caching/CroppingCache.cc 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/mir/caching/CroppingCache.cc 2023-07-15 08:28:47.000000000 +0000 @@ -83,12 +83,9 @@ size_t size; f >> size; - mapping_.clear(); - mapping_.reserve(size); + mapping_.resize(size); for (size_t i = 0; i < size; ++i) { - util::AreaCropperMapping::value_type j; - f >> j; - mapping_.push_back(j); + f >> mapping_[i]; } } diff -Nru metview-5.19.1/mir/src/mir/caching/legendre/LegendreLoader.cc metview-5.19.2/mir/src/mir/caching/legendre/LegendreLoader.cc --- metview-5.19.1/mir/src/mir/caching/legendre/LegendreLoader.cc 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/mir/caching/legendre/LegendreLoader.cc 2023-07-15 08:28:47.000000000 +0000 @@ -14,6 +14,7 @@ #include +#include "mir/config/LibMir.h" #include "mir/param/MIRParametrisation.h" #include "mir/util/Exceptions.h" #include "mir/util/Log.h" @@ -68,7 +69,7 @@ util::call_once(once, init); util::lock_guard guard(*local_mutex); - std::string name = "mapped-memory"; + std::string name = LibMir::cacheLoader(LibMir::cache_loader::LEGENDRE); params.get("legendre-loader", name); Log::debug() << "LegendreLoaderFactory: looking for '" << name << "'" << std::endl; @@ -87,7 +88,7 @@ util::call_once(once, init); util::lock_guard guard(*local_mutex); - std::string name = "mapped-memory"; + std::string name = LibMir::cacheLoader(LibMir::cache_loader::LEGENDRE); params.get("legendre-loader", name); Log::debug() << "LegendreLoaderFactory: looking for '" << name << "'" << std::endl; diff -Nru metview-5.19.1/mir/src/mir/caching/legendre/SharedMemoryLoader.cc metview-5.19.2/mir/src/mir/caching/legendre/SharedMemoryLoader.cc --- metview-5.19.1/mir/src/mir/caching/legendre/SharedMemoryLoader.cc 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/mir/caching/legendre/SharedMemoryLoader.cc 2023-07-15 08:28:47.000000000 +0000 @@ -33,6 +33,7 @@ // #include "eckit/os/SemLocker.h" #include "eckit/runtime/Main.h" +#include "mir/config/LibMir.h" #include "mir/param/SimpleParametrisation.h" #include "mir/util/Error.h" #include "mir/util/Exceptions.h" @@ -115,7 +116,7 @@ trace::Timer timer("SharedMemoryLoader: loading '" + path.asString() + "'"); - std::string name; + std::string name = LibMir::cacheLoader(LibMir::cache_loader::LEGENDRE); if (parametrisation.get("legendre-loader", name)) { unload_ = name.substr(0, 4) == "tmp-"; } @@ -159,8 +160,8 @@ #endif // This may return EINVAL is the segment is too large 256MB - int shmid; - if ((shmid = eckit::Shmget::shmget(key, shmsize, IPC_CREAT | 0600)) < 0) { + int shmid = eckit::Shmget::shmget(key, shmsize, IPC_CREAT | 0600); + if (shmid < 0) { Log::warning() << msg.str() << ", shmget: failed to acquire shared memory, check the maximum authorised on this system (Linux ipcs " diff -Nru metview-5.19.1/mir/src/mir/caching/matrix/SharedMemoryLoader.cc metview-5.19.2/mir/src/mir/caching/matrix/SharedMemoryLoader.cc --- metview-5.19.1/mir/src/mir/caching/matrix/SharedMemoryLoader.cc 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/mir/caching/matrix/SharedMemoryLoader.cc 2023-07-15 08:28:47.000000000 +0000 @@ -163,8 +163,8 @@ #endif // This may return EINVAL is the segment is too large 256MB - int shmid; - if ((shmid = eckit::Shmget::shmget(key, shmsize, IPC_CREAT | 0600)) < 0) { + int shmid = eckit::Shmget::shmget(key, shmsize, IPC_CREAT | 0600); + if (shmid < 0) { Log::warning() << msg.str() << ", shmget: failed to acquire shared memory, check the maximum authorised on this system (Linux ipcs " diff -Nru metview-5.19.1/mir/src/mir/caching/WeightCache.cc metview-5.19.2/mir/src/mir/caching/WeightCache.cc --- metview-5.19.1/mir/src/mir/caching/WeightCache.cc 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/mir/caching/WeightCache.cc 2023-07-15 08:28:47.000000000 +0000 @@ -28,13 +28,9 @@ static std::string extract_loader(const param::MIRParametrisation& param) { - - std::string name; - if (param.get("matrix-loader", name)) { - return name; - } - - return "file-io"; + std::string name = LibMir::cacheLoader(LibMir::cache_loader::MATRIX); + param.get("matrix-loader", name); + return name; } diff -Nru metview-5.19.1/mir/src/mir/config/LibMir.cc metview-5.19.2/mir/src/mir/config/LibMir.cc --- metview-5.19.1/mir/src/mir/config/LibMir.cc 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/mir/config/LibMir.cc 2023-07-15 08:28:47.000000000 +0000 @@ -12,11 +12,15 @@ #include "mir/config/LibMir.h" +#include + #include "eckit/config/Resource.h" #include "eckit/filesystem/PathName.h" +#include "eckit/utils/MD5.h" #include "mir/api/mir_version.h" #include "mir/util/Exceptions.h" +#include "mir/util/Log.h" namespace mir { @@ -41,6 +45,13 @@ } +const std::string& LibMir::lsmNamed() { + static const std::string mirLsmNamed = + eckit::LibResource("mir-lsm-named;$MIR_LSM_NAMED", "1km.climate.v020"); + return mirLsmNamed; +} + + eckit::PathName LibMir::configFile(config_file c) { using r = eckit::LibResource; @@ -55,8 +66,41 @@ {r("mir-config-parameters;$MIR_CONFIG_PARAMETERS", "~mir/etc/mir/parameters.yaml")}, }; - ASSERT(0 <= c && c < ALL_CONFIG_FILES); - return files[c]; + ASSERT(0 <= c && c < config_file::ALL_CONFIG_FILES); + const auto& path = files[c]; + + if (!path.exists()) { + const std::string msg = + "Configuration file '" + path.fullName() + "' not found, post-processing defaults might not be appropriate"; + + static bool abort = eckit::Resource("$MIR_ABORT_IF_CONFIGURATION_NOT_FOUND", true); + if (abort) { + Log::error() << msg << std::endl; + throw exception::UserError(msg); + } + + // only log messages once + static std::set known_messages; + if (known_messages.insert(eckit::MD5(msg).digest()).second) { + Log::warning() << msg << std::endl; + } + } + + return path; +} + + +std::string LibMir::cacheLoader(cache_loader l) { + using r = eckit::LibResource; + + static const std::string loaders[]{ + {r("$MIR_LEGENDRE_LOADER;mirLegendreLoader", "mapped-memory")}, + {r("$MIR_MATRIX_LOADER;mirMatrixLoader", "file-io")}, + {r("$MIR_POINT_SEARCH_LOADER;mirPointSearchLoader", "mapped-cache-file")}, + }; + + ASSERT(0 <= l && l < cache_loader::ALL_CACHE_LOADERS); + return loaders[l]; } diff -Nru metview-5.19.1/mir/src/mir/config/LibMir.h metview-5.19.2/mir/src/mir/config/LibMir.h --- metview-5.19.1/mir/src/mir/config/LibMir.h 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/mir/config/LibMir.h 2023-07-15 08:28:47.000000000 +0000 @@ -27,12 +27,13 @@ class LibMir : public eckit::system::Library { public: - LibMir(); static const LibMir& instance(); static std::string homeDir(); static std::string cacheDir(); + static bool caching(); + static const std::string& lsmNamed(); enum config_file { @@ -49,7 +50,19 @@ static eckit::PathName configFile(config_file); -protected: + enum cache_loader + { + LEGENDRE, + MATRIX, + POINT_SEARCH, + ALL_CACHE_LOADERS, + }; + + static std::string cacheLoader(cache_loader); + +private: + LibMir(); + const void* addr() const override; std::string version() const override; std::string gitsha1(unsigned int count) const override; diff -Nru metview-5.19.1/mir/src/mir/lsm/GribFileMaskFromMIR.cc metview-5.19.2/mir/src/mir/lsm/GribFileMaskFromMIR.cc --- metview-5.19.1/mir/src/mir/lsm/GribFileMaskFromMIR.cc 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/mir/lsm/GribFileMaskFromMIR.cc 2023-07-15 08:28:47.000000000 +0000 @@ -15,15 +15,18 @@ namespace mir::lsm { + GribFileMaskFromMIR::GribFileMaskFromMIR(const std::string& name, const eckit::PathName& path, const param::MIRParametrisation& parametrisation, const repres::Representation& representation, const std::string& which) : GribFileMask(path, parametrisation, representation, which), name_(name) {} + bool GribFileMaskFromMIR::cacheable() const { return true; } + std::string GribFileMaskFromMIR::cacheName() const { return name_; } diff -Nru metview-5.19.1/mir/src/mir/lsm/GribFileMaskFromMIR.h metview-5.19.2/mir/src/mir/lsm/GribFileMaskFromMIR.h --- metview-5.19.1/mir/src/mir/lsm/GribFileMaskFromMIR.h 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/mir/lsm/GribFileMaskFromMIR.h 2023-07-15 08:28:47.000000000 +0000 @@ -20,9 +20,8 @@ class GribFileMaskFromMIR : public GribFileMask { public: - GribFileMaskFromMIR(const std::string& name, const eckit::PathName& path, - const param::MIRParametrisation& parametrisation, const repres::Representation& representation, - const std::string& which); + GribFileMaskFromMIR(const std::string& name, const eckit::PathName&, const param::MIRParametrisation&, + const repres::Representation&, const std::string& which); private: std::string name_; diff -Nru metview-5.19.1/mir/src/mir/lsm/GribFileMaskFromUser.cc metview-5.19.2/mir/src/mir/lsm/GribFileMaskFromUser.cc --- metview-5.19.1/mir/src/mir/lsm/GribFileMaskFromUser.cc 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/mir/lsm/GribFileMaskFromUser.cc 2023-07-15 08:28:47.000000000 +0000 @@ -20,8 +20,10 @@ return false; } + std::string GribFileMaskFromUser::cacheName() const { return path_; } + } // namespace mir::lsm diff -Nru metview-5.19.1/mir/src/mir/lsm/GribFileMask.h metview-5.19.2/mir/src/mir/lsm/GribFileMask.h --- metview-5.19.1/mir/src/mir/lsm/GribFileMask.h 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/mir/lsm/GribFileMask.h 2023-07-15 08:28:47.000000000 +0000 @@ -19,16 +19,6 @@ #include "mir/lsm/Mask.h" -namespace mir { -namespace param { -class MIRParametrisation; -} -namespace repres { -class Representation; -} -} // namespace mir - - namespace mir::lsm { diff -Nru metview-5.19.1/mir/src/mir/lsm/LSMSelection.cc metview-5.19.2/mir/src/mir/lsm/LSMSelection.cc --- metview-5.19.1/mir/src/mir/lsm/LSMSelection.cc 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/mir/lsm/LSMSelection.cc 2023-07-15 08:28:47.000000000 +0000 @@ -66,13 +66,12 @@ Log::debug() << "LSMSelection: looking for '" << name << "'" << std::endl; - auto j = m->find(name); - if (j == m->end()) { - list(Log::error() << "LSMSelection: unknown '" << name << "', choices are: "); - throw exception::SeriousBug("LSMSelection: unknown '" + name + "'"); + if (auto j = m->find(name); j != m->end()) { + return *(j->second); } - return *(j->second); + list(Log::error() << "LSMSelection: unknown '" << name << "', choices are: "); + throw exception::SeriousBug("LSMSelection: unknown '" + name + "'"); } diff -Nru metview-5.19.1/mir/src/mir/lsm/MappedMask.h metview-5.19.2/mir/src/mir/lsm/MappedMask.h --- metview-5.19.1/mir/src/mir/lsm/MappedMask.h 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/mir/lsm/MappedMask.h 2023-07-15 08:28:47.000000000 +0000 @@ -19,16 +19,6 @@ #include "mir/lsm/Mask.h" -namespace mir { -namespace param { -class MIRParametrisation; -} -namespace repres { -class Representation; -} -} // namespace mir - - namespace mir::lsm { @@ -39,8 +29,8 @@ // -- Constructors - MappedMask(const std::string& name, const eckit::PathName&, const param::MIRParametrisation& parametrisation, - const repres::Representation& representation, const std::string& which); + MappedMask(const std::string& name, const eckit::PathName&, const param::MIRParametrisation&, + const repres::Representation&, const std::string& which); // -- Destructor diff -Nru metview-5.19.1/mir/src/mir/lsm/NamedLSM.cc metview-5.19.2/mir/src/mir/lsm/NamedLSM.cc --- metview-5.19.1/mir/src/mir/lsm/NamedLSM.cc 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/mir/lsm/NamedLSM.cc 2023-07-15 08:28:47.000000000 +0000 @@ -34,7 +34,7 @@ static NamedLSM const __lsm_selection("named"); -static const NamedMaskBuilder __NamedMappedMask_1("1km", "~mir/share/mir/masks/lsm.1km.climate.v013.mask"); +static const NamedMaskBuilder __NamedMappedMask_1("1km", "~mir/share/mir/masks/lsm.1km.climate.v020.mask"); static const NamedMaskBuilder __NamedMappedMask_2("1km.climate.v020", "~mir/share/mir/masks/lsm.1km.climate.v020.mask"); static const NamedMaskBuilder __NamedMappedMask_3("1km.climate.v013", @@ -119,13 +119,12 @@ name = sane(name); Log::debug() << "NamedMaskFactory: looking for '" << name << "'" << std::endl; - auto j = m->find(name); - if (j == m->end()) { - list(Log::error() << "NamedMaskFactory: unknown '" << name << "', choices are: "); - throw exception::SeriousBug("NamedMaskFactory: unknown '" + name + "'"); + if (auto j = m->find(name); j != m->end()) { + return j->second->make(param, representation, which); } - return j->second->make(param, representation, which); + list(Log::error() << "NamedMaskFactory: unknown '" << name << "', choices are: "); + throw exception::SeriousBug("NamedMaskFactory: unknown '" + name + "'"); } @@ -139,15 +138,14 @@ name = sane(name); Log::debug() << "NamedMaskFactory: looking for '" << name << "'" << std::endl; - auto j = m->find(name); - if (j == m->end()) { - list(Log::error() << "NamedMaskFactory: unknown '" << name << "', choices are: "); - throw exception::SeriousBug("NamedMaskFactory: unknown '" + name + "'"); + if (auto j = m->find(name); j != m->end()) { + eckit::MD5 md5; + j->second->hashCacheKey(md5, param, representation, which); + return "named." + name + "." + md5.digest(); } - eckit::MD5 md5; - j->second->hashCacheKey(md5, param, representation, which); - return "named." + name + "." + md5.digest(); + list(Log::error() << "NamedMaskFactory: unknown '" << name << "', choices are: "); + throw exception::SeriousBug("NamedMaskFactory: unknown '" + name + "'"); } diff -Nru metview-5.19.1/mir/src/mir/lsm/NoMask.cc metview-5.19.2/mir/src/mir/lsm/NoMask.cc --- metview-5.19.1/mir/src/mir/lsm/NoMask.cc 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/mir/lsm/NoMask.cc 2023-07-15 08:28:47.000000000 +0000 @@ -44,8 +44,10 @@ out << "NoMask[]"; } + std::string NoMask::cacheName() const { NOTIMP; } + } // namespace mir::lsm diff -Nru metview-5.19.1/mir/src/mir/lsm/NoneLSM.cc metview-5.19.2/mir/src/mir/lsm/NoneLSM.cc --- metview-5.19.1/mir/src/mir/lsm/NoneLSM.cc 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/mir/lsm/NoneLSM.cc 2023-07-15 08:28:47.000000000 +0000 @@ -49,6 +49,7 @@ return "none"; } + std::string NoneLSM::cacheName() const { NOTIMP; } diff -Nru metview-5.19.1/mir/src/mir/lsm/TenMinutesMask.cc metview-5.19.2/mir/src/mir/lsm/TenMinutesMask.cc --- metview-5.19.1/mir/src/mir/lsm/TenMinutesMask.cc 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/mir/lsm/TenMinutesMask.cc 2023-07-15 08:28:47.000000000 +0000 @@ -128,8 +128,10 @@ return mask_; } + std::string TenMinutesMask::cacheName() const { return name_; } + } // namespace mir::lsm diff -Nru metview-5.19.1/mir/src/mir/lsm/TenMinutesMask.h metview-5.19.2/mir/src/mir/lsm/TenMinutesMask.h --- metview-5.19.1/mir/src/mir/lsm/TenMinutesMask.h 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/mir/lsm/TenMinutesMask.h 2023-07-15 08:28:47.000000000 +0000 @@ -19,13 +19,9 @@ #include "mir/lsm/Mask.h" -namespace mir::param { -class MIRParametrisation; -} // namespace mir::param - - namespace mir::lsm { + class TenMinutesMask : public Mask { public: // -- Exceptions diff -Nru metview-5.19.1/mir/src/mir/param/DefaultParametrisation.cc metview-5.19.2/mir/src/mir/param/DefaultParametrisation.cc --- metview-5.19.1/mir/src/mir/param/DefaultParametrisation.cc 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/mir/param/DefaultParametrisation.cc 2023-07-15 08:28:47.000000000 +0000 @@ -25,15 +25,14 @@ set("interpolation", "linear/k-nearest-neighbours"); set("vector-space", "1d-linear"); - bool caching = LibMir::caching(); - set("caching", caching); + set("caching", LibMir::caching()); set("prune-epsilon", 1e-10); set("nclosest", 4L); set("lsm", false); set("lsm-selection", "named"); - set("lsm-named", "1km"); + set("lsm-named", LibMir::lsmNamed()); set("lsm-interpolation", "nearest-neighbour"); set("lsm-weight-adjustment", 0.2); set("lsm-value-threshold", 0.5); diff -Nru metview-5.19.1/mir/src/mir/param/Rules.cc metview-5.19.2/mir/src/mir/param/Rules.cc --- metview-5.19.1/mir/src/mir/param/Rules.cc 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/mir/param/Rules.cc 2023-07-15 08:28:47.000000000 +0000 @@ -130,19 +130,6 @@ ConfigFile parameters(LibMir::configFile(LibMir::config_file::PARAMETERS)); if (!classes.exists() || !parameterClass.exists() || !parameters.exists()) { - - const std::string msg = - "Configuration files not found," - " post-processing defaults might not be appropriate"; - - static bool abortIfConfigurationFilesNotFound = - eckit::Resource("$MIR_ABORT_IF_CONFIGURATION_NOT_FOUND", false); - if (abortIfConfigurationFilesNotFound) { - Log::error() << msg << std::endl; - throw exception::UserError(msg); - } - - Log::warning() << msg << std::endl; return; } diff -Nru metview-5.19.1/mir/src/mir/repres/latlon/ReducedLL.cc metview-5.19.2/mir/src/mir/repres/latlon/ReducedLL.cc --- metview-5.19.1/mir/src/mir/repres/latlon/ReducedLL.cc 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/mir/repres/latlon/ReducedLL.cc 2023-07-15 08:28:47.000000000 +0000 @@ -15,6 +15,7 @@ #include #include #include +#include #include "eckit/types/FloatCompare.h" #include "eckit/types/Fraction.h" @@ -333,6 +334,13 @@ } +const Representation* mir::repres::latlon::ReducedLL::croppedRepresentation(const util::BoundingBox&) const { + std::ostringstream os; + os << "ReducedLL::croppedRepresentation() not supported for " << *this; + throw exception::FunctionalityNotSupported(os.str()); +} + + static const RepresentationBuilder reducedLL("reduced_ll"); diff -Nru metview-5.19.1/mir/src/mir/repres/latlon/ReducedLL.h metview-5.19.2/mir/src/mir/repres/latlon/ReducedLL.h --- metview-5.19.1/mir/src/mir/repres/latlon/ReducedLL.h 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/mir/repres/latlon/ReducedLL.h 2023-07-15 08:28:47.000000000 +0000 @@ -98,6 +98,7 @@ // From Representation std::vector gridBoxes() const override; + const Representation* croppedRepresentation(const util::BoundingBox&) const override; // -- Class members // None diff -Nru metview-5.19.1/mir/src/mir/repres/other/UnstructuredGrid.cc metview-5.19.2/mir/src/mir/repres/other/UnstructuredGrid.cc --- metview-5.19.1/mir/src/mir/repres/other/UnstructuredGrid.cc 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/mir/repres/other/UnstructuredGrid.cc 2023-07-15 08:28:47.000000000 +0000 @@ -46,6 +46,24 @@ namespace mir::repres { + + +template <> +Representation* RepresentationBuilder::make(const param::MIRParametrisation& param) { +#if mir_HAVE_ATLAS + // specially-named unstructured grids + std::string grid; + if (param.get("grid", grid)) { + if (!key::grid::ORCAPattern::match(grid, param).empty()) { + return new other::ORCA(param); + } + } +#endif + + return new other::UnstructuredGrid(param); +} + + namespace other { @@ -276,20 +294,4 @@ } // namespace other -template <> -Representation* RepresentationBuilder::make(const param::MIRParametrisation& param) { -#if mir_HAVE_ATLAS - // specially-named unstructured grids - std::string grid; - if (param.get("grid", grid)) { - if (!key::grid::ORCAPattern::match(grid, param).empty()) { - return new other::ORCA(param); - } - } -#endif - - return new other::UnstructuredGrid(param); -} - - } // namespace mir::repres diff -Nru metview-5.19.1/mir/src/mir/search/PointSearch.cc metview-5.19.2/mir/src/mir/search/PointSearch.cc --- metview-5.19.1/mir/src/mir/search/PointSearch.cc 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/mir/search/PointSearch.cc 2023-07-15 08:28:47.000000000 +0000 @@ -26,15 +26,19 @@ namespace mir::search { -PointSearch::PointSearch(const param::MIRParametrisation& parametrisation, const repres::Representation& r) { + +static std::string extract_loader(const param::MIRParametrisation& param) { bool caching = LibMir::caching(); - parametrisation.get("caching", caching); + param.get("caching", caching); - std::string name = caching ? "mapped-cache-file" : "memory"; - parametrisation.get("point-search-trees", name); + std::string name = caching ? LibMir::cacheLoader(LibMir::cache_loader::POINT_SEARCH) : "memory"; + param.get("point-search-trees", name); + return name; +} - tree_.reset(TreeFactory::build(name, r)); +PointSearch::PointSearch(const param::MIRParametrisation& param, const repres::Representation& r) { + tree_.reset(TreeFactory::build(extract_loader(param), r)); eckit::AutoLock lock(*tree_); Log::debug() << "Search using " << *tree_ << std::endl; @@ -45,10 +49,12 @@ } } + PointSearch::PointValueType PointSearch::closestPoint(const PointSearch::PointType& pt) const { return tree_->nearestNeighbour(pt); } + void PointSearch::closestNPoints(const PointType& pt, size_t n, std::vector& closest) const { // Small optimisation @@ -61,10 +67,12 @@ closest = tree_->kNearestNeighbours(pt, n); } + void PointSearch::closestWithinRadius(const PointType& pt, double radius, std::vector& closest) const { closest = tree_->findInSphere(pt, radius); } + void PointSearch::build(const repres::Representation& r) { const size_t npts = tree_->itemCount(); ASSERT(npts > 0); @@ -97,9 +105,11 @@ } } + void PointSearch::print(std::ostream& out) const { tree_->statsPrint(out, false); tree_->statsReset(); } + } // namespace mir::search diff -Nru metview-5.19.1/mir/src/mir/util/Exceptions.h metview-5.19.2/mir/src/mir/util/Exceptions.h --- metview-5.19.1/mir/src/mir/util/Exceptions.h 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/mir/util/Exceptions.h 2023-07-15 08:28:47.000000000 +0000 @@ -38,6 +38,7 @@ using eckit::BadValue; using eckit::CantOpenFile; using eckit::FailedSystemCall; +using eckit::FunctionalityNotSupported; using eckit::SeriousBug; using eckit::UserError; using eckit::WriteError; diff -Nru metview-5.19.1/mir/src/tools/mir-load-matrix.cc metview-5.19.2/mir/src/tools/mir-load-matrix.cc --- metview-5.19.1/mir/src/tools/mir-load-matrix.cc 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/tools/mir-load-matrix.cc 2023-07-15 08:28:47.000000000 +0000 @@ -24,6 +24,7 @@ #include "mir/caching/matrix/MatrixLoader.h" #include "mir/caching/matrix/SharedMemoryLoader.h" +#include "mir/config/LibMir.h" #include "mir/method/WeightMatrix.h" #include "mir/param/ConfigurationWrapper.h" #include "mir/tools/MIRTool.h" @@ -96,7 +97,7 @@ param.get("unload", unload); param.get("wait", wait); - std::string matrixLoader = "file-io"; + std::string matrixLoader = LibMir::cacheLoader(LibMir::cache_loader::MATRIX); param.get("matrix-loader", matrixLoader); diff -Nru metview-5.19.1/mir/src/tools/mir-weight-matrix-diff.cc metview-5.19.2/mir/src/tools/mir-weight-matrix-diff.cc --- metview-5.19.1/mir/src/tools/mir-weight-matrix-diff.cc 2023-05-21 19:29:42.000000000 +0000 +++ metview-5.19.2/mir/src/tools/mir-weight-matrix-diff.cc 2023-07-15 08:28:47.000000000 +0000 @@ -21,6 +21,7 @@ #include "eckit/types/FloatCompare.h" #include "mir/caching/matrix/MatrixLoader.h" +#include "mir/config/LibMir.h" #include "mir/method/WeightMatrix.h" #include "mir/param/ConfigurationWrapper.h" #include "mir/stats/detail/CounterBinary.h" @@ -85,20 +86,16 @@ using caching::matrix::MatrixLoaderFactory; using method::WeightMatrix; - struct shape_t : std::vector { - shape_t(const WeightMatrix& m) : std::vector{m.nonZeros(), m.rows(), m.cols()} {} - }; - const param::ConfigurationWrapper param(args); auto& log = Log::info(); - std::string matrixLoader = "file-io"; + std::string matrixLoader = LibMir::cacheLoader(LibMir::cache_loader::MATRIX); param.get("matrix-loader", matrixLoader); - bool matrixValidate; + bool matrixValidate = false; param.get("matrix-validate", matrixValidate); - bool counter; + bool counter = false; param.get("counter", counter); WeightMatrix a(MatrixLoaderFactory::build(matrixLoader, args(0))); @@ -111,8 +108,8 @@ b.validate(("load '" + args(1) + "'").c_str()); } - shape_t aShape(a); - shape_t bShape(b); + auto aShape = std::vector{a.nonZeros(), a.rows(), a.cols()}; + auto bShape = std::vector{b.nonZeros(), b.rows(), b.cols()}; if (aShape != bShape) { log << "!= geometry: " << aShape << " != " << bShape << std::endl; } diff -Nru metview-5.19.1/mir/VERSION metview-5.19.2/mir/VERSION --- metview-5.19.1/mir/VERSION 1970-01-01 00:00:00.000000000 +0000 +++ metview-5.19.2/mir/VERSION 2023-07-15 08:28:47.000000000 +0000 @@ -0,0 +1 @@ +1.17.2