diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/tcp.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/tcp.yaml new file mode 100644 index 000000000..ad85ccc99 --- /dev/null +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/observations/tcp.yaml @@ -0,0 +1,120 @@ +obs space: + name: TC vital storm center pressure + obsdatain: + engine: + type: H5File + obsfile: '{{cycle_dir}}/tcp.{{window_begin}}.nc4' + obsdataout: + engine: + type: H5File + obsfile: '{{cycle_dir}}/{{experiment_id}}.tcp.{{window_begin}}.nc4' + simulated variables: [stationPressure] + +obs operator: + + # Surface pressure is handled using the correction scheme + name: SfcCorrected + variables: + - name: stationPressure + correction scheme to use: GSL + geovar_geomz: geopotential_height + geovar_sfc_geomz: height_above_mean_sea_level_at_surface + station_altitude: height + +obs prior filters: + +# Apply variable changes needed for rescaled height coordinate +# ------------------------------------------------------------ +- filter: Variable Transforms + Transform: AdjustedHeightCoordinate + SkipWhenNoObs: False + +# limit to obs with pressures in valid range +- filter: Domain Check + where: + - variable: + name: MetaData/pressure + minvalue: 85000 + maxvalue: 102500 + +obs post filters: + +#ps 180 1 1 3.0 0 0 0 4.0 3.0 1.0 4.0 0.000300 0 0. 0. 0 0. 0. +#tcp 112 0 1 3.0 0 0 0 75.0 5.0 1.0 75.0 0.000000 0 0. 0. 0 0. 0. + +- filter: Perform Action + filter variables: + - name: stationPressure + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorSfcPressure + options: + geovar_geomz: geopotential_height + geovar_sfc_geomz: height_above_mean_sea_level_at_surface + station_altitude: height +# assign TempObsErrorData/stationPressure <--- ObsErrorData before changing its Min and Max +- filter: Variable Assignment + assignments: + - name: TempObsErrorData/stationPressure + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/stationPressure + defer to post: true +# set ObsErrorData 100 Pa if it < 100 Pa. +- filter: Perform Action + filter variables: + - name: stationPressure + action: + name: assign error + error parameter: 100 + where: + - variable: + name: TempObsErrorData/stationPressure + maxvalue: 100 + - variable: + name: TempObsErrorData/stationPressure + value: is_valid + defer to post: true +# set ObsErrorData 500 Pa if it > 500 Pa. +- filter: Perform Action + filter variables: + - name: stationPressure + action: + name: assign error + error parameter: 500 + where: + - variable: + name: TempObsErrorData/stationPressure + minvalue: 500 + - variable: + name: TempObsErrorData/stationPressure + value: is_valid + defer to post: true + +# Background check +- filter: Background Check + filter variables: + - name: stationPressure + threshold: 75.0 + action: + name: reject + defer to post: true + +# Re-assign error ObsErrorData/stationPressure <--- TempObsErrorData/stationPressure +- filter: Perform Action + filter variables: + - name: stationPressure + action: + name: assign error + error function: TempObsErrorData/stationPressure + where: + - variable: + name: TempObsErrorData/stationPressure + value: is_valid + 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 3492d5ed3..7aa6f271c 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/task_questions.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/task_questions.yaml @@ -241,6 +241,7 @@ observations: - sfcship - sfc - sondes + - tcp - airs_aqua - amsr2_gcom-w1 - amsua_aqua @@ -275,6 +276,7 @@ observations: - sfcship - sfc - sondes + - tcp - airs_aqua - amsr2_gcom-w1 - amsua_aqua diff --git a/src/swell/configuration/jedi/observation_ioda_names.yaml b/src/swell/configuration/jedi/observation_ioda_names.yaml index f12a41e46..96eed2726 100644 --- a/src/swell/configuration/jedi/observation_ioda_names.yaml +++ b/src/swell/configuration/jedi/observation_ioda_names.yaml @@ -199,6 +199,9 @@ ioda instrument names: full name: SSMIS (DMSP-F17) provider : ncdiag inst type: radiance + - ioda name: tcp + full name: Tropical Cyclone central pressure + inst type: conventional - ioda name: vadwind full name: Velocity Azimuth Display Wind Profile provider : ncdiag diff --git a/src/swell/suites/3dfgat_atmos/suite_config.py b/src/swell/suites/3dfgat_atmos/suite_config.py index c35915186..bcadb3663 100644 --- a/src/swell/suites/3dfgat_atmos/suite_config.py +++ b/src/swell/suites/3dfgat_atmos/suite_config.py @@ -76,7 +76,8 @@ class SuiteConfig(QuestionContainer, Enum): "sfcship", "sfc", "sondes", - "ssmis_f17" + "ssmis_f17", + "tcp" ]), qd.gradient_norm_reduction("1e-3"), qd.number_of_iterations([10]), diff --git a/src/swell/suites/3dvar_atmos/suite_config.py b/src/swell/suites/3dvar_atmos/suite_config.py index 2bf5ab418..3701b4f93 100644 --- a/src/swell/suites/3dvar_atmos/suite_config.py +++ b/src/swell/suites/3dvar_atmos/suite_config.py @@ -80,7 +80,8 @@ class SuiteConfig(QuestionContainer, Enum): "sfcship", "sfc", "sondes", - "ssmis_f17" + "ssmis_f17", + "tcp" ]), qd.clean_patterns(['*.txt', '*.csv']), ] diff --git a/src/swell/suites/convert_ncdiags/suite_config.py b/src/swell/suites/convert_ncdiags/suite_config.py index c8669546c..5b766c81c 100644 --- a/src/swell/suites/convert_ncdiags/suite_config.py +++ b/src/swell/suites/convert_ncdiags/suite_config.py @@ -76,7 +76,8 @@ class SuiteConfig(QuestionContainer, Enum): "sfcship", "sfc", "sondes", - "ssmis_f17" + "ssmis_f17", + "tcp" ]), qd.path_to_gsi_nc_diags("/discover/nobackup/projects/gmao/advda/SwellTestData/" "ufo_testing/ncdiagv2/%Y%m%d%H"), diff --git a/src/swell/suites/eva_capabilities/suite_config.py b/src/swell/suites/eva_capabilities/suite_config.py index a5dc9af50..ae7ea70c2 100644 --- a/src/swell/suites/eva_capabilities/suite_config.py +++ b/src/swell/suites/eva_capabilities/suite_config.py @@ -95,7 +95,8 @@ class SuiteConfig(QuestionContainer, Enum): "sfcship", "sfc", "sondes", - "ssmis_f17" + "ssmis_f17", + "tcp" ]), qd.ncdiag_experiments(['x0050_fgat']), qd.clean_patterns(['*.txt', '*.csv']), diff --git a/src/swell/suites/hofx/suite_config.py b/src/swell/suites/hofx/suite_config.py index 90723ef84..71d43a27d 100644 --- a/src/swell/suites/hofx/suite_config.py +++ b/src/swell/suites/hofx/suite_config.py @@ -70,7 +70,8 @@ class SuiteConfig(QuestionContainer, Enum): "sfcship", "sfc", "sondes", - "ssmis_f17" + "ssmis_f17", + "tcp" ]), qd.clean_patterns([]), ] diff --git a/src/swell/suites/localensembleda/suite_config.py b/src/swell/suites/localensembleda/suite_config.py index 437dd35ab..936d7d558 100644 --- a/src/swell/suites/localensembleda/suite_config.py +++ b/src/swell/suites/localensembleda/suite_config.py @@ -110,6 +110,7 @@ class SuiteConfig(QuestionContainer, Enum): "scatwind", "sfcship", "sfc", + "tcp", "mhs_metop-b", "mhs_metop-c", "mhs_n19", diff --git a/src/swell/suites/ufo_testing/suite_config.py b/src/swell/suites/ufo_testing/suite_config.py index ab10cc015..bd60d9629 100644 --- a/src/swell/suites/ufo_testing/suite_config.py +++ b/src/swell/suites/ufo_testing/suite_config.py @@ -61,7 +61,8 @@ class SuiteConfig(QuestionContainer, Enum): "sfc", "sfcship", "sondes", - "ssmis_f17" + "ssmis_f17", + "tcp" ]), qd.produce_geovals(False), qd.clean_patterns([ diff --git a/src/swell/tasks/get_obs_not_in_r2d2.py b/src/swell/tasks/get_obs_not_in_r2d2.py index 6ad2e21e2..5c2ccd5de 100644 --- a/src/swell/tasks/get_obs_not_in_r2d2.py +++ b/src/swell/tasks/get_obs_not_in_r2d2.py @@ -26,7 +26,7 @@ def execute(self) -> None: # -------------------- cycle_date = self.__datetime__.string_directory() - # Get the path and pattern for the background files + # Get the path and pattern for the observation files # ------------------------------------------------- existing_path = self.config.ioda_locations_not_in_r2d2() @@ -50,8 +50,8 @@ def execute(self) -> None: # Assert that some files were found # --------------------------------- - self.logger.assert_abort(len(existing_path_files) > 0, f'No background ' - 'files matching cycle in background directory.') + self.logger.assert_abort(len(existing_path_files) > 0, f'No observation ' + 'files matching cycle in observation directory.') # Loop over all the files # -----------------------