diff --git a/parm/atm/berror/hybvar_bump.yaml b/parm/atm/berror/hybvar_bump.yaml.j2 similarity index 97% rename from parm/atm/berror/hybvar_bump.yaml rename to parm/atm/berror/hybvar_bump.yaml.j2 index 11398dccd..e0eae4713 100644 --- a/parm/atm/berror/hybvar_bump.yaml +++ b/parm/atm/berror/hybvar_bump.yaml.j2 @@ -10,7 +10,7 @@ components: active variables: &active_vars [psi,chi,t,ps,rh,liq_wat,o3mr] bump: io: - data directory: &staticb_dir $(DATA)/berror + data directory: &staticb_dir '{{ DATA }}/berror' drivers: multivariate strategy: specific_univariate read local nicas: true @@ -105,7 +105,7 @@ components: filename_sfcw: '{{ current_cycle | to_fv3time }}.fv_srf_wnd.res.nc' filename_cplr: '{{ current_cycle | to_fv3time }}.coupler.res' pattern: '%mem%' - nmembers: $(NMEM_ENS) + nmembers: {{ NMEM_ENS }} zero padding: 3 # localization: # localization method: SABER diff --git a/parm/atm/berror/hybvar_gsibec.yaml b/parm/atm/berror/hybvar_gsibec.yaml.j2 similarity index 89% rename from parm/atm/berror/hybvar_gsibec.yaml rename to parm/atm/berror/hybvar_gsibec.yaml.j2 index 4266b1b70..27570aaaa 100644 --- a/parm/atm/berror/hybvar_gsibec.yaml +++ b/parm/atm/berror/hybvar_gsibec.yaml.j2 @@ -5,12 +5,12 @@ components: saber central block: saber block name: gsi covariance read: - gsi akbk: &akbk $(DATA)/fv3jedi/akbk.nc4 - gsi error covariance file: &gsiberr $(DATA)/berror/gsi-coeffs-gfs-global.nc4 -# gsi error covariance file: &gsiberr $(DATA)/berror/global_berror.f77 - gsi berror namelist file: &gsibnml $(DATA)/berror/gfs_gsi_global.nml - processor layout x direction: &layout_gsib_x $(layout_gsib_x) - processor layout y direction: &layout_gsib_y $(layout_gsib_y) + gsi akbk: &akbk '{{ DATA }}/fv3jedi/akbk.nc4' + gsi error covariance file: &gsiberr '{{ DATA }}/berror/gsi-coeffs-gfs-global.nc4' +# gsi error covariance file: &gsiberr '{{ DATA }}/berror/global_berror.f77' + gsi berror namelist file: &gsibnml '{{ DATA }}/berror/gfs_gsi_global.nml' + processor layout x direction: &layout_gsib_x {{ layout_gsib_x }} + processor layout y direction: &layout_gsib_y {{ layout_gsib_y }} debugging mode: false saber outer blocks: - saber block name: gsi interpolation to model grid @@ -42,7 +42,7 @@ components: filename_sfcw: '{{ current_cycle | to_fv3time }}.fv_srf_wnd.res.nc' filename_cplr: '{{ current_cycle | to_fv3time }}.coupler.res' pattern: '%mem%' - nmembers: $(NMEM_ENS) + nmembers: {{ NMEM_ENS }} zero padding: 3 localization: localization method: SABER @@ -61,6 +61,8 @@ components: level for 2d variables: last nicas: resolution: 6 + min effective resolution: 0.2 # Note: this is very much not recommended (resolution too low), only + # used because covariance quality is not important for CI tests explicit length-scales: true horizontal length-scale: - groups: diff --git a/parm/atm/berror/staticb_bump.yaml b/parm/atm/berror/staticb_bump.yaml.j2 similarity index 97% rename from parm/atm/berror/staticb_bump.yaml rename to parm/atm/berror/staticb_bump.yaml.j2 index 8cabf7060..4c63e1c3f 100644 --- a/parm/atm/berror/staticb_bump.yaml +++ b/parm/atm/berror/staticb_bump.yaml.j2 @@ -8,7 +8,7 @@ saber blocks: active variables: &active_vars [psi,chi,t,ps,rh,liq_wat,o3mr] bump: io: - data directory: &staticb_dir $(DATA)/berror + data directory: &staticb_dir '{{ DATA }}/berror' drivers: multivariate strategy: specific_univariate read local nicas: true diff --git a/parm/atm/berror/staticb_gsibec.yaml b/parm/atm/berror/staticb_gsibec.yaml.j2 similarity index 64% rename from parm/atm/berror/staticb_gsibec.yaml rename to parm/atm/berror/staticb_gsibec.yaml.j2 index ba218842e..8fd02c070 100644 --- a/parm/atm/berror/staticb_gsibec.yaml +++ b/parm/atm/berror/staticb_gsibec.yaml.j2 @@ -3,12 +3,12 @@ full inverse: true saber central block: saber block name: gsi covariance read: - gsi akbk: &akbk $(DATA)/fv3jedi/akbk.nc4 - gsi error covariance file: &gsiberr $(DATA)/berror/gsi-coeffs-gfs-global.nc4 -# gsi error covariance file: &gsiberr $(DATA)/berror/global_berror.f77 - gsi berror namelist file: &gsibnml $(DATA)/berror/gfs_gsi_global.nml - processor layout x direction: &layout_gsib_x $(layout_gsib_x) - processor layout y direction: &layout_gsib_y $(layout_gsib_y) + gsi akbk: &akbk '{{ DATA }}/fv3jedi/akbk.nc4' + gsi error covariance file: &gsiberr '{{ DATA }}/berror/gsi-coeffs-gfs-global.nc4' +# gsi error covariance file: &gsiberr '{{ DATA }}/berror/global_berror.f77' + gsi berror namelist file: &gsibnml '{{ DATA }}/berror/gfs_gsi_global.nml' + processor layout x direction: &layout_gsib_x {{ layout_gsib_x }} + processor layout y direction: &layout_gsib_y {{ layout_gsib_y }} debugging mode: false saber outer blocks: - saber block name: gsi interpolation to model grid diff --git a/parm/atm/berror/staticb_identity.yaml b/parm/atm/berror/staticb_identity.yaml.j2 similarity index 100% rename from parm/atm/berror/staticb_identity.yaml rename to parm/atm/berror/staticb_identity.yaml.j2 diff --git a/parm/atm/hofx/hofx4d.yaml b/parm/atm/hofx/hofx4d.yaml.j2 similarity index 66% rename from parm/atm/hofx/hofx4d.yaml rename to parm/atm/hofx/hofx4d.yaml.j2 index bd961d55a..9c24720da 100644 --- a/parm/atm/hofx/hofx4d.yaml +++ b/parm/atm/hofx/hofx4d.yaml.j2 @@ -1,21 +1,21 @@ time window: begin: '{{ ATM_WINDOW_BEGIN | to_isotime }}' - length: $(ATM_WINDOW_LENGTH) -forecast length: $(ATM_WINDOW_LENGTH) + length: '{{ ATM_WINDOW_LENGTH }}' +forecast length: '{{ ATM_WINDOW_LENGTH }}' geometry: fms initialization: - namelist filename: $(DATA)/fv3jedi/fmsmpp.nml - field table filename: $(DATA)/fv3jedi/field_table - akbk: $(DATA)/fv3jedi/akbk.nc4 + namelist filename: '{{ DATA }}/fv3jedi/fmsmpp.nml' + field table filename: '{{ DATA }}/fv3jedi/field_table' + akbk: '{{ DATA }}/fv3jedi/akbk.nc4' layout: - - $(layout_x) - - $(layout_y) - npx: $(npx_ges) - npy: $(npy_ges) - npz: $(npz_ges) - field metadata override: $(DATA)/fv3jedi/fv3jedi_fieldmetadata_restart.yaml + - {{ layout_x }} + - {{ layout_y }} + npx: {{ npx_ges }} + npy: {{ npy_ges }} + npz: {{ npz_ges }} + field metadata override: '{{ DATA }}/fv3jedi/fv3jedi_fieldmetadata_restart.yaml' initial condition: - datapath: $(DATA)/bkg + datapath: '{{ DATA }}/bkg' filetype: fms restart datetime: '{{ ATM_WINDOW_BEGIN | to_isotime }}' filename_core: '{{ ATM_WINDOW_BEGIN | to_fv3time }}.fv_core.res.nc' @@ -28,7 +28,7 @@ initial condition: u_srf,v_srf,f10m] model: name: PSEUDO - datapath: $(DATA)/bkg + datapath: '{{ DATA }}/bkg' filetype: fms restart datetime: '{{ ATM_WINDOW_BEGIN | to_isotime }}' filename is datetime templated: true @@ -37,8 +37,12 @@ model: filename_sfcd: '%yyyy%mm%dd.%hh%MM%ss.sfc_data.nc' filename_sfcw: '%yyyy%mm%dd.%hh%MM%ss.fv_srf_wnd.res.nc' filename_cplr: '%yyyy%mm%dd.%hh%MM%ss.coupler.res' - tstep: $(BKG_TSTEP) + tstep: {{ BKG_TSTEP }} model variables: [ua,va,t,delp,sphum,ice_wat,liq_wat,o3mr,phis, slmsk,sheleg,tsea,vtype,stype,vfrac,stc,smc,snwdph, u_srf,v_srf,f10m] -observations: !INC ${OBS_LIST} +observations: +{% filter indent(width=2) %} +{% set atm_obs_list = 'OBS_LIST' | getenv('atm/obs/lists/gdas_prototype.yaml.j2') %} +{% include atm_obs_list %} +{% endfilter %} diff --git a/parm/atm/hofx/hofx_nomodel.yaml b/parm/atm/hofx/hofx_nomodel.yaml.j2 similarity index 54% rename from parm/atm/hofx/hofx_nomodel.yaml rename to parm/atm/hofx/hofx_nomodel.yaml.j2 index ec3551100..f49df0e53 100644 --- a/parm/atm/hofx/hofx_nomodel.yaml +++ b/parm/atm/hofx/hofx_nomodel.yaml.j2 @@ -1,20 +1,20 @@ time window: begin: '{{ ATM_WINDOW_BEGIN | to_isotime }}' - length: $(ATM_WINDOW_LENGTH) + length: '{{ ATM_WINDOW_LENGTH }}' geometry: fms initialization: - namelist filename: $(DATA)/fv3jedi/fmsmpp.nml - field table filename: $(DATA)/fv3jedi/field_table - akbk: $(DATA)/fv3jedi/akbk.nc4 + namelist filename: '{{ DATA }}/fv3jedi/fmsmpp.nml' + field table filename: '{{ DATA }}/fv3jedi/field_table' + akbk: '{{ DATA }}/fv3jedi/akbk.nc4' layout: - - $(layout_x) - - $(layout_y) - npx: $(npx_ges) - npy: $(npy_ges) - npz: $(npz_ges) - field metadata override: $(DATA)/fv3jedi/fv3jedi_fieldmetadata_restart.yaml + - {{ layout_x }} + - {{ layout_y }} + npx: {{ npx_ges }} + npy: {{ npy_ges }} + npz: {{ npz_ges }} + field metadata override: '{{ DATA }}/fv3jedi/fv3jedi_fieldmetadata_restart.yaml' state: - datapath: $(DATA)/bkg + datapath: '{{ DATA }}/bkg' filetype: fms restart datetime: '{{ current_cycle | to_isotime }}' filename_core: '{{ current_cycle | to_fv3time }}.fv_core.res.nc' @@ -25,4 +25,8 @@ state: state variables: [ua,va,t,delp,sphum,ice_wat,liq_wat,o3mr,phis, slmsk,sheleg,tsea,vtype,stype,vfrac,stc,smc,snwdph, u_srf,v_srf,f10m] -observations: !INC ${OBS_LIST} +observations: +{% filter indent(width=2) %} +{% set atm_obs_list = 'OBS_LIST' | getenv('atm/obs/lists/gdas_prototype.yaml.j2') %} +{% include atm_obs_list %} +{% endfilter %} diff --git a/parm/atm/hofx/hofx_ufotest.yaml b/parm/atm/hofx/hofx_ufotest.yaml deleted file mode 100644 index a1f29a1ef..000000000 --- a/parm/atm/hofx/hofx_ufotest.yaml +++ /dev/null @@ -1,4 +0,0 @@ -time window: - begin: '{{ATM_WINDOW_BEGIN}}' - end: '{{ATM_WINDOW_END}}' -observations: !INC ${OBS_LIST} diff --git a/parm/atm/hofx/hofx_ufotest.yaml.j2 b/parm/atm/hofx/hofx_ufotest.yaml.j2 new file mode 100644 index 000000000..85273ace0 --- /dev/null +++ b/parm/atm/hofx/hofx_ufotest.yaml.j2 @@ -0,0 +1,8 @@ +time window: + begin: '{{ ATM_WINDOW_BEGIN }}' + end: '{{ ATM_WINDOW_END }}' +observations: +{% filter indent(width=2) %} +{% set atm_obs_list = 'OBS_LIST' | getenv('atm/obs/lists/gdas_prototype.yaml.j2') %} +{% include atm_obs_list %} +{% endfilter %} diff --git a/parm/atm/lgetkf/lgetkf.yaml b/parm/atm/lgetkf/lgetkf.yaml.j2 similarity index 84% rename from parm/atm/lgetkf/lgetkf.yaml rename to parm/atm/lgetkf/lgetkf.yaml.j2 index d5086e3b2..4f156d213 100644 --- a/parm/atm/lgetkf/lgetkf.yaml +++ b/parm/atm/lgetkf/lgetkf.yaml.j2 @@ -4,15 +4,15 @@ geometry: field table filename: ./fv3jedi/field_table akbk: ./fv3jedi/akbk.nc4 layout: - - $(layout_x) - - $(layout_y) - npx: $(npx_ges) - npy: $(npy_ges) - npz: $(npz_ges) + - {{ layout_x }} + - {{ layout_y }} + npx: {{ npx_ges }} + npy: {{ npy_ges }} + npz: {{ npz_ges }} field metadata override: ./fv3jedi/fv3jedi_fieldmetadata_restart.yaml time window: begin: '{{ ATM_WINDOW_BEGIN | to_isotime }}' - length: $(ATM_WINDOW_LENGTH) + length: '{{ ATM_WINDOW_LENGTH }}' increment variables: [ua,va,DZ,delp,t,ps,sphum,ice_wat,liq_wat,o3mr] background: @@ -31,10 +31,14 @@ background: filename_sfcw: '{{ current_cycle | to_fv3time }}.fv_srf_wnd.res.nc' filename_cplr: '{{ current_cycle | to_fv3time }}.coupler.res' pattern: '%mem%' - nmembers: $(NMEM_ENS) + nmembers: {{ NMEM_ENS }} zero padding: 3 -observations: !INC ${OBS_LIST} +observations: +{% filter indent(width=2) %} +{% set atm_obs_list = 'OBS_LIST' | getenv('atm/obs/lists/lgetkf_prototype.yaml.j2') %} +{% include atm_obs_list %} +{% endfilter %} driver: update obs config with geometry info: true diff --git a/parm/atm/obs/config/aircraft.yaml b/parm/atm/obs/config/aircraft.yaml deleted file mode 100644 index e0d292e26..000000000 --- a/parm/atm/obs/config/aircraft.yaml +++ /dev/null @@ -1,330 +0,0 @@ -obs space: - name: Aircraft - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)aircraft.${{ current_cycle | to_YMDH }}.nc - obsgrouping: - group variables: ["stationIdentification"] - sort variable: "pressure" - sort order: "descending" - obsdataout: - engine: - type: H5File - obsfile: $(DATA)/diags/diag_aircraft_${{ current_cycle | to_YMDH }}.nc - io pool: - max pool size: 1 - simulated variables: [windEastward, windNorthward, airTemperature, specificHumidity] -# -obs operator: - name: VertInterp -# -obs filters: - # Observation Range Sanity Check - - filter: Bounds Check - filter variables: - - name: airTemperature - minvalue: 195 - maxvalue: 327 - action: - name: reject - # - - filter: Bounds Check - filter variables: - - name: specificHumidity - minvalue: 1.0E-7 - maxvalue: 0.034999999 - action: - name: reject - # - - filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - minvalue: -130 - maxvalue: 130 - action: - name: reject - # - - filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: ObsFunction/Velocity - maxvalue: 130.0 - action: - name: reject - # Reject when pressure is less than 126 mb. - - filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: MetaData/pressure - minvalue: 12600 - action: - name: reject - # - # Reject all obs with PreQC mark already set above 3 - # - filter: PreQC - # maxvalue: 3 - # action: - # name: reject - # - #-------------------------------------------------------------------------------------------------------------------- - # Wind - #-------------------------------------------------------------------------------------------------------------------- - # - # Begin by assigning all ObsError to a constant value. These will get overwritten (as needed) for specific types. - - filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - action: - name: assign error - error parameter: 2.0 # 2.0 m/s - # Assign intial ObsError specific to AIREP/ACARS - - filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - action: - name: assign error - error parameter: 3.6 # 3.6 m/s - where: - - variable: - name: ObsType/windEastward - is_in: 230 - # Assign intial ObsError specific to AMDAR - - filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - action: - name: assign error - error parameter: 3.0 # 3.0 m/s - where: - - variable: - name: ObsType/windEastward - is_in: 231 - # Assign intial ObsError specific to MDCRS - - filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - action: - name: assign error - error parameter: 2.5 # 2.5 m/s - where: - - variable: - name: ObsType/windEastward - is_in: 233 - # - - filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelStepwiseLinear - options: - xvar: - name: MetaData/pressure - xvals: [100000, 95000, 80000, 65000, 60000, 55000, 50000, 45000, 40000, 35000, 30000, 25000, 20000, 15000, 10000] #Pressure (Pa) - errors: [1.4, 1.5, 1.6, 1.8, 1.9, 2.0, 2.1, 2.3, 2.6, 2.8, 3.0, 3.2, 2.7, 2.4, 2.1] - # Assign the initial ObsError, based on height/pressure for RECON aircraft - - filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelStepwiseLinear - options: - xvar: - name: MetaData/pressure - xvals: [70000, 65000, 60000, 55000, 50000, 45000, 40000, 35000, 30000, 25000, 20000, 15000, 10000, 7500, 5000] - errors: [2.4, 2.5, 2.6, 2.7, 2.8, 2.95, 3.1, 3.25, 3.4, 3.175, 2.95, 2.725, 2.5, 2.6, 2.7] - where: - - variable: - name: ObsType/windEastward - is_in: 232 - # Reject when difference of wind direction is more than 50 degrees. - - filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: ObsFunction/WindDirAngleDiff - options: - minimum_uv: 3.5 - maxvalue: 50.0 - action: - name: reject - defer to post: true - # When multiple obs exist within a single vertical model level, inflate ObsError -# - filter: Perform Action -# filter variables: -# - name: windEastward -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# test QCflag: PreQC -# inflate variables: [windEastward] -# defer to post: true - # -# - filter: Perform Action -# filter variables: -# - name: windNorthward -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# test QCflag: PreQC -# inflate variables: [windNorthward] -# defer to post: true - # - # Gross error check with (O - B) / ObsError greater than threshold. - - filter: Background Check - filter variables: - - name: windEastward - - name: windNorthward - threshold: 6.0 - absolute threshold: 19.0 - action: - name: reject - # - #-------------------------------------------------------------------------------------------------------------------- - # Temperature - #-------------------------------------------------------------------------------------------------------------------- - # - # Begin by assigning all ObsError to a constant value. These will get overwritten for specific types. - - filter: Perform Action - filter variables: - - name: airTemperature - action: - name: assign error - error parameter: 2.0 # 2.0 K - # Assign the initial observation error, based on pressure (for AIREP/ACARS; itype=130) - - filter: Perform Action - filter variables: - - name: airTemperature - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelStepwiseLinear - options: - xvar: - name: MetaData/pressure - xvals: [100000, 95000, 90000, 85000, 80000] - errors: [2.5, 2.3, 2.1, 1.9, 1.7] - where: - - variable: - name: ObsType/airTemperature - is_in: 130 - # Assign the initial observation error, based on pressure (for AMDAR and MDCRS; itype=131,133) - - filter: Perform Action - filter variables: - - name: airTemperature - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelStepwiseLinear - options: - xvar: - name: MetaData/pressure - xvals: [100000, 95000, 90000, 85000, 80000] - errors: [1.4706, 1.3529, 1.2353, 1.1176, 1.0] - where: - - variable: - name: ObsType/airTemperature - is_in: 131,133 - # Assign the initial observation error, based on pressure (for RECON aircraft; itype=132) - - filter: Perform Action - filter variables: - - name: airTemperature - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelStepwiseLinear - options: - xvar: - name: MetaData/pressure - xvals: [100000, 95000, 90000, 85000, 35000, 30000, 25000, 20000, 15000, 10000, 7500, 5000, 4000, 3200, 2000, 1000] - errors: [1.2, 1.1, 0.9, 0.8, 0.8, 0.9, 1.2, 1.2, 1.0, 0.8, 0.8, 0.9, 0.95, 1.0, 1.25, 1.5] - where: - - variable: - name: ObsType/airTemperature - is_in: 132 - # When multiple obs exist within a single vertical model level, inflate ObsError -# - filter: Perform Action -# filter variables: -# - name: airTemperature -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# test QCflag: PreQC -# inflate variables: [airTemperature] -# defer to post: true - - # Gross error check with (O - B) / ObsError greater than threshold. - - filter: Background Check - filter variables: - - name: airTemperature - threshold: 7.0 - absolute threshold: 8.0 - action: - name: reject - # - #-------------------------------------------------------------------------------------------------------------------- - # Moisture - #-------------------------------------------------------------------------------------------------------------------- - # - # Assign the initial observation error, based on height/pressure ONLY MDCRS - - filter: Perform Action - filter variables: - - name: specificHumidity - 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] - errors: [.19455, .19062, .18488, .17877, .17342, .16976, .16777, .16696, .16605, .16522, .16637, .17086, - .17791, .18492, .18996, .19294, .19447, .19597, .19748, .19866, .19941, .19979, .19994, .19999, .2] - scale_factor_var: ObsValue/specificHumidity - where: - - variable: - name: ObsType/specificHumidity - is_in: 133 - # When multiple obs exist within a single vertical model level, inflate ObsError -# - filter: Perform Action -# filter variables: -# - name: specificHumidity -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# test QCflag: PreQC -# inflate variables: [specificHumidity] -# defer to post: true - - # Gross error check with (O - B) / ObsError greater than threshold. - - filter: Background Check - filter variables: - - name: specificHumidity - threshold: 8.0 - action: - name: reject diff --git a/parm/atm/obs/config/aircraft.yaml.j2 b/parm/atm/obs/config/aircraft.yaml.j2 new file mode 100644 index 000000000..353a0ab5f --- /dev/null +++ b/parm/atm/obs/config/aircraft.yaml.j2 @@ -0,0 +1,330 @@ +- obs space: + name: Aircraft + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}aircraft.{{ current_cycle | to_YMDH }}.nc' + obsgrouping: + group variables: ["stationIdentification"] + sort variable: "pressure" + sort order: "descending" + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_aircraft_{{ current_cycle | to_YMDH }}.nc' + io pool: + max pool size: 1 + simulated variables: [windEastward, windNorthward, airTemperature, specificHumidity] + # + obs operator: + name: VertInterp + # + obs filters: + # Observation Range Sanity Check + - filter: Bounds Check + filter variables: + - name: airTemperature + minvalue: 195 + maxvalue: 327 + action: + name: reject + # + - filter: Bounds Check + filter variables: + - name: specificHumidity + minvalue: 1.0E-7 + maxvalue: 0.034999999 + action: + name: reject + # + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + minvalue: -130 + maxvalue: 130 + action: + name: reject + # + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: ObsFunction/Velocity + maxvalue: 130.0 + action: + name: reject + # Reject when pressure is less than 126 mb. + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: MetaData/pressure + minvalue: 12600 + action: + name: reject + # + # Reject all obs with PreQC mark already set above 3 + # - filter: PreQC + # maxvalue: 3 + # action: + # name: reject + # + #-------------------------------------------------------------------------------------------------------------------- + # Wind + #-------------------------------------------------------------------------------------------------------------------- + # + # Begin by assigning all ObsError to a constant value. These will get overwritten (as needed) for specific types. + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + action: + name: assign error + error parameter: 2.0 # 2.0 m/s + # Assign intial ObsError specific to AIREP/ACARS + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + action: + name: assign error + error parameter: 3.6 # 3.6 m/s + where: + - variable: + name: ObsType/windEastward + is_in: 230 + # Assign intial ObsError specific to AMDAR + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + action: + name: assign error + error parameter: 3.0 # 3.0 m/s + where: + - variable: + name: ObsType/windEastward + is_in: 231 + # Assign intial ObsError specific to MDCRS + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + action: + name: assign error + error parameter: 2.5 # 2.5 m/s + where: + - variable: + name: ObsType/windEastward + is_in: 233 + # + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + xvar: + name: MetaData/pressure + xvals: [100000, 95000, 80000, 65000, 60000, 55000, 50000, 45000, 40000, 35000, 30000, 25000, 20000, 15000, 10000] #Pressure (Pa) + errors: [1.4, 1.5, 1.6, 1.8, 1.9, 2.0, 2.1, 2.3, 2.6, 2.8, 3.0, 3.2, 2.7, 2.4, 2.1] + # Assign the initial ObsError, based on height/pressure for RECON aircraft + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + xvar: + name: MetaData/pressure + xvals: [70000, 65000, 60000, 55000, 50000, 45000, 40000, 35000, 30000, 25000, 20000, 15000, 10000, 7500, 5000] + errors: [2.4, 2.5, 2.6, 2.7, 2.8, 2.95, 3.1, 3.25, 3.4, 3.175, 2.95, 2.725, 2.5, 2.6, 2.7] + where: + - variable: + name: ObsType/windEastward + is_in: 232 + # Reject when difference of wind direction is more than 50 degrees. + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: ObsFunction/WindDirAngleDiff + options: + minimum_uv: 3.5 + maxvalue: 50.0 + action: + name: reject + defer to post: true + # When multiple obs exist within a single vertical model level, inflate ObsError + # - filter: Perform Action + # filter variables: + # - name: windEastward + # action: + # name: inflate error + # inflation variable: + # name: ObsFunction/ObsErrorFactorConventional + # options: + # test QCflag: PreQC + # inflate variables: [windEastward] + # defer to post: true + # + # - filter: Perform Action + # filter variables: + # - name: windNorthward + # action: + # name: inflate error + # inflation variable: + # name: ObsFunction/ObsErrorFactorConventional + # options: + # test QCflag: PreQC + # inflate variables: [windNorthward] + # defer to post: true + # + # Gross error check with (O - B) / ObsError greater than threshold. + - filter: Background Check + filter variables: + - name: windEastward + - name: windNorthward + threshold: 6.0 + absolute threshold: 19.0 + action: + name: reject + # + #-------------------------------------------------------------------------------------------------------------------- + # Temperature + #-------------------------------------------------------------------------------------------------------------------- + # + # Begin by assigning all ObsError to a constant value. These will get overwritten for specific types. + - filter: Perform Action + filter variables: + - name: airTemperature + action: + name: assign error + error parameter: 2.0 # 2.0 K + # Assign the initial observation error, based on pressure (for AIREP/ACARS; itype=130) + - filter: Perform Action + filter variables: + - name: airTemperature + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + xvar: + name: MetaData/pressure + xvals: [100000, 95000, 90000, 85000, 80000] + errors: [2.5, 2.3, 2.1, 1.9, 1.7] + where: + - variable: + name: ObsType/airTemperature + is_in: 130 + # Assign the initial observation error, based on pressure (for AMDAR and MDCRS; itype=131,133) + - filter: Perform Action + filter variables: + - name: airTemperature + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + xvar: + name: MetaData/pressure + xvals: [100000, 95000, 90000, 85000, 80000] + errors: [1.4706, 1.3529, 1.2353, 1.1176, 1.0] + where: + - variable: + name: ObsType/airTemperature + is_in: 131,133 + # Assign the initial observation error, based on pressure (for RECON aircraft; itype=132) + - filter: Perform Action + filter variables: + - name: airTemperature + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + xvar: + name: MetaData/pressure + xvals: [100000, 95000, 90000, 85000, 35000, 30000, 25000, 20000, 15000, 10000, 7500, 5000, 4000, 3200, 2000, 1000] + errors: [1.2, 1.1, 0.9, 0.8, 0.8, 0.9, 1.2, 1.2, 1.0, 0.8, 0.8, 0.9, 0.95, 1.0, 1.25, 1.5] + where: + - variable: + name: ObsType/airTemperature + is_in: 132 + # When multiple obs exist within a single vertical model level, inflate ObsError + # - filter: Perform Action + # filter variables: + # - name: airTemperature + # action: + # name: inflate error + # inflation variable: + # name: ObsFunction/ObsErrorFactorConventional + # options: + # test QCflag: PreQC + # inflate variables: [airTemperature] + # defer to post: true + + # Gross error check with (O - B) / ObsError greater than threshold. + - filter: Background Check + filter variables: + - name: airTemperature + threshold: 7.0 + absolute threshold: 8.0 + action: + name: reject + # + #-------------------------------------------------------------------------------------------------------------------- + # Moisture + #-------------------------------------------------------------------------------------------------------------------- + # + # Assign the initial observation error, based on height/pressure ONLY MDCRS + - filter: Perform Action + filter variables: + - name: specificHumidity + 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] + errors: [.19455, .19062, .18488, .17877, .17342, .16976, .16777, .16696, .16605, .16522, .16637, .17086, + .17791, .18492, .18996, .19294, .19447, .19597, .19748, .19866, .19941, .19979, .19994, .19999, .2] + scale_factor_var: ObsValue/specificHumidity + where: + - variable: + name: ObsType/specificHumidity + is_in: 133 + # When multiple obs exist within a single vertical model level, inflate ObsError + # - filter: Perform Action + # filter variables: + # - name: specificHumidity + # action: + # name: inflate error + # inflation variable: + # name: ObsFunction/ObsErrorFactorConventional + # options: + # test QCflag: PreQC + # inflate variables: [specificHumidity] + # defer to post: true + + # Gross error check with (O - B) / ObsError greater than threshold. + - filter: Background Check + filter variables: + - name: specificHumidity + threshold: 8.0 + action: + name: reject diff --git a/parm/atm/obs/config/amsua_n19.yaml b/parm/atm/obs/config/amsua_n19.yaml deleted file mode 100644 index d866569b6..000000000 --- a/parm/atm/obs/config/amsua_n19.yaml +++ /dev/null @@ -1,367 +0,0 @@ -obs space: - name: amsua_n19 - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)amsua_n19.{{ current_cycle | to_YMDH }}.nc - obsdataout: - engine: - type: H5File - obsfile: $(DATA)/diags/diag_amsua_n19_{{ current_cycle | to_YMDH }}.nc - io pool: - max pool size: 1 - simulated variables: [brightnessTemperature] - channels: &amsua_n19_channels 1-15 -obs operator: - name: CRTM - Absorbers: [H2O,O3] - Clouds: [Water, Ice] - Cloud_Fraction: 1.0 - obs options: - Sensor_ID: amsua_n19 - EndianType: little_endian - CoefficientPath: $(DATA)/crtm/ -obs bias: - input file: $(DATA)/obs/$(GPREFIX)amsua_n19.satbias.nc - output file: $(DATA)/bc/$(APREFIX)amsua_n19.satbias.nc - variational bc: - predictors: - - name: constant - - name: lapse_rate - order: 2 - tlapse: &amsua_n19_tlapse $(DATA)/obs/$(GPREFIX)amsua_n19.tlapse.txt - - name: lapse_rate - tlapse: *amsua_n19_tlapse - - name: emissivity - - name: scan_angle - order: 4 - - name: scan_angle - order: 3 - - name: scan_angle - order: 2 - - name: scan_angle - covariance: - minimal required obs number: 20 - variance range: [1.0e-6, 10.0] - step size: 1.0e-4 - largest analysis variance: 10000.0 - prior: - input file: $(DATA)/obs/$(GPREFIX)amsua_n19.satbias_cov.nc - inflation: - ratio: 1.1 - ratio for small dataset: 2.0 - output file: $(DATA)/bc/$(APREFIX)amsua_n19.satbias_cov.nc -obs filters: -- filter: BlackList - filter variables: - - name: brightnessTemperature - channels: *amsua_n19_channels - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelRamp - channels: *amsua_n19_channels - options: - channels: *amsua_n19_channels - xvar: - name: ObsFunction/CLWRetSymmetricMW - options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [ObsValue, HofX] - x0: [ 0.050, 0.030, 0.030, 0.020, 0.000, - 0.100, 0.000, 0.000, 0.000, 0.000, - 0.000, 0.000, 0.000, 0.000, 0.030] - x1: [ 0.600, 0.450, 0.400, 0.450, 1.000, - 1.500, 0.000, 0.000, 0.000, 0.000, - 0.000, 0.000, 0.000, 0.000, 0.200] - err0: [ 2.500, 2.200, 2.000, 0.550, 0.300, - 0.230, 0.230, 0.250, 0.250, 0.350, - 0.400, 0.550, 0.800, 3.000, 3.500] - err1: [20.000, 18.000, 12.000, 3.000, 0.500, - 0.300, 0.230, 0.250, 0.250, 0.350, - 0.400, 0.550, 0.800, 3.000, 18.000] -# CLW Retrieval Check -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: 1-6, 15 - test variables: - - name: ObsFunction/CLWRetMW - options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [ObsValue] - maxvalue: 999.0 - action: - name: reject -# CLW Retrieval Check -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: 1-6, 15 - test variables: - - name: ObsFunction/CLWRetMW - options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [HofX] - maxvalue: 999.0 - action: - name: reject -# Hydrometeor Check (cloud/precipitation affected chanels) -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: *amsua_n19_channels - test variables: - - name: ObsFunction/HydrometeorCheckAMSUA - channels: *amsua_n19_channels - options: - channels: *amsua_n19_channels - obserr_clearsky: [ 2.500, 2.200, 2.000, 0.550, 0.300, - 0.230, 0.230, 0.250, 0.250, 0.350, - 0.400, 0.550, 0.800, 3.000, 3.500] - clwret_function: - name: ObsFunction/CLWRetMW - options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [ObsValue] - obserr_function: - name: ObsFunction/ObsErrorModelRamp - channels: *amsua_n19_channels - options: - channels: *amsua_n19_channels - xvar: - name: ObsFunction/CLWRetSymmetricMW - options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [ObsValue, HofX] - x0: [ 0.050, 0.030, 0.030, 0.020, 0.000, - 0.100, 0.000, 0.000, 0.000, 0.000, - 0.000, 0.000, 0.000, 0.000, 0.030] - x1: [ 0.600, 0.450, 0.400, 0.450, 1.000, - 1.500, 0.000, 0.000, 0.000, 0.000, - 0.000, 0.000, 0.000, 0.000, 0.200] - err0: [ 2.500, 2.200, 2.000, 0.550, 0.300, - 0.230, 0.230, 0.250, 0.250, 0.350, - 0.400, 0.550, 0.800, 3.000, 3.500] - err1: [20.000, 18.000, 12.000, 3.000, 0.500, - 0.300, 0.230, 0.250, 0.250, 0.350, - 0.400, 0.550, 0.800, 3.000, 18.000] - maxvalue: 0.0 - action: - name: reject -# Topography check -- filter: BlackList - filter variables: - - name: brightnessTemperature - channels: *amsua_n19_channels - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorTopoRad - channels: *amsua_n19_channels - options: - sensor: amsua_n19 - channels: *amsua_n19_channels -# Transmittnace Top Check -- filter: BlackList - filter variables: - - name: brightnessTemperature - channels: *amsua_n19_channels - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorTransmitTopRad - channels: *amsua_n19_channels - options: - sensor: amsua_n19 - channels: *amsua_n19_channels -# Surface Jacobian check -- filter: BlackList - filter variables: - - name: brightnessTemperature - channels: *amsua_n19_channels - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorSurfJacobianRad - channels: *amsua_n19_channels - options: - sensor: amsua_n19 - channels: *amsua_n19_channels - obserr_demisf: [0.010, 0.020, 0.015, 0.020, 0.200] - obserr_dtempf: [0.500, 2.000, 1.000, 2.000, 4.500] -# Situation dependent Check -- filter: BlackList - filter variables: - - name: brightnessTemperature - channels: *amsua_n19_channels - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorSituDependMW - channels: *amsua_n19_channels - options: - sensor: amsua_n19 - channels: *amsua_n19_channels - clwobs_function: - name: ObsFunction/CLWRetMW - options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [ObsValue] - clwbkg_function: - name: ObsFunction/CLWRetMW - options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [HofX] - bias_application: HofX - scatobs_function: - name: ObsFunction/SCATRetMW - options: - scatret_ch238: 1 - scatret_ch314: 2 - scatret_ch890: 15 - scatret_types: [ObsValue] - bias_application: HofX - clwmatchidx_function: - name: ObsFunction/CLWMatchIndexMW - channels: *amsua_n19_channels - options: - channels: *amsua_n19_channels - clwobs_function: - name: ObsFunction/CLWRetMW - options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [ObsValue] - clwbkg_function: - name: ObsFunction/CLWRetMW - options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [HofX] - bias_application: HofX - clwret_clearsky: [0.050, 0.030, 0.030, 0.020, 0.000, - 0.100, 0.000, 0.000, 0.000, 0.000, - 0.000, 0.000, 0.000, 0.000, 0.030] - obserr_function: - name: ObsFunction/ObsErrorModelRamp - channels: *amsua_n19_channels - options: - channels: *amsua_n19_channels - xvar: - name: ObsFunction/CLWRetSymmetricMW - options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [ObsValue, HofX] - x0: [ 0.050, 0.030, 0.030, 0.020, 0.000, - 0.100, 0.000, 0.000, 0.000, 0.000, - 0.000, 0.000, 0.000, 0.000, 0.030] - x1: [ 0.600, 0.450, 0.400, 0.450, 1.000, - 1.500, 0.000, 0.000, 0.000, 0.000, - 0.000, 0.000, 0.000, 0.000, 0.200] - err0: [ 2.500, 2.200, 2.000, 0.550, 0.300, - 0.230, 0.230, 0.250, 0.250, 0.350, - 0.400, 0.550, 0.800, 3.000, 3.500] - err1: [20.000, 18.000, 12.000, 3.000, 0.500, - 0.300, 0.230, 0.250, 0.250, 0.350, - 0.400, 0.550, 0.800, 3.000, 18.000] - obserr_clearsky: [2.500, 2.200, 2.000, 0.550, 0.300, - 0.230, 0.230, 0.250, 0.250, 0.350, - 0.400, 0.550, 0.800, 3.000, 3.500] -# Gross check -- filter: Background Check - filter variables: - - name: brightnessTemperature - channels: *amsua_n19_channels - function absolute threshold: - - name: ObsFunction/ObsErrorBoundMW - channels: *amsua_n19_channels - options: - sensor: amsua_n19 - channels: *amsua_n19_channels - obserr_bound_latitude: - name: ObsFunction/ObsErrorFactorLatRad - options: - latitude_parameters: [25.0, 0.25, 0.04, 3.0] - obserr_bound_transmittop: - name: ObsFunction/ObsErrorFactorTransmitTopRad - channels: *amsua_n19_channels - options: - channels: *amsua_n19_channels - obserr_bound_topo: - name: ObsFunction/ObsErrorFactorTopoRad - channels: *amsua_n19_channels - options: - channels: *amsua_n19_channels - sensor: amsua_n19 - obserr_function: - name: ObsFunction/ObsErrorModelRamp - channels: *amsua_n19_channels - options: - channels: *amsua_n19_channels - xvar: - name: ObsFunction/CLWRetSymmetricMW - options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [ObsValue, HofX] - bias_application: HofX - x0: [ 0.050, 0.030, 0.030, 0.020, 0.000, - 0.100, 0.000, 0.000, 0.000, 0.000, - 0.000, 0.000, 0.000, 0.000, 0.030] - x1: [ 0.600, 0.450, 0.400, 0.450, 1.000, - 1.500, 0.000, 0.000, 0.000, 0.000, - 0.000, 0.000, 0.000, 0.000, 0.200] - err0: [ 2.500, 2.200, 2.000, 0.550, 0.300, - 0.230, 0.230, 0.250, 0.250, 0.350, - 0.400, 0.550, 0.800, 3.000, 3.500] - err1: [20.000, 18.000, 12.000, 3.000, 0.500, - 0.300, 0.230, 0.250, 0.250, 0.350, - 0.400, 0.550, 0.800, 3.000, 18.000] - obserr_bound_max: [4.5, 4.5, 4.5, 2.5, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, - 2.5, 3.5, 4.5, 4.5, 4.5] - action: - name: reject -# Inter-channel check -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: *amsua_n19_channels - test variables: - - name: ObsFunction/InterChannelConsistencyCheck - channels: *amsua_n19_channels - options: - channels: *amsua_n19_channels - sensor: amsua_n19 - use_flag: [ 1, 1, 1, 1, 1, - 1, -1, -1, 1, 1, - 1, 1, 1, -1, 1 ] - maxvalue: 1.0e-12 - action: - name: reject -# Useflag check -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: *amsua_n19_channels - test variables: - - name: ObsFunction/ChannelUseflagCheckRad - channels: *amsua_n19_channels - options: - sensor: amsua_n19 - channels: *amsua_n19_channels - use_flag: [ 1, 1, 1, 1, 1, - 1, -1, -1, 1, 1, - 1, 1, 1, -1, 1 ] - minvalue: 1.0e-12 - action: - name: reject diff --git a/parm/atm/obs/config/amsua_n19.yaml.j2 b/parm/atm/obs/config/amsua_n19.yaml.j2 new file mode 100644 index 000000000..06ec22687 --- /dev/null +++ b/parm/atm/obs/config/amsua_n19.yaml.j2 @@ -0,0 +1,367 @@ +- obs space: + name: amsua_n19 + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}amsua_n19.{{ current_cycle | to_YMDH }}.nc' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_amsua_n19_{{ current_cycle | to_YMDH }}.nc' + io pool: + max pool size: 1 + simulated variables: [brightnessTemperature] + channels: &amsua_n19_channels 1-15 + obs operator: + name: CRTM + Absorbers: [H2O,O3] + Clouds: [Water, Ice] + Cloud_Fraction: 1.0 + obs options: + Sensor_ID: amsua_n19 + EndianType: little_endian + CoefficientPath: '{{ DATA }}/crtm/' + obs bias: + input file: '{{ DATA }}/obs/{{ GPREFIX }}amsua_n19.satbias.nc' + output file: '{{ DATA }}/bc/{{ APREFIX }}amsua_n19.satbias.nc' + variational bc: + predictors: + - name: constant + - name: lapse_rate + order: 2 + tlapse: &amsua_n19_tlapse '{{ DATA }}/obs/{{ GPREFIX }}amsua_n19.tlapse.txt' + - name: lapse_rate + tlapse: *amsua_n19_tlapse + - name: emissivity + - name: scan_angle + order: 4 + - name: scan_angle + order: 3 + - name: scan_angle + order: 2 + - name: scan_angle + covariance: + minimal required obs number: 20 + variance range: [1.0e-6, 10.0] + step size: 1.0e-4 + largest analysis variance: 10000.0 + prior: + input file: '{{ DATA }}/obs/{{ GPREFIX }}amsua_n19.satbias_cov.nc' + inflation: + ratio: 1.1 + ratio for small dataset: 2.0 + output file: '{{ DATA }}/bc/{{ APREFIX }}amsua_n19.satbias_cov.nc' + obs filters: + - filter: BlackList + filter variables: + - name: brightnessTemperature + channels: *amsua_n19_channels + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelRamp + channels: *amsua_n19_channels + options: + channels: *amsua_n19_channels + xvar: + name: ObsFunction/CLWRetSymmetricMW + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [ObsValue, HofX] + x0: [ 0.050, 0.030, 0.030, 0.020, 0.000, + 0.100, 0.000, 0.000, 0.000, 0.000, + 0.000, 0.000, 0.000, 0.000, 0.030] + x1: [ 0.600, 0.450, 0.400, 0.450, 1.000, + 1.500, 0.000, 0.000, 0.000, 0.000, + 0.000, 0.000, 0.000, 0.000, 0.200] + err0: [ 2.500, 2.200, 2.000, 0.550, 0.300, + 0.230, 0.230, 0.250, 0.250, 0.350, + 0.400, 0.550, 0.800, 3.000, 3.500] + err1: [20.000, 18.000, 12.000, 3.000, 0.500, + 0.300, 0.230, 0.250, 0.250, 0.350, + 0.400, 0.550, 0.800, 3.000, 18.000] + # CLW Retrieval Check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: 1-6, 15 + test variables: + - name: ObsFunction/CLWRetMW + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [ObsValue] + maxvalue: 999.0 + action: + name: reject + # CLW Retrieval Check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: 1-6, 15 + test variables: + - name: ObsFunction/CLWRetMW + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [HofX] + maxvalue: 999.0 + action: + name: reject + # Hydrometeor Check (cloud/precipitation affected chanels) + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *amsua_n19_channels + test variables: + - name: ObsFunction/HydrometeorCheckAMSUA + channels: *amsua_n19_channels + options: + channels: *amsua_n19_channels + obserr_clearsky: [ 2.500, 2.200, 2.000, 0.550, 0.300, + 0.230, 0.230, 0.250, 0.250, 0.350, + 0.400, 0.550, 0.800, 3.000, 3.500] + clwret_function: + name: ObsFunction/CLWRetMW + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [ObsValue] + obserr_function: + name: ObsFunction/ObsErrorModelRamp + channels: *amsua_n19_channels + options: + channels: *amsua_n19_channels + xvar: + name: ObsFunction/CLWRetSymmetricMW + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [ObsValue, HofX] + x0: [ 0.050, 0.030, 0.030, 0.020, 0.000, + 0.100, 0.000, 0.000, 0.000, 0.000, + 0.000, 0.000, 0.000, 0.000, 0.030] + x1: [ 0.600, 0.450, 0.400, 0.450, 1.000, + 1.500, 0.000, 0.000, 0.000, 0.000, + 0.000, 0.000, 0.000, 0.000, 0.200] + err0: [ 2.500, 2.200, 2.000, 0.550, 0.300, + 0.230, 0.230, 0.250, 0.250, 0.350, + 0.400, 0.550, 0.800, 3.000, 3.500] + err1: [20.000, 18.000, 12.000, 3.000, 0.500, + 0.300, 0.230, 0.250, 0.250, 0.350, + 0.400, 0.550, 0.800, 3.000, 18.000] + maxvalue: 0.0 + action: + name: reject + # Topography check + - filter: BlackList + filter variables: + - name: brightnessTemperature + channels: *amsua_n19_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorTopoRad + channels: *amsua_n19_channels + options: + sensor: amsua_n19 + channels: *amsua_n19_channels + # Transmittnace Top Check + - filter: BlackList + filter variables: + - name: brightnessTemperature + channels: *amsua_n19_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorTransmitTopRad + channels: *amsua_n19_channels + options: + sensor: amsua_n19 + channels: *amsua_n19_channels + # Surface Jacobian check + - filter: BlackList + filter variables: + - name: brightnessTemperature + channels: *amsua_n19_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorSurfJacobianRad + channels: *amsua_n19_channels + options: + sensor: amsua_n19 + channels: *amsua_n19_channels + obserr_demisf: [0.010, 0.020, 0.015, 0.020, 0.200] + obserr_dtempf: [0.500, 2.000, 1.000, 2.000, 4.500] + # Situation dependent Check + - filter: BlackList + filter variables: + - name: brightnessTemperature + channels: *amsua_n19_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorSituDependMW + channels: *amsua_n19_channels + options: + sensor: amsua_n19 + channels: *amsua_n19_channels + clwobs_function: + name: ObsFunction/CLWRetMW + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [ObsValue] + clwbkg_function: + name: ObsFunction/CLWRetMW + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [HofX] + bias_application: HofX + scatobs_function: + name: ObsFunction/SCATRetMW + options: + scatret_ch238: 1 + scatret_ch314: 2 + scatret_ch890: 15 + scatret_types: [ObsValue] + bias_application: HofX + clwmatchidx_function: + name: ObsFunction/CLWMatchIndexMW + channels: *amsua_n19_channels + options: + channels: *amsua_n19_channels + clwobs_function: + name: ObsFunction/CLWRetMW + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [ObsValue] + clwbkg_function: + name: ObsFunction/CLWRetMW + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [HofX] + bias_application: HofX + clwret_clearsky: [0.050, 0.030, 0.030, 0.020, 0.000, + 0.100, 0.000, 0.000, 0.000, 0.000, + 0.000, 0.000, 0.000, 0.000, 0.030] + obserr_function: + name: ObsFunction/ObsErrorModelRamp + channels: *amsua_n19_channels + options: + channels: *amsua_n19_channels + xvar: + name: ObsFunction/CLWRetSymmetricMW + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [ObsValue, HofX] + x0: [ 0.050, 0.030, 0.030, 0.020, 0.000, + 0.100, 0.000, 0.000, 0.000, 0.000, + 0.000, 0.000, 0.000, 0.000, 0.030] + x1: [ 0.600, 0.450, 0.400, 0.450, 1.000, + 1.500, 0.000, 0.000, 0.000, 0.000, + 0.000, 0.000, 0.000, 0.000, 0.200] + err0: [ 2.500, 2.200, 2.000, 0.550, 0.300, + 0.230, 0.230, 0.250, 0.250, 0.350, + 0.400, 0.550, 0.800, 3.000, 3.500] + err1: [20.000, 18.000, 12.000, 3.000, 0.500, + 0.300, 0.230, 0.250, 0.250, 0.350, + 0.400, 0.550, 0.800, 3.000, 18.000] + obserr_clearsky: [2.500, 2.200, 2.000, 0.550, 0.300, + 0.230, 0.230, 0.250, 0.250, 0.350, + 0.400, 0.550, 0.800, 3.000, 3.500] + # Gross check + - filter: Background Check + filter variables: + - name: brightnessTemperature + channels: *amsua_n19_channels + function absolute threshold: + - name: ObsFunction/ObsErrorBoundMW + channels: *amsua_n19_channels + options: + sensor: amsua_n19 + channels: *amsua_n19_channels + obserr_bound_latitude: + name: ObsFunction/ObsErrorFactorLatRad + options: + latitude_parameters: [25.0, 0.25, 0.04, 3.0] + obserr_bound_transmittop: + name: ObsFunction/ObsErrorFactorTransmitTopRad + channels: *amsua_n19_channels + options: + channels: *amsua_n19_channels + obserr_bound_topo: + name: ObsFunction/ObsErrorFactorTopoRad + channels: *amsua_n19_channels + options: + channels: *amsua_n19_channels + sensor: amsua_n19 + obserr_function: + name: ObsFunction/ObsErrorModelRamp + channels: *amsua_n19_channels + options: + channels: *amsua_n19_channels + xvar: + name: ObsFunction/CLWRetSymmetricMW + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [ObsValue, HofX] + bias_application: HofX + x0: [ 0.050, 0.030, 0.030, 0.020, 0.000, + 0.100, 0.000, 0.000, 0.000, 0.000, + 0.000, 0.000, 0.000, 0.000, 0.030] + x1: [ 0.600, 0.450, 0.400, 0.450, 1.000, + 1.500, 0.000, 0.000, 0.000, 0.000, + 0.000, 0.000, 0.000, 0.000, 0.200] + err0: [ 2.500, 2.200, 2.000, 0.550, 0.300, + 0.230, 0.230, 0.250, 0.250, 0.350, + 0.400, 0.550, 0.800, 3.000, 3.500] + err1: [20.000, 18.000, 12.000, 3.000, 0.500, + 0.300, 0.230, 0.250, 0.250, 0.350, + 0.400, 0.550, 0.800, 3.000, 18.000] + obserr_bound_max: [4.5, 4.5, 4.5, 2.5, 2.0, + 2.0, 2.0, 2.0, 2.0, 2.0, + 2.5, 3.5, 4.5, 4.5, 4.5] + action: + name: reject + # Inter-channel check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *amsua_n19_channels + test variables: + - name: ObsFunction/InterChannelConsistencyCheck + channels: *amsua_n19_channels + options: + channels: *amsua_n19_channels + sensor: amsua_n19 + use_flag: [ 1, 1, 1, 1, 1, + 1, -1, -1, 1, 1, + 1, 1, 1, -1, 1 ] + maxvalue: 1.0e-12 + action: + name: reject + # Useflag check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *amsua_n19_channels + test variables: + - name: ObsFunction/ChannelUseflagCheckRad + channels: *amsua_n19_channels + options: + sensor: amsua_n19 + channels: *amsua_n19_channels + use_flag: [ 1, 1, 1, 1, 1, + 1, -1, -1, 1, 1, + 1, 1, 1, -1, 1 ] + minvalue: 1.0e-12 + action: + name: reject diff --git a/parm/atm/obs/config/atms_n20.yaml b/parm/atm/obs/config/atms_n20.yaml deleted file mode 100644 index d32ce2489..000000000 --- a/parm/atm/obs/config/atms_n20.yaml +++ /dev/null @@ -1,557 +0,0 @@ -obs space: - name: atms_n20 - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)atms_n20.tm00.nc - obsdataout: - engine: - type: H5File - obsfile: $(DATA)/diags/diag_atms_n20_{{ current_cycle | to_YMDH }}.nc - io pool: - max pool size: 1 - simulated variables: [brightnessTemperature] - channels: &atms_n20_channels 1-22 - -obs operator: - name: CRTM - Absorbers: [H2O, O3, CO2] - Clouds: [Water, Ice] - Cloud_Fraction: 1.0 - Cloud_Seeding: true - obs options: - Sensor_ID: &Sensor_ID atms_n20 - EndianType: little_endian - CoefficientPath: $(DATA)/crtm/ - linear obs operator: - Absorbers: [H2O, O3] - -obs bias: - input file: $(DATA)/obs/$(GPREFIX)atms_n20.satbias.nc - output file: $(DATA)/bc/$(APREFIX)atms_n20.satbias.nc - variational bc: - predictors: - - name: constant - - name: lapse_rate - order: 2 - tlapse: &atms_n20_tlapse $(DATA)/obs/$(GPREFIX)atms_n20.tlapse.txt - - name: lapse_rate - tlapse: *atms_n20_tlapse - - name: emissivity - - name: scan_angle - order: 4 - - name: scan_angle - order: 3 - - name: scan_angle - order: 2 - - name: scan_angle - covariance: - minimal required obs number: 20 - variance range: [1.0e-6, 10.0] - step size: 1.0e-4 - largest analysis variance: 10000.0 - prior: - input file: $(DATA)/obs/$(GPREFIX)atms_n20.satbias_cov.nc - inflation: - ratio: 1.1 - ratio for small dataset: 2.0 - output file: $(DATA)/bc/$(APREFIX)atms_n20.satbias_cov.nc - -obs pre filters: -# Step 0-A: Create Diagnostic Flags -- filter: Create Diagnostic Flags - filter variables: - - name: brightnessTemperature - channels: *atms_n20_channels - flags: - - name: ScanEdgeRemoval - initial value: false - force reinitialization: false - - name: Thinning - initial value: false - force reinitialization: false - - name: CLWRetrievalCheck - initial value: false - force reinitialization: false - - name: WindowChannelExtremeResidual - initial value: false - force reinitialization: false - - name: HydrometeorCheck - initial value: false - force reinitialization: false - - name: GrossCheck - initial value: false - force reinitialization: false - - name: InterChannelConsistency - initial value: false - force reinitialization: false - - name: UseflagCheck - initial value: false - force reinitialization: false - -obs post filters: -# Step 0-B: Calculate derived variables -# Calculate CLW retrieved from observation -- filter: Variable Assignment - assignments: - - name: CLWRetFromObs@DerivedMetaData - type: float - function: - name: CLWRetMW@ObsFunction - options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [ObsValue] - -# Calculate CLW retrieved from observation -- filter: Variable Assignment - assignments: - - name: CLWRetFromBkg@DerivedMetaData - type: float - function: - name: CLWRetMW@ObsFunction - options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [HofX] - -# Calculate symmetric retrieved CLW -- filter: Variable Assignment - assignments: - - name: CLWRetSymmetric@DerivedMetaData - type: float - value: 1000.0 - -- filter: Variable Assignment - where: - - variable: - name: CLWRetFromObs@DerivedMetaData - minvalue: 0. - maxvalue: 999. - - variable: - name: CLWRetFromBkg@DerivedMetaData - minvalue: 0. - maxvalue: 999. - where operator: and - assignments: - - name: CLWRetSymmetric@DerivedMetaData - type: float - function: - name: Arithmetic@ObsFunction - options: - variables: - - name: CLWRetFromObs@DerivedMetaData - - name: CLWRetFromBkg@DerivedMetaData - total coefficient: 0.5 - -# Calculate scattering index from observation -- filter: Variable Assignment - assignments: - - name: SIRetFromObs@DerivedMetaData - type: float - function: - name: SCATRetMW@ObsFunction - options: - scatret_ch238: 1 - scatret_ch314: 2 - scatret_ch890: 16 - scatret_types: [ObsValue] - -# Calculate CLW obs/bkg match index -- filter: Variable Assignment - assignments: - - name: CLWMatchIndex@DerivedMetaData - channels: *atms_n20_channels - type: float - function: - name: CLWMatchIndexMW@ObsFunction - channels: *atms_n20_channels - options: - channels: *atms_n20_channels - clwobs_function: - name: CLWRetFromObs@DerivedMetaData - clwbkg_function: - name: CLWRetFromBkg@DerivedMetaData - clwret_clearsky: [ 0.030, 0.030, 0.030, 0.020, 0.030, - 0.080, 0.150, 0.000, 0.000, 0.000, - 0.000, 0.000, 0.000, 0.000, 0.000, - 0.020, 0.030, 0.030, 0.030, 0.030, - 0.050, 0.100] - -# Calculate symmetric observation error -- filter: Variable Assignment - assignments: - - name: InitialObsError@DerivedMetaData - channels: *atms_n20_channels - type: float - function: - name: ObsErrorModelRamp@ObsFunction - channels: *atms_n20_channels - options: - channels: *atms_n20_channels - xvar: - name: CLWRetSymmetric@DerivedMetaData - x0: [ 0.030, 0.030, 0.030, 0.020, 0.030, - 0.080, 0.150, 0.000, 0.000, 0.000, - 0.000, 0.000, 0.000, 0.000, 0.000, - 0.020, 0.030, 0.030, 0.030, 0.030, - 0.050, 0.100] - x1: [ 0.350, 0.380, 0.400, 0.450, 0.500, - 1.000, 1.000, 0.000, 0.000, 0.000, - 0.000, 0.000, 0.000, 0.000, 0.000, - 0.350, 0.500, 0.500, 0.500, 0.500, - 0.500, 0.500] - err0: [ 4.500, 4.500, 4.500, 2.500, 0.550, - 0.300, 0.300, 0.400, 0.400, 0.400, - 0.450, 0.450, 0.550, 0.800, 4.000, - 4.000, 4.000, 3.500, 3.000, 3.000, - 3.000, 3.000] - err1: [20.000, 25.000, 12.000, 7.000, 3.500, - 3.000, 0.800, 0.400, 0.400, 0.400, - 0.450, 0.450, 0.550, 0.800, 4.000, - 19.000, 30.000, 25.000, 16.500, 12.000, - 9.000, 6.500] - -# Calculate Innovation@DerivedMetaData -- filter: Variable Assignment - assignments: - - name: Innovation@DerivedMetaData - channels: *atms_n20_channels - type: float - function: - name: ObsFunction/Arithmetic - channels: *atms_n20_channels - options: - variables: - - name: brightnessTemperature@ObsValue - channels: *atms_n20_channels - - name: brightnessTemperature@HofX - channels: *atms_n20_channels - coefs: [1, -1] - -# Step 0-C: Assign Initial All-Sky Observation Error -- filter: Perform Action - filter variables: - - name: brightnessTemperature - channels: *atms_n20_channels - action: - name: assign error - error function: - name: InitialObsError@DerivedMetaData - channels: *atms_n20_channels - -# Step 1: Remove Observations from the Edge of the Scan -- filter: Domain Check - filter variables: - - name: brightnessTemperature - channels: 1-22 - where: - - variable: - name: MetaData/sensorScanPosition - is_in: 7-90 - actions: - - name: set - flag: ScanEdgeRemoval - - name: reject - -# Step 2: Data Thinning -- filter: Gaussian Thinning - horizontal_mesh: 145 - use_reduced_horizontal_grid: true - distance_norm: geodesic -# round_horizontal_bin_count_to_nearest: true -# partition_longitude_bins_using_mesh: true - actions: - - name: set - flag: Thinning - - name: reject - -# Step 3A: CLW Retrieval Check (observation_based) -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: 1-7, 16-22 - test variables: - - name: CLWRetFromObs@DerivedMetaData - maxvalue: 999.0 - actions: - - name: set - flag: CLWRetrievalCheck - - name: reject - -# Step 3B: CLW Retrieval Check (background_based) -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: 1-7, 16-22 - test variables: - - name: CLWRetFromBkg@DerivedMetaData - maxvalue: 999.0 - actions: - - name: set - flag: CLWRetrievalCheck - - name: reject - -# Step 4: Window Channel Sanity Check -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: 1-7, 16, 17-22 - test variables: - - name: Innovation@DerivedMetaData - channels: 1, 2, 5-7, 16 - maxvalue: 200.0 - minvalue: -200.0 - flag all filter variables if any test variable is out of bounds: true - actions: - - name: set - flag: WindowChannelExtremeResidual - - name: reject - -# Step 5: Hydrometeor Check (cloud/precipitation affected chanels) -- filter: Variable Assignment - assignments: - - name: DerivedMetaData/HydrometeorCheckATMS - channels: *atms_n20_channels - type: float - function: - name: HydrometeorCheckATMS@ObsFunction - channels: *atms_n20_channels - options: - channels: *atms_n20_channels - obserr_clearsky: [ 4.500, 4.500, 4.500, 2.500, 0.550, - 0.300, 0.300, 0.400, 0.400, 0.400, - 0.450, 0.450, 0.550, 0.800, 4.000, - 4.000, 4.000, 3.500, 3.000, 3.000, - 3.000, 3.000] - clwret_function: - name: CLWRetFromObs@DerivedMetaData - obserr_function: - name: InitialObsError@DerivedMetaData - channels: *atms_n20_channels - -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: *atms_n20_channels - test variables: - - name: DerivedMetaData/HydrometeorCheckATMS - channels: *atms_n20_channels - maxvalue: 0.0 - actions: - - name: set - flag: HydrometeorCheck - ignore: rejected observations - - name: reject - -# Step 6: Observation Error Inflation based on Topography Check -- filter: Variable Assignment - assignments: - - name: ObsErrorFactorTopo@DerivedMetaData - channels: *atms_n20_channels - type: float - function: - name: ObsErrorFactorTopoRad@ObsFunction - channels: *atms_n20_channels - options: - sensor: *Sensor_ID - channels: *atms_n20_channels - -- filter: Perform Action - filter variables: - - name: brightnessTemperature - channels: *atms_n20_channels - action: - name: inflate error - inflation variable: - name: ObsErrorFactorTopo@DerivedMetaData - channels: *atms_n20_channels - -# Step 7: Obs Error Inflation based on TOA Transmittancec Check -- filter: Variable Assignment - assignments: - - name: ObsErrorFactorTransmitTop@DerivedMetaData - channels: *atms_n20_channels - type: float - function: - name: ObsErrorFactorTransmitTopRad@ObsFunction - channels: *atms_n20_channels - options: - channels: *atms_n20_channels - -- filter: Perform Action - filter variables: - - name: brightnessTemperature - channels: *atms_n20_channels - action: - name: inflate error - inflation variable: - name: ObsErrorFactorTransmitTop@DerivedMetaData - channels: *atms_n20_channels - -# Step 8: Observation Error Inflation based on Surface Jacobian Check -- filter: Variable Assignment - assignments: - - name: ObsErrorFactorSurfJacobian@DerivedMetaData - channels: *atms_n20_channels - type: float - function: - name: ObsErrorFactorSurfJacobianRad@ObsFunction - channels: *atms_n20_channels - options: - sensor: *Sensor_ID - channels: *atms_n20_channels - obserr_demisf: [0.010, 0.020, 0.015, 0.020, 0.200] - obserr_dtempf: [0.500, 2.000, 1.000, 2.000, 4.500] - - -- filter: Perform Action - filter variables: - - name: brightnessTemperature - channels: *atms_n20_channels - action: - name: inflate error - inflation variable: - name: ObsErrorFactorSurfJacobian@DerivedMetaData - channels: *atms_n20_channels - -# Step 9: Situation Dependent Check -- filter: Variable Assignment - assignments: - - name: ObsErrorFactorSituDepend@DerivedMetaData - channels: *atms_n20_channels - type: float - function: - name: ObsErrorFactorSituDependMW@ObsFunction - channels: *atms_n20_channels - options: - sensor: *Sensor_ID - channels: *atms_n20_channels - clwbkg_function: - name: CLWRetFromBkg@DerivedMetaData - clwobs_function: - name: CLWRetFromObs@DerivedMetaData - scatobs_function: - name: SIRetFromObs@DerivedMetaData - clwmatchidx_function: - name: CLWMatchIndex@DerivedMetaData - channels: *atms_n20_channels - obserr_function: - name: InitialObsError@DerivedMetaData - channels: *atms_n20_channels - obserr_clearsky: [ 4.500, 4.500, 4.500, 2.500, 0.550, - 0.300, 0.300, 0.400, 0.400, 0.400, - 0.450, 0.450, 0.550, 0.800, 4.000, - 4.000, 4.000, 3.500, 3.000, 3.000, - 3.000, 3.000] - -- filter: Perform Action - filter variables: - - name: brightnessTemperature - channels: *atms_n20_channels - action: - name: inflate error - inflation variable: - name: ObsErrorFactorSituDepend@DerivedMetaData - channels: *atms_n20_channels - -# Step 10: Gross check -# Remove data if abs(Obs-HofX) > absolute threhold -- filter: Variable Assignment - assignments: - - name: ObsErrorFactorLat@DerivedMetaData - type: float - function: - name: ObsErrorFactorLatRad@ObsFunction - options: - latitude_parameters: [25.0, 0.25, 0.04, 3.0] - -- filter: Variable Assignment - assignments: - - name: ObsErrorBound@DerivedMetaData - channels: *atms_n20_channels - type: float - function: - name: ObsErrorBoundMW@ObsFunction - channels: *atms_n20_channels - options: - sensor: *Sensor_ID - channels: *atms_n20_channels - obserr_bound_latitude: - name: ObsErrorFactorLat@DerivedMetaData - obserr_bound_transmittop: - name: ObsErrorFactorTransmitTop@DerivedMetaData - channels: *atms_n20_channels - options: - channels: *atms_n20_channels - obserr_bound_topo: - name: ObsErrorFactorTopo@DerivedMetaData - channels: *atms_n20_channels - obserr_function: - name: InitialObsError@DerivedMetaData - channels: *atms_n20_channels - threhold: 3 - obserr_bound_max: [4.5, 4.5, 3.0, 3.0, 1.0, - 1.0, 1.0, 1.0, 1.0, 1.0, - 1.0, 1.0, 1.0, 2.0, 4.5, - 4.5, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0] - -- filter: Background Check - filter variables: - - name: brightnessTemperature - channels: *atms_n20_channels - function absolute threshold: - - name: ObsErrorBound@DerivedMetaData - channels: *atms_n20_channels - actions: - - name: set - flag: GrossCheck - ignore: rejected observations - - name: reject - -# Step 11: Inter-Channel Check -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: *atms_n20_channels - test variables: - - name: InterChannelConsistencyCheck@ObsFunction - channels: *atms_n20_channels - options: - channels: *atms_n20_channels - use passive_bc: true - sensor: *Sensor_ID - use_flag: [ 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, - 1, 1, 1, 1, 4, - 1, 1, 1, 1, 1, - 1, 1] - maxvalue: 1.0e-12 - actions: - - name: set - flag: InterChannelConsistency - ignore: rejected observations - - name: reject - -# Step 12: Useflag Check -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: *atms_n20_channels - test variables: - - name: ObsFunction/ChannelUseflagCheckRad - channels: *atms_n20_channels - options: - channels: *atms_n20_channels - use_flag: [ 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, - 1, 1, 1, 1, 4, - 1, 1, 1, 1, 1, - 1, 1] - minvalue: 1.0e-12 - actions: - - name: set - flag: UseflagCheck - ignore: rejected observations - - name: reject diff --git a/parm/atm/obs/config/atms_n20.yaml.j2 b/parm/atm/obs/config/atms_n20.yaml.j2 new file mode 100644 index 000000000..5f29a735f --- /dev/null +++ b/parm/atm/obs/config/atms_n20.yaml.j2 @@ -0,0 +1,557 @@ +- obs space: + name: atms_n20 + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}atms_n20.tm00.nc' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_atms_n20_{{ current_cycle | to_YMDH }}.nc' + io pool: + max pool size: 1 + simulated variables: [brightnessTemperature] + channels: &atms_n20_channels 1-22 + + obs operator: + name: CRTM + Absorbers: [H2O, O3, CO2] + Clouds: [Water, Ice] + Cloud_Fraction: 1.0 + Cloud_Seeding: true + obs options: + Sensor_ID: &Sensor_ID atms_n20 + EndianType: little_endian + CoefficientPath: '{{ DATA }}/crtm/' + linear obs operator: + Absorbers: [H2O, O3] + + obs bias: + input file: '{{ DATA }}/obs/{{ GPREFIX }}atms_n20.satbias.nc' + output file: '{{ DATA }}/bc/{{ APREFIX }}atms_n20.satbias.nc' + variational bc: + predictors: + - name: constant + - name: lapse_rate + order: 2 + tlapse: &atms_n20_tlapse '{{ DATA }}/obs/{{ GPREFIX }}atms_n20.tlapse.txt' + - name: lapse_rate + tlapse: *atms_n20_tlapse + - name: emissivity + - name: scan_angle + order: 4 + - name: scan_angle + order: 3 + - name: scan_angle + order: 2 + - name: scan_angle + covariance: + minimal required obs number: 20 + variance range: [1.0e-6, 10.0] + step size: 1.0e-4 + largest analysis variance: 10000.0 + prior: + input file: '{{ DATA }}/obs/{{ GPREFIX }}atms_n20.satbias_cov.nc' + inflation: + ratio: 1.1 + ratio for small dataset: 2.0 + output file: '{{ DATA }}/bc/{{ APREFIX }}atms_n20.satbias_cov.nc' + + obs pre filters: + # Step 0-A: Create Diagnostic Flags + - filter: Create Diagnostic Flags + filter variables: + - name: brightnessTemperature + channels: *atms_n20_channels + flags: + - name: ScanEdgeRemoval + initial value: false + force reinitialization: false + - name: Thinning + initial value: false + force reinitialization: false + - name: CLWRetrievalCheck + initial value: false + force reinitialization: false + - name: WindowChannelExtremeResidual + initial value: false + force reinitialization: false + - name: HydrometeorCheck + initial value: false + force reinitialization: false + - name: GrossCheck + initial value: false + force reinitialization: false + - name: InterChannelConsistency + initial value: false + force reinitialization: false + - name: UseflagCheck + initial value: false + force reinitialization: false + + obs post filters: + # Step 0-B: Calculate derived variables + # Calculate CLW retrieved from observation + - filter: Variable Assignment + assignments: + - name: CLWRetFromObs@DerivedMetaData + type: float + function: + name: CLWRetMW@ObsFunction + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [ObsValue] + + # Calculate CLW retrieved from observation + - filter: Variable Assignment + assignments: + - name: CLWRetFromBkg@DerivedMetaData + type: float + function: + name: CLWRetMW@ObsFunction + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [HofX] + + # Calculate symmetric retrieved CLW + - filter: Variable Assignment + assignments: + - name: CLWRetSymmetric@DerivedMetaData + type: float + value: 1000.0 + + - filter: Variable Assignment + where: + - variable: + name: CLWRetFromObs@DerivedMetaData + minvalue: 0. + maxvalue: 999. + - variable: + name: CLWRetFromBkg@DerivedMetaData + minvalue: 0. + maxvalue: 999. + where operator: and + assignments: + - name: CLWRetSymmetric@DerivedMetaData + type: float + function: + name: Arithmetic@ObsFunction + options: + variables: + - name: CLWRetFromObs@DerivedMetaData + - name: CLWRetFromBkg@DerivedMetaData + total coefficient: 0.5 + + # Calculate scattering index from observation + - filter: Variable Assignment + assignments: + - name: SIRetFromObs@DerivedMetaData + type: float + function: + name: SCATRetMW@ObsFunction + options: + scatret_ch238: 1 + scatret_ch314: 2 + scatret_ch890: 16 + scatret_types: [ObsValue] + + # Calculate CLW obs/bkg match index + - filter: Variable Assignment + assignments: + - name: CLWMatchIndex@DerivedMetaData + channels: *atms_n20_channels + type: float + function: + name: CLWMatchIndexMW@ObsFunction + channels: *atms_n20_channels + options: + channels: *atms_n20_channels + clwobs_function: + name: CLWRetFromObs@DerivedMetaData + clwbkg_function: + name: CLWRetFromBkg@DerivedMetaData + clwret_clearsky: [ 0.030, 0.030, 0.030, 0.020, 0.030, + 0.080, 0.150, 0.000, 0.000, 0.000, + 0.000, 0.000, 0.000, 0.000, 0.000, + 0.020, 0.030, 0.030, 0.030, 0.030, + 0.050, 0.100] + + # Calculate symmetric observation error + - filter: Variable Assignment + assignments: + - name: InitialObsError@DerivedMetaData + channels: *atms_n20_channels + type: float + function: + name: ObsErrorModelRamp@ObsFunction + channels: *atms_n20_channels + options: + channels: *atms_n20_channels + xvar: + name: CLWRetSymmetric@DerivedMetaData + x0: [ 0.030, 0.030, 0.030, 0.020, 0.030, + 0.080, 0.150, 0.000, 0.000, 0.000, + 0.000, 0.000, 0.000, 0.000, 0.000, + 0.020, 0.030, 0.030, 0.030, 0.030, + 0.050, 0.100] + x1: [ 0.350, 0.380, 0.400, 0.450, 0.500, + 1.000, 1.000, 0.000, 0.000, 0.000, + 0.000, 0.000, 0.000, 0.000, 0.000, + 0.350, 0.500, 0.500, 0.500, 0.500, + 0.500, 0.500] + err0: [ 4.500, 4.500, 4.500, 2.500, 0.550, + 0.300, 0.300, 0.400, 0.400, 0.400, + 0.450, 0.450, 0.550, 0.800, 4.000, + 4.000, 4.000, 3.500, 3.000, 3.000, + 3.000, 3.000] + err1: [20.000, 25.000, 12.000, 7.000, 3.500, + 3.000, 0.800, 0.400, 0.400, 0.400, + 0.450, 0.450, 0.550, 0.800, 4.000, + 19.000, 30.000, 25.000, 16.500, 12.000, + 9.000, 6.500] + + # Calculate Innovation@DerivedMetaData + - filter: Variable Assignment + assignments: + - name: Innovation@DerivedMetaData + channels: *atms_n20_channels + type: float + function: + name: ObsFunction/Arithmetic + channels: *atms_n20_channels + options: + variables: + - name: brightnessTemperature@ObsValue + channels: *atms_n20_channels + - name: brightnessTemperature@HofX + channels: *atms_n20_channels + coefs: [1, -1] + + # Step 0-C: Assign Initial All-Sky Observation Error + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *atms_n20_channels + action: + name: assign error + error function: + name: InitialObsError@DerivedMetaData + channels: *atms_n20_channels + + # Step 1: Remove Observations from the Edge of the Scan + - filter: Domain Check + filter variables: + - name: brightnessTemperature + channels: 1-22 + where: + - variable: + name: MetaData/sensorScanPosition + is_in: 7-90 + actions: + - name: set + flag: ScanEdgeRemoval + - name: reject + + # Step 2: Data Thinning + - filter: Gaussian Thinning + horizontal_mesh: 145 + use_reduced_horizontal_grid: true + distance_norm: geodesic + # round_horizontal_bin_count_to_nearest: true + # partition_longitude_bins_using_mesh: true + actions: + - name: set + flag: Thinning + - name: reject + + # Step 3A: CLW Retrieval Check (observation_based) + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: 1-7, 16-22 + test variables: + - name: CLWRetFromObs@DerivedMetaData + maxvalue: 999.0 + actions: + - name: set + flag: CLWRetrievalCheck + - name: reject + + # Step 3B: CLW Retrieval Check (background_based) + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: 1-7, 16-22 + test variables: + - name: CLWRetFromBkg@DerivedMetaData + maxvalue: 999.0 + actions: + - name: set + flag: CLWRetrievalCheck + - name: reject + + # Step 4: Window Channel Sanity Check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: 1-7, 16, 17-22 + test variables: + - name: Innovation@DerivedMetaData + channels: 1, 2, 5-7, 16 + maxvalue: 200.0 + minvalue: -200.0 + flag all filter variables if any test variable is out of bounds: true + actions: + - name: set + flag: WindowChannelExtremeResidual + - name: reject + + # Step 5: Hydrometeor Check (cloud/precipitation affected chanels) + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/HydrometeorCheckATMS + channels: *atms_n20_channels + type: float + function: + name: HydrometeorCheckATMS@ObsFunction + channels: *atms_n20_channels + options: + channels: *atms_n20_channels + obserr_clearsky: [ 4.500, 4.500, 4.500, 2.500, 0.550, + 0.300, 0.300, 0.400, 0.400, 0.400, + 0.450, 0.450, 0.550, 0.800, 4.000, + 4.000, 4.000, 3.500, 3.000, 3.000, + 3.000, 3.000] + clwret_function: + name: CLWRetFromObs@DerivedMetaData + obserr_function: + name: InitialObsError@DerivedMetaData + channels: *atms_n20_channels + + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *atms_n20_channels + test variables: + - name: DerivedMetaData/HydrometeorCheckATMS + channels: *atms_n20_channels + maxvalue: 0.0 + actions: + - name: set + flag: HydrometeorCheck + ignore: rejected observations + - name: reject + + # Step 6: Observation Error Inflation based on Topography Check + - filter: Variable Assignment + assignments: + - name: ObsErrorFactorTopo@DerivedMetaData + channels: *atms_n20_channels + type: float + function: + name: ObsErrorFactorTopoRad@ObsFunction + channels: *atms_n20_channels + options: + sensor: *Sensor_ID + channels: *atms_n20_channels + + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *atms_n20_channels + action: + name: inflate error + inflation variable: + name: ObsErrorFactorTopo@DerivedMetaData + channels: *atms_n20_channels + + # Step 7: Obs Error Inflation based on TOA Transmittancec Check + - filter: Variable Assignment + assignments: + - name: ObsErrorFactorTransmitTop@DerivedMetaData + channels: *atms_n20_channels + type: float + function: + name: ObsErrorFactorTransmitTopRad@ObsFunction + channels: *atms_n20_channels + options: + channels: *atms_n20_channels + + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *atms_n20_channels + action: + name: inflate error + inflation variable: + name: ObsErrorFactorTransmitTop@DerivedMetaData + channels: *atms_n20_channels + + # Step 8: Observation Error Inflation based on Surface Jacobian Check + - filter: Variable Assignment + assignments: + - name: ObsErrorFactorSurfJacobian@DerivedMetaData + channels: *atms_n20_channels + type: float + function: + name: ObsErrorFactorSurfJacobianRad@ObsFunction + channels: *atms_n20_channels + options: + sensor: *Sensor_ID + channels: *atms_n20_channels + obserr_demisf: [0.010, 0.020, 0.015, 0.020, 0.200] + obserr_dtempf: [0.500, 2.000, 1.000, 2.000, 4.500] + + + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *atms_n20_channels + action: + name: inflate error + inflation variable: + name: ObsErrorFactorSurfJacobian@DerivedMetaData + channels: *atms_n20_channels + + # Step 9: Situation Dependent Check + - filter: Variable Assignment + assignments: + - name: ObsErrorFactorSituDepend@DerivedMetaData + channels: *atms_n20_channels + type: float + function: + name: ObsErrorFactorSituDependMW@ObsFunction + channels: *atms_n20_channels + options: + sensor: *Sensor_ID + channels: *atms_n20_channels + clwbkg_function: + name: CLWRetFromBkg@DerivedMetaData + clwobs_function: + name: CLWRetFromObs@DerivedMetaData + scatobs_function: + name: SIRetFromObs@DerivedMetaData + clwmatchidx_function: + name: CLWMatchIndex@DerivedMetaData + channels: *atms_n20_channels + obserr_function: + name: InitialObsError@DerivedMetaData + channels: *atms_n20_channels + obserr_clearsky: [ 4.500, 4.500, 4.500, 2.500, 0.550, + 0.300, 0.300, 0.400, 0.400, 0.400, + 0.450, 0.450, 0.550, 0.800, 4.000, + 4.000, 4.000, 3.500, 3.000, 3.000, + 3.000, 3.000] + + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *atms_n20_channels + action: + name: inflate error + inflation variable: + name: ObsErrorFactorSituDepend@DerivedMetaData + channels: *atms_n20_channels + + # Step 10: Gross check + # Remove data if abs(Obs-HofX) > absolute threhold + - filter: Variable Assignment + assignments: + - name: ObsErrorFactorLat@DerivedMetaData + type: float + function: + name: ObsErrorFactorLatRad@ObsFunction + options: + latitude_parameters: [25.0, 0.25, 0.04, 3.0] + + - filter: Variable Assignment + assignments: + - name: ObsErrorBound@DerivedMetaData + channels: *atms_n20_channels + type: float + function: + name: ObsErrorBoundMW@ObsFunction + channels: *atms_n20_channels + options: + sensor: *Sensor_ID + channels: *atms_n20_channels + obserr_bound_latitude: + name: ObsErrorFactorLat@DerivedMetaData + obserr_bound_transmittop: + name: ObsErrorFactorTransmitTop@DerivedMetaData + channels: *atms_n20_channels + options: + channels: *atms_n20_channels + obserr_bound_topo: + name: ObsErrorFactorTopo@DerivedMetaData + channels: *atms_n20_channels + obserr_function: + name: InitialObsError@DerivedMetaData + channels: *atms_n20_channels + threhold: 3 + obserr_bound_max: [4.5, 4.5, 3.0, 3.0, 1.0, + 1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.0, 1.0, 2.0, 4.5, + 4.5, 2.0, 2.0, 2.0, 2.0, + 2.0, 2.0] + + - filter: Background Check + filter variables: + - name: brightnessTemperature + channels: *atms_n20_channels + function absolute threshold: + - name: ObsErrorBound@DerivedMetaData + channels: *atms_n20_channels + actions: + - name: set + flag: GrossCheck + ignore: rejected observations + - name: reject + + # Step 11: Inter-Channel Check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *atms_n20_channels + test variables: + - name: InterChannelConsistencyCheck@ObsFunction + channels: *atms_n20_channels + options: + channels: *atms_n20_channels + use passive_bc: true + sensor: *Sensor_ID + use_flag: [ 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, + 1, 1, 1, 1, 4, + 1, 1, 1, 1, 1, + 1, 1] + maxvalue: 1.0e-12 + actions: + - name: set + flag: InterChannelConsistency + ignore: rejected observations + - name: reject + + # Step 12: Useflag Check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *atms_n20_channels + test variables: + - name: ObsFunction/ChannelUseflagCheckRad + channels: *atms_n20_channels + options: + channels: *atms_n20_channels + use_flag: [ 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, + 1, 1, 1, 1, 4, + 1, 1, 1, 1, 1, + 1, 1] + minvalue: 1.0e-12 + actions: + - name: set + flag: UseflagCheck + ignore: rejected observations + - name: reject diff --git a/parm/atm/obs/config/atms_npp.yaml b/parm/atm/obs/config/atms_npp.yaml deleted file mode 100644 index 30926fc20..000000000 --- a/parm/atm/obs/config/atms_npp.yaml +++ /dev/null @@ -1,557 +0,0 @@ -obs space: - name: atms_npp - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)atms_npp.tm00.nc - obsdataout: - engine: - type: H5File - obsfile: $(DATA)/diags/diag_atms_npp_{{ current_cycle | to_YMDH }}.nc - io pool: - max pool size: 1 - simulated variables: [brightnessTemperature] - channels: &atms_npp_channels 1-22 - -obs operator: - name: CRTM - Absorbers: [H2O,O3,CO2] - Clouds: [Water, Ice] - Cloud_Fraction: 1.0 - Cloud_Seeding: true - obs options: - Sensor_ID: &Sensor_ID atms_npp - EndianType: little_endian - CoefficientPath: $(DATA)/crtm/ - linear obs operator: - Absorbers: [H2O, O3] - -obs bias: - input file: $(DATA)/obs/$(GPREFIX)atms_npp.satbias.nc - output file: $(DATA)/bc/$(APREFIX)atms_npp.satbias.nc - variational bc: - predictors: - - name: constant - - name: lapse_rate - order: 2 - tlapse: &atms_npp_tlapse $(DATA)/obs/$(GPREFIX)atms_npp.tlapse.txt - - name: lapse_rate - tlapse: *atms_npp_tlapse - - name: emissivity - - name: scan_angle - order: 4 - - name: scan_angle - order: 3 - - name: scan_angle - order: 2 - - name: scan_angle - covariance: - minimal required obs number: 20 - variance range: [1.0e-6, 10.0] - step size: 1.0e-4 - largest analysis variance: 10000.0 - prior: - input file: $(DATA)/obs/$(GPREFIX)atms_npp.satbias_cov.nc - inflation: - ratio: 1.1 - ratio for small dataset: 2.0 - output file: $(DATA)/bc/$(APREFIX)atms_npp.satbias_cov.nc - -obs pre filters: -# Step 0-A: Create Diagnostic Flags -- filter: Create Diagnostic Flags - filter variables: - - name: brightnessTemperature - channels: *atms_npp_channels - flags: - - name: ScanEdgeRemoval - initial value: false - force reinitialization: false - - name: Thinning - initial value: false - force reinitialization: false - - name: CLWRetrievalCheck - initial value: false - force reinitialization: false - - name: WindowChannelExtremeResidual - initial value: false - force reinitialization: false - - name: HydrometeorCheck - initial value: false - force reinitialization: false - - name: GrossCheck - initial value: false - force reinitialization: false - - name: InterChannelConsistency - initial value: false - force reinitialization: false - - name: UseflagCheck - initial value: false - force reinitialization: false - -obs post filters: -# Step 0-B: Calculate derived variables -# Calculate CLW retrieved from observation -- filter: Variable Assignment - assignments: - - name: CLWRetFromObs@DerivedMetaData - type: float - function: - name: CLWRetMW@ObsFunction - options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [ObsValue] - -# Calculate CLW retrieved from observation -- filter: Variable Assignment - assignments: - - name: CLWRetFromBkg@DerivedMetaData - type: float - function: - name: CLWRetMW@ObsFunction - options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [HofX] - -# Calculate symmetric retrieved CLW -- filter: Variable Assignment - assignments: - - name: CLWRetSymmetric@DerivedMetaData - type: float - value: 1000.0 - -- filter: Variable Assignment - where: - - variable: - name: CLWRetFromObs@DerivedMetaData - minvalue: 0. - maxvalue: 999. - - variable: - name: CLWRetFromBkg@DerivedMetaData - minvalue: 0. - maxvalue: 999. - where operator: and - assignments: - - name: CLWRetSymmetric@DerivedMetaData - type: float - function: - name: Arithmetic@ObsFunction - options: - variables: - - name: CLWRetFromObs@DerivedMetaData - - name: CLWRetFromBkg@DerivedMetaData - total coefficient: 0.5 - -# Calculate scattering index from observation -- filter: Variable Assignment - assignments: - - name: SIRetFromObs@DerivedMetaData - type: float - function: - name: SCATRetMW@ObsFunction - options: - scatret_ch238: 1 - scatret_ch314: 2 - scatret_ch890: 16 - scatret_types: [ObsValue] - -# Calculate CLW obs/bkg match index -- filter: Variable Assignment - assignments: - - name: CLWMatchIndex@DerivedMetaData - channels: *atms_npp_channels - type: float - function: - name: CLWMatchIndexMW@ObsFunction - channels: *atms_npp_channels - options: - channels: *atms_npp_channels - clwobs_function: - name: CLWRetFromObs@DerivedMetaData - clwbkg_function: - name: CLWRetFromBkg@DerivedMetaData - clwret_clearsky: [ 0.030, 0.030, 0.030, 0.020, 0.030, - 0.080, 0.150, 0.000, 0.000, 0.000, - 0.000, 0.000, 0.000, 0.000, 0.000, - 0.020, 0.030, 0.030, 0.030, 0.030, - 0.050, 0.100] - -# Calculate symmetric observation error -- filter: Variable Assignment - assignments: - - name: InitialObsError@DerivedMetaData - channels: *atms_npp_channels - type: float - function: - name: ObsErrorModelRamp@ObsFunction - channels: *atms_npp_channels - options: - channels: *atms_npp_channels - xvar: - name: CLWRetSymmetric@DerivedMetaData - x0: [ 0.030, 0.030, 0.030, 0.020, 0.030, - 0.080, 0.150, 0.000, 0.000, 0.000, - 0.000, 0.000, 0.000, 0.000, 0.000, - 0.020, 0.030, 0.030, 0.030, 0.030, - 0.050, 0.100] - x1: [ 0.350, 0.380, 0.400, 0.450, 0.500, - 1.000, 1.000, 0.000, 0.000, 0.000, - 0.000, 0.000, 0.000, 0.000, 0.000, - 0.350, 0.500, 0.500, 0.500, 0.500, - 0.500, 0.500] - err0: [ 4.500, 4.500, 4.500, 2.500, 0.550, - 0.300, 0.300, 0.400, 0.400, 0.400, - 0.450, 0.450, 0.550, 0.800, 4.000, - 4.000, 4.000, 3.500, 3.000, 3.000, - 3.000, 3.000] - err1: [20.000, 25.000, 12.000, 7.000, 3.500, - 3.000, 0.800, 0.400, 0.400, 0.400, - 0.450, 0.450, 0.550, 0.800, 4.000, - 19.000, 30.000, 25.000, 16.500, 12.000, - 9.000, 6.500] - -# Calculate Innovation@DerivedMetaData -- filter: Variable Assignment - assignments: - - name: Innovation@DerivedMetaData - channels: *atms_npp_channels - type: float - function: - name: ObsFunction/Arithmetic - channels: *atms_npp_channels - options: - variables: - - name: brightnessTemperature@ObsValue - channels: *atms_npp_channels - - name: brightnessTemperature@HofX - channels: *atms_npp_channels - coefs: [1, -1] - -# Step 0-C: Assign Initial All-Sky Observation Error -- filter: Perform Action - filter variables: - - name: brightnessTemperature - channels: *atms_npp_channels - action: - name: assign error - error function: - name: InitialObsError@DerivedMetaData - channels: *atms_npp_channels - -# Step 1: Remove Observations from the Edge of the Scan -- filter: Domain Check - filter variables: - - name: brightnessTemperature - channels: 1-22 - where: - - variable: - name: MetaData/sensorScanPosition - is_in: 7-90 - actions: - - name: set - flag: ScanEdgeRemoval - - name: reject - -# Step 2: Data Thinning -- filter: Gaussian Thinning - horizontal_mesh: 145 - use_reduced_horizontal_grid: true - distance_norm: geodesic -# round_horizontal_bin_count_to_nearest: true -# partition_longitude_bins_using_mesh: true - actions: - - name: set - flag: Thinning - - name: reject - -# Step 3A: CLW Retrieval Check (observation_based) -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: 1-7, 16-22 - test variables: - - name: CLWRetFromObs@DerivedMetaData - maxvalue: 999.0 - actions: - - name: set - flag: CLWRetrievalCheck - - name: reject - -# Step 3B: CLW Retrieval Check (background_based) -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: 1-7, 16-22 - test variables: - - name: CLWRetFromBkg@DerivedMetaData - maxvalue: 999.0 - actions: - - name: set - flag: CLWRetrievalCheck - - name: reject - -# Step 4: Window Channel Sanity Check -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: 1-7, 16, 17-22 - test variables: - - name: Innovation@DerivedMetaData - channels: 1, 2, 5-7, 16 - maxvalue: 200.0 - minvalue: -200.0 - flag all filter variables if any test variable is out of bounds: true - actions: - - name: set - flag: WindowChannelExtremeResidual - - name: reject - -# Step 5: Hydrometeor Check (cloud/precipitation affected chanels) -- filter: Variable Assignment - assignments: - - name: DerivedMetaData/HydrometeorCheckATMS - channels: *atms_npp_channels - type: float - function: - name: HydrometeorCheckATMS@ObsFunction - channels: *atms_npp_channels - options: - channels: *atms_npp_channels - obserr_clearsky: [ 4.500, 4.500, 4.500, 2.500, 0.550, - 0.300, 0.300, 0.400, 0.400, 0.400, - 0.450, 0.450, 0.550, 0.800, 4.000, - 4.000, 4.000, 3.500, 3.000, 3.000, - 3.000, 3.000] - clwret_function: - name: CLWRetFromObs@DerivedMetaData - obserr_function: - name: InitialObsError@DerivedMetaData - channels: *atms_npp_channels - -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: *atms_npp_channels - test variables: - - name: DerivedMetaData/HydrometeorCheckATMS - channels: *atms_npp_channels - maxvalue: 0.0 - actions: - - name: set - flag: HydrometeorCheck - ignore: rejected observations - - name: reject - -# Step 6: Observation Error Inflation based on Topography Check -- filter: Variable Assignment - assignments: - - name: ObsErrorFactorTopo@DerivedMetaData - channels: *atms_npp_channels - type: float - function: - name: ObsErrorFactorTopoRad@ObsFunction - channels: *atms_npp_channels - options: - sensor: *Sensor_ID - channels: *atms_npp_channels - -- filter: Perform Action - filter variables: - - name: brightnessTemperature - channels: *atms_npp_channels - action: - name: inflate error - inflation variable: - name: ObsErrorFactorTopo@DerivedMetaData - channels: *atms_npp_channels - -# Step 7: Obs Error Inflation based on TOA Transmittancec Check -- filter: Variable Assignment - assignments: - - name: ObsErrorFactorTransmitTop@DerivedMetaData - channels: *atms_npp_channels - type: float - function: - name: ObsErrorFactorTransmitTopRad@ObsFunction - channels: *atms_npp_channels - options: - channels: *atms_npp_channels - -- filter: Perform Action - filter variables: - - name: brightnessTemperature - channels: *atms_npp_channels - action: - name: inflate error - inflation variable: - name: ObsErrorFactorTransmitTop@DerivedMetaData - channels: *atms_npp_channels - -# Step 8: Observation Error Inflation based on Surface Jacobian Check -- filter: Variable Assignment - assignments: - - name: ObsErrorFactorSurfJacobian@DerivedMetaData - channels: *atms_npp_channels - type: float - function: - name: ObsErrorFactorSurfJacobianRad@ObsFunction - channels: *atms_npp_channels - options: - sensor: *Sensor_ID - channels: *atms_npp_channels - obserr_demisf: [0.010, 0.020, 0.015, 0.020, 0.200] - obserr_dtempf: [0.500, 2.000, 1.000, 2.000, 4.500] - - -- filter: Perform Action - filter variables: - - name: brightnessTemperature - channels: *atms_npp_channels - action: - name: inflate error - inflation variable: - name: ObsErrorFactorSurfJacobian@DerivedMetaData - channels: *atms_npp_channels - -# Step 9: Situation Dependent Check -- filter: Variable Assignment - assignments: - - name: ObsErrorFactorSituDepend@DerivedMetaData - channels: *atms_npp_channels - type: float - function: - name: ObsErrorFactorSituDependMW@ObsFunction - channels: *atms_npp_channels - options: - sensor: *Sensor_ID - channels: *atms_npp_channels - clwbkg_function: - name: CLWRetFromBkg@DerivedMetaData - clwobs_function: - name: CLWRetFromObs@DerivedMetaData - scatobs_function: - name: SIRetFromObs@DerivedMetaData - clwmatchidx_function: - name: CLWMatchIndex@DerivedMetaData - channels: *atms_npp_channels - obserr_function: - name: InitialObsError@DerivedMetaData - channels: *atms_npp_channels - obserr_clearsky: [ 4.500, 4.500, 4.500, 2.500, 0.550, - 0.300, 0.300, 0.400, 0.400, 0.400, - 0.450, 0.450, 0.550, 0.800, 4.000, - 4.000, 4.000, 3.500, 3.000, 3.000, - 3.000, 3.000] - -- filter: Perform Action - filter variables: - - name: brightnessTemperature - channels: *atms_npp_channels - action: - name: inflate error - inflation variable: - name: ObsErrorFactorSituDepend@DerivedMetaData - channels: *atms_npp_channels - -# Step 10: Gross check -# Remove data if abs(Obs-HofX) > absolute threhold -- filter: Variable Assignment - assignments: - - name: ObsErrorFactorLat@DerivedMetaData - type: float - function: - name: ObsErrorFactorLatRad@ObsFunction - options: - latitude_parameters: [25.0, 0.25, 0.04, 3.0] - -- filter: Variable Assignment - assignments: - - name: ObsErrorBound@DerivedMetaData - channels: *atms_npp_channels - type: float - function: - name: ObsErrorBoundMW@ObsFunction - channels: *atms_npp_channels - options: - sensor: *Sensor_ID - channels: *atms_npp_channels - obserr_bound_latitude: - name: ObsErrorFactorLat@DerivedMetaData - obserr_bound_transmittop: - name: ObsErrorFactorTransmitTop@DerivedMetaData - channels: *atms_npp_channels - options: - channels: *atms_npp_channels - obserr_bound_topo: - name: ObsErrorFactorTopo@DerivedMetaData - channels: *atms_npp_channels - obserr_function: - name: InitialObsError@DerivedMetaData - channels: *atms_npp_channels - threhold: 3 - obserr_bound_max: [4.5, 4.5, 3.0, 3.0, 1.0, - 1.0, 1.0, 1.0, 1.0, 1.0, - 1.0, 1.0, 1.0, 2.0, 4.5, - 4.5, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0] - -- filter: Background Check - filter variables: - - name: brightnessTemperature - channels: *atms_npp_channels - function absolute threshold: - - name: ObsErrorBound@DerivedMetaData - channels: *atms_npp_channels - actions: - - name: set - flag: GrossCheck - ignore: rejected observations - - name: reject - -# Step 11: Inter-Channel Check -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: *atms_npp_channels - test variables: - - name: InterChannelConsistencyCheck@ObsFunction - channels: *atms_npp_channels - options: - channels: *atms_npp_channels - use passive_bc: true - sensor: *Sensor_ID - use_flag: [ 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, - 1, 1, 1, 1, 4, - 1, 1, 1, 1, 1, - 1, 1] - maxvalue: 1.0e-12 - actions: - - name: set - flag: InterChannelConsistency - ignore: rejected observations - - name: reject - -# Step 12: Useflag Check -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: *atms_npp_channels - test variables: - - name: ObsFunction/ChannelUseflagCheckRad - channels: *atms_npp_channels - options: - channels: *atms_npp_channels - use_flag: [ 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, - 1, 1, 1, 1, 4, - 1, 1, 1, 1, 1, - 1, 1] - minvalue: 1.0e-12 - actions: - - name: set - flag: UseflagCheck - ignore: rejected observations - - name: reject diff --git a/parm/atm/obs/config/atms_npp.yaml.j2 b/parm/atm/obs/config/atms_npp.yaml.j2 new file mode 100644 index 000000000..a7be6b9cc --- /dev/null +++ b/parm/atm/obs/config/atms_npp.yaml.j2 @@ -0,0 +1,557 @@ +- obs space: + name: atms_npp + obsdatain: + engine: + type: H5File + obsfile: {{ DATA }}/obs/{{ OPREFIX }}atms_npp.tm00.nc + obsdataout: + engine: + type: H5File + obsfile: {{ DATA }}/diags/diag_atms_npp_{{ current_cycle | to_YMDH }}.nc + io pool: + max pool size: 1 + simulated variables: [brightnessTemperature] + channels: &atms_npp_channels 1-2 + + obs operator: + name: CRTM + Absorbers: [H2O,O3,CO2] + Clouds: [Water, Ice] + Cloud_Fraction: 1.0 + Cloud_Seeding: true + obs options: + Sensor_ID: &Sensor_ID atms_npp + EndianType: little_endian + CoefficientPath: {{ DATA }}/crtm/ + linear obs operator: + Absorbers: [H2O, O3] + + obs bias: + input file: {{ DATA }}/obs/{{ GPREFIX }}atms_npp.satbias.nc + output file: {{ DATA }}/bc/{{ APREFIX }}atms_npp.satbias.nc + variational bc: + predictors: + - name: constant + - name: lapse_rate + order: 2 + tlapse: &atms_npp_tlapse {{ DATA }}/obs/{{ GPREFIX }}atms_npp.tlapse.txt + - name: lapse_rate + tlapse: *atms_npp_tlapse + - name: emissivity + - name: scan_angle + order: 4 + - name: scan_angle + order: 3 + - name: scan_angle + order: 2 + - name: scan_angle + covariance: + minimal required obs number: 20 + variance range: [1.0e-6, 10.0] + step size: 1.0e-4 + largest analysis variance: 10000.0 + prior: + input file: {{ DATA }}/obs/{{ GPREFIX }}atms_npp.satbias_cov.nc + inflation: + ratio: 1.1 + ratio for small dataset: 2.0 + output file: {{ DATA }}/bc/{{ APREFIX }}atms_npp.satbias_cov.nc + + obs pre filters: + # Step 0-A: Create Diagnostic Flags + - filter: Create Diagnostic Flags + filter variables: + - name: brightnessTemperature + channels: *atms_npp_channels + flags: + - name: ScanEdgeRemoval + initial value: false + force reinitialization: false + - name: Thinning + initial value: false + force reinitialization: false + - name: CLWRetrievalCheck + initial value: false + force reinitialization: false + - name: WindowChannelExtremeResidual + initial value: false + force reinitialization: false + - name: HydrometeorCheck + initial value: false + force reinitialization: false + - name: GrossCheck + initial value: false + force reinitialization: false + - name: InterChannelConsistency + initial value: false + force reinitialization: false + - name: UseflagCheck + initial value: false + force reinitialization: false + + obs post filters: + # Step 0-B: Calculate derived variables + # Calculate CLW retrieved from observation + - filter: Variable Assignment + assignments: + - name: CLWRetFromObs@DerivedMetaData + type: float + function: + name: CLWRetMW@ObsFunction + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [ObsValue] + + # Calculate CLW retrieved from observation + - filter: Variable Assignment + assignments: + - name: CLWRetFromBkg@DerivedMetaData + type: float + function: + name: CLWRetMW@ObsFunction + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [HofX] + + # Calculate symmetric retrieved CLW + - filter: Variable Assignment + assignments: + - name: CLWRetSymmetric@DerivedMetaData + type: float + value: 1000.0 + + - filter: Variable Assignment + where: + - variable: + name: CLWRetFromObs@DerivedMetaData + minvalue: 0. + maxvalue: 999. + - variable: + name: CLWRetFromBkg@DerivedMetaData + minvalue: 0. + maxvalue: 999. + where operator: and + assignments: + - name: CLWRetSymmetric@DerivedMetaData + type: float + function: + name: Arithmetic@ObsFunction + options: + variables: + - name: CLWRetFromObs@DerivedMetaData + - name: CLWRetFromBkg@DerivedMetaData + total coefficient: 0.5 + + # Calculate scattering index from observation + - filter: Variable Assignment + assignments: + - name: SIRetFromObs@DerivedMetaData + type: float + function: + name: SCATRetMW@ObsFunction + options: + scatret_ch238: 1 + scatret_ch314: 2 + scatret_ch890: 16 + scatret_types: [ObsValue] + + # Calculate CLW obs/bkg match index + - filter: Variable Assignment + assignments: + - name: CLWMatchIndex@DerivedMetaData + channels: *atms_npp_channels + type: float + function: + name: CLWMatchIndexMW@ObsFunction + channels: *atms_npp_channels + options: + channels: *atms_npp_channels + clwobs_function: + name: CLWRetFromObs@DerivedMetaData + clwbkg_function: + name: CLWRetFromBkg@DerivedMetaData + clwret_clearsky: [ 0.030, 0.030, 0.030, 0.020, 0.030, + 0.080, 0.150, 0.000, 0.000, 0.000, + 0.000, 0.000, 0.000, 0.000, 0.000, + 0.020, 0.030, 0.030, 0.030, 0.030, + 0.050, 0.100] + + # Calculate symmetric observation error + - filter: Variable Assignment + assignments: + - name: InitialObsError@DerivedMetaData + channels: *atms_npp_channels + type: float + function: + name: ObsErrorModelRamp@ObsFunction + channels: *atms_npp_channels + options: + channels: *atms_npp_channels + xvar: + name: CLWRetSymmetric@DerivedMetaData + x0: [ 0.030, 0.030, 0.030, 0.020, 0.030, + 0.080, 0.150, 0.000, 0.000, 0.000, + 0.000, 0.000, 0.000, 0.000, 0.000, + 0.020, 0.030, 0.030, 0.030, 0.030, + 0.050, 0.100] + x1: [ 0.350, 0.380, 0.400, 0.450, 0.500, + 1.000, 1.000, 0.000, 0.000, 0.000, + 0.000, 0.000, 0.000, 0.000, 0.000, + 0.350, 0.500, 0.500, 0.500, 0.500, + 0.500, 0.500] + err0: [ 4.500, 4.500, 4.500, 2.500, 0.550, + 0.300, 0.300, 0.400, 0.400, 0.400, + 0.450, 0.450, 0.550, 0.800, 4.000, + 4.000, 4.000, 3.500, 3.000, 3.000, + 3.000, 3.000] + err1: [20.000, 25.000, 12.000, 7.000, 3.500, + 3.000, 0.800, 0.400, 0.400, 0.400, + 0.450, 0.450, 0.550, 0.800, 4.000, + 19.000, 30.000, 25.000, 16.500, 12.000, + 9.000, 6.500] + + # Calculate Innovation@DerivedMetaData + - filter: Variable Assignment + assignments: + - name: Innovation@DerivedMetaData + channels: *atms_npp_channels + type: float + function: + name: ObsFunction/Arithmetic + channels: *atms_npp_channels + options: + variables: + - name: brightnessTemperature@ObsValue + channels: *atms_npp_channels + - name: brightnessTemperature@HofX + channels: *atms_npp_channels + coefs: [1, -1] + + # Step 0-C: Assign Initial All-Sky Observation Error + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *atms_npp_channels + action: + name: assign error + error function: + name: InitialObsError@DerivedMetaData + channels: *atms_npp_channels + + # Step 1: Remove Observations from the Edge of the Scan + - filter: Domain Check + filter variables: + - name: brightnessTemperature + channels: 1-22 + where: + - variable: + name: MetaData/sensorScanPosition + is_in: 7-90 + actions: + - name: set + flag: ScanEdgeRemoval + - name: reject + + # Step 2: Data Thinning + - filter: Gaussian Thinning + horizontal_mesh: 145 + use_reduced_horizontal_grid: true + distance_norm: geodesic + # round_horizontal_bin_count_to_nearest: true + # partition_longitude_bins_using_mesh: true + actions: + - name: set + flag: Thinning + - name: reject + + # Step 3A: CLW Retrieval Check (observation_based) + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: 1-7, 16-22 + test variables: + - name: CLWRetFromObs@DerivedMetaData + maxvalue: 999.0 + actions: + - name: set + flag: CLWRetrievalCheck + - name: reject + + # Step 3B: CLW Retrieval Check (background_based) + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: 1-7, 16-22 + test variables: + - name: CLWRetFromBkg@DerivedMetaData + maxvalue: 999.0 + actions: + - name: set + flag: CLWRetrievalCheck + - name: reject + + # Step 4: Window Channel Sanity Check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: 1-7, 16, 17-22 + test variables: + - name: Innovation@DerivedMetaData + channels: 1, 2, 5-7, 16 + maxvalue: 200.0 + minvalue: -200.0 + flag all filter variables if any test variable is out of bounds: true + actions: + - name: set + flag: WindowChannelExtremeResidual + - name: reject + + # Step 5: Hydrometeor Check (cloud/precipitation affected chanels) + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/HydrometeorCheckATMS + channels: *atms_npp_channels + type: float + function: + name: HydrometeorCheckATMS@ObsFunction + channels: *atms_npp_channels + options: + channels: *atms_npp_channels + obserr_clearsky: [ 4.500, 4.500, 4.500, 2.500, 0.550, + 0.300, 0.300, 0.400, 0.400, 0.400, + 0.450, 0.450, 0.550, 0.800, 4.000, + 4.000, 4.000, 3.500, 3.000, 3.000, + 3.000, 3.000] + clwret_function: + name: CLWRetFromObs@DerivedMetaData + obserr_function: + name: InitialObsError@DerivedMetaData + channels: *atms_npp_channels + + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *atms_npp_channels + test variables: + - name: DerivedMetaData/HydrometeorCheckATMS + channels: *atms_npp_channels + maxvalue: 0.0 + actions: + - name: set + flag: HydrometeorCheck + ignore: rejected observations + - name: reject + + # Step 6: Observation Error Inflation based on Topography Check + - filter: Variable Assignment + assignments: + - name: ObsErrorFactorTopo@DerivedMetaData + channels: *atms_npp_channels + type: float + function: + name: ObsErrorFactorTopoRad@ObsFunction + channels: *atms_npp_channels + options: + sensor: *Sensor_ID + channels: *atms_npp_channels + + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *atms_npp_channels + action: + name: inflate error + inflation variable: + name: ObsErrorFactorTopo@DerivedMetaData + channels: *atms_npp_channels + + # Step 7: Obs Error Inflation based on TOA Transmittancec Check + - filter: Variable Assignment + assignments: + - name: ObsErrorFactorTransmitTop@DerivedMetaData + channels: *atms_npp_channels + type: float + function: + name: ObsErrorFactorTransmitTopRad@ObsFunction + channels: *atms_npp_channels + options: + channels: *atms_npp_channels + + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *atms_npp_channels + action: + name: inflate error + inflation variable: + name: ObsErrorFactorTransmitTop@DerivedMetaData + channels: *atms_npp_channels + + # Step 8: Observation Error Inflation based on Surface Jacobian Check + - filter: Variable Assignment + assignments: + - name: ObsErrorFactorSurfJacobian@DerivedMetaData + channels: *atms_npp_channels + type: float + function: + name: ObsErrorFactorSurfJacobianRad@ObsFunction + channels: *atms_npp_channels + options: + sensor: *Sensor_ID + channels: *atms_npp_channels + obserr_demisf: [0.010, 0.020, 0.015, 0.020, 0.200] + obserr_dtempf: [0.500, 2.000, 1.000, 2.000, 4.500] + + + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *atms_npp_channels + action: + name: inflate error + inflation variable: + name: ObsErrorFactorSurfJacobian@DerivedMetaData + channels: *atms_npp_channels + + # Step 9: Situation Dependent Check + - filter: Variable Assignment + assignments: + - name: ObsErrorFactorSituDepend@DerivedMetaData + channels: *atms_npp_channels + type: float + function: + name: ObsErrorFactorSituDependMW@ObsFunction + channels: *atms_npp_channels + options: + sensor: *Sensor_ID + channels: *atms_npp_channels + clwbkg_function: + name: CLWRetFromBkg@DerivedMetaData + clwobs_function: + name: CLWRetFromObs@DerivedMetaData + scatobs_function: + name: SIRetFromObs@DerivedMetaData + clwmatchidx_function: + name: CLWMatchIndex@DerivedMetaData + channels: *atms_npp_channels + obserr_function: + name: InitialObsError@DerivedMetaData + channels: *atms_npp_channels + obserr_clearsky: [ 4.500, 4.500, 4.500, 2.500, 0.550, + 0.300, 0.300, 0.400, 0.400, 0.400, + 0.450, 0.450, 0.550, 0.800, 4.000, + 4.000, 4.000, 3.500, 3.000, 3.000, + 3.000, 3.000] + + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *atms_npp_channels + action: + name: inflate error + inflation variable: + name: ObsErrorFactorSituDepend@DerivedMetaData + channels: *atms_npp_channels + + # Step 10: Gross check + # Remove data if abs(Obs-HofX) > absolute threhold + - filter: Variable Assignment + assignments: + - name: ObsErrorFactorLat@DerivedMetaData + type: float + function: + name: ObsErrorFactorLatRad@ObsFunction + options: + latitude_parameters: [25.0, 0.25, 0.04, 3.0] + + - filter: Variable Assignment + assignments: + - name: ObsErrorBound@DerivedMetaData + channels: *atms_npp_channels + type: float + function: + name: ObsErrorBoundMW@ObsFunction + channels: *atms_npp_channels + options: + sensor: *Sensor_ID + channels: *atms_npp_channels + obserr_bound_latitude: + name: ObsErrorFactorLat@DerivedMetaData + obserr_bound_transmittop: + name: ObsErrorFactorTransmitTop@DerivedMetaData + channels: *atms_npp_channels + options: + channels: *atms_npp_channels + obserr_bound_topo: + name: ObsErrorFactorTopo@DerivedMetaData + channels: *atms_npp_channels + obserr_function: + name: InitialObsError@DerivedMetaData + channels: *atms_npp_channels + threhold: 3 + obserr_bound_max: [4.5, 4.5, 3.0, 3.0, 1.0, + 1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.0, 1.0, 2.0, 4.5, + 4.5, 2.0, 2.0, 2.0, 2.0, + 2.0, 2.0] + + - filter: Background Check + filter variables: + - name: brightnessTemperature + channels: *atms_npp_channels + function absolute threshold: + - name: ObsErrorBound@DerivedMetaData + channels: *atms_npp_channels + actions: + - name: set + flag: GrossCheck + ignore: rejected observations + - name: reject + + # Step 11: Inter-Channel Check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *atms_npp_channels + test variables: + - name: InterChannelConsistencyCheck@ObsFunction + channels: *atms_npp_channels + options: + channels: *atms_npp_channels + use passive_bc: true + sensor: *Sensor_ID + use_flag: [ 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, + 1, 1, 1, 1, 4, + 1, 1, 1, 1, 1, + 1, 1] + maxvalue: 1.0e-12 + actions: + - name: set + flag: InterChannelConsistency + ignore: rejected observations + - name: reject + + # Step 12: Useflag Check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *atms_npp_channels + test variables: + - name: ObsFunction/ChannelUseflagCheckRad + channels: *atms_npp_channels + options: + channels: *atms_npp_channels + use_flag: [ 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, + 1, 1, 1, 1, 4, + 1, 1, 1, 1, 1, + 1, 1] + minvalue: 1.0e-12 + actions: + - name: set + flag: UseflagCheck + ignore: rejected observations + - name: reject diff --git a/parm/atm/obs/config/conv_ps.yaml b/parm/atm/obs/config/conv_ps.yaml deleted file mode 100644 index ffae20073..000000000 --- a/parm/atm/obs/config/conv_ps.yaml +++ /dev/null @@ -1,351 +0,0 @@ -obs space: - name: surface_ps - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)conventional_ps.prepbufr.nc - obsdataout: - engine: - type: H5File - obsfile: $(DATA)/diags/diag_conventional_ps_prepbufr_{{ current_cycle | to_YMDH }}.nc - io pool: - max pool size: 1 - simulated variables: [stationPressure] - -obs operator: - name: SfcPCorrected - variables: - - name: stationPressure - da_psfc_scheme: GSI - station_altitude: height - geovar_sfc_geomz: surface_altitude - geovar_geomz: geopotential_height - -linear obs operator: - name: Identity - variables: - - name: stationPressure - -obs prior filters: -# Initial Error Assignments for SFC Observations -- filter: Perform Action - filter variables: - - name: stationPressure - where: - - variable: ObsType/stationPressure - is_in: [181] - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelStepwiseLinear - options: - round_to_the_nearest_integer: true - xvar: - name: ObsValue/stationPressure - xvals: [80000, 75000, 70000, 65000, 60000, 55000 ] - errors: [110, 120, 120, 120, 120, 1.0e+11] - -- filter: Perform Action - filter variables: - - name: stationPressure - where: - - variable: ObsType/stationPressure - is_in: [187] - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelStepwiseLinear - options: - round_to_the_nearest_integer: true - xvar: - name: ObsValue/stationPressure - xvals: [85000, 80000, 75000, 70000, 65000, 60000, 55000 ] - errors: [ 120, 140, 140, 140, 140, 140, 1.0e+11] - -# Initial Error Assignments for SFCSHIP Observations -- filter: Perform Action - filter variables: - - name: stationPressure - where: - - variable: ObsType/stationPressure - is_in: [180] - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelStepwiseLinear - options: - round_to_the_nearest_integer: true - xvar: - name: ObsValue/stationPressure - xvals: [60000, 55000 ] - errors: [ 130, 1.0e+11] - -- filter: Perform Action - filter variables: - - name: stationPressure - where: - - variable: ObsType/stationPressure - is_in: [183] - action: - name: assign error - error parameter: 1.0e+11 - -# Initial Error Assignments for Radiosonde -- filter: Perform Action - filter variables: - - name: stationPressure - where: - - variable: ObsType/stationPressure - is_in: [120] - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelStepwiseLinear - options: - round_to_the_nearest_integer: true - xvar: - name: ObsValue/stationPressure - xvals: [80000, 75000, 70000, 65000, 60000, 55000 ] - errors: [ 110, 120, 120, 120, 120, 1.0e+11] - -# Create PreQC group variable (pqm in GSI read_prepbufr) -- filter: Variable Assignment - assignments: - - name: InputObsError/stationPressure - type: float - source variable: ObsErrorData/stationPressure - -# Set observation quality-realted variables -# Create PreQC group variable (pqm in GSI read_prepbufr) -- filter: Variable Assignment - assignments: - - name: PreQC/stationPressure - type: int - source variable: QualityMarker/stationPressure - -# Create PreUseFlag group variable (usage in GSI read_prepbufr) -# Initialize -- filter: Variable Assignment - assignments: - - name: PreUseFlag/stationPressure - type: int - source variable: PreQC/stationPressure - -- filter: Variable Assignment - where: - - variable: - name: PreUseFlag/stationPressure - is_in: 1-15 - assignments: - - name: PreUseFlag/stationPressure - value: 0 -# Re-assignment -- filter: Variable Assignment - where: - - variable: - name: ObsType/stationPressure - is_in: 183 - assignments: - - name: PreUseFlag/stationPressure - value: 100 - -- filter: Variable Assignment - where: - - variable: - name: ObsValue/stationPressure - is_defined: - - variable: - name: ObsValue/stationPressure - maxvalue: 50000.00 - where operator: and - assignments: - - name: PreUseFlag/stationPressure - value: 100 - -- filter: Variable Assignment - where: - - variable: - name: PreQC/stationPressure - is_in: 9, 12, 15 - assignments: - - name: PreUseFlag/stationPressure - value: 100 - -- filter: Variable Assignment - where: - - variable: - name: PreQC/stationPressure - is_in: 4-15 - assignments: - - name: PreUseFlag/stationPressure - value: 101 - -## Observation range sanity check -#- filter: Bounds Check -# filter variables: -# - name: stationPressure -# minvalue: 37499.0 -# maxvalue: 106999.0 -# action: -# name: reject - -## Reject all ObsType 183 -#- filter: RejectList -# where: -# - variable: -# name: ObsType/stationPressure -# is_in: 183 - -## Reject surface pressure below 500 hPa -#- filter: Bounds Check -# filter variables: -# - name: stationPressure -# minvalue: 50000.00 -# action: -# name: reject - -#- filter: RejectList -# where: -# - variable: -# name: PreQC/stationPressure -# is_in: 4-15 - -# Inflate obs error based on obs type -- filter: Perform Action - filter variables: - - name: stationPressure - where: - - variable: PreQC/stationPressure - is_in: 3, 7 - action: - name: inflate error - inflation factor: 1.2 - -obs post filters: -# Calculate obs error inflation factors for duplicated observations at the same location -- filter: Variable Assignment - assignments: - - name: ObsErrorFactorDuplicateCheck/stationPressure - type: float - function: - name: ObsFunction/ObsErrorFactorDuplicateCheck - options: - use_air_pressure: false - variable: stationPressure - -# Reduce effective observation error based on obs type and subtype -# In this case: reduce effective obs error for buoy -- filter: Perform Action - filter variables: - - name: stationPressure - where: - - variable: - name: ObsType/stationPressure - is_in: 180 - - variable: - name: ObsSubType/stationPressure - is_in: 0 - action: - name: inflate error - inflation factor: 0.7 - -# Calculate obs error inflation factors for large discrepancies between model and observations -- filter: Variable Assignment - assignments: - - name: ObsErrorFactorSfcPressure/stationPressure - type: float - function: - name: ObsFunction/ObsErrorFactorSfcPressure - options: - geovar_sfc_geomz: surface_altitude - geovar_geomz: geopotential_height - station_altitude: height - -# Inflate surface pressure observation based on discrepancies between -# model and observations due to terrian -- filter: Perform Action - filter variables: - - name: stationPressure - action: - name: inflate error - inflation variable: - name: ObsErrorFactorSfcPressure/stationPressure - -- filter: Variable Assignment - assignments: - - name: DerivedMetaData/Innovation - type: float - function: - name: ObsFunction/Arithmetic - options: - variables: - - name: ObsValue/stationPressure - - name: HofX/stationPressure - coefs: [1, -1] - -- filter: Variable Assignment - assignments: - - name: DerivedMetaData/ObsErrorBoundSfcPressure1 - type: float - function: - name: ObsFunction/ObsErrorBoundConventional - options: - obsvar: stationPressure - obserr_bound_min: 100 - obserr_bound_max: 300 - obserr_bound_factor: 5.0 - -- filter: Background Check - filter variables: - - name: stationPressure - where: - - variable: PreQC/stationPressure - is_not_in: 3 - function absolute threshold: - - name: DerivedMetaData/ObsErrorBoundSfcPressure1 - action: - name: reject - -- filter: Variable Assignment - assignments: - - name: DerivedMetaData/ObsErrorBoundSfcPressure2 - type: float - function: - name: ObsFunction/ObsErrorBoundConventional - options: - obsvar: stationPressure - obserr_bound_min: 100 - obserr_bound_max: 300 - obserr_bound_factor: 3.5 - -- filter: Background Check - filter variables: - - name: stationPressure - where: - - variable: PreQC/stationPressure - is_in: 3 - function absolute threshold: - - name: DerivedMetaData/ObsErrorBoundSfcPressure2 - action: - name: reject - -# Inflate obs error based on duplicate check -- filter: Perform Action - filter variables: - - name: stationPressure - action: - name: inflate error - inflation variable: - name: ObsErrorFactorDuplicateCheck/stationPressure - -# Reject data based on PreUseFlag (usage in GSI) -- filter: Perform Action - filter variables: - - name: stationPressure - where: - - variable: PreUseFlag/stationPressure - is_not_in: 0, 1 - action: - name: reject -# End of Filters - diff --git a/parm/atm/obs/config/conv_ps.yaml.j2 b/parm/atm/obs/config/conv_ps.yaml.j2 new file mode 100644 index 000000000..09aed9d25 --- /dev/null +++ b/parm/atm/obs/config/conv_ps.yaml.j2 @@ -0,0 +1,350 @@ +- obs space: + name: surface_ps + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}conventional_ps.prepbufr.nc' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_conventional_ps_prepbufr_{{ current_cycle | to_YMDH }}.nc' + io pool: + max pool size: 1 + simulated variables: [stationPressure] + + obs operator: + name: SfcPCorrected + variables: + - name: stationPressure + da_psfc_scheme: GSI + station_altitude: height + geovar_sfc_geomz: surface_altitude + geovar_geomz: geopotential_height + + linear obs operator: + name: Identity + variables: + - name: stationPressure + + obs prior filters: + # Initial Error Assignments for SFC Observations + - filter: Perform Action + filter variables: + - name: stationPressure + where: + - variable: ObsType/stationPressure + is_in: [181] + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + round_to_the_nearest_integer: true + xvar: + name: ObsValue/stationPressure + xvals: [80000, 75000, 70000, 65000, 60000, 55000 ] + errors: [110, 120, 120, 120, 120, 1.0e+11] + + - filter: Perform Action + filter variables: + - name: stationPressure + where: + - variable: ObsType/stationPressure + is_in: [187] + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + round_to_the_nearest_integer: true + xvar: + name: ObsValue/stationPressure + xvals: [85000, 80000, 75000, 70000, 65000, 60000, 55000 ] + errors: [ 120, 140, 140, 140, 140, 140, 1.0e+11] + + # Initial Error Assignments for SFCSHIP Observations + - filter: Perform Action + filter variables: + - name: stationPressure + where: + - variable: ObsType/stationPressure + is_in: [180] + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + round_to_the_nearest_integer: true + xvar: + name: ObsValue/stationPressure + xvals: [60000, 55000 ] + errors: [ 130, 1.0e+11] + + - filter: Perform Action + filter variables: + - name: stationPressure + where: + - variable: ObsType/stationPressure + is_in: [183] + action: + name: assign error + error parameter: 1.0e+11 + + # Initial Error Assignments for Radiosonde + - filter: Perform Action + filter variables: + - name: stationPressure + where: + - variable: ObsType/stationPressure + is_in: [120] + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + round_to_the_nearest_integer: true + xvar: + name: ObsValue/stationPressure + xvals: [80000, 75000, 70000, 65000, 60000, 55000 ] + errors: [ 110, 120, 120, 120, 120, 1.0e+11] + + # Create PreQC group variable (pqm in GSI read_prepbufr) + - filter: Variable Assignment + assignments: + - name: InputObsError/stationPressure + type: float + source variable: ObsErrorData/stationPressure + + # Set observation quality-realted variables + # Create PreQC group variable (pqm in GSI read_prepbufr) + - filter: Variable Assignment + assignments: + - name: PreQC/stationPressure + type: int + source variable: QualityMarker/stationPressure + + # Create PreUseFlag group variable (usage in GSI read_prepbufr) + # Initialize + - filter: Variable Assignment + assignments: + - name: PreUseFlag/stationPressure + type: int + source variable: PreQC/stationPressure + + - filter: Variable Assignment + where: + - variable: + name: PreUseFlag/stationPressure + is_in: 1-15 + assignments: + - name: PreUseFlag/stationPressure + value: 0 + # Re-assignment + - filter: Variable Assignment + where: + - variable: + name: ObsType/stationPressure + is_in: 183 + assignments: + - name: PreUseFlag/stationPressure + value: 100 + + - filter: Variable Assignment + where: + - variable: + name: ObsValue/stationPressure + is_defined: + - variable: + name: ObsValue/stationPressure + maxvalue: 50000.00 + where operator: and + assignments: + - name: PreUseFlag/stationPressure + value: 100 + + - filter: Variable Assignment + where: + - variable: + name: PreQC/stationPressure + is_in: 9, 12, 15 + assignments: + - name: PreUseFlag/stationPressure + value: 100 + + - filter: Variable Assignment + where: + - variable: + name: PreQC/stationPressure + is_in: 4-15 + assignments: + - name: PreUseFlag/stationPressure + value: 101 + + ## Observation range sanity check + #- filter: Bounds Check + # filter variables: + # - name: stationPressure + # minvalue: 37499.0 + # maxvalue: 106999.0 + # action: + # name: reject + + ## Reject all ObsType 183 + #- filter: RejectList + # where: + # - variable: + # name: ObsType/stationPressure + # is_in: 183 + + ## Reject surface pressure below 500 hPa + #- filter: Bounds Check + # filter variables: + # - name: stationPressure + # minvalue: 50000.00 + # action: + # name: reject + + #- filter: RejectList + # where: + # - variable: + # name: PreQC/stationPressure + # is_in: 4-15 + + # Inflate obs error based on obs type + - filter: Perform Action + filter variables: + - name: stationPressure + where: + - variable: PreQC/stationPressure + is_in: 3, 7 + action: + name: inflate error + inflation factor: 1.2 + + obs post filters: + # Calculate obs error inflation factors for duplicated observations at the same location + - filter: Variable Assignment + assignments: + - name: ObsErrorFactorDuplicateCheck/stationPressure + type: float + function: + name: ObsFunction/ObsErrorFactorDuplicateCheck + options: + use_air_pressure: false + variable: stationPressure + + # Reduce effective observation error based on obs type and subtype + # In this case: reduce effective obs error for buoy + - filter: Perform Action + filter variables: + - name: stationPressure + where: + - variable: + name: ObsType/stationPressure + is_in: 180 + - variable: + name: ObsSubType/stationPressure + is_in: 0 + action: + name: inflate error + inflation factor: 0.7 + + # Calculate obs error inflation factors for large discrepancies between model and observations + - filter: Variable Assignment + assignments: + - name: ObsErrorFactorSfcPressure/stationPressure + type: float + function: + name: ObsFunction/ObsErrorFactorSfcPressure + options: + geovar_sfc_geomz: surface_altitude + geovar_geomz: geopotential_height + station_altitude: height + + # Inflate surface pressure observation based on discrepancies between + # model and observations due to terrian + - filter: Perform Action + filter variables: + - name: stationPressure + action: + name: inflate error + inflation variable: + name: ObsErrorFactorSfcPressure/stationPressure + + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/Innovation + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsValue/stationPressure + - name: HofX/stationPressure + coefs: [1, -1] + + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/ObsErrorBoundSfcPressure1 + type: float + function: + name: ObsFunction/ObsErrorBoundConventional + options: + obsvar: stationPressure + obserr_bound_min: 100 + obserr_bound_max: 300 + obserr_bound_factor: 5.0 + + - filter: Background Check + filter variables: + - name: stationPressure + where: + - variable: PreQC/stationPressure + is_not_in: 3 + function absolute threshold: + - name: DerivedMetaData/ObsErrorBoundSfcPressure1 + action: + name: reject + + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/ObsErrorBoundSfcPressure2 + type: float + function: + name: ObsFunction/ObsErrorBoundConventional + options: + obsvar: stationPressure + obserr_bound_min: 100 + obserr_bound_max: 300 + obserr_bound_factor: 3.5 + + - filter: Background Check + filter variables: + - name: stationPressure + where: + - variable: PreQC/stationPressure + is_in: 3 + function absolute threshold: + - name: DerivedMetaData/ObsErrorBoundSfcPressure2 + action: + name: reject + + # Inflate obs error based on duplicate check + - filter: Perform Action + filter variables: + - name: stationPressure + action: + name: inflate error + inflation variable: + name: ObsErrorFactorDuplicateCheck/stationPressure + + # Reject data based on PreUseFlag (usage in GSI) + - filter: Perform Action + filter variables: + - name: stationPressure + where: + - variable: PreUseFlag/stationPressure + is_not_in: 0, 1 + action: + name: reject + # End of Filters diff --git a/parm/atm/obs/config/cris-fsr_n20.yaml b/parm/atm/obs/config/cris-fsr_n20.yaml deleted file mode 100644 index 3b26fb672..000000000 --- a/parm/atm/obs/config/cris-fsr_n20.yaml +++ /dev/null @@ -1,457 +0,0 @@ -obs space: - name: cris-fsr_n20 - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)cris-fsr_n20.${{ current_cycle | to_YMDH }}.nc - obsdataout: - engine: - type: H5File - obsfile: $(DATA)/diags/diag_cris-fsr_n20_${{ current_cycle | to_YMDH }}.nc - io pool: - max pool size: 1 - simulated variables: [brightness_temperature] - channels: &cris-fsr_n20_channels 19, 24, 26, 27, 28, 31, 32, 33, 37, 39, 42, 44, 47, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 208, - 211, 216, 224, 234, 236, 238, 239, 242, 246, 248, 255, 264, 266, 268, - 275, 279, 283, 285, 291, 295, 301, 305, 311, 332, 342, 389, 400, 402, - 404, 406, 410, 427, 439, 440, 441, 445, 449, 455, 458, 461, 464, 467, - 470, 473, 475, 482, 486, 487, 490, 493, 496, 499, 501, 503, 505, 511, - 513, 514, 518, 519, 520, 522, 529, 534, 563, 568, 575, 592, 594, 596, - 598, 600, 602, 604, 611, 614, 616, 618, 620, 622, 626, 631, 638, 646, - 648, 652, 659, 673, 675, 678, 684, 688, 694, 700, 707, 710, 713, 714, - 718, 720, 722, 725, 728, 735, 742, 748, 753, 762, 780, 784, 798, 849, - 860, 862, 866, 874, 882, 890, 898, 906, 907, 908, 914, 937, 972, 973, - 978, 980, 981, 988, 995, 998, 1000, 1003, 1008, 1009, 1010, 1014, 1017, - 1018, 1020, 1022, 1024, 1026, 1029, 1030, 1032, 1034, 1037, 1038, 1041, - 1042, 1044, 1046, 1049, 1050, 1053, 1054, 1058, 1060, 1062, 1064, 1066, - 1069, 1076, 1077, 1080, 1086, 1091, 1095, 1101, 1109, 1112, 1121, 1128, - 1133, 1163, 1172, 1187, 1189, 1205, 1211, 1219, 1231, 1245, 1271, 1289, - 1300, 1313, 1316, 1325, 1329, 1346, 1347, 1473, 1474, 1491, 1499, 1553, - 1570, 1596, 1602, 1619, 1624, 1635, 1939, 1940, 1941, 1942, 1943, 1944, - 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, - 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, - 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, - 1981, 1982, 1983, 1984, 1985, 1986, 1987, 2119, 2140, 2143, 2147, 2153, - 2158, 2161, 2168, 2171, 2175, 2182 -obs operator: - name: CRTM - Absorbers: [H2O,O3] - Clouds: [Water, Ice] - Cloud_Fraction: 1.0 - obs options: - Sensor_ID: cris-fsr_n20 - EndianType: little_endian - CoefficientPath: $(DATA)/crtm/ -obs bias: - input file: $(DATA)/obs/$(GPREFIX)cris-fsr_n20.satbias.nc - output file: $(DATA)/bc/$(APREFIX)cris-fsr_n20.satbias.nc - variational bc: - predictors: - - name: constant - - name: lapse_rate - order: 2 - tlapse: &cris-fsr_n20_tlapse $(DATA)/obs/$(GPREFIX)cris-fsr_n20.tlapse.txt - - name: lapse_rate - tlapse: *cris-fsr_n20_tlapse - - name: emissivity - - name: scan_angle - order: 4 - - name: scan_angle - order: 3 - - name: scan_angle - order: 2 - - name: scan_angle - covariance: - minimal required obs number: 20 - variance range: [1.0e-6, 10.0] - step size: 1.0e-4 - largest analysis variance: 10000.0 - prior: - input file: $(DATA)/obs/$(GPREFIX)cris-fsr_n20.satbias_cov.nc - inflation: - ratio: 1.1 - ratio for small dataset: 2.0 - output file: $(DATA)/bc/$(APREFIX)cris-fsr_n20.satbias_cov.nc -# -#obs filters: -## Wavenumber Check -#- filter: BlackList -# filter variables: -# - name: brightness_temperature -# channels: 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, -# 1982, 1983, 1984, 1985, 1986, 1987, 2119, 2140, 2143, 2147, -# 2153, 2158, 2161, 2168, 2171, 2175, 2182 -# where: -# - variable: -# name: solar_zenith_angle@MetaData -# maxvalue: 88.9999 -# - variable: -# name: water_area_fraction@GeoVaLs -# minvalue: 1.0e-12 -# action: -# name: reject -#- filter: BlackList -# filter variables: -# - name: brightness_temperature -# channels: *cris-fsr_n20_channels -# action: -# name: inflate error -# inflation variable: -# name: ObsErrorFactorWavenumIR@ObsFunction -# channels: *cris-fsr_n20_channels -# options: -# channels: *cris-fsr_n20_channels -## Observation Range Sanity Check -#- filter: Bounds Check -# filter variables: -# - name: brightness_temperature -# channels: *cris-fsr_n20_channels -# minvalue: 50.00001 -# maxvalue: 449.99999 -# action: -# name: reject -## Topography Check -#- filter: BlackList -# filter variables: -# - name: brightness_temperature -# channels: *cris-fsr_n20_channels -# action: -# name: inflate error -# inflation variable: -# name: ObsErrorFactorTopoRad@ObsFunction -# channels: *cris-fsr_n20_channels -# options: -# channels: *cris-fsr_n20_channels -# sensor: cris-fsr_n20 -## Transmittance Top Check -#- filter: BlackList -# filter variables: -# - name: brightness_temperature -# channels: *cris-fsr_n20_channels -# action: -# name: inflate error -# inflation variable: -# name: ObsErrorFactorTransmitTopRad@ObsFunction -# channels: *cris-fsr_n20_channels -# options: -# channels: *cris-fsr_n20_channels -## Cloud Detection Check -#- filter: Bounds Check -# filter variables: -# - name: brightness_temperature -# channels: *cris-fsr_n20_channels -# test variables: -# - name: CloudDetectMinResidualIR@ObsFunction -# channels: *cris-fsr_n20_channels -# options: -# channels: *cris-fsr_n20_channels -# use_flag: [ -1, 1, 1, -1, 1, -1, 1, -1, 1, 1, -# 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, -1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -# -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -# -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# 1, 1, -1, -1, 1, -1, -1, -1, 1, 1, -# 1, 1, -1, -1, -1, -1, 1, 1, -1, -1, -# -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -# -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -# 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, 1, 1, -1, -1, -1, -1, -1, 1, -# -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -# 1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1] -# use_flag_clddet: [ -1, 1, -1, -1, -1, -1, 1, -1, 1, -1, -# 1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -# -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -# -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -# -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -# -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -# -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -# -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -# -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -# -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, -# 1, 1, -1, -1, -1, -1, 1, 1, -1, -1, -# -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -# -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1] -# obserr_dtempf: [0.50,2.00,4.00,2.00,4.00] -# maxvalue: 1.0e-12 -# action: -# name: reject -## Surface Temperature Jacobian Check over Land -#- filter: Bounds Check -# filter variables: -# - name: brightness_temperature -# channels: *cris-fsr_n20_channels -# where: -# - variable: -# name: water_area_fraction@GeoVaLs -# maxvalue: 0.99 -# test variables: -# - name: brightness_temperature_jacobian_surface_temperature@ObsDiag -# channels: *cris-fsr_n20_channels -# maxvalue: 0.2 -## NSST Retrieval Check -#- filter: Bounds Check -# filter variables: -# - name: brightness_temperature -# channels: *cris-fsr_n20_channels -# test variables: -# - name: NearSSTRetCheckIR@ObsFunction -# channels: *cris-fsr_n20_channels -# options: -# channels: *cris-fsr_n20_channels -# use_flag: [ -1, 1, 1, -1, 1, -1, 1, -1, 1, 1, -# 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, -1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -# -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -# -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# 1, 1, -1, -1, 1, -1, -1, -1, 1, 1, -# 1, 1, -1, -1, -1, -1, 1, 1, -1, -1, -# -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -# -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -# 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, 1, 1, -1, -1, -1, -1, -1, 1, -# -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -# 1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1 ] -# obserr_demisf: [0.01,0.02,0.03,0.02,0.03] -# obserr_dtempf: [0.50,2.00,4.00,2.00,4.00] -# maxvalue: 1.0e-12 -# action: -# name: reject -## Surface Jacobians Check -#- filter: BlackList -# filter variables: -# - name: brightness_temperature -# channels: *cris-fsr_n20_channels -# action: -# name: inflate error -# inflation variable: -# name: ObsErrorFactorSurfJacobianRad@ObsFunction -# channels: *cris-fsr_n20_channels -# options: -# channels: *cris-fsr_n20_channels -# obserr_demisf: [0.01, 0.02, 0.03, 0.02, 0.03] -# obserr_dtempf: [0.50, 2.00, 4.00, 2.00, 4.00] -## Gross check -#- filter: Background Check -# filter variables: -# - name: brightness_temperature -# channels: *cris-fsr_n20_channels -# function absolute threshold: -# - name: ObsErrorBoundIR@ObsFunction -# channels: *cris-fsr_n20_channels -# options: -# channels: *cris-fsr_n20_channels -# obserr_bound_latitude: -# name: ObsErrorFactorLatRad@ObsFunction -# options: -# latitude_parameters: [25.0, 0.5, 0.04, 1.0] -# obserr_bound_transmittop: -# name: ObsErrorFactorTransmitTopRad@ObsFunction -# channels: *cris-fsr_n20_channels -# options: -# channels: *cris-fsr_n20_channels -# obserr_bound_max: [ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0 ] -# action: -# name: reject -## Useflag Check -#- filter: Bounds Check -# filter variables: -# - name: brightness_temperature -# channels: *cris-fsr_n20_channels -# test variables: -# - name: ChannelUseflagCheckRad@ObsFunction -# channels: *cris-fsr_n20_channels -# options: -# channels: *cris-fsr_n20_channels -# use_flag: [ -1, 1, 1, -1, 1, -1, 1, -1, 1, 1, -# 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, -1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -# -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -# -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# 1, 1, -1, -1, 1, -1, -1, -1, 1, 1, -# 1, 1, -1, -1, -1, -1, 1, 1, -1, -1, -# -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -# -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -# 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, 1, 1, -1, -1, -1, -1, -1, 1, -# -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -# 1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1 ] -# minvalue: 1.0e-12 -# action: -# name: reject diff --git a/parm/atm/obs/config/cris-fsr_n20.yaml.j2 b/parm/atm/obs/config/cris-fsr_n20.yaml.j2 new file mode 100644 index 000000000..54fa33c33 --- /dev/null +++ b/parm/atm/obs/config/cris-fsr_n20.yaml.j2 @@ -0,0 +1,457 @@ +- obs space: + name: cris-fsr_n20 + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}cris-fsr_n20.{{ current_cycle | to_YMDH }}.nc' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_cris-fsr_n20_{{ current_cycle | to_YMDH }}.nc' + io pool: + max pool size: 1 + simulated variables: [brightness_temperature] + channels: &cris-fsr_n20_channels 19, 24, 26, 27, 28, 31, 32, 33, 37, 39, 42, 44, 47, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 208, + 211, 216, 224, 234, 236, 238, 239, 242, 246, 248, 255, 264, 266, 268, + 275, 279, 283, 285, 291, 295, 301, 305, 311, 332, 342, 389, 400, 402, + 404, 406, 410, 427, 439, 440, 441, 445, 449, 455, 458, 461, 464, 467, + 470, 473, 475, 482, 486, 487, 490, 493, 496, 499, 501, 503, 505, 511, + 513, 514, 518, 519, 520, 522, 529, 534, 563, 568, 575, 592, 594, 596, + 598, 600, 602, 604, 611, 614, 616, 618, 620, 622, 626, 631, 638, 646, + 648, 652, 659, 673, 675, 678, 684, 688, 694, 700, 707, 710, 713, 714, + 718, 720, 722, 725, 728, 735, 742, 748, 753, 762, 780, 784, 798, 849, + 860, 862, 866, 874, 882, 890, 898, 906, 907, 908, 914, 937, 972, 973, + 978, 980, 981, 988, 995, 998, 1000, 1003, 1008, 1009, 1010, 1014, 1017, + 1018, 1020, 1022, 1024, 1026, 1029, 1030, 1032, 1034, 1037, 1038, 1041, + 1042, 1044, 1046, 1049, 1050, 1053, 1054, 1058, 1060, 1062, 1064, 1066, + 1069, 1076, 1077, 1080, 1086, 1091, 1095, 1101, 1109, 1112, 1121, 1128, + 1133, 1163, 1172, 1187, 1189, 1205, 1211, 1219, 1231, 1245, 1271, 1289, + 1300, 1313, 1316, 1325, 1329, 1346, 1347, 1473, 1474, 1491, 1499, 1553, + 1570, 1596, 1602, 1619, 1624, 1635, 1939, 1940, 1941, 1942, 1943, 1944, + 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, + 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, + 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, + 1981, 1982, 1983, 1984, 1985, 1986, 1987, 2119, 2140, 2143, 2147, 2153, + 2158, 2161, 2168, 2171, 2175, 2182 + obs operator: + name: CRTM + Absorbers: [H2O,O3] + Clouds: [Water, Ice] + Cloud_Fraction: 1.0 + obs options: + Sensor_ID: cris-fsr_n20 + EndianType: little_endian + CoefficientPath: '{{ DATA }}/crtm/' + obs bias: + input file: '{{ DATA }}/obs/{{ GPREFIX }}cris-fsr_n20.satbias.nc' + output file: '{{ DATA }}/bc/{{ APREFIX }}cris-fsr_n20.satbias.nc' + variational bc: + predictors: + - name: constant + - name: lapse_rate + order: 2 + tlapse: &cris-fsr_n20_tlapse '{{ DATA }}/obs/{{ GPREFIX }}cris-fsr_n20.tlapse.txt' + - name: lapse_rate + tlapse: *cris-fsr_n20_tlapse + - name: emissivity + - name: scan_angle + order: 4 + - name: scan_angle + order: 3 + - name: scan_angle + order: 2 + - name: scan_angle + covariance: + minimal required obs number: 20 + variance range: [1.0e-6, 10.0] + step size: 1.0e-4 + largest analysis variance: 10000.0 + prior: + input file: '{{ DATA }}/obs/{{ GPREFIX }}cris-fsr_n20.satbias_cov.nc' + inflation: + ratio: 1.1 + ratio for small dataset: 2.0 + output file: '{{ DATA }}/bc/{{ APREFIX }}cris-fsr_n20.satbias_cov.nc' + # + #obs filters: + ## Wavenumber Check + #- filter: BlackList + # filter variables: + # - name: brightness_temperature + # channels: 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, + # 1982, 1983, 1984, 1985, 1986, 1987, 2119, 2140, 2143, 2147, + # 2153, 2158, 2161, 2168, 2171, 2175, 2182 + # where: + # - variable: + # name: solar_zenith_angle@MetaData + # maxvalue: 88.9999 + # - variable: + # name: water_area_fraction@GeoVaLs + # minvalue: 1.0e-12 + # action: + # name: reject + #- filter: BlackList + # filter variables: + # - name: brightness_temperature + # channels: *cris-fsr_n20_channels + # action: + # name: inflate error + # inflation variable: + # name: ObsErrorFactorWavenumIR@ObsFunction + # channels: *cris-fsr_n20_channels + # options: + # channels: *cris-fsr_n20_channels + ## Observation Range Sanity Check + #- filter: Bounds Check + # filter variables: + # - name: brightness_temperature + # channels: *cris-fsr_n20_channels + # minvalue: 50.00001 + # maxvalue: 449.99999 + # action: + # name: reject + ## Topography Check + #- filter: BlackList + # filter variables: + # - name: brightness_temperature + # channels: *cris-fsr_n20_channels + # action: + # name: inflate error + # inflation variable: + # name: ObsErrorFactorTopoRad@ObsFunction + # channels: *cris-fsr_n20_channels + # options: + # channels: *cris-fsr_n20_channels + # sensor: cris-fsr_n20 + ## Transmittance Top Check + #- filter: BlackList + # filter variables: + # - name: brightness_temperature + # channels: *cris-fsr_n20_channels + # action: + # name: inflate error + # inflation variable: + # name: ObsErrorFactorTransmitTopRad@ObsFunction + # channels: *cris-fsr_n20_channels + # options: + # channels: *cris-fsr_n20_channels + ## Cloud Detection Check + #- filter: Bounds Check + # filter variables: + # - name: brightness_temperature + # channels: *cris-fsr_n20_channels + # test variables: + # - name: CloudDetectMinResidualIR@ObsFunction + # channels: *cris-fsr_n20_channels + # options: + # channels: *cris-fsr_n20_channels + # use_flag: [ -1, 1, 1, -1, 1, -1, 1, -1, 1, 1, + # 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, -1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, + # -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, + # -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # 1, 1, -1, -1, 1, -1, -1, -1, 1, 1, + # 1, 1, -1, -1, -1, -1, 1, 1, -1, -1, + # -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, + # -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, 1, 1, -1, -1, -1, -1, -1, -1, -1, + # 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, 1, 1, -1, -1, -1, -1, -1, 1, + # -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, + # 1, -1, -1, -1, -1, -1, -1, 1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1] + # use_flag_clddet: [ -1, 1, -1, -1, -1, -1, 1, -1, 1, -1, + # 1, -1, 1, -1, -1, 1, -1, -1, -1, 1, + # -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, + # -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, + # -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, + # -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, + # -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, + # -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, + # -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, + # -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, + # 1, 1, -1, -1, -1, -1, 1, 1, -1, -1, + # -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, + # -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, 1, 1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1] + # obserr_dtempf: [0.50,2.00,4.00,2.00,4.00] + # maxvalue: 1.0e-12 + # action: + # name: reject + ## Surface Temperature Jacobian Check over Land + #- filter: Bounds Check + # filter variables: + # - name: brightness_temperature + # channels: *cris-fsr_n20_channels + # where: + # - variable: + # name: water_area_fraction@GeoVaLs + # maxvalue: 0.99 + # test variables: + # - name: brightness_temperature_jacobian_surface_temperature@ObsDiag + # channels: *cris-fsr_n20_channels + # maxvalue: 0.2 + ## NSST Retrieval Check + #- filter: Bounds Check + # filter variables: + # - name: brightness_temperature + # channels: *cris-fsr_n20_channels + # test variables: + # - name: NearSSTRetCheckIR@ObsFunction + # channels: *cris-fsr_n20_channels + # options: + # channels: *cris-fsr_n20_channels + # use_flag: [ -1, 1, 1, -1, 1, -1, 1, -1, 1, 1, + # 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, -1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, + # -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, + # -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # 1, 1, -1, -1, 1, -1, -1, -1, 1, 1, + # 1, 1, -1, -1, -1, -1, 1, 1, -1, -1, + # -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, + # -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, 1, 1, -1, -1, -1, -1, -1, -1, -1, + # 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, 1, 1, -1, -1, -1, -1, -1, 1, + # -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, + # 1, -1, -1, -1, -1, -1, -1, 1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1 ] + # obserr_demisf: [0.01,0.02,0.03,0.02,0.03] + # obserr_dtempf: [0.50,2.00,4.00,2.00,4.00] + # maxvalue: 1.0e-12 + # action: + # name: reject + ## Surface Jacobians Check + #- filter: BlackList + # filter variables: + # - name: brightness_temperature + # channels: *cris-fsr_n20_channels + # action: + # name: inflate error + # inflation variable: + # name: ObsErrorFactorSurfJacobianRad@ObsFunction + # channels: *cris-fsr_n20_channels + # options: + # channels: *cris-fsr_n20_channels + # obserr_demisf: [0.01, 0.02, 0.03, 0.02, 0.03] + # obserr_dtempf: [0.50, 2.00, 4.00, 2.00, 4.00] + ## Gross check + #- filter: Background Check + # filter variables: + # - name: brightness_temperature + # channels: *cris-fsr_n20_channels + # function absolute threshold: + # - name: ObsErrorBoundIR@ObsFunction + # channels: *cris-fsr_n20_channels + # options: + # channels: *cris-fsr_n20_channels + # obserr_bound_latitude: + # name: ObsErrorFactorLatRad@ObsFunction + # options: + # latitude_parameters: [25.0, 0.5, 0.04, 1.0] + # obserr_bound_transmittop: + # name: ObsErrorFactorTransmitTopRad@ObsFunction + # channels: *cris-fsr_n20_channels + # options: + # channels: *cris-fsr_n20_channels + # obserr_bound_max: [ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0 ] + # action: + # name: reject + ## Useflag Check + #- filter: Bounds Check + # filter variables: + # - name: brightness_temperature + # channels: *cris-fsr_n20_channels + # test variables: + # - name: ChannelUseflagCheckRad@ObsFunction + # channels: *cris-fsr_n20_channels + # options: + # channels: *cris-fsr_n20_channels + # use_flag: [ -1, 1, 1, -1, 1, -1, 1, -1, 1, 1, + # 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, -1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, + # -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, + # -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # 1, 1, -1, -1, 1, -1, -1, -1, 1, 1, + # 1, 1, -1, -1, -1, -1, 1, 1, -1, -1, + # -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, + # -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, 1, 1, -1, -1, -1, -1, -1, -1, -1, + # 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, 1, 1, -1, -1, -1, -1, -1, 1, + # -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, + # 1, -1, -1, -1, -1, -1, -1, 1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1 ] + # minvalue: 1.0e-12 + # action: + # name: reject diff --git a/parm/atm/obs/config/cris-fsr_npp.yaml b/parm/atm/obs/config/cris-fsr_npp.yaml deleted file mode 100644 index ff0aabe86..000000000 --- a/parm/atm/obs/config/cris-fsr_npp.yaml +++ /dev/null @@ -1,456 +0,0 @@ -obs space: - name: cris-fsr_npp - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)cris-fsr_npp.${{ current_cycle | to_YMDH }}.nc - obsdataout: - engine: - type: H5File - obsfile: $(DATA)/diags/diag_cris-fsr_npp_${{ current_cycle | to_YMDH }}.nc - io pool: - max pool size: 1 - simulated variables: [brightness_temperature] - channels: &cris-fsr_npp_channels 19, 24, 26, 27, 28, 31, 32, 33, 37, 39, 42, 44, 47, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 208, - 211, 216, 224, 234, 236, 238, 239, 242, 246, 248, 255, 264, 266, 268, - 275, 279, 283, 285, 291, 295, 301, 305, 311, 332, 342, 389, 400, 402, - 404, 406, 410, 427, 439, 440, 441, 445, 449, 455, 458, 461, 464, 467, - 470, 473, 475, 482, 486, 487, 490, 493, 496, 499, 501, 503, 505, 511, - 513, 514, 518, 519, 520, 522, 529, 534, 563, 568, 575, 592, 594, 596, - 598, 600, 602, 604, 611, 614, 616, 618, 620, 622, 626, 631, 638, 646, - 648, 652, 659, 673, 675, 678, 684, 688, 694, 700, 707, 710, 713, 714, - 718, 720, 722, 725, 728, 735, 742, 748, 753, 762, 780, 784, 798, 849, - 860, 862, 866, 874, 882, 890, 898, 906, 907, 908, 914, 937, 972, 973, - 978, 980, 981, 988, 995, 998, 1000, 1003, 1008, 1009, 1010, 1014, 1017, - 1018, 1020, 1022, 1024, 1026, 1029, 1030, 1032, 1034, 1037, 1038, 1041, - 1042, 1044, 1046, 1049, 1050, 1053, 1054, 1058, 1060, 1062, 1064, 1066, - 1069, 1076, 1077, 1080, 1086, 1091, 1095, 1101, 1109, 1112, 1121, 1128, - 1133, 1163, 1172, 1187, 1189, 1205, 1211, 1219, 1231, 1245, 1271, 1289, - 1300, 1313, 1316, 1325, 1329, 1346, 1347, 1473, 1474, 1491, 1499, 1553, - 1570, 1596, 1602, 1619, 1624, 1635, 1939, 1940, 1941, 1942, 1943, 1944, - 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, - 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, - 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, - 1981, 1982, 1983, 1984, 1985, 1986, 1987, 2119, 2140, 2143, 2147, 2153, - 2158, 2161, 2168, 2171, 2175, 2182 -obs operator: - name: CRTM - Absorbers: [H2O,O3] - Clouds: [Water, Ice] - Cloud_Fraction: 1.0 - obs options: - Sensor_ID: cris-fsr_npp - EndianType: little_endian - CoefficientPath: $(DATA)/crtm/ -obs bias: - input file: $(DATA)/obs/$(GPREFIX)cris-fsr_npp.satbias.nc - output file: $(DATA)/bc/$(APREFIX)cris-fsr_npp.satbias.nc - variational bc: - predictors: - - name: constant - - name: lapse_rate - order: 2 - tlapse: &cris-fsr_npp_tlapse $(DATA)/obs/$(GPREFIX)cris-fsr_npp.tlapse.txt - - name: lapse_rate - tlapse: *cris-fsr_npp_tlapse - - name: emissivity - - name: scan_angle - order: 4 - - name: scan_angle - order: 3 - - name: scan_angle - order: 2 - - name: scan_angle - covariance: - minimal required obs number: 20 - variance range: [1.0e-6, 10.0] - step size: 1.0e-4 - largest analysis variance: 10000.0 - prior: - input file: $(DATA)/obs/$(GPREFIX)cris-fsr_npp.satbias_cov.nc - inflation: - ratio: 1.1 - ratio for small dataset: 2.0 - output file: $(DATA)/bc/$(APREFIX)cris-fsr_npp.satbias_cov.nc -#obs filters: -## Wavenumber Check -#- filter: BlackList -# filter variables: -# - name: brightness_temperature -# channels: 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, -# 1982, 1983, 1984, 1985, 1986, 1987, 2119, 2140, 2143, 2147, -# 2153, 2158, 2161, 2168, 2171, 2175, 2182 -# where: -# - variable: -# name: solar_zenith_angle@MetaData -# maxvalue: 88.9999 -# - variable: -# name: water_area_fraction@GeoVaLs -# minvalue: 1.0e-12 -# action: -# name: reject -#- filter: BlackList -# filter variables: -# - name: brightness_temperature -# channels: *cris-fsr_npp_channels -# action: -# name: inflate error -# inflation variable: -# name: ObsErrorFactorWavenumIR@ObsFunction -# channels: *cris-fsr_npp_channels -# options: -# channels: *cris-fsr_npp_channels -## Observation Range Sanity Check -#- filter: Bounds Check -# filter variables: -# - name: brightness_temperature -# channels: *cris-fsr_npp_channels -# minvalue: 50.00001 -# maxvalue: 449.99999 -# action: -# name: reject -## Topography Check -#- filter: BlackList -# filter variables: -# - name: brightness_temperature -# channels: *cris-fsr_npp_channels -# action: -# name: inflate error -# inflation variable: -# name: ObsErrorFactorTopoRad@ObsFunction -# channels: *cris-fsr_npp_channels -# options: -# channels: *cris-fsr_npp_channels -# sensor: cris-fsr_npp -## Transmittance Top Check -#- filter: BlackList -# filter variables: -# - name: brightness_temperature -# channels: *cris-fsr_npp_channels -# action: -# name: inflate error -# inflation variable: -# name: ObsErrorFactorTransmitTopRad@ObsFunction -# channels: *cris-fsr_npp_channels -# options: -# channels: *cris-fsr_npp_channels -## Cloud Detection Check -#- filter: Bounds Check -# filter variables: -# - name: brightness_temperature -# channels: *cris-fsr_npp_channels -# test variables: -# - name: CloudDetectMinResidualIR@ObsFunction -# channels: *cris-fsr_npp_channels -# options: -# channels: *cris-fsr_npp_channels -# use_flag: [ -1, 1, 1, -1, 1, -1, 1, -1, 1, 1, -# 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, -1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -# -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -# -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# 1, 1, -1, -1, 1, -1, -1, -1, 1, 1, -# 1, 1, -1, -1, -1, -1, 1, 1, -1, -1, -# -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -# -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -# 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, 1, 1, -1, -1, -1, -1, -1, 1, -# -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -# 1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1] -# use_flag_clddet: [ -1, 1, -1, -1, -1, -1, 1, -1, 1, -1, -# 1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -# -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -# -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -# -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -# -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -# -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -# -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -# -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -# -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, -# 1, 1, -1, -1, -1, -1, 1, 1, -1, -1, -# -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -# -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1] -# obserr_dtempf: [0.50,2.00,4.00,2.00,4.00] -# maxvalue: 1.0e-12 -# action: -# name: reject -## Surface Temperature Jacobian Check over Land -#- filter: Bounds Check -# filter variables: -# - name: brightness_temperature -# channels: *cris-fsr_npp_channels -# where: -# - variable: -# name: water_area_fraction@GeoVaLs -# maxvalue: 0.99 -# test variables: -# - name: brightness_temperature_jacobian_surface_temperature@ObsDiag -# channels: *cris-fsr_npp_channels -# maxvalue: 0.2 -## NSST Retrieval Check -#- filter: Bounds Check -# filter variables: -# - name: brightness_temperature -# channels: *cris-fsr_npp_channels -# test variables: -# - name: NearSSTRetCheckIR@ObsFunction -# channels: *cris-fsr_npp_channels -# options: -# channels: *cris-fsr_npp_channels -# use_flag: [ -1, 1, 1, -1, 1, -1, 1, -1, 1, 1, -# 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, -1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -# -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -# -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# 1, 1, -1, -1, 1, -1, -1, -1, 1, 1, -# 1, 1, -1, -1, -1, -1, 1, 1, -1, -1, -# -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -# -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -# 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, 1, 1, -1, -1, -1, -1, -1, 1, -# -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -# 1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1 ] -# obserr_demisf: [0.01,0.02,0.03,0.02,0.03] -# obserr_dtempf: [0.50,2.00,4.00,2.00,4.00] -# maxvalue: 1.0e-12 -# action: -# name: reject -## Surface Jacobians Check -#- filter: BlackList -# filter variables: -# - name: brightness_temperature -# channels: *cris-fsr_npp_channels -# action: -# name: inflate error -# inflation variable: -# name: ObsErrorFactorSurfJacobianRad@ObsFunction -# channels: *cris-fsr_npp_channels -# options: -# channels: *cris-fsr_npp_channels -# obserr_demisf: [0.01, 0.02, 0.03, 0.02, 0.03] -# obserr_dtempf: [0.50, 2.00, 4.00, 2.00, 4.00] -## Gross check -#- filter: Background Check -# filter variables: -# - name: brightness_temperature -# channels: *cris-fsr_npp_channels -# function absolute threshold: -# - name: ObsErrorBoundIR@ObsFunction -# channels: *cris-fsr_npp_channels -# options: -# channels: *cris-fsr_npp_channels -# obserr_bound_latitude: -# name: ObsErrorFactorLatRad@ObsFunction -# options: -# latitude_parameters: [25.0, 0.5, 0.04, 1.0] -# obserr_bound_transmittop: -# name: ObsErrorFactorTransmitTopRad@ObsFunction -# channels: *cris-fsr_npp_channels -# options: -# channels: *cris-fsr_npp_channels -# obserr_bound_max: [ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, -# 2.0 ] -# action: -# name: reject -## Useflag Check -#- filter: Bounds Check -# filter variables: -# - name: brightness_temperature -# channels: *cris-fsr_npp_channels -# test variables: -# - name: ChannelUseflagCheckRad@ObsFunction -# channels: *cris-fsr_npp_channels -# options: -# channels: *cris-fsr_npp_channels -# use_flag: [ -1, 1, 1, -1, 1, -1, 1, -1, 1, 1, -# 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, -1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -# -1, 1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -# -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -# -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -# -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# 1, 1, -1, -1, 1, -1, -1, -1, 1, 1, -# 1, 1, -1, -1, -1, -1, 1, 1, -1, -1, -# -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -# -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -# 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, 1, 1, -1, -1, -1, -1, -1, 1, -# -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -# 1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -# -1 ] -# minvalue: 1.0e-12 -# action: -# name: reject diff --git a/parm/atm/obs/config/cris-fsr_npp.yaml.j2 b/parm/atm/obs/config/cris-fsr_npp.yaml.j2 new file mode 100644 index 000000000..a245b748f --- /dev/null +++ b/parm/atm/obs/config/cris-fsr_npp.yaml.j2 @@ -0,0 +1,456 @@ +- obs space: + name: cris-fsr_npp + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}cris-fsr_npp.{{ current_cycle | to_YMDH }}.nc' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_cris-fsr_npp_{{ current_cycle | to_YMDH }}.nc' + io pool: + max pool size: 1 + simulated variables: [brightness_temperature] + channels: &cris-fsr_npp_channels 19, 24, 26, 27, 28, 31, 32, 33, 37, 39, 42, 44, 47, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 208, + 211, 216, 224, 234, 236, 238, 239, 242, 246, 248, 255, 264, 266, 268, + 275, 279, 283, 285, 291, 295, 301, 305, 311, 332, 342, 389, 400, 402, + 404, 406, 410, 427, 439, 440, 441, 445, 449, 455, 458, 461, 464, 467, + 470, 473, 475, 482, 486, 487, 490, 493, 496, 499, 501, 503, 505, 511, + 513, 514, 518, 519, 520, 522, 529, 534, 563, 568, 575, 592, 594, 596, + 598, 600, 602, 604, 611, 614, 616, 618, 620, 622, 626, 631, 638, 646, + 648, 652, 659, 673, 675, 678, 684, 688, 694, 700, 707, 710, 713, 714, + 718, 720, 722, 725, 728, 735, 742, 748, 753, 762, 780, 784, 798, 849, + 860, 862, 866, 874, 882, 890, 898, 906, 907, 908, 914, 937, 972, 973, + 978, 980, 981, 988, 995, 998, 1000, 1003, 1008, 1009, 1010, 1014, 1017, + 1018, 1020, 1022, 1024, 1026, 1029, 1030, 1032, 1034, 1037, 1038, 1041, + 1042, 1044, 1046, 1049, 1050, 1053, 1054, 1058, 1060, 1062, 1064, 1066, + 1069, 1076, 1077, 1080, 1086, 1091, 1095, 1101, 1109, 1112, 1121, 1128, + 1133, 1163, 1172, 1187, 1189, 1205, 1211, 1219, 1231, 1245, 1271, 1289, + 1300, 1313, 1316, 1325, 1329, 1346, 1347, 1473, 1474, 1491, 1499, 1553, + 1570, 1596, 1602, 1619, 1624, 1635, 1939, 1940, 1941, 1942, 1943, 1944, + 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, + 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, + 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, + 1981, 1982, 1983, 1984, 1985, 1986, 1987, 2119, 2140, 2143, 2147, 2153, + 2158, 2161, 2168, 2171, 2175, 2182 + obs operator: + name: CRTM + Absorbers: [H2O,O3] + Clouds: [Water, Ice] + Cloud_Fraction: 1.0 + obs options: + Sensor_ID: cris-fsr_npp + EndianType: little_endian + CoefficientPath: '{{ DATA }}/crtm/' + obs bias: + input file: '{{ DATA }}/obs/{{ GPREFIX }}cris-fsr_npp.satbias.nc' + output file: '{{ DATA }}/bc/{{ APREFIX }}cris-fsr_npp.satbias.nc' + variational bc: + predictors: + - name: constant + - name: lapse_rate + order: 2 + tlapse: &cris-fsr_npp_tlapse '{{ DATA }}/obs/{{ GPREFIX }}cris-fsr_npp.tlapse.txt' + - name: lapse_rate + tlapse: *cris-fsr_npp_tlapse + - name: emissivity + - name: scan_angle + order: 4 + - name: scan_angle + order: 3 + - name: scan_angle + order: 2 + - name: scan_angle + covariance: + minimal required obs number: 20 + variance range: [1.0e-6, 10.0] + step size: 1.0e-4 + largest analysis variance: 10000.0 + prior: + input file: '{{ DATA }}/obs/{{ GPREFIX }}cris-fsr_npp.satbias_cov.nc' + inflation: + ratio: 1.1 + ratio for small dataset: 2.0 + output file: '{{ DATA }}/bc/{{ APREFIX }}cris-fsr_npp.satbias_cov.nc' + #obs filters: + ## Wavenumber Check + #- filter: BlackList + # filter variables: + # - name: brightness_temperature + # channels: 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, + # 1982, 1983, 1984, 1985, 1986, 1987, 2119, 2140, 2143, 2147, + # 2153, 2158, 2161, 2168, 2171, 2175, 2182 + # where: + # - variable: + # name: solar_zenith_angle@MetaData + # maxvalue: 88.9999 + # - variable: + # name: water_area_fraction@GeoVaLs + # minvalue: 1.0e-12 + # action: + # name: reject + #- filter: BlackList + # filter variables: + # - name: brightness_temperature + # channels: *cris-fsr_npp_channels + # action: + # name: inflate error + # inflation variable: + # name: ObsErrorFactorWavenumIR@ObsFunction + # channels: *cris-fsr_npp_channels + # options: + # channels: *cris-fsr_npp_channels + ## Observation Range Sanity Check + #- filter: Bounds Check + # filter variables: + # - name: brightness_temperature + # channels: *cris-fsr_npp_channels + # minvalue: 50.00001 + # maxvalue: 449.99999 + # action: + # name: reject + ## Topography Check + #- filter: BlackList + # filter variables: + # - name: brightness_temperature + # channels: *cris-fsr_npp_channels + # action: + # name: inflate error + # inflation variable: + # name: ObsErrorFactorTopoRad@ObsFunction + # channels: *cris-fsr_npp_channels + # options: + # channels: *cris-fsr_npp_channels + # sensor: cris-fsr_npp + ## Transmittance Top Check + #- filter: BlackList + # filter variables: + # - name: brightness_temperature + # channels: *cris-fsr_npp_channels + # action: + # name: inflate error + # inflation variable: + # name: ObsErrorFactorTransmitTopRad@ObsFunction + # channels: *cris-fsr_npp_channels + # options: + # channels: *cris-fsr_npp_channels + ## Cloud Detection Check + #- filter: Bounds Check + # filter variables: + # - name: brightness_temperature + # channels: *cris-fsr_npp_channels + # test variables: + # - name: CloudDetectMinResidualIR@ObsFunction + # channels: *cris-fsr_npp_channels + # options: + # channels: *cris-fsr_npp_channels + # use_flag: [ -1, 1, 1, -1, 1, -1, 1, -1, 1, 1, + # 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, -1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, + # -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, + # -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # 1, 1, -1, -1, 1, -1, -1, -1, 1, 1, + # 1, 1, -1, -1, -1, -1, 1, 1, -1, -1, + # -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, + # -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, 1, 1, -1, -1, -1, -1, -1, -1, -1, + # 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, 1, 1, -1, -1, -1, -1, -1, 1, + # -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, + # 1, -1, -1, -1, -1, -1, -1, 1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1] + # use_flag_clddet: [ -1, 1, -1, -1, -1, -1, 1, -1, 1, -1, + # 1, -1, 1, -1, -1, 1, -1, -1, -1, 1, + # -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, + # -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, + # -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, + # -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, + # -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, + # -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, + # -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, + # -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, + # 1, 1, -1, -1, -1, -1, 1, 1, -1, -1, + # -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, + # -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, 1, 1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1] + # obserr_dtempf: [0.50,2.00,4.00,2.00,4.00] + # maxvalue: 1.0e-12 + # action: + # name: reject + ## Surface Temperature Jacobian Check over Land + #- filter: Bounds Check + # filter variables: + # - name: brightness_temperature + # channels: *cris-fsr_npp_channels + # where: + # - variable: + # name: water_area_fraction@GeoVaLs + # maxvalue: 0.99 + # test variables: + # - name: brightness_temperature_jacobian_surface_temperature@ObsDiag + # channels: *cris-fsr_npp_channels + # maxvalue: 0.2 + ## NSST Retrieval Check + #- filter: Bounds Check + # filter variables: + # - name: brightness_temperature + # channels: *cris-fsr_npp_channels + # test variables: + # - name: NearSSTRetCheckIR@ObsFunction + # channels: *cris-fsr_npp_channels + # options: + # channels: *cris-fsr_npp_channels + # use_flag: [ -1, 1, 1, -1, 1, -1, 1, -1, 1, 1, + # 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, -1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, + # -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, + # -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # 1, 1, -1, -1, 1, -1, -1, -1, 1, 1, + # 1, 1, -1, -1, -1, -1, 1, 1, -1, -1, + # -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, + # -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, 1, 1, -1, -1, -1, -1, -1, -1, -1, + # 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, 1, 1, -1, -1, -1, -1, -1, 1, + # -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, + # 1, -1, -1, -1, -1, -1, -1, 1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1 ] + # obserr_demisf: [0.01,0.02,0.03,0.02,0.03] + # obserr_dtempf: [0.50,2.00,4.00,2.00,4.00] + # maxvalue: 1.0e-12 + # action: + # name: reject + ## Surface Jacobians Check + #- filter: BlackList + # filter variables: + # - name: brightness_temperature + # channels: *cris-fsr_npp_channels + # action: + # name: inflate error + # inflation variable: + # name: ObsErrorFactorSurfJacobianRad@ObsFunction + # channels: *cris-fsr_npp_channels + # options: + # channels: *cris-fsr_npp_channels + # obserr_demisf: [0.01, 0.02, 0.03, 0.02, 0.03] + # obserr_dtempf: [0.50, 2.00, 4.00, 2.00, 4.00] + ## Gross check + #- filter: Background Check + # filter variables: + # - name: brightness_temperature + # channels: *cris-fsr_npp_channels + # function absolute threshold: + # - name: ObsErrorBoundIR@ObsFunction + # channels: *cris-fsr_npp_channels + # options: + # channels: *cris-fsr_npp_channels + # obserr_bound_latitude: + # name: ObsErrorFactorLatRad@ObsFunction + # options: + # latitude_parameters: [25.0, 0.5, 0.04, 1.0] + # obserr_bound_transmittop: + # name: ObsErrorFactorTransmitTopRad@ObsFunction + # channels: *cris-fsr_npp_channels + # options: + # channels: *cris-fsr_npp_channels + # obserr_bound_max: [ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + # 2.0 ] + # action: + # name: reject + ## Useflag Check + #- filter: Bounds Check + # filter variables: + # - name: brightness_temperature + # channels: *cris-fsr_npp_channels + # test variables: + # - name: ChannelUseflagCheckRad@ObsFunction + # channels: *cris-fsr_npp_channels + # options: + # channels: *cris-fsr_npp_channels + # use_flag: [ -1, 1, 1, -1, 1, -1, 1, -1, 1, 1, + # 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, -1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + # -1, 1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, + # -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, + # -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, + # -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # 1, 1, -1, -1, 1, -1, -1, -1, 1, 1, + # 1, 1, -1, -1, -1, -1, 1, 1, -1, -1, + # -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, + # -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, 1, 1, -1, -1, -1, -1, -1, -1, -1, + # 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, 1, 1, -1, -1, -1, -1, -1, 1, + # -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, + # 1, -1, -1, -1, -1, -1, -1, 1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + # -1 ] + # minvalue: 1.0e-12 + # action: + # name: reject diff --git a/parm/atm/obs/config/gnssro.yaml b/parm/atm/obs/config/gnssro.yaml deleted file mode 100644 index 1b4d1a0dd..000000000 --- a/parm/atm/obs/config/gnssro.yaml +++ /dev/null @@ -1,139 +0,0 @@ -obs operator: - name: GnssroBndNBAM - obs options: - use_compress: 1 - sr_steps: 2 - vertlayer: full - super_ref_qc: NBAM -obs space: - name: gnssrobndnbam - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)gnssro.tm00.bufr_d.nc -# obsgrouping: -# group variables: [ 'sequenceNumber' ] -# sort variable: 'impactHeightRO' -# sort order: 'ascending' - obsdataout: - engine: - type: H5File - obsfile: $(DATA)/diags/diag_gnssro_{{ current_cycle | to_YMDH }}.nc - simulated variables: [bendingAngle] - -obs filters: -# Apply gross check using pccf -# Step 0-A: Create Diagnostic Flags -# Diagnostic flag for pccf -- filter: Create Diagnostic Flags - filter variables: - - name: bendingAngle - flags: - - name: pccfCheckReject - initial value: false - force reinitialization: true - -# Diagnostic flag for qfro -- filter: Create Diagnostic Flags - filter variables: - - name: bendingAngle - flags: - - name: qfroCheckReject - initial value: false - force reinitialization: true - -# Step 0-B: pccf Check - good: 0.1-100, reject: 0 -- filter: Bounds Check - filter variables: - - name: bendingAngle - where: - - variable: - name: MetaData/satelliteIdentifier - is_in: 265-269,750-755,44,786,820,825 - test variables: - - name: MetaData/pccf - minvalue: 0.1 - maxvalue: 100.1 - actions: - - name: set - flag: pccfCheckReject - - name: reject - -# Step 0-B: qfro Check - good: 0, reject: 1 -- filter: Bounds Check -- filter: RejectList - filter variables: - - name: bendingAngle - where: - - variable: - name: MetaData/satelliteIdentifier - is_in: 3-5,421,440,821 - test variables: - - name: MetaData/qualityFlags - minvalue: -0.1 - maxvalue: 0.1 - actions: - - name: set - flag: qfroCheckReject - - name: reject - -#1. gpstop -- filter: Domain Check - filter variables: - - name: bendingAngle - where: - - variable: - name: MetaData/impactHeightRO - minvalue: 0 - maxvalue: 55000.1 - action: - name: reject -#2. commgpstop -- filter: Bounds Check - filter variables: - - name: bendingAngle - where: - - variable: - name: MetaData/satelliteIdentifier - is_in: 265,266,267,268,269 - test variables: - - name: MetaData/impactHeightRO - maxvalue: 45000.1 - action: - name: reject -#3. metop below 8 km -- filter: Bounds Check - filter variables: - - name: bendingAngle - where: - - variable: - name: MetaData/satelliteIdentifier - is_in: 3-5 - test variables: - - name: MetaData/impactHeightRO - minvalue: 8000.1 - action: - name: reject -#4. assign obs error -- filter: ROobserror - filter variables: - - name: bendingAngle - errmodel: NBAM -#5. RONBAM cut off check -- filter: Background Check RONBAM - filter variables: - - name: bendingAngle -#6. Obs error inflate -- filter: Background Check RONBAM - filter variables: - - name: bendingAngle - action: - name: RONBAMErrInflate -#7. Background check -#- filter: Background Check -# filter variables: -# - name: bendingAngle -# threshold: 10 -# action: -# name: reject - diff --git a/parm/atm/obs/config/gnssro.yaml.j2 b/parm/atm/obs/config/gnssro.yaml.j2 new file mode 100644 index 000000000..7caa2ad9b --- /dev/null +++ b/parm/atm/obs/config/gnssro.yaml.j2 @@ -0,0 +1,140 @@ +- obs space: + name: gnssrobndnbam + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}gnssro.tm00.bufr_d.nc' + # obsgrouping: + # group variables: [ 'sequenceNumber' ] + # sort variable: 'impactHeightRO' + # sort order: 'ascending' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_gnssro_{{ current_cycle | to_YMDH }}.nc' + simulated variables: [bendingAngle] + + obs operator: + name: GnssroBndNBAM + obs options: + use_compress: 1 + sr_steps: 2 + vertlayer: full + super_ref_qc: NBAM + + obs filters: + # Apply gross check using pccf + # Step 0-A: Create Diagnostic Flags + # Diagnostic flag for pccf + - filter: Create Diagnostic Flags + filter variables: + - name: bendingAngle + flags: + - name: pccfCheckReject + initial value: false + force reinitialization: true + + # Diagnostic flag for qfro + - filter: Create Diagnostic Flags + filter variables: + - name: bendingAngle + flags: + - name: qfroCheckReject + initial value: false + force reinitialization: true + + # Step 0-B: pccf Check - good: 0.1-100, reject: 0 + - filter: Bounds Check + filter variables: + - name: bendingAngle + where: + - variable: + name: MetaData/satelliteIdentifier + is_in: 265-269,750-755,44,786,820,825 + test variables: + - name: MetaData/pccf + minvalue: 0.1 + maxvalue: 100.1 + actions: + - name: set + flag: pccfCheckReject + - name: reject + + # Step 0-B: qfro Check - good: 0, reject: 1 + - filter: Bounds Check + - filter: RejectList + filter variables: + - name: bendingAngle + where: + - variable: + name: MetaData/satelliteIdentifier + is_in: 3-5,421,440,821 + test variables: + - name: MetaData/qualityFlags + minvalue: -0.1 + maxvalue: 0.1 + actions: + - name: set + flag: qfroCheckReject + - name: reject + + #1. gpstop + - filter: Domain Check + filter variables: + - name: bendingAngle + where: + - variable: + name: MetaData/impactHeightRO + minvalue: 0 + maxvalue: 55000.1 + action: + name: reject + #2. commgpstop + - filter: Bounds Check + filter variables: + - name: bendingAngle + where: + - variable: + name: MetaData/satelliteIdentifier + is_in: 265,266,267,268,269 + test variables: + - name: MetaData/impactHeightRO + maxvalue: 45000.1 + action: + name: reject + #3. metop below 8 km + - filter: Bounds Check + filter variables: + - name: bendingAngle + where: + - variable: + name: MetaData/satelliteIdentifier + is_in: 3-5 + test variables: + - name: MetaData/impactHeightRO + minvalue: 8000.1 + action: + name: reject + #4. assign obs error + - filter: ROobserror + filter variables: + - name: bendingAngle + errmodel: NBAM + #5. RONBAM cut off check + - filter: Background Check RONBAM + filter variables: + - name: bendingAngle + #6. Obs error inflate + - filter: Background Check RONBAM + filter variables: + - name: bendingAngle + action: + name: RONBAMErrInflate + #7. Background check + #- filter: Background Check + # filter variables: + # - name: bendingAngle + # threshold: 10 + # action: + # name: reject + diff --git a/parm/atm/obs/config/iasi_metop-a.yaml b/parm/atm/obs/config/iasi_metop-a.yaml deleted file mode 100644 index fdc974d8e..000000000 --- a/parm/atm/obs/config/iasi_metop-a.yaml +++ /dev/null @@ -1,756 +0,0 @@ -obs space: - name: iasi_metop-a - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)mtiasi_metop-a.tm00.nc - obsdataout: - engine: - type: H5File - obsfile: $(DATA)/diags/diag_iasi_metop-a_{{ current_cycle | to_YMDH }}.nc - io pool: - max pool size: 1 - observed variables: [radiance] - simulated variables: [brightnessTemperature] - derived variables: [brightnessTemperature] - channels: &iasi_metop-a_channels 16, 29, 32, 35, 38, 41, 44, 47, 49, 50, 51, 53, - 55, 56, 57, 59, 61, 62, 63, 66, 68, 70, 72, 74, 76, 78, 79, 81, 82, 83, - 84, 85, 86, 87, 89, 92, 93, 95, 97, 99, 101, 103, 104, 106, 109, 110, - 111, 113, 116, 119, 122, 125, 128, 131, 133, 135, 138, 141, 144, 146, - 148, 150, 151, 154, 157, 159, 160, 161, 163, 167, 170, 173, 176, 179, - 180, 185, 187, 191, 193, 197, 199, 200, 202, 203, 205, 207, 210, 212, - 213, 214, 217, 218, 219, 222, 224, 225, 226, 228, 230, 231, 232, 236, - 237, 239, 243, 246, 249, 252, 254, 259, 260, 262, 265, 267, 269, 275, - 279, 282, 285, 294, 296, 299, 300, 303, 306, 309, 313, 320, 323, 326, - 327, 329, 332, 335, 345, 347, 350, 354, 356, 360, 363, 366, 371, 372, - 373, 375, 377, 379, 381, 383, 386, 389, 398, 401, 404, 405, 407, 408, - 410, 411, 414, 416, 418, 423, 426, 428, 432, 433, 434, 439, 442, 445, - 450, 457, 459, 472, 477, 483, 509, 515, 546, 552, 559, 566, 571, 573, - 578, 584, 594, 625, 646, 662, 668, 705, 739, 756, 797, 867, 906, 921, - 1027, 1046, 1090, 1098, 1121, 1133, 1173, 1191, 1194, 1222, 1271, 1283, - 1338, 1409, 1414, 1420, 1424, 1427, 1430, 1434, 1440, 1442, 1445, 1450, - 1454, 1460, 1463, 1469, 1474, 1479, 1483, 1487, 1494, 1496, 1502, 1505, - 1509, 1510, 1513, 1518, 1521, 1526, 1529, 1532, 1536, 1537, 1541, 1545, - 1548, 1553, 1560, 1568, 1574, 1579, 1583, 1585, 1587, 1606, 1626, 1639, - 1643, 1652, 1658, 1659, 1666, 1671, 1675, 1681, 1694, 1697, 1710, 1786, - 1791, 1805, 1839, 1884, 1913, 1946, 1947, 1991, 2019, 2094, 2119, 2213, - 2239, 2271, 2289, 2321, 2333, 2346, 2349, 2352, 2359, 2367, 2374, 2398, - 2426, 2562, 2701, 2741, 2745, 2760, 2819, 2889, 2907, 2910, 2919, 2921, - 2939, 2944, 2945, 2948, 2951, 2958, 2971, 2977, 2985, 2988, 2990, 2991, - 2993, 3002, 3008, 3014, 3027, 3029, 3030, 3036, 3047, 3049, 3052, 3053, - 3055, 3058, 3064, 3069, 3087, 3093, 3098, 3105, 3107, 3110, 3116, 3127, - 3129, 3136, 3146, 3151, 3160, 3165, 3168, 3175, 3178, 3189, 3207, 3228, - 3244, 3248, 3252, 3256, 3263, 3281, 3295, 3303, 3309, 3312, 3322, 3326, - 3354, 3366, 3375, 3378, 3411, 3416, 3432, 3438, 3440, 3442, 3444, 3446, - 3448, 3450, 3452, 3454, 3458, 3467, 3476, 3484, 3491, 3497, 3499, 3504, - 3506, 3509, 3518, 3527, 3555, 3575, 3577, 3580, 3582, 3586, 3589, 3599, - 3610, 3626, 3638, 3646, 3653, 3658, 3661, 3673, 3689, 3700, 3710, 3726, - 3763, 3814, 3841, 3888, 4032, 4059, 4068, 4082, 4095, 4160, 4234, 4257, - 4411, 4498, 4520, 4552, 4567, 4608, 4646, 4698, 4808, 4849, 4920, 4939, - 4947, 4967, 4991, 4996, 5015, 5028, 5056, 5128, 5130, 5144, 5170, 5178, - 5183, 5188, 5191, 5368, 5371, 5379, 5381, 5383, 5397, 5399, 5401, 5403, - 5405, 5446, 5455, 5472, 5480, 5483, 5485, 5492, 5497, 5502, 5507, 5509, - 5517, 5528, 5558, 5697, 5714, 5749, 5766, 5785, 5798, 5799, 5801, 5817, - 5833, 5834, 5836, 5849, 5851, 5852, 5865, 5869, 5881, 5884, 5897, 5900, - 5916, 5932, 5948, 5963, 5968, 5978, 5988, 5992, 5994, 5997, 6003, 6008, - 6023, 6026, 6039, 6053, 6056, 6067, 6071, 6082, 6085, 6098, 6112, 6126, - 6135, 6140, 6149, 6154, 6158, 6161, 6168, 6174, 6182, 6187, 6205, 6209, - 6213, 6317, 6339, 6342, 6366, 6381, 6391, 6489, 6962, 6966, 6970, 6975, - 6977, 6982, 6985, 6987, 6989, 6991, 6993, 6995, 6997, 6999, 7000, 7004, - 7008, 7013, 7016, 7021, 7024, 7027, 7029, 7032, 7038, 7043, 7046, 7049, - 7069, 7072, 7076, 7081, 7084, 7089, 7099, 7209, 7222, 7231, 7235, 7247, - 7267, 7269, 7284, 7389, 7419, 7423, 7424, 7426, 7428, 7431, 7436, 7444, - 7475, 7549, 7584, 7665, 7666, 7831, 7836, 7853, 7865, 7885, 7888, 7912, - 7950, 7972, 7980, 7995, 8007, 8015, 8055, 8078 - -obs operator: - name: CRTM - Absorbers: [H2O,O3,CO2] - obs options: - Sensor_ID: iasi_metop-a - EndianType: little_endian - CoefficientPath: $(DATA)/crtm/ - linear obs operator: - Absorbers: [H2O,O3] - -obs bias: - input file: $(DATA)/obs/$(GPREFIX)iasi_metop-a.satbias.nc - output file: $(DATA)/bc/$(APREFIX)iasi_metop-a.satbias.nc - variational bc: - predictors: - - name: constant - - name: lapse_rate - order: 2 - tlapse: &iasi_metop-a_tlapse $(DATA)/obs/$(GPREFIX)iasi_metop-a.tlapse.txt - - name: lapse_rate - tlapse: *iasi_metop-a_tlapse - - name: emissivity - - name: scan_angle - order: 4 - - name: scan_angle - order: 3 - - name: scan_angle - order: 2 - - name: scan_angle - covariance: - minimal required obs number: 20 - variance range: [1.0e-6, 10.0] - step size: 1.0e-4 - largest analysis variance: 10000.0 - prior: - input file: $(DATA)/obs/$(GPREFIX)iasi_metop-a.satbias_cov.nc - inflation: - ratio: 1.1 - ratio for small dataset: 2.0 - output file: $(DATA)/bc/$(APREFIX)iasi_metop-a.satbias_cov.nc - -obs pre filters: -# Step 0-A: Create Diagnostic Flags -#- filter: Create Diagnostic Flags -# filter variables: -# - name: brightnessTemperature -# channels: *iasi_metop-a_channels -# flags: -# - name: ScanEdgeRemoval -# initial value: false -# force reinitialization: false -# - name: Thinning -# initial value: false -# force reinitialization: false -# - name: ShortwaveIRCheck -# initial value: false -# force reinitialization: false -# - name: ObsValueRangeCheck -# initial value: false -# force reinitialization: false -# - name: CloudDetection -# initial value: false -# force reinitialization: false -# - name: NSSTCheck -# initial value: false -# force reinitialization: false -# - name: GrossCheck -# initial value: false -# force reinitialization: false -# - name: InterChannelConsistency -# initial value: false -# force reinitialization: false -# - name: UseFlagCheck -# initial value: false -# force reinitialization: false - -# Step 0-B: Create Derived Variables -# Assign channel wavenumbers in m-1 -- filter: Variable Assignment - assignments: - - name: MetaData/sensorCentralWavenumber - type: float - channels: *iasi_metop-a_channels - function: - name: ObsFunction/LinearCombination - options: - variables: - - name: ObsValue/radiance - channels: *iasi_metop-a_channels - coefs: [25.0] - intercept: 64475.0 - use channel numbers: true - -# Transform radiance to brightness temperature -- filter: Variable Transforms - Transform: SatBrightnessTempFromRad - transform from: - name: ObsValue/radiance - channels: *iasi_metop-a_channels - spectral variable: - name: MetaData/sensorCentralWavenumber - channels: *iasi_metop-a_channels - radiance units: wavenumber - planck1: 1.191042953e-16 - planck2: 1.4387774e-2 - -# Step 0-C: Assign Observation Error -obs prior filters: -- filter: Perform Action - filter variables: - - name: brightnessTemperature - channels: *iasi_metop-a_channels - action: - name: assign error - error parameter vector: &iasi_metop-a_oberr [ 1.38, 0.81, 0.75, 0.79, 0.72, 0.74, 0.68, 0.72, 0.65, 0.65, - 0.65, 0.69, 0.64, 0.64, 0.65, 0.67, 0.62, 0.61, 0.62, 0.64, 0.59, 0.76, - 1.22, 0.78, 0.64, 0.62, 0.61, 0.69, 0.65, 0.59, 0.61, 0.59, 0.68, 0.62, - 0.68, 4.38, 3.05, 2.31, 1.56, 1.33, 1.58, 0.93, 1.67, 0.72, 0.57, 0.58, - 0.55, 0.68, 0.59, 0.68, 0.59, 0.65, 0.58, 0.62, 0.64, 0.58, 0.64, 0.55, - 0.64, 0.5, 0.82, 0.59, 0.62, 0.51, 0.64, 0.52, 0.51, 0.51, 0.76, 0.52, - 0.57, 0.55, 0.69, 0.58, 0.65, 0.61, 0.59, 0.64, 0.76, 0.72, 1.05, 0.75, - 0.51, 0.65, 1.3, 0.69, 0.93, 1.49, 1.12, 0.68, 0.66, 0.67, 0.59, 0.59, - 0.69, 0.67, 0.64, 0.62, 0.72, 0.69, 0.66, 0.79, 0.78, 0.74, 0.88, 0.77, - 0.88, 0.86, 1, 0.87, 0.85, 0.88, 0.84, 0.84, 0.84, 0.8, 0.8, 0.87, - 0.98, 0.52, 0.65, 0.69, 0.61, 0.6, 0.67, 0.79, 0.62, 0.66, 0.7, 0.65, - 0.62, 0.61, 0.62, 0.53, 0.6, 0.68, 0.95, 0.63, 0.97, 0.65, 0.98, 0.58, - 0.73, 0.65, 0.85, 0.99, 0.76, 0.85, 0.97, 0.77, 0.62, 0.63, 1.21, 1.41, - 1.55, 1.78, 1.35, 1.14, 1.69, 1.79, 1.46, 1.63, 1.94, 2.01, 1.24, 1.76, - 1.26, 1.47, 1.9, 1.66, 2.13, 1.49, 1.52, 1.55, 1.96, 2.31, 2.33, 2.32, - 2.31, 2.33, 2.23, 2.33, 1.84, 2.29, 2.28, 2.28, 2.28, 2.26, 2.26, 2.26, - 2.27, 2.24, 2.23, 2.24, 2.26, 2.28, 2.28, 2.3, 2.15, 2.31, 2.37, 2.27, - 2.29, 2.29, 2.23, 2.28, 2.32, 2.32, 2.31, 2.32, 2.32, 2.31, 2.31, 2.28, - 2.29, 2.28, 2.26, 2.29, 2.27, 2.26, 2.25, 2.27, 2.24, 2.21, 2.24, 2.17, - 2.18, 2.17, 2.21, 1.99, 2.16, 2.2, 2.13, 2.12, 2.13, 2.1, 2.12, 2.11, - 2.09, 2.09, 2.08, 2.09, 2.04, 2.04, 2.1, 2.01, 2.05, 2.03, 2.06, 1.98, - 1.95, 1.94, 1.91, 1.7, 1.76, 1.77, 1.83, 2.04, 1.91, 1.99, 1.99, 2.07, - 2.02, 2.04, 2.1, 2.06, 2.18, 2.21, 2.24, 2.23, 2.23, 1.98, 2.2, 2.18, - 2.18, 2.21, 2.23, 2.24, 2.24, 2.25, 1.8, 2.24, 1.73, 1.73, 2.27, 1.67, - 2.21, 1.72, 2.23, 2.23, 2.23, 2.24, 2.23, 2.12, 2.17, 1.74, 2.02, 1.88, - 1.67, 1.73, 1.83, 1.82, 1.73, 1.83, 2.19, 1.84, 1.89, 1.6, 1.71, 1.86, - 1.85, 1.84, 1.87, 1.91, 1.52, 1.95, 1.87, 1.89, 1.91, 1.91, 1.93, 1.9, - 1.91, 1.9, 1.89, 1.89, 1.91, 1.9, 1.91, 1.91, 1.91, 1.93, 1.94, 1.91, - 1.92, 1.77, 1.91, 1.95, 1.19, 1.96, 1.98, 1.94, 1.55, 1.91, 1.92, 1.92, - 1.97, 1.93, 1.99, 1.86, 1.12, 1.93, 1.92, 1.95, 1.85, 1.84, 1.91, 1.12, - 1.82, 1.82, 1.95, 1.24, 1.94, 1.96, 1.21, 1.83, 1.96, 1.36, 1.96, 1.82, - 1.92, 1.68, 1.93, 1.23, 1.96, 1.93, 1.86, 1.41, 1.16, 1.6, 1.25, 1.2, - 1.65, 1.66, 1.87, 1.94, 1.96, 1.91, 1.25, 1.93, 1.91, 1.7, 0.99, 1.81, - 1.92, 1.95, 1.5, 1.47, 1.15, 1.58, 1.18, 1.82, 1.13, 1.83, 1.91, 1.26, - 1.27, 1.91, 1.45, 1.6, 1.29, 1.94, 1.94, 1.23, 1.95, 1.21, 1.94, 1.86, - 1.9, 1.33, 1.75, 2.02, 1.98, 2.03, 1.83, 1.5, 2.04, 2.02, 1.9, 2, 2.02, - 1.95, 1.93, 1.95, 1.95, 1.99, 2, 1.94, 1.96, 1.86, 1.92, 1.88, 1.86, - 1.84, 1.87, 1.77, 1.89, 1.89, 1.88, 1.94, 1.82, 1.79, 1.86, 2.06, 2.33, - 1.88, 1.86, 1.81, 1.8, 1.8, 1.86, 1.9, 2, 2.06, 2.1, 2.2, 2, 2.16, - 1.98, 1.8, 1.8, 1.85, 1.75, 2.04, 2.19, 2.14, 2.19, 1.86, 2.1, 2.11, - 2.18, 2.03, 2.28, 2.19, 2.26, 2.26, 2.21, 2.21, 2.26, 2.33, 2.27, 2.21, - 2.12, 2.23, 2.26, 2.25, 1.88, 2.26, 2.24, 2.36, 2.29, 2.35, 2.3, 2.27, - 2.08, 2.05, 2.27, 2.28, 2.27, 2.28, 1.97, 2.25, 2.25, 2.25, 2.31, 2.28, - 2.27, 2.13, 2.24, 2.28, 2.28, 2.41, 2.34, 9.32, 2.28, 2.38, 2.27, 2.27, - 2.39, 2.11, 2.09, 2.1, 2.06, 2.12, 2.08, 2, 1.93, 2.02, 2.55, 1.54, - 1.64, 1.51, 1.55, 2.82, 2.92, 2.55, 2.37, 1.85, 1.6, 1.72, 1.74, 1.79, - 1.9, 1.94, 2, 2.04, 2.08, 2.12, 2.13, 2.16, 2.18, 2.18, 2.2, 2.2, 2.41, - 2.39, 2.38, 2.4, 2.42, 2.41, 2.43, 2.45, 2.43, 2.45, 2.43, 2.4, 2.44, - 2.4, 2.42, 2.43, 2.45, 2.45, 2.45, 2.46, 2.45, 2.45, 2.43, 2.51, 2.48, - 2.48, 2.53, 2.46, 2.49, 2.5, 2.5, 2.5, 2.52, 2.52, 2.54, 2.5, 2.48, - 2.5, 2.55, 2.5, 2.48, 2.5, 2.5, 2.52, 2.52, 2.48, 2.5, 2.5, 2.52, 2.46, - 2.53, 9 ] - -obs post filters: -# Step 1: Remove Observations from the Edge of the Scan -- filter: Domain Check - filter variables: - - name: brightnessTemperature - channels: *iasi_metop-a_channels - where: - - variable: - name: MetaData/sensorScanPosition - is_in: 5-56 - action: - name: reject -# actions: -# - name: set -# flag: ScanEdgeRemoval -# - name: reject - -# Step 2: Data Thinning -- filter: Gaussian Thinning - filter variables: - - name: brightnessTemperature - channels: *iasi_metop-a_channels - horizontal_mesh: 145 - use_reduced_horizontal_grid: true - distance_norm: geodesic - priority_variable: MetaData/fractionOfClearPixelsInFOV -# round_horizontal_bin_count_to_nearest: true -# partition_longitude_bins_using_mesh: true - action: - name: reject -# actions: -# - name: set -# flag: Thinning -# - name: reject - -# Step 3: Wavenumber Check -- filter: Perform Action - filter variables: - - name: brightnessTemperature - channels: 7024, 7027, 7029, 7032, 7038, 7043, 7046, 7049, 7069, 7072, - 7076, 7081, 7084, 7089, 7099, 7209, 7222, 7231, 7235, 7247, - 7267, 7269, 7284, 7389, 7419, 7423, 7424, 7426, 7428, 7431, - 7436, 7444, 7475, 7549, 7584, 7665, 7666, 7831, 7836, 7853, - 7865, 7885, 7888, 7912, 7950, 7972, 7980, 7995, 8007, 8015, - 8055, 8078 - where: - - variable: - name: MetaData/solarZenithAngle - maxvalue: 88.9999 - - variable: - name: water_area_fraction@GeoVaLs - minvalue: 1.0e-12 - action: - name: reject -# actions: -# - name: set -# flag: ShortwaveIRCheck -# - name: reject - -# Step 4: Observation Error Inflation based on Wavenumber -- filter: Perform Action - filter variables: - - name: brightnessTemperature - channels: *iasi_metop-a_channels - action: - name: inflate error - inflation variable: - name: ObsErrorFactorWavenumIR@ObsFunction - channels: *iasi_metop-a_channels - options: - channels: *iasi_metop-a_channels - -# Step 5: Observation Range Sanity Check -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: *iasi_metop-a_channels - minvalue: 50.00001 - maxvalue: 449.99999 -# maxvalue: 100.00000 - action: - name: reject -# actions: -# - name: set -# flag: ObsValueRangeCheck -# - name: reject - -# Step 6: Topography Check -- filter: Perform Action - filter variables: - - name: brightnessTemperature - channels: *iasi_metop-a_channels - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorTopoRad - channels: *iasi_metop-a_channels - options: - channels: *iasi_metop-a_channels - sensor: iasi_metop-a - -# Step 7: Transmittance Top Check -- filter: Perform Action - filter variables: - - name: brightnessTemperature - channels: *iasi_metop-a_channels - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorTransmitTopRad - channels: *iasi_metop-a_channels - options: - channels: *iasi_metop-a_channels - -# Step 8: Cloud Detection Check -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: *iasi_metop-a_channels - test variables: - - name: ObsFunction/CloudDetectMinResidualIR - channels: *iasi_metop-a_channels - options: - channels: *iasi_metop-a_channels - use_flag: [ 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, - 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, - -1, 1, 1, 1, -1, -1, 1, 1, -1, 1, - -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, - -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, - 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, - 1, -1, -1, -1, 1, 1, 1, 1, -1, 1, - 1, -1, 1, 1, 1, -1, 1, -1, 1, -1, - 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, - 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, - 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, - 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, - -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, -1, 1, -1, 1, -1, - 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, - -1, 1, -1, 1, -1, -1, -1, -1, -1, 1, - 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, - 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, - 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, - 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, - -1, -1, -1, -1, -1, -1, 1, -1, 1, -1, - 1, -1, -1, -1, 1, -1, -1, -1, -1, -1, - -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, - 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, - -1, 1, -1, 1, -1, 1, -1, -1, -1, 1, - 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, - -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, - -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, - 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, - -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, - -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1] - use_flag_clddet: [ 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, - 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, - -1, 1, 1, 1, -1, -1, 1, 1, -1, 1, - -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, - -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, - 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, - 1, -1, -1, -1, 1, 1, 1, 1, -1, 1, - 1, -1, 1, 1, 1, -1, 1, -1, 1, -1, - 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, - 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, - 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, - 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, - -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, -1, 1, -1, 1, -1, - 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, - -1, 1, -1, 1, -1, -1, -1, -1, -1, 1, - 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, - 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, - 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, - 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1, -1, 1, -1, 1, -1, -1, -1, 1, - 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, - -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1] - obserr_dtempf: [0.50,2.00,4.00,2.00,4.00] - error parameter vector: *iasi_metop-a_oberr - maxvalue: 1.0e-12 - action: - name: reject -# actions: -# - name: set -# flag: CloudDetection -# - name: reject - -# Step 9: NSST Retrieval Check -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: *iasi_metop-a_channels - test variables: - - name: NearSSTRetCheckIR@ObsFunction - channels: *iasi_metop-a_channels - options: - channels: *iasi_metop-a_channels - use_flag: [ 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, - 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, - -1, 1, 1, 1, -1, -1, 1, 1, -1, 1, - -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, - -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, - 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, - 1, -1, -1, -1, 1, 1, 1, 1, -1, 1, - 1, -1, 1, 1, 1, -1, 1, -1, 1, -1, - 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, - 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, - 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, - 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, - -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, -1, 1, -1, 1, -1, - 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, - -1, 1, -1, 1, -1, -1, -1, -1, -1, 1, - 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, - 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, - 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, - 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, - -1, -1, -1, -1, -1, -1, 1, -1, 1, -1, - 1, -1, -1, -1, 1, -1, -1, -1, -1, -1, - -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, - 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, - -1, 1, -1, 1, -1, 1, -1, -1, -1, 1, - 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, - -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, - -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, - 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, - -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, - -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1] - obserr_demisf: [0.01,0.02,0.03,0.02,0.03] - obserr_dtempf: [0.50,2.00,4.00,2.00,4.00] - maxvalue: 1.0e-12 - action: - name: reject -# actions: -# - name: set -# flag: NSSTCheck -# - name: reject - -# Step 10: Surface Jacobians Check -- filter: Perform Action - filter variables: - - name: brightnessTemperature - channels: *iasi_metop-a_channels - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorSurfJacobianRad - channels: *iasi_metop-a_channels - options: - channels: *iasi_metop-a_channels - obserr_demisf: [0.01, 0.02, 0.03, 0.02, 0.03] - obserr_dtempf: [0.50, 2.00, 4.00, 2.00, 4.00] - sensor: iasi_metop-a - -# Step 11: Gross check -- filter: Background Check - filter variables: - - name: brightnessTemperature - channels: *iasi_metop-a_channels - function absolute threshold: - - name: ObsFunction/ObsErrorBoundIR - channels: *iasi_metop-a_channels - options: - channels: *iasi_metop-a_channels - obserr_bound_latitude: - name: ObsFunction/ObsErrorFactorLatRad - options: - latitude_parameters: [25.0, 0.5, 0.04, 1.0] - obserr_bound_transmittop: - name: ObsFunction/ObsErrorFactorTransmitTopRad - channels: *iasi_metop-a_channels - options: - channels: *iasi_metop-a_channels - obserr_bound_max: [ 3.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 4.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 4.0, 4.0, - 3.5, 2.5, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 3.5, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 3.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.5, 2.0, 2.5, 2.5, 3.0, 2.5, - 2.5, 2.5, 2.5, 3.5, 2.5, 2.5, 3.0, 3.5, 3.0, 4.0, - 4.0, 4.0, 4.0, 4.0, 4.0, 4.5, 4.5, 4.5, 4.5, 4.5, - 4.0, 4.5, 4.0, 4.0, 4.5, 2.5, 3.0, 2.5, 3.0, 2.5, - 3.0, 2.0, 2.5, 2.5, 3.0, 3.0, 2.5, 3.0, 3.0, 3.0, - 2.5, 2.5, 4.0, 4.5, 4.5, 5.0, 4.0, 4.0, 5.0, 5.0, - 5.0, 5.0, 5.5, 5.5, 4.0, 5.0, 4.0, 4.5, 5.5, 5.5, - 6.0, 4.5, 4.5, 4.0, 5.0, 5.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 5.5, 4.5, 6.0, - 5.0, 5.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 5.0, 6.0, - 6.0, 6.0, 4.0, 6.0, 6.0, 6.0, 6.0, 4.5, 6.0, 6.0, - 4.5, 6.0, 6.0, 6.0, 6.0, 6.0, 5.0, 6.0, 6.0, 6.0, - 5.0, 6.0, 6.0, 5.0, 6.0, 5.0, 6.0, 6.0, 6.0, 5.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0] - error parameter vector: *iasi_metop-a_oberr - action: - name: reject -# actions: -# - name: set -# flag: GrossCheck -# - name: reject - -# Step 12: Useflag Check -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: *iasi_metop-a_channels - test variables: - - name: ObsFunction/ChannelUseflagCheckRad - channels: *iasi_metop-a_channels - options: - channels: *iasi_metop-a_channels - use_flag: [ 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, - 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, - -1, 1, 1, 1, -1, -1, 1, 1, -1, 1, - -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, - -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, - 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, - 1, -1, -1, -1, 1, 1, 1, 1, -1, 1, - 1, -1, 1, 1, 1, -1, 1, -1, 1, -1, - 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, - 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, - 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, - 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, - -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, -1, 1, -1, 1, -1, - 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, - -1, 1, -1, 1, -1, -1, -1, -1, -1, 1, - 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, - 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, - 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, - 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, - -1, -1, -1, -1, -1, -1, 1, -1, 1, -1, - 1, -1, -1, -1, 1, -1, -1, -1, -1, -1, - -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, - 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, - -1, 1, -1, 1, -1, 1, -1, -1, -1, 1, - 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, - -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, - -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, - 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, - -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, - -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1] - minvalue: 1.0e-12 - action: - name: reject -# actions: -# - name: set -# flag: UseFlagCheck -# - name: reject diff --git a/parm/atm/obs/config/iasi_metop-a.yaml.j2 b/parm/atm/obs/config/iasi_metop-a.yaml.j2 new file mode 100644 index 000000000..1634ccc6e --- /dev/null +++ b/parm/atm/obs/config/iasi_metop-a.yaml.j2 @@ -0,0 +1,756 @@ +- obs space: + name: iasi_metop-a + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}mtiasi_metop-a.tm00.nc' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_iasi_metop-a_{{ current_cycle | to_YMDH }}.nc' + io pool: + max pool size: 1 + observed variables: [radiance] + simulated variables: [brightnessTemperature] + derived variables: [brightnessTemperature] + channels: &iasi_metop-a_channels 16, 29, 32, 35, 38, 41, 44, 47, 49, 50, 51, 53, + 55, 56, 57, 59, 61, 62, 63, 66, 68, 70, 72, 74, 76, 78, 79, 81, 82, 83, + 84, 85, 86, 87, 89, 92, 93, 95, 97, 99, 101, 103, 104, 106, 109, 110, + 111, 113, 116, 119, 122, 125, 128, 131, 133, 135, 138, 141, 144, 146, + 148, 150, 151, 154, 157, 159, 160, 161, 163, 167, 170, 173, 176, 179, + 180, 185, 187, 191, 193, 197, 199, 200, 202, 203, 205, 207, 210, 212, + 213, 214, 217, 218, 219, 222, 224, 225, 226, 228, 230, 231, 232, 236, + 237, 239, 243, 246, 249, 252, 254, 259, 260, 262, 265, 267, 269, 275, + 279, 282, 285, 294, 296, 299, 300, 303, 306, 309, 313, 320, 323, 326, + 327, 329, 332, 335, 345, 347, 350, 354, 356, 360, 363, 366, 371, 372, + 373, 375, 377, 379, 381, 383, 386, 389, 398, 401, 404, 405, 407, 408, + 410, 411, 414, 416, 418, 423, 426, 428, 432, 433, 434, 439, 442, 445, + 450, 457, 459, 472, 477, 483, 509, 515, 546, 552, 559, 566, 571, 573, + 578, 584, 594, 625, 646, 662, 668, 705, 739, 756, 797, 867, 906, 921, + 1027, 1046, 1090, 1098, 1121, 1133, 1173, 1191, 1194, 1222, 1271, 1283, + 1338, 1409, 1414, 1420, 1424, 1427, 1430, 1434, 1440, 1442, 1445, 1450, + 1454, 1460, 1463, 1469, 1474, 1479, 1483, 1487, 1494, 1496, 1502, 1505, + 1509, 1510, 1513, 1518, 1521, 1526, 1529, 1532, 1536, 1537, 1541, 1545, + 1548, 1553, 1560, 1568, 1574, 1579, 1583, 1585, 1587, 1606, 1626, 1639, + 1643, 1652, 1658, 1659, 1666, 1671, 1675, 1681, 1694, 1697, 1710, 1786, + 1791, 1805, 1839, 1884, 1913, 1946, 1947, 1991, 2019, 2094, 2119, 2213, + 2239, 2271, 2289, 2321, 2333, 2346, 2349, 2352, 2359, 2367, 2374, 2398, + 2426, 2562, 2701, 2741, 2745, 2760, 2819, 2889, 2907, 2910, 2919, 2921, + 2939, 2944, 2945, 2948, 2951, 2958, 2971, 2977, 2985, 2988, 2990, 2991, + 2993, 3002, 3008, 3014, 3027, 3029, 3030, 3036, 3047, 3049, 3052, 3053, + 3055, 3058, 3064, 3069, 3087, 3093, 3098, 3105, 3107, 3110, 3116, 3127, + 3129, 3136, 3146, 3151, 3160, 3165, 3168, 3175, 3178, 3189, 3207, 3228, + 3244, 3248, 3252, 3256, 3263, 3281, 3295, 3303, 3309, 3312, 3322, 3326, + 3354, 3366, 3375, 3378, 3411, 3416, 3432, 3438, 3440, 3442, 3444, 3446, + 3448, 3450, 3452, 3454, 3458, 3467, 3476, 3484, 3491, 3497, 3499, 3504, + 3506, 3509, 3518, 3527, 3555, 3575, 3577, 3580, 3582, 3586, 3589, 3599, + 3610, 3626, 3638, 3646, 3653, 3658, 3661, 3673, 3689, 3700, 3710, 3726, + 3763, 3814, 3841, 3888, 4032, 4059, 4068, 4082, 4095, 4160, 4234, 4257, + 4411, 4498, 4520, 4552, 4567, 4608, 4646, 4698, 4808, 4849, 4920, 4939, + 4947, 4967, 4991, 4996, 5015, 5028, 5056, 5128, 5130, 5144, 5170, 5178, + 5183, 5188, 5191, 5368, 5371, 5379, 5381, 5383, 5397, 5399, 5401, 5403, + 5405, 5446, 5455, 5472, 5480, 5483, 5485, 5492, 5497, 5502, 5507, 5509, + 5517, 5528, 5558, 5697, 5714, 5749, 5766, 5785, 5798, 5799, 5801, 5817, + 5833, 5834, 5836, 5849, 5851, 5852, 5865, 5869, 5881, 5884, 5897, 5900, + 5916, 5932, 5948, 5963, 5968, 5978, 5988, 5992, 5994, 5997, 6003, 6008, + 6023, 6026, 6039, 6053, 6056, 6067, 6071, 6082, 6085, 6098, 6112, 6126, + 6135, 6140, 6149, 6154, 6158, 6161, 6168, 6174, 6182, 6187, 6205, 6209, + 6213, 6317, 6339, 6342, 6366, 6381, 6391, 6489, 6962, 6966, 6970, 6975, + 6977, 6982, 6985, 6987, 6989, 6991, 6993, 6995, 6997, 6999, 7000, 7004, + 7008, 7013, 7016, 7021, 7024, 7027, 7029, 7032, 7038, 7043, 7046, 7049, + 7069, 7072, 7076, 7081, 7084, 7089, 7099, 7209, 7222, 7231, 7235, 7247, + 7267, 7269, 7284, 7389, 7419, 7423, 7424, 7426, 7428, 7431, 7436, 7444, + 7475, 7549, 7584, 7665, 7666, 7831, 7836, 7853, 7865, 7885, 7888, 7912, + 7950, 7972, 7980, 7995, 8007, 8015, 8055, 8078 + + obs operator: + name: CRTM + Absorbers: [H2O,O3,CO2] + obs options: + Sensor_ID: iasi_metop-a + EndianType: little_endian + CoefficientPath: '{{ DATA }}/crtm/' + linear obs operator: + Absorbers: [H2O,O3] + + obs bias: + input file: '{{ DATA }}/obs/{{ GPREFIX }}iasi_metop-a.satbias.nc' + output file: '{{ DATA }}/bc/{{ APREFIX }}iasi_metop-a.satbias.nc' + variational bc: + predictors: + - name: constant + - name: lapse_rate + order: 2 + tlapse: &iasi_metop-a_tlapse '{{ DATA }}/obs/{{ GPREFIX }}iasi_metop-a.tlapse.txt' + - name: lapse_rate + tlapse: *iasi_metop-a_tlapse + - name: emissivity + - name: scan_angle + order: 4 + - name: scan_angle + order: 3 + - name: scan_angle + order: 2 + - name: scan_angle + covariance: + minimal required obs number: 20 + variance range: [1.0e-6, 10.0] + step size: 1.0e-4 + largest analysis variance: 10000.0 + prior: + input file: '{{ DATA }}/obs/{{ GPREFIX }}iasi_metop-a.satbias_cov.nc' + inflation: + ratio: 1.1 + ratio for small dataset: 2.0 + output file: '{{ DATA }}/bc/{{ APREFIX }}iasi_metop-a.satbias_cov.nc' + + obs pre filters: + # Step 0-A: Create Diagnostic Flags + #- filter: Create Diagnostic Flags + # filter variables: + # - name: brightnessTemperature + # channels: *iasi_metop-a_channels + # flags: + # - name: ScanEdgeRemoval + # initial value: false + # force reinitialization: false + # - name: Thinning + # initial value: false + # force reinitialization: false + # - name: ShortwaveIRCheck + # initial value: false + # force reinitialization: false + # - name: ObsValueRangeCheck + # initial value: false + # force reinitialization: false + # - name: CloudDetection + # initial value: false + # force reinitialization: false + # - name: NSSTCheck + # initial value: false + # force reinitialization: false + # - name: GrossCheck + # initial value: false + # force reinitialization: false + # - name: InterChannelConsistency + # initial value: false + # force reinitialization: false + # - name: UseFlagCheck + # initial value: false + # force reinitialization: false + + # Step 0-B: Create Derived Variables + # Assign channel wavenumbers in m-1 + - filter: Variable Assignment + assignments: + - name: MetaData/sensorCentralWavenumber + type: float + channels: *iasi_metop-a_channels + function: + name: ObsFunction/LinearCombination + options: + variables: + - name: ObsValue/radiance + channels: *iasi_metop-a_channels + coefs: [25.0] + intercept: 64475.0 + use channel numbers: true + + # Transform radiance to brightness temperature + - filter: Variable Transforms + Transform: SatBrightnessTempFromRad + transform from: + name: ObsValue/radiance + channels: *iasi_metop-a_channels + spectral variable: + name: MetaData/sensorCentralWavenumber + channels: *iasi_metop-a_channels + radiance units: wavenumber + planck1: 1.191042953e-16 + planck2: 1.4387774e-2 + + # Step 0-C: Assign Observation Error + obs prior filters: + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-a_channels + action: + name: assign error + error parameter vector: &iasi_metop-a_oberr [ 1.38, 0.81, 0.75, 0.79, 0.72, 0.74, 0.68, 0.72, 0.65, 0.65, + 0.65, 0.69, 0.64, 0.64, 0.65, 0.67, 0.62, 0.61, 0.62, 0.64, 0.59, 0.76, + 1.22, 0.78, 0.64, 0.62, 0.61, 0.69, 0.65, 0.59, 0.61, 0.59, 0.68, 0.62, + 0.68, 4.38, 3.05, 2.31, 1.56, 1.33, 1.58, 0.93, 1.67, 0.72, 0.57, 0.58, + 0.55, 0.68, 0.59, 0.68, 0.59, 0.65, 0.58, 0.62, 0.64, 0.58, 0.64, 0.55, + 0.64, 0.5, 0.82, 0.59, 0.62, 0.51, 0.64, 0.52, 0.51, 0.51, 0.76, 0.52, + 0.57, 0.55, 0.69, 0.58, 0.65, 0.61, 0.59, 0.64, 0.76, 0.72, 1.05, 0.75, + 0.51, 0.65, 1.3, 0.69, 0.93, 1.49, 1.12, 0.68, 0.66, 0.67, 0.59, 0.59, + 0.69, 0.67, 0.64, 0.62, 0.72, 0.69, 0.66, 0.79, 0.78, 0.74, 0.88, 0.77, + 0.88, 0.86, 1, 0.87, 0.85, 0.88, 0.84, 0.84, 0.84, 0.8, 0.8, 0.87, + 0.98, 0.52, 0.65, 0.69, 0.61, 0.6, 0.67, 0.79, 0.62, 0.66, 0.7, 0.65, + 0.62, 0.61, 0.62, 0.53, 0.6, 0.68, 0.95, 0.63, 0.97, 0.65, 0.98, 0.58, + 0.73, 0.65, 0.85, 0.99, 0.76, 0.85, 0.97, 0.77, 0.62, 0.63, 1.21, 1.41, + 1.55, 1.78, 1.35, 1.14, 1.69, 1.79, 1.46, 1.63, 1.94, 2.01, 1.24, 1.76, + 1.26, 1.47, 1.9, 1.66, 2.13, 1.49, 1.52, 1.55, 1.96, 2.31, 2.33, 2.32, + 2.31, 2.33, 2.23, 2.33, 1.84, 2.29, 2.28, 2.28, 2.28, 2.26, 2.26, 2.26, + 2.27, 2.24, 2.23, 2.24, 2.26, 2.28, 2.28, 2.3, 2.15, 2.31, 2.37, 2.27, + 2.29, 2.29, 2.23, 2.28, 2.32, 2.32, 2.31, 2.32, 2.32, 2.31, 2.31, 2.28, + 2.29, 2.28, 2.26, 2.29, 2.27, 2.26, 2.25, 2.27, 2.24, 2.21, 2.24, 2.17, + 2.18, 2.17, 2.21, 1.99, 2.16, 2.2, 2.13, 2.12, 2.13, 2.1, 2.12, 2.11, + 2.09, 2.09, 2.08, 2.09, 2.04, 2.04, 2.1, 2.01, 2.05, 2.03, 2.06, 1.98, + 1.95, 1.94, 1.91, 1.7, 1.76, 1.77, 1.83, 2.04, 1.91, 1.99, 1.99, 2.07, + 2.02, 2.04, 2.1, 2.06, 2.18, 2.21, 2.24, 2.23, 2.23, 1.98, 2.2, 2.18, + 2.18, 2.21, 2.23, 2.24, 2.24, 2.25, 1.8, 2.24, 1.73, 1.73, 2.27, 1.67, + 2.21, 1.72, 2.23, 2.23, 2.23, 2.24, 2.23, 2.12, 2.17, 1.74, 2.02, 1.88, + 1.67, 1.73, 1.83, 1.82, 1.73, 1.83, 2.19, 1.84, 1.89, 1.6, 1.71, 1.86, + 1.85, 1.84, 1.87, 1.91, 1.52, 1.95, 1.87, 1.89, 1.91, 1.91, 1.93, 1.9, + 1.91, 1.9, 1.89, 1.89, 1.91, 1.9, 1.91, 1.91, 1.91, 1.93, 1.94, 1.91, + 1.92, 1.77, 1.91, 1.95, 1.19, 1.96, 1.98, 1.94, 1.55, 1.91, 1.92, 1.92, + 1.97, 1.93, 1.99, 1.86, 1.12, 1.93, 1.92, 1.95, 1.85, 1.84, 1.91, 1.12, + 1.82, 1.82, 1.95, 1.24, 1.94, 1.96, 1.21, 1.83, 1.96, 1.36, 1.96, 1.82, + 1.92, 1.68, 1.93, 1.23, 1.96, 1.93, 1.86, 1.41, 1.16, 1.6, 1.25, 1.2, + 1.65, 1.66, 1.87, 1.94, 1.96, 1.91, 1.25, 1.93, 1.91, 1.7, 0.99, 1.81, + 1.92, 1.95, 1.5, 1.47, 1.15, 1.58, 1.18, 1.82, 1.13, 1.83, 1.91, 1.26, + 1.27, 1.91, 1.45, 1.6, 1.29, 1.94, 1.94, 1.23, 1.95, 1.21, 1.94, 1.86, + 1.9, 1.33, 1.75, 2.02, 1.98, 2.03, 1.83, 1.5, 2.04, 2.02, 1.9, 2, 2.02, + 1.95, 1.93, 1.95, 1.95, 1.99, 2, 1.94, 1.96, 1.86, 1.92, 1.88, 1.86, + 1.84, 1.87, 1.77, 1.89, 1.89, 1.88, 1.94, 1.82, 1.79, 1.86, 2.06, 2.33, + 1.88, 1.86, 1.81, 1.8, 1.8, 1.86, 1.9, 2, 2.06, 2.1, 2.2, 2, 2.16, + 1.98, 1.8, 1.8, 1.85, 1.75, 2.04, 2.19, 2.14, 2.19, 1.86, 2.1, 2.11, + 2.18, 2.03, 2.28, 2.19, 2.26, 2.26, 2.21, 2.21, 2.26, 2.33, 2.27, 2.21, + 2.12, 2.23, 2.26, 2.25, 1.88, 2.26, 2.24, 2.36, 2.29, 2.35, 2.3, 2.27, + 2.08, 2.05, 2.27, 2.28, 2.27, 2.28, 1.97, 2.25, 2.25, 2.25, 2.31, 2.28, + 2.27, 2.13, 2.24, 2.28, 2.28, 2.41, 2.34, 9.32, 2.28, 2.38, 2.27, 2.27, + 2.39, 2.11, 2.09, 2.1, 2.06, 2.12, 2.08, 2, 1.93, 2.02, 2.55, 1.54, + 1.64, 1.51, 1.55, 2.82, 2.92, 2.55, 2.37, 1.85, 1.6, 1.72, 1.74, 1.79, + 1.9, 1.94, 2, 2.04, 2.08, 2.12, 2.13, 2.16, 2.18, 2.18, 2.2, 2.2, 2.41, + 2.39, 2.38, 2.4, 2.42, 2.41, 2.43, 2.45, 2.43, 2.45, 2.43, 2.4, 2.44, + 2.4, 2.42, 2.43, 2.45, 2.45, 2.45, 2.46, 2.45, 2.45, 2.43, 2.51, 2.48, + 2.48, 2.53, 2.46, 2.49, 2.5, 2.5, 2.5, 2.52, 2.52, 2.54, 2.5, 2.48, + 2.5, 2.55, 2.5, 2.48, 2.5, 2.5, 2.52, 2.52, 2.48, 2.5, 2.5, 2.52, 2.46, + 2.53, 9 ] + + obs post filters: + # Step 1: Remove Observations from the Edge of the Scan + - filter: Domain Check + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-a_channels + where: + - variable: + name: MetaData/sensorScanPosition + is_in: 5-56 + action: + name: reject + # actions: + # - name: set + # flag: ScanEdgeRemoval + # - name: reject + + # Step 2: Data Thinning + - filter: Gaussian Thinning + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-a_channels + horizontal_mesh: 145 + use_reduced_horizontal_grid: true + distance_norm: geodesic + priority_variable: MetaData/fractionOfClearPixelsInFOV + # round_horizontal_bin_count_to_nearest: true + # partition_longitude_bins_using_mesh: true + action: + name: reject + # actions: + # - name: set + # flag: Thinning + # - name: reject + + # Step 3: Wavenumber Check + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: 7024, 7027, 7029, 7032, 7038, 7043, 7046, 7049, 7069, 7072, + 7076, 7081, 7084, 7089, 7099, 7209, 7222, 7231, 7235, 7247, + 7267, 7269, 7284, 7389, 7419, 7423, 7424, 7426, 7428, 7431, + 7436, 7444, 7475, 7549, 7584, 7665, 7666, 7831, 7836, 7853, + 7865, 7885, 7888, 7912, 7950, 7972, 7980, 7995, 8007, 8015, + 8055, 8078 + where: + - variable: + name: MetaData/solarZenithAngle + maxvalue: 88.9999 + - variable: + name: water_area_fraction@GeoVaLs + minvalue: 1.0e-12 + action: + name: reject + # actions: + # - name: set + # flag: ShortwaveIRCheck + # - name: reject + + # Step 4: Observation Error Inflation based on Wavenumber + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-a_channels + action: + name: inflate error + inflation variable: + name: ObsErrorFactorWavenumIR@ObsFunction + channels: *iasi_metop-a_channels + options: + channels: *iasi_metop-a_channels + + # Step 5: Observation Range Sanity Check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-a_channels + minvalue: 50.00001 + maxvalue: 449.99999 + # maxvalue: 100.00000 + action: + name: reject + # actions: + # - name: set + # flag: ObsValueRangeCheck + # - name: reject + + # Step 6: Topography Check + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-a_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorTopoRad + channels: *iasi_metop-a_channels + options: + channels: *iasi_metop-a_channels + sensor: iasi_metop-a + + # Step 7: Transmittance Top Check + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-a_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorTransmitTopRad + channels: *iasi_metop-a_channels + options: + channels: *iasi_metop-a_channels + + # Step 8: Cloud Detection Check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-a_channels + test variables: + - name: ObsFunction/CloudDetectMinResidualIR + channels: *iasi_metop-a_channels + options: + channels: *iasi_metop-a_channels + use_flag: [ 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, + 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, + -1, 1, 1, 1, -1, -1, 1, 1, -1, 1, + -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, + -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, + 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, + 1, -1, -1, -1, 1, 1, 1, 1, -1, 1, + 1, -1, 1, 1, 1, -1, 1, -1, 1, -1, + 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, + 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, + 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, + 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, + -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, -1, 1, -1, 1, -1, + 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, + -1, 1, -1, 1, -1, -1, -1, -1, -1, 1, + 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, + 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, + 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, + 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, + -1, -1, -1, -1, -1, -1, 1, -1, 1, -1, + 1, -1, -1, -1, 1, -1, -1, -1, -1, -1, + -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, + 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, + -1, 1, -1, 1, -1, 1, -1, -1, -1, 1, + 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, + -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, + -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, + 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, + -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, + -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1] + use_flag_clddet: [ 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, + 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, + -1, 1, 1, 1, -1, -1, 1, 1, -1, 1, + -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, + -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, + 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, + 1, -1, -1, -1, 1, 1, 1, 1, -1, 1, + 1, -1, 1, 1, 1, -1, 1, -1, 1, -1, + 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, + 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, + 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, + 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, + -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, -1, 1, -1, 1, -1, + 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, + -1, 1, -1, 1, -1, -1, -1, -1, -1, 1, + 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, + 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, + 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, + 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1, -1, 1, -1, 1, -1, -1, -1, 1, + 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, + -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1] + obserr_dtempf: [0.50,2.00,4.00,2.00,4.00] + error parameter vector: *iasi_metop-a_oberr + maxvalue: 1.0e-12 + action: + name: reject + # actions: + # - name: set + # flag: CloudDetection + # - name: reject + + # Step 9: NSST Retrieval Check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-a_channels + test variables: + - name: NearSSTRetCheckIR@ObsFunction + channels: *iasi_metop-a_channels + options: + channels: *iasi_metop-a_channels + use_flag: [ 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, + 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, + -1, 1, 1, 1, -1, -1, 1, 1, -1, 1, + -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, + -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, + 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, + 1, -1, -1, -1, 1, 1, 1, 1, -1, 1, + 1, -1, 1, 1, 1, -1, 1, -1, 1, -1, + 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, + 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, + 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, + 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, + -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, -1, 1, -1, 1, -1, + 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, + -1, 1, -1, 1, -1, -1, -1, -1, -1, 1, + 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, + 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, + 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, + 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, + -1, -1, -1, -1, -1, -1, 1, -1, 1, -1, + 1, -1, -1, -1, 1, -1, -1, -1, -1, -1, + -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, + 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, + -1, 1, -1, 1, -1, 1, -1, -1, -1, 1, + 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, + -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, + -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, + 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, + -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, + -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1] + obserr_demisf: [0.01,0.02,0.03,0.02,0.03] + obserr_dtempf: [0.50,2.00,4.00,2.00,4.00] + maxvalue: 1.0e-12 + action: + name: reject + # actions: + # - name: set + # flag: NSSTCheck + # - name: reject + + # Step 10: Surface Jacobians Check + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-a_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorSurfJacobianRad + channels: *iasi_metop-a_channels + options: + channels: *iasi_metop-a_channels + obserr_demisf: [0.01, 0.02, 0.03, 0.02, 0.03] + obserr_dtempf: [0.50, 2.00, 4.00, 2.00, 4.00] + sensor: iasi_metop-a + + # Step 11: Gross check + - filter: Background Check + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-a_channels + function absolute threshold: + - name: ObsFunction/ObsErrorBoundIR + channels: *iasi_metop-a_channels + options: + channels: *iasi_metop-a_channels + obserr_bound_latitude: + name: ObsFunction/ObsErrorFactorLatRad + options: + latitude_parameters: [25.0, 0.5, 0.04, 1.0] + obserr_bound_transmittop: + name: ObsFunction/ObsErrorFactorTransmitTopRad + channels: *iasi_metop-a_channels + options: + channels: *iasi_metop-a_channels + obserr_bound_max: [ 3.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + 2.0, 2.0, 4.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 4.0, 4.0, + 3.5, 2.5, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + 3.5, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 3.0, 2.0, 2.0, + 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + 2.0, 2.0, 2.0, 2.0, 2.5, 2.0, 2.5, 2.5, 3.0, 2.5, + 2.5, 2.5, 2.5, 3.5, 2.5, 2.5, 3.0, 3.5, 3.0, 4.0, + 4.0, 4.0, 4.0, 4.0, 4.0, 4.5, 4.5, 4.5, 4.5, 4.5, + 4.0, 4.5, 4.0, 4.0, 4.5, 2.5, 3.0, 2.5, 3.0, 2.5, + 3.0, 2.0, 2.5, 2.5, 3.0, 3.0, 2.5, 3.0, 3.0, 3.0, + 2.5, 2.5, 4.0, 4.5, 4.5, 5.0, 4.0, 4.0, 5.0, 5.0, + 5.0, 5.0, 5.5, 5.5, 4.0, 5.0, 4.0, 4.5, 5.5, 5.5, + 6.0, 4.5, 4.5, 4.0, 5.0, 5.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 5.5, 4.5, 6.0, + 5.0, 5.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 5.0, 6.0, + 6.0, 6.0, 4.0, 6.0, 6.0, 6.0, 6.0, 4.5, 6.0, 6.0, + 4.5, 6.0, 6.0, 6.0, 6.0, 6.0, 5.0, 6.0, 6.0, 6.0, + 5.0, 6.0, 6.0, 5.0, 6.0, 5.0, 6.0, 6.0, 6.0, 5.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0] + error parameter vector: *iasi_metop-a_oberr + action: + name: reject + # actions: + # - name: set + # flag: GrossCheck + # - name: reject + + # Step 12: Useflag Check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-a_channels + test variables: + - name: ObsFunction/ChannelUseflagCheckRad + channels: *iasi_metop-a_channels + options: + channels: *iasi_metop-a_channels + use_flag: [ 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, + 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, + -1, 1, 1, 1, -1, -1, 1, 1, -1, 1, + -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, + -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, + 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, + 1, -1, -1, -1, 1, 1, 1, 1, -1, 1, + 1, -1, 1, 1, 1, -1, 1, -1, 1, -1, + 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, + 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, + 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, + 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, + -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, -1, 1, -1, 1, -1, + 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, + -1, 1, -1, 1, -1, -1, -1, -1, -1, 1, + 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, + 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, + 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, + 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, + -1, -1, -1, -1, -1, -1, 1, -1, 1, -1, + 1, -1, -1, -1, 1, -1, -1, -1, -1, -1, + -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, + 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, + -1, 1, -1, 1, -1, 1, -1, -1, -1, 1, + 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, + -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, + -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, + 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, + -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, + -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1] + minvalue: 1.0e-12 + action: + name: reject + # actions: + # - name: set + # flag: UseFlagCheck + # - name: reject diff --git a/parm/atm/obs/config/iasi_metop-b.yaml b/parm/atm/obs/config/iasi_metop-b.yaml deleted file mode 100644 index 2f8f1424e..000000000 --- a/parm/atm/obs/config/iasi_metop-b.yaml +++ /dev/null @@ -1,756 +0,0 @@ -obs space: - name: iasi_metop-b - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)mtiasi_metop-b.tm00.nc - obsdataout: - engine: - type: H5File - obsfile: $(DATA)/diags/diag_iasi_metop-b_{{ current_cycle | to_YMDH }}.nc - io pool: - max pool size: 1 - observed variables: [radiance] - simulated variables: [brightnessTemperature] - derived variables: [brightnessTemperature] - channels: &iasi_metop-b_channels 16, 29, 32, 35, 38, 41, 44, 47, 49, 50, 51, 53, - 55, 56, 57, 59, 61, 62, 63, 66, 68, 70, 72, 74, 76, 78, 79, 81, 82, 83, - 84, 85, 86, 87, 89, 92, 93, 95, 97, 99, 101, 103, 104, 106, 109, 110, - 111, 113, 116, 119, 122, 125, 128, 131, 133, 135, 138, 141, 144, 146, - 148, 150, 151, 154, 157, 159, 160, 161, 163, 167, 170, 173, 176, 179, - 180, 185, 187, 191, 193, 197, 199, 200, 202, 203, 205, 207, 210, 212, - 213, 214, 217, 218, 219, 222, 224, 225, 226, 228, 230, 231, 232, 236, - 237, 239, 243, 246, 249, 252, 254, 259, 260, 262, 265, 267, 269, 275, - 279, 282, 285, 294, 296, 299, 300, 303, 306, 309, 313, 320, 323, 326, - 327, 329, 332, 335, 345, 347, 350, 354, 356, 360, 363, 366, 371, 372, - 373, 375, 377, 379, 381, 383, 386, 389, 398, 401, 404, 405, 407, 408, - 410, 411, 414, 416, 418, 423, 426, 428, 432, 433, 434, 439, 442, 445, - 450, 457, 459, 472, 477, 483, 509, 515, 546, 552, 559, 566, 571, 573, - 578, 584, 594, 625, 646, 662, 668, 705, 739, 756, 797, 867, 906, 921, - 1027, 1046, 1090, 1098, 1121, 1133, 1173, 1191, 1194, 1222, 1271, 1283, - 1338, 1409, 1414, 1420, 1424, 1427, 1430, 1434, 1440, 1442, 1445, 1450, - 1454, 1460, 1463, 1469, 1474, 1479, 1483, 1487, 1494, 1496, 1502, 1505, - 1509, 1510, 1513, 1518, 1521, 1526, 1529, 1532, 1536, 1537, 1541, 1545, - 1548, 1553, 1560, 1568, 1574, 1579, 1583, 1585, 1587, 1606, 1626, 1639, - 1643, 1652, 1658, 1659, 1666, 1671, 1675, 1681, 1694, 1697, 1710, 1786, - 1791, 1805, 1839, 1884, 1913, 1946, 1947, 1991, 2019, 2094, 2119, 2213, - 2239, 2271, 2289, 2321, 2333, 2346, 2349, 2352, 2359, 2367, 2374, 2398, - 2426, 2562, 2701, 2741, 2745, 2760, 2819, 2889, 2907, 2910, 2919, 2921, - 2939, 2944, 2945, 2948, 2951, 2958, 2971, 2977, 2985, 2988, 2990, 2991, - 2993, 3002, 3008, 3014, 3027, 3029, 3030, 3036, 3047, 3049, 3052, 3053, - 3055, 3058, 3064, 3069, 3087, 3093, 3098, 3105, 3107, 3110, 3116, 3127, - 3129, 3136, 3146, 3151, 3160, 3165, 3168, 3175, 3178, 3189, 3207, 3228, - 3244, 3248, 3252, 3256, 3263, 3281, 3295, 3303, 3309, 3312, 3322, 3326, - 3354, 3366, 3375, 3378, 3411, 3416, 3432, 3438, 3440, 3442, 3444, 3446, - 3448, 3450, 3452, 3454, 3458, 3467, 3476, 3484, 3491, 3497, 3499, 3504, - 3506, 3509, 3518, 3527, 3555, 3575, 3577, 3580, 3582, 3586, 3589, 3599, - 3610, 3626, 3638, 3646, 3653, 3658, 3661, 3673, 3689, 3700, 3710, 3726, - 3763, 3814, 3841, 3888, 4032, 4059, 4068, 4082, 4095, 4160, 4234, 4257, - 4411, 4498, 4520, 4552, 4567, 4608, 4646, 4698, 4808, 4849, 4920, 4939, - 4947, 4967, 4991, 4996, 5015, 5028, 5056, 5128, 5130, 5144, 5170, 5178, - 5183, 5188, 5191, 5368, 5371, 5379, 5381, 5383, 5397, 5399, 5401, 5403, - 5405, 5446, 5455, 5472, 5480, 5483, 5485, 5492, 5497, 5502, 5507, 5509, - 5517, 5528, 5558, 5697, 5714, 5749, 5766, 5785, 5798, 5799, 5801, 5817, - 5833, 5834, 5836, 5849, 5851, 5852, 5865, 5869, 5881, 5884, 5897, 5900, - 5916, 5932, 5948, 5963, 5968, 5978, 5988, 5992, 5994, 5997, 6003, 6008, - 6023, 6026, 6039, 6053, 6056, 6067, 6071, 6082, 6085, 6098, 6112, 6126, - 6135, 6140, 6149, 6154, 6158, 6161, 6168, 6174, 6182, 6187, 6205, 6209, - 6213, 6317, 6339, 6342, 6366, 6381, 6391, 6489, 6962, 6966, 6970, 6975, - 6977, 6982, 6985, 6987, 6989, 6991, 6993, 6995, 6997, 6999, 7000, 7004, - 7008, 7013, 7016, 7021, 7024, 7027, 7029, 7032, 7038, 7043, 7046, 7049, - 7069, 7072, 7076, 7081, 7084, 7089, 7099, 7209, 7222, 7231, 7235, 7247, - 7267, 7269, 7284, 7389, 7419, 7423, 7424, 7426, 7428, 7431, 7436, 7444, - 7475, 7549, 7584, 7665, 7666, 7831, 7836, 7853, 7865, 7885, 7888, 7912, - 7950, 7972, 7980, 7995, 8007, 8015, 8055, 8078 - -obs operator: - name: CRTM - Absorbers: [H2O,O3,CO2] - obs options: - Sensor_ID: iasi_metop-b - EndianType: little_endian - CoefficientPath: $(DATA)/crtm/ - linear obs operator: - Absorbers: [H2O,O3] - -obs bias: - input file: $(DATA)/obs/$(GPREFIX)iasi_metop-b.satbias.nc - output file: $(DATA)/bc/$(APREFIX)iasi_metop-b.satbias.nc - variational bc: - predictors: - - name: constant - - name: lapse_rate - order: 2 - tlapse: &iasi_metop-b_tlapse $(DATA)/obs/$(GPREFIX)iasi_metop-b.tlapse.txt - - name: lapse_rate - tlapse: *iasi_metop-b_tlapse - - name: emissivity - - name: scan_angle - order: 4 - - name: scan_angle - order: 3 - - name: scan_angle - order: 2 - - name: scan_angle - covariance: - minimal required obs number: 20 - variance range: [1.0e-6, 10.0] - step size: 1.0e-4 - largest analysis variance: 10000.0 - prior: - input file: $(DATA)/obs/$(GPREFIX)iasi_metop-b.satbias_cov.nc - inflation: - ratio: 1.1 - ratio for small dataset: 2.0 - output file: $(DATA)/bc/$(APREFIX)iasi_metop-b.satbias_cov.nc - -obs pre filters: -# Step 0-A: Create Diagnostic Flags -#- filter: Create Diagnostic Flags -# filter variables: -# - name: brightnessTemperature -# channels: *iasi_metop-b_channels -# flags: -# - name: ScanEdgeRemoval -# initial value: false -# force reinitialization: false -# - name: Thinning -# initial value: false -# force reinitialization: false -# - name: ShortwaveIRCheck -# initial value: false -# force reinitialization: false -# - name: ObsValueRangeCheck -# initial value: false -# force reinitialization: false -# - name: CloudDetection -# initial value: false -# force reinitialization: false -# - name: NSSTCheck -# initial value: false -# force reinitialization: false -# - name: GrossCheck -# initial value: false -# force reinitialization: false -# - name: InterChannelConsistency -# initial value: false -# force reinitialization: false -# - name: UseFlagCheck -# initial value: false -# force reinitialization: false - -# Step 0-B: Create Derived Variables -# Assign channel wavenumbers in m-1 -- filter: Variable Assignment - assignments: - - name: MetaData/sensorCentralWavenumber - type: float - channels: *iasi_metop-b_channels - function: - name: ObsFunction/LinearCombination - options: - variables: - - name: ObsValue/radiance - channels: *iasi_metop-b_channels - coefs: [25.0] - intercept: 64475.0 - use channel numbers: true - -# Transform radiance to brightness temperature -- filter: Variable Transforms - Transform: SatBrightnessTempFromRad - transform from: - name: ObsValue/radiance - channels: *iasi_metop-b_channels - spectral variable: - name: MetaData/sensorCentralWavenumber - channels: *iasi_metop-b_channels - radiance units: wavenumber - planck1: 1.191042953e-16 - planck2: 1.4387774e-2 - -# Step 0-C: Assign Observation Error -obs prior filters: -- filter: Perform Action - filter variables: - - name: brightnessTemperature - channels: *iasi_metop-b_channels - action: - name: assign error - error parameter vector: &iasi_metop-b_oberr [ 1.38, 0.81, 0.75, 0.79, 0.72, 0.74, 0.68, 0.72, 0.65, 0.65, - 0.65, 0.69, 0.64, 0.64, 0.65, 0.67, 0.62, 0.61, 0.62, 0.64, 0.59, 0.76, - 1.22, 0.78, 0.64, 0.62, 0.61, 0.69, 0.65, 0.59, 0.61, 0.59, 0.68, 0.62, - 0.68, 4.38, 3.05, 2.31, 1.56, 1.33, 1.58, 0.93, 1.67, 0.72, 0.57, 0.58, - 0.55, 0.68, 0.59, 0.68, 0.59, 0.65, 0.58, 0.62, 0.64, 0.58, 0.64, 0.55, - 0.64, 0.5, 0.82, 0.59, 0.62, 0.51, 0.64, 0.52, 0.51, 0.51, 0.76, 0.52, - 0.57, 0.55, 0.69, 0.58, 0.65, 0.61, 0.59, 0.64, 0.76, 0.72, 1.05, 0.75, - 0.51, 0.65, 1.3, 0.69, 0.93, 1.49, 1.12, 0.68, 0.66, 0.67, 0.59, 0.59, - 0.69, 0.67, 0.64, 0.62, 0.72, 0.69, 0.66, 0.79, 0.78, 0.74, 0.88, 0.77, - 0.88, 0.86, 1, 0.87, 0.85, 0.88, 0.84, 0.84, 0.84, 0.8, 0.8, 0.87, - 0.98, 0.52, 0.65, 0.69, 0.61, 0.6, 0.67, 0.79, 0.62, 0.66, 0.7, 0.65, - 0.62, 0.61, 0.62, 0.53, 0.6, 0.68, 0.95, 0.63, 0.97, 0.65, 0.98, 0.58, - 0.73, 0.65, 0.85, 0.99, 0.76, 0.85, 0.97, 0.77, 0.62, 0.63, 1.21, 1.41, - 1.55, 1.78, 1.35, 1.14, 1.69, 1.79, 1.46, 1.63, 1.94, 2.01, 1.24, 1.76, - 1.26, 1.47, 1.9, 1.66, 2.13, 1.49, 1.52, 1.55, 1.96, 2.31, 2.33, 2.32, - 2.31, 2.33, 2.23, 2.33, 1.84, 2.29, 2.28, 2.28, 2.28, 2.26, 2.26, 2.26, - 2.27, 2.24, 2.23, 2.24, 2.26, 2.28, 2.28, 2.3, 2.15, 2.31, 2.37, 2.27, - 2.29, 2.29, 2.23, 2.28, 2.32, 2.32, 2.31, 2.32, 2.32, 2.31, 2.31, 2.28, - 2.29, 2.28, 2.26, 2.29, 2.27, 2.26, 2.25, 2.27, 2.24, 2.21, 2.24, 2.17, - 2.18, 2.17, 2.21, 1.99, 2.16, 2.2, 2.13, 2.12, 2.13, 2.1, 2.12, 2.11, - 2.09, 2.09, 2.08, 2.09, 2.04, 2.04, 2.1, 2.01, 2.05, 2.03, 2.06, 1.98, - 1.95, 1.94, 1.91, 1.7, 1.76, 1.77, 1.83, 2.04, 1.91, 1.99, 1.99, 2.07, - 2.02, 2.04, 2.1, 2.06, 2.18, 2.21, 2.24, 2.23, 2.23, 1.98, 2.2, 2.18, - 2.18, 2.21, 2.23, 2.24, 2.24, 2.25, 1.8, 2.24, 1.73, 1.73, 2.27, 1.67, - 2.21, 1.72, 2.23, 2.23, 2.23, 2.24, 2.23, 2.12, 2.17, 1.74, 2.02, 1.88, - 1.67, 1.73, 1.83, 1.82, 1.73, 1.83, 2.19, 1.84, 1.89, 1.6, 1.71, 1.86, - 1.85, 1.84, 1.87, 1.91, 1.52, 1.95, 1.87, 1.89, 1.91, 1.91, 1.93, 1.9, - 1.91, 1.9, 1.89, 1.89, 1.91, 1.9, 1.91, 1.91, 1.91, 1.93, 1.94, 1.91, - 1.92, 1.77, 1.91, 1.95, 1.19, 1.96, 1.98, 1.94, 1.55, 1.91, 1.92, 1.92, - 1.97, 1.93, 1.99, 1.86, 1.12, 1.93, 1.92, 1.95, 1.85, 1.84, 1.91, 1.12, - 1.82, 1.82, 1.95, 1.24, 1.94, 1.96, 1.21, 1.83, 1.96, 1.36, 1.96, 1.82, - 1.92, 1.68, 1.93, 1.23, 1.96, 1.93, 1.86, 1.41, 1.16, 1.6, 1.25, 1.2, - 1.65, 1.66, 1.87, 1.94, 1.96, 1.91, 1.25, 1.93, 1.91, 1.7, 0.99, 1.81, - 1.92, 1.95, 1.5, 1.47, 1.15, 1.58, 1.18, 1.82, 1.13, 1.83, 1.91, 1.26, - 1.27, 1.91, 1.45, 1.6, 1.29, 1.94, 1.94, 1.23, 1.95, 1.21, 1.94, 1.86, - 1.9, 1.33, 1.75, 2.02, 1.98, 2.03, 1.83, 1.5, 2.04, 2.02, 1.9, 2, 2.02, - 1.95, 1.93, 1.95, 1.95, 1.99, 2, 1.94, 1.96, 1.86, 1.92, 1.88, 1.86, - 1.84, 1.87, 1.77, 1.89, 1.89, 1.88, 1.94, 1.82, 1.79, 1.86, 2.06, 2.33, - 1.88, 1.86, 1.81, 1.8, 1.8, 1.86, 1.9, 2, 2.06, 2.1, 2.2, 2, 2.16, - 1.98, 1.8, 1.8, 1.85, 1.75, 2.04, 2.19, 2.14, 2.19, 1.86, 2.1, 2.11, - 2.18, 2.03, 2.28, 2.19, 2.26, 2.26, 2.21, 2.21, 2.26, 2.33, 2.27, 2.21, - 2.12, 2.23, 2.26, 2.25, 1.88, 2.26, 2.24, 2.36, 2.29, 2.35, 2.3, 2.27, - 2.08, 2.05, 2.27, 2.28, 2.27, 2.28, 1.97, 2.25, 2.25, 2.25, 2.31, 2.28, - 2.27, 2.13, 2.24, 2.28, 2.28, 2.41, 2.34, 9.32, 2.28, 2.38, 2.27, 2.27, - 2.39, 2.11, 2.09, 2.1, 2.06, 2.12, 2.08, 2, 1.93, 2.02, 2.55, 1.54, - 1.64, 1.51, 1.55, 2.82, 2.92, 2.55, 2.37, 1.85, 1.6, 1.72, 1.74, 1.79, - 1.9, 1.94, 2, 2.04, 2.08, 2.12, 2.13, 2.16, 2.18, 2.18, 2.2, 2.2, 2.41, - 2.39, 2.38, 2.4, 2.42, 2.41, 2.43, 2.45, 2.43, 2.45, 2.43, 2.4, 2.44, - 2.4, 2.42, 2.43, 2.45, 2.45, 2.45, 2.46, 2.45, 2.45, 2.43, 2.51, 2.48, - 2.48, 2.53, 2.46, 2.49, 2.5, 2.5, 2.5, 2.52, 2.52, 2.54, 2.5, 2.48, - 2.5, 2.55, 2.5, 2.48, 2.5, 2.5, 2.52, 2.52, 2.48, 2.5, 2.5, 2.52, 2.46, - 2.53, 9 ] - -obs post filters: -# Step 1: Remove Observations from the Edge of the Scan -- filter: Domain Check - filter variables: - - name: brightnessTemperature - channels: *iasi_metop-b_channels - where: - - variable: - name: MetaData/sensorScanPosition - is_in: 5-56 - action: - name: reject -# actions: -# - name: set -# flag: ScanEdgeRemoval -# - name: reject - -# Step 2: Data Thinning -- filter: Gaussian Thinning - filter variables: - - name: brightnessTemperature - channels: *iasi_metop-b_channels - horizontal_mesh: 145 - use_reduced_horizontal_grid: true - distance_norm: geodesic - priority_variable: MetaData/fractionOfClearPixelsInFOV -# round_horizontal_bin_count_to_nearest: true -# partition_longitude_bins_using_mesh: true - action: - name: reject -# actions: -# - name: set -# flag: Thinning -# - name: reject - -# Step 3: Wavenumber Check -- filter: Perform Action - filter variables: - - name: brightnessTemperature - channels: 7024, 7027, 7029, 7032, 7038, 7043, 7046, 7049, 7069, 7072, - 7076, 7081, 7084, 7089, 7099, 7209, 7222, 7231, 7235, 7247, - 7267, 7269, 7284, 7389, 7419, 7423, 7424, 7426, 7428, 7431, - 7436, 7444, 7475, 7549, 7584, 7665, 7666, 7831, 7836, 7853, - 7865, 7885, 7888, 7912, 7950, 7972, 7980, 7995, 8007, 8015, - 8055, 8078 - where: - - variable: - name: MetaData/solarZenithAngle - maxvalue: 88.9999 - - variable: - name: water_area_fraction@GeoVaLs - minvalue: 1.0e-12 - action: - name: reject -# actions: -# - name: set -# flag: ShortwaveIRCheck -# - name: reject - -# Step 4: Observation Error Inflation based on Wavenumber -- filter: Perform Action - filter variables: - - name: brightnessTemperature - channels: *iasi_metop-b_channels - action: - name: inflate error - inflation variable: - name: ObsErrorFactorWavenumIR@ObsFunction - channels: *iasi_metop-b_channels - options: - channels: *iasi_metop-b_channels - -# Step 5: Observation Range Sanity Check -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: *iasi_metop-b_channels - minvalue: 50.00001 - maxvalue: 449.99999 -# maxvalue: 100.00000 - action: - name: reject -# actions: -# - name: set -# flag: ObsValueRangeCheck -# - name: reject - -# Step 6: Topography Check -- filter: Perform Action - filter variables: - - name: brightnessTemperature - channels: *iasi_metop-b_channels - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorTopoRad - channels: *iasi_metop-b_channels - options: - channels: *iasi_metop-b_channels - sensor: iasi_metop-b - -# Step 7: Transmittance Top Check -- filter: Perform Action - filter variables: - - name: brightnessTemperature - channels: *iasi_metop-b_channels - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorTransmitTopRad - channels: *iasi_metop-b_channels - options: - channels: *iasi_metop-b_channels - -# Step 8: Cloud Detection Check -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: *iasi_metop-b_channels - test variables: - - name: ObsFunction/CloudDetectMinResidualIR - channels: *iasi_metop-b_channels - options: - channels: *iasi_metop-b_channels - use_flag: [ 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, - 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, - -1, 1, 1, 1, -1, -1, 1, 1, -1, 1, - -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, - -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, - 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, - 1, -1, -1, -1, 1, 1, 1, 1, -1, 1, - 1, -1, 1, 1, 1, -1, 1, -1, 1, -1, - 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, - 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, - 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, - 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, - -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, -1, 1, -1, 1, -1, - 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, - -1, 1, -1, 1, -1, -1, -1, -1, -1, 1, - 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, - 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, - 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, - 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, - -1, -1, -1, -1, -1, -1, 1, -1, 1, -1, - 1, -1, -1, -1, 1, -1, -1, -1, -1, -1, - -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, - 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, - -1, 1, -1, 1, -1, 1, -1, -1, -1, 1, - 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, - -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, - -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, - 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, - -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, - -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1] - use_flag_clddet: [ 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, - 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, - -1, 1, 1, 1, -1, -1, 1, 1, -1, 1, - -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, - -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, - 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, - 1, -1, -1, -1, 1, 1, 1, 1, -1, 1, - 1, -1, 1, 1, 1, -1, 1, -1, 1, -1, - 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, - 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, - 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, - 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, - -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, -1, 1, -1, 1, -1, - 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, - -1, 1, -1, 1, -1, -1, -1, -1, -1, 1, - 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, - 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, - 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, - 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1, -1, 1, -1, 1, -1, -1, -1, 1, - 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, - -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1] - obserr_dtempf: [0.50,2.00,4.00,2.00,4.00] - error parameter vector: *iasi_metop-b_oberr - maxvalue: 1.0e-12 - action: - name: reject -# actions: -# - name: set -# flag: CloudDetection -# - name: reject - -# Step 9: NSST Retrieval Check -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: *iasi_metop-b_channels - test variables: - - name: NearSSTRetCheckIR@ObsFunction - channels: *iasi_metop-b_channels - options: - channels: *iasi_metop-b_channels - use_flag: [ 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, - 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, - -1, 1, 1, 1, -1, -1, 1, 1, -1, 1, - -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, - -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, - 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, - 1, -1, -1, -1, 1, 1, 1, 1, -1, 1, - 1, -1, 1, 1, 1, -1, 1, -1, 1, -1, - 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, - 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, - 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, - 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, - -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, -1, 1, -1, 1, -1, - 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, - -1, 1, -1, 1, -1, -1, -1, -1, -1, 1, - 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, - 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, - 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, - 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, - -1, -1, -1, -1, -1, -1, 1, -1, 1, -1, - 1, -1, -1, -1, 1, -1, -1, -1, -1, -1, - -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, - 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, - -1, 1, -1, 1, -1, 1, -1, -1, -1, 1, - 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, - -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, - -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, - 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, - -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, - -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1] - obserr_demisf: [0.01,0.02,0.03,0.02,0.03] - obserr_dtempf: [0.50,2.00,4.00,2.00,4.00] - maxvalue: 1.0e-12 - action: - name: reject -# actions: -# - name: set -# flag: NSSTCheck -# - name: reject - -# Step 10: Surface Jacobians Check -- filter: Perform Action - filter variables: - - name: brightnessTemperature - channels: *iasi_metop-b_channels - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorSurfJacobianRad - channels: *iasi_metop-b_channels - options: - channels: *iasi_metop-b_channels - obserr_demisf: [0.01, 0.02, 0.03, 0.02, 0.03] - obserr_dtempf: [0.50, 2.00, 4.00, 2.00, 4.00] - sensor: iasi_metop-b - -# Step 11: Gross check -- filter: Background Check - filter variables: - - name: brightnessTemperature - channels: *iasi_metop-b_channels - function absolute threshold: - - name: ObsFunction/ObsErrorBoundIR - channels: *iasi_metop-b_channels - options: - channels: *iasi_metop-b_channels - obserr_bound_latitude: - name: ObsFunction/ObsErrorFactorLatRad - options: - latitude_parameters: [25.0, 0.5, 0.04, 1.0] - obserr_bound_transmittop: - name: ObsFunction/ObsErrorFactorTransmitTopRad - channels: *iasi_metop-b_channels - options: - channels: *iasi_metop-b_channels - obserr_bound_max: [ 3.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 4.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 4.0, 4.0, - 3.5, 2.5, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 3.5, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 3.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.5, 2.0, 2.5, 2.5, 3.0, 2.5, - 2.5, 2.5, 2.5, 3.5, 2.5, 2.5, 3.0, 3.5, 3.0, 4.0, - 4.0, 4.0, 4.0, 4.0, 4.0, 4.5, 4.5, 4.5, 4.5, 4.5, - 4.0, 4.5, 4.0, 4.0, 4.5, 2.5, 3.0, 2.5, 3.0, 2.5, - 3.0, 2.0, 2.5, 2.5, 3.0, 3.0, 2.5, 3.0, 3.0, 3.0, - 2.5, 2.5, 4.0, 4.5, 4.5, 5.0, 4.0, 4.0, 5.0, 5.0, - 5.0, 5.0, 5.5, 5.5, 4.0, 5.0, 4.0, 4.5, 5.5, 5.5, - 6.0, 4.5, 4.5, 4.0, 5.0, 5.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 5.5, 4.5, 6.0, - 5.0, 5.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 5.0, 6.0, - 6.0, 6.0, 4.0, 6.0, 6.0, 6.0, 6.0, 4.5, 6.0, 6.0, - 4.5, 6.0, 6.0, 6.0, 6.0, 6.0, 5.0, 6.0, 6.0, 6.0, - 5.0, 6.0, 6.0, 5.0, 6.0, 5.0, 6.0, 6.0, 6.0, 5.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, - 6.0, 6.0, 6.0, 6.0, 6.0, 6.0] - error parameter vector: *iasi_metop-b_oberr - action: - name: reject -# actions: -# - name: set -# flag: GrossCheck -# - name: reject - -# Step 12: Useflag Check -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: *iasi_metop-b_channels - test variables: - - name: ObsFunction/ChannelUseflagCheckRad - channels: *iasi_metop-b_channels - options: - channels: *iasi_metop-b_channels - use_flag: [ 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, - 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, - -1, 1, 1, 1, -1, -1, 1, 1, -1, 1, - -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, - -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, - 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, - 1, -1, -1, -1, 1, 1, 1, 1, -1, 1, - 1, -1, 1, 1, 1, -1, 1, -1, 1, -1, - 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, - 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, - 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, - 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, - -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, -1, 1, -1, 1, -1, - 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, - -1, 1, -1, 1, -1, -1, -1, -1, -1, 1, - 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, - 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, - 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, - 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, - -1, -1, -1, -1, -1, -1, 1, -1, 1, -1, - 1, -1, -1, -1, 1, -1, -1, -1, -1, -1, - -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, - 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, - -1, 1, -1, 1, -1, 1, -1, -1, -1, 1, - 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, - -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, - -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, - 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, - -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, - -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1] - minvalue: 1.0e-12 - action: - name: reject -# actions: -# - name: set -# flag: UseFlagCheck -# - name: reject diff --git a/parm/atm/obs/config/iasi_metop-b.yaml.j2 b/parm/atm/obs/config/iasi_metop-b.yaml.j2 new file mode 100644 index 000000000..95dbb7e85 --- /dev/null +++ b/parm/atm/obs/config/iasi_metop-b.yaml.j2 @@ -0,0 +1,756 @@ +- obs space: + name: iasi_metop-b + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}mtiasi_metop-b.tm00.nc' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_iasi_metop-b_{{ current_cycle | to_YMDH }}.nc' + io pool: + max pool size: 1 + observed variables: [radiance] + simulated variables: [brightnessTemperature] + derived variables: [brightnessTemperature] + channels: &iasi_metop-b_channels 16, 29, 32, 35, 38, 41, 44, 47, 49, 50, 51, 53, + 55, 56, 57, 59, 61, 62, 63, 66, 68, 70, 72, 74, 76, 78, 79, 81, 82, 83, + 84, 85, 86, 87, 89, 92, 93, 95, 97, 99, 101, 103, 104, 106, 109, 110, + 111, 113, 116, 119, 122, 125, 128, 131, 133, 135, 138, 141, 144, 146, + 148, 150, 151, 154, 157, 159, 160, 161, 163, 167, 170, 173, 176, 179, + 180, 185, 187, 191, 193, 197, 199, 200, 202, 203, 205, 207, 210, 212, + 213, 214, 217, 218, 219, 222, 224, 225, 226, 228, 230, 231, 232, 236, + 237, 239, 243, 246, 249, 252, 254, 259, 260, 262, 265, 267, 269, 275, + 279, 282, 285, 294, 296, 299, 300, 303, 306, 309, 313, 320, 323, 326, + 327, 329, 332, 335, 345, 347, 350, 354, 356, 360, 363, 366, 371, 372, + 373, 375, 377, 379, 381, 383, 386, 389, 398, 401, 404, 405, 407, 408, + 410, 411, 414, 416, 418, 423, 426, 428, 432, 433, 434, 439, 442, 445, + 450, 457, 459, 472, 477, 483, 509, 515, 546, 552, 559, 566, 571, 573, + 578, 584, 594, 625, 646, 662, 668, 705, 739, 756, 797, 867, 906, 921, + 1027, 1046, 1090, 1098, 1121, 1133, 1173, 1191, 1194, 1222, 1271, 1283, + 1338, 1409, 1414, 1420, 1424, 1427, 1430, 1434, 1440, 1442, 1445, 1450, + 1454, 1460, 1463, 1469, 1474, 1479, 1483, 1487, 1494, 1496, 1502, 1505, + 1509, 1510, 1513, 1518, 1521, 1526, 1529, 1532, 1536, 1537, 1541, 1545, + 1548, 1553, 1560, 1568, 1574, 1579, 1583, 1585, 1587, 1606, 1626, 1639, + 1643, 1652, 1658, 1659, 1666, 1671, 1675, 1681, 1694, 1697, 1710, 1786, + 1791, 1805, 1839, 1884, 1913, 1946, 1947, 1991, 2019, 2094, 2119, 2213, + 2239, 2271, 2289, 2321, 2333, 2346, 2349, 2352, 2359, 2367, 2374, 2398, + 2426, 2562, 2701, 2741, 2745, 2760, 2819, 2889, 2907, 2910, 2919, 2921, + 2939, 2944, 2945, 2948, 2951, 2958, 2971, 2977, 2985, 2988, 2990, 2991, + 2993, 3002, 3008, 3014, 3027, 3029, 3030, 3036, 3047, 3049, 3052, 3053, + 3055, 3058, 3064, 3069, 3087, 3093, 3098, 3105, 3107, 3110, 3116, 3127, + 3129, 3136, 3146, 3151, 3160, 3165, 3168, 3175, 3178, 3189, 3207, 3228, + 3244, 3248, 3252, 3256, 3263, 3281, 3295, 3303, 3309, 3312, 3322, 3326, + 3354, 3366, 3375, 3378, 3411, 3416, 3432, 3438, 3440, 3442, 3444, 3446, + 3448, 3450, 3452, 3454, 3458, 3467, 3476, 3484, 3491, 3497, 3499, 3504, + 3506, 3509, 3518, 3527, 3555, 3575, 3577, 3580, 3582, 3586, 3589, 3599, + 3610, 3626, 3638, 3646, 3653, 3658, 3661, 3673, 3689, 3700, 3710, 3726, + 3763, 3814, 3841, 3888, 4032, 4059, 4068, 4082, 4095, 4160, 4234, 4257, + 4411, 4498, 4520, 4552, 4567, 4608, 4646, 4698, 4808, 4849, 4920, 4939, + 4947, 4967, 4991, 4996, 5015, 5028, 5056, 5128, 5130, 5144, 5170, 5178, + 5183, 5188, 5191, 5368, 5371, 5379, 5381, 5383, 5397, 5399, 5401, 5403, + 5405, 5446, 5455, 5472, 5480, 5483, 5485, 5492, 5497, 5502, 5507, 5509, + 5517, 5528, 5558, 5697, 5714, 5749, 5766, 5785, 5798, 5799, 5801, 5817, + 5833, 5834, 5836, 5849, 5851, 5852, 5865, 5869, 5881, 5884, 5897, 5900, + 5916, 5932, 5948, 5963, 5968, 5978, 5988, 5992, 5994, 5997, 6003, 6008, + 6023, 6026, 6039, 6053, 6056, 6067, 6071, 6082, 6085, 6098, 6112, 6126, + 6135, 6140, 6149, 6154, 6158, 6161, 6168, 6174, 6182, 6187, 6205, 6209, + 6213, 6317, 6339, 6342, 6366, 6381, 6391, 6489, 6962, 6966, 6970, 6975, + 6977, 6982, 6985, 6987, 6989, 6991, 6993, 6995, 6997, 6999, 7000, 7004, + 7008, 7013, 7016, 7021, 7024, 7027, 7029, 7032, 7038, 7043, 7046, 7049, + 7069, 7072, 7076, 7081, 7084, 7089, 7099, 7209, 7222, 7231, 7235, 7247, + 7267, 7269, 7284, 7389, 7419, 7423, 7424, 7426, 7428, 7431, 7436, 7444, + 7475, 7549, 7584, 7665, 7666, 7831, 7836, 7853, 7865, 7885, 7888, 7912, + 7950, 7972, 7980, 7995, 8007, 8015, 8055, 8078 + + obs operator: + name: CRTM + Absorbers: [H2O,O3,CO2] + obs options: + Sensor_ID: iasi_metop-b + EndianType: little_endian + CoefficientPath: '{{ DATA }}/crtm/' + linear obs operator: + Absorbers: [H2O,O3] + + obs bias: + input file: '{{ DATA }}/obs/{{ GPREFIX }}iasi_metop-b.satbias.nc' + output file: '{{ DATA }}/bc/{{ APREFIX }}iasi_metop-b.satbias.nc' + variational bc: + predictors: + - name: constant + - name: lapse_rate + order: 2 + tlapse: &iasi_metop-b_tlapse '{{ DATA }}/obs/{{ GPREFIX }}iasi_metop-b.tlapse.txt' + - name: lapse_rate + tlapse: *iasi_metop-b_tlapse + - name: emissivity + - name: scan_angle + order: 4 + - name: scan_angle + order: 3 + - name: scan_angle + order: 2 + - name: scan_angle + covariance: + minimal required obs number: 20 + variance range: [1.0e-6, 10.0] + step size: 1.0e-4 + largest analysis variance: 10000.0 + prior: + input file: '{{ DATA }}/obs/{{ GPREFIX }}iasi_metop-b.satbias_cov.nc' + inflation: + ratio: 1.1 + ratio for small dataset: 2.0 + output file: '{{ DATA }}/bc/{{ APREFIX }}iasi_metop-b.satbias_cov.nc' + + obs pre filters: + # Step 0-A: Create Diagnostic Flags + #- filter: Create Diagnostic Flags + # filter variables: + # - name: brightnessTemperature + # channels: *iasi_metop-b_channels + # flags: + # - name: ScanEdgeRemoval + # initial value: false + # force reinitialization: false + # - name: Thinning + # initial value: false + # force reinitialization: false + # - name: ShortwaveIRCheck + # initial value: false + # force reinitialization: false + # - name: ObsValueRangeCheck + # initial value: false + # force reinitialization: false + # - name: CloudDetection + # initial value: false + # force reinitialization: false + # - name: NSSTCheck + # initial value: false + # force reinitialization: false + # - name: GrossCheck + # initial value: false + # force reinitialization: false + # - name: InterChannelConsistency + # initial value: false + # force reinitialization: false + # - name: UseFlagCheck + # initial value: false + # force reinitialization: false + + # Step 0-B: Create Derived Variables + # Assign channel wavenumbers in m-1 + - filter: Variable Assignment + assignments: + - name: MetaData/sensorCentralWavenumber + type: float + channels: *iasi_metop-b_channels + function: + name: ObsFunction/LinearCombination + options: + variables: + - name: ObsValue/radiance + channels: *iasi_metop-b_channels + coefs: [25.0] + intercept: 64475.0 + use channel numbers: true + + # Transform radiance to brightness temperature + - filter: Variable Transforms + Transform: SatBrightnessTempFromRad + transform from: + name: ObsValue/radiance + channels: *iasi_metop-b_channels + spectral variable: + name: MetaData/sensorCentralWavenumber + channels: *iasi_metop-b_channels + radiance units: wavenumber + planck1: 1.191042953e-16 + planck2: 1.4387774e-2 + + # Step 0-C: Assign Observation Error + obs prior filters: + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-b_channels + action: + name: assign error + error parameter vector: &iasi_metop-b_oberr [ 1.38, 0.81, 0.75, 0.79, 0.72, 0.74, 0.68, 0.72, 0.65, 0.65, + 0.65, 0.69, 0.64, 0.64, 0.65, 0.67, 0.62, 0.61, 0.62, 0.64, 0.59, 0.76, + 1.22, 0.78, 0.64, 0.62, 0.61, 0.69, 0.65, 0.59, 0.61, 0.59, 0.68, 0.62, + 0.68, 4.38, 3.05, 2.31, 1.56, 1.33, 1.58, 0.93, 1.67, 0.72, 0.57, 0.58, + 0.55, 0.68, 0.59, 0.68, 0.59, 0.65, 0.58, 0.62, 0.64, 0.58, 0.64, 0.55, + 0.64, 0.5, 0.82, 0.59, 0.62, 0.51, 0.64, 0.52, 0.51, 0.51, 0.76, 0.52, + 0.57, 0.55, 0.69, 0.58, 0.65, 0.61, 0.59, 0.64, 0.76, 0.72, 1.05, 0.75, + 0.51, 0.65, 1.3, 0.69, 0.93, 1.49, 1.12, 0.68, 0.66, 0.67, 0.59, 0.59, + 0.69, 0.67, 0.64, 0.62, 0.72, 0.69, 0.66, 0.79, 0.78, 0.74, 0.88, 0.77, + 0.88, 0.86, 1, 0.87, 0.85, 0.88, 0.84, 0.84, 0.84, 0.8, 0.8, 0.87, + 0.98, 0.52, 0.65, 0.69, 0.61, 0.6, 0.67, 0.79, 0.62, 0.66, 0.7, 0.65, + 0.62, 0.61, 0.62, 0.53, 0.6, 0.68, 0.95, 0.63, 0.97, 0.65, 0.98, 0.58, + 0.73, 0.65, 0.85, 0.99, 0.76, 0.85, 0.97, 0.77, 0.62, 0.63, 1.21, 1.41, + 1.55, 1.78, 1.35, 1.14, 1.69, 1.79, 1.46, 1.63, 1.94, 2.01, 1.24, 1.76, + 1.26, 1.47, 1.9, 1.66, 2.13, 1.49, 1.52, 1.55, 1.96, 2.31, 2.33, 2.32, + 2.31, 2.33, 2.23, 2.33, 1.84, 2.29, 2.28, 2.28, 2.28, 2.26, 2.26, 2.26, + 2.27, 2.24, 2.23, 2.24, 2.26, 2.28, 2.28, 2.3, 2.15, 2.31, 2.37, 2.27, + 2.29, 2.29, 2.23, 2.28, 2.32, 2.32, 2.31, 2.32, 2.32, 2.31, 2.31, 2.28, + 2.29, 2.28, 2.26, 2.29, 2.27, 2.26, 2.25, 2.27, 2.24, 2.21, 2.24, 2.17, + 2.18, 2.17, 2.21, 1.99, 2.16, 2.2, 2.13, 2.12, 2.13, 2.1, 2.12, 2.11, + 2.09, 2.09, 2.08, 2.09, 2.04, 2.04, 2.1, 2.01, 2.05, 2.03, 2.06, 1.98, + 1.95, 1.94, 1.91, 1.7, 1.76, 1.77, 1.83, 2.04, 1.91, 1.99, 1.99, 2.07, + 2.02, 2.04, 2.1, 2.06, 2.18, 2.21, 2.24, 2.23, 2.23, 1.98, 2.2, 2.18, + 2.18, 2.21, 2.23, 2.24, 2.24, 2.25, 1.8, 2.24, 1.73, 1.73, 2.27, 1.67, + 2.21, 1.72, 2.23, 2.23, 2.23, 2.24, 2.23, 2.12, 2.17, 1.74, 2.02, 1.88, + 1.67, 1.73, 1.83, 1.82, 1.73, 1.83, 2.19, 1.84, 1.89, 1.6, 1.71, 1.86, + 1.85, 1.84, 1.87, 1.91, 1.52, 1.95, 1.87, 1.89, 1.91, 1.91, 1.93, 1.9, + 1.91, 1.9, 1.89, 1.89, 1.91, 1.9, 1.91, 1.91, 1.91, 1.93, 1.94, 1.91, + 1.92, 1.77, 1.91, 1.95, 1.19, 1.96, 1.98, 1.94, 1.55, 1.91, 1.92, 1.92, + 1.97, 1.93, 1.99, 1.86, 1.12, 1.93, 1.92, 1.95, 1.85, 1.84, 1.91, 1.12, + 1.82, 1.82, 1.95, 1.24, 1.94, 1.96, 1.21, 1.83, 1.96, 1.36, 1.96, 1.82, + 1.92, 1.68, 1.93, 1.23, 1.96, 1.93, 1.86, 1.41, 1.16, 1.6, 1.25, 1.2, + 1.65, 1.66, 1.87, 1.94, 1.96, 1.91, 1.25, 1.93, 1.91, 1.7, 0.99, 1.81, + 1.92, 1.95, 1.5, 1.47, 1.15, 1.58, 1.18, 1.82, 1.13, 1.83, 1.91, 1.26, + 1.27, 1.91, 1.45, 1.6, 1.29, 1.94, 1.94, 1.23, 1.95, 1.21, 1.94, 1.86, + 1.9, 1.33, 1.75, 2.02, 1.98, 2.03, 1.83, 1.5, 2.04, 2.02, 1.9, 2, 2.02, + 1.95, 1.93, 1.95, 1.95, 1.99, 2, 1.94, 1.96, 1.86, 1.92, 1.88, 1.86, + 1.84, 1.87, 1.77, 1.89, 1.89, 1.88, 1.94, 1.82, 1.79, 1.86, 2.06, 2.33, + 1.88, 1.86, 1.81, 1.8, 1.8, 1.86, 1.9, 2, 2.06, 2.1, 2.2, 2, 2.16, + 1.98, 1.8, 1.8, 1.85, 1.75, 2.04, 2.19, 2.14, 2.19, 1.86, 2.1, 2.11, + 2.18, 2.03, 2.28, 2.19, 2.26, 2.26, 2.21, 2.21, 2.26, 2.33, 2.27, 2.21, + 2.12, 2.23, 2.26, 2.25, 1.88, 2.26, 2.24, 2.36, 2.29, 2.35, 2.3, 2.27, + 2.08, 2.05, 2.27, 2.28, 2.27, 2.28, 1.97, 2.25, 2.25, 2.25, 2.31, 2.28, + 2.27, 2.13, 2.24, 2.28, 2.28, 2.41, 2.34, 9.32, 2.28, 2.38, 2.27, 2.27, + 2.39, 2.11, 2.09, 2.1, 2.06, 2.12, 2.08, 2, 1.93, 2.02, 2.55, 1.54, + 1.64, 1.51, 1.55, 2.82, 2.92, 2.55, 2.37, 1.85, 1.6, 1.72, 1.74, 1.79, + 1.9, 1.94, 2, 2.04, 2.08, 2.12, 2.13, 2.16, 2.18, 2.18, 2.2, 2.2, 2.41, + 2.39, 2.38, 2.4, 2.42, 2.41, 2.43, 2.45, 2.43, 2.45, 2.43, 2.4, 2.44, + 2.4, 2.42, 2.43, 2.45, 2.45, 2.45, 2.46, 2.45, 2.45, 2.43, 2.51, 2.48, + 2.48, 2.53, 2.46, 2.49, 2.5, 2.5, 2.5, 2.52, 2.52, 2.54, 2.5, 2.48, + 2.5, 2.55, 2.5, 2.48, 2.5, 2.5, 2.52, 2.52, 2.48, 2.5, 2.5, 2.52, 2.46, + 2.53, 9 ] + + obs post filters: + # Step 1: Remove Observations from the Edge of the Scan + - filter: Domain Check + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-b_channels + where: + - variable: + name: MetaData/sensorScanPosition + is_in: 5-56 + action: + name: reject + # actions: + # - name: set + # flag: ScanEdgeRemoval + # - name: reject + + # Step 2: Data Thinning + - filter: Gaussian Thinning + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-b_channels + horizontal_mesh: 145 + use_reduced_horizontal_grid: true + distance_norm: geodesic + priority_variable: MetaData/fractionOfClearPixelsInFOV + # round_horizontal_bin_count_to_nearest: true + # partition_longitude_bins_using_mesh: true + action: + name: reject + # actions: + # - name: set + # flag: Thinning + # - name: reject + + # Step 3: Wavenumber Check + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: 7024, 7027, 7029, 7032, 7038, 7043, 7046, 7049, 7069, 7072, + 7076, 7081, 7084, 7089, 7099, 7209, 7222, 7231, 7235, 7247, + 7267, 7269, 7284, 7389, 7419, 7423, 7424, 7426, 7428, 7431, + 7436, 7444, 7475, 7549, 7584, 7665, 7666, 7831, 7836, 7853, + 7865, 7885, 7888, 7912, 7950, 7972, 7980, 7995, 8007, 8015, + 8055, 8078 + where: + - variable: + name: MetaData/solarZenithAngle + maxvalue: 88.9999 + - variable: + name: water_area_fraction@GeoVaLs + minvalue: 1.0e-12 + action: + name: reject + # actions: + # - name: set + # flag: ShortwaveIRCheck + # - name: reject + + # Step 4: Observation Error Inflation based on Wavenumber + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-b_channels + action: + name: inflate error + inflation variable: + name: ObsErrorFactorWavenumIR@ObsFunction + channels: *iasi_metop-b_channels + options: + channels: *iasi_metop-b_channels + + # Step 5: Observation Range Sanity Check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-b_channels + minvalue: 50.00001 + maxvalue: 449.99999 + # maxvalue: 100.00000 + action: + name: reject + # actions: + # - name: set + # flag: ObsValueRangeCheck + # - name: reject + + # Step 6: Topography Check + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-b_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorTopoRad + channels: *iasi_metop-b_channels + options: + channels: *iasi_metop-b_channels + sensor: iasi_metop-b + + # Step 7: Transmittance Top Check + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-b_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorTransmitTopRad + channels: *iasi_metop-b_channels + options: + channels: *iasi_metop-b_channels + + # Step 8: Cloud Detection Check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-b_channels + test variables: + - name: ObsFunction/CloudDetectMinResidualIR + channels: *iasi_metop-b_channels + options: + channels: *iasi_metop-b_channels + use_flag: [ 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, + 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, + -1, 1, 1, 1, -1, -1, 1, 1, -1, 1, + -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, + -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, + 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, + 1, -1, -1, -1, 1, 1, 1, 1, -1, 1, + 1, -1, 1, 1, 1, -1, 1, -1, 1, -1, + 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, + 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, + 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, + 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, + -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, -1, 1, -1, 1, -1, + 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, + -1, 1, -1, 1, -1, -1, -1, -1, -1, 1, + 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, + 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, + 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, + 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, + -1, -1, -1, -1, -1, -1, 1, -1, 1, -1, + 1, -1, -1, -1, 1, -1, -1, -1, -1, -1, + -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, + 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, + -1, 1, -1, 1, -1, 1, -1, -1, -1, 1, + 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, + -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, + -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, + 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, + -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, + -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1] + use_flag_clddet: [ 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, + 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, + -1, 1, 1, 1, -1, -1, 1, 1, -1, 1, + -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, + -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, + 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, + 1, -1, -1, -1, 1, 1, 1, 1, -1, 1, + 1, -1, 1, 1, 1, -1, 1, -1, 1, -1, + 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, + 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, + 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, + 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, + -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, -1, 1, -1, 1, -1, + 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, + -1, 1, -1, 1, -1, -1, -1, -1, -1, 1, + 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, + 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, + 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, + 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1, -1, 1, -1, 1, -1, -1, -1, 1, + 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, + -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1] + obserr_dtempf: [0.50,2.00,4.00,2.00,4.00] + error parameter vector: *iasi_metop-b_oberr + maxvalue: 1.0e-12 + action: + name: reject + # actions: + # - name: set + # flag: CloudDetection + # - name: reject + + # Step 9: NSST Retrieval Check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-b_channels + test variables: + - name: NearSSTRetCheckIR@ObsFunction + channels: *iasi_metop-b_channels + options: + channels: *iasi_metop-b_channels + use_flag: [ 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, + 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, + -1, 1, 1, 1, -1, -1, 1, 1, -1, 1, + -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, + -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, + 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, + 1, -1, -1, -1, 1, 1, 1, 1, -1, 1, + 1, -1, 1, 1, 1, -1, 1, -1, 1, -1, + 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, + 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, + 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, + 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, + -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, -1, 1, -1, 1, -1, + 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, + -1, 1, -1, 1, -1, -1, -1, -1, -1, 1, + 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, + 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, + 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, + 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, + -1, -1, -1, -1, -1, -1, 1, -1, 1, -1, + 1, -1, -1, -1, 1, -1, -1, -1, -1, -1, + -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, + 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, + -1, 1, -1, 1, -1, 1, -1, -1, -1, 1, + 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, + -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, + -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, + 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, + -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, + -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1] + obserr_demisf: [0.01,0.02,0.03,0.02,0.03] + obserr_dtempf: [0.50,2.00,4.00,2.00,4.00] + maxvalue: 1.0e-12 + action: + name: reject + # actions: + # - name: set + # flag: NSSTCheck + # - name: reject + + # Step 10: Surface Jacobians Check + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-b_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorSurfJacobianRad + channels: *iasi_metop-b_channels + options: + channels: *iasi_metop-b_channels + obserr_demisf: [0.01, 0.02, 0.03, 0.02, 0.03] + obserr_dtempf: [0.50, 2.00, 4.00, 2.00, 4.00] + sensor: iasi_metop-b + + # Step 11: Gross check + - filter: Background Check + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-b_channels + function absolute threshold: + - name: ObsFunction/ObsErrorBoundIR + channels: *iasi_metop-b_channels + options: + channels: *iasi_metop-b_channels + obserr_bound_latitude: + name: ObsFunction/ObsErrorFactorLatRad + options: + latitude_parameters: [25.0, 0.5, 0.04, 1.0] + obserr_bound_transmittop: + name: ObsFunction/ObsErrorFactorTransmitTopRad + channels: *iasi_metop-b_channels + options: + channels: *iasi_metop-b_channels + obserr_bound_max: [ 3.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + 2.0, 2.0, 4.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 4.0, 4.0, + 3.5, 2.5, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + 3.5, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 3.0, 2.0, 2.0, + 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + 2.0, 2.0, 2.0, 2.0, 2.5, 2.0, 2.5, 2.5, 3.0, 2.5, + 2.5, 2.5, 2.5, 3.5, 2.5, 2.5, 3.0, 3.5, 3.0, 4.0, + 4.0, 4.0, 4.0, 4.0, 4.0, 4.5, 4.5, 4.5, 4.5, 4.5, + 4.0, 4.5, 4.0, 4.0, 4.5, 2.5, 3.0, 2.5, 3.0, 2.5, + 3.0, 2.0, 2.5, 2.5, 3.0, 3.0, 2.5, 3.0, 3.0, 3.0, + 2.5, 2.5, 4.0, 4.5, 4.5, 5.0, 4.0, 4.0, 5.0, 5.0, + 5.0, 5.0, 5.5, 5.5, 4.0, 5.0, 4.0, 4.5, 5.5, 5.5, + 6.0, 4.5, 4.5, 4.0, 5.0, 5.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 5.5, 4.5, 6.0, + 5.0, 5.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 5.0, 6.0, + 6.0, 6.0, 4.0, 6.0, 6.0, 6.0, 6.0, 4.5, 6.0, 6.0, + 4.5, 6.0, 6.0, 6.0, 6.0, 6.0, 5.0, 6.0, 6.0, 6.0, + 5.0, 6.0, 6.0, 5.0, 6.0, 5.0, 6.0, 6.0, 6.0, 5.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, + 6.0, 6.0, 6.0, 6.0, 6.0, 6.0] + error parameter vector: *iasi_metop-b_oberr + action: + name: reject + # actions: + # - name: set + # flag: GrossCheck + # - name: reject + + # Step 12: Useflag Check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-b_channels + test variables: + - name: ObsFunction/ChannelUseflagCheckRad + channels: *iasi_metop-b_channels + options: + channels: *iasi_metop-b_channels + use_flag: [ 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, + 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, + -1, 1, 1, 1, -1, -1, 1, 1, -1, 1, + -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, + -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, + 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, + 1, -1, -1, -1, 1, 1, 1, 1, -1, 1, + 1, -1, 1, 1, 1, -1, 1, -1, 1, -1, + 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, + 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, + 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, + 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, + -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, -1, 1, -1, 1, -1, + 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, + -1, 1, -1, 1, -1, -1, -1, -1, -1, 1, + 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, + 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, + 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, + 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, + -1, -1, -1, -1, -1, -1, 1, -1, 1, -1, + 1, -1, -1, -1, 1, -1, -1, -1, -1, -1, + -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, + 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, + -1, 1, -1, 1, -1, 1, -1, -1, -1, 1, + 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, + -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, + -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, + 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, + -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, + -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1] + minvalue: 1.0e-12 + action: + name: reject + # actions: + # - name: set + # flag: UseFlagCheck + # - name: reject diff --git a/parm/atm/obs/config/lgetkf_amsua_n19.yaml b/parm/atm/obs/config/lgetkf_amsua_n19.yaml deleted file mode 100644 index a29cb8bdf..000000000 --- a/parm/atm/obs/config/lgetkf_amsua_n19.yaml +++ /dev/null @@ -1,79 +0,0 @@ -obs space: - name: amsua_n19 - distribution: - name: Halo - halo size: 1250e3 - obsdatain: - engine: - type: H5File - obsfile: ./obs/$(OPREFIX)amsua_n19.{{ current_cycle | to_YMDH }}.nc - obsdataout: - engine: - type: H5File - obsfile: ./diags/diag_amsua_n19_{{ current_cycle | to_YMDH }}.nc - io pool: - max pool size: 1 - simulated variables: [brightnessTemperature] - channels: &amsua_n19_channels 4-6,9-14 -obs operator: - name: CRTM - Absorbers: [H2O,O3] - Clouds: [Water, Ice] - Cloud_Fraction: 1.0 - obs options: - Sensor_ID: amsua_n19 - EndianType: little_endian - CoefficientPath: ./crtm/ -obs error: - covariance model: diagonal -obs bias: - input file: $(DATA)/obs/$(GPREFIX)amsua_n19.satbias.nc - output file: $(DATA)/bc/$(APREFIX)amsua_n19.satbias.nc - variational bc: - predictors: - - name: constant - - name: lapse_rate - order: 2 - tlapse: &amsua_n19_tlapse $(DATA)/obs/$(GPREFIX)amsua_n19.tlapse.txt - - name: lapse_rate - tlapse: *amsua_n19_tlapse - - name: emissivity - - name: scan_angle - order: 4 - - name: scan_angle - order: 3 - - name: scan_angle - order: 2 - - name: scan_angle - covariance: - minimal required obs number: 20 - variance range: [1.0e-6, 10.0] - step size: 1.0e-4 - largest analysis variance: 10000.0 - prior: - input file: $(DATA)/obs/$(GPREFIX)amsua_n19.satbias_cov.nc - inflation: - ratio: 1.1 - ratio for small dataset: 2.0 - output file: $(DATA)/bc/$(APREFIX)amsua_n19.satbias_cov.nc -obs filters: -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: *amsua_n19_channels - minvalue: 100.0 - maxvalue: 500.0 - action: - name: reject -# Gross check -- filter: Background Check - filter variables: - - name: brightnessTemperature - channels: *amsua_n19_channels - threshold: 3.0 - action: - name: reject -obs localizations: -- localization method: Horizontal Gaspari-Cohn - lengthscale: 1250e3 - max nobs: 10000 diff --git a/parm/atm/obs/config/lgetkf_amsua_n19.yaml.j2 b/parm/atm/obs/config/lgetkf_amsua_n19.yaml.j2 new file mode 100644 index 000000000..9fda72ea9 --- /dev/null +++ b/parm/atm/obs/config/lgetkf_amsua_n19.yaml.j2 @@ -0,0 +1,79 @@ +- obs space: + name: amsua_n19 + distribution: + name: Halo + halo size: 1250e3 + obsdatain: + engine: + type: H5File + obsfile: './obs/{{ OPREFIX }}amsua_n19.{{ current_cycle | to_YMDH }}.nc' + obsdataout: + engine: + type: H5File + obsfile: './diags/diag_amsua_n19_{{ current_cycle | to_YMDH }}.nc' + io pool: + max pool size: 1 + simulated variables: [brightnessTemperature] + channels: &amsua_n19_channels 4-6,9-14 + obs operator: + name: CRTM + Absorbers: [H2O,O3] + Clouds: [Water, Ice] + Cloud_Fraction: 1.0 + obs options: + Sensor_ID: amsua_n19 + EndianType: little_endian + CoefficientPath: ./crtm/ + obs error: + covariance model: diagonal + obs bias: + input file: '{{ DATA }}/obs/{{ GPREFIX }}amsua_n19.satbias.nc' + output file: '{{ DATA }}/bc/{{ APREFIX }}amsua_n19.satbias.nc' + variational bc: + predictors: + - name: constant + - name: lapse_rate + order: 2 + tlapse: &amsua_n19_tlapse '{{ DATA }}/obs/{{ GPREFIX }}amsua_n19.tlapse.txt' + - name: lapse_rate + tlapse: *amsua_n19_tlapse + - name: emissivity + - name: scan_angle + order: 4 + - name: scan_angle + order: 3 + - name: scan_angle + order: 2 + - name: scan_angle + covariance: + minimal required obs number: 20 + variance range: [1.0e-6, 10.0] + step size: 1.0e-4 + largest analysis variance: 10000.0 + prior: + input file: '{{ DATA }}/obs/{{ GPREFIX }}amsua_n19.satbias_cov.nc' + inflation: + ratio: 1.1 + ratio for small dataset: 2.0 + output file: '{{ DATA }}/bc/{{ APREFIX }}amsua_n19.satbias_cov.nc' + obs filters: + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *amsua_n19_channels + minvalue: 100.0 + maxvalue: 500.0 + action: + name: reject + # Gross check + - filter: Background Check + filter variables: + - name: brightnessTemperature + channels: *amsua_n19_channels + threshold: 3.0 + action: + name: reject + obs localizations: + - localization method: Horizontal Gaspari-Cohn + lengthscale: 1250e3 + max nobs: 10000 diff --git a/parm/atm/obs/config/lgetkf_conv_ps.yaml.j2 b/parm/atm/obs/config/lgetkf_conv_ps.yaml.j2 new file mode 100644 index 000000000..d10a46901 --- /dev/null +++ b/parm/atm/obs/config/lgetkf_conv_ps.yaml.j2 @@ -0,0 +1,357 @@ +- obs space: + name: surface_ps + distribution: + name: Halo + halo size: 1250e3 + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}conventional_ps.prepbufr.nc' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_conventional_ps_prepbufr_{{ current_cycle | to_YMDH }}.nc' + io pool: + max pool size: 1 + simulated variables: [stationPressure] + + obs operator: + name: SfcPCorrected + variables: + - name: stationPressure + da_psfc_scheme: GSI + station_altitude: height + geovar_sfc_geomz: surface_altitude + geovar_geomz: geopotential_height + + linear obs operator: + name: Identity + variables: + - name: stationPressure + + obs prior filters: + # Initial Error Assignments for SFC Observations + - filter: Perform Action + filter variables: + - name: stationPressure + where: + - variable: ObsType/stationPressure + is_in: [181] + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + round_to_the_nearest_integer: true + xvar: + name: ObsValue/stationPressure + xvals: [80000, 75000, 70000, 65000, 60000, 55000 ] + errors: [110, 120, 120, 120, 120, 1.0e+11] + + - filter: Perform Action + filter variables: + - name: stationPressure + where: + - variable: ObsType/stationPressure + is_in: [187] + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + round_to_the_nearest_integer: true + xvar: + name: ObsValue/stationPressure + xvals: [85000, 80000, 75000, 70000, 65000, 60000, 55000 ] + errors: [ 120, 140, 140, 140, 140, 140, 1.0e+11] + + # Initial Error Assignments for SFCSHIP Observations + - filter: Perform Action + filter variables: + - name: stationPressure + where: + - variable: ObsType/stationPressure + is_in: [180] + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + round_to_the_nearest_integer: true + xvar: + name: ObsValue/stationPressure + xvals: [60000, 55000 ] + errors: [ 130, 1.0e+11] + + - filter: Perform Action + filter variables: + - name: stationPressure + where: + - variable: ObsType/stationPressure + is_in: [183] + action: + name: assign error + error parameter: 1.0e+11 + + # Initial Error Assignments for Radiosonde + - filter: Perform Action + filter variables: + - name: stationPressure + where: + - variable: ObsType/stationPressure + is_in: [120] + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + round_to_the_nearest_integer: true + xvar: + name: ObsValue/stationPressure + xvals: [80000, 75000, 70000, 65000, 60000, 55000 ] + errors: [ 110, 120, 120, 120, 120, 1.0e+11] + + # Create PreQC group variable (pqm in GSI read_prepbufr) + - filter: Variable Assignment + assignments: + - name: InputObsError/stationPressure + type: float + source variable: ObsErrorData/stationPressure + + # Set observation quality-realted variables + # Create PreQC group variable (pqm in GSI read_prepbufr) + - filter: Variable Assignment + assignments: + - name: PreQC/stationPressure + type: int + source variable: QualityMarker/stationPressure + + # Create PreUseFlag group variable (usage in GSI read_prepbufr) + # Initialize + - filter: Variable Assignment + assignments: + - name: PreUseFlag/stationPressure + type: int + source variable: PreQC/stationPressure + + - filter: Variable Assignment + where: + - variable: + name: PreUseFlag/stationPressure + is_in: 1-15 + assignments: + - name: PreUseFlag/stationPressure + value: 0 + # Re-assignment + - filter: Variable Assignment + where: + - variable: + name: ObsType/stationPressure + is_in: 183 + assignments: + - name: PreUseFlag/stationPressure + value: 100 + + - filter: Variable Assignment + where: + - variable: + name: ObsValue/stationPressure + is_defined: + - variable: + name: ObsValue/stationPressure + maxvalue: 50000.00 + where operator: and + assignments: + - name: PreUseFlag/stationPressure + value: 100 + + - filter: Variable Assignment + where: + - variable: + name: PreQC/stationPressure + is_in: 9, 12, 15 + assignments: + - name: PreUseFlag/stationPressure + value: 100 + + - filter: Variable Assignment + where: + - variable: + name: PreQC/stationPressure + is_in: 4-15 + assignments: + - name: PreUseFlag/stationPressure + value: 101 + + ## Observation range sanity check + #- filter: Bounds Check + # filter variables: + # - name: stationPressure + # minvalue: 37499.0 + # maxvalue: 106999.0 + # action: + # name: reject + + ## Reject all ObsType 183 + #- filter: RejectList + # where: + # - variable: + # name: ObsType/stationPressure + # is_in: 183 + + ## Reject surface pressure below 500 hPa + #- filter: Bounds Check + # filter variables: + # - name: stationPressure + # minvalue: 50000.00 + # action: + # name: reject + + #- filter: RejectList + # where: + # - variable: + # name: PreQC/stationPressure + # is_in: 4-15 + + # Inflate obs error based on obs type + - filter: Perform Action + filter variables: + - name: stationPressure + where: + - variable: PreQC/stationPressure + is_in: 3, 7 + action: + name: inflate error + inflation factor: 1.2 + + obs post filters: + # Calculate obs error inflation factors for duplicated observations at the same location + - filter: Variable Assignment + assignments: + - name: ObsErrorFactorDuplicateCheck/stationPressure + type: float + function: + name: ObsFunction/ObsErrorFactorDuplicateCheck + options: + use_air_pressure: false + variable: stationPressure + + # Reduce effective observation error based on obs type and subtype + # In this case: reduce effective obs error for buoy + - filter: Perform Action + filter variables: + - name: stationPressure + where: + - variable: + name: ObsType/stationPressure + is_in: 180 + - variable: + name: ObsSubType/stationPressure + is_in: 0 + action: + name: inflate error + inflation factor: 0.7 + + # Calculate obs error inflation factors for large discrepancies between model and observations + - filter: Variable Assignment + assignments: + - name: ObsErrorFactorSfcPressure/stationPressure + type: float + function: + name: ObsFunction/ObsErrorFactorSfcPressure + options: + geovar_sfc_geomz: surface_altitude + geovar_geomz: geopotential_height + station_altitude: height + + # Inflate surface pressure observation based on discrepancies between + # model and observations due to terrian + - filter: Perform Action + filter variables: + - name: stationPressure + action: + name: inflate error + inflation variable: + name: ObsErrorFactorSfcPressure/stationPressure + + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/Innovation + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsValue/stationPressure + - name: HofX/stationPressure + coefs: [1, -1] + + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/ObsErrorBoundSfcPressure1 + type: float + function: + name: ObsFunction/ObsErrorBoundConventional + options: + obsvar: stationPressure + obserr_bound_min: 100 + obserr_bound_max: 300 + obserr_bound_factor: 5.0 + + - filter: Background Check + filter variables: + - name: stationPressure + where: + - variable: PreQC/stationPressure + is_not_in: 3 + function absolute threshold: + - name: DerivedMetaData/ObsErrorBoundSfcPressure1 + action: + name: reject + + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/ObsErrorBoundSfcPressure2 + type: float + function: + name: ObsFunction/ObsErrorBoundConventional + options: + obsvar: stationPressure + obserr_bound_min: 100 + obserr_bound_max: 300 + obserr_bound_factor: 3.5 + + - filter: Background Check + filter variables: + - name: stationPressure + where: + - variable: PreQC/stationPressure + is_in: 3 + function absolute threshold: + - name: DerivedMetaData/ObsErrorBoundSfcPressure2 + action: + name: reject + + # Inflate obs error based on duplicate check + - filter: Perform Action + filter variables: + - name: stationPressure + action: + name: inflate error + inflation variable: + name: ObsErrorFactorDuplicateCheck/stationPressure + + # Reject data based on PreUseFlag (usage in GSI) + - filter: Perform Action + filter variables: + - name: stationPressure + where: + - variable: PreUseFlag/stationPressure + is_not_in: 0, 1 + action: + name: reject + # End of Filters + obs localizations: + - localization method: Horizontal Gaspari-Cohn + lengthscale: 1250e3 + max nobs: 10000 diff --git a/parm/atm/obs/config/lgetkf_gnssro.yaml.j2 b/parm/atm/obs/config/lgetkf_gnssro.yaml.j2 new file mode 100644 index 000000000..8e7747b45 --- /dev/null +++ b/parm/atm/obs/config/lgetkf_gnssro.yaml.j2 @@ -0,0 +1,146 @@ +- obs space: + name: gnssrobndnbam + distribution: + name: Halo + halo size: 1250e3 + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}gnssro.tm00.bufr_d.nc' + # obsgrouping: + # group variables: [ 'sequenceNumber' ] + # sort variable: 'impactHeightRO' + # sort order: 'ascending' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_gnssro_{{ current_cycle | to_YMDH }}.nc' + simulated variables: [bendingAngle] + + obs operator: + name: GnssroBndNBAM + obs options: + use_compress: 1 + sr_steps: 2 + vertlayer: full + super_ref_qc: NBAM + + obs filters: + # Apply gross check using pccf + # Step 0-A: Create Diagnostic Flags + # Diagnostic flag for pccf + - filter: Create Diagnostic Flags + filter variables: + - name: bendingAngle + flags: + - name: pccfCheckReject + initial value: false + force reinitialization: true + + # Diagnostic flag for qfro + - filter: Create Diagnostic Flags + filter variables: + - name: bendingAngle + flags: + - name: qfroCheckReject + initial value: false + force reinitialization: true + + # Step 0-B: pccf Check - good: 0.1-100, reject: 0 + - filter: Bounds Check + filter variables: + - name: bendingAngle + where: + - variable: + name: MetaData/satelliteIdentifier + is_in: 265-269,750-755,44,786,820,825 + test variables: + - name: MetaData/pccf + minvalue: 0.1 + maxvalue: 100.1 + actions: + - name: set + flag: pccfCheckReject + - name: reject + + # Step 0-B: qfro Check - good: 0, reject: 1 + - filter: Bounds Check + - filter: RejectList + filter variables: + - name: bendingAngle + where: + - variable: + name: MetaData/satelliteIdentifier + is_in: 3-5,421,440,821 + test variables: + - name: MetaData/qualityFlags + minvalue: -0.1 + maxvalue: 0.1 + actions: + - name: set + flag: qfroCheckReject + - name: reject + + #1. gpstop + - filter: Domain Check + filter variables: + - name: bendingAngle + where: + - variable: + name: MetaData/impactHeightRO + minvalue: 0 + maxvalue: 55000.1 + action: + name: reject + #2. commgpstop + - filter: Bounds Check + filter variables: + - name: bendingAngle + where: + - variable: + name: MetaData/satelliteIdentifier + is_in: 265,266,267,268,269 + test variables: + - name: MetaData/impactHeightRO + maxvalue: 45000.1 + action: + name: reject + #3. metop below 8 km + - filter: Bounds Check + filter variables: + - name: bendingAngle + where: + - variable: + name: MetaData/satelliteIdentifier + is_in: 3-5 + test variables: + - name: MetaData/impactHeightRO + minvalue: 8000.1 + action: + name: reject + #4. assign obs error + - filter: ROobserror + filter variables: + - name: bendingAngle + errmodel: NBAM + #5. RONBAM cut off check + - filter: Background Check RONBAM + filter variables: + - name: bendingAngle + #6. Obs error inflate + - filter: Background Check RONBAM + filter variables: + - name: bendingAngle + action: + name: RONBAMErrInflate + #7. Background check + #- filter: Background Check + # filter variables: + # - name: bendingAngle + # threshold: 10 + # action: + # name: reject + obs localizations: + - localization method: Horizontal Gaspari-Cohn + lengthscale: 1250e3 + max nobs: 10000 diff --git a/parm/atm/obs/config/lgetkf_satwind_abi_goes-16.yaml.j2 b/parm/atm/obs/config/lgetkf_satwind_abi_goes-16.yaml.j2 new file mode 100644 index 000000000..f39c5eff0 --- /dev/null +++ b/parm/atm/obs/config/lgetkf_satwind_abi_goes-16.yaml.j2 @@ -0,0 +1,573 @@ +- obs space: + name: satwind_goes-16 + distribution: + name: Halo + halo size: 1250e3 + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}satwnd.abi_goes-16.tm00.nc' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_satwind_abi_goes-16_{{ current_cycle | to_YMDH }}.nc' + 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 + + 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 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 + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + xvar: + name: MetaData/pressure + xvals: [110000.,0.] #Pressure (Pa) + errors: [1000000000.,1000000000.] + + # 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 + 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 + 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 + 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 251 (GOES VIS): Assigned all dummy values + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 251 + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + xvar: + name: MetaData/pressure + xvals: [110000.,0.] #Pressure (Pa) + errors: [1000000000.,1000000000.] + + # 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 251 (VIS) --- obs tossed without passing to setup routine + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 251 + 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 + + # Reject obs with pressure < 12500 pa --- obs tosed without passing to setup routine + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/satelliteIdentifier + is_in: 250-299 + test variables: + - name: MetaData/pressure + minvalue: 12500. + action: + name: reject + + # Exclude data over non-water surface type where latitude > 20N for Type 240 (IRSW) and Type 245 (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: 240, 245 + - 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 qualityInformationWithoutForecast < 90. OR > 100. + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/satelliteIdentifier + is_in: 250-299 + test variables: + - name: MetaData/qualityInformationWithoutForecast + minvalue: 90. + maxvalue: 100. + action: + name: reject + + # Reject obs with pressure < 15000 pa. + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/satelliteIdentifier + is_in: 250-299 + test variables: + - name: MetaData/pressure + minvalue: 15000. + action: + name: reject + + # Reject obs with pressure < 70000 pa. when Type=251 + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/satelliteIdentifier + is_in: 250-299 + - variable: ObsType/windEastward + is_in: 251 + test variables: + - name: MetaData/pressure + minvalue: 70000. + action: + name: reject + + # Reject obs with pressure > 30000. when Type=246 + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/satelliteIdentifier + is_in: 250-299 + - 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) + # Notes: Replace land_type_index_NPOESS with land_area_fraction (eliu) + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/satelliteIdentifier + is_in: 250-299 + - variable: GeoVaLs/land_area_fraction + minvalue: 0.99 + 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 + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/satelliteIdentifier + is_in: 250-299 + - 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 NESDIS winds + # + # CLEARED: With caveat that float precision/handling differences can generate different acceptance criteria + # between UFO and GSI for observations with an experr_norm value right around the maxvalue. + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/satelliteIdentifier + is_in: 250-299 + test variables: + - name: ObsFunction/SatWindsErrnormCheck + maxvalue: 0.9 + action: + name: reject + + # Reject all Type=240 (GOES SWIR) AMVs: These are not currently assimilated in GSI and they have missing-values + # assigned to ob-errors + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 240 + 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 + + # 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 + + # 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 + + # 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 + + # 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 + # Notes (eliu): Replace land_type_index_NPOESS with land_area_fraction. + - filter: Difference Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: + name: GeoVaLs/water_area_fraction + maxvalue: 0.99 + - 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 + + # 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 + + # 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 + obs localizations: + - localization method: Horizontal Gaspari-Cohn + lengthscale: 1250e3 + max nobs: 10000 diff --git a/parm/atm/obs/config/lgetkf_satwind_ahi_h8.yaml.j2 b/parm/atm/obs/config/lgetkf_satwind_ahi_h8.yaml.j2 new file mode 100644 index 000000000..3ab5656e0 --- /dev/null +++ b/parm/atm/obs/config/lgetkf_satwind_ahi_h8.yaml.j2 @@ -0,0 +1,404 @@ +- obs space: + name: satwind_ahi_h8 + distribution: + name: Halo + halo size: 1250e3 + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}satwnd.ahi_h8.tm00.nc' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_satwind_ahi_h8_{{ current_cycle | to_YMDH }}.nc' + 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 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 qualityInformationWithoutForecast < 85. (also > 100., which is missing data) + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: MetaData/qualityInformationWithoutForecast + 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 + + # 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 + obs localizations: + - localization method: Horizontal Gaspari-Cohn + lengthscale: 1250e3 + max nobs: 10000 diff --git a/parm/atm/obs/config/lgetkf_scatwind_ascat_metop-b.yaml.j2 b/parm/atm/obs/config/lgetkf_scatwind_ascat_metop-b.yaml.j2 new file mode 100644 index 000000000..a19161e0e --- /dev/null +++ b/parm/atm/obs/config/lgetkf_scatwind_ascat_metop-b.yaml.j2 @@ -0,0 +1,301 @@ +- obs space: + name: ascatw_ascat_metop-b + distribution: + name: Halo + halo size: 1250e3 + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}ascatw.ascat_metop-b.tm00.nc' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_ascatw_ascat_metop-b_{{ current_cycle | to_YMDH }}.nc' + io pool: + max pool size: 1 + simulated variables: [windEastward, windNorthward] + + obs operator: + name: VertInterp + # Use height vertical coordinate first + # vertical coordinate: geometric_height + vertical coordinate: geopotential_height + observation vertical coordinate group: DerivedVariables + observation vertical coordinate: adjustedHeight + interpolation method: linear + hofx scaling field: SurfaceWindScalingHeight + hofx scaling field group: DerivedVariables + + linear obs operator: + name: VertInterp + vertical coordinate: geopotential_height + observation vertical coordinate group: DerivedVariables + observation vertical coordinate: adjustedHeight + interpolation method: linear + + obs pre filters: + - filter: Gaussian Thinning + horizontal_mesh: 75 + 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 rescaled height coordinate + - filter: Variable Transforms + Transform: AdjustedHeightCoordinate + SkipWhenNoObs: False + + # Apply variable changes needed for wind scaling + - filter: Variable Transforms + Transform: SurfaceWindScalingHeight + SkipWhenNoObs: False + + # Assign the initial observation error (constant value, 1.5 m/s right now). + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + action: + name: assign error + error parameter: 1.5 + + # 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 + + # Reject all obs with PreQC mark already set above 3 + # NOTE: All scatwinds have an automatic PreQC mark of 2 (hard-wired default from GSI) + # - filter: PreQC + # maxvalue: 3 + # action: + # name: reject + + obs post filters: + # Reject all ASCAT (Type 290) winds with tsavg <= 273.0 (surface temperature) + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 290 + # - variable: GeoVaLs/surface_temperature + - variable: GeoVaLs/surface_temperature_where_land + maxvalue: 273. + action: + name: reject + + # Reject all ASCAT (Type 290) winds with isflg /= 0 (non-water surface) + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 290 + - variable: GeoVaLs/water_area_fraction + maxvalue: 0.99 + action: + name: reject + + # Reject ASCAT (Type 290) when observed component deviates from background by more than 5.0 m/s + # NOTE: This check can reject a u- or v-component of the same observation independently, which + # is fundamentally different from how GSI rejects obs (both components are rejected if + # either component fails a check). + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: ObsFunction/Arithmetic + options: + variables: + - name: ObsValue/windEastward + - name: HofX/windEastward + coefs: [1.0, -1.0] + minvalue: -5.0 + maxvalue: 5.0 + + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: ObsFunction/Arithmetic + options: + variables: + - name: ObsValue/windNorthward + - name: HofX/windNorthward + coefs: [1.0, -1.0] + minvalue: -5.0 + maxvalue: 5.0 + + # Reject OSCAT (Type 291) when observed component deviates from background by more than 6.0 m/s + # NOTE: This check can reject a u- or v-component of the same observation independently, which + # is fundamentally different from how GSI rejects obs (both components are rejected if + # either component fails a check). + - filter: Background Check + filter variables: + - name: windEastward + - name: windNorthward + threshold: 6. + absolute threshold: 6. + where: + - variable: ObsType/windEastward + is_in: 291 + action: + name: reject + + # Reject ASCAT (Type 290) when ambiguity check fails (returned value is negative) + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 290 + test variables: + - name: ObsFunction/ScatWindsAmbiguityCheck + options: + minimum_uv: 0.0001 # hard-coding a minimum-uv for transparancy, want this to basically be zero + maxvalue: 0. + action: + name: reject + + # All scatwinds must adjust errors based on ObsErrorFactorPressureCheck. + # This check will inflate errors for obs that are too close to either + # the model top or bottom. + - filter: Perform Action + filter variables: + - name: windEastward + where: + - variable: + name: ObsType/windEastward + is_in: 290-291 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windEastward + inflation factor: 4.0 + + - filter: Perform Action + filter variables: + - name: windNorthward + where: + - variable: + name: ObsType/windNorthward + is_in: 290-291 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windNorthward + inflation factor: 4.0 + + # All scatwinds subject to a gross error check. This is contained within + # the WindsSPDBCheck, although it is not exclusive to satwinds. + - filter: Background Check + filter variables: + - name: windEastward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 290, 291] + cgross: [ 5.0, 5.0] + error_min: [1.4, 1.4] + error_max: [6.1, 6.1] + variable: windEastward + action: + name: reject + + - filter: Background Check + filter variables: + - name: windNorthward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 290, 291] + cgross: [ 5.0, 5.0] + error_min: [1.4, 1.4] + error_max: [6.1, 6.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. + #- 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 + + # There is no across-the-board inflation for nvqc=.true. for scatwinds, presumably because for + # this inflation to take place both nvqc must be .true. AND ibeta must be >0, see: + # https://github.com/NOAA-EMC/GSI/blob/14ae595af1b03471287d322596d35c0665336e95/src/gsi/setupw.f90#L1229 + # GSI settings must have ibeta>0 for satwinds, but not for scatwinds. + # + # If the ibeta settings for scatwinds were to change while nvqc remained .true., we would extend YAML to + # an additional filter that inflates final ob-errors across-the-board by 1/0.8 = 1.25. NOTE: the nvqc setting + # is defaulted to .false. in GSI code, but is overridden in global operational configuration. See: + # 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 functionality were to be activated for scatwinds, you would want to include this last inflation filter. + #- filter: Perform Action + # filter variables: + # - name: windEastward + # where: + # - variable: ObsType/windEastward + # is_in: 290-291 + # action: + # name: inflate error + # inflation factor: 1.25 + #- filter: Perform Action + # filter variables: + # - name: windNorthward + # where: + # - variable: ObsType/windNorthward + # is_in: 290-291 + # action: + # name: inflate error + # inflation factor: 1.25 + + # END OF FILTERS# + obs localizations: + - localization method: Horizontal Gaspari-Cohn + lengthscale: 1250e3 + max nobs: 10000 diff --git a/parm/atm/obs/config/lgetkf_sondes.yaml b/parm/atm/obs/config/lgetkf_sondes.yaml deleted file mode 100644 index 8515508a6..000000000 --- a/parm/atm/obs/config/lgetkf_sondes.yaml +++ /dev/null @@ -1,33 +0,0 @@ -obs space: - name: sondes - distribution: - name: Halo - halo size: 1250e3 - obsdatain: - engine: - type: H5File - obsfile: ./obs/$(OPREFIX)sondes.{{ current_cycle | to_YMDH }}.nc - obsdataout: - engine: - type: H5File - obsfile: ./diags/diag_sondes_lgetkf_{{ current_cycle | to_YMDH }}.nc - io pool: - max pool size: 1 - simulated variables: [windEastward, windNorthward, airTemperature] -obs operator: - name: VertInterp -obs error: - covariance model: diagonal -obs filters: -- filter: PreQC - maxvalue: 3 -- filter: Background Check - filter variables: - - name: windEastward - - name: windNorthward - - name: airTemperature - threshold: 2.0 -obs localizations: -- localization method: Horizontal Gaspari-Cohn - lengthscale: 1250e3 - max nobs: 10000 diff --git a/parm/atm/obs/config/lgetkf_sondes.yaml.j2 b/parm/atm/obs/config/lgetkf_sondes.yaml.j2 new file mode 100644 index 000000000..2a2c6b58d --- /dev/null +++ b/parm/atm/obs/config/lgetkf_sondes.yaml.j2 @@ -0,0 +1,33 @@ +- obs space: + name: sondes + distribution: + name: Halo + halo size: 1250e3 + obsdatain: + engine: + type: H5File + obsfile: './obs/{{ OPREFIX }}sondes.{{ current_cycle | to_YMDH }}.nc' + obsdataout: + engine: + type: H5File + obsfile: './diags/diag_sondes_lgetkf_{{ current_cycle | to_YMDH }}.nc' + io pool: + max pool size: 1 + simulated variables: [windEastward, windNorthward, airTemperature] + obs operator: + name: VertInterp + obs error: + covariance model: diagonal + obs filters: + - filter: PreQC + maxvalue: 3 + - filter: Background Check + filter variables: + - name: windEastward + - name: windNorthward + - name: airTemperature + threshold: 2.0 + obs localizations: + - localization method: Horizontal Gaspari-Cohn + lengthscale: 1250e3 + max nobs: 10000 diff --git a/parm/atm/obs/config/omi_aura.yaml b/parm/atm/obs/config/omi_aura.yaml deleted file mode 100644 index 27fa97004..000000000 --- a/parm/atm/obs/config/omi_aura.yaml +++ /dev/null @@ -1,89 +0,0 @@ -obs space: - name: omi_aura - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)omi_aura.${{ current_cycle | to_YMDH }}.nc - obsdataout: - engine: - type: H5File - obsfile: $(DATA)/diags/diag_omi_aura_${{ current_cycle | to_YMDH }}.nc - io pool: - max pool size: 1 - simulated variables: [ozoneTotal] - -obs operator: - name: AtmVertInterpLay - geovals: [mole_fraction_of_ozone_in_air] - coefficients: [0.007886131] # convert from ppmv to DU - nlevels: [1] - -obs pre filters: -- filter: Perform Action - filter variables: - - name: ozoneTotal - action: - name: assign error - error parameter: 6.0 - -obs prior filters: -# GSI read routine QC -# range sanity check -- filter: Bounds Check - filter variables: - - name: ozoneTotal - minvalue: 0 - maxvalue: 10000 - action: - name: reject - -# Do not use the data if row anomaly (bit 10)is 1 -- filter: RejectList - filter variables: - - name: ozoneTotal - where: - - variable: - name: MetaData/totalOzoneQualityFlag - any_bit_set_of: 9 - -# Scan position check: reject scan position >= 25 -- filter: RejectList - filter variables: - - name: ozoneTotal - where: - - variable: - name: MetaData/sensorScanPosition - minvalue: 25 - -# Accept total_ozone_error_flag values of 0 and 1, but not any others. -- filter: RejectList - filter variables: - - name: ozoneTotal - where: - - variable: - name: MetaData/totalOzoneQualityCode - is_not_in: 0, 1 - -# Use data with best ozone algorighm -- filter: RejectList - filter variables: - - name: ozoneTotal - where: - - variable: - name: MetaData/bestOzoneAlgorithmFlag - is_in: 3, 13 - -obs post filters: -# GSI setup routine QC -# Gross check -- filter: Background Check - filter variables: - - name: ozoneTotal - threshold: 10.0 - absolute threshold: 300.0 - action: - name: reject - -# End of Filters - - diff --git a/parm/atm/obs/config/omi_aura.yaml.j2 b/parm/atm/obs/config/omi_aura.yaml.j2 new file mode 100644 index 000000000..9cfd90dc9 --- /dev/null +++ b/parm/atm/obs/config/omi_aura.yaml.j2 @@ -0,0 +1,89 @@ +- obs space: + name: omi_aura + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}omi_aura.{{ current_cycle | to_YMDH }}.nc' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_omi_aura_{{ current_cycle | to_YMDH }}.nc' + io pool: + max pool size: 1 + simulated variables: [ozoneTotal] + + obs operator: + name: AtmVertInterpLay + geovals: [mole_fraction_of_ozone_in_air] + coefficients: [0.007886131] # convert from ppmv to DU + nlevels: [1] + + obs pre filters: + - filter: Perform Action + filter variables: + - name: ozoneTotal + action: + name: assign error + error parameter: 6.0 + + obs prior filters: + # GSI read routine QC + # range sanity check + - filter: Bounds Check + filter variables: + - name: ozoneTotal + minvalue: 0 + maxvalue: 10000 + action: + name: reject + + # Do not use the data if row anomaly (bit 10)is 1 + - filter: RejectList + filter variables: + - name: ozoneTotal + where: + - variable: + name: MetaData/totalOzoneQualityFlag + any_bit_set_of: 9 + + # Scan position check: reject scan position >= 25 + - filter: RejectList + filter variables: + - name: ozoneTotal + where: + - variable: + name: MetaData/sensorScanPosition + minvalue: 25 + + # Accept total_ozone_error_flag values of 0 and 1, but not any others. + - filter: RejectList + filter variables: + - name: ozoneTotal + where: + - variable: + name: MetaData/totalOzoneQualityCode + is_not_in: 0, 1 + + # Use data with best ozone algorighm + - filter: RejectList + filter variables: + - name: ozoneTotal + where: + - variable: + name: MetaData/bestOzoneAlgorithmFlag + is_in: 3, 13 + + obs post filters: + # GSI setup routine QC + # Gross check + - filter: Background Check + filter variables: + - name: ozoneTotal + threshold: 10.0 + absolute threshold: 300.0 + action: + name: reject + + # End of Filters + + diff --git a/parm/atm/obs/config/ompsnp_npp.yaml b/parm/atm/obs/config/ompsnp_npp.yaml deleted file mode 100644 index f543a693d..000000000 --- a/parm/atm/obs/config/ompsnp_npp.yaml +++ /dev/null @@ -1,287 +0,0 @@ -obs space: - name: ompsnp_npp - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)ompsnp_npp.${{ current_cycle | to_YMDH }}.nc - obsgrouping: - group variables: ["latitude"] - sort variable: "pressure" - sort order: "ascending" - obsdataout: - engine: - type: H5File - obsfile: $(DATA)/diags/diag_ompsnp_npp_${{ current_cycle | to_YMDH }}.nc - io pool: - max pool size: 1 - simulated variables: [ozoneLayer] - -obs operator: - name: AtmVertInterpLay - geovals: [mole_fraction_of_ozone_in_air] - coefficients: [0.007886131] # convert from ppmv to DU - nlevels: [22] - -obs pre filters: -# Observation error assignment -- filter: Perform Action - filter variables: - - name: ozoneLayer - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelStepwiseLinear - options: - xvar: - name: MetaData/pressure - xvals: [0.001, 10.1325, 16.00935, 25.43258, 40.32735, 63.93607, 101.325, 160.0935, 254.3257, 403.2735, 639.3608, 1013.25, 1600.935, 2543.258, 4032.735, 6393.607, 10132.5, 16009.35, 25432.57, 40327.35, 63936.07, 101325] - errors: [7.7236, 0.02, 0.02, 0.025, 0.08, 0.15, 0.056, 0.125, 0.2, 0.299, 0.587, 0.864, 1.547, 2.718, 3.893, 4.353, 3.971, 4.407, 4.428, 3.312, 2.198, 2.285] - -obs prior filters: -# Do not assimilation where pressure is zero -# Zero pressure indicates the data is total column ozone -- filter: RejectList - filter variables: - - name: ozoneLayer - where: - - variable: - name: MetaData/pressure - maxvalue: 0.0001 - -# Sanity check on observaton values -- filter: Bounds Check - filter variables: - - name: ozoneLayer - minvalue: 0 - maxvalue: 1000 - action: - name: reject - -# Total Ozone Quality Check (keeps 0, 2) -# 0 indentifies good data -# 2 identifies good data with a solar zenith angle > 84 degrees -- filter: RejectList - filter variables: - - name: ozoneLayer - where: - - variable: - name: MetaData/totalOzoneQuality - is_not_in: 0, 2 - -# Profile Ozone Quality Check (keeps 0, 1, 7) -# 0 : good data -# 1 : good data with a solar zenith angle > 84 degrees -# 7 : profile for which stray light correction applied -- filter: RejectList - filter variables: - - name: ozoneLayer - where: - - variable: - name: MetaData/profileOzoneQuality - is_not_in: 0, 1, 7 - -obs post filters: -# Gross error check -- filter: Background Check - filter variables: - - name: ozoneLayer - absolute threshold: 120 - action: - name: reject - where: - - variable: - name: MetaData/pressure - maxvalue: 0.001 - -- filter: Background Check - filter variables: - - name: ozoneLayer - absolute threshold: 30 - action: - name: reject - where: - - variable: - name: MetaData/pressure - minvalue: 30000.0 - maxvalue: 110000.0 - -- filter: Background Check - filter variables: - - name: ozoneLayer - absolute threshold: 40 - action: - name: reject - where: - - variable: - name: MetaData/pressure - minvalue: 20000.0 - maxvalue: 30000.0 - -- filter: Background Check - filter variables: - - name: ozoneLayer - absolute threshold: 44.42 - action: - name: reject - where: - - variable: - name: MetaData/pressure - minvalue: 10100.0 - maxvalue: 20000.0 - -- filter: Background Check - filter variables: - - name: ozoneLayer - absolute threshold: 57.52 - action: - name: reject - where: - - variable: - name: MetaData/pressure - minvalue: 6400.0 - maxvalue: 10100.0 - -- filter: Background Check - filter variables: - - name: ozoneLayer - absolute threshold: 69.4 - action: - name: reject - where: - - variable: - name: MetaData/pressure - minvalue: 4000.0 - maxvalue: 6400.0 - -- filter: Background Check - filter variables: - - name: ozoneLayer - absolute threshold: 70 - action: - name: reject - where: - - variable: - name: MetaData/pressure - minvalue: 2600.0 - maxvalue: 4000.0 - -- filter: Background Check - filter variables: - - name: ozoneLayer - absolute threshold: 62.73 - action: - name: reject - where: - - variable: - name: MetaData/pressure - minvalue: 1600.0 - maxvalue: 2600.0 - -- filter: Background Check - filter variables: - - name: ozoneLayer - absolute threshold: 50.52 - action: - name: reject - where: - - variable: - name: MetaData/pressure - minvalue: 1100.0 - maxvalue: 1600.0 - -- filter: Background Check - filter variables: - - name: ozoneLayer - absolute threshold: 35.9 - action: - name: reject - where: - - variable: - name: MetaData/pressure - minvalue: 700.0 - maxvalue: 1100.0 - -- filter: Background Check - filter variables: - - name: ozoneLayer - absolute threshold: 26.41 - action: - name: reject - where: - - variable: - name: MetaData/pressure - minvalue: 400.0 - maxvalue: 700.0 - -- filter: Background Check - filter variables: - - name: ozoneLayer - absolute threshold: 20.51 - action: - name: reject - where: - - variable: - name: MetaData/pressure - minvalue: 300.0 - maxvalue: 400.0 - -- filter: Background Check - filter variables: - - name: ozoneLayer - absolute threshold: 12.82 - action: - name: reject - where: - - variable: - name: MetaData/pressure - minvalue: 200.0 - maxvalue: 300.0 - -- filter: Background Check - filter variables: - - name: ozoneLayer - absolute threshold: 10 - action: - name: reject - where: - - variable: - name: MetaData/pressure - maxvalue: 70.0 - maxvalue: 200.0 - -- filter: Background Check - filter variables: - - name: ozoneLayer - absolute threshold: 5 - action: - name: reject - where: - - variable: - name: MetaData/pressure - minvalue: 40.0 - maxvalue: 70.0 - -- filter: Background Check - filter variables: - - name: ozoneLayer - absolute threshold: 2 - action: - name: reject - where: - - variable: - name: MetaData/pressure - minvalue: 30.0 - maxvalue: 40.0 - -- filter: Background Check - filter variables: - - name: ozoneLayer - absolute threshold: 1 - action: - name: reject - where: - - variable: - name: MetaData/pressure - maxvalue: 30.0 - -# End of Filters diff --git a/parm/atm/obs/config/ompsnp_npp.yaml.j2 b/parm/atm/obs/config/ompsnp_npp.yaml.j2 new file mode 100644 index 000000000..82108dcd4 --- /dev/null +++ b/parm/atm/obs/config/ompsnp_npp.yaml.j2 @@ -0,0 +1,287 @@ +- obs space: + name: ompsnp_npp + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}ompsnp_npp.{{ current_cycle | to_YMDH }}.nc' + obsgrouping: + group variables: ["latitude"] + sort variable: "pressure" + sort order: "ascending" + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_ompsnp_npp_{{ current_cycle | to_YMDH }}.nc' + io pool: + max pool size: 1 + simulated variables: [ozoneLayer] + + obs operator: + name: AtmVertInterpLay + geovals: [mole_fraction_of_ozone_in_air] + coefficients: [0.007886131] # convert from ppmv to DU + nlevels: [22] + + obs pre filters: + # Observation error assignment + - filter: Perform Action + filter variables: + - name: ozoneLayer + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + xvar: + name: MetaData/pressure + xvals: [0.001, 10.1325, 16.00935, 25.43258, 40.32735, 63.93607, 101.325, 160.0935, 254.3257, 403.2735, 639.3608, 1013.25, 1600.935, 2543.258, 4032.735, 6393.607, 10132.5, 16009.35, 25432.57, 40327.35, 63936.07, 101325] + errors: [7.7236, 0.02, 0.02, 0.025, 0.08, 0.15, 0.056, 0.125, 0.2, 0.299, 0.587, 0.864, 1.547, 2.718, 3.893, 4.353, 3.971, 4.407, 4.428, 3.312, 2.198, 2.285] + + obs prior filters: + # Do not assimilation where pressure is zero + # Zero pressure indicates the data is total column ozone + - filter: RejectList + filter variables: + - name: ozoneLayer + where: + - variable: + name: MetaData/pressure + maxvalue: 0.0001 + + # Sanity check on observaton values + - filter: Bounds Check + filter variables: + - name: ozoneLayer + minvalue: 0 + maxvalue: 1000 + action: + name: reject + + # Total Ozone Quality Check (keeps 0, 2) + # 0 indentifies good data + # 2 identifies good data with a solar zenith angle > 84 degrees + - filter: RejectList + filter variables: + - name: ozoneLayer + where: + - variable: + name: MetaData/totalOzoneQuality + is_not_in: 0, 2 + + # Profile Ozone Quality Check (keeps 0, 1, 7) + # 0 : good data + # 1 : good data with a solar zenith angle > 84 degrees + # 7 : profile for which stray light correction applied + - filter: RejectList + filter variables: + - name: ozoneLayer + where: + - variable: + name: MetaData/profileOzoneQuality + is_not_in: 0, 1, 7 + + obs post filters: + # Gross error check + - filter: Background Check + filter variables: + - name: ozoneLayer + absolute threshold: 120 + action: + name: reject + where: + - variable: + name: MetaData/pressure + maxvalue: 0.001 + + - filter: Background Check + filter variables: + - name: ozoneLayer + absolute threshold: 30 + action: + name: reject + where: + - variable: + name: MetaData/pressure + minvalue: 30000.0 + maxvalue: 110000.0 + + - filter: Background Check + filter variables: + - name: ozoneLayer + absolute threshold: 40 + action: + name: reject + where: + - variable: + name: MetaData/pressure + minvalue: 20000.0 + maxvalue: 30000.0 + + - filter: Background Check + filter variables: + - name: ozoneLayer + absolute threshold: 44.42 + action: + name: reject + where: + - variable: + name: MetaData/pressure + minvalue: 10100.0 + maxvalue: 20000.0 + + - filter: Background Check + filter variables: + - name: ozoneLayer + absolute threshold: 57.52 + action: + name: reject + where: + - variable: + name: MetaData/pressure + minvalue: 6400.0 + maxvalue: 10100.0 + + - filter: Background Check + filter variables: + - name: ozoneLayer + absolute threshold: 69.4 + action: + name: reject + where: + - variable: + name: MetaData/pressure + minvalue: 4000.0 + maxvalue: 6400.0 + + - filter: Background Check + filter variables: + - name: ozoneLayer + absolute threshold: 70 + action: + name: reject + where: + - variable: + name: MetaData/pressure + minvalue: 2600.0 + maxvalue: 4000.0 + + - filter: Background Check + filter variables: + - name: ozoneLayer + absolute threshold: 62.73 + action: + name: reject + where: + - variable: + name: MetaData/pressure + minvalue: 1600.0 + maxvalue: 2600.0 + + - filter: Background Check + filter variables: + - name: ozoneLayer + absolute threshold: 50.52 + action: + name: reject + where: + - variable: + name: MetaData/pressure + minvalue: 1100.0 + maxvalue: 1600.0 + + - filter: Background Check + filter variables: + - name: ozoneLayer + absolute threshold: 35.9 + action: + name: reject + where: + - variable: + name: MetaData/pressure + minvalue: 700.0 + maxvalue: 1100.0 + + - filter: Background Check + filter variables: + - name: ozoneLayer + absolute threshold: 26.41 + action: + name: reject + where: + - variable: + name: MetaData/pressure + minvalue: 400.0 + maxvalue: 700.0 + + - filter: Background Check + filter variables: + - name: ozoneLayer + absolute threshold: 20.51 + action: + name: reject + where: + - variable: + name: MetaData/pressure + minvalue: 300.0 + maxvalue: 400.0 + + - filter: Background Check + filter variables: + - name: ozoneLayer + absolute threshold: 12.82 + action: + name: reject + where: + - variable: + name: MetaData/pressure + minvalue: 200.0 + maxvalue: 300.0 + + - filter: Background Check + filter variables: + - name: ozoneLayer + absolute threshold: 10 + action: + name: reject + where: + - variable: + name: MetaData/pressure + maxvalue: 70.0 + maxvalue: 200.0 + + - filter: Background Check + filter variables: + - name: ozoneLayer + absolute threshold: 5 + action: + name: reject + where: + - variable: + name: MetaData/pressure + minvalue: 40.0 + maxvalue: 70.0 + + - filter: Background Check + filter variables: + - name: ozoneLayer + absolute threshold: 2 + action: + name: reject + where: + - variable: + name: MetaData/pressure + minvalue: 30.0 + maxvalue: 40.0 + + - filter: Background Check + filter variables: + - name: ozoneLayer + absolute threshold: 1 + action: + name: reject + where: + - variable: + name: MetaData/pressure + maxvalue: 30.0 + + # End of Filters diff --git a/parm/atm/obs/config/ompstc8_npp.yaml b/parm/atm/obs/config/ompstc8_npp.yaml deleted file mode 100644 index 1563c4534..000000000 --- a/parm/atm/obs/config/ompstc8_npp.yaml +++ /dev/null @@ -1,89 +0,0 @@ -obs space: - name: ompstc8_npp - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)ompstc8_npp.${{ current_cycle | to_YMDH }}.nc - obsdataout: - engine: - type: H5File - obsfile: $(DATA)/diags/diag_ompstc8_npp_${{ current_cycle | to_YMDH }}.nc - io pool: - max pool size: 1 - simulated variables: [ozoneTotal] - -obs operator: - name: AtmVertInterpLay - geovals: [mole_fraction_of_ozone_in_air] - coefficients: [0.007886131] # convert from ppmv to DU - nlevels: [1] - -obs pre filters: -- filter: Perform Action - filter variables: - - name: ozoneTotal - action: - name: assign error - error parameter: 6.0 - -obs prior filters: -# GSI read routine QC -# range sanity check -- filter: Bounds Check - filter variables: - - name: ozoneTotal - minvalue: 0 - maxvalue: 1000 - action: - name: reject - -# Accept total_ozone_error_flag values of 0 and 1, but not any others. -- filter: RejectList - filter variables: - - name: ozoneTotal - where: - - variable: - name: MetaData/totalOzoneQualityCode - is_not_in: 0, 1 - -- filter: RejectList - filter variables: - - name: ozoneTotal - where: - - variable: - name: MetaData/bestOzoneAlgorithmFlag - is_in: 3, 13 - -# GSI setup routine QC -- filter: RejectList - filter variables: - - name: ozoneTotal - where: - - variable: - name: MetaData/sensorScanPosition - is_in: 1, 2, 3, 4, 35 - - variable: - name: MetaData/latitude - minvalue: 50.0 - -- filter: RejectList - filter variables: - - name: ozoneTotal - where: - - variable: - name: MetaData/sensorScanPosition - is_in: 1, 2, 3, 4, 35 - - variable: - name: MetaData/latitude - maxvalue: -50.0 - -obs post filters: -- filter: Background Check - filter variables: - - name: ozoneTotal - threshold: 10.0 - absolute threshold: 300.0 - action: - name: reject - -# End of Filters diff --git a/parm/atm/obs/config/ompstc8_npp.yaml.j2 b/parm/atm/obs/config/ompstc8_npp.yaml.j2 new file mode 100644 index 000000000..e22eee7c8 --- /dev/null +++ b/parm/atm/obs/config/ompstc8_npp.yaml.j2 @@ -0,0 +1,89 @@ +- obs space: + name: ompstc8_npp + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}ompstc8_npp.{{ current_cycle | to_YMDH }}.nc' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_ompstc8_npp_{{ current_cycle | to_YMDH }}.nc' + io pool: + max pool size: 1 + simulated variables: [ozoneTotal] + + obs operator: + name: AtmVertInterpLay + geovals: [mole_fraction_of_ozone_in_air] + coefficients: [0.007886131] # convert from ppmv to DU + nlevels: [1] + + obs pre filters: + - filter: Perform Action + filter variables: + - name: ozoneTotal + action: + name: assign error + error parameter: 6.0 + + obs prior filters: + # GSI read routine QC + # range sanity check + - filter: Bounds Check + filter variables: + - name: ozoneTotal + minvalue: 0 + maxvalue: 1000 + action: + name: reject + + # Accept total_ozone_error_flag values of 0 and 1, but not any others. + - filter: RejectList + filter variables: + - name: ozoneTotal + where: + - variable: + name: MetaData/totalOzoneQualityCode + is_not_in: 0, 1 + + - filter: RejectList + filter variables: + - name: ozoneTotal + where: + - variable: + name: MetaData/bestOzoneAlgorithmFlag + is_in: 3, 13 + + # GSI setup routine QC + - filter: RejectList + filter variables: + - name: ozoneTotal + where: + - variable: + name: MetaData/sensorScanPosition + is_in: 1, 2, 3, 4, 35 + - variable: + name: MetaData/latitude + minvalue: 50.0 + + - filter: RejectList + filter variables: + - name: ozoneTotal + where: + - variable: + name: MetaData/sensorScanPosition + is_in: 1, 2, 3, 4, 35 + - variable: + name: MetaData/latitude + maxvalue: -50.0 + + obs post filters: + - filter: Background Check + filter variables: + - name: ozoneTotal + threshold: 10.0 + absolute threshold: 300.0 + action: + name: reject + + # End of Filters diff --git a/parm/atm/obs/config/satwind.yaml b/parm/atm/obs/config/satwind.yaml deleted file mode 100644 index 80b74e23c..000000000 --- a/parm/atm/obs/config/satwind.yaml +++ /dev/null @@ -1,882 +0,0 @@ -obs space: - name: satwind - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)satwind.${{ current_cycle | to_YMDH }}.nc - obsdataout: - engine: - type: H5File - obsfile: $(DATA)/diags/diag_satwind_${{ current_cycle | to_YMDH }}.nc - io pool: - max pool size: 1 - simulated variables: [windEastward, windNorthward] -obs operator: - name: VertInterp -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.] -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 -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 obs operator: - name: Identity - diff --git a/parm/atm/obs/config/satwind.yaml.j2 b/parm/atm/obs/config/satwind.yaml.j2 new file mode 100644 index 000000000..de0524198 --- /dev/null +++ b/parm/atm/obs/config/satwind.yaml.j2 @@ -0,0 +1,882 @@ +- obs space: + name: satwind + obsdatain: + engine: + type: H5File + obsfile: {{ DATA }}/obs/{{ OPREFIX }}satwind.{{ current_cycle | to_YMDH }}.nc + obsdataout: + engine: + type: H5File + obsfile: {{ DATA }}/diags/diag_satwind_{{ current_cycle | to_YMDH }}.nc + io pool: + max pool size: 1 + simulated variables: [windEastward, windNorthward] + obs operator: + name: VertInterp + 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.] + 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 + 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 obs operator: + name: Identity + diff --git a/parm/atm/obs/config/satwind_abi_goes-16.yaml b/parm/atm/obs/config/satwind_abi_goes-16.yaml deleted file mode 100644 index c35f9626b..000000000 --- a/parm/atm/obs/config/satwind_abi_goes-16.yaml +++ /dev/null @@ -1,566 +0,0 @@ -obs space: - name: satwind_goes-16 - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)satwnd.abi_goes-16.tm00.nc - obsdataout: - engine: - type: H5File - obsfile: $(DATA)/diags/diag_satwind_abi_goes-16_{{ current_cycle | to_YMDH }}.nc - 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 - -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 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 - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelStepwiseLinear - options: - xvar: - name: MetaData/pressure - xvals: [110000.,0.] #Pressure (Pa) - errors: [1000000000.,1000000000.] - -# 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 - 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 - 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 - 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 251 (GOES VIS): Assigned all dummy values -- filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 251 - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelStepwiseLinear - options: - xvar: - name: MetaData/pressure - xvals: [110000.,0.] #Pressure (Pa) - errors: [1000000000.,1000000000.] - -# 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 251 (VIS) --- obs tossed without passing to setup routine -- filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 251 - 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 - -# Reject obs with pressure < 12500 pa --- obs tosed without passing to setup routine -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: MetaData/satelliteIdentifier - is_in: 250-299 - test variables: - - name: MetaData/pressure - minvalue: 12500. - action: - name: reject - -# Exclude data over non-water surface type where latitude > 20N for Type 240 (IRSW) and Type 245 (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: 240, 245 - - 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 qualityInformationWithoutForecast < 90. OR > 100. -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: MetaData/satelliteIdentifier - is_in: 250-299 - test variables: - - name: MetaData/qualityInformationWithoutForecast - minvalue: 90. - maxvalue: 100. - action: - name: reject - -# Reject obs with pressure < 15000 pa. -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: MetaData/satelliteIdentifier - is_in: 250-299 - test variables: - - name: MetaData/pressure - minvalue: 15000. - action: - name: reject - -# Reject obs with pressure < 70000 pa. when Type=251 -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: MetaData/satelliteIdentifier - is_in: 250-299 - - variable: ObsType/windEastward - is_in: 251 - test variables: - - name: MetaData/pressure - minvalue: 70000. - action: - name: reject - -# Reject obs with pressure > 30000. when Type=246 -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: MetaData/satelliteIdentifier - is_in: 250-299 - - 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) -# Notes: Replace land_type_index_NPOESS with land_area_fraction (eliu) -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: MetaData/satelliteIdentifier - is_in: 250-299 - - variable: GeoVaLs/land_area_fraction - minvalue: 0.99 - 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 -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: MetaData/satelliteIdentifier - is_in: 250-299 - - 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 NESDIS winds -# -# CLEARED: With caveat that float precision/handling differences can generate different acceptance criteria -# between UFO and GSI for observations with an experr_norm value right around the maxvalue. -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: MetaData/satelliteIdentifier - is_in: 250-299 - test variables: - - name: ObsFunction/SatWindsErrnormCheck - maxvalue: 0.9 - action: - name: reject - -# Reject all Type=240 (GOES SWIR) AMVs: These are not currently assimilated in GSI and they have missing-values -# assigned to ob-errors -- filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 240 - 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 - -# 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 - -# 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 - -# 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 - -# 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 -# Notes (eliu): Replace land_type_index_NPOESS with land_area_fraction. -- filter: Difference Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: - name: GeoVaLs/water_area_fraction - maxvalue: 0.99 - - 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 - -# 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 - -# 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/parm/atm/obs/config/satwind_abi_goes-16.yaml.j2 b/parm/atm/obs/config/satwind_abi_goes-16.yaml.j2 new file mode 100644 index 000000000..6f7b5a785 --- /dev/null +++ b/parm/atm/obs/config/satwind_abi_goes-16.yaml.j2 @@ -0,0 +1,566 @@ +- obs space: + name: satwind_goes-16 + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}satwnd.abi_goes-16.tm00.nc' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_satwind_abi_goes-16_{{ current_cycle | to_YMDH }}.nc' + 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 + + 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 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 + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + xvar: + name: MetaData/pressure + xvals: [110000.,0.] #Pressure (Pa) + errors: [1000000000.,1000000000.] + + # 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 + 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 + 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 + 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 251 (GOES VIS): Assigned all dummy values + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 251 + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + xvar: + name: MetaData/pressure + xvals: [110000.,0.] #Pressure (Pa) + errors: [1000000000.,1000000000.] + + # 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 251 (VIS) --- obs tossed without passing to setup routine + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 251 + 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 + + # Reject obs with pressure < 12500 pa --- obs tosed without passing to setup routine + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/satelliteIdentifier + is_in: 250-299 + test variables: + - name: MetaData/pressure + minvalue: 12500. + action: + name: reject + + # Exclude data over non-water surface type where latitude > 20N for Type 240 (IRSW) and Type 245 (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: 240, 245 + - 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 qualityInformationWithoutForecast < 90. OR > 100. + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/satelliteIdentifier + is_in: 250-299 + test variables: + - name: MetaData/qualityInformationWithoutForecast + minvalue: 90. + maxvalue: 100. + action: + name: reject + + # Reject obs with pressure < 15000 pa. + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/satelliteIdentifier + is_in: 250-299 + test variables: + - name: MetaData/pressure + minvalue: 15000. + action: + name: reject + + # Reject obs with pressure < 70000 pa. when Type=251 + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/satelliteIdentifier + is_in: 250-299 + - variable: ObsType/windEastward + is_in: 251 + test variables: + - name: MetaData/pressure + minvalue: 70000. + action: + name: reject + + # Reject obs with pressure > 30000. when Type=246 + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/satelliteIdentifier + is_in: 250-299 + - 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) + # Notes: Replace land_type_index_NPOESS with land_area_fraction (eliu) + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/satelliteIdentifier + is_in: 250-299 + - variable: GeoVaLs/land_area_fraction + minvalue: 0.99 + 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 + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/satelliteIdentifier + is_in: 250-299 + - 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 NESDIS winds + # + # CLEARED: With caveat that float precision/handling differences can generate different acceptance criteria + # between UFO and GSI for observations with an experr_norm value right around the maxvalue. + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/satelliteIdentifier + is_in: 250-299 + test variables: + - name: ObsFunction/SatWindsErrnormCheck + maxvalue: 0.9 + action: + name: reject + + # Reject all Type=240 (GOES SWIR) AMVs: These are not currently assimilated in GSI and they have missing-values + # assigned to ob-errors + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 240 + 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 + + # 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 + + # 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 + + # 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 + + # 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 + # Notes (eliu): Replace land_type_index_NPOESS with land_area_fraction. + - filter: Difference Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: + name: GeoVaLs/water_area_fraction + maxvalue: 0.99 + - 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 + + # 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 + + # 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/parm/atm/obs/config/satwind_abi_goes-17.yaml b/parm/atm/obs/config/satwind_abi_goes-17.yaml deleted file mode 100644 index 19eee100a..000000000 --- a/parm/atm/obs/config/satwind_abi_goes-17.yaml +++ /dev/null @@ -1,566 +0,0 @@ -obs space: - name: satwind_goes-17 - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)satwnd.abi_goes-17.tm00.nc - obsdataout: - engine: - type: H5File - obsfile: $(DATA)/diags/diag_satwind_abi_goes-17_{{ current_cycle | to_YMDH }}.nc - 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 - -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 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 - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelStepwiseLinear - options: - xvar: - name: MetaData/pressure - xvals: [110000.,0.] #Pressure (Pa) - errors: [1000000000.,1000000000.] - -# 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 - 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 - 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 - 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 251 (GOES VIS): Assigned all dummy values -- filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 251 - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelStepwiseLinear - options: - xvar: - name: MetaData/pressure - xvals: [110000.,0.] #Pressure (Pa) - errors: [1000000000.,1000000000.] - -# 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 251 (VIS) --- obs tossed without passing to setup routine -- filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 251 - 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 - -# Reject obs with pressure < 12500 pa --- obs tosed without passing to setup routine -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: MetaData/satelliteIdentifier - is_in: 250-299 - test variables: - - name: MetaData/pressure - minvalue: 12500. - action: - name: reject - -# Exclude data over non-water surface type where latitude > 20N for Type 240 (IRSW) and Type 245 (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: 240, 245 - - 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 qualityInformationWithoutForecast < 90. OR > 100. -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: MetaData/satelliteIdentifier - is_in: 250-299 - test variables: - - name: MetaData/qualityInformationWithoutForecast - minvalue: 90. - maxvalue: 100. - action: - name: reject - -# Reject obs with pressure < 15000 pa. -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: MetaData/satelliteIdentifier - is_in: 250-299 - test variables: - - name: MetaData/pressure - minvalue: 15000. - action: - name: reject - -# Reject obs with pressure < 70000 pa. when Type=251 -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: MetaData/satelliteIdentifier - is_in: 250-299 - - variable: ObsType/windEastward - is_in: 251 - test variables: - - name: MetaData/pressure - minvalue: 70000. - action: - name: reject - -# Reject obs with pressure > 30000. when Type=246 -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: MetaData/satelliteIdentifier - is_in: 250-299 - - 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) -# Notes: Replace land_type_index_NPOESS with land_area_fraction (eliu) -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: MetaData/satelliteIdentifier - is_in: 250-299 - - variable: GeoVaLs/land_area_fraction - minvalue: 0.99 - 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 -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: MetaData/satelliteIdentifier - is_in: 250-299 - - 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 NESDIS winds -# -# CLEARED: With caveat that float precision/handling differences can generate different acceptance criteria -# between UFO and GSI for observations with an experr_norm value right around the maxvalue. -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: MetaData/satelliteIdentifier - is_in: 250-299 - test variables: - - name: ObsFunction/SatWindsErrnormCheck - maxvalue: 0.9 - action: - name: reject - -# Reject all Type=240 (GOES SWIR) AMVs: These are not currently assimilated in GSI and they have missing-values -# assigned to ob-errors -- filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 240 - 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 - -# 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 - -# 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 - -# 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 - -# 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 -# Notes (eliu): Replace land_type_index_NPOESS with land_area_fraction. -- filter: Difference Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: - name: GeoVaLs/water_area_fraction - maxvalue: 0.99 - - 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 - -# 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 - -# 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/parm/atm/obs/config/satwind_abi_goes-17.yaml.j2 b/parm/atm/obs/config/satwind_abi_goes-17.yaml.j2 new file mode 100644 index 000000000..e0d197c5d --- /dev/null +++ b/parm/atm/obs/config/satwind_abi_goes-17.yaml.j2 @@ -0,0 +1,566 @@ +- obs space: + name: satwind_goes-17 + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}satwnd.abi_goes-17.tm00.nc' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_satwind_abi_goes-17_{{ current_cycle | to_YMDH }}.nc' + 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 + + 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 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 + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + xvar: + name: MetaData/pressure + xvals: [110000.,0.] #Pressure (Pa) + errors: [1000000000.,1000000000.] + + # 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 + 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 + 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 + 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 251 (GOES VIS): Assigned all dummy values + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 251 + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + xvar: + name: MetaData/pressure + xvals: [110000.,0.] #Pressure (Pa) + errors: [1000000000.,1000000000.] + + # 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 251 (VIS) --- obs tossed without passing to setup routine + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 251 + 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 + + # Reject obs with pressure < 12500 pa --- obs tosed without passing to setup routine + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/satelliteIdentifier + is_in: 250-299 + test variables: + - name: MetaData/pressure + minvalue: 12500. + action: + name: reject + + # Exclude data over non-water surface type where latitude > 20N for Type 240 (IRSW) and Type 245 (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: 240, 245 + - 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 qualityInformationWithoutForecast < 90. OR > 100. + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/satelliteIdentifier + is_in: 250-299 + test variables: + - name: MetaData/qualityInformationWithoutForecast + minvalue: 90. + maxvalue: 100. + action: + name: reject + + # Reject obs with pressure < 15000 pa. + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/satelliteIdentifier + is_in: 250-299 + test variables: + - name: MetaData/pressure + minvalue: 15000. + action: + name: reject + + # Reject obs with pressure < 70000 pa. when Type=251 + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/satelliteIdentifier + is_in: 250-299 + - variable: ObsType/windEastward + is_in: 251 + test variables: + - name: MetaData/pressure + minvalue: 70000. + action: + name: reject + + # Reject obs with pressure > 30000. when Type=246 + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/satelliteIdentifier + is_in: 250-299 + - 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) + # Notes: Replace land_type_index_NPOESS with land_area_fraction (eliu) + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/satelliteIdentifier + is_in: 250-299 + - variable: GeoVaLs/land_area_fraction + minvalue: 0.99 + 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 + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/satelliteIdentifier + is_in: 250-299 + - 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 NESDIS winds + # + # CLEARED: With caveat that float precision/handling differences can generate different acceptance criteria + # between UFO and GSI for observations with an experr_norm value right around the maxvalue. + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: MetaData/satelliteIdentifier + is_in: 250-299 + test variables: + - name: ObsFunction/SatWindsErrnormCheck + maxvalue: 0.9 + action: + name: reject + + # Reject all Type=240 (GOES SWIR) AMVs: These are not currently assimilated in GSI and they have missing-values + # assigned to ob-errors + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 240 + 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 + + # 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 + + # 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 + + # 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 + + # 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 + # Notes (eliu): Replace land_type_index_NPOESS with land_area_fraction. + - filter: Difference Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: + name: GeoVaLs/water_area_fraction + maxvalue: 0.99 + - 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 + + # 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 + + # 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/parm/atm/obs/config/satwind_ahi_h8.yaml b/parm/atm/obs/config/satwind_ahi_h8.yaml deleted file mode 100644 index 2cfc17e02..000000000 --- a/parm/atm/obs/config/satwind_ahi_h8.yaml +++ /dev/null @@ -1,397 +0,0 @@ -obs space: - name: satwind_ahi_h8 - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)satwnd.ahi_h8.tm00.nc - obsdataout: - engine: - type: H5File - obsfile: $(DATA)/diags/diag_satwind_ahi_h8_{{ current_cycle | to_YMDH }}.nc - 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 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 qualityInformationWithoutForecast < 85. (also > 100., which is missing data) -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: MetaData/qualityInformationWithoutForecast - 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 - -# 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 diff --git a/parm/atm/obs/config/satwind_ahi_h8.yaml.j2 b/parm/atm/obs/config/satwind_ahi_h8.yaml.j2 new file mode 100644 index 000000000..4a2944e27 --- /dev/null +++ b/parm/atm/obs/config/satwind_ahi_h8.yaml.j2 @@ -0,0 +1,397 @@ +- obs space: + name: satwind_ahi_h8 + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}satwnd.ahi_h8.tm00.nc' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_satwind_ahi_h8_{{ current_cycle | to_YMDH }}.nc' + 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 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 qualityInformationWithoutForecast < 85. (also > 100., which is missing data) + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: MetaData/qualityInformationWithoutForecast + 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 + + # 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 diff --git a/parm/atm/obs/config/satwind_seviri_m11.yaml b/parm/atm/obs/config/satwind_seviri_m11.yaml deleted file mode 100644 index 763e59fda..000000000 --- a/parm/atm/obs/config/satwind_seviri_m11.yaml +++ /dev/null @@ -1,405 +0,0 @@ -obs space: - name: satwind_seviri_m11 - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)satwnd.seviri_m11.tm00.nc - obsdataout: - engine: - type: H5File - obsfile: $(DATA)/diags/diag_satwind_seviri_m11_{{ current_cycle | to_YMDH }}.nc - 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 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 - -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 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 qualityInformationWithoutForecast < 85. OR > 100. -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: MetaData/qualityInformationWithoutForecast - minvalue: 85. - maxvalue: 100. - 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 - -# 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 diff --git a/parm/atm/obs/config/satwind_seviri_m11.yaml.j2 b/parm/atm/obs/config/satwind_seviri_m11.yaml.j2 new file mode 100644 index 000000000..63eb01308 --- /dev/null +++ b/parm/atm/obs/config/satwind_seviri_m11.yaml.j2 @@ -0,0 +1,405 @@ +- obs space: + name: satwind_seviri_m11 + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}satwnd.seviri_m11.tm00.nc' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_satwind_seviri_m11_{{ current_cycle | to_YMDH }}.nc' + 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 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 + + 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 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 qualityInformationWithoutForecast < 85. OR > 100. + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: MetaData/qualityInformationWithoutForecast + minvalue: 85. + maxvalue: 100. + 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 + + # 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 diff --git a/parm/atm/obs/config/satwind_seviri_m8.yaml b/parm/atm/obs/config/satwind_seviri_m8.yaml deleted file mode 100644 index 70ada0f9d..000000000 --- a/parm/atm/obs/config/satwind_seviri_m8.yaml +++ /dev/null @@ -1,405 +0,0 @@ -obs space: - name: satwind_seviri_m8 - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)satwnd.seviri_m8.tm00.nc - obsdataout: - engine: - type: H5File - obsfile: $(DATA)/diags/diag_satwind_seviri_m8_{{ current_cycle | to_YMDH }}.nc - 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 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 - -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 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 qualityInformationWithoutForecast < 85. OR > 100. -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: MetaData/qualityInformationWithoutForecast - minvalue: 85. - maxvalue: 100. - 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 - -# 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 diff --git a/parm/atm/obs/config/satwind_seviri_m8.yaml.j2 b/parm/atm/obs/config/satwind_seviri_m8.yaml.j2 new file mode 100644 index 000000000..7306e6d09 --- /dev/null +++ b/parm/atm/obs/config/satwind_seviri_m8.yaml.j2 @@ -0,0 +1,405 @@ +- obs space: + name: satwind_seviri_m8 + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}satwnd.seviri_m8.tm00.nc' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_satwind_seviri_m8_{{ current_cycle | to_YMDH }}.nc' + 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 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 + + 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 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 qualityInformationWithoutForecast < 85. OR > 100. + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: MetaData/qualityInformationWithoutForecast + minvalue: 85. + maxvalue: 100. + 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 + + # 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 diff --git a/parm/atm/obs/config/scatwind_ascat_metop-a.yaml b/parm/atm/obs/config/scatwind_ascat_metop-a.yaml deleted file mode 100644 index 9dcbe9eab..000000000 --- a/parm/atm/obs/config/scatwind_ascat_metop-a.yaml +++ /dev/null @@ -1,294 +0,0 @@ -obs space: - name: ascatw_ascat_metop-a - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)ascatw.ascat_metop-a.tm00.nc - obsdataout: - engine: - type: H5File - obsfile: $(DATA)/diags/diag_ascatw_ascat_metop-a_{{ current_cycle | to_YMDH }}.nc - io pool: - max pool size: 1 - simulated variables: [windEastward, windNorthward] - -obs operator: - name: VertInterp - # Use height vertical coordinate first -# vertical coordinate: geometric_height - vertical coordinate: geopotential_height - observation vertical coordinate group: DerivedVariables - observation vertical coordinate: adjustedHeight - interpolation method: linear - hofx scaling field: SurfaceWindScalingHeight - hofx scaling field group: DerivedVariables - -linear obs operator: - name: VertInterp - vertical coordinate: geopotential_height - observation vertical coordinate group: DerivedVariables - observation vertical coordinate: adjustedHeight - interpolation method: linear - -obs pre filters: -- filter: Gaussian Thinning - horizontal_mesh: 75 - 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 rescaled height coordinate -- filter: Variable Transforms - Transform: AdjustedHeightCoordinate - SkipWhenNoObs: False - -# Apply variable changes needed for wind scaling -- filter: Variable Transforms - Transform: SurfaceWindScalingHeight - SkipWhenNoObs: False - -# Assign the initial observation error (constant value, 1.5 m/s right now). -- filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - action: - name: assign error - error parameter: 1.5 - -# 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 - -# Reject all obs with PreQC mark already set above 3 -# NOTE: All scatwinds have an automatic PreQC mark of 2 (hard-wired default from GSI) -# - filter: PreQC -# maxvalue: 3 -# action: -# name: reject - -obs post filters: -# Reject all ASCAT (Type 290) winds with tsavg <= 273.0 (surface temperature) -- filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 290 -# - variable: GeoVaLs/surface_temperature - - variable: GeoVaLs/surface_temperature_where_land - maxvalue: 273. - action: - name: reject - -# Reject all ASCAT (Type 290) winds with isflg /= 0 (non-water surface) -- filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 290 - - variable: GeoVaLs/water_area_fraction - maxvalue: 0.99 - action: - name: reject - -# Reject ASCAT (Type 290) when observed component deviates from background by more than 5.0 m/s -# NOTE: This check can reject a u- or v-component of the same observation independently, which -# is fundamentally different from how GSI rejects obs (both components are rejected if -# either component fails a check). -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: ObsFunction/Arithmetic - options: - variables: - - name: ObsValue/windEastward - - name: HofX/windEastward - coefs: [1.0, -1.0] - minvalue: -5.0 - maxvalue: 5.0 - -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: ObsFunction/Arithmetic - options: - variables: - - name: ObsValue/windNorthward - - name: HofX/windNorthward - coefs: [1.0, -1.0] - minvalue: -5.0 - maxvalue: 5.0 - -# Reject OSCAT (Type 291) when observed component deviates from background by more than 6.0 m/s -# NOTE: This check can reject a u- or v-component of the same observation independently, which -# is fundamentally different from how GSI rejects obs (both components are rejected if -# either component fails a check). -- filter: Background Check - filter variables: - - name: windEastward - - name: windNorthward - threshold: 6. - absolute threshold: 6. - where: - - variable: ObsType/windEastward - is_in: 291 - action: - name: reject - -# Reject ASCAT (Type 290) when ambiguity check fails (returned value is negative) -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 290 - test variables: - - name: ObsFunction/ScatWindsAmbiguityCheck - options: - minimum_uv: 0.0001 # hard-coding a minimum-uv for transparancy, want this to basically be zero - maxvalue: 0. - action: - name: reject - -# All scatwinds must adjust errors based on ObsErrorFactorPressureCheck. -# This check will inflate errors for obs that are too close to either -# the model top or bottom. -- filter: Perform Action - filter variables: - - name: windEastward - where: - - variable: - name: ObsType/windEastward - is_in: 290-291 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: windEastward - inflation factor: 4.0 - -- filter: Perform Action - filter variables: - - name: windNorthward - where: - - variable: - name: ObsType/windNorthward - is_in: 290-291 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: windNorthward - inflation factor: 4.0 - -# All scatwinds subject to a gross error check. This is contained within -# the WindsSPDBCheck, although it is not exclusive to satwinds. -- filter: Background Check - filter variables: - - name: windEastward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 290, 291] - cgross: [ 5.0, 5.0] - error_min: [1.4, 1.4] - error_max: [6.1, 6.1] - variable: windEastward - action: - name: reject - -- filter: Background Check - filter variables: - - name: windNorthward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 290, 291] - cgross: [ 5.0, 5.0] - error_min: [1.4, 1.4] - error_max: [6.1, 6.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. -#- 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 - -# There is no across-the-board inflation for nvqc=.true. for scatwinds, presumably because for -# this inflation to take place both nvqc must be .true. AND ibeta must be >0, see: -# https://github.com/NOAA-EMC/GSI/blob/14ae595af1b03471287d322596d35c0665336e95/src/gsi/setupw.f90#L1229 -# GSI settings must have ibeta>0 for satwinds, but not for scatwinds. -# -# If the ibeta settings for scatwinds were to change while nvqc remained .true., we would extend YAML to -# an additional filter that inflates final ob-errors across-the-board by 1/0.8 = 1.25. NOTE: the nvqc setting -# is defaulted to .false. in GSI code, but is overridden in global operational configuration. See: -# 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 functionality were to be activated for scatwinds, you would want to include this last inflation filter. -#- filter: Perform Action -# filter variables: -# - name: windEastward -# where: -# - variable: ObsType/windEastward -# is_in: 290-291 -# action: -# name: inflate error -# inflation factor: 1.25 -#- filter: Perform Action -# filter variables: -# - name: windNorthward -# where: -# - variable: ObsType/windNorthward -# is_in: 290-291 -# action: -# name: inflate error -# inflation factor: 1.25 - -# END OF FILTERS# diff --git a/parm/atm/obs/config/scatwind_ascat_metop-a.yaml.j2 b/parm/atm/obs/config/scatwind_ascat_metop-a.yaml.j2 new file mode 100644 index 000000000..1e8138dde --- /dev/null +++ b/parm/atm/obs/config/scatwind_ascat_metop-a.yaml.j2 @@ -0,0 +1,294 @@ +- obs space: + name: ascatw_ascat_metop-a + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}ascatw.ascat_metop-a.tm00.nc' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_ascatw_ascat_metop-a_{{ current_cycle | to_YMDH }}.nc' + io pool: + max pool size: 1 + simulated variables: [windEastward, windNorthward] + + obs operator: + name: VertInterp + # Use height vertical coordinate first + # vertical coordinate: geometric_height + vertical coordinate: geopotential_height + observation vertical coordinate group: DerivedVariables + observation vertical coordinate: adjustedHeight + interpolation method: linear + hofx scaling field: SurfaceWindScalingHeight + hofx scaling field group: DerivedVariables + + linear obs operator: + name: VertInterp + vertical coordinate: geopotential_height + observation vertical coordinate group: DerivedVariables + observation vertical coordinate: adjustedHeight + interpolation method: linear + + obs pre filters: + - filter: Gaussian Thinning + horizontal_mesh: 75 + 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 rescaled height coordinate + - filter: Variable Transforms + Transform: AdjustedHeightCoordinate + SkipWhenNoObs: False + + # Apply variable changes needed for wind scaling + - filter: Variable Transforms + Transform: SurfaceWindScalingHeight + SkipWhenNoObs: False + + # Assign the initial observation error (constant value, 1.5 m/s right now). + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + action: + name: assign error + error parameter: 1.5 + + # 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 + + # Reject all obs with PreQC mark already set above 3 + # NOTE: All scatwinds have an automatic PreQC mark of 2 (hard-wired default from GSI) + # - filter: PreQC + # maxvalue: 3 + # action: + # name: reject + + obs post filters: + # Reject all ASCAT (Type 290) winds with tsavg <= 273.0 (surface temperature) + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 290 + # - variable: GeoVaLs/surface_temperature + - variable: GeoVaLs/surface_temperature_where_land + maxvalue: 273. + action: + name: reject + + # Reject all ASCAT (Type 290) winds with isflg /= 0 (non-water surface) + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 290 + - variable: GeoVaLs/water_area_fraction + maxvalue: 0.99 + action: + name: reject + + # Reject ASCAT (Type 290) when observed component deviates from background by more than 5.0 m/s + # NOTE: This check can reject a u- or v-component of the same observation independently, which + # is fundamentally different from how GSI rejects obs (both components are rejected if + # either component fails a check). + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: ObsFunction/Arithmetic + options: + variables: + - name: ObsValue/windEastward + - name: HofX/windEastward + coefs: [1.0, -1.0] + minvalue: -5.0 + maxvalue: 5.0 + + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: ObsFunction/Arithmetic + options: + variables: + - name: ObsValue/windNorthward + - name: HofX/windNorthward + coefs: [1.0, -1.0] + minvalue: -5.0 + maxvalue: 5.0 + + # Reject OSCAT (Type 291) when observed component deviates from background by more than 6.0 m/s + # NOTE: This check can reject a u- or v-component of the same observation independently, which + # is fundamentally different from how GSI rejects obs (both components are rejected if + # either component fails a check). + - filter: Background Check + filter variables: + - name: windEastward + - name: windNorthward + threshold: 6. + absolute threshold: 6. + where: + - variable: ObsType/windEastward + is_in: 291 + action: + name: reject + + # Reject ASCAT (Type 290) when ambiguity check fails (returned value is negative) + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 290 + test variables: + - name: ObsFunction/ScatWindsAmbiguityCheck + options: + minimum_uv: 0.0001 # hard-coding a minimum-uv for transparancy, want this to basically be zero + maxvalue: 0. + action: + name: reject + + # All scatwinds must adjust errors based on ObsErrorFactorPressureCheck. + # This check will inflate errors for obs that are too close to either + # the model top or bottom. + - filter: Perform Action + filter variables: + - name: windEastward + where: + - variable: + name: ObsType/windEastward + is_in: 290-291 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windEastward + inflation factor: 4.0 + + - filter: Perform Action + filter variables: + - name: windNorthward + where: + - variable: + name: ObsType/windNorthward + is_in: 290-291 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windNorthward + inflation factor: 4.0 + + # All scatwinds subject to a gross error check. This is contained within + # the WindsSPDBCheck, although it is not exclusive to satwinds. + - filter: Background Check + filter variables: + - name: windEastward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 290, 291] + cgross: [ 5.0, 5.0] + error_min: [1.4, 1.4] + error_max: [6.1, 6.1] + variable: windEastward + action: + name: reject + + - filter: Background Check + filter variables: + - name: windNorthward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 290, 291] + cgross: [ 5.0, 5.0] + error_min: [1.4, 1.4] + error_max: [6.1, 6.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. + #- 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 + + # There is no across-the-board inflation for nvqc=.true. for scatwinds, presumably because for + # this inflation to take place both nvqc must be .true. AND ibeta must be >0, see: + # https://github.com/NOAA-EMC/GSI/blob/14ae595af1b03471287d322596d35c0665336e95/src/gsi/setupw.f90#L1229 + # GSI settings must have ibeta>0 for satwinds, but not for scatwinds. + # + # If the ibeta settings for scatwinds were to change while nvqc remained .true., we would extend YAML to + # an additional filter that inflates final ob-errors across-the-board by 1/0.8 = 1.25. NOTE: the nvqc setting + # is defaulted to .false. in GSI code, but is overridden in global operational configuration. See: + # 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 functionality were to be activated for scatwinds, you would want to include this last inflation filter. + #- filter: Perform Action + # filter variables: + # - name: windEastward + # where: + # - variable: ObsType/windEastward + # is_in: 290-291 + # action: + # name: inflate error + # inflation factor: 1.25 + #- filter: Perform Action + # filter variables: + # - name: windNorthward + # where: + # - variable: ObsType/windNorthward + # is_in: 290-291 + # action: + # name: inflate error + # inflation factor: 1.25 + + # END OF FILTERS# diff --git a/parm/atm/obs/config/scatwind_ascat_metop-b.yaml b/parm/atm/obs/config/scatwind_ascat_metop-b.yaml deleted file mode 100644 index 16f10351b..000000000 --- a/parm/atm/obs/config/scatwind_ascat_metop-b.yaml +++ /dev/null @@ -1,294 +0,0 @@ -obs space: - name: ascatw_ascat_metop-b - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)ascatw.ascat_metop-b.tm00.nc - obsdataout: - engine: - type: H5File - obsfile: $(DATA)/diags/diag_ascatw_ascat_metop-b_{{ current_cycle | to_YMDH }}.nc - io pool: - max pool size: 1 - simulated variables: [windEastward, windNorthward] - -obs operator: - name: VertInterp - # Use height vertical coordinate first -# vertical coordinate: geometric_height - vertical coordinate: geopotential_height - observation vertical coordinate group: DerivedVariables - observation vertical coordinate: adjustedHeight - interpolation method: linear - hofx scaling field: SurfaceWindScalingHeight - hofx scaling field group: DerivedVariables - -linear obs operator: - name: VertInterp - vertical coordinate: geopotential_height - observation vertical coordinate group: DerivedVariables - observation vertical coordinate: adjustedHeight - interpolation method: linear - -obs pre filters: -- filter: Gaussian Thinning - horizontal_mesh: 75 - 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 rescaled height coordinate -- filter: Variable Transforms - Transform: AdjustedHeightCoordinate - SkipWhenNoObs: False - -# Apply variable changes needed for wind scaling -- filter: Variable Transforms - Transform: SurfaceWindScalingHeight - SkipWhenNoObs: False - -# Assign the initial observation error (constant value, 1.5 m/s right now). -- filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - action: - name: assign error - error parameter: 1.5 - -# 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 - -# Reject all obs with PreQC mark already set above 3 -# NOTE: All scatwinds have an automatic PreQC mark of 2 (hard-wired default from GSI) -# - filter: PreQC -# maxvalue: 3 -# action: -# name: reject - -obs post filters: -# Reject all ASCAT (Type 290) winds with tsavg <= 273.0 (surface temperature) -- filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 290 -# - variable: GeoVaLs/surface_temperature - - variable: GeoVaLs/surface_temperature_where_land - maxvalue: 273. - action: - name: reject - -# Reject all ASCAT (Type 290) winds with isflg /= 0 (non-water surface) -- filter: Perform Action - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 290 - - variable: GeoVaLs/water_area_fraction - maxvalue: 0.99 - action: - name: reject - -# Reject ASCAT (Type 290) when observed component deviates from background by more than 5.0 m/s -# NOTE: This check can reject a u- or v-component of the same observation independently, which -# is fundamentally different from how GSI rejects obs (both components are rejected if -# either component fails a check). -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: ObsFunction/Arithmetic - options: - variables: - - name: ObsValue/windEastward - - name: HofX/windEastward - coefs: [1.0, -1.0] - minvalue: -5.0 - maxvalue: 5.0 - -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: ObsFunction/Arithmetic - options: - variables: - - name: ObsValue/windNorthward - - name: HofX/windNorthward - coefs: [1.0, -1.0] - minvalue: -5.0 - maxvalue: 5.0 - -# Reject OSCAT (Type 291) when observed component deviates from background by more than 6.0 m/s -# NOTE: This check can reject a u- or v-component of the same observation independently, which -# is fundamentally different from how GSI rejects obs (both components are rejected if -# either component fails a check). -- filter: Background Check - filter variables: - - name: windEastward - - name: windNorthward - threshold: 6. - absolute threshold: 6. - where: - - variable: ObsType/windEastward - is_in: 291 - action: - name: reject - -# Reject ASCAT (Type 290) when ambiguity check fails (returned value is negative) -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 290 - test variables: - - name: ObsFunction/ScatWindsAmbiguityCheck - options: - minimum_uv: 0.0001 # hard-coding a minimum-uv for transparancy, want this to basically be zero - maxvalue: 0. - action: - name: reject - -# All scatwinds must adjust errors based on ObsErrorFactorPressureCheck. -# This check will inflate errors for obs that are too close to either -# the model top or bottom. -- filter: Perform Action - filter variables: - - name: windEastward - where: - - variable: - name: ObsType/windEastward - is_in: 290-291 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: windEastward - inflation factor: 4.0 - -- filter: Perform Action - filter variables: - - name: windNorthward - where: - - variable: - name: ObsType/windNorthward - is_in: 290-291 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: windNorthward - inflation factor: 4.0 - -# All scatwinds subject to a gross error check. This is contained within -# the WindsSPDBCheck, although it is not exclusive to satwinds. -- filter: Background Check - filter variables: - - name: windEastward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 290, 291] - cgross: [ 5.0, 5.0] - error_min: [1.4, 1.4] - error_max: [6.1, 6.1] - variable: windEastward - action: - name: reject - -- filter: Background Check - filter variables: - - name: windNorthward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 290, 291] - cgross: [ 5.0, 5.0] - error_min: [1.4, 1.4] - error_max: [6.1, 6.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. -#- 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 - -# There is no across-the-board inflation for nvqc=.true. for scatwinds, presumably because for -# this inflation to take place both nvqc must be .true. AND ibeta must be >0, see: -# https://github.com/NOAA-EMC/GSI/blob/14ae595af1b03471287d322596d35c0665336e95/src/gsi/setupw.f90#L1229 -# GSI settings must have ibeta>0 for satwinds, but not for scatwinds. -# -# If the ibeta settings for scatwinds were to change while nvqc remained .true., we would extend YAML to -# an additional filter that inflates final ob-errors across-the-board by 1/0.8 = 1.25. NOTE: the nvqc setting -# is defaulted to .false. in GSI code, but is overridden in global operational configuration. See: -# 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 functionality were to be activated for scatwinds, you would want to include this last inflation filter. -#- filter: Perform Action -# filter variables: -# - name: windEastward -# where: -# - variable: ObsType/windEastward -# is_in: 290-291 -# action: -# name: inflate error -# inflation factor: 1.25 -#- filter: Perform Action -# filter variables: -# - name: windNorthward -# where: -# - variable: ObsType/windNorthward -# is_in: 290-291 -# action: -# name: inflate error -# inflation factor: 1.25 - -# END OF FILTERS# diff --git a/parm/atm/obs/config/scatwind_ascat_metop-b.yaml.j2 b/parm/atm/obs/config/scatwind_ascat_metop-b.yaml.j2 new file mode 100644 index 000000000..c73995214 --- /dev/null +++ b/parm/atm/obs/config/scatwind_ascat_metop-b.yaml.j2 @@ -0,0 +1,294 @@ +- obs space: + name: ascatw_ascat_metop-b + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}ascatw.ascat_metop-b.tm00.nc' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_ascatw_ascat_metop-b_{{ current_cycle | to_YMDH }}.nc' + io pool: + max pool size: 1 + simulated variables: [windEastward, windNorthward] + + obs operator: + name: VertInterp + # Use height vertical coordinate first + # vertical coordinate: geometric_height + vertical coordinate: geopotential_height + observation vertical coordinate group: DerivedVariables + observation vertical coordinate: adjustedHeight + interpolation method: linear + hofx scaling field: SurfaceWindScalingHeight + hofx scaling field group: DerivedVariables + + linear obs operator: + name: VertInterp + vertical coordinate: geopotential_height + observation vertical coordinate group: DerivedVariables + observation vertical coordinate: adjustedHeight + interpolation method: linear + + obs pre filters: + - filter: Gaussian Thinning + horizontal_mesh: 75 + 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 rescaled height coordinate + - filter: Variable Transforms + Transform: AdjustedHeightCoordinate + SkipWhenNoObs: False + + # Apply variable changes needed for wind scaling + - filter: Variable Transforms + Transform: SurfaceWindScalingHeight + SkipWhenNoObs: False + + # Assign the initial observation error (constant value, 1.5 m/s right now). + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + action: + name: assign error + error parameter: 1.5 + + # 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 + + # Reject all obs with PreQC mark already set above 3 + # NOTE: All scatwinds have an automatic PreQC mark of 2 (hard-wired default from GSI) + # - filter: PreQC + # maxvalue: 3 + # action: + # name: reject + + obs post filters: + # Reject all ASCAT (Type 290) winds with tsavg <= 273.0 (surface temperature) + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 290 + # - variable: GeoVaLs/surface_temperature + - variable: GeoVaLs/surface_temperature_where_land + maxvalue: 273. + action: + name: reject + + # Reject all ASCAT (Type 290) winds with isflg /= 0 (non-water surface) + - filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 290 + - variable: GeoVaLs/water_area_fraction + maxvalue: 0.99 + action: + name: reject + + # Reject ASCAT (Type 290) when observed component deviates from background by more than 5.0 m/s + # NOTE: This check can reject a u- or v-component of the same observation independently, which + # is fundamentally different from how GSI rejects obs (both components are rejected if + # either component fails a check). + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: ObsFunction/Arithmetic + options: + variables: + - name: ObsValue/windEastward + - name: HofX/windEastward + coefs: [1.0, -1.0] + minvalue: -5.0 + maxvalue: 5.0 + + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: ObsFunction/Arithmetic + options: + variables: + - name: ObsValue/windNorthward + - name: HofX/windNorthward + coefs: [1.0, -1.0] + minvalue: -5.0 + maxvalue: 5.0 + + # Reject OSCAT (Type 291) when observed component deviates from background by more than 6.0 m/s + # NOTE: This check can reject a u- or v-component of the same observation independently, which + # is fundamentally different from how GSI rejects obs (both components are rejected if + # either component fails a check). + - filter: Background Check + filter variables: + - name: windEastward + - name: windNorthward + threshold: 6. + absolute threshold: 6. + where: + - variable: ObsType/windEastward + is_in: 291 + action: + name: reject + + # Reject ASCAT (Type 290) when ambiguity check fails (returned value is negative) + - filter: Bounds Check + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 290 + test variables: + - name: ObsFunction/ScatWindsAmbiguityCheck + options: + minimum_uv: 0.0001 # hard-coding a minimum-uv for transparancy, want this to basically be zero + maxvalue: 0. + action: + name: reject + + # All scatwinds must adjust errors based on ObsErrorFactorPressureCheck. + # This check will inflate errors for obs that are too close to either + # the model top or bottom. + - filter: Perform Action + filter variables: + - name: windEastward + where: + - variable: + name: ObsType/windEastward + is_in: 290-291 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windEastward + inflation factor: 4.0 + + - filter: Perform Action + filter variables: + - name: windNorthward + where: + - variable: + name: ObsType/windNorthward + is_in: 290-291 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windNorthward + inflation factor: 4.0 + + # All scatwinds subject to a gross error check. This is contained within + # the WindsSPDBCheck, although it is not exclusive to satwinds. + - filter: Background Check + filter variables: + - name: windEastward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 290, 291] + cgross: [ 5.0, 5.0] + error_min: [1.4, 1.4] + error_max: [6.1, 6.1] + variable: windEastward + action: + name: reject + + - filter: Background Check + filter variables: + - name: windNorthward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 290, 291] + cgross: [ 5.0, 5.0] + error_min: [1.4, 1.4] + error_max: [6.1, 6.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. + #- 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 + + # There is no across-the-board inflation for nvqc=.true. for scatwinds, presumably because for + # this inflation to take place both nvqc must be .true. AND ibeta must be >0, see: + # https://github.com/NOAA-EMC/GSI/blob/14ae595af1b03471287d322596d35c0665336e95/src/gsi/setupw.f90#L1229 + # GSI settings must have ibeta>0 for satwinds, but not for scatwinds. + # + # If the ibeta settings for scatwinds were to change while nvqc remained .true., we would extend YAML to + # an additional filter that inflates final ob-errors across-the-board by 1/0.8 = 1.25. NOTE: the nvqc setting + # is defaulted to .false. in GSI code, but is overridden in global operational configuration. See: + # 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 functionality were to be activated for scatwinds, you would want to include this last inflation filter. + #- filter: Perform Action + # filter variables: + # - name: windEastward + # where: + # - variable: ObsType/windEastward + # is_in: 290-291 + # action: + # name: inflate error + # inflation factor: 1.25 + #- filter: Perform Action + # filter variables: + # - name: windNorthward + # where: + # - variable: ObsType/windNorthward + # is_in: 290-291 + # action: + # name: inflate error + # inflation factor: 1.25 + + # END OF FILTERS# diff --git a/parm/atm/obs/config/sfc.yaml b/parm/atm/obs/config/sfc.yaml deleted file mode 100644 index b846e98f0..000000000 --- a/parm/atm/obs/config/sfc.yaml +++ /dev/null @@ -1,20 +0,0 @@ -obs space: - name: sfc - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)sfc.${{ current_cycle | to_YMDH }}.nc - obsdataout: - engine: - type: H5File - obsfile: $(DATA)/diags/diag_sfc_${{ current_cycle | to_YMDH }}.nc - io pool: - max pool size: 1 - simulated variables: [stationPressure] -obs operator: - name: SfcPCorrected - da_psfc_scheme: GSI - geovar_sfc_geomz: surface_geometric_height - geovar_geomz: geopotential_height -linear obs operator: - name: Identity diff --git a/parm/atm/obs/config/sfc.yaml.j2 b/parm/atm/obs/config/sfc.yaml.j2 new file mode 100644 index 000000000..97371fbdf --- /dev/null +++ b/parm/atm/obs/config/sfc.yaml.j2 @@ -0,0 +1,20 @@ +- obs space: + name: sfc + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}sfc.{{ current_cycle | to_YMDH }}.nc' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_sfc_{{ current_cycle | to_YMDH }}.nc' + io pool: + max pool size: 1 + simulated variables: [stationPressure] + obs operator: + name: SfcPCorrected + da_psfc_scheme: GSI + geovar_sfc_geomz: surface_geometric_height + geovar_geomz: geopotential_height + linear obs operator: + name: Identity diff --git a/parm/atm/obs/config/sfcship.yaml b/parm/atm/obs/config/sfcship.yaml deleted file mode 100644 index b9f548b53..000000000 --- a/parm/atm/obs/config/sfcship.yaml +++ /dev/null @@ -1,75 +0,0 @@ -obs space: - name: sfcship - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)sfcship.${{ current_cycle | to_YMDH }}.nc - obsdataout: - engine: - type: H5File - overwrite: true - obsfile: $(DATA)/diags/diag_sfcship_${{ current_cycle | to_YMDH }}.nc - io pool: - max pool size: 1 - simulated variables: [stationPressure, airTemperature, specificHumidity] -obs operator: - name: Composite - components: - - name: VertInterp - variables: - - name: airTemperature - - name: specificHumidity - - name: SfcPCorrected - variables: - - name: stationPressure - da_psfc_scheme: GSI - geovar_sfc_geomz: surface_geometric_height - geovar_geomz: geopotential_height -linear obs operator: - name: Identity - -obs filters: - # Observation range sanity check - - filter: Bounds Check - filter variables: - - name: stationPressure - minvalue: 37499.0 - maxvalue: 106999.0 - action: - name: reject - filter variables: - - name: airTemperature - minvalue: 195.0 - maxvalue: 327.0 - action: - name: reject - filter variables: - - name: specificHumidity - minvalue: 0.0 - maxvalue: 0.03499 - action: - name: reject - - # Gross error check with (O - B) / ObsError greater than threshold. - - filter: Background Check - filter variables: - - name: stationPressure - threshold: 3.6 - absolute threshold: 990.0 - action: - name: reject - defer to post: true - filter variables: - - name: airTemperature - threshold: 7.0 - absolute threshold: 9.0 - action: - name: reject - defer to post: true - - # Reject all ObsType 183 - - filter: BlackList - where: - - variable: - name: ObsType/stationPressure - is_in: 183 diff --git a/parm/atm/obs/config/sfcship.yaml.j2 b/parm/atm/obs/config/sfcship.yaml.j2 new file mode 100644 index 000000000..6a7a21ab1 --- /dev/null +++ b/parm/atm/obs/config/sfcship.yaml.j2 @@ -0,0 +1,75 @@ +- obs space: + name: sfcship + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}sfcship.{{ current_cycle | to_YMDH }}.nc' + obsdataout: + engine: + type: H5File + overwrite: true + obsfile: '{{ DATA }}/diags/diag_sfcship_{{ current_cycle | to_YMDH }}.nc' + io pool: + max pool size: 1 + simulated variables: [stationPressure, airTemperature, specificHumidity] + obs operator: + name: Composite + components: + - name: VertInterp + variables: + - name: airTemperature + - name: specificHumidity + - name: SfcPCorrected + variables: + - name: stationPressure + da_psfc_scheme: GSI + geovar_sfc_geomz: surface_geometric_height + geovar_geomz: geopotential_height + linear obs operator: + name: Identity + + obs filters: + # Observation range sanity check + - filter: Bounds Check + filter variables: + - name: stationPressure + minvalue: 37499.0 + maxvalue: 106999.0 + action: + name: reject + filter variables: + - name: airTemperature + minvalue: 195.0 + maxvalue: 327.0 + action: + name: reject + filter variables: + - name: specificHumidity + minvalue: 0.0 + maxvalue: 0.03499 + action: + name: reject + + # Gross error check with (O - B) / ObsError greater than threshold. + - filter: Background Check + filter variables: + - name: stationPressure + threshold: 3.6 + absolute threshold: 990.0 + action: + name: reject + defer to post: true + filter variables: + - name: airTemperature + threshold: 7.0 + absolute threshold: 9.0 + action: + name: reject + defer to post: true + + # Reject all ObsType 183 + - filter: BlackList + where: + - variable: + name: ObsType/stationPressure + is_in: 183 diff --git a/parm/atm/obs/config/sondes.yaml b/parm/atm/obs/config/sondes.yaml deleted file mode 100644 index 5c83686eb..000000000 --- a/parm/atm/obs/config/sondes.yaml +++ /dev/null @@ -1,104 +0,0 @@ -obs space: - name: sondes - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)sondes.{{ current_cycle | to_YMDH }}.nc - obsgrouping: - group variables: ["stationIdentification"] - sort variable: "pressure" - sort order: "descending" - obsdataout: - engine: - type: H5File - obsfile: $(DATA)/diags/diag_sondes_{{ current_cycle | to_YMDH }}.nc - io pool: - max pool size: 1 - simulated variables: [stationPressure, airTemperature, windEastward, windNorthward, specificHumidity] -obs operator: - name: Composite - components: - - name: VertInterp - variables: - - name: airTemperature - - name: windEastward - - name: windNorthward - - name: specificHumidity - - name: SfcPCorrected - da_psfc_scheme: GSI - geovar_sfc_geomz: surface_geopotential_height - geovar_geomz: geopotential_height - variables: - - name: stationPressure -linear obs operator: - name: Composite - components: - - name: VertInterp - variables: - - name: airTemperature - - name: windEastward - - name: windNorthward - - name: specificHumidity - - name: Identity - variables: - - name: stationPressure -obs filters: - # - # Reject all obs with PreQC mark already set above 3 - - filter: PreQC - maxvalue: 3.0 - action: - name: reject - # - # Observation Range Sanity Check - - filter: Bounds Check - filter variables: - - name: stationPressure - minvalue: 37499.0 - maxvalue: 106999.0 - action: - name: reject - # - # Assign obsError - - filter: Perform Action - filter variables: - - name: stationPressure - action: - name: assign error - error parameter: 100.0 # 1.0 hPa - # - # Assign the initial observation error, based on height/pressure - - filter: Perform Action - filter variables: - - name: stationPressure - action: - name: assign error - error function: - name: ObsErrorModelStepwiseLinear@ObsFunction - options: - xvar: - name: ObsValue/stationPressure - xvals: [80000.0, 75000.0] - errors: [110.0, 120.0] # 1.1 mb below 800 mb and 1.2 mb agove 750 mb - # - - filter: Perform Action - filter variables: - - name: stationPressure - action: - name: inflate error - inflation variable: - name: ObsErrorFactorSfcPressure@ObsFunction - options: - error_min: 100.0 # 1 mb - error_max: 300.0 # 3 mb - geovar_geomz: geopotential_height - geovar_sfc_geomz: surface_geopotential_height - # - # Gross error check with (O - B) / ObsError greater than threshold - - filter: Background Check - filter variables: - - name: stationPressure - threshold: 3.6 - absolute threshold: 990.0 - action: - name: reject diff --git a/parm/atm/obs/config/sondes.yaml.j2 b/parm/atm/obs/config/sondes.yaml.j2 new file mode 100644 index 000000000..0ea056d96 --- /dev/null +++ b/parm/atm/obs/config/sondes.yaml.j2 @@ -0,0 +1,104 @@ +- obs space: + name: sondes + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}sondes.{{ current_cycle | to_YMDH }}.nc' + obsgrouping: + group variables: ["stationIdentification"] + sort variable: "pressure" + sort order: "descending" + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_sondes_{{ current_cycle | to_YMDH }}.nc' + io pool: + max pool size: 1 + simulated variables: [stationPressure, airTemperature, windEastward, windNorthward, specificHumidity] + obs operator: + name: Composite + components: + - name: VertInterp + variables: + - name: airTemperature + - name: windEastward + - name: windNorthward + - name: specificHumidity + - name: SfcPCorrected + da_psfc_scheme: GSI + geovar_sfc_geomz: surface_geopotential_height + geovar_geomz: geopotential_height + variables: + - name: stationPressure + linear obs operator: + name: Composite + components: + - name: VertInterp + variables: + - name: airTemperature + - name: windEastward + - name: windNorthward + - name: specificHumidity + - name: Identity + variables: + - name: stationPressure + obs filters: + # + # Reject all obs with PreQC mark already set above 3 + - filter: PreQC + maxvalue: 3.0 + action: + name: reject + # + # Observation Range Sanity Check + - filter: Bounds Check + filter variables: + - name: stationPressure + minvalue: 37499.0 + maxvalue: 106999.0 + action: + name: reject + # + # Assign obsError + - filter: Perform Action + filter variables: + - name: stationPressure + action: + name: assign error + error parameter: 100.0 # 1.0 hPa + # + # Assign the initial observation error, based on height/pressure + - filter: Perform Action + filter variables: + - name: stationPressure + action: + name: assign error + error function: + name: ObsErrorModelStepwiseLinear@ObsFunction + options: + xvar: + name: ObsValue/stationPressure + xvals: [80000.0, 75000.0] + errors: [110.0, 120.0] # 1.1 mb below 800 mb and 1.2 mb agove 750 mb + # + - filter: Perform Action + filter variables: + - name: stationPressure + action: + name: inflate error + inflation variable: + name: ObsErrorFactorSfcPressure@ObsFunction + options: + error_min: 100.0 # 1 mb + error_max: 300.0 # 3 mb + geovar_geomz: geopotential_height + geovar_sfc_geomz: surface_geopotential_height + # + # Gross error check with (O - B) / ObsError greater than threshold + - filter: Background Check + filter variables: + - name: stationPressure + threshold: 3.6 + absolute threshold: 990.0 + action: + name: reject diff --git a/parm/atm/obs/config/ssmis_f17.yaml b/parm/atm/obs/config/ssmis_f17.yaml deleted file mode 100644 index dc16f1581..000000000 --- a/parm/atm/obs/config/ssmis_f17.yaml +++ /dev/null @@ -1,152 +0,0 @@ -obs operator: - name: CRTM - Absorbers: [H2O,O3,CO2] - obs options: - Sensor_ID: ssmis_f17 - EndianType: little_endian - CoefficientPath: $(DATA)/crtm/ -obs space: - name: ssmis_f17 - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)ssmis_f17.${{ current_cycle | to_YMDH }}.nc - obsdataout: - engine: - type: H5File - obsfile: $(DATA)/diags/diag_ssmis_f17_${{ current_cycle | to_YMDH }}.nc - simulated variables: [brightness_temperature] - channels: 1-24 -obs bias: - input file: $(DATA)/obs/$(GPREFIX)ssmis_f17.satbias.nc - output file: $(DATA)/bc/$(APREFIX)ssmis_f17.satbias.nc - variational bc: - predictors: - - name: constant - - name: cloud_liquid_water - sensor: SSMIS - ch19h: 12 - ch19v: 13 - ch22v: 14 - ch37h: 15 - ch37v: 16 - ch91v: 17 - ch91h: 18 - - name: cosine_of_latitude_times_orbit_node - - name: sine_of_latitude - - name: lapse_rate - order: 2 - tlapse: &ssmis_f17_tlapse $(DATA)/obs/$(GPREFIX)ssmis_f17.tlapse.txt - - name: lapse_rate - tlapse: *ssmis_f17_tlapse - - name: emissivity - - name: scan_angle - var_name: scan_position - order: 4 - - name: scan_angle - var_name: scan_position - order: 3 - - name: scan_angle - var_name: scan_position - order: 2 - - name: scan_angle - var_name: scan_position - -obs prior filters: -- filter: Perform Action - filter variables: - - name: brightness_temperature - channels: 1-24 - action: - name: assign error - error parameter vector: [ 1.5, 0.5, 0.5, 0.5, 0.5, 1, 1, 3, 3, 3, 3, 2.4, 1.27, 1.44, 3, - 1.34, 1.74, 3.75, 3, 3, 2, 6.4, 1, 1] - -obs post filters: -#step1: Gross check (setuprad) -- filter: Background Check - filter variables: - - name: brightness_temperature - channels: 1-24 - threshold: 1.5 - action: - name: reject -#step1: Gross check(qcmod) -- filter: Background Check - filter variables: - - name: brightness_temperature - channels: 1-24 - absolute threshold: 3.5 - remove bias correction: true - action: - name: reject - -- filter: Difference Check - filter variables: - - name: brightness_temperature - channels: 1-2,12-16 - reference: brightness_temperature_2@ObsValue - value: brightness_temperature_2@HofX - minvalue: -1.5 - maxvalue: 1.5 - where: - - variable: - name: water_area_fraction@GeoVaLs - maxvalue: 0.99 -#QC_terrain: If seviri and terrain height > 2km. do not use -- filter: Domain Check - filter variables: - - name: brightness_temperature - channels: 1-24 - where: - - variable: - name: height_above_mean_sea_level@MetaData - maxvalue: 2000.0 -#do not use over mixed surface -- filter: BlackList - filter variables: - - name: brightness_temperature - channels: 1-3,8-18 - where: - - variable: - name: land_area_fraction@GeoVaLs - maxvalue: 0.99 - - variable: - name: water_area_fraction@GeoVaLs - maxvalue: 0.99 - - variable: - name: ice_area_fraction@GeoVaLs - maxvalue: 0.99 - - variable: - name: surface_snow_area_fraction@GeoVaLs - maxvalue: 0.99 -#step4: Generate q.c. bounds and modified variances -- filter: BlackList - filter variables: - - name: brightness_temperature - channels: 1-24 - action: - name: inflate error - inflation variable: -# Surface Jacobian check - name: ObsErrorFactorSurfJacobianRad@ObsFunction - channels: 1-24 - options: - channels: 1-24 - sensor: ssmis_f17 - obserr_demisf: [0.010, 0.010, 0.010, 0.010, 0.010] - obserr_dtempf: [0.500, 0.500, 0.500, 0.500, 0.500] -# Useflag Check -- filter: Bounds Check - filter variables: - - name: brightness_temperature - channels: 1-24 - test variables: - - name: ChannelUseflagCheckRad@ObsFunction - channels: 1-24 - options: - channels: 1-24 - use_flag: [ 1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1] - minvalue: 1.0e-12 - action: - name: reject diff --git a/parm/atm/obs/config/ssmis_f17.yaml.j2 b/parm/atm/obs/config/ssmis_f17.yaml.j2 new file mode 100644 index 000000000..1f2f83c40 --- /dev/null +++ b/parm/atm/obs/config/ssmis_f17.yaml.j2 @@ -0,0 +1,152 @@ +- obs space: + name: ssmis_f17 + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}ssmis_f17.{{ current_cycle | to_YMDH }}.nc' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_ssmis_f17_{{ current_cycle | to_YMDH }}.nc' + simulated variables: [brightness_temperature] + channels: 1-24 + obs operator: + name: CRTM + Absorbers: [H2O,O3,CO2] + obs options: + Sensor_ID: ssmis_f17 + EndianType: little_endian + CoefficientPath: '{{ DATA }}/crtm/' + obs bias: + input file: '{{ DATA }}/obs/{{ GPREFIX }}ssmis_f17.satbias.nc' + output file: '{{ DATA }}/bc/{{ APREFIX }}ssmis_f17.satbias.nc' + variational bc: + predictors: + - name: constant + - name: cloud_liquid_water + sensor: SSMIS + ch19h: 12 + ch19v: 13 + ch22v: 14 + ch37h: 15 + ch37v: 16 + ch91v: 17 + ch91h: 18 + - name: cosine_of_latitude_times_orbit_node + - name: sine_of_latitude + - name: lapse_rate + order: 2 + tlapse: &ssmis_f17_tlapse '{{ DATA }}/obs/{{ GPREFIX }}ssmis_f17.tlapse.txt' + - name: lapse_rate + tlapse: *ssmis_f17_tlapse + - name: emissivity + - name: scan_angle + var_name: scan_position + order: 4 + - name: scan_angle + var_name: scan_position + order: 3 + - name: scan_angle + var_name: scan_position + order: 2 + - name: scan_angle + var_name: scan_position + + obs prior filters: + - filter: Perform Action + filter variables: + - name: brightness_temperature + channels: 1-24 + action: + name: assign error + error parameter vector: [ 1.5, 0.5, 0.5, 0.5, 0.5, 1, 1, 3, 3, 3, 3, 2.4, 1.27, 1.44, 3, + 1.34, 1.74, 3.75, 3, 3, 2, 6.4, 1, 1] + + obs post filters: + #step1: Gross check (setuprad) + - filter: Background Check + filter variables: + - name: brightness_temperature + channels: 1-24 + threshold: 1.5 + action: + name: reject + #step1: Gross check(qcmod) + - filter: Background Check + filter variables: + - name: brightness_temperature + channels: 1-24 + absolute threshold: 3.5 + remove bias correction: true + action: + name: reject + + - filter: Difference Check + filter variables: + - name: brightness_temperature + channels: 1-2,12-16 + reference: brightness_temperature_2@ObsValue + value: brightness_temperature_2@HofX + minvalue: -1.5 + maxvalue: 1.5 + where: + - variable: + name: water_area_fraction@GeoVaLs + maxvalue: 0.99 + #QC_terrain: If seviri and terrain height > 2km. do not use + - filter: Domain Check + filter variables: + - name: brightness_temperature + channels: 1-24 + where: + - variable: + name: height_above_mean_sea_level@MetaData + maxvalue: 2000.0 + #do not use over mixed surface + - filter: BlackList + filter variables: + - name: brightness_temperature + channels: 1-3,8-18 + where: + - variable: + name: land_area_fraction@GeoVaLs + maxvalue: 0.99 + - variable: + name: water_area_fraction@GeoVaLs + maxvalue: 0.99 + - variable: + name: ice_area_fraction@GeoVaLs + maxvalue: 0.99 + - variable: + name: surface_snow_area_fraction@GeoVaLs + maxvalue: 0.99 + #step4: Generate q.c. bounds and modified variances + - filter: BlackList + filter variables: + - name: brightness_temperature + channels: 1-24 + action: + name: inflate error + inflation variable: + # Surface Jacobian check + name: ObsErrorFactorSurfJacobianRad@ObsFunction + channels: 1-24 + options: + channels: 1-24 + sensor: ssmis_f17 + obserr_demisf: [0.010, 0.010, 0.010, 0.010, 0.010] + obserr_dtempf: [0.500, 0.500, 0.500, 0.500, 0.500] + # Useflag Check + - filter: Bounds Check + filter variables: + - name: brightness_temperature + channels: 1-24 + test variables: + - name: ChannelUseflagCheckRad@ObsFunction + channels: 1-24 + options: + channels: 1-24 + use_flag: [ 1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1] + minvalue: 1.0e-12 + action: + name: reject diff --git a/parm/atm/obs/config/ssmis_f18.yaml b/parm/atm/obs/config/ssmis_f18.yaml deleted file mode 100644 index c22598815..000000000 --- a/parm/atm/obs/config/ssmis_f18.yaml +++ /dev/null @@ -1,152 +0,0 @@ -obs operator: - name: CRTM - Absorbers: [H2O,O3,CO2] - obs options: - Sensor_ID: ssmis_f18 - EndianType: little_endian - CoefficientPath: $(DATA)/crtm/ -obs space: - name: ssmis_f18 - obsdatain: - engine: - type: H5File - obsfile: $(DATA)/obs/$(OPREFIX)ssmis_f18.${{ current_cycle | to_YMDH }}.nc - obsdataout: - engine: - type: H5File - obsfile: $(DATA)/diags/diag_ssmis_f18_${{ current_cycle | to_YMDH }}.nc - simulated variables: [brightness_temperature] - channels: 1-24 -obs bias: - input file: $(DATA)/obs/$(GPREFIX)ssmis_f18.satbias.nc - output file: $(DATA)/bc/$(APREFIX)ssmis_f18.satbias.nc - variational bc: - predictors: - - name: constant - - name: cloud_liquid_water - sensor: SSMIS - ch19h: 12 - ch19v: 13 - ch22v: 14 - ch37h: 15 - ch37v: 16 - ch91v: 17 - ch91h: 18 - - name: cosine_of_latitude_times_orbit_node - - name: sine_of_latitude - - name: lapse_rate - order: 2 - tlapse: &ssmis_f18_tlapse $(DATA)/obs/$(GPREFIX)ssmis_f18.tlapse.txt - - name: lapse_rate - tlapse: *ssmis_f18_tlapse - - name: emissivity - - name: scan_angle - var_name: scan_position - order: 4 - - name: scan_angle - var_name: scan_position - order: 3 - - name: scan_angle - var_name: scan_position - order: 2 - - name: scan_angle - var_name: scan_position - -obs prior filters: -- filter: Perform Action - filter variables: - - name: brightness_temperature - channels: 1-24 - action: - name: assign error - error parameter vector: [ 1.5, 0.5, 0.5, 0.5, 0.5, 1, 1, 3, 3, 3, 3, 2.4, 1.27, 1.44, 3, - 1.34, 1.74, 3.75, 3, 3, 2, 6.4, 1, 1] - -obs post filters: -#step1: Gross check (setuprad) -- filter: Background Check - filter variables: - - name: brightness_temperature - channels: 1-24 - threshold: 1.5 - action: - name: reject -#step1: Gross check(qcmod) -- filter: Background Check - filter variables: - - name: brightness_temperature - channels: 1-24 - absolute threshold: 3.5 - remove bias correction: true - action: - name: reject - -- filter: Difference Check - filter variables: - - name: brightness_temperature - channels: 1-2,12-16 - reference: brightness_temperature_2@ObsValue - value: brightness_temperature_2@HofX - minvalue: -1.5 - maxvalue: 1.5 - where: - - variable: - name: water_area_fraction@GeoVaLs - maxvalue: 0.99 -#QC_terrain: If seviri and terrain height > 2km. do not use -- filter: Domain Check - filter variables: - - name: brightness_temperature - channels: 1-24 - where: - - variable: - name: height_above_mean_sea_level@MetaData - maxvalue: 2000.0 -#do not use over mixed surface -- filter: BlackList - filter variables: - - name: brightness_temperature - channels: 1-3,8-18 - where: - - variable: - name: land_area_fraction@GeoVaLs - maxvalue: 0.99 - - variable: - name: water_area_fraction@GeoVaLs - maxvalue: 0.99 - - variable: - name: ice_area_fraction@GeoVaLs - maxvalue: 0.99 - - variable: - name: surface_snow_area_fraction@GeoVaLs - maxvalue: 0.99 -#step4: Generate q.c. bounds and modified variances -- filter: BlackList - filter variables: - - name: brightness_temperature - channels: 1-24 - action: - name: inflate error - inflation variable: -# Surface Jacobian check - name: ObsErrorFactorSurfJacobianRad@ObsFunction - channels: 1-24 - options: - channels: 1-24 - sensor: ssmis_f18 - obserr_demisf: [0.010, 0.010, 0.010, 0.010, 0.010] - obserr_dtempf: [0.500, 0.500, 0.500, 0.500, 0.500] -# Useflag Check -- filter: Bounds Check - filter variables: - - name: brightness_temperature - channels: 1-24 - test variables: - - name: ChannelUseflagCheckRad@ObsFunction - channels: 1-24 - options: - channels: 1-24 - use_flag: [ 1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1] - minvalue: 1.0e-12 - action: - name: reject diff --git a/parm/atm/obs/config/ssmis_f18.yaml.j2 b/parm/atm/obs/config/ssmis_f18.yaml.j2 new file mode 100644 index 000000000..fd1cd4b4c --- /dev/null +++ b/parm/atm/obs/config/ssmis_f18.yaml.j2 @@ -0,0 +1,152 @@ +- obs space: + name: ssmis_f18 + obsdatain: + engine: + type: H5File + obsfile: '{{ DATA }}/obs/{{ OPREFIX }}ssmis_f18.{{ current_cycle | to_YMDH }}.nc' + obsdataout: + engine: + type: H5File + obsfile: '{{ DATA }}/diags/diag_ssmis_f18_{{ current_cycle | to_YMDH }}.nc' + simulated variables: [brightness_temperature] + channels: 1-24 + obs operator: + name: CRTM + Absorbers: [H2O,O3,CO2] + obs options: + Sensor_ID: ssmis_f18 + EndianType: little_endian + CoefficientPath: '{{ DATA }}/crtm/' + obs bias: + input file: '{{ DATA }}/obs/{{ GPREFIX }}ssmis_f18.satbias.nc' + output file: '{{ DATA }}/bc/{{ APREFIX }}ssmis_f18.satbias.nc' + variational bc: + predictors: + - name: constant + - name: cloud_liquid_water + sensor: SSMIS + ch19h: 12 + ch19v: 13 + ch22v: 14 + ch37h: 15 + ch37v: 16 + ch91v: 17 + ch91h: 18 + - name: cosine_of_latitude_times_orbit_node + - name: sine_of_latitude + - name: lapse_rate + order: 2 + tlapse: &ssmis_f18_tlapse '{{ DATA }}/obs/{{ GPREFIX }}ssmis_f18.tlapse.txt' + - name: lapse_rate + tlapse: *ssmis_f18_tlapse + - name: emissivity + - name: scan_angle + var_name: scan_position + order: 4 + - name: scan_angle + var_name: scan_position + order: 3 + - name: scan_angle + var_name: scan_position + order: 2 + - name: scan_angle + var_name: scan_position + + obs prior filters: + - filter: Perform Action + filter variables: + - name: brightness_temperature + channels: 1-24 + action: + name: assign error + error parameter vector: [ 1.5, 0.5, 0.5, 0.5, 0.5, 1, 1, 3, 3, 3, 3, 2.4, 1.27, 1.44, 3, + 1.34, 1.74, 3.75, 3, 3, 2, 6.4, 1, 1] + + obs post filters: + #step1: Gross check (setuprad) + - filter: Background Check + filter variables: + - name: brightness_temperature + channels: 1-24 + threshold: 1.5 + action: + name: reject + #step1: Gross check(qcmod) + - filter: Background Check + filter variables: + - name: brightness_temperature + channels: 1-24 + absolute threshold: 3.5 + remove bias correction: true + action: + name: reject + + - filter: Difference Check + filter variables: + - name: brightness_temperature + channels: 1-2,12-16 + reference: brightness_temperature_2@ObsValue + value: brightness_temperature_2@HofX + minvalue: -1.5 + maxvalue: 1.5 + where: + - variable: + name: water_area_fraction@GeoVaLs + maxvalue: 0.99 + #QC_terrain: If seviri and terrain height > 2km. do not use + - filter: Domain Check + filter variables: + - name: brightness_temperature + channels: 1-24 + where: + - variable: + name: height_above_mean_sea_level@MetaData + maxvalue: 2000.0 + #do not use over mixed surface + - filter: BlackList + filter variables: + - name: brightness_temperature + channels: 1-3,8-18 + where: + - variable: + name: land_area_fraction@GeoVaLs + maxvalue: 0.99 + - variable: + name: water_area_fraction@GeoVaLs + maxvalue: 0.99 + - variable: + name: ice_area_fraction@GeoVaLs + maxvalue: 0.99 + - variable: + name: surface_snow_area_fraction@GeoVaLs + maxvalue: 0.99 + #step4: Generate q.c. bounds and modified variances + - filter: BlackList + filter variables: + - name: brightness_temperature + channels: 1-24 + action: + name: inflate error + inflation variable: + # Surface Jacobian check + name: ObsErrorFactorSurfJacobianRad@ObsFunction + channels: 1-24 + options: + channels: 1-24 + sensor: ssmis_f18 + obserr_demisf: [0.010, 0.010, 0.010, 0.010, 0.010] + obserr_dtempf: [0.500, 0.500, 0.500, 0.500, 0.500] + # Useflag Check + - filter: Bounds Check + filter variables: + - name: brightness_temperature + channels: 1-24 + test variables: + - name: ChannelUseflagCheckRad@ObsFunction + channels: 1-24 + options: + channels: 1-24 + use_flag: [ 1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1] + minvalue: 1.0e-12 + action: + name: reject diff --git a/parm/atm/obs/lists/gdas_prototype.yaml b/parm/atm/obs/lists/gdas_prototype.yaml deleted file mode 100644 index 8536c7208..000000000 --- a/parm/atm/obs/lists/gdas_prototype.yaml +++ /dev/null @@ -1,13 +0,0 @@ -observers: -- !INC ${OBS_YAML_DIR}/amsua_n19.yaml -- !INC ${OBS_YAML_DIR}/sondes.yaml -- !INC ${OBS_YAML_DIR}/atms_n20.yaml -- !INC ${OBS_YAML_DIR}/aircraft.yaml -- !INC ${OBS_YAML_DIR}/satwind.yaml -- !INC ${OBS_YAML_DIR}/omi_aura.yaml -- !INC ${OBS_YAML_DIR}/ompsnp_npp.yaml -- !INC ${OBS_YAML_DIR}/ompstc8_npp.yaml -- !INC ${OBS_YAML_DIR}/cris-fsr_n20.yaml -- !INC ${OBS_YAML_DIR}/cris-fsr_npp.yaml -- !INC ${OBS_YAML_DIR}/sfc.yaml -#- !INC ${OBS_YAML_DIR}/sfcship.yaml diff --git a/parm/atm/obs/lists/gdas_prototype.yaml.j2 b/parm/atm/obs/lists/gdas_prototype.yaml.j2 new file mode 100644 index 000000000..704133576 --- /dev/null +++ b/parm/atm/obs/lists/gdas_prototype.yaml.j2 @@ -0,0 +1,15 @@ +observers: +{% filter indent(width=2) %} +{% include 'atm/obs/config/amsua_n19.yaml.j2' %} +{% include 'atm/obs/config/sondes.yaml.j2' %} +{% include 'atm/obs/config/atms_n20.yaml.j2' %} +{% include 'atm/obs/config/aircraft.yaml.j2' %} +{% include 'atm/obs/config/satwind.yaml.j2' %} +{% include 'atm/obs/config/omi_aura.yaml.j2' %} +{% include 'atm/obs/config/ompsnp_npp.yaml.j2' %} +{% include 'atm/obs/config/ompstc8_npp.yaml.j2' %} +{% include 'atm/obs/config/cris-fsr_n20.yaml.j2' %} +{% include 'atm/obs/config/cris-fsr_npp.yaml.j2' %} +{% include 'atm/obs/config/sfc.yaml.j2' %} +{% include 'atm/obs/config/sfcship.yaml.j2' %} +{% endfilter %} diff --git a/parm/atm/obs/lists/gdas_prototype_3d.yaml b/parm/atm/obs/lists/gdas_prototype_3d.yaml deleted file mode 100644 index bcb6ddb55..000000000 --- a/parm/atm/obs/lists/gdas_prototype_3d.yaml +++ /dev/null @@ -1,21 +0,0 @@ -observers: -##- !INC ${OBS_YAML_DIR}/amsua_n19.yaml -##- !INC ${OBS_YAML_DIR}/sondes_prepbufr.yaml -##- !INC ${OBS_YAML_DIR}/atms_n20.yaml -##- !INC ${OBS_YAML_DIR}/atms_npp.yaml -##- !INC ${OBS_YAML_DIR}/aircraft.yaml -##- !INC ${OBS_YAML_DIR}/satwind_abi_goes-16.yaml -##- !INC ${OBS_YAML_DIR}/satwind_abi_goes-17.yaml -##- !INC ${OBS_YAML_DIR}/scatwind_ascat_metop-a.yaml -##- !INC ${OBS_YAML_DIR}/scatwind_ascat_metop-b.yaml -##- !INC ${OBS_YAML_DIR}/omi_aura.yaml -##- !INC ${OBS_YAML_DIR}/ompsnp_npp.yaml -##- !INC ${OBS_YAML_DIR}/ompstc8_npp.yaml -##- !INC ${OBS_YAML_DIR}/cris-fsr_n20.yaml -##- !INC ${OBS_YAML_DIR}/cris-fsr_npp.yaml -##- !INC ${OBS_YAML_DIR}/iasi_metop-a.yaml -##- !INC ${OBS_YAML_DIR}/iasi_metop-b.yaml -##- !INC ${OBS_YAML_DIR}/sfc.yaml -##- !INC ${OBS_YAML_DIR}/sfcship.yaml -##- !INC ${OBS_YAML_DIR}/conv_ps.yaml -##- !INC ${OBS_YAML_DIR}/gnssro.yaml diff --git a/parm/atm/obs/lists/gdas_prototype_3d.yaml.j2 b/parm/atm/obs/lists/gdas_prototype_3d.yaml.j2 new file mode 100644 index 000000000..a8bc25019 --- /dev/null +++ b/parm/atm/obs/lists/gdas_prototype_3d.yaml.j2 @@ -0,0 +1,7 @@ +observers: +{% filter indent(width=2) %} +{% include 'atm/obs/config/satwind_abi_goes-16.yaml.j2' %} +{% include 'atm/obs/config/scatwind_ascat_metop-b.yaml.j2' %} +{% include 'atm/obs/config/conv_ps.yaml.j2' %} +{% include 'atm/obs/config/gnssro.yaml.j2' %} +{% endfilter %} diff --git a/parm/atm/obs/lists/gdas_prototype_4d.yaml b/parm/atm/obs/lists/gdas_prototype_4d.yaml deleted file mode 100644 index 11281cf2c..000000000 --- a/parm/atm/obs/lists/gdas_prototype_4d.yaml +++ /dev/null @@ -1,13 +0,0 @@ -observers: -##- !INC ${OBS_YAML_DIR}/amsua_n19.yaml -- !INC ${OBS_YAML_DIR}/sondes.yaml -##- !INC ${OBS_YAML_DIR}/atms_n20.yaml -##- !INC ${OBS_YAML_DIR}/aircraft.yaml -##- !INC ${OBS_YAML_DIR}/satwind.yaml -##- !INC ${OBS_YAML_DIR}/omi_aura.yaml -##- !INC ${OBS_YAML_DIR}/ompsnp_npp.yaml -##- !INC ${OBS_YAML_DIR}/ompstc8_npp.yaml -##- !INC ${OBS_YAML_DIR}/cris-fsr_n20.yaml -##- !INC ${OBS_YAML_DIR}/cris-fsr_npp.yaml -##- !INC ${OBS_YAML_DIR}/sfc.yaml -#- !INC ${OBS_YAML_DIR}/sfcship.yaml diff --git a/parm/atm/obs/lists/gdas_prototype_4d.yaml.j2 b/parm/atm/obs/lists/gdas_prototype_4d.yaml.j2 new file mode 100644 index 000000000..704133576 --- /dev/null +++ b/parm/atm/obs/lists/gdas_prototype_4d.yaml.j2 @@ -0,0 +1,15 @@ +observers: +{% filter indent(width=2) %} +{% include 'atm/obs/config/amsua_n19.yaml.j2' %} +{% include 'atm/obs/config/sondes.yaml.j2' %} +{% include 'atm/obs/config/atms_n20.yaml.j2' %} +{% include 'atm/obs/config/aircraft.yaml.j2' %} +{% include 'atm/obs/config/satwind.yaml.j2' %} +{% include 'atm/obs/config/omi_aura.yaml.j2' %} +{% include 'atm/obs/config/ompsnp_npp.yaml.j2' %} +{% include 'atm/obs/config/ompstc8_npp.yaml.j2' %} +{% include 'atm/obs/config/cris-fsr_n20.yaml.j2' %} +{% include 'atm/obs/config/cris-fsr_npp.yaml.j2' %} +{% include 'atm/obs/config/sfc.yaml.j2' %} +{% include 'atm/obs/config/sfcship.yaml.j2' %} +{% endfilter %} diff --git a/parm/atm/obs/lists/lgetkf_prototype.yaml b/parm/atm/obs/lists/lgetkf_prototype.yaml deleted file mode 100644 index 33b9872f4..000000000 --- a/parm/atm/obs/lists/lgetkf_prototype.yaml +++ /dev/null @@ -1,3 +0,0 @@ -observers: -- !INC ${OBS_YAML_DIR}/lgetkf_amsua_n19.yaml -- !INC ${OBS_YAML_DIR}/lgetkf_sondes.yaml diff --git a/parm/atm/obs/lists/lgetkf_prototype.yaml.j2 b/parm/atm/obs/lists/lgetkf_prototype.yaml.j2 new file mode 100644 index 000000000..6151234e6 --- /dev/null +++ b/parm/atm/obs/lists/lgetkf_prototype.yaml.j2 @@ -0,0 +1,7 @@ +observers: +{% filter indent(width=2) %} +{% include 'atm/obs/config/lgetkf_satwind_abi_goes-16.yaml.j2' %} +{% include 'atm/obs/config/lgetkf_scatwind_ascat_metop-b.yaml.j2' %} +{% include 'atm/obs/config/lgetkf_conv_ps.yaml.j2' %} +{% include 'atm/obs/config/lgetkf_gnssro.yaml.j2' %} +{% endfilter %} diff --git a/parm/atm/variational/3dvar_drpcg.yaml b/parm/atm/variational/3dvar_drpcg.yaml.j2 similarity index 73% rename from parm/atm/variational/3dvar_drpcg.yaml rename to parm/atm/variational/3dvar_drpcg.yaml.j2 index 9464c7489..c0f684413 100644 --- a/parm/atm/variational/3dvar_drpcg.yaml +++ b/parm/atm/variational/3dvar_drpcg.yaml.j2 @@ -2,7 +2,7 @@ cost function: cost type: 3D-Var time window: begin: '{{ ATM_WINDOW_BEGIN | to_isotime }}' - length: $(ATM_WINDOW_LENGTH) + length: '{{ ATM_WINDOW_LENGTH }}' bound to include: begin analysis variables: &3dvars [ua,va,t,ps,sphum,ice_wat,liq_wat,o3mr] geometry: @@ -11,11 +11,11 @@ cost function: field table filename: ./fv3jedi/field_table akbk: ./fv3jedi/akbk.nc4 layout: - - $(layout_x) - - $(layout_y) - npx: $(npx_ges) - npy: $(npy_ges) - npz: $(npz_ges) + - {{ layout_x }} + - {{ layout_y }} + npx: {{ npx_ges }} + npy: {{ npy_ges }} + npz: {{ npz_ges }} field metadata override: ./fv3jedi/fv3jedi_fieldmetadata_restart.yaml background: datapath: ./bkg @@ -29,8 +29,17 @@ cost function: state variables: [ua,va,t,DZ,delp,ps,sphum,ice_wat,liq_wat,o3mr,phis, slmsk,sheleg,tsea,vtype,stype,vfrac,stc,smc,snwdph, u_srf,v_srf,f10m] - background error: !INC ${BERROR_YAML} - observations: !INC ${OBS_LIST} + background error: +{% filter indent(width=4) %} +{% set berror_list = 'BERROR_YAML' | getenv('atm/berror/berror.yaml.j2') %} +{% include berror_list %} +{% endfilter %} + observations: +{% filter indent(width=4) %} +{% set atm_obs_list = 'OBS_LIST' | getenv('atm/obs/lists/gdas_prototype_3d.yaml.j2') %} +{% include atm_obs_list %} +{% endfilter %} + variational: minimizer: algorithm: DRPCG @@ -44,11 +53,11 @@ variational: field table filename: ./fv3jedi/field_table akbk: ./fv3jedi/akbk.nc4 layout: - - $(layout_x) - - $(layout_y) - npx: $(npx_anl) - npy: $(npy_anl) - npz: $(npz_anl) + - {{ layout_x }} + - {{ layout_y }} + npx: {{ npx_anl }} + npy: {{ npy_anl }} + npz: {{ npz_anl }} field metadata override: ./fv3jedi/fv3jedi_fieldmetadata_restart.yaml diagnostics: departures: bkgmob @@ -61,11 +70,11 @@ variational: field table filename: ./fv3jedi/field_table akbk: ./fv3jedi/akbk.nc4 layout: - - $(layout_x) - - $(layout_y) - npx: $(npx_anl) - npy: $(npy_anl) - npz: $(npz_anl) + - {{ layout_x }} + - {{ layout_y }} + npx: {{ npx_anl }} + npy: {{ npy_anl }} + npz: {{ npz_anl }} field metadata override: ./fv3jedi/fv3jedi_fieldmetadata_restart.yaml diagnostics: departures: bkgmob1 @@ -84,9 +93,9 @@ final: field table filename: ./fv3jedi/field_table akbk: ./fv3jedi/akbk.nc4 layout: - - $(layout_x) - - $(layout_y) - npx: $(npx_anl) - npy: $(npy_anl) - npz: $(npz_anl) + - {{ layout_x }} + - {{ layout_y }} + npx: {{ npx_anl }} + npy: {{ npy_anl }} + npz: {{ npz_anl }} field metadata override: ./fv3jedi/fv3jedi_fieldmetadata_restart.yaml diff --git a/parm/ioda/bufr2ioda/bufr2ioda_altkob_surface.json b/parm/ioda/bufr2ioda/bufr2ioda_altkob_surface.json new file mode 100644 index 000000000..c7b7b095b --- /dev/null +++ b/parm/ioda/bufr2ioda/bufr2ioda_altkob_surface.json @@ -0,0 +1,12 @@ +{ + "data_format" : "altkob", + "subsets" : "ALTKOB", + "source" : "NCEP data tank", + "data_type" : "bathy", + "cycle_type" : "{{ RUN }}", + "cycle_datetime" : "{{ current_cycle | to_YMDH }}", + "dump_directory" : "{{ DMPDIR }}", + "ioda_directory" : "{{ COM_OBS }}", + "data_description" : "6-hrly in situ Along Track Surface", + "data_provider" : "U.S. NOAA" +} diff --git a/test/atm/global-workflow/config.atmanl b/test/atm/global-workflow/config.atmanl index c8b6d1d80..4aa60d76e 100755 --- a/test/atm/global-workflow/config.atmanl +++ b/test/atm/global-workflow/config.atmanl @@ -5,12 +5,16 @@ echo "BEGIN: config.atmanl" -export CASE_ANL="@ATMRES_ANL@" -export OBS_YAML_DIR=${HOMEgfs}/sorc/gdas.cd/parm/atm/obs/config/ +if [[ ${DOHYBVAR} = "YES" ]]; then + # shellcheck disable=SC2153 + export CASE_ANL=${CASE_ENS} +else + export CASE_ANL=${CASE} +fi export OBS_LIST=@OBS_LIST@ -export ATMVARYAML=${HOMEgfs}/sorc/gdas.cd/parm/atm/variational/3dvar_drpcg.yaml +export JEDIYAML="${HOMEgfs}/parm/gdas/atm/variational/3dvar_drpcg.yaml.j2" export STATICB_TYPE="identity" -export BERROR_YAML=${HOMEgfs}/sorc/gdas.cd/parm/atm/berror/staticb_${STATICB_TYPE}.yaml +export BERROR_YAML="${HOMEgfs}/parm/gdas/atm/berror/staticb_${STATICB_TYPE}.yaml.j2" export INTERP_METHOD='barycentric' export layout_x_atmanl=@LAYOUT_X_ATMANL@ diff --git a/test/atm/global-workflow/config.atmensanl b/test/atm/global-workflow/config.atmensanl new file mode 100644 index 000000000..86640782c --- /dev/null +++ b/test/atm/global-workflow/config.atmensanl @@ -0,0 +1,20 @@ +#! /usr/bin/env bash + +########## config.atmensanl ########## +# configuration common to all atm ens analysis tasks + +echo "BEGIN: config.atmensanl" + +export OBS_LIST=@OBS_LIST@ +export JEDIYAML="${HOMEgfs}/parm/gdas/atm/lgetkf/lgetkf.yaml.j2" +export INTERP_METHOD='barycentric' + +export layout_x_atmensanl=@LAYOUT_X_ATMENSANL@ +export layout_y_atmensanl=@LAYOUT_Y_ATMENSANL@ + +export io_layout_x=@IO_LAYOUT_X@ +export io_layout_y=@IO_LAYOUT_Y@ + +export JEDIEXE=${HOMEgfs}/exec/fv3jedi_letkf.x + +echo "END: config.atmensanl" diff --git a/test/atm/global-workflow/config.yaml b/test/atm/global-workflow/config.yaml index 43da40fcf..b7594f4bf 100644 --- a/test/atm/global-workflow/config.yaml +++ b/test/atm/global-workflow/config.yaml @@ -7,7 +7,7 @@ base: STMP: "@bindir@/test/atm/global-workflow/testrun" PTMP: "@bindir@/test/atm/global-workflow/testrun" atmanl: - OBS_LIST: "@srcdir@/test/atm/global-workflow/gdas_prototype.yaml" + OBS_LIST: "@srcdir@/test/atm/global-workflow/gdas_prototype.yaml.j2" ATMRES_ANL: "C48" LAYOUT_X_ATMANL: 1 LAYOUT_Y_ATMANL: 1 @@ -15,6 +15,7 @@ atmanl: IO_LAYOUT_Y: 1 atmensanl: + OBS_LIST: "@srcdir@/test/atm/global-workflow/lgetkf_prototype.yaml.j2" LAYOUT_X_ATMENSANL: 1 LAYOUT_Y_ATMENSANL: 1 IO_LAYOUT_X: 1 diff --git a/test/atm/global-workflow/gdas_prototype.yaml b/test/atm/global-workflow/gdas_prototype.yaml deleted file mode 100644 index 18d64e54e..000000000 --- a/test/atm/global-workflow/gdas_prototype.yaml +++ /dev/null @@ -1,13 +0,0 @@ -observers: -- !INC ${OBS_YAML_DIR}/amsua_n19.yaml -- !INC ${OBS_YAML_DIR}/sondes.yaml -##- !INC ${OBS_YAML_DIR}/atms_n20.yaml -##- !INC ${OBS_YAML_DIR}/aircraft.yaml -##- !INC ${OBS_YAML_DIR}/satwind.yaml -##- !INC ${OBS_YAML_DIR}/omi_aura.yaml -##- !INC ${OBS_YAML_DIR}/ompsnp_npp.yaml -##- !INC ${OBS_YAML_DIR}/ompstc8_npp.yaml -##- !INC ${OBS_YAML_DIR}/cris-fsr_n20.yaml -##- !INC ${OBS_YAML_DIR}/cris-fsr_npp.yaml -##- !INC ${OBS_YAML_DIR}/sfc.yaml -#- !INC ${OBS_YAML_DIR}/sfcship.yaml diff --git a/test/atm/global-workflow/gdas_prototype.yaml.j2 b/test/atm/global-workflow/gdas_prototype.yaml.j2 new file mode 100644 index 000000000..906a316d1 --- /dev/null +++ b/test/atm/global-workflow/gdas_prototype.yaml.j2 @@ -0,0 +1,5 @@ +observers: +{% filter indent(width=2) %} +{% include 'atm/obs/config/amsua_n19.yaml.j2' %} +{% include 'atm/obs/config/sondes.yaml.j2' %} +{% endfilter %} diff --git a/test/atm/global-workflow/lgetkf_prototype.yaml.j2 b/test/atm/global-workflow/lgetkf_prototype.yaml.j2 new file mode 100644 index 000000000..ec4ebf0fa --- /dev/null +++ b/test/atm/global-workflow/lgetkf_prototype.yaml.j2 @@ -0,0 +1,5 @@ +observers: +{% filter indent(width=2) %} +{% include 'atm/obs/config/lgetkf_amsua_n19.yaml.j2' %} +{% include 'atm/obs/config/lgetkf_sondes.yaml.j2' %} +{% endfilter %} diff --git a/test/atm/global-workflow/setup_workflow_exp.sh b/test/atm/global-workflow/setup_workflow_exp.sh index 67bfd3b03..2739ae97c 100755 --- a/test/atm/global-workflow/setup_workflow_exp.sh +++ b/test/atm/global-workflow/setup_workflow_exp.sh @@ -25,6 +25,7 @@ rm -rf $comroot $expdir config # copy config.yaml to local config cp -r $configdir config cp $srcdir/test/atm/global-workflow/config.atmanl config/ +cp $srcdir/test/atm/global-workflow/config.atmensanl config/ cp $srcdir/test/atm/global-workflow/config.yaml . # update paths in config.yaml diff --git a/ush/ioda/bufr2ioda/bufr2ioda_acft_profiles_prepbufr.py b/ush/ioda/bufr2ioda/bufr2ioda_acft_profiles_prepbufr.py index 2e04e8f38..8d4fa9974 100755 --- a/ush/ioda/bufr2ioda/bufr2ioda_acft_profiles_prepbufr.py +++ b/ush/ioda/bufr2ioda/bufr2ioda_acft_profiles_prepbufr.py @@ -99,6 +99,10 @@ def bufr_to_ioda(config, logger): bufrfile = f"{cycle_type}.t{hh}z.{data_format}.acft_profiles" DATA_PATH = os.path.join(dump_dir, f"{cycle_type}.{yyyymmdd}", str(hh), 'atmos', bufrfile) + if not os.path.isfile(DATA_PATH): + logger.info(f"DATA_PATH {DATA_PATH} does not exist") + return + logger.debug(f"The DATA_PATH is: {DATA_PATH}") # ============================================ # Make the QuerySet for all the data we want @@ -157,7 +161,11 @@ def bufr_to_ioda(config, logger): logger.debug(f"Executing QuerySet to get ResultSet ...") with bufr.File(DATA_PATH) as f: - r = f.execute(q) + try: + r = f.execute(q) + except Exception as err: + logger.info(f'Return with {err}') + return logger.debug(f" ... Executing QuerySet: get MetaData: basic ...") diff --git a/ush/ioda/bufr2ioda/bufr2ioda_adpsfc_prepbufr.py b/ush/ioda/bufr2ioda/bufr2ioda_adpsfc_prepbufr.py index a0086293a..d23157605 100755 --- a/ush/ioda/bufr2ioda/bufr2ioda_adpsfc_prepbufr.py +++ b/ush/ioda/bufr2ioda/bufr2ioda_adpsfc_prepbufr.py @@ -71,7 +71,9 @@ def bufr_to_ioda(config, logger): bufrfile = f"{cycle_type}.t{hh}z.{data_format}" DATA_PATH = os.path.join(dump_dir, f"{cycle_type}.{yyyymmdd}", str(hh), 'atmos', bufrfile) - + if not os.path.isfile(DATA_PATH): + logger.info(f"DATA_PATH {DATA_PATH} does not exist") + return logger.debug(f"The DATA_PATH is: {DATA_PATH}") # ============================================ @@ -116,7 +118,11 @@ def bufr_to_ioda(config, logger): logger.debug(f"Executing QuerySet to get ResultSet ...") with bufr.File(DATA_PATH) as f: - r = f.execute(q) + try: + r = f.execute(q) + except Exception as err: + logger.info(f'Return with {err}') + return # ObsType logger.debug(" ... Executing QuerySet: get ObsType ...") diff --git a/ush/ioda/bufr2ioda/bufr2ioda_adpupa_prepbufr.py b/ush/ioda/bufr2ioda/bufr2ioda_adpupa_prepbufr.py index 48ccedc90..05214f2fe 100755 --- a/ush/ioda/bufr2ioda/bufr2ioda_adpupa_prepbufr.py +++ b/ush/ioda/bufr2ioda/bufr2ioda_adpupa_prepbufr.py @@ -88,6 +88,10 @@ def bufr_to_ioda(config, logger): bufrfile = f"{cycle_type}.t{hh}z.{data_format}" DATA_PATH = os.path.join(dump_dir, f"{cycle_type}.{yyyymmdd}", str(hh), 'atmos', bufrfile) + if not os.path.isfile(DATA_PATH): + logger.info(f"DATA_PATH {DATA_PATH} does not exist") + return + logger.debug(f"The DATA_PATH is: {DATA_PATH}") # ============================================ # Make the QuerySet for all the data we want @@ -147,7 +151,11 @@ def bufr_to_ioda(config, logger): logger.info('Executing QuerySet to get ResultSet') with bufr.File(DATA_PATH) as f: - r = f.execute(q) + try: + r = f.execute(q) + except Exception as err: + logger.info(f'Return with {err}') + return # ObsType logger.debug(" ... Executing QuerySet for ADPUPA: get ObsType ...") diff --git a/ush/ioda/bufr2ioda/bufr2ioda_altkob_surface.py b/ush/ioda/bufr2ioda/bufr2ioda_altkob_surface.py index 361852abd..8aa1c6011 100755 --- a/ush/ioda/bufr2ioda/bufr2ioda_altkob_surface.py +++ b/ush/ioda/bufr2ioda/bufr2ioda_altkob_surface.py @@ -19,6 +19,9 @@ from collections import namedtuple from pyioda import ioda_obs_space as ioda_ospace from wxflow import Logger +import warnings +# suppress warnings +warnings.filterwarnings('ignore') def Compute_sequenceNumber(lon): @@ -54,8 +57,11 @@ def bufr_to_ioda(config, logger): converter = 'BUFR to IODA Converter' platform_description = 'Surface obs from ALTKOB: temperature and salinity' - bufrfile = f"{cycle_type}.t{hh}z.{data_format}.tm{hh}.bufr_d" + bufrfile = f"{cycle_type}.t{hh}z.{data_format}.tm00.bufr_d" DATA_PATH = os.path.join(dump_dir, f"{cycle_type}.{yyyymmdd}", str(hh), f"atmos", bufrfile) + if not os.path.isfile(DATA_PATH): + logger.info(f"DATA_PATH {DATA_PATH} does not exist") + return logger.debug(f"{bufrfile}, {DATA_PATH}") # =========================================== @@ -96,22 +102,26 @@ def bufr_to_ioda(config, logger): logger.debug(f"Executing QuerySet to get ResultSet ...") with bufr.File(DATA_PATH) as f: - r = f.execute(q) + try: + r = f.execute(q) + except Exception as err: + logger.info(f'Return with {err}') + return # MetaData logger.debug(f" ... Executing QuerySet: get MetaData ...") - dateTime = r.get_datetime('year', 'month', 'day', 'hour', 'minute', group_by='depth') + dateTime = r.get_datetime('year', 'month', 'day', 'hour', 'minute') dateTime = dateTime.astype(np.int64) - rcptdateTime = r.get_datetime('ryear', 'rmonth', 'rday', 'rhour', 'rminute', group_by='depth') + rcptdateTime = r.get_datetime('ryear', 'rmonth', 'rday', 'rhour', 'rminute') rcptdateTime = rcptdateTime.astype(np.int64) - lat = r.get('latitude', group_by='depth') - lon = r.get('longitude', group_by='depth') + lat = r.get('latitude') + lon = r.get('longitude') # ObsValue logger.debug(f" ... Executing QuerySet: get ObsValue ...") - temp = r.get('temp', group_by='depth') + temp = r.get('temp') temp -= 273.15 - saln = r.get('saln', group_by='depth') + saln = r.get('saln') # Add mask based on min, max values mask = ((temp > -10.0) & (temp <= 50.0)) & ((saln >= 0.0) & (saln <= 45.0)) @@ -142,11 +152,9 @@ def bufr_to_ioda(config, logger): logger.debug(f" saln min, max, length, dtype = {saln.min()}, {saln.max()}, {len(saln)}, {saln.dtype}") logger.debug(f" lon min, max, length, dtype = {lon.min()}, {lon.max()}, {len(lon)}, {lon.dtype}") logger.debug(f" lat min, max, length, dtype = {lat.min()}, {lat.max()}, {len(lat)}, {lat.dtype}") - logger.debug(f" depth min, max, length, dtype = {depth.min()}, {depth.max()}, {len(depth)}, {depth.dtype}") logger.debug(f" PreQC min, max, length, dtype = {PreQC.min()}, {PreQC.max()}, {len(PreQC)}, {PreQC.dtype}") logger.debug(f" ObsError_temp min, max, length, dtype = {ObsError_temp.min()}, {ObsError_temp.max()}, {len(ObsError_temp)}, {ObsError_temp.dtype}") logger.debug(f" ObsError_saln min, max, length, dtype = {ObsError_saln.min()}, {ObsError_saln.max()}, {len(ObsError_saln)}, {ObsError_saln.dtype}") - logger.debug(f" stationID shape, dtype = {stationID.shape}, {stationID.astype(str).dtype}") logger.debug(f" dateTime shape, dtype = {dateTime.shape}, {dateTime.dtype}") logger.debug(f" rcptdateTime shape, dytpe = {rcptdateTime.shape}, {rcptdateTime.dtype}") @@ -207,11 +215,6 @@ def bufr_to_ioda(config, logger): .write_attr('long_name', 'Latitude') \ .write_data(lat) - # Station Identification - obsspace.create_var('MetaData/stationID', dtype=stationID.dtype, fillval=stationID.fill_value) \ - .write_attr('long_name', 'Station Identification') \ - .write_data(stationID) - # PreQC obsspace.create_var('PreQC/seaSurfaceTemperature', dtype=PreQC.dtype, fillval=PreQC.fill_value) \ .write_attr('long_name', 'PreQC') \ @@ -256,11 +259,15 @@ def bufr_to_ioda(config, logger): if __name__ == '__main__': start_time = time.time() - config = "bufr2ioda_trackob_surface.json" + + parser = argparse.ArgumentParser() + parser.add_argument('-c', '--config', type=str, help='Input JSON configuration', required=True) + parser.add_argument('-v', '--verbose', help='print debug logging information', + action='store_true') + args = parser.parse_args() log_level = 'DEBUG' if args.verbose else 'INFO' - logger = Logger('bufr2ioda_trackob_surface.py', level=log_level, - colored_log=True) + logger = Logger('bufr2ioda_trackob_surface.py', level=log_level, colored_log=True) with open(args.config, "r") as json_file: config = json.load(json_file) diff --git a/ush/ioda/bufr2ioda/bufr2ioda_bathythermal_profiles.py b/ush/ioda/bufr2ioda/bufr2ioda_bathythermal_profiles.py index 76df14741..9a9a956b4 100755 --- a/ush/ioda/bufr2ioda/bufr2ioda_bathythermal_profiles.py +++ b/ush/ioda/bufr2ioda/bufr2ioda_bathythermal_profiles.py @@ -19,6 +19,9 @@ from collections import namedtuple from pyioda import ioda_obs_space as ioda_ospace from wxflow import Logger +import warnings +# suppress warnings +warnings.filterwarnings('ignore') def Compute_sequenceNumber(lon): @@ -53,8 +56,11 @@ def bufr_to_ioda(config, logger): converter = 'BUFR to IODA Converter' platform_description = 'Profiles from BATHYthermal: temperature' - bufrfile = f"{cycle_type}.t{hh}z.{data_format}.tm{hh}.bufr_d" + bufrfile = f"{cycle_type}.t{hh}z.{data_format}.tm00.bufr_d" DATA_PATH = os.path.join(dump_dir, f"{cycle_type}.{yyyymmdd}", str(hh), f"atmos", bufrfile) + if not os.path.isfile(DATA_PATH): + logger.info(f"DATA_PATH {DATA_PATH} does not exist") + return logger.debug(f"{bufrfile}, {DATA_PATH}") # ========================================== @@ -96,7 +102,11 @@ def bufr_to_ioda(config, logger): logger.debug(f"Executing QuerySet to get ResultSet ...") with bufr.File(DATA_PATH) as f: - r = f.execute(q) + try: + r = f.execute(q) + except Exception as err: + logger.info(f'Return with {err}') + return # MetaData logger.debug(f" ... Executing QuerySet: get MetaData ...") @@ -251,11 +261,15 @@ def bufr_to_ioda(config, logger): if __name__ == '__main__': start_time = time.time() - config = "bufr2ioda_bathythermal_profiles.json" + + parser = argparse.ArgumentParser() + parser.add_argument('-c', '--config', type=str, help='Input JSON configuration', required=True) + parser.add_argument('-v', '--verbose', help='print debug logging information', + action='store_true') + args = parser.parse_args() log_level = 'DEBUG' if args.verbose else 'INFO' - logger = Logger('bufr2ioda_bathythermal_profiles.py', level=log_level, - colored_log=True) + logger = Logger('bufr2ioda_bathythermal_profiles.py', level=log_level, colored_log=True) with open(args.config, "r") as json_file: config = json.load(json_file) diff --git a/ush/ioda/bufr2ioda/bufr2ioda_conventional_prepbufr_ps.py b/ush/ioda/bufr2ioda/bufr2ioda_conventional_prepbufr_ps.py index 8352b9f63..55684cb56 100755 --- a/ush/ioda/bufr2ioda/bufr2ioda_conventional_prepbufr_ps.py +++ b/ush/ioda/bufr2ioda/bufr2ioda_conventional_prepbufr_ps.py @@ -102,7 +102,9 @@ def bufr_to_ioda(config, logger): bufrfile = f"{cycle_type}.t{hh}z.{data_format}" DATA_PATH = os.path.join(dump_dir, f"{cycle_type}.{yyyymmdd}", str(hh), 'atmos', bufrfile) - + if not os.path.isfile(DATA_PATH): + logger.info(f"DATA_PATH {DATA_PATH} does not exist") + return logger.debug(f"The DATA_PATH is: {DATA_PATH}") # ============================================ @@ -227,13 +229,25 @@ def bufr_to_ioda(config, logger): logger.debug(f"Executing QuerySet to get ResultSet ...") with bufr.File(DATA_PATH) as f: - t = f.execute(q) + try: + t = f.execute(q) + except Exception as err: + logger.info(f'Return t with {err}') + return with bufr.File(DATA_PATH) as f: - u = f.execute(r) + try: + u = f.execute(r) + except Exception as err: + logger.info(f'Return u with {err}') + return with bufr.File(DATA_PATH) as f: - v = f.execute(s) + try: + v = f.execute(s) + except Exception as err: + logger.info(f'Return v with {err}') + return # ADPSFC # ObsType diff --git a/ush/ioda/bufr2ioda/bufr2ioda_gnssro_bufr.py b/ush/ioda/bufr2ioda/bufr2ioda_gnssro_bufr.py index 1b256c4a8..c200ea7dc 100755 --- a/ush/ioda/bufr2ioda/bufr2ioda_gnssro_bufr.py +++ b/ush/ioda/bufr2ioda/bufr2ioda_gnssro_bufr.py @@ -80,6 +80,10 @@ def bufr_to_ioda(config, logger): bufrfile = f"{cycle_type}.t{hh}z.{bufr_data_type}.tm00.{data_format}" DATA_PATH = os.path.join(dump_dir, f"{cycle_type}.{yyyymmdd}", str(hh), 'atmos', bufrfile) + if not os.path.isfile(DATA_PATH): + logger.info(f"DATA_PATH {DATA_PATH} does not exist") + return + logger.debug(f"The DATA_PATH is: {DATA_PATH}") # ============================================ # Make the QuerySet for all the data we want @@ -156,7 +160,11 @@ def bufr_to_ioda(config, logger): logger.debug(f"Executing QuerySet to get ResultSet ...") with bufr.File(DATA_PATH) as f: - r = f.execute(q) + try: + r = f.execute(q) + except Exception as err: + logger.info(f'Return with {err}') + return logger.debug(f" ... Executing QuerySet: get MetaData: basic ...") # MetaData diff --git a/ush/ioda/bufr2ioda/bufr2ioda_gpsro_bufr_combined.py b/ush/ioda/bufr2ioda/bufr2ioda_gpsro_bufr_combined.py index f6db55893..698e5d422 100755 --- a/ush/ioda/bufr2ioda/bufr2ioda_gpsro_bufr_combined.py +++ b/ush/ioda/bufr2ioda/bufr2ioda_gpsro_bufr_combined.py @@ -78,6 +78,10 @@ def bufr_to_ioda(config, logger): bufrfile = f"{cycle_type}.t{hh}z.{data_type}.tm00.{data_format}" DATA_PATH = os.path.join(dump_dir, f"{cycle_type}.{yyyymmdd}", str(hh), 'atmos', bufrfile) + if not os.path.isfile(DATA_PATH): + logger.info(f"DATA_PATH {DATA_PATH} does not exist") + return + logger.debug(f"The DATA_PATH is: {DATA_PATH}") # ============================================ # Make the QuerySet for all the data we want @@ -148,7 +152,11 @@ def bufr_to_ioda(config, logger): logger.debug(f"Executing QuerySet to get ResultSet ...") with bufr.File(DATA_PATH) as f: - r = f.execute(q) + try: + r = f.execute(q) + except Exception as err: + logger.info(f'Return with {err}') + return logger.debug(f" ... Executing QuerySet: get MetaData: basic ...") # MetaData diff --git a/ush/ioda/bufr2ioda/bufr2ioda_satwind_amv_ahi.py b/ush/ioda/bufr2ioda/bufr2ioda_satwind_amv_ahi.py index 8380b12aa..3f897e61d 100755 --- a/ush/ioda/bufr2ioda/bufr2ioda_satwind_amv_ahi.py +++ b/ush/ioda/bufr2ioda/bufr2ioda_satwind_amv_ahi.py @@ -102,6 +102,10 @@ def bufr_to_ioda(config, logger): bufrfile = f"{cycle_type}.t{hh}z.{data_type}.tm00.{data_format}" DATA_PATH = os.path.join(dump_dir, f"{cycle_type}.{yyyymmdd}", str(hh), 'atmos', bufrfile) + if not os.path.isfile(DATA_PATH): + logger.info(f"DATA_PATH {DATA_PATH} does not exist") + return + logger.debug(f"The DATA_PATH is: {DATA_PATH}") # ============================================ # Make the QuerySet for all the data we want @@ -151,7 +155,11 @@ def bufr_to_ioda(config, logger): logger.info('Executing QuerySet to get ResultSet') with bufr.File(DATA_PATH) as f: - r = f.execute(q) + try: + r = f.execute(q) + except Exception as err: + logger.info(f'Return with {err}') + return # MetaData satid = r.get('satelliteId') diff --git a/ush/ioda/bufr2ioda/bufr2ioda_satwind_amv_goes.py b/ush/ioda/bufr2ioda/bufr2ioda_satwind_amv_goes.py index 7e1207f54..594e5f008 100755 --- a/ush/ioda/bufr2ioda/bufr2ioda_satwind_amv_goes.py +++ b/ush/ioda/bufr2ioda/bufr2ioda_satwind_amv_goes.py @@ -105,6 +105,10 @@ def bufr_to_ioda(config, logger): bufrfile = f"{cycle_type}.t{hh}z.{data_type}.tm00.{data_format}" DATA_PATH = os.path.join(dump_dir, f"{cycle_type}.{yyyymmdd}", str(hh), 'atmos', bufrfile) + if not os.path.isfile(DATA_PATH): + logger.info(f"DATA_PATH {DATA_PATH} does not exist") + return + logger.debug(f"The DATA_PATH is: {DATA_PATH}") # ============================================ # Make the QuerySet for all the data we want @@ -161,7 +165,11 @@ def bufr_to_ioda(config, logger): logger.info('Executing QuerySet to get ResultSet') with bufr.File(DATA_PATH) as f: - r = f.execute(q) + try: + r = f.execute(q) + except Exception as err: + logger.info(f'Return with {err}') + return # MetaData satid = r.get('satelliteId') diff --git a/ush/ioda/bufr2ioda/bufr2ioda_satwind_amv_seviri.py b/ush/ioda/bufr2ioda/bufr2ioda_satwind_amv_seviri.py index c28274948..dc873d962 100755 --- a/ush/ioda/bufr2ioda/bufr2ioda_satwind_amv_seviri.py +++ b/ush/ioda/bufr2ioda/bufr2ioda_satwind_amv_seviri.py @@ -102,6 +102,10 @@ def bufr_to_ioda(config, logger): bufrfile = f"{cycle_type}.t{hh}z.{data_type}.tm00.{data_format}" DATA_PATH = os.path.join(dump_dir, f"{cycle_type}.{yyyymmdd}", str(hh), 'atmos', bufrfile) + if not os.path.isfile(DATA_PATH): + logger.info(f"DATA_PATH {DATA_PATH} does not exist") + return + logger.debug(f"The DATA_PATH is: {DATA_PATH}") # ============================================ # Make the QuerySet for all the data we want @@ -150,7 +154,11 @@ def bufr_to_ioda(config, logger): logger.info('Executing QuerySet to get ResultSet') with bufr.File(DATA_PATH) as f: - r = f.execute(q) + try: + r = f.execute(q) + except Exception as err: + logger.info(f'Return with {err}') + return # MetaData satid = r.get('satelliteId') diff --git a/ush/ioda/bufr2ioda/bufr2ioda_satwind_scat.py b/ush/ioda/bufr2ioda/bufr2ioda_satwind_scat.py index abdeb6358..295a7f13f 100755 --- a/ush/ioda/bufr2ioda/bufr2ioda_satwind_scat.py +++ b/ush/ioda/bufr2ioda/bufr2ioda_satwind_scat.py @@ -78,6 +78,10 @@ def bufr_to_ioda(config, logger): bufrfile = f"{cycle_type}.t{hh}z.{data_type}.tm00.{data_format}" DATA_PATH = os.path.join(dump_dir, f"{cycle_type}.{yyyymmdd}", str(hh), 'atmos', bufrfile) + if not os.path.isfile(DATA_PATH): + logger.info(f"DATA_PATH {DATA_PATH} does not exist") + return + logger.debug(f"The DATA_PATH is: {DATA_PATH}") # ============================================ # Make the QuerySet for all the data we want @@ -117,7 +121,11 @@ def bufr_to_ioda(config, logger): logger.info('Executing QuerySet to get ResultSet') with bufr.File(DATA_PATH) as f: - r = f.execute(q) + try: + r = f.execute(q) + except Exception as err: + logger.info(f'Return with {err}') + return # MetaData satid = r.get('satelliteId') diff --git a/ush/ioda/bufr2ioda/bufr2ioda_sfcshp_prepbufr.py b/ush/ioda/bufr2ioda/bufr2ioda_sfcshp_prepbufr.py index 84aaa7a22..ef1339818 100755 --- a/ush/ioda/bufr2ioda/bufr2ioda_sfcshp_prepbufr.py +++ b/ush/ioda/bufr2ioda/bufr2ioda_sfcshp_prepbufr.py @@ -61,7 +61,9 @@ def bufr_to_ioda(config, logger): bufrfile = f"{cycle_type}.t{hh}z.{data_format}" DATA_PATH = os.path.join(dump_dir, f"{cycle_type}.{yyyymmdd}", str(hh), 'atmos', bufrfile) - + if not os.path.isfile(DATA_PATH): + logger.info(f"DATA_PATH {DATA_PATH} does not exist") + return logger.debug(f"The DATA_PATH is: {DATA_PATH}") # ============================================ @@ -113,7 +115,11 @@ def bufr_to_ioda(config, logger): logger.debug(f"Executing QuerySet to get ResultSet ...") with bufr.File(DATA_PATH) as f: - r = f.execute(q) + try: + r = f.execute(q) + except Exception as err: + logger.info(f'Return with {err}') + return logger.debug(f" ... Executing QuerySet: get metadata: basic ...") # ObsType diff --git a/ush/ioda/bufr2ioda/bufr2ioda_snocvr_bufr.py b/ush/ioda/bufr2ioda/bufr2ioda_snocvr_bufr.py index a2761faca..6cf60ef6d 100755 --- a/ush/ioda/bufr2ioda/bufr2ioda_snocvr_bufr.py +++ b/ush/ioda/bufr2ioda/bufr2ioda_snocvr_bufr.py @@ -46,7 +46,9 @@ def bufr_to_ioda(config, logger): bufrfile = f"{cycle_type}.t{hh}z.{data_type}.tm00.{data_format}" DATA_PATH = os.path.join(dump_dir, f"{cycle_type}.{yyyymmdd}", str(hh), 'atmos', bufrfile) - + if not os.path.isfile(DATA_PATH): + logger.info(f"DATA_PATH {DATA_PATH} does not exist") + return logger.debug(f"The DATA_PATH is: {DATA_PATH}") # ============================================ @@ -83,7 +85,11 @@ def bufr_to_ioda(config, logger): logger.debug(f" ... Executing QuerySet: get data ...") with bufr.File(DATA_PATH) as f: - r = f.execute(q) + try: + r = f.execute(q) + except Exception as err: + logger.info(f'Return with {err}') + return # Use the ResultSet returned to get numpy arrays of the data logger.debug(f" ... Executing QuerySet: get MetaData ...") diff --git a/ush/ioda/bufr2ioda/bufr2ioda_subpfl_argo_profiles.py b/ush/ioda/bufr2ioda/bufr2ioda_subpfl_argo_profiles.py index feb3521c9..58fe78530 100755 --- a/ush/ioda/bufr2ioda/bufr2ioda_subpfl_argo_profiles.py +++ b/ush/ioda/bufr2ioda/bufr2ioda_subpfl_argo_profiles.py @@ -19,6 +19,9 @@ from collections import namedtuple from pyioda import ioda_obs_space as ioda_ospace from wxflow import Logger +import warnings +# suppress warnings +warnings.filterwarnings('ignore') def Compute_sequenceNumber(lon): @@ -54,8 +57,11 @@ def bufr_to_ioda(config, logger): converter = 'BUFR to IODA Converter' platform_description = 'ARGO profiles from subpfl: temperature and salinity' - bufrfile = f"{cycle_type}.t{hh}z.{data_format}.tm{hh}.bufr_d" + bufrfile = f"{cycle_type}.t{hh}z.{data_format}.tm00.bufr_d" DATA_PATH = os.path.join(dump_dir, f"{cycle_type}.{yyyymmdd}", str(hh), f"atmos", bufrfile) + if not os.path.isfile(DATA_PATH): + logger.info(f"DATA_PATH {DATA_PATH} does not exist") + return logger.debug(f"{bufrfile}, {DATA_PATH}") # ========================================== @@ -97,7 +103,11 @@ def bufr_to_ioda(config, logger): start_time = time.time() logger.debug(f"Executing QuerySet to get ResultSet ...") with bufr.File(DATA_PATH) as f: - r = f.execute(q) + try: + r = f.execute(q) + except Exception as err: + logger.info(f'Return with {err}') + return # MetaData logger.debug(f" ... Executing QuerySet: get MetaData ...") @@ -301,11 +311,15 @@ def bufr_to_ioda(config, logger): if __name__ == '__main__': start_time = time.time() - config = "bufr2ioda_subpfl_argo_profiles.json" + + parser = argparse.ArgumentParser() + parser.add_argument('-c', '--config', type=str, help='Input JSON configuration', required=True) + parser.add_argument('-v', '--verbose', help='print debug logging information', + action='store_true') + args = parser.parse_args() log_level = 'DEBUG' if args.verbose else 'INFO' - logger = Logger('bufr2ioda_subpfl_argo_profiles.py', level=log_level, - colored_log=True) + logger = Logger('bufr2ioda_subpfl_argo_profiles.py', level=log_level, colored_log=True) with open(args.config, "r") as json_file: config = json.load(json_file) diff --git a/ush/ioda/bufr2ioda/bufr2ioda_subpfl_glider_profiles.py b/ush/ioda/bufr2ioda/bufr2ioda_subpfl_glider_profiles.py index a557e6cd0..44a1141da 100755 --- a/ush/ioda/bufr2ioda/bufr2ioda_subpfl_glider_profiles.py +++ b/ush/ioda/bufr2ioda/bufr2ioda_subpfl_glider_profiles.py @@ -19,6 +19,9 @@ from collections import namedtuple from pyioda import ioda_obs_space as ioda_ospace from wxflow import Logger +import warnings +# suppress warnings +warnings.filterwarnings('ignore') def Compute_sequenceNumber(lon): @@ -54,8 +57,11 @@ def bufr_to_ioda(config, logger): converter = 'BUFR to IODA Converter' platform_description = 'GLIDER profiles from subpfl: temperature and salinity' - bufrfile = f"{cycle_type}.t{hh}z.{data_format}.tm{hh}.bufr_d" + bufrfile = f"{cycle_type}.t{hh}z.{data_format}.tm00.bufr_d" DATA_PATH = os.path.join(dump_dir, f"{cycle_type}.{yyyymmdd}", str(hh), f"atmos", bufrfile) + if not os.path.isfile(DATA_PATH): + logger.info(f"DATA_PATH {DATA_PATH} does not exist") + return logger.debug(f"{bufrfile}, {DATA_PATH}") # ========================================== @@ -97,7 +103,11 @@ def bufr_to_ioda(config, logger): start_time = time.time() logger.debug(f"Executing QuerySet to get ResultSet ...") with bufr.File(DATA_PATH) as f: - r = f.execute(q) + try: + r = f.execute(q) + except Exception as err: + logger.info(f'Return with {err}') + return # MetaData logger.debug(f" ... Executing QuerySet: get MetaData ...") @@ -302,11 +312,15 @@ def bufr_to_ioda(config, logger): if __name__ == '__main__': start_time = time.time() - config = "bufr2ioda_subpfl_glider_profiles.json" + + parser = argparse.ArgumentParser() + parser.add_argument('-c', '--config', type=str, help='Input JSON configuration', required=True) + parser.add_argument('-v', '--verbose', help='print debug logging information', + action='store_true') + args = parser.parse_args() log_level = 'DEBUG' if args.verbose else 'INFO' - logger = Logger('bufr2ioda_subpfl_glider_profiles.py', level=log_level, - colored_log=True) + logger = Logger('bufr2ioda_subpfl_glider_profiles.py', level=log_level, colored_log=True) with open(args.config, "r") as json_file: config = json.load(json_file) diff --git a/ush/ioda/bufr2ioda/bufr2ioda_tesac_mammals_profiles.py b/ush/ioda/bufr2ioda/bufr2ioda_tesac_mammals_profiles.py index e5ba8b03e..088408ed1 100755 --- a/ush/ioda/bufr2ioda/bufr2ioda_tesac_mammals_profiles.py +++ b/ush/ioda/bufr2ioda/bufr2ioda_tesac_mammals_profiles.py @@ -19,6 +19,9 @@ from collections import namedtuple from pyioda import ioda_obs_space as ioda_ospace from wxflow import Logger +import warnings +# suppress warnings +warnings.filterwarnings('ignore') def Compute_sequenceNumber(lon): @@ -54,8 +57,11 @@ def bufr_to_ioda(config, logger): converter = 'BUFR to IODA Converter' platform_description = 'Profiles from TESAC: temperature and salinity' - bufrfile = f"{cycle_type}.t{hh}z.{data_format}.tm{hh}.bufr_d" + bufrfile = f"{cycle_type}.t{hh}z.{data_format}.tm00.bufr_d" DATA_PATH = os.path.join(dump_dir, f"{cycle_type}.{yyyymmdd}", str(hh), f"atmos", bufrfile) + if not os.path.isfile(DATA_PATH): + logger.info(f"DATA_PATH {DATA_PATH} does not exist") + return logger.debug(f"{bufrfile}, {DATA_PATH}") # ========================================== @@ -97,7 +103,11 @@ def bufr_to_ioda(config, logger): start_time = time.time() logger.debug(f"Executing QuerySet to get ResultSet ...") with bufr.File(DATA_PATH) as f: - r = f.execute(q) + try: + r = f.execute(q) + except Exception as err: + logger.info(f'Return with {err}') + return # MetaData logger.debug(f" ... Executing QuerySet: get MetaData ...") @@ -137,6 +147,9 @@ def bufr_to_ioda(config, logger): alpha_mask = [item.isalpha() for item in stationID] indices_true = [index for index, value in enumerate(alpha_mask) if value] + if len(indices_true) is 0: + logger.info(f"No marine mammals in {DATA_PATH}") + return # Apply index stationID = stationID[indices_true] @@ -296,11 +309,15 @@ def bufr_to_ioda(config, logger): if __name__ == '__main__': start_time = time.time() - config = "bufr2ioda_tesac_mammals_profiles.json" + + parser = argparse.ArgumentParser() + parser.add_argument('-c', '--config', type=str, help='Input JSON configuration', required=True) + parser.add_argument('-v', '--verbose', help='print debug logging information', + action='store_true') + args = parser.parse_args() log_level = 'DEBUG' if args.verbose else 'INFO' - logger = Logger('bufr2ioda_tesac_mammals_profiles.py', level=log_level, - colored_log=True) + logger = Logger('bufr2ioda_tesac_mammals_profiles.py', level=log_level, colored_log=True) with open(args.config, "r") as json_file: config = json.load(json_file) diff --git a/ush/ioda/bufr2ioda/bufr2ioda_tesac_profiles.py b/ush/ioda/bufr2ioda/bufr2ioda_tesac_profiles.py index 8896dc4b7..85968a110 100755 --- a/ush/ioda/bufr2ioda/bufr2ioda_tesac_profiles.py +++ b/ush/ioda/bufr2ioda/bufr2ioda_tesac_profiles.py @@ -19,6 +19,9 @@ from collections import namedtuple from pyioda import ioda_obs_space as ioda_ospace from wxflow import Logger +import warnings +# suppress warnings +warnings.filterwarnings('ignore') def Compute_sequenceNumber(lon): @@ -54,8 +57,11 @@ def bufr_to_ioda(config, logger): converter = 'BUFR to IODA Converter' platform_description = 'Profiles from TESAC: temperature and salinity' - bufrfile = f"{cycle_type}.t{hh}z.{data_format}.tm{hh}.bufr_d" + bufrfile = f"{cycle_type}.t{hh}z.{data_format}.tm00.bufr_d" DATA_PATH = os.path.join(dump_dir, f"{cycle_type}.{yyyymmdd}", str(hh), f"atmos", bufrfile) + if not os.path.isfile(DATA_PATH): + logger.info(f"DATA_PATH {DATA_PATH} does not exist") + return logger.debug(f"{bufrfile}, {DATA_PATH}") # ========================================== @@ -97,7 +103,11 @@ def bufr_to_ioda(config, logger): start_time = time.time() logger.debug(f"Executing QuerySet to get ResultSet ...") with bufr.File(DATA_PATH) as f: - r = f.execute(q) + try: + r = f.execute(q) + except Exception as err: + logger.info(f'Return with {err}') + return # MetaData logger.debug(f" ... Executing QuerySet: get MetaData ...") @@ -296,11 +306,15 @@ def bufr_to_ioda(config, logger): if __name__ == '__main__': start_time = time.time() - config = "bufr2ioda_tesac_profiles.json" + + parser = argparse.ArgumentParser() + parser.add_argument('-c', '--config', type=str, help='Input JSON configuration', required=True) + parser.add_argument('-v', '--verbose', help='print debug logging information', + action='store_true') + args = parser.parse_args() log_level = 'DEBUG' if args.verbose else 'INFO' - logger = Logger('bufr2ioda_tesac_profiles.py', level=log_level, - colored_log=True) + logger = Logger('bufr2ioda_tesac_profiles.py', level=log_level, colored_log=True) with open(args.config, "r") as json_file: config = json.load(json_file) diff --git a/ush/ioda/bufr2ioda/bufr2ioda_trackob_surface.py b/ush/ioda/bufr2ioda/bufr2ioda_trackob_surface.py index 86405c8e1..e6f2021c9 100755 --- a/ush/ioda/bufr2ioda/bufr2ioda_trackob_surface.py +++ b/ush/ioda/bufr2ioda/bufr2ioda_trackob_surface.py @@ -19,6 +19,9 @@ from collections import namedtuple from pyioda import ioda_obs_space as ioda_ospace from wxflow import Logger +import warnings +# suppress warnings +warnings.filterwarnings('ignore') def Compute_sequenceNumber(lon): @@ -54,8 +57,11 @@ def bufr_to_ioda(config, logger): converter = 'BUFR to IODA Converter' platform_description = 'Surface obs from TRACKOB: temperature and salinity' - bufrfile = f"{cycle_type}.t{hh}z.{data_format}.tm{hh}.bufr_d" + bufrfile = f"{cycle_type}.t{hh}z.{data_format}.tm00.bufr_d" DATA_PATH = os.path.join(dump_dir, f"{cycle_type}.{yyyymmdd}", str(hh), f"atmos", bufrfile) + if not os.path.isfile(DATA_PATH): + logger.info(f"DATA_PATH {DATA_PATH} does not exist") + return logger.debug(f"{bufrfile}, {DATA_PATH}") # ========================================== @@ -80,6 +86,7 @@ def bufr_to_ioda(config, logger): q.add('stationID', '*/RPID') q.add('latitude', '*/CLAT') q.add('longitude', '*/CLON') + q.add('depth', '*/BTOCN/DBSS') # ObsValue q.add('temp', '*/BTOCN/STMP') @@ -96,7 +103,11 @@ def bufr_to_ioda(config, logger): start_time = time.time() logger.debug(f"Executing QuerySet to get ResultSet ...") with bufr.File(DATA_PATH) as f: - r = f.execute(q) + try: + r = f.execute(q) + except Exception as err: + logger.info(f'Return with {err}') + return # MetaData logger.debug(f" ... Executing QuerySet: get MetaData ...") @@ -122,6 +133,9 @@ def bufr_to_ioda(config, logger): dateTime = dateTime[mask] rcptdateTime = rcptdateTime[mask] temp = temp[mask] + if len(temp) is 0: + logger.info(f"trackob_surface temp array is {len(temp)} after applying mask. Return.") + return saln = saln[mask] # ObsError @@ -258,11 +272,15 @@ def bufr_to_ioda(config, logger): if __name__ == '__main__': start_time = time.time() - config = "bufr2ioda_trackob_surface.json" + + parser = argparse.ArgumentParser() + parser.add_argument('-c', '--config', type=str, help='Input JSON configuration', required=True) + parser.add_argument('-v', '--verbose', help='print debug logging information', + action='store_true') + args = parser.parse_args() log_level = 'DEBUG' if args.verbose else 'INFO' - logger = Logger('bufr2ioda_trackob_surface.py', level=log_level, - colored_log=True) + logger = Logger('bufr2ioda_trackob_surface.py', level=log_level, colored_log=True) with open(args.config, "r") as json_file: config = json.load(json_file) diff --git a/ush/ioda/bufr2ioda/bufr2ioda_xbtctd_profiles.py b/ush/ioda/bufr2ioda/bufr2ioda_xbtctd_profiles.py index 68e9c0588..1ef4ee6b9 100755 --- a/ush/ioda/bufr2ioda/bufr2ioda_xbtctd_profiles.py +++ b/ush/ioda/bufr2ioda/bufr2ioda_xbtctd_profiles.py @@ -19,6 +19,9 @@ from collections import namedtuple from pyioda import ioda_obs_space as ioda_ospace from wxflow import Logger +import warnings +# suppress warnings +warnings.filterwarnings('ignore') def Compute_sequenceNumber(lon): @@ -54,8 +57,11 @@ def bufr_to_ioda(config, logger): converter = 'BUFR to IODA Converter' platform_description = 'Profiles from XBT/CTD: temperature and salinity' - bufrfile = f"{cycle_type}.t{hh}z.{data_format}.tm{hh}.bufr_d" + bufrfile = f"{cycle_type}.t{hh}z.{data_format}.tm00.bufr_d" DATA_PATH = os.path.join(dump_dir, f"{cycle_type}.{yyyymmdd}", str(hh), f"atmos", bufrfile) + if not os.path.isfile(DATA_PATH): + logger.info(f"DATA_PATH {DATA_PATH} does not exist") + return logger.debug(f"{bufrfile}, {DATA_PATH}") # ========================================== @@ -97,7 +103,11 @@ def bufr_to_ioda(config, logger): start_time = time.time() logger.debug(f"Executing QuerySet to get ResultSet ...") with bufr.File(DATA_PATH) as f: - r = f.execute(q) + try: + r = f.execute(q) + except Exception as err: + logger.info(f'Return with {err}') + return # MetaData logger.debug(f" ... Executing QuerySet: get MetaData ...") @@ -277,11 +287,15 @@ def bufr_to_ioda(config, logger): if __name__ == '__main__': start_time = time.time() - config = "bufr2ioda_xbtctd_profiles.json" + + parser = argparse.ArgumentParser() + parser.add_argument('-c', '--config', type=str, help='Input JSON configuration', required=True) + parser.add_argument('-v', '--verbose', help='print debug logging information', + action='store_true') + args = parser.parse_args() log_level = 'DEBUG' if args.verbose else 'INFO' - logger = Logger('bufr2ioda_xbtctd_profiles.py', level=log_level, - colored_log=True) + logger = Logger('bufr2ioda_xbtctd_profiles.py', level=log_level, colored_log=True) with open(args.config, "r") as json_file: config = json.load(json_file)