From 1865fb86a4b186928e8dfc840f6ee6e5d7de5508 Mon Sep 17 00:00:00 2001 From: Stu Newman Date: Thu, 23 Jul 2026 15:06:58 +0100 Subject: [PATCH 1/5] Changes for processing of IASI-NG --- .../Ops_GetDefaultCxFields.inc | 2 +- .../Ops_ReadObsGroupSwitches.inc | 1 + .../OpsMod_ODB/OpsFn_ObsToReportType.inc | 18 +++++++ .../OpsMod_ODB/OpsODB_InitODBElemDesp.inc | 50 +++++++++++++++++++ .../OpsODB_InitODBElemDesp_Body.inc | 11 ++++ .../OpsMod_Varobs/Ops_GetDefaultVarfields.inc | 2 +- .../OpsMod_Varobs/Ops_SetupVarobsLevDepC.inc | 6 +++ .../Ops_Constants/OpsFn_IsSatRadGroup.inc | 1 + .../Ops_Constants/OpsFn_ObsGroupNameToNum.inc | 2 + .../Ops_Constants/OpsFn_ObsGroupNumToName.inc | 2 + .../Ops_Constants/OpsMod_ObsGroupInfo.f90 | 3 +- .../stubs/Ops_Constants/OpsMod_ObsTypes.f90 | 1 + .../Ops_Constants/Ops_SubTypeNumToName.inc | 2 + etc/global/cx/IASING.nl | 3 ++ etc/global/varobs/IASING.nl | 3 ++ 15 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 etc/global/cx/IASING.nl create mode 100644 etc/global/varobs/IASING.nl diff --git a/deps/ops/stubs/OpsMod_CXGenerate/Ops_GetDefaultCxFields.inc b/deps/ops/stubs/OpsMod_CXGenerate/Ops_GetDefaultCxFields.inc index 89a7f3e4..7322d648 100644 --- a/deps/ops/stubs/OpsMod_CXGenerate/Ops_GetDefaultCxFields.inc +++ b/deps/ops/stubs/OpsMod_CXGenerate/Ops_GetDefaultCxFields.inc @@ -165,7 +165,7 @@ SELECT CASE (ObsGroup) CASE (ObsGroupHLOSWIND) CxFields(1:5) = (/StashItem_u,StashItem_v,StashItem_orog,StashItem_p, & StashItem_p_Surface/) - CASE (ObsGroupIASI) + CASE (ObsGroupIASI, ObsGroupIASING) CxFields(1:14) = (/StashItem_theta,StashItem_q,StashItem_qcf,StashItem_SST, & StashItem_SeaIce,StashItem_orog,StashItem_qcl, & StashItem_p,StashItem_p_Surface,StashCode_u10, & diff --git a/deps/ops/stubs/OpsMod_Control/Ops_ReadObsGroupSwitches.inc b/deps/ops/stubs/OpsMod_Control/Ops_ReadObsGroupSwitches.inc index fcd305d5..ff1bd8ae 100644 --- a/deps/ops/stubs/OpsMod_Control/Ops_ReadObsGroupSwitches.inc +++ b/deps/ops/stubs/OpsMod_Control/Ops_ReadObsGroupSwitches.inc @@ -107,6 +107,7 @@ Using(ObsGroupOceanWinds) = ops_env_is_true ("OPS_OCEANWINDS") Using(ObsGroupGIIRSLW) = ops_env_is_true ("OPS_GIIRSLW") Using(ObsGroupGIIRSMW) = ops_env_is_true ("OPS_GIIRSMW") Using(ObsGroupMTGIRS) = ops_env_is_true ("OPS_MTGIRS") +Using(ObsGroupIASING) = ops_env_is_true ("OPS_IASING") ALLOCATE (obs_group_list(COUNT (using))) obs_group_list = IMDI diff --git a/deps/ops/stubs/OpsMod_ODB/OpsFn_ObsToReportType.inc b/deps/ops/stubs/OpsMod_ODB/OpsFn_ObsToReportType.inc index ab04757d..f82e1601 100644 --- a/deps/ops/stubs/OpsMod_ODB/OpsFn_ObsToReportType.inc +++ b/deps/ops/stubs/OpsMod_ODB/OpsFn_ObsToReportType.inc @@ -651,6 +651,24 @@ SELECT CASE (Obs % Header % ObsGroup) END IF END DO END IF + CASE (ObsGroupIASING) + IF (Obs % Header % Satid % Present) THEN + DO i = ob_start, ob_end + IF (Obs % Satid(i) == SatId_MetopD) THEN + report_types(i - ob_start + 1) = rep_type_iasing_metop_d + ELSE + found_report_type = .FALSE. + DO j = 1, SIZE (map, DIM = 1) + IF (map(j,1) == ObsGroupIASING .AND. map(j,2) == Obs % Satid(i)) THEN + report_types(i - ob_start + 1) = map(j,3) + found_report_type = .TRUE. + EXIT + END IF + END DO + CALL update_unrecognized_satids (Obs % Satid(i)) + END IF + END DO + END IF CASE (ObsGroupIN3DIClr) report_types = rep_type_insat_3d_imager CASE (ObsGroupIN3DS) diff --git a/deps/ops/stubs/OpsMod_ODB/OpsODB_InitODBElemDesp.inc b/deps/ops/stubs/OpsMod_ODB/OpsODB_InitODBElemDesp.inc index cbbec080..cb286a95 100644 --- a/deps/ops/stubs/OpsMod_ODB/OpsODB_InitODBElemDesp.inc +++ b/deps/ops/stubs/OpsMod_ODB/OpsODB_InitODBElemDesp.inc @@ -1422,6 +1422,13 @@ ElemDesp2ODBDesp(IndexIASIPCScore) % colname_array_length = 300 ElemDesp2ODBDesp(IndexIASIPCScoreCount) % TableName = 'iasi_principle_component' ElemDesp2ODBDesp(IndexIASIPCScoreCount) % ColName = 'principle_component_count' +ElemDesp2ODBDesp(IndexIASINGPCScore) % TableName = 'principal_component' +ElemDesp2ODBDesp(IndexIASINGPCScore) % ColName = 'principal_component_ng_score' +ElemDesp2ODBDesp(IndexIASINGPCScore) % colname_array_length = 340 + +ElemDesp2ODBDesp(IndexIASINGPCScoreCount) % TableName = 'principal_component' +ElemDesp2ODBDesp(IndexIASINGPCScoreCount) % ColName = 'principal_component_ng_count' + ElemDesp2ODBDesp(IndexODBObsType) % TableName = 'hdr' ElemDesp2ODBDesp(IndexODBObsType) % ColName = 'obstype' @@ -1668,6 +1675,49 @@ ElemDesp2ODBDesp(IndexModelSurfaceType) % ColName = 'totalcloud' ElemDesp2ODBDesp(IndexModelSurfaceType) % data_type = odb_real ElemDesp2ODBDesp(IndexModelSurfaceType) % has_missing = c_false +ElemDesp2ODBDesp(IndexSatelliteClassification) % TableName = 'radiance' +ElemDesp2ODBDesp(IndexSatelliteClassification) % ColName = 'satellite_classification' +ElemDesp2ODBDesp(IndexSatelliteClassification) % data_type = odb_integer +ElemDesp2ODBDesp(IndexSatelliteClassification) % has_missing = c_false + +ElemDesp2ODBDesp(IndexNonNormalisedPCScore) % TableName = 'radiance' +ElemDesp2ODBDesp(IndexNonNormalisedPCScore) % ColName = 'non_normalised_pcscore' +ElemDesp2ODBDesp(IndexNonNormalisedPCScore) % data_type = odb_real +ElemDesp2ODBDesp(IndexNonNormalisedPCScore) % has_missing = c_false + +ElemDesp2ODBDesp(IndexChannelStartBand) % TableName = 'radiance' +ElemDesp2ODBDesp(IndexChannelStartBand) % ColName = 'band_channel_start' +ElemDesp2ODBDesp(IndexChannelStartBand) % colname_array_length = 4 +ElemDesp2ODBDesp(IndexChannelStartBand) % data_type = odb_real +ElemDesp2ODBDesp(IndexChannelStartBand) % has_missing = c_false + +ElemDesp2ODBDesp(IndexChannelEndBand) % TableName = 'radiance' +ElemDesp2ODBDesp(IndexChannelEndBand) % ColName = 'band_channel_end' +ElemDesp2ODBDesp(IndexChannelEndBand) % colname_array_length = 4 +ElemDesp2ODBDesp(IndexChannelEndBand) % data_type = odb_real +ElemDesp2ODBDesp(IndexChannelEndBand) % has_missing = c_false + +ElemDesp2ODBDesp(IndexPCResidualBand) % TableName = 'radiance' +ElemDesp2ODBDesp(IndexPCResidualBand) % ColName = 'band_pc_residual' +ElemDesp2ODBDesp(IndexPCResidualBand) % colname_array_length = 4 +ElemDesp2ODBDesp(IndexPCResidualBand) % data_type = odb_real +ElemDesp2ODBDesp(IndexPCResidualBand) % has_missing = c_false + +ElemDesp2ODBDesp(IndexNumberOfRadianceChannels) % TableName = 'hdr' +ElemDesp2ODBDesp(IndexNumberOfRadianceChannels) % ColName = 'numlev' +ElemDesp2ODBDesp(IndexNumberOfRadianceChannels) % data_type = odb_integer +ElemDesp2ODBDesp(IndexNumberOfRadianceChannels) % has_missing = c_false + +ElemDesp2ODBDesp(IndexNumberOfMWSChannels) % TableName = 'hdr' +ElemDesp2ODBDesp(IndexNumberOfMWSChannels) % ColName = 'numlev' +ElemDesp2ODBDesp(IndexNumberOfMWSChannels) % data_type = odb_integer +ElemDesp2ODBDesp(IndexNumberOfMWSChannels) % has_missing = c_false + +ElemDesp2ODBDesp(IndexIASINGRadianceTypeFlags) % TableName = 'radiance' +ElemDesp2ODBDesp(IndexIASINGRadianceTypeFlags) % ColName = 'radiance_type' +ElemDesp2ODBDesp(IndexIASINGRadianceTypeFlags) % data_type = odb_integer +ElemDesp2ODBDesp(IndexIASINGRadianceTypeFlags) % has_missing = c_false + CALL OpsODB_InitODBElemDesp_Body (h, & obsgroup) diff --git a/deps/ops/stubs/OpsMod_ODB/OpsODB_InitODBElemDesp_Body.inc b/deps/ops/stubs/OpsMod_ODB/OpsODB_InitODBElemDesp_Body.inc index 61edf7d4..30835cc6 100644 --- a/deps/ops/stubs/OpsMod_ODB/OpsODB_InitODBElemDesp_Body.inc +++ b/deps/ops/stubs/OpsMod_ODB/OpsODB_InitODBElemDesp_Body.inc @@ -38,6 +38,7 @@ USE OpsMod_ObsGroupInfo, ONLY: & ObsGroupGPSRO, & ObsGroupHLOSWind, & ObsGroupIASI, & + ObsGroupIASING, & ObsGroupIN3DIClr, & ObsGroupIN3DS, & ObsGroupSAPHIR, & @@ -1365,6 +1366,16 @@ IF (ObsGroup == ObsGroupGMIlow .OR. ObsGroup == ObsGroupGMIhigh) THEN END IF +IF (ObsGroup == ObsGroupIASING) THEN + ElemDesp2ODBDesp(IndexRadiance) % TableName = 'body' + ElemDesp2ODBDesp(IndexRadiance) % ColName = 'initial_obsvalue' + ElemDesp2ODBDesp(IndexRadiance) % Varno = ops_odb_getval (h, "$rawsca") + + ElemDesp2ODBDesp(IndexMWSBrightnessTemperature) % TableName = 'body' + ElemDesp2ODBDesp(IndexMWSBrightnessTemperature) % ColName = 'initial_obsvalue' + ElemDesp2ODBDesp(IndexMWSBrightnessTemperature) % Varno = ops_odb_getval (h, "$rawbt") ! brightness temperature +END IF + ElemDesp2ODBDesp(IndexHLOSWIND) % TableName = 'body' ElemDesp2ODBDesp(IndexHLOSWIND) % ColName = 'initial_obsvalue' ElemDesp2ODBDesp(IndexHLOSWIND) % Varno = ops_odb_getval (h, "$los") diff --git a/deps/ops/stubs/OpsMod_Varobs/Ops_GetDefaultVarfields.inc b/deps/ops/stubs/OpsMod_Varobs/Ops_GetDefaultVarfields.inc index e6b78c6b..5b5f315e 100644 --- a/deps/ops/stubs/OpsMod_Varobs/Ops_GetDefaultVarfields.inc +++ b/deps/ops/stubs/OpsMod_Varobs/Ops_GetDefaultVarfields.inc @@ -179,7 +179,7 @@ SELECT CASE (ObsGroup) CASE (ObsGroupHLOSWIND) Varfields(1:6) = (/Varfield_HLOSwind,Varfield_ProfileNo,VarField_dWinddT, & VarField_dWinddP,VarField_AzimuthCOG,VarField_HeightCOG/) - CASE (ObsGroupIASI) + CASE (ObsGroupIASI, ObsGroupIASING) Varfields(1:12) = (/Varfield_tskin,Varfield_tcozone,Varfield_satzenith, & Varfield_surface,Varfield_stratt,Varfield_satid, & Varfield_numchans,Varfield_channum,Varfield_britemp, & diff --git a/deps/ops/stubs/OpsMod_Varobs/Ops_SetupVarobsLevDepC.inc b/deps/ops/stubs/OpsMod_Varobs/Ops_SetupVarobsLevDepC.inc index 76ec26f3..a2c70775 100644 --- a/deps/ops/stubs/OpsMod_Varobs/Ops_SetupVarobsLevDepC.inc +++ b/deps/ops/stubs/OpsMod_Varobs/Ops_SetupVarobsLevDepC.inc @@ -42,6 +42,7 @@ USE OpsMod_ObsGroupInfo, ONLY: & ObsGroupAIRS, & ObsGroupCrIS, & ObsGroupIASI, & + ObsGroupIASING, & ObsGroupSBUV, & ObsGroupRadar, & ObsGroupRadarZ, & @@ -173,6 +174,11 @@ SELECT CASE (Observations % header % ObsGroup) ObsLevelType = 0.0 NumLevelLevs = 1 + CASE (ObsGroupIASING) + + ObsLevelType = 0.0 + NumLevelLevs = 1 + CASE (ObsGroupMTGIRS) ObsLevelType = 0.0 diff --git a/deps/ops/stubs/Ops_Constants/OpsFn_IsSatRadGroup.inc b/deps/ops/stubs/Ops_Constants/OpsFn_IsSatRadGroup.inc index 843ca577..69e22e8f 100644 --- a/deps/ops/stubs/Ops_Constants/OpsFn_IsSatRadGroup.inc +++ b/deps/ops/stubs/Ops_Constants/OpsFn_IsSatRadGroup.inc @@ -32,6 +32,7 @@ IF (obsgroup == ObsGroupABIClr .OR. & obsgroup == ObsGroupGeoCloud .OR. & obsgroup == ObsGroupGOESImClr .OR. & obsgroup == ObsGroupIASI .OR. & + obsgroup == ObsGroupIASING .OR. & obsgroup == ObsGroupIN3DIClr .OR. & obsgroup == ObsGroupIN3DS .OR. & obsgroup == ObsGroupMWSFY3B .OR. & diff --git a/deps/ops/stubs/Ops_Constants/OpsFn_ObsGroupNameToNum.inc b/deps/ops/stubs/Ops_Constants/OpsFn_ObsGroupNameToNum.inc index ee5e1134..39bb1f90 100644 --- a/deps/ops/stubs/Ops_Constants/OpsFn_ObsGroupNameToNum.inc +++ b/deps/ops/stubs/Ops_Constants/OpsFn_ObsGroupNameToNum.inc @@ -76,6 +76,8 @@ SELECT CASE (ObsGroupName) OpsFn_ObsGroupNameToNum = ObsGroupHLOSwind CASE ("IASI") OpsFn_ObsGroupNameToNum = ObsGroupIASI + CASE ("IASING") + OpsFn_ObsGroupNameToNum = ObsGroupIASING CASE ("IN3DIClr") OpsFn_ObsGroupNameToNum = ObsGroupIN3DIClr CASE ("IN3DS") diff --git a/deps/ops/stubs/Ops_Constants/OpsFn_ObsGroupNumToName.inc b/deps/ops/stubs/Ops_Constants/OpsFn_ObsGroupNumToName.inc index d29c7362..779a71ee 100644 --- a/deps/ops/stubs/Ops_Constants/OpsFn_ObsGroupNumToName.inc +++ b/deps/ops/stubs/Ops_Constants/OpsFn_ObsGroupNumToName.inc @@ -139,6 +139,8 @@ SELECT CASE (ObsGroup) OpsFn_ObsGroupNumToName = "EPSMWS" CASE (ObsGroupSternaMWR) OpsFn_ObsGroupNumToName = "SternaMWR" + CASE (ObsGroupIASING) + OpsFn_ObsGroupNumToName = "IASING" CASE DEFAULT OpsFn_ObsGroupNumToName = "Unknown" END SELECT diff --git a/deps/ops/stubs/Ops_Constants/OpsMod_ObsGroupInfo.f90 b/deps/ops/stubs/Ops_Constants/OpsMod_ObsGroupInfo.f90 index 97a8b725..2dd25a4b 100644 --- a/deps/ops/stubs/Ops_Constants/OpsMod_ObsGroupInfo.f90 +++ b/deps/ops/stubs/Ops_Constants/OpsMod_ObsGroupInfo.f90 @@ -82,7 +82,8 @@ MODULE OpsMod_ObsGroupInfo INTEGER, PARAMETER :: ObsGroupEPSMWS = 71 ! => EPS SG MWS INTEGER, PARAMETER :: ObsGroupMWSFY3E = 72 ! => FY3E microwave sounder data INTEGER, PARAMETER :: ObsGroupHIRAS2 = 74 ! => HIRAS Radiances -INTEGER, PARAMETER :: max_obs_group_num = 74 ! Number of observation groups +INTEGER, PARAMETER :: ObsGroupIASING = 75 ! => IASI Next Generation on EPS-SG +INTEGER, PARAMETER :: max_obs_group_num = 75 ! Number of observation groups CONTAINS diff --git a/deps/ops/stubs/Ops_Constants/OpsMod_ObsTypes.f90 b/deps/ops/stubs/Ops_Constants/OpsMod_ObsTypes.f90 index e5dc6d40..b109a9ed 100644 --- a/deps/ops/stubs/Ops_Constants/OpsMod_ObsTypes.f90 +++ b/deps/ops/stubs/Ops_Constants/OpsMod_ObsTypes.f90 @@ -269,6 +269,7 @@ MODULE OpsMod_ObsTypes INTEGER, PARAMETER :: ObsTypeAHICSR = 26310 ! => AHI radiances INTEGER, PARAMETER :: ObsTypeAHIASR = 26320 ! => AHI all-sky radiances INTEGER, PARAMETER :: ObsTypeABICSR = 26330 ! => ABI (GOES-16 onwards) radiances +INTEGER, PARAMETER :: ObsTypeIASING = 26500 ! => IASI-NG INTEGER, PARAMETER :: ObsTypeSATAOD = 26600 ! => Satellite AOD (Polar) INTEGER, PARAMETER :: ObsTypeASCATCO = 26700 ! => ASCAT coastal winds INTEGER, PARAMETER :: ObsTypeIN3DImCSR = 26800 ! => INSAT3D Imager radiances diff --git a/deps/ops/stubs/Ops_Constants/Ops_SubTypeNumToName.inc b/deps/ops/stubs/Ops_Constants/Ops_SubTypeNumToName.inc index 3490e92c..1f3ba9c2 100644 --- a/deps/ops/stubs/Ops_Constants/Ops_SubTypeNumToName.inc +++ b/deps/ops/stubs/Ops_Constants/Ops_SubTypeNumToName.inc @@ -155,6 +155,8 @@ SELECT CASE (num) name = "IASIHR" CASE (ObsTypeIASI_L) name = "IASIL" + CASE (ObsTypeIASING) + name = "IASING" CASE (ObsTypeIMDWINDS) name = "IMDWINDS" CASE (ObsTypeIN3DImCSR) diff --git a/etc/global/cx/IASING.nl b/etc/global/cx/IASING.nl new file mode 100644 index 00000000..7e3c5a63 --- /dev/null +++ b/etc/global/cx/IASING.nl @@ -0,0 +1,3 @@ +&CXControlNL +CxFields=4,10,12,24,31,33,254,266,267,268,407,409,3209,3210,3236,3245,16222 +/ diff --git a/etc/global/varobs/IASING.nl b/etc/global/varobs/IASING.nl new file mode 100644 index 00000000..e2e9ed74 --- /dev/null +++ b/etc/global/varobs/IASING.nl @@ -0,0 +1,3 @@ +&VarobsControlNL +Varfields=10,11,18,19,21,28,31,35,36,54,55,57,80 +/ From 4a4cb74137cc65a7cec0e0f73b07fc44f3775be4 Mon Sep 17 00:00:00 2001 From: Stu Newman Date: Fri, 18 Sep 2026 08:58:53 +0100 Subject: [PATCH 2/5] Changes needed for pseudo-IASI --- .../Ops_GetDefaultCxFields.inc | 2 +- .../Ops_ReadObsGroupSwitches.inc | 1 + .../OpsMod_ODB/OpsFn_ObsToReportType.inc | 22 ++++++++++++++++++- .../OpsODB_InitODBElemDesp_Body.inc | 3 ++- .../OpsMod_Varobs/Ops_GetDefaultVarfields.inc | 2 +- .../OpsMod_Varobs/Ops_SetupVarobsLevDepC.inc | 6 +++++ .../Ops_Constants/OpsFn_IsSatRadGroup.inc | 1 + .../Ops_Constants/OpsFn_ObsGroupNameToNum.inc | 2 ++ .../Ops_Constants/OpsFn_ObsGroupNumToName.inc | 2 ++ .../Ops_Constants/OpsMod_ObsGroupInfo.f90 | 3 ++- .../stubs/Ops_Constants/OpsMod_ObsTypes.f90 | 1 + .../Ops_Constants/Ops_SubTypeNumToName.inc | 2 ++ etc/global/cx/PseudoIASI.nl | 3 +++ etc/global/varobs/PseudoIASI.nl | 3 +++ 14 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 etc/global/cx/PseudoIASI.nl create mode 100644 etc/global/varobs/PseudoIASI.nl diff --git a/deps/ops/stubs/OpsMod_CXGenerate/Ops_GetDefaultCxFields.inc b/deps/ops/stubs/OpsMod_CXGenerate/Ops_GetDefaultCxFields.inc index 7322d648..00ec675c 100644 --- a/deps/ops/stubs/OpsMod_CXGenerate/Ops_GetDefaultCxFields.inc +++ b/deps/ops/stubs/OpsMod_CXGenerate/Ops_GetDefaultCxFields.inc @@ -165,7 +165,7 @@ SELECT CASE (ObsGroup) CASE (ObsGroupHLOSWIND) CxFields(1:5) = (/StashItem_u,StashItem_v,StashItem_orog,StashItem_p, & StashItem_p_Surface/) - CASE (ObsGroupIASI, ObsGroupIASING) + CASE (ObsGroupIASI, ObsGroupIASING, ObsGroupPseudoIASI) CxFields(1:14) = (/StashItem_theta,StashItem_q,StashItem_qcf,StashItem_SST, & StashItem_SeaIce,StashItem_orog,StashItem_qcl, & StashItem_p,StashItem_p_Surface,StashCode_u10, & diff --git a/deps/ops/stubs/OpsMod_Control/Ops_ReadObsGroupSwitches.inc b/deps/ops/stubs/OpsMod_Control/Ops_ReadObsGroupSwitches.inc index ff1bd8ae..77bb11f4 100644 --- a/deps/ops/stubs/OpsMod_Control/Ops_ReadObsGroupSwitches.inc +++ b/deps/ops/stubs/OpsMod_Control/Ops_ReadObsGroupSwitches.inc @@ -108,6 +108,7 @@ Using(ObsGroupGIIRSLW) = ops_env_is_true ("OPS_GIIRSLW") Using(ObsGroupGIIRSMW) = ops_env_is_true ("OPS_GIIRSMW") Using(ObsGroupMTGIRS) = ops_env_is_true ("OPS_MTGIRS") Using(ObsGroupIASING) = ops_env_is_true ("OPS_IASING") +Using(ObsGroupPseudoIASI) = ops_env_is_true ("OPS_PseudoIASI") ALLOCATE (obs_group_list(COUNT (using))) obs_group_list = IMDI diff --git a/deps/ops/stubs/OpsMod_ODB/OpsFn_ObsToReportType.inc b/deps/ops/stubs/OpsMod_ODB/OpsFn_ObsToReportType.inc index f82e1601..28afdac4 100644 --- a/deps/ops/stubs/OpsMod_ODB/OpsFn_ObsToReportType.inc +++ b/deps/ops/stubs/OpsMod_ODB/OpsFn_ObsToReportType.inc @@ -654,7 +654,9 @@ SELECT CASE (Obs % Header % ObsGroup) CASE (ObsGroupIASING) IF (Obs % Header % Satid % Present) THEN DO i = ob_start, ob_end - IF (Obs % Satid(i) == SatId_MetopD) THEN + ! IASING (native resolution) is stored as SatId_MetopE for convenience, while + ! IASING (IASI resolution) is stored as SatId_MetopD and processed as ObsGroupIASI + IF (Obs % Satid(i) == SatId_MetopD .OR. Obs % Satid(i) == SatId_MetopE) THEN report_types(i - ob_start + 1) = rep_type_iasing_metop_d ELSE found_report_type = .FALSE. @@ -669,6 +671,24 @@ SELECT CASE (Obs % Header % ObsGroup) END IF END DO END IF + CASE (ObsGroupPseudoIASI) + IF (Obs % Header % Satid % Present) THEN + DO i = ob_start, ob_end + IF (Obs % Satid(i) == SatId_MetopD) THEN + report_types(i - ob_start + 1) = rep_type_iasing_metop_d + ELSE + found_report_type = .FALSE. + DO j = 1, SIZE (map, DIM = 1) + IF (map(j,1) == ObsGroupPseudoIASI .AND. map(j,2) == Obs % Satid(i)) THEN + report_types(i - ob_start + 1) = map(j,3) + found_report_type = .TRUE. + EXIT + END IF + END DO + CALL update_unrecognized_satids (Obs % Satid(i)) + END IF + END DO + END IF CASE (ObsGroupIN3DIClr) report_types = rep_type_insat_3d_imager CASE (ObsGroupIN3DS) diff --git a/deps/ops/stubs/OpsMod_ODB/OpsODB_InitODBElemDesp_Body.inc b/deps/ops/stubs/OpsMod_ODB/OpsODB_InitODBElemDesp_Body.inc index 30835cc6..8e5d3cdb 100644 --- a/deps/ops/stubs/OpsMod_ODB/OpsODB_InitODBElemDesp_Body.inc +++ b/deps/ops/stubs/OpsMod_ODB/OpsODB_InitODBElemDesp_Body.inc @@ -39,6 +39,7 @@ USE OpsMod_ObsGroupInfo, ONLY: & ObsGroupHLOSWind, & ObsGroupIASI, & ObsGroupIASING, & + ObsGroupPseudoIASI, & ObsGroupIN3DIClr, & ObsGroupIN3DS, & ObsGroupSAPHIR, & @@ -1366,7 +1367,7 @@ IF (ObsGroup == ObsGroupGMIlow .OR. ObsGroup == ObsGroupGMIhigh) THEN END IF -IF (ObsGroup == ObsGroupIASING) THEN +IF (ObsGroup == ObsGroupIASING .OR. ObsGroup == ObsGroupPseudoIASI) THEN ElemDesp2ODBDesp(IndexRadiance) % TableName = 'body' ElemDesp2ODBDesp(IndexRadiance) % ColName = 'initial_obsvalue' ElemDesp2ODBDesp(IndexRadiance) % Varno = ops_odb_getval (h, "$rawsca") diff --git a/deps/ops/stubs/OpsMod_Varobs/Ops_GetDefaultVarfields.inc b/deps/ops/stubs/OpsMod_Varobs/Ops_GetDefaultVarfields.inc index 5b5f315e..82658925 100644 --- a/deps/ops/stubs/OpsMod_Varobs/Ops_GetDefaultVarfields.inc +++ b/deps/ops/stubs/OpsMod_Varobs/Ops_GetDefaultVarfields.inc @@ -179,7 +179,7 @@ SELECT CASE (ObsGroup) CASE (ObsGroupHLOSWIND) Varfields(1:6) = (/Varfield_HLOSwind,Varfield_ProfileNo,VarField_dWinddT, & VarField_dWinddP,VarField_AzimuthCOG,VarField_HeightCOG/) - CASE (ObsGroupIASI, ObsGroupIASING) + CASE (ObsGroupIASI, ObsGroupIASING, ObsGroupPseudoIASI) Varfields(1:12) = (/Varfield_tskin,Varfield_tcozone,Varfield_satzenith, & Varfield_surface,Varfield_stratt,Varfield_satid, & Varfield_numchans,Varfield_channum,Varfield_britemp, & diff --git a/deps/ops/stubs/OpsMod_Varobs/Ops_SetupVarobsLevDepC.inc b/deps/ops/stubs/OpsMod_Varobs/Ops_SetupVarobsLevDepC.inc index a2c70775..846bde9c 100644 --- a/deps/ops/stubs/OpsMod_Varobs/Ops_SetupVarobsLevDepC.inc +++ b/deps/ops/stubs/OpsMod_Varobs/Ops_SetupVarobsLevDepC.inc @@ -43,6 +43,7 @@ USE OpsMod_ObsGroupInfo, ONLY: & ObsGroupCrIS, & ObsGroupIASI, & ObsGroupIASING, & + ObsGroupPseudoIASI, & ObsGroupSBUV, & ObsGroupRadar, & ObsGroupRadarZ, & @@ -179,6 +180,11 @@ SELECT CASE (Observations % header % ObsGroup) ObsLevelType = 0.0 NumLevelLevs = 1 + CASE (ObsGroupPseudoIASI) + + ObsLevelType = 0.0 + NumLevelLevs = 1 + CASE (ObsGroupMTGIRS) ObsLevelType = 0.0 diff --git a/deps/ops/stubs/Ops_Constants/OpsFn_IsSatRadGroup.inc b/deps/ops/stubs/Ops_Constants/OpsFn_IsSatRadGroup.inc index 69e22e8f..c5a7e5fe 100644 --- a/deps/ops/stubs/Ops_Constants/OpsFn_IsSatRadGroup.inc +++ b/deps/ops/stubs/Ops_Constants/OpsFn_IsSatRadGroup.inc @@ -33,6 +33,7 @@ IF (obsgroup == ObsGroupABIClr .OR. & obsgroup == ObsGroupGOESImClr .OR. & obsgroup == ObsGroupIASI .OR. & obsgroup == ObsGroupIASING .OR. & + obsgroup == ObsGroupPseudoIASI .OR. & obsgroup == ObsGroupIN3DIClr .OR. & obsgroup == ObsGroupIN3DS .OR. & obsgroup == ObsGroupMWSFY3B .OR. & diff --git a/deps/ops/stubs/Ops_Constants/OpsFn_ObsGroupNameToNum.inc b/deps/ops/stubs/Ops_Constants/OpsFn_ObsGroupNameToNum.inc index 39bb1f90..d3d3f626 100644 --- a/deps/ops/stubs/Ops_Constants/OpsFn_ObsGroupNameToNum.inc +++ b/deps/ops/stubs/Ops_Constants/OpsFn_ObsGroupNameToNum.inc @@ -78,6 +78,8 @@ SELECT CASE (ObsGroupName) OpsFn_ObsGroupNameToNum = ObsGroupIASI CASE ("IASING") OpsFn_ObsGroupNameToNum = ObsGroupIASING + CASE ("PseudoIASI") + OpsFn_ObsGroupNameToNum = ObsGroupPseudoIASI CASE ("IN3DIClr") OpsFn_ObsGroupNameToNum = ObsGroupIN3DIClr CASE ("IN3DS") diff --git a/deps/ops/stubs/Ops_Constants/OpsFn_ObsGroupNumToName.inc b/deps/ops/stubs/Ops_Constants/OpsFn_ObsGroupNumToName.inc index 779a71ee..02111593 100644 --- a/deps/ops/stubs/Ops_Constants/OpsFn_ObsGroupNumToName.inc +++ b/deps/ops/stubs/Ops_Constants/OpsFn_ObsGroupNumToName.inc @@ -141,6 +141,8 @@ SELECT CASE (ObsGroup) OpsFn_ObsGroupNumToName = "SternaMWR" CASE (ObsGroupIASING) OpsFn_ObsGroupNumToName = "IASING" + CASE (ObsGroupPseudoIASI) + OpsFn_ObsGroupNumToName = "PseudoIASI" CASE DEFAULT OpsFn_ObsGroupNumToName = "Unknown" END SELECT diff --git a/deps/ops/stubs/Ops_Constants/OpsMod_ObsGroupInfo.f90 b/deps/ops/stubs/Ops_Constants/OpsMod_ObsGroupInfo.f90 index 2dd25a4b..7e2935da 100644 --- a/deps/ops/stubs/Ops_Constants/OpsMod_ObsGroupInfo.f90 +++ b/deps/ops/stubs/Ops_Constants/OpsMod_ObsGroupInfo.f90 @@ -83,7 +83,8 @@ MODULE OpsMod_ObsGroupInfo INTEGER, PARAMETER :: ObsGroupMWSFY3E = 72 ! => FY3E microwave sounder data INTEGER, PARAMETER :: ObsGroupHIRAS2 = 74 ! => HIRAS Radiances INTEGER, PARAMETER :: ObsGroupIASING = 75 ! => IASI Next Generation on EPS-SG -INTEGER, PARAMETER :: max_obs_group_num = 75 ! Number of observation groups +INTEGER, PARAMETER :: ObsGroupPseudoIASI = 76 ! => Pseudo-IASI version of IASI-NG on EPS-SG +INTEGER, PARAMETER :: max_obs_group_num = 76 ! Number of observation groups CONTAINS diff --git a/deps/ops/stubs/Ops_Constants/OpsMod_ObsTypes.f90 b/deps/ops/stubs/Ops_Constants/OpsMod_ObsTypes.f90 index b109a9ed..3e0f65c7 100644 --- a/deps/ops/stubs/Ops_Constants/OpsMod_ObsTypes.f90 +++ b/deps/ops/stubs/Ops_Constants/OpsMod_ObsTypes.f90 @@ -251,6 +251,7 @@ MODULE OpsMod_ObsTypes INTEGER, PARAMETER :: ObsTypeAMSR2 = 25000 ! => AMSR2 radiances INTEGER, PARAMETER :: ObsTypeAIRSL = 25100 ! => AIRS locally received data INTEGER, PARAMETER :: ObsTypeIASI_H = 25300 ! => High Res IASI +INTEGER, PARAMETER :: ObsTypePseudoIASI = 25310 ! => IASI-NG degraded to IASI sampling INTEGER, PARAMETER :: ObsTypeMERIS = 25400 ! => MERIS INTEGER, PARAMETER :: ObsTypeOLCI = 25410 ! => OLCI INTEGER, PARAMETER :: ObsTypeASCATHR = 25500 ! => HiRes ASCAT BUFR diff --git a/deps/ops/stubs/Ops_Constants/Ops_SubTypeNumToName.inc b/deps/ops/stubs/Ops_Constants/Ops_SubTypeNumToName.inc index 1f3ba9c2..149aa570 100644 --- a/deps/ops/stubs/Ops_Constants/Ops_SubTypeNumToName.inc +++ b/deps/ops/stubs/Ops_Constants/Ops_SubTypeNumToName.inc @@ -239,6 +239,8 @@ SELECT CASE (num) name = "PAOBS" CASE (ObsTypePilot) name = "PILOT" + CASE (ObsTypePseudoIASI) + name = "PseudoIASI" CASE (ObsTypeRadopWind) name = "RADOP" CASE (ObsTypeRadop2Wind) diff --git a/etc/global/cx/PseudoIASI.nl b/etc/global/cx/PseudoIASI.nl new file mode 100644 index 00000000..7e3c5a63 --- /dev/null +++ b/etc/global/cx/PseudoIASI.nl @@ -0,0 +1,3 @@ +&CXControlNL +CxFields=4,10,12,24,31,33,254,266,267,268,407,409,3209,3210,3236,3245,16222 +/ diff --git a/etc/global/varobs/PseudoIASI.nl b/etc/global/varobs/PseudoIASI.nl new file mode 100644 index 00000000..e2e9ed74 --- /dev/null +++ b/etc/global/varobs/PseudoIASI.nl @@ -0,0 +1,3 @@ +&VarobsControlNL +Varfields=10,11,18,19,21,28,31,35,36,54,55,57,80 +/ From 297c88bb9ca4d76eeb684e5bb8388d7133186394 Mon Sep 17 00:00:00 2001 From: Stu Newman Date: Fri, 25 Sep 2026 20:05:41 +0100 Subject: [PATCH 3/5] Make consistent with OPS tickets --- .../stubs/OpsMod_ODB/OpsODB_InitODBElemDesp.inc | 15 ++++----------- .../stubs/Ops_Constants/Ops_SubTypeNameToNum.inc | 4 ++++ 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/deps/ops/stubs/OpsMod_ODB/OpsODB_InitODBElemDesp.inc b/deps/ops/stubs/OpsMod_ODB/OpsODB_InitODBElemDesp.inc index cb286a95..e6a10d64 100644 --- a/deps/ops/stubs/OpsMod_ODB/OpsODB_InitODBElemDesp.inc +++ b/deps/ops/stubs/OpsMod_ODB/OpsODB_InitODBElemDesp.inc @@ -1422,13 +1422,6 @@ ElemDesp2ODBDesp(IndexIASIPCScore) % colname_array_length = 300 ElemDesp2ODBDesp(IndexIASIPCScoreCount) % TableName = 'iasi_principle_component' ElemDesp2ODBDesp(IndexIASIPCScoreCount) % ColName = 'principle_component_count' -ElemDesp2ODBDesp(IndexIASINGPCScore) % TableName = 'principal_component' -ElemDesp2ODBDesp(IndexIASINGPCScore) % ColName = 'principal_component_ng_score' -ElemDesp2ODBDesp(IndexIASINGPCScore) % colname_array_length = 340 - -ElemDesp2ODBDesp(IndexIASINGPCScoreCount) % TableName = 'principal_component' -ElemDesp2ODBDesp(IndexIASINGPCScoreCount) % ColName = 'principal_component_ng_count' - ElemDesp2ODBDesp(IndexODBObsType) % TableName = 'hdr' ElemDesp2ODBDesp(IndexODBObsType) % ColName = 'obstype' @@ -1675,10 +1668,10 @@ ElemDesp2ODBDesp(IndexModelSurfaceType) % ColName = 'totalcloud' ElemDesp2ODBDesp(IndexModelSurfaceType) % data_type = odb_real ElemDesp2ODBDesp(IndexModelSurfaceType) % has_missing = c_false -ElemDesp2ODBDesp(IndexSatelliteClassification) % TableName = 'radiance' -ElemDesp2ODBDesp(IndexSatelliteClassification) % ColName = 'satellite_classification' -ElemDesp2ODBDesp(IndexSatelliteClassification) % data_type = odb_integer -ElemDesp2ODBDesp(IndexSatelliteClassification) % has_missing = c_false +ElemDesp2ODBDesp(IndexSatelliteMission) % TableName = 'radiance' +ElemDesp2ODBDesp(IndexSatelliteMission) % ColName = 'satellite_mission' +ElemDesp2ODBDesp(IndexSatelliteMission) % data_type = odb_integer +ElemDesp2ODBDesp(IndexSatelliteMission) % has_missing = c_false ElemDesp2ODBDesp(IndexNonNormalisedPCScore) % TableName = 'radiance' ElemDesp2ODBDesp(IndexNonNormalisedPCScore) % ColName = 'non_normalised_pcscore' diff --git a/deps/ops/stubs/Ops_Constants/Ops_SubTypeNameToNum.inc b/deps/ops/stubs/Ops_Constants/Ops_SubTypeNameToNum.inc index b698d20b..d637541c 100644 --- a/deps/ops/stubs/Ops_Constants/Ops_SubTypeNameToNum.inc +++ b/deps/ops/stubs/Ops_Constants/Ops_SubTypeNameToNum.inc @@ -150,6 +150,8 @@ SELECT CASE (name) num = ObsTypeIASI_H CASE ("IASIL") num = ObsTypeIASI_L + CASE ("IASING") + num = ObsTypeIASING CASE ("IMDWINDS") num = ObsTypeIMDWINDS CASE ("IN3DCSR") @@ -236,6 +238,8 @@ SELECT CASE (name) num = 40700 CASE ("PILOT") num = ObsTypePilot + CASE ("PseudoIASI") + num = ObsTypePseudoIASI CASE ("RADOP") num = ObsTypeRadopWind CASE ("RADOP2") From 21baf4e57e1d69dc1b9450e1097a37d8cb421729 Mon Sep 17 00:00:00 2001 From: Stu Newman Date: Mon, 12 Oct 2026 15:19:11 +0100 Subject: [PATCH 4/5] Add ctests for IASING and PseudoIASI --- test/generate_unittest_netcdfs.py | 40 +++++++++++ test/testinput/cx_globalnamelist_iasing.nc4 | Bin 0 -> 17405 bytes .../cx_globalnamelist_pseudoiasi.nc4 | Bin 0 -> 17405 bytes .../cxwriter_globalnamelist_iasing.yaml | 58 +++++++++++++++ .../cxwriter_globalnamelist_pseudoiasi.yaml | 58 +++++++++++++++ .../varobs_globalnamelist_iasing.nc4 | Bin 0 -> 21928 bytes .../varobs_globalnamelist_pseudoiasi.nc4 | Bin 0 -> 21928 bytes .../varobswriter_globalnamelist_iasing.yaml | 68 ++++++++++++++++++ ...arobswriter_globalnamelist_pseudoiasi.yaml | 68 ++++++++++++++++++ 9 files changed, 292 insertions(+) create mode 100644 test/testinput/cx_globalnamelist_iasing.nc4 create mode 100644 test/testinput/cx_globalnamelist_pseudoiasi.nc4 create mode 100644 test/testinput/cxwriter_globalnamelist_iasing.yaml create mode 100644 test/testinput/cxwriter_globalnamelist_pseudoiasi.yaml create mode 100644 test/testinput/varobs_globalnamelist_iasing.nc4 create mode 100644 test/testinput/varobs_globalnamelist_pseudoiasi.nc4 create mode 100644 test/testinput/varobswriter_globalnamelist_iasing.yaml create mode 100644 test/testinput/varobswriter_globalnamelist_pseudoiasi.yaml diff --git a/test/generate_unittest_netcdfs.py b/test/generate_unittest_netcdfs.py index 599455a0..14ee9469 100644 --- a/test/generate_unittest_netcdfs.py +++ b/test/generate_unittest_netcdfs.py @@ -918,6 +918,30 @@ def copy_var_to_var(Group, invarname, outvarname, filename): ['MetaData/surfaceQualifier', 'MetaData/satelliteIdentifier', 'MetaData/observationSubTypeNum'], 'testinput/varobs_globalnamelist_iasi.nc4') + # IASING + output_full_varobs_to_netcdf(['MetaData/latitude', 'MetaData/longitude', + 'OneDVar/skinTemperature', 'MetaData/sensorZenithAngle', + 'MetaData/solarZenithAngle', 'OutputToVAR/pressureAtTopOfCloud', 'OneDVar/cloudAmount', + 'MetaData/ozoneTotal'], + ['ObsValue/radiance', 'DerivedObsValue/brightnessTemperature', 'EffectiveError/brightnessTemperature', + 'OneDVar/emissivity', 'BiasCorrObsValue/brightnessTemperature', + 'thickness_850_300hPa_satid_13Predictor/brightnessTemperature', + 'thickness_850_300hPa_satid_17Predictor/brightnessTemperature'], + ['MetaData/surfaceQualifier', 'MetaData/satelliteIdentifier', 'MetaData/observationSubTypeNum'], + 'testinput/varobs_globalnamelist_iasing.nc4') + + # PseudoIASI + output_full_varobs_to_netcdf(['MetaData/latitude', 'MetaData/longitude', + 'OneDVar/skinTemperature', 'MetaData/sensorZenithAngle', + 'MetaData/solarZenithAngle', 'OutputToVAR/pressureAtTopOfCloud', 'OneDVar/cloudAmount', + 'MetaData/ozoneTotal'], + ['ObsValue/radiance', 'DerivedObsValue/brightnessTemperature', 'EffectiveError/brightnessTemperature', + 'OneDVar/emissivity', 'BiasCorrObsValue/brightnessTemperature', + 'thickness_850_300hPa_satid_13Predictor/brightnessTemperature', + 'thickness_850_300hPa_satid_17Predictor/brightnessTemperature'], + ['MetaData/surfaceQualifier', 'MetaData/satelliteIdentifier', 'MetaData/observationSubTypeNum'], + 'testinput/varobs_globalnamelist_pseudoiasi.nc4') + # SEVIRIClr output_full_varobs_to_netcdf(['MetaData/latitude', 'MetaData/longitude', 'OneDVar/skinTemperature', 'MetaData/sensorZenithAngle', 'MetaData/solarZenithAngle', 'Emiss/emissivityIR', 'MetaData/ozoneTotal'], @@ -1234,6 +1258,22 @@ def copy_var_to_var(Group, invarname, outvarname, filename): 'cloud_volume_fraction_in_atmosphere_layer', 'liquid_cloud_volume_fraction_in_atmosphere_layer', 'ice_cloud_volume_fraction_in_atmosphere_layer'], 'testinput/cx_globalnamelist_iasi.nc4') + # IASING + output_full_cx_to_netcdf(['skin_temperature_at_surface', 'ice_area_fraction', 'height_above_mean_sea_level_at_surface', 'air_pressure_at_surface', 'eastward_wind_at_10m', + 'northward_wind_at_10m', 'air_temperature_at_2m', 'relative_humidity_at_2m', 'air_pressure_at_sea_level'], + ['air_potential_temperature', 'water_vapor_mixing_ratio_wrt_moist_air', 'cloud_ice_mixing_ratio_wrt_moist_air_and_condensed_water', + 'cloud_liquid_water_mixing_ratio_wrt_moist_air_and_condensed_water', 'air_pressure_levels', + 'cloud_volume_fraction_in_atmosphere_layer', 'liquid_cloud_volume_fraction_in_atmosphere_layer', 'ice_cloud_volume_fraction_in_atmosphere_layer'], + 'testinput/cx_globalnamelist_iasing.nc4') + + # PseudoIASI + output_full_cx_to_netcdf(['skin_temperature_at_surface', 'ice_area_fraction', 'height_above_mean_sea_level_at_surface', 'air_pressure_at_surface', 'eastward_wind_at_10m', + 'northward_wind_at_10m', 'air_temperature_at_2m', 'relative_humidity_at_2m', 'air_pressure_at_sea_level'], + ['air_potential_temperature', 'water_vapor_mixing_ratio_wrt_moist_air', 'cloud_ice_mixing_ratio_wrt_moist_air_and_condensed_water', + 'cloud_liquid_water_mixing_ratio_wrt_moist_air_and_condensed_water', 'air_pressure_levels', + 'cloud_volume_fraction_in_atmosphere_layer', 'liquid_cloud_volume_fraction_in_atmosphere_layer', 'ice_cloud_volume_fraction_in_atmosphere_layer'], + 'testinput/cx_globalnamelist_pseudoiasi.nc4') + # SEVIRIClr output_full_cx_to_netcdf(['skin_temperature_at_surface', 'ice_area_fraction', 'height_above_mean_sea_level_at_surface', 'air_pressure_at_surface', 'eastward_wind_at_10m', 'northward_wind_at_10m', 'air_temperature_at_2m', 'relative_humidity_at_2m', 'air_pressure_at_sea_level'], diff --git a/test/testinput/cx_globalnamelist_iasing.nc4 b/test/testinput/cx_globalnamelist_iasing.nc4 new file mode 100644 index 0000000000000000000000000000000000000000..3142e214bf05b32fae0cfc8f4aad82833b1d26f5 GIT binary patch literal 17405 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 literal 0 HcmV?d00001 diff --git a/test/testinput/varobs_globalnamelist_pseudoiasi.nc4 b/test/testinput/varobs_globalnamelist_pseudoiasi.nc4 new file mode 100644 index 0000000000000000000000000000000000000000..c07f938ead72add0d606b337c0b2af79c5cd2f22 GIT binary patch literal 21928 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 literal 0 HcmV?d00001 diff --git a/test/testinput/varobswriter_globalnamelist_iasing.yaml b/test/testinput/varobswriter_globalnamelist_iasing.yaml new file mode 100644 index 00000000..2592fc97 --- /dev/null +++ b/test/testinput/varobswriter_globalnamelist_iasing.yaml @@ -0,0 +1,68 @@ +time window: + begin: 1999-01-01T00:00:00Z + end: 2032-01-01T02:00:00Z + +observations: + - obs space: + name: IASING + obsdatain: + engine: + type: H5File + obsfile: Data/varobs_globalnamelist_iasing.nc4 + observed variables: [radiance] + simulated variables: [brightnessTemperature] + derived variables: [brightnessTemperature] + channels: &all_channels 1, 3 + obs filters: + # Set the flag of observations with missing values to "pass": we want to check if these + # values are encoded correctly in the VarObsFile. + - filter: Reset Flags to Pass + flags_to_reset: [10, 15] # missing, Hfailed + ### Assign nominal error (ensure not missing values) ### + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *all_channels + action: + name: assign error + error parameter: 10.0 + - filter: BlackList + filter variables: + - name: brightnessTemperature + channels: *all_channels + where: + - variable: + name: MetaData/latitude #ensures ob2 is failed + value: is_not_valid + - filter: VarObs Writer + namelist_directory: ../etc/global/varobs + variables_for_quality_control: + - name: brightnessTemperature + channels: *all_channels + reject_obs_with_all_variables_failing_qc: true + general_mode: verbose + output_varbc_predictors: true + size_of_varobs_array: 4 + fill_obstype_from_ops_subtype: true + - filter: VarObs Checker + expected_main_table_columns: + # Only channels 1 and 3 are simulated and hence written to the VarObs file. + # In the arrays below, rows denote locations and columns are the varobs channels are consecutive. + field: ["10","10","10","10","11","18","19","21","28","31","35","36","54","55","55","57","57","57","57","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80", + "10","10","10","10","11","18","19","21","28","31","35","36","54","55","55","57","57","57","57","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80", + "10","10","10","10","11","18","19","21","28","31","35","36","54","55","55","57","57","57","57","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80"] + level: ["1","2","3","4","1","1","1","1","1","1","1","1","1","1","2","1","2","3","4","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31", + "1","2","3","4","1","1","1","1","1","1","1","1","1","1","2","1","2","3","4","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31", + "1","2","3","4","1","1","1","1","1","1","1","1","1","1","2","1","2","3","4","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31"] + ob value: ["41.10000","41.30000","-1073741824.00000","-1073741824.00000","27.10000","77.10000","37.10000","3.00000","13.00000","47.10000","57.10000","67.10000","2.00000","1.00000","2.00000","31.10000","31.30000","-1073741824.00000","-1073741824.00000","0.00000","112.20000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000", + "43.10000","43.30000","-1073741824.00000","-1073741824.00000","27.30000","77.30000","37.30000","7.00000","17.00000","47.30000","57.30000","67.30000","2.00000","1.00000","2.00000","33.10000","33.30000","-1073741824.00000","-1073741824.00000","0.00000","116.20000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000", + "44.10000","44.30000","-1073741824.00000","-1073741824.00000","27.40000","77.40000","37.40000","9.00000","19.00000","47.40000","57.40000","67.40000","2.00000","1.00000","2.00000","34.10000","34.30000","-1073741824.00000","-1073741824.00000","0.00000","118.20000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000"] + lat: ["7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000", + "7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000", + "7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000"] + lon: ["17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000", + "17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000", + "17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000"] + HofX: ObsValue + benchmarkFlag: 1000 + flaggedBenchmark: 0 diff --git a/test/testinput/varobswriter_globalnamelist_pseudoiasi.yaml b/test/testinput/varobswriter_globalnamelist_pseudoiasi.yaml new file mode 100644 index 00000000..7ff5abf9 --- /dev/null +++ b/test/testinput/varobswriter_globalnamelist_pseudoiasi.yaml @@ -0,0 +1,68 @@ +time window: + begin: 1999-01-01T00:00:00Z + end: 2032-01-01T02:00:00Z + +observations: + - obs space: + name: PseudoIASI + obsdatain: + engine: + type: H5File + obsfile: Data/varobs_globalnamelist_pseudoiasi.nc4 + observed variables: [radiance] + simulated variables: [brightnessTemperature] + derived variables: [brightnessTemperature] + channels: &all_channels 1, 3 + obs filters: + # Set the flag of observations with missing values to "pass": we want to check if these + # values are encoded correctly in the VarObsFile. + - filter: Reset Flags to Pass + flags_to_reset: [10, 15] # missing, Hfailed + ### Assign nominal error (ensure not missing values) ### + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *all_channels + action: + name: assign error + error parameter: 10.0 + - filter: BlackList + filter variables: + - name: brightnessTemperature + channels: *all_channels + where: + - variable: + name: MetaData/latitude #ensures ob2 is failed + value: is_not_valid + - filter: VarObs Writer + namelist_directory: ../etc/global/varobs + variables_for_quality_control: + - name: brightnessTemperature + channels: *all_channels + reject_obs_with_all_variables_failing_qc: true + general_mode: verbose + output_varbc_predictors: true + size_of_varobs_array: 4 + fill_obstype_from_ops_subtype: true + - filter: VarObs Checker + expected_main_table_columns: + # Only channels 1 and 3 are simulated and hence written to the VarObs file. + # In the arrays below, rows denote locations and columns are the varobs channels are consecutive. + field: ["10","10","10","10","11","18","19","21","28","31","35","36","54","55","55","57","57","57","57","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80", + "10","10","10","10","11","18","19","21","28","31","35","36","54","55","55","57","57","57","57","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80", + "10","10","10","10","11","18","19","21","28","31","35","36","54","55","55","57","57","57","57","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80","80"] + level: ["1","2","3","4","1","1","1","1","1","1","1","1","1","1","2","1","2","3","4","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31", + "1","2","3","4","1","1","1","1","1","1","1","1","1","1","2","1","2","3","4","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31", + "1","2","3","4","1","1","1","1","1","1","1","1","1","1","2","1","2","3","4","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31"] + ob value: ["41.10000","41.30000","-1073741824.00000","-1073741824.00000","27.10000","77.10000","37.10000","3.00000","13.00000","47.10000","57.10000","67.10000","2.00000","1.00000","2.00000","31.10000","31.30000","-1073741824.00000","-1073741824.00000","0.00000","112.20000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000", + "43.10000","43.30000","-1073741824.00000","-1073741824.00000","27.30000","77.30000","37.30000","7.00000","17.00000","47.30000","57.30000","67.30000","2.00000","1.00000","2.00000","33.10000","33.30000","-1073741824.00000","-1073741824.00000","0.00000","116.20000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000", + "44.10000","44.30000","-1073741824.00000","-1073741824.00000","27.40000","77.40000","37.40000","9.00000","19.00000","47.40000","57.40000","67.40000","2.00000","1.00000","2.00000","34.10000","34.30000","-1073741824.00000","-1073741824.00000","0.00000","118.20000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000","0.00000"] + lat: ["7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000","7.10000", + "7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000","7.30000", + "7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000","7.40000"] + lon: ["17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000","17.10000", + "17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000","17.30000", + "17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000","17.40000"] + HofX: ObsValue + benchmarkFlag: 1000 + flaggedBenchmark: 0 From 3fb4055c83f333469b74d88aa3d2003df18efd67 Mon Sep 17 00:00:00 2001 From: Stu Newman Date: Mon, 12 Oct 2026 15:56:44 +0100 Subject: [PATCH 5/5] Add cxwriter and varobswriter tests --- test/CMakeLists.txt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index d6a5c183..ae138379 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -414,6 +414,16 @@ ADD_WRITER_TEST(NAME varobswriter_globalnamelist_iasi YAML varobswriter_globalnamelist_iasi.yaml NAMELIST ../../etc/global/varobs/IASI.nl DATA varobs_globalnamelist_iasi.nc4 018_VarField_tcozone_obsdiag.nc4) +ADD_WRITER_TEST(NAME varobswriter_globalnamelist_iasing + LABELS varobswriter globalnamelist + YAML varobswriter_globalnamelist_iasing.yaml + NAMELIST ../../etc/global/varobs/IASING.nl + DATA varobs_globalnamelist_iasing.nc4) +ADD_WRITER_TEST(NAME varobswriter_globalnamelist_pseudoiasi + LABELS varobswriter globalnamelist + YAML varobswriter_globalnamelist_pseudoiasi.yaml + NAMELIST ../../etc/global/varobs/PseudoIASI.nl + DATA varobs_globalnamelist_pseudoiasi.nc4) ADD_WRITER_TEST(NAME varobswriter_globalnamelist_seviriclr LABELS varobswriter globalnamelist YAML varobswriter_globalnamelist_seviriclr.yaml @@ -831,6 +841,14 @@ ADD_WRITER_TEST(NAME cxwriter_globalnamelist_iasi LABELS cxwriter globalnamelist YAML cxwriter_globalnamelist_iasi.yaml DATA cx_globalnamelist_iasi.nc4 varobs_globalnamelist_iasi.nc4) +ADD_WRITER_TEST(NAME cxwriter_globalnamelist_iasing + LABELS cxwriter globalnamelist + YAML cxwriter_globalnamelist_iasing.yaml + DATA cx_globalnamelist_iasing.nc4 dummy.nc4) +ADD_WRITER_TEST(NAME cxwriter_globalnamelist_pseudoiasi + LABELS cxwriter globalnamelist + YAML cxwriter_globalnamelist_pseudoiasi.yaml + DATA cx_globalnamelist_pseudoiasi.nc4 dummy.nc4) ADD_WRITER_TEST(NAME cxwriter_globalnamelist_seviriclr LABELS cxwriter globalnamelist YAML cxwriter_globalnamelist_seviriclr.yaml