From 4297dc6be6a9179eddb7d6ac591e77e2664c78e6 Mon Sep 17 00:00:00 2001 From: Brett Hoover Date: Mon, 26 Aug 2024 16:48:08 -0500 Subject: [PATCH] yaml.j2 files updated for satwind thinning of AHI and SEVIRI, added yaml.j2 files for AHI_H9, SEVIRI_M9, SEVIRI_M10 --- observations/atmosphere/satwnd.ahi_h8.yaml.j2 | 16 + observations/atmosphere/satwnd.ahi_h9.yaml.j2 | 448 +++++++++++++++++ .../atmosphere/satwnd.seviri_m10.yaml.j2 | 459 +++++++++++++++++ .../atmosphere/satwnd.seviri_m11.yaml.j2 | 20 + .../atmosphere/satwnd.seviri_m8.yaml.j2 | 25 + .../atmosphere/satwnd.seviri_m9.yaml.j2 | 464 ++++++++++++++++++ 6 files changed, 1432 insertions(+) create mode 100644 observations/atmosphere/satwnd.ahi_h9.yaml.j2 create mode 100644 observations/atmosphere/satwnd.seviri_m10.yaml.j2 create mode 100644 observations/atmosphere/satwnd.seviri_m9.yaml.j2 diff --git a/observations/atmosphere/satwnd.ahi_h8.yaml.j2 b/observations/atmosphere/satwnd.ahi_h8.yaml.j2 index 0aac154..5389570 100644 --- a/observations/atmosphere/satwnd.ahi_h8.yaml.j2 +++ b/observations/atmosphere/satwnd.ahi_h8.yaml.j2 @@ -222,6 +222,22 @@ action: name: reject + # THINNING: Himawari winds are not prioritized + - filter: Gaussian Thinning + horizontal_mesh: 100 + vertical_mesh: 10000 + where: + - variable: + name: MetaData/pressure + minvalue: 50001. + - filter: Gaussian Thinning + horizontal_mesh: 90 + vertical_mesh: 10000 + where: + - variable: + name: MetaData/pressure + maxvalue: 50000. + # GSI setupw routine QC # Reject any ob Type [240–260] when pressure greater than 950 mb. # CLEARED: minvalue/maxvalue are >=/<=, not >/<, so editing range by 1 Pa diff --git a/observations/atmosphere/satwnd.ahi_h9.yaml.j2 b/observations/atmosphere/satwnd.ahi_h9.yaml.j2 new file mode 100644 index 0000000..f69f130 --- /dev/null +++ b/observations/atmosphere/satwnd.ahi_h9.yaml.j2 @@ -0,0 +1,448 @@ +- + + # Observation Space (I/O) + # ----------------------- + obs space: + name: satwind_ahi_h9 + obsdatain: + engine: + type: H5File + obsfile: "{{atmosphere_obsdatain_path}}/{{atmosphere_obsdatain_prefix}}{{observation_from_jcb}}{{atmosphere_obsdatain_suffix}}" + obsdataout: + engine: + type: H5File + obsfile: "{{atmosphere_obsdataout_path}}/{{atmosphere_obsdataout_prefix}}{{observation_from_jcb}}{{atmosphere_obsdataout_suffix}}" + io pool: + max pool size: 1 + simulated variables: [windEastward, windNorthward] + + # Observation Operator + # -------------------- + obs operator: + name: VertInterp + hofx scaling field: SurfaceWindScalingPressure + hofx scaling field group: DerivedVariables + + # Linear Observation Operator + # --------------------------- + linear obs operator: + name: VertInterp + + # NOTE: Tests using the Gaussian Thinning filter (below) to duplicate GSI"s thinning of AHI/Himawari-8 satwinds + # results in more JEDI satwinds in the diag file than in GSI, but far fewer JEDI satwinds assimilated than + # GSI. JEDI under-counts assimilated winds by roughly 25-40%, relative to GSI, and this under-count is not + # even including the temporal thinning which is applied in GSI but not JEDI (by this filter below). See + # GDASApp Issue #741 for details: https://github.com/NOAA-EMC/GDASApp/issues/741 + #obs pre filters: + #- filter: Gaussian Thinning + # horizontal_mesh: 200 + # vertical_mesh: 10000 + # use_reduced_horizontal_grid: true + # round_horizontal_bin_count_to_nearest: true + # partition_longitude_bins_using_mesh: true + + # Observation Prior Filters (QC) + # ------------------------------ + obs prior filters: + # Apply variable changes needed for wind scaling + # For wind observations with pressure provided + - filter: Variable Transforms + Transform: SurfaceWindScalingPressure + SkipWhenNoObs: false + + # Calculate error inflation factor for duplicate observations + #- filter: Variable Assignment + # assignments: + # - name: ObsErrorFactorDuplicateCheck/windEastward + # type: float + # function: + # name: ObsFunction/ObsErrorFactorDuplicateCheck + # options: + # use_air_pressure: true + # variable: windEastward + #- filter: Variable Assignment + # assignments: + # - name: ObsErrorFactorDuplicateCheck/windNorthward + # type: float + # function: + # name: ObsFunction/ObsErrorFactorDuplicateCheck + # options: + # use_air_pressure: true + # variable: windNorthward + + # Observation Post Filters (QC) + # ----------------------------- + obs post filters: + # Assign the initial observation error, based on height/pressure + # Hard-wiring to prepobs_errtable.global by Type + # ObsError is currently not updating in diag file, but passes directly to EffectiveError when no inflation is specified in YAML + # Type 242 (Himawari VIS) + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 242 + 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.] #Pressure (Pa) + errors: [3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.9, 3.9, 4., 4., 4.1, + 5., 6., 6.3, 6.6, 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., + 7., 7., 7.] + # Type 250 (Himawari AHI WV, cloud-top or clear-sky) + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 250 + 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.] #Pressure (Pa) + errors: [3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.9, 3.9, 4., 4., 4.1, + 5., 7., 7.3, 7.6, 8., 8., 8., 8., 8., 8., 8., 8., 8., 8., 8., 8., 8., + 8., 8., 8.] + # Type Type 252 (Himawari AHI LWIR) + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 252 + 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.] #Pressure (Pa) + errors: [3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.9, 3.9, 4., 4., 4.1, + 5., 6., 6.3, 6.6, 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., + 7., 7., 7.] + # sanity-check criteria + # Observation Range Sanity Check + # NOT EXPLICITLY CLEARED: No obs in this range in file, so 0 Bounds Check rejects (which is correct) but essentially untested + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + minvalue: -130. + maxvalue: 130. + action: + name: reject + + # Velocity Sanity Check + # NOT EXPLICITLY CLEARED: No obs in this range in file, so 0 Bounds Check rejects (which is correct) but essentially untested + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: ObsFunction/Velocity + maxvalue: 130. + action: + name: reject + + # GSI read routine QC (part-1) + # Exclude Type 250 with windComputationMethod==5 (clear-sky WV) --- obs tossed without passing to setup routine + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windNorthward + is_in: 250 + - variable: MetaData/windComputationMethod + is_in: 5 + action: + name: reject + + # Exclude data with satellite zenith angle > 68 for all types --- obs tossed without passing to setup routine + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: MetaData/satelliteZenithAngle + maxvalue: 68. + action: + name: reject + + # GSI read routine QC (part-2) + # Reject obs with qiWithoutForecast < 85. (also > 100., which is missing data) + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: MetaData/qiWithoutForecast + minvalue: 85. + maxvalue: 100. + action: + name: reject + + # Reject Type 252 (IR) winds with a /=0 surface type (non-water surface) when latitude > 20. + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: + name: GeoVaLs/water_area_fraction + maxvalue: 0.99 + - variable: + name: ObsType/windEastward + is_in: 252 + test variables: + - name: MetaData/latitude + maxvalue: 20. + action: + name: reject + + # THINNING: Himawari winds are not prioritized + - filter: Gaussian Thinning + horizontal_mesh: 100 + vertical_mesh: 10000 + where: + - variable: + name: MetaData/pressure + minvalue: 50001. + - filter: Gaussian Thinning + horizontal_mesh: 90 + vertical_mesh: 10000 + where: + - variable: + name: MetaData/pressure + maxvalue: 50000. + + # GSI setupw routine QC + # Reject any ob Type [240–260] when pressure greater than 950 mb. + # CLEARED: minvalue/maxvalue are >=/<=, not >/<, so editing range by 1 Pa + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 240-260 + test variables: + - name: MetaData/pressure + maxvalue: 95001. + action: + name: reject + + # IR (Type 242), reject when pressure is less than 700 mb + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 242 + test variables: + - name: MetaData/pressure + minvalue: 70000. + action: + name: reject + + # cloud-top WV (Type 250), reject when pressure greater than 399 mb. + # CLEARED: maxvalue is rejecting >, not >= as per a Perform Action, so threshold is unchanged + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 250 + test variables: + - name: MetaData/pressure + maxvalue: 39900. + action: + name: reject + + # JMA IR (252) reject when pressure between 499 and 801 mb. + # PERFORM ACTION: minvalue/maxvalue are >=/<=, not >/<, so editing range by 1 Pa + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/pressure + minvalue: 49901. + maxvalue: 80099. + - variable: ObsType/windEastward + is_in: 252 + action: + name: reject + + # Multiple satellite platforms, reject when pressure is more than 50 mb above tropopause. + # CLEARED: minvalue is rejecting <, not <= as per a Perform Action, so threshold is unchanged + # Notes (eliu): This tropopause check reject too many obs; probably due to tropopause pressure estimation + # Turn this check off for now. + # Need to check if troposphere pressure was implemented correctly in fv3-jed + - filter: Difference Check + filter variables: + - name: windEastward + - name: windNorthward + reference: GeoVaLs/tropopause_pressure + value: MetaData/pressure + minvalue: -5000. # 50 hPa above tropopause level, negative p-diff + action: + name: reject + + # All satwinds must adjust errors based on ObsErrorFactorPressureCheck + # prior to the SPDB check (i.e. the gross-error check). The gross-error + # check uses the adjusted errors for error-bound tightening and rejection, + # so this check has to come first. This check will inflate errors for obs + # that are too close to either the model top or bottom. + # Notes (eliu): GMAO added a required parameter: adjusted_error_name. + - filter: Perform Action + filter variables: + - name: windEastward + where: + - variable: + name: ObsType/windEastward + is_in: 240-260 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + surface_obs: false + variable: windEastward + inflation factor: 4.0 + + - filter: Perform Action + filter variables: + - name: windNorthward + where: + - variable: + name: ObsType/windNorthward + is_in: 240-260 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windNorthward + inflation factor: 4.0 + + # All satwinds subject to a gross-error check that contains significant + # modifiers for satwinds with a negative speed-bias. ALL wind gross-error + # checks are currently being done by the SatWindsSPDBCheck. + # CLEARED + - filter: Background Check + filter variables: + - name: windEastward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260] + cgross: [2.5, 2.5, 2.5, 1.5, 2.5, 1.3, 1.3, 2.5, 2.5, 2.5, 2.5, 1.3, 2.5, + 1.5, 1.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5] + error_min: [1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, + 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4] + error_max: [6.1, 6.1, 15.0, 15.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, + 20.0, 20.0, 20.0, 20.0, 20.1, 20.1, 20.1, 20.1, 20.1, 20.1] + variable: windEastward + action: + name: reject + + - filter: Background Check + filter variables: + - name: windNorthward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260] + cgross: [2.5, 2.5, 2.5, 1.5, 2.5, 1.3, 1.3, 2.5, 2.5, 2.5, 2.5, 1.3, 2.5, + 1.5, 1.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5] + error_min: [1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, + 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4] + error_max: [6.1, 6.1, 15.0, 15.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, + 20.0, 20.0, 20.0, 20.0, 20.1, 20.1, 20.1, 20.1, 20.1, 20.1] + variable: windNorthward + action: + name: reject + + # The last error inflation check is for duplicate observations. This one needs + # to come last, because we don"t want to inflate errors for duplication if one + # of the duplicates should be rejected. + # Notes (eliu): ObsErrorFactorDuplicateCheck obsfunction requires PreUseFlag (usage parameter from read_satwnd.f90). + # : Turn off duplicate check for now. + #- filter: Perform Action + # filter variables: + # - name: windEastward + # action: + # name: inflate error + # inflation variable: + # name: ObsErrorFactorDuplicateCheck/windEastward + #- filter: Perform Action + # filter variables: + # - name: windNorthward + # action: + # name: inflate error + # inflation variable: + # name: ObsErrorFactorDuplicateCheck/windNorthward + # We are extending this to an additional filter that inflates final ob-errors across-the-board by + # 1/0.8 = 1.25. This is caused by the GSI value of nvqc being set to .true. in the global operational + # configuration, see: https://github.com/NOAA-EMC/global-workflow/blob/d5ae3328fa4041b177357b1133f6b92e81c859d7/scripts/exglobal_atmos_analysis.sh#L750 + # This setting activates Line 1229 of setupw.f90 to scale ratio_errors by 0.8, which is applied in + # the denominator of the final ob-error, so 1/0.8 = 1.25 factor of ob-error inflation. + # + # If this nvqc functionality were to be switched off (i.e. if variational qc were to be turned off), + # you would want to remove this last inflation filter. + #- filter: Perform Action + # filter variables: + # - name: windEastward + # where: + # - variable: ObsType/windEastward + # is_in: 240-260 + # action: + # name: inflate error + # inflation factor: 1.25 + #- filter: Perform Action + # filter variables: + # - name: windNorthward + # where: + # - variable: ObsType/windNorthward + # is_in: 240-260 + # action: + # name: inflate error + # inflation factor: 1.25 + # End of Filters + + + # GeoVaLs for Driving Observation Operators (testing mode) + # -------------------------------------------------------- + geovals: + filename: "{{atmosphere_obsdatain_path}}/{{atmosphere_obsdatain_prefix}}{{observation_from_jcb}}_geoval{{atmosphere_obsdatain_suffix}}" + + # Passed benchmark for UFO testing + # -------------------------------- + passedBenchmark: 0 diff --git a/observations/atmosphere/satwnd.seviri_m10.yaml.j2 b/observations/atmosphere/satwnd.seviri_m10.yaml.j2 new file mode 100644 index 0000000..c80759f --- /dev/null +++ b/observations/atmosphere/satwnd.seviri_m10.yaml.j2 @@ -0,0 +1,459 @@ +- + + # Observation Space (I/O) + # ----------------------- + obs space: + name: satwind_seviri_m10 + obsdatain: + engine: + type: H5File + obsfile: "{{atmosphere_obsdatain_path}}/{{atmosphere_obsdatain_prefix}}{{observation_from_jcb}}{{atmosphere_obsdatain_suffix}}" + obsdataout: + engine: + type: H5File + obsfile: "{{atmosphere_obsdataout_path}}/{{atmosphere_obsdataout_prefix}}{{observation_from_jcb}}{{atmosphere_obsdataout_suffix}}" + io pool: + max pool size: 1 + simulated variables: [windEastward, windNorthward] + + # Observation Operator + # -------------------- + obs operator: + name: VertInterp + hofx scaling field: SurfaceWindScalingPressure + hofx scaling field group: DerivedVariables + + # Linear Observation Operator + # --------------------------- + linear obs operator: + name: VertInterp + + # NOTE: Tests using the Gaussian Thinning filter (below) to duplicate GSI"s thinning of SEVIRI/METEOSAT-8 satwinds + # results in more JEDI satwinds in the diag file than in GSI, but far fewer JEDI satwinds assimilated than + # GSI. JEDI under-counts assimilated winds by roughly 25-40%, relative to GSI, and this under-count is not + # even including the temporal thinning which is applied in GSI but not JEDI (by this filter below). See + # GDASApp Issue #758 for details: https://github.com/NOAA-EMC/GDASApp/issues/758 + #obs pre filters: + #- filter: Gaussian Thinning + # where: + # - variable: ObsType/windEastward + # is_in: 243, 253 + # horizontal_mesh: 200 + # vertical_mesh: 10000 + # use_reduced_horizontal_grid: true + # round_horizontal_bin_count_to_nearest: true + # partition_longitude_bins_using_mesh: true + + # Observation Prior Filters (QC) + # ------------------------------ + obs prior filters: + # Apply variable changes needed for wind scaling + # For wind observations with pressure provided + - filter: Variable Transforms + Transform: SurfaceWindScalingPressure + SkipWhenNoObs: false + + # Calculate error inflation factor for duplicate observations + #- filter: Variable Assignment + # assignments: + # - name: ObsErrorFactorDuplicateCheck/windEastward + # type: float + # function: + # name: ObsFunction/ObsErrorFactorDuplicateCheck + # options: + # use_air_pressure: true + # variable: windEastward + #- filter: Variable Assignment + # assignments: + # - name: ObsErrorFactorDuplicateCheck/windNorthward + # type: float + # function: + # name: ObsFunction/ObsErrorFactorDuplicateCheck + # options: + # use_air_pressure: true + # variable: windNorthward + + # Observation Post Filters (QC) + # ----------------------------- + obs post filters: + # Assign the initial observation error, based on height/pressure + # Hard-wiring to prepobs_errtable.global by Type + # ObsError is currently not updating in diag file, but passes directly to EffectiveError when no inflation is specified in YAML + # Type 243 (MVIRI/SEVIRI VIS) + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 243 + minvalue: -135. + maxvalue: 135. + 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.] #Pressure (Pa) + errors: [3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.9, 3.9, 4., 4., 4.1, + 5., 6., 6.3, 6.6, 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., + 7., 7., 7.] + # Type 253 (MVIRI/SEVERI LWIR) + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 253 + minvalue: -135. + maxvalue: 135. + 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.] #Pressure (Pa) + errors: [3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.9, 3.9, 4., 4., 4.1, + 5., 6., 6.3, 6.6, 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., + 7., 7., 7.] + # Type 254 (MVIRI/SEVIRI WV, both cloud-top and clear-sky) + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 254 + minvalue: -135. + maxvalue: 135. + 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.] #Pressure (Pa) + errors: [3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.9, 3.9, 4., 4.5, 6.1, + 6., 6.5, 7.3, 7.6, 7., 7.5, 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., + 7., 7., 7.] + # sanity-check criteria + # Observation Range Sanity Check + # NOT EXPLICITLY CLEARED: No obs in this range in file, so 0 Bounds Check rejects (which is correct) but essentially untested + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + minvalue: -130. + maxvalue: 130. + action: + name: reject + + # Velocity Sanity Check + # NOT EXPLICITLY CLEARED: No obs in this range in file, so 0 Bounds Check rejects (which is correct) but essentially untested + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: ObsFunction/Velocity + maxvalue: 130. + action: + name: reject + + # GSI read routine QC (part-1) + # Exclude Type 254 with windComputationMethod==5 (clear-sky WV) --- obs tossed without passing to setup routine + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windNorthward + is_in: 254 + - variable: MetaData/windComputationMethod + is_in: 5 + action: + name: reject + + # Exclude data with satellite zenith angle > 68 for all types --- obs tossed without passing to setup routine + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: MetaData/satelliteZenithAngle + maxvalue: 68. + action: + name: reject + + # Exclude data over non-water surface type where latitude > 20N for Type 253 (IRLW) --- obs tossed and not passed to setup routine + # Notes: This check was missing, so added (eliu) + # Replace land_type_index_NPOSS with water_area_fraction (eliu) + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 253 + - variable: MetaData/latitude + minvalue: 20. + test variables: + - name: GeoVaLs/water_area_fraction + minvalue: 0.99 + action: + name: reject + + # GSI read routine QC (part-2) + # Reject obs with qiWithoutForecast < 85. OR > 100. + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: MetaData/qiWithoutForecast + minvalue: 85. + maxvalue: 100. + action: + name: reject + + # THINNING: METEOSAT winds are prioritized by qiWithoutForecast + - filter: Gaussian Thinning + horizontal_mesh: 100 + vertical_mesh: 10000 + priority_variable: + name: MetaData/qiWithoutForecast + where: + - variable: + name: MetaData/pressure + minvalue: 50001. + - filter: Gaussian Thinning + horizontal_mesh: 90 + vertical_mesh: 10000 + priority_variable: + name: MetaData/qiWithoutForecast + where: + - variable: + name: MetaData/pressure + maxvalue: 50000. + + # GSI setupw routine QC + # Reject any ob Type [240–260] when pressure greater than 950 mb. + # CLEARED: minvalue/maxvalue are >=/<=, not >/<, so editing range by 1 Pa + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 240-260 + test variables: + - name: MetaData/pressure + maxvalue: 95001. + action: + name: reject + + # EUMETSAT IR (253) reject when pressure between 401 and 801 mb. + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/pressure + minvalue: 40101. + maxvalue: 80099. + - variable: ObsType/windEastward + is_in: 253 + action: + name: reject + + # EUMET VIS (243) reject when pressure less than 700 mb. + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 243 + test variables: + - name: MetaData/pressure + minvalue: 70000. + action: + name: reject + + # EUMET WV (254) reject when pressure greater than 399 mb. + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 254 + test variables: + - name: MetaData/pressure + maxvalue: 39900. + action: + name: reject + + # Multiple satellite platforms, reject when pressure is more than 50 mb above tropopause. + # CLEARED: minvalue is rejecting <, not <= as per a Perform Action, so threshold is unchanged + # Notes (eliu): This tropopause check reject too many obs; probably due to tropopause pressure estimation + # Turn this check off for now. + # Need to check if troposphere pressure was implemented correctly in fv3-jed + - filter: Difference Check + filter variables: + - name: windEastward + - name: windNorthward + reference: GeoVaLs/tropopause_pressure + value: MetaData/pressure + minvalue: -5000. # 50 hPa above tropopause level, negative p-diff + action: + name: reject + + # All satwinds must adjust errors based on ObsErrorFactorPressureCheck + # prior to the SPDB check (i.e. the gross-error check). The gross-error + # check uses the adjusted errors for error-bound tightening and rejection, + # so this check has to come first. This check will inflate errors for obs + # that are too close to either the model top or bottom. + # Notes (eliu): GMAO added a required parameter: adjusted_error_name. + - filter: Perform Action + filter variables: + - name: windEastward + where: + - variable: + name: ObsType/windEastward + is_in: 240-260 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + surface_obs: false + variable: windEastward + inflation factor: 4.0 + + - filter: Perform Action + filter variables: + - name: windNorthward + where: + - variable: + name: ObsType/windNorthward + is_in: 240-260 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windNorthward + inflation factor: 4.0 + + # All satwinds subject to a gross-error check that contains significant + # modifiers for satwinds with a negative speed-bias. ALL wind gross-error + # checks are currently being done by the SatWindsSPDBCheck. + # CLEARED + - filter: Background Check + filter variables: + - name: windEastward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260] + cgross: [2.5, 2.5, 2.5, 1.5, 2.5, 1.3, 1.3, 2.5, 2.5, 2.5, 2.5, 1.3, 2.5, + 1.5, 1.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5] + error_min: [1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, + 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4] + error_max: [6.1, 6.1, 15.0, 15.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, + 20.0, 20.0, 20.0, 20.0, 20.1, 20.1, 20.1, 20.1, 20.1, 20.1] + variable: windEastward + action: + name: reject + + - filter: Background Check + filter variables: + - name: windNorthward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260] + cgross: [2.5, 2.5, 2.5, 1.5, 2.5, 1.3, 1.3, 2.5, 2.5, 2.5, 2.5, 1.3, 2.5, + 1.5, 1.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5] + error_min: [1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, + 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4] + error_max: [6.1, 6.1, 15.0, 15.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, + 20.0, 20.0, 20.0, 20.0, 20.1, 20.1, 20.1, 20.1, 20.1, 20.1] + variable: windNorthward + action: + name: reject + + # The last error inflation check is for duplicate observations. This one needs + # to come last, because we don"t want to inflate errors for duplication if one + # of the duplicates should be rejected. + # Notes (eliu): ObsErrorFactorDuplicateCheck obsfunction requires PreUseFlag (usage parameter from read_satwnd.f90). + # : Turn off duplicate check for now. + #- filter: Perform Action + # filter variables: + # - name: windEastward + # action: + # name: inflate error + # inflation variable: + # name: ObsErrorFactorDuplicateCheck/windEastward + #- filter: Perform Action + # filter variables: + # - name: windNorthward + # action: + # name: inflate error + # inflation variable: + # name: ObsErrorFactorDuplicateCheck/windNorthward + # We are extending this to an additional filter that inflates final ob-errors across-the-board by + # 1/0.8 = 1.25. This is caused by the GSI value of nvqc being set to .true. in the global operational + # configuration, see: https://github.com/NOAA-EMC/global-workflow/blob/d5ae3328fa4041b177357b1133f6b92e81c859d7/scripts/exglobal_atmos_analysis.sh#L750 + # This setting activates Line 1229 of setupw.f90 to scale ratio_errors by 0.8, which is applied in + # the denominator of the final ob-error, so 1/0.8 = 1.25 factor of ob-error inflation. + # + # If this nvqc functionality were to be switched off (i.e. if variational qc were to be turned off), + # you would want to remove this last inflation filter. + #- filter: Perform Action + # filter variables: + # - name: windEastward + # where: + # - variable: ObsType/windEastward + # is_in: 240-260 + # action: + # name: inflate error + # inflation factor: 1.25 + #- filter: Perform Action + # filter variables: + # - name: windNorthward + # where: + # - variable: ObsType/windNorthward + # is_in: 240-260 + # action: + # name: inflate error + # inflation factor: 1.25 + # End of Filters + + + # GeoVaLs for Driving Observation Operators (testing mode) + # -------------------------------------------------------- + geovals: + filename: "{{atmosphere_obsdatain_path}}/{{atmosphere_obsdatain_prefix}}{{observation_from_jcb}}_geoval{{atmosphere_obsdatain_suffix}}" + + # Passed benchmark for UFO testing + # -------------------------------- + passedBenchmark: 0 diff --git a/observations/atmosphere/satwnd.seviri_m11.yaml.j2 b/observations/atmosphere/satwnd.seviri_m11.yaml.j2 index cb6a10d..e8bab78 100644 --- a/observations/atmosphere/satwnd.seviri_m11.yaml.j2 +++ b/observations/atmosphere/satwnd.seviri_m11.yaml.j2 @@ -231,6 +231,26 @@ action: name: reject + # THINNING: METEOSAT winds are prioritized by qiWithoutForecast + - filter: Gaussian Thinning + horizontal_mesh: 100 + vertical_mesh: 10000 + priority_variable: + name: MetaData/qiWithoutForecast + where: + - variable: + name: MetaData/pressure + minvalue: 50001. + - filter: Gaussian Thinning + horizontal_mesh: 90 + vertical_mesh: 10000 + priority_variable: + name: MetaData/qiWithoutForecast + where: + - variable: + name: MetaData/pressure + maxvalue: 50000. + # GSI setupw routine QC # Reject any ob Type [240–260] when pressure greater than 950 mb. # CLEARED: minvalue/maxvalue are >=/<=, not >/<, so editing range by 1 Pa diff --git a/observations/atmosphere/satwnd.seviri_m8.yaml.j2 b/observations/atmosphere/satwnd.seviri_m8.yaml.j2 index e85bb81..95d33c9 100644 --- a/observations/atmosphere/satwnd.seviri_m8.yaml.j2 +++ b/observations/atmosphere/satwnd.seviri_m8.yaml.j2 @@ -231,6 +231,31 @@ action: name: reject + # THINNING: METEOSAT-8 Type-243/253 winds are thinned using priority_variable=MetaData/qiWithoutForecast + # METEOSAT-8 Type-254 winds are NOT thinned + - filter: Gaussian Thinning + horizontal_mesh: 100 + vertical_mesh: 10000 + priority_variable: + name: MetaData/qiWithoutForecast + where: + - variable: ObsType/windEastward + is_in: 243,253 + - variable: + name: MetaData/pressure + minvalue: 50001. + - filter: Gaussian Thinning + horizontal_mesh: 90 + vertical_mesh: 10000 + priority_variable: + name: MetaData/qiWithoutForecast + where: + - variable: ObsType/windEastward + is_in: 243,253 + - variable: + name: MetaData/pressure + maxvalue: 50000. + # GSI setupw routine QC # Reject any ob Type [240–260] when pressure greater than 950 mb. # CLEARED: minvalue/maxvalue are >=/<=, not >/<, so editing range by 1 Pa diff --git a/observations/atmosphere/satwnd.seviri_m9.yaml.j2 b/observations/atmosphere/satwnd.seviri_m9.yaml.j2 new file mode 100644 index 0000000..21307a3 --- /dev/null +++ b/observations/atmosphere/satwnd.seviri_m9.yaml.j2 @@ -0,0 +1,464 @@ +- + + # Observation Space (I/O) + # ----------------------- + obs space: + name: satwind_seviri_m9 + obsdatain: + engine: + type: H5File + obsfile: "{{atmosphere_obsdatain_path}}/{{atmosphere_obsdatain_prefix}}{{observation_from_jcb}}{{atmosphere_obsdatain_suffix}}" + obsdataout: + engine: + type: H5File + obsfile: "{{atmosphere_obsdataout_path}}/{{atmosphere_obsdataout_prefix}}{{observation_from_jcb}}{{atmosphere_obsdataout_suffix}}" + io pool: + max pool size: 1 + simulated variables: [windEastward, windNorthward] + + # Observation Operator + # -------------------- + obs operator: + name: VertInterp + hofx scaling field: SurfaceWindScalingPressure + hofx scaling field group: DerivedVariables + + # Linear Observation Operator + # --------------------------- + linear obs operator: + name: VertInterp + + # NOTE: Tests using the Gaussian Thinning filter (below) to duplicate GSI"s thinning of SEVIRI/METEOSAT-8 satwinds + # results in more JEDI satwinds in the diag file than in GSI, but far fewer JEDI satwinds assimilated than + # GSI. JEDI under-counts assimilated winds by roughly 25-40%, relative to GSI, and this under-count is not + # even including the temporal thinning which is applied in GSI but not JEDI (by this filter below). See + # GDASApp Issue #758 for details: https://github.com/NOAA-EMC/GDASApp/issues/758 + #obs pre filters: + #- filter: Gaussian Thinning + # where: + # - variable: ObsType/windEastward + # is_in: 243, 253 + # horizontal_mesh: 200 + # vertical_mesh: 10000 + # use_reduced_horizontal_grid: true + # round_horizontal_bin_count_to_nearest: true + # partition_longitude_bins_using_mesh: true + + # Observation Prior Filters (QC) + # ------------------------------ + obs prior filters: + # Apply variable changes needed for wind scaling + # For wind observations with pressure provided + - filter: Variable Transforms + Transform: SurfaceWindScalingPressure + SkipWhenNoObs: false + + # Calculate error inflation factor for duplicate observations + #- filter: Variable Assignment + # assignments: + # - name: ObsErrorFactorDuplicateCheck/windEastward + # type: float + # function: + # name: ObsFunction/ObsErrorFactorDuplicateCheck + # options: + # use_air_pressure: true + # variable: windEastward + #- filter: Variable Assignment + # assignments: + # - name: ObsErrorFactorDuplicateCheck/windNorthward + # type: float + # function: + # name: ObsFunction/ObsErrorFactorDuplicateCheck + # options: + # use_air_pressure: true + # variable: windNorthward + + # Observation Post Filters (QC) + # ----------------------------- + obs post filters: + # Assign the initial observation error, based on height/pressure + # Hard-wiring to prepobs_errtable.global by Type + # ObsError is currently not updating in diag file, but passes directly to EffectiveError when no inflation is specified in YAML + # Type 243 (MVIRI/SEVIRI VIS) + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 243 + minvalue: -135. + maxvalue: 135. + 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.] #Pressure (Pa) + errors: [3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.9, 3.9, 4., 4., 4.1, + 5., 6., 6.3, 6.6, 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., + 7., 7., 7.] + # Type 253 (MVIRI/SEVERI LWIR) + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 253 + minvalue: -135. + maxvalue: 135. + 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.] #Pressure (Pa) + errors: [3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.9, 3.9, 4., 4., 4.1, + 5., 6., 6.3, 6.6, 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., + 7., 7., 7.] + # Type 254 (MVIRI/SEVIRI WV, both cloud-top and clear-sky) + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 254 + minvalue: -135. + maxvalue: 135. + 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.] #Pressure (Pa) + errors: [3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.8, 3.9, 3.9, 4., 4.5, 6.1, + 6., 6.5, 7.3, 7.6, 7., 7.5, 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., 7., + 7., 7., 7.] + # sanity-check criteria + # Observation Range Sanity Check + # NOT EXPLICITLY CLEARED: No obs in this range in file, so 0 Bounds Check rejects (which is correct) but essentially untested + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + minvalue: -130. + maxvalue: 130. + action: + name: reject + + # Velocity Sanity Check + # NOT EXPLICITLY CLEARED: No obs in this range in file, so 0 Bounds Check rejects (which is correct) but essentially untested + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: ObsFunction/Velocity + maxvalue: 130. + action: + name: reject + + # GSI read routine QC (part-1) + # Exclude Type 254 with windComputationMethod==5 (clear-sky WV) --- obs tossed without passing to setup routine + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windNorthward + is_in: 254 + - variable: MetaData/windComputationMethod + is_in: 5 + action: + name: reject + + # Exclude data with satellite zenith angle > 68 for all types --- obs tossed without passing to setup routine + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: MetaData/satelliteZenithAngle + maxvalue: 68. + action: + name: reject + + # Exclude data over non-water surface type where latitude > 20N for Type 253 (IRLW) --- obs tossed and not passed to setup routine + # Notes: This check was missing, so added (eliu) + # Replace land_type_index_NPOSS with water_area_fraction (eliu) + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 253 + - variable: MetaData/latitude + minvalue: 20. + test variables: + - name: GeoVaLs/water_area_fraction + minvalue: 0.99 + action: + name: reject + + # GSI read routine QC (part-2) + # Reject obs with qiWithoutForecast < 85. OR > 100. + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: MetaData/qiWithoutForecast + minvalue: 85. + maxvalue: 100. + action: + name: reject + + # THINNING: METEOSAT-9 Type-243/253 winds are thinned using priority_variable=MetaData/qiWithoutForecast + # METEOSAT-9 Type-254 winds are NOT thinned + - filter: Gaussian Thinning + horizontal_mesh: 100 + vertical_mesh: 10000 + priority_variable: + name: MetaData/qiWithoutForecast + where: + - variable: ObsType/windEastward + is_in: 243,253 + - variable: + name: MetaData/pressure + minvalue: 50001. + - filter: Gaussian Thinning + horizontal_mesh: 90 + vertical_mesh: 10000 + priority_variable: + name: MetaData/qiWithoutForecast + where: + - variable: ObsType/windEastward + is_in: 243,253 + - variable: + name: MetaData/pressure + maxvalue: 50000. + + # GSI setupw routine QC + # Reject any ob Type [240–260] when pressure greater than 950 mb. + # CLEARED: minvalue/maxvalue are >=/<=, not >/<, so editing range by 1 Pa + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 240-260 + test variables: + - name: MetaData/pressure + maxvalue: 95001. + action: + name: reject + + # EUMETSAT IR (253) reject when pressure between 401 and 801 mb. + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/pressure + minvalue: 40101. + maxvalue: 80099. + - variable: ObsType/windEastward + is_in: 253 + action: + name: reject + + # EUMET VIS (243) reject when pressure less than 700 mb. + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 243 + test variables: + - name: MetaData/pressure + minvalue: 70000. + action: + name: reject + + # EUMET WV (254) reject when pressure greater than 399 mb. + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 254 + test variables: + - name: MetaData/pressure + maxvalue: 39900. + action: + name: reject + + # Multiple satellite platforms, reject when pressure is more than 50 mb above tropopause. + # CLEARED: minvalue is rejecting <, not <= as per a Perform Action, so threshold is unchanged + # Notes (eliu): This tropopause check reject too many obs; probably due to tropopause pressure estimation + # Turn this check off for now. + # Need to check if troposphere pressure was implemented correctly in fv3-jed + - filter: Difference Check + filter variables: + - name: windEastward + - name: windNorthward + reference: GeoVaLs/tropopause_pressure + value: MetaData/pressure + minvalue: -5000. # 50 hPa above tropopause level, negative p-diff + action: + name: reject + + # All satwinds must adjust errors based on ObsErrorFactorPressureCheck + # prior to the SPDB check (i.e. the gross-error check). The gross-error + # check uses the adjusted errors for error-bound tightening and rejection, + # so this check has to come first. This check will inflate errors for obs + # that are too close to either the model top or bottom. + # Notes (eliu): GMAO added a required parameter: adjusted_error_name. + - filter: Perform Action + filter variables: + - name: windEastward + where: + - variable: + name: ObsType/windEastward + is_in: 240-260 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + surface_obs: false + variable: windEastward + inflation factor: 4.0 + + - filter: Perform Action + filter variables: + - name: windNorthward + where: + - variable: + name: ObsType/windNorthward + is_in: 240-260 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windNorthward + inflation factor: 4.0 + + # All satwinds subject to a gross-error check that contains significant + # modifiers for satwinds with a negative speed-bias. ALL wind gross-error + # checks are currently being done by the SatWindsSPDBCheck. + # CLEARED + - filter: Background Check + filter variables: + - name: windEastward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260] + cgross: [2.5, 2.5, 2.5, 1.5, 2.5, 1.3, 1.3, 2.5, 2.5, 2.5, 2.5, 1.3, 2.5, + 1.5, 1.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5] + error_min: [1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, + 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4] + error_max: [6.1, 6.1, 15.0, 15.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, + 20.0, 20.0, 20.0, 20.0, 20.1, 20.1, 20.1, 20.1, 20.1, 20.1] + variable: windEastward + action: + name: reject + + - filter: Background Check + filter variables: + - name: windNorthward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260] + cgross: [2.5, 2.5, 2.5, 1.5, 2.5, 1.3, 1.3, 2.5, 2.5, 2.5, 2.5, 1.3, 2.5, + 1.5, 1.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5] + error_min: [1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, + 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4] + error_max: [6.1, 6.1, 15.0, 15.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, + 20.0, 20.0, 20.0, 20.0, 20.1, 20.1, 20.1, 20.1, 20.1, 20.1] + variable: windNorthward + action: + name: reject + + # The last error inflation check is for duplicate observations. This one needs + # to come last, because we don"t want to inflate errors for duplication if one + # of the duplicates should be rejected. + # Notes (eliu): ObsErrorFactorDuplicateCheck obsfunction requires PreUseFlag (usage parameter from read_satwnd.f90). + # : Turn off duplicate check for now. + #- filter: Perform Action + # filter variables: + # - name: windEastward + # action: + # name: inflate error + # inflation variable: + # name: ObsErrorFactorDuplicateCheck/windEastward + #- filter: Perform Action + # filter variables: + # - name: windNorthward + # action: + # name: inflate error + # inflation variable: + # name: ObsErrorFactorDuplicateCheck/windNorthward + # We are extending this to an additional filter that inflates final ob-errors across-the-board by + # 1/0.8 = 1.25. This is caused by the GSI value of nvqc being set to .true. in the global operational + # configuration, see: https://github.com/NOAA-EMC/global-workflow/blob/d5ae3328fa4041b177357b1133f6b92e81c859d7/scripts/exglobal_atmos_analysis.sh#L750 + # This setting activates Line 1229 of setupw.f90 to scale ratio_errors by 0.8, which is applied in + # the denominator of the final ob-error, so 1/0.8 = 1.25 factor of ob-error inflation. + # + # If this nvqc functionality were to be switched off (i.e. if variational qc were to be turned off), + # you would want to remove this last inflation filter. + #- filter: Perform Action + # filter variables: + # - name: windEastward + # where: + # - variable: ObsType/windEastward + # is_in: 240-260 + # action: + # name: inflate error + # inflation factor: 1.25 + #- filter: Perform Action + # filter variables: + # - name: windNorthward + # where: + # - variable: ObsType/windNorthward + # is_in: 240-260 + # action: + # name: inflate error + # inflation factor: 1.25 + # End of Filters + + + # GeoVaLs for Driving Observation Operators (testing mode) + # -------------------------------------------------------- + geovals: + filename: "{{atmosphere_obsdatain_path}}/{{atmosphere_obsdatain_prefix}}{{observation_from_jcb}}_geoval{{atmosphere_obsdatain_suffix}}" + + # Passed benchmark for UFO testing + # -------------------------------- + passedBenchmark: 0