diff --git a/deps/ops/stubs/OpsMod_CXGenerate/Ops_GetDefaultCxFields.inc b/deps/ops/stubs/OpsMod_CXGenerate/Ops_GetDefaultCxFields.inc index 89a7f3e4..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) + 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 fcd305d5..77bb11f4 100644 --- a/deps/ops/stubs/OpsMod_Control/Ops_ReadObsGroupSwitches.inc +++ b/deps/ops/stubs/OpsMod_Control/Ops_ReadObsGroupSwitches.inc @@ -107,6 +107,8 @@ 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") +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 ab04757d..28afdac4 100644 --- a/deps/ops/stubs/OpsMod_ODB/OpsFn_ObsToReportType.inc +++ b/deps/ops/stubs/OpsMod_ODB/OpsFn_ObsToReportType.inc @@ -651,6 +651,44 @@ 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 + ! 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. + 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 (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.inc b/deps/ops/stubs/OpsMod_ODB/OpsODB_InitODBElemDesp.inc index cbbec080..e6a10d64 100644 --- a/deps/ops/stubs/OpsMod_ODB/OpsODB_InitODBElemDesp.inc +++ b/deps/ops/stubs/OpsMod_ODB/OpsODB_InitODBElemDesp.inc @@ -1668,6 +1668,49 @@ ElemDesp2ODBDesp(IndexModelSurfaceType) % ColName = 'totalcloud' ElemDesp2ODBDesp(IndexModelSurfaceType) % data_type = odb_real ElemDesp2ODBDesp(IndexModelSurfaceType) % 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' +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..8e5d3cdb 100644 --- a/deps/ops/stubs/OpsMod_ODB/OpsODB_InitODBElemDesp_Body.inc +++ b/deps/ops/stubs/OpsMod_ODB/OpsODB_InitODBElemDesp_Body.inc @@ -38,6 +38,8 @@ USE OpsMod_ObsGroupInfo, ONLY: & ObsGroupGPSRO, & ObsGroupHLOSWind, & ObsGroupIASI, & + ObsGroupIASING, & + ObsGroupPseudoIASI, & ObsGroupIN3DIClr, & ObsGroupIN3DS, & ObsGroupSAPHIR, & @@ -1365,6 +1367,16 @@ IF (ObsGroup == ObsGroupGMIlow .OR. ObsGroup == ObsGroupGMIhigh) THEN END IF +IF (ObsGroup == ObsGroupIASING .OR. ObsGroup == ObsGroupPseudoIASI) 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..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) + 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 76ec26f3..846bde9c 100644 --- a/deps/ops/stubs/OpsMod_Varobs/Ops_SetupVarobsLevDepC.inc +++ b/deps/ops/stubs/OpsMod_Varobs/Ops_SetupVarobsLevDepC.inc @@ -42,6 +42,8 @@ USE OpsMod_ObsGroupInfo, ONLY: & ObsGroupAIRS, & ObsGroupCrIS, & ObsGroupIASI, & + ObsGroupIASING, & + ObsGroupPseudoIASI, & ObsGroupSBUV, & ObsGroupRadar, & ObsGroupRadarZ, & @@ -173,6 +175,16 @@ SELECT CASE (Observations % header % ObsGroup) ObsLevelType = 0.0 NumLevelLevs = 1 + CASE (ObsGroupIASING) + + 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 843ca577..c5a7e5fe 100644 --- a/deps/ops/stubs/Ops_Constants/OpsFn_IsSatRadGroup.inc +++ b/deps/ops/stubs/Ops_Constants/OpsFn_IsSatRadGroup.inc @@ -32,6 +32,8 @@ IF (obsgroup == ObsGroupABIClr .OR. & obsgroup == ObsGroupGeoCloud .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 ee5e1134..d3d3f626 100644 --- a/deps/ops/stubs/Ops_Constants/OpsFn_ObsGroupNameToNum.inc +++ b/deps/ops/stubs/Ops_Constants/OpsFn_ObsGroupNameToNum.inc @@ -76,6 +76,10 @@ SELECT CASE (ObsGroupName) OpsFn_ObsGroupNameToNum = ObsGroupHLOSwind CASE ("IASI") 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 d29c7362..02111593 100644 --- a/deps/ops/stubs/Ops_Constants/OpsFn_ObsGroupNumToName.inc +++ b/deps/ops/stubs/Ops_Constants/OpsFn_ObsGroupNumToName.inc @@ -139,6 +139,10 @@ SELECT CASE (ObsGroup) OpsFn_ObsGroupNumToName = "EPSMWS" CASE (ObsGroupSternaMWR) 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 97a8b725..7e2935da 100644 --- a/deps/ops/stubs/Ops_Constants/OpsMod_ObsGroupInfo.f90 +++ b/deps/ops/stubs/Ops_Constants/OpsMod_ObsGroupInfo.f90 @@ -82,7 +82,9 @@ 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 :: 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 e5dc6d40..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 @@ -269,6 +270,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_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") diff --git a/deps/ops/stubs/Ops_Constants/Ops_SubTypeNumToName.inc b/deps/ops/stubs/Ops_Constants/Ops_SubTypeNumToName.inc index 3490e92c..149aa570 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) @@ -237,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/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/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/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 +/ 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 +/ 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 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 00000000..3142e214 Binary files /dev/null and b/test/testinput/cx_globalnamelist_iasing.nc4 differ diff --git a/test/testinput/cx_globalnamelist_pseudoiasi.nc4 b/test/testinput/cx_globalnamelist_pseudoiasi.nc4 new file mode 100644 index 00000000..3142e214 Binary files /dev/null and b/test/testinput/cx_globalnamelist_pseudoiasi.nc4 differ diff --git a/test/testinput/cxwriter_globalnamelist_iasing.yaml b/test/testinput/cxwriter_globalnamelist_iasing.yaml new file mode 100644 index 00000000..ce2f5579 --- /dev/null +++ b/test/testinput/cxwriter_globalnamelist_iasing.yaml @@ -0,0 +1,58 @@ +time window: + begin: 2018-01-01T00:00:00Z + end: 2018-01-01T01: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 + geovals: + filename: Data/cx_globalnamelist_iasing.nc4 + 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: Cx Writer + variables_for_quality_control: + - name: brightnessTemperature + channels: *all_channels + namelist_directory: ../etc/global/cx + reject_obs_with_all_variables_failing_qc: true + general_mode: debug + IC_PLevels: 5 + - filter: Cx Checker + expected_surface_variables: ["1","2","3","4","5","6","13","16","17"] + expected_upper_air_variables: ["1","5","11","29","30","31","34","35"] + expected_main_table_columns: + - # batch 1 - 9 1dvalues first ; then 2d values in expected order + # observation 3 is rejected by the tests above hence only 3 (1,2,4) columns + - ["27.10","37.10","67.10","7710.00","47.10","57.10","7.10","87.10","17.10","1.10","1.20","1.30","11.10","11.20","11.30","41.10","41.20","41.30","21.10","21.20","21.30","31.10","31.20","31.30","51.10","51.20","51.30","71.10","71.20","71.30","61.10","61.20","61.30"] # column 1 - 1st observation + - ["27.30","37.30","67.30","7730.00","47.30","57.30","7.30","87.30","17.30","3.10","3.20","3.30","13.10","13.20","13.30","43.10","43.20","43.30","23.10","23.20","23.30","33.10","33.20","33.30","53.10","53.20","53.30","73.10","73.20","73.30","63.10","63.20","63.30"] # column 3 - 3rd observation + - ["27.40","37.40","67.40","7740.00","47.40","57.40","7.40","87.40","17.40","4.10","4.20","4.30","14.10","14.20","14.30","44.10","44.20","44.30","24.10","24.20","24.30","34.10","34.20","34.30","54.10","54.20","54.30","74.10","74.20","74.30","64.10","64.20","64.30"] # column 4 - 4th observation + HofX: ObsValue # just a placeholder -- not used, but needed to force calls to postFilter. + benchmarkFlag: 1000 # just to keep the ObsFilters test happy + flaggedBenchmark: 0 diff --git a/test/testinput/cxwriter_globalnamelist_pseudoiasi.yaml b/test/testinput/cxwriter_globalnamelist_pseudoiasi.yaml new file mode 100644 index 00000000..86df793b --- /dev/null +++ b/test/testinput/cxwriter_globalnamelist_pseudoiasi.yaml @@ -0,0 +1,58 @@ +time window: + begin: 2018-01-01T00:00:00Z + end: 2018-01-01T01: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 + geovals: + filename: Data/cx_globalnamelist_pseudoiasi.nc4 + 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: Cx Writer + variables_for_quality_control: + - name: brightnessTemperature + channels: *all_channels + namelist_directory: ../etc/global/cx + reject_obs_with_all_variables_failing_qc: true + general_mode: debug + IC_PLevels: 5 + - filter: Cx Checker + expected_surface_variables: ["1","2","3","4","5","6","13","16","17"] + expected_upper_air_variables: ["1","5","11","29","30","31","34","35"] + expected_main_table_columns: + - # batch 1 - 9 1dvalues first ; then 2d values in expected order + # observation 3 is rejected by the tests above hence only 3 (1,2,4) columns + - ["27.10","37.10","67.10","7710.00","47.10","57.10","7.10","87.10","17.10","1.10","1.20","1.30","11.10","11.20","11.30","41.10","41.20","41.30","21.10","21.20","21.30","31.10","31.20","31.30","51.10","51.20","51.30","71.10","71.20","71.30","61.10","61.20","61.30"] # column 1 - 1st observation + - ["27.30","37.30","67.30","7730.00","47.30","57.30","7.30","87.30","17.30","3.10","3.20","3.30","13.10","13.20","13.30","43.10","43.20","43.30","23.10","23.20","23.30","33.10","33.20","33.30","53.10","53.20","53.30","73.10","73.20","73.30","63.10","63.20","63.30"] # column 3 - 3rd observation + - ["27.40","37.40","67.40","7740.00","47.40","57.40","7.40","87.40","17.40","4.10","4.20","4.30","14.10","14.20","14.30","44.10","44.20","44.30","24.10","24.20","24.30","34.10","34.20","34.30","54.10","54.20","54.30","74.10","74.20","74.30","64.10","64.20","64.30"] # column 4 - 4th observation + HofX: ObsValue # just a placeholder -- not used, but needed to force calls to postFilter. + benchmarkFlag: 1000 # just to keep the ObsFilters test happy + flaggedBenchmark: 0 diff --git a/test/testinput/varobs_globalnamelist_iasing.nc4 b/test/testinput/varobs_globalnamelist_iasing.nc4 new file mode 100644 index 00000000..c07f938e Binary files /dev/null and b/test/testinput/varobs_globalnamelist_iasing.nc4 differ diff --git a/test/testinput/varobs_globalnamelist_pseudoiasi.nc4 b/test/testinput/varobs_globalnamelist_pseudoiasi.nc4 new file mode 100644 index 00000000..c07f938e Binary files /dev/null and b/test/testinput/varobs_globalnamelist_pseudoiasi.nc4 differ 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