diff --git a/rrfs-test/validated_yamls/gen_yaml_ctest.sh b/rrfs-test/validated_yamls/gen_yaml_ctest.sh index 8a7427b..59e0ad0 100755 --- a/rrfs-test/validated_yamls/gen_yaml_ctest.sh +++ b/rrfs-test/validated_yamls/gen_yaml_ctest.sh @@ -46,6 +46,10 @@ msonet_obtype_configs=( atms_obtype_configs=( "atms_npp_qc_bc.yaml" ) +# Define AMSUA observation type configs as an array +amsua_obtype_configs=( + "amsua_n19.yaml" +) # Function to concatenate all obtypes into one file process_obtypes() { @@ -99,6 +103,7 @@ for basic_config in "${basic_configs[@]}"; do process_obtypes "${ctest_names[$iconfig]}" "aircft_obtype_configs[@]" "data/obs_ctest/ioda_aircft_dc.nc" "$temp_yaml" process_obtypes "${ctest_names[$iconfig]}" "msonet_obtype_configs[@]" "data/obs_ctest/ioda_msonet_dc.nc" "$temp_yaml" process_obtypes "${ctest_names[$iconfig]}" "atms_obtype_configs[@]" "data/obs_ctest/atms_npp_obs_2024052700.nc" "$temp_yaml" + process_obtypes "${ctest_names[$iconfig]}" "amsua_obtype_configs[@]" "data/obs_ctest/ioda_amsua_n19_dc.nc" "$temp_yaml" # Copy the basic configuration yaml into the super yaml cp -p templates/basic_config/$basic_config ./$conv_yaml diff --git a/rrfs-test/validated_yamls/templates/obtype_config/amsua_n19.yaml b/rrfs-test/validated_yamls/templates/obtype_config/amsua_n19.yaml new file mode 100644 index 0000000..9a4ee08 --- /dev/null +++ b/rrfs-test/validated_yamls/templates/obtype_config/amsua_n19.yaml @@ -0,0 +1,375 @@ + - obs space: + name: amsua_n19 + distribution: + name: "@DISTRIBUTION@" + obsdatain: + engine: + type: H5File + obsfile: data/obs/amsua_n19_obs.2024052700.nc + obsdataout: + engine: + type: H5File + obsfile: amsua_n19_hofx.2024052700.nc4 + simulated variables: [brightnessTemperature] + observed variables: [brightnessTemperature] + channels: &amsua_n19_channels 1-15 + obs operator: + name: CRTM + Absorbers: [H2O,O3] + SurfaceWindGeoVars: uv + Clouds: [Water, Ice] + Cloud_Fraction: 1.0 + obs options: + Sensor_ID: amsua_n19 + EndianType: little_endian + CoefficientPath: data/crtm/ + IRVISlandCoeff: IGBP + linear obs operator: + Absorbers: [H2O, O3] + obs localizations: + - localization method: Horizontal Gaspari-Cohn + lengthscale: 300e3 # orig + obs bias: + input file: data/obs/amsua_n19.satbias.nc4 + output file: out_amsua_n19.satbias.nc4 + variational bc: + predictors: + - name: constant + - name: lapseRate + order: 2 + tlapse: &amsua_n19_tlapse data/obs/amsua_n19.tlapse.txt + - name: lapseRate + tlapse: *amsua_n19_tlapse + - name: emissivityJacobian + - name: sensorScanAngle + order: 4 + - name: sensorScanAngle + order: 3 + - name: sensorScanAngle + order: 2 + - name: sensorScanAngle + covariance: + minimal required obs number: 20 + variance range: [1.0e-6, 10.0] + step size: 1.0e-4 + largest analysis variance: 10000.0 + prior: + input file: data/obs/amsua_n19.satbias_cov.nc4 + inflation: + ratio: 1.1 + ratio for small dataset: 2.0 + output file: out_amsua_n19.satbias_cov.nc4 + obs filters: + - filter: BlackList + filter variables: + - name: brightnessTemperature + channels: *amsua_n19_channels + action: + name: assign error + error function: + name: ObsFunction/ObsErrorModelRamp + channels: *amsua_n19_channels + options: + channels: *amsua_n19_channels + xvar: + name: ObsFunction/CLWRetSymmetricMW + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [ObsValue, HofX] + x0: [ 0.050, 0.030, 0.030, 0.020, 0.000, + 0.100, 0.000, 0.000, 0.000, 0.000, + 0.000, 0.000, 0.000, 0.000, 0.030] + x1: [ 0.600, 0.450, 0.400, 0.450, 1.000, + 1.500, 0.000, 0.000, 0.000, 0.000, + 0.000, 0.000, 0.000, 0.000, 0.200] + err0: [ 2.500, 2.200, 2.000, 0.550, 0.300, + 0.230, 0.230, 0.250, 0.250, 0.350, + 0.400, 0.550, 0.800, 3.000, 3.500] + err1: [20.000, 18.000, 12.000, 3.000, 0.500, + 0.300, 0.230, 0.250, 0.250, 0.350, + 0.400, 0.550, 0.800, 3.000, 18.000] + # CLW Retrieval Check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: 1-6, 15 + test variables: + - name: ObsFunction/CLWRetMW + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [ObsValue] + maxvalue: 999.0 + action: + name: reject + # CLW Retrieval Check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: 1-6, 15 + test variables: + - name: ObsFunction/CLWRetMW + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [HofX] + maxvalue: 999.0 + action: + name: reject + # Hydrometeor Check (cloud/precipitation affected chanels) + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *amsua_n19_channels + test variables: + - name: ObsFunction/HydrometeorCheckAMSUA + channels: *amsua_n19_channels + options: + channels: *amsua_n19_channels + obserr_clearsky: [ 2.500, 2.200, 2.000, 0.550, 0.300, + 0.230, 0.230, 0.250, 0.250, 0.350, + 0.400, 0.550, 0.800, 3.000, 3.500] + clwret_function: + name: ObsFunction/CLWRetMW + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [ObsValue] + obserr_function: + name: ObsFunction/ObsErrorModelRamp + channels: *amsua_n19_channels + options: + channels: *amsua_n19_channels + xvar: + name: ObsFunction/CLWRetSymmetricMW + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [ObsValue, HofX] + x0: [ 0.050, 0.030, 0.030, 0.020, 0.000, + 0.100, 0.000, 0.000, 0.000, 0.000, + 0.000, 0.000, 0.000, 0.000, 0.030] + x1: [ 0.600, 0.450, 0.400, 0.450, 1.000, + 1.500, 0.000, 0.000, 0.000, 0.000, + 0.000, 0.000, 0.000, 0.000, 0.200] + err0: [ 2.500, 2.200, 2.000, 0.550, 0.300, + 0.230, 0.230, 0.250, 0.250, 0.350, + 0.400, 0.550, 0.800, 3.000, 3.500] + err1: [20.000, 18.000, 12.000, 3.000, 0.500, + 0.300, 0.230, 0.250, 0.250, 0.350, + 0.400, 0.550, 0.800, 3.000, 18.000] + maxvalue: 0.0 + action: + name: reject + # Topography check + - filter: BlackList + filter variables: + - name: brightnessTemperature + channels: *amsua_n19_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorTopoRad + channels: *amsua_n19_channels + options: + sensor: amsua_n19 + channels: *amsua_n19_channels + # Transmittnace Top Check + - filter: BlackList + filter variables: + - name: brightnessTemperature + channels: *amsua_n19_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorTransmitTopRad + channels: *amsua_n19_channels + options: + sensor: amsua_n19 + channels: *amsua_n19_channels + # Surface Jacobian check + - filter: BlackList + filter variables: + - name: brightnessTemperature + channels: *amsua_n19_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorSurfJacobianRad + channels: *amsua_n19_channels + options: + sensor: amsua_n19 + channels: *amsua_n19_channels + obserr_demisf: [0.010, 0.020, 0.015, 0.020, 0.200] + obserr_dtempf: [0.500, 2.000, 1.000, 2.000, 4.500] + # Situation dependent Check + - filter: BlackList + filter variables: + - name: brightnessTemperature + channels: *amsua_n19_channels + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorSituDependMW + channels: *amsua_n19_channels + options: + sensor: amsua_n19 + channels: *amsua_n19_channels + clwobs_function: + name: ObsFunction/CLWRetMW + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [ObsValue] + clwbkg_function: + name: ObsFunction/CLWRetMW + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [HofX] + bias_application: HofX + scatobs_function: + name: ObsFunction/SCATRetMW + options: + scatret_ch238: 1 + scatret_ch314: 2 + scatret_ch890: 15 + scatret_types: [ObsValue] + bias_application: HofX + clwmatchidx_function: + name: ObsFunction/CLWMatchIndexMW + channels: *amsua_n19_channels + options: + channels: *amsua_n19_channels + clwobs_function: + name: ObsFunction/CLWRetMW + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [ObsValue] + clwbkg_function: + name: ObsFunction/CLWRetMW + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [HofX] + bias_application: HofX + clwret_clearsky: [0.050, 0.030, 0.030, 0.020, 0.000, + 0.100, 0.000, 0.000, 0.000, 0.000, + 0.000, 0.000, 0.000, 0.000, 0.030] + obserr_function: + name: ObsFunction/ObsErrorModelRamp + channels: *amsua_n19_channels + options: + channels: *amsua_n19_channels + xvar: + name: ObsFunction/CLWRetSymmetricMW + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [ObsValue, HofX] + x0: [ 0.050, 0.030, 0.030, 0.020, 0.000, + 0.100, 0.000, 0.000, 0.000, 0.000, + 0.000, 0.000, 0.000, 0.000, 0.030] + x1: [ 0.600, 0.450, 0.400, 0.450, 1.000, + 1.500, 0.000, 0.000, 0.000, 0.000, + 0.000, 0.000, 0.000, 0.000, 0.200] + err0: [ 2.500, 2.200, 2.000, 0.550, 0.300, + 0.230, 0.230, 0.250, 0.250, 0.350, + 0.400, 0.550, 0.800, 3.000, 3.500] + err1: [20.000, 18.000, 12.000, 3.000, 0.500, + 0.300, 0.230, 0.250, 0.250, 0.350, + 0.400, 0.550, 0.800, 3.000, 18.000] + obserr_clearsky: [2.500, 2.200, 2.000, 0.550, 0.300, + 0.230, 0.230, 0.250, 0.250, 0.350, + 0.400, 0.550, 0.800, 3.000, 3.500] + # Gross check + - filter: Background Check + filter variables: + - name: brightnessTemperature + channels: *amsua_n19_channels + function absolute threshold: + - name: ObsFunction/ObsErrorBoundMW + channels: *amsua_n19_channels + options: + sensor: amsua_n19 + channels: *amsua_n19_channels + obserr_bound_latitude: + name: ObsFunction/ObsErrorFactorLatRad + options: + latitude_parameters: [25.0, 0.25, 0.04, 3.0] + obserr_bound_transmittop: + name: ObsFunction/ObsErrorFactorTransmitTopRad + channels: *amsua_n19_channels + options: + channels: *amsua_n19_channels + obserr_bound_topo: + name: ObsFunction/ObsErrorFactorTopoRad + channels: *amsua_n19_channels + options: + channels: *amsua_n19_channels + sensor: amsua_n19 + obserr_function: + name: ObsFunction/ObsErrorModelRamp + channels: *amsua_n19_channels + options: + channels: *amsua_n19_channels + xvar: + name: ObsFunction/CLWRetSymmetricMW + options: + clwret_ch238: 1 + clwret_ch314: 2 + clwret_types: [ObsValue, HofX] + bias_application: HofX + x0: [ 0.050, 0.030, 0.030, 0.020, 0.000, + 0.100, 0.000, 0.000, 0.000, 0.000, + 0.000, 0.000, 0.000, 0.000, 0.030] + x1: [ 0.600, 0.450, 0.400, 0.450, 1.000, + 1.500, 0.000, 0.000, 0.000, 0.000, + 0.000, 0.000, 0.000, 0.000, 0.200] + err0: [ 2.500, 2.200, 2.000, 0.550, 0.300, + 0.230, 0.230, 0.250, 0.250, 0.350, + 0.400, 0.550, 0.800, 3.000, 3.500] + err1: [20.000, 18.000, 12.000, 3.000, 0.500, + 0.300, 0.230, 0.250, 0.250, 0.350, + 0.400, 0.550, 0.800, 3.000, 18.000] + obserr_bound_max: [4.5, 4.5, 4.5, 2.5, 2.0, + 2.0, 2.0, 2.0, 2.0, 2.0, + 2.5, 3.5, 4.5, 4.5, 4.5] + action: + name: reject + # Inter-channel check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *amsua_n19_channels + test variables: + - name: ObsFunction/InterChannelConsistencyCheck + channels: *amsua_n19_channels + options: + channels: *amsua_n19_channels + sensor: amsua_n19 + use_flag: [ 1, 1, 1, 1, 1, + 1, -1, -1, 1, 1, + 1, 1, 1, -1, 1 ] + maxvalue: 1.0e-12 + action: + name: reject + # Useflag check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *amsua_n19_channels + test variables: + - name: ObsFunction/ChannelUseflagCheckRad + channels: *amsua_n19_channels + options: + sensor: amsua_n19 + channels: *amsua_n19_channels + use_flag: [ 1, 1, 1, 1, 1, + 1, -1, -1, 1, 1, + 1, 1, 1, -1, 1 ] + minvalue: 1.0e-12 + action: + name: reject