diff --git a/.github/workflows/tier1_application_discover.yml b/.github/workflows/tier1_application_discover.yml index 1546ef11..350a2b9f 100644 --- a/.github/workflows/tier1_application_discover.yml +++ b/.github/workflows/tier1_application_discover.yml @@ -8,5 +8,5 @@ defaults: shell: bash jobs: - run-discover-nightly: - uses: GEOS-ESM/CI-workflows/.github/workflows/swell-discover-nightly.yml@main + run-tier1-apps-discover: + uses: GEOS-ESM/CI-workflows/.github/workflows/swell-tier1_application_discover.yml@feature/ufo_tests diff --git a/.github/workflows/tier2_application_discover.yml b/.github/workflows/tier2_application_discover.yml index 67e92091..979cd877 100644 --- a/.github/workflows/tier2_application_discover.yml +++ b/.github/workflows/tier2_application_discover.yml @@ -12,5 +12,5 @@ defaults: shell: bash jobs: - run-discover-nightly: - uses: GEOS-ESM/CI-workflows/.github/workflows/swell-discover-nightly.yml@main + run-tier2-apps-discover: + uses: GEOS-ESM/CI-workflows/.github/workflows/swell-tier2_application_discover.yml@feature/ufo_tests diff --git a/.gitignore b/.gitignore index 696f8829..18643848 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # System files *.swp *DS_Store* +._* # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/README.md b/README.md index ced5ac67..5fb5ed9a 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ ### Licence: -(C) Copyright 2021-2022 United States Government as represented by the Administrator of the National +(C) Copyright 2021- United States Government as represented by the Administrator of the National Aeronautics and Space Administration. All Rights Reserved. [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) diff --git a/requirements-standalone.txt b/requirements-standalone.txt new file mode 100644 index 00000000..bcaaa59a --- /dev/null +++ b/requirements-standalone.txt @@ -0,0 +1,12 @@ +click>=8.1.5 +jinja2>=3.1.2 +pyyaml>=6.0 +pycodestyle>=2.10.0 +pandas>=1.4.0 +isodate>=0.5.4 +f90nml>=1.4.3 +questionary>=1.10.0 +flake8>=6.0.0 +netCDF4 +xarray +matplotlib diff --git a/requirements.txt b/requirements.txt index f2633164..ef64ba0a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ click>=8.1.5 jinja2>=3.1.2 pyyaml>=6.0 -pycodestyle>=2.8.0 +pycodestyle==2.8.0 pandas>=1.4.0 isodate>=0.5.4 f90nml>=1.4.3 diff --git a/src/swell/__init__.py b/src/swell/__init__.py index b8651c71..e1371654 100644 --- a/src/swell/__init__.py +++ b/src/swell/__init__.py @@ -9,4 +9,4 @@ repo_directory = os.path.dirname(__file__) # Set the version for swell -__version__ = '1.5.0' +__version__ = '1.6.0' diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/model/analysis.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/model/analysis.yaml new file mode 100644 index 00000000..1fce43da --- /dev/null +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/model/analysis.yaml @@ -0,0 +1,6 @@ +filetype: cube sphere history +provider: geos +datapath: '{{cycle_dir}}' +filename: '{{experiment_id}}.analysis.%yyyy%mm%dd_%hh%MM%ssz.nc4' +first: PT0H +frequency: PT1H diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/model/background.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/model/background.yaml index 4d10032f..b85df25a 100755 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/model/background.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/model/background.yaml @@ -4,7 +4,7 @@ provider: geos datapath: '' filenames: ['{{cycle_dir}}/bkg.%yyyy%mm%ddT%hh%MM%ssZ.nc4', '{{experiment_root}}/{{experiment_id}}/stage/fv3-jedi/geos_atmosphere/bkg/geos.crtmsrf.{{horizontal_resolution}}.nc4'] -state variables: [u,v,ua,va,t,delp,q,qi,ql,qr,qs,o3ppmv,phis, +state variables: [u,v,ua,va,t,delp,ps,q,qi,ql,qr,qs,o3ppmv,phis, qls,qcn,cfcn,frocean,frland,varflt,ustar,bstar, zpbl,cm,ct,cq,kcbl,tsm,khl,khu,frlake,frseaice,vtype, stype,vfrac,sheleg,ts,soilt,soilm,u10m,v10m] diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/model/background_error.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/model/background_error.yaml new file mode 100644 index 00000000..fe2f0b7e --- /dev/null +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/model/background_error.yaml @@ -0,0 +1,28 @@ +covariance model: SABER +saber central block: + saber block name: gsi covariance + read: + gsi akbk: '{{experiment_root}}/{{experiment_id}}/stage/fv3-jedi/geos_atmosphere/fv3files/akbk{{vertical_resolution}}.nc4' + gsi error covariance file: '{{experiment_root}}/{{experiment_id}}/stage/fv3-jedi/geos_atmosphere/gsibec/gsibec_coefficients_c{{horizontal_resolution}}.nc4' + gsi berror namelist file: '{{experiment_root}}/{{experiment_id}}/stage/fv3-jedi/geos_atmosphere/gsibec/gsibec_configuration_c{{horizontal_resolution}}.nml' + processor layout x direction: {{gsibec_npx_proc}} + processor layout y direction: {{gsibec_npy_proc}} + debugging mode: false +saber outer blocks: +- saber block name: gsi interpolation to model grid + state variables to inverse: &bvars [eastward_wind,northward_wind,air_temperature,surface_pressure, + specific_humidity,cloud_liquid_ice,cloud_liquid_water, + mole_fraction_of_ozone_in_air, + skin_temperature, + fraction_of_ocean,fraction_of_lake,fraction_of_ice, + sfc_geopotential_height_times_grav] + gsi akbk: '{{experiment_root}}/{{experiment_id}}/stage/fv3-jedi/geos_atmosphere/fv3files/akbk{{vertical_resolution}}.nc4' + gsi error covariance file: '{{experiment_root}}/{{experiment_id}}/stage/fv3-jedi/geos_atmosphere/gsibec/gsibec_coefficients_c{{horizontal_resolution}}.nc4' + gsi berror namelist file: '{{experiment_root}}/{{experiment_id}}/stage/fv3-jedi/geos_atmosphere/gsibec/gsibec_configuration_c{{horizontal_resolution}}.nml' + processor layout x direction: {{gsibec_npx_proc}} + processor layout y direction: {{gsibec_npy_proc}} + debugging mode: false +linear variable change: + linear variable change name: Control2Analysis + input variables: *bvars + output variables: {{analysis_variables}} diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/model/geometry_inner.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/model/geometry_inner.yaml new file mode 100755 index 00000000..3116dada --- /dev/null +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/model/geometry_inner.yaml @@ -0,0 +1,9 @@ +fms initialization: + namelist filename: '{{experiment_root}}/{{experiment_id}}/stage/fv3-jedi/geos_atmosphere/fv3files/fmsmpp.nml' + field table filename: '{{experiment_root}}/{{experiment_id}}/stage/fv3-jedi/geos_atmosphere/fv3files/field_table_gmao' +akbk: '{{experiment_root}}/{{experiment_id}}/stage/fv3-jedi/geos_atmosphere/fv3files/akbk{{vertical_resolution}}.nc4' +layout: [{{npx_proc}},{{npy_proc}}] +npx: {{horizontal_resolution}} +npy: {{horizontal_resolution}} +npz: {{vertical_resolution}} +field metadata override: '{{experiment_root}}/{{experiment_id}}/stage/fv3-jedi/geos_atmosphere/fieldmetadata/geos.yaml' diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/model/pseudo-model.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/model/pseudo-model.yaml index 075af1c1..b74aa294 100755 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/model/pseudo-model.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/model/pseudo-model.yaml @@ -5,6 +5,3 @@ provider: geos datapath: '' filenames: ['{{cycle_dir}}/bkg.%yyyy%mm%ddT%hh%MM%ssZ.nc4', '{{experiment_root}}/{{experiment_id}}/stage/fv3-jedi/geos_atmosphere/bkg/geos.crtmsrf.{{horizontal_resolution}}.nc4'] -model variables: [u,v,ua,va,t,delp,q,qi,ql,qr,qs,o3ppmv,phis,qls,qcn,cfcn,frocean,frland,varflt,ustar, - bstar,zpbl,cm,ct,cq,kcbl,tsm,khl,khu,frlake,frseaice,vtype,stype,vfrac,sheleg, - ts,soilt,soilm,u10m,v10m] diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/model/stage.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/model/stage.yaml index efc0957e..70c9f00d 100755 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/model/stage.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/model/stage.yaml @@ -3,3 +3,5 @@ - ['{{swell_static_files}}/jedi/interfaces/geos_atmosphere/GEOS_CRTM_Surface/geos.crtmsrf.{{horizontal_resolution}}.nc4', '{{experiment_root}}/{{experiment_id}}/stage/fv3-jedi/geos_atmosphere/bkg/'] - ['{{experiment_root}}/{{experiment_id}}/jedi_bundle/source/fv3-jedi/test/Data/fieldmetadata/*', '{{experiment_root}}/{{experiment_id}}/stage/fv3-jedi/geos_atmosphere/fieldmetadata/'] - ['{{experiment_root}}/{{experiment_id}}/jedi_bundle/source/fv3-jedi/test/Data/fv3files/*', '{{experiment_root}}/{{experiment_id}}/stage/fv3-jedi/geos_atmosphere/fv3files/'] + - ['{{swell_static_files}}/jedi/interfaces/geos_atmosphere/gsibec/gsibec_coefficients_c{{horizontal_resolution}}.nc4', '{{experiment_root}}/{{experiment_id}}/stage/fv3-jedi/geos_atmosphere/gsibec/'] + - ['{{swell_static_files}}/jedi/interfaces/geos_atmosphere/gsibec/gsibec_configuration_c{{horizontal_resolution}}.nml', '{{experiment_root}}/{{experiment_id}}/stage/fv3-jedi/geos_atmosphere/gsibec/'] diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/aircraft.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/aircraft.yaml index 38971ea5..fd3721e2 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/aircraft.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/aircraft.yaml @@ -1,6 +1,9 @@ + obs operator: name: VertInterp observation alias file: '{{experiment_root}}/{{experiment_id}}/configuration/jedi/interfaces/{{model_component}}/observations/obsop_name_map.yaml' + apply near surface wind scaling: true + obs space: name: Aircraft obsdatain: @@ -8,397 +11,566 @@ obs space: type: H5File obsfile: '{{cycle_dir}}/aircraft.{{window_begin}}.nc4' obsgrouping: - group variables: ["stationIdentification"] + group variables: ["stationIdentification", "releaseTime"] sort variable: "pressure" sort order: "descending" obsdataout: engine: type: H5File obsfile: '{{cycle_dir}}/{{experiment_id}}.aircraft.{{window_begin}}.nc4' - simulated variables: [windEastward, windNorthward, airTemperature] -#obs filters: -##-------------------------------------------------------------------------------------------------------------------- -## WINDS -##-------------------------------------------------------------------------------------------------------------------- -## -## Begin by assigning all ObsError to a constant value. These will get overwritten (as needed) for specific types. -#- filter: BlackList -# 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: BlackList -# 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: BlackList -# 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: BlackList -# 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 -## -## Assign the initial ObsError, based on height/pressure for RECON aircraft -#- filter: Bounds Check -# filter variables: -# - name: windEastward -# - name: windNorthward -# minvalue: -135 -# maxvalue: 135 -# 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 all obs with PreQC mark already set above 3 -#- filter: PreQC -# maxvalue: 3 -# action: -# name: reject -## -## Observation Range Sanity Check: either wind component or velocity exceeds 135 m/s -#- filter: Bounds Check -# filter variables: -# - name: windEastward -# - name: windNorthward -# minvalue: -135 -# maxvalue: 135 -# action: -# name: reject -#- filter: Bounds Check -# filter variables: -# - name: windEastward -# - name: windNorthward -# test variables: -# - name: ObsFunction/Velocity -# maxvalue: 135.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 when difference of wind direction is more than 50 degrees. -#- filter: Bounds Check -# filter variables: -# - name: windEastward -# - name: windNorthward -# test variables: -# - name: ObsFunction/WindDirAngleDiff -# maxvalue: 50.0 -# action: -# name: reject -## -## When multiple obs exist within a single vertical model level, inflate ObsError -#- filter: BlackList -# filter variables: -# - name: windEastward -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# test QCflag: PreQC -# inflate variables: [eastward_wind] -# pressure: MetaData/pressure -# defer to post: true -## -#- filter: BlackList -# filter variables: -# - name: windNorthward -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# test QCflag: PreQC -# inflate variables: [northward_wind] -# pressure: MetaData/pressure -# defer to post: true -## -## If background check is largely different than obs, inflate ObsError -#- filter: Background Check -# filter variables: -# - name: windEastward -# - name: windNorthward -# absolute threshold: 7.5 -# action: -# name: inflate error -# inflation factor: 3.0 -# defer to post: true -## -#- filter: Bounds Check -# filter variables: -# - name: windEastward -# action: -# name: reject -# maxvalue: 7.0 -# test variables: -# - name: ObsFunction/ObsErrorFactorQuotient -# options: -# numerator: -# name: ObsErrorData/windEastward # After inflation step -# denominator: -# name: ObsError/windEastward -# defer to post: true -## -## If ObsError inflation factor is larger than threshold, reject obs -#- filter: Bounds Check -# filter variables: -# - name: windNorthward -# action: -# name: reject -# maxvalue: 7.0 -# test variables: -# - name: ObsFunction/ObsErrorFactorQuotient -# options: -# numerator: -# name: ObsErrorData/windNorthward # After inflation step -# denominator: -# name: ObsError/windNorthward -# defer to post: true -##-------------------------------------------------------------------------------------------------------------------- -## TEMPERATURE -##-------------------------------------------------------------------------------------------------------------------- -## -## Begin by assigning all ObsError to a constant value. These will get overwritten for specific types. -#- filter: BlackList -# 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: Bounds Check -# filter variables: -# - name: airTemperature -# minvalue: 195 -# maxvalue: 327 -# 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: Bounds Check -# filter variables: -# - name: airTemperature -# minvalue: 195 -# maxvalue: 327 -# 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: Bounds Check -# filter variables: -# - name: airTemperature -# minvalue: 195 -# maxvalue: 327 -# 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 -## -## Observation Range Sanity Check -#- filter: Bounds Check -# filter variables: -# - name: airTemperature -# minvalue: 195 -# maxvalue: 327 -# action: -# name: reject -## -## Reject all obs with PreQC mark already set above 3 -#- filter: PreQC -# maxvalue: 3 -# action: -# name: reject -## -## When multiple obs exist within a single vertical model level, inflate ObsError -#- filter: BlackList -# filter variables: -# - name: airTemperature -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -## test QCflag: PreQC -# inflate variables: [air_temperature] -# pressure: MetaData/pressure -# defer to post: true -## -## If background check is largely different than obs, inflate ObsError -#- filter: Background Check -# filter variables: -# - name: airTemperature -# absolute threshold: 4.0 -# action: -# name: inflate error -# inflation factor: 3.0 -# defer to post: true -## -## If ObsError inflation factor is larger than threshold, reject obs -#- filter: Bounds Check -# filter variables: -# - name: airTemperature -# action: -# name: reject -# maxvalue: 7.0 -# test variables: -# - name: ObsFunction/ObsErrorFactorQuotient -# options: -# numerator: -# name: ObsErrorData/airTemperature # After inflation step -# denominator: -# name: ObsError/airTemperature -# defer to post: true -# #-------------------------------------------------------------------------------------------------------------------- -# # MOISTURE -# #-------------------------------------------------------------------------------------------------------------------- -# # -# # Assign the initial observation error, based on height/pressure ONLY MDCRS -# - filter: Bounds Check -# filter variables: -# - name: specificHumidity -# minvalue: 1.0E-7 -# maxvalue: 0.34999999 -# 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: specific_humidity@ObsValue -# where: -# - variable: -# name: ObsType/specificHumidity -# is_in: 133 -# # -# # Observation Range Sanity Check -# - filter: Bounds Check -# filter variables: -# - name: specificHumidity -# minvalue: 1.0E-7 -# maxvalue: 0.34999999 -# action: -# name: reject -# # -# # Reject all obs with PreQC mark already set above 3 -# - filter: PreQC -# maxvalue: 3 -# action: -# name: reject -# # -# # When multiple obs exist within a single vertical model level, inflate ObsError -# - filter: BlackList -# filter variables: -# - name: specificHumidity -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# test QCflag: PreQC -# inflate variables: [specific_humidity] -# pressure: MetaData/pressure -# defer to post: true -# # -# # If ObsError inflation factor is larger than threshold, reject obs -# - filter: Bounds Check -# filter variables: -# - name: specificHumidity -# action: -# name: reject -# maxvalue: 8.0 -# test variables: -# - name: ObsFunction/ObsErrorFactorQuotient -# options: -# numerator: -# name: ObsErrorData/specificHumidity # After inflation step -# denominator: -# name: ObsError/specificHumidity -# defer to post: true + simulated variables: [airTemperature, windEastward, windNorthward] + +obs filters: + +# airTemperature +# -------------- + +# Reject all obs with PreQC mark already set above 3 - checked, GMAO has noiqc=false so QC limit=4 +# Input prepbufr without OIQC would not have QC marks 4-7 though ("global" assignment of obs error) +- filter: Perform Action + filter variables: + - name: airTemperature + action: + name: assign error + error parameter: 2.0 + +# 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: [105000, 100000, 95000, 90000, 85000, 70000, 65000, 60000, 40000, 35000, 30000, 25000, 20000, 5000] + errors: [1.5, 1.3, 1.1, 0.9, 0.8, 0.8, 0.75, 0.7, 0.7, 0.75, 0.85, 1.3, 1.5, 1.5] + where: + - variable: + name: ObsType/airTemperature + is_in: 132 + +# Assign the initial observation error, based on pressure (for TAMDAR itype=134) +- 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, 60000, 40000] + errors: [1.5, 1.35, 1.25, 1.10, 1.0, 1.3, 1.7] + where: + - variable: + name: ObsType/airTemperature + is_in: 134 + +# Assign the initial observation error, based on pressure (for Canadian AMDAR itype=135) +- 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, 1000000000.0 ] + where: + - variable: + name: ObsType/airTemperature + is_in: 135 + +# 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] + pressure: MetaData/pressure + distance threshold: 60000.0 + defer to post: true + +- filter: Perform Action + filter variables: + - name: airTemperature + where: + - variable: PreQC/airTemperature + is_in: 4-15 + action: + name: passivate + defer to post: true + +# TAMDAR and Canadian AMDAR are passive in GSI +- filter: Perform Action + filter variables: + - name: airTemperature + where: + - variable: + name: ObsType/airTemperature + is_in: 134, 135 + action: + name: passivate + defer to post: true + +# Inflate kx130 error for obs below 500 if (aircraft_t_bc .and. kx==130 .and. ppb>=500.0_r_kind) +# toe=toe*r10 +- filter: Perform Action + action: + name: inflate error + inflation factor: 10. + filter variables: + - name: airTemperature + where: + - variable: + name: MetaData/pressure + maxvalue: 110000 + minvalue: 50000 + - variable: + name: ObsType/airTemperature + is_in: 130 + defer to post: true + +# A temporary solution: Replace error by GsiAdjustObsError overwrite above error assignments and +# inflation. +- filter: Perform Action + filter variables: + - name: airTemperature + action: + name: assign error + error function: GsiAdjustObsError/airTemperature + where: + - variable: + name: GsiAdjustObsError/airTemperature + is_defined: + defer to post: true + +# error inflation based on pressure check +- filter: Perform Action + filter variables: + - name: airTemperature + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: airTemperature + inflation factor: 8.0 + surface_obs: false + adjusted_error_name: GsiAdjustObsError + defer to post: true + +# assign TempObsErrorData/airTemperature <--- ObsErrorData before changing its Min and Max +- filter: Variable Assignment + assignments: + - name: TempObsErrorData/airTemperature + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/airTemperature + defer to post: true + +# set ObsErrorData 1.3 K if it < 1.3 K +- filter: Perform Action + filter variables: + - name: airTemperature + action: + name: assign error + error parameter: 1.3 + where: + - variable: + name: TempObsErrorData/airTemperature + maxvalue: 1.3 + - variable: + name: TempObsErrorData/airTemperature + is_defined: + defer to post: true + +# set ObsErrorData 5.6 K if it > 5.6 K. +- filter: Perform Action + filter variables: + - name: airTemperature + action: + name: assign error + error parameter: 5.6 + where: + - variable: + name: TempObsErrorData/airTemperature + minvalue: 5.6 + - variable: + name: TempObsErrorData/airTemperature + is_defined: + defer to post: true + +# Screen data by PreUseFlag. PreUseFlag is assigned in reading programs in GSI. +- filter: Perform Action + filter variables: + - name: airTemperature + where: + - variable: PreUseFlag/airTemperature + # PreUseFlag should =< ijter ( # of outloop(0,1,2) + 1) in GSI + minvalue: 1 + action: + name: reject + +# Background check +# ratio threshold 7.0 +- filter: Background Check + filter variables: + - name: airTemperature + threshold: 7.0 + action: + name: reject + where: + - variable: PreQC/airTemperature + is_not_in: [3] + defer to post: true + +# ratio threshold * 0.7 if PreQC=3 +- filter: Background Check + filter variables: + - name: airTemperature + threshold: 4.9 + action: + name: reject + where: + - variable: PreQC/airTemperature + is_in: [3] + defer to post: true + +# Re-assign error ObsErrorData/airTemperature <--- TempObsErrorData/airTemperature +- filter: Perform Action + filter variables: + - name: airTemperature + action: + name: assign error + error function: TempObsErrorData/airTemperature + where: + - variable: + name: TempObsErrorData/airTemperature + is_defined: + defer to post: true + +## Duplicate factor +- filter: Perform Action + filter variables: + - name: airTemperature + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorDuplicateCheck + options: + use_air_pressure: true + variable: airTemperature + defer to post: true + +# Note: have not implemented error inflation for new tail. One tail 'RPXTOZBA' had uninitialized +# errors and its error was inflated by a factor of 1.2 + + +# Eastward and northward wind +# --------------------------- + +# Reject all obs with PreQC mark already set above 3 - checked, GMAO has noiqc=false so QC limit=4 +# Input prepbufr without OIQC would not have QC marks 4-7 though +- filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: PreQC/windEastward + is_in: 4-15 + action: + name: passivate + defer to post: true + +- filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: + name: ObsType/windEastward + is_in: 234, 235 + action: + name: passivate + defer to post: true + +# Begin by assigning all ObsError as a function of pressure. These will get overwritten (as needed) +# for specific types. (this is a little strange, but whatever?) +- 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 intial ObsError specific to AIREP/ACARS +- filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + action: + name: assign error + error parameter: 3.6 + 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 + 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 + where: + - variable: + name: ObsType/windEastward + is_in: 233 + +# Assign intial ObsError specific to TAMDAR, Canadian AMDAR +- filter: Perform Action + filter variables: + - name: windEastward + - name: windNorthward + action: + name: assign error + error parameter: 3.0 + where: + - variable: + name: ObsType/windEastward + is_in: 234, 235 + +# 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: ObsErrorModelStepwiseLinear@ObsFunction + options: + xvar: + name: MetaData/pressure + xvals: [80000, 75000, 70000, 65000, 60000, 55000, 50000, 45000, 40000, 35000, 30000, 25000, 4000, 3000, 2000, 1000, 500] + errors: [1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.2, 2.3, 2.3, 2.4, 2.4, 2.5, 2.7, 2.9, 3.1] + where: + - variable: + name: ObsType/windEastward + is_in: 232 + +# 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] + pressure: MetaData/pressure + distance threshold: 60000.0 + 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] + pressure: MetaData/pressure + distance threshold: 60000.0 + defer to post: true + +# A temporary solution: Replace error by GsiAdjustObsError overwrite above error assignments and +# inflation. +- filter: Perform Action + filter variables: + - name: windEastward + action: + name: assign error + error function: GsiAdjustObsError/windEastward + where: + - variable: + name: GsiAdjustObsError/windEastward + is_defined: + defer to post: true + +- filter: Perform Action + filter variables: + - name: windNorthward + action: + name: assign error + error function: GsiAdjustObsError/windNorthward + where: + - variable: + name: GsiAdjustObsError/windNorthward + is_defined: + defer to post: true + +# Error inflation based on pressure check +- filter: Perform Action + filter variables: + - name: windEastward + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windEastward + inflation factor: 4.0 + surface_obs: false + adjusted_error_name: GsiAdjustObsError + defer to post: true + +# Error inflation based on pressure check +- filter: Perform Action + filter variables: + - name: windNorthward + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windNorthward + inflation factor: 4.0 + surface_obs: false + adjusted_error_name: GsiAdjustObsError + defer to post: true + + # Gross Check +- filter: Background Check + filter variables: + - name: windEastward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 230, 231, 232, 233, 234, 235 ] + cgross: [ 6.0, 6.5, 7.0, 7.5, 7.5, 7.5 ] + error_min: [ 1.4, 1.4, 1.4, 1.4, 1.4, 1.4 ] + error_max: [ 6.1, 6.1, 6.1, 6.1, 6.1, 6.1 ] + variable: windEastward + action: + name: reject + defer to post: true + + # Gross Check +- filter: Background Check + filter variables: + - name: windNorthward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 230, 231, 232, 233, 234, 235 ] + cgross: [ 6.0, 6.5, 7.0, 7.5, 7.5, 7.5 ] + error_min: [ 1.4, 1.4, 1.4, 1.4, 1.4, 1.4 ] + error_max: [ 6.1, 6.1, 6.1, 6.1, 6.1, 6.1 ] + variable: windNorthward + action: + name: reject + defer to post: true + +# Duplicate factor +- filter: Perform Action + filter variables: + - name: windEastward + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorDuplicateCheck + options: + use_air_pressure: true + variable: windEastward + defer to post: true + +- filter: Perform Action + filter variables: + - name: windNorthward + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorDuplicateCheck + options: + use_air_pressure: true + variable: windNorthward + defer to post: true diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/airs_aqua.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/airs_aqua.yaml index 35ded4fe..b72873e9 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/airs_aqua.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/airs_aqua.yaml @@ -1,5 +1,14 @@ +obs operator: + name: CRTM + Absorbers: [H2O,O3,CO2] + linear obs operator: + Absorbers: [H2O,O3,CO2] + obs options: + Sensor_ID: &Sensor_ID airs_aqua + EndianType: little_endian + CoefficientPath: '{{crtm_coeff_dir}}' obs space: - name: airs_aqua + name: *Sensor_ID obsdatain: engine: type: H5File @@ -31,13 +40,6 @@ obs space: 2122, 2123, 2128, 2134, 2141, 2145, 2149, 2153, 2164, 2189, 2197, 2209, 2226, 2234, 2280, 2318, 2321, 2325, 2328, 2333, 2339, 2348, 2353, 2355, 2357, 2363, 2370, 2371, 2377 -obs operator: - name: CRTM - Absorbers: [H2O,O3,CO2] - obs options: - Sensor_ID: &Sensor_ID airs_aqua - EndianType: little_endian - CoefficientPath: '{{crtm_coeff_dir}}' obs bias: input file: '{{cycle_dir}}/airs_aqua.{{background_time}}.satbias.nc4' variational bc: @@ -57,6 +59,41 @@ obs bias: order: 2 - name: scan_angle obs filters: +- filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *airs_aqua_channels + action: + name: assign error + error parameter vector: [ 1.2000, 1.2000, 1.3136, 1.4000, 1.4000, 1.2639, 1.4000, 1.4000, 1.1802, 1.2517, + 1.1719, 1.2000, 1.1728, 1.1442, 1.2000, 1.2000, 1.1500, 1.0801, 1.1500, 1.1500, + 1.0396, 1.1500, 1.1500, 1.1500, 1.1500, 1.1500, 1.1500, 1.1500, 0.9946, 1.0500, + 0.9217, 2.0000, 2.0000, 2.0000, 2.0000, 2.0000, 2.0000, 2.0000, 2.0000, 2.0000, + 2.0000, 2.0000, 2.0000, 0.9591, 0.9465, 0.9593, 0.9337, 1.0000, 0.9861, 1.0017, + 1.1000, 1.0083, 1.0024, 1.1000, 0.9967, 1.0094, 0.9412, 1.1000, 0.9980, 0.9807, + 0.8570, 0.8727, 0.8114, 0.8790, 0.8710, 0.8853, 0.7937, 0.8243, 0.8000, 0.8016, + 0.8000, 0.7781, 0.7475, 0.8500, 0.7405, 0.7150, 0.7416, 0.7465, 0.9000, 0.7198, + 0.7157, 0.9000, 0.7270, 0.7246, 0.7040, 0.7039, 0.6600, 0.6694, 0.6669, 0.7031, + 0.6977, 0.6488, 0.6653, 0.9000, 0.6265, 0.6220, 0.6308, 0.6297, 0.6210, 0.6225, + 0.6229, 0.6234, 0.6238, 0.6332, 0.6425, 0.7028, 0.6152, 0.9000, 0.7257, 0.7288, + 1.1500, 0.9000, 0.6673, 0.7473, 0.6767, 0.7056, 0.9000, 0.9500, 0.7271, 0.9500, + 0.7250, 0.7601, 0.6973, 0.7573, 0.6011, 0.6060, 0.9000, 0.6635, 0.5860, 0.5766, + 0.7500, 2.0386, 0.7500, 1.0000, 0.9000, 0.9000, 0.9000, 0.9000, 0.9000, 0.9000, + 1.0000, 1.3386, 1.0000, 1.0000, 0.8500, 0.9500, 1.7386, 0.9500, 0.9000, 0.8000, + 1.7386, 0.7500, 0.7500, 0.7500, 0.8000, 0.7500, 0.8000, 0.9000, 0.7500, 0.8000, + 0.8000, 1.1000, 0.7500, 1.1000, 0.7500, 0.5991, 0.5348, 0.6541, 0.7421, 0.6192, + 0.8186, 1.0616, 0.8848, 1.0240, 2.5000, 1.0249, 1.0795, 1.2199, 2.5000, 2.5000, + 1.3103, 1.3603, 2.5000, 2.5000, 2.5000, 1.3230, 2.5000, 2.5000, 2.5000, 1.4406, + 2.5000, 2.5000, 1.3965, 2.5000, 2.5000, 2.5000, 2.5000, 2.5000, 2.5000, 2.5000, + 2.5000, 1.6997, 2.5000, 2.5000, 2.5000, 2.5000, 2.5000, 1.6264, 2.5000, 2.5000, + 2.5000, 1.3436, 2.5000, 2.5000, 0.5727, 0.6838, 0.5994, 0.5178, 0.5145, 0.5470, + 0.5572, 0.5002, 0.4974, 0.5500, 0.4953, 0.4883, 0.4948, 0.5446, 0.5777, 1.5000, + 1.5000, 3.0000, 3.0000, 2.5000, 2.5000, 2.0000, 1.0000, 1.5000, 1.5000, 1.8000, + 0.6000, 0.7000, 0.6500, 0.6750, 0.7000, 0.7500, 0.7750, 0.8000, 0.8000, 0.8500, + 0.8500, 0.8500, 0.7000, 0.7000, 0.7000, 0.7000, 0.7000, 0.7000, 0.7000, 0.7250, + 0.7500, 0.7750, 0.8000, 0.8250, 0.8000, 0.8000, 0.8000, 0.7500, 0.8000, 0.8000, + 0.8000, 0.8000, 0.8000, 0.8500, 0.8000, 0.8000, 2.5000, 0.7500, 0.7500, 0.7500, + 0.7500 ] # Wavenumber Check - filter: BlackList filter variables: @@ -90,7 +127,7 @@ obs filters: - name: brightnessTemperature channels: *airs_aqua_channels minvalue: 50.00001 - maxvalue: 449.99999 + maxvalue: 549.99999 action: name: reject # Topography Check @@ -128,64 +165,64 @@ obs filters: channels: *airs_aqua_channels options: channels: *airs_aqua_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 ] - 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 ] + use_flag: &useflag_airs_aqua [ -1, -1, 1, -1, -1, 1, -1, -1, 1, 1, + 1, -1, 1, 1, -1, -1, -1, 1, -1, -1, + 1, -1, -1, -1, -1, -1, -1, -1, 1, -1, + 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 1, 1, 1, 1, -1, 1, 1, + -1, 1, 1, -1, 1, 1, 1, -1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, + -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, + 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, + -1, -1, 1, 1, 1, 1, -1, -1, 1, -1, + 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, + -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1, -1, -1, -1, -1, 1, -1, -1, -1, + 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, -1, 1, 1, 1, -1, -1, + 1, 1, -1, -1, -1, 1, -1, -1, -1, 1, + -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, + -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, + -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, -1, 1, 1, 1, 1, 1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -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: &clddet_airs_aqua [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1,31, 1,31, 1, 1, 1, 1, 1, 1, + 1,31, 1, 1, 1, 1,31, 1, 1, 1, + 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 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: @@ -200,35 +237,7 @@ obs filters: channels: *airs_aqua_channels options: channels: *airs_aqua_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 ] + use_flag: *useflag_airs_aqua 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 @@ -268,35 +277,51 @@ obs filters: channels: *airs_aqua_channels options: channels: *airs_aqua_channels - obserr_bound_max: [ 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, - 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, - 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, - 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, - 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, - 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, - 3.5, 3.5, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, - 3.0, 3.0, 3.0, 3.0, 3.5, 3.5, 3.5, 3.0, 3.0, 3.5, - 3.5, 3.0, 3.0, 3.0, 3.5, 3.0, 3.0, 3.0, 3.0, 3.0, - 3.5, 3.0, 3.5, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, - 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, - 3.5, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, - 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, - 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, - 3.5, 3.5, 3.5, 3.5, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, - 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, - 3.0, 3.5, 3.0, 3.5, 3.0, 3.0, 3.0, 3.0, 3.5, 3.0, - 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, - 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, - 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, - 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, - 4.5, 4.5, 4.5, 4.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, - 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 3.5, - 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, - 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, - 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, - 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, - 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, - 3.0 ] + obserr_bound_max: [3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, + 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, + 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, + 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, + 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, + 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, + 3.50, 3.50, 3.00, 3.00, 3.00, 3.00, 1.00, 1.00, 3.00, 1.00, + 3.00, 1.00, 1.00, 3.00, 1.00, 1.00, 1.00, 1.00, 3.00, 1.00, + 1.00, 3.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 3.00, 3.00, + 3.50, 3.00, 3.50, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, + 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, + 3.50, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, + 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, + 3.00, 1.70, 3.00, 1.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, + 3.50, 1.25, 3.50, 3.50, 3.00, 3.00, 1.50, 3.00, 3.00, 3.00, + 1.50, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, + 3.00, 3.50, 3.00, 3.50, 3.00, 3.00, 3.00, 3.00, 3.50, 3.00, + 4.50, 4.50, 4.50, 4.50, 4.50, 4.50, 4.50, 4.50, 4.50, 4.50, + 4.50, 4.50, 4.50, 4.50, 4.50, 4.50, 4.50, 4.50, 4.50, 4.50, + 4.50, 4.50, 4.50, 4.50, 4.50, 4.50, 4.50, 4.50, 4.50, 4.50, + 4.50, 4.50, 4.50, 4.50, 4.50, 4.50, 4.50, 4.50, 4.50, 4.50, + 4.50, 4.50, 4.50, 4.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, + 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 3.50, + 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, 3.50, + 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, + 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, + 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, + 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, + 3.00 ] + action: + name: reject +# Surface Type Check +- filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *airs_aqua_channels + test variables: + - name: SurfTypeCheckRad@ObsFunction + channels: *airs_aqua_channels + options: + channels: *airs_aqua_channels + use_flag: *useflag_airs_aqua + use_flag_clddet: *clddet_airs_aqua + maxvalue: 1.0e-12 + defer to post: true action: name: reject # Useflag Check @@ -309,35 +334,8 @@ obs filters: channels: *airs_aqua_channels options: channels: *airs_aqua_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 ] + use passive_bc: true + use_flag: *useflag_airs_aqua minvalue: 1.0e-12 action: name: reject diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/amsua_aqua.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/amsua_aqua.yaml index 8be16c45..2d97b3b6 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/amsua_aqua.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/amsua_aqua.yaml @@ -3,11 +3,11 @@ obs space: obsdatain: engine: type: H5File - obsfile: '{{cycle_dir}}/amsua_aqua.{{window_begin}}.nc4' + obsfile: '{{cycle_dir}}/amsua_aqua.{{window_begin}}.nc4' obsdataout: engine: type: H5File - obsfile: '{{cycle_dir}}/{{experiment_id}}.amsua_aqua.{{window_begin}}.nc4' + obsfile: '{{cycle_dir}}/{{experiment_id}}.amsua_aqua.{{window_begin}}.nc4' simulated variables: [brightnessTemperature] channels: &amsua_aqua_channels 1-15 obs operator: @@ -160,9 +160,9 @@ obs filters: [2.500, 2.000, 2.000, 0.500, 0.400, 0.400, 0.500, 0.300, 0.350, 0.350, 0.450, 1.000, 1.500, 3.750, 6.300] - obserr_bound_max: [4.5, 4.5, 4.5, 2.5, 2.0, + obserr_bound_max: [4.5, 4.5, 4.5, 3.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.5, 3.5, 4.5, 4.5, 4.5] + 3.0, 3.5, 4.5, 4.5, 4.5] action: name: reject # Inter-channel check @@ -193,7 +193,7 @@ obs filters: channels: 1-15 options: channels: 1-15 - use passive_bc: true +# use passive_bc: true use_flag: [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1] diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/amsua_metop-b.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/amsua_metop-b.yaml index 8629943a..f86d2ef0 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/amsua_metop-b.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/amsua_metop-b.yaml @@ -195,7 +195,7 @@ obs filters: channels: 1-15 options: channels: 1-15 - use passive_bc: true +# use passive_bc: true use_flag: [-1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1] diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/amsua_metop-c.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/amsua_metop-c.yaml index e8afaca2..3e4e2939 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/amsua_metop-c.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/amsua_metop-c.yaml @@ -195,7 +195,7 @@ obs filters: channels: 1-15 options: channels: 1-15 - use passive_bc: true +# use passive_bc: true use_flag: [-1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1] diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/amsua_n15.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/amsua_n15.yaml index ecc93397..bb2264a0 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/amsua_n15.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/amsua_n15.yaml @@ -195,7 +195,7 @@ obs filters: channels: 1-15 options: channels: 1-15 - use passive_bc: true +# use passive_bc: true use_flag: [-1, -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1] diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/amsua_n18.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/amsua_n18.yaml index 36e147da..4dfdd00b 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/amsua_n18.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/amsua_n18.yaml @@ -195,7 +195,7 @@ obs filters: channels: 1-15 options: channels: 1-15 - use passive_bc: true +# use passive_bc: true use_flag: [-1, -1, -1, 1, -1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1] diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/amsua_n19.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/amsua_n19.yaml index 9a69c50a..6230551a 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/amsua_n19.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/amsua_n19.yaml @@ -195,7 +195,7 @@ obs filters: channels: 1-15 options: channels: 1-15 - use passive_bc: true +# use passive_bc: true use_flag: [-1, -1, -1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, -1] diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/atms_n20.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/atms_n20.yaml index 9140e7d3..4d7ec8b4 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/atms_n20.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/atms_n20.yaml @@ -13,8 +13,8 @@ obs space: obs operator: name: CRTM Absorbers: [H2O,O3,CO2] - Clouds: [Water, Ice] - Cloud_Fraction: 1.0 + linear obs operator: + Absorbers: [H2O,O3,CO2] obs options: Sensor_ID: &Sensor_ID atms_n20 EndianType: little_endian @@ -24,6 +24,10 @@ obs bias: variational bc: predictors: - name: constant + - name: cloud_liquid_water + sensor: ATMS + clwdif_ch238: 1 + clwdif_ch314: 2 - name: lapse_rate order: 2 tlapse: &atms_n20_tlapse '{{cycle_dir}}/atms_n20.{{background_time}}.tlapse.txt' @@ -38,323 +42,171 @@ obs bias: order: 2 - name: scan_angle obs filters: -- filter: BlackList - filter variables: - - name: brightnessTemperature - channels: *atms_n20_channels - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelRamp - channels: *atms_n20_channels +# Window and surface-sensitive channels check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: 1-7,16-22 + test variables: + - name: ObsValue/brightnessTemperature + channels: 1-7,16 + treat missing as out of bounds: true + minvalue: 100.0 + maxvalue: 500.0 + flag all filter variables if any test variable is out of bounds: true +# passedBenchmark: 1500 +# All channels unreasonable values check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: atms_n20_channels + minvalue: 100.0 + maxvalue: 500.0 +#Hydrometeor Check (cloud/precipitation affected chanels) + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: atms_n20_channels + test variables: + - name: ObsFunction/HydrometeorCheckAMSUAclr + channels: atms_n20_channels options: - channels: *atms_n20_channels - xvar: - name: ObsFunction/CLWRetSymmetricMW - options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [ObsValue, HofX] - 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, 3.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, 3.000, - 19.000, 30.000, 25.000, 16.500, 12.000, - 9.000, 6.500] -# CLW Retrieval Check -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: 1-7, 16-22 - 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-7, 16-22 - 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: *atms_n20_channels - test variables: - - name: ObsFunction/HydrometeorCheckATMS - 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, 3.000, - 4.000, 4.000, 3.500, 3.000, 3.000, - 3.000, 3.000] - clwret_function: - name: ObsFunction/CLWRetMW + sensor: *Sensor_ID + channels: atms_n20_channels + test_biaspredictor: cloud_liquid_waterPredictor + maxvalue: 0.0 + action: + name: reject +# Assign obs error + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: atms_n20_channels + action: + name: assign error + error parameter vector: + [5.000, 5.000, 5.000, 3.000, 0.550, + 0.300, 0.300, 0.300, 0.300, 0.300, + 0.350, 0.400, 0.550, 0.800, 5.000, + 5.000, 2.500, 2.500, 2.500, 2.500, + 2.500, 2.500] +# Topography check + - filter: BlackList + filter variables: + - name: brightnessTemperature + channels: atms_n20_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorTopoRad + channels: atms_n20_channels options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [ObsValue] - obserr_function: - name: ObsFunction/ObsErrorModelRamp - channels: *atms_n20_channels + sensor: *Sensor_ID + channels: atms_n20_channels +# Transmittance Top Check + - filter: BlackList + filter variables: + - name: brightnessTemperature + channels: atms_n20_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorTransmitTopRad + channels: atms_n20_channels options: - channels: *atms_n20_channels - xvar: - name: ObsFunction/CLWRetSymmetricMW - options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [ObsValue, HofX] - 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, 3.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, 3.000, - 19.000, 30.000, 25.000, 16.500, 12.000, - 9.000, 6.500] - maxvalue: 0.0 - action: - name: reject -# Topography check -- filter: BlackList - filter variables: - - name: brightnessTemperature - channels: *atms_n20_channels - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorTopoRad - channels: *atms_n20_channels - options: - sensor: atms_n20 - channels: *atms_n20_channels -# Transmittnace Top Check -- filter: BlackList - filter variables: - - name: brightnessTemperature - channels: *atms_n20_channels - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorTransmitTopRad - channels: *atms_n20_channels - options: - channels: *atms_n20_channels -# Surface Jacobian check -- filter: BlackList - filter variables: - - name: brightnessTemperature - channels: *atms_n20_channels - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorSurfJacobianRad - channels: *atms_n20_channels + channels: atms_n20_channels +# Surface Jacobian check + - filter: BlackList + filter variables: + - name: brightnessTemperature + channels: atms_n20_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorSurfJacobianRad + channels: atms_n20_channels + options: + channels: atms_n20_channels + use_biasterm: true + test_biasterm: ObsBiasTerm + sensor: *Sensor_ID + obserr_demisf: [0.010, 0.020, 0.015, 0.020, 0.200] + obserr_dtempf: [0.500, 2.000, 1.000, 2.000, 4.500] +# Gross check + - filter: Background Check + filter variables: + - name: brightnessTemperature + channels: atms_n20_channels + function absolute threshold: + - name: ObsFunction/ObsErrorBoundMW + channels: atms_n20_channels options: - channels: *atms_n20_channels sensor: *Sensor_ID - 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: *atms_n20_channels - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorSituDependMW - channels: *atms_n20_channels - options: - sensor: atms_n20 - channels: *atms_n20_channels - clwobs_function: - name: ObsFunction/CLWRetMW - options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [ObsValue] - clwbkg_function: - name: ObsFunction/CLWRetMW + channels: atms_n20_channels + obserr_bound_latitude: + name: ObsFunction/ObsErrorFactorLatRad options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [HofX] - scatobs_function: - name: ObsFunction/SCATRetMW + latitude_parameters: [25.0, 0.25, 0.04, 3.0] + obserr_bound_transmittop: + name: ObsFunction/ObsErrorFactorTransmitTopRad + channels: atms_n20_channels options: - scatret_ch238: 1 - scatret_ch314: 2 - scatret_ch890: 16 - scatret_types: [ObsValue] - clwmatchidx_function: - name: ObsFunction/CLWMatchIndexMW - channels: *atms_n20_channels + channels: atms_n20_channels + obserr_bound_topo: + name: ObsFunction/ObsErrorFactorTopoRad + channels: atms_n20_channels options: - channels: *atms_n20_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] - 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] - 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, 3.000, - 4.000, 4.000, 3.500, 3.000, 3.000, - 3.000, 3.000] -# Gross check -- filter: Background Check - filter variables: - - name: brightnessTemperature - channels: *atms_n20_channels - function absolute threshold: - - name: ObsFunction/ObsErrorBoundMW - channels: *atms_n20_channels - options: - sensor: atms_n20 - channels: *atms_n20_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: *atms_n20_channels - options: - channels: *atms_n20_channels - obserr_bound_topo: - name: ObsFunction/ObsErrorFactorTopoRad - channels: *atms_n20_channels - options: - channels: *atms_n20_channels - sensor: atms_n20 - obserr_function: - name: ObsFunction/ObsErrorModelRamp - channels: *atms_n20_channels - options: - channels: *atms_n20_channels - xvar: - name: ObsFunction/CLWRetSymmetricMW - options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [ObsValue, HofX] - 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, 3.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, 3.000, - 19.000, 30.000, 25.000, 16.500, 12.000, - 9.000, 6.500] - 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] - action: - name: reject -# Inter-channel check -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: *atms_n20_channels - test variables: - - name: ObsFunction/InterChannelConsistencyCheck - channels: *atms_n20_channels - options: - channels: *atms_n20_channels - sensor: atms_n20 - use_flag: [ 1, 1, 1, 1, 1, - 1, 1, 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: *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, -1, - 1, 1, 1, 1, 1, - 1, 1] - minvalue: 1.0e-12 - action: - name: reject + channels: atms_n20_channels + sensor: *Sensor_ID + error parameter vector: + [5.000, 5.000, 5.000, 3.000, 0.550, + 0.300, 0.300, 0.300, 0.300, 0.300, + 0.350, 0.400, 0.550, 0.800, 5.000, + 5.000, 2.500, 2.500, 2.500, 2.500, + 2.500, 2.500] + 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] + action: + name: reject +# Inter-channel check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: atms_n20_channels + test variables: + - name: ObsFunction/InterChannelConsistencyCheck + 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, 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: atms_n20_channels + test variables: + - name: ObsFunction/ChannelUseflagCheckRad + channels: atms_n20_channels + options: + channels: atms_n20_channels + use passive_bc: true + use_flag: [-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/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/atms_npp.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/atms_npp.yaml index 1cb1fffe..62be3a1c 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/atms_npp.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/atms_npp.yaml @@ -13,8 +13,8 @@ obs space: obs operator: name: CRTM Absorbers: [H2O,O3,CO2] - Clouds: [Water, Ice] - Cloud_Fraction: 1.0 + linear obs operator: + Absorbers: [H2O,O3,CO2] obs options: Sensor_ID: &Sensor_ID atms_npp EndianType: little_endian @@ -24,6 +24,10 @@ obs bias: variational bc: predictors: - name: constant + - name: cloud_liquid_water + sensor: ATMS + clwdif_ch238: 1 + clwdif_ch314: 2 - name: lapse_rate order: 2 tlapse: &atms_npp_tlapse '{{cycle_dir}}/atms_npp.{{background_time}}.tlapse.txt' @@ -38,323 +42,171 @@ obs bias: order: 2 - name: scan_angle obs filters: -- filter: BlackList - filter variables: - - name: brightnessTemperature - channels: *atms_npp_channels - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelRamp - channels: *atms_npp_channels +# Window and surface-sensitive channels check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: 1-7,16-22 + test variables: + - name: ObsValue/brightnessTemperature + channels: 1-7,16 + treat missing as out of bounds: true + minvalue: 100.0 + maxvalue: 500.0 + flag all filter variables if any test variable is out of bounds: true +# passedBenchmark: 1500 +# All channels unreasonable values check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: atms_npp_channels + minvalue: 100.0 + maxvalue: 500.0 +#Hydrometeor Check (cloud/precipitation affected chanels) + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: atms_npp_channels + test variables: + - name: ObsFunction/HydrometeorCheckAMSUAclr + channels: atms_npp_channels options: - channels: *atms_npp_channels - xvar: - name: ObsFunction/CLWRetSymmetricMW - options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [ObsValue, HofX] - 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, 3.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, 3.000, - 19.000, 30.000, 25.000, 16.500, 12.000, - 9.000, 6.500] -# CLW Retrieval Check -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: 1-7, 16-22 - 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-7, 16-22 - 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: *atms_npp_channels - test variables: - - name: ObsFunction/HydrometeorCheckATMS - 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, 3.000, - 4.000, 4.000, 3.500, 3.000, 3.000, - 3.000, 3.000] - clwret_function: - name: ObsFunction/CLWRetMW + sensor: *Sensor_ID + channels: atms_npp_channels + test_biaspredictor: cloud_liquid_waterPredictor + maxvalue: 0.0 + action: + name: reject +# Assign obs error + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: atms_npp_channels + action: + name: assign error + error parameter vector: + [5.000, 5.000, 5.000, 3.000, 0.550, + 0.300, 0.300, 0.300, 0.300, 0.300, + 0.350, 0.400, 0.550, 0.800, 5.000, + 5.000, 2.500, 2.500, 2.500, 2.500, + 2.500, 2.500] +# Topography check + - filter: BlackList + filter variables: + - name: brightnessTemperature + channels: atms_npp_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorTopoRad + channels: atms_npp_channels options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [ObsValue] - obserr_function: - name: ObsFunction/ObsErrorModelRamp - channels: *atms_npp_channels + sensor: *Sensor_ID + channels: atms_npp_channels +# Transmittance Top Check + - filter: BlackList + filter variables: + - name: brightnessTemperature + channels: atms_npp_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorTransmitTopRad + channels: atms_npp_channels options: - channels: *atms_npp_channels - xvar: - name: ObsFunction/CLWRetSymmetricMW - options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [ObsValue, HofX] - 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, 3.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, 3.000, - 19.000, 30.000, 25.000, 16.500, 12.000, - 9.000, 6.500] - maxvalue: 0.0 - action: - name: reject -# Topography check -- filter: BlackList - filter variables: - - name: brightnessTemperature - channels: *atms_npp_channels - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorTopoRad - channels: *atms_npp_channels - options: - sensor: atms_npp - channels: *atms_npp_channels -# Transmittnace Top Check -- filter: BlackList - filter variables: - - name: brightnessTemperature - channels: *atms_npp_channels - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorTransmitTopRad - channels: *atms_npp_channels - options: - channels: *atms_npp_channels -# Surface Jacobian check -- filter: BlackList - filter variables: - - name: brightnessTemperature - channels: *atms_npp_channels - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorSurfJacobianRad - channels: *atms_npp_channels + channels: atms_npp_channels +# Surface Jacobian check + - filter: BlackList + filter variables: + - name: brightnessTemperature + channels: atms_npp_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorSurfJacobianRad + channels: atms_npp_channels + options: + channels: atms_npp_channels + use_biasterm: true + test_biasterm: ObsBiasTerm + sensor: *Sensor_ID + obserr_demisf: [0.010, 0.020, 0.015, 0.020, 0.200] + obserr_dtempf: [0.500, 2.000, 1.000, 2.000, 4.500] +# Gross check + - filter: Background Check + filter variables: + - name: brightnessTemperature + channels: atms_npp_channels + function absolute threshold: + - name: ObsFunction/ObsErrorBoundMW + channels: atms_npp_channels options: - channels: *atms_npp_channels sensor: *Sensor_ID - 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: *atms_npp_channels - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorSituDependMW - channels: *atms_npp_channels - options: - sensor: atms_npp - channels: *atms_npp_channels - clwobs_function: - name: ObsFunction/CLWRetMW - options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [ObsValue] - clwbkg_function: - name: ObsFunction/CLWRetMW + channels: atms_npp_channels + obserr_bound_latitude: + name: ObsFunction/ObsErrorFactorLatRad options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [HofX] - scatobs_function: - name: ObsFunction/SCATRetMW + latitude_parameters: [25.0, 0.25, 0.04, 3.0] + obserr_bound_transmittop: + name: ObsFunction/ObsErrorFactorTransmitTopRad + channels: atms_npp_channels options: - scatret_ch238: 1 - scatret_ch314: 2 - scatret_ch890: 16 - scatret_types: [ObsValue] - clwmatchidx_function: - name: ObsFunction/CLWMatchIndexMW - channels: *atms_npp_channels + channels: atms_npp_channels + obserr_bound_topo: + name: ObsFunction/ObsErrorFactorTopoRad + channels: atms_npp_channels options: - channels: *atms_npp_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] - 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] - 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, 3.000, - 4.000, 4.000, 3.500, 3.000, 3.000, - 3.000, 3.000] -# Gross check -- filter: Background Check - filter variables: - - name: brightnessTemperature - channels: *atms_npp_channels - function absolute threshold: - - name: ObsFunction/ObsErrorBoundMW - channels: *atms_npp_channels - options: - sensor: atms_npp - channels: *atms_npp_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: *atms_npp_channels - options: - channels: *atms_npp_channels - obserr_bound_topo: - name: ObsFunction/ObsErrorFactorTopoRad - channels: *atms_npp_channels - options: - channels: *atms_npp_channels - sensor: atms_npp - obserr_function: - name: ObsFunction/ObsErrorModelRamp - channels: *atms_npp_channels - options: - channels: *atms_npp_channels - xvar: - name: ObsFunction/CLWRetSymmetricMW - options: - clwret_ch238: 1 - clwret_ch314: 2 - clwret_types: [ObsValue, HofX] - 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, 3.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, 3.000, - 19.000, 30.000, 25.000, 16.500, 12.000, - 9.000, 6.500] - 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] - action: - name: reject -# Inter-channel check -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: *atms_npp_channels - test variables: - - name: ObsFunction/InterChannelConsistencyCheck - channels: *atms_npp_channels - options: - channels: *atms_npp_channels - sensor: atms_npp - use_flag: [ 1, 1, 1, 1, 1, - 1, 1, 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: *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, -1, - 1, 1, 1, 1, 1, - 1, 1] - minvalue: 1.0e-12 - action: - name: reject + channels: atms_npp_channels + sensor: *Sensor_ID + error parameter vector: + [5.000, 5.000, 5.000, 3.000, 0.550, + 0.300, 0.300, 0.300, 0.300, 0.300, + 0.350, 0.400, 0.550, 0.800, 5.000, + 5.000, 2.500, 2.500, 2.500, 2.500, + 2.500, 2.500] + 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] + action: + name: reject +# Inter-channel check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: atms_npp_channels + test variables: + - name: ObsFunction/InterChannelConsistencyCheck + 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, 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: atms_npp_channels + test variables: + - name: ObsFunction/ChannelUseflagCheckRad + channels: atms_npp_channels + options: + channels: atms_npp_channels + use passive_bc: true + use_flag: [-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/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/avhrr3_metop-a.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/avhrr3_metop-b.yaml similarity index 69% rename from src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/avhrr3_metop-a.yaml rename to src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/avhrr3_metop-b.yaml index b8ba9860..f3e2446a 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/avhrr3_metop-a.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/avhrr3_metop-b.yaml @@ -1,32 +1,32 @@ obs space: - name: avhrr3_metop-a + name: avhrr3_metop-b obsdatain: engine: type: H5File - obsfile: '{{cycle_dir}}/avhrr3_metop-a.{{window_begin}}.nc4' + obsfile: '{{cycle_dir}}/avhrr3_metop-b.{{window_begin}}.nc4' obsdataout: engine: type: H5File - obsfile: '{{cycle_dir}}/{{experiment_id}}.avhrr3_metop-a.{{window_begin}}.nc4' + obsfile: '{{cycle_dir}}/{{experiment_id}}.avhrr3_metop-b.{{window_begin}}.nc4' simulated variables: [brightnessTemperature] - channels: &avhrr3_metop-a_channels 3,4,5 + channels: &avhrr3_metop-b_channels 3,4,5 obs operator: name: CRTM Absorbers: [H2O,O3,CO2] obs options: - Sensor_ID: &Sensor_ID avhrr3_metop-a + Sensor_ID: &Sensor_ID avhrr3_metop-b EndianType: little_endian CoefficientPath: '{{crtm_coeff_dir}}' obs bias: - input file: '{{cycle_dir}}/avhrr3_metop-a.{{background_time}}.satbias.nc4' + input file: '{{cycle_dir}}/avhrr3_metop-b.{{background_time}}.satbias.nc4' variational bc: predictors: - name: constant - name: lapse_rate order: 2 - tlapse: &avhrr3_metop-a_tlapse '{{cycle_dir}}/avhrr3_metop-a.{{background_time}}.tlapse.txt' + tlapse: &avhrr3_metop-b_tlapse '{{cycle_dir}}/avhrr3_metop-b.{{background_time}}.tlapse.txt' - name: lapse_rate - tlapse: *avhrr3_metop-a_tlapse + tlapse: *avhrr3_metop-b_tlapse - name: emissivity - name: scan_angle order: 4 @@ -53,32 +53,32 @@ obs filters: - filter: BlackList filter variables: - name: brightnessTemperature - channels: *avhrr3_metop-a_channels + channels: *avhrr3_metop-b_channels action: name: inflate error inflation variable: name: ObsFunction/ObsErrorFactorWavenumIR - channels: *avhrr3_metop-a_channels + channels: *avhrr3_metop-b_channels options: - channels: *avhrr3_metop-a_channels + channels: *avhrr3_metop-b_channels # Topography Check - filter: BlackList filter variables: - name: brightnessTemperature - channels: *avhrr3_metop-a_channels + channels: *avhrr3_metop-b_channels action: name: inflate error inflation variable: name: ObsFunction/ObsErrorFactorTopoRad - channels: *avhrr3_metop-a_channels + channels: *avhrr3_metop-b_channels options: - channels: *avhrr3_metop-a_channels - sensor: avhrr3_metop-a + channels: *avhrr3_metop-b_channels + sensor: avhrr3_metop-b # Observation Range Sanity Check - filter: Bounds Check filter variables: - name: brightnessTemperature - channels: *avhrr3_metop-a_channels + channels: *avhrr3_metop-b_channels minvalue: 0.00001 maxvalue: 1000.0 action: @@ -87,24 +87,24 @@ obs filters: - filter: BlackList filter variables: - name: brightnessTemperature - channels: *avhrr3_metop-a_channels + channels: *avhrr3_metop-b_channels action: name: inflate error inflation variable: name: ObsFunction/ObsErrorFactorTransmitTopRad - channels: *avhrr3_metop-a_channels + channels: *avhrr3_metop-b_channels options: - channels: *avhrr3_metop-a_channels + channels: *avhrr3_metop-b_channels # Cloud Detection Check - filter: Bounds Check filter variables: - name: brightnessTemperature - channels: *avhrr3_metop-a_channels + channels: *avhrr3_metop-b_channels test variables: - name: ObsFunction/CloudDetectMinResidualAVHRR - channels: *avhrr3_metop-a_channels + channels: *avhrr3_metop-b_channels options: - channels: *avhrr3_metop-a_channels + channels: *avhrr3_metop-b_channels use_flag: [ 1, 1, 1 ] use_flag_clddet: [ 1, 1, 1 ] obserr_dtempf: [0.50,2.00,4.00,2.00,4.00] @@ -115,12 +115,12 @@ obs filters: - filter: Bounds Check filter variables: - name: brightnessTemperature - channels: *avhrr3_metop-a_channels + channels: *avhrr3_metop-b_channels test variables: - name: ObsFunction/NearSSTRetCheckIR - channels: *avhrr3_metop-a_channels + channels: *avhrr3_metop-b_channels options: - channels: *avhrr3_metop-a_channels + channels: *avhrr3_metop-b_channels use_flag: [ 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] @@ -131,14 +131,14 @@ obs filters: - filter: BlackList filter variables: - name: brightnessTemperature - channels: *avhrr3_metop-a_channels + channels: *avhrr3_metop-b_channels action: name: inflate error inflation variable: name: ObsFunction/ObsErrorFactorSurfJacobianRad - channels: *avhrr3_metop-a_channels + channels: *avhrr3_metop-b_channels options: - channels: *avhrr3_metop-a_channels + channels: *avhrr3_metop-b_channels sensor: *Sensor_ID obserr_demisf: [0.01, 0.02, 0.03, 0.02, 0.03] obserr_dtempf: [0.50, 2.00, 4.00, 2.00, 4.00] @@ -146,21 +146,21 @@ obs filters: - filter: Background Check filter variables: - name: brightnessTemperature - channels: *avhrr3_metop-a_channels + channels: *avhrr3_metop-b_channels function absolute threshold: - name: ObsFunction/ObsErrorBoundIR - channels: *avhrr3_metop-a_channels + channels: *avhrr3_metop-b_channels options: - channels: *avhrr3_metop-a_channels + channels: *avhrr3_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: *avhrr3_metop-a_channels + channels: *avhrr3_metop-b_channels options: - channels: *avhrr3_metop-a_channels + channels: *avhrr3_metop-b_channels obserr_bound_max: [ 6.0, 6.0, 6.0 ] action: name: reject @@ -168,12 +168,12 @@ obs filters: - filter: Bounds Check filter variables: - name: brightnessTemperature - channels: *avhrr3_metop-a_channels + channels: *avhrr3_metop-b_channels test variables: - name: ObsFunction/ChannelUseflagCheckRad - channels: *avhrr3_metop-a_channels + channels: *avhrr3_metop-b_channels options: - channels: *avhrr3_metop-a_channels + channels: *avhrr3_metop-b_channels use_flag: [ 1, 1, 1 ] minvalue: 1.0e-12 action: diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/avhrr3_n19.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/avhrr3_n19.yaml new file mode 100644 index 00000000..ae520a1b --- /dev/null +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/avhrr3_n19.yaml @@ -0,0 +1,181 @@ +obs space: + name: avhrr3_n19 + obsdatain: + engine: + type: H5File + obsfile: '{{cycle_dir}}/avhrr3_n19.{{window_begin}}.nc4' + obsdataout: + engine: + type: H5File + obsfile: '{{cycle_dir}}/{{experiment_id}}.avhrr3_n19.{{window_begin}}.nc4' + simulated variables: [brightnessTemperature] + channels: &avhrr3_n19_channels 3,4,5 +obs operator: + name: CRTM + Absorbers: [H2O,O3,CO2] + obs options: + Sensor_ID: &Sensor_ID avhrr3_n19 + EndianType: little_endian + CoefficientPath: '{{crtm_coeff_dir}}' +obs bias: + input file: '{{cycle_dir}}/avhrr3_n19.{{background_time}}.satbias.nc4' + variational bc: + predictors: + - name: constant + - name: lapse_rate + order: 2 + tlapse: &avhrr3_n19_tlapse '{{cycle_dir}}/avhrr3_n19.{{background_time}}.tlapse.txt' + - name: lapse_rate + tlapse: *avhrr3_n19_tlapse + - name: emissivity + - name: scan_angle + order: 4 + - name: scan_angle + order: 3 + - name: scan_angle + order: 2 + - name: scan_angle +obs filters: +# Wavenumber Check +- filter: BlackList + filter variables: + - name: brightnessTemperature + channels: 3 + where: + - variable: + name: MetaData/solarZenithAngle + maxvalue: 88.9999 + - variable: + name: GeoVaLs/water_area_fraction + minvalue: 1.0e-12 + action: + name: reject +- filter: BlackList + filter variables: + - name: brightnessTemperature + channels: *avhrr3_n19_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorWavenumIR + channels: *avhrr3_n19_channels + options: + channels: *avhrr3_n19_channels +# Topography Check +- filter: BlackList + filter variables: + - name: brightnessTemperature + channels: *avhrr3_n19_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorTopoRad + channels: *avhrr3_n19_channels + options: + channels: *avhrr3_n19_channels + sensor: avhrr3_n19 +# Observation Range Sanity Check +- filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *avhrr3_n19_channels + minvalue: 0.00001 + maxvalue: 1000.0 + action: + name: reject +# Transmittance Top Check +- filter: BlackList + filter variables: + - name: brightnessTemperature + channels: *avhrr3_n19_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorTransmitTopRad + channels: *avhrr3_n19_channels + options: + channels: *avhrr3_n19_channels +# Cloud Detection Check +- filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *avhrr3_n19_channels + test variables: + - name: ObsFunction/CloudDetectMinResidualAVHRR + channels: *avhrr3_n19_channels + options: + channels: *avhrr3_n19_channels + use_flag: [ 1, 1, 1 ] + use_flag_clddet: [ 1, 1, 1 ] + obserr_dtempf: [0.50,2.00,4.00,2.00,4.00] + maxvalue: 1.0e-12 + action: + name: reject +# NSST Retrieval Check +- filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *avhrr3_n19_channels + test variables: + - name: ObsFunction/NearSSTRetCheckIR + channels: *avhrr3_n19_channels + options: + channels: *avhrr3_n19_channels + use_flag: [ 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: brightnessTemperature + channels: *avhrr3_n19_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorSurfJacobianRad + channels: *avhrr3_n19_channels + options: + channels: *avhrr3_n19_channels + sensor: *Sensor_ID + 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: brightnessTemperature + channels: *avhrr3_n19_channels + function absolute threshold: + - name: ObsFunction/ObsErrorBoundIR + channels: *avhrr3_n19_channels + options: + channels: *avhrr3_n19_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: *avhrr3_n19_channels + options: + channels: *avhrr3_n19_channels + obserr_bound_max: [ 6.0, 6.0, 6.0 ] + action: + name: reject +# Useflag Check +- filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *avhrr3_n19_channels + test variables: + - name: ObsFunction/ChannelUseflagCheckRad + channels: *avhrr3_n19_channels + options: + channels: *avhrr3_n19_channels + use_flag: [ 1, 1, 1 ] + minvalue: 1.0e-12 + action: + name: reject + diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/cris-fsr_n20.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/cris-fsr_n20.yaml index 9b2c802e..a9048a7a 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/cris-fsr_n20.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/cris-fsr_n20.yaml @@ -1,5 +1,14 @@ +obs operator: + name: CRTM + Absorbers: [H2O,O3,CO2] + linear obs operator: + Absorbers: [H2O,O3,CO2] + obs options: + Sensor_ID: &Sensor_ID cris-fsr_n20 + EndianType: little_endian + CoefficientPath: '{{crtm_coeff_dir}}' obs space: - name: cris-fsr_n20 + name: *Sensor_ID obsdatain: engine: type: H5File @@ -41,13 +50,6 @@ obs space: 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,CO2] - obs options: - Sensor_ID: &Sensor_ID cris-fsr_n20 - EndianType: little_endian - CoefficientPath: '{{crtm_coeff_dir}}' obs bias: input file: '{{cycle_dir}}/cris-fsr_n20.{{background_time}}.satbias.nc4' variational bc: @@ -67,6 +69,56 @@ obs bias: order: 2 - name: scan_angle obs filters: +- filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *cris-fsr_n20_channels + action: + name: assign error + error parameter vector: [ 0.8230, 0.7600, 0.7360, 0.7430, 0.8560, 1.0790, 0.8880, 0.7780, 0.6710, 0.6500, + 0.6430, 0.6290, 0.6290, 0.6180, 0.6380, 0.6190, 0.6100, 0.6270, 0.6010, 0.6170, + 0.6080, 0.4980, 0.5112, 0.4922, 0.4959, 0.4954, 0.4836, 0.5140, 0.5005, 0.4917, + 0.4881, 0.4656, 0.4793, 0.4638, 0.4557, 0.4666, 0.4468, 0.4534, 0.4471, 0.4448, + 0.4469, 0.5360, 0.4426, 0.4388, 0.5340, 0.4368, 0.4380, 0.5310, 0.4379, 0.5350, + 0.4404, 0.4405, 0.4409, 0.4472, 0.4555, 0.4433, 0.4437, 0.4454, 0.4448, 0.4465, + 0.4499, 0.4488, 0.5400, 0.4534, 0.4472, 0.4550, 0.4562, 0.4520, 0.4639, 0.5380, + 0.4573, 0.4604, 0.4533, 0.4692, 0.5660, 0.4457, 0.4457, 0.5154, 0.5084, 0.5280, + 0.5520, 0.5600, 0.5670, 0.5460, 0.4950, 0.4809, 0.4732, 0.4861, 0.4632, 0.5290, + 0.4748, 0.5007, 0.5711, 0.5950, 0.5469, 0.6260, 0.5410, 0.5430, 0.5330, 0.5410, + 0.4695, 0.5300, 0.5390, 0.5290, 0.5420, 0.4681, 0.5360, 0.5420, 0.5350, 0.5630, + 0.4805, 0.6470, 0.6090, 0.5530, 0.5830, 0.5760, 0.6294, 0.5885, 0.5560, 0.5780, + 0.5660, 0.6010, 0.5627, 0.5675, 0.5920, 0.5166, 0.5890, 0.5291, 0.5892, 0.5976, + 0.5834, 0.6512, 0.6748, 0.6615, 0.6003, 0.5669, 0.5587, 0.5507, 0.5871, 0.6160, + 0.6370, 0.6330, 0.6390, 0.6550, 0.6410, 0.6640, 0.6480, 0.6560, 0.6630, 0.6520, + 0.6810, 0.6620, 0.6730, 0.6720, 0.6800, 0.7350, 0.7320, 0.7150, 0.6740, 0.6870, + 0.7020, 0.7050, 0.7150, 0.7250, 0.7070, 0.7400, 0.7400, 0.8740, 0.7370, 0.8190, + 0.7600, 0.8690, 0.9000, 0.6980, 0.8230, 0.6760, 0.6820, 0.7660, 0.6800, 0.6850, + 0.6940, 0.6950, 0.6890, 0.7270, 0.6950, 0.6880, 0.6770, 0.7360, 0.6510, 0.6610, + 0.6199, 0.6223, 0.6036, 0.6003, 0.5991, 0.5980, 0.5910, 0.5764, 0.5770, 0.5593, + 0.5970, 0.5760, 0.5740, 0.5780, 0.5790, 0.5750, 0.5760, 0.5680, 0.5750, 0.5690, + 0.5590, 0.5680, 0.5401, 0.5500, 0.5575, 0.5780, 0.5635, 0.5786, 0.5807, 0.5810, + 0.5730, 0.5690, 0.5670, 0.5520, 0.5500, 0.5580, 0.5520, 0.5620, 0.5740, 0.5750, + 0.6290, 0.6820, 0.7560, 1.0500, 1.1220, 1.1402, 1.1540, 1.1310, 1.1230, 1.1590, + 1.1060, 1.1160, 1.0690, 1.0770, 1.1550, 1.1620, 1.1402, 0.6440, 1.2080, 1.1402, + 1.2950, 1.2580, 1.1402, 0.6060, 0.6030, 0.5630, 0.5920, 0.6070, 0.6110, 0.6120, + 0.6180, 0.6260, 0.6290, 0.5830, 0.8646, 0.6260, 0.6390, 0.5590, 0.8270, 0.6120, + 0.5760, 0.5800, 0.5750, 0.6880, 0.6970, 0.7430, 0.6810, 0.8320, 0.7190, 0.7850, + 0.8780, 0.9402, 1.0054, 1.0730, 1.1290, 1.0350, 1.0270, 0.9703, 1.1950, 0.9153, + 1.2660, 1.1530, 1.3480, 1.1800, 1.2690, 1.3110, 0.9914, 1.3590, 1.1660, 1.1390, + 1.2817, 1.3980, 1.5420, 1.2290, 1.3770, 1.2800, 1.2450, 1.1188, 1.1930, 1.2930, + 1.2750, 1.3310, 1.3400, 1.0990, 1.0480, 1.1240, 1.2250, 1.1830, 1.1960, 1.4000, + 1.3330, 1.4170, 1.3260, 1.3050, 1.0638, 1.2680, 1.2170, 1.2890, 1.3950, 1.2320, + 1.4350, 1.2980, 1.3280, 1.2620, 1.1990, 1.3910, 1.2330, 1.3290, 1.6640, 1.5090, + 1.3490, 1.4810, 1.5950, 1.4850, 1.5320, 1.5040, 1.5840, 1.6090, 1.5160, 1.4890, + 1.5020, 1.5440, 1.6110, 1.5390, 1.2960, 1.2880, 1.2410, 1.3200, 1.3130, 1.3010, + 1.8430, 1.7470, 1.7110, 1.7710, 1.9370, 1.5750, 1.5730, 1.5000, 1.4590, 1.4020, + 1.3630, 2.2010, 2.1270, 2.1770, 2.1570, 2.1920, 2.1460, 2.1510, 2.0710, 1.9860, + 1.8450, 1.6870, 1.5050, 1.3730, 1.2290, 1.1130, 1.0040, 0.9360, 0.8950, 0.8710, + 0.8410, 0.8210, 0.8050, 0.8000, 0.7920, 0.7970, 0.7910, 0.7830, 0.7770, 0.7850, + 0.7870, 0.7890, 0.7930, 0.7940, 0.7450, 0.7500, 0.7480, 0.7490, 0.7440, 0.7330, + 0.7330, 0.7410, 0.7460, 0.7460, 0.7380, 0.7430, 0.7450, 0.7490, 0.7500, 0.7500, + 0.8840, 0.9060, 0.9170, 0.9240, 0.9220, 0.9280, 0.9210, 0.9380, 0.9310, 0.9430, + 0.9460 ] # Wavenumber Check - filter: BlackList filter variables: @@ -100,7 +152,7 @@ obs filters: - name: brightnessTemperature channels: *cris-fsr_n20_channels minvalue: 50.00001 - maxvalue: 449.99999 + maxvalue: 549.99999 action: name: reject # Topography Check @@ -115,7 +167,7 @@ obs filters: channels: *cris-fsr_n20_channels options: channels: *cris-fsr_n20_channels - sensor: cris-fsr_n20 + sensor: *Sensor_ID # Transmittance Top Check - filter: BlackList filter variables: @@ -138,94 +190,94 @@ obs filters: 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] + use_flag: &useflag_cris-fsr_n20 [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, -1, 1, 1, -1, 1, 1, -1, 1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, + 1, 1, 1, 1, -1, 1, 1, 1, 1, -1, + -1, -1, -1, -1, 1, 1, 1, 1, 1, -1, + 1, 1, 1, -1, 1, -1, -1, -1, -1, -1, + 1, -1, -1, -1, -1, 1, -1, -1, -1, -1, + 1, -1, -1, -1, -1, -1, 1, 1, -1, -1, + -1, -1, 1, 1, -1, 1, -1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1, 1, 1, -1, 1, 1, 1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, + -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1, 1, -1, -1, -1, -1, -1, -1, 1, + -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, + 1, -1, -1, -1, -1, -1, -1, 1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -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: &clddet_cris-fsr_n20 [ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 30, + 30, 30, 31, 31, 30, 31, 30, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 31, 31, 31, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 31, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 31, 30, 30, 31, + 30, 30, 31, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 31, 30, 30, 30, 30, 30, 30, 31, + 30, 30, 30, 30, 30, 30, 31, 30, 30, 30, + 31, 30, 30, 30, 30, 30, 30, 31, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 31, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30 ] obserr_dtempf: [0.50,2.00,4.00,2.00,4.00] maxvalue: 1.0e-12 action: @@ -253,50 +305,7 @@ obs filters: 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: *useflag_cris-fsr_n20 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 @@ -339,7 +348,11 @@ obs filters: 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, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, + 0.4, 2.0, 0.4, 0.4, 2.0, 0.4, 0.4, 2.0, 0.4, 2.0, + 0.4, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 0.4, 0.4, 0.4, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, @@ -355,13 +368,9 @@ obs filters: 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + 2.0, 2.0, 2.0, 2.0, 2.0, 1.0, 2.0, 2.0, 2.0, 2.0, + 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 1.0, 2.0, 2.0, 1.0, + 2.0, 2.0, 1.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, @@ -382,6 +391,22 @@ obs filters: 2.0 ] action: name: reject +# Surface Type Check +- filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *cris-fsr_n20_channels + test variables: + - name: SurfTypeCheckRad@ObsFunction + channels: *cris-fsr_n20_channels + options: + channels: *cris-fsr_n20_channels + use_flag: *useflag_cris-fsr_n20 + use_flag_clddet: *clddet_cris-fsr_n20 + maxvalue: 1.0e-12 + defer to post: true + action: + name: reject # Useflag Check - filter: Bounds Check filter variables: @@ -392,50 +417,8 @@ obs filters: 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 passive_bc: true + use_flag: *useflag_cris-fsr_n20 minvalue: 1.0e-12 action: name: reject diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/cris-fsr_npp.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/cris-fsr_npp.yaml index 73d9b764..f5f623ff 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/cris-fsr_npp.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/cris-fsr_npp.yaml @@ -1,5 +1,14 @@ +obs operator: + name: CRTM + Absorbers: [H2O,O3,CO2] + linear obs operator: + Absorbers: [H2O,O3,CO2] + obs options: + Sensor_ID: &Sensor_ID cris-fsr_npp + EndianType: little_endian + CoefficientPath: '{{crtm_coeff_dir}}' obs space: - name: cris-fsr_npp + name: *Sensor_ID obsdatain: engine: type: H5File @@ -41,13 +50,6 @@ obs space: 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,CO2] - obs options: - Sensor_ID: &Sensor_ID cris-fsr_npp - EndianType: little_endian - CoefficientPath: '{{crtm_coeff_dir}}' obs bias: input file: '{{cycle_dir}}/cris-fsr_npp.{{background_time}}.satbias.nc4' variational bc: @@ -67,6 +69,56 @@ obs bias: order: 2 - name: scan_angle obs filters: +- filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *cris-fsr_npp_channels + action: + name: assign error + error parameter vector: [ 0.8230, 0.7600, 0.7360, 0.7430, 0.8560, 1.0790, 0.8880, 0.7780, 0.6710, 0.6500, + 0.6430, 0.6290, 0.6290, 0.6180, 0.6380, 0.6190, 0.6100, 0.6270, 0.6010, 0.6170, + 0.6080, 0.4980, 0.5112, 0.4922, 0.4959, 0.4954, 0.4836, 0.5140, 0.5005, 0.4917, + 0.4881, 0.4656, 0.4793, 0.4638, 0.4557, 0.4666, 0.4468, 0.4534, 0.4471, 0.4448, + 0.4469, 0.5360, 0.4426, 0.4388, 0.5340, 0.4368, 0.4380, 0.5310, 0.4379, 0.5350, + 0.4404, 0.4405, 0.4409, 0.4472, 0.4555, 0.4433, 0.4437, 0.4454, 0.4448, 0.4465, + 0.4499, 0.4488, 0.5400, 0.4534, 0.4472, 0.4550, 0.4562, 0.4520, 0.4639, 0.5380, + 0.4573, 0.4604, 0.4533, 0.4692, 0.5660, 0.4457, 0.4457, 0.5154, 0.5084, 0.5280, + 0.5520, 0.5600, 0.5670, 0.5460, 0.4950, 0.4809, 0.4732, 0.4861, 0.4632, 0.5290, + 0.4748, 0.5007, 0.5711, 0.5950, 0.5469, 0.6260, 0.5410, 0.5430, 0.5330, 0.5410, + 0.4695, 0.5300, 0.5390, 0.5290, 0.5420, 0.4681, 0.5360, 0.5420, 0.5350, 0.5630, + 0.4805, 0.6470, 0.6090, 0.5530, 0.5830, 0.5760, 0.6294, 0.5885, 0.5560, 0.5780, + 0.5660, 0.6010, 0.5627, 0.5675, 0.5920, 0.5166, 0.5890, 0.5291, 0.5892, 0.5976, + 0.5834, 0.6512, 0.6748, 0.6615, 0.6003, 0.5669, 0.5587, 0.5507, 0.5871, 0.6160, + 0.6370, 0.6330, 0.6390, 0.6550, 0.6410, 0.6640, 0.6480, 0.6560, 0.6630, 0.6520, + 0.6810, 0.6620, 0.6730, 0.6720, 0.6800, 0.7350, 0.7320, 0.7150, 0.6740, 0.6870, + 0.7020, 0.7050, 0.7150, 0.7250, 0.7070, 0.7400, 0.7400, 0.8740, 0.7370, 0.8190, + 0.7600, 0.8690, 0.9000, 0.6980, 0.8230, 0.6760, 0.6820, 0.7660, 0.6800, 0.6850, + 0.6940, 0.6950, 0.6890, 0.7270, 0.6950, 0.6880, 0.6770, 0.7360, 0.6510, 0.6610, + 0.6199, 0.6223, 0.6036, 0.6003, 0.5991, 0.5980, 0.5910, 0.5764, 0.5770, 0.5593, + 0.5970, 0.5760, 0.5740, 0.5780, 0.5790, 0.5750, 0.5760, 0.5680, 0.5750, 0.5690, + 0.5590, 0.5680, 0.5401, 0.5500, 0.5575, 0.5780, 0.5635, 0.5786, 0.5807, 0.5810, + 0.5730, 0.5690, 0.5670, 0.5520, 0.5500, 0.5580, 0.5520, 0.5620, 0.5740, 0.5750, + 0.6290, 0.6820, 0.7560, 1.0500, 1.1220, 1.1402, 1.1540, 1.1310, 1.1230, 1.1590, + 1.1060, 1.1160, 1.0690, 1.0770, 1.1550, 1.1620, 1.1402, 0.6440, 1.2080, 1.1402, + 1.2950, 1.2580, 1.1402, 0.6060, 0.6030, 0.5630, 0.5920, 0.6070, 0.6110, 0.6120, + 0.6180, 0.6260, 0.6290, 0.5830, 0.8646, 0.6260, 0.6390, 0.5590, 0.8270, 0.6120, + 0.5760, 0.5800, 0.5750, 0.6880, 0.6970, 0.7430, 0.6810, 0.8320, 0.7190, 0.7850, + 0.8780, 0.9402, 1.0054, 1.0730, 1.1290, 1.0350, 1.0270, 0.9703, 1.1950, 0.9153, + 1.2660, 1.1530, 1.3480, 1.1800, 1.2690, 1.3110, 0.9914, 1.3590, 1.1660, 1.1390, + 1.2817, 1.3980, 1.5420, 1.2290, 1.3770, 1.2800, 1.2450, 1.1188, 1.1930, 1.2930, + 1.2750, 1.3310, 1.3400, 1.0990, 1.0480, 1.1240, 1.2250, 1.1830, 1.1960, 1.4000, + 1.3330, 1.4170, 1.3260, 1.3050, 1.0638, 1.2680, 1.2170, 1.2890, 1.3950, 1.2320, + 1.4350, 1.2980, 1.3280, 1.2620, 1.1990, 1.3910, 1.2330, 1.3290, 1.6640, 1.5090, + 1.3490, 1.4810, 1.5950, 1.4850, 1.5320, 1.5040, 1.5840, 1.6090, 1.5160, 1.4890, + 1.5020, 1.5440, 1.6110, 1.5390, 1.2960, 1.2880, 1.2410, 1.3200, 1.3130, 1.3010, + 1.8430, 1.7470, 1.7110, 1.7710, 1.9370, 1.5750, 1.5730, 1.5000, 1.4590, 1.4020, + 1.3630, 2.2010, 2.1270, 2.1770, 2.1570, 2.1920, 2.1460, 2.1510, 2.0710, 1.9860, + 1.8450, 1.6870, 1.5050, 1.3730, 1.2290, 1.1130, 1.0040, 0.9360, 0.8950, 0.8710, + 0.8410, 0.8210, 0.8050, 0.8000, 0.7920, 0.7970, 0.7910, 0.7830, 0.7770, 0.7850, + 0.7870, 0.7890, 0.7930, 0.7940, 0.7450, 0.7500, 0.7480, 0.7490, 0.7440, 0.7330, + 0.7330, 0.7410, 0.7460, 0.7460, 0.7380, 0.7430, 0.7450, 0.7490, 0.7500, 0.7500, + 0.8840, 0.9060, 0.9170, 0.9240, 0.9220, 0.9280, 0.9210, 0.9380, 0.9310, 0.9430, + 0.9460 ] # Wavenumber Check - filter: BlackList filter variables: @@ -100,7 +152,7 @@ obs filters: - name: brightnessTemperature channels: *cris-fsr_npp_channels minvalue: 50.00001 - maxvalue: 449.99999 + maxvalue: 549.99999 action: name: reject # Topography Check @@ -115,7 +167,7 @@ obs filters: channels: *cris-fsr_npp_channels options: channels: *cris-fsr_npp_channels - sensor: cris-fsr_npp + sensor: *Sensor_ID # Transmittance Top Check - filter: BlackList filter variables: @@ -138,94 +190,94 @@ obs filters: 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] + use_flag: &useflag_cris-fsr_npp [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, -1, 1, 1, -1, 1, 1, -1, 1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, + 1, 1, 1, 1, -1, 1, 1, 1, 1, -1, + -1, -1, -1, -1, 1, 1, 1, 1, 1, -1, + 1, 1, 1, -1, 1, -1, -1, -1, -1, -1, + 1, -1, -1, -1, -1, 1, -1, -1, -1, -1, + 1, -1, -1, -1, -1, -1, 1, 1, -1, -1, + -1, -1, 1, 1, -1, 1, -1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1, 1, 1, -1, 1, 1, 1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, + -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1, 1, -1, -1, -1, -1, -1, -1, 1, + -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, + 1, -1, -1, -1, -1, -1, -1, 1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -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: &clddet_cris-fsr_npp [ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 30, + 30, 30, 31, 31, 30, 31, 30, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 31, 31, 31, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 31, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 31, 30, 30, 31, + 30, 30, 31, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 31, 30, 30, 30, 30, 30, 30, 31, + 30, 30, 30, 30, 30, 30, 31, 30, 30, 30, + 31, 30, 30, 30, 30, 30, 30, 31, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 31, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30 ] obserr_dtempf: [0.50,2.00,4.00,2.00,4.00] maxvalue: 1.0e-12 action: @@ -253,50 +305,7 @@ obs filters: 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: *useflag_cris-fsr_npp 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 @@ -339,7 +348,11 @@ obs filters: 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, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, + 0.4, 2.0, 0.4, 0.4, 2.0, 0.4, 0.4, 2.0, 0.4, 2.0, + 0.4, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 0.4, 0.4, 0.4, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, @@ -355,13 +368,9 @@ obs filters: 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + 2.0, 2.0, 2.0, 2.0, 2.0, 1.0, 2.0, 2.0, 2.0, 2.0, + 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 1.0, 2.0, 2.0, 1.0, + 2.0, 2.0, 1.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, @@ -382,6 +391,22 @@ obs filters: 2.0 ] action: name: reject +# Surface Type Check +- filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *cris-fsr_npp_channels + test variables: + - name: SurfTypeCheckRad@ObsFunction + channels: *cris-fsr_npp_channels + options: + channels: *cris-fsr_npp_channels + use_flag: *useflag_cris-fsr_npp + use_flag_clddet: *clddet_cris-fsr_npp + maxvalue: 1.0e-12 + defer to post: true + action: + name: reject # Useflag Check - filter: Bounds Check filter variables: @@ -392,50 +417,8 @@ obs filters: 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 passive_bc: true + use_flag: *useflag_cris-fsr_npp minvalue: 1.0e-12 action: name: reject diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/gmi_gpm.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/gmi_gpm.yaml index 26f162fb..51b4e9e6 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/gmi_gpm.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/gmi_gpm.yaml @@ -34,8 +34,17 @@ obs bias: - name: lapse_rate tlapse: *gmi_gpm_tlapse - name: emissivity -## - name: cosine_of_latitude_times_orbit_node -## - name: sine_of_latitude + - name: cloud_liquid_water + sensor: GMI_GPM + ch37v: 6 + ch37h: 7 + order: 2 + tlapse: *gmi_gpm_tlapse + - name: cloud_liquid_water + sensor: GMI_GPM + ch37v: 6 + ch37h: 7 + tlapse: *gmi_gpm_tlapse - name: scan_angle var_name: sensorScanPosition order: 4 @@ -57,7 +66,7 @@ obs filters: - filter: Bounds Check filter variables: - name: brightnessTemperature - channels: 10,11,12,13 + channels: 10-13 minvalue: 70.0 maxvalue: 320.0 - filter: Domain Check @@ -74,28 +83,39 @@ obs filters: minvalue: -55.0 maxvalue: 55.0 - variable: - name: MetaData/height + name: MetaData/heightOfSurface maxvalue: 2000 - variable: name: GeoVaLs/water_area_fraction minvalue: 0.99 - variable: - name: GeoVaLs/surface_temperature_where_sea + name: GeoVaLs/average_surface_temperature_within_field_of_view minvalue: 275 - filter: BlackList filter variables: - name: brightnessTemperature - channels: 5,6,7,10,12,13 + channels: 1-13 where: - variable: name: MetaData/latitude - minvalue: -25.0 + minvalue: -20.0 maxvalue: 0.0 - variable: name: MetaData/longitude minvalue: 25.0 maxvalue: 40.0 -# CLW Retrieval Check from ObsValue +# Save CLW retrievals from ObsValue +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/clw_obs + type: float + function: + name: ObsFunction/CLWRetMW + options: + clwret_ch37v: 6 + clwret_ch37h: 7 + clwret_types: [ObsValue] +# Check CLW retrievals from ObsValue - filter: Bounds Check filter variables: - name: brightnessTemperature @@ -106,10 +126,8 @@ obs filters: clwret_ch37v: 6 clwret_ch37h: 7 clwret_types: [ObsValue] - maxvalue: 999.0 - action: - name: reject -# Ckeck CLW retrievals from Hofx + maxvalue: 900 +# Ckeck CLW retrievals from Hofx - filter: Bounds Check filter variables: - name: brightnessTemperature @@ -120,42 +138,178 @@ obs filters: clwret_ch37v: 6 clwret_ch37h: 7 clwret_types: [HofX] - maxvalue: 999.0 + maxvalue: 900 +# Save CLW retrievals from HofX +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/clw_hofx + type: float + function: + name: ObsFunction/CLWRetMW + options: + clwret_ch37v: 6 + clwret_ch37h: 7 + clwret_types: [HofX] +# emiss_qc +- filter: BlackList + filter variables: + - name: brightnessTemperature + channels: 1-13 + where: + - variable: + name: ObsFunction/CLWRetMW + options: + clwret_ch37v: 6 + clwret_ch37h: 7 + clwret_types: [ObsValue] + minvalue: 0.0 + maxvalue: 0.05 + - variable: + name: ObsFunction/Emissivity_Diff_GMI + options: + channel: 2 + regression_constant_1: 0.13290 + regression_constant_2: 0.42468 + regression_coeff_1: [-0.00548, 0.00772, 0.00530, -0.00425, + 0.00053, 0.00008, -0.00003, -0.00144, + 0.00059, -0.00016, 0.00003, -0.00011, + 0.00017] + regression_coeff_2: [0.00289, -0.00142] + minvalue: 0.01 + action: + name: reject +- filter: BlackList + filter variables: + - name: brightnessTemperature + channels: 1-13 + where: + - variable: + name: ObsFunction/CLWRetMW + options: + clwret_ch37v: 6 + clwret_ch37h: 7 + clwret_types: [ObsValue] + minvalue: 0.0 + maxvalue: 0.05 + - variable: + name: ObsFunction/Emissivity_Diff_GMI + options: + channel: 4 + regression_constant_1: 0.15627 + regression_constant_2: 0.83807 + regression_coeff_1: [-0.01084, 0.01194, 0.01111, -0.00784, + 0.00060, 0.00008, -0.00003, -0.00248, + 0.00105, -0.00008, 0.00000, -0.00013, + 0.00016] + regression_coeff_2: [0.00048, -0.00207] + minvalue: 0.035 + action: + name: reject +- filter: BlackList + filter variables: + - name: brightnessTemperature + channels: 1-13 + where: + - variable: + name: ObsFunction/CLWRetMW + options: + clwret_ch37v: 6 + clwret_ch37h: 7 + clwret_types: [ObsValue] + minvalue: 0.0 + maxvalue: 0.05 + - variable: + name: ObsFunction/Emissivity_Diff_GMI + options: + channel: 7 + regression_constant_1: 0.30306 + regression_constant_2: 1.24071 + regression_coeff_1: [-0.01793, 0.01730, 0.01784, -0.01199, + 0.00067, 0.00013, -0.00004, -0.00365, + 0.00154, -0.00004, -0.00001, -0.00015, + 0.00017] + regression_coeff_2: [0.00068, -0.00342] + minvalue: 0.05 action: name: reject # Assign observational error in all-sky DA. - filter: BlackList filter variables: - name: brightnessTemperature - channels: 5,6,7,10,12,13 + channels: 1-13 action: name: assign error error function: name: ObsFunction/ObsErrorModelRamp - channels: 5,6,7,10,12,13 + channels: 1-13 options: - channels: 5,6,7,10,12,13 + channels: 1-13 xvar: name: ObsFunction/CLWRetSymmetricMW options: clwret_ch37v: 6 clwret_ch37h: 7 clwret_types: [ObsValue, HofX] - x0: [ 0.050, 0.050, 0.050, + x0: [ 0.050, 0.050, 0.050, 0.050, 0.050, + 0.050, 0.050, 0.050, 0.050, 0.050, 0.050, 0.050, 0.050] - x1: [ 0.200, 0.200, 0.200, + x1: [ 0.200, 0.200, 0.200, 0.200, 0.200, + 0.200, 0.200, 0.200, 0.200, 0.300, 0.200, 0.300, 0.300] - x2: [ 0.500, 0.500, 0.500, + x2: [ 0.500, 0.500, 0.500, 0.500, 0.500, + 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500] - err0: [ 4.000, 3.800,300.000, + err0: [ 2.700, 3.700, 3.500, 4.500, 4.000, + 3.800,300.000, 5.000, 11.500, 5.000, 5.000, 2.500, 3.000] - err1: [11.000, 13.300, 23.000, + err1: [17.000, 23.000, 13.000, 25.000, 11.000, + 13.000, 23.000, 10.000, 20.000, 15.000, 20.000, 8.000, 13.000] - err2: [35.000, 25.300,500.000, + err2: [25.000, 40.000, 40.000, 55.000, 35.000, + 25.000,500.000, 50.000, 50.000, 50.000, 50.000, 30.000, 40.000] - filter: Background Check apply at iterations: 0, 1 filter variables: - name: brightnessTemperature - channels: 5,6,7,10,12,13 + channels: 1,2,4,6 + threshold: 2.0 + absolute threshold: 30.0 + action: + name: reject +- filter: Background Check + apply at iterations: 0, 1 + filter variables: + - name: brightnessTemperature + channels: 9,10,11 threshold: 2.0 + absolute threshold: 20.0 + action: + name: reject +- filter: Background Check + apply at iterations: 0, 1 + filter variables: + - name: brightnessTemperature + channels: 3,5,8 + threshold: 2.0 + absolute threshold: 15.0 + action: + name: reject +- filter: Background Check + apply at iterations: 0, 1 + filter variables: + - name: brightnessTemperature + channels: 12,13 + threshold: 2.0 + absolute threshold: 10.0 + action: + name: reject +- filter: Background Check + apply at iterations: 0, 1 + filter variables: + - name: brightnessTemperature + channels: 7 + threshold: 2.0 + absolute threshold: 5.0 + action: + name: reject diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/gnssrobndnbam.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/gps.yaml similarity index 100% rename from src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/gnssrobndnbam.yaml rename to src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/gps.yaml diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/iasi_metop-a.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/iasi_metop-a.yaml index 6515ca2c..9075bd5a 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/iasi_metop-a.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/iasi_metop-a.yaml @@ -1,5 +1,14 @@ +obs operator: + name: CRTM + Absorbers: [H2O,O3,CO2] + linear obs operator: + Absorbers: [H2O,O3,CO2] + obs options: + Sensor_ID: &Sensor_ID iasi_metop-a + EndianType: little_endian + CoefficientPath: '{{crtm_coeff_dir}}' obs space: - name: iasi_metop-a + name: *Sensor_ID obsdatain: engine: type: H5File @@ -58,13 +67,6 @@ obs space: 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: &Sensor_ID iasi_metop-a - EndianType: little_endian - CoefficientPath: '{{crtm_coeff_dir}}' obs bias: input file: '{{cycle_dir}}/iasi_metop-a.{{background_time}}.satbias.nc4' variational bc: @@ -84,6 +86,74 @@ obs bias: order: 2 - name: scan_angle obs filters: +- filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-a_channels + action: + name: assign error + error parameter vector: [ 0.7270, 0.8100, 0.7500, 0.7900, 0.7055, 0.7400, 0.6800, 0.7200, 0.6526, 0.6500, + 0.6650, 0.6900, 0.6394, 0.6400, 0.6528, 0.6065, 0.6246, 0.6100, 0.6423, 0.5995, + 0.5900, 0.6069, 0.6000, 0.5965, 0.6400, 0.6200, 0.5890, 0.5865, 0.6500, 0.5861, + 0.6100, 0.5874, 0.6800, 0.6060, 0.6800, 4.3800, 3.0500, 2.3100, 1.5600, 1.3300, + 1.5800, 0.9300, 0.5832, 0.5587, 0.5867, 0.5800, 0.5655, 0.5522, 0.5864, 0.5475, + 0.5854, 0.5455, 0.5811, 0.5376, 0.5452, 0.5686, 0.5329, 0.5655, 0.5302, 0.5450, + 0.5628, 0.5900, 0.5262, 0.5590, 0.5264, 0.5442, 0.5100, 0.5513, 0.5224, 0.5523, + 0.5188, 0.5487, 0.5245, 0.5800, 0.5437, 0.5343, 0.5364, 0.6400, 0.5338, 0.7200, + 0.5370, 0.7500, 0.5100, 0.6500, 0.5274, 0.5290, 0.5187, 0.5228, 1.1200, 0.5222, + 0.5109, 0.6700, 0.5133, 0.5179, 0.5070, 0.6700, 0.5091, 0.6200, 0.5093, 0.6900, + 0.5048, 0.5024, 0.7800, 0.4970, 0.5337, 0.4865, 0.4915, 0.4835, 0.4869, 0.8700, + 0.4824, 0.4852, 0.8400, 0.8400, 0.8400, 0.5318, 0.8000, 0.4772, 0.9800, 0.4880, + 0.4978, 0.5157, 0.6100, 0.5213, 0.4884, 0.7900, 0.6200, 0.6600, 0.4691, 0.6500, + 0.4809, 0.4680, 0.6200, 0.4679, 0.6913, 0.4705, 0.4785, 0.4700, 0.4773, 0.4703, + 0.9800, 0.4697, 0.4662, 0.6500, 0.4670, 0.4883, 0.4684, 0.4684, 0.4947, 0.5393, + 0.5024, 0.4715, 0.6210, 0.6136, 0.5316, 1.7800, 0.5099, 1.1400, 0.5390, 1.7900, + 0.5080, 0.5723, 1.9400, 2.0100, 0.4900, 0.5647, 0.5022, 1.4700, 0.5815, 0.6782, + 2.1300, 0.5445, 1.5200, 0.5555, 1.9600, 2.3100, 2.3300, 2.3200, 2.3100, 0.6994, + 0.7006, 0.7060, 0.9785, 0.7023, 0.6991, 0.6946, 2.2800, 2.2600, 2.2600, 2.2600, + 0.6608, 0.6835, 0.6822, 2.2400, 2.2600, 0.6735, 2.2800, 0.6670, 0.7732, 0.6642, + 0.6480, 0.6629, 2.2900, 2.2900, 0.6799, 0.6230, 2.3200, 0.6030, 0.6224, 2.3200, + 0.6187, 2.3100, 2.3100, 2.2800, 2.2900, 2.2800, 2.2600, 1.9660, 2.2700, 2.2600, + 2.2500, 2.2700, 2.2400, 2.2100, 2.2400, 2.1700, 2.1800, 2.1700, 2.2100, 1.4000, + 2.1600, 2.2000, 2.1300, 2.1200, 2.1300, 2.1000, 2.1200, 2.1100, 2.0900, 2.0900, + 2.0800, 2.0900, 2.0400, 2.0400, 1.9660, 2.0100, 2.0500, 2.0300, 2.0600, 1.9800, + 1.9500, 1.9400, 1.9100, 1.8570, 1.7600, 1.7480, 1.8300, 2.0400, 1.7480, 1.9900, + 2.0750, 2.0700, 2.0200, 2.0400, 2.1000, 1.9660, 2.1800, 2.2100, 2.2400, 2.2300, + 2.2300, 1.9800, 2.2000, 2.1800, 2.1800, 2.2100, 2.2300, 2.2400, 2.2400, 2.2500, + 1.8000, 2.2400, 1.7300, 1.7300, 2.2700, 1.6700, 2.2100, 1.7200, 2.2300, 2.2300, + 2.2300, 2.2400, 2.2300, 2.1200, 2.1700, 1.7400, 2.0200, 1.8800, 1.6700, 1.7300, + 1.8300, 1.8200, 1.7300, 1.8300, 2.1900, 1.8400, 1.8900, 1.6000, 1.7100, 1.8600, + 1.8500, 1.8400, 1.8700, 1.9100, 1.5200, 1.9500, 1.8700, 1.8900, 1.9100, 1.9100, + 1.9300, 1.9000, 1.9100, 1.9000, 1.8900, 1.8900, 1.9100, 1.9000, 1.9100, 1.9100, + 1.9100, 1.9300, 1.9400, 1.9100, 1.9200, 1.7700, 1.9100, 1.9500, 1.1900, 1.9600, + 1.9800, 1.9400, 1.5500, 1.9100, 1.9200, 1.9200, 1.9700, 1.9300, 1.9900, 1.8600, + 1.1200, 1.9300, 1.9200, 1.9500, 1.8500, 1.8400, 1.9100, 1.1200, 1.8200, 1.8200, + 1.9500, 1.2400, 1.9400, 1.9600, 1.2100, 1.8300, 1.9600, 1.3600, 1.9600, 1.8200, + 1.9200, 1.6800, 1.9300, 1.2300, 1.9600, 1.9300, 1.8600, 1.4100, 1.1600, 1.6000, + 1.2500, 1.2000, 1.6500, 1.6600, 1.8700, 1.9400, 1.9600, 1.9100, 1.2500, 1.9300, + 1.9100, 1.7000, 0.9900, 1.8100, 1.9200, 1.9500, 1.5000, 1.4700, 1.1500, 1.5800, + 1.1800, 1.8200, 1.1300, 1.8300, 1.9100, 1.2600, 1.2700, 1.9100, 1.4500, 1.6000, + 1.2900, 1.9400, 1.9400, 1.2300, 1.9500, 1.2100, 1.9400, 1.8600, 1.9000, 1.3300, + 1.7500, 2.0200, 1.9800, 2.0300, 1.8300, 1.5000, 2.0400, 2.0200, 1.9000, 2.0000, + 2.0200, 1.9500, 1.9300, 1.9500, 1.9500, 1.9900, 2.0000, 1.9400, 1.9600, 1.8600, + 1.9200, 1.8800, 1.8600, 1.8400, 1.8700, 1.7700, 1.8900, 1.8900, 1.8800, 1.9400, + 1.8200, 1.7900, 1.8600, 2.0600, 2.3300, 1.8800, 1.8600, 1.8100, 1.8000, 1.8000, + 1.8600, 1.9000, 2.0000, 2.0600, 2.1000, 2.2000, 2.0000, 2.1600, 1.9800, 1.8000, + 1.8000, 1.8500, 1.7500, 2.0400, 2.1900, 2.1400, 2.1900, 1.8600, 2.1000, 2.1100, + 2.1800, 2.0300, 2.2800, 2.1900, 2.2600, 2.2600, 2.2100, 2.2100, 2.2600, 2.3300, + 2.2700, 2.2100, 2.1200, 2.2300, 2.2600, 2.2500, 1.8800, 2.2600, 2.2400, 2.3600, + 2.2900, 2.3500, 2.3000, 2.2700, 2.0800, 2.0500, 2.2700, 2.2800, 2.2700, 2.2800, + 1.9700, 2.2500, 2.2500, 2.2500, 2.3100, 2.2800, 2.2700, 2.1300, 2.2400, 2.2800, + 2.2800, 2.4100, 2.3400, 9.3200, 2.2800, 2.3800, 2.2700, 2.2700, 2.3900, 2.1100, + 2.0900, 2.1000, 2.0600, 2.1200, 2.0800, 2.0000, 1.9300, 2.0200, 2.5500, 1.5400, + 1.6400, 1.5100, 1.5500, 2.8200, 2.9200, 2.5500, 2.3700, 1.8500, 1.6000, 1.7200, + 1.7400, 1.7900, 1.9000, 1.9400, 2.0000, 2.0400, 2.0800, 2.1200, 2.1300, 2.1600, + 2.1800, 2.1800, 2.2000, 2.2000, 2.4100, 2.3900, 2.3800, 2.4000, 2.4200, 2.4100, + 2.4300, 2.4500, 2.4300, 2.4500, 2.4300, 2.4000, 2.4400, 2.4000, 2.4200, 2.4300, + 2.4500, 2.4500, 2.4500, 2.4600, 2.4500, 2.4500, 2.4300, 2.5100, 2.4800, 2.4800, + 2.5300, 2.4600, 2.4900, 2.5000, 2.5000, 2.5000, 2.5200, 2.5200, 2.5400, 2.5000, + 2.4800, 2.5000, 2.5500, 2.5000, 2.4800, 2.5000, 2.5000, 2.5200, 2.5200, 2.4800, + 2.5000, 2.5000, 2.5200, 2.4600, 2.5300, 9.0000 ] # Wavenumber Check - filter: BlackList filter variables: @@ -120,7 +190,7 @@ obs filters: - name: brightnessTemperature channels: *iasi_metop-a_channels minvalue: 50.00001 - maxvalue: 449.99999 + maxvalue: 549.99999 action: name: reject # Topography Check @@ -135,7 +205,7 @@ obs filters: channels: *iasi_metop-a_channels options: channels: *iasi_metop-a_channels - sensor: iasi_metop-a + sensor: *Sensor_ID # Transmittance Top Check - filter: BlackList filter variables: @@ -158,130 +228,130 @@ obs filters: 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] + use_flag: &useflag_iasi_metop-a [ 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, + 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, + -1, 1, 1, 1, -1, -1, 1, 1, -1, 1, + -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, + -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, + 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, + 1, -1, -1, -1, 1, 1, 1, 1, -1, 1, + 1, -1, 1, 1, 1, -1, 1, -1, 1, -1, + 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, + 1, 1, -1, -1, -1, 1, -1, 1, -1, 1, + 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, + 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, + -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, -1, 1, -1, 1, -1, + 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, + -1, 1, -1, 1, -1, -1, -1, -1, -1, 1, + 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, + 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, + 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, + 1, -1, -1, -1, -1, -1, -1, 1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, + -1, -1, -1, 1, -1, 1, -1, -1, 1, -1, + 1, -1, -1, -1, -1, 1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -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: &clddet_iasi_metop-a [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 31, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 31, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 31, 1, 1, 1, 1, 1, + 1, 1, 1, 31, 1, 31, 1, 1, 31, 1, + 31, 1, 1, 1, 1, 31, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 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: @@ -296,68 +366,7 @@ obs filters: 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: *useflag_iasi_metop-a 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 @@ -397,68 +406,84 @@ obs filters: 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] + obserr_bound_max: [ 3.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, + 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, + 2.00, 2.00, 4.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, + 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 4.00, 4.00, + 3.50, 2.50, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, + 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, + 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, + 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 0.75, 2.00, + 0.75, 2.00, 2.00, 2.00, 0.75, 0.75, 0.75, 0.75, 2.00, 0.75, + 0.75, 2.00, 0.75, 0.75, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, + 2.00, 2.00, 2.00, 2.00, 2.50, 2.00, 2.50, 2.50, 3.00, 2.50, + 2.50, 2.50, 2.50, 3.50, 2.50, 2.50, 3.00, 3.50, 3.00, 4.00, + 4.00, 0.75, 4.00, 4.00, 4.00, 4.50, 4.50, 4.50, 4.50, 4.50, + 4.00, 4.50, 4.00, 4.00, 4.50, 2.50, 3.00, 2.50, 3.00, 2.50, + 3.00, 2.00, 2.50, 2.50, 3.00, 3.00, 2.50, 3.00, 3.00, 3.00, + 2.50, 2.50, 4.00, 4.50, 4.50, 5.00, 4.00, 4.00, 5.00, 5.00, + 5.00, 5.00, 5.50, 5.50, 4.00, 5.00, 4.00, 4.50, 5.50, 5.50, + 6.00, 4.50, 4.50, 4.00, 5.00, 5.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 1.25, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 1.25, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 1.50, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 1.40, 6.00, 1.40, 6.00, 6.00, 1.40, 6.00, + 1.50, 6.00, 6.00, 6.00, 6.00, 1.50, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 5.50, 4.50, 6.00, + 5.00, 5.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 5.00, 6.00, + 6.00, 6.00, 4.00, 6.00, 6.00, 6.00, 6.00, 4.50, 6.00, 6.00, + 4.50, 6.00, 6.00, 6.00, 6.00, 6.00, 5.00, 6.00, 6.00, 6.00, + 5.00, 6.00, 6.00, 5.00, 6.00, 5.00, 6.00, 6.00, 6.00, 5.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00 ] + action: + name: reject +# Surface Type Check +- filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-a_channels + test variables: + - name: SurfTypeCheckRad@ObsFunction + channels: *iasi_metop-a_channels + options: + channels: *iasi_metop-a_channels + use_flag: *useflag_iasi_metop-a + use_flag_clddet: *clddet_iasi_metop-a + maxvalue: 1.0e-12 + defer to post: true action: name: reject # Useflag Check @@ -471,68 +496,8 @@ obs filters: 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 passive_bc: true + use_flag: *useflag_iasi_metop-a minvalue: 1.0e-12 action: name: reject diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/iasi_metop-b.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/iasi_metop-b.yaml index af5f899a..ee513a7f 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/iasi_metop-b.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/iasi_metop-b.yaml @@ -1,5 +1,14 @@ +obs operator: + name: CRTM + Absorbers: [H2O,O3,CO2] + linear obs operator: + Absorbers: [H2O,O3,CO2] + obs options: + Sensor_ID: &Sensor_ID iasi_metop-b + EndianType: little_endian + CoefficientPath: '{{crtm_coeff_dir}}' obs space: - name: iasi_metop-b + name: *Sensor_ID obsdatain: engine: type: H5File @@ -58,13 +67,6 @@ obs space: 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: &Sensor_ID iasi_metop-b - EndianType: little_endian - CoefficientPath: '{{crtm_coeff_dir}}' obs bias: input file: '{{cycle_dir}}/iasi_metop-b.{{background_time}}.satbias.nc4' variational bc: @@ -84,6 +86,74 @@ obs bias: order: 2 - name: scan_angle obs filters: +- filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-b_channels + action: + name: assign error + error parameter vector: [ 0.7270, 0.8100, 0.7500, 0.7900, 0.7055, 0.7400, 0.6800, 0.7200, 0.6526, 0.6500, + 0.6650, 0.6900, 0.6394, 0.6400, 0.6528, 0.6065, 0.6246, 0.6100, 0.6423, 0.5995, + 0.5900, 0.6069, 0.6000, 0.5965, 0.6400, 0.6200, 0.5890, 0.5865, 0.6500, 0.5861, + 0.6100, 0.5874, 0.6800, 0.6060, 0.6800, 4.3800, 3.0500, 2.3100, 1.5600, 1.3300, + 1.5800, 0.9300, 0.5832, 0.5587, 0.5867, 0.5800, 0.5655, 0.5522, 0.5864, 0.5475, + 0.5854, 0.5455, 0.5811, 0.5376, 0.5452, 0.5686, 0.5329, 0.5655, 0.5302, 0.5450, + 0.5628, 0.5900, 0.5262, 0.5590, 0.5264, 0.5442, 0.5100, 0.5513, 0.5224, 0.5523, + 0.5188, 0.5487, 0.5245, 0.5800, 0.5437, 0.5343, 0.5364, 0.6400, 0.5338, 0.7200, + 0.5370, 0.7500, 0.5100, 0.6500, 0.5274, 0.5290, 0.5187, 0.5228, 1.1200, 0.5222, + 0.5109, 0.6700, 0.5133, 0.5179, 0.5070, 0.6700, 0.5091, 0.6200, 0.5093, 0.6900, + 0.5048, 0.5024, 0.7800, 0.4970, 0.5337, 0.4865, 0.4915, 0.4835, 0.4869, 0.8700, + 0.4824, 0.4852, 0.8400, 0.8400, 0.8400, 0.5318, 0.8000, 0.4772, 0.9800, 0.4880, + 0.4978, 0.5157, 0.6100, 0.5213, 0.4884, 0.7900, 0.6200, 0.6600, 0.4691, 0.6500, + 0.4809, 0.4680, 0.6200, 0.4679, 0.6913, 0.4705, 0.4785, 0.4700, 0.4773, 0.4703, + 0.9800, 0.4697, 0.4662, 0.6500, 0.4670, 0.4883, 0.4684, 0.4684, 0.4947, 0.5393, + 0.5024, 0.4715, 0.6210, 0.6136, 0.5316, 1.7800, 0.5099, 1.1400, 0.5390, 1.7900, + 0.5080, 0.5723, 1.9400, 2.0100, 0.4900, 0.5647, 0.5022, 1.4700, 0.5815, 0.6782, + 2.1300, 0.5445, 1.5200, 0.5555, 1.9600, 2.3100, 2.3300, 2.3200, 2.3100, 0.6994, + 0.7006, 0.7060, 0.9785, 0.7023, 0.6991, 0.6946, 2.2800, 2.2600, 2.2600, 2.2600, + 0.6608, 0.6835, 0.6822, 2.2400, 2.2600, 0.6735, 2.2800, 0.6670, 0.7732, 0.6642, + 0.6480, 0.6629, 2.2900, 2.2900, 0.6799, 0.6230, 2.3200, 0.6030, 0.6224, 2.3200, + 0.6187, 2.3100, 2.3100, 2.2800, 2.2900, 2.2800, 2.2600, 1.9660, 2.2700, 2.2600, + 2.2500, 2.2700, 2.2400, 2.2100, 2.2400, 2.1700, 2.1800, 2.1700, 2.2100, 1.4000, + 2.1600, 2.2000, 2.1300, 2.1200, 2.1300, 2.1000, 2.1200, 2.1100, 2.0900, 2.0900, + 2.0800, 2.0900, 2.0400, 2.0400, 1.9660, 2.0100, 2.0500, 2.0300, 2.0600, 1.9800, + 1.9500, 1.9400, 1.9100, 1.8570, 1.7600, 1.7480, 1.8300, 2.0400, 1.7480, 1.9900, + 2.0750, 2.0700, 2.0200, 2.0400, 2.1000, 1.9660, 2.1800, 2.2100, 2.2400, 2.2300, + 2.2300, 1.9800, 2.2000, 2.1800, 2.1800, 2.2100, 2.2300, 2.2400, 2.2400, 2.2500, + 1.8000, 2.2400, 1.7300, 1.7300, 2.2700, 1.6700, 2.2100, 1.7200, 2.2300, 2.2300, + 2.2300, 2.2400, 2.2300, 2.1200, 2.1700, 1.7400, 2.0200, 1.8800, 1.6700, 1.7300, + 1.8300, 1.8200, 1.7300, 1.8300, 2.1900, 1.8400, 1.8900, 1.6000, 1.7100, 1.8600, + 1.8500, 1.8400, 1.8700, 1.9100, 1.5200, 1.9500, 1.8700, 1.8900, 1.9100, 1.9100, + 1.9300, 1.9000, 1.9100, 1.9000, 1.8900, 1.8900, 1.9100, 1.9000, 1.9100, 1.9100, + 1.9100, 1.9300, 1.9400, 1.9100, 1.9200, 1.7700, 1.9100, 1.9500, 1.1900, 1.9600, + 1.9800, 1.9400, 1.5500, 1.9100, 1.9200, 1.9200, 1.9700, 1.9300, 1.9900, 1.8600, + 1.1200, 1.9300, 1.9200, 1.9500, 1.8500, 1.8400, 1.9100, 1.1200, 1.8200, 1.8200, + 1.9500, 1.2400, 1.9400, 1.9600, 1.2100, 1.8300, 1.9600, 1.3600, 1.9600, 1.8200, + 1.9200, 1.6800, 1.9300, 1.2300, 1.9600, 1.9300, 1.8600, 1.4100, 1.1600, 1.6000, + 1.2500, 1.2000, 1.6500, 1.6600, 1.8700, 1.9400, 1.9600, 1.9100, 1.2500, 1.9300, + 1.9100, 1.7000, 0.9900, 1.8100, 1.9200, 1.9500, 1.5000, 1.4700, 1.1500, 1.5800, + 1.1800, 1.8200, 1.1300, 1.8300, 1.9100, 1.2600, 1.2700, 1.9100, 1.4500, 1.6000, + 1.2900, 1.9400, 1.9400, 1.2300, 1.9500, 1.2100, 1.9400, 1.8600, 1.9000, 1.3300, + 1.7500, 2.0200, 1.9800, 2.0300, 1.8300, 1.5000, 2.0400, 2.0200, 1.9000, 2.0000, + 2.0200, 1.9500, 1.9300, 1.9500, 1.9500, 1.9900, 2.0000, 1.9400, 1.9600, 1.8600, + 1.9200, 1.8800, 1.8600, 1.8400, 1.8700, 1.7700, 1.8900, 1.8900, 1.8800, 1.9400, + 1.8200, 1.7900, 1.8600, 2.0600, 2.3300, 1.8800, 1.8600, 1.8100, 1.8000, 1.8000, + 1.8600, 1.9000, 2.0000, 2.0600, 2.1000, 2.2000, 2.0000, 2.1600, 1.9800, 1.8000, + 1.8000, 1.8500, 1.7500, 2.0400, 2.1900, 2.1400, 2.1900, 1.8600, 2.1000, 2.1100, + 2.1800, 2.0300, 2.2800, 2.1900, 2.2600, 2.2600, 2.2100, 2.2100, 2.2600, 2.3300, + 2.2700, 2.2100, 2.1200, 2.2300, 2.2600, 2.2500, 1.8800, 2.2600, 2.2400, 2.3600, + 2.2900, 2.3500, 2.3000, 2.2700, 2.0800, 2.0500, 2.2700, 2.2800, 2.2700, 2.2800, + 1.9700, 2.2500, 2.2500, 2.2500, 2.3100, 2.2800, 2.2700, 2.1300, 2.2400, 2.2800, + 2.2800, 2.4100, 2.3400, 9.3200, 2.2800, 2.3800, 2.2700, 2.2700, 2.3900, 2.1100, + 2.0900, 2.1000, 2.0600, 2.1200, 2.0800, 2.0000, 1.9300, 2.0200, 2.5500, 1.5400, + 1.6400, 1.5100, 1.5500, 2.8200, 2.9200, 2.5500, 2.3700, 1.8500, 1.6000, 1.7200, + 1.7400, 1.7900, 1.9000, 1.9400, 2.0000, 2.0400, 2.0800, 2.1200, 2.1300, 2.1600, + 2.1800, 2.1800, 2.2000, 2.2000, 2.4100, 2.3900, 2.3800, 2.4000, 2.4200, 2.4100, + 2.4300, 2.4500, 2.4300, 2.4500, 2.4300, 2.4000, 2.4400, 2.4000, 2.4200, 2.4300, + 2.4500, 2.4500, 2.4500, 2.4600, 2.4500, 2.4500, 2.4300, 2.5100, 2.4800, 2.4800, + 2.5300, 2.4600, 2.4900, 2.5000, 2.5000, 2.5000, 2.5200, 2.5200, 2.5400, 2.5000, + 2.4800, 2.5000, 2.5500, 2.5000, 2.4800, 2.5000, 2.5000, 2.5200, 2.5200, 2.4800, + 2.5000, 2.5000, 2.5200, 2.4600, 2.5300, 9.0000 ] # Wavenumber Check - filter: BlackList filter variables: @@ -120,7 +190,7 @@ obs filters: - name: brightnessTemperature channels: *iasi_metop-b_channels minvalue: 50.00001 - maxvalue: 449.99999 + maxvalue: 549.99999 action: name: reject # Topography Check @@ -135,7 +205,7 @@ obs filters: channels: *iasi_metop-b_channels options: channels: *iasi_metop-b_channels - sensor: iasi_metop-b + sensor: *Sensor_ID # Transmittance Top Check - filter: BlackList filter variables: @@ -158,130 +228,130 @@ obs filters: 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] + use_flag: &useflag_iasi_metop-b [ 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, + 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, + -1, 1, 1, 1, -1, -1, 1, 1, -1, 1, + -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, + -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, + 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, + 1, -1, -1, -1, 1, 1, 1, 1, -1, 1, + 1, -1, 1, 1, 1, -1, 1, -1, 1, -1, + 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, + 1, 1, -1, -1, -1, 1, -1, 1, -1, 1, + 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, + 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, + -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, -1, 1, -1, 1, -1, + 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, + -1, 1, -1, 1, -1, -1, -1, -1, -1, 1, + 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, + 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, + 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, + 1, -1, -1, -1, -1, -1, -1, 1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, + -1, -1, -1, 1, -1, 1, -1, -1, 1, -1, + 1, -1, -1, -1, -1, 1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -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: &clddet_iasi_metop-b [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 31, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 31, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 31, 1, 1, 1, 1, 1, + 1, 1, 1, 31, 1, 31, 1, 1, 31, 1, + 31, 1, 1, 1, 1, 31, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 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: @@ -296,68 +366,7 @@ obs filters: 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: *useflag_iasi_metop-b 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 @@ -397,68 +406,84 @@ obs filters: 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] + obserr_bound_max: [ 3.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, + 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, + 2.00, 2.00, 4.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, + 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 4.00, 4.00, + 3.50, 2.50, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, + 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, + 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, + 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 0.75, 2.00, + 0.75, 2.00, 2.00, 2.00, 0.75, 0.75, 0.75, 0.75, 2.00, 0.75, + 0.75, 2.00, 0.75, 0.75, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, + 2.00, 2.00, 2.00, 2.00, 2.50, 2.00, 2.50, 2.50, 3.00, 2.50, + 2.50, 2.50, 2.50, 3.50, 2.50, 2.50, 3.00, 3.50, 3.00, 4.00, + 4.00, 0.75, 4.00, 4.00, 4.00, 4.50, 4.50, 4.50, 4.50, 4.50, + 4.00, 4.50, 4.00, 4.00, 4.50, 2.50, 3.00, 2.50, 3.00, 2.50, + 3.00, 2.00, 2.50, 2.50, 3.00, 3.00, 2.50, 3.00, 3.00, 3.00, + 2.50, 2.50, 4.00, 4.50, 4.50, 5.00, 4.00, 4.00, 5.00, 5.00, + 5.00, 5.00, 5.50, 5.50, 4.00, 5.00, 4.00, 4.50, 5.50, 5.50, + 6.00, 4.50, 4.50, 4.00, 5.00, 5.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 1.25, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 1.25, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 1.50, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 1.40, 6.00, 1.40, 6.00, 6.00, 1.40, 6.00, + 1.50, 6.00, 6.00, 6.00, 6.00, 1.50, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 5.50, 4.50, 6.00, + 5.00, 5.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 5.00, 6.00, + 6.00, 6.00, 4.00, 6.00, 6.00, 6.00, 6.00, 4.50, 6.00, 6.00, + 4.50, 6.00, 6.00, 6.00, 6.00, 6.00, 5.00, 6.00, 6.00, 6.00, + 5.00, 6.00, 6.00, 5.00, 6.00, 5.00, 6.00, 6.00, 6.00, 5.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00 ] + action: + name: reject +# Surface Type Check +- filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-b_channels + test variables: + - name: SurfTypeCheckRad@ObsFunction + channels: *iasi_metop-b_channels + options: + channels: *iasi_metop-b_channels + use_flag: *useflag_iasi_metop-b + use_flag_clddet: *clddet_iasi_metop-b + maxvalue: 1.0e-12 + defer to post: true action: name: reject # Useflag Check @@ -471,68 +496,8 @@ obs filters: 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 passive_bc: true + use_flag: *useflag_iasi_metop-b minvalue: 1.0e-12 action: name: reject diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/iasi_metop-c.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/iasi_metop-c.yaml new file mode 100644 index 00000000..97ec2366 --- /dev/null +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/iasi_metop-c.yaml @@ -0,0 +1,503 @@ +obs operator: + name: CRTM + Absorbers: [H2O,O3,CO2] + linear obs operator: + Absorbers: [H2O,O3,CO2] + obs options: + Sensor_ID: &Sensor_ID iasi_metop-c + EndianType: little_endian + CoefficientPath: '{{crtm_coeff_dir}}' +obs space: + name: *Sensor_ID + obsdatain: + engine: + type: H5File + obsfile: '{{cycle_dir}}/iasi_metop-c.{{window_begin}}.nc4' + obsdataout: + engine: + type: H5File + obsfile: '{{cycle_dir}}/{{experiment_id}}.iasi_metop-c.{{window_begin}}.nc4' + simulated variables: [brightnessTemperature] + channels: &iasi_metop-c_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 bias: + input file: '{{cycle_dir}}/iasi_metop-c.{{background_time}}.satbias.nc4' + variational bc: + predictors: + - name: constant + - name: lapse_rate + order: 2 + tlapse: &iasi_metop-c_tlapse '{{cycle_dir}}/iasi_metop-c.{{background_time}}.tlapse.txt' + - name: lapse_rate + tlapse: *iasi_metop-c_tlapse + - name: emissivity + - name: scan_angle + order: 4 + - name: scan_angle + order: 3 + - name: scan_angle + order: 2 + - name: scan_angle +obs filters: +- filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-c_channels + action: + name: assign error + error parameter vector: [ 0.7270, 0.8100, 0.7500, 0.7900, 0.7055, 0.7400, 0.6800, 0.7200, 0.6526, 0.6500, + 0.6650, 0.6900, 0.6394, 0.6400, 0.6528, 0.6065, 0.6246, 0.6100, 0.6423, 0.5995, + 0.5900, 0.6069, 0.6000, 0.5965, 0.6400, 0.6200, 0.5890, 0.5865, 0.6500, 0.5861, + 0.6100, 0.5874, 0.6800, 0.6060, 0.6800, 4.3800, 3.0500, 2.3100, 1.5600, 1.3300, + 1.5800, 0.9300, 0.5832, 0.5587, 0.5867, 0.5800, 0.5655, 0.5522, 0.5864, 0.5475, + 0.5854, 0.5455, 0.5811, 0.5376, 0.5452, 0.5686, 0.5329, 0.5655, 0.5302, 0.5450, + 0.5628, 0.5900, 0.5262, 0.5590, 0.5264, 0.5442, 0.5100, 0.5513, 0.5224, 0.5523, + 0.5188, 0.5487, 0.5245, 0.5800, 0.5437, 0.5343, 0.5364, 0.6400, 0.5338, 0.7200, + 0.5370, 0.7500, 0.5100, 0.6500, 0.5274, 0.5290, 0.5187, 0.5228, 1.1200, 0.5222, + 0.5109, 0.6700, 0.5133, 0.5179, 0.5070, 0.6700, 0.5091, 0.6200, 0.5093, 0.6900, + 0.5048, 0.5024, 0.7800, 0.4970, 0.5337, 0.4865, 0.4915, 0.4835, 0.4869, 0.8700, + 0.4824, 0.4852, 0.8400, 0.8400, 0.8400, 0.5318, 0.8000, 0.4772, 0.9800, 0.4880, + 0.4978, 0.5157, 0.6100, 0.5213, 0.4884, 0.7900, 0.6200, 0.6600, 0.4691, 0.6500, + 0.4809, 0.4680, 0.6200, 0.4679, 0.6913, 0.4705, 0.4785, 0.4700, 0.4773, 0.4703, + 0.9800, 0.4697, 0.4662, 0.6500, 0.4670, 0.4883, 0.4684, 0.4684, 0.4947, 0.5393, + 0.5024, 0.4715, 0.6210, 0.6136, 0.5316, 1.7800, 0.5099, 1.1400, 0.5390, 1.7900, + 0.5080, 0.5723, 1.9400, 2.0100, 0.4900, 0.5647, 0.5022, 1.4700, 0.5815, 0.6782, + 2.1300, 0.5445, 1.5200, 0.5555, 1.9600, 2.3100, 2.3300, 2.3200, 2.3100, 0.6994, + 0.7006, 0.7060, 0.9785, 0.7023, 0.6991, 0.6946, 2.2800, 2.2600, 2.2600, 2.2600, + 0.6608, 0.6835, 0.6822, 2.2400, 2.2600, 0.6735, 2.2800, 0.6670, 0.7732, 0.6642, + 0.6480, 0.6629, 2.2900, 2.2900, 0.6799, 0.6230, 2.3200, 0.6030, 0.6224, 2.3200, + 0.6187, 2.3100, 2.3100, 2.2800, 2.2900, 2.2800, 2.2600, 1.9660, 2.2700, 2.2600, + 2.2500, 2.2700, 2.2400, 2.2100, 2.2400, 2.1700, 2.1800, 2.1700, 2.2100, 1.4000, + 2.1600, 2.2000, 2.1300, 2.1200, 2.1300, 2.1000, 2.1200, 2.1100, 2.0900, 2.0900, + 2.0800, 2.0900, 2.0400, 2.0400, 1.9660, 2.0100, 2.0500, 2.0300, 2.0600, 1.9800, + 1.9500, 1.9400, 1.9100, 1.8570, 1.7600, 1.7480, 1.8300, 2.0400, 1.7480, 1.9900, + 2.0750, 2.0700, 2.0200, 2.0400, 2.1000, 1.9660, 2.1800, 2.2100, 2.2400, 2.2300, + 2.2300, 1.9800, 2.2000, 2.1800, 2.1800, 2.2100, 2.2300, 2.2400, 2.2400, 2.2500, + 1.8000, 2.2400, 1.7300, 1.7300, 2.2700, 1.6700, 2.2100, 1.7200, 2.2300, 2.2300, + 2.2300, 2.2400, 2.2300, 2.1200, 2.1700, 1.7400, 2.0200, 1.8800, 1.6700, 1.7300, + 1.8300, 1.8200, 1.7300, 1.8300, 2.1900, 1.8400, 1.8900, 1.6000, 1.7100, 1.8600, + 1.8500, 1.8400, 1.8700, 1.9100, 1.5200, 1.9500, 1.8700, 1.8900, 1.9100, 1.9100, + 1.9300, 1.9000, 1.9100, 1.9000, 1.8900, 1.8900, 1.9100, 1.9000, 1.9100, 1.9100, + 1.9100, 1.9300, 1.9400, 1.9100, 1.9200, 1.7700, 1.9100, 1.9500, 1.1900, 1.9600, + 1.9800, 1.9400, 1.5500, 1.9100, 1.9200, 1.9200, 1.9700, 1.9300, 1.9900, 1.8600, + 1.1200, 1.9300, 1.9200, 1.9500, 1.8500, 1.8400, 1.9100, 1.1200, 1.8200, 1.8200, + 1.9500, 1.2400, 1.9400, 1.9600, 1.2100, 1.8300, 1.9600, 1.3600, 1.9600, 1.8200, + 1.9200, 1.6800, 1.9300, 1.2300, 1.9600, 1.9300, 1.8600, 1.4100, 1.1600, 1.6000, + 1.2500, 1.2000, 1.6500, 1.6600, 1.8700, 1.9400, 1.9600, 1.9100, 1.2500, 1.9300, + 1.9100, 1.7000, 0.9900, 1.8100, 1.9200, 1.9500, 1.5000, 1.4700, 1.1500, 1.5800, + 1.1800, 1.8200, 1.1300, 1.8300, 1.9100, 1.2600, 1.2700, 1.9100, 1.4500, 1.6000, + 1.2900, 1.9400, 1.9400, 1.2300, 1.9500, 1.2100, 1.9400, 1.8600, 1.9000, 1.3300, + 1.7500, 2.0200, 1.9800, 2.0300, 1.8300, 1.5000, 2.0400, 2.0200, 1.9000, 2.0000, + 2.0200, 1.9500, 1.9300, 1.9500, 1.9500, 1.9900, 2.0000, 1.9400, 1.9600, 1.8600, + 1.9200, 1.8800, 1.8600, 1.8400, 1.8700, 1.7700, 1.8900, 1.8900, 1.8800, 1.9400, + 1.8200, 1.7900, 1.8600, 2.0600, 2.3300, 1.8800, 1.8600, 1.8100, 1.8000, 1.8000, + 1.8600, 1.9000, 2.0000, 2.0600, 2.1000, 2.2000, 2.0000, 2.1600, 1.9800, 1.8000, + 1.8000, 1.8500, 1.7500, 2.0400, 2.1900, 2.1400, 2.1900, 1.8600, 2.1000, 2.1100, + 2.1800, 2.0300, 2.2800, 2.1900, 2.2600, 2.2600, 2.2100, 2.2100, 2.2600, 2.3300, + 2.2700, 2.2100, 2.1200, 2.2300, 2.2600, 2.2500, 1.8800, 2.2600, 2.2400, 2.3600, + 2.2900, 2.3500, 2.3000, 2.2700, 2.0800, 2.0500, 2.2700, 2.2800, 2.2700, 2.2800, + 1.9700, 2.2500, 2.2500, 2.2500, 2.3100, 2.2800, 2.2700, 2.1300, 2.2400, 2.2800, + 2.2800, 2.4100, 2.3400, 9.3200, 2.2800, 2.3800, 2.2700, 2.2700, 2.3900, 2.1100, + 2.0900, 2.1000, 2.0600, 2.1200, 2.0800, 2.0000, 1.9300, 2.0200, 2.5500, 1.5400, + 1.6400, 1.5100, 1.5500, 2.8200, 2.9200, 2.5500, 2.3700, 1.8500, 1.6000, 1.7200, + 1.7400, 1.7900, 1.9000, 1.9400, 2.0000, 2.0400, 2.0800, 2.1200, 2.1300, 2.1600, + 2.1800, 2.1800, 2.2000, 2.2000, 2.4100, 2.3900, 2.3800, 2.4000, 2.4200, 2.4100, + 2.4300, 2.4500, 2.4300, 2.4500, 2.4300, 2.4000, 2.4400, 2.4000, 2.4200, 2.4300, + 2.4500, 2.4500, 2.4500, 2.4600, 2.4500, 2.4500, 2.4300, 2.5100, 2.4800, 2.4800, + 2.5300, 2.4600, 2.4900, 2.5000, 2.5000, 2.5000, 2.5200, 2.5200, 2.5400, 2.5000, + 2.4800, 2.5000, 2.5500, 2.5000, 2.4800, 2.5000, 2.5000, 2.5200, 2.5200, 2.4800, + 2.5000, 2.5000, 2.5200, 2.4600, 2.5300, 9.0000 ] +# Wavenumber Check +- filter: BlackList + 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: GeoVaLs/water_area_fraction + minvalue: 1.0e-12 + action: + name: reject +- filter: BlackList + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-c_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorWavenumIR + channels: *iasi_metop-c_channels + options: + channels: *iasi_metop-c_channels +# Observation Range Sanity Check +- filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-c_channels + minvalue: 50.00001 + maxvalue: 549.99999 + action: + name: reject +# Topography Check +- filter: BlackList + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-c_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorTopoRad + channels: *iasi_metop-c_channels + options: + channels: *iasi_metop-c_channels + sensor: *Sensor_ID +# Transmittance Top Check +- filter: BlackList + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-c_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorTransmitTopRad + channels: *iasi_metop-c_channels + options: + channels: *iasi_metop-c_channels +# Cloud Detection Check +- filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-c_channels + test variables: + - name: ObsFunction/CloudDetectMinResidualIR + channels: *iasi_metop-c_channels + options: + channels: *iasi_metop-c_channels + use_flag: &useflag_iasi_metop-c [ 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, + 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, + -1, 1, 1, 1, -1, -1, 1, 1, -1, 1, + -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, + -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, + 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, + 1, -1, -1, -1, 1, 1, 1, 1, -1, 1, + 1, -1, 1, 1, 1, -1, 1, -1, 1, -1, + 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, + 1, 1, -1, -1, -1, 1, -1, 1, -1, 1, + 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, + 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, + -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, -1, 1, -1, 1, -1, + 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, + -1, 1, -1, 1, -1, -1, -1, -1, -1, 1, + 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, + 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, + 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, + 1, -1, -1, -1, -1, -1, -1, 1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, + -1, -1, -1, 1, -1, 1, -1, -1, 1, -1, + 1, -1, -1, -1, -1, 1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -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: &clddet_iasi_metop-c [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 31, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 31, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 31, 1, 1, 1, 1, 1, + 1, 1, 1, 31, 1, 31, 1, 1, 31, 1, + 31, 1, 1, 1, 1, 31, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 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 +# NSST Retrieval Check +- filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-c_channels + test variables: + - name: ObsFunction/NearSSTRetCheckIR + channels: *iasi_metop-c_channels + options: + channels: *iasi_metop-c_channels + use_flag: *useflag_iasi_metop-c + 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: brightnessTemperature + channels: *iasi_metop-c_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorSurfJacobianRad + channels: *iasi_metop-c_channels + options: + channels: *iasi_metop-c_channels + sensor: *Sensor_ID + 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: brightnessTemperature + channels: *iasi_metop-c_channels + function absolute threshold: + - name: ObsFunction/ObsErrorBoundIR + channels: *iasi_metop-c_channels + options: + channels: *iasi_metop-c_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-c_channels + options: + channels: *iasi_metop-c_channels + obserr_bound_max: [ 3.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, + 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, + 2.00, 2.00, 4.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, + 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 4.00, 4.00, + 3.50, 2.50, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, + 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, + 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, + 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 0.75, 2.00, + 0.75, 2.00, 2.00, 2.00, 0.75, 0.75, 0.75, 0.75, 2.00, 0.75, + 0.75, 2.00, 0.75, 0.75, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, + 2.00, 2.00, 2.00, 2.00, 2.50, 2.00, 2.50, 2.50, 3.00, 2.50, + 2.50, 2.50, 2.50, 3.50, 2.50, 2.50, 3.00, 3.50, 3.00, 4.00, + 4.00, 0.75, 4.00, 4.00, 4.00, 4.50, 4.50, 4.50, 4.50, 4.50, + 4.00, 4.50, 4.00, 4.00, 4.50, 2.50, 3.00, 2.50, 3.00, 2.50, + 3.00, 2.00, 2.50, 2.50, 3.00, 3.00, 2.50, 3.00, 3.00, 3.00, + 2.50, 2.50, 4.00, 4.50, 4.50, 5.00, 4.00, 4.00, 5.00, 5.00, + 5.00, 5.00, 5.50, 5.50, 4.00, 5.00, 4.00, 4.50, 5.50, 5.50, + 6.00, 4.50, 4.50, 4.00, 5.00, 5.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 1.25, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 1.25, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 1.50, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 1.40, 6.00, 1.40, 6.00, 6.00, 1.40, 6.00, + 1.50, 6.00, 6.00, 6.00, 6.00, 1.50, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 5.50, 4.50, 6.00, + 5.00, 5.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 5.00, 6.00, + 6.00, 6.00, 4.00, 6.00, 6.00, 6.00, 6.00, 4.50, 6.00, 6.00, + 4.50, 6.00, 6.00, 6.00, 6.00, 6.00, 5.00, 6.00, 6.00, 6.00, + 5.00, 6.00, 6.00, 5.00, 6.00, 5.00, 6.00, 6.00, 6.00, 5.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, 6.00, + 6.00, 6.00, 6.00, 6.00, 6.00, 6.00 ] + action: + name: reject +# Surface Type Check +- filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-c_channels + test variables: + - name: SurfTypeCheckRad@ObsFunction + channels: *iasi_metop-c_channels + options: + channels: *iasi_metop-c_channels + use_flag: *useflag_iasi_metop-c + use_flag_clddet: *clddet_iasi_metop-c + maxvalue: 1.0e-12 + defer to post: true + action: + name: reject +# Useflag Check +- filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *iasi_metop-c_channels + test variables: + - name: ObsFunction/ChannelUseflagCheckRad + channels: *iasi_metop-c_channels + options: + channels: *iasi_metop-c_channels + use passive_bc: true + use_flag: *useflag_iasi_metop-c + minvalue: 1.0e-12 + action: + name: reject diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/mhs_n19.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/mhs_n19.yaml index c06291d2..21cdf9c4 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/mhs_n19.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/mhs_n19.yaml @@ -9,12 +9,17 @@ obs space: type: H5File obsfile: '{{cycle_dir}}/{{experiment_id}}.mhs_n19.{{window_begin}}.nc4' simulated variables: [brightnessTemperature] - channels: 1-5 + channels: &mhs_n19_channels 1-5 obs operator: name: CRTM Absorbers: [H2O,O3,CO2] + Clouds: [Water, Ice, Rain, Snow] + Cloud_Fraction: 1.0 + linear obs operator: + Absorbers: [H2O,O3,CO2] + Clouds: [Water] obs options: - Sensor_ID: mhs_n19 + Sensor_ID: &Sensor_ID mhs_n19 EndianType: little_endian CoefficientPath: '{{crtm_coeff_dir}}' obs bias: @@ -35,3 +40,269 @@ obs bias: - name: scan_angle order: 2 - name: scan_angle +obs filters: +- filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *mhs_n19_channels + minvalue: 50.0 + maxvalue: 550.0 +- filter: Domain Check + filter variables: + - name: brightnessTemperature + channels: mhs_n19_channels + where: + - variable: + name: MetaData/sensorScanPosition + minvalue: 10 + maxvalue: 81 +- filter: BlackList + filter variables: + - name: brightnessTemperature + channels: 1-3 + where: + - variable: + name: MetaData/latitude + minvalue: -25.0 + maxvalue: -10.0 + - variable: + name: MetaData/longitude + minvalue: 260.0 + maxvalue: 300.0 + action: + name: reject +- filter: BlackList + filter variables: + - name: brightnessTemperature + channels: mhs_n19_channels + where: + - variable: + name: GeoVaLs/surface_snow_area_fraction + minvalue: 0.01 +# ice surface +- filter: BlackList + filter variables: + - name: brightnessTemperature + channels: mhs_n19_channels + where: + - variable: + name: GeoVaLs/ice_area_fraction + minvalue: 0.01 +# mixed surface +- filter: BlackList + filter variables: + - name: brightnessTemperature + channels: mhs_n19_channels + where: + - variable: + name: GeoVaLs/water_area_fraction + maxvalue: 0.99 + - variable: + name: GeoVaLs/land_area_fraction + maxvalue: 0.99 +- filter: BlackList + filter variables: + - name: brightnessTemperature + channels: mhs_n19_channels + where: + - variable: + name: GeoVaLs/water_area_fraction + minvalue: 0.99 + - variable: + name: GeoVaLs/average_surface_temperature_within_field_of_view + maxvalue: 275 +- filter: BlackList + filter variables: + - name: brightnessTemperature + channels: mhs_n19_channels + where: + - variable: + name: GeoVaLs/water_area_fraction + maxvalue: 0.99 + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelRamp + channels: mhs_n19_channels + options: + channels: mhs_n19_channels + xvar: + name: ObsFunction/CLWRetSymmetricMW + options: + clwret_ch89v: 1 + clwret_ch166v: 2 + clwret_types: [ObsValue, HofX] + bias_application: HofX + test_bias: ObsBiasData + x0: [ 0.050, 0.050, 0.050, + 0.050, 0.050] + x1: [ 25.00, 25.00, 25.00, + 25.00, 25.00] + err0: [300.00, 300.00, 2.500, + 2.000, 2.000] + err1: [700.00, 700.00, 30.00, + 50.00, 60.00] +- filter: BlackList + filter variables: + - name: brightnessTemperature + channels: mhs_n19_channels + where: + - variable: + name: GeoVaLs/water_area_fraction + minvalue: 0.99 + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelRamp + channels: mhs_n19_channels + options: + channels: mhs_n19_channels + xvar: + name: ObsFunction/CLWRetSymmetricMW + options: + clwret_ch89v: 1 + clwret_ch166v: 2 + clwret_types: [ObsValue, HofX] + bias_application: HofX + test_bias: ObsBiasData + x0: [ 0.050, 0.050, 0.050, + 0.050, 0.050] + x1: [ 25.00, 25.00, 25.00, + 25.00, 25.00] + err0: [300.00, 300.00, 2.500, + 2.000, 2.000] + err1: [350.00, 350.00, 15.00, + 25.00, 30.00] +#Topography check +- filter: BlackList + filter variables: + - name: brightnessTemperature + channels: *mhs_n19_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorTopoRad + channels: *mhs_n19_channels + options: + sensor: *Sensor_ID + channels: *mhs_n19_channels +#Transmittnace Top Check +- filter: BlackList + filter variables: + - name: brightnessTemperature + channels: *mhs_n19_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorTransmitTopRad + channels: *mhs_n19_channels + options: + channels: *mhs_n19_channels +#Gross check +- filter: Background Check + filter variables: + - name: brightnessTemperature + channels: *mhs_n19_channels + where: + - variable: + name: GeoVaLs/water_area_fraction + maxvalue: 0.99 + function absolute threshold: + - name: ObsFunction/ObsErrorBoundMW + channels: *mhs_n19_channels + options: + sensor: *Sensor_ID + channels: *mhs_n19_channels + threshold: 2.0 + obserr_bound_latitude: + name: ObsFunction/ObsErrorFactorLatRad + options: + latitude_parameters: [0.0, 1.0, 0.0, 1.0] + obserr_bound_transmittop: + name: ObsFunction/ObsErrorFactorTransmitTopRad + channels: *mhs_n19_channels + options: + channels: *mhs_n19_channels + obserr_bound_topo: + name: ObsFunction/ObsErrorFactorTopoRad + channels: *mhs_n19_channels + options: + channels: *mhs_n19_channels + sensor: *Sensor_ID + obserr_function: + name: ObsFunction/ObsErrorModelRamp + channels: *mhs_n19_channels + options: + channels: *mhs_n19_channels + xvar: + name: ObsFunction/CLWRetSymmetricMW + options: + clwret_ch89v: 1 + clwret_ch166v: 2 + clwret_types: [ObsValue, HofX] + bias_application: HofX + x0: [ 0.050, 0.050, 0.050, + 0.050, 0.050] + x1: [ 25.00, 25.00, 25.00, + 25.00, 25.00] + err0: [300.00, 300.00, 2.500, + 2.000, 2.000] + err1: [700.00, 700.00, 30.00, + 50.00, 60.00] + obserr_bound_max: [5.0, 5.0, 10.0, 10.0, 10.0] + action: + name: reject +#Gross check +- filter: Background Check + filter variables: + - name: brightnessTemperature + channels: *mhs_n19_channels + where: + - variable: + name: GeoVaLs/water_area_fraction + minvalue: 0.99 + function absolute threshold: + - name: ObsFunction/ObsErrorBoundMW + channels: *mhs_n19_channels + options: + sensor: *Sensor_ID + channels: *mhs_n19_channels + threshold: 2.0 + obserr_bound_latitude: + name: ObsFunction/ObsErrorFactorLatRad + options: + latitude_parameters: [0.0, 1.0, 0.0, 1.0] + obserr_bound_transmittop: + name: ObsFunction/ObsErrorFactorTransmitTopRad + channels: *mhs_n19_channels + options: + channels: *mhs_n19_channels + obserr_bound_topo: + name: ObsFunction/ObsErrorFactorTopoRad + channels: *mhs_n19_channels + options: + channels: *mhs_n19_channels + sensor: *Sensor_ID + obserr_function: + name: ObsFunction/ObsErrorModelRamp + channels: *mhs_n19_channels + options: + channels: *mhs_n19_channels + xvar: + name: ObsFunction/CLWRetSymmetricMW + options: + clwret_ch89v: 1 + clwret_ch166v: 2 + clwret_types: [ObsValue, HofX] + bias_application: HofX + x0: [ 0.050, 0.050, 0.050, + 0.050, 0.050] + x1: [ 25.00, 25.00, 25.00, + 25.00, 25.00] + err0: [300.00, 300.00, 2.500, + 2.000, 2.000] + err1: [350.00, 350.00, 15.00, + 25.00, 30.00] + obserr_bound_max: [5.0, 5.0, 10.0, 10.0, 10.0] + action: + name: reject diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/mls55_aura.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/mls55_aura.yaml index aa4a5067..7788ce6f 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/mls55_aura.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/mls55_aura.yaml @@ -8,7 +8,7 @@ obs space: engine: type: H5File obsfile: '{{cycle_dir}}/{{experiment_id}}.mls55_aura.{{window_begin}}.nc4' - simulated variables: [ozoneLayer] + simulated variables: [ozoneProfile] obs operator: name: VertInterp vertical coordinate: air_pressure @@ -17,7 +17,7 @@ obs filters: # range sanity check - filter: Bounds Check filter variables: - - name: ozoneLayer + - name: ozoneProfile minvalue: 0 maxvalue: 10000 action: @@ -25,7 +25,7 @@ obs filters: # threshold is really threshold*observation error (threshold= relative threshold) - filter: Background Check filter variables: - - name: ozoneLayer + - name: ozoneProfile threshold: 5.0 action: name: reject diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/ompslpnc_npp.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/ompslpnc_npp.yaml index 48c71dbc..8da30580 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/ompslpnc_npp.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/ompslpnc_npp.yaml @@ -8,7 +8,7 @@ obs space: engine: type: H5File obsfile: '{{cycle_dir}}/{{experiment_id}}.ompslpnc_npp.{{window_begin}}.nc4' - simulated variables: [ozoneLayer] + simulated variables: [ozoneTotal] obs operator: name: VertInterp vertical coordinate: ["air_pressure"] @@ -18,7 +18,7 @@ obs filters: # range sanity check - filter: Bounds Check filter variables: - - name: ozoneLayer + - name: ozoneTotal minvalue: 0 maxvalue: 10000 action: @@ -26,7 +26,7 @@ obs filters: # threshold is really threshold*observation error (threshold= relative threshold) - filter: Background Check filter variables: - - name: ozoneLayer + - name: ozoneTotal threshold: 5.0 action: name: reject diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/rass_tv.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/rass_tv.yaml deleted file mode 100644 index 4954bef3..00000000 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/rass_tv.yaml +++ /dev/null @@ -1,14 +0,0 @@ -obs operator: - name: VertInterp - observation alias file: '{{experiment_root}}/{{experiment_id}}/configuration/jedi/interfaces/{{model_component}}/observations/obsop_name_map.yaml' -obs space: - name: rass_tv - obsdatain: - engine: - type: H5File - obsfile: '{{cycle_dir}}/rass_tv.{{window_begin}}.nc4' - obsdataout: - engine: - type: H5File - obsfile: '{{cycle_dir}}/{{experiment_id}}.rass_tv.{{window_begin}}.nc4' - simulated variables: [virtualTemperature] diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/satwind.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/satwind.yaml index 8a50d727..f875a5d3 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/satwind.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/satwind.yaml @@ -1,6 +1,7 @@ obs operator: name: VertInterp observation alias file: '{{experiment_root}}/{{experiment_id}}/configuration/jedi/interfaces/{{model_component}}/observations/obsop_name_map.yaml' + apply near surface wind scaling: true obs space: name: satwind obsdatain: @@ -19,14 +20,34 @@ obs filters: maxvalue: 3 action: name: reject + +- filter: Perform Action + filter variables: + - name: windEastward + where: + - variable: PreUseFlag/windEastward + is_in: 100 + action: + name: reject + +- filter: Perform Action + filter variables: + - name: windNorthward + where: + - variable: PreUseFlag/windNorthward + is_in: 100 + action: + name: reject + # # Assign the initial observation error, based on height/pressure -- filter: Bounds Check +# add back +- filter: Perform Action filter variables: - name: windEastward - name: windNorthward - minvalue: -135 - maxvalue: 135 +# minvalue: -135 +# maxvalue: 135 action: name: assign error error function: @@ -35,146 +56,225 @@ obs filters: 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] + errors: [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] + +# #Blacklist Obstypes that aren't used in GSI +- filter: BlackList + where: + - variable: + name: ObsType/windEastward + is_in: 240, 241, 248, 249, 251, 255, 256, 260 # -# Observation Range Sanity Check: either wind component or velocity exceeds 135 m/s -- filter: Bounds Check +# Assign the initial observation error, based on height/pressure +# kx = 244 +# reject pressure levels = [110000, 105000, 7500, 5000, 4000, 3000, 2000, 1000, 500, 400, 300, 200, 100, 0] +- filter: Perform Action filter variables: - name: windEastward - name: windNorthward - minvalue: -135 - maxvalue: 135 action: - name: reject -- filter: Bounds Check + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + xvar: + name: MetaData/pressure + xvals: [100000, 95000, 90000, 85000, 80000, 75000, 70000, 65000, 60000, 55000, 50000, 45000, 40000, 35000, 30000, 25000, 20000, 15000, 10000] #Pressure (Pa) + errors: [5.9, 5.9, 5.9, 5.9, 5.45, 5, 5, 5, 5.075, 5.175, 5.3, 5.675, 6.05, 6.25, 6.625, 7, 7, 7, 7] + where: + - variable: + name: ObsType/windEastward + is_in: 244 + + + # Assign the initial observation error, based on height/pressure +- filter: Perform Action filter variables: - name: windEastward - name: windNorthward - test variables: - - name: ObsFunction/Velocity - maxvalue: 135.0 action: - name: reject -# -# All satellite platforms, reject when pressure greater than 950 mb. -- filter: Bounds Check + 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.0, 4.0, 4.1, 5, 6, 6.3, 6.6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7] + where: + - variable: + name: ObsType/windEastward + is_in: 245, 246 + + +# Assign the initial observation error, based on height/pressure +- filter: Perform Action filter variables: - name: windEastward - name: windNorthward - test variables: - - name: MetaData/pressure - maxvalue: 95000 action: - name: reject -# -# Difference check surface_pressure and air_pressure@ObsValue, if less than 100 hPa, reject. -# Starting with 730029 values, 338418 missing (half?), 50883 rejected by difference check, leaving 340728 -- filter: Difference Check + 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.0, 4.0, 4.1, 5, 6, 6.3, 6.6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7] + where: + - variable: + name: ObsType/windEastward + is_in: 242, 243, 247, 252, 253 + +# Assign the initial observation error, based on height/pressure +# kx = 254 +- filter: Perform Action filter variables: - name: windEastward - name: windNorthward - reference: surface_pressure@GeoVaLs - value: pressure@MetaData - maxvalue: -10000 -# -# Multiple satellite platforms, reject when pressure is more than 50 mb above tropopause. -- filter: Difference Check + 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.0, 4.5, 6.1, 6.0, 6.5, 7.3, 7.6, 7, 7.5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7] + where: + - variable: + name: ObsType/windEastward + is_in: 254 + +# Assign the initial observation error, based on height/pressure +# kx = 250 +- filter: Perform Action filter variables: - name: windEastward - name: windNorthward - reference: TropopauseEstimate@ObsFunction - value: pressure@MetaData - minvalue: -5000 # 50 hPa above tropopause level, negative p-diff action: - name: reject -# -# GOES WV (non-cloudy; itype=247) reject when difference of wind direction is more than 50 degrees. -- filter: Bounds Check + 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.0, 4.0, 4.1, 5.0, 7, 7.3, 7.6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8] + where: + - variable: + name: ObsType/windEastward + is_in: 250 + +# Assign the initial observation error, based on height/pressure +# kx = 257 +# reject [110000, 105000, 7500, 5000, 4000, 3000, 2000, 1000, 500, 400, 300, 200, 100, 0] +- filter: Perform Action filter variables: - name: windEastward - name: windNorthward - test variables: - - name: ObsFunction/WindDirAngleDiff - maxvalue: 50.0 action: - name: reject -# -# GOES IR (245), EUMET IR (253), JMA IR (252) reject when pressure between 400 and 800 mb. -- filter: Bounds Check + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + xvar: + name: MetaData/pressure + xvals: [100000, 95000, 90000, 85000, 80000, 75000, 70000, 65000, 60000, 55000, 50000, 45000, 40000, 35000, 30000, 25000, 20000, 15000, 10000] #Pressure (Pa) + errors: [5.9, 5.9, 5.9, 5.9, 5.9, 5.9, 5.9, 5.9, 5.675, 5.45, 5.525, 5.8, 6.275, 6.575, 6.825, 7.05, 7.05, 7.05, 7.05] + where: + - variable: + name: ObsType/windEastward + is_in: 257 + +# Assign the initial observation error, based on height/pressure +# kx = 258 +# reject = [110000, 105000, 100000, 95000, 90000, 85000, 80000, 75000, 70000, 65000, 7500, 5000, 4000, 3000, 2000, 1000, 500, 400, 300, 200, 100, 0] +- filter: Perform Action filter variables: - name: windEastward - name: windNorthward - test variables: - - name: MetaData/pressure - minvalue: 40000 - maxvalue: 80000 + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + xvar: + name: MetaData/pressure + xvals: [60000, 55000, 50000, 45000, 40000, 35000, 30000, 25000, 20000, 15000, 10000] #Pressure (Pa) + errors: [6.05, 5.625, 5.275, 5.375, 5.925, 6.475, 6.775, 7.05, 7.05, 7.05, 7.05] where: - variable: name: ObsType/windEastward - is_in: 245, 252, 253 - action: - name: reject -# -# GOES WV (246, 250, 254), reject when pressure greater than 400 mb. -- filter: Bounds Check + is_in: 258 + +# Assign the initial observation error, based on height/pressure +# kx = 257 +# reject [110000, 105000, 7500, 5000, 4000, 3000, 2000, 1000, 500, 400, 300, 200, 100, 0] +- filter: Perform Action filter variables: - name: windEastward - name: windNorthward - test variables: - - name: MetaData/pressure - maxvalue: 40000 + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelStepwiseLinear + options: + xvar: + name: MetaData/pressure + xvals: [100000, 95000, 90000, 85000, 80000, 75000, 70000, 65000, 60000, 55000, 50000, 45000, 40000, 35000, 30000, 25000, 20000, 15000, 10000] #Pressure (Pa) + errors: [6.5, 6.5, 6.5, 6.5, 6.5, 6.5, 6.5, 6.5, 6, 5.5, 5.5, 5.575, 6.025, 6.4, 6.775, 7.15, 7.15, 7.15, 7.15] where: - variable: name: ObsType/windEastward - is_in: 246, 250, 254 - action: - name: reject -# -# EUMET (242) and JMA (243) vis, reject when pressure less than 700 mb. -- filter: Bounds Check + is_in: 259 + +- filter: Difference Check filter variables: - name: windEastward - name: windNorthward - test variables: - - name: MetaData/pressure - minvalue: 70000 + reference: GeoVaLs/surface_pressure + value: MetaData/pressure + maxvalue: -11000 where: - variable: name: ObsType/windEastward - is_in: 242, 243 - action: - name: reject + is_in: 247 + - variable: + name: MetaData/surfaceQualifier + minvalue: 1 # -# MODIS-Aqua/Terra (257) and (259), reject when pressure less than 250 mb. -- filter: Bounds Check +- filter: Difference Check filter variables: - name: windEastward - name: windNorthward - test variables: - - name: MetaData/pressure - minvalue: 25000 + reference: GeoVaLs/surface_pressure + value: MetaData/pressure + maxvalue: -20000 where: - variable: name: ObsType/windEastward - is_in: 257-259 - action: - name: reject -# -# MODIS-Aqua/Terra (258) and (259), reject when pressure greater than 600 mb. + is_in: 244, 257, 258, 259, 260 + - variable: + name: MetaData/surfaceQualifier + minvalue: 1 + +# GOES WV (non-cloudy; itype=247) reject when difference of wind direction is more than 50 degrees. - filter: Bounds Check filter variables: - name: windEastward - name: windNorthward test variables: - - name: MetaData/pressure - maxvalue: 60000 + - name: ObsFunction/WindDirAngleDiff + maxvalue: 50.0 where: - variable: name: ObsType/windEastward - is_in: 258, 259 + is_in: 247 action: name: reject # +# # AVHRR (244), MODIS (257,258,259), VIIRS (260), GOES (247) use a LNVD check. - filter: Bounds Check filter variables: @@ -190,131 +290,106 @@ obs filters: action: name: reject # -# AVHRR and MODIS (ObsType=244,257,258,259) use a SPDB check. -- filter: Bounds Check + +#wgu +- filter: BlackList filter variables: - name: windEastward - - name: windNorthward - test variables: - - name: ObsFunction/SatWindsSPDBCheck - options: - error_min: 1.4 - error_max: 20.0 - maxvalue: 1.75 where: - variable: name: ObsType/windEastward - is_in: 244, 257, 258, 259 + is_in: 240-260 action: - name: reject -# -# GOES (ObsType=245,246,253,254) use a SPDB check only between 300-400 mb. -- filter: Bounds Check + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windEastward + inflation factor: 4 + adjusted_error_name: GsiAdjustObsError + +- filter: BlackList filter variables: - - name: windEastward - name: windNorthward - test variables: - - name: ObsFunction/SatWindsSPDBCheck - options: - error_min: 1.4 - error_max: 20.0 - maxvalue: 1.75 where: - variable: - name: ObsType/windEastward - is_in: 244, 257, 258, 259 - - variable: - name: MetaData/pressure - minvalue: 30000 - maxvalue: 40000 - action: - name: reject -# -- filter: Background Check - filter variables: - - name: windEastward - - name: windNorthward - absolute threshold: 7.5 + name: ObsType/windNorthward + is_in: 240-260 action: name: inflate error - inflation factor: 3.0 - defer to post: true -# -# If the total inflation factor is too big, reject. -- filter: Bounds Check + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windNorthward + inflation factor: 4 + adjusted_error_name: GsiAdjustObsError + +#wgu +# Gross Check +- filter: Background Check filter variables: - name: windEastward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + 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] + 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] + cgross: [ 2.5, 2.5, 2.5, 1.5, 2.5, 2.5, 2.5, 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] + wndtype: [ 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 256, 257, 258, 259, 260] + variable: windEastward action: name: reject - maxvalue: 2.5 - test variables: - - name: ObsFunction/ObsErrorFactorQuotient - options: - numerator: - name: ObsErrorData/windEastward # After inflation step - denominator: - name: ObsError/windEastward - where: - - variable: - name: ObsType/windEastward - is_in: 240, 241, 242, 244, 247, 248, 249, 250, 252, 255-260 - defer to post: true -# -- filter: Bounds Check + +- filter: Background Check filter variables: - name: windNorthward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + cgross: [ 2.5, 2.5, 2.5, 1.5, 2.5, 2.5, 2.5, 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] + 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] + 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] + wndtype: [ 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 256, 257, 258, 259, 260] + variable: windNorthward action: name: reject - maxvalue: 2.5 - test variables: - - name: ObsFunction/ObsErrorFactorQuotient - options: - numerator: - name: ObsErrorData/windNorthward # After inflation step - denominator: - name: ObsError/windNorthward - where: - - variable: - name: ObsType/windNorthward - is_in: 240, 241, 242, 244, 247, 248, 249, 250, 252, 255-260 - defer to post: true -# -# Some satellite platforms have a lower threshold of inflation factor of 1.5 -- filter: Bounds Check + +- filter: BlackList filter variables: - name: windEastward action: - name: reject - maxvalue: 1.5 - test variables: - - name: ObsFunction/ObsErrorFactorQuotient - options: - numerator: - name: ObsErrorData/windEastward # After inflation step - denominator: - name: ObsError/windEastward + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorDuplicateCheck + options: + use_air_pressure: true + variable: windEastward where: - - variable: - name: ObsType/windEastward - is_in: 243, 245, 246, 251, 253, 254 + - variable: + name: ObsType/windEastward + is_in: 240-260 defer to post: true -# -- filter: Bounds Check + +- filter: BlackList filter variables: - name: windNorthward action: - name: reject - maxvalue: 1.5 - test variables: - - name: ObsFunction/ObsErrorFactorQuotient - options: - numerator: - name: ObsErrorData/windNorthward # After inflation step - denominator: - name: ObsError/windNorthward + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorDuplicateCheck + options: + use_air_pressure: true + variable: windNorthward where: - - variable: - name: ObsType/windEastward - is_in: 243, 245, 246, 251, 253, 254 + - variable: + name: ObsType/windNorthward + is_in: 240-260 defer to post: true - diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/scatwind.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/scatwind.yaml index fb024aee..9ef016c8 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/scatwind.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/scatwind.yaml @@ -1,8 +1,5 @@ -obs operator: - name: GSISfcModel - observation alias file: '{{experiment_root}}/{{experiment_id}}/configuration/jedi/interfaces/{{model_component}}/observations/obsop_name_map.yaml' obs space: - name: scatwind + name: Scatwind obsdatain: engine: type: H5File @@ -12,107 +9,162 @@ obs space: type: H5File obsfile: '{{cycle_dir}}/{{experiment_id}}.scatwind.{{window_begin}}.nc4' simulated variables: [windEastward, windNorthward] +obs operator: + name: VertInterp + observation alias file: '{{experiment_root}}/{{experiment_id}}/configuration/jedi/interfaces/{{model_component}}/observations/obsop_name_map.yaml' + apply near surface wind scaling: true + obs filters: +# # Reject all obs with PreQC mark already set above 3 -- filter: PreQC - maxvalue: 3 - action: - name: reject +#- filter: PreQC +# maxvalue: 3 +# action: +# name: reject # -# WindSat (289), ASCAT (290), or OSCAT (291) either wind component or velocity greater than 20 m/s, then reject. +# Assign the initial observation error, based on height/pressure - filter: Bounds Check filter variables: - name: windEastward - name: windNorthward - minvalue: -20 - maxvalue: 20 + 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] #Pressure (Pa) + errors: [2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0] # -- filter: Bounds Check +- filter: Perform Action filter variables: - name: windEastward - - name: windNorthward - test variables: - - name: ObsFunction/Velocity - maxvalue: 20.0 where: - - variable: - name: ObsType/windEastward - is_in: 289, 290, 291 + - variable: PreUseFlag/windEastward + is_in: 100 action: name: reject # -# Similar to satellite winds AMV, reject when obs wind direction is more than 50 degrees different than model. -- filter: Bounds Check +- filter: Perform Action filter variables: - - name: windEastward - name: windNorthward - test variables: - - name: ObsFunction/WindDirAngleDiff - maxvalue: 50.0 + where: + - variable: PreUseFlag/windNorthward + is_in: 100 action: name: reject # -# ASCAT (290), RAPIDSCAT (296) use a LNVD check. -- filter: Bounds Check +#wgu +- filter: BlackList filter variables: - name: windEastward - - name: windNorthward - test variables: - - name: ObsFunction/SatWindsLNVDCheck - maxvalue: 3 where: - - variable: - name: ObsType/windEastward - is_in: 290, 296 + - variable: + name: ObsType/windEastward + is_in: 290 action: - name: reject + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windEastward + inflation factor: 4.0 + adjusted_error_name: GsiAdjustObsError # -# Assign the initial observation error (constant value, 3.5 m/s right now). - filter: BlackList filter variables: - - name: windEastward - name: windNorthward + where: + - variable: + name: ObsType/windNorthward + is_in: 290 action: - name: assign error - error parameter: 3.5 + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windNorthward + inflation factor: 4.0 + adjusted_error_name: GsiAdjustObsError # -# For OSCAT, ASCAT, RAPIDSCAT, or WindSat, reject when either wind component differs by at least 6 m/s from model. -- filter: Background Check +- filter: Bounds Check filter variables: - name: windEastward - name: windNorthward - absolute threshold: 6.0 + test variables: + - name: ObsFunction/ScatWindsAmbiguityCheck + maxvalue: 1.e-12 where: - variable: name: ObsType/windEastward - is_in: 289, 290, 291, 296 + is_in: 290 action: name: reject -# + +# Bounds checks. Filter U obs if |v_O-F| > 5, and V obs if |u_O-F| > 5. - filter: Bounds Check filter variables: - name: windEastward - action: - name: reject - maxvalue: 5.0 + - name: windNorthward test variables: - - name: ObsFunction/ObsErrorFactorQuotient + - name: ObsFunction/Arithmetic options: - numerator: - name: ObsErrorData/windEastward # After inflation step - denominator: - name: ObsError/windEastward + 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 +# +# Gross Check +- filter: Background Check + filter variables: + - name: windEastward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 290 ] + cgross: [ 5.0 ] + error_min: [ 1.4 ] + error_max: [ 6.1 ] + variable: windEastward action: name: reject - maxvalue: 5.0 - test variables: - - name: ObsFunction/ObsErrorFactorQuotient + defer to post: true +# +- filter: Background Check + filter variables: + - name: windNorthward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck options: - numerator: - name: ObsErrorData/windNorthward # After inflation step - denominator: - name: ObsError/windNorthward + wndtype: [ 290 ] + cgross: [ 5.0 ] + error_min: [ 1.4 ] + error_max: [ 6.1 ] + variable: windNorthward + action: + name: reject + defer to post: true + diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/seviri_m11.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/seviri_m11.yaml deleted file mode 100644 index 3ff177cf..00000000 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/seviri_m11.yaml +++ /dev/null @@ -1,143 +0,0 @@ -obs space: - name: seviri_m11 - obsdatain: - engine: - type: H5File - obsfile: '{{cycle_dir}}/seviri_m11.{{window_begin}}.nc4' - obsdataout: - engine: - type: H5File - obsfile: '{{cycle_dir}}/{{experiment_id}}.seviri_m11.{{window_begin}}.nc4' - simulated variables: [brightnessTemperature] - channels: &seviri_m11_channels 4-11 -obs operator: - name: CRTM - Absorbers: [H2O,O3,CO2] - obs options: - Sensor_ID: &Sensor_ID seviri_m11 - EndianType: little_endian - CoefficientPath: '{{crtm_coeff_dir}}' -obs bias: - input file: '{{cycle_dir}}/seviri_m11.{{background_time}}.satbias.nc4' - variational bc: - predictors: - - name: constant - - name: lapse_rate - order: 2 - tlapse: &seviri_m11_tlapse '{{cycle_dir}}/seviri_m11.{{background_time}}.tlapse.txt' - - name: lapse_rate - tlapse: *seviri_m11_tlapse - - name: emissivity - - name: scan_angle - var_name: sensorScanPosition - order: 4 - - name: scan_angle - var_name: sensorScanPosition - order: 3 - - name: scan_angle - var_name: sensorScanPosition - order: 2 - - name: scan_angle - var_name: sensorScanPosition -obs filters: -# Observation Range Sanity Check -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: *seviri_m11_channels - minvalue: 50.00001 - maxvalue: 449.99999 - action: - name: reject -# Surface Check:use chn 2 and 3 over both sea and land while other IR chns only over sea -# ch2 and ch3 in GSI should be the original seviri ch5 and ch6 -- filter: BlackList - filter variables: - - name: brightnessTemperature - channels: 4,7-11 - where: - - variable: - name: GeoVaLs/water_area_fraction - maxvalue: 0.99 -# Do not use ch5,6 over snow -- filter: BlackList - filter variables: - - name: brightnessTemperature - channels: *seviri_m11_channels - where: - - variable: - name: GeoVaLs/surface_snow_area_fraction - minvalue: 0.01 -# Do not use ch5,6 over ice -- filter: BlackList - filter variables: - - name: brightnessTemperature - channels: *seviri_m11_channels - where: - - variable: - name: GeoVaLs/ice_area_fraction - minvalue: 0.01 -# Do not use over mixed surface -- filter: BlackList - filter variables: - - name: brightnessTemperature - channels: *seviri_m11_channels - where: - - variable: - name: GeoVaLs/land_area_fraction - maxvalue: 0.99 - - variable: - name: GeoVaLs/water_area_fraction - maxvalue: 0.99 - - variable: - name: GeoVaLs/ice_area_fraction - maxvalue: 0.99 - - variable: - name: GeoVaLs/surface_snow_area_fraction - maxvalue: 0.99 -# QC_terrain: If seviri and terrain height > 1km. do not use -- filter: Domain Check - filter variables: - - name: brightnessTemperature - channels: *seviri_m11_channels - where: - - variable: - name: GeoVaLs/surface_geopotential_height - maxvalue: 1000.0 -# Gross check -- filter: Background Check - filter variables: - - name: brightnessTemperature - channels: *seviri_m11_channels - absolute threshold: 2.0 - action: - name: reject -# Surface Jacobians Check -- filter: BlackList - filter variables: - - name: brightnessTemperature - channels: *seviri_m11_channels - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorSurfJacobianRad - channels: *seviri_m11_channels - options: - channels: *seviri_m11_channels - sensor: *Sensor_ID - obserr_demisf: [0.01, 0.02, 0.02, 0.02, 0.02] - obserr_dtempf: [0.50, 2.00, 3.00, 3.00, 5.00] -# Useflag Check -- filter: Bounds Check - filter variables: - - name: brightnessTemperature - channels: *seviri_m11_channels - test variables: - - name: ObsFunction/ChannelUseflagCheckRad - channels: *seviri_m11_channels - options: - channels: *seviri_m11_channels - use_flag: [ -1, 1, 1, -1, -1, -1, -1, -1 ] - minvalue: 1.0e-12 - action: - name: reject diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/ssmis_f17.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/ssmis_f17.yaml index 5083aa21..7aa7911f 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/ssmis_f17.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/ssmis_f17.yaml @@ -1,5 +1,14 @@ +obs operator: + name: CRTM + Absorbers: [H2O,O3,CO2] + linear obs operator: + Absorbers: [H2O,O3,CO2] + obs options: + Sensor_ID: &Sensor_ID ssmis_f17 + EndianType: little_endian + CoefficientPath: '{{crtm_coeff_dir}}' obs space: - name: ssmis_f17 + name: *Sensor_ID obsdatain: engine: type: H5File @@ -10,13 +19,6 @@ obs space: obsfile: '{{cycle_dir}}/{{experiment_id}}.ssmis_f17.{{window_begin}}.nc4' simulated variables: [brightnessTemperature] channels: &ssmis_f17_channels 1-24 -obs operator: - name: CRTM - Absorbers: [H2O,O3,CO2] - obs options: - Sensor_ID: &Sensor_ID ssmis_f17 - EndianType: little_endian - CoefficientPath: '{{crtm_coeff_dir}}' obs bias: input file: '{{cycle_dir}}/ssmis_f17.{{background_time}}.satbias.nc4' variational bc: @@ -50,75 +52,49 @@ obs bias: order: 2 - name: scan_angle var_name: sensorScanPosition -obs filters: -#step1: Gross check (setuprad) -- filter: Background Check +obs prior filters: +# Step 1: Initial Observation Error Assignment +- filter: Perform Action filter variables: - name: brightnessTemperature channels: *ssmis_f17_channels - threshold: 1.5 action: - name: reject -#step1: Gross check(qcmod) + name: assign error + error parameter vector: [ 1.50, 0.50, 0.50, 0.50, 0.50, 1.00, 1.00, 3.00, 3.00, 3.00, + 3.00, 2.40, 1.27, 1.44, 3.00, 1.34, 1.74, 3.75, 3.00, 3.00, + 2.00, 6.40, 1.00, 1.00] +obs post filters: +# step 2: Gross check(qcmod) - filter: Background Check filter variables: - name: brightnessTemperature channels: *ssmis_f17_channels absolute threshold: 3.5 remove bias correction: true + where: + - variable: + name: GeoVaLs/water_area_fraction + minvalue: 0.99 action: name: reject -# #step2: clw check -# Keep the CLW check in yaml for further improvement. -# The test case using 2020110112 global SSMIS data shows that CLW check is not activated in GSI. -#- filter: Bounds Check -# filter variables: -# - name: brightnessTemperature -# channels: 1 -# test variables: -# - name: ObsFunction/CLWRetMW_SSMIS -# options: -# satellite: SSMIS -# ch19h: 12 -# ch19v: 13 -# ch22v: 14 -# ch37h: 15 -# ch37v: 16 -# ch91v: 17 -# ch91h: 18 -# varGroup: ObsValue -# minvalue: 0.0 -# maxvalue: 0.1 -# where: -# - variable: -# name: GeoVaLs/water_area_fraction -# minvalue: 0.99 -# action: -# name: reject -#step3: -- filter: Difference Check + +# Step 3: Reject all channels if surface height is greater than 2km +- filter: RejectList filter variables: - name: brightnessTemperature - channels: 1-2,12-16 - reference: brightness_temperature_2@ObsValue - value: brightness_temperature_2@HofX - minvalue: -1.5 - maxvalue: 1.5 + channels: *ssmis_f17_channels where: + - variable: + name: GeoVaLs/surface_geopotential_height + minvalue: 2000.0 + min_exclusive: true - variable: name: GeoVaLs/water_area_fraction maxvalue: 0.99 -#QC_terrain: If ssmis and terrain height > 2km. do not use -- filter: Domain Check - filter variables: - - name: brightnessTemperature - channels: *ssmis_f17_channels - where: - - variable: - name: MetaData/height - maxvalue: 2000.0 -#Do not use over mixed surface -- filter: BlackList + max_exclusive: true + +# Step 4: Reject data over mixed surface type +- filter: RejectList filter variables: - name: brightnessTemperature channels: 1-3,8-18 @@ -126,16 +102,120 @@ obs filters: - variable: name: GeoVaLs/land_area_fraction maxvalue: 0.99 + max_exclusive: true - variable: name: GeoVaLs/water_area_fraction maxvalue: 0.99 + max_exclusive: true - variable: name: GeoVaLs/ice_area_fraction maxvalue: 0.99 + max_exclusive: true - variable: name: GeoVaLs/surface_snow_area_fraction maxvalue: 0.99 -#step4: Generate q.c. bounds and modified variances + max_exclusive: true + +# Step 5: Channel 2 O-F check over non-water dominant area +- filter: Difference Check + filter variables: + - name: brightnessTemperature + channels: 1-2, 12-16 + reference: ObsValue/brightnessTemperature_2 + value: HofX/brightnessTemperature_2 + minvalue: -1.5 + maxvalue: 1.5 + where: + - variable: + name: GeoVaLs/water_area_fraction + maxvalue: 0.99 + max_exclusive: true + +# Step 6: Gross check over non-water dominant area +- filter: Background Check + filter variables: + - name: brightnessTemperature + channels: *ssmis_f17_channels + absolute threshold: 3.5 + remove bias correction: true + where: + - variable: + name: GeoVaLs/water_area_fraction + maxvalue: 0.99 + max_exclusive: true + action: + name: reject + +# Step 7: Scattering check for channels 9-11 using channels 8 and 17 +- filter: Difference Check + filter variables: + - name: brightnessTemperature + channels: 9 + reference: ObsValue/brightnessTemperature_9 + value: + name: ObsFunction/Arithmetic + options: + variables: + - name: HofX/brightnessTemperature_17 + - name: ObsBiasData/brightnessTemperature_17 + - name: HofX/brightnessTemperature_8 + - name: ObsBiasData/brightnessTemperature_8 + coefs: [-0.485934, 0.485934, 0.473806, -0.473806] + intercept: 271.252327 + maxvalue: 2 + +- filter: Difference Check + filter variables: + - name: brightnessTemperature + channels: 10 + reference: ObsValue/brightnessTemperature_10 + value: + name: ObsFunction/Arithmetic + options: + variables: + - name: HofX/brightnessTemperature_17 + - name: ObsBiasData/brightnessTemperature_17 + - name: HofX/brightnessTemperature_8 + - name: ObsBiasData/brightnessTemperature_8 + coefs: [-0.413688, 0.413688, 0.361549, -0.361549] + intercept: 272.280341 + maxvalue: 2 + +- filter: Difference Check + filter variables: + - name: brightnessTemperature + channels: 11 + reference: ObsValue/brightnessTemperature_11 + value: + name: ObsFunction/Arithmetic + options: + variables: + - name: HofX/brightnessTemperature_17 + - name: ObsBiasData/brightnessTemperature_17 + - name: HofX/brightnessTemperature_8 + - name: ObsBiasData/brightnessTemperature_8 + coefs: [-0.400882, 0.400882, 0.270510, -0.270510] + intercept: 278.824902 + maxvalue: 2 + +# Step 8: NSST retrieval check +- filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *ssmis_f17_channels + test variables: + - name: ObsFunction/NearSSTRetCheckIR + channels: *ssmis_f17_channels + options: + channels: *ssmis_f17_channels + use_flag: &useflag_ssmis_f17 [ -1, -1, -1, -1, 1, 1, 1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1, 1] + maxvalue: 1.0e-12 + action: + name: reject + +# Step 9: Error inflation based on surface jacobian - filter: BlackList filter variables: - name: brightnessTemperature @@ -143,7 +223,6 @@ obs filters: action: name: inflate error inflation variable: -#Surface Jacobian check name: ObsFunction/ObsErrorFactorSurfJacobianRad channels: *ssmis_f17_channels options: @@ -151,7 +230,513 @@ obs filters: sensor: *Sensor_ID 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 + +# Step 10: Final gross check +# Channel 1 +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/errorInflationFactor1 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/brightnessTemperature_1 + coefs: [ 2.25 ] + exponents: [ -1 ] + +- filter: Background Check + filter variables: + - name: brightnessTemperature_1 + threshold: DerivedMetaData/errorInflationFactor1 + absolute threshold: 6.0 + action: + name: reject + +# Channel 2 +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/errorInflationFactor2 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/brightnessTemperature_2 + coefs: [ 0.75 ] + exponents: [ -1 ] + +- filter: Background Check + filter variables: + - name: brightnessTemperature_2 + threshold: DerivedMetaData/errorInflationFactor2 + absolute threshold: 6.0 + action: + name: reject + +# Channel 3 +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/errorInflationFactor3 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/brightnessTemperature_3 + coefs: [ 0.75 ] + exponents: [ -1 ] + +- filter: Background Check + filter variables: + - name: brightnessTemperature_3 + threshold: DerivedMetaData/errorInflationFactor3 + absolute threshold: 6.0 + action: + name: reject + +# Channel 4 +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/errorInflationFactor4 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/brightnessTemperature_4 + coefs: [ 0.75 ] + exponents: [ -1 ] + +- filter: Background Check + filter variables: + - name: brightnessTemperature_4 + threshold: DerivedMetaData/errorInflationFactor4 + absolute threshold: 6.0 + action: + name: reject + +# Channel 5 +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/errorInflationFactor5 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/brightnessTemperature_5 + coefs: [ 0.75 ] + exponents: [ -1 ] + +- filter: Background Check + filter variables: + - name: brightnessTemperature_5 + threshold: DerivedMetaData/errorInflationFactor5 + absolute threshold: 6.0 + action: + name: reject + +# Channel 6 +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/errorInflationFactor6 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/brightnessTemperature_6 + coefs: [ 1.50 ] + exponents: [ -1 ] + +- filter: Background Check + filter variables: + - name: brightnessTemperature_6 + threshold: DerivedMetaData/errorInflationFactor6 + absolute threshold: 6.0 + action: + name: reject + +# Channel 7 +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/errorInflationFactor7 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/brightnessTemperature_7 + coefs: [ 1.50 ] + exponents: [ -1 ] + +- filter: Background Check + filter variables: + - name: brightnessTemperature_7 + threshold: DerivedMetaData/errorInflationFactor7 + absolute threshold: 6.0 + action: + name: reject + +# Channel 8 +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/errorInflationFactor8 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/brightnessTemperature_8 + coefs: [ 4.50 ] + exponents: [ -1 ] + +- filter: Background Check + filter variables: + - name: brightnessTemperature_8 + threshold: DerivedMetaData/errorInflationFactor8 + absolute threshold: 6.0 + action: + name: reject + +# Channel 9 +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/errorInflationFactor9 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/brightnessTemperature_9 + coefs: [ 4.50 ] + exponents: [ -1 ] + +- filter: Background Check + filter variables: + - name: brightnessTemperature_9 + threshold: DerivedMetaData/errorInflationFactor9 + absolute threshold: 6.0 + action: + name: reject + +# Channel 10 +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/errorInflationFactor10 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/brightnessTemperature_10 + coefs: [ 4.50 ] + exponents: [ -1 ] + +- filter: Background Check + filter variables: + - name: brightnessTemperature_10 + threshold: DerivedMetaData/errorInflationFactor10 + absolute threshold: 6.0 + action: + name: reject + +# Channel 11 +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/errorInflationFactor11 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/brightnessTemperature_11 + coefs: [ 4.50 ] + exponents: [ -1 ] + +- filter: Background Check + filter variables: + - name: brightnessTemperature_11 + threshold: DerivedMetaData/errorInflationFactor11 + absolute threshold: 6.0 + action: + name: reject + +# Channel 12 +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/errorInflationFactor12 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/brightnessTemperature_12 + coefs: [ 3.60 ] + exponents: [ -1 ] + +- filter: Background Check + filter variables: + - name: brightnessTemperature_12 + threshold: DerivedMetaData/errorInflationFactor12 + absolute threshold: 6.0 + action: + name: reject + +# Channel 13 +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/errorInflationFactor13 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/brightnessTemperature_13 + coefs: [ 1.905 ] + exponents: [ -1 ] + +- filter: Background Check + filter variables: + - name: brightnessTemperature_13 + threshold: DerivedMetaData/errorInflationFactor13 + absolute threshold: 6.0 + action: + name: reject + +# Channel 14 +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/errorInflationFactor14 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/brightnessTemperature_14 + coefs: [ 2.16 ] + exponents: [ -1 ] + +- filter: Background Check + filter variables: + - name: brightnessTemperature_14 + threshold: DerivedMetaData/errorInflationFactor14 + absolute threshold: 6.0 + action: + name: reject + +# Channel 15 +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/errorInflationFactor15 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/brightnessTemperature_15 + coefs: [ 4.50 ] + exponents: [ -1 ] + +- filter: Background Check + filter variables: + - name: brightnessTemperature_15 + threshold: DerivedMetaData/errorInflationFactor15 + absolute threshold: 6.0 + action: + name: reject + +# Channel 16 +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/errorInflationFactor16 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/brightnessTemperature_16 + coefs: [ 2.01 ] + exponents: [ -1 ] + +- filter: Background Check + filter variables: + - name: brightnessTemperature_16 + threshold: DerivedMetaData/errorInflationFactor16 + absolute threshold: 6.0 + action: + name: reject + +# Channel 17 +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/errorInflationFactor17 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/brightnessTemperature_17 + coefs: [ 2.61 ] + exponents: [ -1 ] + +- filter: Background Check + filter variables: + - name: brightnessTemperature_17 + threshold: DerivedMetaData/errorInflationFactor17 + absolute threshold: 6.0 + action: + name: reject + +# Channel 18 +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/errorInflationFactor18 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/brightnessTemperature_18 + coefs: [ 5.625 ] + exponents: [ -1 ] + +- filter: Background Check + filter variables: + - name: brightnessTemperature_18 + threshold: DerivedMetaData/errorInflationFactor18 + absolute threshold: 6.0 + action: + name: reject + +# Channel 19 +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/errorInflationFactor19 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/brightnessTemperature_19 + coefs: [ 4.50 ] + exponents: [ -1 ] + +- filter: Background Check + filter variables: + - name: brightnessTemperature_19 + threshold: DerivedMetaData/errorInflationFactor19 + absolute threshold: 6.0 + action: + name: reject + +# Channel 20 +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/errorInflationFactor20 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/brightnessTemperature_20 + coefs: [ 4.50 ] + exponents: [ -1 ] + +- filter: Background Check + filter variables: + - name: brightnessTemperature_20 + threshold: DerivedMetaData/errorInflationFactor20 + absolute threshold: 6.0 + action: + name: reject + +# Channel 21 +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/errorInflationFactor21 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/brightnessTemperature_21 + coefs: [ 3.00 ] + exponents: [ -1 ] + +- filter: Background Check + filter variables: + - name: brightnessTemperature_21 + threshold: DerivedMetaData/errorInflationFactor21 + absolute threshold: 6.0 + action: + name: reject + +# Channel 22 +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/errorInflationFactor22 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/brightnessTemperature_22 + coefs: [ 9.60 ] + exponents: [ -1 ] + +- filter: Background Check + filter variables: + - name: brightnessTemperature_22 + threshold: DerivedMetaData/errorInflationFactor22 + absolute threshold: 6.0 + action: + name: reject + +# Channel 23 +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/errorInflationFactor23 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/brightnessTemperature_23 + coefs: [ 1.50 ] + exponents: [ -1 ] + +- filter: Background Check + filter variables: + - name: brightnessTemperature_23 + threshold: DerivedMetaData/errorInflationFactor23 + absolute threshold: 6.0 + action: + name: reject + +# Channel 24 +- filter: Variable Assignment + assignments: + - name: DerivedMetaData/errorInflationFactor24 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/brightnessTemperature_24 + coefs: [ 1.50 ] + exponents: [ -1 ] + +- filter: Background Check + filter variables: + - name: brightnessTemperature_24 + threshold: DerivedMetaData/errorInflationFactor24 + absolute threshold: 6.0 + action: + name: reject + +# Useflag Check - filter: Bounds Check filter variables: - name: brightnessTemperature @@ -161,9 +746,8 @@ obs filters: channels: *ssmis_f17_channels options: channels: *ssmis_f17_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] + use_flag: *useflag_ssmis_f17 minvalue: 1.0e-12 action: name: reject + diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/ufo_tests.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/ufo_tests.yaml new file mode 100644 index 00000000..7792d6e4 --- /dev/null +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/ufo_tests.yaml @@ -0,0 +1,220 @@ +# Default values applied to all observation types if not overridden below +# ----------------------------------------------------------------------- + +default: + operator_test: + linear obs operator test: + coef TL: 0.1 + tolerance TL: 1.0e-11 + tolerance AD: 1.0e-13 + tolerance: 1.0e-06 + rms ref: 1.0 + filter_test: + passedBenchmark: 1 + +# Values for individual observation types +# --------------------------------------- + +aircraft: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 341802 + +airs_aqua: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 1 + +amsr2_gcom-w1: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 54558 + +amsua_aqua: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 0 + +amsua_metop-a: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 1 + +amsua_metop-b: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 71950 + +amsua_metop-c: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 91419 + +amsua_n15: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 56139 + +amsua_n18: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 69693 + +amsua_n19: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 73421 + +atms_n20: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 159928 + +atms_npp: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 158687 + +avhrr3_metop-a: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 1 + +avhrr3_n18: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 1 + +cris-fsr_n20: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 1 + +cris-fsr_npp: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 1 + +gmi_gpm: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 41937 + +gnssrobndnbam: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 1 + +iasi_metop-a: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 1 + +iasi_metop-b: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 1 + +mhs_metop-b: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 29630 + +mhs_metop-c: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 29815 + +mhs_n19: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 27823 + +mls55_aura: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 1 + +omi_aura: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 1 + +ompslpnc_npp: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 1 + +ompsnm_npp: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 1 + +satwind: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 231948 + +scatwind: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 16384 + +sfcship: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 1 + +sfc: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 1 + +sondes: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 1 + +ssmis_f17: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 1 + +vadwind: + operator_test: + rms ref: 1.0e-1 + filter_test: + passedBenchmark: 1 diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/vadwind.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/vadwind.yaml deleted file mode 100644 index 98484999..00000000 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/vadwind.yaml +++ /dev/null @@ -1,159 +0,0 @@ -obs operator: - name: VertInterp - observation alias file: '{{experiment_root}}/{{experiment_id}}/configuration/jedi/interfaces/{{model_component}}/observations/obsop_name_map.yaml' -obs space: - name: vadwind - obsdatain: - engine: - type: H5File - obsfile: '{{cycle_dir}}/vadwind.{{window_begin}}.nc4' - obsgrouping: - group variables: ["stationIdentification", "datetime"] - sort variable: "pressure" - sort order: "descending" - obsdataout: - engine: - type: H5File - obsfile: '{{cycle_dir}}/{{experiment_id}}.vadwind.{{window_begin}}.nc4' - simulated variables: [windEastward, windNorthward] -#-------------------------------------------------------------------------------------------------------------------- -obs filters: -# Begin by assigning all ObsError to a constant value. These might get overwritten later. -- filter: BlackList - filter variables: - - name: windEastward - - name: windNorthward - action: - name: assign error - error parameter: 2.0 # 2.0 m/s -# -# Assign the initial ObsError, based on height/pressure -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - minvalue: -135 - maxvalue: 135 - action: - name: assign error - error function: - name: ObsFunction/ObsErrorModelStepwiseLinear - options: - xvar: - name: MetaData/pressure - xvals: [100000, 95000, 85000, 80000, 70000, 65000, 60000, 55000, 50000, 45000, 40000, 35000, 30000, 25000, 20000, 15000, 10000] - errors: [1.4, 1.5, 1.5, 1.6, 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] -# -# Reject all obs with PreQC mark already set above 3 -- filter: PreQC - maxvalue: 3 - action: - name: reject -# -# Reject when pressure is less than 226 mb. -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: MetaData/pressure - minvalue: 22600 - action: - name: reject -# -# Observation Range Sanity Check: either wind component or velocity exceeds 135 m/s -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - minvalue: -135 - maxvalue: 135 - action: - name: reject -- filter: Bounds Check - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: ObsFunction/Velocity - maxvalue: 135.0 - action: - name: reject -# -# 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 - maxvalue: 50.0 - action: - name: reject - defer to post: true -# -# Inflate obserror when multiple obs exist inside vertical model layers. -- filter: BlackList - filter variables: - - name: windEastward - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorConventional - options: - test QCflag: PreQC - inflate variables: [eastward_wind] - defer to post: true -# -- filter: BlackList - filter variables: - - name: windNorthward - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorConventional - options: - test QCflag: PreQC - inflate variables: [northward_wind] - defer to post: true -# -- filter: Background Check - filter variables: - - name: windEastward - - name: windNorthward - absolute threshold: 7.5 - action: - name: inflate error - inflation factor: 2.5 - defer to post: true -# -# If the total inflation factor is too big, reject. -- filter: Bounds Check - filter variables: - - name: windEastward - action: - name: reject - maxvalue: 6.5 - test variables: - - name: ObsFunction/ObsErrorFactorQuotient - options: - numerator: - name: ObsErrorData/windEastward # After inflation step - denominator: - name: ObsError/windEastward - defer to post: true -# -- filter: Bounds Check - filter variables: - - name: windNorthward - action: - name: reject - maxvalue: 6.5 - test variables: - - name: ObsFunction/ObsErrorFactorQuotient - options: - numerator: - name: ObsErrorData/windNorthward # After inflation step - denominator: - name: ObsError/windNorthward - defer to post: true diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/task_questions.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/task_questions.yaml index 57b6eb88..86d315c2 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/task_questions.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/task_questions.yaml @@ -32,6 +32,10 @@ clean_patterns: - '*.txt' - logfile.*.out +forecast_duration: + default_value: + - PT6H + geos_background_restart_offset: default_value: TODO @@ -41,6 +45,12 @@ geos_bkg_filename_template: geos_bkg_tar_filename_template: default_value: TODO +geovals_experiment: + default_value: x0044_test_obs_filters_geovals + +geovals_provider: + default_value: ncdiag + gradient_norm_reduction: default_value: 10e-5 @@ -109,6 +119,23 @@ observations: - omi_aura - ompsnm_npp +path_to_geos_adas_background: + default_value: /discover/nobackup/drholdaw/SwellTestData/geosadas/bkg/*bkg_clcv_rst* + +path_to_gsi_bc_coefficients: + default_value: + - /discover/nobackup/drholdaw/SwellTestData/geosadas/bc + +path_to_gsi_nc_diags: + default_value: + - /discover/nobackup/drholdaw/SwellTestData/geosadas/obs + +produce_geovals: + default_value: true + options: + - true + - false + static_background_error_model: default_value: GSIbec options: diff --git a/src/swell/configuration/jedi/interfaces/geos_ocean/task_questions.yaml b/src/swell/configuration/jedi/interfaces/geos_ocean/task_questions.yaml index 8e02881e..4739701f 100644 --- a/src/swell/configuration/jedi/interfaces/geos_ocean/task_questions.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_ocean/task_questions.yaml @@ -29,6 +29,10 @@ clean_patterns: - '*MOM*' - logfile.*.out +forecast_duration: + default_value: + - P1D + gradient_norm_reduction: default_value: 1e-10 diff --git a/src/swell/configuration/jedi/oops/ufo_tests.yaml b/src/swell/configuration/jedi/oops/ufo_tests.yaml new file mode 100644 index 00000000..2bdeaf7b --- /dev/null +++ b/src/swell/configuration/jedi/oops/ufo_tests.yaml @@ -0,0 +1,3 @@ +window begin: '{{window_begin_iso}}' +window end: '{{window_end_iso}}' +observations: SPECIALobservations diff --git a/src/swell/deployment/bin/swell_launch_experiment.py b/src/swell/deployment/bin/swell_launch_experiment.py index 3f36bae6..6e75825a 100644 --- a/src/swell/deployment/bin/swell_launch_experiment.py +++ b/src/swell/deployment/bin/swell_launch_experiment.py @@ -52,6 +52,7 @@ def cylc_run_experiment(self): # NB: Could be a factory based on workflow_manag if self.log_path: # Add optional path for workflow engine logging. option = '--symlink-dirs=run=' + self.log_path + print(['cylc', 'install', option]) run_subprocess(self.logger, ['cylc', 'install', option]) else: run_subprocess(self.logger, ['cylc', 'install']) diff --git a/src/swell/deployment/bin/swell_prepare_config.py b/src/swell/deployment/bin/swell_prepare_config.py index d919e425..bf491bcb 100644 --- a/src/swell/deployment/bin/swell_prepare_config.py +++ b/src/swell/deployment/bin/swell_prepare_config.py @@ -37,7 +37,7 @@ def main(input_method, suite, platform, override): # Create suites object # -------------------- - config_file = prepare_config(input_method, suite, platform, override) + prepare_config(input_method, suite, platform, override) # -------------------------------------------------------------------------------------------------- diff --git a/src/swell/deployment/bin/swell_sat_db_processing.py b/src/swell/deployment/bin/swell_sat_db_processing.py index 46ce3767..d1e17c18 100644 --- a/src/swell/deployment/bin/swell_sat_db_processing.py +++ b/src/swell/deployment/bin/swell_sat_db_processing.py @@ -9,11 +9,9 @@ import yaml import click import numpy as np -import pandas as pd from datetime import datetime as dt -from swell.utilities.git_utils import git_got from swell.utilities.sat_db_utils import run_sat_db_process diff --git a/src/swell/deployment/platforms/generic/task_questions.yaml b/src/swell/deployment/platforms/generic/task_questions.yaml index e9fa7727..6bb85dac 100644 --- a/src/swell/deployment/platforms/generic/task_questions.yaml +++ b/src/swell/deployment/platforms/generic/task_questions.yaml @@ -13,6 +13,14 @@ existing_jedi_build_directory: existing_jedi_source_directory: default_value: This would need to be provided by user +geos_experiment_directory: + default_value: + - /home/geos/ + +geos_restarts_directory: + default_value: + - /home/geos/restarts + swell_static_files: default_value: This would need to be provided by user diff --git a/src/swell/deployment/platforms/nccs_discover/modules b/src/swell/deployment/platforms/nccs_discover/modules index 63e543f7..57449e7b 100644 --- a/src/swell/deployment/platforms/nccs_discover/modules +++ b/src/swell/deployment/platforms/nccs_discover/modules @@ -29,11 +29,15 @@ module unload gsibec module use -a /discover/nobackup/drholdaw/JediOpt/modulefiles/compiler/intel/2022.0.1 module load crtm/v2.4-jedi.2 -# Add IODA to PYTHONPATH in case it is needed -# ------------------------------------------- +# IODA from experiement JEDI build +# -------------------------------- PYTHONPATH={{experiment_root}}/{{experiment_id}}/jedi_bundle/build/lib/python3.9:$PYTHONPATH PYTHONPATH={{experiment_root}}/{{experiment_id}}/jedi_bundle/build/lib/python3.9/pyioda:$PYTHONPATH +# IODA-Converters from experiement JEDI source +# -------------------------------------------- +PYTHONPATH={{experiment_root}}/{{experiment_id}}/jedi_bundle/source/iodaconv/src:$PYTHONPATH + # Load GMAO modules # ----------------- module use -a /discover/swdev/gmao_SIteam/modulefiles-SLES12 diff --git a/src/swell/deployment/platforms/nccs_discover/task_questions.yaml b/src/swell/deployment/platforms/nccs_discover/task_questions.yaml index 6bd82470..f8207772 100644 --- a/src/swell/deployment/platforms/nccs_discover/task_questions.yaml +++ b/src/swell/deployment/platforms/nccs_discover/task_questions.yaml @@ -13,6 +13,14 @@ existing_jedi_build_directory: existing_jedi_source_directory: default_value: /discover/nobackup/gmao_ci/swell/nightly/latest/jedi_build/ +geos_experiment_directory: + default_value: + - /discover/nobackup/drholdaw/SwellStaticFiles/geos/run_dirs/5deg_v11 + +geos_restarts_directory: + default_value: + - /discover/nobackup/drholdaw/SwellStaticFiles/geos/restarts/restarts_20210620_000000 + swell_static_files: default_value: /discover/nobackup/drholdaw/SwellStaticFiles diff --git a/src/swell/deployment/prep_config.py b/src/swell/deployment/prep_config.py index 810a8552..becc9beb 100644 --- a/src/swell/deployment/prep_config.py +++ b/src/swell/deployment/prep_config.py @@ -11,14 +11,11 @@ import datetime import os import importlib -import ruamel.yaml as ry -import sys import yaml from swell.utilities.logger import Logger from swell.swell_path import get_swell_path from swell.utilities.dictionary import dict_get, add_comments_to_dictionary -from swell.utilities.jinja2 import template_string_jinja2 # -------------------------------------------------------------------------------------------------- @@ -113,9 +110,8 @@ def prepare_config(method, suite, platform, override=None): # Write dictionary to YAML file # ----------------------------- - exp_dict_file_open = open(exp_dict_file, "w") - n = exp_dict_file_open.write(experiment_dict_string_comments) - exp_dict_file_open.close() + with open(exp_dict_file, 'w') as file: + file.write(experiment_dict_string_comments) logger.info(f'Prepared configuration file written to {exp_dict_file}', False) # Return path to dictionary file diff --git a/src/swell/deployment/prep_config_base.py b/src/swell/deployment/prep_config_base.py index b48146e1..8073d142 100644 --- a/src/swell/deployment/prep_config_base.py +++ b/src/swell/deployment/prep_config_base.py @@ -11,7 +11,6 @@ from abc import ABC, abstractmethod import datetime import os -import pathlib import yaml from swell.swell_path import get_swell_path @@ -180,7 +179,6 @@ def add_to_experiment_dictionary(self, key, element_dict): # Check for disallowed element types for element_item in element_items: - element_item_type = type(element_item) for dis_elem_type in self.dis_elem_types: if isinstance(element_item, dis_elem_type): self.logger.abort(f'Element \'{element}\' has a type that is not permitted. ' + diff --git a/src/swell/deployment/prep_config_cli.py b/src/swell/deployment/prep_config_cli.py index c3b266d6..9e6fb4c4 100644 --- a/src/swell/deployment/prep_config_cli.py +++ b/src/swell/deployment/prep_config_cli.py @@ -16,7 +16,6 @@ import questionary from swell.deployment.prep_config_base import PrepConfigBase -from swell.swell_path import get_swell_path # -------------------------------------------------------------------------------------------------- @@ -248,7 +247,6 @@ def validate(self, document): def make_check_widget(self, quest, options, default, prompt): if options == 'file': - dir_list = os.listdir(self.directory) new_path = os.path.join(self.directory, '*/') suite_list = [x.split('/')[-2] for x in glob.glob(new_path)] choices = suite_list diff --git a/src/swell/deployment/prep_config_defaults.py b/src/swell/deployment/prep_config_defaults.py index ca1eb136..5e4c77fe 100644 --- a/src/swell/deployment/prep_config_defaults.py +++ b/src/swell/deployment/prep_config_defaults.py @@ -8,9 +8,6 @@ # -------------------------------------------------------------------------------------------------- -import os -import yaml - from swell.deployment.prep_config_base import PrepConfigBase diff --git a/src/swell/deployment/prep_exp_dirs.py b/src/swell/deployment/prep_exp_dirs.py index 9489a8af..962582d8 100644 --- a/src/swell/deployment/prep_exp_dirs.py +++ b/src/swell/deployment/prep_exp_dirs.py @@ -10,9 +10,7 @@ import copy import glob -import importlib import os -import pathlib import shutil from swell.swell_path import get_swell_path diff --git a/src/swell/deployment/prep_suite.py b/src/swell/deployment/prep_suite.py index 3c2cd6dd..f13a5e74 100644 --- a/src/swell/deployment/prep_suite.py +++ b/src/swell/deployment/prep_suite.py @@ -139,6 +139,14 @@ def prepare_cylc_suite_jinja2(logger, swell_suite_path, exp_suite_path, experime render_dictionary['scheduling']['RunGeosExecutable']['ntasks_per_node'] = 24 render_dictionary['scheduling']['RunGeosExecutable']['constraint'] = 'cas|sky|hasw' + render_dictionary['scheduling']['RunJediUfoTestsExecutable'] = {} + render_dictionary['scheduling']['RunJediUfoTestsExecutable']['execution_time_limit'] = 'PT30M' # noqa + render_dictionary['scheduling']['RunJediUfoTestsExecutable']['account'] = 'g0613' + render_dictionary['scheduling']['RunJediUfoTestsExecutable']['qos'] = 'allnccs' + render_dictionary['scheduling']['RunJediUfoTestsExecutable']['nodes'] = 1 + render_dictionary['scheduling']['RunJediUfoTestsExecutable']['ntasks_per_node'] = 1 + render_dictionary['scheduling']['RunJediUfoTestsExecutable']['constraint'] = 'cas' + # Render the template # ------------------- new_suite_file = template_string_jinja2(logger, suite_file, render_dictionary) diff --git a/src/swell/suites/build_jedi/suites-build_jedi.yaml b/src/swell/suites/build_jedi/suites-build_jedi.yaml index eab54fb3..051cd7e9 100644 --- a/src/swell/suites/build_jedi/suites-build_jedi.yaml +++ b/src/swell/suites/build_jedi/suites-build_jedi.yaml @@ -25,7 +25,7 @@ existing_jedi_build_directory: # Bundles to build bundles: - default_value: ['fv3-jedi', 'soca', 'iodaconv'] + default_value: ['fv3-jedi', 'soca', 'iodaconv', 'ufo'] prompt: List the bundles that you wish to build type: string-check-list options: use_method # This method would ask jedi_bundle for the default bundles diff --git a/src/swell/suites/convert_ncdiags/flow.cylc b/src/swell/suites/convert_ncdiags/flow.cylc new file mode 100644 index 00000000..4456b23f --- /dev/null +++ b/src/swell/suites/convert_ncdiags/flow.cylc @@ -0,0 +1,105 @@ +# (C) Copyright 2021- United States Government as represented by the Administrator of the +# National Aeronautics and Space Administration. All Rights Reserved. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. + +# -------------------------------------------------------------------------------------------------- + +# Cylc suite for executing geos_atmosphere ObsFilters tests + +# -------------------------------------------------------------------------------------------------- + +[scheduler] + UTC mode = True + allow implicit tasks = False + +# -------------------------------------------------------------------------------------------------- + +[scheduling] + + initial cycle point = {{start_cycle_point}} + final cycle point = {{final_cycle_point}} + runahead limit = {{runahead_limit}} + + [[graph]] + R1 = """ + # Triggers for non cycle time dependent tasks + # ------------------------------------------- + # Clone JEDI source code + CloneJedi + + # Build JEDI source code by linking + CloneJedi => BuildJediByLinking? + + # If not able to link to build create the build + BuildJediByLinking:fail? => BuildJedi + """ + + {% for cycle_time in cycle_times %} + {{cycle_time.cycle_time}} = """ + + # Convert bias correction to ioda + GetGsiBc + GetGsiBc => GsiBcToIoda + BuildJediByLinking[^]? | BuildJedi[^] => GsiBcToIoda + + # Convert ncdiags to ioda + GetGsiNcdiag + GetGsiNcdiag => GsiNcdiagToIoda + BuildJediByLinking[^]? | BuildJedi[^] => GsiNcdiagToIoda + + # Clean up + GsiNcdiagToIoda => CleanCycle + """ + {% endfor %} + +# -------------------------------------------------------------------------------------------------- + +[runtime] + + # Task defaults + # ------------- + [[root]] + pre-script = "source $CYLC_SUITE_DEF_PATH/modules" + + [[[environment]]] + datetime = $CYLC_TASK_CYCLE_POINT + config = $CYLC_SUITE_DEF_PATH/experiment.yaml + + # Tasks + # ----- + [[CloneJedi]] + script = "swell_task CloneJedi $config" + + [[BuildJediByLinking]] + script = "swell_task BuildJediByLinking $config" + + [[BuildJedi]] + script = "swell_task BuildJedi $config" + platform = {{platform}} + execution time limit = {{scheduling["BuildJedi"]["execution_time_limit"]}} + [[[directives]]] + --account = {{scheduling["BuildJedi"]["account"]}} + --qos = {{scheduling["BuildJedi"]["qos"]}} + --job-name = BuildJedi + --nodes={{scheduling["BuildJedi"]["nodes"]}} + --ntasks-per-node={{scheduling["BuildJedi"]["ntasks_per_node"]}} + --constraint={{scheduling["BuildJedi"]["constraint"]}} + + [[ GetGsiBc ]] + script = "swell_task GetGsiBc $config -d $datetime -m geos_atmosphere" + + [[ GsiBcToIoda ]] + script = "swell_task GsiBcToIoda $config -d $datetime -m geos_atmosphere" + + [[ GetGsiNcdiag ]] + script = "swell_task GetGsiNcdiag $config -d $datetime -m geos_atmosphere" + + [[ GsiNcdiagToIoda ]] + script = "swell_task GsiNcdiagToIoda $config -d $datetime -m geos_atmosphere" + + [[CleanCycle]] + script = "swell_task CleanCycle $config -d $datetime -m geos_atmosphere" + +# -------------------------------------------------------------------------------------------------- diff --git a/src/swell/suites/convert_ncdiags/geos_atmosphere/suites-convert_ncdiags-geos_atmosphere.yaml b/src/swell/suites/convert_ncdiags/geos_atmosphere/suites-convert_ncdiags-geos_atmosphere.yaml new file mode 100644 index 00000000..6480ac8b --- /dev/null +++ b/src/swell/suites/convert_ncdiags/geos_atmosphere/suites-convert_ncdiags-geos_atmosphere.yaml @@ -0,0 +1,85 @@ +# Cycle frequency +cycle_times: + default_value: ['T00'] + prompt: List all cycle times, by middle of the window? + options: ['T00'] + type: string-check-list + +# Observations +observations: + default_value: + # Conventional + - aircraft + - gps + - satwind + - scatwind + - sfcship + - sfc + - sondes + # Radiances + - airs_aqua + - amsr2_gcom-w1 + - amsua_aqua + - amsua_metop-b + - amsua_metop-c + - amsua_n15 + - amsua_n18 + - amsua_n19 + - atms_n20 + - atms_npp + - avhrr3_metop-b + - avhrr3_n18 + - avhrr3_n19 + - cris-fsr_n20 + - cris-fsr_npp + - gmi_gpm + - iasi_metop-b + - iasi_metop-c + - mhs_metop-b + - mhs_metop-c + - mhs_n19 + - ssmis_f17 + # Ozone + - mls55_aura + - omi_aura + - ompsnm_npp + prompt: Select observations to run with. + options: use_method + type: string-check-list + +# Path to GSI ncdiags +path_to_gsi_nc_diags: + default_value: '/discover/nobackup/drholdaw/SwellTestData/ufo_testing/ncdiag/2021121200' + prompt: Path to where the ncdiags will be held + type: string + +# Compute GeoVaLs and observations +produce_geovals: + default_value: true + prompt: Compute GeoVaLs as well as observations? + type: boolean + +# Location for bias correction coefficients +path_to_gsi_bc_coefficients: + default_value: '/discover/nobackup/drholdaw/SwellTestData/ufo_testing/bc/2021121200' + prompt: Tar or directory containing BC files + type: string + +fixed_options: + window_offset: + default_value: PT3H + prompt: Time from beginning to middle of the window + background_time_offset: + default_value: PT9H + prompt: Time before the middle of the window that the background providing forecast began + clean_patterns: + default_value: + - gsi_bcs/*.nc4 + - gsi_bcs/*.txt + - gsi_bcs/*.yaml + - gsi_bcs + - gsi_ncdiags/*.nc4 + - gsi_ncdiags/aircraft/*.nc4 + - gsi_ncdiags/aircraft + - gsi_ncdiags + prompt: 'Patterns for the files to remove after completing a cycle' diff --git a/src/swell/suites/convert_ncdiags/suites-convert_ncdiags.yaml b/src/swell/suites/convert_ncdiags/suites-convert_ncdiags.yaml new file mode 100644 index 00000000..c77e8437 --- /dev/null +++ b/src/swell/suites/convert_ncdiags/suites-convert_ncdiags.yaml @@ -0,0 +1,61 @@ +# Cycle start point +start_cycle_point: + default_value: '2021-12-12T00:00:00Z' + prompt: What is the time of the first cycle (middle of the window)? + type: iso-datetime + +# Cycle final point +final_cycle_point: + default_value: '2021-12-12T00:00:00Z' + prompt: What is the time of the final cycle (middle of the window)? + type: iso-datetime + +# Run ahead limit for workflow +runahead_limit: + default_value: 'P4' + prompt: Since this suite is non-cycling choose how many hours the workflow can run ahead? + type: string + +# Jedi build system +jedi_build_method: + default_value: use_existing + prompt: Create a new JEDI build or use an existing build? + options: ['create', 'use_existing'] + type: string-drop-list + +# Existing JEDI bundle directory +existing_jedi_source_directory: + default_value: {{existing_jedi_source_directory}} + prompt: Provide the path to an existing JEDI bundle directory containing source code repos + type: string + depends: + key: jedi_build_method + value: use_existing + +# Existing JEDI build +existing_jedi_build_directory: + default_value: {{existing_jedi_build_directory}} + prompt: Provide the path to an existing JEDI build directory + type: string + depends: + key: jedi_build_method + value: use_existing + +# Models to use +model_components: + default_value: ['geos_atmosphere'] + prompt: Select models to use (choose at least one) + options: use_method + type: file-check-list + +# Fixed options +fixed_options: + data_assimilation_run: + default_value: true + prompt: Does this workflow include data assimilation? + +# R2D2 Configuration +r2d2_local_path: + default_value: {{r2d2_local_path}} + prompt: Enter the path where R2D2 will store experiment output + type: string diff --git a/src/swell/suites/geosadas/flow.cylc b/src/swell/suites/geosadas/flow.cylc new file mode 100644 index 00000000..f697e15c --- /dev/null +++ b/src/swell/suites/geosadas/flow.cylc @@ -0,0 +1,111 @@ +# (C) Copyright 2021- United States Government as represented by the Administrator of the +# National Aeronautics and Space Administration. All Rights Reserved. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. + +# -------------------------------------------------------------------------------------------------- + +# Cylc suite for executing JEDI-based non-cycling variational data assimilation + +# -------------------------------------------------------------------------------------------------- + +[scheduler] + UTC mode = True + allow implicit tasks = False + +# -------------------------------------------------------------------------------------------------- + +[scheduling] + + initial cycle point = 2020-12-15T00:00:00Z + final cycle point = 2020-12-15T00:00:00Z + + [[graph]] + R1 = """ + # Clone JEDI source code + CloneJedi + + # Build JEDI source code by linking + BuildJediByLinking? + + # Stage JEDI static files + CloneJedi => StageJedi + """ + + T00 = """ + # Get and convert bias correction coefficients + GetGsiBc => GsiBcToIoda + + # Get and convert ncdiags + GetGsiNcdiag => GsiNcdiagToIoda + + # Get background + GetGeosAdasBackground + + # Run Jedi variational executable + BuildJediByLinking[^] => RunJediVariationalExecutable + StageJedi[^] => RunJediVariationalExecutable + GsiBcToIoda => RunJediVariationalExecutable + GsiNcdiagToIoda => RunJediVariationalExecutable + GetGeosAdasBackground => RunJediVariationalExecutable + + # Clean cycle + RunJediVariationalExecutable => CleanCycle + """ + +# -------------------------------------------------------------------------------------------------- + +[runtime] + + # Task defaults + # ------------- + [[root]] + pre-script = "source $CYLC_SUITE_DEF_PATH/modules" + + [[[environment]]] + datetime = $CYLC_TASK_CYCLE_POINT + config = $CYLC_SUITE_DEF_PATH/experiment.yaml + + # Tasks + # ----- + [[CloneJedi]] + script = "swell_task CloneJedi $config" + + [[BuildJediByLinking]] + script = "swell_task BuildJediByLinking $config" + + [[StageJedi]] + script = "swell_task StageJedi $config -m geos_atmosphere" + + [[ GetGsiBc ]] + script = "swell_task GetGsiBc $config -d $datetime -m geos_atmosphere" + + [[ GsiBcToIoda ]] + script = "swell_task GsiBcToIoda $config -d $datetime -m geos_atmosphere" + + [[ GetGsiNcdiag ]] + script = "swell_task GetGsiNcdiag $config -d $datetime -m geos_atmosphere" + + [[ GsiNcdiagToIoda ]] + script = "swell_task GsiNcdiagToIoda $config -d $datetime -m geos_atmosphere" + + [[ GetGeosAdasBackground ]] + script = "swell_task GetGeosAdasBackground $config -d $datetime -m geos_atmosphere" + + [[RunJediVariationalExecutable]] + script = "swell_task RunJediVariationalExecutable $config -d $datetime -m geos_atmosphere" + platform = {{platform}} + execution time limit = {{scheduling["RunJediVariationalExecutable"]["execution_time_limit"]}} + [[[directives]]] + --account = {{scheduling["RunJediVariationalExecutable"]["account"]}} + --qos = {{scheduling["RunJediVariationalExecutable"]["qos"]}} + --job-name = RunJediVariationalExecutable + --nodes={{scheduling["RunJediVariationalExecutable"]["nodes"]}} + --ntasks-per-node={{scheduling["RunJediVariationalExecutable"]["ntasks_per_node"]}} + --constraint={{scheduling["RunJediVariationalExecutable"]["constraint"]}} + + [[CleanCycle]] + script = "swell_task CleanCycle $config -d $datetime -m geos_atmosphere" + +# -------------------------------------------------------------------------------------------------- diff --git a/src/swell/suites/geosadas/geos_atmosphere/suites-geosadas-geos_atmosphere.yaml b/src/swell/suites/geosadas/geos_atmosphere/suites-geosadas-geos_atmosphere.yaml new file mode 100644 index 00000000..cc93920f --- /dev/null +++ b/src/swell/suites/geosadas/geos_atmosphere/suites-geosadas-geos_atmosphere.yaml @@ -0,0 +1,107 @@ +# Window length +window_length: + default_value: 'PT6H' + prompt: Window length for ocean data assimilation + type: iso-duration + +# Horizontal resolution +horizontal_resolution: + default_value: '361' + prompt: What resolution for the atmospheric background (For c360 choose 361)? + options: ['181', '361', '721'] + type: string-drop-list + +# Vertical resolution +vertical_resolution: + default_value: '72' + prompt: What vertical resolution for the atmospheric background? + options: ['72'] + type: string-drop-list + +# Processor layout x direction +npx_proc: + default_value: '4' + prompt: What processor layout (x-direction) per cube face? + type: string + +# Processor layout y direction +npy_proc: + default_value: '1' + prompt: What processor layout (y-direction) per cube face? + type: string + +# Analysis +analysis_variables: + default_value: [ua,va,t,ps,q,qi,ql,o3ppmv,ts,phis,frocean,frlake,frseaice] + prompt: Variables to be assimilated? + type: string + +# Observations +observations: + default_value: + - sondes + - amsua_n19 + prompt: Select observations. + options: use_method + type: string-check-list + +# Path to GSI bias correction coefficients +path_to_gsi_bc_coefficients: + default_value: /discover/nobackup/drholdaw/SwellTestData/geosadas/bc + prompt: Tar or directory containing BC files + type: string + +# Path to GSI ncdiags +path_to_gsi_nc_diags: + default_value: /discover/nobackup/drholdaw/SwellTestData/geosadas/obs + prompt: Path to where the ncdiags will be held + type: string + +# Path to GEOS adas background files +path_to_geos_adas_background: + default_value: /discover/nobackup/drholdaw/SwellTestData/geosadas/bkg/*bkg_clcv_rst* + prompt: Tar or directory containing BC files + type: string + +# Compute GeoVaLs and observations +produce_geovals: + default_value: false + prompt: Compute GeoVaLs as well as observations? + type: boolean + +# Fixed options (user not prompted for these) +# ------------------------------------------- +fixed_options: + window_type: + default_value: 3D + prompt: Window type (3D or 4D) + minimizer: + default_value: DRIPCG + prompt: Minimizer to use for gradient descent + number_of_iterations: + default_value: [2] + prompt: Number of iterations to use in the minimization + gradient_norm_reduction: + default_value: 1e-6 + prompt: Threshold for convergence of the minimization + window_offset: + default_value: PT3H + prompt: Time from beginning to middle of the window + analysis_forecast_window_offset: + default_value: -PT3H + prompt: Time from the middle of the window when forecasts start + background_time_offset: + default_value: PT1H + prompt: Time before the middle of the window that the background providing forecast began + background_frequency: + default_value: PT1H + prompt: 'Frequency of 4D backgrounds' + background_source: + default_value: file + prompt: 'Source of the background files (file or from model)' + clean_patterns: + default_value: ['*.nc4','*.txt'] + prompt: 'Patterns for the files to remove after completing a cycle' + crtm_coeff_dir: + default_value: {{crtm_coeff_dir}} + prompt: 'Directory containing the CRTM coefficient files' diff --git a/src/swell/suites/geosadas/suites-geosadas.yaml b/src/swell/suites/geosadas/suites-geosadas.yaml new file mode 100644 index 00000000..63a0b853 --- /dev/null +++ b/src/swell/suites/geosadas/suites-geosadas.yaml @@ -0,0 +1,36 @@ +# Jedi build system +jedi_build_method: + default_value: use_existing + prompt: Create a new JEDI build or use an existing build? + options: ['create', 'use_existing'] + type: string-drop-list + +# Existing JEDI bundle directory +existing_jedi_source_directory: + default_value: /discover/nobackup/drholdaw/JediDev/gsibec + prompt: Provide the path to an existing JEDI bundle directory containing source code repos + type: string + depends: + key: jedi_build_method + value: use_existing + +# Existing JEDI build +existing_jedi_build_directory: + default_value: /discover/nobackup/drholdaw/JediDev/gsibec/build-intel-release/ + prompt: Provide the path to an existing JEDI build directory + type: string + depends: + key: jedi_build_method + value: use_existing + +# Models to use +model_components: + default_value: ['geos_atmosphere'] + prompt: Select models to use + options: use_method + type: file-check-list + +generate_yaml_and_exit: + default_value: True + prompt: Generate YAML and exit? + type: boolean diff --git a/src/swell/suites/hofx/geos_atmosphere/suites-hofx-geos_atmosphere.yaml b/src/swell/suites/hofx/geos_atmosphere/suites-hofx-geos_atmosphere.yaml index 19d2e828..f71aa2ec 100644 --- a/src/swell/suites/hofx/geos_atmosphere/suites-hofx-geos_atmosphere.yaml +++ b/src/swell/suites/hofx/geos_atmosphere/suites-hofx-geos_atmosphere.yaml @@ -37,13 +37,13 @@ npy_proc: # Backgrounds background_experiment: - default_value: x0044 + default_value: x0048 prompt: Experiment providing the background files? type: string # Observation experiment obs_experiment: - default_value: x0044_v3 + default_value: x0048 prompt: Experiment providing the observations? type: string @@ -53,14 +53,6 @@ observations: # Conventional - aircraft # Radiances - - amsua_n19 - - amsua_aqua - - amsua_metop-a - - amsua_metop-b - - amsua_metop-c - - amsua_n15 - - amsua_n18 - - amsua_n19 - gmi_gpm - amsr2_gcom-w1 # Ozone diff --git a/src/swell/suites/hofx/suites-hofx.yaml b/src/swell/suites/hofx/suites-hofx.yaml index 7114e936..3af7c28e 100644 --- a/src/swell/suites/hofx/suites-hofx.yaml +++ b/src/swell/suites/hofx/suites-hofx.yaml @@ -1,12 +1,12 @@ # Cycle start point start_cycle_point: - default_value: '2020-12-15T00:00:00Z' + default_value: '2021-12-12T00:00:00Z' prompt: What is the time of the first cycle (middle of the window)? type: iso-datetime # Cycle final point final_cycle_point: - default_value: '2020-12-15T06:00:00Z' + default_value: '2021-12-12T06:00:00Z' prompt: What is the time of the final cycle (middle of the window)? type: iso-datetime diff --git a/src/swell/suites/ufo_testing/flow.cylc b/src/swell/suites/ufo_testing/flow.cylc new file mode 100644 index 00000000..c1edb926 --- /dev/null +++ b/src/swell/suites/ufo_testing/flow.cylc @@ -0,0 +1,134 @@ +# (C) Copyright 2021- United States Government as represented by the Administrator of the +# National Aeronautics and Space Administration. All Rights Reserved. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. + +# -------------------------------------------------------------------------------------------------- + +# Cylc suite for executing geos_atmosphere ObsFilters tests + +# -------------------------------------------------------------------------------------------------- + +[scheduler] + UTC mode = True + allow implicit tasks = False + +# -------------------------------------------------------------------------------------------------- + +[scheduling] + + initial cycle point = {{start_cycle_point}} + final cycle point = {{final_cycle_point}} + runahead limit = {{runahead_limit}} + + [[graph]] + R1 = """ + # Triggers for non cycle time dependent tasks + # ------------------------------------------- + # Clone JEDI source code + CloneJedi + + # Build JEDI source code by linking + CloneJedi => BuildJediByLinking? + + # If not able to link to build create the build + BuildJediByLinking:fail? => BuildJedi + """ + + {% for cycle_time in cycle_times %} + {{cycle_time.cycle_time}} = """ + + # Convert bias correction to ioda + GetGsiBc + GetGsiBc => GsiBcToIoda + BuildJediByLinking[^]? | BuildJedi[^] => GsiBcToIoda + + # Convert ncdiags to ioda + GetGsiNcdiag + GetGsiNcdiag => GsiNcdiagToIoda + BuildJediByLinking[^]? | BuildJedi[^] => GsiNcdiagToIoda + + GetGeovals + + # Run Jedi hofx executable + GsiNcdiagToIoda => RunJediUfoTestsExecutable + GsiBcToIoda => RunJediUfoTestsExecutable + GetGeovals => RunJediUfoTestsExecutable + + # EvaObservations + RunJediUfoTestsExecutable => EvaObservations + + # Clean up large files + EvaObservations => CleanCycle + + """ + {% endfor %} + +# -------------------------------------------------------------------------------------------------- + +[runtime] + + # Task defaults + # ------------- + [[root]] + pre-script = "source $CYLC_SUITE_DEF_PATH/modules" + + [[[environment]]] + datetime = $CYLC_TASK_CYCLE_POINT + config = $CYLC_SUITE_DEF_PATH/experiment.yaml + + # Tasks + # ----- + [[CloneJedi]] + script = "swell_task CloneJedi $config" + + [[BuildJediByLinking]] + script = "swell_task BuildJediByLinking $config" + + [[BuildJedi]] + script = "swell_task BuildJedi $config" + platform = {{platform}} + execution time limit = {{scheduling["BuildJedi"]["execution_time_limit"]}} + [[[directives]]] + --account = {{scheduling["BuildJedi"]["account"]}} + --qos = {{scheduling["BuildJedi"]["qos"]}} + --job-name = BuildJedi + --nodes={{scheduling["BuildJedi"]["nodes"]}} + --ntasks-per-node={{scheduling["BuildJedi"]["ntasks_per_node"]}} + --constraint={{scheduling["BuildJedi"]["constraint"]}} + + [[ GetGsiBc ]] + script = "swell_task GetGsiBc $config -d $datetime -m geos_atmosphere" + + [[ GsiBcToIoda ]] + script = "swell_task GsiBcToIoda $config -d $datetime -m geos_atmosphere" + + [[ GetGsiNcdiag ]] + script = "swell_task GetGsiNcdiag $config -d $datetime -m geos_atmosphere" + + [[ GsiNcdiagToIoda ]] + script = "swell_task GsiNcdiagToIoda $config -d $datetime -m geos_atmosphere" + + [[ GetGeovals ]] + script = "swell_task GetGeovals $config -d $datetime -m geos_atmosphere" + + [[RunJediUfoTestsExecutable]] + script = "swell_task RunJediUfoTestsExecutable $config -d $datetime -m geos_atmosphere" + platform = {{platform}} + execution time limit = {{scheduling["RunJediUfoTestsExecutable"]["execution_time_limit"]}} + [[[directives]]] + --account = {{scheduling["RunJediUfoTestsExecutable"]["account"]}} + --qos = {{scheduling["RunJediUfoTestsExecutable"]["qos"]}} + --job-name = RunJediUfoTestsExecutable + --nodes={{scheduling["RunJediUfoTestsExecutable"]["nodes"]}} + --ntasks-per-node={{scheduling["RunJediUfoTestsExecutable"]["ntasks_per_node"]}} + --constraint={{scheduling["RunJediUfoTestsExecutable"]["constraint"]}} + + [[EvaObservations]] + script = "swell_task EvaObservations $config -d $datetime -m geos_atmosphere" + + [[CleanCycle]] + script = "swell_task CleanCycle $config -d $datetime -m geos_atmosphere" + +# -------------------------------------------------------------------------------------------------- diff --git a/src/swell/suites/ufo_testing/geos_atmosphere/eva_observations.yaml b/src/swell/suites/ufo_testing/geos_atmosphere/eva_observations.yaml new file mode 100644 index 00000000..904bd387 --- /dev/null +++ b/src/swell/suites/ufo_testing/geos_atmosphere/eva_observations.yaml @@ -0,0 +1,390 @@ +diagnostics: + +- data: + type: IodaObsSpace + datasets: + + - name: experiment + filenames: + - {{obs_path_file}} + missing_value_threshold: 1.0e06 + channels: &channels {{channels}} + groups: + - name: ObsValue + variables: &variables {{simulated_variables}} + - name: MetaData + # Jedi + - name: hofx + - name: EffectiveQC + - name: EffectiveError + # Gsi + - name: GsiHofX + - name: GsiHofXBc + - name: GsiEffectiveQC + - name: GsiFinalObsError + + transforms: + + # Hofx differences + # ---------------- + + - transform: arithmetic + new name: experiment::hofxDiff::${variable} + equals: experiment::hofx::${variable}-experiment::GsiHofX::${variable} + for: + variable: *variables + + - transform: arithmetic + new name: experiment::hofxDiffBc::${variable} + equals: experiment::hofx::${variable}-experiment::GsiHofXBc::${variable} + for: + variable: *variables + + # Observation minus Hofx + # ---------------------- + + - transform: arithmetic + new name: experiment::ObsValueMinusHofx::${variable} + equals: experiment::ObsValue::${variable}-experiment::hofx::${variable} + for: + variable: *variables + + - transform: arithmetic + new name: experiment::ObsValueMinusGsiHofX::${variable} + equals: experiment::ObsValue::${variable}-experiment::GsiHofX::${variable} + for: + variable: *variables + + - transform: arithmetic + new name: experiment::ObsValueMinusGsiHofXBc::${variable} + equals: experiment::ObsValue::${variable}-experiment::GsiHofXBc::${variable} + for: + variable: *variables + + # Effective error that passed QC + # ------------------------------ + + - transform: accept where + new name: experiment::EffectiveErrorPassedQc::${variable} + starting field: experiment::EffectiveError::${variable} + where: + - experiment::EffectiveQC::${variable} == 0 + for: + variable: *variables + + - transform: accept where + new name: experiment::FinalObsErrorPassedQc::${variable} + starting field: experiment::GsiFinalObsError::${variable} + where: + - experiment::GsiFinalObsError::${variable} > 0 + for: + variable: *variables + + # Error Difference + # ---------------- + - transform: arithmetic + new name: experiment::EffectiveErrorPassedQcDiff::${variable} + equals: experiment::FinalObsErrorPassedQc::${variable}-experiment::EffectiveErrorPassedQc::${variable} + for: + variable: *variables + + # Observation minus Hofx passing QC + # --------------------------------- + - transform: accept where + new name: experiment::ObsValueMinusHofxPassedQc::${variable} + starting field: experiment::ObsValueMinusHofx::${variable} + where: + - experiment::EffectiveQC::${variable} == 0 + for: + variable: *variables + + - transform: accept where + new name: experiment::ObsValueMinusGsiHofXPassedQc::${variable} + starting field: experiment::ObsValueMinusGsiHofX::${variable} + where: + - experiment::GsiEffectiveQC::${variable} == 0 + for: + variable: *variables + + - transform: accept where + new name: experiment::ObsValueMinusGsiHofXBcPassedQc::${variable} + starting field: experiment::ObsValueMinusGsiHofXBc::${variable} + where: + - experiment::GsiEffectiveQC::${variable} == 0 + for: + variable: *variables + + + graphics: + + # Correlation scatter JEDI h(x) vs GSI h(x) + # ----------------------------------------- + - batch figure: + variables: *variables + channels: *channels + figure: + layout: [1,1] + title: 'JEDI h(x) vs. GSI h(x) | {{instrument_title}} | ${variable_title}' + output name: '{{cycle_dir}}/eva/{{instrument}}/${variable}${channel}_a_hofx_vs_gsihofx.png' + plots: + - add_xlabel: 'GSI h(x)' + add_ylabel: 'JEDI h(x)' + add_grid: + add_legend: + loc: 'upper left' + layers: + - type: Scatter + y: + variable: experiment::hofx::${variable} + x: + variable: experiment::GsiHofX::${variable} + channel: ${channel} + markersize: 5 + color: 'blue' + label: 'JEDI h(x) versus GSI h(x)' + + # Correlation scatter JEDI h(x) vs GSI h(x) BC + # -------------------------------------------- + - batch figure: + variables: *variables + channels: *channels + figure: + layout: [1,1] + title: 'JEDI h(x) vs. GSI h(x) BC | {{instrument_title}} | ${variable_title}' + output name: '{{cycle_dir}}/eva/{{instrument}}/${variable}${channel}_b_hofx_vs_gsihofxbc.png' + plots: + - add_xlabel: 'GSI h(x) BC' + add_ylabel: 'JEDI h(x)' + add_grid: + add_legend: + loc: 'upper left' + layers: + - type: Scatter + y: + variable: experiment::hofx::${variable} + x: + variable: experiment::GsiHofXBc::${variable} + channel: ${channel} + markersize: 5 + color: 'blue' + label: 'JEDI h(x) versus GSI h(x)' + + # Correlation scatter JEDI h(x) - GSI H(x) vs GSI h(x) + # ---------------------------------------------------- + - batch figure: + variables: *variables + channels: *channels + figure: + layout: [1,1] + title: 'JEDI h(x) - GSI h(x) vs. GSI h(x) | {{instrument_title}} | ${variable_title}' + output name: '{{cycle_dir}}/eva/{{instrument}}/${variable}${channel}_c_hofxdiff_vs_gsihofx.png' + plots: + - add_xlabel: 'GSI h(x)' + add_ylabel: 'JEDI h(x) - GSI h(x)' + add_grid: + add_legend: + loc: 'upper left' + layers: + - type: Scatter + y: + variable: experiment::hofxDiff::${variable} + x: + variable: experiment::GsiHofX::${variable} + channel: ${channel} + markersize: 5 + color: 'blue' + label: 'JEDI h(x) versus GSI h(x)' + + # Correlation scatter JEDI h(x) - GSI H(x) BC vs GSI h(x) BC + # ---------------------------------------------------------- + - batch figure: + variables: *variables + channels: *channels + figure: + layout: [1,1] + title: 'JEDI h(x) - GSI h(x) BC vs. GSI h(x) BC | {{instrument_title}} | ${variable_title}' + output name: '{{cycle_dir}}/eva/{{instrument}}/${variable}${channel}_d_hofxdiffbc_vs_gsihofxbc.png' + plots: + - add_xlabel: 'GSI h(x) BC' + add_ylabel: 'JEDI h(x) - GSI h(x) BC' + add_grid: + add_legend: + loc: 'upper left' + layers: + - type: Scatter + y: + variable: experiment::hofxDiffBc::${variable} + x: + variable: experiment::GsiHofXBc::${variable} + channel: ${channel} + markersize: 5 + color: 'blue' + label: 'JEDI h(x) versus GSI h(x)' + + + # Effective Error vs GSI Final Error (Passed QC) + # ---------------------------------------------- + - batch figure: + variables: *variables + channels: *channels + figure: + layout: [1,1] + title: 'JEDI Effective Error vs. GSI FinalObsError (Passing QC) | {{instrument_title}} | ${variable_title}' + output name: '{{cycle_dir}}/eva/{{instrument}}/${variable}${channel}_e_effectiveerror_vs_gsifinalerror.png' + plots: + - add_xlabel: 'GSI FinalObsError (Passed QC)' + add_ylabel: 'JEDI Effective Error (Passed QC)' + add_grid: + add_legend: + loc: 'upper left' + layers: + - type: Scatter + y: + variable: experiment::EffectiveErrorPassedQc::${variable} + x: + variable: experiment::FinalObsErrorPassedQc::${variable} + channel: ${channel} + markersize: 5 + color: 'blue' + label: 'JEDI h(x) versus GSI h(x)' + + + # Effective Error - GSI Final Error vs GSI Final Error (Passed QC) + # ---------------------------------------------------------------- + - batch figure: + variables: *variables + channels: *channels + figure: + layout: [1,1] + title: 'JEDI Effective Error vs. GSI FinalObsError (Passing QC) | {{instrument_title}} | ${variable_title}' + output name: '{{cycle_dir}}/eva/{{instrument}}/${variable}${channel}_f_effectiveerrordiff_vs_gsifinalerror.png' + plots: + - add_xlabel: 'GSI FinalObsError (Passed QC)' + add_ylabel: 'JEDI Effective Error (Passed QC) - GSI FinalObsError (Passed QC)' + add_grid: + add_legend: + loc: 'upper left' + layers: + - type: Scatter + y: + variable: experiment::EffectiveErrorPassedQcDiff::${variable} + x: + variable: experiment::FinalObsErrorPassedQc::${variable} + channel: ${channel} + markersize: 5 + color: 'blue' + label: 'JEDI h(x) versus GSI h(x)' + + + # Density plot for observation minus background passed QC + # ------------------------------------------------------- + - batch figure: + variables: *variables + channels: *channels + figure: + layout: [1,1] + title: 'Observation minus Background Density (Passing QC) | {{instrument_title}} | ${variable_title}' + output name: '{{cycle_dir}}/eva/{{instrument}}/${variable}${channel}_g_omb_density.png' + plots: + - add_xlabel: 'Observation minus h(x)' + add_ylabel: 'Density' + add_legend: + loc: 'upper left' + statistics: + fields: + - field_name: experiment::ObsValueMinusGsiHofXPassedQc::${variable} + channel: ${channel} + xloc: 0.5 + yloc: -0.10 + kwargs: + color: 'blue' + fontsize: 8 + fontfamily: monospace + - field_name: experiment::ObsValueMinusHofxPassedQc::${variable} + channel: ${channel} + xloc: 0.5 + yloc: -0.13 + kwargs: + color: 'red' + fontsize: 8 + fontfamily: monospace + statistics_variables: + - n + - min + - mean + - max + - std + layers: + - type: Density + data: + variable: experiment::ObsValueMinusGsiHofXPassedQc::${variable} + channel: ${channel} + color: 'blue' + label: 'GSI omb (Passed QC)' + alpha: 0.5 + bw_adjust: 0.1 # Reduce this value to fit the data more closely + - type: Density + data: + variable: experiment::ObsValueMinusHofxPassedQc::${variable} + channel: ${channel} + color: 'red' + label: 'JEDI omb (Passed QC)' + alpha: 0.5 + bw_adjust: 0.1 # Reduce this value to fit the data more closely + + + # Density plot for observation minus background passed QC (bias corrected) + # ------------------------------------------------------------------------ + - batch figure: + variables: *variables + channels: *channels + figure: + layout: [1,1] + title: 'Observation minus Background Density (Passing QC) | {{instrument_title}} | ${variable_title}' + output name: '{{cycle_dir}}/eva/{{instrument}}/${variable}${channel}_h_ombbc_density.png' + plots: + - add_xlabel: 'Observation minus h(x)' + add_ylabel: 'Density' + add_legend: + loc: 'upper left' + statistics: + fields: + - field_name: experiment::ObsValueMinusGsiHofXBcPassedQc::${variable} + channel: ${channel} + xloc: 0.5 + yloc: -0.10 + kwargs: + color: 'blue' + fontsize: 8 + fontfamily: monospace + - field_name: experiment::ObsValueMinusHofxPassedQc::${variable} + channel: ${channel} + xloc: 0.5 + yloc: -0.13 + kwargs: + color: 'red' + fontsize: 8 + fontfamily: monospace + statistics_variables: + - n + - min + - mean + - max + - std + layers: + - type: Density + data: + variable: experiment::ObsValueMinusGsiHofXBcPassedQc::${variable} + channel: ${channel} + color: 'blue' + label: 'GSI omb BC (Passed QC)' + alpha: 0.5 + bw_adjust: 0.1 # Reduce this value to fit the data more closely + - type: Density + data: + variable: experiment::ObsValueMinusHofxPassedQc::${variable} + channel: ${channel} + color: 'red' + label: 'JEDI omb (Passed QC)' + alpha: 0.5 + bw_adjust: 0.1 # Reduce this value to fit the data more closely diff --git a/src/swell/suites/ufo_testing/geos_atmosphere/suites-ufo_testing-geos_atmosphere.yaml b/src/swell/suites/ufo_testing/geos_atmosphere/suites-ufo_testing-geos_atmosphere.yaml new file mode 100644 index 00000000..25930f5d --- /dev/null +++ b/src/swell/suites/ufo_testing/geos_atmosphere/suites-ufo_testing-geos_atmosphere.yaml @@ -0,0 +1,120 @@ +# Cycle frequency +cycle_times: + default_value: ['T00'] + prompt: List all cycle times, by middle of the window? + options: ['T00'] + type: string-check-list + +# Window length +window_length: + default_value: 'PT6H' + prompt: Window length + type: iso-duration + +# Observations +observations: + default_value: + - aircraft + - gmi_gpm + + +# - airs_aqua +# - amsr2_gcom-w1 +# - amsua_aqua +# - amsua_metop-a +# - amsua_metop-b +# - amsua_metop-c +# - amsua_n15 +# - amsua_n18 +# - amsua_n19 +# - atms_n20 +# - atms_npp +# - avhrr_metop-a +# - avhrr_n18 +# - cris-fsr_n20 +# - cris-fsr_npp +# - gmi_gpm +# - gps +# - iasi_metop-a +# - iasi_metop-b +# - mhs_metop-b +# - mhs_metop-c +# - mhs_n19 +# - mls55_aura +# - omi_aura +# - ompsnm_npp +# - satwind +# - scatwind +# - seviri_m08 +# - sfcship +# - sfc +# - ssmis_f17 +# - vadwind + prompt: Select observations to run with. + options: use_method + type: string-check-list + +# Path to GSI ncdiags +path_to_gsi_nc_diags: + default_value: '/discover/nobackup/drholdaw/SwellTestData/ufo_testing/ncdiag/2021121200' + prompt: Path to where the ncdiags will be held + type: string + +# Compute GeoVaLs and observations +produce_geovals: + default_value: false + prompt: Compute GeoVaLs as well as observations? + type: boolean + +# Location for bias correction coefficients +path_to_gsi_bc_coefficients: + default_value: '/discover/nobackup/drholdaw/SwellTestData/ufo_testing/bc/2021121200' + prompt: Tar or directory containing BC files + type: string + +# Observation experiment +geovals_experiment: + default_value: x0048-geovals + prompt: Experiment providing the GeoVaLs? + type: string + + +# Fixed options (user not prompted for these) +# ------------------------------------------- +fixed_options: + crtm_coeff_dir: + default_value: {{crtm_coeff_dir}} + prompt: 'Directory containing the CRTM coefficient files' + total_processors: + default_value: 1 + prompt: Equation to compute total number of processors + clean_patterns: + default_value: + - '*.nc4' + - '*.txt' + - '*.log' + - '*.yaml' + - gsi_bcs/*.nc4 + - gsi_bcs/*.txt + - gsi_bcs/*.yaml + - gsi_bcs + - gsi_ncdiags/*.nc4 + - gsi_ncdiags/aircraft/*.nc4 + - gsi_ncdiags/aircraft + - gsi_ncdiags + prompt: 'Patterns for the files to remove after completing a cycle' + # Needed because of config gen + window_type: + default_value: 4D + prompt: Window type (3D or 4D) + window_offset: + default_value: PT3H + prompt: Time from beginning to middle of the window + background_time_offset: + default_value: PT9H + prompt: Time before the middle of the window that the background providing forecast began + geovals_provider: + default_value: ncdiag + prompt: Database providing the geovals. + + diff --git a/src/swell/suites/ufo_testing/suites-ufo_testing.yaml b/src/swell/suites/ufo_testing/suites-ufo_testing.yaml new file mode 100644 index 00000000..a145c553 --- /dev/null +++ b/src/swell/suites/ufo_testing/suites-ufo_testing.yaml @@ -0,0 +1,61 @@ +# Cycle start point +start_cycle_point: + default_value: '2021-12-12T00:00:00Z' + prompt: What is the time of the first cycle (middle of the window)? + type: iso-datetime + +# Cycle final point +final_cycle_point: + default_value: '2021-12-12T00:00:00Z' + prompt: What is the time of the final cycle (middle of the window)? + type: iso-datetime + +# Run ahead limit for workflow +runahead_limit: + default_value: 'P4' + prompt: Since this suite is non-cycling choose how many hours the workflow can run ahead? + type: string + +# Jedi build system +jedi_build_method: + default_value: use_existing + prompt: Create a new JEDI build or use an existing build? + options: ['create', 'use_existing'] + type: string-drop-list + +# Existing JEDI bundle directory +existing_jedi_source_directory: + default_value: {{existing_jedi_source_directory}} + prompt: Provide the path to an existing JEDI bundle directory containing source code repos + type: string + depends: + key: jedi_build_method + value: use_existing + +# Existing JEDI build +existing_jedi_build_directory: + default_value: {{existing_jedi_build_directory}} + prompt: Provide the path to an existing JEDI build directory + type: string + depends: + key: jedi_build_method + value: use_existing + +# R2D2 Configuration +r2d2_local_path: + default_value: {{r2d2_local_path}} + prompt: Enter the path where R2D2 will store experiment output + type: string + +# Models to use +model_components: + default_value: ['geos_atmosphere'] + prompt: Select models to use (choose at least one) + options: use_method + type: file-check-list + +# Fixed options +fixed_options: + data_assimilation_run: + default_value: true + prompt: Does this workflow include data assimilation? diff --git a/src/swell/tasks/base/task_base.py b/src/swell/tasks/base/task_base.py index 676c9a7e..e1d1c039 100644 --- a/src/swell/tasks/base/task_base.py +++ b/src/swell/tasks/base/task_base.py @@ -14,9 +14,7 @@ import click import importlib import os -import sys import time -import yaml # swell imports from swell.tasks.base.task_registry import valid_tasks @@ -75,11 +73,12 @@ def __init__(self, config_input, datetime_input, model, task_name): # Create cycle and forecast directories # ------------------------------------- cycle_dir = None - forecast_dir = None + self.cycle_forecast_dir = None if datetime_input is not None: - forecast_dir = self.forecast_dir() - os.makedirs(forecast_dir, 0o755, exist_ok=True) + # Name of directory where cycle forecast files will be staged + self.cycle_forecast_dir = os.path.join(self.experiment_path(), 'run', + self.__datetime__.string_directory(), 'forecast') if model is not None: cycle_dir = self.cycle_dir() @@ -92,7 +91,7 @@ def __init__(self, config_input, datetime_input, model, task_name): # Add GEOS utils # -------------- - self.geos = Geos(self.logger, forecast_dir) + self.geos = Geos(self.logger, self.cycle_forecast_dir) # Create some extra helpers available when the datetime is present # ---------------------------------------------------------------- @@ -172,10 +171,13 @@ def cycle_dir(self): def forecast_dir(self, paths=[]): + # Make sure forecast directory exists + # ----------------------------------- + os.makedirs(self.cycle_forecast_dir, 0o755, exist_ok=True) + # Combine datetime string (directory format) with the model # ------------------------------------------------------ - forecast_dir = os.path.join(self.experiment_path(), 'run', - self.__datetime__.string_directory(), 'forecast') + forecast_dir = self.cycle_forecast_dir if len(paths) > 0: # If paths (which should be a list) is not empty, combine with forecast_dir diff --git a/src/swell/tasks/base/task_registry.py b/src/swell/tasks/base/task_registry.py index e26ccce5..ff5a6219 100644 --- a/src/swell/tasks/base/task_registry.py +++ b/src/swell/tasks/base/task_registry.py @@ -18,8 +18,14 @@ 'GenerateBClimatology', 'GetBackgroundGeosExperiment', 'GetBackground', - 'GetObservations', + 'GetGeosAdasBackground', 'GetGeosRestart', + 'GetGeovals', + 'GetGsiBc', + 'GetGsiNcdiag', + 'GetObservations', + 'GsiBcToIoda', + 'GsiNcdiagToIoda', 'LinkGeosOutput', 'MoveDaRestart', 'MoveForecastRestart', @@ -29,6 +35,7 @@ 'RemoveForecastDir', 'RunGeosExecutable', 'RunJediHofxExecutable', + 'RunJediUfoTestsExecutable', 'RunJediVariationalExecutable', 'SaveObsDiags', 'SaveRestart', diff --git a/src/swell/tasks/build_jedi.py b/src/swell/tasks/build_jedi.py index 472dd4a4..7a7ad40b 100644 --- a/src/swell/tasks/build_jedi.py +++ b/src/swell/tasks/build_jedi.py @@ -10,10 +10,10 @@ import os -from jedi_bundle.bin.jedi_bundle import execute_tasks +from jedi_bundle.bin.jedi_bundle import execute_tasks, get_bundles from swell.tasks.base.task_base import taskBase -from swell.utilities.build import set_jedi_bundle_config, get_bundles, build_and_source_dirs +from swell.utilities.build import set_jedi_bundle_config, build_and_source_dirs # -------------------------------------------------------------------------------------------------- diff --git a/src/swell/tasks/build_jedi_by_linking.py b/src/swell/tasks/build_jedi_by_linking.py index 02d77d23..cbd7bb9d 100644 --- a/src/swell/tasks/build_jedi_by_linking.py +++ b/src/swell/tasks/build_jedi_by_linking.py @@ -10,8 +10,6 @@ import os -from jedi_bundle.bin.jedi_bundle import execute_tasks - from swell.tasks.base.task_base import taskBase from swell.utilities.build import build_and_source_dirs, link_path diff --git a/src/swell/tasks/clean_cycle.py b/src/swell/tasks/clean_cycle.py index 5a0466ea..8fba3a84 100644 --- a/src/swell/tasks/clean_cycle.py +++ b/src/swell/tasks/clean_cycle.py @@ -27,24 +27,64 @@ class CleanCycle(taskBase): def execute(self): + # Parse config + clean_patterns = self.config.clean_patterns(None) + # If no cleaning requested then exit - if self.config.clean_patterns() is None: + if clean_patterns is None: return - if os.path.isdir(self.cycle_dir()): - os.chdir(self.cycle_dir()) - # Remove all specified files - for pattern in self.config.clean_patterns(): - if pattern == '*': - continue - path_parts = os.path.split(pattern) - if path_parts[1] == '*': - continue + # Move to the cycle directory + os.chdir(self.cycle_dir()) + + # Remove all specified files + for pattern in clean_patterns: + + # --------------------------- + # Perform some safety checks: + # --------------------------- + + # 1. Check that path is not absolute. Things can only be deleted relative to the cycle + # directory. + if os.path.isabs(pattern): + self.logger.abort(f'Absolute paths are forbidden. Offending entry: {pattern}') + + # 2. Check that the pattern does not begin with a / or ./ + if pattern[0] == '/' or pattern[0] == '.': + self.logger.abort(f'Patterns beginning with \'/\' or \'.\' are forbidden. ' + f'Offending entry: {pattern}') + + # 3. Check that the pattern is not a blanket removal of all files + if any(ele == '*' for ele in os.path.split(pattern)): + self.logger.abort(f'Deleting all files from any directory is forbidden. Offending ' + f'entry: {pattern}') + + # --------------------------- + # --------------------------- + + # Assemble list of files to remove + items_to_remove = glob.glob(pattern) + + # Loop over files and remove + for item_to_remove in items_to_remove: + + # Print info about what will be removed + self.logger.info(f'Removing item {item_to_remove}') + + # Only allow removing of empty directories + if os.path.isdir(item_to_remove): + + if len(os.listdir(item_to_remove)) == 0: + os.rmdir(item_to_remove) + else: + self.logger.info(f'Trying to remove directory {item_to_remove} but code ' + f'can only remove empty directories. Reorder removal ' + f'to empty directory first.') + else: - for file_to_delete in glob.glob(path_parts[1]): - os.remove(file_to_delete) - # Save cycle_done file to cycle directory - filename = 'cycle_done' - cmd = 'touch ' + os.path.join(self.cycle_dir(), filename) - os.system(cmd) + os.remove(item_to_remove) + + # Save cycle_done file to cycle_dir + with open(os.path.join(self.cycle_dir(), 'cycle_done'), 'w') as file: + file.write('cycle complete') diff --git a/src/swell/tasks/clone_geos.py b/src/swell/tasks/clone_geos.py index 79c5806f..36396022 100644 --- a/src/swell/tasks/clone_geos.py +++ b/src/swell/tasks/clone_geos.py @@ -9,8 +9,6 @@ import os -import tarfile -import urllib.request from swell.tasks.base.task_base import taskBase from swell.utilities.build import build_and_source_dirs, link_path diff --git a/src/swell/tasks/clone_jedi.py b/src/swell/tasks/clone_jedi.py index 77f1f41b..6f72d821 100644 --- a/src/swell/tasks/clone_jedi.py +++ b/src/swell/tasks/clone_jedi.py @@ -10,10 +10,10 @@ import os -from jedi_bundle.bin.jedi_bundle import execute_tasks +from jedi_bundle.bin.jedi_bundle import execute_tasks, get_bundles from swell.tasks.base.task_base import taskBase -from swell.utilities.build import set_jedi_bundle_config, get_bundles, build_and_source_dirs +from swell.utilities.build import set_jedi_bundle_config, build_and_source_dirs from swell.utilities.build import link_path diff --git a/src/swell/tasks/generate_b_climatology.py b/src/swell/tasks/generate_b_climatology.py index 786f7935..a18c94a9 100644 --- a/src/swell/tasks/generate_b_climatology.py +++ b/src/swell/tasks/generate_b_climatology.py @@ -153,7 +153,7 @@ def execute(self): # Compute number of processors # ---------------------------- - np = eval(model_component_meta['total_processors']) + self.np = eval(model_component_meta['total_processors']) # Obtain and initialize proper error model # ----------------------------------------------- diff --git a/src/swell/tasks/get_background.py b/src/swell/tasks/get_background.py index 7b47deac..a7196ee7 100644 --- a/src/swell/tasks/get_background.py +++ b/src/swell/tasks/get_background.py @@ -10,10 +10,8 @@ from swell.tasks.base.task_base import taskBase -from datetime import datetime as dt import isodate import os -import re from r2d2 import fetch diff --git a/src/swell/tasks/get_geos_adas_background.py b/src/swell/tasks/get_geos_adas_background.py new file mode 100644 index 00000000..3a7f6e6e --- /dev/null +++ b/src/swell/tasks/get_geos_adas_background.py @@ -0,0 +1,69 @@ +# (C) Copyright 2021- United States Government as represented by the Administrator of the +# National Aeronautics and Space Administration. All Rights Reserved. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. + + +# -------------------------------------------------------------------------------------------------- + + +import datetime +import glob +import os +import re + +from swell.tasks.base.task_base import taskBase + + +# -------------------------------------------------------------------------------------------------- + + +class GetGeosAdasBackground(taskBase): + + def execute(self): + + # Get the path and pattern for the background files + # ------------------------------------------------- + background_path = self.config.path_to_geos_adas_background() + + # Get list of ncdiags to test with + # -------------------------------- + background_path_files = glob.glob(background_path) + + # Assert that some files were found + # --------------------------------- + self.logger.assert_abort(len(background_path_files) != 0, f'No background ' + + f'files found in the source directory ' + + f'\'{background_path}\'') + + # Loop over all the files + # ----------------------- + for background_path_file in background_path_files: + + # Get filename from full path + background_file = os.path.basename(background_path_file) + + # Extract the datetime part from the string + datetime_part = re.search(r"\d{8}_\d{4}\w", background_file).group() + + # Get datetime for the file from the filename + background_file_datetime = datetime.datetime.strptime(datetime_part, '%Y%m%d_%H%Mz') + + # Create target filename using the datetime format + background_file_target = background_file_datetime.strftime('bkg.%Y%m%dT%H%M%SZ.nc4') + + # Target path and filename + background_path_file_target = os.path.join(self.cycle_dir(), background_file_target) + + # Remove target file if it exists (might be a link) + if os.path.exists(background_path_file_target): + os.remove(background_path_file_target) + + # Create symlink from target to source + self.logger.info(f'Creating sym link from {background_path_file} to ' + f'{background_path_file_target}') + os.symlink(background_path_file, background_path_file_target) + + +# -------------------------------------------------------------------------------------------------- diff --git a/src/swell/tasks/get_geos_restart.py b/src/swell/tasks/get_geos_restart.py index 1a0c4e3f..efa8be80 100644 --- a/src/swell/tasks/get_geos_restart.py +++ b/src/swell/tasks/get_geos_restart.py @@ -13,8 +13,6 @@ from swell.tasks.base.task_base import taskBase from swell.utilities.file_system_operations import copy_to_dst_dir -from datetime import datetime as dt - # -------------------------------------------------------------------------------------------------- diff --git a/src/swell/tasks/get_geovals.py b/src/swell/tasks/get_geovals.py new file mode 100644 index 00000000..e215852c --- /dev/null +++ b/src/swell/tasks/get_geovals.py @@ -0,0 +1,64 @@ +# (C) Copyright 2021- United States Government as represented by the Administrator of the +# National Aeronautics and Space Administration. All Rights Reserved. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. + + +# -------------------------------------------------------------------------------------------------- + + +import os + +from swell.tasks.base.task_base import taskBase +from r2d2 import fetch + + +# -------------------------------------------------------------------------------------------------- + +class GetGeovals(taskBase): + + def execute(self): + + # Parse config + # ------------ + geovals_experiment = self.config.geovals_experiment() + geovals_provider = self.config.geovals_provider() + window_offset = self.config.window_offset() + background_time_offset = self.config.background_time_offset() + observations = self.config.observations() + window_length = self.config.window_length() + crtm_coeff_dir = self.config.crtm_coeff_dir(None) + + # Get window begin time + window_begin = self.da_window_params.window_begin(window_offset) + background_time = self.da_window_params.background_time(window_offset, + background_time_offset) + + # Add to JEDI template rendering dictionary + self.jedi_rendering.add_key('background_time', background_time) + self.jedi_rendering.add_key('crtm_coeff_dir', crtm_coeff_dir) + self.jedi_rendering.add_key('window_begin', window_begin) + + # Loop over observation operators + # ------------------------------- + for observation in observations: + + # Fetch observation files + # ----------------------- + target_file = os.path.join(self.cycle_dir(), + f'{observation}_geovals.{window_begin}.nc4') + self.logger.info("Processing observation file "+target_file) + + fetch(date=window_begin, + target_file=target_file, + provider=geovals_provider, + obs_type=observation, + time_window=window_length, + type='ob', + experiment=geovals_experiment) + + # Change permission + os.chmod(target_file, 0o644) + + # ---------------------------------------------------------------------------------------------- diff --git a/src/swell/tasks/get_gsi_bc.py b/src/swell/tasks/get_gsi_bc.py new file mode 100644 index 00000000..a5b31ec6 --- /dev/null +++ b/src/swell/tasks/get_gsi_bc.py @@ -0,0 +1,79 @@ +# (C) Copyright 2021- United States Government as represented by the Administrator of the +# National Aeronautics and Space Administration. All Rights Reserved. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. + + +# -------------------------------------------------------------------------------------------------- + + +import glob +import os +import shutil +import tarfile + +from swell.tasks.base.task_base import taskBase + + +# -------------------------------------------------------------------------------------------------- + + +class GetGsiBc(taskBase): + + def execute(self): + + # Get the build method + # -------------------- + gsi_bc_location = self.config.path_to_gsi_bc_coefficients() + + # Holding directory + gsi_bc_dir = os.path.join(self.cycle_dir(), 'gsi_bcs') + os.makedirs(gsi_bc_dir, 0o755, exist_ok=True) + + # Get list of bias correction files to copy + # ----------------------------------------- + files_found = False + + if os.path.isdir(gsi_bc_location): + + # Get list of matching files in the directory + ana_satbias_rst = glob.glob(os.path.join(gsi_bc_location, '*.ana.satbias.*')) + ana_satbiaspc_rst = glob.glob(os.path.join(gsi_bc_location, '*.ana.satbiaspc.*')) + + # Record that files were found + if len(ana_satbias_rst) == 1 and len(ana_satbiaspc_rst) == 1: + files_found = True + + # Report if too many files were found + if len(ana_satbias_rst) > 1 or len(ana_satbiaspc_rst) > 1: + self.logger.abort(f'In GetGsiBc too many files were found in the directory.') + + # Copy files + shutil.copy(ana_satbias_rst[0], gsi_bc_dir) + shutil.copy(ana_satbiaspc_rst[0], gsi_bc_dir) + + elif tarfile.is_tarfile(gsi_bc_location): + + bc_tar = tarfile.open(gsi_bc_location) + found_satbias = False + found_satbiaspc = False + for bc_tar_file in bc_tar.getnames(): + if 'ana_satbias_rst' in bc_tar_file: + bc_tar.extract(bc_tar_file, gsi_bc_dir) + found_satbias = True + if 'ana_satbiaspc_rst' in bc_tar_file: + bc_tar.extract(bc_tar_file, gsi_bc_dir) + found_satbiaspc = True + bc_tar.close() + + # Record that files were found + if found_satbias and found_satbiaspc: + files_found = True + + self.logger.assert_abort(files_found, f'When passing \'gsi_bc_location\' it should point ' + f'to either a tar file or directory containing *ana_satbias_rst* ' + f'and *ana_satbiaspc_rst*. gsi_bc_location = {gsi_bc_location}.') + + +# -------------------------------------------------------------------------------------------------- diff --git a/src/swell/tasks/get_gsi_ncdiag.py b/src/swell/tasks/get_gsi_ncdiag.py new file mode 100644 index 00000000..0cdeb19e --- /dev/null +++ b/src/swell/tasks/get_gsi_ncdiag.py @@ -0,0 +1,77 @@ +# (C) Copyright 2021- United States Government as represented by the Administrator of the +# National Aeronautics and Space Administration. All Rights Reserved. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. + + +# -------------------------------------------------------------------------------------------------- + + +import glob +import os + +from swell.tasks.base.task_base import taskBase + + +# -------------------------------------------------------------------------------------------------- + + +class GetGsiNcdiag(taskBase): + + def execute(self): + + # Get the build method + # -------------------- + gsi_diag_path = self.config.path_to_gsi_nc_diags() + + # Get list of ncdiags to test with + # -------------------------------- + gsi_diag_path_files_pattern = os.path.join(gsi_diag_path, '*ges*.nc*') + gsi_diag_path_files = glob.glob(gsi_diag_path_files_pattern) + + # Get cycle dir and create if needed + # ---------------------------------- + gsi_diag_dir = os.path.join(self.cycle_dir(), 'gsi_ncdiags') + os.makedirs(gsi_diag_dir, 0o755, exist_ok=True) + + # Assert that some files were found + self.logger.assert_abort(len(gsi_diag_path_files) != 0 is not None, f'No ncdiag ' + + f'files found in the source directory ' + + f'\'{gsi_diag_path_files_pattern}\'') + + # Copy all the files into the cycle directory + # ------------------------------------------- + for gsi_diag_path_file in gsi_diag_path_files: + + # Source file + gsi_diag_file_source = os.path.basename(gsi_diag_path_file) + + # Target file + gsi_diag_file_target = os.path.join(gsi_diag_dir, gsi_diag_file_source) + + # Remove target file if it exists (might be a link) + if os.path.exists(gsi_diag_file_target): + os.remove(gsi_diag_file_target) + + # Create symlink from target to source + self.logger.info(f'Creating sym link from {gsi_diag_path_file} to ' + f'{gsi_diag_file_target}') + os.symlink(gsi_diag_path_file, gsi_diag_file_target) + + # Create another directory to hold the aircraft data + # -------------------------------------------------- + prof_files = glob.glob(os.path.join(gsi_diag_dir, '*prof*.nc4')) + + for prof_file in prof_files: + os.makedirs(os.path.join(gsi_diag_dir, 'aircraft'), 0o755, exist_ok=True) + + # Replace _prof with nothing + file_name = os.path.basename(prof_file) + file_name = file_name.replace('_prof', '') + + # Move the file into the prof directory + os.rename(prof_file, os.path.join(gsi_diag_dir, 'aircraft', file_name)) + + +# -------------------------------------------------------------------------------------------------- diff --git a/src/swell/tasks/gsi_bc_to_ioda.py b/src/swell/tasks/gsi_bc_to_ioda.py new file mode 100644 index 00000000..d0ad95a6 --- /dev/null +++ b/src/swell/tasks/gsi_bc_to_ioda.py @@ -0,0 +1,149 @@ +# (C) Copyright 2021- United States Government as represented by the Administrator of the +# National Aeronautics and Space Administration. All Rights Reserved. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. + + +# -------------------------------------------------------------------------------------------------- + + +import glob +import os + +from swell.tasks.base.task_base import taskBase +from swell.utilities.dictionary import write_dict_to_yaml +from swell.utilities.shell_commands import run_track_log_subprocess + + +# -------------------------------------------------------------------------------------------------- + + +class GsiBcToIoda(taskBase): + + def execute(self): + + # Parse configuration + # ------------------- + observations = self.config.observations() + window_offset = self.config.window_offset() + background_time_offset = self.config.background_time_offset() + crtm_coeff_dir = self.config.crtm_coeff_dir(None) + + # Get window beginning time + window_begin = self.da_window_params.window_begin(window_offset) + background_time = self.da_window_params.background_time(window_offset, + background_time_offset) + + # Prepare dictionary for rendering jedi interface files + self.jedi_rendering.add_key('background_time', background_time) + self.jedi_rendering.add_key('crtm_coeff_dir', crtm_coeff_dir) + self.jedi_rendering.add_key('window_begin', window_begin) + + # Assemble list of needed sensors + # ------------------------------- + sensors = [] + sensors_satbias = [] + sensors_tlapse = [] + for observation in observations: + # Open configuration file for observation + observation_dict = self.jedi_rendering.render_interface_observations(observation) + + # Check for sensor key + try: + sensor = observation_dict['obs operator']['obs options']['Sensor_ID'] + except Exception: + continue + + sensors.append(sensor) + sensors_satbias.append(f'{sensor}.{background_time}.satbias.nc4') + sensors_tlapse.append(f'{sensor}.{background_time}.tlapse.txt') + + # If there are no sensors then there is nothing to do + if not sensors: + self.logger.info('In GsiBcToIoda no radiance observations were found so nothing to do.') + return + + # Holding directory + gsi_bc_dir = os.path.join(self.cycle_dir(), 'gsi_bcs') + + # Get list of files from holding directory + bc_files = glob.glob(os.path.join(gsi_bc_dir, '*.txt')) + + # Create dictionary that will be passed to converter + satbias_converter_dict = {} + + # Add the files + for bc_file in bc_files: + if '.ana.satbias.' in bc_file: + satbias_converter_dict['input coeff file'] = bc_file + if '.ana.satbiaspc.' in bc_file: + satbias_converter_dict['input err file'] = bc_file + + # Add the default predictors + default_predictors = [] + default_predictors.append('constant') + default_predictors.append('zenith_angle') + default_predictors.append('cloud_liquid_water') + default_predictors.append('lapse_rate_order_2') + default_predictors.append('lapse_rate') + default_predictors.append('cosine_of_latitude_times_orbit_node') + default_predictors.append('sine_of_latitude') + default_predictors.append('emissivity') + default_predictors.append('scan_angle_order_4') + default_predictors.append('scan_angle_order_3') + default_predictors.append('scan_angle_order_2') + default_predictors.append('scan_angle') + + gmi_gpm_predictors = [] + gmi_gpm_predictors.append('constant') + gmi_gpm_predictors.append('zenith_angle') + gmi_gpm_predictors.append('cosine_of_latitude_times_orbit_node') + gmi_gpm_predictors.append('lapse_rate_order_2') + gmi_gpm_predictors.append('lapse_rate') + gmi_gpm_predictors.append('cloud_liquid_water_order_2') + gmi_gpm_predictors.append('cloud_liquid_water') + gmi_gpm_predictors.append('emissivity') + gmi_gpm_predictors.append('scan_angle_order_4') + gmi_gpm_predictors.append('scan_angle_order_3') + gmi_gpm_predictors.append('scan_angle_order_2') + gmi_gpm_predictors.append('scan_angle') + + satbias_converter_dict['default predictors'] = default_predictors + + satbias_converter_dict_output = [] + for sensor, sensor_satbias in zip(sensors, sensors_satbias): + output_dict = {} + output_dict['sensor'] = sensor + output_dict['output file'] = os.path.join(self.cycle_dir(), sensor_satbias) + if sensor == 'gmi_gpm': + output_dict['predictors'] = gmi_gpm_predictors + else: + output_dict['predictors'] = default_predictors + satbias_converter_dict_output.append(output_dict) + + satbias_converter_dict['output'] = satbias_converter_dict_output + + # Write to YAML file + satbias_converter_yaml = os.path.join(gsi_bc_dir, 'satbias.yaml') + write_dict_to_yaml(satbias_converter_dict, satbias_converter_yaml) + + # Run IODA satbias converter + satbias_converter_exe = os.path.join(self.experiment_path(), 'jedi_bundle', 'build', 'bin', + 'satbias2ioda.x') + + run_track_log_subprocess(self.logger, [satbias_converter_exe, satbias_converter_yaml]) + + # Run tlapse converter (just a grep) + for sensor, sensor_tlapse in zip(sensors, sensors_tlapse): + sensor_tlapse_file = '' + with open(satbias_converter_dict['input coeff file'], 'r') as f: + for line in f.readlines(): + if sensor in line: + sensor_tlapse_file = sensor_tlapse_file + ' '.join(line.split()[1:4]) + '\n' + # Write to tlapse file + with open(os.path.join(self.cycle_dir(), sensor_tlapse), 'w') as file_open: + file_open.write(sensor_tlapse_file) + + +# -------------------------------------------------------------------------------------------------- diff --git a/src/swell/tasks/gsi_ncdiag_to_ioda.py b/src/swell/tasks/gsi_ncdiag_to_ioda.py new file mode 100644 index 00000000..78ff7180 --- /dev/null +++ b/src/swell/tasks/gsi_ncdiag_to_ioda.py @@ -0,0 +1,348 @@ +# (C) Copyright 2021- United States Government as represented by the Administrator of the +# National Aeronautics and Space Administration. All Rights Reserved. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. + + +# -------------------------------------------------------------------------------------------------- + + +import copy +import datetime +import glob +import os + +# Ioda converters +import gsi_ncdiag.gsi_ncdiag as gsid +from gsi_ncdiag.combine_obsspace import combine_obsspace + +from swell.tasks.base.task_base import taskBase +from swell.utilities.shell_commands import run_track_log_subprocess +from swell.utilities.datetime import datetime_formats + +# -------------------------------------------------------------------------------------------------- + + +class GsiNcdiagToIoda(taskBase): + + def execute(self): + + # Parse configuration + # ------------------- + observations = self.config.observations() + produce_geovals = self.config.produce_geovals() + window_offset = self.config.window_offset() + + # Get window beginning time + window_begin = self.da_window_params.window_begin(window_offset) + + # Keep copy of the + observations_orig = observations.copy() + + # Directory containing the ncdiags + gsi_diag_dir = os.path.join(self.cycle_dir(), 'gsi_ncdiags') + + # Assemble all conventional types that ioda considers + # --------------------------------------------------- + gsi_to_ioda_dict = copy.copy(gsid.conv_platforms) + + # Remove aircraft from the lists and add new dictionaries for aircraft + # -------------------------------------------------------------------- + aircraft_is_in_prof_files = True + + if aircraft_is_in_prof_files: + for key, value in gsi_to_ioda_dict.items(): + gsi_to_ioda_dict[key] = [x for x in value if x not in ['aircraft']] + + if 'aircraft' in observations: + gsi_to_ioda_dict['conv_prof_t'] = ['aircraft'] + gsi_to_ioda_dict['conv_prof_uv'] = ['aircraft'] + + ioda_types = [] + for key in gsi_to_ioda_dict: + ioda_types += gsi_to_ioda_dict[key] + + # Remove duplicates + ioda_types = list(set(ioda_types)) + + # Invert the dictionary so for each ioda type we know the gsi files that provide data + ioda_to_gsi_dict = {} + for ioda_type in ioda_types: + ioda_to_gsi_dict[ioda_type] = [] + for key in gsi_to_ioda_dict: + if ioda_type in gsi_to_ioda_dict[key]: + ioda_to_gsi_dict[ioda_type].append(key) + + # Get all the elements that are in both observations and ioda_types + needed_ioda_types = [elem for elem in observations if elem in ioda_types] + + # Determine which gsi files need to be processed + gsi_types_to_process = [] + for needed_ioda_type in needed_ioda_types: + gsi_types_to_process += ioda_to_gsi_dict[needed_ioda_type] + gsi_types_to_process = list(set(gsi_types_to_process)) # Unique values only + gsi_types_to_process = sorted(gsi_types_to_process) + + # Remove conv_platforms_to_process from the total observations list, leaving rad and ozn + for needed_ioda_type in needed_ioda_types: + observations.remove(needed_ioda_type) + + # Convert cycle time datetime object to string with format yyyymmdd_hhz + gsi_datetime_str = datetime.datetime.strftime(self.cycle_time_dto(), + datetime_formats['gsi_nc_diag_format']) + + # First process the conventional data (if needed) + # ----------------------------------------------- + for gsi_type_to_process in gsi_types_to_process: + + log_str = f'Processing GSI file {gsi_type_to_process}' + self.logger.info('', wrap=False) + self.logger.info(log_str) + self.logger.info('-'*len(log_str)) + + # If prof in the name then it is aircraft data. Adjust path and rename + if 'prof' in gsi_type_to_process: + gsi_type_to_process_actual = gsi_type_to_process.replace('_prof', '') + extra_path = 'aircraft' + else: + gsi_type_to_process_actual = gsi_type_to_process + extra_path = '' + + # Path to search to GSI ncdiag files + path_to_search = os.path.join(gsi_diag_dir, extra_path, + f'*{gsi_type_to_process_actual}_*{gsi_datetime_str}*') + + # Get the list of files + gsi_conv_file = glob.glob(path_to_search) + + # Check that some files where found + self.logger.assert_abort(len(gsi_conv_file) != 0, 'The search for GSI ncdiags files ' + + f'returned no files. Search path: \'{path_to_search}\'') + + # Check that only one file was found + self.logger.assert_abort(len(gsi_conv_file) == 1, 'The search for GSI ncdiags files ' + + f'returned more than one file. Files: \'{gsi_conv_file}\'') + + # Open the file + Diag = gsid.Conv(gsi_conv_file[0]) + Diag.read() + + # Assemble list of needed platforms + needed_platforms = [] + for platform in gsid.conv_platforms[gsi_type_to_process_actual]: + if platform in needed_ioda_types: + needed_platforms.append(platform) + + # Extract data + Diag.toIODAobs(self.cycle_dir(), platforms=needed_platforms) + + if produce_geovals: + self.logger.info('', wrap=False) + self.logger.info(f'Processing GeoVaLs from {gsi_type_to_process_actual}') + Diag.toGeovals(self.cycle_dir()) + + Diag.close() + + # Rename gps files from gps_bend if they exist + if 'gps' in observations_orig: + gps_files = glob.glob(os.path.join(self.cycle_dir(), 'gps_bend*')) + for gps_file in gps_files: + gps_file_newname = os.path.basename(gps_file).replace('gps_bend', 'gps') + os.rename(gps_file, os.path.join(self.cycle_dir(), gps_file_newname)) + + # Combine the conventional data + # ----------------------------- + for needed_ioda_type in needed_ioda_types: + + # Logging + log_str = f'Combining IODA files for {needed_ioda_type}' + self.logger.info('', wrap=False) + self.logger.info(log_str) + self.logger.info('-'*len(log_str)) + + # Check the number of files that are found + ioda_type_pattern = f'{needed_ioda_type}*_obs_*' # Pattern, e.g.: *aircraft*_obs_* + + # List of files for that instrument + ioda_path_files = glob.glob(os.path.join(self.cycle_dir(), ioda_type_pattern)) + + # For sfc make sure there are no surface ship files + if needed_ioda_type == 'sfc': + ioda_path_files = [x for x in ioda_path_files if 'sfcship' not in x] + + # Show files that will be combined + self.logger.info(f'Files to combine:') + for ioda_path_file in ioda_path_files: + self.logger.info(f' - {os.path.basename(ioda_path_file)}') + + # Check that there are some files to combine + self.logger.assert_abort(len(ioda_path_files) > 0, f'In combine of ' + + f'{needed_ioda_type} no files where found. Ensure that ' + + f'the converter worked as expected.') + + # Get last file (first could be type_obs_ if the code already ran) + ioda_file_0 = os.path.basename(ioda_path_files[-1]) + + # Split by underscore + ioda_file_0_ = ioda_file_0.split('_') + + # Logic fails for gps so skip + if needed_ioda_type == 'gps': + ioda_file_0_ = ['gps', 'is', 'skipped'] + + # Only combine if the split name has 4 elements + if len(ioda_file_0_) == 4: + + # If we are here there should be more than one file associated with the ioda type. + # i.e. files with *_uv_*, *_tsen_* for aircraft. + if len(ioda_path_files) == 1: + self.logger.abort(f'Combine issue for {needed_ioda_type}, not multiple files.') + + # Create new file name + new_name_split = ioda_file_0_ + del new_name_split[1] + new_name = os.path.join(self.cycle_dir(), '_'.join(new_name_split)) + + # Check if new file already exists and remove if so + if os.path.exists(new_name): + os.remove(new_name) + if new_name in ioda_path_files: + ioda_path_files.remove(new_name) + + # Run the combine step + geo_dir = None + if produce_geovals: + geo_dir = self.cycle_dir() + + # Remove wind_reduction_factor_at_10m from non-uv geoval files + geoval_files = glob.glob(os.path.join(self.cycle_dir(), + f'{needed_ioda_type}_*_geoval_*.nc4')) + for geoval_file in geoval_files: + if f'{needed_ioda_type}_uv_geoval_' not in geoval_file: + var_remove_command = ['ncks', '-O', '-x', '-v', + 'wind_reduction_factor_at_10m', + geoval_file, geoval_file] + run_track_log_subprocess(self.logger, var_remove_command) + + combine_obsspace(ioda_path_files, new_name, geo_dir) + + # Remove input files + for ioda_path_file in ioda_path_files: + os.remove(ioda_path_file) + + elif len(ioda_file_0_) == 3: + self.logger.info(f'Skipping combine for {needed_ioda_type}, single file already.') + + else: + self.logger.abort(f'Combine failed for {needed_ioda_type}, file name issue.') + + # Get list of the observations that are ozone observations + # -------------------------------------------------------- + ozone_sensors = gsid.oz_lay_sensors + gsid.oz_lev_sensors + ozone_observations = [] + for observation in observations: + for ozone_sensor in ozone_sensors: + if ozone_sensor in observation: + ozone_observations.append(observation) + + # Transform radiances and ozone + # ----------------------------- + for observation in observations: + + self.logger.info(f'Converting {observation} to IODA format') + + observation_search_name = copy.copy(observation) + + # For avhrr replace the search with just avhrr + if 'avhrr3' in observation_search_name: + observation_search_name = observation_search_name.replace('avhrr3', 'avhrr') + + gsi_obs_file = glob.glob(os.path.join(gsi_diag_dir, f'*{observation_search_name}*')) + + # Skip this observation if not files were found + if len(gsi_obs_file) == 0: + self.logger.info(f'No observation files found for {observation}. Skipping convert') + continue + + if observation not in ozone_observations: + + # Radiances + Diag = gsid.Radiances(gsi_obs_file[0]) + Diag.read() + Diag.toIODAobs(self.cycle_dir(), False, False, False) + + else: + + # Ozone + Diag = gsid.Ozone(gsi_obs_file[0]) + Diag.read() + Diag.toIODAobs(self.cycle_dir()) + + # GeoVaLs call + if produce_geovals: + Diag.toGeovals(self.cycle_dir()) + + if observation not in ozone_observations: + Diag.close() + + # Rename avhrr files + # ------------------ + # Rename gps files from gps_bend if they exist + if any('avhrr3' in item for item in observations): + avhrr_files = glob.glob(os.path.join(self.cycle_dir(), 'avhrr*')) + for avhrr_file in avhrr_files: + avhrr_file_newname = os.path.basename(avhrr_file).replace('avhrr', 'avhrr3') + os.rename(avhrr_file, os.path.join(self.cycle_dir(), avhrr_file_newname)) + + # Rename files to be swell compliant + # ---------------------------------- + for observation in observations_orig: + + self.logger.info(f'Renaming \'{observation}\' to be swell compliant') + + # Change to gps_bend + search_name = observation + + # Input filename + ioda_obs_in_pattern = f'{search_name}_obs_*nc*' + + ioda_obs_in_found = glob.glob(os.path.join(self.cycle_dir(), ioda_obs_in_pattern)) + + # If nothing found then skipt this observation + if len(ioda_obs_in_found) == 0: + self.logger.info(f'No observation files found for {observation}. Skipping rename') + continue + + ioda_obs_in = ioda_obs_in_found[0] + + ioda_obs_out = f'{search_name}.{window_begin}.nc4' + + os.rename(ioda_obs_in, os.path.join(self.cycle_dir(), ioda_obs_out)) + + # Rename GeoVaLs file if need be + if produce_geovals: + ioda_geoval_in_pattern = f'{search_name}_geoval_*.nc*' + ioda_geoval_in = glob.glob(os.path.join(self.cycle_dir(), + ioda_geoval_in_pattern))[0] + + ioda_geoval_out = f'{search_name}_geovals.{window_begin}.nc4' + + os.rename(ioda_geoval_in, os.path.join(self.cycle_dir(), ioda_geoval_out)) + + # Remove left over files + # ------------------------------ + + self.logger.info('Removing residual files...') + + patterns = [ + '*_geoval_*', + ] + + for pattern in patterns: + geoval_files = glob.glob(os.path.join(self.cycle_dir(), pattern)) + for geoval_file in geoval_files: + self.logger.info(f' - Removing {os.path.basename(geoval_file)}') + os.remove(geoval_file) + +# -------------------------------------------------------------------------------------------------- diff --git a/src/swell/tasks/link_geos_output.py b/src/swell/tasks/link_geos_output.py index 962e1135..6718dd23 100644 --- a/src/swell/tasks/link_geos_output.py +++ b/src/swell/tasks/link_geos_output.py @@ -7,11 +7,9 @@ # -------------------------------------------------------------------------------------------------- -from datetime import datetime as dt import os from swell.tasks.base.task_base import taskBase -from swell.utilities.datetime import datetime_formats # -------------------------------------------------------------------------------------------------- diff --git a/src/swell/tasks/move_da_restart.py b/src/swell/tasks/move_da_restart.py index da0619f3..0b4e3057 100644 --- a/src/swell/tasks/move_da_restart.py +++ b/src/swell/tasks/move_da_restart.py @@ -1,4 +1,4 @@ -# (C) Copyright 2023 United States Government as represented by the Administrator of the +# (C) Copyright 2021- United States Government as represented by the Administrator of the # National Aeronautics and Space Administration. All Rights Reserved. # # This software is licensed under the terms of the Apache Licence Version 2.0 @@ -12,7 +12,6 @@ from swell.tasks.base.task_base import taskBase from swell.utilities.file_system_operations import move_files -from datetime import datetime as dt # -------------------------------------------------------------------------------------------------- diff --git a/src/swell/tasks/move_forecast_restart.py b/src/swell/tasks/move_forecast_restart.py index ab975afd..d1e99ba7 100644 --- a/src/swell/tasks/move_forecast_restart.py +++ b/src/swell/tasks/move_forecast_restart.py @@ -1,4 +1,4 @@ -# (C) Copyright 2023 United States Government as represented by the Administrator of the +# (C) Copyright 2021- United States Government as represented by the Administrator of the # National Aeronautics and Space Administration. All Rights Reserved. # # This software is licensed under the terms of the Apache Licence Version 2.0 @@ -12,7 +12,6 @@ from swell.tasks.base.task_base import taskBase from swell.utilities.file_system_operations import move_files -from datetime import datetime as dt # -------------------------------------------------------------------------------------------------- diff --git a/src/swell/tasks/prep_geos_run_dir.py b/src/swell/tasks/prep_geos_run_dir.py index 810e53b4..606411d2 100644 --- a/src/swell/tasks/prep_geos_run_dir.py +++ b/src/swell/tasks/prep_geos_run_dir.py @@ -12,7 +12,6 @@ import yaml from datetime import datetime as dt -import isodate from swell.tasks.base.task_base import taskBase from swell.utilities.file_system_operations import copy_to_dst_dir @@ -300,12 +299,12 @@ def get_bcs(self): self.logger.info(' OBTAINING EXTRA WOA13 files') rst_path = self.config.geos_restarts_directory() - src = os.path.join(self.swell_static_files, 'geos', 'restarts', self.rst_path, + src = os.path.join(self.swell_static_files, 'geos', 'restarts', rst_path, 'woa13_ptemp_monthly.nc') copy_to_dst_dir(self.logger, src, self.forecast_dir(['INPUT', 'woa13_ptemp_monthly.nc'])) - src = os.path.join(self.swell_static_files, 'geos', 'restarts', self.rst_path, + src = os.path.join(self.swell_static_files, 'geos', 'restarts', rst_path, 'woa13_s_monthly.nc') copy_to_dst_dir(self.logger, src, self.forecast_dir(['INPUT', 'woa13_s_monthly.nc'])) @@ -367,9 +366,7 @@ def link_replay(self): # --------------------------------------------------------- if self.agcm_dict['REPLAY_MODE'] == 'Exact' or self.agcm_dict['REPLAY_MODE'] == 'Regular': - ANA_EXPID = self.agcm_dict['REPLAY_ANA_EXPID'] ANA_LOCATION = self.agcm_dict['REPLAY_ANA_LOCATION'] - REPLAY_FILE = self.agcm_dict['REPLAY_FILE'] rply_dict = { os.path.join(ANA_LOCATION, 'aod'): '', diff --git a/src/swell/tasks/prepare_analysis.py b/src/swell/tasks/prepare_analysis.py index 8fe4d080..48d8aa2e 100644 --- a/src/swell/tasks/prepare_analysis.py +++ b/src/swell/tasks/prepare_analysis.py @@ -1,4 +1,4 @@ -# (C) Copyright 2023- United States Government as represented by the Administrator of the +# (C) Copyright 2021- United States Government as represented by the Administrator of the # National Aeronautics and Space Administration. All Rights Reserved. # # This software is licensed under the terms of the Apache Licence Version 2.0 @@ -7,14 +7,12 @@ # -------------------------------------------------------------------------------------------------- -from datetime import datetime as dt import glob import netCDF4 as nc import os import shutil from swell.tasks.base.task_base import taskBase -from swell.utilities.datetime import datetime_formats # -------------------------------------------------------------------------------------------------- @@ -41,7 +39,6 @@ def execute(self): # -------------------------------- self.current_cycle = os.path.basename(self.forecast_dir()) self.cc_dto = self.cycle_time_dto() - ana_path = self.at_cycledir(['ocn.*' + self.cc_dto.strftime('.an.%Y-%m-%dT%H:%M:%SZ.nc')]) # GEOS restarts have seconds in their filename # -------------------------------------------- diff --git a/src/swell/tasks/run_geos_executable.py b/src/swell/tasks/run_geos_executable.py index aed9e4dc..36dd4bd2 100644 --- a/src/swell/tasks/run_geos_executable.py +++ b/src/swell/tasks/run_geos_executable.py @@ -10,7 +10,7 @@ import os from swell.tasks.base.task_base import taskBase -from swell.utilities.shell_commands import run_subprocess, run_track_log_subprocess +from swell.utilities.shell_commands import run_track_log_subprocess # -------------------------------------------------------------------------------------------------- diff --git a/src/swell/tasks/run_jedi_hofx_executable.py b/src/swell/tasks/run_jedi_hofx_executable.py index 354f12f8..9c3684b3 100644 --- a/src/swell/tasks/run_jedi_hofx_executable.py +++ b/src/swell/tasks/run_jedi_hofx_executable.py @@ -35,6 +35,7 @@ def execute(self): background_time_offset = self.config.background_time_offset() observations = self.config.observations() jedi_forecast_model = self.config.jedi_forecast_model(None) + generate_yaml_and_exit = self.config.generate_yaml_and_exit(False) # Compute data assimilation window parameters background_time = self.da_window_params.background_time(window_offset, @@ -109,8 +110,11 @@ def execute(self): # Run the JEDI executable # ----------------------- - run_executable(self.logger, self.cycle_dir(), np, jedi_executable_path, jedi_config_file, - output_log_file) - self.logger.info('Running '+jedi_executable_path+' with '+str(np)+' processors.') + if not generate_yaml_and_exit: + self.logger.info('Running '+jedi_executable_path+' with '+str(np)+' processors.') + run_executable(self.logger, self.cycle_dir(), np, jedi_executable_path, + jedi_config_file, output_log_file) + else: + self.logger.info('YAML generated, now exiting.') # -------------------------------------------------------------------------------------------------- diff --git a/src/swell/tasks/run_jedi_ufo_tests_executable.py b/src/swell/tasks/run_jedi_ufo_tests_executable.py new file mode 100644 index 00000000..665bdc4c --- /dev/null +++ b/src/swell/tasks/run_jedi_ufo_tests_executable.py @@ -0,0 +1,160 @@ +# (C) Copyright 2021- United States Government as represented by the Administrator of the +# National Aeronautics and Space Administration. All Rights Reserved. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. + + +# -------------------------------------------------------------------------------------------------- + + +import copy +import os +import yaml + +from swell.tasks.base.task_base import taskBase +from swell.utilities.dictionary import update_dict +from swell.utilities.run_jedi_executables import jedi_dictionary_iterator, run_executable + + +# -------------------------------------------------------------------------------------------------- + + +class RunJediUfoTestsExecutable(taskBase): + + # ---------------------------------------------------------------------------------------------- + + def execute(self): + + # Jedi application name + # --------------------- + jedi_application = 'ufo_tests' + + # Parse configuration + # ------------------- + window_offset = self.config.window_offset() + window_length = self.config.window_length() + bkg_time_offset = self.config.background_time_offset() + observations = self.config.observations() + generate_yaml_and_exit = self.config.generate_yaml_and_exit(False) + + # Compute data assimilation window parameters + window_begin = self.da_window_params.window_begin(window_offset) + window_begin_iso = self.da_window_params.window_begin_iso(window_offset) + window_end_iso = self.da_window_params.window_end_iso(window_offset, window_length) + + # Populate jedi interface templates dictionary + # -------------------------------------------- + background_time = self.da_window_params.background_time(window_offset, bkg_time_offset) + self.jedi_rendering.add_key('window_begin_iso', window_begin_iso) + self.jedi_rendering.add_key('window_end_iso', window_end_iso) + + # Observations + self.jedi_rendering.add_key('background_time', background_time) + self.jedi_rendering.add_key('crtm_coeff_dir', self.config.crtm_coeff_dir(None)) + self.jedi_rendering.add_key('window_begin', window_begin) + + # Open the JEDI config file and fill initial templates + # ---------------------------------------------------- + jedi_config_dict = self.jedi_rendering.render_oops_file(f'{jedi_application}') + + # Perform complete template rendering + # ----------------------------------- + jedi_dictionary_iterator(jedi_config_dict, self.jedi_rendering, '3D', observations) + + # Make modifications needed for testing + # ------------------------------------- + conventional_types = ['aircraft'] + + # Open the ufo_tests config file + # ------------------------------ + ufo_tests_dict = self.jedi_rendering.render_interface_observations(f'ufo_tests') + ufo_tests_default = ufo_tests_dict['default'] + + # Insert the GeoVaLs section + # -------------------------- + + # Loop over the observations + for index in range(len(observations)): + + # Remove GetValues if present + if 'get values' in jedi_config_dict['observations'][index]: + del jedi_config_dict['observations'][index]['get values'] + + # GeoVaLs filename + geo_va_ls_fname = os.path.join(self.cycle_dir(), + f'{observations[index]}_geovals.{window_begin}.nc4') + + # Create GeoVaLs dictionary + geo_va_ls_dict = {} + geo_va_ls_dict['filename'] = geo_va_ls_fname + + # For conventional add the GeoVaLs flip + if observations[index] in conventional_types: + geo_va_ls_dict['levels_are_top_down'] = False + + jedi_config_dict['observations'][index]['geovals'] = geo_va_ls_dict + + # Copies for each kind of test + # ---------------------------- + jedi_operator_dict = copy.deepcopy(jedi_config_dict) + jedi_filter_dict = copy.deepcopy(jedi_config_dict) + + # Loop through observations and moderate based on test needs + # ---------------------------------------------------------- + for index in range(len(observations)): + + # Overwrite the defaults with the values in ufo_tests_obs + ufo_tests_obs = ufo_tests_dict[observations[index]] + ufo_tests_obs = update_dict(ufo_tests_default, ufo_tests_obs) + + # Merge the ufo_tests_obs dictionary with the observation dictionary + jedi_operator_dict['observations'][index].update(ufo_tests_obs['operator_test']) + jedi_filter_dict['observations'][index].update(ufo_tests_obs['filter_test']) + + # Remove filters from operator test + if 'obs filters' in jedi_operator_dict['observations'][index]: + del jedi_operator_dict['observations'][index]['obs filters'] + + # Write configuration files for the tests + # --------------------------------------- + file = os.path.join(self.cycle_dir(), 'jedi_test_ObsOperator_config.yaml') + with open(file, 'w') as jedi_config_file_open: + yaml.dump(jedi_operator_dict, jedi_config_file_open, default_flow_style=False) + + file = os.path.join(self.cycle_dir(), 'jedi_test_ObsOperatorTLAD_config.yaml') + with open(file, 'w') as jedi_config_file_open: + yaml.dump(jedi_operator_dict, jedi_config_file_open, default_flow_style=False) + + file = os.path.join(self.cycle_dir(), 'jedi_test_ObsFilters_config.yaml') + with open(file, 'w') as jedi_config_file_open: + yaml.dump(jedi_filter_dict, jedi_config_file_open, default_flow_style=False) + + # Tests to run + # ------------ + # tests = ['test_ObsOperator', 'test_ObsOperatorTLAD', 'test_ObsFilters'] + tests = ['test_ObsFilters'] + + # Loop over the tests + # ------------------- + for test in tests: + + # Output log file + # --------------- + jedi_config_file = os.path.join(self.cycle_dir(), f'jedi_{test}_config.yaml') + output_log_file = os.path.join(self.cycle_dir(), f'jedi_{test}_log.log') + + # Jedi executable name + # -------------------- + jedi_executable_path = os.path.join(self.experiment_path(), 'jedi_bundle', 'build', + 'bin', f'{test}.x') + + # Run the Test Obs Filters executable + # ----------------------------------- + if not generate_yaml_and_exit: + run_executable(self.logger, self.cycle_dir(), 1, jedi_executable_path, + jedi_config_file, output_log_file) + else: + self.logger.info('YAML generated, now exiting.') + +# -------------------------------------------------------------------------------------------------- diff --git a/src/swell/tasks/run_jedi_variational_executable.py b/src/swell/tasks/run_jedi_variational_executable.py index 7936d49d..0b9e6727 100644 --- a/src/swell/tasks/run_jedi_variational_executable.py +++ b/src/swell/tasks/run_jedi_variational_executable.py @@ -36,6 +36,10 @@ def execute(self): number_of_iterations = self.config.number_of_iterations() observations = self.config.observations() jedi_forecast_model = self.config.jedi_forecast_model(None) + generate_yaml_and_exit = self.config.generate_yaml_and_exit(False) + + npx_proc = self.config.npx_proc(None) + npy_proc = self.config.npy_proc(None) # Compute data assimilation window parameters background_time = self.da_window_params.background_time(window_offset, @@ -64,8 +68,8 @@ def execute(self): # Geometry self.jedi_rendering.add_key('vertical_resolution', self.config.vertical_resolution()) - self.jedi_rendering.add_key('npx_proc', self.config.npx_proc(None)) - self.jedi_rendering.add_key('npy_proc', self.config.npy_proc(None)) + self.jedi_rendering.add_key('npx_proc', npx_proc) + self.jedi_rendering.add_key('npy_proc', npy_proc) self.jedi_rendering.add_key('total_processors', self.config.total_processors(None)) # Observations @@ -73,6 +77,11 @@ def execute(self): self.jedi_rendering.add_key('crtm_coeff_dir', self.config.crtm_coeff_dir(None)) self.jedi_rendering.add_key('window_begin', window_begin) + # Atmosphere background error model + if npx_proc is not None and npy_proc is not None: + self.jedi_rendering.add_key('gsibec_npx_proc', npx_proc) + self.jedi_rendering.add_key('gsibec_npy_proc', 6*npy_proc) + # Model if window_type == '4D': self.jedi_rendering.add_key('background_frequency', self.config.background_frequency()) @@ -115,8 +124,11 @@ def execute(self): # Run the JEDI executable # ----------------------- - run_executable(self.logger, self.cycle_dir(), np, jedi_executable_path, jedi_config_file, - output_log_file) - self.logger.info('Running '+jedi_executable_path+' with '+str(np)+' processors.') + if not generate_yaml_and_exit: + self.logger.info('Running '+jedi_executable_path+' with '+str(np)+' processors.') + run_executable(self.logger, self.cycle_dir(), np, jedi_executable_path, + jedi_config_file, output_log_file) + else: + self.logger.info('YAML generated, now exiting.') # -------------------------------------------------------------------------------------------------- diff --git a/src/swell/tasks/stage_jedi.py b/src/swell/tasks/stage_jedi.py index 479cdd04..8e1d74cd 100644 --- a/src/swell/tasks/stage_jedi.py +++ b/src/swell/tasks/stage_jedi.py @@ -9,14 +9,10 @@ import os -import re -import glob -from shutil import copyfile from swell.tasks.base.task_base import taskBase from swell.utilities.filehandler import * from swell.utilities.exceptions import * -from r2d2 import fetch # -------------------------------------------------------------------------------------------------- diff --git a/src/swell/tasks/store_background.py b/src/swell/tasks/store_background.py index 2e95e9df..f6e76f8f 100644 --- a/src/swell/tasks/store_background.py +++ b/src/swell/tasks/store_background.py @@ -11,7 +11,6 @@ from datetime import datetime as dt import isodate import os -import re from r2d2 import store diff --git a/src/swell/tasks/task_questions.yaml b/src/swell/tasks/task_questions.yaml index a50a5ecd..53118a55 100644 --- a/src/swell/tasks/task_questions.yaml +++ b/src/swell/tasks/task_questions.yaml @@ -70,8 +70,11 @@ background_time_offset: forecast begin? tasks: - EvaObservations + - GetGeovals - GetObservations + - GsiBcToIoda - RunJediHofxExecutable + - RunJediUfoTestsExecutable - RunJediVariationalExecutable - SaveObsDiags type: duration @@ -114,8 +117,11 @@ crtm_coeff_dir: prompt: What is the path to the CRTM coefficient files? tasks: - EvaObservations + - GetGeovals - GetObservations + - GsiBcToIoda - RunJediHofxExecutable + - RunJediUfoTestsExecutable - RunJediVariationalExecutable - SaveObsDiags type: string @@ -172,10 +178,20 @@ forecast_duration: - all prompt: GEOS forecast duration tasks: - - PrepGeosRunDir - MoveForecastRestart + - PrepGeosRunDir type: duration +generate_yaml_and_exit: + ask_question: false + default_value: false + prompt: Generate JEDI executable YAML and exit? + tasks: + - RunJediHofxExecutable + - RunJediUfoTestsExecutable + - RunJediVariationalExecutable + type: boolean + geos_background_restart_offset: ask_question: true default_value: defer_to_model @@ -248,6 +264,26 @@ geos_restarts_directory: - PrepGeosRunDir type: string +geovals_experiment: + ask_question: true + default_value: defer_to_model + models: + - geos_atmosphere + prompt: What is the name of the R2D2 experiment providing the GeoVaLs? + tasks: + - GetGeovals + type: string + +geovals_provider: + ask_question: false + default_value: defer_to_model + models: + - geos_atmosphere + prompt: What is the name of the R2D2 database providing the GeoVaLs? + tasks: + - GetGeovals + type: string + gradient_norm_reduction: ask_question: false default_value: defer_to_model @@ -390,12 +426,61 @@ observations: prompt: Which observations do you want to include? tasks: - EvaObservations + - GetGeovals - GetObservations + - GsiBcToIoda + - GsiNcdiagToIoda - RunJediHofxExecutable + - RunJediUfoTestsExecutable - RunJediVariationalExecutable - SaveObsDiags type: string-check-list +path_to_geos_adas_background: + ask_question: true + default_value: defer_to_model + models: + - geos_atmosphere + prompt: What is the path to where the cubed sphere backgrounds are in the GEOSadas + run? + tasks: + - GetGeosAdasBackground + type: string + +path_to_gsi_bc_coefficients: + ask_question: true + default_value: defer_to_model + models: + - geos_atmosphere + prompt: What is the location where GSI bias correction files can be found? + tasks: + - GetGsiBc + type: string + +path_to_gsi_nc_diags: + ask_question: true + default_value: defer_to_model + models: + - geos_atmosphere + prompt: What is the path to where the GSI ncdiags are stored? + tasks: + - GetGsiNcdiag + type: string + +produce_geovals: + ask_question: true + default_value: defer_to_model + models: + - geos_atmosphere + options: + - true + - false + prompt: When running the ncdiag to ioda converted do you want to produce GeoVaLs + files? + tasks: + - GsiNcdiagToIoda + type: boolean + static_background_error_model: ask_question: true default_value: defer_to_model @@ -440,7 +525,7 @@ total_processors: tasks: - GenerateBClimatology - GenerateBClimatologyByLinking - - RunGeosExecutable + - PrepareAnalysis - RunJediHofxExecutable - RunJediVariationalExecutable type: integer @@ -468,9 +553,11 @@ window_length: prompt: What is the duration for the data assimilation window? tasks: - GetBackground + - GetGeovals - GetObservations - MoveDaRestart - RunJediHofxExecutable + - RunJediUfoTestsExecutable - RunJediVariationalExecutable - StoreBackground type: duration @@ -484,8 +571,12 @@ window_offset: tasks: - EvaObservations - GetBackground + - GetGeovals - GetObservations + - GsiBcToIoda + - GsiNcdiagToIoda - RunJediHofxExecutable + - RunJediUfoTestsExecutable - RunJediVariationalExecutable - SaveObsDiags - StoreBackground diff --git a/src/swell/test/question_dictionary_comparison_test.py b/src/swell/test/question_dictionary_comparison_test.py index 6eab93be..066c99a6 100644 --- a/src/swell/test/question_dictionary_comparison_test.py +++ b/src/swell/test/question_dictionary_comparison_test.py @@ -8,17 +8,15 @@ # -------------------------------------------------------------------------------------------------- -import os import unittest -import yaml -from swell.swell_path import get_swell_path from swell.utilities.bin.task_question_dicts import tq_dicts from swell.utilities.bin.task_question_dicts_defaults import tq_dicts_defaults # -------------------------------------------------------------------------------------------------- + class QuestionDictionaryTest(unittest.TestCase): def test_dictionary_comparison(self): diff --git a/src/swell/test/test_suite.py b/src/swell/test/test_suite.py index c21e314f..e07feacd 100644 --- a/src/swell/test/test_suite.py +++ b/src/swell/test/test_suite.py @@ -12,6 +12,7 @@ import unittest from swell.test.question_dictionary_comparison_test import QuestionDictionaryTest +from swell.test.unused_variables_test import UnusedVariablesTest from swell.utilities.logger import Logger @@ -29,7 +30,10 @@ def main(): # Create a test suite test_suite = unittest.TestSuite() - # Load tests from QuestionDictionaryTest + # Load unused variable test + test_suite.addTests(unittest.TestLoader().loadTestsFromTestCase(UnusedVariablesTest)) + + # Load tests from UnusedVariablesTest test_suite.addTests(unittest.TestLoader().loadTestsFromTestCase(QuestionDictionaryTest)) # Create a test runner diff --git a/src/swell/test/unused_variables_test.py b/src/swell/test/unused_variables_test.py new file mode 100644 index 00000000..865b1bb7 --- /dev/null +++ b/src/swell/test/unused_variables_test.py @@ -0,0 +1,44 @@ +# (C) Copyright 2021- United States Government as represented by the Administrator of the +# National Aeronautics and Space Administration. All Rights Reserved. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. + + +# -------------------------------------------------------------------------------------------------- + + +import unittest +import subprocess +import os + +from swell.swell_path import get_swell_path + + +# -------------------------------------------------------------------------------------------------- + + +def run_flake8(file_path): + flake8_cmd = ['flake8', '--select', 'F401,F841', file_path] + result = subprocess.run(flake8_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, + universal_newlines=True) + return result.stdout.strip() + + +# -------------------------------------------------------------------------------------------------- + + +class UnusedVariablesTest(unittest.TestCase): + + def test_unused_variables(self): + + for root, _, files in os.walk(get_swell_path()): + for filename in files: + if filename.endswith('.py'): # Only process Python files + file_path = os.path.join(root, filename) + flake8_output = run_flake8(file_path) + + self.assertEqual(flake8_output, '', f"Unused variables found in {file_path}") + + +# -------------------------------------------------------------------------------------------------- diff --git a/src/swell/utilities/bin/task_question_dicts.py b/src/swell/utilities/bin/task_question_dicts.py index e4264187..b2e94c8c 100644 --- a/src/swell/utilities/bin/task_question_dicts.py +++ b/src/swell/utilities/bin/task_question_dicts.py @@ -30,9 +30,6 @@ def tq_dicts(): # Create a logger logger = Logger('ListOfTaskQuestions') - # Path to JEDI interface code - swell_path = get_swell_path() - # All python files task_codes = glob.glob(os.path.join(get_swell_path(), 'tasks', '*.py')) task_codes = list(filter(lambda task_code: task_code != '__init__.py', task_codes)) @@ -40,6 +37,10 @@ def tq_dicts(): # Target YAML file destination_yaml = os.path.join(get_swell_path(), 'tasks', 'task_questions.yaml') + # Print message + logger.info(f'Running tool to regenerate the task questions dictionary. Output dictionary ' + + f'be written to {destination_yaml}') + # Read input file into dictionary if os.path.exists(destination_yaml): with open(destination_yaml, 'r') as ymlfile: @@ -49,7 +50,6 @@ def tq_dicts(): question_dict = {} question_dict_str = '' - question_dict_in = question_dict.copy() question_dict_str_in = question_dict_str # Loop through task code and accumulate all lines containing a use of config diff --git a/src/swell/utilities/bin/task_question_dicts_defaults.py b/src/swell/utilities/bin/task_question_dicts_defaults.py index 23afbb60..8c065263 100644 --- a/src/swell/utilities/bin/task_question_dicts_defaults.py +++ b/src/swell/utilities/bin/task_question_dicts_defaults.py @@ -10,7 +10,6 @@ # standard imports -import glob import os import random import string @@ -19,7 +18,6 @@ # swell imports from swell.swell_path import get_swell_path from swell.utilities.logger import Logger -from swell.utilities.case_switching import snake_case_to_camel_case # -------------------------------------------------------------------------------------------------- @@ -133,9 +131,6 @@ def tq_dicts_defaults(): # Create a logger logger = Logger('ListOfTaskQuestions') - # Path to JEDI interface code - swell_path = get_swell_path() - # Output file task_questions_config = os.path.join(get_swell_path(), 'tasks', 'task_questions.yaml') diff --git a/src/swell/utilities/build.py b/src/swell/utilities/build.py index 532a6d05..64780271 100644 --- a/src/swell/utilities/build.py +++ b/src/swell/utilities/build.py @@ -10,7 +10,7 @@ import os import shutil -from jedi_bundle.bin.jedi_bundle import get_default_config, get_bundles +from jedi_bundle.bin.jedi_bundle import get_default_config # -------------------------------------------------------------------------------------------------- diff --git a/src/swell/utilities/config.py b/src/swell/utilities/config.py index 62e76dcc..1df11841 100644 --- a/src/swell/utilities/config.py +++ b/src/swell/utilities/config.py @@ -109,7 +109,6 @@ def __init__(self, input_file, logger, task_name, model): setattr(self, f'__{experiment_key}__', experiment_value) # Add a method to get the variable - print('adding method for ', experiment_key) setattr(self, f'{experiment_key}', self.get(experiment_key)) # ---------------------------------------------------------------------------------------------- diff --git a/src/swell/utilities/data_assimilation_window_params.py b/src/swell/utilities/data_assimilation_window_params.py index 13ab1ec8..97f5bf87 100644 --- a/src/swell/utilities/data_assimilation_window_params.py +++ b/src/swell/utilities/data_assimilation_window_params.py @@ -66,6 +66,21 @@ def window_begin_iso(self, window_offset): # ---------------------------------------------------------------------------------------------- + def window_end_iso(self, window_offset, window_length): + + # Compute window length duration + window_length_dur = isodate.parse_duration(window_length) + + # Get window beginning time + window_begin_dto = self.__get_window_begin_dto__(window_offset) + + # Window end time + window_end_dto = window_begin_dto + window_length_dur + + return window_end_dto.strftime(datetime_formats['iso_format']) + + # ---------------------------------------------------------------------------------------------- + def background_time(self, window_offset, background_time_offset): background_time_offset_dur = isodate.parse_duration(background_time_offset) diff --git a/src/swell/utilities/datetime.py b/src/swell/utilities/datetime.py index bc3c9188..956cb7e7 100644 --- a/src/swell/utilities/datetime.py +++ b/src/swell/utilities/datetime.py @@ -15,8 +15,9 @@ # -------------------------------------------------------------------------------------------------- datetime_formats = { - 'directory_format': '%Y%m%dT%H%M%SZ', # yyyymmddThhMMssZ for directory formats - 'iso_format': '%Y-%m-%dT%H:%M:%SZ' # yyyy-mm-ddThh:MM:ssZ ISO format + 'directory_format': '%Y%m%dT%H%M%SZ', # yyyymmddThhMMssZ for directory formats + 'iso_format': '%Y-%m-%dT%H:%M:%SZ', # yyyy-mm-ddThh:MM:ssZ ISO format + 'gsi_nc_diag_format': '%Y%m%d_%Hz', # yyyymmdd_hhz Format for GSI netcdf diagnostic files } # -------------------------------------------------------------------------------------------------- diff --git a/src/swell/utilities/dictionary.py b/src/swell/utilities/dictionary.py index 9b827705..ee58d8d2 100644 --- a/src/swell/utilities/dictionary.py +++ b/src/swell/utilities/dictionary.py @@ -7,8 +7,6 @@ # -------------------------------------------------------------------------------------------------- -import re -import string import yaml from collections.abc import Hashable @@ -116,3 +114,36 @@ def replace_string_in_dictionary(dictionary, string_in, string_out): # Convert back to dictionary return yaml.safe_load(dictionary_string) + + +# -------------------------------------------------------------------------------------------------- + + +def write_dict_to_yaml(dictionary, file): + + # Convert dictionary to YAML string + dictionary_string = yaml.dump(dictionary, default_flow_style=False, sort_keys=False) + + # Write string to file + with open(file, 'w') as file_open: + file_open.write(dictionary_string) + + +# -------------------------------------------------------------------------------------------------- + + +def update_dict(original_dict, overwrite_dict): + + # Create output dictionary from original dictionary + output_dict = original_dict.copy() + + for key, value in overwrite_dict.items(): + if isinstance(value, dict) and key in output_dict and isinstance(output_dict[key], dict): + output_dict[key] = update_dict(output_dict[key], value) + else: + output_dict[key] = value + + return output_dict + + +# -------------------------------------------------------------------------------------------------- diff --git a/src/swell/utilities/geos.py b/src/swell/utilities/geos.py index 57b2c7a8..e8017a00 100644 --- a/src/swell/utilities/geos.py +++ b/src/swell/utilities/geos.py @@ -1,4 +1,4 @@ -# (C) Copyright 2023 United States Government as represented by the Administrator of the +# (C) Copyright 2023- United States Government as represented by the Administrator of the # National Aeronautics and Space Administration. All Rights Reserved. # # This software is licensed under the terms of the Apache Licence Version 2.0 @@ -14,11 +14,8 @@ import netCDF4 import os import re -import shutil -from abc import ABC, abstractmethod - -from swell.utilities.shell_commands import run_subprocess, run_track_log_subprocess +from swell.utilities.shell_commands import run_subprocess from swell.utilities.datetime import datetime_formats # -------------------------------------------------------------------------------------------------- diff --git a/src/swell/utilities/jinja2.py b/src/swell/utilities/jinja2.py index 7dcbe6fb..fee239c3 100644 --- a/src/swell/utilities/jinja2.py +++ b/src/swell/utilities/jinja2.py @@ -8,7 +8,6 @@ import jinja2 -import yaml # -------------------------------------------------------------------------------------------------- diff --git a/src/swell/utilities/render_jedi_interface_files.py b/src/swell/utilities/render_jedi_interface_files.py index e0319cca..cb6e8b0a 100644 --- a/src/swell/utilities/render_jedi_interface_files.py +++ b/src/swell/utilities/render_jedi_interface_files.py @@ -51,6 +51,8 @@ def __init__(self, logger, experiment_root, experiment_id, cycle_dir, jedi_inter 'local_background_time', 'local_background_time_iso', 'minimizer', + 'gsibec_npx_proc', + 'gsibec_npy_proc', 'npx_proc', 'npy_proc', 'number_of_iterations', @@ -59,6 +61,7 @@ def __init__(self, logger, experiment_root, experiment_id, cycle_dir, jedi_inter 'vertical_resolution', 'window_begin', 'window_begin_iso', + 'window_end_iso', 'window_length', ] diff --git a/src/swell/utilities/run_jedi_executables.py b/src/swell/utilities/run_jedi_executables.py index 2427a08c..79f5dcd7 100644 --- a/src/swell/utilities/run_jedi_executables.py +++ b/src/swell/utilities/run_jedi_executables.py @@ -17,7 +17,7 @@ def jedi_dictionary_iterator(jedi_config_dict, jedi_rendering, window_type, obs, - jedi_forecast_model): + jedi_forecast_model=None): # Assemble configuration YAML file # -------------------------------- diff --git a/src/swell/utilities/shell_commands.py b/src/swell/utilities/shell_commands.py index c5ac871e..f48a39af 100644 --- a/src/swell/utilities/shell_commands.py +++ b/src/swell/utilities/shell_commands.py @@ -70,7 +70,8 @@ def run_subprocess(logger, command, stdout=None, stderr=None): try: subprocess.run(command, check=True, stdout=stdout, stderr=stderr) except subprocess.CalledProcessError as e: - logger.abort('Subprocess with command {command} failed, throwing error \n{e}') + print(e) + logger.abort(f'Subprocess with command {command} failed, throwing error {e}') # --------------------------------------------------------------------------------------------------