Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add capability to create varobs and cx files for MTG-IRS #234

Merged
merged 9 commits into from
Feb 12, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ jobs:
--entrypoint=/usr/local/src/${REPO}/${PR}/build-and-test \
--workdir=/usr/local/src/${REPO}/${PR} \
--volume ${PWD}/${PR}:/usr/local/src/${REPO}/${PR} \
'jcsda/docker-gnu-openmpi-dev:latest'
'jcsda/docker-gnu-openmpi-dev:skylab-v8'

build2:
if: |
Expand Down
2 changes: 1 addition & 1 deletion deps/ops/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ set(OPS_SOURCE_FILES
code/OpsMod_AirQuality/OpsMod_AirQuality.f90
code/OpsMod_Argument/OpsMod_Argument.f90
code/OpsMod_CXInfo/OpsMod_CXInfo.f90
code/OpsMod_Control/OpsMod_Control.f90
code/OpsMod_DateTime/OpsMod_DateTime.f90
code/OpsMod_GatherSpread/OpsMod_GatherSpread.F90
code/OpsMod_HorizontalInterp/OpsMod_HorizontalInterp.f90
Expand Down Expand Up @@ -88,6 +87,7 @@ set(OPS_SOURCE_FILES
stubs/OpsMod_Varobs/OpsMod_Varobs.f90
stubs/Ops_SatRad_Info/OpsMod_SatRad_RTmodel.f90
stubs/Ops_SatRad_SetUp/OpsMod_SatRad_SetUp.f90
stubs/OpsMod_Control/OpsMod_Control.f90
)

# Intel inserts lines in the source during pre-processing that contain the source file path, if the pathname
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ Using(ObsGroupHIRAS) = ops_env_is_true ("OPS_HIRAS")
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")

ALLOCATE (obs_group_list(COUNT (using)))
obs_group_list = IMDI
Expand Down
9 changes: 9 additions & 0 deletions deps/ops/stubs/OpsMod_Varobs/Ops_GetDefaultVarfields.inc
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,15 @@ SELECT CASE (ObsGroup)
IF (.NOT. RTTOV_CloudSwitch) THEN
Varfields(13:14) = (/Varfield_cloudtopp, Varfield_cloudfrac/)
END IF
CASE (ObsGroupMTGIRS)
Varfields(1:12) = (/Varfield_tskin,Varfield_tcozone,Varfield_satzenith, &
Varfield_surface,Varfield_stratt,Varfield_satid, &
Varfield_numchans,Varfield_channum,Varfield_britemp, &
Varfield_emissivity,Varfield_solzenith, &
Varfield_qcinfo/)
IF (.NOT. RTTOV_CloudSwitch) THEN
Varfields(13:14) = (/Varfield_cloudtopp, Varfield_cloudfrac/)
END IF
CASE (ObsGroupIN3DIClr)
Varfields(1:12) = (/Varfield_britemp,Varfield_satid,Varfield_satzenith, &
Varfield_solzenith,Varfield_tskin,Varfield_tcozone, &
Expand Down
8 changes: 7 additions & 1 deletion deps/ops/stubs/OpsMod_Varobs/Ops_SetupVarobsLevDepC.inc
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,8 @@ USE OpsMod_ObsGroupInfo, ONLY: &
ObsGroupHIRAS, &
ObsGroupOceanWinds, &
ObsGroupGIIRSLW, &
ObsGroupGIIRSMW
ObsGroupGIIRSMW, &
ObsGroupMTGIRS

USE OpsMod_ObsInfo, ONLY: &
OB_type
Expand Down Expand Up @@ -166,6 +167,11 @@ SELECT CASE (Observations % header % ObsGroup)
ObsLevelType = 0.0
NumLevelLevs = 1

CASE (ObsGroupMTGIRS)

ObsLevelType = 0.0
NumLevelLevs = 1

CASE (ObsGroupAMSUB)

ObsLevelType = 0.0
Expand Down
3 changes: 2 additions & 1 deletion deps/ops/stubs/Ops_Constants/OpsFn_IsSatRadGroup.inc
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ IF (obsgroup == ObsGroupABIClr .OR. &
obsgroup == ObsGroupGMIhigh .OR. &
obsgroup == ObsGroupSSMIS .OR. &
obsgroup == ObsGroupGIIRSLW .OR. &
obsgroup == ObsGroupGIIRSMW) THEN
obsgroup == ObsGroupGIIRSMW .OR. &
obsgroup == ObsGroupMTGIRS) THEN

OpsFn_IsSatRadGroup = .TRUE.
ELSE
Expand Down
2 changes: 2 additions & 0 deletions deps/ops/stubs/Ops_Constants/OpsFn_ObsGroupNameToNum.inc
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,8 @@ SELECT CASE (ObsGroupName)
OpsFn_ObsGroupNameToNum = ObsGroupSurface
CASE ("SurfaceCloud")
OpsFn_ObsGroupNameToNum = ObsGroupSurfaceCloud
CASE ("MTGIRS")
OpsFn_ObsGroupNameToNum = ObsGroupMTGIRS
CASE DEFAULT
OpsFn_ObsGroupNameToNum = IMDI
END SELECT
Expand Down
2 changes: 2 additions & 0 deletions deps/ops/stubs/Ops_Constants/OpsFn_ObsGroupNumToName.inc
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,8 @@ SELECT CASE (ObsGroup)
OpsFn_ObsGroupNumToName = "Surface"
CASE (ObsGroupSurfaceCloud)
OpsFn_ObsGroupNumToName = "SurfaceCloud"
CASE (ObsGroupMTGIRS)
OpsFn_ObsGroupNumToName = "MTGIRS"
CASE DEFAULT
OpsFn_ObsGroupNumToName = "Unknown"
END SELECT
Expand Down
5 changes: 4 additions & 1 deletion deps/ops/stubs/Ops_Constants/OpsMod_ObsGroupInfo.f90
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,10 @@ MODULE OpsMod_ObsGroupInfo
INTEGER, PARAMETER :: ObsGroupGIIRSLW = 62 ! => GIIRS LW radiances
INTEGER, PARAMETER :: ObsGroupGIIRSMW = 63 ! => GIIRS MW radiances
INTEGER, PARAMETER :: ObsGroupScatwindChosen = 64 ! => Scatterometer winds (single solution)
INTEGER, PARAMETER :: max_obs_group_num = 64 ! Number of observation groups
INTEGER, PARAMETER :: ObsGroupSurfaceLSDA = 65 ! => LSDA (Surface)
INTEGER, PARAMETER :: ObsGroupAscatLSDA = 66 ! => LSDA (ASCAT)
INTEGER, PARAMETER :: ObsGroupMTGIRS = 67 ! => MTG-IRS radiances
INTEGER, PARAMETER :: max_obs_group_num = 67 ! Number of observation groups

CONTAINS

Expand Down
1 change: 0 additions & 1 deletion deps/update_ops_sources.sh
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ cp --parents --recursive code/GenMod_ModelIO "$DEST_DIR"
cp --parents --recursive code/OpsMod_AirQuality "$DEST_DIR"
cp --parents --recursive code/OpsMod_Argument "$DEST_DIR"
cp --parents --recursive code/OpsMod_CXInfo "$DEST_DIR"
cp --parents --recursive code/OpsMod_Control "$DEST_DIR"
cp --parents --recursive code/OpsMod_DateTime "$DEST_DIR"
cp --parents --recursive code/OpsMod_GatherSpread "$DEST_DIR"
cp --parents --recursive code/OpsMod_HorizontalInterp "$DEST_DIR"
Expand Down
3 changes: 3 additions & 0 deletions etc/global/cx/MTGIRS.nl
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
&CXControlNL
CxFields=4,10,12,24,31,33,254,266,267,268,407,409,3209,3210,3236,3245,16222
/
3 changes: 3 additions & 0 deletions etc/global/varobs/MTGIRS.nl
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
&VarobsControlNL
Varfields=10,11,18,19,21,28,31,35,36,54,55,57,80
/
8 changes: 8 additions & 0 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,10 @@ ADD_WRITER_TEST(NAME varobswriter_globalnamelist_seviriclr
YAML varobswriter_globalnamelist_seviriclr.yaml
NAMELIST ../../etc/global/varobs/SEVIRIClr.nl
DATA varobs_globalnamelist_seviriclr.nc4)
ADD_WRITER_TEST(NAME varobswriter_globalnamelist_mtgirs
YAML varobswriter_globalnamelist_mtgirs.yaml
NAMELIST ../../etc/global/varobs/MTGIRS.nl
DATA varobs_globalnamelist_mtgirs.nc4)
ADD_WRITER_TEST(NAME varobswriter_globalnamelist_sonde
YAML varobswriter_globalnamelist_sonde.yaml
NAMELIST ../../etc/global/varobs/Sonde.nl
Expand Down Expand Up @@ -665,6 +669,10 @@ ADD_WRITER_TEST(NAME cxwriter_globalnamelist_seviriclr
YAML cxwriter_globalnamelist_seviriclr.yaml
NAMELIST ../../etc/global/cx/SEVIRIClr.nl
DATA cx_globalnamelist_seviriclr.nc4 dummy.nc4)
ADD_WRITER_TEST(NAME cxwriter_globalnamelist_mtgirs
YAML cxwriter_globalnamelist_mtgirs.yaml
NAMELIST ../../etc/global/cx/MTGIRS.nl
DATA cx_globalnamelist_mtgirs.nc4 dummy.nc4)
ADD_WRITER_TEST(NAME cxwriter_globalnamelist_sonde
YAML cxwriter_globalnamelist_sonde.yaml
NAMELIST ../../etc/global/cx/Sonde.nl
Expand Down
20 changes: 20 additions & 0 deletions test/generate_unittest_netcdfs.py
Original file line number Diff line number Diff line change
Expand Up @@ -879,6 +879,18 @@ def copy_var_to_var(Group, invarname, outvarname, filename):
'ObsValue/cloud_amount', 'ObsValue/cloud_top_temperature', 'ObsValue/lower_layer_pressure'],
['MetaData/surfaceQualifier', 'MetaData/satelliteIdentifier'],
'testinput/varobs_ukvnamelist_seviriasr.nc4')

# MTG-IRS
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_mtgirs.nc4')

# Aircraft
output_full_varobs_to_netcdf(['MetaData/latitude',
Expand Down Expand Up @@ -1113,6 +1125,14 @@ def copy_var_to_var(Group, invarname, outvarname, filename):
'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_ukvnamelist_seviriasr.nc4')

# MTG-IRS
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_mtgirs.nc4')

# GroundGPS
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',
Expand Down
Binary file added test/testinput/cx_globalnamelist_mtgirs.nc4
Binary file not shown.
58 changes: 58 additions & 0 deletions test/testinput/cxwriter_globalnamelist_mtgirs.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
time window:
begin: 2018-01-01T00:00:00Z
end: 2018-01-01T01:00:00Z

observations:
- obs space:
name: MTGIRS
obsdatain:
engine:
type: H5File
obsfile: Data/varobs_globalnamelist_mtgirs.nc4
observed variables: [radiance]
simulated variables: [brightnessTemperature]
derived variables: [brightnessTemperature]
channels: &all_channels 1, 3
geovals:
filename: Data/cx_globalnamelist_mtgirs.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","77.10","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","77.30","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","77.40","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
Binary file added test/testinput/varobs_globalnamelist_mtgirs.nc4
Binary file not shown.
Loading