From f705899249a1d9dfe1a3195e47634260aeff51c3 Mon Sep 17 00:00:00 2001 From: Brett Hoover Date: Mon, 20 May 2024 15:32:53 -0500 Subject: [PATCH] Overhaul satwnd observations/atmosphere/ .yaml.j2 files to update name-conventions: satwind->satwnd, qualityInformationWithoutForecast->qiWithoutForecast --- observations/atmosphere/satwind.yaml.j2 | 982 ------------------ .../atmosphere/satwnd.abi_goes-16.yaml.j2 | 4 +- ...-17.yaml.j2 => satwnd.abi_goes-17.yaml.j2} | 4 +- ...d_ahi_h8.yaml.j2 => satwnd.ahi_h8.yaml.j2} | 4 +- ...r_n15.yaml.j2 => satwnd.avhrr_n15.yaml.j2} | 0 ...r_n18.yaml.j2 => satwnd.avhrr_n18.yaml.j2} | 0 ...r_n19.yaml.j2 => satwnd.avhrr_n19.yaml.j2} | 0 .../atmosphere/satwnd.modis_aqua.yaml.j2 | 356 +++++++ .../atmosphere/satwnd.modis_terra.yaml.j2 | 368 +++++++ ..._m11.yaml.j2 => satwnd.seviri_m11.yaml.j2} | 4 +- ...ri_m8.yaml.j2 => satwnd.seviri_m8.yaml.j2} | 4 +- .../atmosphere/satwnd.viirs_n20.yaml.j2 | 289 ++++++ .../atmosphere/satwnd.viirs_npp.yaml.j2 | 289 ++++++ 13 files changed, 1312 insertions(+), 992 deletions(-) delete mode 100644 observations/atmosphere/satwind.yaml.j2 rename observations/atmosphere/{satwind_abi_goes-17.yaml.j2 => satwnd.abi_goes-17.yaml.j2} (99%) rename observations/atmosphere/{satwind_ahi_h8.yaml.j2 => satwnd.ahi_h8.yaml.j2} (99%) rename observations/atmosphere/{satwind_avhrr_n15.yaml.j2 => satwnd.avhrr_n15.yaml.j2} (100%) rename observations/atmosphere/{satwind_avhrr_n18.yaml.j2 => satwnd.avhrr_n18.yaml.j2} (100%) rename observations/atmosphere/{satwind_avhrr_n19.yaml.j2 => satwnd.avhrr_n19.yaml.j2} (100%) create mode 100644 observations/atmosphere/satwnd.modis_aqua.yaml.j2 create mode 100644 observations/atmosphere/satwnd.modis_terra.yaml.j2 rename observations/atmosphere/{satwind_seviri_m11.yaml.j2 => satwnd.seviri_m11.yaml.j2} (99%) rename observations/atmosphere/{satwind_seviri_m8.yaml.j2 => satwnd.seviri_m8.yaml.j2} (99%) create mode 100644 observations/atmosphere/satwnd.viirs_n20.yaml.j2 create mode 100644 observations/atmosphere/satwnd.viirs_npp.yaml.j2 diff --git a/observations/atmosphere/satwind.yaml.j2 b/observations/atmosphere/satwind.yaml.j2 deleted file mode 100644 index 3973c3e9..00000000 --- a/observations/atmosphere/satwind.yaml.j2 +++ /dev/null @@ -1,982 +0,0 @@ -- - - # Observation Space (I/O) - # ----------------------- - obs space: - name: satwind - obsdatain: - engine: - type: H5File - obsfile: "{{atm_obsdatain_path}}/{{atm_obsdatain_prefix}}{{observation_from_jcb}}{{atm_obsdatain_suffix}}" - obsdataout: - engine: - type: H5File - obsfile: "{{atm_obsdataout_path}}/{{atm_obsdataout_prefix}}{{observation_from_jcb}}{{atm_obsdataout_suffix}}" - io pool: - max pool size: 1 - simulated variables: [windEastward, windNorthward] - - # Observation Operator - # -------------------- - obs operator: - name: VertInterp - - # Observation Pre Filters (QC) - # ---------------------------- - obs pre 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 240 (GOES SWIR): Assigned all dummy values in prepobs_errtable.global - - filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 240 - minvalue: -135. - maxvalue: 135. - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelStepwiseLinear - options: - xvar: - name: MetaData/pressure - xvals: [110000., 0.] #Pressure (Pa) - errors: [1000000000., 1000000000.] - # Type 241 (Multi Spec. Imager LWIR): Assigned all dummy values - - filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 241 - minvalue: -135. - maxvalue: 135. - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelStepwiseLinear - options: - xvar: - name: MetaData/pressure - xvals: [110000., 0.] #Pressure (Pa) - errors: [1000000000., 1000000000.] - # Type 242 (Himawari VIS) - - filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 242 - 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 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 244 (AVHRR LWIR) - - filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 244 - 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 245 (GOES LWIR): I am assuming these are halved relative to prepobs_errtable.global, based on read_satwnd.f90: L1410–1416 - - filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 245 - 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: [7.6, 7.6, 7.6, 7.6, 7.6, 7.6, 7.6, 7.6, 7.8, 7.8, 8., 8., 8.2, - 10., 12., 12.6, 13.2, 14., 14., 14., 14., 14., 14., 14., 14., 14., 14., - 14., 14., 14., 14., 14., 14.] - # Type 246 (GOES cloud-top WV): I am assuming these are halved relative to prepobs_errtable.global, based on read_satwnd.f90: L1410–1416 - - filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 246 - 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: [7.6, 7.6, 7.6, 7.6, 7.6, 7.6, 7.6, 7.6, 7.8, 7.8, 8., 8., 8.2, - 10., 12., 12.6, 13.2, 14., 14., 14., 14., 14., 14., 14., 14., 14., 14., - 14., 14., 14., 14., 14., 14.] - # Type 247 (GOES clear-sky WV): I am assuming these are halved relative to prepobs_errtable.global, based on read_satwnd.f90: L1410–1416 - - filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 247 - 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: [7.6, 7.6, 7.6, 7.6, 7.6, 7.6, 7.6, 7.6, 7.8, 7.8, 8., 8., 8.2, - 10., 12., 12.6, 13.2, 14., 14., 14., 14., 14., 14., 14., 14., 14., 14., - 14., 14., 14., 14., 14., 14.] - # Type 248 (GOES Sounder cloud-top WV): Assigned all dummy values - - filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 248 - minvalue: -135. - maxvalue: 135. - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelStepwiseLinear - options: - xvar: - name: MetaData/pressure - xvals: [110000., 0.] #Pressure (Pa) - errors: [1000000000., 1000000000.] - # Type 249 (GOES Sounder clear-sky WV): Assigned all dummy values - - filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 249 - minvalue: -135. - maxvalue: 135. - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelStepwiseLinear - options: - xvar: - name: MetaData/pressure - xvals: [110000., 0.] #Pressure (Pa) - errors: [1000000000., 1000000000.] - # 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 - 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., 7., 7.3, 7.6, 8., 8., 8., 8., 8., 8., 8., 8., 8., 8., 8., 8., 8., - 8., 8., 8.] - # Type 251 (GOES VIS): Assigned all dummy values - - filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 251 - minvalue: -135. - maxvalue: 135. - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelStepwiseLinear - options: - xvar: - name: MetaData/pressure - xvals: [110000., 0.] #Pressure (Pa) - errors: [1000000000., 1000000000.] - # Type 252 (Himawari AHI LWIR) - - filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 252 - 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.] - # Type 255 (GOES low-level picture triplet cloud drift): According to prepbufr table this should no longer exist?? - - filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 255 - 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 256 (Multi Spec. Imager WV, both clear-sky and cloud-top): Assigned all dummy values - - filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 256 - minvalue: -135. - maxvalue: 135. - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelStepwiseLinear - options: - xvar: - name: MetaData/pressure - xvals: [110000., 0.] #Pressure (Pa) - errors: [1000000000., 1000000000.] - # Type 257 (MODIS LWIR) - - filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 257 - 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 258 (MODIS cloud-top WV): Some levels assigned dummy values - - filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 258 - minvalue: -135. - maxvalue: 135. - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelStepwiseLinear - options: - xvar: - name: MetaData/pressure - xvals: [110000., 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: [1000000000., 1000000000., 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 259 (MODIS clear-sky WV): Some levels assigned dummy values - - filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 259 - minvalue: -135. - maxvalue: 135. - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelStepwiseLinear - options: - xvar: - name: MetaData/pressure - xvals: [110000., 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: [1000000000., 1000000000., 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 260 (VIIRS LWIR): All levels assigned dummy values in prepobs_errtable.global, HOWEVER the GSI values appear - # to be a standard profile (borrowed from e.g., Type=244). Using the standard profile here. - # It"s possibly that my prepobs_errtable.global file is out-of-date. - - filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 260 - 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.] - - # Observation Prior Filters (QC) - # ------------------------------ - obs prior filters: - # - # 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 - # - # preQC (read_satwnd) criteria - # - # EUMETSAT winds: satelliteIdentifer [50–79] (>49, <80) - # Reject obs with satelliteZenithAngle > 68 deg - # 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 - where: - - variable: MetaData/satelliteIdentifier - minvalue: 49. - maxvalue: 80. - test variables: - - name: MetaData/satelliteZenithAngle - maxvalue: 68. - action: - name: reject - # Reject obs with windComputationMethod = 5 (clear-sky WV AMV) - # CLEARED - - filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: MetaData/satelliteIdentifier - minvalue: 49. - maxvalue: 80. - test variables: - - name: MetaData/windComputationMethod - maxvalue: 4. - action: - name: reject - # Reject obs with qualityInformationWithoutForecast < 85. - # CLEARED - - filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: MetaData/satelliteIdentifier - minvalue: 49. - maxvalue: 80. - test variables: - - name: MetaData/qualityInformationWithoutForecast - minvalue: 85. - action: - name: reject - # JMA: satelliteIdentifier [100–199] (>99, <200) - # Reject obs with satelliteZenithAngle > 68 deg - # 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 - where: - - variable: MetaData/satelliteIdentifier - minvalue: 99. - maxvalue: 200. - test variables: - - name: MetaData/satelliteZenithAngle - maxvalue: 68. - action: - name: reject - # Reject obs with windComputationMethod = 5 (clear-sky WV AMV) - # 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 - where: - - variable: MetaData/satelliteIdentifier - minvalue: 99. - maxvalue: 200. - test variables: - - name: MetaData/windComputationMethod - maxvalue: 4. - action: - name: reject - # Reject obs with qualityInformationWithoutForecast < 85. - # CLEARED - - filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: MetaData/satelliteIdentifier - minvalue: 99. - maxvalue: 200. - test variables: - - name: MetaData/qualityInformationWithoutForecast - minvalue: 85. - action: - name: reject - # NESDIS: satelliteIdentifier [250–299] (>249, <300) - # Reject obs with satelliteZenithAngle > 68 deg - # 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 - where: - - variable: MetaData/satelliteIdentifier - minvalue: 249. - maxvalue: 300. - test variables: - - name: MetaData/satelliteZenithAngle - maxvalue: 68. - action: - name: reject - # Reject obs with qualityInformationWithoutForecast < 90. OR > 100. - # CLEARED - - filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: MetaData/satelliteIdentifier - minvalue: 249. - maxvalue: 300. - test variables: - - name: MetaData/qualityInformationWithoutForecast - minvalue: 90. - maxvalue: 100. - action: - name: reject - # Reject obs with pressure < 15000. - # CLEARED - - filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: MetaData/satelliteIdentifier - minvalue: 249. - maxvalue: 300. - test variables: - - name: MetaData/pressure - minvalue: 15000. - action: - name: reject - # Reject obs with pressure < 70000. when Type=251 - # 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 - where: - - variable: MetaData/satelliteIdentifier - minvalue: 249. - maxvalue: 300. - - variable: ObsType/windEastward - is_in: 251 - test variables: - - name: MetaData/pressure - minvalue: 70000. - action: - name: reject - # Reject obs with pressure > 30000. when Type=246 - # CLEARED - - filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: MetaData/satelliteIdentifier - minvalue: 249. - maxvalue: 300. - - variable: ObsType/windEastward - is_in: 246 - test variables: - - name: MetaData/pressure - maxvalue: 30000. - action: - name: reject - # Reject obs with pressure > 85000. when isli=1 (land surface) - # CLEARED - - filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: MetaData/satelliteIdentifier - minvalue: 249. - maxvalue: 300. - - variable: GeoVaLs/land_type_index_NPOESS - minvalue: 1. - maxvalue: 1. - test variables: - - name: MetaData/pressure - maxvalue: 85000. - action: - name: reject - # Reject obs with pct1 (Coeff. of Var.) outside of 0.04–0.5, Type [240,245,246,251] ONLY - # CLEARED - - filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: MetaData/satelliteIdentifier - minvalue: 249. - maxvalue: 300. - - variable: ObsType/windEastward - is_in: 240,245,246,251 - test variables: - - name: MetaData/coefficientOfVariation - minvalue: 0.04 - maxvalue: 0.5 - action: - name: reject - # NESDIS obs are also subject to the experr_norm test defined as: - # - # if (10. - 0.1*(expectedError))/(ob_speed)>0.9, or ob_speed<0.1, reject, applies to Types [240,245,246,247,251] - # - # This is not implemented in the YAML file because we do not have the capability to compute - # the norm, lacking the required math operators. Instead, this will likely have to be - # implemented as an ObsFunction like the SatWindsLNVDCheck test. - # - # setupw criteria - # - # 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 - # GOES IR (245) reject when pressure between 399 and 801 mb. - # CLEARED: minvalue/maxvalue are >=/<=, not >/<, so editing range by 1 Pa - - filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: MetaData/pressure - minvalue: 39901. - maxvalue: 80099. - - variable: ObsType/windEastward - is_in: 245 - action: - name: reject - # JMA IR (252) reject when pressure between 499 and 801 mb. - # CLEARED: 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 - # EUMETSAT IR (253) reject when pressure between 401 and 801 mb. - # CLEARED: minvalue/maxvalue are >=/<=, not >/<, so editing range by 1 Pa - - 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 - # GOES WV (246, 250, 254), 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: 246, 250, 254 - test variables: - - name: MetaData/pressure - maxvalue: 39900. - action: - name: reject - # EUMET (242) and JMA (243) vis, reject when pressure less than 700 mb. - # CLEARED: minvalue 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: 242, 243 - test variables: - - name: MetaData/pressure - minvalue: 70000. - action: - name: reject - # MODIS-Aqua/Terra (257) and (259), reject when pressure less than 249 mb. - # CLEARED: minvalue 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: 257,259 - test variables: - - name: MetaData/pressure - minvalue: 24900. - action: - name: reject - # MODIS-Aqua/Terra (258) and (259), reject when pressure greater than 600 mb. - # NOT EXPLICITLY CLEARED: No obs in this range in file, so 0 Bounds Check rejects (which is correct) but essentially untested - # 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: 258, 259 - test variables: - - name: MetaData/pressure - maxvalue: 60000. - 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 - - 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 - # GOES (247) reject any observation with a /=0 surface type (non-water - # surface) within 110 hPa of the surface pressure (as part of the LNVD - # check). - # NOT EXPLICITLY CLEARED: No obs in this range in file, so 0 Bounds Check rejects (which is correct) but essentially untested - - filter: Difference Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: - name: GeoVaLs/land_type_index_NPOESS - minvalue: 1. - - variable: - name: ObsType/windEastward - is_in: 247 - reference: GeoVaLs/surface_pressure - value: MetaData/pressure - maxvalue: -11000. # within 110 hPa above surface pressure, negative p-diff - action: - name: reject - # AVHRR (244), MODIS (257,258,259), and VIIRS (260) reject any - # observation with a /=0 surface type (non-water surface) within - # 200 hPa of the surface pressure (as part of the LNVD check). - # CLEARED: maxvalue is rejecting >, not >= as per a Perform Action, so threshold is unchanged - - filter: Difference Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: - name: GeoVaLs/land_type_index_NPOESS - minvalue: 1. - - variable: - name: ObsType/windEastward - is_in: 244, 257-260 - reference: GeoVaLs/surface_pressure - value: MetaData/pressure - maxvalue: -20000. # within 200 hPa above surface pressure, negative p-diff - action: - name: reject - - # Observation Post Filters (QC) - # ----------------------------- - obs post filters: - # Reject GOES (247) when difference of wind direction is more than 50 degrees. - # 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: 247 - test variables: - - name: ObsFunction/WindDirAngleDiff - maxvalue: 50. - action: - name: reject - # AVHRR (244), MODIS (257,258,259), VIIRS (260), GOES (247) use a LNVD check. - # 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: 244, 247, 257-260 - test variables: - - name: ObsFunction/SatWindsLNVDCheck - maxvalue: 3. - action: - name: reject - # - # All satwinds subject to a SPDB check (function may be broken?) - # We are ignoring this filter for now, and will come back to - # the issue of how to handle this SPDB check later. For now, - # observations that are GSI-rejected based on this test are - # not being considered when checking acceptance compliance. - #- filter: Bounds Check - # filter variables: - # - name: windEastward - # - name: windNorthward - # test variables: - # - name: ObsFunction/SatWindsSPDBCheck - # options: - # error_min: 1.4 - # error_max: 20.0 - # maxvalue: 1.75 - # action: - # name: reject - # defer to post: true - - # Linear Observation Operator - # --------------------------- - linear obs operator: - name: Identity - - - - # GeoVaLs for Driving Observation Operators (testing mode) - # -------------------------------------------------------- - geovals: - filename: "{{atm_obsdatain_path}}/{{atm_obsdatain_prefix}}{{observation_from_jcb}}_geoval{{atm_obsdatain_suffix}}" - - # Passed benchmark for UFO testing - # -------------------------------- - passedBenchmark: 0 diff --git a/observations/atmosphere/satwnd.abi_goes-16.yaml.j2 b/observations/atmosphere/satwnd.abi_goes-16.yaml.j2 index e7b9c62e..21c0f49f 100644 --- a/observations/atmosphere/satwnd.abi_goes-16.yaml.j2 +++ b/observations/atmosphere/satwnd.abi_goes-16.yaml.j2 @@ -243,7 +243,7 @@ name: reject # GSI read routine QC (part-2) - # Reject obs with qualityInformationWithoutForecast < 90. OR > 100. + # Reject obs with qiWithoutForecast < 90. OR > 100. - filter: Bounds Check filter variables: - name: windEastward @@ -252,7 +252,7 @@ - variable: MetaData/satelliteIdentifier is_in: 250-299 test variables: - - name: MetaData/qualityInformationWithoutForecast + - name: MetaData/qiWithoutForecast minvalue: 90. maxvalue: 100. action: diff --git a/observations/atmosphere/satwind_abi_goes-17.yaml.j2 b/observations/atmosphere/satwnd.abi_goes-17.yaml.j2 similarity index 99% rename from observations/atmosphere/satwind_abi_goes-17.yaml.j2 rename to observations/atmosphere/satwnd.abi_goes-17.yaml.j2 index 3dd8a44f..bc4b072e 100644 --- a/observations/atmosphere/satwind_abi_goes-17.yaml.j2 +++ b/observations/atmosphere/satwnd.abi_goes-17.yaml.j2 @@ -243,7 +243,7 @@ name: reject # GSI read routine QC (part-2) - # Reject obs with qualityInformationWithoutForecast < 90. OR > 100. + # Reject obs with qiWithoutForecast < 90. OR > 100. - filter: Bounds Check filter variables: - name: windEastward @@ -252,7 +252,7 @@ - variable: MetaData/satelliteIdentifier is_in: 250-299 test variables: - - name: MetaData/qualityInformationWithoutForecast + - name: MetaData/qiWithoutForecast minvalue: 90. maxvalue: 100. action: diff --git a/observations/atmosphere/satwind_ahi_h8.yaml.j2 b/observations/atmosphere/satwnd.ahi_h8.yaml.j2 similarity index 99% rename from observations/atmosphere/satwind_ahi_h8.yaml.j2 rename to observations/atmosphere/satwnd.ahi_h8.yaml.j2 index 500f0914..f7569d38 100644 --- a/observations/atmosphere/satwind_ahi_h8.yaml.j2 +++ b/observations/atmosphere/satwnd.ahi_h8.yaml.j2 @@ -192,13 +192,13 @@ name: reject # GSI read routine QC (part-2) - # Reject obs with qualityInformationWithoutForecast < 85. (also > 100., which is missing data) + # Reject obs with qiWithoutForecast < 85. (also > 100., which is missing data) - filter: Bounds Check filter variables: - name: windEastward - name: windNorthward test variables: - - name: MetaData/qualityInformationWithoutForecast + - name: MetaData/qiWithoutForecast minvalue: 85. maxvalue: 100. action: diff --git a/observations/atmosphere/satwind_avhrr_n15.yaml.j2 b/observations/atmosphere/satwnd.avhrr_n15.yaml.j2 similarity index 100% rename from observations/atmosphere/satwind_avhrr_n15.yaml.j2 rename to observations/atmosphere/satwnd.avhrr_n15.yaml.j2 diff --git a/observations/atmosphere/satwind_avhrr_n18.yaml.j2 b/observations/atmosphere/satwnd.avhrr_n18.yaml.j2 similarity index 100% rename from observations/atmosphere/satwind_avhrr_n18.yaml.j2 rename to observations/atmosphere/satwnd.avhrr_n18.yaml.j2 diff --git a/observations/atmosphere/satwind_avhrr_n19.yaml.j2 b/observations/atmosphere/satwnd.avhrr_n19.yaml.j2 similarity index 100% rename from observations/atmosphere/satwind_avhrr_n19.yaml.j2 rename to observations/atmosphere/satwnd.avhrr_n19.yaml.j2 diff --git a/observations/atmosphere/satwnd.modis_aqua.yaml.j2 b/observations/atmosphere/satwnd.modis_aqua.yaml.j2 new file mode 100644 index 00000000..4ab84f56 --- /dev/null +++ b/observations/atmosphere/satwnd.modis_aqua.yaml.j2 @@ -0,0 +1,356 @@ +- obs space: + name: satwind_modis_aqua + obsdatain: + engine: + type: H5File + obsfile: "{{atm_obsdatain_path}}/{{atm_obsdatain_prefix}}{{observation_from_jcb}}{{atm_obsdatain_suffix}}" + obsdataout: + engine: + type: H5File + obsfile: "{{atm_obsdataout_path}}/{{atm_obsdataout_prefix}}{{observation_from_jcb}}{{atm_obsdataout_suffix}}" + io pool: + max pool size: 1 + simulated variables: [windEastward, windNorthward] + + obs operator: + name: VertInterp + hofx scaling field: SurfaceWindScalingPressure + hofx scaling field group: DerivedVariables + + 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 + + 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 + + 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 257 (MODIS LWIR) + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 257 + 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 258 (MODIS WVCT): Some levels assigned dummy values + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 258 + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + xvar: + name: MetaData/pressure + xvals: [110000.,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: [1000000000.,1000000000.,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 259 (MODIS WVDL): Some levels assigned dummy values + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 259 + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + xvar: + name: MetaData/pressure + xvals: [110000.,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: [1000000000.,1000000000.,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 + + # MODIS-Aqua/Terra (257) and (259), reject when pressure less than 249 mb. + # CLEARED: minvalue 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: 257,259 + test variables: + - name: MetaData/pressure + minvalue: 24900. + action: + name: reject + + # MODIS-Aqua/Terra (258) and (259), reject when pressure greater than 600 mb. + # NOT EXPLICITLY CLEARED: No obs in this range in file, so 0 Bounds Check rejects (which is correct) but essentially untested + # 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: 258, 259 + test variables: + - name: MetaData/pressure + maxvalue: 60000. + action: + name: reject + + # Reject any observation with a /=0 surface type (non-water surface) within + # 200 hPa of the surface pressure (as part of the LNVD check). + # CLEARED: maxvalue is rejecting >, not >= as per a Perform Action, so threshold is unchanged + - filter: Difference Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: + name: GeoVaLs/water_area_fraction + maxvalue: 0.99 + reference: GeoVaLs/surface_pressure + value: MetaData/pressure + maxvalue: -20000. # within 200 hPa above surface pressure, negative p-diff + action: + name: reject + + # LNVD check + # CLEARED: maxvalue is rejecting >, not >= as per a Perform Action, so threshold is unchanged + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: ObsFunction/SatWindsLNVDCheck + maxvalue: 3. + action: + name: reject + + # 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 + + # 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 diff --git a/observations/atmosphere/satwnd.modis_terra.yaml.j2 b/observations/atmosphere/satwnd.modis_terra.yaml.j2 new file mode 100644 index 00000000..811da821 --- /dev/null +++ b/observations/atmosphere/satwnd.modis_terra.yaml.j2 @@ -0,0 +1,368 @@ +- obs space: + name: satwind_modis_terra + obsdatain: + engine: + type: H5File + obsfile: "{{atm_obsdatain_path}}/{{atm_obsdatain_prefix}}{{observation_from_jcb}}{{atm_obsdatain_suffix}}" + obsdataout: + engine: + type: H5File + obsfile: "{{atm_obsdataout_path}}/{{atm_obsdataout_prefix}}{{observation_from_jcb}}{{atm_obsdataout_suffix}}" + io pool: + max pool size: 1 + simulated variables: [windEastward, windNorthward] + + obs operator: + name: VertInterp + hofx scaling field: SurfaceWindScalingPressure + hofx scaling field group: DerivedVariables + + 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 + + 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 + + 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 257 (MODIS LWIR) + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 257 + 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 258 (MODIS WVCT): Some levels assigned dummy values + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 258 + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + xvar: + name: MetaData/pressure + xvals: [110000.,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: [1000000000.,1000000000.,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 259 (MODIS WVDL): Some levels assigned dummy values + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 259 + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + xvar: + name: MetaData/pressure + xvals: [110000.,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: [1000000000.,1000000000.,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 + + # MODIS-TERRA: reject any WVCT (258) or WVDL (259) satwind + # NOTE: This restriction does NOT apply to MODIS-AQUA + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 258,259 + action: + name: reject + + # MODIS-Aqua/Terra (257) and (259), reject when pressure less than 249 mb. + # CLEARED: minvalue 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: 257,259 + test variables: + - name: MetaData/pressure + minvalue: 24900. + action: + name: reject + + # MODIS-Aqua/Terra (258) and (259), reject when pressure greater than 600 mb. + # NOT EXPLICITLY CLEARED: No obs in this range in file, so 0 Bounds Check rejects (which is correct) but essentially untested + # 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: 258, 259 + test variables: + - name: MetaData/pressure + maxvalue: 60000. + action: + name: reject + + # Reject any observation with a /=0 surface type (non-water surface) within + # 200 hPa of the surface pressure (as part of the LNVD check). + # CLEARED: maxvalue is rejecting >, not >= as per a Perform Action, so threshold is unchanged + - filter: Difference Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: + name: GeoVaLs/water_area_fraction + maxvalue: 0.99 + reference: GeoVaLs/surface_pressure + value: MetaData/pressure + maxvalue: -20000. # within 200 hPa above surface pressure, negative p-diff + action: + name: reject + + # LNVD check + # CLEARED: maxvalue is rejecting >, not >= as per a Perform Action, so threshold is unchanged + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: ObsFunction/SatWindsLNVDCheck + maxvalue: 3. + action: + name: reject + + # 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 + + # 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 diff --git a/observations/atmosphere/satwind_seviri_m11.yaml.j2 b/observations/atmosphere/satwnd.seviri_m11.yaml.j2 similarity index 99% rename from observations/atmosphere/satwind_seviri_m11.yaml.j2 rename to observations/atmosphere/satwnd.seviri_m11.yaml.j2 index 88456210..58e85d6a 100644 --- a/observations/atmosphere/satwind_seviri_m11.yaml.j2 +++ b/observations/atmosphere/satwnd.seviri_m11.yaml.j2 @@ -219,13 +219,13 @@ name: reject # GSI read routine QC (part-2) - # Reject obs with qualityInformationWithoutForecast < 85. OR > 100. + # Reject obs with qiWithoutForecast < 85. OR > 100. - filter: Bounds Check filter variables: - name: windEastward - name: windNorthward test variables: - - name: MetaData/qualityInformationWithoutForecast + - name: MetaData/qiWithoutForecast minvalue: 85. maxvalue: 100. action: diff --git a/observations/atmosphere/satwind_seviri_m8.yaml.j2 b/observations/atmosphere/satwnd.seviri_m8.yaml.j2 similarity index 99% rename from observations/atmosphere/satwind_seviri_m8.yaml.j2 rename to observations/atmosphere/satwnd.seviri_m8.yaml.j2 index 86c0d425..aac8a659 100644 --- a/observations/atmosphere/satwind_seviri_m8.yaml.j2 +++ b/observations/atmosphere/satwnd.seviri_m8.yaml.j2 @@ -219,13 +219,13 @@ name: reject # GSI read routine QC (part-2) - # Reject obs with qualityInformationWithoutForecast < 85. OR > 100. + # Reject obs with qiWithoutForecast < 85. OR > 100. - filter: Bounds Check filter variables: - name: windEastward - name: windNorthward test variables: - - name: MetaData/qualityInformationWithoutForecast + - name: MetaData/qiWithoutForecast minvalue: 85. maxvalue: 100. action: diff --git a/observations/atmosphere/satwnd.viirs_n20.yaml.j2 b/observations/atmosphere/satwnd.viirs_n20.yaml.j2 new file mode 100644 index 00000000..033d1e5b --- /dev/null +++ b/observations/atmosphere/satwnd.viirs_n20.yaml.j2 @@ -0,0 +1,289 @@ +- obs space: + name: satwind_viirs_n20 + obsdatain: + engine: + type: H5File + obsfile: "{{atm_obsdatain_path}}/{{atm_obsdatain_prefix}}{{observation_from_jcb}}{{atm_obsdatain_suffix}}" + obsdataout: + engine: + type: H5File + obsfile: "{{atm_obsdataout_path}}/{{atm_obsdataout_prefix}}{{observation_from_jcb}}{{atm_obsdataout_suffix}}" + io pool: + max pool size: 1 + simulated variables: [windEastward, windNorthward] + + obs operator: + name: VertInterp + hofx scaling field: SurfaceWindScalingPressure + hofx scaling field group: DerivedVariables + + 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 + + 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 + + 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 260 (VIIRS LWIR) + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 260 + 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: [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 + + # Reject any observation with a /=0 surface type (non-water surface) within + # 200 hPa of the surface pressure (as part of the LNVD check). + # CLEARED: maxvalue is rejecting >, not >= as per a Perform Action, so threshold is unchanged + - filter: Difference Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: + name: GeoVaLs/water_area_fraction + maxvalue: 0.99 + reference: GeoVaLs/surface_pressure + value: MetaData/pressure + maxvalue: -20000. # within 200 hPa above surface pressure, negative p-diff + action: + name: reject + + # LNVD check + # CLEARED: maxvalue is rejecting >, not >= as per a Perform Action, so threshold is unchanged + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: ObsFunction/SatWindsLNVDCheck + maxvalue: 3. + action: + name: reject + + # 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 + + # 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 diff --git a/observations/atmosphere/satwnd.viirs_npp.yaml.j2 b/observations/atmosphere/satwnd.viirs_npp.yaml.j2 new file mode 100644 index 00000000..c8148fbb --- /dev/null +++ b/observations/atmosphere/satwnd.viirs_npp.yaml.j2 @@ -0,0 +1,289 @@ +- obs space: + name: satwind_viirs_npp + obsdatain: + engine: + type: H5File + obsfile: "{{atm_obsdatain_path}}/{{atm_obsdatain_prefix}}{{observation_from_jcb}}{{atm_obsdatain_suffix}}" + obsdataout: + engine: + type: H5File + obsfile: "{{atm_obsdataout_path}}/{{atm_obsdataout_prefix}}{{observation_from_jcb}}{{atm_obsdataout_suffix}}" + io pool: + max pool size: 1 + simulated variables: [windEastward, windNorthward] + + obs operator: + name: VertInterp + hofx scaling field: SurfaceWindScalingPressure + hofx scaling field group: DerivedVariables + + 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 + + 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 + + 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 260 (VIIRS LWIR) + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 260 + 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: [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 + + # Reject any observation with a /=0 surface type (non-water surface) within + # 200 hPa of the surface pressure (as part of the LNVD check). + # CLEARED: maxvalue is rejecting >, not >= as per a Perform Action, so threshold is unchanged + - filter: Difference Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: + name: GeoVaLs/water_area_fraction + maxvalue: 0.99 + reference: GeoVaLs/surface_pressure + value: MetaData/pressure + maxvalue: -20000. # within 200 hPa above surface pressure, negative p-diff + action: + name: reject + + # LNVD check + # CLEARED: maxvalue is rejecting >, not >= as per a Perform Action, so threshold is unchanged + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: ObsFunction/SatWindsLNVDCheck + maxvalue: 3. + action: + name: reject + + # 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 + + # 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