Skip to content

Commit

Permalink
Add precipitable clouds in microwave all-sky assimilations (#63)
Browse files Browse the repository at this point in the history
Add rain, snow, and graupel clouds for CRTM inputs.
  Add a prior filter to zero clouds over non-water surfaces.
  Add an option of clouds in the Hydrometeo check.
  Add gross error check threshold for precipition impacted channels.
  Add cold-air-outbreak filters.
  Read cloud fraction from GeoVals.
  Render list of not-bias corrected channels from JCB tables.
  Add configurations for atms_n21.
  • Loading branch information
jianjunj authored Jan 16, 2025
1 parent 10a744a commit 875fb3c
Show file tree
Hide file tree
Showing 5 changed files with 1,155 additions and 14 deletions.
43 changes: 43 additions & 0 deletions observation_chronicle/atmosphere/atms_n21.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Instrument metadata
# -------------------
commissioned: 2023-05-01T12:00:00

observer_type: satellite # Type of chronicle to use

# Instrument initial configuration
# --------------------------------
channel_variables:
simulated: min
active: min
biascorrtd: min
error: max
error_cld: max
ermax: max
var_b: min
var_pg: min
icld_det: min
icloud: min
iaerosol: min
channel_values:
1: [ 1, 1, 1, 4.50, 20.00, 4.50, 10.00, 0.00, -2, 1, -1 ]
2: [ 1, 1, 1, 4.50, 25.00, 4.50, 10.00, 0.00, -2, 1, -1 ]
3: [ 1, 1, 1, 4.50, 12.00, 3.00, 10.00, 0.00, -2, 1, -1 ]
4: [ 1, 1, 1, 2.50, 7.00, 3.00, 10.00, 0.00, -2, 1, -1 ]
5: [ 1, 1, 1, 0.55, 3.50, 1.00, 10.00, 0.00, -2, 1, -1 ]
6: [ 1, 1, 1, 0.30, 3.00, 1.00, 10.00, 0.00, -2, 1, -1 ]
7: [ 1, 1, 1, 0.30, 0.80, 1.00, 10.00, 0.00, -2, 1, -1 ]
8: [ 1, 1, 1, 0.40, 0.40, 1.00, 10.00, 0.00, -2, 1, -1 ]
9: [ 1, 1, 1, 0.40, 0.40, 1.00, 10.00, 0.00, -2, 1, -1 ]
10: [ 1, 1, 1, 0.40, 0.40, 1.00, 10.00, 0.00, -2, 1, -1 ]
11: [ 1, 1, 1, 0.45, 0.45, 1.00, 10.00, 0.00, -2, 1, -1 ]
12: [ 1, 1, 1, 0.45, 0.45, 1.00, 10.00, 0.00, -2, 1, -1 ]
13: [ 1, 1, 1, 0.55, 0.55, 1.00, 10.00, 0.00, -2, 1, -1 ]
14: [ 1, 1, 1, 0.80, 0.80, 2.00, 10.00, 0.00, -2, 1, -1 ]
15: [ 1, 1, 0, 4.00, 4.00, 4.50, 10.00, 0.00, -2, 1, -1 ]
16: [ 1, 1, 1, 4.00, 19.00, 4.50, 10.00, 0.00, -2, 1, -1 ]
17: [ 1, 1, 1, 4.00, 30.00, 2.00, 10.00, 0.00, -2, 1, -1 ]
18: [ 1, 1, 1, 3.50, 25.00, 2.00, 10.00, 0.00, -2, 1, -1 ]
19: [ 1, 1, 1, 3.00, 16.50, 2.00, 10.00, 0.00, -2, 1, -1 ]
20: [ 1, 1, 1, 3.00, 12.00, 2.00, 10.00, 0.00, -2, 1, -1 ]
21: [ 1, 1, 1, 3.00, 9.00, 2.00, 10.00, 0.00, -2, 1, -1 ]
22: [ 1, 1, 1, 3.00, 6.50, 2.00, 10.00, 0.00, -2, 1, -1 ]
142 changes: 137 additions & 5 deletions observations/atmosphere/amsua_n19.yaml.j2
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,10 @@
# --------------------
obs operator:
name: CRTM
Absorbers: [H2O, O3]
Clouds: [Water, Ice]
Cloud_Fraction: 1.0
Absorbers: [H2O, O3, CO2]
Clouds: &{{observation_from_jcb}}_clouds [Water, Ice, Rain, Snow, Graupel]
# Cloud_Fraction: 1.0
Cloud_Seeding: true
obs options:
Sensor_ID: &{{observation_from_jcb}}_sensor_id amsua_n19
EndianType: little_endian
Expand All @@ -34,6 +35,8 @@
obs bias:
input file: "{{atmosphere_obsbiasin_path}}/{{atmosphere_obsbiasin_prefix}}{{observation_from_jcb}}{{atmosphere_obsbiasin_suffix}}"
output file: "{{atmosphere_obsbiasout_path}}/{{atmosphere_obsbiasout_prefix}}{{observation_from_jcb}}{{atmosphere_obsbiasout_suffix}}"
variables without bc: [brightnessTemperature]
channels: {{ get_satellite_variable(observation_from_jcb, "not_biascorrtd") }}
variational bc:
predictors:
- name: constant
Expand Down Expand Up @@ -64,7 +67,25 @@

# Observation Filters (QC)
# ------------------------
obs filters:
obs prior filters:
# Zero Atmospheric clouds in CRTM where water_area_fraction < 0.99
- filter: Variable Assignment
assignments:
- name: MetaData/zeroCloudInCRTM
type: int
function:
name: ObsFunction/Conditional
options:
# firstmatchingcase: false
defaultvalue: 0 # Will not zero clouds by default
cases:
- where:
- variable:
name: GeoVaLs/water_area_fraction
maxvalue: 0.99
value: 1 # Will zero clouds by default

obs post filters:
- filter: BlackList
filter variables:
- name: brightnessTemperature
Expand Down Expand Up @@ -124,6 +145,7 @@
channels: *{{observation_from_jcb}}_simulated_channels
options:
channels: *{{observation_from_jcb}}_simulated_channels
Clouds: *{{observation_from_jcb}}_clouds
obserr_clearsky: *{{observation_from_jcb}}_err0
clwret_function:
name: ObsFunction/CLWRetMW
Expand Down Expand Up @@ -301,6 +323,8 @@
x1: *{{observation_from_jcb}}_x1
err0: *{{observation_from_jcb}}_err0
err1: *{{observation_from_jcb}}_err1
threshold: 3
threshold_precip: 2.5
obserr_bound_max: [{{ get_satellite_variable(observation_from_jcb, "ermax") }}]
action:
name: reject
Expand Down Expand Up @@ -334,8 +358,116 @@
minvalue: 1.0e-12
action:
name: reject
# Column liquid cloud
- filter: Variable Assignment
assignments:
- name: DerivedMetaData/ColumnLiquidCloud
type: float
function:
name: TotalColumnCloudGuess@ObsFunction
options:
cloud_content: mass_content_of_cloud_liquid_water_in_atmosphere_layer
# Column ice cloud
- filter: Variable Assignment
assignments:
- name: DerivedMetaData/ColumnIceCloud
type: float
function:
name: TotalColumnCloudGuess@ObsFunction
options:
cloud_content: mass_content_of_cloud_ice_in_atmosphere_layer
# Combined ColumnLiquidCloud + ColumnIceCloud
- filter: Variable Assignment
assignments:
- name: DerivedMetaData/ColumnLiquidIceCloud
type: float
function:
name: ObsFunction/Arithmetic
options:
variables:
- name: DerivedMetaData/ColumnLiquidCloud
- name: DerivedMetaData/ColumnIceCloud
coefs: [1, 1]
# replace zero by 1e-7 in DerivedMetaData/ColumnLiquidIceCloud
- filter: Variable Assignment
assignments:
- name: DerivedMetaData/ColumnLiquidIceCloud
type: float
value: 1.0e-7
where:
- variable:
name: DerivedMetaData/ColumnLiquidIceCloud
maxvalue: 1.0e-8


# ratio of liquid /(Liquid+Ice)
- filter: Variable Assignment
assignments:
- name: DerivedMetaData/ColumnRatioLiquidCloud
type: float
function:
name: ObsFunction/ElementMultiply
options:
variables:
- name: DerivedMetaData/ColumnLiquidCloud
- name: DerivedMetaData/ColumnLiquidIceCloud
exponents: [1,-1]
# TotalColumnVaporGuess
- filter: Variable Assignment
assignments:
- name: DerivedMetaData/TotalColumnVaporGuess
type: float
function:
name: ObsFunction/TotalColumnVaporGuess
# potentialTemperature at surface
- filter: Variable Assignment
assignments:
- name: DerivedMetaData/PotentialTemperatureSurface
type: float
function:
name: PotentialTemperatureGuess2D@ObsFunction
options:
approximate pressure: surface_pressure
# potentialTemperature near 700 hPa
- filter: Variable Assignment
assignments:
- name: DerivedMetaData/PotentialTemperatureAt700hPa
type: float
function:
name: PotentialTemperatureGuess2D@ObsFunction
options:
approximate pressure: 70000.0
# stability = Difference between PotentialTemperatur values
- filter: Variable Assignment
assignments:
- name: DerivedMetaData/PotentialTemperatureDiff
type: float
function:
name: ObsFunction/Arithmetic
options:
variables:
- name: DerivedMetaData/PotentialTemperatureAt700hPa
- name: DerivedMetaData/PotentialTemperatureSurface
coefs: [1, -1]
## cao_check
- filter: BlackList
filter variables:
- name: brightnessTemperature
channels: 1-6, 15
where:
- variable:
name: ObsFunction/TotalColumnVaporGuess
maxvalue: 8.0
- variable:
name: DerivedMetaData/ColumnRatioLiquidCloud
maxvalue: 0.5
- variable:
name: DerivedMetaData/ColumnLiquidIceCloud
minvalue: 1.0e-6
- variable:
name: DerivedMetaData/PotentialTemperatureDiff
maxvalue: 12.0
action:
name: reject
# GeoVaLs for Driving Observation Operators (testing mode)
# --------------------------------------------------------
geovals:
Expand Down
Loading

0 comments on commit 875fb3c

Please sign in to comment.