From 2ed98b2683def521acb8d5f163c687c17325d4c1 Mon Sep 17 00:00:00 2001 From: Jiarui Dong Date: Tue, 12 Sep 2023 16:49:43 -0400 Subject: [PATCH] Add the capability to assimilate the MADIS snow depth for global-workflow (#602) * Initialize the madis snow DA in GDASApp for Global-Workflow. * Add temporal thinning filter for madis data * Update the temporal thinning filter. * Change '$(' to '{{' as suggested. * Made changes from $() to {{ }} --- parm/land/obs/config/snocvr_snow.yaml | 102 +++++++++++++++++++ parm/land/obs/lists/gdas_land_gts_only.yaml | 3 + parm/land/obs/lists/gdas_land_prototype.yaml | 1 + parm/land/prep/prep_gts.yaml | 10 +- test/testinput/bufr_adpsfc_snow.yaml | 6 +- test/testinput/bufr_snocvr_snow.yaml | 83 +++++++++++++++ 6 files changed, 198 insertions(+), 7 deletions(-) create mode 100644 parm/land/obs/config/snocvr_snow.yaml create mode 100644 parm/land/obs/lists/gdas_land_gts_only.yaml create mode 100644 test/testinput/bufr_snocvr_snow.yaml diff --git a/parm/land/obs/config/snocvr_snow.yaml b/parm/land/obs/config/snocvr_snow.yaml new file mode 100644 index 000000000..3dade008b --- /dev/null +++ b/parm/land/obs/config/snocvr_snow.yaml @@ -0,0 +1,102 @@ +obs space: + name: snocvr_snow + distribution: + name: Halo + halo size: 250e3 + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}snocvr_snow.nc4' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_snocvr_snow.nc4' + simulated variables: [totalSnowDepth] +obs operator: + name: Composite + components: + - name: Identity + - name: BackgroundErrorIdentity +obs error: + covariance model: diagonal +obs localizations: + - localization method: Horizontal SOAR + lengthscale: 250e3 + soar horizontal decay: 0.000021 + max nobs: 50 + - localization method: Vertical Brasnett + vertical lengthscale: 700 +obs filters: + - filter: Bounds Check + filter variables: + - name: totalSnowDepth + minvalue: 0.0 + maxvalue: 2000.0 + action: + name: reject + - filter: Domain Check + where: + - variable: + name: MetaData/height + minvalue: -999.0 + - filter: Domain Check # land only + where: + - variable: + name: GeoVaLs/slmsk + minvalue: 0.5 + maxvalue: 1.5 + - filter: RejectList # no land-ice + where: + - variable: + name: GeoVaLs/vtype + minvalue: 14.5 + maxvalue: 15.5 + - filter: Temporal Thinning + min_spacing: '{{ LAND_WINDOW_LENGTH }}' + seed_time: '{{ current_cycle | to_isotime }}' + category_variable: + name: MetaData/stationIdentification + - filter: Background Check # gross error check + filter variables: + - name: totalSnowDepth + threshold: 6.25 + action: + name: reject + - filter: Met Office Buddy Check + filter variables: + - name: totalSnowDepth + rejection_threshold: 0.5 + traced_boxes: # trace all observations + min_latitude: -90 + max_latitude: 90 + min_longitude: -180 + max_longitude: 180 + search_radius: 150 # km + station_id_variable: + name: MetaData/stationIdentification + num_zonal_bands: 24 + sort_by_pressure: false + max_total_num_buddies: 15 + max_num_buddies_from_single_band: 10 + max_num_buddies_with_same_station_id: 5 + use_legacy_buddy_collector: false + horizontal_correlation_scale: { "-90": 150, "90": 150 } + temporal_correlation_scale: PT6H + damping_factor_1: 1.0 + damping_factor_2: 1.0 + background_error_group: BkgError + - filter: Perform Action + filter variables: + - name: totalSnowDepth + action: + name: assign error + error parameter: 40.0 + - filter: Variable Assignment + assignments: + - name: GrossErrorProbability/totalSnowDepth + type: float + value: 0.02 + - name: BkgError/totalSnowDepth_background_error + type: float + value: 30.0 + diff --git a/parm/land/obs/lists/gdas_land_gts_only.yaml b/parm/land/obs/lists/gdas_land_gts_only.yaml new file mode 100644 index 000000000..00c7edef9 --- /dev/null +++ b/parm/land/obs/lists/gdas_land_gts_only.yaml @@ -0,0 +1,3 @@ +observers: +- !INC ${OBS_YAML_DIR}/adpsfc_snow.yaml +- !INC ${OBS_YAML_DIR}/snocvr_snow.yaml diff --git a/parm/land/obs/lists/gdas_land_prototype.yaml b/parm/land/obs/lists/gdas_land_prototype.yaml index cf8e11172..d9d4deb3b 100644 --- a/parm/land/obs/lists/gdas_land_prototype.yaml +++ b/parm/land/obs/lists/gdas_land_prototype.yaml @@ -1,3 +1,4 @@ observers: - !INC ${OBS_YAML_DIR}/adpsfc_snow.yaml +- !INC ${OBS_YAML_DIR}/snocvr_snow.yaml - !INC ${OBS_YAML_DIR}/ims_snow.yaml diff --git a/parm/land/prep/prep_gts.yaml b/parm/land/prep/prep_gts.yaml index 7fc552aef..0f138e8e2 100644 --- a/parm/land/prep/prep_gts.yaml +++ b/parm/land/prep/prep_gts.yaml @@ -2,8 +2,12 @@ gtsbufr: mkdir: - $(DATA)/obs copy: - - [$(COM_OBS)/$(OPREFIX)adpsfc.tm00.bufr_d, $(DATA)/obs/] + - [{{ COM_OBS }}/{{ OPREFIX }}adpsfc.tm00.bufr_d, {{ DATA }}/obs/] + - [{{ COM_OBS }}/{{ OPREFIX }}snocvr.tm00.bufr_d, {{ DATA }}/obs/] gtsioda: copy: - - [$(DATA)/$(OPREFIX)adpsfc_snow.nc4, $(COM_OBS)/$(OPREFIX)adpsfc_snow.nc4] - + - [{{ DATA }}/{{ OPREFIX }}adpsfc_snow.nc4, {{ COM_OBS }}/{{ OPREFIX }}adpsfc_snow.nc4] + - [{{ DATA }}/{{ OPREFIX }}snocvr_snow.nc4, {{ COM_OBS }}/{{ OPREFIX }}snocvr_snow.nc4] +bufr2ioda: + adpsfc: {{ HOMEgfs }}/sorc/gdas.cd/test/testinput/bufr_adpsfc_snow.yaml + snocvr: {{ HOMEgfs }}/sorc/gdas.cd/test/testinput/bufr_snocvr_snow.yaml diff --git a/test/testinput/bufr_adpsfc_snow.yaml b/test/testinput/bufr_adpsfc_snow.yaml index acaeb455b..250e0fd62 100644 --- a/test/testinput/bufr_adpsfc_snow.yaml +++ b/test/testinput/bufr_adpsfc_snow.yaml @@ -1,13 +1,11 @@ # (C) Copyright 2021-2022 NOAA/NWS/NCEP/EMC # -# This software is licensed under the terms of the Apache Licence Version 2.0 -# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. observations: - obs space: name: bufr - obsdatain: $(DATA)/obs/$(OPREFIX)adpsfc.tm00.bufr_d + obsdatain: '{{ DATA }}/obs/{{ OPREFIX }}adpsfc.tm00.bufr_d' exports: variables: @@ -41,7 +39,7 @@ observations: ioda: backend: netcdf - obsdataout: $(DATA)/$(OPREFIX)adpsfc_snow.nc4 + obsdataout: '{{ DATA }}/{{ OPREFIX }}adpsfc_snow.nc4' variables: diff --git a/test/testinput/bufr_snocvr_snow.yaml b/test/testinput/bufr_snocvr_snow.yaml new file mode 100644 index 000000000..5c2c803e2 --- /dev/null +++ b/test/testinput/bufr_snocvr_snow.yaml @@ -0,0 +1,83 @@ +# (C) Copyright 2021-2022 NOAA/NWS/NCEP/EMC +# + +observations: + - obs space: + name: bufr + + obsdatain: '{{ DATA }}/obs/{{ OPREFIX }}snocvr.tm00.bufr_d' + + exports: + variables: + # MetaData + timestamp: + datetime: + year: "*/YEAR[1]" + month: "*/MNTH[1]" + day: "*/DAYS[1]" + hour: "*/HOUR[1]" + minute: "*/MINU[1]" + latitude: + query: "[*/CLAT, */CLATH]" + longitude: + query: "[*/CLON, */CLONH]" + stationIdentification: + query: "*/WGOSLID" + + height: + query: "[*/SELV, */HSMSL]" + + # ObsValue + totalSnowDepth: + query: "*/TOSD" + transforms: + - scale: 1000.0 + filters: + - bounding: + variable: totalSnowDepth + upperBound: 10000000 + + ioda: + backend: netcdf + obsdataout: '{{ DATA }}/{{ OPREFIX }}snocvr_snow.nc4' + + variables: + + # MetaData + - name: "MetaData/dateTime" + coordinates: "longitude latitude" + source: variables/timestamp + longName: "Datetime" + units: "seconds since 1970-01-01T00:00:00Z" + + - name: "MetaData/latitude" + coordinates: "longitude latitude" + source: variables/latitude + longName: "Latitude" + units: "degree_north" + range: [-90, 90] + + - name: "MetaData/longitude" + coordinates: "longitude latitude" + source: variables/longitude + longName: "Longitude" + units: "degree_east" + range: [-180, 180] + + - name: "MetaData/height" + coordinates: "longitude latitude" + source: variables/height + longName: "Height of Station" + + - name: "MetaData/stationIdentification" + coordinates: "longitude latitude" + source: variables/stationIdentification + longName: "Identification of Observing Location" + units: "m" + + # ObsValue + - name: "ObsValue/totalSnowDepth" + coordinates: "longitude latitude" + source: variables/totalSnowDepth + longName: "Total Snow Depth" + units: "mm"