From 517ceb554eea075ddaf8d8d8abedb5566d13bd94 Mon Sep 17 00:00:00 2001 From: spanNOAA <142531472+spanNOAA@users.noreply.github.com> Date: Thu, 5 Dec 2024 14:19:58 -0700 Subject: [PATCH] Add 187/287 METAR config templates (#218) Finalize yamls for 187/287 metar observations with reasonable results. See issue #46 for details. --- .../adpsfc_airTemperature_187.yaml | 214 ++++++++++++++++ .../adpsfc_specificHumidity_187.yaml | 215 ++++++++++++++++ .../adpsfc_stationPressure_187.yaml | 208 ++++++++++++++++ .../obtype_config/adpsfc_winds_287.yaml | 234 ++++++++++++++++++ 4 files changed, 871 insertions(+) create mode 100644 rrfs-test/validated_yamls/templates/obtype_config/adpsfc_airTemperature_187.yaml create mode 100644 rrfs-test/validated_yamls/templates/obtype_config/adpsfc_specificHumidity_187.yaml create mode 100644 rrfs-test/validated_yamls/templates/obtype_config/adpsfc_stationPressure_187.yaml create mode 100644 rrfs-test/validated_yamls/templates/obtype_config/adpsfc_winds_287.yaml diff --git a/rrfs-test/validated_yamls/templates/obtype_config/adpsfc_airTemperature_187.yaml b/rrfs-test/validated_yamls/templates/obtype_config/adpsfc_airTemperature_187.yaml new file mode 100644 index 0000000..f2f370f --- /dev/null +++ b/rrfs-test/validated_yamls/templates/obtype_config/adpsfc_airTemperature_187.yaml @@ -0,0 +1,214 @@ + - obs space: + name: adpsfc_airTemperature_187 + distribution: + name: "@DISTRIBUTION@" + halo size: 100e3 + obsdatain: + engine: + type: H5File + obsfile: "@OBSFILE@" + obsdataout: + engine: + type: H5File + obsfile: hofx_adpsfc_airTemperature_187.nc4 + allow overwrite: true + io pool: + max pool size: 1 + observed variables: [airTemperature] + simulated variables: [airTemperature] + + obs operator: + name: Composite + components: + - name: VertInterp + vertical coordinate: air_pressure + observation vertical coordinate: pressure + observation vertical coordinate group: MetaData + interpolation method: log-linear + variables: + - name: airTemperature + + obs error: + covariance model: diagonal + + obs localizations: + - localization method: Horizontal Gaspari-Cohn + lengthscale: 300e3 # orig + + obs filters: + # ------------------ + # airTemperature (187) + # ------------------ + # Reject all observations with QualityMarker > 3 + - filter: RejectList + apply at iterations: 0,1 + where: + - variable: ObsType/airTemperature + is_in: 187 + - variable: QualityMarker/airTemperature + is_in: 4-15 + + # Time window filter + - filter: Domain Check + apply at iterations: 0,1 + where: + - variable: + name: MetaData/timeOffset + minvalue: -900 + maxvalue: 900 + + # Online domain check + - filter: Bounds Check + filter variables: + - name: airTemperature + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + filter variables: + - name: airTemperature + where: + - variable: ObsType/airTemperature + is_in: 187 + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + xvar: + name: MetaData/pressure + xvals: [110000, 105000, 100000, 95000, 90000, 85000, 80000, 75000, 70000, 65000, 60000, 55000, 50000, 45000, 40000, 35000, 30000, 25000, 20000, 15000, 10000, 7500, 5000, 4000, 3000, 2000, 1000, 500, 400, 300, 200, 100, 0] + errors: [2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585] + + # Error inflation based on pressure check (setupt.f90) + - filter: Perform Action + filter variables: + - name: airTemperature + where: + - variable: ObsType/airTemperature + is_in: 187 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: airTemperature + inflation factor: 8.0 + # The new feature "surface observation error ramp" + # needs to be added to UFO to align with the ramp + # options for temperature and humidity in GSI. + #surface observation error ramp: true + + # Bounds Check + - filter: Bounds Check + apply at iterations: 0,1 + filter variables: + - name: airTemperature + minvalue: 100 + maxvalue: 400 + + # Create temporary ObsErrorData + - filter: Variable Assignment + apply at iterations: 0,1 + assignments: + - name: TempObsErrorData/airTemperature + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/airTemperature + defer to post: true + + # Set ObsError set "error parameter" if < "max value" + - filter: Perform Action + apply at iterations: 0,1 + filter variables: + - name: airTemperature + action: + name: assign error + error parameter: 1.0 + where: + - variable: + name: ObsErrorData/airTemperature + maxvalue: 1.0 + - variable: + name: ObsErrorData/airTemperature + value: is_valid + defer to post: true + + # Set ObsError set "error parameter" if > "min value" + - filter: Perform Action + apply at iterations: 0,1 + filter variables: + - name: airTemperature + action: + name: assign error + error parameter: 3.0 + where: + - variable: + name: ObsErrorData/airTemperature + minvalue: 3.0 + - variable: + name: ObsErrorData/airTemperature + value: is_valid + defer to post: true + + # Gross Error Check + - filter: Background Check + apply at iterations: 0,1 + filter variables: + - name: airTemperature + threshold: 5.0 + where: + - variable: ObsType/airTemperature + is_in: 187 + - variable: QualityMarker/airTemperature + is_not_in: 3 + action: + name: reject + defer to post: true + + # Gross Error Check: cgross*0.7 if QualityMarker=3 + - filter: Background Check + apply at iterations: 0,1 + filter variables: + - name: airTemperature + threshold: 3.5 + where: + - variable: ObsType/airTemperature + is_in: 187 + - variable: QualityMarker/airTemperature + is_in: 3 + action: + name: reject + defer to post: true + + # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. + - filter: Perform Action + apply at iterations: 0,1 + filter variables: + - name: airTemperature + action: + name: assign error + error function: TempObsErrorData/airTemperature + where: + - variable: + name: TempObsErrorData/airTemperature + value: is_valid + defer to post: true + + # Duplicate Check + - filter: Temporal Thinning + apply at iterations: 0,1 + min_spacing: PT30M + seed_time: *analysisDate + category_variable: + name: MetaData/stationIdentification + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/msonet_geovals_rrfs.nc4 diff --git a/rrfs-test/validated_yamls/templates/obtype_config/adpsfc_specificHumidity_187.yaml b/rrfs-test/validated_yamls/templates/obtype_config/adpsfc_specificHumidity_187.yaml new file mode 100644 index 0000000..ff8ae19 --- /dev/null +++ b/rrfs-test/validated_yamls/templates/obtype_config/adpsfc_specificHumidity_187.yaml @@ -0,0 +1,215 @@ + - obs space: + name: adpsfc_specificHumidity_187 + distribution: + name: "@DISTRIBUTION@" + halo size: 100e3 + obsdatain: + engine: + type: H5File + obsfile: "@OBSFILE@" + obsdataout: + engine: + type: H5File + obsfile: hofx_adpsfc_specificHumidity_187.nc4 + allow overwrite: true + io pool: + max pool size: 1 + observed variables: [specificHumidity] + simulated variables: [specificHumidity] + + obs operator: + name: Composite + components: + - name: VertInterp + vertical coordinate: air_pressure + observation vertical coordinate: pressure + observation vertical coordinate group: MetaData + interpolation method: log-linear + variables: + - name: specificHumidity + + obs error: + covariance model: diagonal + + obs localizations: + - localization method: Horizontal Gaspari-Cohn + lengthscale: 300e3 # orig + + obs filters: + # ------------------ + # specificHumidity (187) + # ------------------ + # Reject all observations with QualityMarker > 3 + - filter: RejectList + apply at iterations: 0,1 + where: + - variable: ObsType/specificHumidity + is_in: 187 + - variable: QualityMarker/specificHumidity + is_in: 4-15 + + # Time window filter + - filter: Domain Check + apply at iterations: 0,1 + where: + - variable: + name: MetaData/timeOffset + minvalue: -900 + maxvalue: 900 + + # Online domain check + - filter: Bounds Check + filter variables: + - name: specificHumidity + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + filter variables: + - name: specificHumidity + where: + - variable: ObsType/specificHumidity + is_in: 187 + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + xvar: + name: MetaData/pressure + xvals: [110000, 105000, 100000, 95000, 90000, 85000, 80000, 75000, 70000, 65000, 60000, 55000, 50000, 45000, 40000, 35000, 30000, 25000, 20000, 15000, 10000, 7500, 5000, 4000, 3000, 2000, 1000, 500, 400, 300, 200, 100, 0] + errors: [0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912] + + # Error inflation based on pressure check (setupq.f90) + - filter: Perform Action + filter variables: + - name: specificHumidity + where: + - variable: ObsType/specificHumidity + is_in: 187 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: specificHumidity + inflation factor: 8.0 + request_saturation_specific_humidity_geovals: true + # The new feature "surface observation error ramp" + # needs to be added to UFO to align with the ramp + # options for temperature and humidity in GSI. + #surface observation error ramp: true + + # Bounds Check + - filter: Bounds Check + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + minvalue: 0.0 + maxvalue: 1.0 + + # Create temporary ObsErrorData + - filter: Variable Assignment + apply at iterations: 0,1 + assignments: + - name: TempObsErrorData/specificHumidity + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/specificHumidity + defer to post: true + + # Set ObsError set "error parameter" if < "max value" + - filter: Perform Action + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + action: + name: assign error + error parameter: 5.0 + where: + - variable: + name: ObsErrorData/specificHumidity + maxvalue: 5.0 + - variable: + name: ObsErrorData/specificHumidity + value: is_valid + defer to post: true + + # Set ObsError set "error parameter" if > "min value" + - filter: Perform Action + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + action: + name: assign error + error parameter: 50.0 + where: + - variable: + name: ObsErrorData/specificHumidity + minvalue: 50.0 + - variable: + name: ObsErrorData/specificHumidity + value: is_valid + defer to post: true + + # Gross Error Check + - filter: Background Check + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + threshold: 7.0 + where: + - variable: ObsType/specificHumidity + is_in: 187 + - variable: QualityMarker/specificHumidity + is_not_in: 3 + action: + name: reject + defer to post: true + + # Gross Error Check: cgross*0.7 if QualityMarker=3 + - filter: Background Check + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + threshold: 4.9 + where: + - variable: ObsType/specificHumidity + is_in: 187 + - variable: QualityMarker/specificHumidity + is_in: 3 + action: + name: reject + defer to post: true + + # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. + - filter: Perform Action + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + action: + name: assign error + error function: TempObsErrorData/specificHumidity + where: + - variable: + name: TempObsErrorData/specificHumidity + value: is_valid + defer to post: true + + # Duplicate Check + - filter: Temporal Thinning + apply at iterations: 0,1 + min_spacing: PT30M + seed_time: *analysisDate + category_variable: + name: MetaData/stationIdentification + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/msonet_geovals_rrfs.nc4 diff --git a/rrfs-test/validated_yamls/templates/obtype_config/adpsfc_stationPressure_187.yaml b/rrfs-test/validated_yamls/templates/obtype_config/adpsfc_stationPressure_187.yaml new file mode 100644 index 0000000..577c107 --- /dev/null +++ b/rrfs-test/validated_yamls/templates/obtype_config/adpsfc_stationPressure_187.yaml @@ -0,0 +1,208 @@ + - obs space: + name: adpsfc_stationPressure_187 + distribution: + name: "@DISTRIBUTION@" + halo size: 100e3 + obsdatain: + engine: + type: H5File + obsfile: "@OBSFILE@" + obsdataout: + engine: + type: H5File + obsfile: hofx_adpsfc_stationPressure_187.nc4 + allow overwrite: true + io pool: + max pool size: 1 + observed variables: [stationPressure] + simulated variables: [stationPressure] + + obs operator: + name: SfcPCorrected + da_psfc_scheme: GSI + geovar_sfc_geomz: geopotential_height_at_surface + geovar_geomz: geopotential_height + linear obs operator: + name: Identity + + obs error: + covariance model: diagonal + + obs localizations: + - localization method: Horizontal Gaspari-Cohn + lengthscale: 300e3 # orig + + obs filters: + # ------------------ + # stationPressure (187) + # ------------------ + # Reject all observations with QualityMarker > 3 + - filter: RejectList + apply at iterations: 0,1 + where: + - variable: ObsType/stationPressure + is_in: 187 + - variable: QualityMarker/stationPressure + is_in: 4-15 + + # Time window filter + - filter: Domain Check + apply at iterations: 0,1 + where: + - variable: + name: MetaData/timeOffset + minvalue: -900 + maxvalue: 900 + + # Online domain check + - filter: Bounds Check + filter variables: + - name: stationPressure + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + filter variables: + - name: stationPressure + where: + - variable: ObsType/stationPressure + is_in: 187 + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + xvar: + name: MetaData/pressure + xvals: [110000, 105000, 100000, 95000, 90000, 85000, 80000, 75000, 70000, 65000, 60000, 55000, 50000, 45000, 40000, 35000, 30000, 25000, 20000, 15000, 10000, 7500, 5000, 4000, 3000, 2000, 1000, 500, 400, 300, 200, 100, 0] + errors: [53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 1E9, 1E9, 1E9, 1E9, 1E9, 1E9, 1E9, 1E9, 1E9, 1E9, 1E9, 1E9, 1E9, 1E9, 1E9, 1E9, 1E9, 1E9, 1E9] + + # Error inflation based on setupps.f90 + - filter: Perform Action + filter variables: + - name: stationPressure + where: + - variable: ObsType/stationPressure + is_in: 187 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorSfcPressure + options: + geovar_geomz: geopotential_height + #geovar_sfc_geomz: geopotential_height_at_surface + station_altitude: height + + # Bounds Check + - filter: Bounds Check + apply at iterations: 0,1 + filter variables: + - name: stationPressure + minvalue: 20000.0 + maxvalue: 120000.0 + + # Create temporary ObsErrorData + - filter: Variable Assignment + apply at iterations: 0,1 + assignments: + - name: TempObsErrorData/stationPressure + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/stationPressure + defer to post: true + + # Set ObsError set "error parameter" if < "max value" + - filter: Perform Action + apply at iterations: 0,1 + filter variables: + - name: stationPressure + action: + name: assign error + error parameter: 100.0 + where: + - variable: + name: ObsErrorData/stationPressure + maxvalue: 100.0 + - variable: + name: ObsErrorData/stationPressure + value: is_valid + defer to post: true + + # Set ObsError set "error parameter" if > "min value" + - filter: Perform Action + apply at iterations: 0,1 + filter variables: + - name: stationPressure + action: + name: assign error + error parameter: 300.0 + where: + - variable: + name: ObsErrorData/stationPressure + minvalue: 300.0 + - variable: + name: ObsErrorData/stationPressure + value: is_valid + defer to post: true + + # Gross Error Check + - filter: Background Check + apply at iterations: 0,1 + filter variables: + - name: stationPressure + threshold: 5.0 + where: + - variable: ObsType/stationPressure + is_in: 187 + - variable: QualityMarker/stationPressure + is_not_in: 3 + action: + name: reject + defer to post: true + + # Gross Error Check: cgross*0.7 if QualityMarker=3 + - filter: Background Check + apply at iterations: 0,1 + filter variables: + - name: stationPressure + threshold: 3.5 + where: + - variable: ObsType/stationPressure + is_in: 187 + - variable: QualityMarker/stationPressure + is_in: 3 + action: + name: reject + defer to post: true + + # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. + - filter: Perform Action + apply at iterations: 0,1 + filter variables: + - name: stationPressure + action: + name: assign error + error function: TempObsErrorData/stationPressure + where: + - variable: + name: TempObsErrorData/stationPressure + value: is_valid + defer to post: true + + # Duplicate Check + - filter: Temporal Thinning + apply at iterations: 0,1 + min_spacing: PT00M + seed_time: *analysisDate + category_variable: + name: MetaData/stationIdentification + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/msonet_geovals_rrfs.nc4 diff --git a/rrfs-test/validated_yamls/templates/obtype_config/adpsfc_winds_287.yaml b/rrfs-test/validated_yamls/templates/obtype_config/adpsfc_winds_287.yaml new file mode 100644 index 0000000..1512886 --- /dev/null +++ b/rrfs-test/validated_yamls/templates/obtype_config/adpsfc_winds_287.yaml @@ -0,0 +1,234 @@ + - obs space: + name: adpsfc_winds_287 + distribution: + name: "@DISTRIBUTION@" + halo size: 100e3 + obsdatain: + engine: + type: H5File + obsfile: "@OBSFILE@" + obsdataout: + engine: + type: H5File + obsfile: hofx_adpsfc_winds_287.nc4 + allow overwrite: true + io pool: + max pool size: 1 + observed variables: [windEastward, windNorthward] + simulated variables: [windEastward, windNorthward] + + obs operator: + name: Composite + components: + - name: VertInterp + hofx_scaling: true + hofx scaling field: wind_reduction_factor_at_10m + hofx scaling field group: GeoVaLs + vertical coordinate: air_pressure + observation vertical coordinate: pressure + observation vertical coordinate group: MetaData + interpolation method: log-linear + variables: + - name: windEastward + - name: windNorthward + + linear obs operator: + name: Identity + + obs error: + covariance model: diagonal + + obs localizations: + - localization method: Horizontal Gaspari-Cohn + lengthscale: 300e3 # orig + + obs filters: + # ------------------ + # wind (287) + # ------------------ + # Reject all observations with QualityMarker > 3 + - filter: RejectList + apply at iterations: 0,1 + where: + - variable: ObsType/windEastward + is_not_in: 287 + - filter: RejectList + where: + - variable: QualityMarker/windEastward + is_in: 4-15 + + # Time window filter + - filter: Domain Check + apply at iterations: 0,1 + where: + - variable: + name: MetaData/timeOffset + minvalue: -900 + maxvalue: 900 + + # Online domain check + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 287 + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + xvar: + name: MetaData/pressure + xvals: [110000, 105000, 100000, 95000, 90000, 85000, 80000, 75000, 70000, 65000, 60000, 55000, 50000, 45000, 40000, 35000, 30000, 25000, 20000, 15000, 10000, 7500, 5000, 4000, 3000, 2000, 1000, 500, 400, 300, 200, 100, 0] + errors: [1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874] + + # Error inflation (windEastward) based on pressure check (setupw.f90) + - filter: Perform Action + filter variables: + - name: windEastward + where: + - variable: ObsType/windEastward + is_in: 287 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windEastward + inflation factor: 4.0 + SetSfcWndObsHeight: true + AddObsHeightToStationElevation: true + AssumedSfcWndObsHeight: 10 + + # Error inflation (windNorthward) based on pressure check (setupw.f90) + - filter: Perform Action + filter variables: + - name: windNorthward + where: + - variable: ObsType/windNorthward + is_in: 287 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windNorthward + inflation factor: 4.0 + SetSfcWndObsHeight: true + AddObsHeightToStationElevation: true + AssumedSfcWndObsHeight: 10 + + # Bounds Check + - filter: Bounds Check + apply at iterations: 0,1 + filter variables: + - name: windEastward + - name: windNorthward + minvalue: -130 + maxvalue: 130 + action: + name: reject + + # Gross Error Check (windEastward) + - filter: Background Check + apply at iterations: 0,1 + filter variables: + - name: windEastward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 287 ] + cgross: [ 5.0 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windEastward + where: + - variable: QualityMarker/windEastward + is_not_in: 3 + action: + name: reject + defer to post: true + + # Gross Error Check (windNorthward) + - filter: Background Check + apply at iterations: 0,1 + filter variables: + - name: windNorthward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 287 ] + cgross: [ 5.0 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windNorthward + where: + - variable: QualityMarker/windNorthward + is_not_in: 3 + action: + name: reject + defer to post: true + + # Gross Error Check (windEastward): cgross*0.7 if QualityMarker=3 + - filter: Background Check + apply at iterations: 0,1 + filter variables: + - name: windEastward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 287 ] + cgross: [ 3.5 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windEastward + where: + - variable: QualityMarker/windEastward + is_in: 3 + action: + name: reject + defer to post: true + + # Gross Error Check (windNorthward): cgross*0.7 if QualityMarker=3 + - filter: Background Check + apply at iterations: 0,1 + filter variables: + - name: windNorthward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 287 ] + cgross: [ 3.5 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windNorthward + where: + - variable: QualityMarker/windNorthward + is_in: 3 + action: + name: reject + defer to post: true + + # Duplicate Check + - filter: Temporal Thinning + apply at iterations: 0,1 + min_spacing: PT30M + seed_time: *analysisDate + category_variable: + name: MetaData/stationIdentification + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/msonet_geovals_rrfs.nc4