diff --git a/.gitmodules b/.gitmodules index 2a931e564..945b2d291 100644 --- a/.gitmodules +++ b/.gitmodules @@ -81,6 +81,10 @@ path = parm/jcb-algorithms url = https://github.com/noaa-emc/jcb-algorithms branch = develop +[submodule "sorc/da-utils"] + path = sorc/da-utils + url = https://github.com/noaa-emc/da-utils.git + branch = develop [submodule "sorc/bufr-query"] path = sorc/bufr-query url = https://github.com/noaa-emc/bufr-query.git diff --git a/bundle/CMakeLists.txt b/bundle/CMakeLists.txt index c7282f6c2..4f628faff 100644 --- a/bundle/CMakeLists.txt +++ b/bundle/CMakeLists.txt @@ -120,6 +120,7 @@ if(BUILD_GDASBUNDLE) # Build JEDI/DA or other peripherals ecbuild_bundle( PROJECT gdas-utils SOURCE "../utils" ) + ecbuild_bundle( PROJECT da-utils SOURCE "../sorc/da-utils" ) # Build IODA converters option(BUILD_IODA_CONVERTERS "Build IODA Converters" ON) diff --git a/parm/snow/obs/config/sfcsno_snow.yaml.j2 b/parm/snow/obs/config/sfcsno_snow.yaml.j2 new file mode 100644 index 000000000..443915b34 --- /dev/null +++ b/parm/snow/obs/config/sfcsno_snow.yaml.j2 @@ -0,0 +1,109 @@ +- obs space: + name: sfcsno_snow + distribution: + name: Halo + halo size: 250e3 + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}sfcsno_snow.nc4' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_sfcsno_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 pre filters: + - 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 + obs prior filters: + - filter: Bounds Check + filter variables: + - name: totalSnowDepth + minvalue: 0.0 + maxvalue: 2000.0 + action: + name: reject + - filter: Domain Check + where: + - variable: + name: MetaData/stationElevation + 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: BlackList + where: + - variable: + name: MetaData/stationIdentification + is_in: [71120,71397,71621,71727,71816] + size where true: 5 + obs post filters: + - filter: Background Check # gross error check + filter variables: + - name: totalSnowDepth + threshold: 6.25 + action: + name: reject + - filter: Temporal Thinning + min_spacing: '{{ SNOW_WINDOW_LENGTH }}' + seed_time: '{{ current_cycle | to_isotime }}' + category_variable: + name: MetaData/stationIdentification + - 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 diff --git a/parm/snow/obs/lists/gdas_snow.yaml.j2 b/parm/snow/obs/lists/gdas_snow.yaml.j2 index d74b0f653..0bbeb0e72 100644 --- a/parm/snow/obs/lists/gdas_snow.yaml.j2 +++ b/parm/snow/obs/lists/gdas_snow.yaml.j2 @@ -1,6 +1,6 @@ observers: {% filter indent(width=2) %} -{% include 'snow/obs/config/adpsfc_snow.yaml.j2' %} +{% include 'snow/obs/config/sfcsno_snow.yaml.j2' %} {% include 'snow/obs/config/snocvr_snow.yaml.j2' %} {% set cycle = current_cycle | strftime("t%Hz") %} {% if cycle in ['t00z'] %} diff --git a/parm/snow/prep/prep_gts.yaml.j2 b/parm/snow/prep/prep_gts.yaml.j2 index a5e4915a3..f91bb21e0 100644 --- a/parm/snow/prep/prep_gts.yaml.j2 +++ b/parm/snow/prep/prep_gts.yaml.j2 @@ -2,9 +2,9 @@ gtsbufr: mkdir: - '{{ DATA }}/obs' copy: - - ['{{ COM_OBS }}/{{ OPREFIX }}adpsfc.tm00.bufr_d', '{{ DATA }}/obs/'] + - ['{{ COM_OBS }}/{{ OPREFIX }}sfcsno.tm00.bufr_d', '{{ DATA }}/obs/'] gtsioda: copy: - - ['{{ DATA }}/{{ OPREFIX }}adpsfc_snow.nc4', '{{ COM_OBS }}/{{ OPREFIX }}adpsfc_snow.nc4'] + - ['{{ DATA }}/{{ OPREFIX }}sfcsno_snow.nc4', '{{ COM_OBS }}/{{ OPREFIX }}sfcsno_snow.nc4'] bufr2ioda: - adpsfc: '{{ HOMEgfs }}/sorc/gdas.cd/test/testinput/bufr_adpsfc_snow.yaml' + sfcsno: '{{ HOMEgfs }}/sorc/gdas.cd/test/testinput/bufr_sfcsno_snow.yaml' diff --git a/sorc/da-utils b/sorc/da-utils new file mode 160000 index 000000000..7e8a55664 --- /dev/null +++ b/sorc/da-utils @@ -0,0 +1 @@ +Subproject commit 7e8a556647ccfde0988817c6794f55fc2ab85ec0 diff --git a/test/testinput/bufr_sfcsno_snow.yaml b/test/testinput/bufr_sfcsno_snow.yaml new file mode 100644 index 000000000..b1d663ae8 --- /dev/null +++ b/test/testinput/bufr_sfcsno_snow.yaml @@ -0,0 +1,83 @@ +# (C) Copyright 2021-2022 NOAA/NWS/NCEP/EMC +# + +observations: + - obs space: + name: bufr + + obsdatain: '{{ DATA }}/obs/{{ OPREFIX }}sfcsno.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: "*/RPID" + + stationElevation: + query: "[*/SELV, */HSMSL]" + + # ObsValue + totalSnowDepth: + query: "[*/SNWSQ1/TOSD, */MTRMSC/TOSD, */STGDSNDM/TOSD]" + transforms: + - scale: 1000.0 + filters: + - bounding: + variable: totalSnowDepth + upperBound: 10000000 + + ioda: + backend: netcdf + obsdataout: '{{ DATA }}/{{ OPREFIX }}sfcsno_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/stationElevation" + coordinates: "longitude latitude" + source: variables/stationElevation + 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"