From c4ac7af4b4d692701be6b729e240245af286f4cd Mon Sep 17 00:00:00 2001 From: tsga Date: Sat, 31 Jan 2026 12:12:34 +0000 Subject: [PATCH 01/98] add snow ensemble configs --- build.sh | 25 +-- .../snow/snow_background_ensemble.yaml.j2 | 30 +++ .../snow/snow_ensemble_increments_fms.yaml.j2 | 24 +++ ..._ensemble_increments_fms_norestart.yaml.j2 | 4 + .../snow/snow_posterior_output_fms.yaml.j2 | 25 +++ parm/snow/jcb-base.yaml.j2 | 15 +- parm/snow/jcb-prototype_lgetkf.yaml.j2 | 21 ++ .../jcb-prototype_lgetkf_observer.yaml.j2 | 28 +++ parm/snow/jcb-prototype_lgetkf_solver.yaml.j2 | 31 +++ parm/snow/snow_ensda_config.yaml.j2 | 204 ++++++++++++++++++ 10 files changed, 388 insertions(+), 19 deletions(-) create mode 100644 parm/jcb-gdas/model/snow/snow_background_ensemble.yaml.j2 create mode 100644 parm/jcb-gdas/model/snow/snow_ensemble_increments_fms.yaml.j2 create mode 100644 parm/jcb-gdas/model/snow/snow_ensemble_increments_fms_norestart.yaml.j2 create mode 100644 parm/jcb-gdas/model/snow/snow_posterior_output_fms.yaml.j2 create mode 100644 parm/snow/jcb-prototype_lgetkf.yaml.j2 create mode 100644 parm/snow/jcb-prototype_lgetkf_observer.yaml.j2 create mode 100644 parm/snow/jcb-prototype_lgetkf_solver.yaml.j2 create mode 100644 parm/snow/snow_ensda_config.yaml.j2 diff --git a/build.sh b/build.sh index 252a98557..9b173062e 100755 --- a/build.sh +++ b/build.sh @@ -112,18 +112,19 @@ mkdir -p ${BUILD_DIR} && cd ${BUILD_DIR} # Set WORKFLOW_TESTS as CMake option CMAKE_OPTS+=" -DWORKFLOW_TESTS=${WORKFLOW_TESTS:-${WORKFLOW_BUILD}}" -if [[ $BUILD_SOCA == 'ON' ]]; then - if [[ $WORKFLOW_BUILD == 'ON' ]]; then - # Link MOM6 and Icepack in SOCA to submodules in the UFS repo - rm -rf $dir_root/sorc/soca/external/mom6/MOM6 - rm -rf $dir_root/sorc/soca/external/icepack/Icepack - ln -sf $HOMEgfs/sorc/ufs_model.fd/MOM6-interface/MOM6/ $dir_root/sorc/soca/external/mom6/MOM6 - ln -sf $HOMEgfs/sorc/ufs_model.fd/CICE-interface/CICE/icepack/ $dir_root/sorc/soca/external/icepack/Icepack - else - # Delete forked SOCA NOAA-EMC dev/emc repo and clone the original JCSDA develop repo - rm -rf "$dir_root/sorc/soca/" - git clone https://github.com/jcsda/soca "$dir_root/sorc/soca" --recurse-submodules - fi +if [[ $WORKFLOW_BUILD == 'ON' ]]; then + # Link MOM6 and Icepack in SOCA to submodules in the UFS repo + rm -rf $dir_root/sorc/soca/external/mom6/MOM6 + rm -rf $dir_root/sorc/soca/external/icepack/Icepack + ln -sf $HOMEgfs/sorc/ufs_model.fd/MOM6-interface/MOM6/ $dir_root/sorc/soca/external/mom6/MOM6 + ln -sf $HOMEgfs/sorc/ufs_model.fd/CICE-interface/CICE/icepack/ $dir_root/sorc/soca/external/icepack/Icepack +else + # Delete forked SOCA NOAA-EMC dev/emc repo and clone the original JCSDA develop repo + rm -rf "$dir_root/sorc/soca/" + git clone https://github.com/jcsda/soca "$dir_root/sorc/soca" --recurse-submodules + cd "$dir_root/sorc/soca" + git checkout 733ac0177ad0b45e04586f2ead5aa67137da332c + cd ${BUILD_DIR} fi if [[ $BUILD_IODA_CONVERTERS == 'YES' ]]; then diff --git a/parm/jcb-gdas/model/snow/snow_background_ensemble.yaml.j2 b/parm/jcb-gdas/model/snow/snow_background_ensemble.yaml.j2 new file mode 100644 index 000000000..73b1afdab --- /dev/null +++ b/parm/jcb-gdas/model/snow/snow_background_ensemble.yaml.j2 @@ -0,0 +1,30 @@ +datetime: '{{ snow_background_time_iso }}' +members from template: + template: + datetime: '{{ snow_background_time_iso }}' + filetype: fms restart + skip coupler file: true +# provider: ufs + state variables: + - totalSnowDepth + - vtype + - slmsk + - sheleg + - filtered_orography + - fraction_of_ice + - fraction_of_land + - stc + field io names: + totalSnowDepth: snodl + filtered_orography: orog_filt + fraction_of_ice: fice + fraction_of_land: land_frac + datapath: {{ snow_background_ensemble_path }} + filename is datetime templated: true + filename_sfcd: '{{ snow_background_time_fv3 }}.sfc_data.nc' + filename_cplr: '{{ snow_background_time_fv3 }}.coupler.res' + filename_orog: '{{ snow_orog_prefix }}_oro_data.nc' + max allowable geometry difference: 1e-4 + pattern: "{{ snow_ensemble_pattern | default("%mem%", true) }}" + nmembers: {{ snow_number_ensemble_members }} + zero padding: 3 diff --git a/parm/jcb-gdas/model/snow/snow_ensemble_increments_fms.yaml.j2 b/parm/jcb-gdas/model/snow/snow_ensemble_increments_fms.yaml.j2 new file mode 100644 index 000000000..25fd93136 --- /dev/null +++ b/parm/jcb-gdas/model/snow/snow_ensemble_increments_fms.yaml.j2 @@ -0,0 +1,24 @@ +output: + state component: + datapath: ./anl/mem%{member}% + prefix: snowinc + filetype: fms restart + filename_sfcd: '{{ snow_background_time_fv3 }}.sfc_data.nc' + filename_cplr: '{{ snow_background_time_fv3 }}.coupler.res' + state variables: + - totalSnowDepth + - vtype + - slmsk + field io names: + totalSnowDepth: snodl +geometry: + fms initialization: + namelist filename: "{{ snow_fv3jedi_files_path }}/fmsmpp.nml" + field table filename: "{{ snow_fv3jedi_files_path }}/field_table" + akbk: "{{ snow_fv3jedi_files_path }}/akbk.nc4" + layout: + - {{ snow_layout_x }} + - {{ snow_layout_y }} + npx: {{ snow_npx_ges }} + npy: {{ snow_npy_ges }} + npz: {{ snow_npz_ges }} diff --git a/parm/jcb-gdas/model/snow/snow_ensemble_increments_fms_norestart.yaml.j2 b/parm/jcb-gdas/model/snow/snow_ensemble_increments_fms_norestart.yaml.j2 new file mode 100644 index 000000000..f065f10fd --- /dev/null +++ b/parm/jcb-gdas/model/snow/snow_ensemble_increments_fms_norestart.yaml.j2 @@ -0,0 +1,4 @@ +filetype: fms restart +is restart: false +datapath: ./anl/mem%{member}% +filename_nonrestart: cubed_sphere_grid_sfcinc.jedi.nc diff --git a/parm/jcb-gdas/model/snow/snow_posterior_output_fms.yaml.j2 b/parm/jcb-gdas/model/snow/snow_posterior_output_fms.yaml.j2 new file mode 100644 index 000000000..e2dff3304 --- /dev/null +++ b/parm/jcb-gdas/model/snow/snow_posterior_output_fms.yaml.j2 @@ -0,0 +1,25 @@ +output: + state component: + datapath: ./anl + prefix: snow_posterior_ensmean + filetype: fms restart + filename_sfcd: '{{ snow_background_time_fv3 }}.sfc_data.nc' + filename_cplr: '{{ snow_background_time_fv3 }}.coupler.res' + state variables: + - totalSnowDepth + - vtype + - slmsk + field io names: + totalSnowDepth: snodl +geometry: + fms initialization: + namelist filename: "{{ snow_fv3jedi_files_path }}/fmsmpp.nml" + field table filename: "{{ snow_fv3jedi_files_path }}/field_table" + akbk: "{{ snow_fv3jedi_files_path }}/akbk.nc4" + layout: + - {{ snow_layout_x }} + - {{ snow_layout_y }} + npx: {{ snow_npx_ges }} + npy: {{ snow_npy_ges }} + npz: {{ snow_npz_ges }} + diff --git a/parm/snow/jcb-base.yaml.j2 b/parm/snow/jcb-base.yaml.j2 index 1067a721e..f4519d0d0 100644 --- a/parm/snow/jcb-base.yaml.j2 +++ b/parm/snow/jcb-base.yaml.j2 @@ -9,10 +9,12 @@ app_path_observation_chronicle: "{{PARMgfs}}/gdas/jcb-gdas/observation_chronicle # Places where we deviate from the generic file name of a yaml # ------------------------------------------------------------ -final_increment_file: snow_final_increment_fms model_file: model_pseudo initial_condition_file: background # Initial conditions for 4D apps is background - +#jedi_increment_output: gaussian +final_increment_file: snow_final_increment_fms +output_ensemble_increments_file: snow_ensemble_increments_fms +posterior_output_file: snow_posterior_output_fms # Assimilation window # ------------------- @@ -30,7 +32,6 @@ snow_background_time_julian: "{{ bkg_time_julian }}" snow_increment_time_iso: "{{ bkg_time_iso }}" snow_increment_time_fv3: "{{ bkg_time_fv3 }}" - # Analysis standard things # ------------------------ analysis_variables: [totalSnowDepth] @@ -60,12 +61,11 @@ snow_orog_prefix: "{{ CASE }}.mx{{ OCNRES }}" # Background snow_background_path: {{snow_bkg_path}} -background_ensemble_path: ./ens/mem%mem% +background_ensemble_path: ./ens/mem%mem% #TODO: this may not be ncessary +snow_background_ensemble_path: ./bkg/mem%mem% # Background error snow_bump_data_directory: "{{ DATA }}/berror" -number_ensemble_members: {{ NMEM_ENS | default(1, true) }} - snow_background_error_file: "{{BERROR_YAML}}" # Forecasting @@ -105,7 +105,8 @@ snow_obsbiascovout_prefix: "{{APREFIX}}" snow_obsbiascovout_suffix: ".satbias_cov.nc" # Ensemble mean things -snow_number_ensemble_members: {{NMEM_ENS}} +snow_number_ensemble_members: {{NMEM_ENS}} #do we need the below? +number_ensemble_members: {{ NMEM_ENS | default(1, true) }} # Local Ensemble DA (LETKF) # ------------------------- diff --git a/parm/snow/jcb-prototype_lgetkf.yaml.j2 b/parm/snow/jcb-prototype_lgetkf.yaml.j2 new file mode 100644 index 000000000..2a41c0118 --- /dev/null +++ b/parm/snow/jcb-prototype_lgetkf.yaml.j2 @@ -0,0 +1,21 @@ +# Use observations for lgetkf +# --------------------------- +app_path_observations: {{PARMgfs}}/gdas/jcb-gdas/observations/snow +app_path_observation_chronicle: {{PARMgfs}}/gdas/jcb-gdas/observation_chronicle/snow/{{cycle}} +# Algorithm +# --------- +algorithm: local_ensemble_da + +# Model things +# ------------ +snow_background_ensemble_path: ./bkg/mem%mem% + +# Observation things +# ------------------ +{% include OBS_LIST_YAML %} + +# Testing things +# -------------- +{% if DO_TEST_MODE %} +{% include LETKF_JEDI_TEST_YAML %} +{% endif %} diff --git a/parm/snow/jcb-prototype_lgetkf_observer.yaml.j2 b/parm/snow/jcb-prototype_lgetkf_observer.yaml.j2 new file mode 100644 index 000000000..f188fecf1 --- /dev/null +++ b/parm/snow/jcb-prototype_lgetkf_observer.yaml.j2 @@ -0,0 +1,28 @@ +# Use observations for lgetkf +# --------------------------- +app_path_observations: {{PARMgfs}}/gdas/jcb-gdas/observations/atmosphere-lgetkf +app_path_observation_chronicle: {{PARMgfs}}/gdas/jcb-gdas/observation_chronicle/atmosphere + +# Algorithm +# --------- +algorithm: local_ensemble_da_observer + +# Model things +# ------------ +atmosphere_background_ensemble_path: ./bkg/mem%mem% + +# Naming conventions for observation files +atmosphere_obsdataout_prefix: diag_lobs_ + +# Distribution type +distribution_type: RoundRobin + +# Observation things +# ------------------ +{% include OBS_LIST_YAML %} + +# Testing things +# -------------- +{% if DO_TEST_MODE %} +{% include OBS_JEDI_TEST_YAML %} +{% endif %} diff --git a/parm/snow/jcb-prototype_lgetkf_solver.yaml.j2 b/parm/snow/jcb-prototype_lgetkf_solver.yaml.j2 new file mode 100644 index 000000000..abd0022dd --- /dev/null +++ b/parm/snow/jcb-prototype_lgetkf_solver.yaml.j2 @@ -0,0 +1,31 @@ +# Use observations for lgetkf +# --------------------------- +app_path_observations: {{PARMgfs}}/gdas/jcb-gdas/observations/atmosphere-lgetkf +app_path_observation_chronicle: {{PARMgfs}}/gdas/jcb-gdas/observation_chronicle/atmosphere + +# Algorithm +# --------- +algorithm: local_ensemble_da_solver + +# Model things +# ------------ +atmosphere_background_ensemble_path: ./bkg/mem%mem% + +# Naming conventions for observation files +atmosphere_obsdatain_path: "{{DATA}}/diags" +atmosphere_obsdatain_prefix: diag_lobs_ +atmosphere_obsdatain_suffix: "_{{ current_cycle | to_YMDH }}.nc" +atmosphere_obsdataout_prefix: diag_solv_ + +# Distribution type +distribution_type: Halo + +# Observation things +# ------------------ +{% include OBS_LIST_YAML %} + +# Testing things +# -------------- +{% if DO_TEST_MODE %} +{% include SOL_JEDI_TEST_YAML %} +{% endif %} diff --git a/parm/snow/snow_ensda_config.yaml.j2 b/parm/snow/snow_ensda_config.yaml.j2 new file mode 100644 index 000000000..86014387f --- /dev/null +++ b/parm/snow/snow_ensda_config.yaml.j2 @@ -0,0 +1,204 @@ +jedi_config: + snowensanlobs: + rundir: '{{ DATA }}' + exe_src: '{{ EXECgfs }}/gdas.x' + mpi_cmd: '{{ APRUN_SNOWENSANLOBS }}' + jedi_args: ['fv3jedi', 'localensembleda'] + jcb_base_yaml: '{{ PARMgfs }}/gdas/snow/jcb-base.yaml.j2' + jcb_algo_yaml: '{{ PARMgfs }}/gdas/snow/jcb-prototype_lgetkf_observer.yaml.j2' + obs_list_yaml: '{{ OBS_LIST_YAML }}' + snowensanlsol: + rundir: '{{ DATA }}' + exe_src: '{{ EXECgfs }}/gdas.x' + mpi_cmd: '{{ APRUN_SNOWENSANLSOL }}' + jedi_args: ['fv3jedi', 'localensembleda'] + jcb_base_yaml: '{{ PARMgfs }}/gdas/snow/jcb-base.yaml.j2' + jcb_algo_yaml: '{{ PARMgfs }}/gdas/snow/jcb-prototype_lgetkf_solver.yaml.j2' + obs_list_yaml: '{{ OBS_LIST_YAML }}' + snowensanlletkf: + rundir: '{{ DATA }}' + exe_src: '{{ EXECgfs }}/gdas.x' + mpi_cmd: '{{ APRUN_SNOWENSANLLETKF }}' + jedi_args: ['fv3jedi', 'localensembleda'] + jcb_base_yaml: '{{ PARMgfs }}/gdas/snow/jcb-base.yaml.j2' +#TODO: 'TESTING' clause here not ported jcb_algo_yaml: '{{ PARMgfs }}/gdas/snow/jcb-prototype_lgetkf.yaml.j2' + jcb_algo: 'local_ensemble_da' + obs_list_yaml: '{{ OBS_LIST_YAML }}' + scf_to_ioda: + rundir: '{{ DATA }}' + exe_src: '{{ EXECgfs }}/gdas_fv3jedi_scf_to_ioda.x' + mpi_cmd: '{{ APRUN_SNOWANL }}' + jcb_algo: 'snow_ims_scf_preprocess' + jcb_base_yaml: '{{ PARMgfs }}/gdas/snow/jcb-base.yaml.j2' +# snowensanlfv3inc: +# rundir: '{{ DATA }}' +# exe_src: '{{ EXECgfs }}/gdas_fv3jedi_fv3inc.x' +# mpi_cmd: '{{ APRUN_SNOWENSANLFV3INC }}' +# jcb_algo: 'fv3jedi_fv3inc_lgetkf' +# jcb_base_yaml: '{{ PARMgfs }}/gdas/snow/jcb-base.yaml.j2' +# snowanladdinc: +# rundir: '{{ DATA }}' +# exe_src: '{{ EXECgdas }}/fv3jedi_addincrement.x' +# mpi_cmd: '{{ APRUN_SNOW_ADDINC }}' +# jcb_base_yaml: '{{ PARMgdas }}/snow/jcb-base.yaml.j2' +# jcb_algo: snow_addincrement + +data_in: + mkdir: + - '{{ DATA }}/bkg' + - '{{ DATA }}/anl' + - '{{ DATA }}/bkg/ensmean' + - '{{ DATA }}/anl/ensmean' +{% for mem in range(1, NMEM_ENS + 1) %} + - '{{ DATA }}/bkg/mem{{ '%03d' % mem }}' + - '{{ DATA }}/anl/mem{{ '%03d' % mem }}' +{% endfor %} + - '{{ DATA }}/orog/ens' + - '{{ DATA }}/fv3jedi' + - '{{ DATA }}/berror' + + copy_req: +{% for mem in range(1, NMEM_ENS + 1) %} + {% set gmem = mem+mem_offset %} + {% if gmem > NMEM_ENS_MAX %} + {% set gmem = gmem-NMEM_ENS_MAX %} + {% endif %} + # define variables + # copy coupler file + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.coupler.res', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + # we need to copy them to two places, one serves as the basis for the analysis + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + {% if DOIAU %} + # if using IAU, also need backgrounds copied at the beginning of the window + # we need to copy them to two places, one serves as the basis for the analysis + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + {% endif %} +{% endfor %} + +{% filter indent(width=4) %} +{% include 'snow_stage_jedi_fix.yaml.j2' %} +{% include 'snow_stage_berror.yaml.j2' %} +{% include 'snow_stage_bufr2ioda_mapping.yaml.j2' %} +{% endfilter %} + + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}_mosaic.nc', '{{ DATA }}/orog/ens/'] + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}_grid.tile1.nc', '{{ DATA }}/orog/ens/'] + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}_grid.tile2.nc', '{{ DATA }}/orog/ens/'] + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}_grid.tile3.nc', '{{ DATA }}/orog/ens/'] + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}_grid.tile4.nc', '{{ DATA }}/orog/ens/'] + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}_grid.tile5.nc', '{{ DATA }}/orog/ens/'] + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}_grid.tile6.nc', '{{ DATA }}/orog/ens/'] + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile1.nc', '{{ DATA }}/orog/ens/' ] + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile2.nc', '{{ DATA }}/orog/ens/' ] + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile3.nc', '{{ DATA }}/orog/ens/' ] + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile4.nc', '{{ DATA }}/orog/ens/' ] + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile5.nc', '{{ DATA }}/orog/ens/' ] + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile6.nc', '{{ DATA }}/orog/ens/' ] + + link_req: +{% for imem in range(1, NMEM_ENS+1) %} + {% set memchar = 'mem%03d' | format(imem) %} + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_mosaic.nc', '{{ DATA }}/bkg/{{ memchar }}/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile1.nc', '{{ DATA }}/bkg/{{ memchar }}/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile2.nc', '{{ DATA }}/bkg/{{ memchar }}/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile3.nc', '{{ DATA }}/bkg/{{ memchar }}/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile4.nc', '{{ DATA }}/bkg/{{ memchar }}/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile5.nc', '{{ DATA }}/bkg/{{ memchar }}/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile6.nc', '{{ DATA }}/bkg/{{ memchar }}/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile1.nc', '{{ DATA }}/bkg/{{ memchar }}/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile2.nc', '{{ DATA }}/bkg/{{ memchar }}/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile3.nc', '{{ DATA }}/bkg/{{ memchar }}/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile4.nc', '{{ DATA }}/bkg/{{ memchar }}/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile5.nc', '{{ DATA }}/bkg/{{ memchar }}/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile6.nc', '{{ DATA }}/bkg/{{ memchar }}/'] +{% endfor %} + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_mosaic.nc', '{{ DATA }}/bkg/ensmean/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile1.nc', '{{ DATA }}/bkg/ensmean/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile2.nc', '{{ DATA }}/bkg/ensmean/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile3.nc', '{{ DATA }}/bkg/ensmean/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile4.nc', '{{ DATA }}/bkg/ensmean/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile5.nc', '{{ DATA }}/bkg/ensmean/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile6.nc', '{{ DATA }}/bkg/ensmean/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile1.nc', '{{ DATA }}/bkg/ensmean/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile2.nc', '{{ DATA }}/bkg/ensmean/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile3.nc', '{{ DATA }}/bkg/ensmean/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile4.nc', '{{ DATA }}/bkg/ensmean/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile5.nc', '{{ DATA }}/bkg/ensmean/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile6.nc', '{{ DATA }}/bkg/ensmean/'] + + copy_opt: +{% filter indent(width=4) %} +{% if DO_IMS_SCF %} +{% include 'snow_stage_ims_scf2ioda.yaml.j2' %} +{% endif %} +{% endfilter %} + +data_out: + copy_req: + # Configuration files + - ['{{ DATA }}/snowanlvar.yaml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}snowanlvar.yaml'] + - ['{{ DATA }}/esnowanlensmean.yaml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}esnowanlensmean.yaml'] +{% if DO_IMS_SCF %} + - ['{{ DATA }}/scf_to_ioda.yaml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}scf_to_ioda.yaml'] +{% endif %} + +{% if DOIAU %} + {% set bkgtimes = [ current_cycle, WINDOW_BEGIN ] %} +{% else %} + {% set bkgtimes = [ current_cycle ] %} +{% endif %} +{% for bkgtime in bkgtimes %} + {% for imem in range(1, NMEM_ENS+1) %} + {% set memchar = 'mem%03d' | format(imem) %} + # Analysis + - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc', + '{{ COMOUT_SNOW_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.snow_analysis.sfc_data.tile1.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc', + '{{ COMOUT_SNOW_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.snow_analysis.sfc_data.tile2.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc', + '{{ COMOUT_SNOW_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.snow_analysis.sfc_data.tile3.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc', + '{{ COMOUT_SNOW_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.snow_analysis.sfc_data.tile4.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc', + '{{ COMOUT_SNOW_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.snow_analysis.sfc_data.tile5.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', + '{{ COMOUT_SNOW_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.snow_analysis.sfc_data.tile6.nc'] + + # Increments + - ['{{ DATA }}/anl/{{ memchar }}/snowinc.{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc', + '{{ COMOUT_SNOW_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.snow_increment.sfc_data.tile1.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/snowinc.{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc', + '{{ COMOUT_SNOW_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.snow_increment.sfc_data.tile2.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/snowinc.{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc', + '{{ COMOUT_SNOW_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.snow_increment.sfc_data.tile3.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/snowinc.{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc', + '{{ COMOUT_SNOW_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.snow_increment.sfc_data.tile4.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/snowinc.{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc', + '{{ COMOUT_SNOW_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.snow_increment.sfc_data.tile5.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/snowinc.{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', + '{{ COMOUT_SNOW_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.snow_increment.sfc_data.tile6.nc'] + + {% endfor %} +{% endfor %} From 98042761591bc8d46cf884240b05f1a26d9071e9 Mon Sep 17 00:00:00 2001 From: tsga Date: Sat, 31 Jan 2026 13:02:04 +0000 Subject: [PATCH 02/98] fix bkg and ens inc --- .../snow/snow_background_ensemble.yaml.j2 | 2 +- .../snow/snow_ensemble_increments_fms.yaml.j2 | 35 ++++++------------- .../jcb-prototype_lgetkf_observer.yaml.j2 | 4 +-- parm/snow/jcb-prototype_lgetkf_solver.yaml.j2 | 12 +++---- 4 files changed, 20 insertions(+), 33 deletions(-) diff --git a/parm/jcb-gdas/model/snow/snow_background_ensemble.yaml.j2 b/parm/jcb-gdas/model/snow/snow_background_ensemble.yaml.j2 index 73b1afdab..f0ad26f11 100644 --- a/parm/jcb-gdas/model/snow/snow_background_ensemble.yaml.j2 +++ b/parm/jcb-gdas/model/snow/snow_background_ensemble.yaml.j2 @@ -1,4 +1,4 @@ -datetime: '{{ snow_background_time_iso }}' +#datetime: '{{ snow_background_time_iso }}' members from template: template: datetime: '{{ snow_background_time_iso }}' diff --git a/parm/jcb-gdas/model/snow/snow_ensemble_increments_fms.yaml.j2 b/parm/jcb-gdas/model/snow/snow_ensemble_increments_fms.yaml.j2 index 25fd93136..f0e28b9b7 100644 --- a/parm/jcb-gdas/model/snow/snow_ensemble_increments_fms.yaml.j2 +++ b/parm/jcb-gdas/model/snow/snow_ensemble_increments_fms.yaml.j2 @@ -1,24 +1,11 @@ -output: - state component: - datapath: ./anl/mem%{member}% - prefix: snowinc - filetype: fms restart - filename_sfcd: '{{ snow_background_time_fv3 }}.sfc_data.nc' - filename_cplr: '{{ snow_background_time_fv3 }}.coupler.res' - state variables: - - totalSnowDepth - - vtype - - slmsk - field io names: - totalSnowDepth: snodl -geometry: - fms initialization: - namelist filename: "{{ snow_fv3jedi_files_path }}/fmsmpp.nml" - field table filename: "{{ snow_fv3jedi_files_path }}/field_table" - akbk: "{{ snow_fv3jedi_files_path }}/akbk.nc4" - layout: - - {{ snow_layout_x }} - - {{ snow_layout_y }} - npx: {{ snow_npx_ges }} - npy: {{ snow_npy_ges }} - npz: {{ snow_npz_ges }} +datapath: ./anl/mem%{member}% +prefix: snowinc +filetype: fms restart +filename_sfcd: '{{ snow_background_time_fv3 }}.sfc_data.nc' +filename_cplr: '{{ snow_background_time_fv3 }}.coupler.res' +state variables: +- totalSnowDepth +- vtype +- slmsk +field io names: + totalSnowDepth: snodl diff --git a/parm/snow/jcb-prototype_lgetkf_observer.yaml.j2 b/parm/snow/jcb-prototype_lgetkf_observer.yaml.j2 index f188fecf1..5883a56f2 100644 --- a/parm/snow/jcb-prototype_lgetkf_observer.yaml.j2 +++ b/parm/snow/jcb-prototype_lgetkf_observer.yaml.j2 @@ -1,7 +1,7 @@ # Use observations for lgetkf # --------------------------- -app_path_observations: {{PARMgfs}}/gdas/jcb-gdas/observations/atmosphere-lgetkf -app_path_observation_chronicle: {{PARMgfs}}/gdas/jcb-gdas/observation_chronicle/atmosphere +app_path_observations: {{PARMgfs}}/gdas/jcb-gdas/observations/snow +app_path_observation_chronicle: {{PARMgfs}}/gdas/jcb-gdas/observation_chronicle/snow/{{cycle}} # Algorithm # --------- diff --git a/parm/snow/jcb-prototype_lgetkf_solver.yaml.j2 b/parm/snow/jcb-prototype_lgetkf_solver.yaml.j2 index abd0022dd..d4cc92ae0 100644 --- a/parm/snow/jcb-prototype_lgetkf_solver.yaml.j2 +++ b/parm/snow/jcb-prototype_lgetkf_solver.yaml.j2 @@ -1,7 +1,7 @@ # Use observations for lgetkf # --------------------------- -app_path_observations: {{PARMgfs}}/gdas/jcb-gdas/observations/atmosphere-lgetkf -app_path_observation_chronicle: {{PARMgfs}}/gdas/jcb-gdas/observation_chronicle/atmosphere +app_path_observations: {{PARMgfs}}/gdas/jcb-gdas/observations/snow +app_path_observation_chronicle: {{PARMgfs}}/gdas/jcb-gdas/observation_chronicle/snow/{{cycle}} # Algorithm # --------- @@ -12,10 +12,10 @@ algorithm: local_ensemble_da_solver atmosphere_background_ensemble_path: ./bkg/mem%mem% # Naming conventions for observation files -atmosphere_obsdatain_path: "{{DATA}}/diags" -atmosphere_obsdatain_prefix: diag_lobs_ -atmosphere_obsdatain_suffix: "_{{ current_cycle | to_YMDH }}.nc" -atmosphere_obsdataout_prefix: diag_solv_ +snow_obsdatain_path: "{{DATA}}/diags" +snow_obsdatain_prefix: diag_lobs_ +snow_obsdatain_suffix: "_{{ current_cycle | to_YMDH }}.nc" +snow_obsdataout_prefix: diag_solv_ # Distribution type distribution_type: Halo From 822059c93a878edc5017ffa3551236ce44f931b9 Mon Sep 17 00:00:00 2001 From: tsga Date: Sat, 31 Jan 2026 14:09:50 +0000 Subject: [PATCH 03/98] add snow obs localization for letkf --- .../snow_ensemblemean_increment_fms.yaml.j2 | 11 ++++++ parm/snow/jcb-base.yaml.j2 | 12 ++++--- parm/snow/jcb-prototype_lgetkf.yaml.j2 | 4 +++ .../snow_ens_obs_dist_localizations.yaml.j2 | 21 +++++++++++ parm/snow/snow_ensda_config.yaml.j2 | 36 ++++++++++--------- 5 files changed, 63 insertions(+), 21 deletions(-) create mode 100644 parm/jcb-gdas/model/snow/snow_ensemblemean_increment_fms.yaml.j2 create mode 100644 parm/snow/snow_ens_obs_dist_localizations.yaml.j2 diff --git a/parm/jcb-gdas/model/snow/snow_ensemblemean_increment_fms.yaml.j2 b/parm/jcb-gdas/model/snow/snow_ensemblemean_increment_fms.yaml.j2 new file mode 100644 index 000000000..3b17737c6 --- /dev/null +++ b/parm/jcb-gdas/model/snow/snow_ensemblemean_increment_fms.yaml.j2 @@ -0,0 +1,11 @@ +datapath: ./anl/mem%{member}% +prefix: snowinc_ensmean +filetype: fms restart +filename_sfcd: '{{ snow_background_time_fv3 }}.sfc_data.nc' +filename_cplr: '{{ snow_background_time_fv3 }}.coupler.res' +state variables: +- totalSnowDepth +- vtype +- slmsk +field io names: + totalSnowDepth: snodl diff --git a/parm/snow/jcb-base.yaml.j2 b/parm/snow/jcb-base.yaml.j2 index f4519d0d0..b05fc15de 100644 --- a/parm/snow/jcb-base.yaml.j2 +++ b/parm/snow/jcb-base.yaml.j2 @@ -112,7 +112,7 @@ number_ensemble_members: {{ NMEM_ENS | default(1, true) }} # ------------------------- local_ensemble_da_solver: Deterministic GETKF -increment_variables: [ua,va,DZ,delp,t,ps,sphum,ice_wat,liq_wat,o3mr] +increment_variables: [totalSnowDepth,vtype,slmsk] #[ua,va,DZ,delp,t,ps,sphum,ice_wat,liq_wat,o3mr] # Veritcal localization for GETKF vl_fraction_of_retained_variance: 0.750 @@ -124,11 +124,15 @@ inflation_mult: 1.0 # Driver driver_update_obs_config_with_geometry_info: true -driver_save_posterior_mean: false -driver_save_posterior_ensemble: false +driver_save_posterior_mean: true +driver_save_posterior_ensemble: true driver_save_prior_mean: false -driver_save_posterior_mean_increment: false +driver_save_posterior_mean_increment: true driver_save_posterior_ensemble_increments: true +driver_save_prior_variance: true +driver_save_posterior_variance: true +driver_do_posterior_observer: true +driver_use_control_member: false # Diagnostics ensemble_increment_prefix: "./anl/mem%{member}%/snowinc." diff --git a/parm/snow/jcb-prototype_lgetkf.yaml.j2 b/parm/snow/jcb-prototype_lgetkf.yaml.j2 index 2a41c0118..f84e9feb1 100644 --- a/parm/snow/jcb-prototype_lgetkf.yaml.j2 +++ b/parm/snow/jcb-prototype_lgetkf.yaml.j2 @@ -14,6 +14,10 @@ snow_background_ensemble_path: ./bkg/mem%mem% # ------------------ {% include OBS_LIST_YAML %} +# Observation distribution and localization +{% set distribution_type = "Halo" %} +{% include 'snow_ens_obs_dist_localizations.yaml.j2' %} + # Testing things # -------------- {% if DO_TEST_MODE %} diff --git a/parm/snow/snow_ens_obs_dist_localizations.yaml.j2 b/parm/snow/snow_ens_obs_dist_localizations.yaml.j2 new file mode 100644 index 000000000..8d8f7c092 --- /dev/null +++ b/parm/snow/snow_ens_obs_dist_localizations.yaml.j2 @@ -0,0 +1,21 @@ +obs_distribution_localizations: + obs_distribution: + name: {{ distribution_type }} + halo size: 250e3 + obs_localizations: + - localization method: Horizontal Box car + lengthscale: 250e3 + max nobs: 50 + +override_obs_distribution_localizations: + override: false + ims_snow: + obs_distribution: + name: {{ distribution_type }} + halo size: 250e3 + obs_localizations: + - localization method: Horizontal SOAR + lengthscale: 250e3 + soar horizontal decay: 0.000021 +#assuming one obs every 40 Km + max nobs: 6 diff --git a/parm/snow/snow_ensda_config.yaml.j2 b/parm/snow/snow_ensda_config.yaml.j2 index 86014387f..8d6fda6e3 100644 --- a/parm/snow/snow_ensda_config.yaml.j2 +++ b/parm/snow/snow_ensda_config.yaml.j2 @@ -1,27 +1,12 @@ jedi_config: - snowensanlobs: - rundir: '{{ DATA }}' - exe_src: '{{ EXECgfs }}/gdas.x' - mpi_cmd: '{{ APRUN_SNOWENSANLOBS }}' - jedi_args: ['fv3jedi', 'localensembleda'] - jcb_base_yaml: '{{ PARMgfs }}/gdas/snow/jcb-base.yaml.j2' - jcb_algo_yaml: '{{ PARMgfs }}/gdas/snow/jcb-prototype_lgetkf_observer.yaml.j2' - obs_list_yaml: '{{ OBS_LIST_YAML }}' - snowensanlsol: - rundir: '{{ DATA }}' - exe_src: '{{ EXECgfs }}/gdas.x' - mpi_cmd: '{{ APRUN_SNOWENSANLSOL }}' - jedi_args: ['fv3jedi', 'localensembleda'] - jcb_base_yaml: '{{ PARMgfs }}/gdas/snow/jcb-base.yaml.j2' - jcb_algo_yaml: '{{ PARMgfs }}/gdas/snow/jcb-prototype_lgetkf_solver.yaml.j2' - obs_list_yaml: '{{ OBS_LIST_YAML }}' snowensanlletkf: rundir: '{{ DATA }}' exe_src: '{{ EXECgfs }}/gdas.x' mpi_cmd: '{{ APRUN_SNOWENSANLLETKF }}' jedi_args: ['fv3jedi', 'localensembleda'] jcb_base_yaml: '{{ PARMgfs }}/gdas/snow/jcb-base.yaml.j2' -#TODO: 'TESTING' clause here not ported jcb_algo_yaml: '{{ PARMgfs }}/gdas/snow/jcb-prototype_lgetkf.yaml.j2' +#TODO: handle 'TESTING' clause in prototype and then don't need it? + jcb_algo_yaml: '{{ PARMgfs }}/gdas/snow/jcb-prototype_lgetkf.yaml.j2' jcb_algo: 'local_ensemble_da' obs_list_yaml: '{{ OBS_LIST_YAML }}' scf_to_ioda: @@ -30,6 +15,23 @@ jedi_config: mpi_cmd: '{{ APRUN_SNOWANL }}' jcb_algo: 'snow_ims_scf_preprocess' jcb_base_yaml: '{{ PARMgfs }}/gdas/snow/jcb-base.yaml.j2' +# snowensanlobs: +# rundir: '{{ DATA }}' +# exe_src: '{{ EXECgfs }}/gdas.x' +# mpi_cmd: '{{ APRUN_SNOWENSANLOBS }}' +# jedi_args: ['fv3jedi', 'localensembleda'] +# jcb_base_yaml: '{{ PARMgfs }}/gdas/snow/jcb-base.yaml.j2' +# jcb_algo_yaml: '{{ PARMgfs }}/gdas/snow/jcb-prototype_lgetkf_observer.yaml.j2' +# obs_list_yaml: '{{ OBS_LIST_YAML }}' +# snowensanlsol: +# rundir: '{{ DATA }}' +# exe_src: '{{ EXECgfs }}/gdas.x' +# mpi_cmd: '{{ APRUN_SNOWENSANLSOL }}' +# jedi_args: ['fv3jedi', 'localensembleda'] +# jcb_base_yaml: '{{ PARMgfs }}/gdas/snow/jcb-base.yaml.j2' +# jcb_algo_yaml: '{{ PARMgfs }}/gdas/snow/jcb-prototype_lgetkf_solver.yaml.j2' +# obs_list_yaml: '{{ OBS_LIST_YAML }}' + # snowensanlfv3inc: # rundir: '{{ DATA }}' # exe_src: '{{ EXECgfs }}/gdas_fv3jedi_fv3inc.x' From d3e587a97b12ef49542ba33d9c791799a34fccca Mon Sep 17 00:00:00 2001 From: tsga Date: Sat, 31 Jan 2026 19:53:47 +0000 Subject: [PATCH 04/98] add all letkf output templates --- ...rest_snow_ensemble_increments_fms.yaml.j2} | 0 .../snow/snow_output_increment_fms.yaml.j2 | 11 ++++++ .../snow/snow_output_mean_prior_fms.yaml | 11 ++++++ ...snow_output_variance_posterior_fms.yaml.j2 | 11 ++++++ .../snow_output_variance_prior_fms.yaml.j2 | 11 ++++++ .../snow/snow_posterior_output_fms.yaml.j2 | 36 ++++++------------- parm/snow/jcb-base.yaml.j2 | 20 ++++++----- 7 files changed, 66 insertions(+), 34 deletions(-) rename parm/jcb-gdas/model/snow/{snow_ensemble_increments_fms_norestart.yaml.j2 => norest_snow_ensemble_increments_fms.yaml.j2} (100%) create mode 100644 parm/jcb-gdas/model/snow/snow_output_increment_fms.yaml.j2 create mode 100644 parm/jcb-gdas/model/snow/snow_output_mean_prior_fms.yaml create mode 100644 parm/jcb-gdas/model/snow/snow_output_variance_posterior_fms.yaml.j2 create mode 100644 parm/jcb-gdas/model/snow/snow_output_variance_prior_fms.yaml.j2 diff --git a/parm/jcb-gdas/model/snow/snow_ensemble_increments_fms_norestart.yaml.j2 b/parm/jcb-gdas/model/snow/norest_snow_ensemble_increments_fms.yaml.j2 similarity index 100% rename from parm/jcb-gdas/model/snow/snow_ensemble_increments_fms_norestart.yaml.j2 rename to parm/jcb-gdas/model/snow/norest_snow_ensemble_increments_fms.yaml.j2 diff --git a/parm/jcb-gdas/model/snow/snow_output_increment_fms.yaml.j2 b/parm/jcb-gdas/model/snow/snow_output_increment_fms.yaml.j2 new file mode 100644 index 000000000..3b17737c6 --- /dev/null +++ b/parm/jcb-gdas/model/snow/snow_output_increment_fms.yaml.j2 @@ -0,0 +1,11 @@ +datapath: ./anl/mem%{member}% +prefix: snowinc_ensmean +filetype: fms restart +filename_sfcd: '{{ snow_background_time_fv3 }}.sfc_data.nc' +filename_cplr: '{{ snow_background_time_fv3 }}.coupler.res' +state variables: +- totalSnowDepth +- vtype +- slmsk +field io names: + totalSnowDepth: snodl diff --git a/parm/jcb-gdas/model/snow/snow_output_mean_prior_fms.yaml b/parm/jcb-gdas/model/snow/snow_output_mean_prior_fms.yaml new file mode 100644 index 000000000..d8d819758 --- /dev/null +++ b/parm/jcb-gdas/model/snow/snow_output_mean_prior_fms.yaml @@ -0,0 +1,11 @@ +datapath: ./anl/mem%{member}% +prefix: snow_ensmean_prior +filetype: fms restart +filename_sfcd: '{{ snow_background_time_fv3 }}.sfc_data.nc' +filename_cplr: '{{ snow_background_time_fv3 }}.coupler.res' +state variables: +- totalSnowDepth +- vtype +- slmsk +field io names: + totalSnowDepth: snodl diff --git a/parm/jcb-gdas/model/snow/snow_output_variance_posterior_fms.yaml.j2 b/parm/jcb-gdas/model/snow/snow_output_variance_posterior_fms.yaml.j2 new file mode 100644 index 000000000..fcf72e3d4 --- /dev/null +++ b/parm/jcb-gdas/model/snow/snow_output_variance_posterior_fms.yaml.j2 @@ -0,0 +1,11 @@ +datapath: ./anl/mem%{member}% +prefix: snow_ensvariance_posterior +filetype: fms restart +filename_sfcd: '{{ snow_background_time_fv3 }}.sfc_data.nc' +filename_cplr: '{{ snow_background_time_fv3 }}.coupler.res' +state variables: +- totalSnowDepth +- vtype +- slmsk +field io names: + totalSnowDepth: snodl diff --git a/parm/jcb-gdas/model/snow/snow_output_variance_prior_fms.yaml.j2 b/parm/jcb-gdas/model/snow/snow_output_variance_prior_fms.yaml.j2 new file mode 100644 index 000000000..1e9a45223 --- /dev/null +++ b/parm/jcb-gdas/model/snow/snow_output_variance_prior_fms.yaml.j2 @@ -0,0 +1,11 @@ +datapath: ./anl/mem%{member}% +prefix: snow_ensvariance_prior +filetype: fms restart +filename_sfcd: '{{ snow_background_time_fv3 }}.sfc_data.nc' +filename_cplr: '{{ snow_background_time_fv3 }}.coupler.res' +state variables: +- totalSnowDepth +- vtype +- slmsk +field io names: + totalSnowDepth: snodl diff --git a/parm/jcb-gdas/model/snow/snow_posterior_output_fms.yaml.j2 b/parm/jcb-gdas/model/snow/snow_posterior_output_fms.yaml.j2 index e2dff3304..01ef42626 100644 --- a/parm/jcb-gdas/model/snow/snow_posterior_output_fms.yaml.j2 +++ b/parm/jcb-gdas/model/snow/snow_posterior_output_fms.yaml.j2 @@ -1,25 +1,11 @@ -output: - state component: - datapath: ./anl - prefix: snow_posterior_ensmean - filetype: fms restart - filename_sfcd: '{{ snow_background_time_fv3 }}.sfc_data.nc' - filename_cplr: '{{ snow_background_time_fv3 }}.coupler.res' - state variables: - - totalSnowDepth - - vtype - - slmsk - field io names: - totalSnowDepth: snodl -geometry: - fms initialization: - namelist filename: "{{ snow_fv3jedi_files_path }}/fmsmpp.nml" - field table filename: "{{ snow_fv3jedi_files_path }}/field_table" - akbk: "{{ snow_fv3jedi_files_path }}/akbk.nc4" - layout: - - {{ snow_layout_x }} - - {{ snow_layout_y }} - npx: {{ snow_npx_ges }} - npy: {{ snow_npy_ges }} - npz: {{ snow_npz_ges }} - +datapath: ./anl/mem%{member}% +prefix: snow_ens_anl +filetype: fms restart +filename_sfcd: '{{ snow_background_time_fv3 }}.sfc_data.nc' +filename_cplr: '{{ snow_background_time_fv3 }}.coupler.res' +state variables: +- totalSnowDepth +- vtype +- slmsk +field io names: + totalSnowDepth: snodl diff --git a/parm/snow/jcb-base.yaml.j2 b/parm/snow/jcb-base.yaml.j2 index b05fc15de..6be45e8c4 100644 --- a/parm/snow/jcb-base.yaml.j2 +++ b/parm/snow/jcb-base.yaml.j2 @@ -11,10 +11,11 @@ app_path_observation_chronicle: "{{PARMgfs}}/gdas/jcb-gdas/observation_chronicle # ------------------------------------------------------------ model_file: model_pseudo initial_condition_file: background # Initial conditions for 4D apps is background -#jedi_increment_output: gaussian final_increment_file: snow_final_increment_fms -output_ensemble_increments_file: snow_ensemble_increments_fms posterior_output_file: snow_posterior_output_fms +#output_ensemble_increments_file: snow_ensemble_increments_fms +#output_increment_file: snow_ensemblemean_increment_fms.yaml.j2 snow_output_increment_fms.yaml.j2 +#jedi_increment_output: gaussian # Assimilation window # ------------------- @@ -61,7 +62,7 @@ snow_orog_prefix: "{{ CASE }}.mx{{ OCNRES }}" # Background snow_background_path: {{snow_bkg_path}} -background_ensemble_path: ./ens/mem%mem% #TODO: this may not be ncessary +#background_ensemble_path: ./ens/mem%mem% #TODO: this may not be ncessary snow_background_ensemble_path: ./bkg/mem%mem% # Background error @@ -105,8 +106,8 @@ snow_obsbiascovout_prefix: "{{APREFIX}}" snow_obsbiascovout_suffix: ".satbias_cov.nc" # Ensemble mean things -snow_number_ensemble_members: {{NMEM_ENS}} #do we need the below? -number_ensemble_members: {{ NMEM_ENS | default(1, true) }} +snow_number_ensemble_members: {{NMEM_ENS | default(1, true) }} #do we need the one below? +#number_ensemble_members: {{ NMEM_ENS | default(1, true) }} # Local Ensemble DA (LETKF) # ------------------------- @@ -126,14 +127,15 @@ inflation_mult: 1.0 driver_update_obs_config_with_geometry_info: true driver_save_posterior_mean: true driver_save_posterior_ensemble: true -driver_save_prior_mean: false driver_save_posterior_mean_increment: true driver_save_posterior_ensemble_increments: true driver_save_prior_variance: true driver_save_posterior_variance: true -driver_do_posterior_observer: true -driver_use_control_member: false +#default driver_save_prior_mean: false +#driver_do_test_prints: false (default true) +#default driver_do_posterior_observer: true +#default driver_use_control_member: false # Diagnostics -ensemble_increment_prefix: "./anl/mem%{member}%/snowinc." +#ensemble_increment_prefix: "./anl/mem%{member}%/snowinc." #posterior_output_gaussian: "./mem%{member}%/snowanl." From 8bb80ed1a34b08f87cfcb7f49cf212f27b307580 Mon Sep 17 00:00:00 2001 From: tsga Date: Mon, 2 Feb 2026 12:27:17 +0000 Subject: [PATCH 05/98] temporary to fix to localization --- .../observations/snow/ghcn_snow.yaml.j2 | 11 ++++++++- parm/snow/ens_apply_incr_nml.j2 | 2 +- parm/snow/jcb-base.yaml.j2 | 6 +++-- parm/snow/jcb-prototype_lgetkf.yaml.j2 | 6 ++++- .../snow_ens_obs_dist_localizations.yaml.j2 | 24 +++++++++---------- parm/snow/snow_ensda_config.yaml.j2 | 11 +++++---- 6 files changed, 39 insertions(+), 21 deletions(-) diff --git a/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 b/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 index 4ad6a7444..23828b6e8 100644 --- a/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 +++ b/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 @@ -4,6 +4,9 @@ # ----------------------- obs space: name: {{observation_from_jcb}} + distribution: + name: Halo + halo size: 250e3 obsdatain: engine: type: H5File @@ -20,7 +23,13 @@ # -------------------- obs operator: name: Identity - # + + # localization + # ------------ + obs localizations: + - localization method: Horizontal Box car + lengthscale: 250e3 + max nobs: 50 # Observation Filters (QC) # ------------------------ diff --git a/parm/snow/ens_apply_incr_nml.j2 b/parm/snow/ens_apply_incr_nml.j2 index 36d768247..e46f9df46 100644 --- a/parm/snow/ens_apply_incr_nml.j2 +++ b/parm/snow/ens_apply_incr_nml.j2 @@ -3,7 +3,7 @@ hour_str = "{{ current_cycle | strftime('%H') }}", res = {{ CASE_ENS[1:] }}, frac_grid = .true., - rst_path = "{{ DATA }}/anl/mem{{ MYMEM }}", + rst_path = "{{ DATA }}/anl", inc_path = "{{ DATA }}/anl", orog_path = "{{ HOMEgfs }}/fix/orog/{{ CASE_ENS }}", otype = "{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data", diff --git a/parm/snow/jcb-base.yaml.j2 b/parm/snow/jcb-base.yaml.j2 index 6be45e8c4..3b32d2dcb 100644 --- a/parm/snow/jcb-base.yaml.j2 +++ b/parm/snow/jcb-base.yaml.j2 @@ -13,8 +13,10 @@ model_file: model_pseudo initial_condition_file: background # Initial conditions for 4D apps is background final_increment_file: snow_final_increment_fms posterior_output_file: snow_posterior_output_fms -#output_ensemble_increments_file: snow_ensemble_increments_fms -#output_increment_file: snow_ensemblemean_increment_fms.yaml.j2 snow_output_increment_fms.yaml.j2 +output_ensemble_increments_file: snow_ensemble_increments_fms +output_increment_file: snow_output_increment_fms #snow_ensemblemean_increment_fms.yaml.j2 +output_variance_prior_file: snow_output_variance_prior_fms +output_variance_posterior_file: snow_output_variance_posterior_fms #jedi_increment_output: gaussian # Assimilation window diff --git a/parm/snow/jcb-prototype_lgetkf.yaml.j2 b/parm/snow/jcb-prototype_lgetkf.yaml.j2 index f84e9feb1..d70e66105 100644 --- a/parm/snow/jcb-prototype_lgetkf.yaml.j2 +++ b/parm/snow/jcb-prototype_lgetkf.yaml.j2 @@ -15,8 +15,12 @@ snow_background_ensemble_path: ./bkg/mem%mem% {% include OBS_LIST_YAML %} # Observation distribution and localization +# TODO: set these through templates {% set distribution_type = "Halo" %} -{% include 'snow_ens_obs_dist_localizations.yaml.j2' %} +{% set localization_method = "Horizontal Box car" %} +{% set halo_size = 250e3 %} +{% set loc_length_scale = 250e3 %} +{% set max_nobs = 50 %} # Testing things # -------------- diff --git a/parm/snow/snow_ens_obs_dist_localizations.yaml.j2 b/parm/snow/snow_ens_obs_dist_localizations.yaml.j2 index 8d8f7c092..2f8805f97 100644 --- a/parm/snow/snow_ens_obs_dist_localizations.yaml.j2 +++ b/parm/snow/snow_ens_obs_dist_localizations.yaml.j2 @@ -7,15 +7,15 @@ obs_distribution_localizations: lengthscale: 250e3 max nobs: 50 -override_obs_distribution_localizations: - override: false - ims_snow: - obs_distribution: - name: {{ distribution_type }} - halo size: 250e3 - obs_localizations: - - localization method: Horizontal SOAR - lengthscale: 250e3 - soar horizontal decay: 0.000021 -#assuming one obs every 40 Km - max nobs: 6 +#override_obs_distribution_localizations: +# override: false +# ims_snow: +# obs_distribution: +# name: {{ distribution_type }} +# halo size: 250e3 +# obs_localizations: +# - localization method: Horizontal SOAR +# lengthscale: 250e3 +# soar horizontal decay: 0.000021 +##assuming one obs every 40 Km +# max nobs: 6 diff --git a/parm/snow/snow_ensda_config.yaml.j2 b/parm/snow/snow_ensda_config.yaml.j2 index 8d6fda6e3..1ebfa6c75 100644 --- a/parm/snow/snow_ensda_config.yaml.j2 +++ b/parm/snow/snow_ensda_config.yaml.j2 @@ -7,7 +7,7 @@ jedi_config: jcb_base_yaml: '{{ PARMgfs }}/gdas/snow/jcb-base.yaml.j2' #TODO: handle 'TESTING' clause in prototype and then don't need it? jcb_algo_yaml: '{{ PARMgfs }}/gdas/snow/jcb-prototype_lgetkf.yaml.j2' - jcb_algo: 'local_ensemble_da' +# jcb_algo: 'local_ensemble_da' obs_list_yaml: '{{ OBS_LIST_YAML }}' scf_to_ioda: rundir: '{{ DATA }}' @@ -51,7 +51,7 @@ data_in: - '{{ DATA }}/anl' - '{{ DATA }}/bkg/ensmean' - '{{ DATA }}/anl/ensmean' -{% for mem in range(1, NMEM_ENS + 1) %} +{% for mem in range(0, NMEM_ENS + 1) %} - '{{ DATA }}/bkg/mem{{ '%03d' % mem }}' - '{{ DATA }}/anl/mem{{ '%03d' % mem }}' {% endfor %} @@ -160,8 +160,11 @@ data_in: data_out: copy_req: # Configuration files - - ['{{ DATA }}/snowanlvar.yaml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}snowanlvar.yaml'] - - ['{{ DATA }}/esnowanlensmean.yaml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}esnowanlensmean.yaml'] +# - ['{{ DATA }}/snowanlvar.yaml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}snowanlvar.yaml'] +# - ['{{ DATA }}/esnowanlensmean.yaml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}esnowanlensmean.yaml'] + - ['{{ DATA }}/snowensanlletkf.yaml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}snowensanlletkf.yaml'] + - ['{{ DATA }}/apply_incr_nml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}apply_incr_nml'] + {% if DO_IMS_SCF %} - ['{{ DATA }}/scf_to_ioda.yaml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}scf_to_ioda.yaml'] {% endif %} From 8308dd188a3fa2123f98e78f5dd72f75750ae379 Mon Sep 17 00:00:00 2001 From: tsga Date: Wed, 4 Feb 2026 17:04:26 +0000 Subject: [PATCH 06/98] differentiate letkf from current ens in parm/snow --- parm/snow/ens_apply_incr_nml.j2 | 2 +- parm/snow/letkf_apply_incr_nml.j2 | 16 ++++++++++++++++ ...onfig.yaml.j2 => snow_letkf_config.yaml.j2} | 18 +----------------- 3 files changed, 18 insertions(+), 18 deletions(-) create mode 100644 parm/snow/letkf_apply_incr_nml.j2 rename parm/snow/{snow_ensda_config.yaml.j2 => snow_letkf_config.yaml.j2} (94%) diff --git a/parm/snow/ens_apply_incr_nml.j2 b/parm/snow/ens_apply_incr_nml.j2 index e46f9df46..80ffcba26 100644 --- a/parm/snow/ens_apply_incr_nml.j2 +++ b/parm/snow/ens_apply_incr_nml.j2 @@ -3,7 +3,7 @@ hour_str = "{{ current_cycle | strftime('%H') }}", res = {{ CASE_ENS[1:] }}, frac_grid = .true., - rst_path = "{{ DATA }}/anl", + rst_path = "{{ DATA }}/anl/mem{{ MYMEM }}", inc_path = "{{ DATA }}/anl", orog_path = "{{ HOMEgfs }}/fix/orog/{{ CASE_ENS }}", otype = "{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data", diff --git a/parm/snow/letkf_apply_incr_nml.j2 b/parm/snow/letkf_apply_incr_nml.j2 new file mode 100644 index 000000000..e46f9df46 --- /dev/null +++ b/parm/snow/letkf_apply_incr_nml.j2 @@ -0,0 +1,16 @@ +&noahmp_snow + date_str = "{{ current_cycle | to_YMD }}", + hour_str = "{{ current_cycle | strftime('%H') }}", + res = {{ CASE_ENS[1:] }}, + frac_grid = .true., + rst_path = "{{ DATA }}/anl", + inc_path = "{{ DATA }}/anl", + orog_path = "{{ HOMEgfs }}/fix/orog/{{ CASE_ENS }}", + otype = "{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data", + ntiles={{ ntiles }}, + ens_size={{ ens_size }}, + noincr_threshold={{ noincr_threshold }}, + print_summary=.true., + print_debug={{ print_debug }} , + truncate={{ truncate_incr }} +/ diff --git a/parm/snow/snow_ensda_config.yaml.j2 b/parm/snow/snow_letkf_config.yaml.j2 similarity index 94% rename from parm/snow/snow_ensda_config.yaml.j2 rename to parm/snow/snow_letkf_config.yaml.j2 index 1ebfa6c75..e9c8875b1 100644 --- a/parm/snow/snow_ensda_config.yaml.j2 +++ b/parm/snow/snow_letkf_config.yaml.j2 @@ -5,9 +5,7 @@ jedi_config: mpi_cmd: '{{ APRUN_SNOWENSANLLETKF }}' jedi_args: ['fv3jedi', 'localensembleda'] jcb_base_yaml: '{{ PARMgfs }}/gdas/snow/jcb-base.yaml.j2' -#TODO: handle 'TESTING' clause in prototype and then don't need it? jcb_algo_yaml: '{{ PARMgfs }}/gdas/snow/jcb-prototype_lgetkf.yaml.j2' -# jcb_algo: 'local_ensemble_da' obs_list_yaml: '{{ OBS_LIST_YAML }}' scf_to_ioda: rundir: '{{ DATA }}' @@ -15,6 +13,7 @@ jedi_config: mpi_cmd: '{{ APRUN_SNOWANL }}' jcb_algo: 'snow_ims_scf_preprocess' jcb_base_yaml: '{{ PARMgfs }}/gdas/snow/jcb-base.yaml.j2' +#TODO: add observer mode # snowensanlobs: # rundir: '{{ DATA }}' # exe_src: '{{ EXECgfs }}/gdas.x' @@ -32,19 +31,6 @@ jedi_config: # jcb_algo_yaml: '{{ PARMgfs }}/gdas/snow/jcb-prototype_lgetkf_solver.yaml.j2' # obs_list_yaml: '{{ OBS_LIST_YAML }}' -# snowensanlfv3inc: -# rundir: '{{ DATA }}' -# exe_src: '{{ EXECgfs }}/gdas_fv3jedi_fv3inc.x' -# mpi_cmd: '{{ APRUN_SNOWENSANLFV3INC }}' -# jcb_algo: 'fv3jedi_fv3inc_lgetkf' -# jcb_base_yaml: '{{ PARMgfs }}/gdas/snow/jcb-base.yaml.j2' -# snowanladdinc: -# rundir: '{{ DATA }}' -# exe_src: '{{ EXECgdas }}/fv3jedi_addincrement.x' -# mpi_cmd: '{{ APRUN_SNOW_ADDINC }}' -# jcb_base_yaml: '{{ PARMgdas }}/snow/jcb-base.yaml.j2' -# jcb_algo: snow_addincrement - data_in: mkdir: - '{{ DATA }}/bkg' @@ -160,8 +146,6 @@ data_in: data_out: copy_req: # Configuration files -# - ['{{ DATA }}/snowanlvar.yaml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}snowanlvar.yaml'] -# - ['{{ DATA }}/esnowanlensmean.yaml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}esnowanlensmean.yaml'] - ['{{ DATA }}/snowensanlletkf.yaml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}snowensanlletkf.yaml'] - ['{{ DATA }}/apply_incr_nml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}apply_incr_nml'] From 7309654a369ddd4be094391afa9cdeb1a3f0aba9 Mon Sep 17 00:00:00 2001 From: tsga Date: Wed, 4 Feb 2026 21:23:04 +0000 Subject: [PATCH 07/98] refine snow ensemble output files --- .../model/snow/snow_ensemble_increments_fms.yaml.j2 | 11 +---------- ...aml.j2 => snow_ensemble_output_fms_common.yaml.j2} | 1 - .../model/snow/snow_output_increment_fms.yaml.j2 | 11 +---------- .../model/snow/snow_output_mean_prior_fms.yaml | 11 ----------- .../model/snow/snow_output_mean_prior_fms.yaml.j2 | 2 ++ .../snow/snow_output_variance_posterior_fms.yaml.j2 | 11 +---------- .../model/snow/snow_output_variance_prior_fms.yaml.j2 | 11 +---------- .../model/snow/snow_posterior_output_fms.yaml.j2 | 11 +---------- parm/snow/jcb-base.yaml.j2 | 3 ++- 9 files changed, 9 insertions(+), 63 deletions(-) rename parm/jcb-gdas/model/snow/{snow_ensemblemean_increment_fms.yaml.j2 => snow_ensemble_output_fms_common.yaml.j2} (91%) delete mode 100644 parm/jcb-gdas/model/snow/snow_output_mean_prior_fms.yaml create mode 100644 parm/jcb-gdas/model/snow/snow_output_mean_prior_fms.yaml.j2 diff --git a/parm/jcb-gdas/model/snow/snow_ensemble_increments_fms.yaml.j2 b/parm/jcb-gdas/model/snow/snow_ensemble_increments_fms.yaml.j2 index f0e28b9b7..401278fc1 100644 --- a/parm/jcb-gdas/model/snow/snow_ensemble_increments_fms.yaml.j2 +++ b/parm/jcb-gdas/model/snow/snow_ensemble_increments_fms.yaml.j2 @@ -1,11 +1,2 @@ -datapath: ./anl/mem%{member}% prefix: snowinc -filetype: fms restart -filename_sfcd: '{{ snow_background_time_fv3 }}.sfc_data.nc' -filename_cplr: '{{ snow_background_time_fv3 }}.coupler.res' -state variables: -- totalSnowDepth -- vtype -- slmsk -field io names: - totalSnowDepth: snodl +{% include 'snow_ensemble_output_fms_common.yaml.j2' %} diff --git a/parm/jcb-gdas/model/snow/snow_ensemblemean_increment_fms.yaml.j2 b/parm/jcb-gdas/model/snow/snow_ensemble_output_fms_common.yaml.j2 similarity index 91% rename from parm/jcb-gdas/model/snow/snow_ensemblemean_increment_fms.yaml.j2 rename to parm/jcb-gdas/model/snow/snow_ensemble_output_fms_common.yaml.j2 index 3b17737c6..ea7e19fe2 100644 --- a/parm/jcb-gdas/model/snow/snow_ensemblemean_increment_fms.yaml.j2 +++ b/parm/jcb-gdas/model/snow/snow_ensemble_output_fms_common.yaml.j2 @@ -1,5 +1,4 @@ datapath: ./anl/mem%{member}% -prefix: snowinc_ensmean filetype: fms restart filename_sfcd: '{{ snow_background_time_fv3 }}.sfc_data.nc' filename_cplr: '{{ snow_background_time_fv3 }}.coupler.res' diff --git a/parm/jcb-gdas/model/snow/snow_output_increment_fms.yaml.j2 b/parm/jcb-gdas/model/snow/snow_output_increment_fms.yaml.j2 index 3b17737c6..462363d2c 100644 --- a/parm/jcb-gdas/model/snow/snow_output_increment_fms.yaml.j2 +++ b/parm/jcb-gdas/model/snow/snow_output_increment_fms.yaml.j2 @@ -1,11 +1,2 @@ -datapath: ./anl/mem%{member}% prefix: snowinc_ensmean -filetype: fms restart -filename_sfcd: '{{ snow_background_time_fv3 }}.sfc_data.nc' -filename_cplr: '{{ snow_background_time_fv3 }}.coupler.res' -state variables: -- totalSnowDepth -- vtype -- slmsk -field io names: - totalSnowDepth: snodl +{% include 'snow_ensemble_output_fms_common.yaml.j2' %} diff --git a/parm/jcb-gdas/model/snow/snow_output_mean_prior_fms.yaml b/parm/jcb-gdas/model/snow/snow_output_mean_prior_fms.yaml deleted file mode 100644 index d8d819758..000000000 --- a/parm/jcb-gdas/model/snow/snow_output_mean_prior_fms.yaml +++ /dev/null @@ -1,11 +0,0 @@ -datapath: ./anl/mem%{member}% -prefix: snow_ensmean_prior -filetype: fms restart -filename_sfcd: '{{ snow_background_time_fv3 }}.sfc_data.nc' -filename_cplr: '{{ snow_background_time_fv3 }}.coupler.res' -state variables: -- totalSnowDepth -- vtype -- slmsk -field io names: - totalSnowDepth: snodl diff --git a/parm/jcb-gdas/model/snow/snow_output_mean_prior_fms.yaml.j2 b/parm/jcb-gdas/model/snow/snow_output_mean_prior_fms.yaml.j2 new file mode 100644 index 000000000..b0524dc68 --- /dev/null +++ b/parm/jcb-gdas/model/snow/snow_output_mean_prior_fms.yaml.j2 @@ -0,0 +1,2 @@ +prefix: snow_ensmean_prior +{% include 'snow_ensemble_output_fms_common.yaml.j2' %} diff --git a/parm/jcb-gdas/model/snow/snow_output_variance_posterior_fms.yaml.j2 b/parm/jcb-gdas/model/snow/snow_output_variance_posterior_fms.yaml.j2 index fcf72e3d4..905601106 100644 --- a/parm/jcb-gdas/model/snow/snow_output_variance_posterior_fms.yaml.j2 +++ b/parm/jcb-gdas/model/snow/snow_output_variance_posterior_fms.yaml.j2 @@ -1,11 +1,2 @@ -datapath: ./anl/mem%{member}% prefix: snow_ensvariance_posterior -filetype: fms restart -filename_sfcd: '{{ snow_background_time_fv3 }}.sfc_data.nc' -filename_cplr: '{{ snow_background_time_fv3 }}.coupler.res' -state variables: -- totalSnowDepth -- vtype -- slmsk -field io names: - totalSnowDepth: snodl +{% include 'snow_ensemble_output_fms_common.yaml.j2' %} diff --git a/parm/jcb-gdas/model/snow/snow_output_variance_prior_fms.yaml.j2 b/parm/jcb-gdas/model/snow/snow_output_variance_prior_fms.yaml.j2 index 1e9a45223..cc236d0df 100644 --- a/parm/jcb-gdas/model/snow/snow_output_variance_prior_fms.yaml.j2 +++ b/parm/jcb-gdas/model/snow/snow_output_variance_prior_fms.yaml.j2 @@ -1,11 +1,2 @@ -datapath: ./anl/mem%{member}% prefix: snow_ensvariance_prior -filetype: fms restart -filename_sfcd: '{{ snow_background_time_fv3 }}.sfc_data.nc' -filename_cplr: '{{ snow_background_time_fv3 }}.coupler.res' -state variables: -- totalSnowDepth -- vtype -- slmsk -field io names: - totalSnowDepth: snodl +{% include 'snow_ensemble_output_fms_common.yaml.j2' %} diff --git a/parm/jcb-gdas/model/snow/snow_posterior_output_fms.yaml.j2 b/parm/jcb-gdas/model/snow/snow_posterior_output_fms.yaml.j2 index 01ef42626..3bfc4e49b 100644 --- a/parm/jcb-gdas/model/snow/snow_posterior_output_fms.yaml.j2 +++ b/parm/jcb-gdas/model/snow/snow_posterior_output_fms.yaml.j2 @@ -1,11 +1,2 @@ -datapath: ./anl/mem%{member}% prefix: snow_ens_anl -filetype: fms restart -filename_sfcd: '{{ snow_background_time_fv3 }}.sfc_data.nc' -filename_cplr: '{{ snow_background_time_fv3 }}.coupler.res' -state variables: -- totalSnowDepth -- vtype -- slmsk -field io names: - totalSnowDepth: snodl +{% include 'snow_ensemble_output_fms_common.yaml.j2' %} diff --git a/parm/snow/jcb-base.yaml.j2 b/parm/snow/jcb-base.yaml.j2 index 3b32d2dcb..a486e6041 100644 --- a/parm/snow/jcb-base.yaml.j2 +++ b/parm/snow/jcb-base.yaml.j2 @@ -12,6 +12,7 @@ app_path_observation_chronicle: "{{PARMgfs}}/gdas/jcb-gdas/observation_chronicle model_file: model_pseudo initial_condition_file: background # Initial conditions for 4D apps is background final_increment_file: snow_final_increment_fms +output_mean_prior_file: snow_output_mean_prior_fms posterior_output_file: snow_posterior_output_fms output_ensemble_increments_file: snow_ensemble_increments_fms output_increment_file: snow_output_increment_fms #snow_ensemblemean_increment_fms.yaml.j2 @@ -133,7 +134,7 @@ driver_save_posterior_mean_increment: true driver_save_posterior_ensemble_increments: true driver_save_prior_variance: true driver_save_posterior_variance: true -#default driver_save_prior_mean: false +driver_save_prior_mean: true #(default false) #driver_do_test_prints: false (default true) #default driver_do_posterior_observer: true #default driver_use_control_member: false From c5bb2ed8a6679c795e94a2de958118cecdabcc57 Mon Sep 17 00:00:00 2001 From: tsga Date: Wed, 4 Feb 2026 21:27:04 +0000 Subject: [PATCH 08/98] clean up --- parm/snow/ens_apply_incr_nml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/snow/ens_apply_incr_nml.j2 b/parm/snow/ens_apply_incr_nml.j2 index 80ffcba26..36d768247 100644 --- a/parm/snow/ens_apply_incr_nml.j2 +++ b/parm/snow/ens_apply_incr_nml.j2 @@ -3,7 +3,7 @@ hour_str = "{{ current_cycle | strftime('%H') }}", res = {{ CASE_ENS[1:] }}, frac_grid = .true., - rst_path = "{{ DATA }}/anl/mem{{ MYMEM }}", + rst_path = "{{ DATA }}/anl/mem{{ MYMEM }}", inc_path = "{{ DATA }}/anl", orog_path = "{{ HOMEgfs }}/fix/orog/{{ CASE_ENS }}", otype = "{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data", From c5f964524f18102a8504e9eb1253392c435592b5 Mon Sep 17 00:00:00 2001 From: tsga Date: Wed, 4 Feb 2026 21:38:20 +0000 Subject: [PATCH 09/98] fix build --- build.sh | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/build.sh b/build.sh index 80084df1f..35ee9385f 100755 --- a/build.sh +++ b/build.sh @@ -112,19 +112,18 @@ mkdir -p ${BUILD_DIR} && cd ${BUILD_DIR} # Set WORKFLOW_TESTS as CMake option CMAKE_OPTS+=" -DWORKFLOW_TESTS=${WORKFLOW_TESTS:-${WORKFLOW_BUILD}}" -if [[ $WORKFLOW_BUILD == 'ON' ]]; then - # Link MOM6 and Icepack in SOCA to submodules in the UFS repo - rm -rf $dir_root/sorc/soca/external/mom6/MOM6 - rm -rf $dir_root/sorc/soca/external/icepack/Icepack - ln -sf $HOMEgfs/sorc/ufs_model.fd/MOM6-interface/MOM6/ $dir_root/sorc/soca/external/mom6/MOM6 - ln -sf $HOMEgfs/sorc/ufs_model.fd/CICE-interface/CICE/icepack/ $dir_root/sorc/soca/external/icepack/Icepack -else - # Delete forked SOCA NOAA-EMC dev/emc repo and clone the original JCSDA develop repo - rm -rf "$dir_root/sorc/soca/" - git clone https://github.com/jcsda/soca "$dir_root/sorc/soca" --recurse-submodules - cd "$dir_root/sorc/soca" - git checkout 733ac0177ad0b45e04586f2ead5aa67137da332c - cd ${BUILD_DIR} +if [[ $BUILD_SOCA == 'ON' ]]; then + if [[ $WORKFLOW_BUILD == 'ON' ]]; then + # Link MOM6 and Icepack in SOCA to submodules in the UFS repo + rm -rf $dir_root/sorc/soca/external/mom6/MOM6 + rm -rf $dir_root/sorc/soca/external/icepack/Icepack + ln -sf $HOMEgfs/sorc/ufs_model.fd/MOM6-interface/MOM6/ $dir_root/sorc/soca/external/mom6/MOM6 + ln -sf $HOMEgfs/sorc/ufs_model.fd/CICE-interface/CICE/icepack/ $dir_root/sorc/soca/external/icepack/Icepack + else + # Delete forked SOCA NOAA-EMC dev/emc repo and clone the original JCSDA develop repo + rm -rf "$dir_root/sorc/soca/" + git clone https://github.com/jcsda/soca "$dir_root/sorc/soca" --recurse-submodules + fi fi if [[ $BUILD_IODA_CONVERTERS == 'YES' ]]; then From 8a0403481b1dac0812e4926ed8d0fae9daa3b138 Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Thu, 5 Feb 2026 13:57:48 -0500 Subject: [PATCH 10/98] remove distribution and localization Removed distribution and localization settings from the observation space configuration. --- parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 b/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 index 23828b6e8..28f12582f 100644 --- a/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 +++ b/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 @@ -4,9 +4,6 @@ # ----------------------- obs space: name: {{observation_from_jcb}} - distribution: - name: Halo - halo size: 250e3 obsdatain: engine: type: H5File @@ -24,13 +21,6 @@ obs operator: name: Identity - # localization - # ------------ - obs localizations: - - localization method: Horizontal Box car - lengthscale: 250e3 - max nobs: 50 - # Observation Filters (QC) # ------------------------ obs pre filters: From 6f43724e405eb2a58607f2ba1b29ebc0e645548d Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Thu, 5 Feb 2026 13:59:20 -0500 Subject: [PATCH 11/98] remove unnecessary change in ghcn obs file --- parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 b/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 index 28f12582f..f1792ccb0 100644 --- a/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 +++ b/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 @@ -20,7 +20,8 @@ # -------------------- obs operator: name: Identity - + # + # Observation Filters (QC) # ------------------------ obs pre filters: From 1e55c6c350bdd1e1247d40e2328084a63a886cea Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Thu, 5 Feb 2026 14:00:11 -0500 Subject: [PATCH 12/98] Remove extra whitespace in ghcn_snow.yaml.j2 --- parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 b/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 index f1792ccb0..4ad6a7444 100644 --- a/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 +++ b/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 @@ -21,7 +21,7 @@ obs operator: name: Identity # - + # Observation Filters (QC) # ------------------------ obs pre filters: From 5dc85a042516872279977e35a358b2a90ff2fe1e Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Sun, 8 Feb 2026 07:14:44 -0500 Subject: [PATCH 13/98] Rename snowensanlletkf to snowletkfanl in config --- parm/snow/snow_letkf_config.yaml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/snow/snow_letkf_config.yaml.j2 b/parm/snow/snow_letkf_config.yaml.j2 index e9c8875b1..79930945c 100644 --- a/parm/snow/snow_letkf_config.yaml.j2 +++ b/parm/snow/snow_letkf_config.yaml.j2 @@ -1,5 +1,5 @@ jedi_config: - snowensanlletkf: + snowletkfanl: rundir: '{{ DATA }}' exe_src: '{{ EXECgfs }}/gdas.x' mpi_cmd: '{{ APRUN_SNOWENSANLLETKF }}' From a6956f4fce837542d7e55dc56921aa501a6c2a94 Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Sun, 8 Feb 2026 07:37:53 -0500 Subject: [PATCH 14/98] Update output configuration file references --- parm/snow/snow_letkf_config.yaml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/snow/snow_letkf_config.yaml.j2 b/parm/snow/snow_letkf_config.yaml.j2 index 79930945c..2757f1e59 100644 --- a/parm/snow/snow_letkf_config.yaml.j2 +++ b/parm/snow/snow_letkf_config.yaml.j2 @@ -146,7 +146,7 @@ data_in: data_out: copy_req: # Configuration files - - ['{{ DATA }}/snowensanlletkf.yaml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}snowensanlletkf.yaml'] + - ['{{ DATA }}/snowletkfanl.yaml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}snowletkfanl.yaml'] - ['{{ DATA }}/apply_incr_nml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}apply_incr_nml'] {% if DO_IMS_SCF %} From 1b49b26ff4cefb1c13d4bd144c9c186e3397f2fa Mon Sep 17 00:00:00 2001 From: tsga Date: Wed, 11 Feb 2026 21:47:58 +0000 Subject: [PATCH 15/98] fix dist and localization --- parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 | 13 +++++++++++++ parm/snow/jcb-prototype_lgetkf.yaml.j2 | 12 ++++++------ parm/snow/snow_letkf_config.yaml.j2 | 2 +- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 b/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 index 4ad6a7444..f8603d587 100644 --- a/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 +++ b/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 @@ -4,6 +4,11 @@ # ----------------------- obs space: name: {{observation_from_jcb}} +{% if algorithm == "local_ensemble_da" %} + distribution: + name: {{distribution_type}} + halo size: "{{halo_size}}" +{% endif %} obsdatain: engine: type: H5File @@ -21,6 +26,14 @@ obs operator: name: Identity # + # localization TODO: generalize this condioned on da algo + # ------------ +{% if algorithm == "local_ensemble_da" %} + obs localizations: + - localization method: {{localization_method}} + lengthscale: {{loc_length_scale}} + max nobs: {{max_nobs}} +{% endif %} # Observation Filters (QC) # ------------------------ diff --git a/parm/snow/jcb-prototype_lgetkf.yaml.j2 b/parm/snow/jcb-prototype_lgetkf.yaml.j2 index d70e66105..46a5f7227 100644 --- a/parm/snow/jcb-prototype_lgetkf.yaml.j2 +++ b/parm/snow/jcb-prototype_lgetkf.yaml.j2 @@ -15,12 +15,12 @@ snow_background_ensemble_path: ./bkg/mem%mem% {% include OBS_LIST_YAML %} # Observation distribution and localization -# TODO: set these through templates -{% set distribution_type = "Halo" %} -{% set localization_method = "Horizontal Box car" %} -{% set halo_size = 250e3 %} -{% set loc_length_scale = 250e3 %} -{% set max_nobs = 50 %} +# TODO: +distribution_type: "Halo" +localization_method: "Horizontal Box car" +halo_size: 250e3 +loc_length_scale: 250e3 +max_nobs: 50 # Testing things # -------------- diff --git a/parm/snow/snow_letkf_config.yaml.j2 b/parm/snow/snow_letkf_config.yaml.j2 index 2757f1e59..930e667a0 100644 --- a/parm/snow/snow_letkf_config.yaml.j2 +++ b/parm/snow/snow_letkf_config.yaml.j2 @@ -2,7 +2,7 @@ jedi_config: snowletkfanl: rundir: '{{ DATA }}' exe_src: '{{ EXECgfs }}/gdas.x' - mpi_cmd: '{{ APRUN_SNOWENSANLLETKF }}' + mpi_cmd: '{{ APRUN_SNOWLETKFANL }}' jedi_args: ['fv3jedi', 'localensembleda'] jcb_base_yaml: '{{ PARMgfs }}/gdas/snow/jcb-base.yaml.j2' jcb_algo_yaml: '{{ PARMgfs }}/gdas/snow/jcb-prototype_lgetkf.yaml.j2' From 25cbda0bd0bd5af3c095dda699d2c734ad8d9625 Mon Sep 17 00:00:00 2001 From: tsga Date: Tue, 3 Mar 2026 11:00:35 +0000 Subject: [PATCH 16/98] introduce t2m soil DA --- parm/soil/jcb-base.yaml.j2 | 47 ++++++++++++++++++++++--------- parm/soil/soil_det_config.yaml.j2 | 2 +- parm/soil/soil_obs_list.yaml.j2 | 3 +- 3 files changed, 36 insertions(+), 16 deletions(-) diff --git a/parm/soil/jcb-base.yaml.j2 b/parm/soil/jcb-base.yaml.j2 index e8071f966..ecc60b5ac 100644 --- a/parm/soil/jcb-base.yaml.j2 +++ b/parm/soil/jcb-base.yaml.j2 @@ -6,13 +6,18 @@ app_path_model: "{{PARMgdas}}/jcb-gdas/model/soil" app_path_observations: "{{PARMgdas}}/jcb-gdas/observations/soil" app_path_observation_chronicle: "{{PARMgdas}}/jcb-gdas/observation_chronicle/soil" - # Places where we deviate from the generic file name of a yaml # ------------------------------------------------------------ -final_increment_file: soil_final_increment_fms model_file: model_pseudo initial_condition_file: background # Initial conditions for 4D apps is background -output_file: soil_output +final_increment_file: soil_final_increment_fms +output_mean_prior_file: soil_output_mean_prior_fms +posterior_output_file: soil_posterior_output_fms +output_ensemble_increments_file: soil_ensemble_increments_fms +output_increment_file: soil_output_increment_fms #snow_ensemblemean_increment_fms.yaml.j2 +output_variance_prior_file: soil_output_variance_prior_fms +output_variance_posterior_file: soil_output_variance_posterior_fms +#jedi_increment_output: gaussian # Assimilation window # ------------------- @@ -30,7 +35,6 @@ soil_background_time_julian: "{{ bkg_time_julian }}" soil_increment_time_iso: "{{ bkg_time_iso }}" soil_increment_time_fv3: "{{ bkg_time_fv3 }}" - # Analysis standard things # ------------------------ analysis_variables: [soilMoistureVolumetric] @@ -60,11 +64,10 @@ soil_orog_prefix: "{{ CASE }}.mx{{ OCNRES }}" # Background soil_background_path: {{ soil_bkg_path }} -background_ensemble_path: ./ens/mem%mem% +soil_background_ensemble_path: ./bkg/mem%mem% # Background error soil_bump_data_directory: "{{ DATA }}/berror" -number_ensemble_members: {{ NMEM_ENS | default(1, true) }} soil_background_error_file: "{{BERROR_YAML}}" @@ -72,7 +75,6 @@ soil_background_error_file: "{{BERROR_YAML}}" soil_forecast_length: "{{ SNOW_WINDOW_LENGTH }}" soil_forecast_timestep: "{{ BKG_TSTEP }}" - # Observation things # ------------------ observations: all_observations @@ -105,13 +107,23 @@ soil_obsbiascovout_prefix: "{{APREFIX}}" soil_obsbiascovout_suffix: ".satbias_cov.nc" # Ensemble mean things -soil_number_ensemble_members: {{NMEM_ENS}} +soil_number_ensemble_members: {{NMEM_ENS | default(1, true) }} +soil_analysis_ensemble_path: ./anl/mem%mem% # Local Ensemble DA (LETKF) # ------------------------- local_ensemble_da_solver: Deterministic GETKF -increment_variables: [ua,va,DZ,delp,t,ps,sphum,ice_wat,liq_wat,o3mr] +# Observation distribution and localization +# TODO: +distribution_type: "Halo" +localization_method: "Horizontal Box car" +halo_size: 250e3 +loc_length_scale: 250e3 +max_nobs: 50 + +increment_variables: [stc, air_temperature_at_2m] #, smc, sphum] +#[ua,va,DZ,delp,t,ps,sphum,ice_wat,liq_wat,o3mr] # Veritcal localization for GETKF vl_fraction_of_retained_variance: 0.750 @@ -123,12 +135,19 @@ inflation_mult: 1.0 # Driver driver_update_obs_config_with_geometry_info: true -driver_save_posterior_mean: false -driver_save_posterior_ensemble: false -driver_save_prior_mean: false -driver_save_posterior_mean_increment: false +driver_save_posterior_mean: true +driver_save_posterior_ensemble: true +driver_save_posterior_mean_increment: true driver_save_posterior_ensemble_increments: true +driver_save_prior_variance: true +driver_save_posterior_variance: true +driver_save_prior_mean: true #(default false) +#driver_do_test_prints: false (default true) +#default driver_do_posterior_observer: true +#default driver_use_control_member: false # Diagnostics -ensemble_increment_prefix: "./anl/mem%{member}%/soilinc." +soil_increment_path: ./anl +soil_increment_ensemble_path: ./anl/mem%mem% +soil_increment_prefix: "soilinc" #posterior_output_gaussian: "./mem%{member}%/soilanl." diff --git a/parm/soil/soil_det_config.yaml.j2 b/parm/soil/soil_det_config.yaml.j2 index 6b7133762..d214717f4 100644 --- a/parm/soil/soil_det_config.yaml.j2 +++ b/parm/soil/soil_det_config.yaml.j2 @@ -12,7 +12,7 @@ jedi_config: exe_src: '{{ EXECgdas }}/fv3jedi_addincrement.x' mpi_cmd: '{{ APRUN_SOIL_ADDINC }}' jcb_base_yaml: '{{ PARMgdas }}/soil/jcb-base.yaml.j2' - jcb_algo: soil_addincrement + jcb_algo: 'soil_addincrement' data_in: mkdir: diff --git a/parm/soil/soil_obs_list.yaml.j2 b/parm/soil/soil_obs_list.yaml.j2 index 233073e73..c3789a7cc 100644 --- a/parm/soil/soil_obs_list.yaml.j2 +++ b/parm/soil/soil_obs_list.yaml.j2 @@ -1,2 +1,3 @@ observations: -- smap_soil +# - smap_soil +- t2m_soil From f9b93985d886778ede801ea6220e62a7260af405 Mon Sep 17 00:00:00 2001 From: tsga Date: Tue, 3 Mar 2026 11:01:35 +0000 Subject: [PATCH 17/98] add adpsfc and sfshp config yamls (from RDAS) --- .../soil_ensemble_output_fms_common.yaml.j2 | 36 ++ .../soil/soil_lgetkf_increment.yaml.j2 | 99 +++++ ...orest_soil_ensemble_increments_fms.yaml.j2 | 4 + .../soil/soil_background_ensemble.yaml.j2 | 54 +++ .../soil/soil_ensemble_increments_fms.yaml.j2 | 2 + .../soil_ensemble_output_fms_common.yaml.j2 | 42 ++ .../soil/soil_output_increment_fms.yaml.j2 | 2 + .../soil/soil_output_mean_prior_fms.yaml.j2 | 2 + ...soil_output_variance_posterior_fms.yaml.j2 | 2 + .../soil_output_variance_prior_fms.yaml.j2 | 2 + .../soil/soil_posterior_output_fms.yaml.j2 | 2 + .../soil/adpsfc_airTemperature_181.yaml.j2 | 365 +++++++++++++++++ .../soil/adpsfc_airTemperature_183.yaml.j2 | 348 ++++++++++++++++ .../soil/adpsfc_airTemperature_187.yaml.j2 | 348 ++++++++++++++++ .../soil/adpsfc_specificHumidity_181.yaml.j2 | 340 ++++++++++++++++ .../soil/adpsfc_specificHumidity_183.yaml.j2 | 340 ++++++++++++++++ .../soil/adpsfc_specificHumidity_187.yaml.j2 | 340 ++++++++++++++++ .../soil/adpsfc_stationPressure_181.yaml.j2 | 334 ++++++++++++++++ .../soil/adpsfc_stationPressure_187.yaml.j2 | 334 ++++++++++++++++ .../soil/adpsfc_winds_281.yaml.j2 | 370 ++++++++++++++++++ .../soil/adpsfc_winds_284.yaml.j2 | 370 ++++++++++++++++++ .../soil/adpsfc_winds_287.yaml.j2 | 370 ++++++++++++++++++ .../soil/sfcshp_airTemperature_180.yaml.j2 | 340 ++++++++++++++++ .../soil/sfcshp_airTemperature_182.yaml.j2 | 340 ++++++++++++++++ .../soil/sfcshp_airTemperature_183.yaml.j2 | 340 ++++++++++++++++ .../soil/sfcshp_specificHumidity_180.yaml.j2 | 340 ++++++++++++++++ .../soil/sfcshp_specificHumidity_182.yaml.j2 | 340 ++++++++++++++++ .../soil/sfcshp_specificHumidity_183.yaml.j2 | 340 ++++++++++++++++ .../soil/sfcshp_stationPressure_180.yaml.j2 | 346 ++++++++++++++++ .../soil/sfcshp_stationPressure_182.yaml.j2 | 334 ++++++++++++++++ .../soil/sfcshp_winds_280.yaml.j2 | 370 ++++++++++++++++++ .../soil/sfcshp_winds_282.yaml.j2 | 370 ++++++++++++++++++ .../soil/sfcshp_winds_284.yaml.j2 | 370 ++++++++++++++++++ 33 files changed, 7936 insertions(+) create mode 100644 parm/jcb-gdas/algorithm/soil/soil_ensemble_output_fms_common.yaml.j2 create mode 100644 parm/jcb-gdas/algorithm/soil/soil_lgetkf_increment.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/norest_soil_ensemble_increments_fms.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_ensemble_increments_fms.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_ensemble_output_fms_common.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_output_increment_fms.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_output_mean_prior_fms.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_output_variance_posterior_fms.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_output_variance_prior_fms.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_posterior_output_fms.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/adpsfc_airTemperature_181.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/adpsfc_airTemperature_183.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/adpsfc_airTemperature_187.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/adpsfc_specificHumidity_181.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/adpsfc_specificHumidity_183.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/adpsfc_specificHumidity_187.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/adpsfc_stationPressure_181.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/adpsfc_stationPressure_187.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/adpsfc_winds_281.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/adpsfc_winds_284.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/adpsfc_winds_287.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/sfcshp_airTemperature_180.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/sfcshp_airTemperature_182.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/sfcshp_airTemperature_183.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/sfcshp_specificHumidity_180.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/sfcshp_specificHumidity_182.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/sfcshp_specificHumidity_183.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/sfcshp_stationPressure_180.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/sfcshp_stationPressure_182.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/sfcshp_winds_280.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/sfcshp_winds_282.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/sfcshp_winds_284.yaml.j2 diff --git a/parm/jcb-gdas/algorithm/soil/soil_ensemble_output_fms_common.yaml.j2 b/parm/jcb-gdas/algorithm/soil/soil_ensemble_output_fms_common.yaml.j2 new file mode 100644 index 000000000..378422672 --- /dev/null +++ b/parm/jcb-gdas/algorithm/soil/soil_ensemble_output_fms_common.yaml.j2 @@ -0,0 +1,36 @@ +datapath: ./anl/mem%{member}% +filetype: fms restart +filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' +filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' +state variables: +- soilMoistureVolumetric +- stc +- totalSnowDepth +- sheleg +- vtype +- slmsk +- filtered_orography +- fraction_of_ice +- fraction_of_land +- air_temperature +- air_pressure_at_surface +- water_vapor_mixing_ratio_wrt_moist_air +- skin_temperature_at_surface +- layer_thickness +- air_pressure_thickness +- stype +- vfrac +field io names: + air_temperature: tmp + layer_thickness: delz + air_pressure_thickness: dpres + air_pressure_at_surface: pressfc + water_vapor_mixing_ratio_wrt_moist_air: spfh + skin_temperature_at_surface: tmpsfc + stype: sotyp + vfrac: veg + soilMoistureVolumetric: smc + totalSnowDepth: snodl + filtered_orography: orog_filt + fraction_of_ice: fice + fraction_of_land: land_frac diff --git a/parm/jcb-gdas/algorithm/soil/soil_lgetkf_increment.yaml.j2 b/parm/jcb-gdas/algorithm/soil/soil_lgetkf_increment.yaml.j2 new file mode 100644 index 000000000..4536c9c0a --- /dev/null +++ b/parm/jcb-gdas/algorithm/soil/soil_lgetkf_increment.yaml.j2 @@ -0,0 +1,99 @@ +# background geometry: +state geometry: + fms initialization: + namelist filename: ./fv3jedi/fmsmpp.nml + field table filename: ./fv3jedi/field_table + akbk: ./fv3jedi/akbk.nc4 + layout: + - {{ soil_layout_x }} + - {{ soil_layout_y }} + npx: {{ soil_npx_ges }} + npy: {{ soil_npy_ges }} + npz: {{ soil_npz_ges }} +# field metadata override: ./fv3jedi/fv3jedi_fieldmetadata_history.yaml +# jedi/fv3 increment geometry: +increment geometry: + fms initialization: + namelist filename: ./fv3jedi/fmsmpp.nml + field table filename: ./fv3jedi/field_table + akbk: ./fv3jedi/akbk.nc4 + layout: + - {{ soil_layout_x }} + - {{ soil_layout_y }} + npx: {{ soil_npx_anl }} + npy: {{ soil_npy_anl }} + npz: {{ soil_npz_anl }} +# field metadata override: ./fv3jedi/fv3jedi_fieldmetadata_fv3inc.yaml +members from template: + template: + background input: + state variables: &state_vars + - soilMoistureVolumetric + - stc + - totalSnowDepth + - sheleg + - vtype + - slmsk + - filtered_orography + - fraction_of_ice + - fraction_of_land + - air_temperature + - air_pressure_at_surface + - water_vapor_mixing_ratio_wrt_moist_air + - skin_temperature_at_surface + - layer_thickness + - air_pressure_thickness + - stype + - vfrac + field io names: &field_io_names + air_temperature: tmp + layer_thickness: delz + air_pressure_thickness: dpres + air_pressure_at_surface: pressfc + water_vapor_mixing_ratio_wrt_moist_air: spfh + skin_temperature_at_surface: tmpsfc + stype: sotyp + vfrac: veg + soilMoistureVolumetric: smc + totalSnowDepth: snodl + filtered_orography: orog_filt + fraction_of_ice: fice + fraction_of_land: land_frac + datapath: {{ soil_background_ensemble_path }} + datetime: '{{ soil_background_time_iso }}' + filetype: fms restart + skip coupler file: true + filename is datetime templated: true + filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' + filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' + filename_orog: '{{ soil_orog_prefix }}_oro_data.nc' + max allowable geometry difference: 1e-4 + increment: + added variables: + - stc + - air_temperature + field io names: + air_temperature: tmp + datapath: {{ soil_analysis_ensemble_path }} + datetime: '{{ soil_background_time_iso }}' + filetype: fms restart + skip coupler file: true + filename is datetime templated: true + prefix: soil_inc + filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' + output: + state variables: *state_vars +# - stc +# - air_temperature + field io names: *field_io_names +# air_temperature: tmp + datapath: {{ soil_analysis_ensemble_path }} + datetime: '{{ soil_background_time_iso }}' + filetype: fms restart + skip coupler file: true + filename is datetime templated: true + prefix: soil_anl + filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' + pattern: "{{ soil_ensemble_pattern | default("%mem%", true) }}" + nmembers: {{ soil_number_ensemble_members }} + zero padding: 3 diff --git a/parm/jcb-gdas/model/soil/norest_soil_ensemble_increments_fms.yaml.j2 b/parm/jcb-gdas/model/soil/norest_soil_ensemble_increments_fms.yaml.j2 new file mode 100644 index 000000000..f065f10fd --- /dev/null +++ b/parm/jcb-gdas/model/soil/norest_soil_ensemble_increments_fms.yaml.j2 @@ -0,0 +1,4 @@ +filetype: fms restart +is restart: false +datapath: ./anl/mem%{member}% +filename_nonrestart: cubed_sphere_grid_sfcinc.jedi.nc diff --git a/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 new file mode 100644 index 000000000..726c13277 --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 @@ -0,0 +1,54 @@ +#datetime: '{{ soil_background_time_iso }}' +members from template: + template: + datetime: '{{ soil_background_time_iso }}' + filetype: fms restart + skip coupler file: true +# provider: ufs + state variables: &state_vars + - soilMoistureVolumetric + - stc + - totalSnowDepth + - sheleg + - vtype + - slmsk + - filtered_orography + - fraction_of_ice + - fraction_of_land + - air_temperature_at_2m +#temperature_2m +# - spec_humidity_2m +# - air_temperature +# - air_pressure_at_surface +# - water_vapor_mixing_ratio_wrt_moist_air +# - skin_temperature_at_surface +# - layer_thickness +# - air_pressure_thickness +# - stype +# - vfrac + field io names: &field_ios +# air_temperature: tmp +# layer_thickness: delz +# air_pressure_thickness: dpres +# air_pressure_at_surface: pressfc +# water_vapor_mixing_ratio_wrt_moist_air: spfh +# skin_temperature_at_surface: tmpsfc +# stype: sotyp +# vfrac: veg + soilMoistureVolumetric: smc + totalSnowDepth: snodl + filtered_orography: orog_filt + fraction_of_ice: fice + fraction_of_land: land_frac + air_temperature_at_2m: t2m +# temperature_2m: t2m +# spec_humidity_2m: q2m + datapath: {{ soil_background_ensemble_path }} + filename is datetime templated: true + filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' + filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' + filename_orog: '{{ soil_orog_prefix }}_oro_data.nc' + max allowable geometry difference: 1e-4 + pattern: "{{ soil_ensemble_pattern | default("%mem%", true) }}" + nmembers: {{ soil_number_ensemble_members }} + zero padding: 3 diff --git a/parm/jcb-gdas/model/soil/soil_ensemble_increments_fms.yaml.j2 b/parm/jcb-gdas/model/soil/soil_ensemble_increments_fms.yaml.j2 new file mode 100644 index 000000000..c51d4eb35 --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_ensemble_increments_fms.yaml.j2 @@ -0,0 +1,2 @@ +prefix: soilinc +{% include 'soil_ensemble_output_fms_common.yaml.j2' %} diff --git a/parm/jcb-gdas/model/soil/soil_ensemble_output_fms_common.yaml.j2 b/parm/jcb-gdas/model/soil/soil_ensemble_output_fms_common.yaml.j2 new file mode 100644 index 000000000..b7528da27 --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_ensemble_output_fms_common.yaml.j2 @@ -0,0 +1,42 @@ +datapath: ./anl/mem%{member}% +filetype: fms restart +filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' +filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' +state variables: +- soilMoistureVolumetric +- stc +- totalSnowDepth +- sheleg +- vtype +- slmsk +- filtered_orography +- fraction_of_ice +- fraction_of_land +- air_temperature_at_2m +#- temperature_2m +#- spec_humidity_2m +#- air_temperature +#- air_pressure_at_surface +#- water_vapor_mixing_ratio_wrt_moist_air +#- skin_temperature_at_surface +#- layer_thickness +#- air_pressure_thickness +#- stype +#- vfrac +field io names: + soilMoistureVolumetric: smc + totalSnowDepth: snodl + filtered_orography: orog_filt + fraction_of_ice: fice + fraction_of_land: land_frac + air_temperature_at_2m: t2m +# temperature_2m: t2m +# spec_humidity_2m: q2m +# air_temperature: tmp +# layer_thickness: delz +# air_pressure_thickness: dpres +# air_pressure_at_surface: pressfc +# water_vapor_mixing_ratio_wrt_moist_air: spfh +# skin_temperature_at_surface: tmpsfc +# stype: sotyp +# vfrac: veg diff --git a/parm/jcb-gdas/model/soil/soil_output_increment_fms.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_increment_fms.yaml.j2 new file mode 100644 index 000000000..6fe0e475e --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_output_increment_fms.yaml.j2 @@ -0,0 +1,2 @@ +prefix: soilinc_ensmean +{% include 'soil_ensemble_output_fms_common.yaml.j2' %} diff --git a/parm/jcb-gdas/model/soil/soil_output_mean_prior_fms.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_mean_prior_fms.yaml.j2 new file mode 100644 index 000000000..d28a0e09c --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_output_mean_prior_fms.yaml.j2 @@ -0,0 +1,2 @@ +prefix: soil_ensmean_prior +{% include 'soil_ensemble_output_fms_common.yaml.j2' %} diff --git a/parm/jcb-gdas/model/soil/soil_output_variance_posterior_fms.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_variance_posterior_fms.yaml.j2 new file mode 100644 index 000000000..fb4b989e0 --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_output_variance_posterior_fms.yaml.j2 @@ -0,0 +1,2 @@ +prefix: soil_ensvariance_posterior +{% include 'soil_ensemble_output_fms_common.yaml.j2' %} diff --git a/parm/jcb-gdas/model/soil/soil_output_variance_prior_fms.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_variance_prior_fms.yaml.j2 new file mode 100644 index 000000000..644899794 --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_output_variance_prior_fms.yaml.j2 @@ -0,0 +1,2 @@ +prefix: soil_ensvariance_prior +{% include 'soil_ensemble_output_fms_common.yaml.j2' %} diff --git a/parm/jcb-gdas/model/soil/soil_posterior_output_fms.yaml.j2 b/parm/jcb-gdas/model/soil/soil_posterior_output_fms.yaml.j2 new file mode 100644 index 000000000..c1c194a2e --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_posterior_output_fms.yaml.j2 @@ -0,0 +1,2 @@ +prefix: soil_ens_anl +{% include 'soil_ensemble_output_fms_common.yaml.j2' %} diff --git a/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_181.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_181.yaml.j2 new file mode 100644 index 000000000..17170fc62 --- /dev/null +++ b/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_181.yaml.j2 @@ -0,0 +1,365 @@ +- + # Observation Space (I/O) + # ----------------------- + + obs space: + name: {{observation_from_jcb}} +{% if algorithm == "local_ensemble_da" %} + distribution: + name: {{distribution_type}} + halo size: "{{halo_size}}" +{% endif %} + obsdatain: + engine: + type: H5File + obsfile: "{{soil_obsdatain_path}}/{{soil_obsdatain_prefix}}{{observation_from_jcb}}.nc" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + sort variable: "pressure" + sort order: "descending" + obsdataout: + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: "{{soil_obsdataout_path}}/{{soil_obsdataout_prefix}}{{observation_from_jcb}}{{soil_obsdataout_suffix}}" + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [airTemperature] + simulated variables: [airTemperature] + + obs operator: + name: VertInterp + vertical coordinate: air_pressure + observation vertical coordinate: pressure + observation vertical coordinate group: MetaData + interpolation method: log-linear + variables: + - name: airTemperature + + linear obs operator: + name: VertInterp + + # localization TODO: generalize this condioned on da algo + # ------------ +{% if algorithm == "local_ensemble_da" %} + obs localizations: + - localization method: {{localization_method}} + lengthscale: {{loc_length_scale}} + max nobs: {{max_nobs}} +{% endif %} + + obs error: + covariance model: diagonal + + obs filters: + # ------------------ + # airTemperature (181) + # ------------------ + # Accept, reject, or passivate (monitor) + - filter: Perform Action + udescriptor: "iuse_check" + filter variables: + - name: airTemperature + where: + - variable: ObsType/airTemperature + is_in: 181 + action: + name: {{iuse_adpsfc_airTemperature_181 | default("passivate", true)}} # accept, reject, passivate + + # Reject all obs not in type + - filter: Perform Action + udescriptor: "obs_type_check" + where: + - variable: ObsValue/airTemperature + value: is_not_valid + action: + name: reduce obs space + + # Reject all obs not in kx + - filter: Perform Action + udescriptor: "obs_kx_check" + where: + - variable: ObsType/airTemperature + is_not_in: 181 + action: + name: reduce obs space + + # Reject all obs with QualityMarker > 3 + - filter: RejectList + udescriptor: "quality_marker_check" + filter variables: + - name: airTemperature + where: + - variable: QualityMarker/airTemperature + is_in: 4-15 + value: is_not_valid + where operator: or + action: + name: reduce obs space + + # Time window filter + - filter: Bounds Check + udescriptor: "time_window_check" + filter variables: + - name: airTemperature + test variables: + - name: MetaData/timeOffset + minvalue: -900 + maxvalue: 900 + where: + - variable: ObsType/airTemperature + is_in: 181 + action: + name: reduce obs space + + # Duplicate Check + - filter: Temporal Thinning + udescriptor: "duplicate_check" + filter variables: + - name: airTemperature + min_spacing: PT90M + tolerance: PT0H + seed_time: "{{soil_background_time_iso}}" + category_variable: + name: MetaData/longitude_latitude_pressure + where: + - variable: ObsType/airTemperature + is_in: 181 + action: + name: reduce obs space + + # Online regional domain check + - filter: Bounds Check + udescriptor: "online_domain_check" + filter variables: + - name: airTemperature + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + udescriptor: "initial_error_assignment" + filter variables: + - name: airTemperature + where: + - variable: ObsType/airTemperature + is_in: 181 + 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] + errors: [1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056] + +# # Reduce observation error and turn off ObsErrorFactorPressureCheck (l_gsd_terrain_match_surfTobs=.true., l_sfcobserror_ramp_t=.true.,) +# - filter: Perform Action +# filter variables: +# - name: airTemperature +# action: +# name: inflate error +# inflation factor: 0.5 + + # Error inflation based on pressure check (setupt.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: airTemperature + where: + - variable: ObsType/airTemperature + is_in: 181 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: airTemperature + surface observation error ramp: true + max levels below surface: 15 + inflation factor: 8.0 + +# # Error inflation based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: airTemperature +# where: +# - variable: ObsType/airTemperature +# is_in: 181 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [airTemperature] +# pressure: MetaData/pressure + + # Error inflation when QualityMarker == 3 (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_QualityMarker" + filter variables: + - name: airTemperature + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: QualityMarker/airTemperature + is_in: 3 + - variable: ObsType/airTemperature + is_in: 181 + + # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_observation_pressure" + filter variables: + - name: airTemperature + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: MetaData/pressure + maxvalue: 10000.0 + - variable: ObsType/airTemperature + is_in: 181 + + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: airTemperature + test variables: + - name: ObsErrorData/airTemperature + minvalue: 0.0 + maxvalue: 1000 + where: + - variable: ObsType/airTemperature + is_in: 181 + action: + name: reduce obs space + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: airTemperature + minvalue: 100 + maxvalue: 400 + where: + - variable: ObsType/airTemperature + is_in: 181 + action: + name: reduce obs space + + # Create temporary ObsErrorData + - filter: Variable Assignment + udescriptor: "create_temporary_ObsErrorData" + apply at iterations: 0,1 + where: + - variable: ObsType/airTemperature + is_in: 181 + assignments: + - name: TempObsErrorData/airTemperature + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/airTemperature + defer to post: true + + # Set ObsError set "error parameter" if < "max value" + - filter: Perform Action + udescriptor: "ermin_set" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + action: + name: assign error + error parameter: 1.0 + where: + - variable: + name: ObsErrorData/airTemperature + maxvalue: 1.0 + - variable: + name: ObsErrorData/airTemperature + value: is_valid + - variable: ObsType/airTemperature + is_in: 181 + defer to post: true + + # Set ObsError set "error parameter" if > "min value" + - filter: Perform Action + udescriptor: "ermax_set" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + action: + name: assign error + error parameter: 3.0 + where: + - variable: + name: ObsErrorData/airTemperature + minvalue: 3.0 + - variable: + name: ObsErrorData/airTemperature + value: is_valid + - variable: ObsType/airTemperature + is_in: 181 + defer to post: true + + # Gross Error Check + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + threshold: 5.0 + action: + name: reject + where: + - variable: QualityMarker/airTemperature + is_not_in: 3 + - variable: ObsType/airTemperature + is_in: 181 + defer to post: true + + # Gross Error Check: cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + threshold: 3.5 + action: + name: reject + where: + - variable: QualityMarker/airTemperature + is_in: 3 + - variable: ObsType/airTemperature + is_in: 181 + defer to post: true + + # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. + - filter: Perform Action + udescriptor: "reassign_error_TempObsErrorData" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + action: + name: assign error + error function: TempObsErrorData/airTemperature + where: + - variable: + name: TempObsErrorData/airTemperature + value: is_valid + - variable: ObsType/airTemperature + is_in: 181 + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_183.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_183.yaml.j2 new file mode 100644 index 000000000..b186ce87e --- /dev/null +++ b/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_183.yaml.j2 @@ -0,0 +1,348 @@ + - obs space: + name: adpsfc_airTemperature_183 + obsdatain: + engine: + type: H5File + obsfile: "data/obs/ioda_adpsfc.nc" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + sort variable: "pressure" + sort order: "descending" + obsdataout: + empty obs space action: "{{empty_obs_space_action}}" + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: jdiag_adpsfc_airTemperature_183.nc + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [airTemperature] + simulated variables: [airTemperature] + + obs operator: + name: VertInterp + vertical coordinate: air_pressure + observation vertical coordinate: pressure + observation vertical coordinate group: MetaData + interpolation method: log-linear + variables: + - name: airTemperature + + linear obs operator: + name: VertInterp + + obs error: + covariance model: diagonal + + obs filters: + # ------------------ + # airTemperature (183) + # ------------------ + # Accept, reject, or passivate (monitor) + - filter: Perform Action + udescriptor: "iuse_check" + filter variables: + - name: airTemperature + where: + - variable: ObsType/airTemperature + is_in: 183 + action: + name: {{iuse_adpsfc_airTemperature_183 | default("passivate", true)}} # accept, reject, passivate + + # Reject all obs not in type + - filter: Perform Action + udescriptor: "obs_type_check" + where: + - variable: ObsValue/airTemperature + value: is_not_valid + action: + name: reduce obs space + + # Reject all obs not in kx + - filter: Perform Action + udescriptor: "obs_kx_check" + where: + - variable: ObsType/airTemperature + is_not_in: 183 + action: + name: reduce obs space + + # Reject all obs with QualityMarker > 3 + - filter: RejectList + udescriptor: "quality_marker_check" + filter variables: + - name: airTemperature + where: + - variable: QualityMarker/airTemperature + is_in: 4-15 + value: is_not_valid + where operator: or + action: + name: reduce obs space + + # Time window filter + - filter: Bounds Check + udescriptor: "time_window_check" + filter variables: + - name: airTemperature + test variables: + - name: MetaData/timeOffset + minvalue: -900 + maxvalue: 900 + where: + - variable: ObsType/airTemperature + is_in: 183 + action: + name: reduce obs space + + # Duplicate Check + - filter: Temporal Thinning + udescriptor: "duplicate_check" + filter variables: + - name: airTemperature + min_spacing: PT90M + tolerance: PT0H + seed_time: "{{atmosphere_background_time_iso}}" + category_variable: + name: MetaData/longitude_latitude_pressure + where: + - variable: ObsType/airTemperature + is_in: 183 + action: + name: reduce obs space + + # Online regional domain check + - filter: Bounds Check + udescriptor: "online_domain_check" + filter variables: + - name: airTemperature + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + udescriptor: "initial_error_assignment" + filter variables: + - name: airTemperature + where: + - variable: ObsType/airTemperature + is_in: 183 + 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] + errors: [2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349] + +# # Reduce observation error and turn off ObsErrorFactorPressureCheck (l_gsd_terrain_match_surfTobs=.true., l_sfcobserror_ramp_t=.true.,) +# - filter: Perform Action +# filter variables: +# - name: airTemperature +# action: +# name: inflate error +# inflation factor: 0.5 + + # Error inflation based on pressure check (setupt.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: airTemperature + where: + - variable: ObsType/airTemperature + is_in: 183 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: airTemperature + surface observation error ramp: true + max levels below surface: 15 + inflation factor: 8.0 + +# # Error inflation based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: airTemperature +# where: +# - variable: ObsType/airTemperature +# is_in: 183 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [airTemperature] +# pressure: MetaData/pressure + + # Error inflation when QualityMarker == 3 (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_QualityMarker" + filter variables: + - name: airTemperature + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: QualityMarker/airTemperature + is_in: 3 + - variable: ObsType/airTemperature + is_in: 183 + + # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_observation_pressure" + filter variables: + - name: airTemperature + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: MetaData/pressure + maxvalue: 10000.0 + - variable: ObsType/airTemperature + is_in: 183 + + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: airTemperature + test variables: + - name: ObsErrorData/airTemperature + minvalue: 0.0 + maxvalue: 1000 + where: + - variable: ObsType/airTemperature + is_in: 183 + action: + name: reduce obs space + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: airTemperature + minvalue: 100 + maxvalue: 400 + where: + - variable: ObsType/airTemperature + is_in: 183 + action: + name: reduce obs space + + # Create temporary ObsErrorData + - filter: Variable Assignment + udescriptor: "create_temporary_ObsErrorData" + apply at iterations: 0,1 + where: + - variable: ObsType/airTemperature + is_in: 183 + assignments: + - name: TempObsErrorData/airTemperature + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/airTemperature + defer to post: true + + # Set ObsError set "error parameter" if < "max value" + - filter: Perform Action + udescriptor: "ermin_set" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + action: + name: assign error + error parameter: 1.0 + where: + - variable: + name: ObsErrorData/airTemperature + maxvalue: 1.0 + - variable: + name: ObsErrorData/airTemperature + value: is_valid + - variable: ObsType/airTemperature + is_in: 183 + defer to post: true + + # Set ObsError set "error parameter" if > "min value" + - filter: Perform Action + udescriptor: "ermax_set" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + action: + name: assign error + error parameter: 3.0 + where: + - variable: + name: ObsErrorData/airTemperature + minvalue: 3.0 + - variable: + name: ObsErrorData/airTemperature + value: is_valid + - variable: ObsType/airTemperature + is_in: 183 + defer to post: true + + # Gross Error Check + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + threshold: 5.0 + action: + name: reject + where: + - variable: QualityMarker/airTemperature + is_not_in: 3 + - variable: ObsType/airTemperature + is_in: 183 + defer to post: true + + # Gross Error Check: cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + threshold: 3.5 + action: + name: reject + where: + - variable: QualityMarker/airTemperature + is_in: 3 + - variable: ObsType/airTemperature + is_in: 183 + defer to post: true + + # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. + - filter: Perform Action + udescriptor: "reassign_error_TempObsErrorData" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + action: + name: assign error + error function: TempObsErrorData/airTemperature + where: + - variable: + name: TempObsErrorData/airTemperature + value: is_valid + - variable: ObsType/airTemperature + is_in: 183 + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_187.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_187.yaml.j2 new file mode 100644 index 000000000..b255008ef --- /dev/null +++ b/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_187.yaml.j2 @@ -0,0 +1,348 @@ + - obs space: + name: adpsfc_airTemperature_187 + obsdatain: + engine: + type: H5File + obsfile: "data/obs/ioda_adpsfc.nc" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + sort variable: "pressure" + sort order: "descending" + obsdataout: + empty obs space action: "{{empty_obs_space_action}}" + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: jdiag_adpsfc_airTemperature_187.nc + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [airTemperature] + simulated variables: [airTemperature] + + obs operator: + name: VertInterp + vertical coordinate: air_pressure + observation vertical coordinate: pressure + observation vertical coordinate group: MetaData + interpolation method: log-linear + variables: + - name: airTemperature + + linear obs operator: + name: VertInterp + + obs error: + covariance model: diagonal + + obs filters: + # ------------------ + # airTemperature (187) + # ------------------ + # Accept, reject, or passivate (monitor) + - filter: Perform Action + udescriptor: "iuse_check" + filter variables: + - name: airTemperature + where: + - variable: ObsType/airTemperature + is_in: 187 + action: + name: {{iuse_adpsfc_airTemperature_187 | default("passivate", true)}} # accept, reject, passivate + + # Reject all obs not in type + - filter: Perform Action + udescriptor: "obs_type_check" + where: + - variable: ObsValue/airTemperature + value: is_not_valid + action: + name: reduce obs space + + # Reject all obs not in kx + - filter: Perform Action + udescriptor: "obs_kx_check" + where: + - variable: ObsType/airTemperature + is_not_in: 187 + action: + name: reduce obs space + + # Reject all obs with QualityMarker > 3 + - filter: RejectList + udescriptor: "quality_marker_check" + filter variables: + - name: airTemperature + where: + - variable: QualityMarker/airTemperature + is_in: 4-15 + value: is_not_valid + where operator: or + action: + name: reduce obs space + + # Time window filter + - filter: Bounds Check + udescriptor: "time_window_check" + filter variables: + - name: airTemperature + test variables: + - name: MetaData/timeOffset + minvalue: -900 + maxvalue: 900 + where: + - variable: ObsType/airTemperature + is_in: 187 + action: + name: reduce obs space + + # Duplicate Check + - filter: Temporal Thinning + udescriptor: "duplicate_check" + filter variables: + - name: airTemperature + min_spacing: PT90M + tolerance: PT0H + seed_time: "{{atmosphere_background_time_iso}}" + category_variable: + name: MetaData/longitude_latitude_pressure + where: + - variable: ObsType/airTemperature + is_in: 187 + action: + name: reduce obs space + + # Online regional domain check + - filter: Bounds Check + udescriptor: "online_domain_check" + filter variables: + - name: airTemperature + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + udescriptor: "initial_error_assignment" + filter variables: + - name: airTemperature + where: + - variable: ObsType/airTemperature + is_in: 187 + 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] + errors: [2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585] + +# # Reduce observation error and turn off ObsErrorFactorPressureCheck (l_gsd_terrain_match_surfTobs=.true., l_sfcobserror_ramp_t=.true.,) +# - filter: Perform Action +# filter variables: +# - name: airTemperature +# action: +# name: inflate error +# inflation factor: 0.5 + + # Error inflation based on pressure check (setupt.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: airTemperature + where: + - variable: ObsType/airTemperature + is_in: 187 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: airTemperature + surface observation error ramp: true + max levels below surface: 15 + inflation factor: 8.0 + +# # Error inflation based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: airTemperature +# where: +# - variable: ObsType/airTemperature +# is_in: 187 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [airTemperature] +# pressure: MetaData/pressure + + # Error inflation when QualityMarker == 3 (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_QualityMarker" + filter variables: + - name: airTemperature + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: QualityMarker/airTemperature + is_in: 3 + - variable: ObsType/airTemperature + is_in: 187 + + # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_observation_pressure" + filter variables: + - name: airTemperature + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: MetaData/pressure + maxvalue: 10000.0 + - variable: ObsType/airTemperature + is_in: 187 + + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: airTemperature + test variables: + - name: ObsErrorData/airTemperature + minvalue: 0.0 + maxvalue: 1000 + where: + - variable: ObsType/airTemperature + is_in: 187 + action: + name: reduce obs space + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: airTemperature + minvalue: 100 + maxvalue: 400 + where: + - variable: ObsType/airTemperature + is_in: 187 + action: + name: reduce obs space + + # Create temporary ObsErrorData + - filter: Variable Assignment + udescriptor: "create_temporary_ObsErrorData" + apply at iterations: 0,1 + where: + - variable: ObsType/airTemperature + is_in: 187 + assignments: + - name: TempObsErrorData/airTemperature + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/airTemperature + defer to post: true + + # Set ObsError set "error parameter" if < "max value" + - filter: Perform Action + udescriptor: "ermin_set" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + action: + name: assign error + error parameter: 1.0 + where: + - variable: + name: ObsErrorData/airTemperature + maxvalue: 1.0 + - variable: + name: ObsErrorData/airTemperature + value: is_valid + - variable: ObsType/airTemperature + is_in: 187 + defer to post: true + + # Set ObsError set "error parameter" if > "min value" + - filter: Perform Action + udescriptor: "ermax_set" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + action: + name: assign error + error parameter: 3.0 + where: + - variable: + name: ObsErrorData/airTemperature + minvalue: 3.0 + - variable: + name: ObsErrorData/airTemperature + value: is_valid + - variable: ObsType/airTemperature + is_in: 187 + defer to post: true + + # Gross Error Check + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + threshold: 5.0 + action: + name: reject + where: + - variable: QualityMarker/airTemperature + is_not_in: 3 + - variable: ObsType/airTemperature + is_in: 187 + defer to post: true + + # Gross Error Check: cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + threshold: 3.5 + action: + name: reject + where: + - variable: QualityMarker/airTemperature + is_in: 3 + - variable: ObsType/airTemperature + is_in: 187 + defer to post: true + + # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. + - filter: Perform Action + udescriptor: "reassign_error_TempObsErrorData" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + action: + name: assign error + error function: TempObsErrorData/airTemperature + where: + - variable: + name: TempObsErrorData/airTemperature + value: is_valid + - variable: ObsType/airTemperature + is_in: 187 + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/adpsfc_specificHumidity_181.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_specificHumidity_181.yaml.j2 new file mode 100644 index 000000000..b7defa4dd --- /dev/null +++ b/parm/jcb-gdas/observations/soil/adpsfc_specificHumidity_181.yaml.j2 @@ -0,0 +1,340 @@ + - obs space: + name: adpsfc_specificHumidity_181 + obsdatain: + engine: + type: H5File + obsfile: "data/obs/ioda_adpsfc.nc" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + sort variable: "pressure" + sort order: "descending" + obsdataout: + empty obs space action: "{{empty_obs_space_action}}" + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: jdiag_adpsfc_specificHumidity_181.nc + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [specificHumidity] + simulated variables: [specificHumidity] + + obs operator: + name: VertInterp + vertical coordinate: air_pressure + observation vertical coordinate: pressure + observation vertical coordinate group: MetaData + interpolation method: log-linear + variables: + - name: specificHumidity + + linear obs operator: + name: VertInterp + + obs error: + covariance model: diagonal + + obs filters: + # ------------------ + # specificHumidity (181) + # ------------------ + # Accept, reject, or passivate (monitor) + - filter: Perform Action + udescriptor: "iuse_check" + filter variables: + - name: specificHumidity + where: + - variable: ObsType/specificHumidity + is_in: 181 + action: + name: {{iuse_adpsfc_specificHumidity_181 | default("passivate", true)}} # accept, reject, passivate + + # Reject all obs not in type + - filter: Perform Action + udescriptor: "obs_type_check" + where: + - variable: ObsValue/specificHumidity + value: is_not_valid + action: + name: reduce obs space + + # Reject all obs not in kx + - filter: Perform Action + udescriptor: "obs_kx_check" + where: + - variable: ObsType/specificHumidity + is_not_in: 181 + action: + name: reduce obs space + + # Reject all obs with QualityMarker > 3 + - filter: RejectList + udescriptor: "quality_marker_check" + filter variables: + - name: specificHumidity + where: + - variable: QualityMarker/specificHumidity + is_in: 4-15 + value: is_not_valid + where operator: or + action: + name: reduce obs space + + # Time window filter + - filter: Bounds Check + udescriptor: "time_window_check" + filter variables: + - name: specificHumidity + test variables: + - name: MetaData/timeOffset + minvalue: -900 + maxvalue: 900 + where: + - variable: ObsType/specificHumidity + is_in: 181 + action: + name: reduce obs space + + # Duplicate Check + - filter: Temporal Thinning + udescriptor: "duplicate_check" + filter variables: + - name: specificHumidity + min_spacing: PT90M + tolerance: PT0H + seed_time: "{{atmosphere_background_time_iso}}" + category_variable: + name: MetaData/longitude_latitude_pressure + where: + - variable: ObsType/specificHumidity + is_in: 181 + action: + name: reduce obs space + + # Online regional domain check + - filter: Bounds Check + udescriptor: "online_domain_check" + filter variables: + - name: specificHumidity + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + udescriptor: "initial_error_assignment" + filter variables: + - name: specificHumidity + where: + - variable: ObsType/specificHumidity + is_in: 181 + 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] + errors: [0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912] + + # Error inflation based on pressure check (setupq.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: specificHumidity + where: + - variable: ObsType/specificHumidity + is_in: 181 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: specificHumidity + surface observation error ramp: true + max levels below surface: 15 + inflation factor: 8.0 + +# # Error inflation based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: specificHumidity +# where: +# - variable: ObsType/specificHumidity +# is_in: 181 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [specificHumidity] +# pressure: MetaData/pressure + + # Error inflation when QualityMarker == 3 (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_QualityMarker" + filter variables: + - name: specificHumidity + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: QualityMarker/specificHumidity + is_in: 3 + - variable: ObsType/specificHumidity + is_in: 181 + + # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_observation_pressure" + filter variables: + - name: specificHumidity + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: MetaData/pressure + maxvalue: 10000.0 + - variable: ObsType/specificHumidity + is_in: 181 + + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: specificHumidity + test variables: + - name: ObsErrorData/specificHumidity + minvalue: 0.0 + maxvalue: 1000 + where: + - variable: ObsType/specificHumidity + is_in: 181 + action: + name: reduce obs space + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: specificHumidity + minvalue: 0.0 + maxvalue: 1.0 + where: + - variable: ObsType/specificHumidity + is_in: 181 + action: + name: reduce obs space + + # Create temporary ObsErrorData + - filter: Variable Assignment + udescriptor: "create_temporary_ObsErrorData" + apply at iterations: 0,1 + where: + - variable: ObsType/specificHumidity + is_in: 181 + assignments: + - name: TempObsErrorData/specificHumidity + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/specificHumidity + defer to post: true + + # Set ObsError set "error parameter" if < "max value" + - filter: Perform Action + udescriptor: "ermin_set" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + action: + name: assign error + error parameter: 5.0 + where: + - variable: + name: ObsErrorData/specificHumidity + maxvalue: 5.0 + - variable: + name: ObsErrorData/specificHumidity + value: is_valid + - variable: ObsType/specificHumidity + is_in: 181 + defer to post: true + + # Set ObsError set "error parameter" if > "min value" + - filter: Perform Action + udescriptor: "ermax_set" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + action: + name: assign error + error parameter: 50.0 + where: + - variable: + name: ObsErrorData/specificHumidity + minvalue: 50.0 + - variable: + name: ObsErrorData/specificHumidity + value: is_valid + - variable: ObsType/specificHumidity + is_in: 181 + defer to post: true + + # Gross Error Check + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + threshold: 7.0 + action: + name: reject + where: + - variable: QualityMarker/specificHumidity + is_not_in: 3 + - variable: ObsType/specificHumidity + is_in: 181 + defer to post: true + + # Gross Error Check: cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + threshold: 4.9 + action: + name: reject + where: + - variable: QualityMarker/specificHumidity + is_in: 3 + - variable: ObsType/specificHumidity + is_in: 181 + defer to post: true + + # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. + - filter: Perform Action + udescriptor: "reassign_error_TempObsErrorData" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + action: + name: assign error + error function: TempObsErrorData/specificHumidity + where: + - variable: + name: TempObsErrorData/specificHumidity + value: is_valid + - variable: ObsType/specificHumidity + is_in: 181 + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/adpsfc_specificHumidity_183.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_specificHumidity_183.yaml.j2 new file mode 100644 index 000000000..9affaa5ca --- /dev/null +++ b/parm/jcb-gdas/observations/soil/adpsfc_specificHumidity_183.yaml.j2 @@ -0,0 +1,340 @@ + - obs space: + name: adpsfc_specificHumidity_183 + obsdatain: + engine: + type: H5File + obsfile: "data/obs/ioda_adpsfc.nc" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + sort variable: "pressure" + sort order: "descending" + obsdataout: + empty obs space action: "{{empty_obs_space_action}}" + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: jdiag_adpsfc_specificHumidity_183.nc + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [specificHumidity] + simulated variables: [specificHumidity] + + obs operator: + name: VertInterp + vertical coordinate: air_pressure + observation vertical coordinate: pressure + observation vertical coordinate group: MetaData + interpolation method: log-linear + variables: + - name: specificHumidity + + linear obs operator: + name: VertInterp + + obs error: + covariance model: diagonal + + obs filters: + # ------------------ + # specificHumidity (183) + # ------------------ + # Accept, reject, or passivate (monitor) + - filter: Perform Action + udescriptor: "iuse_check" + filter variables: + - name: specificHumidity + where: + - variable: ObsType/specificHumidity + is_in: 183 + action: + name: {{iuse_adpsfc_specificHumidity_183 | default("passivate", true)}} # accept, reject, passivate + + # Reject all obs not in type + - filter: Perform Action + udescriptor: "obs_type_check" + where: + - variable: ObsValue/specificHumidity + value: is_not_valid + action: + name: reduce obs space + + # Reject all obs not in kx + - filter: Perform Action + udescriptor: "obs_kx_check" + where: + - variable: ObsType/specificHumidity + is_not_in: 183 + action: + name: reduce obs space + + # Reject all obs with QualityMarker > 3 + - filter: RejectList + udescriptor: "quality_marker_check" + filter variables: + - name: specificHumidity + where: + - variable: QualityMarker/specificHumidity + is_in: 4-15 + value: is_not_valid + where operator: or + action: + name: reduce obs space + + # Time window filter + - filter: Bounds Check + udescriptor: "time_window_check" + filter variables: + - name: specificHumidity + test variables: + - name: MetaData/timeOffset + minvalue: -900 + maxvalue: 900 + where: + - variable: ObsType/specificHumidity + is_in: 183 + action: + name: reduce obs space + + # Duplicate Check + - filter: Temporal Thinning + udescriptor: "duplicate_check" + filter variables: + - name: specificHumidity + min_spacing: PT90M + tolerance: PT0H + seed_time: "{{atmosphere_background_time_iso}}" + category_variable: + name: MetaData/longitude_latitude_pressure + where: + - variable: ObsType/specificHumidity + is_in: 183 + action: + name: reduce obs space + + # Online regional domain check + - filter: Bounds Check + udescriptor: "online_domain_check" + filter variables: + - name: specificHumidity + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + udescriptor: "initial_error_assignment" + filter variables: + - name: specificHumidity + where: + - variable: ObsType/specificHumidity + is_in: 183 + 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] + errors: [0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912] + + # Error inflation based on pressure check (setupq.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: specificHumidity + where: + - variable: ObsType/specificHumidity + is_in: 183 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: specificHumidity + surface observation error ramp: true + max levels below surface: 15 + inflation factor: 8.0 + +# # Error inflation based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: specificHumidity +# where: +# - variable: ObsType/specificHumidity +# is_in: 183 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [specificHumidity] +# pressure: MetaData/pressure + + # Error inflation when QualityMarker == 3 (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_QualityMarker" + filter variables: + - name: specificHumidity + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: QualityMarker/specificHumidity + is_in: 3 + - variable: ObsType/specificHumidity + is_in: 183 + + # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_observation_pressure" + filter variables: + - name: specificHumidity + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: MetaData/pressure + maxvalue: 10000.0 + - variable: ObsType/specificHumidity + is_in: 183 + + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: specificHumidity + test variables: + - name: ObsErrorData/specificHumidity + minvalue: 0.0 + maxvalue: 1000 + where: + - variable: ObsType/specificHumidity + is_in: 183 + action: + name: reduce obs space + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: specificHumidity + minvalue: 0.0 + maxvalue: 1.0 + where: + - variable: ObsType/specificHumidity + is_in: 183 + action: + name: reduce obs space + + # Create temporary ObsErrorData + - filter: Variable Assignment + udescriptor: "create_temporary_ObsErrorData" + apply at iterations: 0,1 + where: + - variable: ObsType/specificHumidity + is_in: 183 + assignments: + - name: TempObsErrorData/specificHumidity + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/specificHumidity + defer to post: true + + # Set ObsError set "error parameter" if < "max value" + - filter: Perform Action + udescriptor: "ermin_set" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + action: + name: assign error + error parameter: 5.0 + where: + - variable: + name: ObsErrorData/specificHumidity + maxvalue: 5.0 + - variable: + name: ObsErrorData/specificHumidity + value: is_valid + - variable: ObsType/specificHumidity + is_in: 183 + defer to post: true + + # Set ObsError set "error parameter" if > "min value" + - filter: Perform Action + udescriptor: "ermax_set" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + action: + name: assign error + error parameter: 50.0 + where: + - variable: + name: ObsErrorData/specificHumidity + minvalue: 50.0 + - variable: + name: ObsErrorData/specificHumidity + value: is_valid + - variable: ObsType/specificHumidity + is_in: 183 + defer to post: true + + # Gross Error Check + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + threshold: 7.0 + action: + name: reject + where: + - variable: QualityMarker/specificHumidity + is_not_in: 3 + - variable: ObsType/specificHumidity + is_in: 183 + defer to post: true + + # Gross Error Check: cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + threshold: 4.9 + action: + name: reject + where: + - variable: QualityMarker/specificHumidity + is_in: 3 + - variable: ObsType/specificHumidity + is_in: 183 + defer to post: true + + # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. + - filter: Perform Action + udescriptor: "reassign_error_TempObsErrorData" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + action: + name: assign error + error function: TempObsErrorData/specificHumidity + where: + - variable: + name: TempObsErrorData/specificHumidity + value: is_valid + - variable: ObsType/specificHumidity + is_in: 183 + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/adpsfc_specificHumidity_187.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_specificHumidity_187.yaml.j2 new file mode 100644 index 000000000..dfa9c9ce1 --- /dev/null +++ b/parm/jcb-gdas/observations/soil/adpsfc_specificHumidity_187.yaml.j2 @@ -0,0 +1,340 @@ + - obs space: + name: adpsfc_specificHumidity_187 + obsdatain: + engine: + type: H5File + obsfile: "data/obs/ioda_adpsfc.nc" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + sort variable: "pressure" + sort order: "descending" + obsdataout: + empty obs space action: "{{empty_obs_space_action}}" + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: jdiag_adpsfc_specificHumidity_187.nc + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [specificHumidity] + simulated variables: [specificHumidity] + + obs operator: + name: VertInterp + vertical coordinate: air_pressure + observation vertical coordinate: pressure + observation vertical coordinate group: MetaData + interpolation method: log-linear + variables: + - name: specificHumidity + + linear obs operator: + name: VertInterp + + obs error: + covariance model: diagonal + + obs filters: + # ------------------ + # specificHumidity (187) + # ------------------ + # Accept, reject, or passivate (monitor) + - filter: Perform Action + udescriptor: "iuse_check" + filter variables: + - name: specificHumidity + where: + - variable: ObsType/specificHumidity + is_in: 187 + action: + name: {{iuse_adpsfc_specificHumidity_187 | default("passivate", true)}} # accept, reject, passivate + + # Reject all obs not in type + - filter: Perform Action + udescriptor: "obs_type_check" + where: + - variable: ObsValue/specificHumidity + value: is_not_valid + action: + name: reduce obs space + + # Reject all obs not in kx + - filter: Perform Action + udescriptor: "obs_kx_check" + where: + - variable: ObsType/specificHumidity + is_not_in: 187 + action: + name: reduce obs space + + # Reject all obs with QualityMarker > 3 + - filter: RejectList + udescriptor: "quality_marker_check" + filter variables: + - name: specificHumidity + where: + - variable: QualityMarker/specificHumidity + is_in: 4-15 + value: is_not_valid + where operator: or + action: + name: reduce obs space + + # Time window filter + - filter: Bounds Check + udescriptor: "time_window_check" + filter variables: + - name: specificHumidity + test variables: + - name: MetaData/timeOffset + minvalue: -900 + maxvalue: 900 + where: + - variable: ObsType/specificHumidity + is_in: 187 + action: + name: reduce obs space + + # Duplicate Check + - filter: Temporal Thinning + udescriptor: "duplicate_check" + filter variables: + - name: specificHumidity + min_spacing: PT90M + tolerance: PT0H + seed_time: "{{atmosphere_background_time_iso}}" + category_variable: + name: MetaData/longitude_latitude_pressure + where: + - variable: ObsType/specificHumidity + is_in: 187 + action: + name: reduce obs space + + # Online regional domain check + - filter: Bounds Check + udescriptor: "online_domain_check" + filter variables: + - name: specificHumidity + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + udescriptor: "initial_error_assignment" + filter variables: + - name: specificHumidity + where: + - variable: ObsType/specificHumidity + is_in: 187 + 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] + errors: [0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912] + + # Error inflation based on pressure check (setupq.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: specificHumidity + where: + - variable: ObsType/specificHumidity + is_in: 187 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: specificHumidity + surface observation error ramp: true + max levels below surface: 15 + inflation factor: 8.0 + +# # Error inflation based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: specificHumidity +# where: +# - variable: ObsType/specificHumidity +# is_in: 187 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [specificHumidity] +# pressure: MetaData/pressure + + # Error inflation when QualityMarker == 3 (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_QualityMarker" + filter variables: + - name: specificHumidity + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: QualityMarker/specificHumidity + is_in: 3 + - variable: ObsType/specificHumidity + is_in: 187 + + # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_observation_pressure" + filter variables: + - name: specificHumidity + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: MetaData/pressure + maxvalue: 10000.0 + - variable: ObsType/specificHumidity + is_in: 187 + + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: specificHumidity + test variables: + - name: ObsErrorData/specificHumidity + minvalue: 0.0 + maxvalue: 1000 + where: + - variable: ObsType/specificHumidity + is_in: 187 + action: + name: reduce obs space + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: specificHumidity + minvalue: 0.0 + maxvalue: 1.0 + where: + - variable: ObsType/specificHumidity + is_in: 187 + action: + name: reduce obs space + + # Create temporary ObsErrorData + - filter: Variable Assignment + udescriptor: "create_temporary_ObsErrorData" + apply at iterations: 0,1 + where: + - variable: ObsType/specificHumidity + is_in: 187 + assignments: + - name: TempObsErrorData/specificHumidity + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/specificHumidity + defer to post: true + + # Set ObsError set "error parameter" if < "max value" + - filter: Perform Action + udescriptor: "ermin_set" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + action: + name: assign error + error parameter: 5.0 + where: + - variable: + name: ObsErrorData/specificHumidity + maxvalue: 5.0 + - variable: + name: ObsErrorData/specificHumidity + value: is_valid + - variable: ObsType/specificHumidity + is_in: 187 + defer to post: true + + # Set ObsError set "error parameter" if > "min value" + - filter: Perform Action + udescriptor: "ermax_set" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + action: + name: assign error + error parameter: 50.0 + where: + - variable: + name: ObsErrorData/specificHumidity + minvalue: 50.0 + - variable: + name: ObsErrorData/specificHumidity + value: is_valid + - variable: ObsType/specificHumidity + is_in: 187 + defer to post: true + + # Gross Error Check + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + threshold: 7.0 + action: + name: reject + where: + - variable: QualityMarker/specificHumidity + is_not_in: 3 + - variable: ObsType/specificHumidity + is_in: 187 + defer to post: true + + # Gross Error Check: cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + threshold: 4.9 + action: + name: reject + where: + - variable: QualityMarker/specificHumidity + is_in: 3 + - variable: ObsType/specificHumidity + is_in: 187 + defer to post: true + + # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. + - filter: Perform Action + udescriptor: "reassign_error_TempObsErrorData" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + action: + name: assign error + error function: TempObsErrorData/specificHumidity + where: + - variable: + name: TempObsErrorData/specificHumidity + value: is_valid + - variable: ObsType/specificHumidity + is_in: 187 + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/adpsfc_stationPressure_181.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_stationPressure_181.yaml.j2 new file mode 100644 index 000000000..47d357526 --- /dev/null +++ b/parm/jcb-gdas/observations/soil/adpsfc_stationPressure_181.yaml.j2 @@ -0,0 +1,334 @@ + - obs space: + name: adpsfc_stationPressure_181 + obsdatain: + engine: + type: H5File + obsfile: "data/obs/ioda_adpsfc.nc" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + sort variable: "pressure" + sort order: "descending" + obsdataout: + empty obs space action: "{{empty_obs_space_action}}" + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: jdiag_adpsfc_stationPressure_181.nc + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [stationPressure] + simulated variables: [stationPressure] + + obs operator: + name: SfcCorrected + correction scheme to use: GSL + geovar_sfc_geomz: geopotential_height_at_surface + geovar_geomz: geopotential_height + linear obs operator: + name: Identity + + obs error: + covariance model: diagonal + + obs filters: + # ------------------ + # stationPressure (181) + # ------------------ + # Accept, reject, or passivate (monitor) + - filter: Perform Action + udescriptor: "iuse_check" + filter variables: + - name: stationPressure + where: + - variable: ObsType/stationPressure + is_in: 181 + action: + name: {{iuse_adpsfc_stationPressure_181 | default("passivate", true)}} # accept, reject, passivate + + # Reject all obs not in type + - filter: Perform Action + udescriptor: "obs_type_check" + where: + - variable: ObsValue/stationPressure + value: is_not_valid + action: + name: reduce obs space + + # Reject all obs not in kx + - filter: Perform Action + udescriptor: "obs_kx_check" + where: + - variable: ObsType/stationPressure + is_not_in: 181 + action: + name: reduce obs space + + # Reject all obs with QualityMarker > 3 + - filter: RejectList + udescriptor: "quality_marker_check" + filter variables: + - name: stationPressure + where: + - variable: QualityMarker/stationPressure + is_in: 4-15 + value: is_not_valid + where operator: or + action: + name: reduce obs space + + # Time window filter + - filter: Bounds Check + udescriptor: "time_window_check" + filter variables: + - name: stationPressure + test variables: + - name: MetaData/timeOffset + minvalue: -900 + maxvalue: 900 + where: + - variable: ObsType/stationPressure + is_in: 181 + action: + name: reduce obs space + + # Duplicate Check + - filter: Temporal Thinning + udescriptor: "duplicate_check" + filter variables: + - name: stationPressure + min_spacing: PT90M + tolerance: PT0H + seed_time: "{{atmosphere_background_time_iso}}" + category_variable: + name: MetaData/longitude_latitude_pressure + where: + - variable: ObsType/stationPressure + is_in: 181 + action: + name: reduce obs space + + # Online regional domain check + - filter: Bounds Check + udescriptor: "online_domain_check" + filter variables: + - name: stationPressure + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + udescriptor: "initial_error_assignment" + filter variables: + - name: stationPressure + where: + - variable: ObsType/stationPressure + is_in: 181 + 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] + errors: [53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11] + + # Error inflation based on pressure check (setupps.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: stationPressure + where: + - variable: ObsType/stationPressure + is_in: 181 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorSfcPressure + options: + geovar_geomz: geopotential_height + geovar_sfc_geomz: geopotential_height_at_surface + +# # Error inflation based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: stationPressure +# where: +# - variable: ObsType/stationPressure +# is_in: 181 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [stationPressure] +# pressure: MetaData/pressure + + # Error inflation when QualityMarker == 3 (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_QualityMarker" + filter variables: + - name: stationPressure + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: QualityMarker/stationPressure + is_in: 3 + - variable: ObsType/stationPressure + is_in: 181 + + # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_observation_pressure" + filter variables: + - name: stationPressure + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: MetaData/pressure + maxvalue: 10000.0 + - variable: ObsType/stationPressure + is_in: 181 + + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: stationPressure + test variables: + - name: ObsErrorData/stationPressure + minvalue: 0.0 + maxvalue: 1000 + where: + - variable: ObsType/stationPressure + is_in: 181 + action: + name: reduce obs space + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: stationPressure + minvalue: 20000.0 + maxvalue: 120000.0 + where: + - variable: ObsType/stationPressure + is_in: 181 + action: + name: reduce obs space + + # Create temporary ObsErrorData + - filter: Variable Assignment + udescriptor: "create_temporary_ObsErrorData" + apply at iterations: 0,1 + where: + - variable: ObsType/stationPressure + is_in: 181 + assignments: + - name: TempObsErrorData/stationPressure + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/stationPressure + defer to post: true + + # Set ObsError set "error parameter" if < "max value" + - filter: Perform Action + udescriptor: "ermin_set" + apply at iterations: 0,1 + filter variables: + - name: stationPressure + action: + name: assign error + error parameter: 100.0 + where: + - variable: + name: ObsErrorData/stationPressure + maxvalue: 100.0 + - variable: + name: ObsErrorData/stationPressure + value: is_valid + - variable: ObsType/stationPressure + is_in: 181 + defer to post: true + + # Set ObsError set "error parameter" if > "min value" + - filter: Perform Action + udescriptor: "ermax_set" + apply at iterations: 0,1 + filter variables: + - name: stationPressure + action: + name: assign error + error parameter: 300.0 + where: + - variable: + name: ObsErrorData/stationPressure + minvalue: 300.0 + - variable: + name: ObsErrorData/stationPressure + value: is_valid + - variable: ObsType/stationPressure + is_in: 181 + defer to post: true + + # Gross Error Check + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: stationPressure + threshold: 5.0 + action: + name: reject + where: + - variable: QualityMarker/stationPressure + is_not_in: 3 + - variable: ObsType/stationPressure + is_in: 181 + defer to post: true + + # Gross Error Check: cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: stationPressure + threshold: 3.5 + action: + name: reject + where: + - variable: QualityMarker/stationPressure + is_in: 3 + - variable: ObsType/stationPressure + is_in: 181 + defer to post: true + + # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. + - filter: Perform Action + udescriptor: "reassign_error_TempObsErrorData" + apply at iterations: 0,1 + filter variables: + - name: stationPressure + action: + name: assign error + error function: TempObsErrorData/stationPressure + where: + - variable: + name: TempObsErrorData/stationPressure + value: is_valid + - variable: ObsType/stationPressure + is_in: 181 + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/adpsfc_stationPressure_187.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_stationPressure_187.yaml.j2 new file mode 100644 index 000000000..cdc611f5a --- /dev/null +++ b/parm/jcb-gdas/observations/soil/adpsfc_stationPressure_187.yaml.j2 @@ -0,0 +1,334 @@ + - obs space: + name: adpsfc_stationPressure_187 + obsdatain: + engine: + type: H5File + obsfile: "data/obs/ioda_adpsfc.nc" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + sort variable: "pressure" + sort order: "descending" + obsdataout: + empty obs space action: "{{empty_obs_space_action}}" + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: jdiag_adpsfc_stationPressure_187.nc + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [stationPressure] + simulated variables: [stationPressure] + + obs operator: + name: SfcCorrected + correction scheme to use: GSL + geovar_sfc_geomz: geopotential_height_at_surface + geovar_geomz: geopotential_height + linear obs operator: + name: Identity + + obs error: + covariance model: diagonal + + obs filters: + # ------------------ + # stationPressure (187) + # ------------------ + # Accept, reject, or passivate (monitor) + - filter: Perform Action + udescriptor: "iuse_check" + filter variables: + - name: stationPressure + where: + - variable: ObsType/stationPressure + is_in: 187 + action: + name: {{iuse_adpsfc_stationPressure_187 | default("passivate", true)}} # accept, reject, passivate + + # Reject all obs not in type + - filter: Perform Action + udescriptor: "obs_type_check" + where: + - variable: ObsValue/stationPressure + value: is_not_valid + action: + name: reduce obs space + + # Reject all obs not in kx + - filter: Perform Action + udescriptor: "obs_kx_check" + where: + - variable: ObsType/stationPressure + is_not_in: 187 + action: + name: reduce obs space + + # Reject all obs with QualityMarker > 3 + - filter: RejectList + udescriptor: "quality_marker_check" + filter variables: + - name: stationPressure + where: + - variable: QualityMarker/stationPressure + is_in: 4-15 + value: is_not_valid + where operator: or + action: + name: reduce obs space + + # Time window filter + - filter: Bounds Check + udescriptor: "time_window_check" + filter variables: + - name: stationPressure + test variables: + - name: MetaData/timeOffset + minvalue: -900 + maxvalue: 900 + where: + - variable: ObsType/stationPressure + is_in: 187 + action: + name: reduce obs space + + # Duplicate Check + - filter: Temporal Thinning + udescriptor: "duplicate_check" + filter variables: + - name: stationPressure + min_spacing: PT90M + tolerance: PT0H + seed_time: "{{atmosphere_background_time_iso}}" + category_variable: + name: MetaData/longitude_latitude_pressure + where: + - variable: ObsType/stationPressure + is_in: 187 + action: + name: reduce obs space + + # Online regional domain check + - filter: Bounds Check + udescriptor: "online_domain_check" + filter variables: + - name: stationPressure + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + udescriptor: "initial_error_assignment" + filter variables: + - name: stationPressure + where: + - variable: ObsType/stationPressure + is_in: 187 + 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] + errors: [53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11] + + # Error inflation based on pressure check (setupps.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: stationPressure + where: + - variable: ObsType/stationPressure + is_in: 187 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorSfcPressure + options: + geovar_geomz: geopotential_height + geovar_sfc_geomz: geopotential_height_at_surface + +# # Error inflation based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: stationPressure +# where: +# - variable: ObsType/stationPressure +# is_in: 187 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [stationPressure] +# pressure: MetaData/pressure + + # Error inflation when QualityMarker == 3 (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_QualityMarker" + filter variables: + - name: stationPressure + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: QualityMarker/stationPressure + is_in: 3 + - variable: ObsType/stationPressure + is_in: 187 + + # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_observation_pressure" + filter variables: + - name: stationPressure + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: MetaData/pressure + maxvalue: 10000.0 + - variable: ObsType/stationPressure + is_in: 187 + + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: stationPressure + test variables: + - name: ObsErrorData/stationPressure + minvalue: 0.0 + maxvalue: 1000 + where: + - variable: ObsType/stationPressure + is_in: 187 + action: + name: reduce obs space + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: stationPressure + minvalue: 20000.0 + maxvalue: 120000.0 + where: + - variable: ObsType/stationPressure + is_in: 187 + action: + name: reduce obs space + + # Create temporary ObsErrorData + - filter: Variable Assignment + udescriptor: "create_temporary_ObsErrorData" + apply at iterations: 0,1 + where: + - variable: ObsType/stationPressure + is_in: 187 + assignments: + - name: TempObsErrorData/stationPressure + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/stationPressure + defer to post: true + + # Set ObsError set "error parameter" if < "max value" + - filter: Perform Action + udescriptor: "ermin_set" + apply at iterations: 0,1 + filter variables: + - name: stationPressure + action: + name: assign error + error parameter: 100.0 + where: + - variable: + name: ObsErrorData/stationPressure + maxvalue: 100.0 + - variable: + name: ObsErrorData/stationPressure + value: is_valid + - variable: ObsType/stationPressure + is_in: 187 + defer to post: true + + # Set ObsError set "error parameter" if > "min value" + - filter: Perform Action + udescriptor: "ermax_set" + apply at iterations: 0,1 + filter variables: + - name: stationPressure + action: + name: assign error + error parameter: 300.0 + where: + - variable: + name: ObsErrorData/stationPressure + minvalue: 300.0 + - variable: + name: ObsErrorData/stationPressure + value: is_valid + - variable: ObsType/stationPressure + is_in: 187 + defer to post: true + + # Gross Error Check + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: stationPressure + threshold: 5.0 + action: + name: reject + where: + - variable: QualityMarker/stationPressure + is_not_in: 3 + - variable: ObsType/stationPressure + is_in: 187 + defer to post: true + + # Gross Error Check: cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: stationPressure + threshold: 3.5 + action: + name: reject + where: + - variable: QualityMarker/stationPressure + is_in: 3 + - variable: ObsType/stationPressure + is_in: 187 + defer to post: true + + # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. + - filter: Perform Action + udescriptor: "reassign_error_TempObsErrorData" + apply at iterations: 0,1 + filter variables: + - name: stationPressure + action: + name: assign error + error function: TempObsErrorData/stationPressure + where: + - variable: + name: TempObsErrorData/stationPressure + value: is_valid + - variable: ObsType/stationPressure + is_in: 187 + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/adpsfc_winds_281.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_winds_281.yaml.j2 new file mode 100644 index 000000000..4e57f245a --- /dev/null +++ b/parm/jcb-gdas/observations/soil/adpsfc_winds_281.yaml.j2 @@ -0,0 +1,370 @@ + - obs space: + name: adpsfc_winds_281 + obsdatain: + engine: + type: H5File + obsfile: "data/obs/ioda_adpsfc.nc" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + sort variable: "pressure" + sort order: "descending" + obsdataout: + empty obs space action: "{{empty_obs_space_action}}" + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: jdiag_adpsfc_winds_281.nc + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [windEastward, windNorthward] + simulated variables: [windEastward, windNorthward] + + obs operator: + name: VertInterp + vertical coordinate: air_pressure + observation vertical coordinate: pressure + observation vertical coordinate group: MetaData + interpolation method: log-linear + variables: + - name: windEastward + - name: windNorthward + + linear obs operator: + name: VertInterp + + obs error: + covariance model: diagonal + + obs filters: + # ------------------ + # wind (281) + # ------------------ + # Accept, reject, or passivate (monitor) + - filter: Perform Action + udescriptor: "iuse_check" + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 281 + action: + name: {{iuse_adpsfc_winds_281 | default("passivate", true)}} # accept, reject, passivate + + # Reject all obs not in type + - filter: Perform Action + udescriptor: "obs_type_check" + where: + - variable: ObsValue/windEastward + value: is_not_valid + action: + name: reduce obs space + + # Reject all obs not in kx + - filter: Perform Action + udescriptor: "obs_kx_check" + where: + - variable: ObsType/windEastward + is_not_in: 281 + action: + name: reduce obs space + + # Reject all obs with QualityMarker > 3 + - filter: RejectList + udescriptor: "quality_marker_check" + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: QualityMarker/windEastward + is_in: 4-15 + value: is_not_valid + where operator: or + action: + name: reduce obs space + + # Time window filter + - filter: Bounds Check + udescriptor: "time_window_check" + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: MetaData/timeOffset + minvalue: -900 + maxvalue: 900 + where: + - variable: ObsType/windEastward + is_in: 281 + action: + name: reduce obs space + + # Duplicate Check + - filter: Temporal Thinning + udescriptor: "duplicate_check" + filter variables: + - name: windEastward + - name: windNorthward + min_spacing: PT90M + tolerance: PT0H + seed_time: "{{atmosphere_background_time_iso}}" + category_variable: + name: MetaData/longitude_latitude_pressure + where: + - variable: ObsType/windEastward + is_in: 281 + action: + name: reduce obs space + + # Online domain check + - filter: Bounds Check + udescriptor: "online_domain_check" + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + udescriptor: "initial_error_assignment" + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 281 + 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] + errors: [1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874] + + # Error inflation (windEastward) based on pressure check (setupw.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: windEastward + where: + - variable: ObsType/windEastward + is_in: 281 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windEastward + inflation factor: 4.0 + SetSfcWndObsHeight: true + AddObsHeightToStationElevation: true + AssumedSfcWndObsHeight: 10 + + # Error inflation (windNorthward) based on pressure check (setupw.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: windNorthward + where: + - variable: ObsType/windNorthward + is_in: 281 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windNorthward + inflation factor: 4.0 + SetSfcWndObsHeight: true + AddObsHeightToStationElevation: true + AssumedSfcWndObsHeight: 10 + +# # Error inflation (windEastward) based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: windEastward +# where: +# - variable: ObsType/windEastward +# is_in: 281 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [windEastward] +# test QCflag: QualityMarker +# test QCthreshold: 3 +# distance threshold: 0 +# pressure: MetaData/pressure + +# # Error inflation (windNorthward) based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: windNorthward +# where: +# - variable: ObsType/windNorthward +# is_in: 281 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [windNorthward] +# test QCflag: QualityMarker +# test QCthreshold: 3 +# distance threshold: 0 +# pressure: MetaData/pressure + + # Error inflation when QualityMarker == 3 (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_QualityMarker" + filter variables: + - name: windEastward + - name: windNorthward + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: QualityMarker/windEastward + is_in: 3 + - variable: ObsType/windEastward + is_in: 281 + + # Error inflation when observation pressure < 50 hPa (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_observation_pressure" + filter variables: + - name: windEastward + - name: windNorthward + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: MetaData/pressure + maxvalue: 5000.0 + - variable: ObsType/windEastward + is_in: 281 + + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: ObsErrorData/windEastward + minvalue: 0.0 + maxvalue: 1000 + where: + - variable: ObsType/windEastward + is_in: 281 + action: + name: reduce obs space + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: windEastward + - name: windNorthward + minvalue: -130 + maxvalue: 130 + where: + - variable: ObsType/windEastward + is_in: 281 + action: + name: reduce obs space + + # Gross Error Check (windEastward) + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: windEastward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 281 ] + cgross: [ 5.0 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windEastward + where: + - variable: QualityMarker/windEastward + is_not_in: 3 + action: + name: reject + defer to post: true + + # Gross Error Check (windNorthward) + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: windNorthward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 281 ] + cgross: [ 5.0 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windNorthward + where: + - variable: QualityMarker/windNorthward + is_not_in: 3 + action: + name: reject + defer to post: true + + # Gross Error Check (windEastward): cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: windEastward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 281 ] + cgross: [ 3.5 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windEastward + where: + - variable: QualityMarker/windEastward + is_in: 3 + action: + name: reject + defer to post: true + + # Gross Error Check (windNorthward): cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: windNorthward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 281 ] + cgross: [ 3.5 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windNorthward + where: + - variable: QualityMarker/windNorthward + is_in: 3 + action: + name: reject + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/adpsfc_winds_284.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_winds_284.yaml.j2 new file mode 100644 index 000000000..1a5beb3df --- /dev/null +++ b/parm/jcb-gdas/observations/soil/adpsfc_winds_284.yaml.j2 @@ -0,0 +1,370 @@ + - obs space: + name: adpsfc_winds_284 + obsdatain: + engine: + type: H5File + obsfile: "data/obs/ioda_adpsfc.nc" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + sort variable: "pressure" + sort order: "descending" + obsdataout: + empty obs space action: "{{empty_obs_space_action}}" + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: jdiag_adpsfc_winds_284.nc + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [windEastward, windNorthward] + simulated variables: [windEastward, windNorthward] + + obs operator: + name: VertInterp + vertical coordinate: air_pressure + observation vertical coordinate: pressure + observation vertical coordinate group: MetaData + interpolation method: log-linear + variables: + - name: windEastward + - name: windNorthward + + linear obs operator: + name: VertInterp + + obs error: + covariance model: diagonal + + obs filters: + # ------------------ + # wind (284) + # ------------------ + # Accept, reject, or passivate (monitor) + - filter: Perform Action + udescriptor: "iuse_check" + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 284 + action: + name: {{iuse_adpsfc_winds_284 | default("passivate", true)}} # accept, reject, passivate + + # Reject all obs not in type + - filter: Perform Action + udescriptor: "obs_type_check" + where: + - variable: ObsValue/windEastward + value: is_not_valid + action: + name: reduce obs space + + # Reject all obs not in kx + - filter: Perform Action + udescriptor: "obs_kx_check" + where: + - variable: ObsType/windEastward + is_not_in: 284 + action: + name: reduce obs space + + # Reject all obs with QualityMarker > 3 + - filter: RejectList + udescriptor: "quality_marker_check" + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: QualityMarker/windEastward + is_in: 4-15 + value: is_not_valid + where operator: or + action: + name: reduce obs space + + # Time window filter + - filter: Bounds Check + udescriptor: "time_window_check" + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: MetaData/timeOffset + minvalue: -5400 + maxvalue: 5400 + where: + - variable: ObsType/windEastward + is_in: 284 + action: + name: reduce obs space + + # Duplicate Check + - filter: Temporal Thinning + udescriptor: "duplicate_check" + filter variables: + - name: windEastward + - name: windNorthward + min_spacing: PT90M + tolerance: PT0H + seed_time: "{{atmosphere_background_time_iso}}" + category_variable: + name: MetaData/longitude_latitude_pressure + where: + - variable: ObsType/windEastward + is_in: 284 + action: + name: reduce obs space + + # Online domain check + - filter: Bounds Check + udescriptor: "online_domain_check" + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + udescriptor: "initial_error_assignment" + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 284 + 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] + errors: [1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079] + + # Error inflation (windEastward) based on pressure check (setupw.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: windEastward + where: + - variable: ObsType/windEastward + is_in: 284 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windEastward + inflation factor: 4.0 + SetSfcWndObsHeight: true + AddObsHeightToStationElevation: true + AssumedSfcWndObsHeight: 10 + + # Error inflation (windNorthward) based on pressure check (setupw.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: windNorthward + where: + - variable: ObsType/windNorthward + is_in: 284 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windNorthward + inflation factor: 4.0 + SetSfcWndObsHeight: true + AddObsHeightToStationElevation: true + AssumedSfcWndObsHeight: 10 + +# # Error inflation (windEastward) based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: windEastward +# where: +# - variable: ObsType/windEastward +# is_in: 284 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [windEastward] +# test QCflag: QualityMarker +# test QCthreshold: 3 +# distance threshold: 0 +# pressure: MetaData/pressure + +# # Error inflation (windNorthward) based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: windNorthward +# where: +# - variable: ObsType/windNorthward +# is_in: 284 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [windNorthward] +# test QCflag: QualityMarker +# test QCthreshold: 3 +# distance threshold: 0 +# pressure: MetaData/pressure + + # Error inflation when QualityMarker == 3 (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_QualityMarker" + filter variables: + - name: windEastward + - name: windNorthward + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: QualityMarker/windEastward + is_in: 3 + - variable: ObsType/windEastward + is_in: 284 + + # Error inflation when observation pressure < 50 hPa (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_observation_pressure" + filter variables: + - name: windEastward + - name: windNorthward + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: MetaData/pressure + maxvalue: 5000.0 + - variable: ObsType/windEastward + is_in: 284 + + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: ObsErrorData/windEastward + minvalue: 0.0 + maxvalue: 1000 + where: + - variable: ObsType/windEastward + is_in: 284 + action: + name: reduce obs space + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: windEastward + - name: windNorthward + minvalue: -130 + maxvalue: 130 + where: + - variable: ObsType/windEastward + is_in: 284 + action: + name: reduce obs space + + # Gross Error Check (windEastward) + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: windEastward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 284 ] + cgross: [ 5.0 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windEastward + where: + - variable: QualityMarker/windEastward + is_not_in: 3 + action: + name: reject + defer to post: true + + # Gross Error Check (windNorthward) + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: windNorthward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 284 ] + cgross: [ 5.0 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windNorthward + where: + - variable: QualityMarker/windNorthward + is_not_in: 3 + action: + name: reject + defer to post: true + + # Gross Error Check (windEastward): cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: windEastward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 284 ] + cgross: [ 3.5 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windEastward + where: + - variable: QualityMarker/windEastward + is_in: 3 + action: + name: reject + defer to post: true + + # Gross Error Check (windNorthward): cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: windNorthward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 284 ] + cgross: [ 3.5 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windNorthward + where: + - variable: QualityMarker/windNorthward + is_in: 3 + action: + name: reject + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/adpsfc_winds_287.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_winds_287.yaml.j2 new file mode 100644 index 000000000..75c2f9661 --- /dev/null +++ b/parm/jcb-gdas/observations/soil/adpsfc_winds_287.yaml.j2 @@ -0,0 +1,370 @@ + - obs space: + name: adpsfc_winds_287 + obsdatain: + engine: + type: H5File + obsfile: "data/obs/ioda_adpsfc.nc" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + sort variable: "pressure" + sort order: "descending" + obsdataout: + empty obs space action: "{{empty_obs_space_action}}" + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: jdiag_adpsfc_winds_287.nc + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [windEastward, windNorthward] + simulated variables: [windEastward, windNorthward] + + obs operator: + name: VertInterp + vertical coordinate: air_pressure + observation vertical coordinate: pressure + observation vertical coordinate group: MetaData + interpolation method: log-linear + variables: + - name: windEastward + - name: windNorthward + + linear obs operator: + name: VertInterp + + obs error: + covariance model: diagonal + + obs filters: + # ------------------ + # wind (287) + # ------------------ + # Accept, reject, or passivate (monitor) + - filter: Perform Action + udescriptor: "iuse_check" + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 287 + action: + name: {{iuse_adpsfc_winds_287 | default("passivate", true)}} # accept, reject, passivate + + # Reject all obs not in type + - filter: Perform Action + udescriptor: "obs_type_check" + where: + - variable: ObsValue/windEastward + value: is_not_valid + action: + name: reduce obs space + + # Reject all obs not in kx + - filter: Perform Action + udescriptor: "obs_kx_check" + where: + - variable: ObsType/windEastward + is_not_in: 287 + action: + name: reduce obs space + + # Reject all obs with QualityMarker > 3 + - filter: RejectList + udescriptor: "quality_marker_check" + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: QualityMarker/windEastward + is_in: 4-15 + value: is_not_valid + where operator: or + action: + name: reduce obs space + + # Time window filter + - filter: Bounds Check + udescriptor: "time_window_check" + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: MetaData/timeOffset + minvalue: -900 + maxvalue: 900 + where: + - variable: ObsType/windEastward + is_in: 287 + action: + name: reduce obs space + + # Duplicate Check + - filter: Temporal Thinning + udescriptor: "duplicate_check" + filter variables: + - name: windEastward + - name: windNorthward + min_spacing: PT90M + tolerance: PT0H + seed_time: "{{atmosphere_background_time_iso}}" + category_variable: + name: MetaData/longitude_latitude_pressure + where: + - variable: ObsType/windEastward + is_in: 287 + action: + name: reduce obs space + + # Online domain check + - filter: Bounds Check + udescriptor: "online_domain_check" + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + udescriptor: "initial_error_assignment" + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 287 + 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] + errors: [1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874] + + # Error inflation (windEastward) based on pressure check (setupw.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: windEastward + where: + - variable: ObsType/windEastward + is_in: 287 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windEastward + inflation factor: 4.0 + SetSfcWndObsHeight: true + AddObsHeightToStationElevation: true + AssumedSfcWndObsHeight: 10 + + # Error inflation (windNorthward) based on pressure check (setupw.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: windNorthward + where: + - variable: ObsType/windNorthward + is_in: 287 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windNorthward + inflation factor: 4.0 + SetSfcWndObsHeight: true + AddObsHeightToStationElevation: true + AssumedSfcWndObsHeight: 10 + +# # Error inflation (windEastward) based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: windEastward +# where: +# - variable: ObsType/windEastward +# is_in: 287 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [windEastward] +# test QCflag: QualityMarker +# test QCthreshold: 3 +# distance threshold: 0 +# pressure: MetaData/pressure + +# # Error inflation (windNorthward) based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: windNorthward +# where: +# - variable: ObsType/windNorthward +# is_in: 287 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [windNorthward] +# test QCflag: QualityMarker +# test QCthreshold: 3 +# distance threshold: 0 +# pressure: MetaData/pressure + + # Error inflation when QualityMarker == 3 (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_QualityMarker" + filter variables: + - name: windEastward + - name: windNorthward + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: QualityMarker/windEastward + is_in: 3 + - variable: ObsType/windEastward + is_in: 287 + + # Error inflation when observation pressure < 50 hPa (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_observation_pressure" + filter variables: + - name: windEastward + - name: windNorthward + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: MetaData/pressure + maxvalue: 5000.0 + - variable: ObsType/windEastward + is_in: 287 + + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: ObsErrorData/windEastward + minvalue: 0.0 + maxvalue: 1000 + where: + - variable: ObsType/windEastward + is_in: 287 + action: + name: reduce obs space + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: windEastward + - name: windNorthward + minvalue: -130 + maxvalue: 130 + where: + - variable: ObsType/windEastward + is_in: 287 + action: + name: reduce obs space + + # Gross Error Check (windEastward) + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: windEastward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 287 ] + cgross: [ 5.0 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windEastward + where: + - variable: QualityMarker/windEastward + is_not_in: 3 + action: + name: reject + defer to post: true + + # Gross Error Check (windNorthward) + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: windNorthward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 287 ] + cgross: [ 5.0 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windNorthward + where: + - variable: QualityMarker/windNorthward + is_not_in: 3 + action: + name: reject + defer to post: true + + # Gross Error Check (windEastward): cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: windEastward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 287 ] + cgross: [ 3.5 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windEastward + where: + - variable: QualityMarker/windEastward + is_in: 3 + action: + name: reject + defer to post: true + + # Gross Error Check (windNorthward): cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: windNorthward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 287 ] + cgross: [ 3.5 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windNorthward + where: + - variable: QualityMarker/windNorthward + is_in: 3 + action: + name: reject + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/sfcshp_airTemperature_180.yaml.j2 b/parm/jcb-gdas/observations/soil/sfcshp_airTemperature_180.yaml.j2 new file mode 100644 index 000000000..a379dc8c6 --- /dev/null +++ b/parm/jcb-gdas/observations/soil/sfcshp_airTemperature_180.yaml.j2 @@ -0,0 +1,340 @@ + - obs space: + name: sfcshp_airTemperature_180 + obsdatain: + engine: + type: H5File + obsfile: "data/obs/ioda_sfcshp.nc" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + sort variable: "pressure" + sort order: "descending" + obsdataout: + empty obs space action: "{{empty_obs_space_action}}" + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: jdiag_sfcshp_airTemperature_180.nc + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [airTemperature] + simulated variables: [airTemperature] + + obs operator: + name: VertInterp + vertical coordinate: air_pressure + observation vertical coordinate: pressure + observation vertical coordinate group: MetaData + interpolation method: log-linear + variables: + - name: airTemperature + + linear obs operator: + name: VertInterp + + obs error: + covariance model: diagonal + + obs filters: + # ------------------ + # airTemperature (180) + # ------------------ + # Accept, reject, or passivate (monitor) + - filter: Perform Action + udescriptor: "iuse_check" + filter variables: + - name: airTemperature + where: + - variable: ObsType/airTemperature + is_in: 180 + action: + name: {{iuse_sfcshp_airTemperature_180 | default("passivate", true)}} # accept, reject, passivate + + # Reject all obs not in type + - filter: Perform Action + udescriptor: "obs_type_check" + where: + - variable: ObsValue/airTemperature + value: is_not_valid + action: + name: reduce obs space + + # Reject all obs not in kx + - filter: Perform Action + udescriptor: "obs_kx_check" + where: + - variable: ObsType/airTemperature + is_not_in: 180 + action: + name: reduce obs space + + # Reject all obs with QualityMarker > 3 + - filter: RejectList + udescriptor: "quality_marker_check" + filter variables: + - name: airTemperature + where: + - variable: QualityMarker/airTemperature + is_in: 4-15 + value: is_not_valid + where operator: or + action: + name: reduce obs space + + # Time window filter + - filter: Bounds Check + udescriptor: "time_window_check" + filter variables: + - name: airTemperature + test variables: + - name: MetaData/timeOffset + minvalue: -5400 + maxvalue: 5400 + where: + - variable: ObsType/airTemperature + is_in: 180 + action: + name: reduce obs space + + # Duplicate Check + - filter: Temporal Thinning + udescriptor: "duplicate_check" + filter variables: + - name: airTemperature + min_spacing: PT90M + tolerance: PT0H + seed_time: "{{atmosphere_background_time_iso}}" + category_variable: + name: MetaData/longitude_latitude_pressure + where: + - variable: ObsType/airTemperature + is_in: 180 + action: + name: reduce obs space + + # Online regional domain check + - filter: Bounds Check + udescriptor: "online_domain_check" + filter variables: + - name: airTemperature + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + udescriptor: "initial_error_assignment" + filter variables: + - name: airTemperature + where: + - variable: ObsType/airTemperature + is_in: 180 + 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] + errors: [2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253] + + # Error inflation based on pressure check (setupt.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: airTemperature + where: + - variable: ObsType/airTemperature + is_in: 180 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: airTemperature + surface observation error ramp: true + max levels below surface: 15 + inflation factor: 8.0 + +# # Error inflation based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: airTemperature +# where: +# - variable: ObsType/airTemperature +# is_in: 180 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [airTemperature] +# pressure: MetaData/pressure + + # Error inflation when QualityMarker == 3 (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_QualityMarker" + filter variables: + - name: airTemperature + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: QualityMarker/airTemperature + is_in: 3 + - variable: ObsType/airTemperature + is_in: 180 + + # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_observation_pressure" + filter variables: + - name: airTemperature + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: MetaData/pressure + maxvalue: 10000.0 + - variable: ObsType/airTemperature + is_in: 180 + + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: airTemperature + test variables: + - name: ObsErrorData/airTemperature + minvalue: 0.0 + maxvalue: 1000 + where: + - variable: ObsType/airTemperature + is_in: 180 + action: + name: reduce obs space + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: airTemperature + minvalue: 100 + maxvalue: 400 + where: + - variable: ObsType/airTemperature + is_in: 180 + action: + name: reduce obs space + + # Create temporary ObsErrorData + - filter: Variable Assignment + udescriptor: "create_temporary_ObsErrorData" + apply at iterations: 0,1 + where: + - variable: ObsType/airTemperature + is_in: 180 + assignments: + - name: TempObsErrorData/airTemperature + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/airTemperature + defer to post: true + + # Set ObsError set "error parameter" if < "max value" + - filter: Perform Action + udescriptor: "ermin_set" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + action: + name: assign error + error parameter: 1.0 + where: + - variable: + name: ObsErrorData/airTemperature + maxvalue: 1.0 + - variable: + name: ObsErrorData/airTemperature + value: is_valid + - variable: ObsType/airTemperature + is_in: 180 + defer to post: true + + # Set ObsError set "error parameter" if > "min value" + - filter: Perform Action + udescriptor: "ermax_set" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + action: + name: assign error + error parameter: 3.0 + where: + - variable: + name: ObsErrorData/airTemperature + minvalue: 3.0 + - variable: + name: ObsErrorData/airTemperature + value: is_valid + - variable: ObsType/airTemperature + is_in: 180 + defer to post: true + + # Gross Error Check + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + threshold: 7.0 + action: + name: reject + where: + - variable: QualityMarker/airTemperature + is_not_in: 3 + - variable: ObsType/airTemperature + is_in: 180 + defer to post: true + + # Gross Error Check: cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + threshold: 4.9 + action: + name: reject + where: + - variable: QualityMarker/airTemperature + is_in: 3 + - variable: ObsType/airTemperature + is_in: 180 + defer to post: true + + # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. + - filter: Perform Action + udescriptor: "reassign_error_TempObsErrorData" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + action: + name: assign error + error function: TempObsErrorData/airTemperature + where: + - variable: + name: TempObsErrorData/airTemperature + value: is_valid + - variable: ObsType/airTemperature + is_in: 180 + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/sfcshp_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/sfcshp_airTemperature_182.yaml.j2 b/parm/jcb-gdas/observations/soil/sfcshp_airTemperature_182.yaml.j2 new file mode 100644 index 000000000..5b1b460df --- /dev/null +++ b/parm/jcb-gdas/observations/soil/sfcshp_airTemperature_182.yaml.j2 @@ -0,0 +1,340 @@ + - obs space: + name: sfcshp_airTemperature_182 + obsdatain: + engine: + type: H5File + obsfile: "data/obs/ioda_sfcshp.nc" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + sort variable: "pressure" + sort order: "descending" + obsdataout: + empty obs space action: "{{empty_obs_space_action}}" + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: jdiag_sfcshp_airTemperature_182.nc + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [airTemperature] + simulated variables: [airTemperature] + + obs operator: + name: VertInterp + vertical coordinate: air_pressure + observation vertical coordinate: pressure + observation vertical coordinate group: MetaData + interpolation method: log-linear + variables: + - name: airTemperature + + linear obs operator: + name: VertInterp + + obs error: + covariance model: diagonal + + obs filters: + # ------------------ + # airTemperature (182) + # ------------------ + # Accept, reject, or passivate (monitor) + - filter: Perform Action + udescriptor: "iuse_check" + filter variables: + - name: airTemperature + where: + - variable: ObsType/airTemperature + is_in: 182 + action: + name: {{iuse_sfcshp_airTemperature_182 | default("passivate", true)}} # accept, reject, passivate + + # Reject all obs not in type + - filter: Perform Action + udescriptor: "obs_type_check" + where: + - variable: ObsValue/airTemperature + value: is_not_valid + action: + name: reduce obs space + + # Reject all obs not in kx + - filter: Perform Action + udescriptor: "obs_kx_check" + where: + - variable: ObsType/airTemperature + is_not_in: 182 + action: + name: reduce obs space + + # Reject all obs with QualityMarker > 3 + - filter: RejectList + udescriptor: "quality_marker_check" + filter variables: + - name: airTemperature + where: + - variable: QualityMarker/airTemperature + is_in: 4-15 + value: is_not_valid + where operator: or + action: + name: reduce obs space + + # Time window filter + - filter: Bounds Check + udescriptor: "time_window_check" + filter variables: + - name: airTemperature + test variables: + - name: MetaData/timeOffset + minvalue: -5400 + maxvalue: 5400 + where: + - variable: ObsType/airTemperature + is_in: 182 + action: + name: reduce obs space + + # Duplicate Check + - filter: Temporal Thinning + udescriptor: "duplicate_check" + filter variables: + - name: airTemperature + min_spacing: PT90M + tolerance: PT0H + seed_time: "{{atmosphere_background_time_iso}}" + category_variable: + name: MetaData/longitude_latitude_pressure + where: + - variable: ObsType/airTemperature + is_in: 182 + action: + name: reduce obs space + + # Online regional domain check + - filter: Bounds Check + udescriptor: "online_domain_check" + filter variables: + - name: airTemperature + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + udescriptor: "initial_error_assignment" + filter variables: + - name: airTemperature + where: + - variable: ObsType/airTemperature + is_in: 182 + 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] + errors: [1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054] + + # Error inflation based on pressure check (setupt.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: airTemperature + where: + - variable: ObsType/airTemperature + is_in: 182 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: airTemperature + surface observation error ramp: true + max levels below surface: 15 + inflation factor: 8.0 + +# # Error inflation based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: airTemperature +# where: +# - variable: ObsType/airTemperature +# is_in: 182 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [airTemperature] +# pressure: MetaData/pressure + + # Error inflation when QualityMarker == 3 (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_QualityMarker" + filter variables: + - name: airTemperature + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: QualityMarker/airTemperature + is_in: 3 + - variable: ObsType/airTemperature + is_in: 182 + + # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_observation_pressure" + filter variables: + - name: airTemperature + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: MetaData/pressure + maxvalue: 10000.0 + - variable: ObsType/airTemperature + is_in: 182 + + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: airTemperature + test variables: + - name: ObsErrorData/airTemperature + minvalue: 0.0 + maxvalue: 1000 + where: + - variable: ObsType/airTemperature + is_in: 182 + action: + name: reduce obs space + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: airTemperature + minvalue: 100 + maxvalue: 400 + where: + - variable: ObsType/airTemperature + is_in: 182 + action: + name: reduce obs space + + # Create temporary ObsErrorData + - filter: Variable Assignment + udescriptor: "create_temporary_ObsErrorData" + apply at iterations: 0,1 + where: + - variable: ObsType/airTemperature + is_in: 182 + assignments: + - name: TempObsErrorData/airTemperature + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/airTemperature + defer to post: true + + # Set ObsError set "error parameter" if < "max value" + - filter: Perform Action + udescriptor: "ermin_set" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + action: + name: assign error + error parameter: 1.0 + where: + - variable: + name: ObsErrorData/airTemperature + maxvalue: 1.0 + - variable: + name: ObsErrorData/airTemperature + value: is_valid + - variable: ObsType/airTemperature + is_in: 182 + defer to post: true + + # Set ObsError set "error parameter" if > "min value" + - filter: Perform Action + udescriptor: "ermax_set" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + action: + name: assign error + error parameter: 3.0 + where: + - variable: + name: ObsErrorData/airTemperature + minvalue: 3.0 + - variable: + name: ObsErrorData/airTemperature + value: is_valid + - variable: ObsType/airTemperature + is_in: 182 + defer to post: true + + # Gross Error Check + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + threshold: 5.0 + action: + name: reject + where: + - variable: QualityMarker/airTemperature + is_not_in: 3 + - variable: ObsType/airTemperature + is_in: 182 + defer to post: true + + # Gross Error Check: cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + threshold: 3.5 + action: + name: reject + where: + - variable: QualityMarker/airTemperature + is_in: 3 + - variable: ObsType/airTemperature + is_in: 182 + defer to post: true + + # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. + - filter: Perform Action + udescriptor: "reassign_error_TempObsErrorData" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + action: + name: assign error + error function: TempObsErrorData/airTemperature + where: + - variable: + name: TempObsErrorData/airTemperature + value: is_valid + - variable: ObsType/airTemperature + is_in: 182 + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/sfcshp_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/sfcshp_airTemperature_183.yaml.j2 b/parm/jcb-gdas/observations/soil/sfcshp_airTemperature_183.yaml.j2 new file mode 100644 index 000000000..e6f17172a --- /dev/null +++ b/parm/jcb-gdas/observations/soil/sfcshp_airTemperature_183.yaml.j2 @@ -0,0 +1,340 @@ + - obs space: + name: sfcshp_airTemperature_183 + obsdatain: + engine: + type: H5File + obsfile: "data/obs/ioda_sfcshp.nc" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + sort variable: "pressure" + sort order: "descending" + obsdataout: + empty obs space action: "{{empty_obs_space_action}}" + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: jdiag_sfcshp_airTemperature_183.nc + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [airTemperature] + simulated variables: [airTemperature] + + obs operator: + name: VertInterp + vertical coordinate: air_pressure + observation vertical coordinate: pressure + observation vertical coordinate group: MetaData + interpolation method: log-linear + variables: + - name: airTemperature + + linear obs operator: + name: VertInterp + + obs error: + covariance model: diagonal + + obs filters: + # ------------------ + # airTemperature (183) + # ------------------ + # Accept, reject, or passivate (monitor) + - filter: Perform Action + udescriptor: "iuse_check" + filter variables: + - name: airTemperature + where: + - variable: ObsType/airTemperature + is_in: 183 + action: + name: {{iuse_sfcshp_airTemperature_183 | default("passivate", true)}} # accept, reject, passivate + + # Reject all obs not in type + - filter: Perform Action + udescriptor: "obs_type_check" + where: + - variable: ObsValue/airTemperature + value: is_not_valid + action: + name: reduce obs space + + # Reject all obs not in kx + - filter: Perform Action + udescriptor: "obs_kx_check" + where: + - variable: ObsType/airTemperature + is_not_in: 183 + action: + name: reduce obs space + + # Reject all obs with QualityMarker > 3 + - filter: RejectList + udescriptor: "quality_marker_check" + filter variables: + - name: airTemperature + where: + - variable: QualityMarker/airTemperature + is_in: 4-15 + value: is_not_valid + where operator: or + action: + name: reduce obs space + + # Time window filter + - filter: Bounds Check + udescriptor: "time_window_check" + filter variables: + - name: airTemperature + test variables: + - name: MetaData/timeOffset + minvalue: -900 + maxvalue: 900 + where: + - variable: ObsType/airTemperature + is_in: 183 + action: + name: reduce obs space + + # Duplicate Check + - filter: Temporal Thinning + udescriptor: "duplicate_check" + filter variables: + - name: airTemperature + min_spacing: PT90M + tolerance: PT0H + seed_time: "{{atmosphere_background_time_iso}}" + category_variable: + name: MetaData/longitude_latitude_pressure + where: + - variable: ObsType/airTemperature + is_in: 183 + action: + name: reduce obs space + + # Online regional domain check + - filter: Bounds Check + udescriptor: "online_domain_check" + filter variables: + - name: airTemperature + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + udescriptor: "initial_error_assignment" + filter variables: + - name: airTemperature + where: + - variable: ObsType/airTemperature + is_in: 183 + 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] + errors: [2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349] + + # Error inflation based on pressure check (setupt.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: airTemperature + where: + - variable: ObsType/airTemperature + is_in: 183 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: airTemperature + surface observation error ramp: true + max levels below surface: 15 + inflation factor: 8.0 + +# # Error inflation based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: airTemperature +# where: +# - variable: ObsType/airTemperature +# is_in: 183 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [airTemperature] +# pressure: MetaData/pressure + + # Error inflation when QualityMarker == 3 (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_QualityMarker" + filter variables: + - name: airTemperature + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: QualityMarker/airTemperature + is_in: 3 + - variable: ObsType/airTemperature + is_in: 183 + + # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_observation_pressure" + filter variables: + - name: airTemperature + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: MetaData/pressure + maxvalue: 10000.0 + - variable: ObsType/airTemperature + is_in: 183 + + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: airTemperature + test variables: + - name: ObsErrorData/airTemperature + minvalue: 0.0 + maxvalue: 1000 + where: + - variable: ObsType/airTemperature + is_in: 183 + action: + name: reduce obs space + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: airTemperature + minvalue: 100 + maxvalue: 400 + where: + - variable: ObsType/airTemperature + is_in: 183 + action: + name: reduce obs space + + # Create temporary ObsErrorData + - filter: Variable Assignment + udescriptor: "create_temporary_ObsErrorData" + apply at iterations: 0,1 + where: + - variable: ObsType/airTemperature + is_in: 183 + assignments: + - name: TempObsErrorData/airTemperature + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/airTemperature + defer to post: true + + # Set ObsError set "error parameter" if < "max value" + - filter: Perform Action + udescriptor: "ermin_set" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + action: + name: assign error + error parameter: 1.0 + where: + - variable: + name: ObsErrorData/airTemperature + maxvalue: 1.0 + - variable: + name: ObsErrorData/airTemperature + value: is_valid + - variable: ObsType/airTemperature + is_in: 183 + defer to post: true + + # Set ObsError set "error parameter" if > "min value" + - filter: Perform Action + udescriptor: "ermax_set" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + action: + name: assign error + error parameter: 3.0 + where: + - variable: + name: ObsErrorData/airTemperature + minvalue: 3.0 + - variable: + name: ObsErrorData/airTemperature + value: is_valid + - variable: ObsType/airTemperature + is_in: 183 + defer to post: true + + # Gross Error Check + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + threshold: 5.0 + action: + name: reject + where: + - variable: QualityMarker/airTemperature + is_not_in: 3 + - variable: ObsType/airTemperature + is_in: 183 + defer to post: true + + # Gross Error Check: cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + threshold: 3.5 + action: + name: reject + where: + - variable: QualityMarker/airTemperature + is_in: 3 + - variable: ObsType/airTemperature + is_in: 183 + defer to post: true + + # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. + - filter: Perform Action + udescriptor: "reassign_error_TempObsErrorData" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + action: + name: assign error + error function: TempObsErrorData/airTemperature + where: + - variable: + name: TempObsErrorData/airTemperature + value: is_valid + - variable: ObsType/airTemperature + is_in: 183 + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/sfcshp_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/sfcshp_specificHumidity_180.yaml.j2 b/parm/jcb-gdas/observations/soil/sfcshp_specificHumidity_180.yaml.j2 new file mode 100644 index 000000000..0879af16b --- /dev/null +++ b/parm/jcb-gdas/observations/soil/sfcshp_specificHumidity_180.yaml.j2 @@ -0,0 +1,340 @@ + - obs space: + name: sfcshp_specificHumidity_180 + obsdatain: + engine: + type: H5File + obsfile: "data/obs/ioda_sfcshp.nc" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + sort variable: "pressure" + sort order: "descending" + obsdataout: + empty obs space action: "{{empty_obs_space_action}}" + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: jdiag_sfcshp_specificHumidity_180.nc + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [specificHumidity] + simulated variables: [specificHumidity] + + obs operator: + name: VertInterp + vertical coordinate: air_pressure + observation vertical coordinate: pressure + observation vertical coordinate group: MetaData + interpolation method: log-linear + variables: + - name: specificHumidity + + linear obs operator: + name: VertInterp + + obs error: + covariance model: diagonal + + obs filters: + # ------------------ + # specificHumidity (180) + # ------------------ + # Accept, reject, or passivate (monitor) + - filter: Perform Action + udescriptor: "iuse_check" + filter variables: + - name: specificHumidity + where: + - variable: ObsType/specificHumidity + is_in: 180 + action: + name: {{iuse_sfcshp_specificHumidity_180 | default("passivate", true)}} # accept, reject, passivate + + # Reject all obs not in type + - filter: Perform Action + udescriptor: "obs_type_check" + where: + - variable: ObsValue/specificHumidity + value: is_not_valid + action: + name: reduce obs space + + # Reject all obs not in kx + - filter: Perform Action + udescriptor: "obs_kx_check" + where: + - variable: ObsType/specificHumidity + is_not_in: 180 + action: + name: reduce obs space + + # Reject all obs with QualityMarker > 3 + - filter: RejectList + udescriptor: "quality_marker_check" + filter variables: + - name: specificHumidity + where: + - variable: QualityMarker/specificHumidity + is_in: 4-15 + value: is_not_valid + where operator: or + action: + name: reduce obs space + + # Time window filter + - filter: Bounds Check + udescriptor: "time_window_check" + filter variables: + - name: specificHumidity + test variables: + - name: MetaData/timeOffset + minvalue: -5400 + maxvalue: 5400 + where: + - variable: ObsType/specificHumidity + is_in: 180 + action: + name: reduce obs space + + # Duplicate Check + - filter: Temporal Thinning + udescriptor: "duplicate_check" + filter variables: + - name: specificHumidity + min_spacing: PT90M + tolerance: PT0H + seed_time: "{{atmosphere_background_time_iso}}" + category_variable: + name: MetaData/longitude_latitude_pressure + where: + - variable: ObsType/specificHumidity + is_in: 180 + action: + name: reduce obs space + + # Online regional domain check + - filter: Bounds Check + udescriptor: "online_domain_check" + filter variables: + - name: specificHumidity + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + udescriptor: "initial_error_assignment" + filter variables: + - name: specificHumidity + where: + - variable: ObsType/specificHumidity + is_in: 180 + 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] + errors: [0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912] + + # Error inflation based on pressure check (setupq.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: specificHumidity + where: + - variable: ObsType/specificHumidity + is_in: 180 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: specificHumidity + surface observation error ramp: true + max levels below surface: 15 + inflation factor: 8.0 + +# # Error inflation based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: specificHumidity +# where: +# - variable: ObsType/specificHumidity +# is_in: 180 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [specificHumidity] +# pressure: MetaData/pressure + + # Error inflation when QualityMarker == 3 (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_QualityMarker" + filter variables: + - name: specificHumidity + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: QualityMarker/specificHumidity + is_in: 3 + - variable: ObsType/specificHumidity + is_in: 180 + + # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_observation_pressure" + filter variables: + - name: specificHumidity + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: MetaData/pressure + maxvalue: 10000.0 + - variable: ObsType/specificHumidity + is_in: 180 + + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: specificHumidity + test variables: + - name: ObsErrorData/specificHumidity + minvalue: 0.0 + maxvalue: 1000 + where: + - variable: ObsType/specificHumidity + is_in: 180 + action: + name: reduce obs space + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: specificHumidity + minvalue: 0.0 + maxvalue: 1.0 + where: + - variable: ObsType/specificHumidity + is_in: 180 + action: + name: reduce obs space + + # Create temporary ObsErrorData + - filter: Variable Assignment + udescriptor: "create_temporary_ObsErrorData" + apply at iterations: 0,1 + where: + - variable: ObsType/specificHumidity + is_in: 180 + assignments: + - name: TempObsErrorData/specificHumidity + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/specificHumidity + defer to post: true + + # Set ObsError set "error parameter" if < "max value" + - filter: Perform Action + udescriptor: "ermin_set" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + action: + name: assign error + error parameter: 5.0 + where: + - variable: + name: ObsErrorData/specificHumidity + maxvalue: 5.0 + - variable: + name: ObsErrorData/specificHumidity + value: is_valid + - variable: ObsType/specificHumidity + is_in: 180 + defer to post: true + + # Set ObsError set "error parameter" if > "min value" + - filter: Perform Action + udescriptor: "ermax_set" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + action: + name: assign error + error parameter: 50.0 + where: + - variable: + name: ObsErrorData/specificHumidity + minvalue: 50.0 + - variable: + name: ObsErrorData/specificHumidity + value: is_valid + - variable: ObsType/specificHumidity + is_in: 180 + defer to post: true + + # Gross Error Check + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + threshold: 7.0 + action: + name: reject + where: + - variable: QualityMarker/specificHumidity + is_not_in: 3 + - variable: ObsType/specificHumidity + is_in: 180 + defer to post: true + + # Gross Error Check: cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + threshold: 4.9 + action: + name: reject + where: + - variable: QualityMarker/specificHumidity + is_in: 3 + - variable: ObsType/specificHumidity + is_in: 180 + defer to post: true + + # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. + - filter: Perform Action + udescriptor: "reassign_error_TempObsErrorData" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + action: + name: assign error + error function: TempObsErrorData/specificHumidity + where: + - variable: + name: TempObsErrorData/specificHumidity + value: is_valid + - variable: ObsType/specificHumidity + is_in: 180 + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/sfcshp_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/sfcshp_specificHumidity_182.yaml.j2 b/parm/jcb-gdas/observations/soil/sfcshp_specificHumidity_182.yaml.j2 new file mode 100644 index 000000000..fa4ef18d7 --- /dev/null +++ b/parm/jcb-gdas/observations/soil/sfcshp_specificHumidity_182.yaml.j2 @@ -0,0 +1,340 @@ + - obs space: + name: sfcshp_specificHumidity_182 + obsdatain: + engine: + type: H5File + obsfile: "data/obs/ioda_sfcshp.nc" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + sort variable: "pressure" + sort order: "descending" + obsdataout: + empty obs space action: "{{empty_obs_space_action}}" + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: jdiag_sfcshp_specificHumidity_182.nc + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [specificHumidity] + simulated variables: [specificHumidity] + + obs operator: + name: VertInterp + vertical coordinate: air_pressure + observation vertical coordinate: pressure + observation vertical coordinate group: MetaData + interpolation method: log-linear + variables: + - name: specificHumidity + + linear obs operator: + name: VertInterp + + obs error: + covariance model: diagonal + + obs filters: + # ------------------ + # specificHumidity (182) + # ------------------ + # Accept, reject, or passivate (monitor) + - filter: Perform Action + udescriptor: "iuse_check" + filter variables: + - name: specificHumidity + where: + - variable: ObsType/specificHumidity + is_in: 182 + action: + name: {{iuse_sfcshp_specificHumidity_182 | default("passivate", true)}} # accept, reject, passivate + + # Reject all obs not in type + - filter: Perform Action + udescriptor: "obs_type_check" + where: + - variable: ObsValue/specificHumidity + value: is_not_valid + action: + name: reduce obs space + + # Reject all obs not in kx + - filter: Perform Action + udescriptor: "obs_kx_check" + where: + - variable: ObsType/specificHumidity + is_not_in: 182 + action: + name: reduce obs space + + # Reject all obs with QualityMarker > 3 + - filter: RejectList + udescriptor: "quality_marker_check" + filter variables: + - name: specificHumidity + where: + - variable: QualityMarker/specificHumidity + is_in: 4-15 + value: is_not_valid + where operator: or + action: + name: reduce obs space + + # Time window filter + - filter: Bounds Check + udescriptor: "time_window_check" + filter variables: + - name: specificHumidity + test variables: + - name: MetaData/timeOffset + minvalue: -5400 + maxvalue: 5400 + where: + - variable: ObsType/specificHumidity + is_in: 182 + action: + name: reduce obs space + + # Duplicate Check + - filter: Temporal Thinning + udescriptor: "duplicate_check" + filter variables: + - name: specificHumidity + min_spacing: PT90M + tolerance: PT0H + seed_time: "{{atmosphere_background_time_iso}}" + category_variable: + name: MetaData/longitude_latitude_pressure + where: + - variable: ObsType/specificHumidity + is_in: 182 + action: + name: reduce obs space + + # Online regional domain check + - filter: Bounds Check + udescriptor: "online_domain_check" + filter variables: + - name: specificHumidity + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + udescriptor: "initial_error_assignment" + filter variables: + - name: specificHumidity + where: + - variable: ObsType/specificHumidity + is_in: 182 + 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] + errors: [0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912] + + # Error inflation based on pressure check (setupq.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: specificHumidity + where: + - variable: ObsType/specificHumidity + is_in: 182 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: specificHumidity + surface observation error ramp: true + max levels below surface: 15 + inflation factor: 8.0 + +# # Error inflation based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: specificHumidity +# where: +# - variable: ObsType/specificHumidity +# is_in: 182 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [specificHumidity] +# pressure: MetaData/pressure + + # Error inflation when QualityMarker == 3 (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_QualityMarker" + filter variables: + - name: specificHumidity + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: QualityMarker/specificHumidity + is_in: 3 + - variable: ObsType/specificHumidity + is_in: 182 + + # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_observation_pressure" + filter variables: + - name: specificHumidity + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: MetaData/pressure + maxvalue: 10000.0 + - variable: ObsType/specificHumidity + is_in: 182 + + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: specificHumidity + test variables: + - name: ObsErrorData/specificHumidity + minvalue: 0.0 + maxvalue: 1000 + where: + - variable: ObsType/specificHumidity + is_in: 182 + action: + name: reduce obs space + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: specificHumidity + minvalue: 0.0 + maxvalue: 1.0 + where: + - variable: ObsType/specificHumidity + is_in: 182 + action: + name: reduce obs space + + # Create temporary ObsErrorData + - filter: Variable Assignment + udescriptor: "create_temporary_ObsErrorData" + apply at iterations: 0,1 + where: + - variable: ObsType/specificHumidity + is_in: 182 + assignments: + - name: TempObsErrorData/specificHumidity + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/specificHumidity + defer to post: true + + # Set ObsError set "error parameter" if < "max value" + - filter: Perform Action + udescriptor: "ermin_set" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + action: + name: assign error + error parameter: 5.0 + where: + - variable: + name: ObsErrorData/specificHumidity + maxvalue: 5.0 + - variable: + name: ObsErrorData/specificHumidity + value: is_valid + - variable: ObsType/specificHumidity + is_in: 182 + defer to post: true + + # Set ObsError set "error parameter" if > "min value" + - filter: Perform Action + udescriptor: "ermax_set" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + action: + name: assign error + error parameter: 50.0 + where: + - variable: + name: ObsErrorData/specificHumidity + minvalue: 50.0 + - variable: + name: ObsErrorData/specificHumidity + value: is_valid + - variable: ObsType/specificHumidity + is_in: 182 + defer to post: true + + # Gross Error Check + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + threshold: 7.0 + action: + name: reject + where: + - variable: QualityMarker/specificHumidity + is_not_in: 3 + - variable: ObsType/specificHumidity + is_in: 182 + defer to post: true + + # Gross Error Check: cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + threshold: 4.9 + action: + name: reject + where: + - variable: QualityMarker/specificHumidity + is_in: 3 + - variable: ObsType/specificHumidity + is_in: 182 + defer to post: true + + # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. + - filter: Perform Action + udescriptor: "reassign_error_TempObsErrorData" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + action: + name: assign error + error function: TempObsErrorData/specificHumidity + where: + - variable: + name: TempObsErrorData/specificHumidity + value: is_valid + - variable: ObsType/specificHumidity + is_in: 182 + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/sfcshp_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/sfcshp_specificHumidity_183.yaml.j2 b/parm/jcb-gdas/observations/soil/sfcshp_specificHumidity_183.yaml.j2 new file mode 100644 index 000000000..4a741512e --- /dev/null +++ b/parm/jcb-gdas/observations/soil/sfcshp_specificHumidity_183.yaml.j2 @@ -0,0 +1,340 @@ + - obs space: + name: sfcshp_specificHumidity_183 + obsdatain: + engine: + type: H5File + obsfile: "data/obs/ioda_sfcshp.nc" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + sort variable: "pressure" + sort order: "descending" + obsdataout: + empty obs space action: "{{empty_obs_space_action}}" + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: jdiag_sfcshp_specificHumidity_183.nc + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [specificHumidity] + simulated variables: [specificHumidity] + + obs operator: + name: VertInterp + vertical coordinate: air_pressure + observation vertical coordinate: pressure + observation vertical coordinate group: MetaData + interpolation method: log-linear + variables: + - name: specificHumidity + + linear obs operator: + name: VertInterp + + obs error: + covariance model: diagonal + + obs filters: + # ------------------ + # specificHumidity (183) + # ------------------ + # Accept, reject, or passivate (monitor) + - filter: Perform Action + udescriptor: "iuse_check" + filter variables: + - name: specificHumidity + where: + - variable: ObsType/specificHumidity + is_in: 183 + action: + name: {{iuse_sfcshp_specificHumidity_183 | default("passivate", true)}} # accept, reject, passivate + + # Reject all obs not in type + - filter: Perform Action + udescriptor: "obs_type_check" + where: + - variable: ObsValue/specificHumidity + value: is_not_valid + action: + name: reduce obs space + + # Reject all obs not in kx + - filter: Perform Action + udescriptor: "obs_kx_check" + where: + - variable: ObsType/specificHumidity + is_not_in: 183 + action: + name: reduce obs space + + # Reject all obs with QualityMarker > 3 + - filter: RejectList + udescriptor: "quality_marker_check" + filter variables: + - name: specificHumidity + where: + - variable: QualityMarker/specificHumidity + is_in: 4-15 + value: is_not_valid + where operator: or + action: + name: reduce obs space + + # Time window filter + - filter: Bounds Check + udescriptor: "time_window_check" + filter variables: + - name: specificHumidity + test variables: + - name: MetaData/timeOffset + minvalue: -900 + maxvalue: 900 + where: + - variable: ObsType/specificHumidity + is_in: 183 + action: + name: reduce obs space + + # Duplicate Check + - filter: Temporal Thinning + udescriptor: "duplicate_check" + filter variables: + - name: specificHumidity + min_spacing: PT90M + tolerance: PT0H + seed_time: "{{atmosphere_background_time_iso}}" + category_variable: + name: MetaData/longitude_latitude_pressure + where: + - variable: ObsType/specificHumidity + is_in: 183 + action: + name: reduce obs space + + # Online regional domain check + - filter: Bounds Check + udescriptor: "online_domain_check" + filter variables: + - name: specificHumidity + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + udescriptor: "initial_error_assignment" + filter variables: + - name: specificHumidity + where: + - variable: ObsType/specificHumidity + is_in: 183 + 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] + errors: [0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912] + + # Error inflation based on pressure check (setupq.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: specificHumidity + where: + - variable: ObsType/specificHumidity + is_in: 183 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: specificHumidity + surface observation error ramp: true + max levels below surface: 15 + inflation factor: 8.0 + +# # Error inflation based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: specificHumidity +# where: +# - variable: ObsType/specificHumidity +# is_in: 183 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [specificHumidity] +# pressure: MetaData/pressure + + # Error inflation when QualityMarker == 3 (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_QualityMarker" + filter variables: + - name: specificHumidity + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: QualityMarker/specificHumidity + is_in: 3 + - variable: ObsType/specificHumidity + is_in: 183 + + # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_observation_pressure" + filter variables: + - name: specificHumidity + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: MetaData/pressure + maxvalue: 10000.0 + - variable: ObsType/specificHumidity + is_in: 183 + + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: specificHumidity + test variables: + - name: ObsErrorData/specificHumidity + minvalue: 0.0 + maxvalue: 1000 + where: + - variable: ObsType/specificHumidity + is_in: 183 + action: + name: reduce obs space + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: specificHumidity + minvalue: 0.0 + maxvalue: 1.0 + where: + - variable: ObsType/specificHumidity + is_in: 183 + action: + name: reduce obs space + + # Create temporary ObsErrorData + - filter: Variable Assignment + udescriptor: "create_temporary_ObsErrorData" + apply at iterations: 0,1 + where: + - variable: ObsType/specificHumidity + is_in: 183 + assignments: + - name: TempObsErrorData/specificHumidity + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/specificHumidity + defer to post: true + + # Set ObsError set "error parameter" if < "max value" + - filter: Perform Action + udescriptor: "ermin_set" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + action: + name: assign error + error parameter: 5.0 + where: + - variable: + name: ObsErrorData/specificHumidity + maxvalue: 5.0 + - variable: + name: ObsErrorData/specificHumidity + value: is_valid + - variable: ObsType/specificHumidity + is_in: 183 + defer to post: true + + # Set ObsError set "error parameter" if > "min value" + - filter: Perform Action + udescriptor: "ermax_set" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + action: + name: assign error + error parameter: 50.0 + where: + - variable: + name: ObsErrorData/specificHumidity + minvalue: 50.0 + - variable: + name: ObsErrorData/specificHumidity + value: is_valid + - variable: ObsType/specificHumidity + is_in: 183 + defer to post: true + + # Gross Error Check + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + threshold: 7.0 + action: + name: reject + where: + - variable: QualityMarker/specificHumidity + is_not_in: 3 + - variable: ObsType/specificHumidity + is_in: 183 + defer to post: true + + # Gross Error Check: cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + threshold: 4.9 + action: + name: reject + where: + - variable: QualityMarker/specificHumidity + is_in: 3 + - variable: ObsType/specificHumidity + is_in: 183 + defer to post: true + + # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. + - filter: Perform Action + udescriptor: "reassign_error_TempObsErrorData" + apply at iterations: 0,1 + filter variables: + - name: specificHumidity + action: + name: assign error + error function: TempObsErrorData/specificHumidity + where: + - variable: + name: TempObsErrorData/specificHumidity + value: is_valid + - variable: ObsType/specificHumidity + is_in: 183 + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/sfcshp_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/sfcshp_stationPressure_180.yaml.j2 b/parm/jcb-gdas/observations/soil/sfcshp_stationPressure_180.yaml.j2 new file mode 100644 index 000000000..12f59eb0e --- /dev/null +++ b/parm/jcb-gdas/observations/soil/sfcshp_stationPressure_180.yaml.j2 @@ -0,0 +1,346 @@ + - obs space: + name: sfcshp_stationPressure_180 + obsdatain: + engine: + type: H5File + obsfile: "data/obs/ioda_sfcshp.nc" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + sort variable: "pressure" + sort order: "descending" + obsdataout: + empty obs space action: "{{empty_obs_space_action}}" + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: jdiag_sfcshp_stationPressure_180.nc + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [stationPressure] + simulated variables: [stationPressure] + + obs operator: + name: SfcCorrected + correction scheme to use: GSL + geovar_sfc_geomz: geopotential_height_at_surface + geovar_geomz: geopotential_height + linear obs operator: + name: Identity + + obs error: + covariance model: diagonal + + obs filters: + # ------------------ + # stationPressure (180) + # ------------------ + # Accept, reject, or passivate (monitor) + - filter: Perform Action + udescriptor: "iuse_check" + filter variables: + - name: stationPressure + where: + - variable: ObsType/stationPressure + is_in: 180 + action: + name: {{iuse_sfcshp_stationPressure_180 | default("passivate", true)}} # accept, reject, passivate + + # Reject all obs not in type + - filter: Perform Action + udescriptor: "obs_type_check" + where: + - variable: ObsValue/stationPressure + value: is_not_valid + action: + name: reduce obs space + + # Reject all obs not in kx + - filter: Perform Action + udescriptor: "obs_kx_check" + where: + - variable: ObsType/stationPressure + is_not_in: 180 + action: + name: reduce obs space + + # Reject all obs with QualityMarker > 3 + - filter: RejectList + udescriptor: "quality_marker_check" + filter variables: + - name: stationPressure + where: + - variable: QualityMarker/stationPressure + is_in: 4-15 + value: is_not_valid + where operator: or + action: + name: reduce obs space + + # Time window filter + - filter: Bounds Check + udescriptor: "time_window_check" + filter variables: + - name: stationPressure + test variables: + - name: MetaData/timeOffset + minvalue: -5400 + maxvalue: 5400 + where: + - variable: ObsType/stationPressure + is_in: 180 + action: + name: reduce obs space + + # Duplicate Check + - filter: Temporal Thinning + udescriptor: "duplicate_check" + filter variables: + - name: stationPressure + min_spacing: PT90M + tolerance: PT0H + seed_time: "{{atmosphere_background_time_iso}}" + category_variable: + name: MetaData/longitude_latitude_pressure + where: + - variable: ObsType/stationPressure + is_in: 180 + action: + name: reduce obs space + + # Online regional domain check + - filter: Bounds Check + udescriptor: "online_domain_check" + filter variables: + - name: stationPressure + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + udescriptor: "initial_error_assignment" + filter variables: + - name: stationPressure + where: + - variable: ObsType/stationPressure + is_in: 180 + 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] + errors: [53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11] + + # Reduce observation error for buoy surface pressure observations (setupps.f90) + - filter: Perform Action + udescriptor: "error_inflation_for_buoy" + filter variables: + - name: stationPressure + where: + - variable: ObsType/stationPressure + is_in: 180 + action: + name: inflate error + inflation factor: 0.7 + + # Error inflation based on pressure check (setupps.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: stationPressure + where: + - variable: ObsType/stationPressure + is_in: 180 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorSfcPressure + options: + geovar_geomz: geopotential_height + geovar_sfc_geomz: geopotential_height_at_surface + +# # Error inflation based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: stationPressure +# where: +# - variable: ObsType/stationPressure +# is_in: 180 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [stationPressure] +# pressure: MetaData/pressure + + # Error inflation when QualityMarker == 3 (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_QualityMarker" + filter variables: + - name: stationPressure + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: QualityMarker/stationPressure + is_in: 3 + - variable: ObsType/stationPressure + is_in: 180 + + # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_observation_pressure" + filter variables: + - name: stationPressure + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: MetaData/pressure + maxvalue: 10000.0 + - variable: ObsType/stationPressure + is_in: 180 + + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: stationPressure + test variables: + - name: ObsErrorData/stationPressure + minvalue: 0.0 + maxvalue: 1000 + where: + - variable: ObsType/stationPressure + is_in: 180 + action: + name: reduce obs space + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: stationPressure + minvalue: 20000.0 + maxvalue: 120000.0 + where: + - variable: ObsType/stationPressure + is_in: 180 + action: + name: reduce obs space + + # Create temporary ObsErrorData + - filter: Variable Assignment + udescriptor: "create_temporary_ObsErrorData" + apply at iterations: 0,1 + where: + - variable: ObsType/stationPressure + is_in: 180 + assignments: + - name: TempObsErrorData/stationPressure + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/stationPressure + defer to post: true + + # Set ObsError set "error parameter" if < "max value" + - filter: Perform Action + udescriptor: "ermin_set" + apply at iterations: 0,1 + filter variables: + - name: stationPressure + action: + name: assign error + error parameter: 100.0 + where: + - variable: + name: ObsErrorData/stationPressure + maxvalue: 100.0 + - variable: + name: ObsErrorData/stationPressure + value: is_valid + - variable: ObsType/stationPressure + is_in: 180 + defer to post: true + + # Set ObsError set "error parameter" if > "min value" + - filter: Perform Action + udescriptor: "ermax_set" + apply at iterations: 0,1 + filter variables: + - name: stationPressure + action: + name: assign error + error parameter: 300.0 + where: + - variable: + name: ObsErrorData/stationPressure + minvalue: 300.0 + - variable: + name: ObsErrorData/stationPressure + value: is_valid + - variable: ObsType/stationPressure + is_in: 180 + defer to post: true + + # Gross Error Check + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: stationPressure + threshold: 5.0 + action: + name: reject + where: + - variable: QualityMarker/stationPressure + is_not_in: 3 + - variable: ObsType/stationPressure + is_in: 180 + defer to post: true + + # Gross Error Check: cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: stationPressure + threshold: 3.5 + action: + name: reject + where: + - variable: QualityMarker/stationPressure + is_in: 3 + - variable: ObsType/stationPressure + is_in: 180 + defer to post: true + + # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. + - filter: Perform Action + udescriptor: "reassign_error_TempObsErrorData" + apply at iterations: 0,1 + filter variables: + - name: stationPressure + action: + name: assign error + error function: TempObsErrorData/stationPressure + where: + - variable: + name: TempObsErrorData/stationPressure + value: is_valid + - variable: ObsType/stationPressure + is_in: 180 + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/sfcshp_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/sfcshp_stationPressure_182.yaml.j2 b/parm/jcb-gdas/observations/soil/sfcshp_stationPressure_182.yaml.j2 new file mode 100644 index 000000000..f50ddb153 --- /dev/null +++ b/parm/jcb-gdas/observations/soil/sfcshp_stationPressure_182.yaml.j2 @@ -0,0 +1,334 @@ + - obs space: + name: sfcshp_stationPressure_182 + obsdatain: + engine: + type: H5File + obsfile: "data/obs/ioda_sfcshp.nc" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + sort variable: "pressure" + sort order: "descending" + obsdataout: + empty obs space action: "{{empty_obs_space_action}}" + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: jdiag_sfcshp_stationPressure_182.nc + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [stationPressure] + simulated variables: [stationPressure] + + obs operator: + name: SfcCorrected + correction scheme to use: GSL + geovar_sfc_geomz: geopotential_height_at_surface + geovar_geomz: geopotential_height + linear obs operator: + name: Identity + + obs error: + covariance model: diagonal + + obs filters: + # ------------------ + # stationPressure (182) + # ------------------ + # Accept, reject, or passivate (monitor) + - filter: Perform Action + udescriptor: "iuse_check" + filter variables: + - name: stationPressure + where: + - variable: ObsType/stationPressure + is_in: 182 + action: + name: {{iuse_sfcshp_stationPressure_182 | default("passivate", true)}} # accept, reject, passivate + + # Reject all obs not in type + - filter: Perform Action + udescriptor: "obs_type_check" + where: + - variable: ObsValue/stationPressure + value: is_not_valid + action: + name: reduce obs space + + # Reject all obs not in kx + - filter: Perform Action + udescriptor: "obs_kx_check" + where: + - variable: ObsType/stationPressure + is_not_in: 182 + action: + name: reduce obs space + + # Reject all obs with QualityMarker > 3 + - filter: RejectList + udescriptor: "quality_marker_check" + filter variables: + - name: stationPressure + where: + - variable: QualityMarker/stationPressure + is_in: 4-15 + value: is_not_valid + where operator: or + action: + name: reduce obs space + + # Time window filter + - filter: Bounds Check + udescriptor: "time_window_check" + filter variables: + - name: stationPressure + test variables: + - name: MetaData/timeOffset + minvalue: -5400 + maxvalue: 5400 + where: + - variable: ObsType/stationPressure + is_in: 182 + action: + name: reduce obs space + + # Duplicate Check + - filter: Temporal Thinning + udescriptor: "duplicate_check" + filter variables: + - name: stationPressure + min_spacing: PT90M + tolerance: PT0H + seed_time: "{{atmosphere_background_time_iso}}" + category_variable: + name: MetaData/longitude_latitude_pressure + where: + - variable: ObsType/stationPressure + is_in: 182 + action: + name: reduce obs space + + # Online regional domain check + - filter: Bounds Check + udescriptor: "online_domain_check" + filter variables: + - name: stationPressure + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + udescriptor: "initial_error_assignment" + filter variables: + - name: stationPressure + where: + - variable: ObsType/stationPressure + is_in: 182 + 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] + errors: [53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11] + + # Error inflation based on pressure check (setupps.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: stationPressure + where: + - variable: ObsType/stationPressure + is_in: 182 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorSfcPressure + options: + geovar_geomz: geopotential_height + geovar_sfc_geomz: geopotential_height_at_surface + +# # Error inflation based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: stationPressure +# where: +# - variable: ObsType/stationPressure +# is_in: 182 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [stationPressure] +# pressure: MetaData/pressure + + # Error inflation when QualityMarker == 3 (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_QualityMarker" + filter variables: + - name: stationPressure + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: QualityMarker/stationPressure + is_in: 3 + - variable: ObsType/stationPressure + is_in: 182 + + # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_observation_pressure" + filter variables: + - name: stationPressure + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: MetaData/pressure + maxvalue: 10000.0 + - variable: ObsType/stationPressure + is_in: 182 + + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: stationPressure + test variables: + - name: ObsErrorData/stationPressure + minvalue: 0.0 + maxvalue: 1000 + where: + - variable: ObsType/stationPressure + is_in: 182 + action: + name: reduce obs space + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: stationPressure + minvalue: 20000.0 + maxvalue: 120000.0 + where: + - variable: ObsType/stationPressure + is_in: 182 + action: + name: reduce obs space + + # Create temporary ObsErrorData + - filter: Variable Assignment + udescriptor: "create_temporary_ObsErrorData" + apply at iterations: 0,1 + where: + - variable: ObsType/stationPressure + is_in: 182 + assignments: + - name: TempObsErrorData/stationPressure + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/stationPressure + defer to post: true + + # Set ObsError set "error parameter" if < "max value" + - filter: Perform Action + udescriptor: "ermin_set" + apply at iterations: 0,1 + filter variables: + - name: stationPressure + action: + name: assign error + error parameter: 100.0 + where: + - variable: + name: ObsErrorData/stationPressure + maxvalue: 100.0 + - variable: + name: ObsErrorData/stationPressure + value: is_valid + - variable: ObsType/stationPressure + is_in: 182 + defer to post: true + + # Set ObsError set "error parameter" if > "min value" + - filter: Perform Action + udescriptor: "ermax_set" + apply at iterations: 0,1 + filter variables: + - name: stationPressure + action: + name: assign error + error parameter: 300.0 + where: + - variable: + name: ObsErrorData/stationPressure + minvalue: 300.0 + - variable: + name: ObsErrorData/stationPressure + value: is_valid + - variable: ObsType/stationPressure + is_in: 182 + defer to post: true + + # Gross Error Check + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: stationPressure + threshold: 5.0 + action: + name: reject + where: + - variable: QualityMarker/stationPressure + is_not_in: 3 + - variable: ObsType/stationPressure + is_in: 182 + defer to post: true + + # Gross Error Check: cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: stationPressure + threshold: 3.5 + action: + name: reject + where: + - variable: QualityMarker/stationPressure + is_in: 3 + - variable: ObsType/stationPressure + is_in: 182 + defer to post: true + + # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. + - filter: Perform Action + udescriptor: "reassign_error_TempObsErrorData" + apply at iterations: 0,1 + filter variables: + - name: stationPressure + action: + name: assign error + error function: TempObsErrorData/stationPressure + where: + - variable: + name: TempObsErrorData/stationPressure + value: is_valid + - variable: ObsType/stationPressure + is_in: 182 + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/sfcshp_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/sfcshp_winds_280.yaml.j2 b/parm/jcb-gdas/observations/soil/sfcshp_winds_280.yaml.j2 new file mode 100644 index 000000000..e39f56b31 --- /dev/null +++ b/parm/jcb-gdas/observations/soil/sfcshp_winds_280.yaml.j2 @@ -0,0 +1,370 @@ + - obs space: + name: sfcshp_winds_280 + obsdatain: + engine: + type: H5File + obsfile: "data/obs/ioda_sfcshp.nc" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + sort variable: "pressure" + sort order: "descending" + obsdataout: + empty obs space action: "{{empty_obs_space_action}}" + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: jdiag_sfcshp_winds_280.nc + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [windEastward, windNorthward] + simulated variables: [windEastward, windNorthward] + + obs operator: + name: VertInterp + vertical coordinate: air_pressure + observation vertical coordinate: pressure + observation vertical coordinate group: MetaData + interpolation method: log-linear + variables: + - name: windEastward + - name: windNorthward + + linear obs operator: + name: VertInterp + + obs error: + covariance model: diagonal + + obs filters: + # ------------------ + # wind (280) + # ------------------ + # Accept, reject, or passivate (monitor) + - filter: Perform Action + udescriptor: "iuse_check" + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 280 + action: + name: {{iuse_sfcshp_winds_280 | default("passivate", true)}} # accept, reject, passivate + + # Reject all obs not in type + - filter: Perform Action + udescriptor: "obs_type_check" + where: + - variable: ObsValue/windEastward + value: is_not_valid + action: + name: reduce obs space + + # Reject all obs not in kx + - filter: Perform Action + udescriptor: "obs_kx_check" + where: + - variable: ObsType/windEastward + is_not_in: 280 + action: + name: reduce obs space + + # Reject all obs with QualityMarker > 3 + - filter: RejectList + udescriptor: "quality_marker_check" + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: QualityMarker/windEastward + is_in: 4-15 + value: is_not_valid + where operator: or + action: + name: reduce obs space + + # Time window filter + - filter: Bounds Check + udescriptor: "time_window_check" + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: MetaData/timeOffset + minvalue: -5400 + maxvalue: 5400 + where: + - variable: ObsType/windEastward + is_in: 280 + action: + name: reduce obs space + + # Duplicate Check + - filter: Temporal Thinning + udescriptor: "duplicate_check" + filter variables: + - name: windEastward + - name: windNorthward + min_spacing: PT90M + tolerance: PT0H + seed_time: "{{atmosphere_background_time_iso}}" + category_variable: + name: MetaData/longitude_latitude_pressure + where: + - variable: ObsType/windEastward + is_in: 280 + action: + name: reduce obs space + + # Online domain check + - filter: Bounds Check + udescriptor: "online_domain_check" + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + udescriptor: "initial_error_assignment" + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 280 + 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] + errors: [2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628] + + # Error inflation (windEastward) based on pressure check (setupw.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: windEastward + where: + - variable: ObsType/windEastward + is_in: 280 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windEastward + inflation factor: 4.0 + SetSfcWndObsHeight: true + AddObsHeightToStationElevation: true + AssumedSfcWndObsHeight: 10 + + # Error inflation (windNorthward) based on pressure check (setupw.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: windNorthward + where: + - variable: ObsType/windNorthward + is_in: 280 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windNorthward + inflation factor: 4.0 + SetSfcWndObsHeight: true + AddObsHeightToStationElevation: true + AssumedSfcWndObsHeight: 10 + +# # Error inflation (windEastward) based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: windEastward +# where: +# - variable: ObsType/windEastward +# is_in: 280 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [windEastward] +# test QCflag: QualityMarker +# test QCthreshold: 3 +# distance threshold: 0 +# pressure: MetaData/pressure + +# # Error inflation (windNorthward) based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: windNorthward +# where: +# - variable: ObsType/windNorthward +# is_in: 280 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [windNorthward] +# test QCflag: QualityMarker +# test QCthreshold: 3 +# distance threshold: 0 +# pressure: MetaData/pressure + + # Error inflation when QualityMarker == 3 (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_QualityMarker" + filter variables: + - name: windEastward + - name: windNorthward + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: QualityMarker/windEastward + is_in: 3 + - variable: ObsType/windEastward + is_in: 280 + + # Error inflation when observation pressure < 50 hPa (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_observation_pressure" + filter variables: + - name: windEastward + - name: windNorthward + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: MetaData/pressure + maxvalue: 5000.0 + - variable: ObsType/windEastward + is_in: 280 + + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: ObsErrorData/windEastward + minvalue: 0.0 + maxvalue: 1000 + where: + - variable: ObsType/windEastward + is_in: 280 + action: + name: reduce obs space + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: windEastward + - name: windNorthward + minvalue: -130 + maxvalue: 130 + where: + - variable: ObsType/windEastward + is_in: 280 + action: + name: reduce obs space + + # Gross Error Check (windEastward) + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: windEastward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 280 ] + cgross: [ 5.0 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windEastward + where: + - variable: QualityMarker/windEastward + is_not_in: 3 + action: + name: reject + defer to post: true + + # Gross Error Check (windNorthward) + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: windNorthward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 280 ] + cgross: [ 5.0 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windNorthward + where: + - variable: QualityMarker/windNorthward + is_not_in: 3 + action: + name: reject + defer to post: true + + # Gross Error Check (windEastward): cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: windEastward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 280 ] + cgross: [ 3.5 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windEastward + where: + - variable: QualityMarker/windEastward + is_in: 3 + action: + name: reject + defer to post: true + + # Gross Error Check (windNorthward): cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: windNorthward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 280 ] + cgross: [ 3.5 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windNorthward + where: + - variable: QualityMarker/windNorthward + is_in: 3 + action: + name: reject + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/sfcshp_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/sfcshp_winds_282.yaml.j2 b/parm/jcb-gdas/observations/soil/sfcshp_winds_282.yaml.j2 new file mode 100644 index 000000000..e9ff7afc5 --- /dev/null +++ b/parm/jcb-gdas/observations/soil/sfcshp_winds_282.yaml.j2 @@ -0,0 +1,370 @@ + - obs space: + name: sfcshp_winds_282 + obsdatain: + engine: + type: H5File + obsfile: "data/obs/ioda_sfcshp.nc" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + sort variable: "pressure" + sort order: "descending" + obsdataout: + empty obs space action: "{{empty_obs_space_action}}" + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: jdiag_sfcshp_winds_282.nc + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [windEastward, windNorthward] + simulated variables: [windEastward, windNorthward] + + obs operator: + name: VertInterp + vertical coordinate: air_pressure + observation vertical coordinate: pressure + observation vertical coordinate group: MetaData + interpolation method: log-linear + variables: + - name: windEastward + - name: windNorthward + + linear obs operator: + name: VertInterp + + obs error: + covariance model: diagonal + + obs filters: + # ------------------ + # wind (282) + # ------------------ + # Accept, reject, or passivate (monitor) + - filter: Perform Action + udescriptor: "iuse_check" + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 282 + action: + name: {{iuse_sfcshp_winds_282 | default("passivate", true)}} # accept, reject, passivate + + # Reject all obs not in type + - filter: Perform Action + udescriptor: "obs_type_check" + where: + - variable: ObsValue/windEastward + value: is_not_valid + action: + name: reduce obs space + + # Reject all obs not in kx + - filter: Perform Action + udescriptor: "obs_kx_check" + where: + - variable: ObsType/windEastward + is_not_in: 282 + action: + name: reduce obs space + + # Reject all obs with QualityMarker > 3 + - filter: RejectList + udescriptor: "quality_marker_check" + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: QualityMarker/windEastward + is_in: 4-15 + value: is_not_valid + where operator: or + action: + name: reduce obs space + + # Time window filter + - filter: Bounds Check + udescriptor: "time_window_check" + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: MetaData/timeOffset + minvalue: -5400 + maxvalue: 5400 + where: + - variable: ObsType/windEastward + is_in: 282 + action: + name: reduce obs space + + # Duplicate Check + - filter: Temporal Thinning + udescriptor: "duplicate_check" + filter variables: + - name: windEastward + - name: windNorthward + min_spacing: PT90M + tolerance: PT0H + seed_time: "{{atmosphere_background_time_iso}}" + category_variable: + name: MetaData/longitude_latitude_pressure + where: + - variable: ObsType/windEastward + is_in: 282 + action: + name: reduce obs space + + # Online domain check + - filter: Bounds Check + udescriptor: "online_domain_check" + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + udescriptor: "initial_error_assignment" + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 282 + 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] + errors: [1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079] + + # Error inflation (windEastward) based on pressure check (setupw.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: windEastward + where: + - variable: ObsType/windEastward + is_in: 282 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windEastward + inflation factor: 4.0 + SetSfcWndObsHeight: true + AddObsHeightToStationElevation: true + AssumedSfcWndObsHeight: 10 + + # Error inflation (windNorthward) based on pressure check (setupw.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: windNorthward + where: + - variable: ObsType/windNorthward + is_in: 282 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windNorthward + inflation factor: 4.0 + SetSfcWndObsHeight: true + AddObsHeightToStationElevation: true + AssumedSfcWndObsHeight: 10 + +# # Error inflation (windEastward) based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: windEastward +# where: +# - variable: ObsType/windEastward +# is_in: 282 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [windEastward] +# test QCflag: QualityMarker +# test QCthreshold: 3 +# distance threshold: 0 +# pressure: MetaData/pressure + +# # Error inflation (windNorthward) based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: windNorthward +# where: +# - variable: ObsType/windNorthward +# is_in: 282 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [windNorthward] +# test QCflag: QualityMarker +# test QCthreshold: 3 +# distance threshold: 0 +# pressure: MetaData/pressure + + # Error inflation when QualityMarker == 3 (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_QualityMarker" + filter variables: + - name: windEastward + - name: windNorthward + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: QualityMarker/windEastward + is_in: 3 + - variable: ObsType/windEastward + is_in: 282 + + # Error inflation when observation pressure < 50 hPa (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_observation_pressure" + filter variables: + - name: windEastward + - name: windNorthward + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: MetaData/pressure + maxvalue: 5000.0 + - variable: ObsType/windEastward + is_in: 282 + + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: ObsErrorData/windEastward + minvalue: 0.0 + maxvalue: 1000 + where: + - variable: ObsType/windEastward + is_in: 282 + action: + name: reduce obs space + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: windEastward + - name: windNorthward + minvalue: -130 + maxvalue: 130 + where: + - variable: ObsType/windEastward + is_in: 282 + action: + name: reduce obs space + + # Gross Error Check (windEastward) + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: windEastward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 282 ] + cgross: [ 5.0 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windEastward + where: + - variable: QualityMarker/windEastward + is_not_in: 3 + action: + name: reject + defer to post: true + + # Gross Error Check (windNorthward) + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: windNorthward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 282 ] + cgross: [ 5.0 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windNorthward + where: + - variable: QualityMarker/windNorthward + is_not_in: 3 + action: + name: reject + defer to post: true + + # Gross Error Check (windEastward): cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: windEastward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 282 ] + cgross: [ 3.5 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windEastward + where: + - variable: QualityMarker/windEastward + is_in: 3 + action: + name: reject + defer to post: true + + # Gross Error Check (windNorthward): cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: windNorthward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 282 ] + cgross: [ 3.5 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windNorthward + where: + - variable: QualityMarker/windNorthward + is_in: 3 + action: + name: reject + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/sfcshp_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/sfcshp_winds_284.yaml.j2 b/parm/jcb-gdas/observations/soil/sfcshp_winds_284.yaml.j2 new file mode 100644 index 000000000..9ba293e4f --- /dev/null +++ b/parm/jcb-gdas/observations/soil/sfcshp_winds_284.yaml.j2 @@ -0,0 +1,370 @@ + - obs space: + name: sfcshp_winds_284 + obsdatain: + engine: + type: H5File + obsfile: "data/obs/ioda_sfcshp.nc" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + sort variable: "pressure" + sort order: "descending" + obsdataout: + empty obs space action: "{{empty_obs_space_action}}" + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: jdiag_sfcshp_winds_284.nc + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [windEastward, windNorthward] + simulated variables: [windEastward, windNorthward] + + obs operator: + name: VertInterp + vertical coordinate: air_pressure + observation vertical coordinate: pressure + observation vertical coordinate group: MetaData + interpolation method: log-linear + variables: + - name: windEastward + - name: windNorthward + + linear obs operator: + name: VertInterp + + obs error: + covariance model: diagonal + + obs filters: + # ------------------ + # wind (284) + # ------------------ + # Accept, reject, or passivate (monitor) + - filter: Perform Action + udescriptor: "iuse_check" + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 284 + action: + name: {{iuse_sfcshp_winds_284 | default("passivate", true)}} # accept, reject, passivate + + # Reject all obs not in type + - filter: Perform Action + udescriptor: "obs_type_check" + where: + - variable: ObsValue/windEastward + value: is_not_valid + action: + name: reduce obs space + + # Reject all obs not in kx + - filter: Perform Action + udescriptor: "obs_kx_check" + where: + - variable: ObsType/windEastward + is_not_in: 284 + action: + name: reduce obs space + + # Reject all obs with QualityMarker > 3 + - filter: RejectList + udescriptor: "quality_marker_check" + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: QualityMarker/windEastward + is_in: 4-15 + value: is_not_valid + where operator: or + action: + name: reduce obs space + + # Time window filter + - filter: Bounds Check + udescriptor: "time_window_check" + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: MetaData/timeOffset + minvalue: -5400 + maxvalue: 5400 + where: + - variable: ObsType/windEastward + is_in: 284 + action: + name: reduce obs space + + # Duplicate Check + - filter: Temporal Thinning + udescriptor: "duplicate_check" + filter variables: + - name: windEastward + - name: windNorthward + min_spacing: PT90M + tolerance: PT0H + seed_time: "{{atmosphere_background_time_iso}}" + category_variable: + name: MetaData/longitude_latitude_pressure + where: + - variable: ObsType/windEastward + is_in: 284 + action: + name: reduce obs space + + # Online domain check + - filter: Bounds Check + udescriptor: "online_domain_check" + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: GeoVaLs/observable_domain_mask + minvalue: 0.0 + maxvalue: 0.5 + + # Initial error assignment + - filter: Perform Action + udescriptor: "initial_error_assignment" + filter variables: + - name: windEastward + - name: windNorthward + where: + - variable: ObsType/windEastward + is_in: 284 + 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] + errors: [1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079] + + # Error inflation (windEastward) based on pressure check (setupw.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: windEastward + where: + - variable: ObsType/windEastward + is_in: 284 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windEastward + inflation factor: 4.0 + SetSfcWndObsHeight: true + AddObsHeightToStationElevation: true + AssumedSfcWndObsHeight: 10 + + # Error inflation (windNorthward) based on pressure check (setupw.f90) + - filter: Perform Action + udescriptor: "error_inflation_pressure_check" + filter variables: + - name: windNorthward + where: + - variable: ObsType/windNorthward + is_in: 284 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorPressureCheck + options: + variable: windNorthward + inflation factor: 4.0 + SetSfcWndObsHeight: true + AddObsHeightToStationElevation: true + AssumedSfcWndObsHeight: 10 + +# # Error inflation (windEastward) based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: windEastward +# where: +# - variable: ObsType/windEastward +# is_in: 284 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [windEastward] +# test QCflag: QualityMarker +# test QCthreshold: 3 +# distance threshold: 0 +# pressure: MetaData/pressure + +# # Error inflation (windNorthward) based on errormod (qcmod.f90) +# - filter: Perform Action +# filter variables: +# - name: windNorthward +# where: +# - variable: ObsType/windNorthward +# is_in: 284 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorConventional +# options: +# inflate variables: [windNorthward] +# test QCflag: QualityMarker +# test QCthreshold: 3 +# distance threshold: 0 +# pressure: MetaData/pressure + + # Error inflation when QualityMarker == 3 (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_QualityMarker" + filter variables: + - name: windEastward + - name: windNorthward + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: QualityMarker/windEastward + is_in: 3 + - variable: ObsType/windEastward + is_in: 284 + + # Error inflation when observation pressure < 50 hPa (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_observation_pressure" + filter variables: + - name: windEastward + - name: windNorthward + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: MetaData/pressure + maxvalue: 5000.0 + - variable: ObsType/windEastward + is_in: 284 + + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: windEastward + - name: windNorthward + test variables: + - name: ObsErrorData/windEastward + minvalue: 0.0 + maxvalue: 1000 + where: + - variable: ObsType/windEastward + is_in: 284 + action: + name: reduce obs space + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: windEastward + - name: windNorthward + minvalue: -130 + maxvalue: 130 + where: + - variable: ObsType/windEastward + is_in: 284 + action: + name: reduce obs space + + # Gross Error Check (windEastward) + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: windEastward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 284 ] + cgross: [ 5.0 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windEastward + where: + - variable: QualityMarker/windEastward + is_not_in: 3 + action: + name: reject + defer to post: true + + # Gross Error Check (windNorthward) + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: windNorthward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 284 ] + cgross: [ 5.0 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windNorthward + where: + - variable: QualityMarker/windNorthward + is_not_in: 3 + action: + name: reject + defer to post: true + + # Gross Error Check (windEastward): cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: windEastward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 284 ] + cgross: [ 3.5 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windEastward + where: + - variable: QualityMarker/windEastward + is_in: 3 + action: + name: reject + defer to post: true + + # Gross Error Check (windNorthward): cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: windNorthward + function absolute threshold: + - name: ObsFunction/WindsSPDBCheck + options: + wndtype: [ 284 ] + cgross: [ 3.5 ] + error_min: [ 1.0 ] + error_max: [ 5.0 ] + variable: windNorthward + where: + - variable: QualityMarker/windNorthward + is_in: 3 + action: + name: reject + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/sfcshp_geovals_rrfs.nc From 359d373362d3ed0636c9a78d6d9c9a3e1e0b411c Mon Sep 17 00:00:00 2001 From: tsga Date: Tue, 3 Mar 2026 11:02:38 +0000 Subject: [PATCH 18/98] add lgetkf config --- parm/soil/jcb-prototype_lgetkf.yaml.j2 | 31 ++ parm/soil/prep/prepbufr_adpsfc.yaml | 501 ++++++++++++++++++ parm/soil/prep/prepbufr_sfcshp.yaml | 501 ++++++++++++++++++ .../soil_ens_obs_dist_localizations.yaml.j2 | 21 + parm/soil/soil_letkf_config.yaml.j2 | 191 +++++++ .../soil/soil_stage_bufr2ioda_mapping.yaml.j2 | 1 + 6 files changed, 1246 insertions(+) create mode 100644 parm/soil/jcb-prototype_lgetkf.yaml.j2 create mode 100644 parm/soil/prep/prepbufr_adpsfc.yaml create mode 100644 parm/soil/prep/prepbufr_sfcshp.yaml create mode 100644 parm/soil/soil_ens_obs_dist_localizations.yaml.j2 create mode 100644 parm/soil/soil_letkf_config.yaml.j2 create mode 100644 parm/soil/soil_stage_bufr2ioda_mapping.yaml.j2 diff --git a/parm/soil/jcb-prototype_lgetkf.yaml.j2 b/parm/soil/jcb-prototype_lgetkf.yaml.j2 new file mode 100644 index 000000000..fbcb6a462 --- /dev/null +++ b/parm/soil/jcb-prototype_lgetkf.yaml.j2 @@ -0,0 +1,31 @@ +# Use observations for lgetkf +# --------------------------- +#app_path_observations: {{PARMgfs}}/gdas/jcb-gdas/observations/soil +#app_path_observation_chronicle: {{PARMgfs}}/gdas/jcb-gdas/observation_chronicle/soil +## Algorithm +## --------- +algorithm: local_ensemble_da +# +## Model things +## ------------ +#soil_background_ensemble_path: ./bkg/mem%mem% +#soil_analysis_ensemble_path: ./anl/mem%mem% + +# Observation things +# ------------------ +#? does obs list yaml get constructed from settings? +{% include OBS_LIST_YAML %} + +# Observation distribution and localization +# TODO: +distribution_type: "Halo" +localization_method: "Horizontal Box car" +halo_size: 250e3 +loc_length_scale: 250e3 +max_nobs: 50 + +# Testing things +# -------------- +{% if DO_TEST_MODE %} +{% include LETKF_JEDI_TEST_YAML %} +{% endif %} diff --git a/parm/soil/prep/prepbufr_adpsfc.yaml b/parm/soil/prep/prepbufr_adpsfc.yaml new file mode 100644 index 000000000..c567ac46b --- /dev/null +++ b/parm/soil/prep/prepbufr_adpsfc.yaml @@ -0,0 +1,501 @@ +# (C) Copyright 2024 NOAA/NWS/NCEP/EMC +# +# 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. + +observations: + - obs space: + name: bufr + obsdatain: "./prepbufr" + + exports: + #group_by_variable: prepbufrDataLvlCat + subsets: + - ADPSFC # SURFACE LAND (SYNOPTIC, METAR) REPORTS + #- SFCSHP # SURFACE MARINE (SHIP, BUOY, C-MAN/TIGE GAUGE PLATFORM) REPORTS + variables: + # MetaData + timestamp: + timeoffset: + timeOffset: "*/DHR" + transforms: + - scale: 3600 + referenceTime: "2024-06-01T00:00:00Z" + timeOffset: + query: "*/DHR" + transforms: + - scale: 3600 + longitude: + query: "*/XOB" + latitude: + query: "*/YOB" + stationIdentification: + query: "*/SID" + stationElevation: + query: "*/ELV" + #type: float + prepbufrReportType: + query: "*/TYP" + dumpReportType: + query: "*/T29" + prepbufrDataLvlCat: + query: "*/CAT" + + pressure: + query: "*/P___INFO/P__EVENT{1}/POB" + transforms: + - scale: 100 + stationPressure: + query: "*/P___INFO/P__EVENT{1}/POB" + transforms: + - scale: 100 + stationPressureQualityMarker: + query: "*/P___INFO/P__EVENT{1}/PQM" + stationPressureError: + query: "*/P___INFO/P__BACKG/POE" + transforms: + - scale: 100 + stationPressureTunedError: + query: "*/P___INFO/P__POSTP/POETU" + transforms: + - scale: 100 + + heightOfObservation: + query: "*/Z___INFO/Z__EVENT{1}/ZOB" + #type: float + heightOfObservationQualityMark: + query: "*/Z___INFO/Z__EVENT{1}/ZQM" + + specificHumidity: + query: "*/Q___INFO/Q__EVENT{1}/QOB" + type: float + transforms: + - scale: 0.000001 + # Assign fake Q errors + specificHumidityError: + query: "*/Q___INFO/Q__EVENT{1}/QOB" + type: float + transforms: + - scale: 0.0 + - offset: 999 + specificHumidityQualityMarker: + query: "*/Q___INFO/Q__EVENT{1}/QQM" + relativeHumidityError: + query: "*/Q___INFO/Q__BACKG/QOE" + transforms: + - scale: 0.1 + relativeHumidityTunedError: + query: "*/Q___INFO/Q__POSTP/QOETU" + transforms: + - scale: 0.1 + + dewpointTemperature: + query: "*/Q___INFO/TDO" + transforms: + - offset: 273.15 + + airTemperature: + query: "*/T___INFO/T__EVENT{1}/TOB" + transforms: + - offset: 273.15 + airTemperatureQualityMarker: + query: "*/T___INFO/T__EVENT{1}/TQM" + airTemperatureError: + query: "*/T___INFO/T__BACKG/TOE" + airTemperatureTunedError: + query: "*/T___INFO/T__POSTP/TOETU" + + windEastward: + query: "*/W___INFO/W__EVENT{1}/UOB" + windNorthward: + query: "*/W___INFO/W__EVENT{1}/VOB" + windQualityMarker: + query: "*/W___INFO/W__EVENT{1}/WQM" + windError: + query: "*/W___INFO/W__BACKG/WOE" + windTunedError: + query: "*/W___INFO/W__POSTP/WOETU" + transform: + - scale: 0.514444 + + pressureReducedToMeanSeaLevel: + query: "*/PMSL_SEQ/PMO" + transforms: + - scale: 100 + pressureReducedToMeanSeaLevelQualityMarker: + query: "*/PMSL_SEQ/PMQ" + + seaTemperature: + query: "*/SST_INFO/SSTEVENT{1}/SST1" + seaTemperatureQualityMarker: + query: "*/SST_INFO/SSTEVENT{1}/SSTQM" + seaTemperatureError: + query: "*/SST_INFO/SSTBACKG/SSTOE" + seaTemperatureMethod: + query: "*/SST_INFO/MSST" + depthBelowSeaSurface: + query: "*/SST_INFO/DBSS_SEQ/DBSS" + type: float + heightOfWaves: + query: "*/WAVE_SEQ/HOWV" + type: float + + presentWeather: + query: "*/PREWXSEQ{1}/PRWE" + + maximumWindGustSpeed: + query: "*/GUST1SEQ/MXGS" + + verticalSignificance: + query: "*/CLOUDSEQ{1}/VSSO" + cloudAmount: + query: "*/CLOUDSEQ{1}/CLAM" + heightOfBaseOfCloud: + query: "*/CLOUDSEQ{1}/HOCB" + type: float + cloudCoverTotal: + query: "*/CLOU2SEQ{1}/TOCC" + type: float + transforms: + - scale: 0.01 + heightAboveSurfaceOfBaseOfLowestCloud: + query: "*/CLOU2SEQ/HBLCS" + + ioda: + backend: netcdf + obsdataout: "./ioda_adpsfc.nc" + + dimensions: + - name: pevent_Dim + path: "*/P___INFO/P__EVENT" + - name: qevent_Dim + path: "*/Q___INFO/Q__EVENT" + - name: tevent_Dim + path: "*/T___INFO/T__EVENT" + - name: wevent_Dim + path: "*/W___INFO/W__EVENT" + - name: zevent_Dim + path: "*/Z___INFO/Z__EVENT" + + + variables: + + # MetaData + - name: "MetaData/dateTime" + coordinates: "longitude latitude" + source: variables/timestamp + longName: "Observation Time" + units: "seconds since 1970-01-01T00:00:00Z" + + - name: "MetaData/timeOffset" + coordinates: "longitude latitude" + source: variables/timeOffset + longName: "Observation Time Minus Reference Time" + units: "s" + + - name: "MetaData/stationIdentification" + coordinates: "longitude latitude" + source: variables/stationIdentification + longName: "Station ID" + units: "" + + - name: "MetaData/longitude" + coordinates: "longitude latitude" + source: variables/longitude + longName: "Longitude" + units: "degree_east" + range: [0, 360] + + - name: "MetaData/latitude" + coordinates: "longitude latitude" + source: variables/latitude + longName: "Latitude" + units: "degree_north" + range: [-90, 90] + + - name: "MetaData/stationElevation" + coordinates: "longitude latitude" + source: variables/stationElevation + longName: "Elevation of Station" + units: "m" + + - name: "MetaData/prepbufrReportType" + coordinates: "longitude latitude" + source: variables/prepbufrReportType + longName: "Prepbufr Report Type" + units: "" + + - name: "MetaData/dumpReportType" + coordinates: "longitude latitude" + source: variables/dumpReportType + longName: "Data Dump Report Type" + units: "" + + - name: "MetaData/prepbufrDataLvlCat" + coordinates: "longitude latitude" + source: variables/prepbufrDataLvlCat + longName: "Prepbufr Data Level Category" + units: "" + + - name: "MetaData/seaTemperatureMethod" + coordinates: "longitude latitude" + source: variables/seaTemperatureMethod + longName: "Method of Sea Temperature Measurement" + units: "" + + - name: "MetaData/height" + coordinates: "longitude latitude" + source: variables/heightOfObservation + longName: "Height" + units: "m" + + - name: "MetaData/pressure" + coordinates: "longitude latitude" + source: variables/pressure + longName: "Pressure" + units: "Pa" + + # ObsType + - name: "ObsType/specificHumidity" + coordinates: "longitude latitude" + source: variables/prepbufrReportType + longName: "specificHumidity Report Type" + units: "" + + - name: "ObsType/airTemperature" + coordinates: "longitude latitude" + source: variables/prepbufrReportType + longName: "airTemperature report Type" + units: "" + + - name: "ObsType/windEastward" + coordinates: "longitude latitude" + source: variables/prepbufrReportType + longName: "windEastward Report Type" + units: "" + + - name: "ObsType/windNorthward" + coordinates: "longitude latitude" + source: variables/prepbufrReportType + longName: "windNorthward Report Type" + units: "" + + - name: "ObsType/stationPressure" + coordinates: "longitude latitude" + source: variables/prepbufrReportType + longName: "Pressure" + units: "" + + # ObsValue + - name: "ObsValue/specificHumidity" + coordinates: "longitude latitude" + source: variables/specificHumidity + longName: "Specific Humidity" + units: "Kilogram Kilogram-1" + + - name: "ObsValue/airTemperature" + coordinates: "longitude latitude" + source: variables/airTemperature + longName: "Temperature" + units: "K" + + - name: "ObsValue/dewpointTemperature" + coordinates: "longitude latitude" + source: variables/dewpointTemperature + longName: "Dewpoint Temperature" + units: "K" + + - name: "ObsValue/windEastward" + coordinates: "longitude latitude" + source: variables/windEastward + longName: "Eastward Wind" + units: "m s-1" + + - name: "ObsValue/windNorthward" + coordinates: "longitude latitude" + source: variables/windNorthward + longName: "Northward Wind" + units: "m s-1" + + - name: "ObsValue/stationPressure" + coordinates: "longitude latitude" + source: variables/stationPressure + longName: "Station Pressure" + units: "Pa" + + - name: "ObsValue/pressureReducedToMeanSeaLevel" + coordinates: "longitude latitude" + source: variables/pressureReducedToMeanSeaLevel + longName: "Mean Sea-Level Pressure" + units: "Pa" + + - name: "ObsValue/seaTemperature" + coordinates: "longitude latitude" + source: variables/seaTemperature + longName: "Sea Temperature" + units: "K" + + - name: "ObsValue/depthBelowSeaSurface" + coordinates: "longitude latitude" + source: variables/depthBelowSeaSurface + longName: "Depth Below Sea Surface" + units: "m" + + - name: "ObsValue/heightOfWaves" + coordinates: "longitude latitude" + source: variables/heightOfWaves + longName: "Height of Waves" + units: "m" + + - name: "ObsValue/presentWeather" + coordinates: "longitude latitude" + source: variables/presentWeather + longName: "Description of Present Weather" + + - name: "ObsValue/maximumWindGustSpeed" + coordinates: "longitude latitude" + source: variables/maximumWindGustSpeed + longName: "Maximum Wind Gust Speed" + units: "m s-1" + + - name: "ObsValue/verticalSignificance" + coordinates: "longitude latitude" + source: variables/verticalSignificance + longName: "Description of Vertical Significance (Surface Observations)" + + - name: "ObsValue/cloudAmount" + coordinates: "longitude latitude" + source: variables/cloudAmount + longName: "Description of Cloud Amount" + + - name: "ObsValue/heightOfBaseOfCloud" + coordinates: "longitude latitude" + source: variables/heightOfBaseOfCloud + longName: "Height of Base of Cloud" + units: "m" + + - name: "ObsValue/cloudCoverTotal" + coordinates: "longitude latitude" + source: variables/cloudCoverTotal + longName: "Total Cloud Coverage" + units: "1" + + - name: "ObsValue/heightAboveSurfaceOfBaseOfLowestCloud" + coordinates: "longitude latitude" + source: variables/heightAboveSurfaceOfBaseOfLowestCloud + longName: "Height above Surface of Base of Lowest Cloud Seen" + + # Quality Marker + - name: "QualityMarker/stationPressure" + coordinates: "longitude latitude" + source: variables/stationPressureQualityMarker + longName: "Pressure Quality Marker" + + - name: "QualityMarker/height" + coordinates: "longitude latitude" + source: variables/heightOfObservationQualityMark + longName: "Height Quality Marker" + + - name: "QualityMarker/specificHumidity" + coordinates: "longitude latitude" + source: variables/specificHumidityQualityMarker + longName: "Specific Humidity Quality Marker" + + - name: "QualityMarker/airTemperature" + coordinates: "longitude latitude" + source: variables/airTemperatureQualityMarker + longName: "Temperature Quality Marker" + + - name: "QualityMarker/windEastward" + coordinates: "longitude latitude" + source: variables/windQualityMarker + longName: "windEastward Quality Marker" + + - name: "QualityMarker/windNorthward" + coordinates: "longitude latitude" + source: variables/windQualityMarker + longName: "windNorthward Quality Marker" + + - name: "QualityMarker/pressureReducedToMeanSeaLevel" + coordinates: "longitude latitude" + source: variables/pressureReducedToMeanSeaLevelQualityMarker + longName: "Mean Sea Level Pressure Quality Marker" + + - name: "QualityMarker/seaTemperature" + coordinates: "longitude latitude" + source: variables/seaTemperatureQualityMarker + longName: "Sea Temperature Quality Marker" + + # ObsError + - name: "ObsError/stationPressure" + coordinates: "longitude latitude" + source: variables/stationPressureError + longName: "Pressure Observation Error" + units: "Pa" + + - name: "ObsError/specificHumidity" + coordinates: "longitude latitude" + source: variables/specificHumidityError + longName: "Specific Humidity Error" + units: "kg kg-1" + + - name: "ObsError/relativeHumidity" + coordinates: "longitude latitude" + source: variables/relativeHumidityError + longName: "Relative Humidity Error" + units: "1" + + - name: "ObsError/airTemperature" + coordinates: "longitude latitude" + source: variables/airTemperatureError + longName: "Temperature Error" + units: "K" + + - name: "ObsError/windEastward" + coordinates: "longitude latitude" + source: variables/windError + longName: "Eastward wind error" + units: "m s-1" + + - name: "ObsError/windNorthward" + coordinates: "longitude latitude" + source: variables/windError + longName: "Northward wind error" + units: "m s-1" + + - name: "ObsError/seaTemperature" + coordinates: "longitude latitude" + source: variables/seaTemperatureError + longName: "Sea Temperature Observation Error" + units: "K" + +# # Tuned ObsError +# - name: "TunedObsError/stationPressure" +# coordinates: "longitude latitude" +# source: variables/stationPressureTunedError +# longName: "Analysis-Tuned Pressure Observation Error" +# units: "Pa" +# +# - name: "TunedObsError/relativeHumidity" +# coordinates: "longitude latitude" +# source: variables/relativeHumidityTunedError +# longName: "Analysis-Tuned Relative Humidity Error" +# units: "1" +# +# - name: "TunedObsError/airTemperature" +# coordinates: "longitude latitude" +# source: variables/airTemperatureTunedError +# longName: "Analysis-Tuned Temperature Error" +# units: "K" +# +# - name: "TunedObsError/windEastward" +# coordinates: "longitude latitude" +# source: variables/windTunedError +# longName: "Analysis-Tuned Eastward wind error" +# units: "m s-1" +# +# - name: "TunedObsError/windNorthward" +# coordinates: "longitude latitude" +# source: variables/windTunedError +# longName: "Analysis-Tuned Northward wind error" +# units: "m s-1" diff --git a/parm/soil/prep/prepbufr_sfcshp.yaml b/parm/soil/prep/prepbufr_sfcshp.yaml new file mode 100644 index 000000000..7b84ea004 --- /dev/null +++ b/parm/soil/prep/prepbufr_sfcshp.yaml @@ -0,0 +1,501 @@ +# (C) Copyright 2024 NOAA/NWS/NCEP/EMC +# +# 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. + +observations: + - obs space: + name: bufr + obsdatain: "./prepbufr" + + exports: + #group_by_variable: prepbufrDataLvlCat + subsets: + #- ADPSFC # SURFACE LAND (SYNOPTIC, METAR) REPORTS + - SFCSHP # SURFACE MARINE (SHIP, BUOY, C-MAN/TIGE GAUGE PLATFORM) REPORTS + variables: + # MetaData + timestamp: + timeoffset: + timeOffset: "*/DHR" + transforms: + - scale: 3600 + referenceTime: "2024-06-01T00:00:00Z" + timeOffset: + query: "*/DHR" + transforms: + - scale: 3600 + longitude: + query: "*/XOB" + latitude: + query: "*/YOB" + stationIdentification: + query: "*/SID" + stationElevation: + query: "*/ELV" + #type: float + prepbufrReportType: + query: "*/TYP" + dumpReportType: + query: "*/T29" + prepbufrDataLvlCat: + query: "*/CAT" + + pressure: + query: "*/P___INFO/P__EVENT{1}/POB" + transforms: + - scale: 100 + stationPressure: + query: "*/P___INFO/P__EVENT{1}/POB" + transforms: + - scale: 100 + stationPressureQualityMarker: + query: "*/P___INFO/P__EVENT{1}/PQM" + stationPressureError: + query: "*/P___INFO/P__BACKG/POE" + transforms: + - scale: 100 + stationPressureTunedError: + query: "*/P___INFO/P__POSTP/POETU" + transforms: + - scale: 100 + + heightOfObservation: + query: "*/Z___INFO/Z__EVENT{1}/ZOB" + #type: float + heightOfObservationQualityMark: + query: "*/Z___INFO/Z__EVENT{1}/ZQM" + + specificHumidity: + query: "*/Q___INFO/Q__EVENT{1}/QOB" + type: float + transforms: + - scale: 0.000001 + # Assign fake Q errors + specificHumidityError: + query: "*/Q___INFO/Q__EVENT{1}/QOB" + type: float + transforms: + - scale: 0.0 + - offset: 999 + specificHumidityQualityMarker: + query: "*/Q___INFO/Q__EVENT{1}/QQM" + relativeHumidityError: + query: "*/Q___INFO/Q__BACKG/QOE" + transforms: + - scale: 0.1 + relativeHumidityTunedError: + query: "*/Q___INFO/Q__POSTP/QOETU" + transforms: + - scale: 0.1 + + dewpointTemperature: + query: "*/Q___INFO/TDO" + transforms: + - offset: 273.15 + + airTemperature: + query: "*/T___INFO/T__EVENT{1}/TOB" + transforms: + - offset: 273.15 + airTemperatureQualityMarker: + query: "*/T___INFO/T__EVENT{1}/TQM" + airTemperatureError: + query: "*/T___INFO/T__BACKG/TOE" + airTemperatureTunedError: + query: "*/T___INFO/T__POSTP/TOETU" + + windEastward: + query: "*/W___INFO/W__EVENT{1}/UOB" + windNorthward: + query: "*/W___INFO/W__EVENT{1}/VOB" + windQualityMarker: + query: "*/W___INFO/W__EVENT{1}/WQM" + windError: + query: "*/W___INFO/W__BACKG/WOE" + windTunedError: + query: "*/W___INFO/W__POSTP/WOETU" + transform: + - scale: 0.514444 + + pressureReducedToMeanSeaLevel: + query: "*/PMSL_SEQ/PMO" + transforms: + - scale: 100 + pressureReducedToMeanSeaLevelQualityMarker: + query: "*/PMSL_SEQ/PMQ" + + seaTemperature: + query: "*/SST_INFO/SSTEVENT{1}/SST1" + seaTemperatureQualityMarker: + query: "*/SST_INFO/SSTEVENT{1}/SSTQM" + seaTemperatureError: + query: "*/SST_INFO/SSTBACKG/SSTOE" + seaTemperatureMethod: + query: "*/SST_INFO/MSST" + depthBelowSeaSurface: + query: "*/SST_INFO/DBSS_SEQ/DBSS" + type: float + heightOfWaves: + query: "*/WAVE_SEQ/HOWV" + type: float + + presentWeather: + query: "*/PREWXSEQ{1}/PRWE" + + maximumWindGustSpeed: + query: "*/GUST1SEQ/MXGS" + + verticalSignificance: + query: "*/CLOUDSEQ{1}/VSSO" + cloudAmount: + query: "*/CLOUDSEQ{1}/CLAM" + heightOfBaseOfCloud: + query: "*/CLOUDSEQ{1}/HOCB" + type: float + cloudCoverTotal: + query: "*/CLOU2SEQ{1}/TOCC" + type: float + transforms: + - scale: 0.01 + heightAboveSurfaceOfBaseOfLowestCloud: + query: "*/CLOU2SEQ/HBLCS" + + ioda: + backend: netcdf + obsdataout: "./ioda_sfcshp.nc" + + dimensions: + - name: pevent_Dim + path: "*/P___INFO/P__EVENT" + - name: qevent_Dim + path: "*/Q___INFO/Q__EVENT" + - name: tevent_Dim + path: "*/T___INFO/T__EVENT" + - name: wevent_Dim + path: "*/W___INFO/W__EVENT" + - name: zevent_Dim + path: "*/Z___INFO/Z__EVENT" + + + variables: + + # MetaData + - name: "MetaData/dateTime" + coordinates: "longitude latitude" + source: variables/timestamp + longName: "Observation Time" + units: "seconds since 1970-01-01T00:00:00Z" + + - name: "MetaData/timeOffset" + coordinates: "longitude latitude" + source: variables/timeOffset + longName: "Observation Time Minus Reference Time" + units: "s" + + - name: "MetaData/stationIdentification" + coordinates: "longitude latitude" + source: variables/stationIdentification + longName: "Station ID" + units: "" + + - name: "MetaData/longitude" + coordinates: "longitude latitude" + source: variables/longitude + longName: "Longitude" + units: "degree_east" + range: [0, 360] + + - name: "MetaData/latitude" + coordinates: "longitude latitude" + source: variables/latitude + longName: "Latitude" + units: "degree_north" + range: [-90, 90] + + - name: "MetaData/stationElevation" + coordinates: "longitude latitude" + source: variables/stationElevation + longName: "Elevation of Station" + units: "m" + + - name: "MetaData/prepbufrReportType" + coordinates: "longitude latitude" + source: variables/prepbufrReportType + longName: "Prepbufr Report Type" + units: "" + + - name: "MetaData/dumpReportType" + coordinates: "longitude latitude" + source: variables/dumpReportType + longName: "Data Dump Report Type" + units: "" + + - name: "MetaData/prepbufrDataLvlCat" + coordinates: "longitude latitude" + source: variables/prepbufrDataLvlCat + longName: "Prepbufr Data Level Category" + units: "" + + - name: "MetaData/seaTemperatureMethod" + coordinates: "longitude latitude" + source: variables/seaTemperatureMethod + longName: "Method of Sea Temperature Measurement" + units: "" + + - name: "MetaData/height" + coordinates: "longitude latitude" + source: variables/heightOfObservation + longName: "Height" + units: "m" + + - name: "MetaData/pressure" + coordinates: "longitude latitude" + source: variables/pressure + longName: "Pressure" + units: "Pa" + + # ObsType + - name: "ObsType/specificHumidity" + coordinates: "longitude latitude" + source: variables/prepbufrReportType + longName: "specificHumidity Report Type" + units: "" + + - name: "ObsType/airTemperature" + coordinates: "longitude latitude" + source: variables/prepbufrReportType + longName: "airTemperature report Type" + units: "" + + - name: "ObsType/windEastward" + coordinates: "longitude latitude" + source: variables/prepbufrReportType + longName: "windEastward Report Type" + units: "" + + - name: "ObsType/windNorthward" + coordinates: "longitude latitude" + source: variables/prepbufrReportType + longName: "windNorthward Report Type" + units: "" + + - name: "ObsType/stationPressure" + coordinates: "longitude latitude" + source: variables/prepbufrReportType + longName: "Pressure" + units: "" + + # ObsValue + - name: "ObsValue/specificHumidity" + coordinates: "longitude latitude" + source: variables/specificHumidity + longName: "Specific Humidity" + units: "Kilogram Kilogram-1" + + - name: "ObsValue/airTemperature" + coordinates: "longitude latitude" + source: variables/airTemperature + longName: "Temperature" + units: "K" + + - name: "ObsValue/dewpointTemperature" + coordinates: "longitude latitude" + source: variables/dewpointTemperature + longName: "Dewpoint Temperature" + units: "K" + + - name: "ObsValue/windEastward" + coordinates: "longitude latitude" + source: variables/windEastward + longName: "Eastward Wind" + units: "m s-1" + + - name: "ObsValue/windNorthward" + coordinates: "longitude latitude" + source: variables/windNorthward + longName: "Northward Wind" + units: "m s-1" + + - name: "ObsValue/stationPressure" + coordinates: "longitude latitude" + source: variables/stationPressure + longName: "Station Pressure" + units: "Pa" + + - name: "ObsValue/pressureReducedToMeanSeaLevel" + coordinates: "longitude latitude" + source: variables/pressureReducedToMeanSeaLevel + longName: "Mean Sea-Level Pressure" + units: "Pa" + + - name: "ObsValue/seaTemperature" + coordinates: "longitude latitude" + source: variables/seaTemperature + longName: "Sea Temperature" + units: "K" + + - name: "ObsValue/depthBelowSeaSurface" + coordinates: "longitude latitude" + source: variables/depthBelowSeaSurface + longName: "Depth Below Sea Surface" + units: "m" + + - name: "ObsValue/heightOfWaves" + coordinates: "longitude latitude" + source: variables/heightOfWaves + longName: "Height of Waves" + units: "m" + + - name: "ObsValue/presentWeather" + coordinates: "longitude latitude" + source: variables/presentWeather + longName: "Description of Present Weather" + + - name: "ObsValue/maximumWindGustSpeed" + coordinates: "longitude latitude" + source: variables/maximumWindGustSpeed + longName: "Maximum Wind Gust Speed" + units: "m s-1" + + - name: "ObsValue/verticalSignificance" + coordinates: "longitude latitude" + source: variables/verticalSignificance + longName: "Description of Vertical Significance (Surface Observations)" + + - name: "ObsValue/cloudAmount" + coordinates: "longitude latitude" + source: variables/cloudAmount + longName: "Description of Cloud Amount" + + - name: "ObsValue/heightOfBaseOfCloud" + coordinates: "longitude latitude" + source: variables/heightOfBaseOfCloud + longName: "Height of Base of Cloud" + units: "m" + + - name: "ObsValue/cloudCoverTotal" + coordinates: "longitude latitude" + source: variables/cloudCoverTotal + longName: "Total Cloud Coverage" + units: "1" + + - name: "ObsValue/heightAboveSurfaceOfBaseOfLowestCloud" + coordinates: "longitude latitude" + source: variables/heightAboveSurfaceOfBaseOfLowestCloud + longName: "Height above Surface of Base of Lowest Cloud Seen" + + # Quality Marker + - name: "QualityMarker/stationPressure" + coordinates: "longitude latitude" + source: variables/stationPressureQualityMarker + longName: "Pressure Quality Marker" + + - name: "QualityMarker/height" + coordinates: "longitude latitude" + source: variables/heightOfObservationQualityMark + longName: "Height Quality Marker" + + - name: "QualityMarker/specificHumidity" + coordinates: "longitude latitude" + source: variables/specificHumidityQualityMarker + longName: "Specific Humidity Quality Marker" + + - name: "QualityMarker/airTemperature" + coordinates: "longitude latitude" + source: variables/airTemperatureQualityMarker + longName: "Temperature Quality Marker" + + - name: "QualityMarker/windEastward" + coordinates: "longitude latitude" + source: variables/windQualityMarker + longName: "windEastward Quality Marker" + + - name: "QualityMarker/windNorthward" + coordinates: "longitude latitude" + source: variables/windQualityMarker + longName: "windNorthward Quality Marker" + + - name: "QualityMarker/pressureReducedToMeanSeaLevel" + coordinates: "longitude latitude" + source: variables/pressureReducedToMeanSeaLevelQualityMarker + longName: "Mean Sea Level Pressure Quality Marker" + + - name: "QualityMarker/seaTemperature" + coordinates: "longitude latitude" + source: variables/seaTemperatureQualityMarker + longName: "Sea Temperature Quality Marker" + + # ObsError + - name: "ObsError/stationPressure" + coordinates: "longitude latitude" + source: variables/stationPressureError + longName: "Pressure Observation Error" + units: "Pa" + + - name: "ObsError/specificHumidity" + coordinates: "longitude latitude" + source: variables/specificHumidityError + longName: "Specific Humidity Error" + units: "kg kg-1" + + - name: "ObsError/relativeHumidity" + coordinates: "longitude latitude" + source: variables/relativeHumidityError + longName: "Relative Humidity Error" + units: "1" + + - name: "ObsError/airTemperature" + coordinates: "longitude latitude" + source: variables/airTemperatureError + longName: "Temperature Error" + units: "K" + + - name: "ObsError/windEastward" + coordinates: "longitude latitude" + source: variables/windError + longName: "Eastward wind error" + units: "m s-1" + + - name: "ObsError/windNorthward" + coordinates: "longitude latitude" + source: variables/windError + longName: "Northward wind error" + units: "m s-1" + + - name: "ObsError/seaTemperature" + coordinates: "longitude latitude" + source: variables/seaTemperatureError + longName: "Sea Temperature Observation Error" + units: "K" + +# # Tuned ObsError +# - name: "TunedObsError/stationPressure" +# coordinates: "longitude latitude" +# source: variables/stationPressureTunedError +# longName: "Analysis-Tuned Pressure Observation Error" +# units: "Pa" +# +# - name: "TunedObsError/relativeHumidity" +# coordinates: "longitude latitude" +# source: variables/relativeHumidityTunedError +# longName: "Analysis-Tuned Relative Humidity Error" +# units: "1" +# +# - name: "TunedObsError/airTemperature" +# coordinates: "longitude latitude" +# source: variables/airTemperatureTunedError +# longName: "Analysis-Tuned Temperature Error" +# units: "K" +# +# - name: "TunedObsError/windEastward" +# coordinates: "longitude latitude" +# source: variables/windTunedError +# longName: "Analysis-Tuned Eastward wind error" +# units: "m s-1" +# +# - name: "TunedObsError/windNorthward" +# coordinates: "longitude latitude" +# source: variables/windTunedError +# longName: "Analysis-Tuned Northward wind error" +# units: "m s-1" diff --git a/parm/soil/soil_ens_obs_dist_localizations.yaml.j2 b/parm/soil/soil_ens_obs_dist_localizations.yaml.j2 new file mode 100644 index 000000000..2f8805f97 --- /dev/null +++ b/parm/soil/soil_ens_obs_dist_localizations.yaml.j2 @@ -0,0 +1,21 @@ +obs_distribution_localizations: + obs_distribution: + name: {{ distribution_type }} + halo size: 250e3 + obs_localizations: + - localization method: Horizontal Box car + lengthscale: 250e3 + max nobs: 50 + +#override_obs_distribution_localizations: +# override: false +# ims_snow: +# obs_distribution: +# name: {{ distribution_type }} +# halo size: 250e3 +# obs_localizations: +# - localization method: Horizontal SOAR +# lengthscale: 250e3 +# soar horizontal decay: 0.000021 +##assuming one obs every 40 Km +# max nobs: 6 diff --git a/parm/soil/soil_letkf_config.yaml.j2 b/parm/soil/soil_letkf_config.yaml.j2 new file mode 100644 index 000000000..f1ef2b4f6 --- /dev/null +++ b/parm/soil/soil_letkf_config.yaml.j2 @@ -0,0 +1,191 @@ +jedi_config: + soilletkfanl: + rundir: '{{ DATA }}' + exe_src: '{{ EXECgfs }}/gdas.x' + mpi_cmd: '{{ APRUN_SOILLETKFANL }}' + jedi_args: ['fv3jedi', 'localensembleda'] + jcb_base_yaml: '{{ PARMgfs }}/gdas/soil/jcb-base.yaml.j2' + jcb_algo_yaml: '{{ PARMgfs }}/gdas/soil/jcb-prototype_lgetkf.yaml.j2' +# jcb_algo: 'local_ensemble_da' +# obs_list_yaml: '{{ OBS_LIST_YAML }}' + soilletkfaddinc: + rundir: '{{ DATA }}' + exe_src: '{{ EXECgdas }}/fv3jedi_addincrement.x' + mpi_cmd: '{{ APRUN_SOILLETKF_ADDINC }}' + jcb_base_yaml: '{{ PARMgdas }}/soil/jcb-base.yaml.j2' + jcb_algo: 'soil_lgetkf_increment' + +#TODO: add observer mode +# soilensanlobs: +# rundir: '{{ DATA }}' +# exe_src: '{{ EXECgfs }}/gdas.x' +# mpi_cmd: '{{ APRUN_SOILENSANLOBS }}' +# jedi_args: ['fv3jedi', 'localensembleda'] +# jcb_base_yaml: '{{ PARMgfs }}/gdas/soil/jcb-base.yaml.j2' +# jcb_algo_yaml: '{{ PARMgfs }}/gdas/soil/jcb-prototype_lgetkf_observer.yaml.j2' +# obs_list_yaml: '{{ OBS_LIST_YAML }}' +# soilensanlsol: +# rundir: '{{ DATA }}' +# exe_src: '{{ EXECgfs }}/gdas.x' +# mpi_cmd: '{{ APRUN_SOILENSANLSOL }}' +# jedi_args: ['fv3jedi', 'localensembleda'] +# jcb_base_yaml: '{{ PARMgfs }}/gdas/soil/jcb-base.yaml.j2' +# jcb_algo_yaml: '{{ PARMgfs }}/gdas/soil/jcb-prototype_lgetkf_solver.yaml.j2' +# obs_list_yaml: '{{ OBS_LIST_YAML }}' + +data_in: + mkdir: + - '{{ DATA }}/bkg' + - '{{ DATA }}/anl' + - '{{ DATA }}/bkg/ensmean' + - '{{ DATA }}/anl/ensmean' +{% for mem in range(0, NMEM_ENS + 1) %} + - '{{ DATA }}/bkg/mem{{ '%03d' % mem }}' + - '{{ DATA }}/anl/mem{{ '%03d' % mem }}' +{% endfor %} + - '{{ DATA }}/orog/ens' + - '{{ DATA }}/fv3jedi' + - '{{ DATA }}/berror' + + copy_req: +{% for mem in range(1, NMEM_ENS + 1) %} + {% set gmem = mem+mem_offset %} + {% if gmem > NMEM_ENS_MAX %} + {% set gmem = gmem-NMEM_ENS_MAX %} + {% endif %} + # define variables + # copy coupler file + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.coupler.res', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + # we need to copy them to two places, one serves as the basis for the analysis + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + {% if DOIAU %} + # if using IAU, also need backgrounds copied at the beginning of the window + # we need to copy them to two places, one serves as the basis for the analysis + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + {% endif %} +{% endfor %} + +{% filter indent(width=4) %} +{% include 'soil_stage_jedi_fix.yaml.j2' %} +{% include 'soil_stage_berror.yaml.j2' %} +{% include 'soil_stage_bufr2ioda_mapping.yaml.j2' %} +{% endfilter %} + + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}_mosaic.nc', '{{ DATA }}/orog/ens/'] + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}_grid.tile1.nc', '{{ DATA }}/orog/ens/'] + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}_grid.tile2.nc', '{{ DATA }}/orog/ens/'] + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}_grid.tile3.nc', '{{ DATA }}/orog/ens/'] + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}_grid.tile4.nc', '{{ DATA }}/orog/ens/'] + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}_grid.tile5.nc', '{{ DATA }}/orog/ens/'] + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}_grid.tile6.nc', '{{ DATA }}/orog/ens/'] + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile1.nc', '{{ DATA }}/orog/ens/' ] + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile2.nc', '{{ DATA }}/orog/ens/' ] + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile3.nc', '{{ DATA }}/orog/ens/' ] + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile4.nc', '{{ DATA }}/orog/ens/' ] + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile5.nc', '{{ DATA }}/orog/ens/' ] + - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile6.nc', '{{ DATA }}/orog/ens/' ] + + link_req: +{% for imem in range(1, NMEM_ENS+1) %} + {% set memchar = 'mem%03d' | format(imem) %} + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_mosaic.nc', '{{ DATA }}/bkg/{{ memchar }}/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile1.nc', '{{ DATA }}/bkg/{{ memchar }}/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile2.nc', '{{ DATA }}/bkg/{{ memchar }}/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile3.nc', '{{ DATA }}/bkg/{{ memchar }}/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile4.nc', '{{ DATA }}/bkg/{{ memchar }}/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile5.nc', '{{ DATA }}/bkg/{{ memchar }}/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile6.nc', '{{ DATA }}/bkg/{{ memchar }}/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile1.nc', '{{ DATA }}/bkg/{{ memchar }}/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile2.nc', '{{ DATA }}/bkg/{{ memchar }}/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile3.nc', '{{ DATA }}/bkg/{{ memchar }}/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile4.nc', '{{ DATA }}/bkg/{{ memchar }}/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile5.nc', '{{ DATA }}/bkg/{{ memchar }}/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile6.nc', '{{ DATA }}/bkg/{{ memchar }}/'] +{% endfor %} + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_mosaic.nc', '{{ DATA }}/bkg/ensmean/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile1.nc', '{{ DATA }}/bkg/ensmean/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile2.nc', '{{ DATA }}/bkg/ensmean/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile3.nc', '{{ DATA }}/bkg/ensmean/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile4.nc', '{{ DATA }}/bkg/ensmean/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile5.nc', '{{ DATA }}/bkg/ensmean/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile6.nc', '{{ DATA }}/bkg/ensmean/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile1.nc', '{{ DATA }}/bkg/ensmean/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile2.nc', '{{ DATA }}/bkg/ensmean/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile3.nc', '{{ DATA }}/bkg/ensmean/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile4.nc', '{{ DATA }}/bkg/ensmean/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile5.nc', '{{ DATA }}/bkg/ensmean/'] + - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile6.nc', '{{ DATA }}/bkg/ensmean/'] + +# copy_opt: +# {% filter indent(width=4) %} +# {% include 'soil_stage_obs.yaml.j2' %} +# {% endfilter %} + + +data_out: + copy_req: + # Configuration files + - ['{{ DATA }}/soilletkfanl.yaml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}soilletkfanl.yaml'] + - ['{{ DATA }}/soilanladdinc.yaml', '{{ COMOUT_CONF }}/{{ APREFIX }}soilanladdinc.yaml'] + - ['{{ DATA }}/soil_obs_list.yaml.j2', '{{ COMOUT_CONF }}/{{ APREFIX }}soil_obs_list.yaml.j2'] + +{% if DOIAU %} + {% set bkgtimes = [ current_cycle, WINDOW_BEGIN ] %} +{% else %} + {% set bkgtimes = [ current_cycle ] %} +{% endif %} +{% for bkgtime in bkgtimes %} + {% for imem in range(1, NMEM_ENS+1) %} + {% set memchar = 'mem%03d' | format(imem) %} + # Analysis + - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_analysis.sfc_data.tile1.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_analysis.sfc_data.tile2.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_analysis.sfc_data.tile3.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_analysis.sfc_data.tile4.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_analysis.sfc_data.tile5.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_analysis.sfc_data.tile6.nc'] + + # Increments + - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile1.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile2.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile3.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile4.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile5.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile6.nc'] + + {% endfor %} +{% endfor %} diff --git a/parm/soil/soil_stage_bufr2ioda_mapping.yaml.j2 b/parm/soil/soil_stage_bufr2ioda_mapping.yaml.j2 new file mode 100644 index 000000000..e9dbd2319 --- /dev/null +++ b/parm/soil/soil_stage_bufr2ioda_mapping.yaml.j2 @@ -0,0 +1 @@ +- ['{{PARMgfs}}/gdas/soil/prep/prepbufr_adpsfc.yaml', '{{ DATA }}/obs/'] From 7b945b92bd681d92abd01901128a3f67b6e35cff Mon Sep 17 00:00:00 2001 From: tsga Date: Wed, 4 Mar 2026 13:02:49 +0000 Subject: [PATCH 19/98] fix simulated var --- .../soil/adpsfc_airTemperature_181.yaml.j2 | 46 ++++++++++--------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_181.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_181.yaml.j2 index 17170fc62..3871250f3 100644 --- a/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_181.yaml.j2 +++ b/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_181.yaml.j2 @@ -16,8 +16,8 @@ missing file action: "warn" obsgrouping: group variables: ["stationIdentification"] - sort variable: "pressure" - sort order: "descending" +# sort variable: "pressure" +# sort order: "descending" obsdataout: write multiple files: {{write_multiple_files | default(false) }} engine: @@ -27,19 +27,21 @@ io pool: max pool size: {{ max_pool_size | default(1) }} observed variables: [airTemperature] +# simulated variables: [air_temperature_at_2m] simulated variables: [airTemperature] obs operator: - name: VertInterp - vertical coordinate: air_pressure - observation vertical coordinate: pressure - observation vertical coordinate group: MetaData - interpolation method: log-linear - variables: - - name: airTemperature + name: Identity +# name: VertInterp +# vertical coordinate: air_pressure +# observation vertical coordinate: pressure +# observation vertical coordinate group: MetaData +# interpolation method: log-linear +# variables: +# - name: airTemperature - linear obs operator: - name: VertInterp +# linear obs operator: +# name: VertInterp # localization TODO: generalize this condioned on da algo # ------------ @@ -120,25 +122,27 @@ filter variables: - name: airTemperature min_spacing: PT90M +# min_spacing: '{{ window_length }}' tolerance: PT0H seed_time: "{{soil_background_time_iso}}" category_variable: - name: MetaData/longitude_latitude_pressure + name: MetaData/stationIdentification +#MetaData/longitude_latitude_pressure where: - variable: ObsType/airTemperature is_in: 181 action: name: reduce obs space - # Online regional domain check - - filter: Bounds Check - udescriptor: "online_domain_check" - filter variables: - - name: airTemperature - test variables: - - name: GeoVaLs/observable_domain_mask - minvalue: 0.0 - maxvalue: 0.5 +# # Online regional domain check +# - filter: Bounds Check +# udescriptor: "online_domain_check" +# filter variables: +# - name: airTemperature +# test variables: +# - name: GeoVaLs/observable_domain_mask +# minvalue: 0.0 +# maxvalue: 0.5 # Initial error assignment - filter: Perform Action From adc9cbb9a4d1ade7662325c127ee93f2cf0adb9c Mon Sep 17 00:00:00 2001 From: tsga Date: Mon, 16 Mar 2026 15:02:30 +0000 Subject: [PATCH 20/98] changes for adpsfc_T2m_181 --- parm/atm/atm_obs_list.yaml.j2 | 11 +- parm/atm/jcb-base.yaml.j2 | 16 +- .../soil_ensemble_output_fms_common.yaml.j2 | 36 -- .../soil/soil_fv3jedi_fv3inc_lgetkf.yaml.j2 | 64 +++ .../soil/soil_lgetkf_addincrement.yaml.j2 | 89 ++++ .../soil/soil_lgetkf_increment.yaml.j2 | 117 +++-- .../soil/soil_background_ensemble.yaml.j2 | 20 +- .../soil_ensemble_output_fms_common.yaml.j2 | 18 - .../adpsfc_air_temperature_at_2m_181_gsi.yaml | 14 + .../atmosphere_gsi/sfc_gsi.yaml.j2 | 6 +- .../adpsfc_airTemperature_181_gsi.yaml.j2 | 436 +++++++++++++++++ .../soil/adpsfc_airTemperature_181.yaml.j2 | 302 +++++++----- .../adpsfc_airTemperature_181_gsi.yaml.j2 | 421 ++++++++++++++++ ...psfc_air_temperature_at_2m_181_gsi.yaml.j2 | 448 ++++++++++++++++++ .../soil/bk_adpsfc_airTemperature_181.yaml.j2 | 370 +++++++++++++++ parm/soil/jcb-base.yaml.j2 | 83 +++- parm/soil/jcb-prototype_lgetkf.yaml.j2 | 9 +- parm/soil/soil_letkf_config.yaml.j2 | 5 +- parm/soil/soil_obs_list.yaml.j2 | 6 +- 19 files changed, 2185 insertions(+), 286 deletions(-) delete mode 100644 parm/jcb-gdas/algorithm/soil/soil_ensemble_output_fms_common.yaml.j2 create mode 100644 parm/jcb-gdas/algorithm/soil/soil_fv3jedi_fv3inc_lgetkf.yaml.j2 create mode 100644 parm/jcb-gdas/algorithm/soil/soil_lgetkf_addincrement.yaml.j2 create mode 100644 parm/jcb-gdas/observation_chronicle/soil/adpsfc_air_temperature_at_2m_181_gsi.yaml create mode 100644 parm/jcb-gdas/observations/atmosphere/adpsfc_airTemperature_181_gsi.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/adpsfc_airTemperature_181_gsi.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/adpsfc_air_temperature_at_2m_181_gsi.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/bk_adpsfc_airTemperature_181.yaml.j2 diff --git a/parm/atm/atm_obs_list.yaml.j2 b/parm/atm/atm_obs_list.yaml.j2 index 61b483f68..5cd4977df 100644 --- a/parm/atm/atm_obs_list.yaml.j2 +++ b/parm/atm/atm_obs_list.yaml.j2 @@ -1,12 +1,13 @@ observations: -#- aircraft_humidity +- adpsfc_airTemperature_181_gsi +#aircraft_humidity #- aircraft_temperature #- aircraft_wind #- snowcvr #- abi_g16 -- prepbufr_adpsfc -- prepbufr_adpupa -- prepbufr_sfcshp +##- prepbufr_adpsfc +##- prepbufr_adpupa +##- prepbufr_sfcshp ##- scatwnd.ascat_metop-b ##- scatwnd.ascat_metop-c ##- satwnd.abi_goes-16 @@ -30,7 +31,7 @@ observations: ##- cris-fsr_n20 ##- cris-fsr_n21 ##- atms_npp -- radiance_atms_n20 +##- radiance_atms_n20 ##- gnssro_cosmic2 ##- gnssro_spire ##- gnssro_s6 diff --git a/parm/atm/jcb-base.yaml.j2 b/parm/atm/jcb-base.yaml.j2 index 170595023..601bb5297 100644 --- a/parm/atm/jcb-base.yaml.j2 +++ b/parm/atm/jcb-base.yaml.j2 @@ -82,6 +82,19 @@ atmosphere_iau_times_iso: {{ iau_times_iso }} # ------------------ observations: all_observations +#From Cory: https://docs.google.com/document/d/1CNfOZ7UzAOrVEXNyxeHAKafjjZp7WeBn-F07itWo6eE/ +#replace QC filters with a blanket configuration...to get listed obs' QC decisions from GSI: +replace_obs_filters: + observations: + - adpsfc_air_temperature_at_2m_181_gsi + override_filters: #only assimilate when GsiEffectiveQCAnl is 0 + - filter: PreQC + inputQC: 'GsiEffectiveQCAnl' + maxvalue: 0.0 + action: + name: reject + + crtm_coefficient_path: "{{ DATA }}/crtm/" # Naming conventions for observational files @@ -127,7 +140,8 @@ bias_files_dict: # ------------------------- local_ensemble_da_solver: Deterministic GETKF -increment_variables: [eastward_wind,northward_wind,layer_thickness,air_pressure_thickness,air_temperature,air_pressure_at_surface,water_vapor_mixing_ratio_wrt_moist_air,cloud_liquid_ice,cloud_liquid_water,snow_water,rain_water,graupel,ozone_mass_mixing_ratio] +increment_variables: [air_temperature] +#[eastward_wind,northward_wind,layer_thickness,air_pressure_thickness,air_temperature,air_pressure_at_surface,water_vapor_mixing_ratio_wrt_moist_air,cloud_liquid_ice,cloud_liquid_water,snow_water,rain_water,graupel,ozone_mass_mixing_ratio] atm_enkfonly: {{ DOENKFONLY_ATM | default(false, true) }} diff --git a/parm/jcb-gdas/algorithm/soil/soil_ensemble_output_fms_common.yaml.j2 b/parm/jcb-gdas/algorithm/soil/soil_ensemble_output_fms_common.yaml.j2 deleted file mode 100644 index 378422672..000000000 --- a/parm/jcb-gdas/algorithm/soil/soil_ensemble_output_fms_common.yaml.j2 +++ /dev/null @@ -1,36 +0,0 @@ -datapath: ./anl/mem%{member}% -filetype: fms restart -filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' -filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' -state variables: -- soilMoistureVolumetric -- stc -- totalSnowDepth -- sheleg -- vtype -- slmsk -- filtered_orography -- fraction_of_ice -- fraction_of_land -- air_temperature -- air_pressure_at_surface -- water_vapor_mixing_ratio_wrt_moist_air -- skin_temperature_at_surface -- layer_thickness -- air_pressure_thickness -- stype -- vfrac -field io names: - air_temperature: tmp - layer_thickness: delz - air_pressure_thickness: dpres - air_pressure_at_surface: pressfc - water_vapor_mixing_ratio_wrt_moist_air: spfh - skin_temperature_at_surface: tmpsfc - stype: sotyp - vfrac: veg - soilMoistureVolumetric: smc - totalSnowDepth: snodl - filtered_orography: orog_filt - fraction_of_ice: fice - fraction_of_land: land_frac diff --git a/parm/jcb-gdas/algorithm/soil/soil_fv3jedi_fv3inc_lgetkf.yaml.j2 b/parm/jcb-gdas/algorithm/soil/soil_fv3jedi_fv3inc_lgetkf.yaml.j2 new file mode 100644 index 000000000..a56e0b7f6 --- /dev/null +++ b/parm/jcb-gdas/algorithm/soil/soil_fv3jedi_fv3inc_lgetkf.yaml.j2 @@ -0,0 +1,64 @@ +background geometry: + fms initialization: + namelist filename: ./fv3jedi/fmsmpp.nml + field table filename: ./fv3jedi/field_table + akbk: ./fv3jedi/akbk.nc4 + layout: + - {{ soil_layout_x }} + - {{ soil_layout_y }} + npx: {{ soil_npx_ges }} + npy: {{ soil_npy_ges }} + npz: {{ soil_npz_ges }} +fv3 increment geometry: + fms initialization: + namelist filename: ./fv3jedi/fmsmpp.nml + field table filename: ./fv3jedi/field_table + akbk: ./fv3jedi/akbk.nc4 + layout: + - {{ soil_layout_x }} + - {{ soil_layout_y }} + npx: {{ soil_npx_ges }} + npy: {{ soil_npy_ges }} + npz: {{ soil_npz_ges }} +members from template: + template: + background input: + datapath: ./bkg/mem%mem% + datetime: '{{ soil_background_time_iso }}' + filetype: fms restart + skip coupler file: true + filename is datetime templated: true + filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' + state variables: + - stc +# field io names: +# air_temperature_at_2m: t2m + fv3 increment input: + filetype: fms restart + datapath: ./anl/mem%mem% + datetime: '{{ soil_background_time_iso }}' + filetype: fms restart + skip coupler file: true + filename is datetime templated: true + prefix: soilinc + filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' + added variables: + - stc +# field io names: +# air_temperature_at_2m: t2m + fv3 output: + filetype: fms restart + datapath: ./anl/mem%mem% + datetime: '{{ soil_background_time_iso }}' + filetype: fms restart + skip coupler file: true + filename is datetime templated: true + prefix: soilanl + filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' + added variables: + - stc +# field io names: +# air_temperature_at_2m: t2m + pattern: '%mem%' + nmembers: {{ soil_number_ensemble_members }} + zero padding: 3 diff --git a/parm/jcb-gdas/algorithm/soil/soil_lgetkf_addincrement.yaml.j2 b/parm/jcb-gdas/algorithm/soil/soil_lgetkf_addincrement.yaml.j2 new file mode 100644 index 000000000..c97951382 --- /dev/null +++ b/parm/jcb-gdas/algorithm/soil/soil_lgetkf_addincrement.yaml.j2 @@ -0,0 +1,89 @@ +state geometry: + fms initialization: + namelist filename: ./fv3jedi/fmsmpp.nml + field table filename: ./fv3jedi/field_table + akbk: ./fv3jedi/akbk.nc4 + layout: + - {{ soil_layout_x }} + - {{ soil_layout_y }} + npx: {{ soil_npx_ges }} + npy: {{ soil_npy_ges }} + npz: {{ soil_npz_ges }} +# field metadata override: ./fv3jedi/fv3jedi_fieldmetadata_history.yaml +increment geometry: + fms initialization: + namelist filename: ./fv3jedi/fmsmpp.nml + field table filename: ./fv3jedi/field_table + akbk: ./fv3jedi/akbk.nc4 + layout: + - {{ soil_layout_x }} + - {{ soil_layout_y }} + npx: {{ soil_npx_anl }} + npy: {{ soil_npy_anl }} + npz: {{ soil_npz_anl }} +# field metadata override: ./fv3jedi/fv3jedi_fieldmetadata_fv3inc.yaml +#members from template: +# template: +# pattern: "{{ soil_ensemble_pattern | default("%mem%", true) }}" +# nmembers: {{ soil_number_ensemble_members }} +# zero padding: 3 +state: + state variables: + - soilMoistureVolumetric + - stc + - totalSnowDepth + - sheleg + - vtype + - slmsk + - fraction_of_ice + - air_temperature_at_2m +#- temperature_2m +#- spec_humidity_2m + field io names: + totalSnowDepth: snodl + soilMoistureVolumetric: smc + fraction_of_ice: fice + air_temperature_at_2m: t2m + datapath: ./bkg/mem%{member}% + filetype: fms restart + skip coupler file: true + filename is datetime templated: true + datetime: '{{ soil_background_time_iso }}' + filename_sfcd: {{ soil_background_time_fv3 }}.sfc_data.nc +increment: + added variables: +# - soilMoistureVolumetric + - stc + - air_temperature_at_2m + field io names: +# soilMoistureVolumetric: smc + air_temperature_at_2m: t2m + datapath: ./anl/mem%{member}% + filetype: fms restart + skip coupler file: true + prefix: soilinc + filename is datetime templated: true + datetime: '{{ soil_background_time_iso }}' + filename_sfcd: {{ soil_background_time_fv3 }}.sfc_data.nc +output: + datapath: ./anl/mem%{member}% + prefix: soilanl + filetype: fms restart + skip coupler file: true + filename is datetime templated: true + datetime: '{{ soil_background_time_iso }}' + filename_sfcd: {{ soil_background_time_fv3 }}.sfc_data.nc + state variables: + - soilMoistureVolumetric + - stc + - totalSnowDepth + - sheleg + - vtype + - slmsk + - fraction_of_ice + - air_temperature_at_2m + field io names: + soilMoistureVolumetric: smc + totalSnowDepth: snodl + fraction_of_ice: fice + air_temperature_at_2m: t2m diff --git a/parm/jcb-gdas/algorithm/soil/soil_lgetkf_increment.yaml.j2 b/parm/jcb-gdas/algorithm/soil/soil_lgetkf_increment.yaml.j2 index 4536c9c0a..1c1ae60e3 100644 --- a/parm/jcb-gdas/algorithm/soil/soil_lgetkf_increment.yaml.j2 +++ b/parm/jcb-gdas/algorithm/soil/soil_lgetkf_increment.yaml.j2 @@ -1,4 +1,4 @@ -# background geometry: +#background geometry: state geometry: fms initialization: namelist filename: ./fv3jedi/fmsmpp.nml @@ -24,76 +24,73 @@ increment geometry: npy: {{ soil_npy_anl }} npz: {{ soil_npz_anl }} # field metadata override: ./fv3jedi/fv3jedi_fieldmetadata_fv3inc.yaml -members from template: - template: - background input: +state: + members from template: + template: +#background input: state variables: &state_vars - - soilMoistureVolumetric - - stc - - totalSnowDepth - - sheleg - - vtype - - slmsk - - filtered_orography - - fraction_of_ice - - fraction_of_land - - air_temperature - - air_pressure_at_surface - - water_vapor_mixing_ratio_wrt_moist_air - - skin_temperature_at_surface - - layer_thickness - - air_pressure_thickness - - stype - - vfrac +# - soilMoistureVolumetric +# - stc +# - totalSnowDepth +# - sheleg +# - vtype +# - slmsk +# - filtered_orography +# - fraction_of_ice +# - fraction_of_land + - air_temperature_at_2m +#- temperature_2m +#- spec_humidity_2m field io names: &field_io_names - air_temperature: tmp - layer_thickness: delz - air_pressure_thickness: dpres - air_pressure_at_surface: pressfc - water_vapor_mixing_ratio_wrt_moist_air: spfh - skin_temperature_at_surface: tmpsfc - stype: sotyp - vfrac: veg - soilMoistureVolumetric: smc - totalSnowDepth: snodl - filtered_orography: orog_filt - fraction_of_ice: fice - fraction_of_land: land_frac - datapath: {{ soil_background_ensemble_path }} +# soilMoistureVolumetric: smc +# totalSnowDepth: snodl +# filtered_orography: orog_filt +# fraction_of_ice: fice +# fraction_of_land: land_frac + air_temperature_at_2m: t2m + datapath: ./bkg/mem%mem% datetime: '{{ soil_background_time_iso }}' filetype: fms restart skip coupler file: true - filename is datetime templated: true +# filename is datetime templated: true filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' - filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' - filename_orog: '{{ soil_orog_prefix }}_oro_data.nc' - max allowable geometry difference: 1e-4 - increment: - added variables: - - stc - - air_temperature +# max allowable geometry difference: 1e-4 + pattern: '%mem%' + nmembers: {{ soil_number_ensemble_members }} + zero padding: 3 +increment: + members from template: + template: + state variables: +# - stc + - air_temperature_at_2m field io names: - air_temperature: tmp - datapath: {{ soil_analysis_ensemble_path }} + air_temperature_at_2m: t2m + datapath: ./anl/mem%mem% datetime: '{{ soil_background_time_iso }}' filetype: fms restart skip coupler file: true - filename is datetime templated: true - prefix: soil_inc - filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' - output: - state variables: *state_vars +# filename is datetime templated: true +# prefix: soilinc + filename_sfcd: 'soilinc.{{ soil_background_time_fv3 }}.sfc_data.nc' + pattern: '%mem%' + nmembers: {{ soil_number_ensemble_members }} + zero padding: 3 +output: + members from template: + template: + state variables: # - stc -# - air_temperature - field io names: *field_io_names -# air_temperature: tmp - datapath: {{ soil_analysis_ensemble_path }} + - air_temperature_at_2m + field io names: + air_temperature_at_2m: t2m + datapath: ./anl/mem%mem% datetime: '{{ soil_background_time_iso }}' filetype: fms restart skip coupler file: true - filename is datetime templated: true - prefix: soil_anl - filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' - pattern: "{{ soil_ensemble_pattern | default("%mem%", true) }}" - nmembers: {{ soil_number_ensemble_members }} - zero padding: 3 +# filename is datetime templated: true +# prefix: soil_anl + filename_sfcd: 'soil_bgpi.{{ soil_background_time_fv3 }}.sfc_data.nc' + pattern: '%mem%' + nmembers: {{ soil_number_ensemble_members }} + zero padding: 3 diff --git a/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 index 726c13277..6b59aeaac 100644 --- a/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 @@ -17,32 +17,14 @@ members from template: - fraction_of_land - air_temperature_at_2m #temperature_2m -# - spec_humidity_2m -# - air_temperature -# - air_pressure_at_surface -# - water_vapor_mixing_ratio_wrt_moist_air -# - skin_temperature_at_surface -# - layer_thickness -# - air_pressure_thickness -# - stype -# - vfrac +#spec_humidity_2m field io names: &field_ios -# air_temperature: tmp -# layer_thickness: delz -# air_pressure_thickness: dpres -# air_pressure_at_surface: pressfc -# water_vapor_mixing_ratio_wrt_moist_air: spfh -# skin_temperature_at_surface: tmpsfc -# stype: sotyp -# vfrac: veg soilMoistureVolumetric: smc totalSnowDepth: snodl filtered_orography: orog_filt fraction_of_ice: fice fraction_of_land: land_frac air_temperature_at_2m: t2m -# temperature_2m: t2m -# spec_humidity_2m: q2m datapath: {{ soil_background_ensemble_path }} filename is datetime templated: true filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' diff --git a/parm/jcb-gdas/model/soil/soil_ensemble_output_fms_common.yaml.j2 b/parm/jcb-gdas/model/soil/soil_ensemble_output_fms_common.yaml.j2 index b7528da27..826ab5a81 100644 --- a/parm/jcb-gdas/model/soil/soil_ensemble_output_fms_common.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_ensemble_output_fms_common.yaml.j2 @@ -15,14 +15,6 @@ state variables: - air_temperature_at_2m #- temperature_2m #- spec_humidity_2m -#- air_temperature -#- air_pressure_at_surface -#- water_vapor_mixing_ratio_wrt_moist_air -#- skin_temperature_at_surface -#- layer_thickness -#- air_pressure_thickness -#- stype -#- vfrac field io names: soilMoistureVolumetric: smc totalSnowDepth: snodl @@ -30,13 +22,3 @@ field io names: fraction_of_ice: fice fraction_of_land: land_frac air_temperature_at_2m: t2m -# temperature_2m: t2m -# spec_humidity_2m: q2m -# air_temperature: tmp -# layer_thickness: delz -# air_pressure_thickness: dpres -# air_pressure_at_surface: pressfc -# water_vapor_mixing_ratio_wrt_moist_air: spfh -# skin_temperature_at_surface: tmpsfc -# stype: sotyp -# vfrac: veg diff --git a/parm/jcb-gdas/observation_chronicle/soil/adpsfc_air_temperature_at_2m_181_gsi.yaml b/parm/jcb-gdas/observation_chronicle/soil/adpsfc_air_temperature_at_2m_181_gsi.yaml new file mode 100644 index 000000000..f7db866a8 --- /dev/null +++ b/parm/jcb-gdas/observation_chronicle/soil/adpsfc_air_temperature_at_2m_181_gsi.yaml @@ -0,0 +1,14 @@ +# Instrument metadata +# ------------------- +commissioned: 1970-01-01T00:00:00 + +observer_type: conventional # Type of chronicle to use + +window_option: max + +# observation type initial configuration +# -------------------------------- +stations_to_reject: [fakelist] + +# Chronicle of changes for this observation type +# ---------------------------------------- diff --git a/parm/jcb-gdas/observation_statistics/atmosphere_gsi/sfc_gsi.yaml.j2 b/parm/jcb-gdas/observation_statistics/atmosphere_gsi/sfc_gsi.yaml.j2 index 2f6f5b7c4..358d17d11 100644 --- a/parm/jcb-gdas/observation_statistics/atmosphere_gsi/sfc_gsi.yaml.j2 +++ b/parm/jcb-gdas/observation_statistics/atmosphere_gsi/sfc_gsi.yaml.j2 @@ -4,8 +4,10 @@ engine: type: H5File obsfile: "{{ atmosphere_gsi_obsdatain_path }}/{{ atmosphere_gsi_obsdatain_prefix }}{{ observation_from_jcb }}{{ atmosphere_gsi_obsdatain_suffix }}" - simulated variables: ['stationPressure', 'airTemperature', 'specificHumidity', 'windEastward', 'windNorthward'] - observed variables: ['stationPressure', 'airTemperature', 'specificHumidity', 'windEastward', 'windNorthward'] + simulated variables: ['air_temperature'] +#'stationPressure', 'airTemperature', 'specificHumidity', 'windEastward', 'windNorthward'] + observed variables: ['air_temperature'] +#['stationPressure', 'airTemperature', 'specificHumidity', 'windEastward', 'windNorthward'] statistics to compute: ['mean', 'count', 'RMS'] variables: ['stationPressure', 'airTemperature', 'specificHumidity', 'windEastward', 'windNorthward'] groups to process: ['ombg', 'oman'] diff --git a/parm/jcb-gdas/observations/atmosphere/adpsfc_airTemperature_181_gsi.yaml.j2 b/parm/jcb-gdas/observations/atmosphere/adpsfc_airTemperature_181_gsi.yaml.j2 new file mode 100644 index 000000000..5bf8da0a5 --- /dev/null +++ b/parm/jcb-gdas/observations/atmosphere/adpsfc_airTemperature_181_gsi.yaml.j2 @@ -0,0 +1,436 @@ +- + # Observation Space (I/O) + # ----------------------- + + obs space: + name: {{observation_from_jcb}} +{% if algorithm == "local_ensemble_da" %} + distribution: + name: {{distribution_type}} + halo size: "{{halo_size}}" +{% endif %} + obsdatain: + engine: + type: H5File + obsfile: "{{atmosphere_obsdatain_path}}/{{atmosphere_obsdatain_prefix}}{{observation_from_jcb}}{{atmosphere_obsdatain_suffix}}" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + obsdataout: + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: "{{atmosphere_obsdataout_path}}/{{atmosphere_obsdataout_prefix}}{{observation_from_jcb}}{{atmosphere_obsdataout_suffix}}" + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [airTemperature] +#airTemperature] +# derived variables: [airTemperature] + simulated variables: [airTemperature] + +##--cmnt obs operator: +## name: Identity +## +## # localization TODO: generalize this condioned on da algo +## # ------------ +##{% if algorithm == "local_ensemble_da" %} +## obs localizations: +## - localization method: {{localization_method}} +## lengthscale: {{loc_length_scale}} +## max nobs: {{max_nobs}} +##--cmnt{% endif %} +#..ins + + obs operator: + name: VertInterp + vertical coordinate: air_pressure + observation vertical coordinate: pressure + observation vertical coordinate group: MetaData + interpolation method: log-linear + variables: + - name: airTemperature + + linear obs operator: + name: VertInterp + +#...endins + + obs error: + covariance model: diagonal + +# obs pre filters: +# - filter: Variable Assignment +# assignments: +# - name: DerivedObsValue/airTemperature +# type: float +# function: +# name: ObsFunction/Arithmetic +# options: +# variables: [ObsValue/airTemperature] +# total exponent: 1. + + obs filters: +# # ------------------ +# # airTemperature (181) +# # ------------------ +# # Accept, reject, or passivate (monitor) +# - filter: Perform Action +# udescriptor: "iuse_check" +# filter variables: +# - name: airTemperature +# where: +# - variable: ObsType/airTemperature +# is_in: 181 +# action: +# name: {{iuse_adpsfc_airTemperature_181 | default("passivate", true)}} # accept, reject, passivate +# + # Reject all obs not in type + - filter: Perform Action + udescriptor: "obs_type_check" + where: + - variable: ObsValue/airTemperature + value: is_not_valid + action: + name: reduce obs space + + # Reject all obs not in kx + - filter: Perform Action + udescriptor: "obs_kx_check" + where: + - variable: ObsType/airTemperature + is_not_in: 181 + action: + name: reduce obs space + + # Reject all obs with QualityMarker > 3 + - filter: RejectList + udescriptor: "quality_marker_check" + filter variables: + - name: airTemperature + where: + - variable: QualityMarker/airTemperature + is_in: 4-15 + value: is_not_valid + where operator: or + action: + name: reduce obs space + + # Time window filter + - filter: Bounds Check + udescriptor: "time_window_check" + filter variables: + - name: airTemperature + test variables: + - name: MetaData/timeOffset #s + minvalue: -10800 #-900 + maxvalue: 10800 #900 + where: + - variable: ObsType/airTemperature + is_in: 181 + action: + name: reduce obs space + +# # Duplicate Check +# - filter: Temporal Thinning +# udescriptor: "duplicate_check" +# filter variables: +# - name: airTemperature +## min_spacing: PT90M +# min_spacing: '{{ window_length }}' +# tolerance: PT0H +# seed_time: "{{atmosphere_background_time_iso}}" +# category_variable: +# name: MetaData/stationIdentification +##MetaData/longitude_latitude_pressure +# where: +# - variable: ObsType/airTemperature +# is_in: 181 +# action: +# name: reduce obs space + +## # Online regional domain check +## - filter: Bounds Check +## udescriptor: "online_domain_check" +## filter variables: +## - name: airTemperature +## test variables: +## - name: GeoVaLs/observable_domain_mask +## minvalue: 0.0 +## maxvalue: 0.5 + - filter: Domain Check # land only + where: + - variable: + name: GeoVaLs/fraction_of_land + minvalue: 0.5 + actions: +# - name: set +# flag: land_check +# ignore: rejected observations + - name: reject + - filter: Domain Check # land only, no sea ice + where: + - variable: + name: GeoVaLs/fraction_of_ice + maxvalue: 0.0 + actions: +# - name: set +# flag: seaice_check +# ignore: rejected observations + - name: reject + - filter: Domain Check # no snow + where: + - variable: + name: GeoVaLs/sheleg + maxvalue: 0.0 + actions: +# - name: set +# flag: snow_check +# ignore: rejected observations + - name: reject + - filter: RejectList # no land-ice + where: + - variable: + name: GeoVaLs/vtype + minvalue: 14.5 + maxvalue: 15.5 + actions: +# - name: set +# flag: landice_check +# ignore: rejected observations + - name: reject + - filter: RejectList # exclude certain IGBP vegetation types + where: + - variable: + name: GeoVaLs/vtype + absolute_tolerance: 1.0e-3 + is_close_to_any_of: [1, 2, 3, 4, 13, 15, 17] + actions: +# - name: set +# flag: vegtype_check +# ignore: rejected observations + - name: reject + + # Initial error assignment + - filter: Perform Action + udescriptor: "initial_error_assignment" + filter variables: + - name: airTemperature + where: + - variable: ObsType/airTemperature + is_in: 181 + 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] + errors: [1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056] + +# # Reduce observation error and turn off ObsErrorFactorPressureCheck (l_gsd_terrain_match_surfTobs=.true., l_sfcobserror_ramp_t=.true.,) +# - filter: Perform Action +# filter variables: +# - name: airTemperature +# action: +# name: inflate error +# inflation factor: 0.5 +# +# # Error inflation based on pressure check (setupt.f90) ##>>requires non-sfc geov +# - filter: Perform Action +# udescriptor: "error_inflation_pressure_check" +# filter variables: +# - name: airTemperature +# where: +# - variable: ObsType/airTemperature +# is_in: 181 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorPressureCheck +# options: +# variable: airTemperature +# surface observation error ramp: true +# max levels below surface: 15 +# inflation factor: 8.0 +# +## # Error inflation based on errormod (qcmod.f90) +## - filter: Perform Action +## filter variables: +## - name: airTemperature +## where: +## - variable: ObsType/airTemperature +## is_in: 181 +## action: +## name: inflate error +## inflation variable: +## name: ObsFunction/ObsErrorFactorConventional +## options: +## inflate variables: [airTemperature] +## pressure: MetaData/pressure + + # Error inflation when QualityMarker == 3 (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_QualityMarker" + filter variables: + - name: airTemperature + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: QualityMarker/airTemperature + is_in: 3 + - variable: ObsType/airTemperature + is_in: 181 + + # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_observation_pressure" + filter variables: + - name: airTemperature + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: MetaData/pressure + maxvalue: 10000.0 + - variable: ObsType/airTemperature + is_in: 181 + + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: airTemperature + test variables: + - name: ObsErrorData/airTemperature + minvalue: 0.0 + maxvalue: 1000 + where: + - variable: ObsType/airTemperature + is_in: 181 + action: + name: reduce obs space + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: airTemperature + minvalue: 100 + maxvalue: 400 + where: + - variable: ObsType/airTemperature + is_in: 181 + action: + name: reduce obs space + + # Create temporary ObsErrorData + - filter: Variable Assignment + udescriptor: "create_temporary_ObsErrorData" + apply at iterations: 0,1 + where: + - variable: ObsType/airTemperature + is_in: 181 + assignments: + - name: TempObsErrorData/airTemperature + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/airTemperature + defer to post: true + + # Set ObsError set "error parameter" if < "max value" + - filter: Perform Action + udescriptor: "ermin_set" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + action: + name: assign error + error parameter: 1.0 + where: + - variable: + name: ObsErrorData/airTemperature + maxvalue: 1.0 + - variable: + name: ObsErrorData/airTemperature + value: is_valid + - variable: ObsType/airTemperature + is_in: 181 + defer to post: true + + # Set ObsError set "error parameter" if > "min value" + - filter: Perform Action + udescriptor: "ermax_set" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + action: + name: assign error + error parameter: 3.0 + where: + - variable: + name: ObsErrorData/airTemperature + minvalue: 3.0 + - variable: + name: ObsErrorData/airTemperature + value: is_valid + - variable: ObsType/airTemperature + is_in: 181 + defer to post: true + + # Gross Error Check + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + threshold: 5.0 + action: + name: reject + where: + - variable: QualityMarker/airTemperature + is_not_in: 3 + - variable: ObsType/airTemperature + is_in: 181 + defer to post: true + + # Gross Error Check: cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + threshold: 3.5 + action: + name: reject + where: + - variable: QualityMarker/airTemperature + is_in: 3 + - variable: ObsType/airTemperature + is_in: 181 + defer to post: true + + # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. + - filter: Perform Action + udescriptor: "reassign_error_TempObsErrorData" + apply at iterations: 0,1 + filter variables: + - name: airTemperature + action: + name: assign error + error function: TempObsErrorData/airTemperature + where: + - variable: + name: TempObsErrorData/airTemperature + value: is_valid + - variable: ObsType/airTemperature + is_in: 181 + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_181.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_181.yaml.j2 index 3871250f3..005176ecf 100644 --- a/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_181.yaml.j2 +++ b/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_181.yaml.j2 @@ -12,12 +12,10 @@ obsdatain: engine: type: H5File - obsfile: "{{soil_obsdatain_path}}/{{soil_obsdatain_prefix}}{{observation_from_jcb}}.nc" + obsfile: "{{soil_obsdatain_path}}/{{soil_obsdatain_prefix}}{{observation_from_jcb}}{{atmosphere_obsdatain_suffix}}" missing file action: "warn" obsgrouping: group variables: ["stationIdentification"] -# sort variable: "pressure" -# sort order: "descending" obsdataout: write multiple files: {{write_multiple_files | default(false) }} engine: @@ -26,23 +24,14 @@ allow overwrite: true io pool: max pool size: {{ max_pool_size | default(1) }} - observed variables: [airTemperature] -# simulated variables: [air_temperature_at_2m] - simulated variables: [airTemperature] + observed variables: [air_temperature_at_2m] +#airTemperature] +# derived variables: [air_temperature_at_2m] + simulated variables: [air_temperature_at_2m] obs operator: name: Identity -# name: VertInterp -# vertical coordinate: air_pressure -# observation vertical coordinate: pressure -# observation vertical coordinate group: MetaData -# interpolation method: log-linear -# variables: -# - name: airTemperature - -# linear obs operator: -# name: VertInterp - + # localization TODO: generalize this condioned on da algo # ------------ {% if algorithm == "local_ensemble_da" %} @@ -55,26 +44,37 @@ obs error: covariance model: diagonal - obs filters: - # ------------------ - # airTemperature (181) - # ------------------ - # Accept, reject, or passivate (monitor) - - filter: Perform Action - udescriptor: "iuse_check" - filter variables: - - name: airTemperature - where: - - variable: ObsType/airTemperature - is_in: 181 - action: - name: {{iuse_adpsfc_airTemperature_181 | default("passivate", true)}} # accept, reject, passivate +# obs pre filters: +# - filter: Variable Assignment +# assignments: +# - name: DerivedObsValue/air_temperature_at_2m +# type: float +# function: +# name: ObsFunction/Arithmetic +# options: +# variables: [ObsValue/air_temperature_at_2m] +# total exponent: 1. + obs filters: +# # ------------------ +# # air_temperature_at_2m (181) +# # ------------------ +# # Accept, reject, or passivate (monitor) +# - filter: Perform Action +# udescriptor: "iuse_check" +# filter variables: +# - name: air_temperature_at_2m +# where: +# - variable: ObsType/air_temperature_at_2m +# is_in: 181 +# action: +# name: {{iuse_adpsfc_air_temperature_at_2m_181 | default("passivate", true)}} # accept, reject, passivate +# # Reject all obs not in type - filter: Perform Action udescriptor: "obs_type_check" where: - - variable: ObsValue/airTemperature + - variable: ObsValue/air_temperature_at_2m value: is_not_valid action: name: reduce obs space @@ -83,7 +83,7 @@ - filter: Perform Action udescriptor: "obs_kx_check" where: - - variable: ObsType/airTemperature + - variable: ObsType/air_temperature_at_2m is_not_in: 181 action: name: reduce obs space @@ -92,9 +92,9 @@ - filter: RejectList udescriptor: "quality_marker_check" filter variables: - - name: airTemperature + - name: air_temperature_at_2m where: - - variable: QualityMarker/airTemperature + - variable: QualityMarker/air_temperature_at_2m is_in: 4-15 value: is_not_valid where operator: or @@ -105,52 +105,104 @@ - filter: Bounds Check udescriptor: "time_window_check" filter variables: - - name: airTemperature + - name: air_temperature_at_2m test variables: - - name: MetaData/timeOffset - minvalue: -900 - maxvalue: 900 + - name: MetaData/timeOffset #s + minvalue: -10800 #-900 + maxvalue: 10800 #900 where: - - variable: ObsType/airTemperature + - variable: ObsType/air_temperature_at_2m is_in: 181 action: name: reduce obs space - - # Duplicate Check - - filter: Temporal Thinning - udescriptor: "duplicate_check" - filter variables: - - name: airTemperature - min_spacing: PT90M + +# # Duplicate Check +# - filter: Temporal Thinning +# udescriptor: "duplicate_check" +# filter variables: +# - name: air_temperature_at_2m +## min_spacing: PT90M # min_spacing: '{{ window_length }}' - tolerance: PT0H - seed_time: "{{soil_background_time_iso}}" - category_variable: - name: MetaData/stationIdentification -#MetaData/longitude_latitude_pressure - where: - - variable: ObsType/airTemperature - is_in: 181 - action: - name: reduce obs space +# tolerance: PT0H +# seed_time: "{{soil_background_time_iso}}" +# category_variable: +# name: MetaData/stationIdentification +##MetaData/longitude_latitude_pressure +# where: +# - variable: ObsType/air_temperature_at_2m +# is_in: 181 +# action: +# name: reduce obs space -# # Online regional domain check -# - filter: Bounds Check -# udescriptor: "online_domain_check" -# filter variables: -# - name: airTemperature -# test variables: -# - name: GeoVaLs/observable_domain_mask -# minvalue: 0.0 -# maxvalue: 0.5 +## # Online regional domain check +## - filter: Bounds Check +## udescriptor: "online_domain_check" +## filter variables: +## - name: air_temperature_at_2m +## test variables: +## - name: GeoVaLs/observable_domain_mask +## minvalue: 0.0 +## maxvalue: 0.5 + - filter: Domain Check # land only + where: + - variable: + name: GeoVaLs/fraction_of_land + minvalue: 0.5 + actions: +# - name: set +# flag: land_check +# ignore: rejected observations + - name: reject + - filter: Domain Check # land only, no sea ice + where: + - variable: + name: GeoVaLs/fraction_of_ice + maxvalue: 0.0 + actions: +# - name: set +# flag: seaice_check +# ignore: rejected observations + - name: reject + - filter: Domain Check # no snow + where: + - variable: + name: GeoVaLs/sheleg + maxvalue: 0.0 + actions: +# - name: set +# flag: snow_check +# ignore: rejected observations + - name: reject + - filter: RejectList # no land-ice + where: + - variable: + name: GeoVaLs/vtype + minvalue: 14.5 + maxvalue: 15.5 + actions: +# - name: set +# flag: landice_check +# ignore: rejected observations + - name: reject + - filter: RejectList # exclude certain IGBP vegetation types + where: + - variable: + name: GeoVaLs/vtype + absolute_tolerance: 1.0e-3 + is_close_to_any_of: [1, 2, 3, 4, 13, 15, 17] + actions: +# - name: set +# flag: vegtype_check +# ignore: rejected observations + - name: reject # Initial error assignment - filter: Perform Action udescriptor: "initial_error_assignment" filter variables: - - name: airTemperature + - name: air_temperature_at_2m where: - - variable: ObsType/airTemperature + - variable: ObsType/air_temperature_at_2m is_in: 181 action: name: assign error @@ -165,83 +217,83 @@ # # Reduce observation error and turn off ObsErrorFactorPressureCheck (l_gsd_terrain_match_surfTobs=.true., l_sfcobserror_ramp_t=.true.,) # - filter: Perform Action # filter variables: -# - name: airTemperature +# - name: air_temperature_at_2m # action: # name: inflate error # inflation factor: 0.5 - - # Error inflation based on pressure check (setupt.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: airTemperature - where: - - variable: ObsType/airTemperature - is_in: 181 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: airTemperature - surface observation error ramp: true - max levels below surface: 15 - inflation factor: 8.0 - -# # Error inflation based on errormod (qcmod.f90) +# +# # Error inflation based on pressure check (setupt.f90) ##>>requires non-sfc geov # - filter: Perform Action +# udescriptor: "error_inflation_pressure_check" # filter variables: -# - name: airTemperature +# - name: air_temperature_at_2m # where: -# - variable: ObsType/airTemperature +# - variable: ObsType/air_temperature_at_2m # is_in: 181 # action: # name: inflate error # inflation variable: -# name: ObsFunction/ObsErrorFactorConventional +# name: ObsFunction/ObsErrorFactorPressureCheck # options: -# inflate variables: [airTemperature] -# pressure: MetaData/pressure +# variable: air_temperature_at_2m +# surface observation error ramp: true +# max levels below surface: 15 +# inflation factor: 8.0 +# +## # Error inflation based on errormod (qcmod.f90) +## - filter: Perform Action +## filter variables: +## - name: air_temperature_at_2m +## where: +## - variable: ObsType/air_temperature_at_2m +## is_in: 181 +## action: +## name: inflate error +## inflation variable: +## name: ObsFunction/ObsErrorFactorConventional +## options: +## inflate variables: [air_temperature_at_2m] +## pressure: MetaData/pressure # Error inflation when QualityMarker == 3 (read_prepbufr.f90) - filter: Perform Action udescriptor: "error_inflation_QualityMarker" filter variables: - - name: airTemperature + - name: air_temperature_at_2m action: name: inflate error inflation factor: 1.2 where: - - variable: QualityMarker/airTemperature + - variable: QualityMarker/air_temperature_at_2m is_in: 3 - - variable: ObsType/airTemperature + - variable: ObsType/air_temperature_at_2m is_in: 181 # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) - filter: Perform Action udescriptor: "error_inflation_observation_pressure" filter variables: - - name: airTemperature + - name: air_temperature_at_2m action: name: inflate error inflation factor: 1.2 where: - variable: MetaData/pressure maxvalue: 10000.0 - - variable: ObsType/airTemperature + - variable: ObsType/air_temperature_at_2m is_in: 181 # Bounds Check (ObsError) - filter: Bounds Check udescriptor: "bounds_check_ObsError" filter variables: - - name: airTemperature + - name: air_temperature_at_2m test variables: - - name: ObsErrorData/airTemperature + - name: ObsErrorData/air_temperature_at_2m minvalue: 0.0 maxvalue: 1000 where: - - variable: ObsType/airTemperature + - variable: ObsType/air_temperature_at_2m is_in: 181 action: name: reduce obs space @@ -250,11 +302,11 @@ - filter: Bounds Check udescriptor: "bounds_check_ObsValue" filter variables: - - name: airTemperature + - name: air_temperature_at_2m minvalue: 100 maxvalue: 400 where: - - variable: ObsType/airTemperature + - variable: ObsType/air_temperature_at_2m is_in: 181 action: name: reduce obs space @@ -264,16 +316,16 @@ udescriptor: "create_temporary_ObsErrorData" apply at iterations: 0,1 where: - - variable: ObsType/airTemperature + - variable: ObsType/air_temperature_at_2m is_in: 181 assignments: - - name: TempObsErrorData/airTemperature + - name: TempObsErrorData/air_temperature_at_2m type: float function: name: ObsFunction/Arithmetic options: variables: - - name: ObsErrorData/airTemperature + - name: ObsErrorData/air_temperature_at_2m defer to post: true # Set ObsError set "error parameter" if < "max value" @@ -281,18 +333,18 @@ udescriptor: "ermin_set" apply at iterations: 0,1 filter variables: - - name: airTemperature + - name: air_temperature_at_2m action: name: assign error error parameter: 1.0 where: - variable: - name: ObsErrorData/airTemperature + name: ObsErrorData/air_temperature_at_2m maxvalue: 1.0 - variable: - name: ObsErrorData/airTemperature + name: ObsErrorData/air_temperature_at_2m value: is_valid - - variable: ObsType/airTemperature + - variable: ObsType/air_temperature_at_2m is_in: 181 defer to post: true @@ -301,18 +353,18 @@ udescriptor: "ermax_set" apply at iterations: 0,1 filter variables: - - name: airTemperature + - name: air_temperature_at_2m action: name: assign error error parameter: 3.0 where: - variable: - name: ObsErrorData/airTemperature + name: ObsErrorData/air_temperature_at_2m minvalue: 3.0 - variable: - name: ObsErrorData/airTemperature + name: ObsErrorData/air_temperature_at_2m value: is_valid - - variable: ObsType/airTemperature + - variable: ObsType/air_temperature_at_2m is_in: 181 defer to post: true @@ -321,14 +373,14 @@ udescriptor: "gross_error_check" apply at iterations: 0,1 filter variables: - - name: airTemperature + - name: air_temperature_at_2m threshold: 5.0 action: name: reject where: - - variable: QualityMarker/airTemperature + - variable: QualityMarker/air_temperature_at_2m is_not_in: 3 - - variable: ObsType/airTemperature + - variable: ObsType/air_temperature_at_2m is_in: 181 defer to post: true @@ -337,14 +389,14 @@ udescriptor: "gross_error_check_0.7" apply at iterations: 0,1 filter variables: - - name: airTemperature + - name: air_temperature_at_2m threshold: 3.5 action: name: reject where: - - variable: QualityMarker/airTemperature + - variable: QualityMarker/air_temperature_at_2m is_in: 3 - - variable: ObsType/airTemperature + - variable: ObsType/air_temperature_at_2m is_in: 181 defer to post: true @@ -353,15 +405,15 @@ udescriptor: "reassign_error_TempObsErrorData" apply at iterations: 0,1 filter variables: - - name: airTemperature + - name: air_temperature_at_2m action: name: assign error - error function: TempObsErrorData/airTemperature + error function: TempObsErrorData/air_temperature_at_2m where: - variable: - name: TempObsErrorData/airTemperature + name: TempObsErrorData/air_temperature_at_2m value: is_valid - - variable: ObsType/airTemperature + - variable: ObsType/air_temperature_at_2m is_in: 181 defer to post: true diff --git a/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_181_gsi.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_181_gsi.yaml.j2 new file mode 100644 index 000000000..005176ecf --- /dev/null +++ b/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_181_gsi.yaml.j2 @@ -0,0 +1,421 @@ +- + # Observation Space (I/O) + # ----------------------- + + obs space: + name: {{observation_from_jcb}} +{% if algorithm == "local_ensemble_da" %} + distribution: + name: {{distribution_type}} + halo size: "{{halo_size}}" +{% endif %} + obsdatain: + engine: + type: H5File + obsfile: "{{soil_obsdatain_path}}/{{soil_obsdatain_prefix}}{{observation_from_jcb}}{{atmosphere_obsdatain_suffix}}" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + obsdataout: + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: "{{soil_obsdataout_path}}/{{soil_obsdataout_prefix}}{{observation_from_jcb}}{{soil_obsdataout_suffix}}" + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [air_temperature_at_2m] +#airTemperature] +# derived variables: [air_temperature_at_2m] + simulated variables: [air_temperature_at_2m] + + obs operator: + name: Identity + + # localization TODO: generalize this condioned on da algo + # ------------ +{% if algorithm == "local_ensemble_da" %} + obs localizations: + - localization method: {{localization_method}} + lengthscale: {{loc_length_scale}} + max nobs: {{max_nobs}} +{% endif %} + + obs error: + covariance model: diagonal + +# obs pre filters: +# - filter: Variable Assignment +# assignments: +# - name: DerivedObsValue/air_temperature_at_2m +# type: float +# function: +# name: ObsFunction/Arithmetic +# options: +# variables: [ObsValue/air_temperature_at_2m] +# total exponent: 1. + + obs filters: +# # ------------------ +# # air_temperature_at_2m (181) +# # ------------------ +# # Accept, reject, or passivate (monitor) +# - filter: Perform Action +# udescriptor: "iuse_check" +# filter variables: +# - name: air_temperature_at_2m +# where: +# - variable: ObsType/air_temperature_at_2m +# is_in: 181 +# action: +# name: {{iuse_adpsfc_air_temperature_at_2m_181 | default("passivate", true)}} # accept, reject, passivate +# + # Reject all obs not in type + - filter: Perform Action + udescriptor: "obs_type_check" + where: + - variable: ObsValue/air_temperature_at_2m + value: is_not_valid + action: + name: reduce obs space + + # Reject all obs not in kx + - filter: Perform Action + udescriptor: "obs_kx_check" + where: + - variable: ObsType/air_temperature_at_2m + is_not_in: 181 + action: + name: reduce obs space + + # Reject all obs with QualityMarker > 3 + - filter: RejectList + udescriptor: "quality_marker_check" + filter variables: + - name: air_temperature_at_2m + where: + - variable: QualityMarker/air_temperature_at_2m + is_in: 4-15 + value: is_not_valid + where operator: or + action: + name: reduce obs space + + # Time window filter + - filter: Bounds Check + udescriptor: "time_window_check" + filter variables: + - name: air_temperature_at_2m + test variables: + - name: MetaData/timeOffset #s + minvalue: -10800 #-900 + maxvalue: 10800 #900 + where: + - variable: ObsType/air_temperature_at_2m + is_in: 181 + action: + name: reduce obs space + +# # Duplicate Check +# - filter: Temporal Thinning +# udescriptor: "duplicate_check" +# filter variables: +# - name: air_temperature_at_2m +## min_spacing: PT90M +# min_spacing: '{{ window_length }}' +# tolerance: PT0H +# seed_time: "{{soil_background_time_iso}}" +# category_variable: +# name: MetaData/stationIdentification +##MetaData/longitude_latitude_pressure +# where: +# - variable: ObsType/air_temperature_at_2m +# is_in: 181 +# action: +# name: reduce obs space + +## # Online regional domain check +## - filter: Bounds Check +## udescriptor: "online_domain_check" +## filter variables: +## - name: air_temperature_at_2m +## test variables: +## - name: GeoVaLs/observable_domain_mask +## minvalue: 0.0 +## maxvalue: 0.5 + - filter: Domain Check # land only + where: + - variable: + name: GeoVaLs/fraction_of_land + minvalue: 0.5 + actions: +# - name: set +# flag: land_check +# ignore: rejected observations + - name: reject + - filter: Domain Check # land only, no sea ice + where: + - variable: + name: GeoVaLs/fraction_of_ice + maxvalue: 0.0 + actions: +# - name: set +# flag: seaice_check +# ignore: rejected observations + - name: reject + - filter: Domain Check # no snow + where: + - variable: + name: GeoVaLs/sheleg + maxvalue: 0.0 + actions: +# - name: set +# flag: snow_check +# ignore: rejected observations + - name: reject + - filter: RejectList # no land-ice + where: + - variable: + name: GeoVaLs/vtype + minvalue: 14.5 + maxvalue: 15.5 + actions: +# - name: set +# flag: landice_check +# ignore: rejected observations + - name: reject + - filter: RejectList # exclude certain IGBP vegetation types + where: + - variable: + name: GeoVaLs/vtype + absolute_tolerance: 1.0e-3 + is_close_to_any_of: [1, 2, 3, 4, 13, 15, 17] + actions: +# - name: set +# flag: vegtype_check +# ignore: rejected observations + - name: reject + + # Initial error assignment + - filter: Perform Action + udescriptor: "initial_error_assignment" + filter variables: + - name: air_temperature_at_2m + where: + - variable: ObsType/air_temperature_at_2m + is_in: 181 + 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] + errors: [1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056] + +# # Reduce observation error and turn off ObsErrorFactorPressureCheck (l_gsd_terrain_match_surfTobs=.true., l_sfcobserror_ramp_t=.true.,) +# - filter: Perform Action +# filter variables: +# - name: air_temperature_at_2m +# action: +# name: inflate error +# inflation factor: 0.5 +# +# # Error inflation based on pressure check (setupt.f90) ##>>requires non-sfc geov +# - filter: Perform Action +# udescriptor: "error_inflation_pressure_check" +# filter variables: +# - name: air_temperature_at_2m +# where: +# - variable: ObsType/air_temperature_at_2m +# is_in: 181 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorPressureCheck +# options: +# variable: air_temperature_at_2m +# surface observation error ramp: true +# max levels below surface: 15 +# inflation factor: 8.0 +# +## # Error inflation based on errormod (qcmod.f90) +## - filter: Perform Action +## filter variables: +## - name: air_temperature_at_2m +## where: +## - variable: ObsType/air_temperature_at_2m +## is_in: 181 +## action: +## name: inflate error +## inflation variable: +## name: ObsFunction/ObsErrorFactorConventional +## options: +## inflate variables: [air_temperature_at_2m] +## pressure: MetaData/pressure + + # Error inflation when QualityMarker == 3 (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_QualityMarker" + filter variables: + - name: air_temperature_at_2m + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: QualityMarker/air_temperature_at_2m + is_in: 3 + - variable: ObsType/air_temperature_at_2m + is_in: 181 + + # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) + - filter: Perform Action + udescriptor: "error_inflation_observation_pressure" + filter variables: + - name: air_temperature_at_2m + action: + name: inflate error + inflation factor: 1.2 + where: + - variable: MetaData/pressure + maxvalue: 10000.0 + - variable: ObsType/air_temperature_at_2m + is_in: 181 + + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: air_temperature_at_2m + test variables: + - name: ObsErrorData/air_temperature_at_2m + minvalue: 0.0 + maxvalue: 1000 + where: + - variable: ObsType/air_temperature_at_2m + is_in: 181 + action: + name: reduce obs space + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: air_temperature_at_2m + minvalue: 100 + maxvalue: 400 + where: + - variable: ObsType/air_temperature_at_2m + is_in: 181 + action: + name: reduce obs space + + # Create temporary ObsErrorData + - filter: Variable Assignment + udescriptor: "create_temporary_ObsErrorData" + apply at iterations: 0,1 + where: + - variable: ObsType/air_temperature_at_2m + is_in: 181 + assignments: + - name: TempObsErrorData/air_temperature_at_2m + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsErrorData/air_temperature_at_2m + defer to post: true + + # Set ObsError set "error parameter" if < "max value" + - filter: Perform Action + udescriptor: "ermin_set" + apply at iterations: 0,1 + filter variables: + - name: air_temperature_at_2m + action: + name: assign error + error parameter: 1.0 + where: + - variable: + name: ObsErrorData/air_temperature_at_2m + maxvalue: 1.0 + - variable: + name: ObsErrorData/air_temperature_at_2m + value: is_valid + - variable: ObsType/air_temperature_at_2m + is_in: 181 + defer to post: true + + # Set ObsError set "error parameter" if > "min value" + - filter: Perform Action + udescriptor: "ermax_set" + apply at iterations: 0,1 + filter variables: + - name: air_temperature_at_2m + action: + name: assign error + error parameter: 3.0 + where: + - variable: + name: ObsErrorData/air_temperature_at_2m + minvalue: 3.0 + - variable: + name: ObsErrorData/air_temperature_at_2m + value: is_valid + - variable: ObsType/air_temperature_at_2m + is_in: 181 + defer to post: true + + # Gross Error Check + - filter: Background Check + udescriptor: "gross_error_check" + apply at iterations: 0,1 + filter variables: + - name: air_temperature_at_2m + threshold: 5.0 + action: + name: reject + where: + - variable: QualityMarker/air_temperature_at_2m + is_not_in: 3 + - variable: ObsType/air_temperature_at_2m + is_in: 181 + defer to post: true + + # Gross Error Check: cgross*0.7 if QualityMarker=3 + - filter: Background Check + udescriptor: "gross_error_check_0.7" + apply at iterations: 0,1 + filter variables: + - name: air_temperature_at_2m + threshold: 3.5 + action: + name: reject + where: + - variable: QualityMarker/air_temperature_at_2m + is_in: 3 + - variable: ObsType/air_temperature_at_2m + is_in: 181 + defer to post: true + + # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. + - filter: Perform Action + udescriptor: "reassign_error_TempObsErrorData" + apply at iterations: 0,1 + filter variables: + - name: air_temperature_at_2m + action: + name: assign error + error function: TempObsErrorData/air_temperature_at_2m + where: + - variable: + name: TempObsErrorData/air_temperature_at_2m + value: is_valid + - variable: ObsType/air_temperature_at_2m + is_in: 181 + defer to post: true + + #- filter: GOMsaver + # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/adpsfc_air_temperature_at_2m_181_gsi.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_air_temperature_at_2m_181_gsi.yaml.j2 new file mode 100644 index 000000000..4a25d20b8 --- /dev/null +++ b/parm/jcb-gdas/observations/soil/adpsfc_air_temperature_at_2m_181_gsi.yaml.j2 @@ -0,0 +1,448 @@ +- + # Observation Space (I/O) + # ----------------------- + + obs space: + name: {{observation_from_jcb}} +{% if algorithm == "local_ensemble_da" %} + distribution: + name: {{distribution_type}} + halo size: "{{halo_size}}" +{% endif %} + obsdatain: + engine: + type: H5File + obsfile: "{{soil_obsdatain_path}}/{{soil_obsdatain_prefix}}{{observation_from_jcb}}{{atmosphere_obsdatain_suffix}}" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + obsdataout: + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: "{{soil_obsdataout_path}}/{{soil_obsdataout_prefix}}{{observation_from_jcb}}{{soil_obsdataout_suffix}}" + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [air_temperature_at_2m] +#airTemperature] +# derived variables: [air_temperature_at_2m] + simulated variables: [air_temperature_at_2m] + + obs operator: + name: Identity + + # localization TODO: generalize this condioned on da algo + # ------------ +{% if algorithm == "local_ensemble_da" %} + obs localizations: + - localization method: {{localization_method}} + lengthscale: {{loc_length_scale}} + max nobs: {{max_nobs}} +{% endif %} + + obs error: + covariance model: diagonal + +# obs pre filters: +# - filter: Variable Assignment +# assignments: +# - name: DerivedObsValue/air_temperature_at_2m +# type: float +# function: +# name: ObsFunction/Arithmetic +# options: +# variables: [ObsValue/air_temperature_at_2m] +# total exponent: 1. + +# obs filters: +# - filter: Variable Assignment +# assignments: +# - name: DerivedObsValue/air_temperature_at_2m +# type: float +# source variable: +# name: ObsValue/airTemperature + + + obs filters: +# # ------------------ +# # air_temperature_at_2m (181) +# # ------------------ +# # Accept, reject, or passivate (monitor) +# - filter: Perform Action +# udescriptor: "iuse_check" +# filter variables: +# - name: air_temperature_at_2m +# where: +# - variable: ObsType/air_temperature_at_2m +# is_in: 181 +# action: +# name: {{iuse_adpsfc_air_temperature_at_2m_181 | default("passivate", true)}} # accept, reject, passivate +# + - filter: PreQC + inputQC: 'GsiEffectiveQCGes' +#GsiEffectiveQCAnl' + maxvalue: 0.0 + action: + name: reject +#************ +#* +#* +#* # Reject all obs not in type +#* - filter: Perform Action +#* udescriptor: "obs_type_check" +#* where: +#* - variable: ObsValue/air_temperature_at_2m +#* value: is_not_valid +#* action: +#* name: reduce obs space +#* +#* # Reject all obs not in kx +#* - filter: Perform Action +#* udescriptor: "obs_kx_check" +#* where: +#* - variable: ObsType/air_temperature_at_2m +#* is_not_in: 181 +#* action: +#* name: reduce obs space +#* +#* # Reject all obs with QualityMarker > 3 +#* - filter: RejectList +#* udescriptor: "quality_marker_check" +#* filter variables: +#* - name: air_temperature_at_2m +#* where: +#* - variable: QualityMarker/air_temperature_at_2m +#* is_in: 4-15 +#* value: is_not_valid +#* where operator: or +#* action: +#* name: reduce obs space +#* +#* # Time window filter +#* - filter: Bounds Check +#* udescriptor: "time_window_check" +#* filter variables: +#* - name: air_temperature_at_2m +#* test variables: +#* - name: MetaData/timeOffset #s +#* minvalue: -10800 #-900 +#* maxvalue: 10800 #900 +#* where: +#* - variable: ObsType/air_temperature_at_2m +#* is_in: 181 +#* action: +#* name: reduce obs space +#* +#*# # Duplicate Check +#*# - filter: Temporal Thinning +#*# udescriptor: "duplicate_check" +#*# filter variables: +#*# - name: air_temperature_at_2m +#*## min_spacing: PT90M +#*# min_spacing: '{{ window_length }}' +#*# tolerance: PT0H +#*# seed_time: "{{soil_background_time_iso}}" +#*# category_variable: +#*# name: MetaData/stationIdentification +#*##MetaData/longitude_latitude_pressure +#*# where: +#*# - variable: ObsType/air_temperature_at_2m +#*# is_in: 181 +#*# action: +#*# name: reduce obs space +#* +#*## # Online regional domain check +#*## - filter: Bounds Check +#*## udescriptor: "online_domain_check" +#*## filter variables: +#*## - name: air_temperature_at_2m +#*## test variables: +#*## - name: GeoVaLs/observable_domain_mask +#*## minvalue: 0.0 +#*## maxvalue: 0.5 +#* - filter: Domain Check # land only +#* where: +#* - variable: +#* name: GeoVaLs/fraction_of_land +#* minvalue: 0.5 +#* actions: +#*# - name: set +#*# flag: land_check +#*# ignore: rejected observations +#* - name: reject +#* - filter: Domain Check # land only, no sea ice +#* where: +#* - variable: +#* name: GeoVaLs/fraction_of_ice +#* maxvalue: 0.0 +#* actions: +#*# - name: set +#*# flag: seaice_check +#*# ignore: rejected observations +#* - name: reject +#* - filter: Domain Check # no snow +#* where: +#* - variable: +#* name: GeoVaLs/sheleg +#* maxvalue: 0.0 +#* actions: +#*# - name: set +#*# flag: snow_check +#*# ignore: rejected observations +#* - name: reject +#* - filter: RejectList # no land-ice +#* where: +#* - variable: +#* name: GeoVaLs/vtype +#* minvalue: 14.5 +#* maxvalue: 15.5 +#* actions: +#*# - name: set +#*# flag: landice_check +#*# ignore: rejected observations +#* - name: reject +#* - filter: RejectList # exclude certain IGBP vegetation types +#* where: +#* - variable: +#* name: GeoVaLs/vtype +#* absolute_tolerance: 1.0e-3 +#* is_close_to_any_of: [1, 2, 3, 4, 13, 15, 17] +#* actions: +#*# - name: set +#*# flag: vegtype_check +#*# ignore: rejected observations +#* - name: reject + + # Initial error assignment + - filter: Perform Action + udescriptor: "initial_error_assignment" + filter variables: + - name: air_temperature_at_2m + where: + - variable: ObsTypeGes/air_temperature_at_2m + is_in: 181 + action: + name: assign error +# error parameter: 2.0 + error function: +#---this might be better name: GsiFinalObsErrorGes/air_temperature_at_2m + name: ObsFunction/Arithmetic + options: + variables: [GsiFinalObsErrorGes/air_temperature_at_2m] +#GsiFinalObsErrorAnl/air_temperature_at_2m] +# total exponent: 1. + +#* 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] +#* errors: [1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056] + +# # Reduce observation error and turn off ObsErrorFactorPressureCheck (l_gsd_terrain_match_surfTobs=.true., l_sfcobserror_ramp_t=.true.,) +# - filter: Perform Action +# filter variables: +# - name: air_temperature_at_2m +# action: +# name: inflate error +# inflation factor: 0.5 +# +# # Error inflation based on pressure check (setupt.f90) ##>>requires non-sfc geov +# - filter: Perform Action +# udescriptor: "error_inflation_pressure_check" +# filter variables: +# - name: air_temperature_at_2m +# where: +# - variable: ObsType/air_temperature_at_2m +# is_in: 181 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorPressureCheck +# options: +# variable: air_temperature_at_2m +# surface observation error ramp: true +# max levels below surface: 15 +# inflation factor: 8.0 +# +## # Error inflation based on errormod (qcmod.f90) +## - filter: Perform Action +## filter variables: +## - name: air_temperature_at_2m +## where: +## - variable: ObsType/air_temperature_at_2m +## is_in: 181 +## action: +## name: inflate error +## inflation variable: +## name: ObsFunction/ObsErrorFactorConventional +## options: +## inflate variables: [air_temperature_at_2m] +## pressure: MetaData/pressure +#* +#* # Error inflation when QualityMarker == 3 (read_prepbufr.f90) +#* - filter: Perform Action +#* udescriptor: "error_inflation_QualityMarker" +#* filter variables: +#* - name: air_temperature_at_2m +#* action: +#* name: inflate error +#* inflation factor: 1.2 +#* where: +#* - variable: QualityMarker/air_temperature_at_2m +#* is_in: 3 +#* - variable: ObsType/air_temperature_at_2m +#* is_in: 181 +#* +#* # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) +#* - filter: Perform Action +#* udescriptor: "error_inflation_observation_pressure" +#* filter variables: +#* - name: air_temperature_at_2m +#* action: +#* name: inflate error +#* inflation factor: 1.2 +#* where: +#* - variable: MetaData/pressure +#* maxvalue: 10000.0 +#* - variable: ObsType/air_temperature_at_2m +#* is_in: 181 +#* +#* # Bounds Check (ObsError) +#* - filter: Bounds Check +#* udescriptor: "bounds_check_ObsError" +#* filter variables: +#* - name: air_temperature_at_2m +#* test variables: +#* - name: ObsErrorData/air_temperature_at_2m +#* minvalue: 0.0 +#* maxvalue: 1000 +#* where: +#* - variable: ObsType/air_temperature_at_2m +#* is_in: 181 +#* action: +#* name: reduce obs space +#* +#* # Bounds Check (ObsValue) +#* - filter: Bounds Check +#* udescriptor: "bounds_check_ObsValue" +#* filter variables: +#* - name: air_temperature_at_2m +#* minvalue: 100 +#* maxvalue: 400 +#* where: +#* - variable: ObsType/air_temperature_at_2m +#* is_in: 181 +#* action: +#* name: reduce obs space +#* +#* # Create temporary ObsErrorData +#* - filter: Variable Assignment +#* udescriptor: "create_temporary_ObsErrorData" +#* apply at iterations: 0,1 +#* where: +#* - variable: ObsType/air_temperature_at_2m +#* is_in: 181 +#* assignments: +#* - name: TempObsErrorData/air_temperature_at_2m +#* type: float +#* function: +#* name: ObsFunction/Arithmetic +#* options: +#* variables: +#* - name: ObsErrorData/air_temperature_at_2m +#* defer to post: true +#* +#* # Set ObsError set "error parameter" if < "max value" +#* - filter: Perform Action +#* udescriptor: "ermin_set" +#* apply at iterations: 0,1 +#* filter variables: +#* - name: air_temperature_at_2m +#* action: +#* name: assign error +#* error parameter: 1.0 +#* where: +#* - variable: +#* name: ObsErrorData/air_temperature_at_2m +#* maxvalue: 1.0 +#* - variable: +#* name: ObsErrorData/air_temperature_at_2m +#* value: is_valid +#* - variable: ObsType/air_temperature_at_2m +#* is_in: 181 +#* defer to post: true +#* +#* # Set ObsError set "error parameter" if > "min value" +#* - filter: Perform Action +#* udescriptor: "ermax_set" +#* apply at iterations: 0,1 +#* filter variables: +#* - name: air_temperature_at_2m +#* action: +#* name: assign error +#* error parameter: 3.0 +#* where: +#* - variable: +#* name: ObsErrorData/air_temperature_at_2m +#* minvalue: 3.0 +#* - variable: +#* name: ObsErrorData/air_temperature_at_2m +#* value: is_valid +#* - variable: ObsType/air_temperature_at_2m +#* is_in: 181 +#* defer to post: true +#* +#* # Gross Error Check +#* - filter: Background Check +#* udescriptor: "gross_error_check" +#* apply at iterations: 0,1 +#* filter variables: +#* - name: air_temperature_at_2m +#* threshold: 5.0 +#* action: +#* name: reject +#* where: +#* - variable: QualityMarker/air_temperature_at_2m +#* is_not_in: 3 +#* - variable: ObsType/air_temperature_at_2m +#* is_in: 181 +#* defer to post: true +#* +#* # Gross Error Check: cgross*0.7 if QualityMarker=3 +#* - filter: Background Check +#* udescriptor: "gross_error_check_0.7" +#* apply at iterations: 0,1 +#* filter variables: +#* - name: air_temperature_at_2m +#* threshold: 3.5 +#* action: +#* name: reject +#* where: +#* - variable: QualityMarker/air_temperature_at_2m +#* is_in: 3 +#* - variable: ObsType/air_temperature_at_2m +#* is_in: 181 +#* defer to post: true +#* +#* # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. +#* - filter: Perform Action +#* udescriptor: "reassign_error_TempObsErrorData" +#* apply at iterations: 0,1 +#* filter variables: +#* - name: air_temperature_at_2m +#* action: +#* name: assign error +#* error function: TempObsErrorData/air_temperature_at_2m +#* where: +#* - variable: +#* name: TempObsErrorData/air_temperature_at_2m +#* value: is_valid +#* - variable: ObsType/air_temperature_at_2m +#* is_in: 181 +#* defer to post: true +#* +#* #- filter: GOMsaver +#* # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/bk_adpsfc_airTemperature_181.yaml.j2 b/parm/jcb-gdas/observations/soil/bk_adpsfc_airTemperature_181.yaml.j2 new file mode 100644 index 000000000..35050fbbd --- /dev/null +++ b/parm/jcb-gdas/observations/soil/bk_adpsfc_airTemperature_181.yaml.j2 @@ -0,0 +1,370 @@ +- + # Observation Space (I/O) + # ----------------------- + + obs space: + name: {{observation_from_jcb}} +{% if algorithm == "local_ensemble_da" %} + distribution: + name: {{distribution_type}} + halo size: "{{halo_size}}" +{% endif %} + obsdatain: + engine: + type: H5File + obsfile: "{{soil_obsdatain_path}}/{{soil_obsdatain_prefix}}{{observation_from_jcb}}.nc" + missing file action: "warn" + obsgrouping: + group variables: ["stationIdentification"] + obsdataout: + write multiple files: {{write_multiple_files | default(false) }} + engine: + type: H5File + obsfile: "{{soil_obsdataout_path}}/{{soil_obsdataout_prefix}}{{observation_from_jcb}}{{soil_obsdataout_suffix}}" + allow overwrite: true + io pool: + max pool size: {{ max_pool_size | default(1) }} + observed variables: [air_temperature_at_2m] +#airTemperature] +# simulated variables: [airTemperature] +# derived variables: [air_temperature_at_2m] + simulated variables: [air_temperature_at_2m] + + obs operator: + name: Identity + + # localization TODO: generalize this condioned on da algo + # ------------ +{% if algorithm == "local_ensemble_da" %} + obs localizations: + - localization method: {{localization_method}} + lengthscale: {{loc_length_scale}} + max nobs: {{max_nobs}} +{% endif %} + + obs error: + covariance model: diagonal + +# obs pre filters: +# - filter: Variable Assignment +# assignments: +# - name: DerivedObsValue/air_temperature_at_2m +# type: float +# function: +# name: ObsFunction/Arithmetic +# options: +# variables: [ObsValue/airTemperature] +# total exponent: 1. + +# obs filters: +# # ------------------ +# # airTemperature (181) +# # ------------------ +# # Accept, reject, or passivate (monitor) +# - filter: Perform Action +# udescriptor: "iuse_check" +# filter variables: +# - name: airTemperature +# where: +# - variable: ObsType/airTemperature +# is_in: 181 +# action: +# name: {{iuse_adpsfc_airTemperature_181 | default("passivate", true)}} # accept, reject, passivate +# +# # Reject all obs not in type +# - filter: Perform Action +# udescriptor: "obs_type_check" +# where: +# - variable: ObsValue/airTemperature +# value: is_not_valid +# action: +# name: reduce obs space +# +# # Reject all obs not in kx +# - filter: Perform Action +# udescriptor: "obs_kx_check" +# where: +# - variable: ObsType/airTemperature +# is_not_in: 181 +# action: +# name: reduce obs space +# +# # Reject all obs with QualityMarker > 3 +# - filter: RejectList +# udescriptor: "quality_marker_check" +# filter variables: +# - name: airTemperature +# where: +# - variable: QualityMarker/airTemperature +# is_in: 4-15 +# value: is_not_valid +# where operator: or +# action: +# name: reduce obs space +# +# # Time window filter +# - filter: Bounds Check +# udescriptor: "time_window_check" +# filter variables: +# - name: airTemperature +# test variables: +# - name: MetaData/timeOffset +# minvalue: -900 +# maxvalue: 900 +# where: +# - variable: ObsType/airTemperature +# is_in: 181 +# action: +# name: reduce obs space +# +# # Duplicate Check +# - filter: Temporal Thinning +# udescriptor: "duplicate_check" +# filter variables: +# - name: airTemperature +# min_spacing: PT90M +## min_spacing: '{{ window_length }}' +# tolerance: PT0H +# seed_time: "{{soil_background_time_iso}}" +# category_variable: +# name: MetaData/stationIdentification +##MetaData/longitude_latitude_pressure +# where: +# - variable: ObsType/airTemperature +# is_in: 181 +# action: +# name: reduce obs space +# +## # Online regional domain check +## - filter: Bounds Check +## udescriptor: "online_domain_check" +## filter variables: +## - name: airTemperature +## test variables: +## - name: GeoVaLs/observable_domain_mask +## minvalue: 0.0 +## maxvalue: 0.5 +# +# # Initial error assignment +# - filter: Perform Action +# udescriptor: "initial_error_assignment" +# filter variables: +# - name: airTemperature +# where: +# - variable: ObsType/airTemperature +# is_in: 181 +# 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] +# errors: [1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056] +# +## # Reduce observation error and turn off ObsErrorFactorPressureCheck (l_gsd_terrain_match_surfTobs=.true., l_sfcobserror_ramp_t=.true.,) +## - filter: Perform Action +## filter variables: +## - name: airTemperature +## action: +## name: inflate error +## inflation factor: 0.5 +# +# # Error inflation based on pressure check (setupt.f90) +# - filter: Perform Action +# udescriptor: "error_inflation_pressure_check" +# filter variables: +# - name: airTemperature +# where: +# - variable: ObsType/airTemperature +# is_in: 181 +# action: +# name: inflate error +# inflation variable: +# name: ObsFunction/ObsErrorFactorPressureCheck +# options: +# variable: airTemperature +# surface observation error ramp: true +# max levels below surface: 15 +# inflation factor: 8.0 +# +## # Error inflation based on errormod (qcmod.f90) +## - filter: Perform Action +## filter variables: +## - name: airTemperature +## where: +## - variable: ObsType/airTemperature +## is_in: 181 +## action: +## name: inflate error +## inflation variable: +## name: ObsFunction/ObsErrorFactorConventional +## options: +## inflate variables: [airTemperature] +## pressure: MetaData/pressure +# +# # Error inflation when QualityMarker == 3 (read_prepbufr.f90) +# - filter: Perform Action +# udescriptor: "error_inflation_QualityMarker" +# filter variables: +# - name: airTemperature +# action: +# name: inflate error +# inflation factor: 1.2 +# where: +# - variable: QualityMarker/airTemperature +# is_in: 3 +# - variable: ObsType/airTemperature +# is_in: 181 +# +# # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) +# - filter: Perform Action +# udescriptor: "error_inflation_observation_pressure" +# filter variables: +# - name: airTemperature +# action: +# name: inflate error +# inflation factor: 1.2 +# where: +# - variable: MetaData/pressure +# maxvalue: 10000.0 +# - variable: ObsType/airTemperature +# is_in: 181 +# +# # Bounds Check (ObsError) +# - filter: Bounds Check +# udescriptor: "bounds_check_ObsError" +# filter variables: +# - name: airTemperature +# test variables: +# - name: ObsErrorData/airTemperature +# minvalue: 0.0 +# maxvalue: 1000 +# where: +# - variable: ObsType/airTemperature +# is_in: 181 +# action: +# name: reduce obs space +# +# # Bounds Check (ObsValue) +# - filter: Bounds Check +# udescriptor: "bounds_check_ObsValue" +# filter variables: +# - name: airTemperature +# minvalue: 100 +# maxvalue: 400 +# where: +# - variable: ObsType/airTemperature +# is_in: 181 +# action: +# name: reduce obs space +# +# # Create temporary ObsErrorData +# - filter: Variable Assignment +# udescriptor: "create_temporary_ObsErrorData" +# apply at iterations: 0,1 +# where: +# - variable: ObsType/airTemperature +# is_in: 181 +# assignments: +# - name: TempObsErrorData/airTemperature +# type: float +# function: +# name: ObsFunction/Arithmetic +# options: +# variables: +# - name: ObsErrorData/airTemperature +# defer to post: true +# +# # Set ObsError set "error parameter" if < "max value" +# - filter: Perform Action +# udescriptor: "ermin_set" +# apply at iterations: 0,1 +# filter variables: +# - name: airTemperature +# action: +# name: assign error +# error parameter: 1.0 +# where: +# - variable: +# name: ObsErrorData/airTemperature +# maxvalue: 1.0 +# - variable: +# name: ObsErrorData/airTemperature +# value: is_valid +# - variable: ObsType/airTemperature +# is_in: 181 +# defer to post: true +# +# # Set ObsError set "error parameter" if > "min value" +# - filter: Perform Action +# udescriptor: "ermax_set" +# apply at iterations: 0,1 +# filter variables: +# - name: airTemperature +# action: +# name: assign error +# error parameter: 3.0 +# where: +# - variable: +# name: ObsErrorData/airTemperature +# minvalue: 3.0 +# - variable: +# name: ObsErrorData/airTemperature +# value: is_valid +# - variable: ObsType/airTemperature +# is_in: 181 +# defer to post: true +# +# # Gross Error Check +# - filter: Background Check +# udescriptor: "gross_error_check" +# apply at iterations: 0,1 +# filter variables: +# - name: airTemperature +# threshold: 5.0 +# action: +# name: reject +# where: +# - variable: QualityMarker/airTemperature +# is_not_in: 3 +# - variable: ObsType/airTemperature +# is_in: 181 +# defer to post: true +# +# # Gross Error Check: cgross*0.7 if QualityMarker=3 +# - filter: Background Check +# udescriptor: "gross_error_check_0.7" +# apply at iterations: 0,1 +# filter variables: +# - name: airTemperature +# threshold: 3.5 +# action: +# name: reject +# where: +# - variable: QualityMarker/airTemperature +# is_in: 3 +# - variable: ObsType/airTemperature +# is_in: 181 +# defer to post: true +# +# # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. +# - filter: Perform Action +# udescriptor: "reassign_error_TempObsErrorData" +# apply at iterations: 0,1 +# filter variables: +# - name: airTemperature +# action: +# name: assign error +# error function: TempObsErrorData/airTemperature +# where: +# - variable: +# name: TempObsErrorData/airTemperature +# value: is_valid +# - variable: ObsType/airTemperature +# is_in: 181 +# defer to post: true +# +# #- filter: GOMsaver +# # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/soil/jcb-base.yaml.j2 b/parm/soil/jcb-base.yaml.j2 index ecc60b5ac..67ae81153 100644 --- a/parm/soil/jcb-base.yaml.j2 +++ b/parm/soil/jcb-base.yaml.j2 @@ -14,7 +14,7 @@ final_increment_file: soil_final_increment_fms output_mean_prior_file: soil_output_mean_prior_fms posterior_output_file: soil_posterior_output_fms output_ensemble_increments_file: soil_ensemble_increments_fms -output_increment_file: soil_output_increment_fms #snow_ensemblemean_increment_fms.yaml.j2 +output_increment_file: soil_output_increment_fms output_variance_prior_file: soil_output_variance_prior_fms output_variance_posterior_file: soil_output_variance_posterior_fms #jedi_increment_output: gaussian @@ -79,19 +79,35 @@ soil_forecast_timestep: "{{ BKG_TSTEP }}" # ------------------ observations: all_observations +#From Cory: https://docs.google.com/document/d/1CNfOZ7UzAOrVEXNyxeHAKafjjZp7WeBn-F07itWo6eE/ +#replace QC filters with a blanket configuration...to get listed obs' QC decisions from GSI: +#*replace_obs_filters: +#* observations: +#* - adpsfc_air_temperature_at_2m_181_gsi +#*# - sfcship #Clara: no need for this to assimiate into soil +#* override_filters: #only assimilate when GsiEffectiveQCAnl is 0 +#* - filter: PreQC +#* inputQC: 'GsiEffectiveQCAnl' +#* maxvalue: 0.0 +#* action: +#* name: reject + crtm_coefficient_path: "{{ DATA }}/crtm/" # Naming conventions for observational files soil_obsdataroot_path: "{{COMIN_OBS}}" soil_obsdatain_path: "{{DATA}}/obs" soil_obsdatain_prefix: "{{OPREFIX}}" -soil_obsdatain_suffix: "" #.tm00.bufr_d" +soil_obsdatain_suffix: ".nc" +soil_obsdatain_suffix_bufr: ".tm00.bufr_d" soil_obsdataout_path: "{{DATA}}/diags" soil_prepobs_path: "{{DATA}}/prep" soil_obsdataout_prefix: diag_ soil_obsdataout_suffix: "_{{ current_cycle | to_YMDH }}.nc" # Naming conventions for bias correction files +# note these are really for atm--see below//most may not be applicable for sfc-only DA +##TODO: not sure which of these are needed soil_obsbiasin_path: "{{DATA}}/obs/" soil_obsbiasin_prefix: "{{GPREFIX}}" soil_obsbiasin_suffix: ".satbias.nc" @@ -106,28 +122,68 @@ soil_obsbiasout_suffix: ".satbias.nc" soil_obsbiascovout_prefix: "{{APREFIX}}" soil_obsbiascovout_suffix: ".satbias_cov.nc" +atmosphere_obsbiasin_path: "{{DATA}}/obs/" +atmosphere_obsbiasin_prefix: "{{GPREFIX}}" +atmosphere_obsbiasin_suffix: ".satbias.nc" #GSI converters produce 1 file but JEDI produces 2 +atmosphere_obstlapsein_prefix: "{{GPREFIX}}" +atmosphere_obstlapsein_suffix: ".tlapse.txt" +atmosphere_obsbiascovin_prefix: "{{GPREFIX}}" +atmosphere_obsbiascovin_suffix: ".satbias_cov.nc" + +#####----blindly copied from atm; unlikely to apply here------------ +# Naming conventions for observational files +atmosphere_obsdatain_path: "{{DATA}}/obs" +atmosphere_obsdatain_script_path: "{{HOMEgfs}}/ush/spoc/atmosphere" +atmosphere_obsdatain_prefix: "{{OPREFIX}}" +atmosphere_obsdatain_suffix: ".nc" +atmosphere_obsdatain_suffix_bufr: ".tm00.bufr_d" + +atmosphere_obsdataout_path: "{{DATA}}/diags" +atmosphere_obsdataout_prefix: diag_ +atmosphere_obsdataout_suffix: "_{{ current_cycle | to_YMDH }}.nc" + +# Naming conventions for bias correction files + +atmosphere_obsbiasin_path: "{{DATA}}/obs/" +atmosphere_obsbiasin_prefix: "{{GPREFIX}}" +atmosphere_obsbiasin_suffix: ".satbias.nc" +atmosphere_obstlapsein_prefix: "{{GPREFIX}}" +atmosphere_obstlapsein_suffix: ".tlapse.txt" +atmosphere_obsbiascovin_prefix: "{{GPREFIX}}" +atmosphere_obsbiascovin_suffix: ".satbias_cov.nc" + +atmosphere_obsbiasout_path: "{{DATA}}/bc/" +atmosphere_obsbiasout_prefix: "{{APREFIX}}" +atmosphere_obsbiasout_suffix: ".satbias.nc" #GSI converters produce 1 file but JEDI produces 2 +atmosphere_obsbiascovout_prefix: "{{APREFIX}}" +atmosphere_obsbiascovout_suffix: ".satbias_cov.nc" + +bias_files_dict: + radiance_atms_n20: rad_varbc_params.tar + radiance_atms_npp: rad_varbc_params.tar + radiance_mtiasi_metop-a: rad_varbc_params.tar + radiance_mtiasi_metop-b: rad_varbc_params.tar + radiance_amsua_n19: rad_varbc_params.tar + radiance_ssmis_f17: rad_varbc_params.tar + radiance_ssmis_f18: rad_varbc_params.tar + radiance_cris-fsr_n20: rad_varbc_params.tar + radiance_cris-fsr_npp: rad_varbc_params.tar +####-------------------------------------------------------------- + # Ensemble mean things soil_number_ensemble_members: {{NMEM_ENS | default(1, true) }} soil_analysis_ensemble_path: ./anl/mem%mem% # Local Ensemble DA (LETKF) # ------------------------- -local_ensemble_da_solver: Deterministic GETKF - -# Observation distribution and localization -# TODO: -distribution_type: "Halo" -localization_method: "Horizontal Box car" -halo_size: 250e3 -loc_length_scale: 250e3 -max_nobs: 50 +local_ensemble_da_solver: Deterministic LETKF #GETKF increment_variables: [stc, air_temperature_at_2m] #, smc, sphum] #[ua,va,DZ,delp,t,ps,sphum,ice_wat,liq_wat,o3mr] # Veritcal localization for GETKF vl_fraction_of_retained_variance: 0.750 -vl_lengthscale: 2.1 +vl_lengthscale: 22.1 vl_lengthscale_units: logp inflation_rtps: 0.85 inflation_rtpp: 0.0 @@ -142,7 +198,7 @@ driver_save_posterior_ensemble_increments: true driver_save_prior_variance: true driver_save_posterior_variance: true driver_save_prior_mean: true #(default false) -#driver_do_test_prints: false (default true) +driver_do_test_prints: false #(default true) #default driver_do_posterior_observer: true #default driver_use_control_member: false @@ -151,3 +207,4 @@ soil_increment_path: ./anl soil_increment_ensemble_path: ./anl/mem%mem% soil_increment_prefix: "soilinc" #posterior_output_gaussian: "./mem%{member}%/soilanl." +# diff --git a/parm/soil/jcb-prototype_lgetkf.yaml.j2 b/parm/soil/jcb-prototype_lgetkf.yaml.j2 index fbcb6a462..23bee47d5 100644 --- a/parm/soil/jcb-prototype_lgetkf.yaml.j2 +++ b/parm/soil/jcb-prototype_lgetkf.yaml.j2 @@ -19,10 +19,11 @@ algorithm: local_ensemble_da # Observation distribution and localization # TODO: distribution_type: "Halo" -localization_method: "Horizontal Box car" -halo_size: 250e3 -loc_length_scale: 250e3 -max_nobs: 50 +localization_method: "Horizontal Gaspari-Cohn" +#"Horizontal Box car" +halo_size: 1250e3 +loc_length_scale: 1250e3 +max_nobs: 5000 # Testing things # -------------- diff --git a/parm/soil/soil_letkf_config.yaml.j2 b/parm/soil/soil_letkf_config.yaml.j2 index f1ef2b4f6..a59d3314e 100644 --- a/parm/soil/soil_letkf_config.yaml.j2 +++ b/parm/soil/soil_letkf_config.yaml.j2 @@ -13,7 +13,9 @@ jedi_config: exe_src: '{{ EXECgdas }}/fv3jedi_addincrement.x' mpi_cmd: '{{ APRUN_SOILLETKF_ADDINC }}' jcb_base_yaml: '{{ PARMgdas }}/soil/jcb-base.yaml.j2' +# jcb_algo: 'soil_lgetkf_addincrement' jcb_algo: 'soil_lgetkf_increment' +# jcb_algo: 'soil_fv3jedi_fv3inc_lgetkf' #TODO: add observer mode # soilensanlobs: @@ -71,6 +73,7 @@ data_in: - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] {% if DOIAU %} # if using IAU, also need backgrounds copied at the beginning of the window +##TODO: for soil IAU copy the actual restarts at the three time steps # we need to copy them to two places, one serves as the basis for the analysis - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] @@ -148,7 +151,7 @@ data_out: copy_req: # Configuration files - ['{{ DATA }}/soilletkfanl.yaml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}soilletkfanl.yaml'] - - ['{{ DATA }}/soilanladdinc.yaml', '{{ COMOUT_CONF }}/{{ APREFIX }}soilanladdinc.yaml'] + - ['{{ DATA }}/soilletkfaddinc.yaml', '{{ COMOUT_CONF }}/{{ APREFIX }}soilanladdinc.yaml'] - ['{{ DATA }}/soil_obs_list.yaml.j2', '{{ COMOUT_CONF }}/{{ APREFIX }}soil_obs_list.yaml.j2'] {% if DOIAU %} diff --git a/parm/soil/soil_obs_list.yaml.j2 b/parm/soil/soil_obs_list.yaml.j2 index c3789a7cc..57245495b 100644 --- a/parm/soil/soil_obs_list.yaml.j2 +++ b/parm/soil/soil_obs_list.yaml.j2 @@ -1,3 +1,5 @@ observations: -# - smap_soil -- t2m_soil +##- smap_soil +##- t2m_soil +##- prepbufr_adpsfc +- adpsfc_air_temperature_at_2m_181_gsi From 493a47332b7eaefc7fc1885556c2b9097294000e Mon Sep 17 00:00:00 2001 From: tsga Date: Sat, 11 Apr 2026 14:57:36 -0400 Subject: [PATCH 21/98] update fv3 fields with sfc vars --- .gitmodules | 4 +- .../algorithm/soil/soil_addincrement.yaml.j2 | 54 ++++++++++--------- parm/soil/soil_det_config.yaml.j2 | 9 +--- parm/soil/soil_letkf_config.yaml.j2 | 50 ++++++++--------- sorc/fv3-jedi | 2 +- 5 files changed, 59 insertions(+), 60 deletions(-) diff --git a/.gitmodules b/.gitmodules index 4319b5d63..498c19bf7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -35,8 +35,8 @@ branch = develop [submodule "sorc/fv3-jedi"] path = sorc/fv3-jedi - url = https://github.com/jcsda/fv3-jedi.git - branch = develop + url = https://github.com/tsga/fv3-jedi #https://github.com/jcsda/fv3-jedi.git + branch = landsfc #develop [submodule "sorc/soca"] path = sorc/soca url = https://github.com/NOAA-EMC/soca.git diff --git a/parm/jcb-gdas/algorithm/soil/soil_addincrement.yaml.j2 b/parm/jcb-gdas/algorithm/soil/soil_addincrement.yaml.j2 index d6f01865f..d9a510f4d 100644 --- a/parm/jcb-gdas/algorithm/soil/soil_addincrement.yaml.j2 +++ b/parm/jcb-gdas/algorithm/soil/soil_addincrement.yaml.j2 @@ -9,7 +9,7 @@ state geometry: npx: {{ soil_npx_ges }} npy: {{ soil_npy_ges }} npz: {{ soil_npz_ges }} -# field metadata override: ./fv3jedi/fv3jedi_fieldmetadata_history.yaml + #field metadata override: ./fv3jedi/gfs_v17-land.yaml increment geometry: fms initialization: namelist filename: ./fv3jedi/fmsmpp.nml @@ -23,23 +23,37 @@ increment geometry: npz: {{ soil_npz_anl }} # field metadata override: ./fv3jedi/fv3jedi_fieldmetadata_fv3inc.yaml state: - state variables: - - soilMoistureVolumetric - - stc - - totalSnowDepth - - sheleg - - vtype - - slmsk - - fraction_of_ice - field io names: - totalSnowDepth: snodl - soilMoistureVolumetric: smc - fraction_of_ice: fice datapath: ./bkg filetype: fms restart skip coupler file: true datetime: '{{ soil_background_time_iso }}' filename_sfcd: {{ soil_background_time_fv3 }}.sfc_data.nc + state variables: &statevars + - soilMoistureVolumetric + - totalSnowDepth + - fraction_of_ice + - sheleg + - stc + - slmsk + - vtype + - air_temperature_at_2m + - specfic_humidity_at_2m + - slc + - weasdl + - snwdph + - snowxy + - sneqvoxy + - zsnsoxy + - tsnoxy + - snicexy + - snliqxy + - tgxy + field io names: &fionames + soilMoistureVolumetric: smc + totalSnowDepth: snodl + fraction_of_ice: fice + air_temperature_at_2m: t2m + specfic_humidity_at_2m: q2m increment: added variables: - soilMoistureVolumetric @@ -60,15 +74,5 @@ output: filename is datetime templated: true datetime: '{{ soil_background_time_iso }}' filename_sfcd: {{ soil_background_time_fv3 }}.sfc_data.nc - state variables: - - soilMoistureVolumetric - - stc - - totalSnowDepth - - sheleg - - vtype - - slmsk - - fraction_of_ice - field io names: - soilMoistureVolumetric: smc - totalSnowDepth: snodl - fraction_of_ice: fice + state variables: *statevars + field io names: *fionames diff --git a/parm/soil/soil_det_config.yaml.j2 b/parm/soil/soil_det_config.yaml.j2 index d214717f4..2f1632e20 100644 --- a/parm/soil/soil_det_config.yaml.j2 +++ b/parm/soil/soil_det_config.yaml.j2 @@ -23,7 +23,7 @@ data_in: - '{{ DATA }}/fv3jedi' - '{{ DATA }}/berror' - copy: + copy_req: - ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.coupler.res', '{{ DATA }}/bkg/'] - ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/bkg/'] - ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/bkg/'] @@ -42,15 +42,10 @@ data_in: {% filter indent(width=4) %} {% include 'soil_stage_jedi_fix.yaml.j2' %} {% include 'soil_stage_berror.yaml.j2' %} -{% endfilter %} - - copy_opt: -{% filter indent(width=4) %} -{% include 'soil_stage_obs.yaml.j2' %} {% endfilter %} data_out: - copy: + copy_req: # Configuration files - ['{{ DATA }}/soilanlvar.yaml', '{{ COMOUT_CONF }}/{{ APREFIX }}soilanlvar.yaml'] - ['{{ DATA }}/soilanladdinc.yaml', '{{ COMOUT_CONF }}/{{ APREFIX }}soilanladdinc.yaml'] diff --git a/parm/soil/soil_letkf_config.yaml.j2 b/parm/soil/soil_letkf_config.yaml.j2 index a59d3314e..6b49a2d8c 100644 --- a/parm/soil/soil_letkf_config.yaml.j2 +++ b/parm/soil/soil_letkf_config.yaml.j2 @@ -57,36 +57,36 @@ data_in: {% endif %} # define variables # copy coupler file - - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.coupler.res', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.coupler.res', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] # we need to copy them to two places, one serves as the basis for the analysis - - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] {% if DOIAU %} # if using IAU, also need backgrounds copied at the beginning of the window ##TODO: for soil IAU copy the actual restarts at the three time steps # we need to copy them to two places, one serves as the basis for the analysis - - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV_ENS }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] {% endif %} {% endfor %} diff --git a/sorc/fv3-jedi b/sorc/fv3-jedi index 9311003f3..bd50db5ca 160000 --- a/sorc/fv3-jedi +++ b/sorc/fv3-jedi @@ -1 +1 @@ -Subproject commit 9311003f37c152ff2fd828863ae864ac14e777ea +Subproject commit bd50db5ca8bc56fb69200bed31cf2cbfe3b0b16e From f401e25cd6613e1ab359a7c7b6ef447956dd8bff Mon Sep 17 00:00:00 2001 From: tsga Date: Thu, 16 Apr 2026 12:21:26 -0400 Subject: [PATCH 22/98] update localization --- .../jcb-gdas/algorithm/soil/gfs_v17-land.yaml | 37 ++++++++++++++++++ .../soil/soil_lgetkf_addincrement.yaml.j2 | 8 ++-- .../soil/soil_lgetkf_increment.yaml.j2 | 39 +++++++++---------- .../model/soil/soil_background.yaml.j2 | 2 + .../observations/soil/smap_soil.yaml.j2 | 17 ++++++++ parm/soil/jcb-base.yaml.j2 | 2 +- parm/soil/jcb-prototype_lgetkf.yaml.j2 | 2 +- 7 files changed, 81 insertions(+), 26 deletions(-) create mode 100644 parm/jcb-gdas/algorithm/soil/gfs_v17-land.yaml diff --git a/parm/jcb-gdas/algorithm/soil/gfs_v17-land.yaml b/parm/jcb-gdas/algorithm/soil/gfs_v17-land.yaml new file mode 100644 index 000000000..6ddb9bc3d --- /dev/null +++ b/parm/jcb-gdas/algorithm/soil/gfs_v17-land.yaml @@ -0,0 +1,37 @@ +field metadata: + +- long name: weasdl + io file: surface + +- long name: snwdph + io file: surface + +- long name: q2m + io file: surface + io name: q2m + +- long name: slc + io file: surface + io name: slc + +- long name: snowxy + io file: surface + +- long name: sneqvoxy + io file: surface + io name: sneqvoxy + +- long name: zsnsoxy + io file: surface + +- long name: tsnoxy + io file: surface + +- long name: snicexy + io file: surface + +- long name: snliqxy + io file: surface + +- long name: tgxy + io file: surface diff --git a/parm/jcb-gdas/algorithm/soil/soil_lgetkf_addincrement.yaml.j2 b/parm/jcb-gdas/algorithm/soil/soil_lgetkf_addincrement.yaml.j2 index c97951382..7f605b4a3 100644 --- a/parm/jcb-gdas/algorithm/soil/soil_lgetkf_addincrement.yaml.j2 +++ b/parm/jcb-gdas/algorithm/soil/soil_lgetkf_addincrement.yaml.j2 @@ -52,12 +52,12 @@ state: filename_sfcd: {{ soil_background_time_fv3 }}.sfc_data.nc increment: added variables: -# - soilMoistureVolumetric + - soilMoistureVolumetric - stc - - air_temperature_at_2m +# - air_temperature_at_2m field io names: -# soilMoistureVolumetric: smc - air_temperature_at_2m: t2m + soilMoistureVolumetric: smc +# air_temperature_at_2m: t2m datapath: ./anl/mem%{member}% filetype: fms restart skip coupler file: true diff --git a/parm/jcb-gdas/algorithm/soil/soil_lgetkf_increment.yaml.j2 b/parm/jcb-gdas/algorithm/soil/soil_lgetkf_increment.yaml.j2 index 1c1ae60e3..b33504b35 100644 --- a/parm/jcb-gdas/algorithm/soil/soil_lgetkf_increment.yaml.j2 +++ b/parm/jcb-gdas/algorithm/soil/soil_lgetkf_increment.yaml.j2 @@ -29,32 +29,32 @@ state: template: #background input: state variables: &state_vars -# - soilMoistureVolumetric -# - stc -# - totalSnowDepth -# - sheleg -# - vtype -# - slmsk + - soilMoistureVolumetric + - stc + - totalSnowDepth + - sheleg + - vtype + - slmsk # - filtered_orography -# - fraction_of_ice + - fraction_of_ice # - fraction_of_land - air_temperature_at_2m #- temperature_2m #- spec_humidity_2m field io names: &field_io_names -# soilMoistureVolumetric: smc -# totalSnowDepth: snodl + soilMoistureVolumetric: smc + totalSnowDepth: snodl # filtered_orography: orog_filt -# fraction_of_ice: fice + fraction_of_ice: fice # fraction_of_land: land_frac air_temperature_at_2m: t2m datapath: ./bkg/mem%mem% datetime: '{{ soil_background_time_iso }}' filetype: fms restart skip coupler file: true -# filename is datetime templated: true + filename is datetime templated: true filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' -# max allowable geometry difference: 1e-4 + max allowable geometry difference: 1e-4 pattern: '%mem%' nmembers: {{ soil_number_ensemble_members }} zero padding: 3 @@ -62,9 +62,11 @@ increment: members from template: template: state variables: -# - stc + - soilMoistureVolumetric + - stc - air_temperature_at_2m - field io names: + field io names: + soilMoistureVolumetric: smc air_temperature_at_2m: t2m datapath: ./anl/mem%mem% datetime: '{{ soil_background_time_iso }}' @@ -79,18 +81,15 @@ increment: output: members from template: template: - state variables: -# - stc - - air_temperature_at_2m - field io names: - air_temperature_at_2m: t2m + state variables: *state_vars + field io names: *field_io_names datapath: ./anl/mem%mem% datetime: '{{ soil_background_time_iso }}' filetype: fms restart skip coupler file: true # filename is datetime templated: true # prefix: soil_anl - filename_sfcd: 'soil_bgpi.{{ soil_background_time_fv3 }}.sfc_data.nc' + filename_sfcd: 'soil_bkgpinc.{{ soil_background_time_fv3 }}.sfc_data.nc' pattern: '%mem%' nmembers: {{ soil_number_ensemble_members }} zero padding: 3 diff --git a/parm/jcb-gdas/model/soil/soil_background.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background.yaml.j2 index c495e93f9..9915db123 100644 --- a/parm/jcb-gdas/model/soil/soil_background.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background.yaml.j2 @@ -12,12 +12,14 @@ state variables: - filtered_orography - fraction_of_ice - fraction_of_land +- air_temperature_at_2m field io names: soilMoistureVolumetric: smc totalSnowDepth: snodl filtered_orography: orog_filt fraction_of_ice: fice fraction_of_land: land_frac + air_temperature_at_2m: t2m filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' filename_orog: '{{ soil_orog_prefix }}_oro_data.nc' diff --git a/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 b/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 index 760e5344e..9f065cc3a 100644 --- a/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 +++ b/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 @@ -4,6 +4,11 @@ # ----------------------- obs space: name: {{observation_from_jcb}} +{% if algorithm == "local_ensemble_da" %} + distribution: + name: {{distribution_type}} + halo size: "{{halo_size}}" +{% endif %} obsdatain: engine: type: H5File @@ -22,6 +27,18 @@ name: Identity # + # localization TODO: generalize this condioned on da algo + # ------------ +{% if algorithm == "local_ensemble_da" %} + obs localizations: + - localization method: {{localization_method}} + lengthscale: {{loc_length_scale}} + max nobs: {{max_nobs}} +{% endif %} + + obs error: + covariance model: diagonal + # Observation Filters (QC) # ------------------------ obs pre filters: diff --git a/parm/soil/jcb-base.yaml.j2 b/parm/soil/jcb-base.yaml.j2 index 67ae81153..d3c0de649 100644 --- a/parm/soil/jcb-base.yaml.j2 +++ b/parm/soil/jcb-base.yaml.j2 @@ -178,7 +178,7 @@ soil_analysis_ensemble_path: ./anl/mem%mem% # ------------------------- local_ensemble_da_solver: Deterministic LETKF #GETKF -increment_variables: [stc, air_temperature_at_2m] #, smc, sphum] +increment_variables: [stc, air_temperature_at_2m, soilMoistureVolumetric] #, smc, sphum] #[ua,va,DZ,delp,t,ps,sphum,ice_wat,liq_wat,o3mr] # Veritcal localization for GETKF diff --git a/parm/soil/jcb-prototype_lgetkf.yaml.j2 b/parm/soil/jcb-prototype_lgetkf.yaml.j2 index 23bee47d5..f82875c62 100644 --- a/parm/soil/jcb-prototype_lgetkf.yaml.j2 +++ b/parm/soil/jcb-prototype_lgetkf.yaml.j2 @@ -23,7 +23,7 @@ localization_method: "Horizontal Gaspari-Cohn" #"Horizontal Box car" halo_size: 1250e3 loc_length_scale: 1250e3 -max_nobs: 5000 +max_nobs: 10000 # Testing things # -------------- From 53a6840e60c121deb4891a648d5eafecc479e840 Mon Sep 17 00:00:00 2001 From: tsga Date: Sun, 19 Apr 2026 15:56:05 -0400 Subject: [PATCH 23/98] add soil incr template --- parm/soil/apply_incr_nml.j2 | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 parm/soil/apply_incr_nml.j2 diff --git a/parm/soil/apply_incr_nml.j2 b/parm/soil/apply_incr_nml.j2 new file mode 100644 index 000000000..ac7b00d94 --- /dev/null +++ b/parm/soil/apply_incr_nml.j2 @@ -0,0 +1,18 @@ +&noahmp_soil + date_str = "{{ current_cycle | to_YMD }}", + hour_str = "{{ current_cycle | strftime('%H') }}", + res = {{ CASE[1:] }}, + rst_path = "./anl", + inc_path = "./anl", + orog_path = "{{ HOMEglobal }}/fix/orog/{{ CASE }}", + otype = "{{ CASE }}.mx{{ OCNRES }}_oro_data", + stype_prefix="{{ CASE }}.mx{{ OCNRES }}.soil_type", + ntiles={{ ntiles }}, + ens_size={{ ens_size }}, + upd_stc={{ upd_stc }}, + upd_slc={{ upd_slc }}, + print_summary=.true., + print_debug={{ print_debug }} , + lsoil_incr = {{ LSOIL_INCR }}, + inc_prefix = "{{ INC_PREFIX }}" +/ From f14631ef6c22e0ac072189fde97cea4734a6b511 Mon Sep 17 00:00:00 2001 From: tsga Date: Sun, 19 Apr 2026 15:56:58 -0400 Subject: [PATCH 24/98] enable Var run for stc and slc--introduce BUMP later --- .../model/soil/soil_background.yaml.j2 | 1 + .../model/soil/soil_background_error.yaml.j2 | 61 +++++++++++-------- .../soil/soil_final_increment_fms.yaml.j2 | 1 + parm/soil/jcb-base.yaml.j2 | 2 +- parm/soil/soil_det_config.yaml.j2 | 24 ++++---- 5 files changed, 49 insertions(+), 40 deletions(-) diff --git a/parm/jcb-gdas/model/soil/soil_background.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background.yaml.j2 index 9915db123..ea4a0ec3c 100644 --- a/parm/jcb-gdas/model/soil/soil_background.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background.yaml.j2 @@ -4,6 +4,7 @@ skip coupler file: true datetime: '{{ soil_background_time_iso }}' state variables: - soilMoistureVolumetric +- slc - stc - totalSnowDepth - sheleg diff --git a/parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 index c1220bea3..bde123853 100644 --- a/parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 @@ -1,32 +1,33 @@ covariance model: SABER saber central block: - saber block name: BUMP_NICAS - calibration: #read: - general: - universe length-scale: 5000000.0 - drivers: - multivariate strategy: univariate - compute nicas: true #read global nicas: true - write global nicas: true - nicas: - resolution: 4 - explicit length-scales: true - horizontal length-scale: - - groups: - - soilMoistureVolumetric - value: 1000000.0 - vertical length-scale: - - groups: - - soilMoistureVolumetric - value: 1500.0 - interpolation type: - - groups: - - soilMoistureVolumetric - type: c0 - same horizontal convolution: true - io: - data directory: ./berror - files prefix: smc_bump_nicas_1000km_{{ soil_background_time_fv3 }} +# saber block name: BUMP_NICAS +# calibration: #read: +# general: +# universe length-scale: 5000000.0 +# drivers: +# multivariate strategy: univariate +# compute nicas: true #read global nicas: true +# write global nicas: true +# nicas: +# resolution: 4 +# explicit length-scales: true +# horizontal length-scale: +# - groups: +# - soilMoistureVolumetric +# value: 1000000.0 +# vertical length-scale: +# - groups: +# - soilMoistureVolumetric +# value: 1500.0 +# interpolation type: +# - groups: +# - soilMoistureVolumetric +# type: c0 +# same horizontal convolution: true +# io: +# data directory: ./berror +# files prefix: smc_bump_nicas_1000km_{{ soil_background_time_fv3 }} + saber block name: ID saber outer blocks: - saber block name: BUMP_StdDev read: @@ -38,3 +39,9 @@ saber outer blocks: - variables: - soilMoistureVolumetric value: 0.2 + - variables: + - slc + value: 0.2 + - variables: + - stc + value: 0.5 diff --git a/parm/jcb-gdas/model/soil/soil_final_increment_fms.yaml.j2 b/parm/jcb-gdas/model/soil/soil_final_increment_fms.yaml.j2 index b3a7f22f8..b9e77faed 100644 --- a/parm/jcb-gdas/model/soil/soil_final_increment_fms.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_final_increment_fms.yaml.j2 @@ -7,6 +7,7 @@ output: filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' state variables: - soilMoistureVolumetric + - slc - stc - totalSnowDepth - sheleg diff --git a/parm/soil/jcb-base.yaml.j2 b/parm/soil/jcb-base.yaml.j2 index d3c0de649..9ee3accfe 100644 --- a/parm/soil/jcb-base.yaml.j2 +++ b/parm/soil/jcb-base.yaml.j2 @@ -37,7 +37,7 @@ soil_increment_time_fv3: "{{ bkg_time_fv3 }}" # Analysis standard things # ------------------------ -analysis_variables: [soilMoistureVolumetric] +analysis_variables: [soilMoistureVolumetric, slc, stc] minimizer: DRPCG final_diagnostics_departures: anlmob final_prints_frequency: PT3H diff --git a/parm/soil/soil_det_config.yaml.j2 b/parm/soil/soil_det_config.yaml.j2 index 2f1632e20..744f9c627 100644 --- a/parm/soil/soil_det_config.yaml.j2 +++ b/parm/soil/soil_det_config.yaml.j2 @@ -72,18 +72,18 @@ data_out: {% endif %} {% for bkgtime in bkgtimes %} # Analysis = bkg + inc - - ['{{ DATA }}/anl/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc'] - - ['{{ DATA }}/anl/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc'] - - ['{{ DATA }}/anl/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc'] - - ['{{ DATA }}/anl/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc'] - - ['{{ DATA }}/anl/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc'] - - ['{{ DATA }}/anl/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc'] + - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc'] + - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc'] + - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc'] + - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc'] + - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc'] + - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc'] {% endfor %} {% if DO_FINAL_SOILANL %} {% for bkgtime in bkgtimes %} From 486a5f80056ff170821d525b06d470585ff5f147 Mon Sep 17 00:00:00 2001 From: tsga Date: Sun, 19 Apr 2026 16:01:47 -0400 Subject: [PATCH 25/98] brind the soil incr fort to gdasapp --- sorc/land-jediincr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sorc/land-jediincr b/sorc/land-jediincr index 60925e884..0ea59c36a 160000 --- a/sorc/land-jediincr +++ b/sorc/land-jediincr @@ -1 +1 @@ -Subproject commit 60925e88419aaaf6b9028107fada0192d6ad6b5e +Subproject commit 0ea59c36a3ad99e68968ec48695a9bebf087ccd4 From 505992845c043b7e4a90428d8843268185125953 Mon Sep 17 00:00:00 2001 From: tsga Date: Sun, 19 Apr 2026 16:23:20 -0400 Subject: [PATCH 26/98] add T2m to analysis vars --- .gitmodules | 4 ++-- parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 | 3 +++ parm/soil/jcb-base.yaml.j2 | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.gitmodules b/.gitmodules index 498c19bf7..3ba84633a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -43,8 +43,8 @@ branch = dev/emc [submodule "sorc/land-jediincr"] path = sorc/land-jediincr - url = https://github.com/NOAA-EMC/land-apply_jedi_incr.git - branch = develop + url = https://github.com/tsga/land-apply_jedi_incr #https://github.com/NOAA-EMC/land-apply_jedi_incr.git + branch = tq2m #develop [submodule "sorc/crtm"] path = sorc/crtm url = https://github.com/jcsda/crtm.git diff --git a/parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 index bde123853..52aad333f 100644 --- a/parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 @@ -45,3 +45,6 @@ saber outer blocks: - variables: - stc value: 0.5 + - variables: + - air_temperature_at_2m + value: 1.0 diff --git a/parm/soil/jcb-base.yaml.j2 b/parm/soil/jcb-base.yaml.j2 index 9ee3accfe..18ce00c3a 100644 --- a/parm/soil/jcb-base.yaml.j2 +++ b/parm/soil/jcb-base.yaml.j2 @@ -37,7 +37,7 @@ soil_increment_time_fv3: "{{ bkg_time_fv3 }}" # Analysis standard things # ------------------------ -analysis_variables: [soilMoistureVolumetric, slc, stc] +analysis_variables: [soilMoistureVolumetric, slc, stc, air_temperature_at_2m] minimizer: DRPCG final_diagnostics_departures: anlmob final_prints_frequency: PT3H From 84021efce718dee365fc80ac604c21eadcbb97bc Mon Sep 17 00:00:00 2001 From: tsga Date: Thu, 23 Apr 2026 22:55:54 +0000 Subject: [PATCH 27/98] add slc to inc vars --- parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 | 1 + parm/jcb-gdas/model/soil/soil_ensemble_output_fms_common.yaml.j2 | 1 + parm/jcb-gdas/model/soil/soil_output.yaml.j2 | 1 + 3 files changed, 3 insertions(+) diff --git a/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 index 6b59aeaac..bb116edf2 100644 --- a/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 @@ -8,6 +8,7 @@ members from template: state variables: &state_vars - soilMoistureVolumetric - stc + - slc - totalSnowDepth - sheleg - vtype diff --git a/parm/jcb-gdas/model/soil/soil_ensemble_output_fms_common.yaml.j2 b/parm/jcb-gdas/model/soil/soil_ensemble_output_fms_common.yaml.j2 index 826ab5a81..4d3cfd32a 100644 --- a/parm/jcb-gdas/model/soil/soil_ensemble_output_fms_common.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_ensemble_output_fms_common.yaml.j2 @@ -5,6 +5,7 @@ filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' state variables: - soilMoistureVolumetric - stc +- slc - totalSnowDepth - sheleg - vtype diff --git a/parm/jcb-gdas/model/soil/soil_output.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output.yaml.j2 index 83e44b6ee..2b737d9e9 100644 --- a/parm/jcb-gdas/model/soil/soil_output.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_output.yaml.j2 @@ -1,6 +1,7 @@ state variables: - soilMoistureVolumetric - stc +- slc - totalSnowDepth - sheleg - vtype From 4823884253cf174d03f9c8df2d69aebbdf06aa1a Mon Sep 17 00:00:00 2001 From: tsga Date: Thu, 23 Apr 2026 22:57:38 +0000 Subject: [PATCH 28/98] clean up letkf inc --- parm/soil/jcb-base.yaml.j2 | 2 +- parm/soil/soil_letkf_config.yaml.j2 | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/parm/soil/jcb-base.yaml.j2 b/parm/soil/jcb-base.yaml.j2 index 18ce00c3a..d05600606 100644 --- a/parm/soil/jcb-base.yaml.j2 +++ b/parm/soil/jcb-base.yaml.j2 @@ -178,7 +178,7 @@ soil_analysis_ensemble_path: ./anl/mem%mem% # ------------------------- local_ensemble_da_solver: Deterministic LETKF #GETKF -increment_variables: [stc, air_temperature_at_2m, soilMoistureVolumetric] #, smc, sphum] +increment_variables: [stc, slc, air_temperature_at_2m, soilMoistureVolumetric] #, smc, sphum] #[ua,va,DZ,delp,t,ps,sphum,ice_wat,liq_wat,o3mr] # Veritcal localization for GETKF diff --git a/parm/soil/soil_letkf_config.yaml.j2 b/parm/soil/soil_letkf_config.yaml.j2 index 6b49a2d8c..4066828be 100644 --- a/parm/soil/soil_letkf_config.yaml.j2 +++ b/parm/soil/soil_letkf_config.yaml.j2 @@ -164,17 +164,17 @@ data_out: {% set memchar = 'mem%03d' | format(imem) %} # Analysis - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_analysis.sfc_data.tile1.nc'] + '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc'] - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_analysis.sfc_data.tile2.nc'] + '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc'] - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_analysis.sfc_data.tile3.nc'] + '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc'] - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_analysis.sfc_data.tile4.nc'] + '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc'] - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_analysis.sfc_data.tile5.nc'] + '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc'] - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_analysis.sfc_data.tile6.nc'] + '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc'] # Increments - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc', From 56385a2ef3a8e31e6cef5668340ad91e1642e2af Mon Sep 17 00:00:00 2001 From: tsga Date: Fri, 24 Apr 2026 11:22:01 +0000 Subject: [PATCH 29/98] copy updated bkg to workdir --- parm/soil/soil_letkf_config.yaml.j2 | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/parm/soil/soil_letkf_config.yaml.j2 b/parm/soil/soil_letkf_config.yaml.j2 index 4066828be..4cfc8e3a8 100644 --- a/parm/soil/soil_letkf_config.yaml.j2 +++ b/parm/soil/soil_letkf_config.yaml.j2 @@ -175,6 +175,20 @@ data_out: '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc'] - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc'] +# As bkg for next timestep + - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc'] + # Increments - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc', From 2f42280e2bb9fdd708e7d0992b2aaec1bf14a862 Mon Sep 17 00:00:00 2001 From: tsga Date: Fri, 24 Apr 2026 14:26:23 +0000 Subject: [PATCH 30/98] add q2m to states --- .../model/soil/soil_background.yaml.j2 | 2 ++ .../soil/soil_background_ensemble.yaml.j2 | 4 +++- .../model/soil/soil_background_error.yaml.j2 | 3 +++ .../soil_ensemble_output_fms_common.yaml.j2 | 4 ++-- parm/jcb-gdas/model/soil/soil_output.yaml.j2 | 4 ++++ .../observations/soil/smap_soil.yaml.j2 | 22 +++++++++++++++++++ parm/soil/jcb-base.yaml.j2 | 2 +- 7 files changed, 37 insertions(+), 4 deletions(-) diff --git a/parm/jcb-gdas/model/soil/soil_background.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background.yaml.j2 index ea4a0ec3c..6a5b14614 100644 --- a/parm/jcb-gdas/model/soil/soil_background.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background.yaml.j2 @@ -14,6 +14,7 @@ state variables: - fraction_of_ice - fraction_of_land - air_temperature_at_2m +- specfic_humidity_at_2m field io names: soilMoistureVolumetric: smc totalSnowDepth: snodl @@ -21,6 +22,7 @@ field io names: fraction_of_ice: fice fraction_of_land: land_frac air_temperature_at_2m: t2m + specfic_humidity_at_2m: q2m filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' filename_orog: '{{ soil_orog_prefix }}_oro_data.nc' diff --git a/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 index bb116edf2..c3780b5f6 100644 --- a/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 @@ -16,7 +16,8 @@ members from template: - filtered_orography - fraction_of_ice - fraction_of_land - - air_temperature_at_2m + - air_temperature_at_2m + - specfic_humidity_at_2m #temperature_2m #spec_humidity_2m field io names: &field_ios @@ -26,6 +27,7 @@ members from template: fraction_of_ice: fice fraction_of_land: land_frac air_temperature_at_2m: t2m + specfic_humidity_at_2m: q2m datapath: {{ soil_background_ensemble_path }} filename is datetime templated: true filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' diff --git a/parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 index 52aad333f..3500035fe 100644 --- a/parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 @@ -48,3 +48,6 @@ saber outer blocks: - variables: - air_temperature_at_2m value: 1.0 + - variables: + - specfic_humidity_at_2m + value: 0.5 diff --git a/parm/jcb-gdas/model/soil/soil_ensemble_output_fms_common.yaml.j2 b/parm/jcb-gdas/model/soil/soil_ensemble_output_fms_common.yaml.j2 index 4d3cfd32a..080c15360 100644 --- a/parm/jcb-gdas/model/soil/soil_ensemble_output_fms_common.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_ensemble_output_fms_common.yaml.j2 @@ -14,8 +14,7 @@ state variables: - fraction_of_ice - fraction_of_land - air_temperature_at_2m -#- temperature_2m -#- spec_humidity_2m +- specfic_humidity_at_2m field io names: soilMoistureVolumetric: smc totalSnowDepth: snodl @@ -23,3 +22,4 @@ field io names: fraction_of_ice: fice fraction_of_land: land_frac air_temperature_at_2m: t2m + specfic_humidity_at_2m: q2m diff --git a/parm/jcb-gdas/model/soil/soil_output.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output.yaml.j2 index 2b737d9e9..96c396f6c 100644 --- a/parm/jcb-gdas/model/soil/soil_output.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_output.yaml.j2 @@ -9,12 +9,16 @@ state variables: - filtered_orography - fraction_of_ice - fraction_of_land +- air_temperature_at_2m +- specfic_humidity_at_2m field io names: soilMoistureVolumetric: smc totalSnowDepth: snodl filtered_orography: orog_filt fraction_of_ice: fice fraction_of_land: land_frac + air_temperature_at_2m + specfic_humidity_at_2m datapath: ./anl prefix: soil_finanl filetype: fms restart diff --git a/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 b/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 index 9f065cc3a..bccca391a 100644 --- a/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 +++ b/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 @@ -200,6 +200,28 @@ # ignore: rejected observations # - name: reject obs post filters: + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: soilMoistureVolumetric + test variables: + - name: ObsErrorData/soilMoistureVolumetric + minvalue: 0.0 + maxvalue: 0.2 + action: + name: reject + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: soilMoistureVolumetric + minvalue: 0.02 + maxvalue: 0.5 + action: + name: reject + - filter: Background Check # gross error check filter variables: - name: soilMoistureVolumetric diff --git a/parm/soil/jcb-base.yaml.j2 b/parm/soil/jcb-base.yaml.j2 index d05600606..996af90ce 100644 --- a/parm/soil/jcb-base.yaml.j2 +++ b/parm/soil/jcb-base.yaml.j2 @@ -178,7 +178,7 @@ soil_analysis_ensemble_path: ./anl/mem%mem% # ------------------------- local_ensemble_da_solver: Deterministic LETKF #GETKF -increment_variables: [stc, slc, air_temperature_at_2m, soilMoistureVolumetric] #, smc, sphum] +increment_variables: [soilMoistureVolumetric,slc,stc,air_temperature_at_2m,specfic_humidity_at_2m] #, smc, sphum] #[ua,va,DZ,delp,t,ps,sphum,ice_wat,liq_wat,o3mr] # Veritcal localization for GETKF From a3879aaafcfbaaba207f19d327714a74ac001f2a Mon Sep 17 00:00:00 2001 From: tsga Date: Fri, 24 Apr 2026 19:23:33 +0000 Subject: [PATCH 31/98] add smap obs and err bounds check --- parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 b/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 index bccca391a..684b131c4 100644 --- a/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 +++ b/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 @@ -75,7 +75,7 @@ - name: soilMoistureVolumetric action: name: assign error - error parameter: 0.20 + error parameter: 0.1 - filter: Domain Check where: - variable: From 27bc6e12425feaa480cbe737b37babeba0329a7a Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Tue, 28 Apr 2026 14:41:22 -0400 Subject: [PATCH 32/98] Remove extra fields Removed unused weather-related fields from the YAML configuration. --- parm/jcb-gdas/algorithm/soil/soil_addincrement.yaml.j2 | 9 --------- 1 file changed, 9 deletions(-) diff --git a/parm/jcb-gdas/algorithm/soil/soil_addincrement.yaml.j2 b/parm/jcb-gdas/algorithm/soil/soil_addincrement.yaml.j2 index d9a510f4d..f69637337 100644 --- a/parm/jcb-gdas/algorithm/soil/soil_addincrement.yaml.j2 +++ b/parm/jcb-gdas/algorithm/soil/soil_addincrement.yaml.j2 @@ -39,15 +39,6 @@ state: - air_temperature_at_2m - specfic_humidity_at_2m - slc - - weasdl - - snwdph - - snowxy - - sneqvoxy - - zsnsoxy - - tsnoxy - - snicexy - - snliqxy - - tgxy field io names: &fionames soilMoistureVolumetric: smc totalSnowDepth: snodl From 0832ce54d86f784c1d4d39f6fec7e542c95fed4a Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Tue, 28 Apr 2026 14:45:33 -0400 Subject: [PATCH 33/98] Update soil background error values --- parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 index 3500035fe..2a3dbc9b6 100644 --- a/parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 @@ -38,16 +38,16 @@ saber outer blocks: stddev: - variables: - soilMoistureVolumetric - value: 0.2 + value: 0.05 - variables: - slc - value: 0.2 + value: 0.05 - variables: - stc - value: 0.5 + value: 2.0 - variables: - air_temperature_at_2m - value: 1.0 + value: 2.0 - variables: - specfic_humidity_at_2m value: 0.5 From 6281c50e41d80b756fbc547c6d1daf146bd18e6b Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Tue, 28 Apr 2026 14:46:37 -0400 Subject: [PATCH 34/98] Reduce error parameter for soil moisture filter --- parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 b/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 index 684b131c4..c5d190476 100644 --- a/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 +++ b/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 @@ -75,7 +75,7 @@ - name: soilMoistureVolumetric action: name: assign error - error parameter: 0.1 + error parameter: 0.04 - filter: Domain Check where: - variable: From 80e5b963f8d89357cf2fbe31f5fe7842b9186dd1 Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Tue, 28 Apr 2026 14:50:13 -0400 Subject: [PATCH 35/98] Add specific humidity variable to analysis variables --- parm/soil/jcb-base.yaml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/soil/jcb-base.yaml.j2 b/parm/soil/jcb-base.yaml.j2 index 996af90ce..d74d386b9 100644 --- a/parm/soil/jcb-base.yaml.j2 +++ b/parm/soil/jcb-base.yaml.j2 @@ -37,7 +37,7 @@ soil_increment_time_fv3: "{{ bkg_time_fv3 }}" # Analysis standard things # ------------------------ -analysis_variables: [soilMoistureVolumetric, slc, stc, air_temperature_at_2m] +analysis_variables: [soilMoistureVolumetric, slc, stc, air_temperature_at_2m, specfic_humidity_at_2m] minimizer: DRPCG final_diagnostics_departures: anlmob final_prints_frequency: PT3H From 418d3d2f59840eebde3b3fd205d035964db642c2 Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Tue, 28 Apr 2026 14:57:40 -0400 Subject: [PATCH 36/98] Change specific humidity value from 0.5 to 0.1 --- parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 index 2a3dbc9b6..1d1c54763 100644 --- a/parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 @@ -50,4 +50,4 @@ saber outer blocks: value: 2.0 - variables: - specfic_humidity_at_2m - value: 0.5 + value: 0.1 From ef5c036453c812e7dd0cd09c483a66e779629767 Mon Sep 17 00:00:00 2001 From: tsga Date: Wed, 17 Jun 2026 19:22:01 +0000 Subject: [PATCH 37/98] add soilinc to land-jediinc/cmakelist --- sorc/land-jediincr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sorc/land-jediincr b/sorc/land-jediincr index 0ea59c36a..543ba6fb8 160000 --- a/sorc/land-jediincr +++ b/sorc/land-jediincr @@ -1 +1 @@ -Subproject commit 0ea59c36a3ad99e68968ec48695a9bebf087ccd4 +Subproject commit 543ba6fb8b950f7f4a3f814cf32704c49196f7c6 From 63f1f490a761e50b5fa6e09a011b7f7756ad32f8 Mon Sep 17 00:00:00 2001 From: tsga Date: Thu, 18 Jun 2026 13:19:57 +0000 Subject: [PATCH 38/98] revise soil config files --- .../model/soil/soil_background.yaml.j2 | 49 ++-- .../soil/soil_background_ensemble.yaml.j2 | 61 ++--- .../soil/soil_background_ensemble_fv3.yaml.j2 | 39 +++ .../model/soil/soil_background_error.yaml | 73 ++++++ ...ml.j2 => soil_background_error_ID.yaml.j2} | 0 .../soil_background_error_ensonly.yaml.j2 | 106 ++++++++ .../model/soil/soil_background_error_smc.yaml | 54 ++++ .../soil/soil_background_error_smcstc.yaml | 67 +++++ .../soil/soil_background_error_soill1.yaml | 78 ++++++ ...background_error_static_smcstctq2m.yaml.j2 | 67 +++++ ...oil_background_error_static_soill1.yaml.j2 | 75 ++++++ .../model/soil/soil_background_fv3.yaml.j2 | 28 +++ .../soil/soil_ensemble_increments_csg.yaml.j2 | 1 + .../soil_ensemble_output_csg_common.yaml.j2 | 31 +++ .../soil/soil_final_increment_csg.yaml.j2 | 34 +++ .../soil/soil_final_increment_fms.yaml.j2 | 9 +- .../soil/soil_output_increment_csg.yaml.j2 | 2 + .../observations/soil/smap_soil.yaml.j2 | 105 ++++---- .../observations/soil/smap_soil_smc.yaml.j2 | 238 ++++++++++++++++++ parm/soil/apply_incr_nml.j2 | 5 +- parm/soil/jcb-base.yaml.j2 | 24 +- parm/soil/soil_det_config.yaml.j2 | 55 ++-- parm/soil/soil_letkf_config.yaml.j2 | 50 ++-- parm/soil/soil_stage_berror.yaml.j2 | 2 +- 24 files changed, 1114 insertions(+), 139 deletions(-) create mode 100644 parm/jcb-gdas/model/soil/soil_background_ensemble_fv3.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_background_error.yaml rename parm/jcb-gdas/model/soil/{soil_background_error.yaml.j2 => soil_background_error_ID.yaml.j2} (100%) create mode 100644 parm/jcb-gdas/model/soil/soil_background_error_ensonly.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_background_error_smc.yaml create mode 100644 parm/jcb-gdas/model/soil/soil_background_error_smcstc.yaml create mode 100644 parm/jcb-gdas/model/soil/soil_background_error_soill1.yaml create mode 100644 parm/jcb-gdas/model/soil/soil_background_error_static_smcstctq2m.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_background_error_static_soill1.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_background_fv3.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_ensemble_increments_csg.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_ensemble_output_csg_common.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_final_increment_csg.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_output_increment_csg.yaml.j2 create mode 100644 parm/jcb-gdas/observations/soil/smap_soil_smc.yaml.j2 diff --git a/parm/jcb-gdas/model/soil/soil_background.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background.yaml.j2 index 6a5b14614..cfa50b5dd 100644 --- a/parm/jcb-gdas/model/soil/soil_background.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background.yaml.j2 @@ -1,28 +1,35 @@ datapath: {{ soil_background_path }} -filetype: fms restart -skip coupler file: true +filetype: cube sphere history +provider: ufs datetime: '{{ soil_background_time_iso }}' +filenames: +###- {{ soil_variational_history_prefix }}csg_atm.f006.nc +- {{ soil_variational_history_prefix }}csg_sfc.f006.nc #[enkf]gdas.t12z.csg_sfc.f006.nc +max allowable geometry difference: 1e-4 state variables: -- soilMoistureVolumetric -- slc -- stc -- totalSnowDepth +- soill1 +- soill2 +- soill3 +- soilt1 +- soilt2 +- soilt3 +- air_temperature_at_2m +- specfic_humidity_at_2m - sheleg - vtype - slmsk -- filtered_orography -- fraction_of_ice -- fraction_of_land -- air_temperature_at_2m -- specfic_humidity_at_2m +#- stype +#- vfrac +#- geopotential_height_at_surface +#- skin_temperature_at_surface +#filtered_orography field io names: - soilMoistureVolumetric: smc - totalSnowDepth: snodl - filtered_orography: orog_filt - fraction_of_ice: fice - fraction_of_land: land_frac - air_temperature_at_2m: t2m - specfic_humidity_at_2m: q2m -filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' -filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' -filename_orog: '{{ soil_orog_prefix }}_oro_data.nc' + #filtered_orography: orog_filt + air_temperature_at_2m: tmp2m + specfic_humidity_at_2m: spfh2m + slmsk: land + sheleg: weasd + #geopotential_height_at_surface: hgtsfc + #skin_temperature_at_surface: tmpsfc + #stype: sotyp + #vfrac: veg diff --git a/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 index c3780b5f6..b0f59a103 100644 --- a/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 @@ -1,39 +1,40 @@ -#datetime: '{{ soil_background_time_iso }}' members from template: template: datetime: '{{ soil_background_time_iso }}' - filetype: fms restart - skip coupler file: true -# provider: ufs - state variables: &state_vars - - soilMoistureVolumetric - - stc - - slc - - totalSnowDepth + datapath: {{ soil_background_ensemble_path }} + filetype: cube sphere history + provider: ufs + filenames: + ###- {{ soil_variational_history_prefix }}csg_atm.f006.nc + - {{ soil_variational_history_prefix }}csg_sfc.f006.nc #[enkf]gdas.t12z.csg_sfc.f006.nc + max allowable geometry difference: 1e-4 + state variables: + - soill1 + - soill2 + - soill3 + - soilt1 + - soilt2 + - soilt3 + - air_temperature_at_2m + - specfic_humidity_at_2m - sheleg - vtype - slmsk - - filtered_orography - - fraction_of_ice - - fraction_of_land - - air_temperature_at_2m - - specfic_humidity_at_2m -#temperature_2m -#spec_humidity_2m - field io names: &field_ios - soilMoistureVolumetric: smc - totalSnowDepth: snodl - filtered_orography: orog_filt - fraction_of_ice: fice - fraction_of_land: land_frac - air_temperature_at_2m: t2m - specfic_humidity_at_2m: q2m - datapath: {{ soil_background_ensemble_path }} - filename is datetime templated: true - filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' - filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' - filename_orog: '{{ soil_orog_prefix }}_oro_data.nc' - max allowable geometry difference: 1e-4 + #- stype + #- vfrac + #- geopotential_height_at_surface + #- skin_temperature_at_surface + #filtered_orography + field io names: + #filtered_orography: orog_filt + air_temperature_at_2m: tmp2m + specfic_humidity_at_2m: spfh2m + slmsk: land + sheleg: weasd + #geopotential_height_at_surface: hgtsfc + #skin_temperature_at_surface: tmpsfc + #stype: sotyp + #vfrac: veg pattern: "{{ soil_ensemble_pattern | default("%mem%", true) }}" nmembers: {{ soil_number_ensemble_members }} zero padding: 3 diff --git a/parm/jcb-gdas/model/soil/soil_background_ensemble_fv3.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_ensemble_fv3.yaml.j2 new file mode 100644 index 000000000..c3780b5f6 --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_background_ensemble_fv3.yaml.j2 @@ -0,0 +1,39 @@ +#datetime: '{{ soil_background_time_iso }}' +members from template: + template: + datetime: '{{ soil_background_time_iso }}' + filetype: fms restart + skip coupler file: true +# provider: ufs + state variables: &state_vars + - soilMoistureVolumetric + - stc + - slc + - totalSnowDepth + - sheleg + - vtype + - slmsk + - filtered_orography + - fraction_of_ice + - fraction_of_land + - air_temperature_at_2m + - specfic_humidity_at_2m +#temperature_2m +#spec_humidity_2m + field io names: &field_ios + soilMoistureVolumetric: smc + totalSnowDepth: snodl + filtered_orography: orog_filt + fraction_of_ice: fice + fraction_of_land: land_frac + air_temperature_at_2m: t2m + specfic_humidity_at_2m: q2m + datapath: {{ soil_background_ensemble_path }} + filename is datetime templated: true + filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' + filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' + filename_orog: '{{ soil_orog_prefix }}_oro_data.nc' + max allowable geometry difference: 1e-4 + pattern: "{{ soil_ensemble_pattern | default("%mem%", true) }}" + nmembers: {{ soil_number_ensemble_members }} + zero padding: 3 diff --git a/parm/jcb-gdas/model/soil/soil_background_error.yaml b/parm/jcb-gdas/model/soil/soil_background_error.yaml new file mode 100644 index 000000000..d3f4cff32 --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_background_error.yaml @@ -0,0 +1,73 @@ +covariance model: SABER +saber central block: + saber block name: BUMP_NICAS + read: + general: + universe length-scale: 250000.0 + drivers: + multivariate strategy: univariate + read global nicas: true + nicas: + resolution: 6 + max horizontal grid size: 400000 + explicit length-scales: true + horizontal length-scale: + - groups: + - soill1_shadowLevels + - soill2_shadowLevels + - soilt1_shadowLevels + - soilt2_shadowLevels + value: 250000.0 + vertical length-scale: + - groups: + - soill1_shadowLevels + - soill2_shadowLevels + - soilt1_shadowLevels + - soilt2_shadowLevels + value: 0.0 + interpolation type: + - groups: + - soill1_shadowLevels + - soill2_shadowLevels + - soilt1_shadowLevels + - soilt2_shadowLevels + type: c0 + same horizontal convolution: true + io: + data directory: ./berror + files prefix: smc_bump +saber outer blocks: +- saber block name: ShadowLevels + fields metadata: + soill1: + vert_coord: filtered_orography + soill2: + vert_coord: filtered_orography + soilt1: + vert_coord: filtered_orography + soilt2: + vert_coord: filtered_orography + calibration: + number of shadow levels: 50 + lowest shadow level: -450.0 + highest shadow level: 8850.0 + vertical length-scale: 800.0 +- saber block name: BUMP_StdDev + read: + drivers: + compute variance: true + variance: + explicit stddev: true + stddev: + - variables: + - soill1 + value: 0.05 + - variables: + - soill2 + value: 0.05 + - variables: + - soilt1 + value: 2.0 + - variables: + - soilt2 + value: 2.0 diff --git a/parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_error_ID.yaml.j2 similarity index 100% rename from parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 rename to parm/jcb-gdas/model/soil/soil_background_error_ID.yaml.j2 diff --git a/parm/jcb-gdas/model/soil/soil_background_error_ensonly.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_error_ensonly.yaml.j2 new file mode 100644 index 000000000..598dbe904 --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_background_error_ensonly.yaml.j2 @@ -0,0 +1,106 @@ +covariance model: ensemble +localization: + localization method: SABER + saber central block: + saber block name: ID +members from template: + template: + states: + datapath: /scratch5/purged/Tseganeh.Gichamo/letkf_smap_workdir/mem%mem%/ + filetype: fms restart + skip coupler file: true + datetime: '2024-03-01T00:00:00Z' + state variables: + - soilMoistureVolumetric + - slc + - stc + - totalSnowDepth + - sheleg + - vtype + - slmsk + - filtered_orography + - fraction_of_ice + - fraction_of_land + - air_temperature_at_2m + - specfic_humidity_at_2m + field io names: + soilMoistureVolumetric: smc + totalSnowDepth: snodl + filtered_orography: orog_filt + fraction_of_ice: fice + fraction_of_land: land_frac + air_temperature_at_2m: t2m + specfic_humidity_at_2m: q2m + filename_sfcd: 20240301.000000.sfc_data.nc + filename_cplr: 20240301.000000.coupler.res + filename_orog: C96.mx100_oro_data.nc + pattern: '%mem%' + nmembers: 3 + zero padding: 3 +#covariance model: SABER +#saber central block: +# saber block name: BUMP_NICAS +# read: #calibration +# general: +# universe length-scale: 5000000.0 +# drivers: +# multivariate strategy: univariate +# read global nicas: true #compute nicas: true +# #write global nicas: true +# nicas: +# resolution: 6 +# max horizontal grid size: 400000 +# explicit length-scales: true +# horizontal length-scale: +# - groups: +# - soilMoistureVolumetric +# - slc +# - stc +# - air_temperature_at_2m +# - specfic_humidity_at_2m +# value: 250000.0 +# vertical length-scale: +# - groups: +# - soilMoistureVolumetric +# - slc +# - stc +# - air_temperature_at_2m +# - specfic_humidity_at_2m +# value: 800.0 +# interpolation type: +# - groups: +# - soilMoistureVolumetric +# - slc +# - stc +# - air_temperature_at_2m +# - specfic_humidity_at_2m +# type: c0 +# same horizontal convolution: true +# io: +# data directory: ./berror +# files prefix: smc_bump +##_nicas.nc #_{{ soil_background_time_fv3 }} +## saber block name: ID +#saber outer blocks: +#- saber block name: BUMP_StdDev +# read: +# drivers: +# compute variance: true +# variance: +# explicit stddev: true +# stddev: +# - variables: +# - soilMoistureVolumetric +# value: 0.2 +# - variables: +# - slc +# value: 0.2 +# - variables: +# - stc +# value: 0.5 +# - variables: +# - air_temperature_at_2m +# value: 1.0 +# - variables: +# - specfic_humidity_at_2m +# value: 0.5 diff --git a/parm/jcb-gdas/model/soil/soil_background_error_smc.yaml b/parm/jcb-gdas/model/soil/soil_background_error_smc.yaml new file mode 100644 index 000000000..a7a5f1601 --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_background_error_smc.yaml @@ -0,0 +1,54 @@ +covariance model: SABER +saber central block: + saber block name: BUMP_NICAS + calibration: #read: + general: + universe length-scale: 5000000.0 + drivers: + multivariate strategy: univariate + compute nicas: true #read global nicas: true + write global nicas: true + nicas: + resolution: 4 + explicit length-scales: true + horizontal length-scale: + - groups: + - soilMoistureVolumetric + value: 1000000.0 + vertical length-scale: + - groups: + - soilMoistureVolumetric + value: 1500.0 + interpolation type: + - groups: + - soilMoistureVolumetric + type: c0 + same horizontal convolution: true + io: + data directory: ./berror + files prefix: smc_bump_nicas_1000km.nc +#_{{ soil_background_time_fv3 }} +# saber block name: ID +saber outer blocks: +- saber block name: BUMP_StdDev + read: + drivers: + compute variance: true + variance: + explicit stddev: true + stddev: + - variables: + - soilMoistureVolumetric + value: 0.2 + - variables: + - slc + value: 0.2 + - variables: + - stc + value: 0.5 + - variables: + - air_temperature_at_2m + value: 1.0 + - variables: + - specfic_humidity_at_2m + value: 0.5 diff --git a/parm/jcb-gdas/model/soil/soil_background_error_smcstc.yaml b/parm/jcb-gdas/model/soil/soil_background_error_smcstc.yaml new file mode 100644 index 000000000..b4326d980 --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_background_error_smcstc.yaml @@ -0,0 +1,67 @@ +covariance model: SABER +saber central block: + saber block name: BUMP_NICAS + read: #calibration + general: + universe length-scale: 250000.0 + drivers: + multivariate strategy: univariate + read global nicas: true #compute nicas: true + #write global nicas: true + nicas: + resolution: 6 + max horizontal grid size: 400000 + explicit length-scales: true + horizontal length-scale: + - groups: + - soilMoistureVolumetric + - slc + - stc + - air_temperature_at_2m + - specfic_humidity_at_2m + value: 250000.0 + vertical length-scale: + - groups: + - soilMoistureVolumetric + - slc + - stc + - air_temperature_at_2m + - specfic_humidity_at_2m + value: 800.0 + interpolation type: + - groups: + - soilMoistureVolumetric + - slc + - stc + - air_temperature_at_2m + - specfic_humidity_at_2m + type: c0 + same horizontal convolution: true + io: + data directory: ./berror + files prefix: smc_bump +#_nicas.nc #_{{ soil_background_time_fv3 }} +# saber block name: ID +saber outer blocks: +- saber block name: BUMP_StdDev + read: + drivers: + compute variance: true + variance: + explicit stddev: true + stddev: + - variables: + - soilMoistureVolumetric + value: 0.05 + - variables: + - slc + value: 0.05 + - variables: + - stc + value: 2.0 + - variables: + - air_temperature_at_2m + value: 2.0 + - variables: + - specfic_humidity_at_2m + value: 0.1 diff --git a/parm/jcb-gdas/model/soil/soil_background_error_soill1.yaml b/parm/jcb-gdas/model/soil/soil_background_error_soill1.yaml new file mode 100644 index 000000000..88123efa2 --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_background_error_soill1.yaml @@ -0,0 +1,78 @@ +covariance model: SABER +saber central block: + saber block name: BUMP_NICAS + read: + general: + universe length-scale: 250000.0 + drivers: + multivariate strategy: univariate + #compute nicas: true + read global nicas: true + #write global nicas: true + nicas: + resolution: 6 + max horizontal grid size: 250000 + explicit length-scales: true + horizontal length-scale: + - groups: + - soill1_shadowLevels + - soill2_shadowLevels + - soilt1_shadowLevels + - soilt2_shadowLevels + value: 250000. + vertical length-scale: + - groups: + - soill1_shadowLevels + - soill2_shadowLevels + - soilt1_shadowLevels + - soilt2_shadowLevels + value: 0.0 + interpolation type: + - groups: + - soill1_shadowLevels + - soill2_shadowLevels + - soilt1_shadowLevels + - soilt2_shadowLevels + type: c0 + same horizontal convolution: true + io: + data directory: ./berror + files prefix: smc_bump +saber outer blocks: +- saber block name: ShadowLevels + fields metadata: + soill1: + vert_coord: filtered_orography + soill2: + vert_coord: filtered_orography + soilt1: + vert_coord: filtered_orography + soilt2: + vert_coord: filtered_orography + calibration: + number of shadow levels: 50 + lowest shadow level: -450.0 + highest shadow level: 8850.0 + vertical length-scale: 700.0 +- saber block name: BUMP_StdDev + read: + drivers: + compute variance: true + variance: + explicit stddev: true + stddev: + - variables: + - soill1 + value: 0.05 + - variables: + - soill2 + value: 0.05 + - variables: + - soilt1 + value: 2.0 + - variables: + - soilt1 + value: 2.0 + - variables: + - soilt2 + value: 2.0 diff --git a/parm/jcb-gdas/model/soil/soil_background_error_static_smcstctq2m.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_error_static_smcstctq2m.yaml.j2 new file mode 100644 index 000000000..b4326d980 --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_background_error_static_smcstctq2m.yaml.j2 @@ -0,0 +1,67 @@ +covariance model: SABER +saber central block: + saber block name: BUMP_NICAS + read: #calibration + general: + universe length-scale: 250000.0 + drivers: + multivariate strategy: univariate + read global nicas: true #compute nicas: true + #write global nicas: true + nicas: + resolution: 6 + max horizontal grid size: 400000 + explicit length-scales: true + horizontal length-scale: + - groups: + - soilMoistureVolumetric + - slc + - stc + - air_temperature_at_2m + - specfic_humidity_at_2m + value: 250000.0 + vertical length-scale: + - groups: + - soilMoistureVolumetric + - slc + - stc + - air_temperature_at_2m + - specfic_humidity_at_2m + value: 800.0 + interpolation type: + - groups: + - soilMoistureVolumetric + - slc + - stc + - air_temperature_at_2m + - specfic_humidity_at_2m + type: c0 + same horizontal convolution: true + io: + data directory: ./berror + files prefix: smc_bump +#_nicas.nc #_{{ soil_background_time_fv3 }} +# saber block name: ID +saber outer blocks: +- saber block name: BUMP_StdDev + read: + drivers: + compute variance: true + variance: + explicit stddev: true + stddev: + - variables: + - soilMoistureVolumetric + value: 0.05 + - variables: + - slc + value: 0.05 + - variables: + - stc + value: 2.0 + - variables: + - air_temperature_at_2m + value: 2.0 + - variables: + - specfic_humidity_at_2m + value: 0.1 diff --git a/parm/jcb-gdas/model/soil/soil_background_error_static_soill1.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_error_static_soill1.yaml.j2 new file mode 100644 index 000000000..3a9fc043a --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_background_error_static_soill1.yaml.j2 @@ -0,0 +1,75 @@ +covariance model: SABER +saber central block: + saber block name: BUMP_NICAS + read: + general: + universe length-scale: 250000.0 + drivers: + multivariate strategy: univariate + #compute nicas: true + read global nicas: true + #write global nicas: true + nicas: + resolution: 6 + max horizontal grid size: 250000 + explicit length-scales: true + horizontal length-scale: + - groups: + - soill1_shadowLevels + - soill2_shadowLevels + - soilt1_shadowLevels + - soilt2_shadowLevels + value: 250000. + vertical length-scale: + - groups: + - soill1_shadowLevels + - soill2_shadowLevels + - soilt1_shadowLevels + - soilt2_shadowLevels + value: 0.0 + interpolation type: + - groups: + - soill1_shadowLevels + - soill2_shadowLevels + - soilt1_shadowLevels + - soilt2_shadowLevels + type: c0 + same horizontal convolution: true + io: + data directory: ./berror + files prefix: smc_bump +saber outer blocks: +- saber block name: ShadowLevels + fields metadata: + soill1: + vert_coord: filtered_orography + soill2: + vert_coord: filtered_orography + soilt1: + vert_coord: filtered_orography + soilt2: + vert_coord: filtered_orography + calibration: + number of shadow levels: 50 + lowest shadow level: -450.0 + highest shadow level: 8850.0 + vertical length-scale: 700.0 +- saber block name: BUMP_StdDev + read: + drivers: + compute variance: true + variance: + explicit stddev: true + stddev: + - variables: + - soill1 + value: 0.05 + - variables: + - soill2 + value: 0.05 + - variables: + - soilt1 + value: 2.0 + - variables: + - soilt2 + value: 2.0 diff --git a/parm/jcb-gdas/model/soil/soil_background_fv3.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_fv3.yaml.j2 new file mode 100644 index 000000000..6a5b14614 --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_background_fv3.yaml.j2 @@ -0,0 +1,28 @@ +datapath: {{ soil_background_path }} +filetype: fms restart +skip coupler file: true +datetime: '{{ soil_background_time_iso }}' +state variables: +- soilMoistureVolumetric +- slc +- stc +- totalSnowDepth +- sheleg +- vtype +- slmsk +- filtered_orography +- fraction_of_ice +- fraction_of_land +- air_temperature_at_2m +- specfic_humidity_at_2m +field io names: + soilMoistureVolumetric: smc + totalSnowDepth: snodl + filtered_orography: orog_filt + fraction_of_ice: fice + fraction_of_land: land_frac + air_temperature_at_2m: t2m + specfic_humidity_at_2m: q2m +filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' +filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' +filename_orog: '{{ soil_orog_prefix }}_oro_data.nc' diff --git a/parm/jcb-gdas/model/soil/soil_ensemble_increments_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_ensemble_increments_csg.yaml.j2 new file mode 100644 index 000000000..ec76f92b0 --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_ensemble_increments_csg.yaml.j2 @@ -0,0 +1 @@ +{% include 'soil_ensemble_output_csg_common.yaml.j2' %} diff --git a/parm/jcb-gdas/model/soil/soil_ensemble_output_csg_common.yaml.j2 b/parm/jcb-gdas/model/soil/soil_ensemble_output_csg_common.yaml.j2 new file mode 100644 index 000000000..ff1063bf7 --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_ensemble_output_csg_common.yaml.j2 @@ -0,0 +1,31 @@ +datapath: ./anl/mem%{member}% +filetype: cube sphere history +provider: ufs +filename: soilinc_{{ soil_variational_history_prefix }}csg_sfc.f006.nc +state variables: +- soill1 +- soill2 +- soill3 +- soilt1 +- soilt2 +- soilt3 +- air_temperature_at_2m +- specfic_humidity_at_2m +- sheleg +- vtype +- slmsk +#- stype +#- vfrac +#- geopotential_height_at_surface +#- skin_temperature_at_surface +#filtered_orography +field io names: + #filtered_orography: orog_filt + air_temperature_at_2m: tmp2m + specfic_humidity_at_2m: spfh2m + slmsk: land + sheleg: weasd + #geopotential_height_at_surface: hgtsfc + #skin_temperature_at_surface: tmpsfc + #stype: sotyp + #vfrac: veg diff --git a/parm/jcb-gdas/model/soil/soil_final_increment_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_final_increment_csg.yaml.j2 new file mode 100644 index 000000000..11265fb14 --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_final_increment_csg.yaml.j2 @@ -0,0 +1,34 @@ +output: + state component: + datapath: ./anl + state variables: + - soilMoistureVolumetric + - slc + - stc + - totalSnowDepth + - sheleg + - vtype + - slmsk + field io names: + soilMoistureVolumetric: smc + totalSnowDepth: snodl +# prefix: soilinc + filetype: cube sphere history + provider: ufs +# ufs soil nlev: 4 +# ufs fields split by level: +# - smc +# - stc + filename: soilinc_{{ soil_variational_history_prefix }}csg_sfc.f006.nc + +geometry: + fms initialization: + namelist filename: "{{ soil_fv3jedi_files_path }}/fmsmpp.nml" + field table filename: "{{ soil_fv3jedi_files_path }}/field_table" + akbk: "{{ soil_fv3jedi_files_path }}/akbk.nc4" + layout: + - {{ soil_layout_x }} + - {{ soil_layout_y }} + npx: {{ soil_npx_ges }} + npy: {{ soil_npy_ges }} + npz: {{ soil_npz_ges }} diff --git a/parm/jcb-gdas/model/soil/soil_final_increment_fms.yaml.j2 b/parm/jcb-gdas/model/soil/soil_final_increment_fms.yaml.j2 index b9e77faed..3ecd58f47 100644 --- a/parm/jcb-gdas/model/soil/soil_final_increment_fms.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_final_increment_fms.yaml.j2 @@ -1,10 +1,6 @@ output: state component: datapath: ./anl - prefix: soilinc - filetype: fms restart - filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' - filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' state variables: - soilMoistureVolumetric - slc @@ -16,6 +12,11 @@ output: field io names: soilMoistureVolumetric: smc totalSnowDepth: snodl + prefix: soilinc + filetype: fms restart + filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' + filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' + geometry: fms initialization: namelist filename: "{{ soil_fv3jedi_files_path }}/fmsmpp.nml" diff --git a/parm/jcb-gdas/model/soil/soil_output_increment_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_increment_csg.yaml.j2 new file mode 100644 index 000000000..6f6982a20 --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_output_increment_csg.yaml.j2 @@ -0,0 +1,2 @@ +prefix: soilinc_ensmean +{% include 'soil_ensemble_output_csg_common.yaml.j2' %} diff --git a/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 b/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 index c5d190476..0f863bc74 100644 --- a/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 +++ b/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 @@ -13,18 +13,35 @@ engine: type: H5File obsfile: "{{soil_obsdatain_path}}/{{soil_obsdatain_prefix}}{{observation_from_jcb}}.nc" - missing file action: warn +# - "{{soil_obsdatain_path}}/{{soil_obsdatain_prefix}}h-12.{{observation_from_jcb}}.nc" +# - "{{soil_obsdatain_path}}/{{soil_obsdatain_prefix}}h-6.{{observation_from_jcb}}.nc" +# - "{{soil_obsdatain_path}}/{{soil_obsdatain_prefix}}h0.{{observation_from_jcb}}.nc" +# - "{{soil_obsdatain_path}}/{{soil_obsdatain_prefix}}h6.{{observation_from_jcb}}.nc" +# - "{{soil_obsdatain_path}}/{{soil_obsdatain_prefix}}h12.{{observation_from_jcb}}.nc" +# missing file action: warn +# obsgrouping: +# group variables: +# - stationIdentification obsdataout: + write multiple files: false engine: type: H5File obsfile: "{{soil_obsdataout_path}}/{{soil_obsdataout_prefix}}{{observation_from_jcb}}{{soil_obsdataout_suffix}}" - simulated variables: [soilMoistureVolumetric] + allow overwrite: true + io pool: + max pool size: 1 +# observed variables: +# - soill1 + simulated variables: + - soill1 # # Observation Operator # -------------------- obs operator: name: Identity +# linear obs operator: +# name: Identity # # localization TODO: generalize this condioned on da algo @@ -56,8 +73,8 @@ initial value: false - name: landice_check initial value: false - - name: seaice_check - initial value: false +# - name: seaice_check +# initial value: false - name: snow_check initial value: false - name: retrv_qual_check @@ -72,14 +89,14 @@ initial value: false - filter: Perform Action filter variables: - - name: soilMoistureVolumetric + - name: soill1 action: name: assign error error parameter: 0.04 - filter: Domain Check where: - variable: - name: ObsValue/soilMoistureVolumetric + name: ObsValue/soill1 value: is_valid actions: - name: set @@ -99,7 +116,7 @@ obs prior filters: - filter: Bounds Check filter variables: - - name: soilMoistureVolumetric + - name: soill1 minvalue: 0.0 maxvalue: 1.0 actions: @@ -107,16 +124,16 @@ flag: invalid_smc ignore: rejected observations - name: reject - - filter: Domain Check # land only - where: - - variable: - name: GeoVaLs/fraction_of_land - minvalue: 0.5 - actions: - - name: set - flag: land_check - ignore: rejected observations - - name: reject +# - filter: Domain Check # land only +# where: +# - variable: +# name: GeoVaLs/fraction_of_land +# minvalue: 0.5 +# actions: +# - name: set +# flag: land_check +# ignore: rejected observations +# - name: reject # - filter: Domain Check # where: # - variable: @@ -128,16 +145,16 @@ # flag: invalid_elevation # ignore: rejected observations # - name: reject - - filter: Domain Check # land only, no sea ice - where: - - variable: - name: GeoVaLs/fraction_of_ice - maxvalue: 0.0 - actions: - - name: set - flag: seaice_check - ignore: rejected observations - - name: reject +# - filter: Domain Check # land only, no sea ice +# where: +# - variable: +# name: GeoVaLs/fraction_of_ice +# maxvalue: 0.0 +# actions: +# - name: set +# flag: seaice_check +# ignore: rejected observations +# - name: reject - filter: Domain Check # no snow where: - variable: @@ -151,7 +168,7 @@ - filter: Domain Check # high-quality retrievals where: - variable: - name: PreQC/soilMoistureVolumetric + name: PreQC/soill1 is_in: 0, 8 actions: - name: set @@ -169,17 +186,17 @@ flag: landice_check ignore: rejected observations - name: reject - - filter: RejectList # exclude certain IGBP vegetation types - where: - - variable: - name: GeoVaLs/vtype - absolute_tolerance: 1.0e-3 - is_close_to_any_of: [1, 2, 3, 4, 13, 15, 17] - actions: - - name: set - flag: vegtype_check - ignore: rejected observations - - name: reject +# - filter: RejectList # exclude certain IGBP vegetation types +# where: +# - variable: +# name: GeoVaLs/vtype +# absolute_tolerance: 1.0e-3 +# is_close_to_any_of: [1, 2, 3, 4, 13, 15, 17] +# actions: +# - name: set +# flag: vegtype_check +# ignore: rejected observations +# - name: reject # - filter: Difference Check # elevation check # reference: MetaData/stationElevation # value: GeoVaLs/filtered_orography @@ -204,9 +221,9 @@ - filter: Bounds Check udescriptor: "bounds_check_ObsError" filter variables: - - name: soilMoistureVolumetric + - name: soill1 test variables: - - name: ObsErrorData/soilMoistureVolumetric + - name: ObsErrorData/soill1 minvalue: 0.0 maxvalue: 0.2 action: @@ -216,7 +233,9 @@ - filter: Bounds Check udescriptor: "bounds_check_ObsValue" filter variables: - - name: soilMoistureVolumetric + - name: soill1 + test variables: + - name: ObsValue/soill1 minvalue: 0.02 maxvalue: 0.5 action: @@ -224,7 +243,7 @@ - filter: Background Check # gross error check filter variables: - - name: soilMoistureVolumetric + - name: soill1 #threshold: 5 absolute threshold: 0.5 bias correction parameter: 1.0 diff --git a/parm/jcb-gdas/observations/soil/smap_soil_smc.yaml.j2 b/parm/jcb-gdas/observations/soil/smap_soil_smc.yaml.j2 new file mode 100644 index 000000000..949c5a75d --- /dev/null +++ b/parm/jcb-gdas/observations/soil/smap_soil_smc.yaml.j2 @@ -0,0 +1,238 @@ +- + + # Observation Space (I/O) + # ----------------------- + obs space: + name: {{observation_from_jcb}} +{% if algorithm == "local_ensemble_da" %} + distribution: + name: {{distribution_type}} + halo size: "{{halo_size}}" +{% endif %} + obsdatain: + engine: + type: H5File + obsfile: "{{soil_obsdatain_path}}/{{soil_obsdatain_prefix}}{{observation_from_jcb}}.nc" + #missing file action: warn + obsdataout: + engine: + type: H5File + obsfile: "{{soil_obsdataout_path}}/{{soil_obsdataout_prefix}}{{observation_from_jcb}}{{soil_obsdataout_suffix}}" + simulated variables: [soilMoistureVolumetric] + # + + # Observation Operator + # -------------------- + obs operator: + name: Identity + # + linear obs operator: + name: Identity + + # localization TODO: generalize this condioned on da algo + # ------------ +{% if algorithm == "local_ensemble_da" %} + obs localizations: + - localization method: {{localization_method}} + lengthscale: {{loc_length_scale}} + max nobs: {{max_nobs}} +{% endif %} + + obs error: + covariance model: diagonal + + # Observation Filters (QC) + # ------------------------ + obs pre filters: + - filter: Create Diagnostic Flags + flags: + - name: missing_smc + initial value: false +# - name: missing_elevation +# initial value: false + - name: invalid_smc + initial value: false +# - name: invalid_elevation +# initial value: false + - name: land_check + initial value: false + - name: landice_check + initial value: false + - name: seaice_check + initial value: false + - name: snow_check + initial value: false + - name: retrv_qual_check + initial value: false + - name: vegtype_check + initial value: false + - name: elevation_bkgdiff + initial value: false +# - name: rejectlist +# initial value: false + - name: background_check + initial value: false + - filter: Perform Action + filter variables: + - name: soilMoistureVolumetric + action: + name: assign error + error parameter: 0.1 + - filter: Domain Check + where: + - variable: + name: ObsValue/soilMoistureVolumetric + value: is_valid + actions: + - name: set + flag: missing_smc + ignore: rejected observations + - name: reject +# - filter: Domain Check +# where: +# - variable: +# name: MetaData/stationElevation +# value: is_valid +# actions: +# - name: set +# flag: missing_elevation +# ignore: rejected observations +# - name: reject + obs prior filters: + - filter: Bounds Check + filter variables: + - name: soilMoistureVolumetric + minvalue: 0.0 + maxvalue: 1.0 + actions: + - name: set + flag: invalid_smc + ignore: rejected observations + - name: reject + - filter: Domain Check # land only + where: + - variable: + name: GeoVaLs/fraction_of_land + minvalue: 0.5 + actions: + - name: set + flag: land_check + ignore: rejected observations + - name: reject +# - filter: Domain Check +# where: +# - variable: +# name: MetaData/stationElevation +# minvalue: -200.0 +# maxvalue: 9000.0 +# actions: +# - name: set +# flag: invalid_elevation +# ignore: rejected observations +# - name: reject + - filter: Domain Check # land only, no sea ice + where: + - variable: + name: GeoVaLs/fraction_of_ice + maxvalue: 0.0 + actions: + - name: set + flag: seaice_check + ignore: rejected observations + - name: reject + - filter: Domain Check # no snow + where: + - variable: + name: GeoVaLs/sheleg + maxvalue: 0.0 + actions: + - name: set + flag: snow_check + ignore: rejected observations + - name: reject + - filter: Domain Check # high-quality retrievals + where: + - variable: + name: PreQC/soilMoistureVolumetric + is_in: 0, 8 + actions: + - name: set + flag: retrv_qual_check + ignore: rejected observations + - name: reject + - filter: RejectList # no land-ice + where: + - variable: + name: GeoVaLs/vtype + minvalue: 14.5 + maxvalue: 15.5 + actions: + - name: set + flag: landice_check + ignore: rejected observations + - name: reject +# - filter: RejectList # exclude certain IGBP vegetation types +# where: +# - variable: +# name: GeoVaLs/vtype +# absolute_tolerance: 1.0e-3 +# is_close_to_any_of: [1, 2, 3, 4, 13, 15, 17] +# actions: +# - name: set +# flag: vegtype_check +# ignore: rejected observations +# - name: reject + +# - filter: Difference Check # elevation check +# reference: MetaData/stationElevation +# value: GeoVaLs/filtered_orography +# threshold: 800. +# actions: +# - name: set +# flag: elevation_bkgdiff +# ignore: rejected observations +# - name: reject +# - filter: BlackList +# where: +# - variable: +# name: MetaData/stationIdentification +# is_in: {{ get_conventional_rejected_stations(observation_from_jcb) }} +# actions: +# - name: set +# flag: rejectlist +# ignore: rejected observations +# - name: reject + obs post filters: + # Bounds Check (ObsError) + - filter: Bounds Check + udescriptor: "bounds_check_ObsError" + filter variables: + - name: soilMoistureVolumetric + test variables: + - name: ObsErrorData/soilMoistureVolumetric + minvalue: 0.0 + maxvalue: 0.2 + action: + name: reject + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: soilMoistureVolumetric + minvalue: 0.02 + maxvalue: 0.5 + action: + name: reject + + - filter: Background Check # gross error check + filter variables: + - name: soilMoistureVolumetric + #threshold: 5 + absolute threshold: 0.5 + bias correction parameter: 1.0 + actions: + - name: set + flag: background_check + ignore: rejected observations + - name: reject diff --git a/parm/soil/apply_incr_nml.j2 b/parm/soil/apply_incr_nml.j2 index ac7b00d94..5273c9f10 100644 --- a/parm/soil/apply_incr_nml.j2 +++ b/parm/soil/apply_incr_nml.j2 @@ -13,6 +13,7 @@ upd_slc={{ upd_slc }}, print_summary=.true., print_debug={{ print_debug }} , - lsoil_incr = {{ LSOIL_INCR }}, - inc_prefix = "{{ INC_PREFIX }}" + lsoil_incr = {{ lsoil_incr }}, + inc_prefix = "{{ inc_prefix }}", + csg_increment = {{ csg_increment }} / diff --git a/parm/soil/jcb-base.yaml.j2 b/parm/soil/jcb-base.yaml.j2 index d74d386b9..61df9ebb7 100644 --- a/parm/soil/jcb-base.yaml.j2 +++ b/parm/soil/jcb-base.yaml.j2 @@ -10,11 +10,11 @@ app_path_observation_chronicle: "{{PARMgdas}}/jcb-gdas/observation_chronicle/soi # ------------------------------------------------------------ model_file: model_pseudo initial_condition_file: background # Initial conditions for 4D apps is background -final_increment_file: soil_final_increment_fms +final_increment_file: soil_final_increment_csg output_mean_prior_file: soil_output_mean_prior_fms posterior_output_file: soil_posterior_output_fms -output_ensemble_increments_file: soil_ensemble_increments_fms -output_increment_file: soil_output_increment_fms +output_ensemble_increments_file: soil_ensemble_increments_csg +output_increment_file: soil_output_increment_csg output_variance_prior_file: soil_output_variance_prior_fms output_variance_posterior_file: soil_output_variance_posterior_fms #jedi_increment_output: gaussian @@ -37,7 +37,8 @@ soil_increment_time_fv3: "{{ bkg_time_fv3 }}" # Analysis standard things # ------------------------ -analysis_variables: [soilMoistureVolumetric, slc, stc, air_temperature_at_2m, specfic_humidity_at_2m] +analysis_variables: [soill1, soill2, soilt1, soilt2] +#soilMoistureVolumetric, slc, stc, air_temperature_at_2m] minimizer: DRPCG final_diagnostics_departures: anlmob final_prints_frequency: PT3H @@ -65,11 +66,13 @@ soil_orog_prefix: "{{ CASE }}.mx{{ OCNRES }}" # Background soil_background_path: {{ soil_bkg_path }} soil_background_ensemble_path: ./bkg/mem%mem% +background_file: soil_background # Background error soil_bump_data_directory: "{{ DATA }}/berror" soil_background_error_file: "{{BERROR_YAML}}" +background_error_file: "{{BERROR_YAML}}" # Forecasting soil_forecast_length: "{{ SNOW_WINDOW_LENGTH }}" @@ -178,7 +181,8 @@ soil_analysis_ensemble_path: ./anl/mem%mem% # ------------------------- local_ensemble_da_solver: Deterministic LETKF #GETKF -increment_variables: [soilMoistureVolumetric,slc,stc,air_temperature_at_2m,specfic_humidity_at_2m] #, smc, sphum] +increment_variables: [soill1, soill2, soilt1, soilt2, air_temperature_at_2m, specfic_humidity_at_2m] +#soilMoistureVolumetric,slc,stc,air_temperature_at_2m,specfic_humidity_at_2m] #, smc, sphum] #[ua,va,DZ,delp,t,ps,sphum,ice_wat,liq_wat,o3mr] # Veritcal localization for GETKF @@ -191,13 +195,13 @@ inflation_mult: 1.0 # Driver driver_update_obs_config_with_geometry_info: true -driver_save_posterior_mean: true -driver_save_posterior_ensemble: true +driver_save_posterior_mean: false #true +driver_save_posterior_ensemble: false #true driver_save_posterior_mean_increment: true driver_save_posterior_ensemble_increments: true -driver_save_prior_variance: true -driver_save_posterior_variance: true -driver_save_prior_mean: true #(default false) +driver_save_prior_variance: false #true +driver_save_posterior_variance: false #true +driver_save_prior_mean: false #true #(default false) driver_do_test_prints: false #(default true) #default driver_do_posterior_observer: true #default driver_use_control_member: false diff --git a/parm/soil/soil_det_config.yaml.j2 b/parm/soil/soil_det_config.yaml.j2 index 744f9c627..b8b519d69 100644 --- a/parm/soil/soil_det_config.yaml.j2 +++ b/parm/soil/soil_det_config.yaml.j2 @@ -31,6 +31,7 @@ data_in: - ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/bkg/'] - ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/bkg/'] - ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/bkg/'] + - ['{{ COMIN_ATMOS_HISTORY_PREV }}/{{ GPREFIX }}csg_sfc.f006.nc', '{{ DATA }}/bkg/'] - ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile1.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile1.nc" ] - ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile2.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile2.nc" ] @@ -44,32 +45,30 @@ data_in: {% include 'soil_stage_berror.yaml.j2' %} {% endfilter %} + copy_opt: + - ['{{ COMIN_ATMOS_HISTORY_PREV }}/{{ GPREFIX }}csg_atm.f006.nc', '{{ DATA }}/bkg/{{ GPREFIX }}csg_atm.f006.nc'] + - ['{{ COMIN_ATMOS_HISTORY_PREV }}/{{ GPREFIX }}csg_sfc.f006.nc', '{{ DATA }}/bkg/{{ GPREFIX }}csg_sfc.f006.nc'] + + - ['{{ COMIN_OBS }}/{{ OPREFIX }}h-12.smap_soil.nc', '{{ DATA }}/obs'] + - ['{{ COMIN_OBS }}/{{ OPREFIX }}h-6.smap_soil.nc', '{{ DATA }}/obs'] + - ['{{ COMIN_OBS }}/{{ OPREFIX }}h0.smap_soil.nc', '{{ DATA }}/obs'] + - ['{{ COMIN_OBS }}/{{ OPREFIX }}h6.smap_soil.nc', '{{ DATA }}/obs'] + - ['{{ COMIN_OBS }}/{{ OPREFIX }}h12.smap_soil.nc', '{{ DATA }}/obs'] + data_out: + copy_req: # Configuration files - ['{{ DATA }}/soilanlvar.yaml', '{{ COMOUT_CONF }}/{{ APREFIX }}soilanlvar.yaml'] - ['{{ DATA }}/soilanladdinc.yaml', '{{ COMOUT_CONF }}/{{ APREFIX }}soilanladdinc.yaml'] - ['{{ DATA }}/soil_obs_list.yaml.j2', '{{ COMOUT_CONF }}/{{ APREFIX }}soil_obs_list.yaml.j2'] - # Increments - - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile1.nc'] - - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile2.nc'] - - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile3.nc'] - - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile4.nc'] - - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile5.nc'] - - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile6.nc'] - {% if DOIAU %} {% set bkgtimes = [ current_cycle, WINDOW_BEGIN ] %} {% else %} {% set bkgtimes = [ current_cycle ] %} {% endif %} + {% for bkgtime in bkgtimes %} # Analysis = bkg + inc - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc', @@ -84,7 +83,17 @@ data_out: '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc'] - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc'] + + # Analysis = bkg + inc required for tile-to-vector + - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc', '{{ COMIN_ATMOS_RESTART }}'] + - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc', '{{ COMIN_ATMOS_RESTART }}'] + - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc', '{{ COMIN_ATMOS_RESTART }}'] + - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc', '{{ COMIN_ATMOS_RESTART }}'] + - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc', '{{ COMIN_ATMOS_RESTART }}'] + - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', '{{ COMIN_ATMOS_RESTART }}'] + {% endfor %} + {% if DO_FINAL_SOILANL %} {% for bkgtime in bkgtimes %} # Final 3DVar Analysis @@ -102,3 +111,21 @@ data_out: '{{ COMOUT_SOIL_ANALYSIS }}/{{ bkgtime | to_fv3time }}.sfcanl_data.tile6.nc'] {% endfor %} {% endif %} + + copy_opt: + # Increments TODO: make this _req once options between csg and fv3 well handled + - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile1.nc'] + - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile2.nc'] + - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile3.nc'] + - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile4.nc'] + - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile5.nc'] + - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile6.nc'] + + - ['{{ DATA }}/anl/soilinc_{{ GPREFIX }}csg_sfc.f006.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.csg_sfc.nc'] diff --git a/parm/soil/soil_letkf_config.yaml.j2 b/parm/soil/soil_letkf_config.yaml.j2 index 4cfc8e3a8..86d86fcd7 100644 --- a/parm/soil/soil_letkf_config.yaml.j2 +++ b/parm/soil/soil_letkf_config.yaml.j2 @@ -71,6 +71,10 @@ data_in: - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ GPREFIX }}csg_sfc.f006.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ GPREFIX }}csg_sfc.f006.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + {% if DOIAU %} # if using IAU, also need backgrounds copied at the beginning of the window ##TODO: for soil IAU copy the actual restarts at the three time steps @@ -87,6 +91,10 @@ data_in: - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] +#TODO: add time info/prefix for iau in csg + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ GPREFIX }}csg_sfc.f006.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ GPREFIX }}csg_sfc.f006.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + {% endif %} {% endfor %} @@ -147,6 +155,17 @@ data_in: # {% endfilter %} +# copy_opt: +## - ['{{ COMIN_ATMOS_HISTORY_PREV }}/{{ GPREFIX }}csg_atm.f006.nc', '{{ DATA }}/bkg/{{ GPREFIX }}csg_atm.f006.nc'] +## - ['{{ COMIN_ATMOS_HISTORY_PREV }}/{{ GPREFIX }}csg_sfc.f006.nc', '{{ DATA }}/bkg/{{ GPREFIX }}csg_sfc.f006.nc'] +# +# - ['{{ COMIN_OBS }}/{{ OPREFIX }}h-12.smap_soil.nc', '{{ DATA }}/obs'] +# - ['{{ COMIN_OBS }}/{{ OPREFIX }}h-6.smap_soil.nc', '{{ DATA }}/obs'] +# - ['{{ COMIN_OBS }}/{{ OPREFIX }}h0.smap_soil.nc', '{{ DATA }}/obs'] +# - ['{{ COMIN_OBS }}/{{ OPREFIX }}h6.smap_soil.nc', '{{ DATA }}/obs'] +# - ['{{ COMIN_OBS }}/{{ OPREFIX }}h12.smap_soil.nc', '{{ DATA }}/obs'] + + data_out: copy_req: # Configuration files @@ -175,21 +194,21 @@ data_out: '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc'] - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc'] -# As bkg for next timestep - - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc'] - +# bkg + inc required as bkg for next timestep + - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc', '{{ COMIN_ATMOS_RESTART }}/{{ memchar }}/'] + - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc', '{{ COMIN_ATMOS_RESTART }}/{{ memchar }}/'] + - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc', '{{ COMIN_ATMOS_RESTART }}/{{ memchar }}/'] + - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc', '{{ COMIN_ATMOS_RESTART }}/{{ memchar }}/'] + - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc', '{{ COMIN_ATMOS_RESTART }}/{{ memchar }}/'] + - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', '{{ COMIN_ATMOS_RESTART }}/{{ memchar }}/'] + {% endfor %} +{% endfor %} + copy_opt: + # Increments TODO: make this _req once options between csg and fv3 well handled +{% for bkgtime in bkgtimes %} + {% for imem in range(1, NMEM_ENS+1) %} + {% set memchar = 'mem%03d' | format(imem) %} # Increments - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc', '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile1.nc'] @@ -204,5 +223,8 @@ data_out: - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile6.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/soilinc_{{ GPREFIX }}csg_sfc.f006.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ current_cycle | to_fv3time }}.soil_increment.csg_sfc.nc'] + {% endfor %} {% endfor %} diff --git a/parm/soil/soil_stage_berror.yaml.j2 b/parm/soil/soil_stage_berror.yaml.j2 index 2ff7f3740..d4075bf2b 100644 --- a/parm/soil/soil_stage_berror.yaml.j2 +++ b/parm/soil/soil_stage_berror.yaml.j2 @@ -1 +1 @@ -- ['{{ BCOV_DIR }}/smc_bump_nicas_1000km.nc', '{{ DATA }}/berror'] +- ['{{ BCOV_DIR }}/{{ BCOV_FNAME }}', '{{ DATA }}/berror/smc_bump_nicas.nc'] From 70d403783c5a106e801f85a818d42dcc4924fcc1 Mon Sep 17 00:00:00 2001 From: tsga Date: Thu, 18 Jun 2026 13:22:06 +0000 Subject: [PATCH 39/98] revert snow anl copy --- parm/snow/snow_det_config.yaml.j2 | 1 + 1 file changed, 1 insertion(+) diff --git a/parm/snow/snow_det_config.yaml.j2 b/parm/snow/snow_det_config.yaml.j2 index 9db1ccac4..bf1df6480 100644 --- a/parm/snow/snow_det_config.yaml.j2 +++ b/parm/snow/snow_det_config.yaml.j2 @@ -91,4 +91,5 @@ data_out: '{{ COMOUT_SNOW_ANALYSIS }}/{{ bkgtime | to_fv3time }}.snow_analysis.sfc_data.tile5.nc'] - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', '{{ COMOUT_SNOW_ANALYSIS }}/{{ bkgtime | to_fv3time }}.snow_analysis.sfc_data.tile6.nc'] + {% endfor %} From 76dc637099e41851ebbca44a408fcaf534cb3ce2 Mon Sep 17 00:00:00 2001 From: tsga Date: Thu, 18 Jun 2026 13:46:59 +0000 Subject: [PATCH 40/98] temp submodule links --- .gitmodules | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index 3ba84633a..cc3d80a81 100644 --- a/.gitmodules +++ b/.gitmodules @@ -36,7 +36,7 @@ [submodule "sorc/fv3-jedi"] path = sorc/fv3-jedi url = https://github.com/tsga/fv3-jedi #https://github.com/jcsda/fv3-jedi.git - branch = landsfc #develop + branch = soil_csg #develop [submodule "sorc/soca"] path = sorc/soca url = https://github.com/NOAA-EMC/soca.git @@ -44,7 +44,7 @@ [submodule "sorc/land-jediincr"] path = sorc/land-jediincr url = https://github.com/tsga/land-apply_jedi_incr #https://github.com/NOAA-EMC/land-apply_jedi_incr.git - branch = tq2m #develop + branch = soilinc #develop [submodule "sorc/crtm"] path = sorc/crtm url = https://github.com/jcsda/crtm.git From 317da407fbdf81eaa69e13e21eb80c32f5adb2ac Mon Sep 17 00:00:00 2001 From: tsga Date: Thu, 18 Jun 2026 14:32:18 +0000 Subject: [PATCH 41/98] add land_inc soil changes --- sorc/land-jediincr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sorc/land-jediincr b/sorc/land-jediincr index 543ba6fb8..a77143689 160000 --- a/sorc/land-jediincr +++ b/sorc/land-jediincr @@ -1 +1 @@ -Subproject commit 543ba6fb8b950f7f4a3f814cf32704c49196f7c6 +Subproject commit a77143689858177fded20d269b5be9f78156cfae From af73dcb06545631d04ac2e9cb2fca3b61b3d2732 Mon Sep 17 00:00:00 2001 From: tsga Date: Thu, 18 Jun 2026 15:21:50 +0000 Subject: [PATCH 42/98] restore atm obslist and jcb-base --- parm/atm/atm_obs_list.yaml.j2 | 14 ++++++++------ parm/atm/jcb-base.yaml.j2 | 16 +--------------- 2 files changed, 9 insertions(+), 21 deletions(-) diff --git a/parm/atm/atm_obs_list.yaml.j2 b/parm/atm/atm_obs_list.yaml.j2 index 5cd4977df..e776bd59e 100644 --- a/parm/atm/atm_obs_list.yaml.j2 +++ b/parm/atm/atm_obs_list.yaml.j2 @@ -1,13 +1,12 @@ observations: -- adpsfc_airTemperature_181_gsi -#aircraft_humidity +#- aircraft_humidity #- aircraft_temperature #- aircraft_wind #- snowcvr #- abi_g16 -##- prepbufr_adpsfc -##- prepbufr_adpupa -##- prepbufr_sfcshp +- prepbufr_adpsfc +- prepbufr_adpupa +- prepbufr_sfcshp ##- scatwnd.ascat_metop-b ##- scatwnd.ascat_metop-c ##- satwnd.abi_goes-16 @@ -31,7 +30,10 @@ observations: ##- cris-fsr_n20 ##- cris-fsr_n21 ##- atms_npp -##- radiance_atms_n20 +- radiance_atms_n20 +##- radiance_mhs_metop-b +##- radiance_mhs_metop-c +##- radiance_mhs_n19 ##- gnssro_cosmic2 ##- gnssro_spire ##- gnssro_s6 diff --git a/parm/atm/jcb-base.yaml.j2 b/parm/atm/jcb-base.yaml.j2 index 6db33a042..d09aa9b85 100644 --- a/parm/atm/jcb-base.yaml.j2 +++ b/parm/atm/jcb-base.yaml.j2 @@ -82,19 +82,6 @@ atmosphere_iau_times_iso: {{ iau_times_iso }} # ------------------ observations: all_observations -#From Cory: https://docs.google.com/document/d/1CNfOZ7UzAOrVEXNyxeHAKafjjZp7WeBn-F07itWo6eE/ -#replace QC filters with a blanket configuration...to get listed obs' QC decisions from GSI: -replace_obs_filters: - observations: - - adpsfc_air_temperature_at_2m_181_gsi - override_filters: #only assimilate when GsiEffectiveQCAnl is 0 - - filter: PreQC - inputQC: 'GsiEffectiveQCAnl' - maxvalue: 0.0 - action: - name: reject - - crtm_coefficient_path: "{{ DATA }}/crtm/" # Naming conventions for observational files @@ -140,8 +127,7 @@ bias_files_dict: # ------------------------- local_ensemble_da_solver: Deterministic GETKF -increment_variables: [air_temperature] -#[eastward_wind,northward_wind,layer_thickness,air_pressure_thickness,air_temperature,air_pressure_at_surface,water_vapor_mixing_ratio_wrt_moist_air,cloud_liquid_ice,cloud_liquid_water,snow_water,rain_water,graupel,ozone_mass_mixing_ratio] +increment_variables: [eastward_wind,northward_wind,layer_thickness,air_pressure_thickness,air_temperature,air_pressure_at_surface,water_vapor_mixing_ratio_wrt_moist_air,cloud_liquid_ice,cloud_liquid_water,snow_water,rain_water,graupel,ozone_mass_mixing_ratio] atm_enkfonly: {{ DOENKFONLY_ATM | default(false, true) }} From fc74386542afa140dde64d4d9dac2fa90588e701 Mon Sep 17 00:00:00 2001 From: tsga Date: Thu, 18 Jun 2026 16:10:28 +0000 Subject: [PATCH 43/98] remove old field metada file --- .../jcb-gdas/algorithm/soil/gfs_v17-land.yaml | 37 ------------------- .../algorithm/soil/soil_addincrement.yaml.j2 | 2 - 2 files changed, 39 deletions(-) delete mode 100644 parm/jcb-gdas/algorithm/soil/gfs_v17-land.yaml diff --git a/parm/jcb-gdas/algorithm/soil/gfs_v17-land.yaml b/parm/jcb-gdas/algorithm/soil/gfs_v17-land.yaml deleted file mode 100644 index 6ddb9bc3d..000000000 --- a/parm/jcb-gdas/algorithm/soil/gfs_v17-land.yaml +++ /dev/null @@ -1,37 +0,0 @@ -field metadata: - -- long name: weasdl - io file: surface - -- long name: snwdph - io file: surface - -- long name: q2m - io file: surface - io name: q2m - -- long name: slc - io file: surface - io name: slc - -- long name: snowxy - io file: surface - -- long name: sneqvoxy - io file: surface - io name: sneqvoxy - -- long name: zsnsoxy - io file: surface - -- long name: tsnoxy - io file: surface - -- long name: snicexy - io file: surface - -- long name: snliqxy - io file: surface - -- long name: tgxy - io file: surface diff --git a/parm/jcb-gdas/algorithm/soil/soil_addincrement.yaml.j2 b/parm/jcb-gdas/algorithm/soil/soil_addincrement.yaml.j2 index f69637337..a50dc8614 100644 --- a/parm/jcb-gdas/algorithm/soil/soil_addincrement.yaml.j2 +++ b/parm/jcb-gdas/algorithm/soil/soil_addincrement.yaml.j2 @@ -9,7 +9,6 @@ state geometry: npx: {{ soil_npx_ges }} npy: {{ soil_npy_ges }} npz: {{ soil_npz_ges }} - #field metadata override: ./fv3jedi/gfs_v17-land.yaml increment geometry: fms initialization: namelist filename: ./fv3jedi/fmsmpp.nml @@ -21,7 +20,6 @@ increment geometry: npx: {{ soil_npx_anl }} npy: {{ soil_npy_anl }} npz: {{ soil_npz_anl }} -# field metadata override: ./fv3jedi/fv3jedi_fieldmetadata_fv3inc.yaml state: datapath: ./bkg filetype: fms restart From 644b77a5c0b27f9c38205dac045704140eab6d6e Mon Sep 17 00:00:00 2001 From: tsga Date: Thu, 18 Jun 2026 17:49:30 +0000 Subject: [PATCH 44/98] remove non-essential soil configs --- .../soil/soil_fv3jedi_fv3inc_lgetkf.yaml.j2 | 64 ----------- .../soil/soil_lgetkf_addincrement.yaml.j2 | 89 --------------- .../soil/soil_lgetkf_increment.yaml.j2 | 95 ---------------- ...orest_snow_ensemble_increments_fms.yaml.j2 | 4 - ...orest_soil_ensemble_increments_fms.yaml.j2 | 4 - .../model/soil/soil_background.yaml.j2 | 4 +- .../soil/soil_background_ensemble.yaml.j2 | 4 +- .../soil/soil_background_ensemble_fv3.yaml.j2 | 4 - .../soil/soil_background_error_ID.yaml.j2 | 27 ----- .../soil_background_error_ensonly.yaml.j2 | 106 ------------------ .../model/soil/soil_background_error_smc.yaml | 16 +-- .../soil/soil_background_error_smcstc.yaml | 2 - ...background_error_static_smcstctq2m.yaml.j2 | 2 - .../atmosphere_gsi/sfc_gsi.yaml.j2 | 6 +- 14 files changed, 7 insertions(+), 420 deletions(-) delete mode 100644 parm/jcb-gdas/algorithm/soil/soil_fv3jedi_fv3inc_lgetkf.yaml.j2 delete mode 100644 parm/jcb-gdas/algorithm/soil/soil_lgetkf_addincrement.yaml.j2 delete mode 100644 parm/jcb-gdas/algorithm/soil/soil_lgetkf_increment.yaml.j2 delete mode 100644 parm/jcb-gdas/model/snow/norest_snow_ensemble_increments_fms.yaml.j2 delete mode 100644 parm/jcb-gdas/model/soil/norest_soil_ensemble_increments_fms.yaml.j2 delete mode 100644 parm/jcb-gdas/model/soil/soil_background_error_ensonly.yaml.j2 diff --git a/parm/jcb-gdas/algorithm/soil/soil_fv3jedi_fv3inc_lgetkf.yaml.j2 b/parm/jcb-gdas/algorithm/soil/soil_fv3jedi_fv3inc_lgetkf.yaml.j2 deleted file mode 100644 index a56e0b7f6..000000000 --- a/parm/jcb-gdas/algorithm/soil/soil_fv3jedi_fv3inc_lgetkf.yaml.j2 +++ /dev/null @@ -1,64 +0,0 @@ -background geometry: - fms initialization: - namelist filename: ./fv3jedi/fmsmpp.nml - field table filename: ./fv3jedi/field_table - akbk: ./fv3jedi/akbk.nc4 - layout: - - {{ soil_layout_x }} - - {{ soil_layout_y }} - npx: {{ soil_npx_ges }} - npy: {{ soil_npy_ges }} - npz: {{ soil_npz_ges }} -fv3 increment geometry: - fms initialization: - namelist filename: ./fv3jedi/fmsmpp.nml - field table filename: ./fv3jedi/field_table - akbk: ./fv3jedi/akbk.nc4 - layout: - - {{ soil_layout_x }} - - {{ soil_layout_y }} - npx: {{ soil_npx_ges }} - npy: {{ soil_npy_ges }} - npz: {{ soil_npz_ges }} -members from template: - template: - background input: - datapath: ./bkg/mem%mem% - datetime: '{{ soil_background_time_iso }}' - filetype: fms restart - skip coupler file: true - filename is datetime templated: true - filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' - state variables: - - stc -# field io names: -# air_temperature_at_2m: t2m - fv3 increment input: - filetype: fms restart - datapath: ./anl/mem%mem% - datetime: '{{ soil_background_time_iso }}' - filetype: fms restart - skip coupler file: true - filename is datetime templated: true - prefix: soilinc - filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' - added variables: - - stc -# field io names: -# air_temperature_at_2m: t2m - fv3 output: - filetype: fms restart - datapath: ./anl/mem%mem% - datetime: '{{ soil_background_time_iso }}' - filetype: fms restart - skip coupler file: true - filename is datetime templated: true - prefix: soilanl - filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' - added variables: - - stc -# field io names: -# air_temperature_at_2m: t2m - pattern: '%mem%' - nmembers: {{ soil_number_ensemble_members }} - zero padding: 3 diff --git a/parm/jcb-gdas/algorithm/soil/soil_lgetkf_addincrement.yaml.j2 b/parm/jcb-gdas/algorithm/soil/soil_lgetkf_addincrement.yaml.j2 deleted file mode 100644 index 7f605b4a3..000000000 --- a/parm/jcb-gdas/algorithm/soil/soil_lgetkf_addincrement.yaml.j2 +++ /dev/null @@ -1,89 +0,0 @@ -state geometry: - fms initialization: - namelist filename: ./fv3jedi/fmsmpp.nml - field table filename: ./fv3jedi/field_table - akbk: ./fv3jedi/akbk.nc4 - layout: - - {{ soil_layout_x }} - - {{ soil_layout_y }} - npx: {{ soil_npx_ges }} - npy: {{ soil_npy_ges }} - npz: {{ soil_npz_ges }} -# field metadata override: ./fv3jedi/fv3jedi_fieldmetadata_history.yaml -increment geometry: - fms initialization: - namelist filename: ./fv3jedi/fmsmpp.nml - field table filename: ./fv3jedi/field_table - akbk: ./fv3jedi/akbk.nc4 - layout: - - {{ soil_layout_x }} - - {{ soil_layout_y }} - npx: {{ soil_npx_anl }} - npy: {{ soil_npy_anl }} - npz: {{ soil_npz_anl }} -# field metadata override: ./fv3jedi/fv3jedi_fieldmetadata_fv3inc.yaml -#members from template: -# template: -# pattern: "{{ soil_ensemble_pattern | default("%mem%", true) }}" -# nmembers: {{ soil_number_ensemble_members }} -# zero padding: 3 -state: - state variables: - - soilMoistureVolumetric - - stc - - totalSnowDepth - - sheleg - - vtype - - slmsk - - fraction_of_ice - - air_temperature_at_2m -#- temperature_2m -#- spec_humidity_2m - field io names: - totalSnowDepth: snodl - soilMoistureVolumetric: smc - fraction_of_ice: fice - air_temperature_at_2m: t2m - datapath: ./bkg/mem%{member}% - filetype: fms restart - skip coupler file: true - filename is datetime templated: true - datetime: '{{ soil_background_time_iso }}' - filename_sfcd: {{ soil_background_time_fv3 }}.sfc_data.nc -increment: - added variables: - - soilMoistureVolumetric - - stc -# - air_temperature_at_2m - field io names: - soilMoistureVolumetric: smc -# air_temperature_at_2m: t2m - datapath: ./anl/mem%{member}% - filetype: fms restart - skip coupler file: true - prefix: soilinc - filename is datetime templated: true - datetime: '{{ soil_background_time_iso }}' - filename_sfcd: {{ soil_background_time_fv3 }}.sfc_data.nc -output: - datapath: ./anl/mem%{member}% - prefix: soilanl - filetype: fms restart - skip coupler file: true - filename is datetime templated: true - datetime: '{{ soil_background_time_iso }}' - filename_sfcd: {{ soil_background_time_fv3 }}.sfc_data.nc - state variables: - - soilMoistureVolumetric - - stc - - totalSnowDepth - - sheleg - - vtype - - slmsk - - fraction_of_ice - - air_temperature_at_2m - field io names: - soilMoistureVolumetric: smc - totalSnowDepth: snodl - fraction_of_ice: fice - air_temperature_at_2m: t2m diff --git a/parm/jcb-gdas/algorithm/soil/soil_lgetkf_increment.yaml.j2 b/parm/jcb-gdas/algorithm/soil/soil_lgetkf_increment.yaml.j2 deleted file mode 100644 index b33504b35..000000000 --- a/parm/jcb-gdas/algorithm/soil/soil_lgetkf_increment.yaml.j2 +++ /dev/null @@ -1,95 +0,0 @@ -#background geometry: -state geometry: - fms initialization: - namelist filename: ./fv3jedi/fmsmpp.nml - field table filename: ./fv3jedi/field_table - akbk: ./fv3jedi/akbk.nc4 - layout: - - {{ soil_layout_x }} - - {{ soil_layout_y }} - npx: {{ soil_npx_ges }} - npy: {{ soil_npy_ges }} - npz: {{ soil_npz_ges }} -# field metadata override: ./fv3jedi/fv3jedi_fieldmetadata_history.yaml -# jedi/fv3 increment geometry: -increment geometry: - fms initialization: - namelist filename: ./fv3jedi/fmsmpp.nml - field table filename: ./fv3jedi/field_table - akbk: ./fv3jedi/akbk.nc4 - layout: - - {{ soil_layout_x }} - - {{ soil_layout_y }} - npx: {{ soil_npx_anl }} - npy: {{ soil_npy_anl }} - npz: {{ soil_npz_anl }} -# field metadata override: ./fv3jedi/fv3jedi_fieldmetadata_fv3inc.yaml -state: - members from template: - template: -#background input: - state variables: &state_vars - - soilMoistureVolumetric - - stc - - totalSnowDepth - - sheleg - - vtype - - slmsk -# - filtered_orography - - fraction_of_ice -# - fraction_of_land - - air_temperature_at_2m -#- temperature_2m -#- spec_humidity_2m - field io names: &field_io_names - soilMoistureVolumetric: smc - totalSnowDepth: snodl -# filtered_orography: orog_filt - fraction_of_ice: fice -# fraction_of_land: land_frac - air_temperature_at_2m: t2m - datapath: ./bkg/mem%mem% - datetime: '{{ soil_background_time_iso }}' - filetype: fms restart - skip coupler file: true - filename is datetime templated: true - filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' - max allowable geometry difference: 1e-4 - pattern: '%mem%' - nmembers: {{ soil_number_ensemble_members }} - zero padding: 3 -increment: - members from template: - template: - state variables: - - soilMoistureVolumetric - - stc - - air_temperature_at_2m - field io names: - soilMoistureVolumetric: smc - air_temperature_at_2m: t2m - datapath: ./anl/mem%mem% - datetime: '{{ soil_background_time_iso }}' - filetype: fms restart - skip coupler file: true -# filename is datetime templated: true -# prefix: soilinc - filename_sfcd: 'soilinc.{{ soil_background_time_fv3 }}.sfc_data.nc' - pattern: '%mem%' - nmembers: {{ soil_number_ensemble_members }} - zero padding: 3 -output: - members from template: - template: - state variables: *state_vars - field io names: *field_io_names - datapath: ./anl/mem%mem% - datetime: '{{ soil_background_time_iso }}' - filetype: fms restart - skip coupler file: true -# filename is datetime templated: true -# prefix: soil_anl - filename_sfcd: 'soil_bkgpinc.{{ soil_background_time_fv3 }}.sfc_data.nc' - pattern: '%mem%' - nmembers: {{ soil_number_ensemble_members }} - zero padding: 3 diff --git a/parm/jcb-gdas/model/snow/norest_snow_ensemble_increments_fms.yaml.j2 b/parm/jcb-gdas/model/snow/norest_snow_ensemble_increments_fms.yaml.j2 deleted file mode 100644 index f065f10fd..000000000 --- a/parm/jcb-gdas/model/snow/norest_snow_ensemble_increments_fms.yaml.j2 +++ /dev/null @@ -1,4 +0,0 @@ -filetype: fms restart -is restart: false -datapath: ./anl/mem%{member}% -filename_nonrestart: cubed_sphere_grid_sfcinc.jedi.nc diff --git a/parm/jcb-gdas/model/soil/norest_soil_ensemble_increments_fms.yaml.j2 b/parm/jcb-gdas/model/soil/norest_soil_ensemble_increments_fms.yaml.j2 deleted file mode 100644 index f065f10fd..000000000 --- a/parm/jcb-gdas/model/soil/norest_soil_ensemble_increments_fms.yaml.j2 +++ /dev/null @@ -1,4 +0,0 @@ -filetype: fms restart -is restart: false -datapath: ./anl/mem%{member}% -filename_nonrestart: cubed_sphere_grid_sfcinc.jedi.nc diff --git a/parm/jcb-gdas/model/soil/soil_background.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background.yaml.j2 index cfa50b5dd..249d5e230 100644 --- a/parm/jcb-gdas/model/soil/soil_background.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background.yaml.j2 @@ -3,8 +3,8 @@ filetype: cube sphere history provider: ufs datetime: '{{ soil_background_time_iso }}' filenames: -###- {{ soil_variational_history_prefix }}csg_atm.f006.nc -- {{ soil_variational_history_prefix }}csg_sfc.f006.nc #[enkf]gdas.t12z.csg_sfc.f006.nc +- {{ soil_variational_history_prefix }}csg_atm.f006.nc +- {{ soil_variational_history_prefix }}csg_sfc.f006.nc max allowable geometry difference: 1e-4 state variables: - soill1 diff --git a/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 index b0f59a103..41c5bf6cc 100644 --- a/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 @@ -5,8 +5,8 @@ members from template: filetype: cube sphere history provider: ufs filenames: - ###- {{ soil_variational_history_prefix }}csg_atm.f006.nc - - {{ soil_variational_history_prefix }}csg_sfc.f006.nc #[enkf]gdas.t12z.csg_sfc.f006.nc + - {{ soil_variational_history_prefix }}csg_atm.f006.nc + - {{ soil_variational_history_prefix }}csg_sfc.f006.nc max allowable geometry difference: 1e-4 state variables: - soill1 diff --git a/parm/jcb-gdas/model/soil/soil_background_ensemble_fv3.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_ensemble_fv3.yaml.j2 index c3780b5f6..49a1a7a23 100644 --- a/parm/jcb-gdas/model/soil/soil_background_ensemble_fv3.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background_ensemble_fv3.yaml.j2 @@ -1,10 +1,8 @@ -#datetime: '{{ soil_background_time_iso }}' members from template: template: datetime: '{{ soil_background_time_iso }}' filetype: fms restart skip coupler file: true -# provider: ufs state variables: &state_vars - soilMoistureVolumetric - stc @@ -18,8 +16,6 @@ members from template: - fraction_of_land - air_temperature_at_2m - specfic_humidity_at_2m -#temperature_2m -#spec_humidity_2m field io names: &field_ios soilMoistureVolumetric: smc totalSnowDepth: snodl diff --git a/parm/jcb-gdas/model/soil/soil_background_error_ID.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_error_ID.yaml.j2 index 1d1c54763..e9e090120 100644 --- a/parm/jcb-gdas/model/soil/soil_background_error_ID.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background_error_ID.yaml.j2 @@ -1,32 +1,5 @@ covariance model: SABER saber central block: -# saber block name: BUMP_NICAS -# calibration: #read: -# general: -# universe length-scale: 5000000.0 -# drivers: -# multivariate strategy: univariate -# compute nicas: true #read global nicas: true -# write global nicas: true -# nicas: -# resolution: 4 -# explicit length-scales: true -# horizontal length-scale: -# - groups: -# - soilMoistureVolumetric -# value: 1000000.0 -# vertical length-scale: -# - groups: -# - soilMoistureVolumetric -# value: 1500.0 -# interpolation type: -# - groups: -# - soilMoistureVolumetric -# type: c0 -# same horizontal convolution: true -# io: -# data directory: ./berror -# files prefix: smc_bump_nicas_1000km_{{ soil_background_time_fv3 }} saber block name: ID saber outer blocks: - saber block name: BUMP_StdDev diff --git a/parm/jcb-gdas/model/soil/soil_background_error_ensonly.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_error_ensonly.yaml.j2 deleted file mode 100644 index 598dbe904..000000000 --- a/parm/jcb-gdas/model/soil/soil_background_error_ensonly.yaml.j2 +++ /dev/null @@ -1,106 +0,0 @@ -covariance model: ensemble -localization: - localization method: SABER - saber central block: - saber block name: ID -members from template: - template: - states: - datapath: /scratch5/purged/Tseganeh.Gichamo/letkf_smap_workdir/mem%mem%/ - filetype: fms restart - skip coupler file: true - datetime: '2024-03-01T00:00:00Z' - state variables: - - soilMoistureVolumetric - - slc - - stc - - totalSnowDepth - - sheleg - - vtype - - slmsk - - filtered_orography - - fraction_of_ice - - fraction_of_land - - air_temperature_at_2m - - specfic_humidity_at_2m - field io names: - soilMoistureVolumetric: smc - totalSnowDepth: snodl - filtered_orography: orog_filt - fraction_of_ice: fice - fraction_of_land: land_frac - air_temperature_at_2m: t2m - specfic_humidity_at_2m: q2m - filename_sfcd: 20240301.000000.sfc_data.nc - filename_cplr: 20240301.000000.coupler.res - filename_orog: C96.mx100_oro_data.nc - pattern: '%mem%' - nmembers: 3 - zero padding: 3 -#covariance model: SABER -#saber central block: -# saber block name: BUMP_NICAS -# read: #calibration -# general: -# universe length-scale: 5000000.0 -# drivers: -# multivariate strategy: univariate -# read global nicas: true #compute nicas: true -# #write global nicas: true -# nicas: -# resolution: 6 -# max horizontal grid size: 400000 -# explicit length-scales: true -# horizontal length-scale: -# - groups: -# - soilMoistureVolumetric -# - slc -# - stc -# - air_temperature_at_2m -# - specfic_humidity_at_2m -# value: 250000.0 -# vertical length-scale: -# - groups: -# - soilMoistureVolumetric -# - slc -# - stc -# - air_temperature_at_2m -# - specfic_humidity_at_2m -# value: 800.0 -# interpolation type: -# - groups: -# - soilMoistureVolumetric -# - slc -# - stc -# - air_temperature_at_2m -# - specfic_humidity_at_2m -# type: c0 -# same horizontal convolution: true -# io: -# data directory: ./berror -# files prefix: smc_bump -##_nicas.nc #_{{ soil_background_time_fv3 }} -## saber block name: ID -#saber outer blocks: -#- saber block name: BUMP_StdDev -# read: -# drivers: -# compute variance: true -# variance: -# explicit stddev: true -# stddev: -# - variables: -# - soilMoistureVolumetric -# value: 0.2 -# - variables: -# - slc -# value: 0.2 -# - variables: -# - stc -# value: 0.5 -# - variables: -# - air_temperature_at_2m -# value: 1.0 -# - variables: -# - specfic_humidity_at_2m -# value: 0.5 diff --git a/parm/jcb-gdas/model/soil/soil_background_error_smc.yaml b/parm/jcb-gdas/model/soil/soil_background_error_smc.yaml index a7a5f1601..75c387bfb 100644 --- a/parm/jcb-gdas/model/soil/soil_background_error_smc.yaml +++ b/parm/jcb-gdas/model/soil/soil_background_error_smc.yaml @@ -27,8 +27,6 @@ saber central block: io: data directory: ./berror files prefix: smc_bump_nicas_1000km.nc -#_{{ soil_background_time_fv3 }} -# saber block name: ID saber outer blocks: - saber block name: BUMP_StdDev read: @@ -39,16 +37,4 @@ saber outer blocks: stddev: - variables: - soilMoistureVolumetric - value: 0.2 - - variables: - - slc - value: 0.2 - - variables: - - stc - value: 0.5 - - variables: - - air_temperature_at_2m - value: 1.0 - - variables: - - specfic_humidity_at_2m - value: 0.5 + value: 0.05 diff --git a/parm/jcb-gdas/model/soil/soil_background_error_smcstc.yaml b/parm/jcb-gdas/model/soil/soil_background_error_smcstc.yaml index b4326d980..8ff505ae3 100644 --- a/parm/jcb-gdas/model/soil/soil_background_error_smcstc.yaml +++ b/parm/jcb-gdas/model/soil/soil_background_error_smcstc.yaml @@ -40,8 +40,6 @@ saber central block: io: data directory: ./berror files prefix: smc_bump -#_nicas.nc #_{{ soil_background_time_fv3 }} -# saber block name: ID saber outer blocks: - saber block name: BUMP_StdDev read: diff --git a/parm/jcb-gdas/model/soil/soil_background_error_static_smcstctq2m.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_error_static_smcstctq2m.yaml.j2 index b4326d980..8ff505ae3 100644 --- a/parm/jcb-gdas/model/soil/soil_background_error_static_smcstctq2m.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background_error_static_smcstctq2m.yaml.j2 @@ -40,8 +40,6 @@ saber central block: io: data directory: ./berror files prefix: smc_bump -#_nicas.nc #_{{ soil_background_time_fv3 }} -# saber block name: ID saber outer blocks: - saber block name: BUMP_StdDev read: diff --git a/parm/jcb-gdas/observation_statistics/atmosphere_gsi/sfc_gsi.yaml.j2 b/parm/jcb-gdas/observation_statistics/atmosphere_gsi/sfc_gsi.yaml.j2 index 358d17d11..2f6f5b7c4 100644 --- a/parm/jcb-gdas/observation_statistics/atmosphere_gsi/sfc_gsi.yaml.j2 +++ b/parm/jcb-gdas/observation_statistics/atmosphere_gsi/sfc_gsi.yaml.j2 @@ -4,10 +4,8 @@ engine: type: H5File obsfile: "{{ atmosphere_gsi_obsdatain_path }}/{{ atmosphere_gsi_obsdatain_prefix }}{{ observation_from_jcb }}{{ atmosphere_gsi_obsdatain_suffix }}" - simulated variables: ['air_temperature'] -#'stationPressure', 'airTemperature', 'specificHumidity', 'windEastward', 'windNorthward'] - observed variables: ['air_temperature'] -#['stationPressure', 'airTemperature', 'specificHumidity', 'windEastward', 'windNorthward'] + simulated variables: ['stationPressure', 'airTemperature', 'specificHumidity', 'windEastward', 'windNorthward'] + observed variables: ['stationPressure', 'airTemperature', 'specificHumidity', 'windEastward', 'windNorthward'] statistics to compute: ['mean', 'count', 'RMS'] variables: ['stationPressure', 'airTemperature', 'specificHumidity', 'windEastward', 'windNorthward'] groups to process: ['ombg', 'oman'] From 769c5b05a35325d51f21ee346f65c373407c659b Mon Sep 17 00:00:00 2001 From: tsga Date: Thu, 18 Jun 2026 18:05:15 +0000 Subject: [PATCH 45/98] clean up obs configs --- .../adpsfc_airTemperature_181_gsi.yaml.j2 | 436 ----------------- .../soil/adpsfc_airTemperature_181.yaml.j2 | 421 ---------------- .../adpsfc_airTemperature_181_gsi.yaml.j2 | 421 ---------------- .../soil/adpsfc_airTemperature_183.yaml.j2 | 348 -------------- .../soil/adpsfc_airTemperature_187.yaml.j2 | 348 -------------- ...psfc_air_temperature_at_2m_181_gsi.yaml.j2 | 448 ------------------ .../soil/adpsfc_specificHumidity_181.yaml.j2 | 340 ------------- .../soil/adpsfc_specificHumidity_183.yaml.j2 | 340 ------------- .../soil/adpsfc_specificHumidity_187.yaml.j2 | 340 ------------- .../soil/adpsfc_stationPressure_181.yaml.j2 | 334 ------------- .../soil/adpsfc_stationPressure_187.yaml.j2 | 334 ------------- .../soil/adpsfc_winds_281.yaml.j2 | 370 --------------- .../soil/adpsfc_winds_284.yaml.j2 | 370 --------------- .../soil/adpsfc_winds_287.yaml.j2 | 370 --------------- .../soil/bk_adpsfc_airTemperature_181.yaml.j2 | 370 --------------- .../soil/sfcshp_airTemperature_180.yaml.j2 | 340 ------------- .../soil/sfcshp_airTemperature_182.yaml.j2 | 340 ------------- .../soil/sfcshp_airTemperature_183.yaml.j2 | 340 ------------- .../soil/sfcshp_specificHumidity_180.yaml.j2 | 340 ------------- .../soil/sfcshp_specificHumidity_182.yaml.j2 | 340 ------------- .../soil/sfcshp_specificHumidity_183.yaml.j2 | 340 ------------- .../soil/sfcshp_stationPressure_180.yaml.j2 | 346 -------------- .../soil/sfcshp_stationPressure_182.yaml.j2 | 334 ------------- .../soil/sfcshp_winds_280.yaml.j2 | 370 --------------- .../soil/sfcshp_winds_282.yaml.j2 | 370 --------------- .../soil/sfcshp_winds_284.yaml.j2 | 370 --------------- 26 files changed, 9420 deletions(-) delete mode 100644 parm/jcb-gdas/observations/atmosphere/adpsfc_airTemperature_181_gsi.yaml.j2 delete mode 100644 parm/jcb-gdas/observations/soil/adpsfc_airTemperature_181.yaml.j2 delete mode 100644 parm/jcb-gdas/observations/soil/adpsfc_airTemperature_181_gsi.yaml.j2 delete mode 100644 parm/jcb-gdas/observations/soil/adpsfc_airTemperature_183.yaml.j2 delete mode 100644 parm/jcb-gdas/observations/soil/adpsfc_airTemperature_187.yaml.j2 delete mode 100644 parm/jcb-gdas/observations/soil/adpsfc_air_temperature_at_2m_181_gsi.yaml.j2 delete mode 100644 parm/jcb-gdas/observations/soil/adpsfc_specificHumidity_181.yaml.j2 delete mode 100644 parm/jcb-gdas/observations/soil/adpsfc_specificHumidity_183.yaml.j2 delete mode 100644 parm/jcb-gdas/observations/soil/adpsfc_specificHumidity_187.yaml.j2 delete mode 100644 parm/jcb-gdas/observations/soil/adpsfc_stationPressure_181.yaml.j2 delete mode 100644 parm/jcb-gdas/observations/soil/adpsfc_stationPressure_187.yaml.j2 delete mode 100644 parm/jcb-gdas/observations/soil/adpsfc_winds_281.yaml.j2 delete mode 100644 parm/jcb-gdas/observations/soil/adpsfc_winds_284.yaml.j2 delete mode 100644 parm/jcb-gdas/observations/soil/adpsfc_winds_287.yaml.j2 delete mode 100644 parm/jcb-gdas/observations/soil/bk_adpsfc_airTemperature_181.yaml.j2 delete mode 100644 parm/jcb-gdas/observations/soil/sfcshp_airTemperature_180.yaml.j2 delete mode 100644 parm/jcb-gdas/observations/soil/sfcshp_airTemperature_182.yaml.j2 delete mode 100644 parm/jcb-gdas/observations/soil/sfcshp_airTemperature_183.yaml.j2 delete mode 100644 parm/jcb-gdas/observations/soil/sfcshp_specificHumidity_180.yaml.j2 delete mode 100644 parm/jcb-gdas/observations/soil/sfcshp_specificHumidity_182.yaml.j2 delete mode 100644 parm/jcb-gdas/observations/soil/sfcshp_specificHumidity_183.yaml.j2 delete mode 100644 parm/jcb-gdas/observations/soil/sfcshp_stationPressure_180.yaml.j2 delete mode 100644 parm/jcb-gdas/observations/soil/sfcshp_stationPressure_182.yaml.j2 delete mode 100644 parm/jcb-gdas/observations/soil/sfcshp_winds_280.yaml.j2 delete mode 100644 parm/jcb-gdas/observations/soil/sfcshp_winds_282.yaml.j2 delete mode 100644 parm/jcb-gdas/observations/soil/sfcshp_winds_284.yaml.j2 diff --git a/parm/jcb-gdas/observations/atmosphere/adpsfc_airTemperature_181_gsi.yaml.j2 b/parm/jcb-gdas/observations/atmosphere/adpsfc_airTemperature_181_gsi.yaml.j2 deleted file mode 100644 index 5bf8da0a5..000000000 --- a/parm/jcb-gdas/observations/atmosphere/adpsfc_airTemperature_181_gsi.yaml.j2 +++ /dev/null @@ -1,436 +0,0 @@ -- - # Observation Space (I/O) - # ----------------------- - - obs space: - name: {{observation_from_jcb}} -{% if algorithm == "local_ensemble_da" %} - distribution: - name: {{distribution_type}} - halo size: "{{halo_size}}" -{% endif %} - obsdatain: - engine: - type: H5File - obsfile: "{{atmosphere_obsdatain_path}}/{{atmosphere_obsdatain_prefix}}{{observation_from_jcb}}{{atmosphere_obsdatain_suffix}}" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - obsdataout: - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: "{{atmosphere_obsdataout_path}}/{{atmosphere_obsdataout_prefix}}{{observation_from_jcb}}{{atmosphere_obsdataout_suffix}}" - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [airTemperature] -#airTemperature] -# derived variables: [airTemperature] - simulated variables: [airTemperature] - -##--cmnt obs operator: -## name: Identity -## -## # localization TODO: generalize this condioned on da algo -## # ------------ -##{% if algorithm == "local_ensemble_da" %} -## obs localizations: -## - localization method: {{localization_method}} -## lengthscale: {{loc_length_scale}} -## max nobs: {{max_nobs}} -##--cmnt{% endif %} -#..ins - - obs operator: - name: VertInterp - vertical coordinate: air_pressure - observation vertical coordinate: pressure - observation vertical coordinate group: MetaData - interpolation method: log-linear - variables: - - name: airTemperature - - linear obs operator: - name: VertInterp - -#...endins - - obs error: - covariance model: diagonal - -# obs pre filters: -# - filter: Variable Assignment -# assignments: -# - name: DerivedObsValue/airTemperature -# type: float -# function: -# name: ObsFunction/Arithmetic -# options: -# variables: [ObsValue/airTemperature] -# total exponent: 1. - - obs filters: -# # ------------------ -# # airTemperature (181) -# # ------------------ -# # Accept, reject, or passivate (monitor) -# - filter: Perform Action -# udescriptor: "iuse_check" -# filter variables: -# - name: airTemperature -# where: -# - variable: ObsType/airTemperature -# is_in: 181 -# action: -# name: {{iuse_adpsfc_airTemperature_181 | default("passivate", true)}} # accept, reject, passivate -# - # Reject all obs not in type - - filter: Perform Action - udescriptor: "obs_type_check" - where: - - variable: ObsValue/airTemperature - value: is_not_valid - action: - name: reduce obs space - - # Reject all obs not in kx - - filter: Perform Action - udescriptor: "obs_kx_check" - where: - - variable: ObsType/airTemperature - is_not_in: 181 - action: - name: reduce obs space - - # Reject all obs with QualityMarker > 3 - - filter: RejectList - udescriptor: "quality_marker_check" - filter variables: - - name: airTemperature - where: - - variable: QualityMarker/airTemperature - is_in: 4-15 - value: is_not_valid - where operator: or - action: - name: reduce obs space - - # Time window filter - - filter: Bounds Check - udescriptor: "time_window_check" - filter variables: - - name: airTemperature - test variables: - - name: MetaData/timeOffset #s - minvalue: -10800 #-900 - maxvalue: 10800 #900 - where: - - variable: ObsType/airTemperature - is_in: 181 - action: - name: reduce obs space - -# # Duplicate Check -# - filter: Temporal Thinning -# udescriptor: "duplicate_check" -# filter variables: -# - name: airTemperature -## min_spacing: PT90M -# min_spacing: '{{ window_length }}' -# tolerance: PT0H -# seed_time: "{{atmosphere_background_time_iso}}" -# category_variable: -# name: MetaData/stationIdentification -##MetaData/longitude_latitude_pressure -# where: -# - variable: ObsType/airTemperature -# is_in: 181 -# action: -# name: reduce obs space - -## # Online regional domain check -## - filter: Bounds Check -## udescriptor: "online_domain_check" -## filter variables: -## - name: airTemperature -## test variables: -## - name: GeoVaLs/observable_domain_mask -## minvalue: 0.0 -## maxvalue: 0.5 - - filter: Domain Check # land only - where: - - variable: - name: GeoVaLs/fraction_of_land - minvalue: 0.5 - actions: -# - name: set -# flag: land_check -# ignore: rejected observations - - name: reject - - filter: Domain Check # land only, no sea ice - where: - - variable: - name: GeoVaLs/fraction_of_ice - maxvalue: 0.0 - actions: -# - name: set -# flag: seaice_check -# ignore: rejected observations - - name: reject - - filter: Domain Check # no snow - where: - - variable: - name: GeoVaLs/sheleg - maxvalue: 0.0 - actions: -# - name: set -# flag: snow_check -# ignore: rejected observations - - name: reject - - filter: RejectList # no land-ice - where: - - variable: - name: GeoVaLs/vtype - minvalue: 14.5 - maxvalue: 15.5 - actions: -# - name: set -# flag: landice_check -# ignore: rejected observations - - name: reject - - filter: RejectList # exclude certain IGBP vegetation types - where: - - variable: - name: GeoVaLs/vtype - absolute_tolerance: 1.0e-3 - is_close_to_any_of: [1, 2, 3, 4, 13, 15, 17] - actions: -# - name: set -# flag: vegtype_check -# ignore: rejected observations - - name: reject - - # Initial error assignment - - filter: Perform Action - udescriptor: "initial_error_assignment" - filter variables: - - name: airTemperature - where: - - variable: ObsType/airTemperature - is_in: 181 - 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] - errors: [1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056] - -# # Reduce observation error and turn off ObsErrorFactorPressureCheck (l_gsd_terrain_match_surfTobs=.true., l_sfcobserror_ramp_t=.true.,) -# - filter: Perform Action -# filter variables: -# - name: airTemperature -# action: -# name: inflate error -# inflation factor: 0.5 -# -# # Error inflation based on pressure check (setupt.f90) ##>>requires non-sfc geov -# - filter: Perform Action -# udescriptor: "error_inflation_pressure_check" -# filter variables: -# - name: airTemperature -# where: -# - variable: ObsType/airTemperature -# is_in: 181 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorPressureCheck -# options: -# variable: airTemperature -# surface observation error ramp: true -# max levels below surface: 15 -# inflation factor: 8.0 -# -## # Error inflation based on errormod (qcmod.f90) -## - filter: Perform Action -## filter variables: -## - name: airTemperature -## where: -## - variable: ObsType/airTemperature -## is_in: 181 -## action: -## name: inflate error -## inflation variable: -## name: ObsFunction/ObsErrorFactorConventional -## options: -## inflate variables: [airTemperature] -## pressure: MetaData/pressure - - # Error inflation when QualityMarker == 3 (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_QualityMarker" - filter variables: - - name: airTemperature - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: QualityMarker/airTemperature - is_in: 3 - - variable: ObsType/airTemperature - is_in: 181 - - # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_observation_pressure" - filter variables: - - name: airTemperature - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: MetaData/pressure - maxvalue: 10000.0 - - variable: ObsType/airTemperature - is_in: 181 - - # Bounds Check (ObsError) - - filter: Bounds Check - udescriptor: "bounds_check_ObsError" - filter variables: - - name: airTemperature - test variables: - - name: ObsErrorData/airTemperature - minvalue: 0.0 - maxvalue: 1000 - where: - - variable: ObsType/airTemperature - is_in: 181 - action: - name: reduce obs space - - # Bounds Check (ObsValue) - - filter: Bounds Check - udescriptor: "bounds_check_ObsValue" - filter variables: - - name: airTemperature - minvalue: 100 - maxvalue: 400 - where: - - variable: ObsType/airTemperature - is_in: 181 - action: - name: reduce obs space - - # Create temporary ObsErrorData - - filter: Variable Assignment - udescriptor: "create_temporary_ObsErrorData" - apply at iterations: 0,1 - where: - - variable: ObsType/airTemperature - is_in: 181 - assignments: - - name: TempObsErrorData/airTemperature - type: float - function: - name: ObsFunction/Arithmetic - options: - variables: - - name: ObsErrorData/airTemperature - defer to post: true - - # Set ObsError set "error parameter" if < "max value" - - filter: Perform Action - udescriptor: "ermin_set" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - action: - name: assign error - error parameter: 1.0 - where: - - variable: - name: ObsErrorData/airTemperature - maxvalue: 1.0 - - variable: - name: ObsErrorData/airTemperature - value: is_valid - - variable: ObsType/airTemperature - is_in: 181 - defer to post: true - - # Set ObsError set "error parameter" if > "min value" - - filter: Perform Action - udescriptor: "ermax_set" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - action: - name: assign error - error parameter: 3.0 - where: - - variable: - name: ObsErrorData/airTemperature - minvalue: 3.0 - - variable: - name: ObsErrorData/airTemperature - value: is_valid - - variable: ObsType/airTemperature - is_in: 181 - defer to post: true - - # Gross Error Check - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - threshold: 5.0 - action: - name: reject - where: - - variable: QualityMarker/airTemperature - is_not_in: 3 - - variable: ObsType/airTemperature - is_in: 181 - defer to post: true - - # Gross Error Check: cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - threshold: 3.5 - action: - name: reject - where: - - variable: QualityMarker/airTemperature - is_in: 3 - - variable: ObsType/airTemperature - is_in: 181 - defer to post: true - - # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. - - filter: Perform Action - udescriptor: "reassign_error_TempObsErrorData" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - action: - name: assign error - error function: TempObsErrorData/airTemperature - where: - - variable: - name: TempObsErrorData/airTemperature - value: is_valid - - variable: ObsType/airTemperature - is_in: 181 - defer to post: true - - #- filter: GOMsaver - # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_181.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_181.yaml.j2 deleted file mode 100644 index 005176ecf..000000000 --- a/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_181.yaml.j2 +++ /dev/null @@ -1,421 +0,0 @@ -- - # Observation Space (I/O) - # ----------------------- - - obs space: - name: {{observation_from_jcb}} -{% if algorithm == "local_ensemble_da" %} - distribution: - name: {{distribution_type}} - halo size: "{{halo_size}}" -{% endif %} - obsdatain: - engine: - type: H5File - obsfile: "{{soil_obsdatain_path}}/{{soil_obsdatain_prefix}}{{observation_from_jcb}}{{atmosphere_obsdatain_suffix}}" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - obsdataout: - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: "{{soil_obsdataout_path}}/{{soil_obsdataout_prefix}}{{observation_from_jcb}}{{soil_obsdataout_suffix}}" - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [air_temperature_at_2m] -#airTemperature] -# derived variables: [air_temperature_at_2m] - simulated variables: [air_temperature_at_2m] - - obs operator: - name: Identity - - # localization TODO: generalize this condioned on da algo - # ------------ -{% if algorithm == "local_ensemble_da" %} - obs localizations: - - localization method: {{localization_method}} - lengthscale: {{loc_length_scale}} - max nobs: {{max_nobs}} -{% endif %} - - obs error: - covariance model: diagonal - -# obs pre filters: -# - filter: Variable Assignment -# assignments: -# - name: DerivedObsValue/air_temperature_at_2m -# type: float -# function: -# name: ObsFunction/Arithmetic -# options: -# variables: [ObsValue/air_temperature_at_2m] -# total exponent: 1. - - obs filters: -# # ------------------ -# # air_temperature_at_2m (181) -# # ------------------ -# # Accept, reject, or passivate (monitor) -# - filter: Perform Action -# udescriptor: "iuse_check" -# filter variables: -# - name: air_temperature_at_2m -# where: -# - variable: ObsType/air_temperature_at_2m -# is_in: 181 -# action: -# name: {{iuse_adpsfc_air_temperature_at_2m_181 | default("passivate", true)}} # accept, reject, passivate -# - # Reject all obs not in type - - filter: Perform Action - udescriptor: "obs_type_check" - where: - - variable: ObsValue/air_temperature_at_2m - value: is_not_valid - action: - name: reduce obs space - - # Reject all obs not in kx - - filter: Perform Action - udescriptor: "obs_kx_check" - where: - - variable: ObsType/air_temperature_at_2m - is_not_in: 181 - action: - name: reduce obs space - - # Reject all obs with QualityMarker > 3 - - filter: RejectList - udescriptor: "quality_marker_check" - filter variables: - - name: air_temperature_at_2m - where: - - variable: QualityMarker/air_temperature_at_2m - is_in: 4-15 - value: is_not_valid - where operator: or - action: - name: reduce obs space - - # Time window filter - - filter: Bounds Check - udescriptor: "time_window_check" - filter variables: - - name: air_temperature_at_2m - test variables: - - name: MetaData/timeOffset #s - minvalue: -10800 #-900 - maxvalue: 10800 #900 - where: - - variable: ObsType/air_temperature_at_2m - is_in: 181 - action: - name: reduce obs space - -# # Duplicate Check -# - filter: Temporal Thinning -# udescriptor: "duplicate_check" -# filter variables: -# - name: air_temperature_at_2m -## min_spacing: PT90M -# min_spacing: '{{ window_length }}' -# tolerance: PT0H -# seed_time: "{{soil_background_time_iso}}" -# category_variable: -# name: MetaData/stationIdentification -##MetaData/longitude_latitude_pressure -# where: -# - variable: ObsType/air_temperature_at_2m -# is_in: 181 -# action: -# name: reduce obs space - -## # Online regional domain check -## - filter: Bounds Check -## udescriptor: "online_domain_check" -## filter variables: -## - name: air_temperature_at_2m -## test variables: -## - name: GeoVaLs/observable_domain_mask -## minvalue: 0.0 -## maxvalue: 0.5 - - filter: Domain Check # land only - where: - - variable: - name: GeoVaLs/fraction_of_land - minvalue: 0.5 - actions: -# - name: set -# flag: land_check -# ignore: rejected observations - - name: reject - - filter: Domain Check # land only, no sea ice - where: - - variable: - name: GeoVaLs/fraction_of_ice - maxvalue: 0.0 - actions: -# - name: set -# flag: seaice_check -# ignore: rejected observations - - name: reject - - filter: Domain Check # no snow - where: - - variable: - name: GeoVaLs/sheleg - maxvalue: 0.0 - actions: -# - name: set -# flag: snow_check -# ignore: rejected observations - - name: reject - - filter: RejectList # no land-ice - where: - - variable: - name: GeoVaLs/vtype - minvalue: 14.5 - maxvalue: 15.5 - actions: -# - name: set -# flag: landice_check -# ignore: rejected observations - - name: reject - - filter: RejectList # exclude certain IGBP vegetation types - where: - - variable: - name: GeoVaLs/vtype - absolute_tolerance: 1.0e-3 - is_close_to_any_of: [1, 2, 3, 4, 13, 15, 17] - actions: -# - name: set -# flag: vegtype_check -# ignore: rejected observations - - name: reject - - # Initial error assignment - - filter: Perform Action - udescriptor: "initial_error_assignment" - filter variables: - - name: air_temperature_at_2m - where: - - variable: ObsType/air_temperature_at_2m - is_in: 181 - 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] - errors: [1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056] - -# # Reduce observation error and turn off ObsErrorFactorPressureCheck (l_gsd_terrain_match_surfTobs=.true., l_sfcobserror_ramp_t=.true.,) -# - filter: Perform Action -# filter variables: -# - name: air_temperature_at_2m -# action: -# name: inflate error -# inflation factor: 0.5 -# -# # Error inflation based on pressure check (setupt.f90) ##>>requires non-sfc geov -# - filter: Perform Action -# udescriptor: "error_inflation_pressure_check" -# filter variables: -# - name: air_temperature_at_2m -# where: -# - variable: ObsType/air_temperature_at_2m -# is_in: 181 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorPressureCheck -# options: -# variable: air_temperature_at_2m -# surface observation error ramp: true -# max levels below surface: 15 -# inflation factor: 8.0 -# -## # Error inflation based on errormod (qcmod.f90) -## - filter: Perform Action -## filter variables: -## - name: air_temperature_at_2m -## where: -## - variable: ObsType/air_temperature_at_2m -## is_in: 181 -## action: -## name: inflate error -## inflation variable: -## name: ObsFunction/ObsErrorFactorConventional -## options: -## inflate variables: [air_temperature_at_2m] -## pressure: MetaData/pressure - - # Error inflation when QualityMarker == 3 (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_QualityMarker" - filter variables: - - name: air_temperature_at_2m - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: QualityMarker/air_temperature_at_2m - is_in: 3 - - variable: ObsType/air_temperature_at_2m - is_in: 181 - - # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_observation_pressure" - filter variables: - - name: air_temperature_at_2m - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: MetaData/pressure - maxvalue: 10000.0 - - variable: ObsType/air_temperature_at_2m - is_in: 181 - - # Bounds Check (ObsError) - - filter: Bounds Check - udescriptor: "bounds_check_ObsError" - filter variables: - - name: air_temperature_at_2m - test variables: - - name: ObsErrorData/air_temperature_at_2m - minvalue: 0.0 - maxvalue: 1000 - where: - - variable: ObsType/air_temperature_at_2m - is_in: 181 - action: - name: reduce obs space - - # Bounds Check (ObsValue) - - filter: Bounds Check - udescriptor: "bounds_check_ObsValue" - filter variables: - - name: air_temperature_at_2m - minvalue: 100 - maxvalue: 400 - where: - - variable: ObsType/air_temperature_at_2m - is_in: 181 - action: - name: reduce obs space - - # Create temporary ObsErrorData - - filter: Variable Assignment - udescriptor: "create_temporary_ObsErrorData" - apply at iterations: 0,1 - where: - - variable: ObsType/air_temperature_at_2m - is_in: 181 - assignments: - - name: TempObsErrorData/air_temperature_at_2m - type: float - function: - name: ObsFunction/Arithmetic - options: - variables: - - name: ObsErrorData/air_temperature_at_2m - defer to post: true - - # Set ObsError set "error parameter" if < "max value" - - filter: Perform Action - udescriptor: "ermin_set" - apply at iterations: 0,1 - filter variables: - - name: air_temperature_at_2m - action: - name: assign error - error parameter: 1.0 - where: - - variable: - name: ObsErrorData/air_temperature_at_2m - maxvalue: 1.0 - - variable: - name: ObsErrorData/air_temperature_at_2m - value: is_valid - - variable: ObsType/air_temperature_at_2m - is_in: 181 - defer to post: true - - # Set ObsError set "error parameter" if > "min value" - - filter: Perform Action - udescriptor: "ermax_set" - apply at iterations: 0,1 - filter variables: - - name: air_temperature_at_2m - action: - name: assign error - error parameter: 3.0 - where: - - variable: - name: ObsErrorData/air_temperature_at_2m - minvalue: 3.0 - - variable: - name: ObsErrorData/air_temperature_at_2m - value: is_valid - - variable: ObsType/air_temperature_at_2m - is_in: 181 - defer to post: true - - # Gross Error Check - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: air_temperature_at_2m - threshold: 5.0 - action: - name: reject - where: - - variable: QualityMarker/air_temperature_at_2m - is_not_in: 3 - - variable: ObsType/air_temperature_at_2m - is_in: 181 - defer to post: true - - # Gross Error Check: cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: air_temperature_at_2m - threshold: 3.5 - action: - name: reject - where: - - variable: QualityMarker/air_temperature_at_2m - is_in: 3 - - variable: ObsType/air_temperature_at_2m - is_in: 181 - defer to post: true - - # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. - - filter: Perform Action - udescriptor: "reassign_error_TempObsErrorData" - apply at iterations: 0,1 - filter variables: - - name: air_temperature_at_2m - action: - name: assign error - error function: TempObsErrorData/air_temperature_at_2m - where: - - variable: - name: TempObsErrorData/air_temperature_at_2m - value: is_valid - - variable: ObsType/air_temperature_at_2m - is_in: 181 - defer to post: true - - #- filter: GOMsaver - # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_181_gsi.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_181_gsi.yaml.j2 deleted file mode 100644 index 005176ecf..000000000 --- a/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_181_gsi.yaml.j2 +++ /dev/null @@ -1,421 +0,0 @@ -- - # Observation Space (I/O) - # ----------------------- - - obs space: - name: {{observation_from_jcb}} -{% if algorithm == "local_ensemble_da" %} - distribution: - name: {{distribution_type}} - halo size: "{{halo_size}}" -{% endif %} - obsdatain: - engine: - type: H5File - obsfile: "{{soil_obsdatain_path}}/{{soil_obsdatain_prefix}}{{observation_from_jcb}}{{atmosphere_obsdatain_suffix}}" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - obsdataout: - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: "{{soil_obsdataout_path}}/{{soil_obsdataout_prefix}}{{observation_from_jcb}}{{soil_obsdataout_suffix}}" - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [air_temperature_at_2m] -#airTemperature] -# derived variables: [air_temperature_at_2m] - simulated variables: [air_temperature_at_2m] - - obs operator: - name: Identity - - # localization TODO: generalize this condioned on da algo - # ------------ -{% if algorithm == "local_ensemble_da" %} - obs localizations: - - localization method: {{localization_method}} - lengthscale: {{loc_length_scale}} - max nobs: {{max_nobs}} -{% endif %} - - obs error: - covariance model: diagonal - -# obs pre filters: -# - filter: Variable Assignment -# assignments: -# - name: DerivedObsValue/air_temperature_at_2m -# type: float -# function: -# name: ObsFunction/Arithmetic -# options: -# variables: [ObsValue/air_temperature_at_2m] -# total exponent: 1. - - obs filters: -# # ------------------ -# # air_temperature_at_2m (181) -# # ------------------ -# # Accept, reject, or passivate (monitor) -# - filter: Perform Action -# udescriptor: "iuse_check" -# filter variables: -# - name: air_temperature_at_2m -# where: -# - variable: ObsType/air_temperature_at_2m -# is_in: 181 -# action: -# name: {{iuse_adpsfc_air_temperature_at_2m_181 | default("passivate", true)}} # accept, reject, passivate -# - # Reject all obs not in type - - filter: Perform Action - udescriptor: "obs_type_check" - where: - - variable: ObsValue/air_temperature_at_2m - value: is_not_valid - action: - name: reduce obs space - - # Reject all obs not in kx - - filter: Perform Action - udescriptor: "obs_kx_check" - where: - - variable: ObsType/air_temperature_at_2m - is_not_in: 181 - action: - name: reduce obs space - - # Reject all obs with QualityMarker > 3 - - filter: RejectList - udescriptor: "quality_marker_check" - filter variables: - - name: air_temperature_at_2m - where: - - variable: QualityMarker/air_temperature_at_2m - is_in: 4-15 - value: is_not_valid - where operator: or - action: - name: reduce obs space - - # Time window filter - - filter: Bounds Check - udescriptor: "time_window_check" - filter variables: - - name: air_temperature_at_2m - test variables: - - name: MetaData/timeOffset #s - minvalue: -10800 #-900 - maxvalue: 10800 #900 - where: - - variable: ObsType/air_temperature_at_2m - is_in: 181 - action: - name: reduce obs space - -# # Duplicate Check -# - filter: Temporal Thinning -# udescriptor: "duplicate_check" -# filter variables: -# - name: air_temperature_at_2m -## min_spacing: PT90M -# min_spacing: '{{ window_length }}' -# tolerance: PT0H -# seed_time: "{{soil_background_time_iso}}" -# category_variable: -# name: MetaData/stationIdentification -##MetaData/longitude_latitude_pressure -# where: -# - variable: ObsType/air_temperature_at_2m -# is_in: 181 -# action: -# name: reduce obs space - -## # Online regional domain check -## - filter: Bounds Check -## udescriptor: "online_domain_check" -## filter variables: -## - name: air_temperature_at_2m -## test variables: -## - name: GeoVaLs/observable_domain_mask -## minvalue: 0.0 -## maxvalue: 0.5 - - filter: Domain Check # land only - where: - - variable: - name: GeoVaLs/fraction_of_land - minvalue: 0.5 - actions: -# - name: set -# flag: land_check -# ignore: rejected observations - - name: reject - - filter: Domain Check # land only, no sea ice - where: - - variable: - name: GeoVaLs/fraction_of_ice - maxvalue: 0.0 - actions: -# - name: set -# flag: seaice_check -# ignore: rejected observations - - name: reject - - filter: Domain Check # no snow - where: - - variable: - name: GeoVaLs/sheleg - maxvalue: 0.0 - actions: -# - name: set -# flag: snow_check -# ignore: rejected observations - - name: reject - - filter: RejectList # no land-ice - where: - - variable: - name: GeoVaLs/vtype - minvalue: 14.5 - maxvalue: 15.5 - actions: -# - name: set -# flag: landice_check -# ignore: rejected observations - - name: reject - - filter: RejectList # exclude certain IGBP vegetation types - where: - - variable: - name: GeoVaLs/vtype - absolute_tolerance: 1.0e-3 - is_close_to_any_of: [1, 2, 3, 4, 13, 15, 17] - actions: -# - name: set -# flag: vegtype_check -# ignore: rejected observations - - name: reject - - # Initial error assignment - - filter: Perform Action - udescriptor: "initial_error_assignment" - filter variables: - - name: air_temperature_at_2m - where: - - variable: ObsType/air_temperature_at_2m - is_in: 181 - 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] - errors: [1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056] - -# # Reduce observation error and turn off ObsErrorFactorPressureCheck (l_gsd_terrain_match_surfTobs=.true., l_sfcobserror_ramp_t=.true.,) -# - filter: Perform Action -# filter variables: -# - name: air_temperature_at_2m -# action: -# name: inflate error -# inflation factor: 0.5 -# -# # Error inflation based on pressure check (setupt.f90) ##>>requires non-sfc geov -# - filter: Perform Action -# udescriptor: "error_inflation_pressure_check" -# filter variables: -# - name: air_temperature_at_2m -# where: -# - variable: ObsType/air_temperature_at_2m -# is_in: 181 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorPressureCheck -# options: -# variable: air_temperature_at_2m -# surface observation error ramp: true -# max levels below surface: 15 -# inflation factor: 8.0 -# -## # Error inflation based on errormod (qcmod.f90) -## - filter: Perform Action -## filter variables: -## - name: air_temperature_at_2m -## where: -## - variable: ObsType/air_temperature_at_2m -## is_in: 181 -## action: -## name: inflate error -## inflation variable: -## name: ObsFunction/ObsErrorFactorConventional -## options: -## inflate variables: [air_temperature_at_2m] -## pressure: MetaData/pressure - - # Error inflation when QualityMarker == 3 (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_QualityMarker" - filter variables: - - name: air_temperature_at_2m - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: QualityMarker/air_temperature_at_2m - is_in: 3 - - variable: ObsType/air_temperature_at_2m - is_in: 181 - - # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_observation_pressure" - filter variables: - - name: air_temperature_at_2m - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: MetaData/pressure - maxvalue: 10000.0 - - variable: ObsType/air_temperature_at_2m - is_in: 181 - - # Bounds Check (ObsError) - - filter: Bounds Check - udescriptor: "bounds_check_ObsError" - filter variables: - - name: air_temperature_at_2m - test variables: - - name: ObsErrorData/air_temperature_at_2m - minvalue: 0.0 - maxvalue: 1000 - where: - - variable: ObsType/air_temperature_at_2m - is_in: 181 - action: - name: reduce obs space - - # Bounds Check (ObsValue) - - filter: Bounds Check - udescriptor: "bounds_check_ObsValue" - filter variables: - - name: air_temperature_at_2m - minvalue: 100 - maxvalue: 400 - where: - - variable: ObsType/air_temperature_at_2m - is_in: 181 - action: - name: reduce obs space - - # Create temporary ObsErrorData - - filter: Variable Assignment - udescriptor: "create_temporary_ObsErrorData" - apply at iterations: 0,1 - where: - - variable: ObsType/air_temperature_at_2m - is_in: 181 - assignments: - - name: TempObsErrorData/air_temperature_at_2m - type: float - function: - name: ObsFunction/Arithmetic - options: - variables: - - name: ObsErrorData/air_temperature_at_2m - defer to post: true - - # Set ObsError set "error parameter" if < "max value" - - filter: Perform Action - udescriptor: "ermin_set" - apply at iterations: 0,1 - filter variables: - - name: air_temperature_at_2m - action: - name: assign error - error parameter: 1.0 - where: - - variable: - name: ObsErrorData/air_temperature_at_2m - maxvalue: 1.0 - - variable: - name: ObsErrorData/air_temperature_at_2m - value: is_valid - - variable: ObsType/air_temperature_at_2m - is_in: 181 - defer to post: true - - # Set ObsError set "error parameter" if > "min value" - - filter: Perform Action - udescriptor: "ermax_set" - apply at iterations: 0,1 - filter variables: - - name: air_temperature_at_2m - action: - name: assign error - error parameter: 3.0 - where: - - variable: - name: ObsErrorData/air_temperature_at_2m - minvalue: 3.0 - - variable: - name: ObsErrorData/air_temperature_at_2m - value: is_valid - - variable: ObsType/air_temperature_at_2m - is_in: 181 - defer to post: true - - # Gross Error Check - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: air_temperature_at_2m - threshold: 5.0 - action: - name: reject - where: - - variable: QualityMarker/air_temperature_at_2m - is_not_in: 3 - - variable: ObsType/air_temperature_at_2m - is_in: 181 - defer to post: true - - # Gross Error Check: cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: air_temperature_at_2m - threshold: 3.5 - action: - name: reject - where: - - variable: QualityMarker/air_temperature_at_2m - is_in: 3 - - variable: ObsType/air_temperature_at_2m - is_in: 181 - defer to post: true - - # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. - - filter: Perform Action - udescriptor: "reassign_error_TempObsErrorData" - apply at iterations: 0,1 - filter variables: - - name: air_temperature_at_2m - action: - name: assign error - error function: TempObsErrorData/air_temperature_at_2m - where: - - variable: - name: TempObsErrorData/air_temperature_at_2m - value: is_valid - - variable: ObsType/air_temperature_at_2m - is_in: 181 - defer to post: true - - #- filter: GOMsaver - # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_183.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_183.yaml.j2 deleted file mode 100644 index b186ce87e..000000000 --- a/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_183.yaml.j2 +++ /dev/null @@ -1,348 +0,0 @@ - - obs space: - name: adpsfc_airTemperature_183 - obsdatain: - engine: - type: H5File - obsfile: "data/obs/ioda_adpsfc.nc" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - sort variable: "pressure" - sort order: "descending" - obsdataout: - empty obs space action: "{{empty_obs_space_action}}" - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: jdiag_adpsfc_airTemperature_183.nc - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [airTemperature] - simulated variables: [airTemperature] - - obs operator: - name: VertInterp - vertical coordinate: air_pressure - observation vertical coordinate: pressure - observation vertical coordinate group: MetaData - interpolation method: log-linear - variables: - - name: airTemperature - - linear obs operator: - name: VertInterp - - obs error: - covariance model: diagonal - - obs filters: - # ------------------ - # airTemperature (183) - # ------------------ - # Accept, reject, or passivate (monitor) - - filter: Perform Action - udescriptor: "iuse_check" - filter variables: - - name: airTemperature - where: - - variable: ObsType/airTemperature - is_in: 183 - action: - name: {{iuse_adpsfc_airTemperature_183 | default("passivate", true)}} # accept, reject, passivate - - # Reject all obs not in type - - filter: Perform Action - udescriptor: "obs_type_check" - where: - - variable: ObsValue/airTemperature - value: is_not_valid - action: - name: reduce obs space - - # Reject all obs not in kx - - filter: Perform Action - udescriptor: "obs_kx_check" - where: - - variable: ObsType/airTemperature - is_not_in: 183 - action: - name: reduce obs space - - # Reject all obs with QualityMarker > 3 - - filter: RejectList - udescriptor: "quality_marker_check" - filter variables: - - name: airTemperature - where: - - variable: QualityMarker/airTemperature - is_in: 4-15 - value: is_not_valid - where operator: or - action: - name: reduce obs space - - # Time window filter - - filter: Bounds Check - udescriptor: "time_window_check" - filter variables: - - name: airTemperature - test variables: - - name: MetaData/timeOffset - minvalue: -900 - maxvalue: 900 - where: - - variable: ObsType/airTemperature - is_in: 183 - action: - name: reduce obs space - - # Duplicate Check - - filter: Temporal Thinning - udescriptor: "duplicate_check" - filter variables: - - name: airTemperature - min_spacing: PT90M - tolerance: PT0H - seed_time: "{{atmosphere_background_time_iso}}" - category_variable: - name: MetaData/longitude_latitude_pressure - where: - - variable: ObsType/airTemperature - is_in: 183 - action: - name: reduce obs space - - # Online regional domain check - - filter: Bounds Check - udescriptor: "online_domain_check" - filter variables: - - name: airTemperature - test variables: - - name: GeoVaLs/observable_domain_mask - minvalue: 0.0 - maxvalue: 0.5 - - # Initial error assignment - - filter: Perform Action - udescriptor: "initial_error_assignment" - filter variables: - - name: airTemperature - where: - - variable: ObsType/airTemperature - is_in: 183 - 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] - errors: [2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349] - -# # Reduce observation error and turn off ObsErrorFactorPressureCheck (l_gsd_terrain_match_surfTobs=.true., l_sfcobserror_ramp_t=.true.,) -# - filter: Perform Action -# filter variables: -# - name: airTemperature -# action: -# name: inflate error -# inflation factor: 0.5 - - # Error inflation based on pressure check (setupt.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: airTemperature - where: - - variable: ObsType/airTemperature - is_in: 183 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: airTemperature - surface observation error ramp: true - max levels below surface: 15 - inflation factor: 8.0 - -# # Error inflation based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: airTemperature -# where: -# - variable: ObsType/airTemperature -# is_in: 183 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [airTemperature] -# pressure: MetaData/pressure - - # Error inflation when QualityMarker == 3 (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_QualityMarker" - filter variables: - - name: airTemperature - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: QualityMarker/airTemperature - is_in: 3 - - variable: ObsType/airTemperature - is_in: 183 - - # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_observation_pressure" - filter variables: - - name: airTemperature - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: MetaData/pressure - maxvalue: 10000.0 - - variable: ObsType/airTemperature - is_in: 183 - - # Bounds Check (ObsError) - - filter: Bounds Check - udescriptor: "bounds_check_ObsError" - filter variables: - - name: airTemperature - test variables: - - name: ObsErrorData/airTemperature - minvalue: 0.0 - maxvalue: 1000 - where: - - variable: ObsType/airTemperature - is_in: 183 - action: - name: reduce obs space - - # Bounds Check (ObsValue) - - filter: Bounds Check - udescriptor: "bounds_check_ObsValue" - filter variables: - - name: airTemperature - minvalue: 100 - maxvalue: 400 - where: - - variable: ObsType/airTemperature - is_in: 183 - action: - name: reduce obs space - - # Create temporary ObsErrorData - - filter: Variable Assignment - udescriptor: "create_temporary_ObsErrorData" - apply at iterations: 0,1 - where: - - variable: ObsType/airTemperature - is_in: 183 - assignments: - - name: TempObsErrorData/airTemperature - type: float - function: - name: ObsFunction/Arithmetic - options: - variables: - - name: ObsErrorData/airTemperature - defer to post: true - - # Set ObsError set "error parameter" if < "max value" - - filter: Perform Action - udescriptor: "ermin_set" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - action: - name: assign error - error parameter: 1.0 - where: - - variable: - name: ObsErrorData/airTemperature - maxvalue: 1.0 - - variable: - name: ObsErrorData/airTemperature - value: is_valid - - variable: ObsType/airTemperature - is_in: 183 - defer to post: true - - # Set ObsError set "error parameter" if > "min value" - - filter: Perform Action - udescriptor: "ermax_set" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - action: - name: assign error - error parameter: 3.0 - where: - - variable: - name: ObsErrorData/airTemperature - minvalue: 3.0 - - variable: - name: ObsErrorData/airTemperature - value: is_valid - - variable: ObsType/airTemperature - is_in: 183 - defer to post: true - - # Gross Error Check - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - threshold: 5.0 - action: - name: reject - where: - - variable: QualityMarker/airTemperature - is_not_in: 3 - - variable: ObsType/airTemperature - is_in: 183 - defer to post: true - - # Gross Error Check: cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - threshold: 3.5 - action: - name: reject - where: - - variable: QualityMarker/airTemperature - is_in: 3 - - variable: ObsType/airTemperature - is_in: 183 - defer to post: true - - # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. - - filter: Perform Action - udescriptor: "reassign_error_TempObsErrorData" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - action: - name: assign error - error function: TempObsErrorData/airTemperature - where: - - variable: - name: TempObsErrorData/airTemperature - value: is_valid - - variable: ObsType/airTemperature - is_in: 183 - defer to post: true - - #- filter: GOMsaver - # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_187.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_187.yaml.j2 deleted file mode 100644 index b255008ef..000000000 --- a/parm/jcb-gdas/observations/soil/adpsfc_airTemperature_187.yaml.j2 +++ /dev/null @@ -1,348 +0,0 @@ - - obs space: - name: adpsfc_airTemperature_187 - obsdatain: - engine: - type: H5File - obsfile: "data/obs/ioda_adpsfc.nc" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - sort variable: "pressure" - sort order: "descending" - obsdataout: - empty obs space action: "{{empty_obs_space_action}}" - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: jdiag_adpsfc_airTemperature_187.nc - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [airTemperature] - simulated variables: [airTemperature] - - obs operator: - name: VertInterp - vertical coordinate: air_pressure - observation vertical coordinate: pressure - observation vertical coordinate group: MetaData - interpolation method: log-linear - variables: - - name: airTemperature - - linear obs operator: - name: VertInterp - - obs error: - covariance model: diagonal - - obs filters: - # ------------------ - # airTemperature (187) - # ------------------ - # Accept, reject, or passivate (monitor) - - filter: Perform Action - udescriptor: "iuse_check" - filter variables: - - name: airTemperature - where: - - variable: ObsType/airTemperature - is_in: 187 - action: - name: {{iuse_adpsfc_airTemperature_187 | default("passivate", true)}} # accept, reject, passivate - - # Reject all obs not in type - - filter: Perform Action - udescriptor: "obs_type_check" - where: - - variable: ObsValue/airTemperature - value: is_not_valid - action: - name: reduce obs space - - # Reject all obs not in kx - - filter: Perform Action - udescriptor: "obs_kx_check" - where: - - variable: ObsType/airTemperature - is_not_in: 187 - action: - name: reduce obs space - - # Reject all obs with QualityMarker > 3 - - filter: RejectList - udescriptor: "quality_marker_check" - filter variables: - - name: airTemperature - where: - - variable: QualityMarker/airTemperature - is_in: 4-15 - value: is_not_valid - where operator: or - action: - name: reduce obs space - - # Time window filter - - filter: Bounds Check - udescriptor: "time_window_check" - filter variables: - - name: airTemperature - test variables: - - name: MetaData/timeOffset - minvalue: -900 - maxvalue: 900 - where: - - variable: ObsType/airTemperature - is_in: 187 - action: - name: reduce obs space - - # Duplicate Check - - filter: Temporal Thinning - udescriptor: "duplicate_check" - filter variables: - - name: airTemperature - min_spacing: PT90M - tolerance: PT0H - seed_time: "{{atmosphere_background_time_iso}}" - category_variable: - name: MetaData/longitude_latitude_pressure - where: - - variable: ObsType/airTemperature - is_in: 187 - action: - name: reduce obs space - - # Online regional domain check - - filter: Bounds Check - udescriptor: "online_domain_check" - filter variables: - - name: airTemperature - test variables: - - name: GeoVaLs/observable_domain_mask - minvalue: 0.0 - maxvalue: 0.5 - - # Initial error assignment - - filter: Perform Action - udescriptor: "initial_error_assignment" - filter variables: - - name: airTemperature - where: - - variable: ObsType/airTemperature - is_in: 187 - 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] - errors: [2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585, 2.2585] - -# # Reduce observation error and turn off ObsErrorFactorPressureCheck (l_gsd_terrain_match_surfTobs=.true., l_sfcobserror_ramp_t=.true.,) -# - filter: Perform Action -# filter variables: -# - name: airTemperature -# action: -# name: inflate error -# inflation factor: 0.5 - - # Error inflation based on pressure check (setupt.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: airTemperature - where: - - variable: ObsType/airTemperature - is_in: 187 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: airTemperature - surface observation error ramp: true - max levels below surface: 15 - inflation factor: 8.0 - -# # Error inflation based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: airTemperature -# where: -# - variable: ObsType/airTemperature -# is_in: 187 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [airTemperature] -# pressure: MetaData/pressure - - # Error inflation when QualityMarker == 3 (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_QualityMarker" - filter variables: - - name: airTemperature - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: QualityMarker/airTemperature - is_in: 3 - - variable: ObsType/airTemperature - is_in: 187 - - # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_observation_pressure" - filter variables: - - name: airTemperature - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: MetaData/pressure - maxvalue: 10000.0 - - variable: ObsType/airTemperature - is_in: 187 - - # Bounds Check (ObsError) - - filter: Bounds Check - udescriptor: "bounds_check_ObsError" - filter variables: - - name: airTemperature - test variables: - - name: ObsErrorData/airTemperature - minvalue: 0.0 - maxvalue: 1000 - where: - - variable: ObsType/airTemperature - is_in: 187 - action: - name: reduce obs space - - # Bounds Check (ObsValue) - - filter: Bounds Check - udescriptor: "bounds_check_ObsValue" - filter variables: - - name: airTemperature - minvalue: 100 - maxvalue: 400 - where: - - variable: ObsType/airTemperature - is_in: 187 - action: - name: reduce obs space - - # Create temporary ObsErrorData - - filter: Variable Assignment - udescriptor: "create_temporary_ObsErrorData" - apply at iterations: 0,1 - where: - - variable: ObsType/airTemperature - is_in: 187 - assignments: - - name: TempObsErrorData/airTemperature - type: float - function: - name: ObsFunction/Arithmetic - options: - variables: - - name: ObsErrorData/airTemperature - defer to post: true - - # Set ObsError set "error parameter" if < "max value" - - filter: Perform Action - udescriptor: "ermin_set" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - action: - name: assign error - error parameter: 1.0 - where: - - variable: - name: ObsErrorData/airTemperature - maxvalue: 1.0 - - variable: - name: ObsErrorData/airTemperature - value: is_valid - - variable: ObsType/airTemperature - is_in: 187 - defer to post: true - - # Set ObsError set "error parameter" if > "min value" - - filter: Perform Action - udescriptor: "ermax_set" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - action: - name: assign error - error parameter: 3.0 - where: - - variable: - name: ObsErrorData/airTemperature - minvalue: 3.0 - - variable: - name: ObsErrorData/airTemperature - value: is_valid - - variable: ObsType/airTemperature - is_in: 187 - defer to post: true - - # Gross Error Check - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - threshold: 5.0 - action: - name: reject - where: - - variable: QualityMarker/airTemperature - is_not_in: 3 - - variable: ObsType/airTemperature - is_in: 187 - defer to post: true - - # Gross Error Check: cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - threshold: 3.5 - action: - name: reject - where: - - variable: QualityMarker/airTemperature - is_in: 3 - - variable: ObsType/airTemperature - is_in: 187 - defer to post: true - - # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. - - filter: Perform Action - udescriptor: "reassign_error_TempObsErrorData" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - action: - name: assign error - error function: TempObsErrorData/airTemperature - where: - - variable: - name: TempObsErrorData/airTemperature - value: is_valid - - variable: ObsType/airTemperature - is_in: 187 - defer to post: true - - #- filter: GOMsaver - # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/adpsfc_air_temperature_at_2m_181_gsi.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_air_temperature_at_2m_181_gsi.yaml.j2 deleted file mode 100644 index 4a25d20b8..000000000 --- a/parm/jcb-gdas/observations/soil/adpsfc_air_temperature_at_2m_181_gsi.yaml.j2 +++ /dev/null @@ -1,448 +0,0 @@ -- - # Observation Space (I/O) - # ----------------------- - - obs space: - name: {{observation_from_jcb}} -{% if algorithm == "local_ensemble_da" %} - distribution: - name: {{distribution_type}} - halo size: "{{halo_size}}" -{% endif %} - obsdatain: - engine: - type: H5File - obsfile: "{{soil_obsdatain_path}}/{{soil_obsdatain_prefix}}{{observation_from_jcb}}{{atmosphere_obsdatain_suffix}}" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - obsdataout: - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: "{{soil_obsdataout_path}}/{{soil_obsdataout_prefix}}{{observation_from_jcb}}{{soil_obsdataout_suffix}}" - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [air_temperature_at_2m] -#airTemperature] -# derived variables: [air_temperature_at_2m] - simulated variables: [air_temperature_at_2m] - - obs operator: - name: Identity - - # localization TODO: generalize this condioned on da algo - # ------------ -{% if algorithm == "local_ensemble_da" %} - obs localizations: - - localization method: {{localization_method}} - lengthscale: {{loc_length_scale}} - max nobs: {{max_nobs}} -{% endif %} - - obs error: - covariance model: diagonal - -# obs pre filters: -# - filter: Variable Assignment -# assignments: -# - name: DerivedObsValue/air_temperature_at_2m -# type: float -# function: -# name: ObsFunction/Arithmetic -# options: -# variables: [ObsValue/air_temperature_at_2m] -# total exponent: 1. - -# obs filters: -# - filter: Variable Assignment -# assignments: -# - name: DerivedObsValue/air_temperature_at_2m -# type: float -# source variable: -# name: ObsValue/airTemperature - - - obs filters: -# # ------------------ -# # air_temperature_at_2m (181) -# # ------------------ -# # Accept, reject, or passivate (monitor) -# - filter: Perform Action -# udescriptor: "iuse_check" -# filter variables: -# - name: air_temperature_at_2m -# where: -# - variable: ObsType/air_temperature_at_2m -# is_in: 181 -# action: -# name: {{iuse_adpsfc_air_temperature_at_2m_181 | default("passivate", true)}} # accept, reject, passivate -# - - filter: PreQC - inputQC: 'GsiEffectiveQCGes' -#GsiEffectiveQCAnl' - maxvalue: 0.0 - action: - name: reject -#************ -#* -#* -#* # Reject all obs not in type -#* - filter: Perform Action -#* udescriptor: "obs_type_check" -#* where: -#* - variable: ObsValue/air_temperature_at_2m -#* value: is_not_valid -#* action: -#* name: reduce obs space -#* -#* # Reject all obs not in kx -#* - filter: Perform Action -#* udescriptor: "obs_kx_check" -#* where: -#* - variable: ObsType/air_temperature_at_2m -#* is_not_in: 181 -#* action: -#* name: reduce obs space -#* -#* # Reject all obs with QualityMarker > 3 -#* - filter: RejectList -#* udescriptor: "quality_marker_check" -#* filter variables: -#* - name: air_temperature_at_2m -#* where: -#* - variable: QualityMarker/air_temperature_at_2m -#* is_in: 4-15 -#* value: is_not_valid -#* where operator: or -#* action: -#* name: reduce obs space -#* -#* # Time window filter -#* - filter: Bounds Check -#* udescriptor: "time_window_check" -#* filter variables: -#* - name: air_temperature_at_2m -#* test variables: -#* - name: MetaData/timeOffset #s -#* minvalue: -10800 #-900 -#* maxvalue: 10800 #900 -#* where: -#* - variable: ObsType/air_temperature_at_2m -#* is_in: 181 -#* action: -#* name: reduce obs space -#* -#*# # Duplicate Check -#*# - filter: Temporal Thinning -#*# udescriptor: "duplicate_check" -#*# filter variables: -#*# - name: air_temperature_at_2m -#*## min_spacing: PT90M -#*# min_spacing: '{{ window_length }}' -#*# tolerance: PT0H -#*# seed_time: "{{soil_background_time_iso}}" -#*# category_variable: -#*# name: MetaData/stationIdentification -#*##MetaData/longitude_latitude_pressure -#*# where: -#*# - variable: ObsType/air_temperature_at_2m -#*# is_in: 181 -#*# action: -#*# name: reduce obs space -#* -#*## # Online regional domain check -#*## - filter: Bounds Check -#*## udescriptor: "online_domain_check" -#*## filter variables: -#*## - name: air_temperature_at_2m -#*## test variables: -#*## - name: GeoVaLs/observable_domain_mask -#*## minvalue: 0.0 -#*## maxvalue: 0.5 -#* - filter: Domain Check # land only -#* where: -#* - variable: -#* name: GeoVaLs/fraction_of_land -#* minvalue: 0.5 -#* actions: -#*# - name: set -#*# flag: land_check -#*# ignore: rejected observations -#* - name: reject -#* - filter: Domain Check # land only, no sea ice -#* where: -#* - variable: -#* name: GeoVaLs/fraction_of_ice -#* maxvalue: 0.0 -#* actions: -#*# - name: set -#*# flag: seaice_check -#*# ignore: rejected observations -#* - name: reject -#* - filter: Domain Check # no snow -#* where: -#* - variable: -#* name: GeoVaLs/sheleg -#* maxvalue: 0.0 -#* actions: -#*# - name: set -#*# flag: snow_check -#*# ignore: rejected observations -#* - name: reject -#* - filter: RejectList # no land-ice -#* where: -#* - variable: -#* name: GeoVaLs/vtype -#* minvalue: 14.5 -#* maxvalue: 15.5 -#* actions: -#*# - name: set -#*# flag: landice_check -#*# ignore: rejected observations -#* - name: reject -#* - filter: RejectList # exclude certain IGBP vegetation types -#* where: -#* - variable: -#* name: GeoVaLs/vtype -#* absolute_tolerance: 1.0e-3 -#* is_close_to_any_of: [1, 2, 3, 4, 13, 15, 17] -#* actions: -#*# - name: set -#*# flag: vegtype_check -#*# ignore: rejected observations -#* - name: reject - - # Initial error assignment - - filter: Perform Action - udescriptor: "initial_error_assignment" - filter variables: - - name: air_temperature_at_2m - where: - - variable: ObsTypeGes/air_temperature_at_2m - is_in: 181 - action: - name: assign error -# error parameter: 2.0 - error function: -#---this might be better name: GsiFinalObsErrorGes/air_temperature_at_2m - name: ObsFunction/Arithmetic - options: - variables: [GsiFinalObsErrorGes/air_temperature_at_2m] -#GsiFinalObsErrorAnl/air_temperature_at_2m] -# total exponent: 1. - -#* 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] -#* errors: [1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056] - -# # Reduce observation error and turn off ObsErrorFactorPressureCheck (l_gsd_terrain_match_surfTobs=.true., l_sfcobserror_ramp_t=.true.,) -# - filter: Perform Action -# filter variables: -# - name: air_temperature_at_2m -# action: -# name: inflate error -# inflation factor: 0.5 -# -# # Error inflation based on pressure check (setupt.f90) ##>>requires non-sfc geov -# - filter: Perform Action -# udescriptor: "error_inflation_pressure_check" -# filter variables: -# - name: air_temperature_at_2m -# where: -# - variable: ObsType/air_temperature_at_2m -# is_in: 181 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorPressureCheck -# options: -# variable: air_temperature_at_2m -# surface observation error ramp: true -# max levels below surface: 15 -# inflation factor: 8.0 -# -## # Error inflation based on errormod (qcmod.f90) -## - filter: Perform Action -## filter variables: -## - name: air_temperature_at_2m -## where: -## - variable: ObsType/air_temperature_at_2m -## is_in: 181 -## action: -## name: inflate error -## inflation variable: -## name: ObsFunction/ObsErrorFactorConventional -## options: -## inflate variables: [air_temperature_at_2m] -## pressure: MetaData/pressure -#* -#* # Error inflation when QualityMarker == 3 (read_prepbufr.f90) -#* - filter: Perform Action -#* udescriptor: "error_inflation_QualityMarker" -#* filter variables: -#* - name: air_temperature_at_2m -#* action: -#* name: inflate error -#* inflation factor: 1.2 -#* where: -#* - variable: QualityMarker/air_temperature_at_2m -#* is_in: 3 -#* - variable: ObsType/air_temperature_at_2m -#* is_in: 181 -#* -#* # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) -#* - filter: Perform Action -#* udescriptor: "error_inflation_observation_pressure" -#* filter variables: -#* - name: air_temperature_at_2m -#* action: -#* name: inflate error -#* inflation factor: 1.2 -#* where: -#* - variable: MetaData/pressure -#* maxvalue: 10000.0 -#* - variable: ObsType/air_temperature_at_2m -#* is_in: 181 -#* -#* # Bounds Check (ObsError) -#* - filter: Bounds Check -#* udescriptor: "bounds_check_ObsError" -#* filter variables: -#* - name: air_temperature_at_2m -#* test variables: -#* - name: ObsErrorData/air_temperature_at_2m -#* minvalue: 0.0 -#* maxvalue: 1000 -#* where: -#* - variable: ObsType/air_temperature_at_2m -#* is_in: 181 -#* action: -#* name: reduce obs space -#* -#* # Bounds Check (ObsValue) -#* - filter: Bounds Check -#* udescriptor: "bounds_check_ObsValue" -#* filter variables: -#* - name: air_temperature_at_2m -#* minvalue: 100 -#* maxvalue: 400 -#* where: -#* - variable: ObsType/air_temperature_at_2m -#* is_in: 181 -#* action: -#* name: reduce obs space -#* -#* # Create temporary ObsErrorData -#* - filter: Variable Assignment -#* udescriptor: "create_temporary_ObsErrorData" -#* apply at iterations: 0,1 -#* where: -#* - variable: ObsType/air_temperature_at_2m -#* is_in: 181 -#* assignments: -#* - name: TempObsErrorData/air_temperature_at_2m -#* type: float -#* function: -#* name: ObsFunction/Arithmetic -#* options: -#* variables: -#* - name: ObsErrorData/air_temperature_at_2m -#* defer to post: true -#* -#* # Set ObsError set "error parameter" if < "max value" -#* - filter: Perform Action -#* udescriptor: "ermin_set" -#* apply at iterations: 0,1 -#* filter variables: -#* - name: air_temperature_at_2m -#* action: -#* name: assign error -#* error parameter: 1.0 -#* where: -#* - variable: -#* name: ObsErrorData/air_temperature_at_2m -#* maxvalue: 1.0 -#* - variable: -#* name: ObsErrorData/air_temperature_at_2m -#* value: is_valid -#* - variable: ObsType/air_temperature_at_2m -#* is_in: 181 -#* defer to post: true -#* -#* # Set ObsError set "error parameter" if > "min value" -#* - filter: Perform Action -#* udescriptor: "ermax_set" -#* apply at iterations: 0,1 -#* filter variables: -#* - name: air_temperature_at_2m -#* action: -#* name: assign error -#* error parameter: 3.0 -#* where: -#* - variable: -#* name: ObsErrorData/air_temperature_at_2m -#* minvalue: 3.0 -#* - variable: -#* name: ObsErrorData/air_temperature_at_2m -#* value: is_valid -#* - variable: ObsType/air_temperature_at_2m -#* is_in: 181 -#* defer to post: true -#* -#* # Gross Error Check -#* - filter: Background Check -#* udescriptor: "gross_error_check" -#* apply at iterations: 0,1 -#* filter variables: -#* - name: air_temperature_at_2m -#* threshold: 5.0 -#* action: -#* name: reject -#* where: -#* - variable: QualityMarker/air_temperature_at_2m -#* is_not_in: 3 -#* - variable: ObsType/air_temperature_at_2m -#* is_in: 181 -#* defer to post: true -#* -#* # Gross Error Check: cgross*0.7 if QualityMarker=3 -#* - filter: Background Check -#* udescriptor: "gross_error_check_0.7" -#* apply at iterations: 0,1 -#* filter variables: -#* - name: air_temperature_at_2m -#* threshold: 3.5 -#* action: -#* name: reject -#* where: -#* - variable: QualityMarker/air_temperature_at_2m -#* is_in: 3 -#* - variable: ObsType/air_temperature_at_2m -#* is_in: 181 -#* defer to post: true -#* -#* # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. -#* - filter: Perform Action -#* udescriptor: "reassign_error_TempObsErrorData" -#* apply at iterations: 0,1 -#* filter variables: -#* - name: air_temperature_at_2m -#* action: -#* name: assign error -#* error function: TempObsErrorData/air_temperature_at_2m -#* where: -#* - variable: -#* name: TempObsErrorData/air_temperature_at_2m -#* value: is_valid -#* - variable: ObsType/air_temperature_at_2m -#* is_in: 181 -#* defer to post: true -#* -#* #- filter: GOMsaver -#* # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/adpsfc_specificHumidity_181.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_specificHumidity_181.yaml.j2 deleted file mode 100644 index b7defa4dd..000000000 --- a/parm/jcb-gdas/observations/soil/adpsfc_specificHumidity_181.yaml.j2 +++ /dev/null @@ -1,340 +0,0 @@ - - obs space: - name: adpsfc_specificHumidity_181 - obsdatain: - engine: - type: H5File - obsfile: "data/obs/ioda_adpsfc.nc" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - sort variable: "pressure" - sort order: "descending" - obsdataout: - empty obs space action: "{{empty_obs_space_action}}" - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: jdiag_adpsfc_specificHumidity_181.nc - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [specificHumidity] - simulated variables: [specificHumidity] - - obs operator: - name: VertInterp - vertical coordinate: air_pressure - observation vertical coordinate: pressure - observation vertical coordinate group: MetaData - interpolation method: log-linear - variables: - - name: specificHumidity - - linear obs operator: - name: VertInterp - - obs error: - covariance model: diagonal - - obs filters: - # ------------------ - # specificHumidity (181) - # ------------------ - # Accept, reject, or passivate (monitor) - - filter: Perform Action - udescriptor: "iuse_check" - filter variables: - - name: specificHumidity - where: - - variable: ObsType/specificHumidity - is_in: 181 - action: - name: {{iuse_adpsfc_specificHumidity_181 | default("passivate", true)}} # accept, reject, passivate - - # Reject all obs not in type - - filter: Perform Action - udescriptor: "obs_type_check" - where: - - variable: ObsValue/specificHumidity - value: is_not_valid - action: - name: reduce obs space - - # Reject all obs not in kx - - filter: Perform Action - udescriptor: "obs_kx_check" - where: - - variable: ObsType/specificHumidity - is_not_in: 181 - action: - name: reduce obs space - - # Reject all obs with QualityMarker > 3 - - filter: RejectList - udescriptor: "quality_marker_check" - filter variables: - - name: specificHumidity - where: - - variable: QualityMarker/specificHumidity - is_in: 4-15 - value: is_not_valid - where operator: or - action: - name: reduce obs space - - # Time window filter - - filter: Bounds Check - udescriptor: "time_window_check" - filter variables: - - name: specificHumidity - test variables: - - name: MetaData/timeOffset - minvalue: -900 - maxvalue: 900 - where: - - variable: ObsType/specificHumidity - is_in: 181 - action: - name: reduce obs space - - # Duplicate Check - - filter: Temporal Thinning - udescriptor: "duplicate_check" - filter variables: - - name: specificHumidity - min_spacing: PT90M - tolerance: PT0H - seed_time: "{{atmosphere_background_time_iso}}" - category_variable: - name: MetaData/longitude_latitude_pressure - where: - - variable: ObsType/specificHumidity - is_in: 181 - action: - name: reduce obs space - - # Online regional domain check - - filter: Bounds Check - udescriptor: "online_domain_check" - filter variables: - - name: specificHumidity - test variables: - - name: GeoVaLs/observable_domain_mask - minvalue: 0.0 - maxvalue: 0.5 - - # Initial error assignment - - filter: Perform Action - udescriptor: "initial_error_assignment" - filter variables: - - name: specificHumidity - where: - - variable: ObsType/specificHumidity - is_in: 181 - 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] - errors: [0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912] - - # Error inflation based on pressure check (setupq.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: specificHumidity - where: - - variable: ObsType/specificHumidity - is_in: 181 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: specificHumidity - surface observation error ramp: true - max levels below surface: 15 - inflation factor: 8.0 - -# # Error inflation based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: specificHumidity -# where: -# - variable: ObsType/specificHumidity -# is_in: 181 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [specificHumidity] -# pressure: MetaData/pressure - - # Error inflation when QualityMarker == 3 (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_QualityMarker" - filter variables: - - name: specificHumidity - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: QualityMarker/specificHumidity - is_in: 3 - - variable: ObsType/specificHumidity - is_in: 181 - - # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_observation_pressure" - filter variables: - - name: specificHumidity - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: MetaData/pressure - maxvalue: 10000.0 - - variable: ObsType/specificHumidity - is_in: 181 - - # Bounds Check (ObsError) - - filter: Bounds Check - udescriptor: "bounds_check_ObsError" - filter variables: - - name: specificHumidity - test variables: - - name: ObsErrorData/specificHumidity - minvalue: 0.0 - maxvalue: 1000 - where: - - variable: ObsType/specificHumidity - is_in: 181 - action: - name: reduce obs space - - # Bounds Check (ObsValue) - - filter: Bounds Check - udescriptor: "bounds_check_ObsValue" - filter variables: - - name: specificHumidity - minvalue: 0.0 - maxvalue: 1.0 - where: - - variable: ObsType/specificHumidity - is_in: 181 - action: - name: reduce obs space - - # Create temporary ObsErrorData - - filter: Variable Assignment - udescriptor: "create_temporary_ObsErrorData" - apply at iterations: 0,1 - where: - - variable: ObsType/specificHumidity - is_in: 181 - assignments: - - name: TempObsErrorData/specificHumidity - type: float - function: - name: ObsFunction/Arithmetic - options: - variables: - - name: ObsErrorData/specificHumidity - defer to post: true - - # Set ObsError set "error parameter" if < "max value" - - filter: Perform Action - udescriptor: "ermin_set" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - action: - name: assign error - error parameter: 5.0 - where: - - variable: - name: ObsErrorData/specificHumidity - maxvalue: 5.0 - - variable: - name: ObsErrorData/specificHumidity - value: is_valid - - variable: ObsType/specificHumidity - is_in: 181 - defer to post: true - - # Set ObsError set "error parameter" if > "min value" - - filter: Perform Action - udescriptor: "ermax_set" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - action: - name: assign error - error parameter: 50.0 - where: - - variable: - name: ObsErrorData/specificHumidity - minvalue: 50.0 - - variable: - name: ObsErrorData/specificHumidity - value: is_valid - - variable: ObsType/specificHumidity - is_in: 181 - defer to post: true - - # Gross Error Check - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - threshold: 7.0 - action: - name: reject - where: - - variable: QualityMarker/specificHumidity - is_not_in: 3 - - variable: ObsType/specificHumidity - is_in: 181 - defer to post: true - - # Gross Error Check: cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - threshold: 4.9 - action: - name: reject - where: - - variable: QualityMarker/specificHumidity - is_in: 3 - - variable: ObsType/specificHumidity - is_in: 181 - defer to post: true - - # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. - - filter: Perform Action - udescriptor: "reassign_error_TempObsErrorData" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - action: - name: assign error - error function: TempObsErrorData/specificHumidity - where: - - variable: - name: TempObsErrorData/specificHumidity - value: is_valid - - variable: ObsType/specificHumidity - is_in: 181 - defer to post: true - - #- filter: GOMsaver - # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/adpsfc_specificHumidity_183.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_specificHumidity_183.yaml.j2 deleted file mode 100644 index 9affaa5ca..000000000 --- a/parm/jcb-gdas/observations/soil/adpsfc_specificHumidity_183.yaml.j2 +++ /dev/null @@ -1,340 +0,0 @@ - - obs space: - name: adpsfc_specificHumidity_183 - obsdatain: - engine: - type: H5File - obsfile: "data/obs/ioda_adpsfc.nc" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - sort variable: "pressure" - sort order: "descending" - obsdataout: - empty obs space action: "{{empty_obs_space_action}}" - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: jdiag_adpsfc_specificHumidity_183.nc - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [specificHumidity] - simulated variables: [specificHumidity] - - obs operator: - name: VertInterp - vertical coordinate: air_pressure - observation vertical coordinate: pressure - observation vertical coordinate group: MetaData - interpolation method: log-linear - variables: - - name: specificHumidity - - linear obs operator: - name: VertInterp - - obs error: - covariance model: diagonal - - obs filters: - # ------------------ - # specificHumidity (183) - # ------------------ - # Accept, reject, or passivate (monitor) - - filter: Perform Action - udescriptor: "iuse_check" - filter variables: - - name: specificHumidity - where: - - variable: ObsType/specificHumidity - is_in: 183 - action: - name: {{iuse_adpsfc_specificHumidity_183 | default("passivate", true)}} # accept, reject, passivate - - # Reject all obs not in type - - filter: Perform Action - udescriptor: "obs_type_check" - where: - - variable: ObsValue/specificHumidity - value: is_not_valid - action: - name: reduce obs space - - # Reject all obs not in kx - - filter: Perform Action - udescriptor: "obs_kx_check" - where: - - variable: ObsType/specificHumidity - is_not_in: 183 - action: - name: reduce obs space - - # Reject all obs with QualityMarker > 3 - - filter: RejectList - udescriptor: "quality_marker_check" - filter variables: - - name: specificHumidity - where: - - variable: QualityMarker/specificHumidity - is_in: 4-15 - value: is_not_valid - where operator: or - action: - name: reduce obs space - - # Time window filter - - filter: Bounds Check - udescriptor: "time_window_check" - filter variables: - - name: specificHumidity - test variables: - - name: MetaData/timeOffset - minvalue: -900 - maxvalue: 900 - where: - - variable: ObsType/specificHumidity - is_in: 183 - action: - name: reduce obs space - - # Duplicate Check - - filter: Temporal Thinning - udescriptor: "duplicate_check" - filter variables: - - name: specificHumidity - min_spacing: PT90M - tolerance: PT0H - seed_time: "{{atmosphere_background_time_iso}}" - category_variable: - name: MetaData/longitude_latitude_pressure - where: - - variable: ObsType/specificHumidity - is_in: 183 - action: - name: reduce obs space - - # Online regional domain check - - filter: Bounds Check - udescriptor: "online_domain_check" - filter variables: - - name: specificHumidity - test variables: - - name: GeoVaLs/observable_domain_mask - minvalue: 0.0 - maxvalue: 0.5 - - # Initial error assignment - - filter: Perform Action - udescriptor: "initial_error_assignment" - filter variables: - - name: specificHumidity - where: - - variable: ObsType/specificHumidity - is_in: 183 - 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] - errors: [0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912] - - # Error inflation based on pressure check (setupq.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: specificHumidity - where: - - variable: ObsType/specificHumidity - is_in: 183 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: specificHumidity - surface observation error ramp: true - max levels below surface: 15 - inflation factor: 8.0 - -# # Error inflation based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: specificHumidity -# where: -# - variable: ObsType/specificHumidity -# is_in: 183 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [specificHumidity] -# pressure: MetaData/pressure - - # Error inflation when QualityMarker == 3 (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_QualityMarker" - filter variables: - - name: specificHumidity - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: QualityMarker/specificHumidity - is_in: 3 - - variable: ObsType/specificHumidity - is_in: 183 - - # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_observation_pressure" - filter variables: - - name: specificHumidity - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: MetaData/pressure - maxvalue: 10000.0 - - variable: ObsType/specificHumidity - is_in: 183 - - # Bounds Check (ObsError) - - filter: Bounds Check - udescriptor: "bounds_check_ObsError" - filter variables: - - name: specificHumidity - test variables: - - name: ObsErrorData/specificHumidity - minvalue: 0.0 - maxvalue: 1000 - where: - - variable: ObsType/specificHumidity - is_in: 183 - action: - name: reduce obs space - - # Bounds Check (ObsValue) - - filter: Bounds Check - udescriptor: "bounds_check_ObsValue" - filter variables: - - name: specificHumidity - minvalue: 0.0 - maxvalue: 1.0 - where: - - variable: ObsType/specificHumidity - is_in: 183 - action: - name: reduce obs space - - # Create temporary ObsErrorData - - filter: Variable Assignment - udescriptor: "create_temporary_ObsErrorData" - apply at iterations: 0,1 - where: - - variable: ObsType/specificHumidity - is_in: 183 - assignments: - - name: TempObsErrorData/specificHumidity - type: float - function: - name: ObsFunction/Arithmetic - options: - variables: - - name: ObsErrorData/specificHumidity - defer to post: true - - # Set ObsError set "error parameter" if < "max value" - - filter: Perform Action - udescriptor: "ermin_set" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - action: - name: assign error - error parameter: 5.0 - where: - - variable: - name: ObsErrorData/specificHumidity - maxvalue: 5.0 - - variable: - name: ObsErrorData/specificHumidity - value: is_valid - - variable: ObsType/specificHumidity - is_in: 183 - defer to post: true - - # Set ObsError set "error parameter" if > "min value" - - filter: Perform Action - udescriptor: "ermax_set" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - action: - name: assign error - error parameter: 50.0 - where: - - variable: - name: ObsErrorData/specificHumidity - minvalue: 50.0 - - variable: - name: ObsErrorData/specificHumidity - value: is_valid - - variable: ObsType/specificHumidity - is_in: 183 - defer to post: true - - # Gross Error Check - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - threshold: 7.0 - action: - name: reject - where: - - variable: QualityMarker/specificHumidity - is_not_in: 3 - - variable: ObsType/specificHumidity - is_in: 183 - defer to post: true - - # Gross Error Check: cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - threshold: 4.9 - action: - name: reject - where: - - variable: QualityMarker/specificHumidity - is_in: 3 - - variable: ObsType/specificHumidity - is_in: 183 - defer to post: true - - # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. - - filter: Perform Action - udescriptor: "reassign_error_TempObsErrorData" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - action: - name: assign error - error function: TempObsErrorData/specificHumidity - where: - - variable: - name: TempObsErrorData/specificHumidity - value: is_valid - - variable: ObsType/specificHumidity - is_in: 183 - defer to post: true - - #- filter: GOMsaver - # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/adpsfc_specificHumidity_187.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_specificHumidity_187.yaml.j2 deleted file mode 100644 index dfa9c9ce1..000000000 --- a/parm/jcb-gdas/observations/soil/adpsfc_specificHumidity_187.yaml.j2 +++ /dev/null @@ -1,340 +0,0 @@ - - obs space: - name: adpsfc_specificHumidity_187 - obsdatain: - engine: - type: H5File - obsfile: "data/obs/ioda_adpsfc.nc" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - sort variable: "pressure" - sort order: "descending" - obsdataout: - empty obs space action: "{{empty_obs_space_action}}" - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: jdiag_adpsfc_specificHumidity_187.nc - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [specificHumidity] - simulated variables: [specificHumidity] - - obs operator: - name: VertInterp - vertical coordinate: air_pressure - observation vertical coordinate: pressure - observation vertical coordinate group: MetaData - interpolation method: log-linear - variables: - - name: specificHumidity - - linear obs operator: - name: VertInterp - - obs error: - covariance model: diagonal - - obs filters: - # ------------------ - # specificHumidity (187) - # ------------------ - # Accept, reject, or passivate (monitor) - - filter: Perform Action - udescriptor: "iuse_check" - filter variables: - - name: specificHumidity - where: - - variable: ObsType/specificHumidity - is_in: 187 - action: - name: {{iuse_adpsfc_specificHumidity_187 | default("passivate", true)}} # accept, reject, passivate - - # Reject all obs not in type - - filter: Perform Action - udescriptor: "obs_type_check" - where: - - variable: ObsValue/specificHumidity - value: is_not_valid - action: - name: reduce obs space - - # Reject all obs not in kx - - filter: Perform Action - udescriptor: "obs_kx_check" - where: - - variable: ObsType/specificHumidity - is_not_in: 187 - action: - name: reduce obs space - - # Reject all obs with QualityMarker > 3 - - filter: RejectList - udescriptor: "quality_marker_check" - filter variables: - - name: specificHumidity - where: - - variable: QualityMarker/specificHumidity - is_in: 4-15 - value: is_not_valid - where operator: or - action: - name: reduce obs space - - # Time window filter - - filter: Bounds Check - udescriptor: "time_window_check" - filter variables: - - name: specificHumidity - test variables: - - name: MetaData/timeOffset - minvalue: -900 - maxvalue: 900 - where: - - variable: ObsType/specificHumidity - is_in: 187 - action: - name: reduce obs space - - # Duplicate Check - - filter: Temporal Thinning - udescriptor: "duplicate_check" - filter variables: - - name: specificHumidity - min_spacing: PT90M - tolerance: PT0H - seed_time: "{{atmosphere_background_time_iso}}" - category_variable: - name: MetaData/longitude_latitude_pressure - where: - - variable: ObsType/specificHumidity - is_in: 187 - action: - name: reduce obs space - - # Online regional domain check - - filter: Bounds Check - udescriptor: "online_domain_check" - filter variables: - - name: specificHumidity - test variables: - - name: GeoVaLs/observable_domain_mask - minvalue: 0.0 - maxvalue: 0.5 - - # Initial error assignment - - filter: Perform Action - udescriptor: "initial_error_assignment" - filter variables: - - name: specificHumidity - where: - - variable: ObsType/specificHumidity - is_in: 187 - 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] - errors: [0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912] - - # Error inflation based on pressure check (setupq.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: specificHumidity - where: - - variable: ObsType/specificHumidity - is_in: 187 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: specificHumidity - surface observation error ramp: true - max levels below surface: 15 - inflation factor: 8.0 - -# # Error inflation based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: specificHumidity -# where: -# - variable: ObsType/specificHumidity -# is_in: 187 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [specificHumidity] -# pressure: MetaData/pressure - - # Error inflation when QualityMarker == 3 (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_QualityMarker" - filter variables: - - name: specificHumidity - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: QualityMarker/specificHumidity - is_in: 3 - - variable: ObsType/specificHumidity - is_in: 187 - - # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_observation_pressure" - filter variables: - - name: specificHumidity - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: MetaData/pressure - maxvalue: 10000.0 - - variable: ObsType/specificHumidity - is_in: 187 - - # Bounds Check (ObsError) - - filter: Bounds Check - udescriptor: "bounds_check_ObsError" - filter variables: - - name: specificHumidity - test variables: - - name: ObsErrorData/specificHumidity - minvalue: 0.0 - maxvalue: 1000 - where: - - variable: ObsType/specificHumidity - is_in: 187 - action: - name: reduce obs space - - # Bounds Check (ObsValue) - - filter: Bounds Check - udescriptor: "bounds_check_ObsValue" - filter variables: - - name: specificHumidity - minvalue: 0.0 - maxvalue: 1.0 - where: - - variable: ObsType/specificHumidity - is_in: 187 - action: - name: reduce obs space - - # Create temporary ObsErrorData - - filter: Variable Assignment - udescriptor: "create_temporary_ObsErrorData" - apply at iterations: 0,1 - where: - - variable: ObsType/specificHumidity - is_in: 187 - assignments: - - name: TempObsErrorData/specificHumidity - type: float - function: - name: ObsFunction/Arithmetic - options: - variables: - - name: ObsErrorData/specificHumidity - defer to post: true - - # Set ObsError set "error parameter" if < "max value" - - filter: Perform Action - udescriptor: "ermin_set" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - action: - name: assign error - error parameter: 5.0 - where: - - variable: - name: ObsErrorData/specificHumidity - maxvalue: 5.0 - - variable: - name: ObsErrorData/specificHumidity - value: is_valid - - variable: ObsType/specificHumidity - is_in: 187 - defer to post: true - - # Set ObsError set "error parameter" if > "min value" - - filter: Perform Action - udescriptor: "ermax_set" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - action: - name: assign error - error parameter: 50.0 - where: - - variable: - name: ObsErrorData/specificHumidity - minvalue: 50.0 - - variable: - name: ObsErrorData/specificHumidity - value: is_valid - - variable: ObsType/specificHumidity - is_in: 187 - defer to post: true - - # Gross Error Check - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - threshold: 7.0 - action: - name: reject - where: - - variable: QualityMarker/specificHumidity - is_not_in: 3 - - variable: ObsType/specificHumidity - is_in: 187 - defer to post: true - - # Gross Error Check: cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - threshold: 4.9 - action: - name: reject - where: - - variable: QualityMarker/specificHumidity - is_in: 3 - - variable: ObsType/specificHumidity - is_in: 187 - defer to post: true - - # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. - - filter: Perform Action - udescriptor: "reassign_error_TempObsErrorData" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - action: - name: assign error - error function: TempObsErrorData/specificHumidity - where: - - variable: - name: TempObsErrorData/specificHumidity - value: is_valid - - variable: ObsType/specificHumidity - is_in: 187 - defer to post: true - - #- filter: GOMsaver - # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/adpsfc_stationPressure_181.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_stationPressure_181.yaml.j2 deleted file mode 100644 index 47d357526..000000000 --- a/parm/jcb-gdas/observations/soil/adpsfc_stationPressure_181.yaml.j2 +++ /dev/null @@ -1,334 +0,0 @@ - - obs space: - name: adpsfc_stationPressure_181 - obsdatain: - engine: - type: H5File - obsfile: "data/obs/ioda_adpsfc.nc" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - sort variable: "pressure" - sort order: "descending" - obsdataout: - empty obs space action: "{{empty_obs_space_action}}" - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: jdiag_adpsfc_stationPressure_181.nc - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [stationPressure] - simulated variables: [stationPressure] - - obs operator: - name: SfcCorrected - correction scheme to use: GSL - geovar_sfc_geomz: geopotential_height_at_surface - geovar_geomz: geopotential_height - linear obs operator: - name: Identity - - obs error: - covariance model: diagonal - - obs filters: - # ------------------ - # stationPressure (181) - # ------------------ - # Accept, reject, or passivate (monitor) - - filter: Perform Action - udescriptor: "iuse_check" - filter variables: - - name: stationPressure - where: - - variable: ObsType/stationPressure - is_in: 181 - action: - name: {{iuse_adpsfc_stationPressure_181 | default("passivate", true)}} # accept, reject, passivate - - # Reject all obs not in type - - filter: Perform Action - udescriptor: "obs_type_check" - where: - - variable: ObsValue/stationPressure - value: is_not_valid - action: - name: reduce obs space - - # Reject all obs not in kx - - filter: Perform Action - udescriptor: "obs_kx_check" - where: - - variable: ObsType/stationPressure - is_not_in: 181 - action: - name: reduce obs space - - # Reject all obs with QualityMarker > 3 - - filter: RejectList - udescriptor: "quality_marker_check" - filter variables: - - name: stationPressure - where: - - variable: QualityMarker/stationPressure - is_in: 4-15 - value: is_not_valid - where operator: or - action: - name: reduce obs space - - # Time window filter - - filter: Bounds Check - udescriptor: "time_window_check" - filter variables: - - name: stationPressure - test variables: - - name: MetaData/timeOffset - minvalue: -900 - maxvalue: 900 - where: - - variable: ObsType/stationPressure - is_in: 181 - action: - name: reduce obs space - - # Duplicate Check - - filter: Temporal Thinning - udescriptor: "duplicate_check" - filter variables: - - name: stationPressure - min_spacing: PT90M - tolerance: PT0H - seed_time: "{{atmosphere_background_time_iso}}" - category_variable: - name: MetaData/longitude_latitude_pressure - where: - - variable: ObsType/stationPressure - is_in: 181 - action: - name: reduce obs space - - # Online regional domain check - - filter: Bounds Check - udescriptor: "online_domain_check" - filter variables: - - name: stationPressure - test variables: - - name: GeoVaLs/observable_domain_mask - minvalue: 0.0 - maxvalue: 0.5 - - # Initial error assignment - - filter: Perform Action - udescriptor: "initial_error_assignment" - filter variables: - - name: stationPressure - where: - - variable: ObsType/stationPressure - is_in: 181 - 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] - errors: [53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11] - - # Error inflation based on pressure check (setupps.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: stationPressure - where: - - variable: ObsType/stationPressure - is_in: 181 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorSfcPressure - options: - geovar_geomz: geopotential_height - geovar_sfc_geomz: geopotential_height_at_surface - -# # Error inflation based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: stationPressure -# where: -# - variable: ObsType/stationPressure -# is_in: 181 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [stationPressure] -# pressure: MetaData/pressure - - # Error inflation when QualityMarker == 3 (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_QualityMarker" - filter variables: - - name: stationPressure - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: QualityMarker/stationPressure - is_in: 3 - - variable: ObsType/stationPressure - is_in: 181 - - # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_observation_pressure" - filter variables: - - name: stationPressure - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: MetaData/pressure - maxvalue: 10000.0 - - variable: ObsType/stationPressure - is_in: 181 - - # Bounds Check (ObsError) - - filter: Bounds Check - udescriptor: "bounds_check_ObsError" - filter variables: - - name: stationPressure - test variables: - - name: ObsErrorData/stationPressure - minvalue: 0.0 - maxvalue: 1000 - where: - - variable: ObsType/stationPressure - is_in: 181 - action: - name: reduce obs space - - # Bounds Check (ObsValue) - - filter: Bounds Check - udescriptor: "bounds_check_ObsValue" - filter variables: - - name: stationPressure - minvalue: 20000.0 - maxvalue: 120000.0 - where: - - variable: ObsType/stationPressure - is_in: 181 - action: - name: reduce obs space - - # Create temporary ObsErrorData - - filter: Variable Assignment - udescriptor: "create_temporary_ObsErrorData" - apply at iterations: 0,1 - where: - - variable: ObsType/stationPressure - is_in: 181 - assignments: - - name: TempObsErrorData/stationPressure - type: float - function: - name: ObsFunction/Arithmetic - options: - variables: - - name: ObsErrorData/stationPressure - defer to post: true - - # Set ObsError set "error parameter" if < "max value" - - filter: Perform Action - udescriptor: "ermin_set" - apply at iterations: 0,1 - filter variables: - - name: stationPressure - action: - name: assign error - error parameter: 100.0 - where: - - variable: - name: ObsErrorData/stationPressure - maxvalue: 100.0 - - variable: - name: ObsErrorData/stationPressure - value: is_valid - - variable: ObsType/stationPressure - is_in: 181 - defer to post: true - - # Set ObsError set "error parameter" if > "min value" - - filter: Perform Action - udescriptor: "ermax_set" - apply at iterations: 0,1 - filter variables: - - name: stationPressure - action: - name: assign error - error parameter: 300.0 - where: - - variable: - name: ObsErrorData/stationPressure - minvalue: 300.0 - - variable: - name: ObsErrorData/stationPressure - value: is_valid - - variable: ObsType/stationPressure - is_in: 181 - defer to post: true - - # Gross Error Check - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: stationPressure - threshold: 5.0 - action: - name: reject - where: - - variable: QualityMarker/stationPressure - is_not_in: 3 - - variable: ObsType/stationPressure - is_in: 181 - defer to post: true - - # Gross Error Check: cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: stationPressure - threshold: 3.5 - action: - name: reject - where: - - variable: QualityMarker/stationPressure - is_in: 3 - - variable: ObsType/stationPressure - is_in: 181 - defer to post: true - - # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. - - filter: Perform Action - udescriptor: "reassign_error_TempObsErrorData" - apply at iterations: 0,1 - filter variables: - - name: stationPressure - action: - name: assign error - error function: TempObsErrorData/stationPressure - where: - - variable: - name: TempObsErrorData/stationPressure - value: is_valid - - variable: ObsType/stationPressure - is_in: 181 - defer to post: true - - #- filter: GOMsaver - # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/adpsfc_stationPressure_187.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_stationPressure_187.yaml.j2 deleted file mode 100644 index cdc611f5a..000000000 --- a/parm/jcb-gdas/observations/soil/adpsfc_stationPressure_187.yaml.j2 +++ /dev/null @@ -1,334 +0,0 @@ - - obs space: - name: adpsfc_stationPressure_187 - obsdatain: - engine: - type: H5File - obsfile: "data/obs/ioda_adpsfc.nc" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - sort variable: "pressure" - sort order: "descending" - obsdataout: - empty obs space action: "{{empty_obs_space_action}}" - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: jdiag_adpsfc_stationPressure_187.nc - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [stationPressure] - simulated variables: [stationPressure] - - obs operator: - name: SfcCorrected - correction scheme to use: GSL - geovar_sfc_geomz: geopotential_height_at_surface - geovar_geomz: geopotential_height - linear obs operator: - name: Identity - - obs error: - covariance model: diagonal - - obs filters: - # ------------------ - # stationPressure (187) - # ------------------ - # Accept, reject, or passivate (monitor) - - filter: Perform Action - udescriptor: "iuse_check" - filter variables: - - name: stationPressure - where: - - variable: ObsType/stationPressure - is_in: 187 - action: - name: {{iuse_adpsfc_stationPressure_187 | default("passivate", true)}} # accept, reject, passivate - - # Reject all obs not in type - - filter: Perform Action - udescriptor: "obs_type_check" - where: - - variable: ObsValue/stationPressure - value: is_not_valid - action: - name: reduce obs space - - # Reject all obs not in kx - - filter: Perform Action - udescriptor: "obs_kx_check" - where: - - variable: ObsType/stationPressure - is_not_in: 187 - action: - name: reduce obs space - - # Reject all obs with QualityMarker > 3 - - filter: RejectList - udescriptor: "quality_marker_check" - filter variables: - - name: stationPressure - where: - - variable: QualityMarker/stationPressure - is_in: 4-15 - value: is_not_valid - where operator: or - action: - name: reduce obs space - - # Time window filter - - filter: Bounds Check - udescriptor: "time_window_check" - filter variables: - - name: stationPressure - test variables: - - name: MetaData/timeOffset - minvalue: -900 - maxvalue: 900 - where: - - variable: ObsType/stationPressure - is_in: 187 - action: - name: reduce obs space - - # Duplicate Check - - filter: Temporal Thinning - udescriptor: "duplicate_check" - filter variables: - - name: stationPressure - min_spacing: PT90M - tolerance: PT0H - seed_time: "{{atmosphere_background_time_iso}}" - category_variable: - name: MetaData/longitude_latitude_pressure - where: - - variable: ObsType/stationPressure - is_in: 187 - action: - name: reduce obs space - - # Online regional domain check - - filter: Bounds Check - udescriptor: "online_domain_check" - filter variables: - - name: stationPressure - test variables: - - name: GeoVaLs/observable_domain_mask - minvalue: 0.0 - maxvalue: 0.5 - - # Initial error assignment - - filter: Perform Action - udescriptor: "initial_error_assignment" - filter variables: - - name: stationPressure - where: - - variable: ObsType/stationPressure - is_in: 187 - 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] - errors: [53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11] - - # Error inflation based on pressure check (setupps.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: stationPressure - where: - - variable: ObsType/stationPressure - is_in: 187 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorSfcPressure - options: - geovar_geomz: geopotential_height - geovar_sfc_geomz: geopotential_height_at_surface - -# # Error inflation based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: stationPressure -# where: -# - variable: ObsType/stationPressure -# is_in: 187 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [stationPressure] -# pressure: MetaData/pressure - - # Error inflation when QualityMarker == 3 (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_QualityMarker" - filter variables: - - name: stationPressure - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: QualityMarker/stationPressure - is_in: 3 - - variable: ObsType/stationPressure - is_in: 187 - - # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_observation_pressure" - filter variables: - - name: stationPressure - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: MetaData/pressure - maxvalue: 10000.0 - - variable: ObsType/stationPressure - is_in: 187 - - # Bounds Check (ObsError) - - filter: Bounds Check - udescriptor: "bounds_check_ObsError" - filter variables: - - name: stationPressure - test variables: - - name: ObsErrorData/stationPressure - minvalue: 0.0 - maxvalue: 1000 - where: - - variable: ObsType/stationPressure - is_in: 187 - action: - name: reduce obs space - - # Bounds Check (ObsValue) - - filter: Bounds Check - udescriptor: "bounds_check_ObsValue" - filter variables: - - name: stationPressure - minvalue: 20000.0 - maxvalue: 120000.0 - where: - - variable: ObsType/stationPressure - is_in: 187 - action: - name: reduce obs space - - # Create temporary ObsErrorData - - filter: Variable Assignment - udescriptor: "create_temporary_ObsErrorData" - apply at iterations: 0,1 - where: - - variable: ObsType/stationPressure - is_in: 187 - assignments: - - name: TempObsErrorData/stationPressure - type: float - function: - name: ObsFunction/Arithmetic - options: - variables: - - name: ObsErrorData/stationPressure - defer to post: true - - # Set ObsError set "error parameter" if < "max value" - - filter: Perform Action - udescriptor: "ermin_set" - apply at iterations: 0,1 - filter variables: - - name: stationPressure - action: - name: assign error - error parameter: 100.0 - where: - - variable: - name: ObsErrorData/stationPressure - maxvalue: 100.0 - - variable: - name: ObsErrorData/stationPressure - value: is_valid - - variable: ObsType/stationPressure - is_in: 187 - defer to post: true - - # Set ObsError set "error parameter" if > "min value" - - filter: Perform Action - udescriptor: "ermax_set" - apply at iterations: 0,1 - filter variables: - - name: stationPressure - action: - name: assign error - error parameter: 300.0 - where: - - variable: - name: ObsErrorData/stationPressure - minvalue: 300.0 - - variable: - name: ObsErrorData/stationPressure - value: is_valid - - variable: ObsType/stationPressure - is_in: 187 - defer to post: true - - # Gross Error Check - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: stationPressure - threshold: 5.0 - action: - name: reject - where: - - variable: QualityMarker/stationPressure - is_not_in: 3 - - variable: ObsType/stationPressure - is_in: 187 - defer to post: true - - # Gross Error Check: cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: stationPressure - threshold: 3.5 - action: - name: reject - where: - - variable: QualityMarker/stationPressure - is_in: 3 - - variable: ObsType/stationPressure - is_in: 187 - defer to post: true - - # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. - - filter: Perform Action - udescriptor: "reassign_error_TempObsErrorData" - apply at iterations: 0,1 - filter variables: - - name: stationPressure - action: - name: assign error - error function: TempObsErrorData/stationPressure - where: - - variable: - name: TempObsErrorData/stationPressure - value: is_valid - - variable: ObsType/stationPressure - is_in: 187 - defer to post: true - - #- filter: GOMsaver - # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/adpsfc_winds_281.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_winds_281.yaml.j2 deleted file mode 100644 index 4e57f245a..000000000 --- a/parm/jcb-gdas/observations/soil/adpsfc_winds_281.yaml.j2 +++ /dev/null @@ -1,370 +0,0 @@ - - obs space: - name: adpsfc_winds_281 - obsdatain: - engine: - type: H5File - obsfile: "data/obs/ioda_adpsfc.nc" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - sort variable: "pressure" - sort order: "descending" - obsdataout: - empty obs space action: "{{empty_obs_space_action}}" - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: jdiag_adpsfc_winds_281.nc - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [windEastward, windNorthward] - simulated variables: [windEastward, windNorthward] - - obs operator: - name: VertInterp - vertical coordinate: air_pressure - observation vertical coordinate: pressure - observation vertical coordinate group: MetaData - interpolation method: log-linear - variables: - - name: windEastward - - name: windNorthward - - linear obs operator: - name: VertInterp - - obs error: - covariance model: diagonal - - obs filters: - # ------------------ - # wind (281) - # ------------------ - # Accept, reject, or passivate (monitor) - - filter: Perform Action - udescriptor: "iuse_check" - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 281 - action: - name: {{iuse_adpsfc_winds_281 | default("passivate", true)}} # accept, reject, passivate - - # Reject all obs not in type - - filter: Perform Action - udescriptor: "obs_type_check" - where: - - variable: ObsValue/windEastward - value: is_not_valid - action: - name: reduce obs space - - # Reject all obs not in kx - - filter: Perform Action - udescriptor: "obs_kx_check" - where: - - variable: ObsType/windEastward - is_not_in: 281 - action: - name: reduce obs space - - # Reject all obs with QualityMarker > 3 - - filter: RejectList - udescriptor: "quality_marker_check" - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: QualityMarker/windEastward - is_in: 4-15 - value: is_not_valid - where operator: or - action: - name: reduce obs space - - # Time window filter - - filter: Bounds Check - udescriptor: "time_window_check" - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: MetaData/timeOffset - minvalue: -900 - maxvalue: 900 - where: - - variable: ObsType/windEastward - is_in: 281 - action: - name: reduce obs space - - # Duplicate Check - - filter: Temporal Thinning - udescriptor: "duplicate_check" - filter variables: - - name: windEastward - - name: windNorthward - min_spacing: PT90M - tolerance: PT0H - seed_time: "{{atmosphere_background_time_iso}}" - category_variable: - name: MetaData/longitude_latitude_pressure - where: - - variable: ObsType/windEastward - is_in: 281 - action: - name: reduce obs space - - # Online domain check - - filter: Bounds Check - udescriptor: "online_domain_check" - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: GeoVaLs/observable_domain_mask - minvalue: 0.0 - maxvalue: 0.5 - - # Initial error assignment - - filter: Perform Action - udescriptor: "initial_error_assignment" - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 281 - 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] - errors: [1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874] - - # Error inflation (windEastward) based on pressure check (setupw.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: windEastward - where: - - variable: ObsType/windEastward - is_in: 281 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: windEastward - inflation factor: 4.0 - SetSfcWndObsHeight: true - AddObsHeightToStationElevation: true - AssumedSfcWndObsHeight: 10 - - # Error inflation (windNorthward) based on pressure check (setupw.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: windNorthward - where: - - variable: ObsType/windNorthward - is_in: 281 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: windNorthward - inflation factor: 4.0 - SetSfcWndObsHeight: true - AddObsHeightToStationElevation: true - AssumedSfcWndObsHeight: 10 - -# # Error inflation (windEastward) based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: windEastward -# where: -# - variable: ObsType/windEastward -# is_in: 281 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [windEastward] -# test QCflag: QualityMarker -# test QCthreshold: 3 -# distance threshold: 0 -# pressure: MetaData/pressure - -# # Error inflation (windNorthward) based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: windNorthward -# where: -# - variable: ObsType/windNorthward -# is_in: 281 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [windNorthward] -# test QCflag: QualityMarker -# test QCthreshold: 3 -# distance threshold: 0 -# pressure: MetaData/pressure - - # Error inflation when QualityMarker == 3 (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_QualityMarker" - filter variables: - - name: windEastward - - name: windNorthward - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: QualityMarker/windEastward - is_in: 3 - - variable: ObsType/windEastward - is_in: 281 - - # Error inflation when observation pressure < 50 hPa (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_observation_pressure" - filter variables: - - name: windEastward - - name: windNorthward - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: MetaData/pressure - maxvalue: 5000.0 - - variable: ObsType/windEastward - is_in: 281 - - # Bounds Check (ObsError) - - filter: Bounds Check - udescriptor: "bounds_check_ObsError" - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: ObsErrorData/windEastward - minvalue: 0.0 - maxvalue: 1000 - where: - - variable: ObsType/windEastward - is_in: 281 - action: - name: reduce obs space - - # Bounds Check (ObsValue) - - filter: Bounds Check - udescriptor: "bounds_check_ObsValue" - filter variables: - - name: windEastward - - name: windNorthward - minvalue: -130 - maxvalue: 130 - where: - - variable: ObsType/windEastward - is_in: 281 - action: - name: reduce obs space - - # Gross Error Check (windEastward) - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: windEastward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 281 ] - cgross: [ 5.0 ] - error_min: [ 1.0 ] - error_max: [ 5.0 ] - variable: windEastward - where: - - variable: QualityMarker/windEastward - is_not_in: 3 - action: - name: reject - defer to post: true - - # Gross Error Check (windNorthward) - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: windNorthward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 281 ] - cgross: [ 5.0 ] - error_min: [ 1.0 ] - error_max: [ 5.0 ] - variable: windNorthward - where: - - variable: QualityMarker/windNorthward - is_not_in: 3 - action: - name: reject - defer to post: true - - # Gross Error Check (windEastward): cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: windEastward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 281 ] - cgross: [ 3.5 ] - error_min: [ 1.0 ] - error_max: [ 5.0 ] - variable: windEastward - where: - - variable: QualityMarker/windEastward - is_in: 3 - action: - name: reject - defer to post: true - - # Gross Error Check (windNorthward): cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: windNorthward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 281 ] - cgross: [ 3.5 ] - error_min: [ 1.0 ] - error_max: [ 5.0 ] - variable: windNorthward - where: - - variable: QualityMarker/windNorthward - is_in: 3 - action: - name: reject - defer to post: true - - #- filter: GOMsaver - # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/adpsfc_winds_284.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_winds_284.yaml.j2 deleted file mode 100644 index 1a5beb3df..000000000 --- a/parm/jcb-gdas/observations/soil/adpsfc_winds_284.yaml.j2 +++ /dev/null @@ -1,370 +0,0 @@ - - obs space: - name: adpsfc_winds_284 - obsdatain: - engine: - type: H5File - obsfile: "data/obs/ioda_adpsfc.nc" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - sort variable: "pressure" - sort order: "descending" - obsdataout: - empty obs space action: "{{empty_obs_space_action}}" - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: jdiag_adpsfc_winds_284.nc - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [windEastward, windNorthward] - simulated variables: [windEastward, windNorthward] - - obs operator: - name: VertInterp - vertical coordinate: air_pressure - observation vertical coordinate: pressure - observation vertical coordinate group: MetaData - interpolation method: log-linear - variables: - - name: windEastward - - name: windNorthward - - linear obs operator: - name: VertInterp - - obs error: - covariance model: diagonal - - obs filters: - # ------------------ - # wind (284) - # ------------------ - # Accept, reject, or passivate (monitor) - - filter: Perform Action - udescriptor: "iuse_check" - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 284 - action: - name: {{iuse_adpsfc_winds_284 | default("passivate", true)}} # accept, reject, passivate - - # Reject all obs not in type - - filter: Perform Action - udescriptor: "obs_type_check" - where: - - variable: ObsValue/windEastward - value: is_not_valid - action: - name: reduce obs space - - # Reject all obs not in kx - - filter: Perform Action - udescriptor: "obs_kx_check" - where: - - variable: ObsType/windEastward - is_not_in: 284 - action: - name: reduce obs space - - # Reject all obs with QualityMarker > 3 - - filter: RejectList - udescriptor: "quality_marker_check" - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: QualityMarker/windEastward - is_in: 4-15 - value: is_not_valid - where operator: or - action: - name: reduce obs space - - # Time window filter - - filter: Bounds Check - udescriptor: "time_window_check" - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: MetaData/timeOffset - minvalue: -5400 - maxvalue: 5400 - where: - - variable: ObsType/windEastward - is_in: 284 - action: - name: reduce obs space - - # Duplicate Check - - filter: Temporal Thinning - udescriptor: "duplicate_check" - filter variables: - - name: windEastward - - name: windNorthward - min_spacing: PT90M - tolerance: PT0H - seed_time: "{{atmosphere_background_time_iso}}" - category_variable: - name: MetaData/longitude_latitude_pressure - where: - - variable: ObsType/windEastward - is_in: 284 - action: - name: reduce obs space - - # Online domain check - - filter: Bounds Check - udescriptor: "online_domain_check" - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: GeoVaLs/observable_domain_mask - minvalue: 0.0 - maxvalue: 0.5 - - # Initial error assignment - - filter: Perform Action - udescriptor: "initial_error_assignment" - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 284 - 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] - errors: [1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079] - - # Error inflation (windEastward) based on pressure check (setupw.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: windEastward - where: - - variable: ObsType/windEastward - is_in: 284 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: windEastward - inflation factor: 4.0 - SetSfcWndObsHeight: true - AddObsHeightToStationElevation: true - AssumedSfcWndObsHeight: 10 - - # Error inflation (windNorthward) based on pressure check (setupw.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: windNorthward - where: - - variable: ObsType/windNorthward - is_in: 284 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: windNorthward - inflation factor: 4.0 - SetSfcWndObsHeight: true - AddObsHeightToStationElevation: true - AssumedSfcWndObsHeight: 10 - -# # Error inflation (windEastward) based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: windEastward -# where: -# - variable: ObsType/windEastward -# is_in: 284 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [windEastward] -# test QCflag: QualityMarker -# test QCthreshold: 3 -# distance threshold: 0 -# pressure: MetaData/pressure - -# # Error inflation (windNorthward) based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: windNorthward -# where: -# - variable: ObsType/windNorthward -# is_in: 284 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [windNorthward] -# test QCflag: QualityMarker -# test QCthreshold: 3 -# distance threshold: 0 -# pressure: MetaData/pressure - - # Error inflation when QualityMarker == 3 (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_QualityMarker" - filter variables: - - name: windEastward - - name: windNorthward - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: QualityMarker/windEastward - is_in: 3 - - variable: ObsType/windEastward - is_in: 284 - - # Error inflation when observation pressure < 50 hPa (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_observation_pressure" - filter variables: - - name: windEastward - - name: windNorthward - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: MetaData/pressure - maxvalue: 5000.0 - - variable: ObsType/windEastward - is_in: 284 - - # Bounds Check (ObsError) - - filter: Bounds Check - udescriptor: "bounds_check_ObsError" - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: ObsErrorData/windEastward - minvalue: 0.0 - maxvalue: 1000 - where: - - variable: ObsType/windEastward - is_in: 284 - action: - name: reduce obs space - - # Bounds Check (ObsValue) - - filter: Bounds Check - udescriptor: "bounds_check_ObsValue" - filter variables: - - name: windEastward - - name: windNorthward - minvalue: -130 - maxvalue: 130 - where: - - variable: ObsType/windEastward - is_in: 284 - action: - name: reduce obs space - - # Gross Error Check (windEastward) - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: windEastward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 284 ] - cgross: [ 5.0 ] - error_min: [ 1.0 ] - error_max: [ 5.0 ] - variable: windEastward - where: - - variable: QualityMarker/windEastward - is_not_in: 3 - action: - name: reject - defer to post: true - - # Gross Error Check (windNorthward) - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: windNorthward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 284 ] - cgross: [ 5.0 ] - error_min: [ 1.0 ] - error_max: [ 5.0 ] - variable: windNorthward - where: - - variable: QualityMarker/windNorthward - is_not_in: 3 - action: - name: reject - defer to post: true - - # Gross Error Check (windEastward): cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: windEastward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 284 ] - cgross: [ 3.5 ] - error_min: [ 1.0 ] - error_max: [ 5.0 ] - variable: windEastward - where: - - variable: QualityMarker/windEastward - is_in: 3 - action: - name: reject - defer to post: true - - # Gross Error Check (windNorthward): cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: windNorthward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 284 ] - cgross: [ 3.5 ] - error_min: [ 1.0 ] - error_max: [ 5.0 ] - variable: windNorthward - where: - - variable: QualityMarker/windNorthward - is_in: 3 - action: - name: reject - defer to post: true - - #- filter: GOMsaver - # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/adpsfc_winds_287.yaml.j2 b/parm/jcb-gdas/observations/soil/adpsfc_winds_287.yaml.j2 deleted file mode 100644 index 75c2f9661..000000000 --- a/parm/jcb-gdas/observations/soil/adpsfc_winds_287.yaml.j2 +++ /dev/null @@ -1,370 +0,0 @@ - - obs space: - name: adpsfc_winds_287 - obsdatain: - engine: - type: H5File - obsfile: "data/obs/ioda_adpsfc.nc" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - sort variable: "pressure" - sort order: "descending" - obsdataout: - empty obs space action: "{{empty_obs_space_action}}" - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: jdiag_adpsfc_winds_287.nc - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [windEastward, windNorthward] - simulated variables: [windEastward, windNorthward] - - obs operator: - name: VertInterp - vertical coordinate: air_pressure - observation vertical coordinate: pressure - observation vertical coordinate group: MetaData - interpolation method: log-linear - variables: - - name: windEastward - - name: windNorthward - - linear obs operator: - name: VertInterp - - obs error: - covariance model: diagonal - - obs filters: - # ------------------ - # wind (287) - # ------------------ - # Accept, reject, or passivate (monitor) - - filter: Perform Action - udescriptor: "iuse_check" - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 287 - action: - name: {{iuse_adpsfc_winds_287 | default("passivate", true)}} # accept, reject, passivate - - # Reject all obs not in type - - filter: Perform Action - udescriptor: "obs_type_check" - where: - - variable: ObsValue/windEastward - value: is_not_valid - action: - name: reduce obs space - - # Reject all obs not in kx - - filter: Perform Action - udescriptor: "obs_kx_check" - where: - - variable: ObsType/windEastward - is_not_in: 287 - action: - name: reduce obs space - - # Reject all obs with QualityMarker > 3 - - filter: RejectList - udescriptor: "quality_marker_check" - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: QualityMarker/windEastward - is_in: 4-15 - value: is_not_valid - where operator: or - action: - name: reduce obs space - - # Time window filter - - filter: Bounds Check - udescriptor: "time_window_check" - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: MetaData/timeOffset - minvalue: -900 - maxvalue: 900 - where: - - variable: ObsType/windEastward - is_in: 287 - action: - name: reduce obs space - - # Duplicate Check - - filter: Temporal Thinning - udescriptor: "duplicate_check" - filter variables: - - name: windEastward - - name: windNorthward - min_spacing: PT90M - tolerance: PT0H - seed_time: "{{atmosphere_background_time_iso}}" - category_variable: - name: MetaData/longitude_latitude_pressure - where: - - variable: ObsType/windEastward - is_in: 287 - action: - name: reduce obs space - - # Online domain check - - filter: Bounds Check - udescriptor: "online_domain_check" - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: GeoVaLs/observable_domain_mask - minvalue: 0.0 - maxvalue: 0.5 - - # Initial error assignment - - filter: Perform Action - udescriptor: "initial_error_assignment" - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 287 - 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] - errors: [1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874, 1.5874] - - # Error inflation (windEastward) based on pressure check (setupw.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: windEastward - where: - - variable: ObsType/windEastward - is_in: 287 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: windEastward - inflation factor: 4.0 - SetSfcWndObsHeight: true - AddObsHeightToStationElevation: true - AssumedSfcWndObsHeight: 10 - - # Error inflation (windNorthward) based on pressure check (setupw.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: windNorthward - where: - - variable: ObsType/windNorthward - is_in: 287 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: windNorthward - inflation factor: 4.0 - SetSfcWndObsHeight: true - AddObsHeightToStationElevation: true - AssumedSfcWndObsHeight: 10 - -# # Error inflation (windEastward) based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: windEastward -# where: -# - variable: ObsType/windEastward -# is_in: 287 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [windEastward] -# test QCflag: QualityMarker -# test QCthreshold: 3 -# distance threshold: 0 -# pressure: MetaData/pressure - -# # Error inflation (windNorthward) based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: windNorthward -# where: -# - variable: ObsType/windNorthward -# is_in: 287 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [windNorthward] -# test QCflag: QualityMarker -# test QCthreshold: 3 -# distance threshold: 0 -# pressure: MetaData/pressure - - # Error inflation when QualityMarker == 3 (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_QualityMarker" - filter variables: - - name: windEastward - - name: windNorthward - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: QualityMarker/windEastward - is_in: 3 - - variable: ObsType/windEastward - is_in: 287 - - # Error inflation when observation pressure < 50 hPa (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_observation_pressure" - filter variables: - - name: windEastward - - name: windNorthward - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: MetaData/pressure - maxvalue: 5000.0 - - variable: ObsType/windEastward - is_in: 287 - - # Bounds Check (ObsError) - - filter: Bounds Check - udescriptor: "bounds_check_ObsError" - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: ObsErrorData/windEastward - minvalue: 0.0 - maxvalue: 1000 - where: - - variable: ObsType/windEastward - is_in: 287 - action: - name: reduce obs space - - # Bounds Check (ObsValue) - - filter: Bounds Check - udescriptor: "bounds_check_ObsValue" - filter variables: - - name: windEastward - - name: windNorthward - minvalue: -130 - maxvalue: 130 - where: - - variable: ObsType/windEastward - is_in: 287 - action: - name: reduce obs space - - # Gross Error Check (windEastward) - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: windEastward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 287 ] - cgross: [ 5.0 ] - error_min: [ 1.0 ] - error_max: [ 5.0 ] - variable: windEastward - where: - - variable: QualityMarker/windEastward - is_not_in: 3 - action: - name: reject - defer to post: true - - # Gross Error Check (windNorthward) - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: windNorthward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 287 ] - cgross: [ 5.0 ] - error_min: [ 1.0 ] - error_max: [ 5.0 ] - variable: windNorthward - where: - - variable: QualityMarker/windNorthward - is_not_in: 3 - action: - name: reject - defer to post: true - - # Gross Error Check (windEastward): cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: windEastward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 287 ] - cgross: [ 3.5 ] - error_min: [ 1.0 ] - error_max: [ 5.0 ] - variable: windEastward - where: - - variable: QualityMarker/windEastward - is_in: 3 - action: - name: reject - defer to post: true - - # Gross Error Check (windNorthward): cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: windNorthward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 287 ] - cgross: [ 3.5 ] - error_min: [ 1.0 ] - error_max: [ 5.0 ] - variable: windNorthward - where: - - variable: QualityMarker/windNorthward - is_in: 3 - action: - name: reject - defer to post: true - - #- filter: GOMsaver - # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/bk_adpsfc_airTemperature_181.yaml.j2 b/parm/jcb-gdas/observations/soil/bk_adpsfc_airTemperature_181.yaml.j2 deleted file mode 100644 index 35050fbbd..000000000 --- a/parm/jcb-gdas/observations/soil/bk_adpsfc_airTemperature_181.yaml.j2 +++ /dev/null @@ -1,370 +0,0 @@ -- - # Observation Space (I/O) - # ----------------------- - - obs space: - name: {{observation_from_jcb}} -{% if algorithm == "local_ensemble_da" %} - distribution: - name: {{distribution_type}} - halo size: "{{halo_size}}" -{% endif %} - obsdatain: - engine: - type: H5File - obsfile: "{{soil_obsdatain_path}}/{{soil_obsdatain_prefix}}{{observation_from_jcb}}.nc" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - obsdataout: - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: "{{soil_obsdataout_path}}/{{soil_obsdataout_prefix}}{{observation_from_jcb}}{{soil_obsdataout_suffix}}" - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [air_temperature_at_2m] -#airTemperature] -# simulated variables: [airTemperature] -# derived variables: [air_temperature_at_2m] - simulated variables: [air_temperature_at_2m] - - obs operator: - name: Identity - - # localization TODO: generalize this condioned on da algo - # ------------ -{% if algorithm == "local_ensemble_da" %} - obs localizations: - - localization method: {{localization_method}} - lengthscale: {{loc_length_scale}} - max nobs: {{max_nobs}} -{% endif %} - - obs error: - covariance model: diagonal - -# obs pre filters: -# - filter: Variable Assignment -# assignments: -# - name: DerivedObsValue/air_temperature_at_2m -# type: float -# function: -# name: ObsFunction/Arithmetic -# options: -# variables: [ObsValue/airTemperature] -# total exponent: 1. - -# obs filters: -# # ------------------ -# # airTemperature (181) -# # ------------------ -# # Accept, reject, or passivate (monitor) -# - filter: Perform Action -# udescriptor: "iuse_check" -# filter variables: -# - name: airTemperature -# where: -# - variable: ObsType/airTemperature -# is_in: 181 -# action: -# name: {{iuse_adpsfc_airTemperature_181 | default("passivate", true)}} # accept, reject, passivate -# -# # Reject all obs not in type -# - filter: Perform Action -# udescriptor: "obs_type_check" -# where: -# - variable: ObsValue/airTemperature -# value: is_not_valid -# action: -# name: reduce obs space -# -# # Reject all obs not in kx -# - filter: Perform Action -# udescriptor: "obs_kx_check" -# where: -# - variable: ObsType/airTemperature -# is_not_in: 181 -# action: -# name: reduce obs space -# -# # Reject all obs with QualityMarker > 3 -# - filter: RejectList -# udescriptor: "quality_marker_check" -# filter variables: -# - name: airTemperature -# where: -# - variable: QualityMarker/airTemperature -# is_in: 4-15 -# value: is_not_valid -# where operator: or -# action: -# name: reduce obs space -# -# # Time window filter -# - filter: Bounds Check -# udescriptor: "time_window_check" -# filter variables: -# - name: airTemperature -# test variables: -# - name: MetaData/timeOffset -# minvalue: -900 -# maxvalue: 900 -# where: -# - variable: ObsType/airTemperature -# is_in: 181 -# action: -# name: reduce obs space -# -# # Duplicate Check -# - filter: Temporal Thinning -# udescriptor: "duplicate_check" -# filter variables: -# - name: airTemperature -# min_spacing: PT90M -## min_spacing: '{{ window_length }}' -# tolerance: PT0H -# seed_time: "{{soil_background_time_iso}}" -# category_variable: -# name: MetaData/stationIdentification -##MetaData/longitude_latitude_pressure -# where: -# - variable: ObsType/airTemperature -# is_in: 181 -# action: -# name: reduce obs space -# -## # Online regional domain check -## - filter: Bounds Check -## udescriptor: "online_domain_check" -## filter variables: -## - name: airTemperature -## test variables: -## - name: GeoVaLs/observable_domain_mask -## minvalue: 0.0 -## maxvalue: 0.5 -# -# # Initial error assignment -# - filter: Perform Action -# udescriptor: "initial_error_assignment" -# filter variables: -# - name: airTemperature -# where: -# - variable: ObsType/airTemperature -# is_in: 181 -# 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] -# errors: [1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056, 1.5056] -# -## # Reduce observation error and turn off ObsErrorFactorPressureCheck (l_gsd_terrain_match_surfTobs=.true., l_sfcobserror_ramp_t=.true.,) -## - filter: Perform Action -## filter variables: -## - name: airTemperature -## action: -## name: inflate error -## inflation factor: 0.5 -# -# # Error inflation based on pressure check (setupt.f90) -# - filter: Perform Action -# udescriptor: "error_inflation_pressure_check" -# filter variables: -# - name: airTemperature -# where: -# - variable: ObsType/airTemperature -# is_in: 181 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorPressureCheck -# options: -# variable: airTemperature -# surface observation error ramp: true -# max levels below surface: 15 -# inflation factor: 8.0 -# -## # Error inflation based on errormod (qcmod.f90) -## - filter: Perform Action -## filter variables: -## - name: airTemperature -## where: -## - variable: ObsType/airTemperature -## is_in: 181 -## action: -## name: inflate error -## inflation variable: -## name: ObsFunction/ObsErrorFactorConventional -## options: -## inflate variables: [airTemperature] -## pressure: MetaData/pressure -# -# # Error inflation when QualityMarker == 3 (read_prepbufr.f90) -# - filter: Perform Action -# udescriptor: "error_inflation_QualityMarker" -# filter variables: -# - name: airTemperature -# action: -# name: inflate error -# inflation factor: 1.2 -# where: -# - variable: QualityMarker/airTemperature -# is_in: 3 -# - variable: ObsType/airTemperature -# is_in: 181 -# -# # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) -# - filter: Perform Action -# udescriptor: "error_inflation_observation_pressure" -# filter variables: -# - name: airTemperature -# action: -# name: inflate error -# inflation factor: 1.2 -# where: -# - variable: MetaData/pressure -# maxvalue: 10000.0 -# - variable: ObsType/airTemperature -# is_in: 181 -# -# # Bounds Check (ObsError) -# - filter: Bounds Check -# udescriptor: "bounds_check_ObsError" -# filter variables: -# - name: airTemperature -# test variables: -# - name: ObsErrorData/airTemperature -# minvalue: 0.0 -# maxvalue: 1000 -# where: -# - variable: ObsType/airTemperature -# is_in: 181 -# action: -# name: reduce obs space -# -# # Bounds Check (ObsValue) -# - filter: Bounds Check -# udescriptor: "bounds_check_ObsValue" -# filter variables: -# - name: airTemperature -# minvalue: 100 -# maxvalue: 400 -# where: -# - variable: ObsType/airTemperature -# is_in: 181 -# action: -# name: reduce obs space -# -# # Create temporary ObsErrorData -# - filter: Variable Assignment -# udescriptor: "create_temporary_ObsErrorData" -# apply at iterations: 0,1 -# where: -# - variable: ObsType/airTemperature -# is_in: 181 -# assignments: -# - name: TempObsErrorData/airTemperature -# type: float -# function: -# name: ObsFunction/Arithmetic -# options: -# variables: -# - name: ObsErrorData/airTemperature -# defer to post: true -# -# # Set ObsError set "error parameter" if < "max value" -# - filter: Perform Action -# udescriptor: "ermin_set" -# apply at iterations: 0,1 -# filter variables: -# - name: airTemperature -# action: -# name: assign error -# error parameter: 1.0 -# where: -# - variable: -# name: ObsErrorData/airTemperature -# maxvalue: 1.0 -# - variable: -# name: ObsErrorData/airTemperature -# value: is_valid -# - variable: ObsType/airTemperature -# is_in: 181 -# defer to post: true -# -# # Set ObsError set "error parameter" if > "min value" -# - filter: Perform Action -# udescriptor: "ermax_set" -# apply at iterations: 0,1 -# filter variables: -# - name: airTemperature -# action: -# name: assign error -# error parameter: 3.0 -# where: -# - variable: -# name: ObsErrorData/airTemperature -# minvalue: 3.0 -# - variable: -# name: ObsErrorData/airTemperature -# value: is_valid -# - variable: ObsType/airTemperature -# is_in: 181 -# defer to post: true -# -# # Gross Error Check -# - filter: Background Check -# udescriptor: "gross_error_check" -# apply at iterations: 0,1 -# filter variables: -# - name: airTemperature -# threshold: 5.0 -# action: -# name: reject -# where: -# - variable: QualityMarker/airTemperature -# is_not_in: 3 -# - variable: ObsType/airTemperature -# is_in: 181 -# defer to post: true -# -# # Gross Error Check: cgross*0.7 if QualityMarker=3 -# - filter: Background Check -# udescriptor: "gross_error_check_0.7" -# apply at iterations: 0,1 -# filter variables: -# - name: airTemperature -# threshold: 3.5 -# action: -# name: reject -# where: -# - variable: QualityMarker/airTemperature -# is_in: 3 -# - variable: ObsType/airTemperature -# is_in: 181 -# defer to post: true -# -# # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. -# - filter: Perform Action -# udescriptor: "reassign_error_TempObsErrorData" -# apply at iterations: 0,1 -# filter variables: -# - name: airTemperature -# action: -# name: assign error -# error function: TempObsErrorData/airTemperature -# where: -# - variable: -# name: TempObsErrorData/airTemperature -# value: is_valid -# - variable: ObsType/airTemperature -# is_in: 181 -# defer to post: true -# -# #- filter: GOMsaver -# # filename: ./data/geovals/adpsfc_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/sfcshp_airTemperature_180.yaml.j2 b/parm/jcb-gdas/observations/soil/sfcshp_airTemperature_180.yaml.j2 deleted file mode 100644 index a379dc8c6..000000000 --- a/parm/jcb-gdas/observations/soil/sfcshp_airTemperature_180.yaml.j2 +++ /dev/null @@ -1,340 +0,0 @@ - - obs space: - name: sfcshp_airTemperature_180 - obsdatain: - engine: - type: H5File - obsfile: "data/obs/ioda_sfcshp.nc" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - sort variable: "pressure" - sort order: "descending" - obsdataout: - empty obs space action: "{{empty_obs_space_action}}" - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: jdiag_sfcshp_airTemperature_180.nc - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [airTemperature] - simulated variables: [airTemperature] - - obs operator: - name: VertInterp - vertical coordinate: air_pressure - observation vertical coordinate: pressure - observation vertical coordinate group: MetaData - interpolation method: log-linear - variables: - - name: airTemperature - - linear obs operator: - name: VertInterp - - obs error: - covariance model: diagonal - - obs filters: - # ------------------ - # airTemperature (180) - # ------------------ - # Accept, reject, or passivate (monitor) - - filter: Perform Action - udescriptor: "iuse_check" - filter variables: - - name: airTemperature - where: - - variable: ObsType/airTemperature - is_in: 180 - action: - name: {{iuse_sfcshp_airTemperature_180 | default("passivate", true)}} # accept, reject, passivate - - # Reject all obs not in type - - filter: Perform Action - udescriptor: "obs_type_check" - where: - - variable: ObsValue/airTemperature - value: is_not_valid - action: - name: reduce obs space - - # Reject all obs not in kx - - filter: Perform Action - udescriptor: "obs_kx_check" - where: - - variable: ObsType/airTemperature - is_not_in: 180 - action: - name: reduce obs space - - # Reject all obs with QualityMarker > 3 - - filter: RejectList - udescriptor: "quality_marker_check" - filter variables: - - name: airTemperature - where: - - variable: QualityMarker/airTemperature - is_in: 4-15 - value: is_not_valid - where operator: or - action: - name: reduce obs space - - # Time window filter - - filter: Bounds Check - udescriptor: "time_window_check" - filter variables: - - name: airTemperature - test variables: - - name: MetaData/timeOffset - minvalue: -5400 - maxvalue: 5400 - where: - - variable: ObsType/airTemperature - is_in: 180 - action: - name: reduce obs space - - # Duplicate Check - - filter: Temporal Thinning - udescriptor: "duplicate_check" - filter variables: - - name: airTemperature - min_spacing: PT90M - tolerance: PT0H - seed_time: "{{atmosphere_background_time_iso}}" - category_variable: - name: MetaData/longitude_latitude_pressure - where: - - variable: ObsType/airTemperature - is_in: 180 - action: - name: reduce obs space - - # Online regional domain check - - filter: Bounds Check - udescriptor: "online_domain_check" - filter variables: - - name: airTemperature - test variables: - - name: GeoVaLs/observable_domain_mask - minvalue: 0.0 - maxvalue: 0.5 - - # Initial error assignment - - filter: Perform Action - udescriptor: "initial_error_assignment" - filter variables: - - name: airTemperature - where: - - variable: ObsType/airTemperature - is_in: 180 - 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] - errors: [2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253, 2.1253] - - # Error inflation based on pressure check (setupt.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: airTemperature - where: - - variable: ObsType/airTemperature - is_in: 180 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: airTemperature - surface observation error ramp: true - max levels below surface: 15 - inflation factor: 8.0 - -# # Error inflation based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: airTemperature -# where: -# - variable: ObsType/airTemperature -# is_in: 180 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [airTemperature] -# pressure: MetaData/pressure - - # Error inflation when QualityMarker == 3 (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_QualityMarker" - filter variables: - - name: airTemperature - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: QualityMarker/airTemperature - is_in: 3 - - variable: ObsType/airTemperature - is_in: 180 - - # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_observation_pressure" - filter variables: - - name: airTemperature - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: MetaData/pressure - maxvalue: 10000.0 - - variable: ObsType/airTemperature - is_in: 180 - - # Bounds Check (ObsError) - - filter: Bounds Check - udescriptor: "bounds_check_ObsError" - filter variables: - - name: airTemperature - test variables: - - name: ObsErrorData/airTemperature - minvalue: 0.0 - maxvalue: 1000 - where: - - variable: ObsType/airTemperature - is_in: 180 - action: - name: reduce obs space - - # Bounds Check (ObsValue) - - filter: Bounds Check - udescriptor: "bounds_check_ObsValue" - filter variables: - - name: airTemperature - minvalue: 100 - maxvalue: 400 - where: - - variable: ObsType/airTemperature - is_in: 180 - action: - name: reduce obs space - - # Create temporary ObsErrorData - - filter: Variable Assignment - udescriptor: "create_temporary_ObsErrorData" - apply at iterations: 0,1 - where: - - variable: ObsType/airTemperature - is_in: 180 - assignments: - - name: TempObsErrorData/airTemperature - type: float - function: - name: ObsFunction/Arithmetic - options: - variables: - - name: ObsErrorData/airTemperature - defer to post: true - - # Set ObsError set "error parameter" if < "max value" - - filter: Perform Action - udescriptor: "ermin_set" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - action: - name: assign error - error parameter: 1.0 - where: - - variable: - name: ObsErrorData/airTemperature - maxvalue: 1.0 - - variable: - name: ObsErrorData/airTemperature - value: is_valid - - variable: ObsType/airTemperature - is_in: 180 - defer to post: true - - # Set ObsError set "error parameter" if > "min value" - - filter: Perform Action - udescriptor: "ermax_set" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - action: - name: assign error - error parameter: 3.0 - where: - - variable: - name: ObsErrorData/airTemperature - minvalue: 3.0 - - variable: - name: ObsErrorData/airTemperature - value: is_valid - - variable: ObsType/airTemperature - is_in: 180 - defer to post: true - - # Gross Error Check - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - threshold: 7.0 - action: - name: reject - where: - - variable: QualityMarker/airTemperature - is_not_in: 3 - - variable: ObsType/airTemperature - is_in: 180 - defer to post: true - - # Gross Error Check: cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - threshold: 4.9 - action: - name: reject - where: - - variable: QualityMarker/airTemperature - is_in: 3 - - variable: ObsType/airTemperature - is_in: 180 - defer to post: true - - # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. - - filter: Perform Action - udescriptor: "reassign_error_TempObsErrorData" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - action: - name: assign error - error function: TempObsErrorData/airTemperature - where: - - variable: - name: TempObsErrorData/airTemperature - value: is_valid - - variable: ObsType/airTemperature - is_in: 180 - defer to post: true - - #- filter: GOMsaver - # filename: ./data/geovals/sfcshp_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/sfcshp_airTemperature_182.yaml.j2 b/parm/jcb-gdas/observations/soil/sfcshp_airTemperature_182.yaml.j2 deleted file mode 100644 index 5b1b460df..000000000 --- a/parm/jcb-gdas/observations/soil/sfcshp_airTemperature_182.yaml.j2 +++ /dev/null @@ -1,340 +0,0 @@ - - obs space: - name: sfcshp_airTemperature_182 - obsdatain: - engine: - type: H5File - obsfile: "data/obs/ioda_sfcshp.nc" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - sort variable: "pressure" - sort order: "descending" - obsdataout: - empty obs space action: "{{empty_obs_space_action}}" - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: jdiag_sfcshp_airTemperature_182.nc - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [airTemperature] - simulated variables: [airTemperature] - - obs operator: - name: VertInterp - vertical coordinate: air_pressure - observation vertical coordinate: pressure - observation vertical coordinate group: MetaData - interpolation method: log-linear - variables: - - name: airTemperature - - linear obs operator: - name: VertInterp - - obs error: - covariance model: diagonal - - obs filters: - # ------------------ - # airTemperature (182) - # ------------------ - # Accept, reject, or passivate (monitor) - - filter: Perform Action - udescriptor: "iuse_check" - filter variables: - - name: airTemperature - where: - - variable: ObsType/airTemperature - is_in: 182 - action: - name: {{iuse_sfcshp_airTemperature_182 | default("passivate", true)}} # accept, reject, passivate - - # Reject all obs not in type - - filter: Perform Action - udescriptor: "obs_type_check" - where: - - variable: ObsValue/airTemperature - value: is_not_valid - action: - name: reduce obs space - - # Reject all obs not in kx - - filter: Perform Action - udescriptor: "obs_kx_check" - where: - - variable: ObsType/airTemperature - is_not_in: 182 - action: - name: reduce obs space - - # Reject all obs with QualityMarker > 3 - - filter: RejectList - udescriptor: "quality_marker_check" - filter variables: - - name: airTemperature - where: - - variable: QualityMarker/airTemperature - is_in: 4-15 - value: is_not_valid - where operator: or - action: - name: reduce obs space - - # Time window filter - - filter: Bounds Check - udescriptor: "time_window_check" - filter variables: - - name: airTemperature - test variables: - - name: MetaData/timeOffset - minvalue: -5400 - maxvalue: 5400 - where: - - variable: ObsType/airTemperature - is_in: 182 - action: - name: reduce obs space - - # Duplicate Check - - filter: Temporal Thinning - udescriptor: "duplicate_check" - filter variables: - - name: airTemperature - min_spacing: PT90M - tolerance: PT0H - seed_time: "{{atmosphere_background_time_iso}}" - category_variable: - name: MetaData/longitude_latitude_pressure - where: - - variable: ObsType/airTemperature - is_in: 182 - action: - name: reduce obs space - - # Online regional domain check - - filter: Bounds Check - udescriptor: "online_domain_check" - filter variables: - - name: airTemperature - test variables: - - name: GeoVaLs/observable_domain_mask - minvalue: 0.0 - maxvalue: 0.5 - - # Initial error assignment - - filter: Perform Action - udescriptor: "initial_error_assignment" - filter variables: - - name: airTemperature - where: - - variable: ObsType/airTemperature - is_in: 182 - 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] - errors: [1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054, 1.054] - - # Error inflation based on pressure check (setupt.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: airTemperature - where: - - variable: ObsType/airTemperature - is_in: 182 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: airTemperature - surface observation error ramp: true - max levels below surface: 15 - inflation factor: 8.0 - -# # Error inflation based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: airTemperature -# where: -# - variable: ObsType/airTemperature -# is_in: 182 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [airTemperature] -# pressure: MetaData/pressure - - # Error inflation when QualityMarker == 3 (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_QualityMarker" - filter variables: - - name: airTemperature - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: QualityMarker/airTemperature - is_in: 3 - - variable: ObsType/airTemperature - is_in: 182 - - # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_observation_pressure" - filter variables: - - name: airTemperature - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: MetaData/pressure - maxvalue: 10000.0 - - variable: ObsType/airTemperature - is_in: 182 - - # Bounds Check (ObsError) - - filter: Bounds Check - udescriptor: "bounds_check_ObsError" - filter variables: - - name: airTemperature - test variables: - - name: ObsErrorData/airTemperature - minvalue: 0.0 - maxvalue: 1000 - where: - - variable: ObsType/airTemperature - is_in: 182 - action: - name: reduce obs space - - # Bounds Check (ObsValue) - - filter: Bounds Check - udescriptor: "bounds_check_ObsValue" - filter variables: - - name: airTemperature - minvalue: 100 - maxvalue: 400 - where: - - variable: ObsType/airTemperature - is_in: 182 - action: - name: reduce obs space - - # Create temporary ObsErrorData - - filter: Variable Assignment - udescriptor: "create_temporary_ObsErrorData" - apply at iterations: 0,1 - where: - - variable: ObsType/airTemperature - is_in: 182 - assignments: - - name: TempObsErrorData/airTemperature - type: float - function: - name: ObsFunction/Arithmetic - options: - variables: - - name: ObsErrorData/airTemperature - defer to post: true - - # Set ObsError set "error parameter" if < "max value" - - filter: Perform Action - udescriptor: "ermin_set" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - action: - name: assign error - error parameter: 1.0 - where: - - variable: - name: ObsErrorData/airTemperature - maxvalue: 1.0 - - variable: - name: ObsErrorData/airTemperature - value: is_valid - - variable: ObsType/airTemperature - is_in: 182 - defer to post: true - - # Set ObsError set "error parameter" if > "min value" - - filter: Perform Action - udescriptor: "ermax_set" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - action: - name: assign error - error parameter: 3.0 - where: - - variable: - name: ObsErrorData/airTemperature - minvalue: 3.0 - - variable: - name: ObsErrorData/airTemperature - value: is_valid - - variable: ObsType/airTemperature - is_in: 182 - defer to post: true - - # Gross Error Check - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - threshold: 5.0 - action: - name: reject - where: - - variable: QualityMarker/airTemperature - is_not_in: 3 - - variable: ObsType/airTemperature - is_in: 182 - defer to post: true - - # Gross Error Check: cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - threshold: 3.5 - action: - name: reject - where: - - variable: QualityMarker/airTemperature - is_in: 3 - - variable: ObsType/airTemperature - is_in: 182 - defer to post: true - - # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. - - filter: Perform Action - udescriptor: "reassign_error_TempObsErrorData" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - action: - name: assign error - error function: TempObsErrorData/airTemperature - where: - - variable: - name: TempObsErrorData/airTemperature - value: is_valid - - variable: ObsType/airTemperature - is_in: 182 - defer to post: true - - #- filter: GOMsaver - # filename: ./data/geovals/sfcshp_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/sfcshp_airTemperature_183.yaml.j2 b/parm/jcb-gdas/observations/soil/sfcshp_airTemperature_183.yaml.j2 deleted file mode 100644 index e6f17172a..000000000 --- a/parm/jcb-gdas/observations/soil/sfcshp_airTemperature_183.yaml.j2 +++ /dev/null @@ -1,340 +0,0 @@ - - obs space: - name: sfcshp_airTemperature_183 - obsdatain: - engine: - type: H5File - obsfile: "data/obs/ioda_sfcshp.nc" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - sort variable: "pressure" - sort order: "descending" - obsdataout: - empty obs space action: "{{empty_obs_space_action}}" - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: jdiag_sfcshp_airTemperature_183.nc - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [airTemperature] - simulated variables: [airTemperature] - - obs operator: - name: VertInterp - vertical coordinate: air_pressure - observation vertical coordinate: pressure - observation vertical coordinate group: MetaData - interpolation method: log-linear - variables: - - name: airTemperature - - linear obs operator: - name: VertInterp - - obs error: - covariance model: diagonal - - obs filters: - # ------------------ - # airTemperature (183) - # ------------------ - # Accept, reject, or passivate (monitor) - - filter: Perform Action - udescriptor: "iuse_check" - filter variables: - - name: airTemperature - where: - - variable: ObsType/airTemperature - is_in: 183 - action: - name: {{iuse_sfcshp_airTemperature_183 | default("passivate", true)}} # accept, reject, passivate - - # Reject all obs not in type - - filter: Perform Action - udescriptor: "obs_type_check" - where: - - variable: ObsValue/airTemperature - value: is_not_valid - action: - name: reduce obs space - - # Reject all obs not in kx - - filter: Perform Action - udescriptor: "obs_kx_check" - where: - - variable: ObsType/airTemperature - is_not_in: 183 - action: - name: reduce obs space - - # Reject all obs with QualityMarker > 3 - - filter: RejectList - udescriptor: "quality_marker_check" - filter variables: - - name: airTemperature - where: - - variable: QualityMarker/airTemperature - is_in: 4-15 - value: is_not_valid - where operator: or - action: - name: reduce obs space - - # Time window filter - - filter: Bounds Check - udescriptor: "time_window_check" - filter variables: - - name: airTemperature - test variables: - - name: MetaData/timeOffset - minvalue: -900 - maxvalue: 900 - where: - - variable: ObsType/airTemperature - is_in: 183 - action: - name: reduce obs space - - # Duplicate Check - - filter: Temporal Thinning - udescriptor: "duplicate_check" - filter variables: - - name: airTemperature - min_spacing: PT90M - tolerance: PT0H - seed_time: "{{atmosphere_background_time_iso}}" - category_variable: - name: MetaData/longitude_latitude_pressure - where: - - variable: ObsType/airTemperature - is_in: 183 - action: - name: reduce obs space - - # Online regional domain check - - filter: Bounds Check - udescriptor: "online_domain_check" - filter variables: - - name: airTemperature - test variables: - - name: GeoVaLs/observable_domain_mask - minvalue: 0.0 - maxvalue: 0.5 - - # Initial error assignment - - filter: Perform Action - udescriptor: "initial_error_assignment" - filter variables: - - name: airTemperature - where: - - variable: ObsType/airTemperature - is_in: 183 - 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] - errors: [2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349, 2.6349] - - # Error inflation based on pressure check (setupt.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: airTemperature - where: - - variable: ObsType/airTemperature - is_in: 183 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: airTemperature - surface observation error ramp: true - max levels below surface: 15 - inflation factor: 8.0 - -# # Error inflation based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: airTemperature -# where: -# - variable: ObsType/airTemperature -# is_in: 183 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [airTemperature] -# pressure: MetaData/pressure - - # Error inflation when QualityMarker == 3 (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_QualityMarker" - filter variables: - - name: airTemperature - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: QualityMarker/airTemperature - is_in: 3 - - variable: ObsType/airTemperature - is_in: 183 - - # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_observation_pressure" - filter variables: - - name: airTemperature - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: MetaData/pressure - maxvalue: 10000.0 - - variable: ObsType/airTemperature - is_in: 183 - - # Bounds Check (ObsError) - - filter: Bounds Check - udescriptor: "bounds_check_ObsError" - filter variables: - - name: airTemperature - test variables: - - name: ObsErrorData/airTemperature - minvalue: 0.0 - maxvalue: 1000 - where: - - variable: ObsType/airTemperature - is_in: 183 - action: - name: reduce obs space - - # Bounds Check (ObsValue) - - filter: Bounds Check - udescriptor: "bounds_check_ObsValue" - filter variables: - - name: airTemperature - minvalue: 100 - maxvalue: 400 - where: - - variable: ObsType/airTemperature - is_in: 183 - action: - name: reduce obs space - - # Create temporary ObsErrorData - - filter: Variable Assignment - udescriptor: "create_temporary_ObsErrorData" - apply at iterations: 0,1 - where: - - variable: ObsType/airTemperature - is_in: 183 - assignments: - - name: TempObsErrorData/airTemperature - type: float - function: - name: ObsFunction/Arithmetic - options: - variables: - - name: ObsErrorData/airTemperature - defer to post: true - - # Set ObsError set "error parameter" if < "max value" - - filter: Perform Action - udescriptor: "ermin_set" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - action: - name: assign error - error parameter: 1.0 - where: - - variable: - name: ObsErrorData/airTemperature - maxvalue: 1.0 - - variable: - name: ObsErrorData/airTemperature - value: is_valid - - variable: ObsType/airTemperature - is_in: 183 - defer to post: true - - # Set ObsError set "error parameter" if > "min value" - - filter: Perform Action - udescriptor: "ermax_set" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - action: - name: assign error - error parameter: 3.0 - where: - - variable: - name: ObsErrorData/airTemperature - minvalue: 3.0 - - variable: - name: ObsErrorData/airTemperature - value: is_valid - - variable: ObsType/airTemperature - is_in: 183 - defer to post: true - - # Gross Error Check - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - threshold: 5.0 - action: - name: reject - where: - - variable: QualityMarker/airTemperature - is_not_in: 3 - - variable: ObsType/airTemperature - is_in: 183 - defer to post: true - - # Gross Error Check: cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - threshold: 3.5 - action: - name: reject - where: - - variable: QualityMarker/airTemperature - is_in: 3 - - variable: ObsType/airTemperature - is_in: 183 - defer to post: true - - # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. - - filter: Perform Action - udescriptor: "reassign_error_TempObsErrorData" - apply at iterations: 0,1 - filter variables: - - name: airTemperature - action: - name: assign error - error function: TempObsErrorData/airTemperature - where: - - variable: - name: TempObsErrorData/airTemperature - value: is_valid - - variable: ObsType/airTemperature - is_in: 183 - defer to post: true - - #- filter: GOMsaver - # filename: ./data/geovals/sfcshp_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/sfcshp_specificHumidity_180.yaml.j2 b/parm/jcb-gdas/observations/soil/sfcshp_specificHumidity_180.yaml.j2 deleted file mode 100644 index 0879af16b..000000000 --- a/parm/jcb-gdas/observations/soil/sfcshp_specificHumidity_180.yaml.j2 +++ /dev/null @@ -1,340 +0,0 @@ - - obs space: - name: sfcshp_specificHumidity_180 - obsdatain: - engine: - type: H5File - obsfile: "data/obs/ioda_sfcshp.nc" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - sort variable: "pressure" - sort order: "descending" - obsdataout: - empty obs space action: "{{empty_obs_space_action}}" - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: jdiag_sfcshp_specificHumidity_180.nc - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [specificHumidity] - simulated variables: [specificHumidity] - - obs operator: - name: VertInterp - vertical coordinate: air_pressure - observation vertical coordinate: pressure - observation vertical coordinate group: MetaData - interpolation method: log-linear - variables: - - name: specificHumidity - - linear obs operator: - name: VertInterp - - obs error: - covariance model: diagonal - - obs filters: - # ------------------ - # specificHumidity (180) - # ------------------ - # Accept, reject, or passivate (monitor) - - filter: Perform Action - udescriptor: "iuse_check" - filter variables: - - name: specificHumidity - where: - - variable: ObsType/specificHumidity - is_in: 180 - action: - name: {{iuse_sfcshp_specificHumidity_180 | default("passivate", true)}} # accept, reject, passivate - - # Reject all obs not in type - - filter: Perform Action - udescriptor: "obs_type_check" - where: - - variable: ObsValue/specificHumidity - value: is_not_valid - action: - name: reduce obs space - - # Reject all obs not in kx - - filter: Perform Action - udescriptor: "obs_kx_check" - where: - - variable: ObsType/specificHumidity - is_not_in: 180 - action: - name: reduce obs space - - # Reject all obs with QualityMarker > 3 - - filter: RejectList - udescriptor: "quality_marker_check" - filter variables: - - name: specificHumidity - where: - - variable: QualityMarker/specificHumidity - is_in: 4-15 - value: is_not_valid - where operator: or - action: - name: reduce obs space - - # Time window filter - - filter: Bounds Check - udescriptor: "time_window_check" - filter variables: - - name: specificHumidity - test variables: - - name: MetaData/timeOffset - minvalue: -5400 - maxvalue: 5400 - where: - - variable: ObsType/specificHumidity - is_in: 180 - action: - name: reduce obs space - - # Duplicate Check - - filter: Temporal Thinning - udescriptor: "duplicate_check" - filter variables: - - name: specificHumidity - min_spacing: PT90M - tolerance: PT0H - seed_time: "{{atmosphere_background_time_iso}}" - category_variable: - name: MetaData/longitude_latitude_pressure - where: - - variable: ObsType/specificHumidity - is_in: 180 - action: - name: reduce obs space - - # Online regional domain check - - filter: Bounds Check - udescriptor: "online_domain_check" - filter variables: - - name: specificHumidity - test variables: - - name: GeoVaLs/observable_domain_mask - minvalue: 0.0 - maxvalue: 0.5 - - # Initial error assignment - - filter: Perform Action - udescriptor: "initial_error_assignment" - filter variables: - - name: specificHumidity - where: - - variable: ObsType/specificHumidity - is_in: 180 - 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] - errors: [0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912] - - # Error inflation based on pressure check (setupq.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: specificHumidity - where: - - variable: ObsType/specificHumidity - is_in: 180 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: specificHumidity - surface observation error ramp: true - max levels below surface: 15 - inflation factor: 8.0 - -# # Error inflation based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: specificHumidity -# where: -# - variable: ObsType/specificHumidity -# is_in: 180 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [specificHumidity] -# pressure: MetaData/pressure - - # Error inflation when QualityMarker == 3 (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_QualityMarker" - filter variables: - - name: specificHumidity - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: QualityMarker/specificHumidity - is_in: 3 - - variable: ObsType/specificHumidity - is_in: 180 - - # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_observation_pressure" - filter variables: - - name: specificHumidity - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: MetaData/pressure - maxvalue: 10000.0 - - variable: ObsType/specificHumidity - is_in: 180 - - # Bounds Check (ObsError) - - filter: Bounds Check - udescriptor: "bounds_check_ObsError" - filter variables: - - name: specificHumidity - test variables: - - name: ObsErrorData/specificHumidity - minvalue: 0.0 - maxvalue: 1000 - where: - - variable: ObsType/specificHumidity - is_in: 180 - action: - name: reduce obs space - - # Bounds Check (ObsValue) - - filter: Bounds Check - udescriptor: "bounds_check_ObsValue" - filter variables: - - name: specificHumidity - minvalue: 0.0 - maxvalue: 1.0 - where: - - variable: ObsType/specificHumidity - is_in: 180 - action: - name: reduce obs space - - # Create temporary ObsErrorData - - filter: Variable Assignment - udescriptor: "create_temporary_ObsErrorData" - apply at iterations: 0,1 - where: - - variable: ObsType/specificHumidity - is_in: 180 - assignments: - - name: TempObsErrorData/specificHumidity - type: float - function: - name: ObsFunction/Arithmetic - options: - variables: - - name: ObsErrorData/specificHumidity - defer to post: true - - # Set ObsError set "error parameter" if < "max value" - - filter: Perform Action - udescriptor: "ermin_set" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - action: - name: assign error - error parameter: 5.0 - where: - - variable: - name: ObsErrorData/specificHumidity - maxvalue: 5.0 - - variable: - name: ObsErrorData/specificHumidity - value: is_valid - - variable: ObsType/specificHumidity - is_in: 180 - defer to post: true - - # Set ObsError set "error parameter" if > "min value" - - filter: Perform Action - udescriptor: "ermax_set" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - action: - name: assign error - error parameter: 50.0 - where: - - variable: - name: ObsErrorData/specificHumidity - minvalue: 50.0 - - variable: - name: ObsErrorData/specificHumidity - value: is_valid - - variable: ObsType/specificHumidity - is_in: 180 - defer to post: true - - # Gross Error Check - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - threshold: 7.0 - action: - name: reject - where: - - variable: QualityMarker/specificHumidity - is_not_in: 3 - - variable: ObsType/specificHumidity - is_in: 180 - defer to post: true - - # Gross Error Check: cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - threshold: 4.9 - action: - name: reject - where: - - variable: QualityMarker/specificHumidity - is_in: 3 - - variable: ObsType/specificHumidity - is_in: 180 - defer to post: true - - # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. - - filter: Perform Action - udescriptor: "reassign_error_TempObsErrorData" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - action: - name: assign error - error function: TempObsErrorData/specificHumidity - where: - - variable: - name: TempObsErrorData/specificHumidity - value: is_valid - - variable: ObsType/specificHumidity - is_in: 180 - defer to post: true - - #- filter: GOMsaver - # filename: ./data/geovals/sfcshp_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/sfcshp_specificHumidity_182.yaml.j2 b/parm/jcb-gdas/observations/soil/sfcshp_specificHumidity_182.yaml.j2 deleted file mode 100644 index fa4ef18d7..000000000 --- a/parm/jcb-gdas/observations/soil/sfcshp_specificHumidity_182.yaml.j2 +++ /dev/null @@ -1,340 +0,0 @@ - - obs space: - name: sfcshp_specificHumidity_182 - obsdatain: - engine: - type: H5File - obsfile: "data/obs/ioda_sfcshp.nc" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - sort variable: "pressure" - sort order: "descending" - obsdataout: - empty obs space action: "{{empty_obs_space_action}}" - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: jdiag_sfcshp_specificHumidity_182.nc - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [specificHumidity] - simulated variables: [specificHumidity] - - obs operator: - name: VertInterp - vertical coordinate: air_pressure - observation vertical coordinate: pressure - observation vertical coordinate group: MetaData - interpolation method: log-linear - variables: - - name: specificHumidity - - linear obs operator: - name: VertInterp - - obs error: - covariance model: diagonal - - obs filters: - # ------------------ - # specificHumidity (182) - # ------------------ - # Accept, reject, or passivate (monitor) - - filter: Perform Action - udescriptor: "iuse_check" - filter variables: - - name: specificHumidity - where: - - variable: ObsType/specificHumidity - is_in: 182 - action: - name: {{iuse_sfcshp_specificHumidity_182 | default("passivate", true)}} # accept, reject, passivate - - # Reject all obs not in type - - filter: Perform Action - udescriptor: "obs_type_check" - where: - - variable: ObsValue/specificHumidity - value: is_not_valid - action: - name: reduce obs space - - # Reject all obs not in kx - - filter: Perform Action - udescriptor: "obs_kx_check" - where: - - variable: ObsType/specificHumidity - is_not_in: 182 - action: - name: reduce obs space - - # Reject all obs with QualityMarker > 3 - - filter: RejectList - udescriptor: "quality_marker_check" - filter variables: - - name: specificHumidity - where: - - variable: QualityMarker/specificHumidity - is_in: 4-15 - value: is_not_valid - where operator: or - action: - name: reduce obs space - - # Time window filter - - filter: Bounds Check - udescriptor: "time_window_check" - filter variables: - - name: specificHumidity - test variables: - - name: MetaData/timeOffset - minvalue: -5400 - maxvalue: 5400 - where: - - variable: ObsType/specificHumidity - is_in: 182 - action: - name: reduce obs space - - # Duplicate Check - - filter: Temporal Thinning - udescriptor: "duplicate_check" - filter variables: - - name: specificHumidity - min_spacing: PT90M - tolerance: PT0H - seed_time: "{{atmosphere_background_time_iso}}" - category_variable: - name: MetaData/longitude_latitude_pressure - where: - - variable: ObsType/specificHumidity - is_in: 182 - action: - name: reduce obs space - - # Online regional domain check - - filter: Bounds Check - udescriptor: "online_domain_check" - filter variables: - - name: specificHumidity - test variables: - - name: GeoVaLs/observable_domain_mask - minvalue: 0.0 - maxvalue: 0.5 - - # Initial error assignment - - filter: Perform Action - udescriptor: "initial_error_assignment" - filter variables: - - name: specificHumidity - where: - - variable: ObsType/specificHumidity - is_in: 182 - 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] - errors: [0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912] - - # Error inflation based on pressure check (setupq.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: specificHumidity - where: - - variable: ObsType/specificHumidity - is_in: 182 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: specificHumidity - surface observation error ramp: true - max levels below surface: 15 - inflation factor: 8.0 - -# # Error inflation based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: specificHumidity -# where: -# - variable: ObsType/specificHumidity -# is_in: 182 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [specificHumidity] -# pressure: MetaData/pressure - - # Error inflation when QualityMarker == 3 (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_QualityMarker" - filter variables: - - name: specificHumidity - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: QualityMarker/specificHumidity - is_in: 3 - - variable: ObsType/specificHumidity - is_in: 182 - - # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_observation_pressure" - filter variables: - - name: specificHumidity - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: MetaData/pressure - maxvalue: 10000.0 - - variable: ObsType/specificHumidity - is_in: 182 - - # Bounds Check (ObsError) - - filter: Bounds Check - udescriptor: "bounds_check_ObsError" - filter variables: - - name: specificHumidity - test variables: - - name: ObsErrorData/specificHumidity - minvalue: 0.0 - maxvalue: 1000 - where: - - variable: ObsType/specificHumidity - is_in: 182 - action: - name: reduce obs space - - # Bounds Check (ObsValue) - - filter: Bounds Check - udescriptor: "bounds_check_ObsValue" - filter variables: - - name: specificHumidity - minvalue: 0.0 - maxvalue: 1.0 - where: - - variable: ObsType/specificHumidity - is_in: 182 - action: - name: reduce obs space - - # Create temporary ObsErrorData - - filter: Variable Assignment - udescriptor: "create_temporary_ObsErrorData" - apply at iterations: 0,1 - where: - - variable: ObsType/specificHumidity - is_in: 182 - assignments: - - name: TempObsErrorData/specificHumidity - type: float - function: - name: ObsFunction/Arithmetic - options: - variables: - - name: ObsErrorData/specificHumidity - defer to post: true - - # Set ObsError set "error parameter" if < "max value" - - filter: Perform Action - udescriptor: "ermin_set" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - action: - name: assign error - error parameter: 5.0 - where: - - variable: - name: ObsErrorData/specificHumidity - maxvalue: 5.0 - - variable: - name: ObsErrorData/specificHumidity - value: is_valid - - variable: ObsType/specificHumidity - is_in: 182 - defer to post: true - - # Set ObsError set "error parameter" if > "min value" - - filter: Perform Action - udescriptor: "ermax_set" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - action: - name: assign error - error parameter: 50.0 - where: - - variable: - name: ObsErrorData/specificHumidity - minvalue: 50.0 - - variable: - name: ObsErrorData/specificHumidity - value: is_valid - - variable: ObsType/specificHumidity - is_in: 182 - defer to post: true - - # Gross Error Check - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - threshold: 7.0 - action: - name: reject - where: - - variable: QualityMarker/specificHumidity - is_not_in: 3 - - variable: ObsType/specificHumidity - is_in: 182 - defer to post: true - - # Gross Error Check: cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - threshold: 4.9 - action: - name: reject - where: - - variable: QualityMarker/specificHumidity - is_in: 3 - - variable: ObsType/specificHumidity - is_in: 182 - defer to post: true - - # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. - - filter: Perform Action - udescriptor: "reassign_error_TempObsErrorData" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - action: - name: assign error - error function: TempObsErrorData/specificHumidity - where: - - variable: - name: TempObsErrorData/specificHumidity - value: is_valid - - variable: ObsType/specificHumidity - is_in: 182 - defer to post: true - - #- filter: GOMsaver - # filename: ./data/geovals/sfcshp_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/sfcshp_specificHumidity_183.yaml.j2 b/parm/jcb-gdas/observations/soil/sfcshp_specificHumidity_183.yaml.j2 deleted file mode 100644 index 4a741512e..000000000 --- a/parm/jcb-gdas/observations/soil/sfcshp_specificHumidity_183.yaml.j2 +++ /dev/null @@ -1,340 +0,0 @@ - - obs space: - name: sfcshp_specificHumidity_183 - obsdatain: - engine: - type: H5File - obsfile: "data/obs/ioda_sfcshp.nc" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - sort variable: "pressure" - sort order: "descending" - obsdataout: - empty obs space action: "{{empty_obs_space_action}}" - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: jdiag_sfcshp_specificHumidity_183.nc - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [specificHumidity] - simulated variables: [specificHumidity] - - obs operator: - name: VertInterp - vertical coordinate: air_pressure - observation vertical coordinate: pressure - observation vertical coordinate group: MetaData - interpolation method: log-linear - variables: - - name: specificHumidity - - linear obs operator: - name: VertInterp - - obs error: - covariance model: diagonal - - obs filters: - # ------------------ - # specificHumidity (183) - # ------------------ - # Accept, reject, or passivate (monitor) - - filter: Perform Action - udescriptor: "iuse_check" - filter variables: - - name: specificHumidity - where: - - variable: ObsType/specificHumidity - is_in: 183 - action: - name: {{iuse_sfcshp_specificHumidity_183 | default("passivate", true)}} # accept, reject, passivate - - # Reject all obs not in type - - filter: Perform Action - udescriptor: "obs_type_check" - where: - - variable: ObsValue/specificHumidity - value: is_not_valid - action: - name: reduce obs space - - # Reject all obs not in kx - - filter: Perform Action - udescriptor: "obs_kx_check" - where: - - variable: ObsType/specificHumidity - is_not_in: 183 - action: - name: reduce obs space - - # Reject all obs with QualityMarker > 3 - - filter: RejectList - udescriptor: "quality_marker_check" - filter variables: - - name: specificHumidity - where: - - variable: QualityMarker/specificHumidity - is_in: 4-15 - value: is_not_valid - where operator: or - action: - name: reduce obs space - - # Time window filter - - filter: Bounds Check - udescriptor: "time_window_check" - filter variables: - - name: specificHumidity - test variables: - - name: MetaData/timeOffset - minvalue: -900 - maxvalue: 900 - where: - - variable: ObsType/specificHumidity - is_in: 183 - action: - name: reduce obs space - - # Duplicate Check - - filter: Temporal Thinning - udescriptor: "duplicate_check" - filter variables: - - name: specificHumidity - min_spacing: PT90M - tolerance: PT0H - seed_time: "{{atmosphere_background_time_iso}}" - category_variable: - name: MetaData/longitude_latitude_pressure - where: - - variable: ObsType/specificHumidity - is_in: 183 - action: - name: reduce obs space - - # Online regional domain check - - filter: Bounds Check - udescriptor: "online_domain_check" - filter variables: - - name: specificHumidity - test variables: - - name: GeoVaLs/observable_domain_mask - minvalue: 0.0 - maxvalue: 0.5 - - # Initial error assignment - - filter: Perform Action - udescriptor: "initial_error_assignment" - filter variables: - - name: specificHumidity - where: - - variable: ObsType/specificHumidity - is_in: 183 - 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] - errors: [0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912, 0.05912] - - # Error inflation based on pressure check (setupq.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: specificHumidity - where: - - variable: ObsType/specificHumidity - is_in: 183 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: specificHumidity - surface observation error ramp: true - max levels below surface: 15 - inflation factor: 8.0 - -# # Error inflation based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: specificHumidity -# where: -# - variable: ObsType/specificHumidity -# is_in: 183 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [specificHumidity] -# pressure: MetaData/pressure - - # Error inflation when QualityMarker == 3 (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_QualityMarker" - filter variables: - - name: specificHumidity - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: QualityMarker/specificHumidity - is_in: 3 - - variable: ObsType/specificHumidity - is_in: 183 - - # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_observation_pressure" - filter variables: - - name: specificHumidity - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: MetaData/pressure - maxvalue: 10000.0 - - variable: ObsType/specificHumidity - is_in: 183 - - # Bounds Check (ObsError) - - filter: Bounds Check - udescriptor: "bounds_check_ObsError" - filter variables: - - name: specificHumidity - test variables: - - name: ObsErrorData/specificHumidity - minvalue: 0.0 - maxvalue: 1000 - where: - - variable: ObsType/specificHumidity - is_in: 183 - action: - name: reduce obs space - - # Bounds Check (ObsValue) - - filter: Bounds Check - udescriptor: "bounds_check_ObsValue" - filter variables: - - name: specificHumidity - minvalue: 0.0 - maxvalue: 1.0 - where: - - variable: ObsType/specificHumidity - is_in: 183 - action: - name: reduce obs space - - # Create temporary ObsErrorData - - filter: Variable Assignment - udescriptor: "create_temporary_ObsErrorData" - apply at iterations: 0,1 - where: - - variable: ObsType/specificHumidity - is_in: 183 - assignments: - - name: TempObsErrorData/specificHumidity - type: float - function: - name: ObsFunction/Arithmetic - options: - variables: - - name: ObsErrorData/specificHumidity - defer to post: true - - # Set ObsError set "error parameter" if < "max value" - - filter: Perform Action - udescriptor: "ermin_set" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - action: - name: assign error - error parameter: 5.0 - where: - - variable: - name: ObsErrorData/specificHumidity - maxvalue: 5.0 - - variable: - name: ObsErrorData/specificHumidity - value: is_valid - - variable: ObsType/specificHumidity - is_in: 183 - defer to post: true - - # Set ObsError set "error parameter" if > "min value" - - filter: Perform Action - udescriptor: "ermax_set" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - action: - name: assign error - error parameter: 50.0 - where: - - variable: - name: ObsErrorData/specificHumidity - minvalue: 50.0 - - variable: - name: ObsErrorData/specificHumidity - value: is_valid - - variable: ObsType/specificHumidity - is_in: 183 - defer to post: true - - # Gross Error Check - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - threshold: 7.0 - action: - name: reject - where: - - variable: QualityMarker/specificHumidity - is_not_in: 3 - - variable: ObsType/specificHumidity - is_in: 183 - defer to post: true - - # Gross Error Check: cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - threshold: 4.9 - action: - name: reject - where: - - variable: QualityMarker/specificHumidity - is_in: 3 - - variable: ObsType/specificHumidity - is_in: 183 - defer to post: true - - # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. - - filter: Perform Action - udescriptor: "reassign_error_TempObsErrorData" - apply at iterations: 0,1 - filter variables: - - name: specificHumidity - action: - name: assign error - error function: TempObsErrorData/specificHumidity - where: - - variable: - name: TempObsErrorData/specificHumidity - value: is_valid - - variable: ObsType/specificHumidity - is_in: 183 - defer to post: true - - #- filter: GOMsaver - # filename: ./data/geovals/sfcshp_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/sfcshp_stationPressure_180.yaml.j2 b/parm/jcb-gdas/observations/soil/sfcshp_stationPressure_180.yaml.j2 deleted file mode 100644 index 12f59eb0e..000000000 --- a/parm/jcb-gdas/observations/soil/sfcshp_stationPressure_180.yaml.j2 +++ /dev/null @@ -1,346 +0,0 @@ - - obs space: - name: sfcshp_stationPressure_180 - obsdatain: - engine: - type: H5File - obsfile: "data/obs/ioda_sfcshp.nc" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - sort variable: "pressure" - sort order: "descending" - obsdataout: - empty obs space action: "{{empty_obs_space_action}}" - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: jdiag_sfcshp_stationPressure_180.nc - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [stationPressure] - simulated variables: [stationPressure] - - obs operator: - name: SfcCorrected - correction scheme to use: GSL - geovar_sfc_geomz: geopotential_height_at_surface - geovar_geomz: geopotential_height - linear obs operator: - name: Identity - - obs error: - covariance model: diagonal - - obs filters: - # ------------------ - # stationPressure (180) - # ------------------ - # Accept, reject, or passivate (monitor) - - filter: Perform Action - udescriptor: "iuse_check" - filter variables: - - name: stationPressure - where: - - variable: ObsType/stationPressure - is_in: 180 - action: - name: {{iuse_sfcshp_stationPressure_180 | default("passivate", true)}} # accept, reject, passivate - - # Reject all obs not in type - - filter: Perform Action - udescriptor: "obs_type_check" - where: - - variable: ObsValue/stationPressure - value: is_not_valid - action: - name: reduce obs space - - # Reject all obs not in kx - - filter: Perform Action - udescriptor: "obs_kx_check" - where: - - variable: ObsType/stationPressure - is_not_in: 180 - action: - name: reduce obs space - - # Reject all obs with QualityMarker > 3 - - filter: RejectList - udescriptor: "quality_marker_check" - filter variables: - - name: stationPressure - where: - - variable: QualityMarker/stationPressure - is_in: 4-15 - value: is_not_valid - where operator: or - action: - name: reduce obs space - - # Time window filter - - filter: Bounds Check - udescriptor: "time_window_check" - filter variables: - - name: stationPressure - test variables: - - name: MetaData/timeOffset - minvalue: -5400 - maxvalue: 5400 - where: - - variable: ObsType/stationPressure - is_in: 180 - action: - name: reduce obs space - - # Duplicate Check - - filter: Temporal Thinning - udescriptor: "duplicate_check" - filter variables: - - name: stationPressure - min_spacing: PT90M - tolerance: PT0H - seed_time: "{{atmosphere_background_time_iso}}" - category_variable: - name: MetaData/longitude_latitude_pressure - where: - - variable: ObsType/stationPressure - is_in: 180 - action: - name: reduce obs space - - # Online regional domain check - - filter: Bounds Check - udescriptor: "online_domain_check" - filter variables: - - name: stationPressure - test variables: - - name: GeoVaLs/observable_domain_mask - minvalue: 0.0 - maxvalue: 0.5 - - # Initial error assignment - - filter: Perform Action - udescriptor: "initial_error_assignment" - filter variables: - - name: stationPressure - where: - - variable: ObsType/stationPressure - is_in: 180 - 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] - errors: [53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11] - - # Reduce observation error for buoy surface pressure observations (setupps.f90) - - filter: Perform Action - udescriptor: "error_inflation_for_buoy" - filter variables: - - name: stationPressure - where: - - variable: ObsType/stationPressure - is_in: 180 - action: - name: inflate error - inflation factor: 0.7 - - # Error inflation based on pressure check (setupps.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: stationPressure - where: - - variable: ObsType/stationPressure - is_in: 180 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorSfcPressure - options: - geovar_geomz: geopotential_height - geovar_sfc_geomz: geopotential_height_at_surface - -# # Error inflation based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: stationPressure -# where: -# - variable: ObsType/stationPressure -# is_in: 180 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [stationPressure] -# pressure: MetaData/pressure - - # Error inflation when QualityMarker == 3 (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_QualityMarker" - filter variables: - - name: stationPressure - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: QualityMarker/stationPressure - is_in: 3 - - variable: ObsType/stationPressure - is_in: 180 - - # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_observation_pressure" - filter variables: - - name: stationPressure - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: MetaData/pressure - maxvalue: 10000.0 - - variable: ObsType/stationPressure - is_in: 180 - - # Bounds Check (ObsError) - - filter: Bounds Check - udescriptor: "bounds_check_ObsError" - filter variables: - - name: stationPressure - test variables: - - name: ObsErrorData/stationPressure - minvalue: 0.0 - maxvalue: 1000 - where: - - variable: ObsType/stationPressure - is_in: 180 - action: - name: reduce obs space - - # Bounds Check (ObsValue) - - filter: Bounds Check - udescriptor: "bounds_check_ObsValue" - filter variables: - - name: stationPressure - minvalue: 20000.0 - maxvalue: 120000.0 - where: - - variable: ObsType/stationPressure - is_in: 180 - action: - name: reduce obs space - - # Create temporary ObsErrorData - - filter: Variable Assignment - udescriptor: "create_temporary_ObsErrorData" - apply at iterations: 0,1 - where: - - variable: ObsType/stationPressure - is_in: 180 - assignments: - - name: TempObsErrorData/stationPressure - type: float - function: - name: ObsFunction/Arithmetic - options: - variables: - - name: ObsErrorData/stationPressure - defer to post: true - - # Set ObsError set "error parameter" if < "max value" - - filter: Perform Action - udescriptor: "ermin_set" - apply at iterations: 0,1 - filter variables: - - name: stationPressure - action: - name: assign error - error parameter: 100.0 - where: - - variable: - name: ObsErrorData/stationPressure - maxvalue: 100.0 - - variable: - name: ObsErrorData/stationPressure - value: is_valid - - variable: ObsType/stationPressure - is_in: 180 - defer to post: true - - # Set ObsError set "error parameter" if > "min value" - - filter: Perform Action - udescriptor: "ermax_set" - apply at iterations: 0,1 - filter variables: - - name: stationPressure - action: - name: assign error - error parameter: 300.0 - where: - - variable: - name: ObsErrorData/stationPressure - minvalue: 300.0 - - variable: - name: ObsErrorData/stationPressure - value: is_valid - - variable: ObsType/stationPressure - is_in: 180 - defer to post: true - - # Gross Error Check - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: stationPressure - threshold: 5.0 - action: - name: reject - where: - - variable: QualityMarker/stationPressure - is_not_in: 3 - - variable: ObsType/stationPressure - is_in: 180 - defer to post: true - - # Gross Error Check: cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: stationPressure - threshold: 3.5 - action: - name: reject - where: - - variable: QualityMarker/stationPressure - is_in: 3 - - variable: ObsType/stationPressure - is_in: 180 - defer to post: true - - # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. - - filter: Perform Action - udescriptor: "reassign_error_TempObsErrorData" - apply at iterations: 0,1 - filter variables: - - name: stationPressure - action: - name: assign error - error function: TempObsErrorData/stationPressure - where: - - variable: - name: TempObsErrorData/stationPressure - value: is_valid - - variable: ObsType/stationPressure - is_in: 180 - defer to post: true - - #- filter: GOMsaver - # filename: ./data/geovals/sfcshp_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/sfcshp_stationPressure_182.yaml.j2 b/parm/jcb-gdas/observations/soil/sfcshp_stationPressure_182.yaml.j2 deleted file mode 100644 index f50ddb153..000000000 --- a/parm/jcb-gdas/observations/soil/sfcshp_stationPressure_182.yaml.j2 +++ /dev/null @@ -1,334 +0,0 @@ - - obs space: - name: sfcshp_stationPressure_182 - obsdatain: - engine: - type: H5File - obsfile: "data/obs/ioda_sfcshp.nc" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - sort variable: "pressure" - sort order: "descending" - obsdataout: - empty obs space action: "{{empty_obs_space_action}}" - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: jdiag_sfcshp_stationPressure_182.nc - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [stationPressure] - simulated variables: [stationPressure] - - obs operator: - name: SfcCorrected - correction scheme to use: GSL - geovar_sfc_geomz: geopotential_height_at_surface - geovar_geomz: geopotential_height - linear obs operator: - name: Identity - - obs error: - covariance model: diagonal - - obs filters: - # ------------------ - # stationPressure (182) - # ------------------ - # Accept, reject, or passivate (monitor) - - filter: Perform Action - udescriptor: "iuse_check" - filter variables: - - name: stationPressure - where: - - variable: ObsType/stationPressure - is_in: 182 - action: - name: {{iuse_sfcshp_stationPressure_182 | default("passivate", true)}} # accept, reject, passivate - - # Reject all obs not in type - - filter: Perform Action - udescriptor: "obs_type_check" - where: - - variable: ObsValue/stationPressure - value: is_not_valid - action: - name: reduce obs space - - # Reject all obs not in kx - - filter: Perform Action - udescriptor: "obs_kx_check" - where: - - variable: ObsType/stationPressure - is_not_in: 182 - action: - name: reduce obs space - - # Reject all obs with QualityMarker > 3 - - filter: RejectList - udescriptor: "quality_marker_check" - filter variables: - - name: stationPressure - where: - - variable: QualityMarker/stationPressure - is_in: 4-15 - value: is_not_valid - where operator: or - action: - name: reduce obs space - - # Time window filter - - filter: Bounds Check - udescriptor: "time_window_check" - filter variables: - - name: stationPressure - test variables: - - name: MetaData/timeOffset - minvalue: -5400 - maxvalue: 5400 - where: - - variable: ObsType/stationPressure - is_in: 182 - action: - name: reduce obs space - - # Duplicate Check - - filter: Temporal Thinning - udescriptor: "duplicate_check" - filter variables: - - name: stationPressure - min_spacing: PT90M - tolerance: PT0H - seed_time: "{{atmosphere_background_time_iso}}" - category_variable: - name: MetaData/longitude_latitude_pressure - where: - - variable: ObsType/stationPressure - is_in: 182 - action: - name: reduce obs space - - # Online regional domain check - - filter: Bounds Check - udescriptor: "online_domain_check" - filter variables: - - name: stationPressure - test variables: - - name: GeoVaLs/observable_domain_mask - minvalue: 0.0 - maxvalue: 0.5 - - # Initial error assignment - - filter: Perform Action - udescriptor: "initial_error_assignment" - filter variables: - - name: stationPressure - where: - - variable: ObsType/stationPressure - is_in: 182 - 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] - errors: [53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 53.89, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11, 1E11] - - # Error inflation based on pressure check (setupps.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: stationPressure - where: - - variable: ObsType/stationPressure - is_in: 182 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorSfcPressure - options: - geovar_geomz: geopotential_height - geovar_sfc_geomz: geopotential_height_at_surface - -# # Error inflation based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: stationPressure -# where: -# - variable: ObsType/stationPressure -# is_in: 182 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [stationPressure] -# pressure: MetaData/pressure - - # Error inflation when QualityMarker == 3 (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_QualityMarker" - filter variables: - - name: stationPressure - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: QualityMarker/stationPressure - is_in: 3 - - variable: ObsType/stationPressure - is_in: 182 - - # Error inflation when observation pressure < 100 hPa (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_observation_pressure" - filter variables: - - name: stationPressure - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: MetaData/pressure - maxvalue: 10000.0 - - variable: ObsType/stationPressure - is_in: 182 - - # Bounds Check (ObsError) - - filter: Bounds Check - udescriptor: "bounds_check_ObsError" - filter variables: - - name: stationPressure - test variables: - - name: ObsErrorData/stationPressure - minvalue: 0.0 - maxvalue: 1000 - where: - - variable: ObsType/stationPressure - is_in: 182 - action: - name: reduce obs space - - # Bounds Check (ObsValue) - - filter: Bounds Check - udescriptor: "bounds_check_ObsValue" - filter variables: - - name: stationPressure - minvalue: 20000.0 - maxvalue: 120000.0 - where: - - variable: ObsType/stationPressure - is_in: 182 - action: - name: reduce obs space - - # Create temporary ObsErrorData - - filter: Variable Assignment - udescriptor: "create_temporary_ObsErrorData" - apply at iterations: 0,1 - where: - - variable: ObsType/stationPressure - is_in: 182 - assignments: - - name: TempObsErrorData/stationPressure - type: float - function: - name: ObsFunction/Arithmetic - options: - variables: - - name: ObsErrorData/stationPressure - defer to post: true - - # Set ObsError set "error parameter" if < "max value" - - filter: Perform Action - udescriptor: "ermin_set" - apply at iterations: 0,1 - filter variables: - - name: stationPressure - action: - name: assign error - error parameter: 100.0 - where: - - variable: - name: ObsErrorData/stationPressure - maxvalue: 100.0 - - variable: - name: ObsErrorData/stationPressure - value: is_valid - - variable: ObsType/stationPressure - is_in: 182 - defer to post: true - - # Set ObsError set "error parameter" if > "min value" - - filter: Perform Action - udescriptor: "ermax_set" - apply at iterations: 0,1 - filter variables: - - name: stationPressure - action: - name: assign error - error parameter: 300.0 - where: - - variable: - name: ObsErrorData/stationPressure - minvalue: 300.0 - - variable: - name: ObsErrorData/stationPressure - value: is_valid - - variable: ObsType/stationPressure - is_in: 182 - defer to post: true - - # Gross Error Check - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: stationPressure - threshold: 5.0 - action: - name: reject - where: - - variable: QualityMarker/stationPressure - is_not_in: 3 - - variable: ObsType/stationPressure - is_in: 182 - defer to post: true - - # Gross Error Check: cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: stationPressure - threshold: 3.5 - action: - name: reject - where: - - variable: QualityMarker/stationPressure - is_in: 3 - - variable: ObsType/stationPressure - is_in: 182 - defer to post: true - - # Re-assign err ObsErrorData <--- TempObsErrorData after gross error check. - - filter: Perform Action - udescriptor: "reassign_error_TempObsErrorData" - apply at iterations: 0,1 - filter variables: - - name: stationPressure - action: - name: assign error - error function: TempObsErrorData/stationPressure - where: - - variable: - name: TempObsErrorData/stationPressure - value: is_valid - - variable: ObsType/stationPressure - is_in: 182 - defer to post: true - - #- filter: GOMsaver - # filename: ./data/geovals/sfcshp_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/sfcshp_winds_280.yaml.j2 b/parm/jcb-gdas/observations/soil/sfcshp_winds_280.yaml.j2 deleted file mode 100644 index e39f56b31..000000000 --- a/parm/jcb-gdas/observations/soil/sfcshp_winds_280.yaml.j2 +++ /dev/null @@ -1,370 +0,0 @@ - - obs space: - name: sfcshp_winds_280 - obsdatain: - engine: - type: H5File - obsfile: "data/obs/ioda_sfcshp.nc" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - sort variable: "pressure" - sort order: "descending" - obsdataout: - empty obs space action: "{{empty_obs_space_action}}" - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: jdiag_sfcshp_winds_280.nc - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [windEastward, windNorthward] - simulated variables: [windEastward, windNorthward] - - obs operator: - name: VertInterp - vertical coordinate: air_pressure - observation vertical coordinate: pressure - observation vertical coordinate group: MetaData - interpolation method: log-linear - variables: - - name: windEastward - - name: windNorthward - - linear obs operator: - name: VertInterp - - obs error: - covariance model: diagonal - - obs filters: - # ------------------ - # wind (280) - # ------------------ - # Accept, reject, or passivate (monitor) - - filter: Perform Action - udescriptor: "iuse_check" - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 280 - action: - name: {{iuse_sfcshp_winds_280 | default("passivate", true)}} # accept, reject, passivate - - # Reject all obs not in type - - filter: Perform Action - udescriptor: "obs_type_check" - where: - - variable: ObsValue/windEastward - value: is_not_valid - action: - name: reduce obs space - - # Reject all obs not in kx - - filter: Perform Action - udescriptor: "obs_kx_check" - where: - - variable: ObsType/windEastward - is_not_in: 280 - action: - name: reduce obs space - - # Reject all obs with QualityMarker > 3 - - filter: RejectList - udescriptor: "quality_marker_check" - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: QualityMarker/windEastward - is_in: 4-15 - value: is_not_valid - where operator: or - action: - name: reduce obs space - - # Time window filter - - filter: Bounds Check - udescriptor: "time_window_check" - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: MetaData/timeOffset - minvalue: -5400 - maxvalue: 5400 - where: - - variable: ObsType/windEastward - is_in: 280 - action: - name: reduce obs space - - # Duplicate Check - - filter: Temporal Thinning - udescriptor: "duplicate_check" - filter variables: - - name: windEastward - - name: windNorthward - min_spacing: PT90M - tolerance: PT0H - seed_time: "{{atmosphere_background_time_iso}}" - category_variable: - name: MetaData/longitude_latitude_pressure - where: - - variable: ObsType/windEastward - is_in: 280 - action: - name: reduce obs space - - # Online domain check - - filter: Bounds Check - udescriptor: "online_domain_check" - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: GeoVaLs/observable_domain_mask - minvalue: 0.0 - maxvalue: 0.5 - - # Initial error assignment - - filter: Perform Action - udescriptor: "initial_error_assignment" - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 280 - 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] - errors: [2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628, 2.628] - - # Error inflation (windEastward) based on pressure check (setupw.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: windEastward - where: - - variable: ObsType/windEastward - is_in: 280 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: windEastward - inflation factor: 4.0 - SetSfcWndObsHeight: true - AddObsHeightToStationElevation: true - AssumedSfcWndObsHeight: 10 - - # Error inflation (windNorthward) based on pressure check (setupw.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: windNorthward - where: - - variable: ObsType/windNorthward - is_in: 280 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: windNorthward - inflation factor: 4.0 - SetSfcWndObsHeight: true - AddObsHeightToStationElevation: true - AssumedSfcWndObsHeight: 10 - -# # Error inflation (windEastward) based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: windEastward -# where: -# - variable: ObsType/windEastward -# is_in: 280 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [windEastward] -# test QCflag: QualityMarker -# test QCthreshold: 3 -# distance threshold: 0 -# pressure: MetaData/pressure - -# # Error inflation (windNorthward) based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: windNorthward -# where: -# - variable: ObsType/windNorthward -# is_in: 280 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [windNorthward] -# test QCflag: QualityMarker -# test QCthreshold: 3 -# distance threshold: 0 -# pressure: MetaData/pressure - - # Error inflation when QualityMarker == 3 (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_QualityMarker" - filter variables: - - name: windEastward - - name: windNorthward - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: QualityMarker/windEastward - is_in: 3 - - variable: ObsType/windEastward - is_in: 280 - - # Error inflation when observation pressure < 50 hPa (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_observation_pressure" - filter variables: - - name: windEastward - - name: windNorthward - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: MetaData/pressure - maxvalue: 5000.0 - - variable: ObsType/windEastward - is_in: 280 - - # Bounds Check (ObsError) - - filter: Bounds Check - udescriptor: "bounds_check_ObsError" - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: ObsErrorData/windEastward - minvalue: 0.0 - maxvalue: 1000 - where: - - variable: ObsType/windEastward - is_in: 280 - action: - name: reduce obs space - - # Bounds Check (ObsValue) - - filter: Bounds Check - udescriptor: "bounds_check_ObsValue" - filter variables: - - name: windEastward - - name: windNorthward - minvalue: -130 - maxvalue: 130 - where: - - variable: ObsType/windEastward - is_in: 280 - action: - name: reduce obs space - - # Gross Error Check (windEastward) - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: windEastward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 280 ] - cgross: [ 5.0 ] - error_min: [ 1.0 ] - error_max: [ 5.0 ] - variable: windEastward - where: - - variable: QualityMarker/windEastward - is_not_in: 3 - action: - name: reject - defer to post: true - - # Gross Error Check (windNorthward) - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: windNorthward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 280 ] - cgross: [ 5.0 ] - error_min: [ 1.0 ] - error_max: [ 5.0 ] - variable: windNorthward - where: - - variable: QualityMarker/windNorthward - is_not_in: 3 - action: - name: reject - defer to post: true - - # Gross Error Check (windEastward): cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: windEastward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 280 ] - cgross: [ 3.5 ] - error_min: [ 1.0 ] - error_max: [ 5.0 ] - variable: windEastward - where: - - variable: QualityMarker/windEastward - is_in: 3 - action: - name: reject - defer to post: true - - # Gross Error Check (windNorthward): cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: windNorthward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 280 ] - cgross: [ 3.5 ] - error_min: [ 1.0 ] - error_max: [ 5.0 ] - variable: windNorthward - where: - - variable: QualityMarker/windNorthward - is_in: 3 - action: - name: reject - defer to post: true - - #- filter: GOMsaver - # filename: ./data/geovals/sfcshp_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/sfcshp_winds_282.yaml.j2 b/parm/jcb-gdas/observations/soil/sfcshp_winds_282.yaml.j2 deleted file mode 100644 index e9ff7afc5..000000000 --- a/parm/jcb-gdas/observations/soil/sfcshp_winds_282.yaml.j2 +++ /dev/null @@ -1,370 +0,0 @@ - - obs space: - name: sfcshp_winds_282 - obsdatain: - engine: - type: H5File - obsfile: "data/obs/ioda_sfcshp.nc" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - sort variable: "pressure" - sort order: "descending" - obsdataout: - empty obs space action: "{{empty_obs_space_action}}" - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: jdiag_sfcshp_winds_282.nc - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [windEastward, windNorthward] - simulated variables: [windEastward, windNorthward] - - obs operator: - name: VertInterp - vertical coordinate: air_pressure - observation vertical coordinate: pressure - observation vertical coordinate group: MetaData - interpolation method: log-linear - variables: - - name: windEastward - - name: windNorthward - - linear obs operator: - name: VertInterp - - obs error: - covariance model: diagonal - - obs filters: - # ------------------ - # wind (282) - # ------------------ - # Accept, reject, or passivate (monitor) - - filter: Perform Action - udescriptor: "iuse_check" - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 282 - action: - name: {{iuse_sfcshp_winds_282 | default("passivate", true)}} # accept, reject, passivate - - # Reject all obs not in type - - filter: Perform Action - udescriptor: "obs_type_check" - where: - - variable: ObsValue/windEastward - value: is_not_valid - action: - name: reduce obs space - - # Reject all obs not in kx - - filter: Perform Action - udescriptor: "obs_kx_check" - where: - - variable: ObsType/windEastward - is_not_in: 282 - action: - name: reduce obs space - - # Reject all obs with QualityMarker > 3 - - filter: RejectList - udescriptor: "quality_marker_check" - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: QualityMarker/windEastward - is_in: 4-15 - value: is_not_valid - where operator: or - action: - name: reduce obs space - - # Time window filter - - filter: Bounds Check - udescriptor: "time_window_check" - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: MetaData/timeOffset - minvalue: -5400 - maxvalue: 5400 - where: - - variable: ObsType/windEastward - is_in: 282 - action: - name: reduce obs space - - # Duplicate Check - - filter: Temporal Thinning - udescriptor: "duplicate_check" - filter variables: - - name: windEastward - - name: windNorthward - min_spacing: PT90M - tolerance: PT0H - seed_time: "{{atmosphere_background_time_iso}}" - category_variable: - name: MetaData/longitude_latitude_pressure - where: - - variable: ObsType/windEastward - is_in: 282 - action: - name: reduce obs space - - # Online domain check - - filter: Bounds Check - udescriptor: "online_domain_check" - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: GeoVaLs/observable_domain_mask - minvalue: 0.0 - maxvalue: 0.5 - - # Initial error assignment - - filter: Perform Action - udescriptor: "initial_error_assignment" - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 282 - 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] - errors: [1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079] - - # Error inflation (windEastward) based on pressure check (setupw.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: windEastward - where: - - variable: ObsType/windEastward - is_in: 282 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: windEastward - inflation factor: 4.0 - SetSfcWndObsHeight: true - AddObsHeightToStationElevation: true - AssumedSfcWndObsHeight: 10 - - # Error inflation (windNorthward) based on pressure check (setupw.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: windNorthward - where: - - variable: ObsType/windNorthward - is_in: 282 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: windNorthward - inflation factor: 4.0 - SetSfcWndObsHeight: true - AddObsHeightToStationElevation: true - AssumedSfcWndObsHeight: 10 - -# # Error inflation (windEastward) based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: windEastward -# where: -# - variable: ObsType/windEastward -# is_in: 282 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [windEastward] -# test QCflag: QualityMarker -# test QCthreshold: 3 -# distance threshold: 0 -# pressure: MetaData/pressure - -# # Error inflation (windNorthward) based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: windNorthward -# where: -# - variable: ObsType/windNorthward -# is_in: 282 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [windNorthward] -# test QCflag: QualityMarker -# test QCthreshold: 3 -# distance threshold: 0 -# pressure: MetaData/pressure - - # Error inflation when QualityMarker == 3 (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_QualityMarker" - filter variables: - - name: windEastward - - name: windNorthward - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: QualityMarker/windEastward - is_in: 3 - - variable: ObsType/windEastward - is_in: 282 - - # Error inflation when observation pressure < 50 hPa (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_observation_pressure" - filter variables: - - name: windEastward - - name: windNorthward - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: MetaData/pressure - maxvalue: 5000.0 - - variable: ObsType/windEastward - is_in: 282 - - # Bounds Check (ObsError) - - filter: Bounds Check - udescriptor: "bounds_check_ObsError" - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: ObsErrorData/windEastward - minvalue: 0.0 - maxvalue: 1000 - where: - - variable: ObsType/windEastward - is_in: 282 - action: - name: reduce obs space - - # Bounds Check (ObsValue) - - filter: Bounds Check - udescriptor: "bounds_check_ObsValue" - filter variables: - - name: windEastward - - name: windNorthward - minvalue: -130 - maxvalue: 130 - where: - - variable: ObsType/windEastward - is_in: 282 - action: - name: reduce obs space - - # Gross Error Check (windEastward) - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: windEastward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 282 ] - cgross: [ 5.0 ] - error_min: [ 1.0 ] - error_max: [ 5.0 ] - variable: windEastward - where: - - variable: QualityMarker/windEastward - is_not_in: 3 - action: - name: reject - defer to post: true - - # Gross Error Check (windNorthward) - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: windNorthward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 282 ] - cgross: [ 5.0 ] - error_min: [ 1.0 ] - error_max: [ 5.0 ] - variable: windNorthward - where: - - variable: QualityMarker/windNorthward - is_not_in: 3 - action: - name: reject - defer to post: true - - # Gross Error Check (windEastward): cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: windEastward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 282 ] - cgross: [ 3.5 ] - error_min: [ 1.0 ] - error_max: [ 5.0 ] - variable: windEastward - where: - - variable: QualityMarker/windEastward - is_in: 3 - action: - name: reject - defer to post: true - - # Gross Error Check (windNorthward): cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: windNorthward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 282 ] - cgross: [ 3.5 ] - error_min: [ 1.0 ] - error_max: [ 5.0 ] - variable: windNorthward - where: - - variable: QualityMarker/windNorthward - is_in: 3 - action: - name: reject - defer to post: true - - #- filter: GOMsaver - # filename: ./data/geovals/sfcshp_geovals_rrfs.nc diff --git a/parm/jcb-gdas/observations/soil/sfcshp_winds_284.yaml.j2 b/parm/jcb-gdas/observations/soil/sfcshp_winds_284.yaml.j2 deleted file mode 100644 index 9ba293e4f..000000000 --- a/parm/jcb-gdas/observations/soil/sfcshp_winds_284.yaml.j2 +++ /dev/null @@ -1,370 +0,0 @@ - - obs space: - name: sfcshp_winds_284 - obsdatain: - engine: - type: H5File - obsfile: "data/obs/ioda_sfcshp.nc" - missing file action: "warn" - obsgrouping: - group variables: ["stationIdentification"] - sort variable: "pressure" - sort order: "descending" - obsdataout: - empty obs space action: "{{empty_obs_space_action}}" - write multiple files: {{write_multiple_files | default(false) }} - engine: - type: H5File - obsfile: jdiag_sfcshp_winds_284.nc - allow overwrite: true - io pool: - max pool size: {{ max_pool_size | default(1) }} - observed variables: [windEastward, windNorthward] - simulated variables: [windEastward, windNorthward] - - obs operator: - name: VertInterp - vertical coordinate: air_pressure - observation vertical coordinate: pressure - observation vertical coordinate group: MetaData - interpolation method: log-linear - variables: - - name: windEastward - - name: windNorthward - - linear obs operator: - name: VertInterp - - obs error: - covariance model: diagonal - - obs filters: - # ------------------ - # wind (284) - # ------------------ - # Accept, reject, or passivate (monitor) - - filter: Perform Action - udescriptor: "iuse_check" - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 284 - action: - name: {{iuse_sfcshp_winds_284 | default("passivate", true)}} # accept, reject, passivate - - # Reject all obs not in type - - filter: Perform Action - udescriptor: "obs_type_check" - where: - - variable: ObsValue/windEastward - value: is_not_valid - action: - name: reduce obs space - - # Reject all obs not in kx - - filter: Perform Action - udescriptor: "obs_kx_check" - where: - - variable: ObsType/windEastward - is_not_in: 284 - action: - name: reduce obs space - - # Reject all obs with QualityMarker > 3 - - filter: RejectList - udescriptor: "quality_marker_check" - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: QualityMarker/windEastward - is_in: 4-15 - value: is_not_valid - where operator: or - action: - name: reduce obs space - - # Time window filter - - filter: Bounds Check - udescriptor: "time_window_check" - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: MetaData/timeOffset - minvalue: -5400 - maxvalue: 5400 - where: - - variable: ObsType/windEastward - is_in: 284 - action: - name: reduce obs space - - # Duplicate Check - - filter: Temporal Thinning - udescriptor: "duplicate_check" - filter variables: - - name: windEastward - - name: windNorthward - min_spacing: PT90M - tolerance: PT0H - seed_time: "{{atmosphere_background_time_iso}}" - category_variable: - name: MetaData/longitude_latitude_pressure - where: - - variable: ObsType/windEastward - is_in: 284 - action: - name: reduce obs space - - # Online domain check - - filter: Bounds Check - udescriptor: "online_domain_check" - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: GeoVaLs/observable_domain_mask - minvalue: 0.0 - maxvalue: 0.5 - - # Initial error assignment - - filter: Perform Action - udescriptor: "initial_error_assignment" - filter variables: - - name: windEastward - - name: windNorthward - where: - - variable: ObsType/windEastward - is_in: 284 - 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] - errors: [1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079, 1.079] - - # Error inflation (windEastward) based on pressure check (setupw.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: windEastward - where: - - variable: ObsType/windEastward - is_in: 284 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: windEastward - inflation factor: 4.0 - SetSfcWndObsHeight: true - AddObsHeightToStationElevation: true - AssumedSfcWndObsHeight: 10 - - # Error inflation (windNorthward) based on pressure check (setupw.f90) - - filter: Perform Action - udescriptor: "error_inflation_pressure_check" - filter variables: - - name: windNorthward - where: - - variable: ObsType/windNorthward - is_in: 284 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorPressureCheck - options: - variable: windNorthward - inflation factor: 4.0 - SetSfcWndObsHeight: true - AddObsHeightToStationElevation: true - AssumedSfcWndObsHeight: 10 - -# # Error inflation (windEastward) based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: windEastward -# where: -# - variable: ObsType/windEastward -# is_in: 284 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [windEastward] -# test QCflag: QualityMarker -# test QCthreshold: 3 -# distance threshold: 0 -# pressure: MetaData/pressure - -# # Error inflation (windNorthward) based on errormod (qcmod.f90) -# - filter: Perform Action -# filter variables: -# - name: windNorthward -# where: -# - variable: ObsType/windNorthward -# is_in: 284 -# action: -# name: inflate error -# inflation variable: -# name: ObsFunction/ObsErrorFactorConventional -# options: -# inflate variables: [windNorthward] -# test QCflag: QualityMarker -# test QCthreshold: 3 -# distance threshold: 0 -# pressure: MetaData/pressure - - # Error inflation when QualityMarker == 3 (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_QualityMarker" - filter variables: - - name: windEastward - - name: windNorthward - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: QualityMarker/windEastward - is_in: 3 - - variable: ObsType/windEastward - is_in: 284 - - # Error inflation when observation pressure < 50 hPa (read_prepbufr.f90) - - filter: Perform Action - udescriptor: "error_inflation_observation_pressure" - filter variables: - - name: windEastward - - name: windNorthward - action: - name: inflate error - inflation factor: 1.2 - where: - - variable: MetaData/pressure - maxvalue: 5000.0 - - variable: ObsType/windEastward - is_in: 284 - - # Bounds Check (ObsError) - - filter: Bounds Check - udescriptor: "bounds_check_ObsError" - filter variables: - - name: windEastward - - name: windNorthward - test variables: - - name: ObsErrorData/windEastward - minvalue: 0.0 - maxvalue: 1000 - where: - - variable: ObsType/windEastward - is_in: 284 - action: - name: reduce obs space - - # Bounds Check (ObsValue) - - filter: Bounds Check - udescriptor: "bounds_check_ObsValue" - filter variables: - - name: windEastward - - name: windNorthward - minvalue: -130 - maxvalue: 130 - where: - - variable: ObsType/windEastward - is_in: 284 - action: - name: reduce obs space - - # Gross Error Check (windEastward) - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: windEastward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 284 ] - cgross: [ 5.0 ] - error_min: [ 1.0 ] - error_max: [ 5.0 ] - variable: windEastward - where: - - variable: QualityMarker/windEastward - is_not_in: 3 - action: - name: reject - defer to post: true - - # Gross Error Check (windNorthward) - - filter: Background Check - udescriptor: "gross_error_check" - apply at iterations: 0,1 - filter variables: - - name: windNorthward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 284 ] - cgross: [ 5.0 ] - error_min: [ 1.0 ] - error_max: [ 5.0 ] - variable: windNorthward - where: - - variable: QualityMarker/windNorthward - is_not_in: 3 - action: - name: reject - defer to post: true - - # Gross Error Check (windEastward): cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: windEastward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 284 ] - cgross: [ 3.5 ] - error_min: [ 1.0 ] - error_max: [ 5.0 ] - variable: windEastward - where: - - variable: QualityMarker/windEastward - is_in: 3 - action: - name: reject - defer to post: true - - # Gross Error Check (windNorthward): cgross*0.7 if QualityMarker=3 - - filter: Background Check - udescriptor: "gross_error_check_0.7" - apply at iterations: 0,1 - filter variables: - - name: windNorthward - function absolute threshold: - - name: ObsFunction/WindsSPDBCheck - options: - wndtype: [ 284 ] - cgross: [ 3.5 ] - error_min: [ 1.0 ] - error_max: [ 5.0 ] - variable: windNorthward - where: - - variable: QualityMarker/windNorthward - is_in: 3 - action: - name: reject - defer to post: true - - #- filter: GOMsaver - # filename: ./data/geovals/sfcshp_geovals_rrfs.nc From 063236cbdc0c50a6d85578d70363d781019985e8 Mon Sep 17 00:00:00 2001 From: tsga Date: Thu, 18 Jun 2026 18:38:21 +0000 Subject: [PATCH 46/98] refine snow ens settings --- .../snow/snow_background_ensemble.yaml.j2 | 1 - .../adpsfc_air_temperature_at_2m_181_gsi.yaml | 14 ---- .../observations/soil/smap_soil.yaml.j2 | 72 ++----------------- .../observations/soil/smap_soil_smc.yaml.j2 | 58 --------------- parm/snow/jcb-base.yaml.j2 | 5 +- parm/snow/snow_det_config.yaml.j2 | 1 - 6 files changed, 5 insertions(+), 146 deletions(-) delete mode 100644 parm/jcb-gdas/observation_chronicle/soil/adpsfc_air_temperature_at_2m_181_gsi.yaml diff --git a/parm/jcb-gdas/model/snow/snow_background_ensemble.yaml.j2 b/parm/jcb-gdas/model/snow/snow_background_ensemble.yaml.j2 index f0ad26f11..ce7dcab86 100644 --- a/parm/jcb-gdas/model/snow/snow_background_ensemble.yaml.j2 +++ b/parm/jcb-gdas/model/snow/snow_background_ensemble.yaml.j2 @@ -1,4 +1,3 @@ -#datetime: '{{ snow_background_time_iso }}' members from template: template: datetime: '{{ snow_background_time_iso }}' diff --git a/parm/jcb-gdas/observation_chronicle/soil/adpsfc_air_temperature_at_2m_181_gsi.yaml b/parm/jcb-gdas/observation_chronicle/soil/adpsfc_air_temperature_at_2m_181_gsi.yaml deleted file mode 100644 index f7db866a8..000000000 --- a/parm/jcb-gdas/observation_chronicle/soil/adpsfc_air_temperature_at_2m_181_gsi.yaml +++ /dev/null @@ -1,14 +0,0 @@ -# Instrument metadata -# ------------------- -commissioned: 1970-01-01T00:00:00 - -observer_type: conventional # Type of chronicle to use - -window_option: max - -# observation type initial configuration -# -------------------------------- -stations_to_reject: [fakelist] - -# Chronicle of changes for this observation type -# ---------------------------------------- diff --git a/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 b/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 index b97833f71..bb448d109 100644 --- a/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 +++ b/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 @@ -13,12 +13,7 @@ engine: type: H5File obsfile: "{{soil_obsdatain_path}}/{{soil_obsdatain_prefix}}{{observation_from_jcb}}.nc" -# - "{{soil_obsdatain_path}}/{{soil_obsdatain_prefix}}h-12.{{observation_from_jcb}}.nc" -# - "{{soil_obsdatain_path}}/{{soil_obsdatain_prefix}}h-6.{{observation_from_jcb}}.nc" -# - "{{soil_obsdatain_path}}/{{soil_obsdatain_prefix}}h0.{{observation_from_jcb}}.nc" -# - "{{soil_obsdatain_path}}/{{soil_obsdatain_prefix}}h6.{{observation_from_jcb}}.nc" -# - "{{soil_obsdatain_path}}/{{soil_obsdatain_prefix}}h12.{{observation_from_jcb}}.nc" -# missing file action: warn + missing file action: warn # obsgrouping: # group variables: # - stationIdentification @@ -30,11 +25,10 @@ allow overwrite: true io pool: max pool size: 1 -# observed variables: -# - soill1 - simulated variables: + observed variables: - soill1 - # + simulated variables: + - soill1 # Observation Operator # -------------------- @@ -63,18 +57,12 @@ flags: - name: missing_smc initial value: false -# - name: missing_elevation -# initial value: false - name: invalid_smc initial value: false -# - name: invalid_elevation -# initial value: false - name: land_check initial value: false - name: landice_check initial value: false -# - name: seaice_check -# initial value: false - name: snow_check initial value: false - name: retrv_qual_check @@ -83,8 +71,6 @@ initial value: false - name: elevation_bkgdiff initial value: false -# - name: rejectlist -# initial value: false - name: background_check initial value: false - filter: Perform Action @@ -114,37 +100,6 @@ flag: invalid_smc ignore: rejected observations - name: reject -# - filter: Domain Check # land only -# where: -# - variable: -# name: GeoVaLs/fraction_of_land -# minvalue: 0.5 -# actions: -# - name: set -# flag: land_check -# ignore: rejected observations -# - name: reject -# - filter: Domain Check -# where: -# - variable: -# name: MetaData/stationElevation -# minvalue: -200.0 -# maxvalue: 9000.0 -# actions: -# - name: set -# flag: invalid_elevation -# ignore: rejected observations -# - name: reject -# - filter: Domain Check # land only, no sea ice -# where: -# - variable: -# name: GeoVaLs/fraction_of_ice -# maxvalue: 0.0 -# actions: -# - name: set -# flag: seaice_check -# ignore: rejected observations -# - name: reject - filter: Domain Check # no snow where: - variable: @@ -186,25 +141,6 @@ # - name: set # flag: vegtype_check # ignore: rejected observations -# - name: reject -# - filter: Difference Check # elevation check -# reference: MetaData/stationElevation -# value: GeoVaLs/filtered_orography -# threshold: 800. -# actions: -# - name: set -# flag: elevation_bkgdiff -# ignore: rejected observations -# - name: reject -# - filter: BlackList -# where: -# - variable: -# name: MetaData/stationIdentification -# is_in: {{ get_conventional_rejected_stations(observation_from_jcb) }} -# actions: -# - name: set -# flag: rejectlist -# ignore: rejected observations # - name: reject obs post filters: # Bounds Check (ObsError) diff --git a/parm/jcb-gdas/observations/soil/smap_soil_smc.yaml.j2 b/parm/jcb-gdas/observations/soil/smap_soil_smc.yaml.j2 index 949c5a75d..0688c649a 100644 --- a/parm/jcb-gdas/observations/soil/smap_soil_smc.yaml.j2 +++ b/parm/jcb-gdas/observations/soil/smap_soil_smc.yaml.j2 @@ -48,12 +48,8 @@ flags: - name: missing_smc initial value: false -# - name: missing_elevation -# initial value: false - name: invalid_smc initial value: false -# - name: invalid_elevation -# initial value: false - name: land_check initial value: false - name: landice_check @@ -68,8 +64,6 @@ initial value: false - name: elevation_bkgdiff initial value: false -# - name: rejectlist -# initial value: false - name: background_check initial value: false - filter: Perform Action @@ -88,16 +82,6 @@ flag: missing_smc ignore: rejected observations - name: reject -# - filter: Domain Check -# where: -# - variable: -# name: MetaData/stationElevation -# value: is_valid -# actions: -# - name: set -# flag: missing_elevation -# ignore: rejected observations -# - name: reject obs prior filters: - filter: Bounds Check filter variables: @@ -119,17 +103,6 @@ flag: land_check ignore: rejected observations - name: reject -# - filter: Domain Check -# where: -# - variable: -# name: MetaData/stationElevation -# minvalue: -200.0 -# maxvalue: 9000.0 -# actions: -# - name: set -# flag: invalid_elevation -# ignore: rejected observations -# - name: reject - filter: Domain Check # land only, no sea ice where: - variable: @@ -171,37 +144,6 @@ flag: landice_check ignore: rejected observations - name: reject -# - filter: RejectList # exclude certain IGBP vegetation types -# where: -# - variable: -# name: GeoVaLs/vtype -# absolute_tolerance: 1.0e-3 -# is_close_to_any_of: [1, 2, 3, 4, 13, 15, 17] -# actions: -# - name: set -# flag: vegtype_check -# ignore: rejected observations -# - name: reject - -# - filter: Difference Check # elevation check -# reference: MetaData/stationElevation -# value: GeoVaLs/filtered_orography -# threshold: 800. -# actions: -# - name: set -# flag: elevation_bkgdiff -# ignore: rejected observations -# - name: reject -# - filter: BlackList -# where: -# - variable: -# name: MetaData/stationIdentification -# is_in: {{ get_conventional_rejected_stations(observation_from_jcb) }} -# actions: -# - name: set -# flag: rejectlist -# ignore: rejected observations -# - name: reject obs post filters: # Bounds Check (ObsError) - filter: Bounds Check diff --git a/parm/snow/jcb-base.yaml.j2 b/parm/snow/jcb-base.yaml.j2 index 7cb11147e..10a34262f 100644 --- a/parm/snow/jcb-base.yaml.j2 +++ b/parm/snow/jcb-base.yaml.j2 @@ -65,7 +65,6 @@ snow_orog_prefix: "{{ CASE }}.mx{{ OCNRES }}" # Background snow_background_path: {{snow_bkg_path}} -#background_ensemble_path: ./ens/mem%mem% #TODO: this may not be ncessary snow_background_ensemble_path: ./bkg/mem%mem% # Background error @@ -76,7 +75,6 @@ snow_background_error_file: "{{BERROR_YAML}}" snow_forecast_length: "{{ SNOW_WINDOW_LENGTH }}" snow_forecast_timestep: "{{ BKG_TSTEP }}" - # Observation things # ------------------ observations: all_observations @@ -109,8 +107,7 @@ snow_obsbiascovout_prefix: "{{APREFIX}}" snow_obsbiascovout_suffix: ".satbias_cov.nc" # Ensemble mean things -snow_number_ensemble_members: {{NMEM_ENS | default(1, true) }} #do we need the one below? -#number_ensemble_members: {{ NMEM_ENS | default(1, true) }} +snow_number_ensemble_members: {{NMEM_ENS | default(1, true) }} # Local Ensemble DA (LETKF) # ------------------------- diff --git a/parm/snow/snow_det_config.yaml.j2 b/parm/snow/snow_det_config.yaml.j2 index bf1df6480..9db1ccac4 100644 --- a/parm/snow/snow_det_config.yaml.j2 +++ b/parm/snow/snow_det_config.yaml.j2 @@ -91,5 +91,4 @@ data_out: '{{ COMOUT_SNOW_ANALYSIS }}/{{ bkgtime | to_fv3time }}.snow_analysis.sfc_data.tile5.nc'] - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', '{{ COMOUT_SNOW_ANALYSIS }}/{{ bkgtime | to_fv3time }}.snow_analysis.sfc_data.tile6.nc'] - {% endfor %} From 5789cd0d1ebcc08a99a92a57c5d04141b9c51d6a Mon Sep 17 00:00:00 2001 From: tsga Date: Thu, 18 Jun 2026 18:38:36 +0000 Subject: [PATCH 47/98] clean up soil base --- parm/soil/jcb-base.yaml.j2 | 66 ++------------------------------------ 1 file changed, 2 insertions(+), 64 deletions(-) diff --git a/parm/soil/jcb-base.yaml.j2 b/parm/soil/jcb-base.yaml.j2 index 61df9ebb7..317cda668 100644 --- a/parm/soil/jcb-base.yaml.j2 +++ b/parm/soil/jcb-base.yaml.j2 @@ -37,8 +37,7 @@ soil_increment_time_fv3: "{{ bkg_time_fv3 }}" # Analysis standard things # ------------------------ -analysis_variables: [soill1, soill2, soilt1, soilt2] -#soilMoistureVolumetric, slc, stc, air_temperature_at_2m] +analysis_variables: [soill1, soill2, soilt1, soilt2] #soilMoistureVolumetric, slc, stc, air_temperature_at_2m] minimizer: DRPCG final_diagnostics_departures: anlmob final_prints_frequency: PT3H @@ -82,19 +81,6 @@ soil_forecast_timestep: "{{ BKG_TSTEP }}" # ------------------ observations: all_observations -#From Cory: https://docs.google.com/document/d/1CNfOZ7UzAOrVEXNyxeHAKafjjZp7WeBn-F07itWo6eE/ -#replace QC filters with a blanket configuration...to get listed obs' QC decisions from GSI: -#*replace_obs_filters: -#* observations: -#* - adpsfc_air_temperature_at_2m_181_gsi -#*# - sfcship #Clara: no need for this to assimiate into soil -#* override_filters: #only assimilate when GsiEffectiveQCAnl is 0 -#* - filter: PreQC -#* inputQC: 'GsiEffectiveQCAnl' -#* maxvalue: 0.0 -#* action: -#* name: reject - crtm_coefficient_path: "{{ DATA }}/crtm/" # Naming conventions for observational files @@ -125,54 +111,6 @@ soil_obsbiasout_suffix: ".satbias.nc" soil_obsbiascovout_prefix: "{{APREFIX}}" soil_obsbiascovout_suffix: ".satbias_cov.nc" -atmosphere_obsbiasin_path: "{{DATA}}/obs/" -atmosphere_obsbiasin_prefix: "{{GPREFIX}}" -atmosphere_obsbiasin_suffix: ".satbias.nc" #GSI converters produce 1 file but JEDI produces 2 -atmosphere_obstlapsein_prefix: "{{GPREFIX}}" -atmosphere_obstlapsein_suffix: ".tlapse.txt" -atmosphere_obsbiascovin_prefix: "{{GPREFIX}}" -atmosphere_obsbiascovin_suffix: ".satbias_cov.nc" - -#####----blindly copied from atm; unlikely to apply here------------ -# Naming conventions for observational files -atmosphere_obsdatain_path: "{{DATA}}/obs" -atmosphere_obsdatain_script_path: "{{HOMEgfs}}/ush/spoc/atmosphere" -atmosphere_obsdatain_prefix: "{{OPREFIX}}" -atmosphere_obsdatain_suffix: ".nc" -atmosphere_obsdatain_suffix_bufr: ".tm00.bufr_d" - -atmosphere_obsdataout_path: "{{DATA}}/diags" -atmosphere_obsdataout_prefix: diag_ -atmosphere_obsdataout_suffix: "_{{ current_cycle | to_YMDH }}.nc" - -# Naming conventions for bias correction files - -atmosphere_obsbiasin_path: "{{DATA}}/obs/" -atmosphere_obsbiasin_prefix: "{{GPREFIX}}" -atmosphere_obsbiasin_suffix: ".satbias.nc" -atmosphere_obstlapsein_prefix: "{{GPREFIX}}" -atmosphere_obstlapsein_suffix: ".tlapse.txt" -atmosphere_obsbiascovin_prefix: "{{GPREFIX}}" -atmosphere_obsbiascovin_suffix: ".satbias_cov.nc" - -atmosphere_obsbiasout_path: "{{DATA}}/bc/" -atmosphere_obsbiasout_prefix: "{{APREFIX}}" -atmosphere_obsbiasout_suffix: ".satbias.nc" #GSI converters produce 1 file but JEDI produces 2 -atmosphere_obsbiascovout_prefix: "{{APREFIX}}" -atmosphere_obsbiascovout_suffix: ".satbias_cov.nc" - -bias_files_dict: - radiance_atms_n20: rad_varbc_params.tar - radiance_atms_npp: rad_varbc_params.tar - radiance_mtiasi_metop-a: rad_varbc_params.tar - radiance_mtiasi_metop-b: rad_varbc_params.tar - radiance_amsua_n19: rad_varbc_params.tar - radiance_ssmis_f17: rad_varbc_params.tar - radiance_ssmis_f18: rad_varbc_params.tar - radiance_cris-fsr_n20: rad_varbc_params.tar - radiance_cris-fsr_npp: rad_varbc_params.tar -####-------------------------------------------------------------- - # Ensemble mean things soil_number_ensemble_members: {{NMEM_ENS | default(1, true) }} soil_analysis_ensemble_path: ./anl/mem%mem% @@ -187,7 +125,7 @@ increment_variables: [soill1, soill2, soilt1, soilt2, air_temperature_at_2m, spe # Veritcal localization for GETKF vl_fraction_of_retained_variance: 0.750 -vl_lengthscale: 22.1 +vl_lengthscale: 2.1 vl_lengthscale_units: logp inflation_rtps: 0.85 inflation_rtpp: 0.0 From 555b700592f6ef67823b1c12ac53b0520058b9c6 Mon Sep 17 00:00:00 2001 From: tsga Date: Thu, 18 Jun 2026 18:39:23 +0000 Subject: [PATCH 48/98] remove unused prep files --- parm/soil/prep/prepbufr_adpsfc.yaml | 501 ---------------------------- parm/soil/prep/prepbufr_sfcshp.yaml | 501 ---------------------------- 2 files changed, 1002 deletions(-) delete mode 100644 parm/soil/prep/prepbufr_adpsfc.yaml delete mode 100644 parm/soil/prep/prepbufr_sfcshp.yaml diff --git a/parm/soil/prep/prepbufr_adpsfc.yaml b/parm/soil/prep/prepbufr_adpsfc.yaml deleted file mode 100644 index c567ac46b..000000000 --- a/parm/soil/prep/prepbufr_adpsfc.yaml +++ /dev/null @@ -1,501 +0,0 @@ -# (C) Copyright 2024 NOAA/NWS/NCEP/EMC -# -# 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. - -observations: - - obs space: - name: bufr - obsdatain: "./prepbufr" - - exports: - #group_by_variable: prepbufrDataLvlCat - subsets: - - ADPSFC # SURFACE LAND (SYNOPTIC, METAR) REPORTS - #- SFCSHP # SURFACE MARINE (SHIP, BUOY, C-MAN/TIGE GAUGE PLATFORM) REPORTS - variables: - # MetaData - timestamp: - timeoffset: - timeOffset: "*/DHR" - transforms: - - scale: 3600 - referenceTime: "2024-06-01T00:00:00Z" - timeOffset: - query: "*/DHR" - transforms: - - scale: 3600 - longitude: - query: "*/XOB" - latitude: - query: "*/YOB" - stationIdentification: - query: "*/SID" - stationElevation: - query: "*/ELV" - #type: float - prepbufrReportType: - query: "*/TYP" - dumpReportType: - query: "*/T29" - prepbufrDataLvlCat: - query: "*/CAT" - - pressure: - query: "*/P___INFO/P__EVENT{1}/POB" - transforms: - - scale: 100 - stationPressure: - query: "*/P___INFO/P__EVENT{1}/POB" - transforms: - - scale: 100 - stationPressureQualityMarker: - query: "*/P___INFO/P__EVENT{1}/PQM" - stationPressureError: - query: "*/P___INFO/P__BACKG/POE" - transforms: - - scale: 100 - stationPressureTunedError: - query: "*/P___INFO/P__POSTP/POETU" - transforms: - - scale: 100 - - heightOfObservation: - query: "*/Z___INFO/Z__EVENT{1}/ZOB" - #type: float - heightOfObservationQualityMark: - query: "*/Z___INFO/Z__EVENT{1}/ZQM" - - specificHumidity: - query: "*/Q___INFO/Q__EVENT{1}/QOB" - type: float - transforms: - - scale: 0.000001 - # Assign fake Q errors - specificHumidityError: - query: "*/Q___INFO/Q__EVENT{1}/QOB" - type: float - transforms: - - scale: 0.0 - - offset: 999 - specificHumidityQualityMarker: - query: "*/Q___INFO/Q__EVENT{1}/QQM" - relativeHumidityError: - query: "*/Q___INFO/Q__BACKG/QOE" - transforms: - - scale: 0.1 - relativeHumidityTunedError: - query: "*/Q___INFO/Q__POSTP/QOETU" - transforms: - - scale: 0.1 - - dewpointTemperature: - query: "*/Q___INFO/TDO" - transforms: - - offset: 273.15 - - airTemperature: - query: "*/T___INFO/T__EVENT{1}/TOB" - transforms: - - offset: 273.15 - airTemperatureQualityMarker: - query: "*/T___INFO/T__EVENT{1}/TQM" - airTemperatureError: - query: "*/T___INFO/T__BACKG/TOE" - airTemperatureTunedError: - query: "*/T___INFO/T__POSTP/TOETU" - - windEastward: - query: "*/W___INFO/W__EVENT{1}/UOB" - windNorthward: - query: "*/W___INFO/W__EVENT{1}/VOB" - windQualityMarker: - query: "*/W___INFO/W__EVENT{1}/WQM" - windError: - query: "*/W___INFO/W__BACKG/WOE" - windTunedError: - query: "*/W___INFO/W__POSTP/WOETU" - transform: - - scale: 0.514444 - - pressureReducedToMeanSeaLevel: - query: "*/PMSL_SEQ/PMO" - transforms: - - scale: 100 - pressureReducedToMeanSeaLevelQualityMarker: - query: "*/PMSL_SEQ/PMQ" - - seaTemperature: - query: "*/SST_INFO/SSTEVENT{1}/SST1" - seaTemperatureQualityMarker: - query: "*/SST_INFO/SSTEVENT{1}/SSTQM" - seaTemperatureError: - query: "*/SST_INFO/SSTBACKG/SSTOE" - seaTemperatureMethod: - query: "*/SST_INFO/MSST" - depthBelowSeaSurface: - query: "*/SST_INFO/DBSS_SEQ/DBSS" - type: float - heightOfWaves: - query: "*/WAVE_SEQ/HOWV" - type: float - - presentWeather: - query: "*/PREWXSEQ{1}/PRWE" - - maximumWindGustSpeed: - query: "*/GUST1SEQ/MXGS" - - verticalSignificance: - query: "*/CLOUDSEQ{1}/VSSO" - cloudAmount: - query: "*/CLOUDSEQ{1}/CLAM" - heightOfBaseOfCloud: - query: "*/CLOUDSEQ{1}/HOCB" - type: float - cloudCoverTotal: - query: "*/CLOU2SEQ{1}/TOCC" - type: float - transforms: - - scale: 0.01 - heightAboveSurfaceOfBaseOfLowestCloud: - query: "*/CLOU2SEQ/HBLCS" - - ioda: - backend: netcdf - obsdataout: "./ioda_adpsfc.nc" - - dimensions: - - name: pevent_Dim - path: "*/P___INFO/P__EVENT" - - name: qevent_Dim - path: "*/Q___INFO/Q__EVENT" - - name: tevent_Dim - path: "*/T___INFO/T__EVENT" - - name: wevent_Dim - path: "*/W___INFO/W__EVENT" - - name: zevent_Dim - path: "*/Z___INFO/Z__EVENT" - - - variables: - - # MetaData - - name: "MetaData/dateTime" - coordinates: "longitude latitude" - source: variables/timestamp - longName: "Observation Time" - units: "seconds since 1970-01-01T00:00:00Z" - - - name: "MetaData/timeOffset" - coordinates: "longitude latitude" - source: variables/timeOffset - longName: "Observation Time Minus Reference Time" - units: "s" - - - name: "MetaData/stationIdentification" - coordinates: "longitude latitude" - source: variables/stationIdentification - longName: "Station ID" - units: "" - - - name: "MetaData/longitude" - coordinates: "longitude latitude" - source: variables/longitude - longName: "Longitude" - units: "degree_east" - range: [0, 360] - - - name: "MetaData/latitude" - coordinates: "longitude latitude" - source: variables/latitude - longName: "Latitude" - units: "degree_north" - range: [-90, 90] - - - name: "MetaData/stationElevation" - coordinates: "longitude latitude" - source: variables/stationElevation - longName: "Elevation of Station" - units: "m" - - - name: "MetaData/prepbufrReportType" - coordinates: "longitude latitude" - source: variables/prepbufrReportType - longName: "Prepbufr Report Type" - units: "" - - - name: "MetaData/dumpReportType" - coordinates: "longitude latitude" - source: variables/dumpReportType - longName: "Data Dump Report Type" - units: "" - - - name: "MetaData/prepbufrDataLvlCat" - coordinates: "longitude latitude" - source: variables/prepbufrDataLvlCat - longName: "Prepbufr Data Level Category" - units: "" - - - name: "MetaData/seaTemperatureMethod" - coordinates: "longitude latitude" - source: variables/seaTemperatureMethod - longName: "Method of Sea Temperature Measurement" - units: "" - - - name: "MetaData/height" - coordinates: "longitude latitude" - source: variables/heightOfObservation - longName: "Height" - units: "m" - - - name: "MetaData/pressure" - coordinates: "longitude latitude" - source: variables/pressure - longName: "Pressure" - units: "Pa" - - # ObsType - - name: "ObsType/specificHumidity" - coordinates: "longitude latitude" - source: variables/prepbufrReportType - longName: "specificHumidity Report Type" - units: "" - - - name: "ObsType/airTemperature" - coordinates: "longitude latitude" - source: variables/prepbufrReportType - longName: "airTemperature report Type" - units: "" - - - name: "ObsType/windEastward" - coordinates: "longitude latitude" - source: variables/prepbufrReportType - longName: "windEastward Report Type" - units: "" - - - name: "ObsType/windNorthward" - coordinates: "longitude latitude" - source: variables/prepbufrReportType - longName: "windNorthward Report Type" - units: "" - - - name: "ObsType/stationPressure" - coordinates: "longitude latitude" - source: variables/prepbufrReportType - longName: "Pressure" - units: "" - - # ObsValue - - name: "ObsValue/specificHumidity" - coordinates: "longitude latitude" - source: variables/specificHumidity - longName: "Specific Humidity" - units: "Kilogram Kilogram-1" - - - name: "ObsValue/airTemperature" - coordinates: "longitude latitude" - source: variables/airTemperature - longName: "Temperature" - units: "K" - - - name: "ObsValue/dewpointTemperature" - coordinates: "longitude latitude" - source: variables/dewpointTemperature - longName: "Dewpoint Temperature" - units: "K" - - - name: "ObsValue/windEastward" - coordinates: "longitude latitude" - source: variables/windEastward - longName: "Eastward Wind" - units: "m s-1" - - - name: "ObsValue/windNorthward" - coordinates: "longitude latitude" - source: variables/windNorthward - longName: "Northward Wind" - units: "m s-1" - - - name: "ObsValue/stationPressure" - coordinates: "longitude latitude" - source: variables/stationPressure - longName: "Station Pressure" - units: "Pa" - - - name: "ObsValue/pressureReducedToMeanSeaLevel" - coordinates: "longitude latitude" - source: variables/pressureReducedToMeanSeaLevel - longName: "Mean Sea-Level Pressure" - units: "Pa" - - - name: "ObsValue/seaTemperature" - coordinates: "longitude latitude" - source: variables/seaTemperature - longName: "Sea Temperature" - units: "K" - - - name: "ObsValue/depthBelowSeaSurface" - coordinates: "longitude latitude" - source: variables/depthBelowSeaSurface - longName: "Depth Below Sea Surface" - units: "m" - - - name: "ObsValue/heightOfWaves" - coordinates: "longitude latitude" - source: variables/heightOfWaves - longName: "Height of Waves" - units: "m" - - - name: "ObsValue/presentWeather" - coordinates: "longitude latitude" - source: variables/presentWeather - longName: "Description of Present Weather" - - - name: "ObsValue/maximumWindGustSpeed" - coordinates: "longitude latitude" - source: variables/maximumWindGustSpeed - longName: "Maximum Wind Gust Speed" - units: "m s-1" - - - name: "ObsValue/verticalSignificance" - coordinates: "longitude latitude" - source: variables/verticalSignificance - longName: "Description of Vertical Significance (Surface Observations)" - - - name: "ObsValue/cloudAmount" - coordinates: "longitude latitude" - source: variables/cloudAmount - longName: "Description of Cloud Amount" - - - name: "ObsValue/heightOfBaseOfCloud" - coordinates: "longitude latitude" - source: variables/heightOfBaseOfCloud - longName: "Height of Base of Cloud" - units: "m" - - - name: "ObsValue/cloudCoverTotal" - coordinates: "longitude latitude" - source: variables/cloudCoverTotal - longName: "Total Cloud Coverage" - units: "1" - - - name: "ObsValue/heightAboveSurfaceOfBaseOfLowestCloud" - coordinates: "longitude latitude" - source: variables/heightAboveSurfaceOfBaseOfLowestCloud - longName: "Height above Surface of Base of Lowest Cloud Seen" - - # Quality Marker - - name: "QualityMarker/stationPressure" - coordinates: "longitude latitude" - source: variables/stationPressureQualityMarker - longName: "Pressure Quality Marker" - - - name: "QualityMarker/height" - coordinates: "longitude latitude" - source: variables/heightOfObservationQualityMark - longName: "Height Quality Marker" - - - name: "QualityMarker/specificHumidity" - coordinates: "longitude latitude" - source: variables/specificHumidityQualityMarker - longName: "Specific Humidity Quality Marker" - - - name: "QualityMarker/airTemperature" - coordinates: "longitude latitude" - source: variables/airTemperatureQualityMarker - longName: "Temperature Quality Marker" - - - name: "QualityMarker/windEastward" - coordinates: "longitude latitude" - source: variables/windQualityMarker - longName: "windEastward Quality Marker" - - - name: "QualityMarker/windNorthward" - coordinates: "longitude latitude" - source: variables/windQualityMarker - longName: "windNorthward Quality Marker" - - - name: "QualityMarker/pressureReducedToMeanSeaLevel" - coordinates: "longitude latitude" - source: variables/pressureReducedToMeanSeaLevelQualityMarker - longName: "Mean Sea Level Pressure Quality Marker" - - - name: "QualityMarker/seaTemperature" - coordinates: "longitude latitude" - source: variables/seaTemperatureQualityMarker - longName: "Sea Temperature Quality Marker" - - # ObsError - - name: "ObsError/stationPressure" - coordinates: "longitude latitude" - source: variables/stationPressureError - longName: "Pressure Observation Error" - units: "Pa" - - - name: "ObsError/specificHumidity" - coordinates: "longitude latitude" - source: variables/specificHumidityError - longName: "Specific Humidity Error" - units: "kg kg-1" - - - name: "ObsError/relativeHumidity" - coordinates: "longitude latitude" - source: variables/relativeHumidityError - longName: "Relative Humidity Error" - units: "1" - - - name: "ObsError/airTemperature" - coordinates: "longitude latitude" - source: variables/airTemperatureError - longName: "Temperature Error" - units: "K" - - - name: "ObsError/windEastward" - coordinates: "longitude latitude" - source: variables/windError - longName: "Eastward wind error" - units: "m s-1" - - - name: "ObsError/windNorthward" - coordinates: "longitude latitude" - source: variables/windError - longName: "Northward wind error" - units: "m s-1" - - - name: "ObsError/seaTemperature" - coordinates: "longitude latitude" - source: variables/seaTemperatureError - longName: "Sea Temperature Observation Error" - units: "K" - -# # Tuned ObsError -# - name: "TunedObsError/stationPressure" -# coordinates: "longitude latitude" -# source: variables/stationPressureTunedError -# longName: "Analysis-Tuned Pressure Observation Error" -# units: "Pa" -# -# - name: "TunedObsError/relativeHumidity" -# coordinates: "longitude latitude" -# source: variables/relativeHumidityTunedError -# longName: "Analysis-Tuned Relative Humidity Error" -# units: "1" -# -# - name: "TunedObsError/airTemperature" -# coordinates: "longitude latitude" -# source: variables/airTemperatureTunedError -# longName: "Analysis-Tuned Temperature Error" -# units: "K" -# -# - name: "TunedObsError/windEastward" -# coordinates: "longitude latitude" -# source: variables/windTunedError -# longName: "Analysis-Tuned Eastward wind error" -# units: "m s-1" -# -# - name: "TunedObsError/windNorthward" -# coordinates: "longitude latitude" -# source: variables/windTunedError -# longName: "Analysis-Tuned Northward wind error" -# units: "m s-1" diff --git a/parm/soil/prep/prepbufr_sfcshp.yaml b/parm/soil/prep/prepbufr_sfcshp.yaml deleted file mode 100644 index 7b84ea004..000000000 --- a/parm/soil/prep/prepbufr_sfcshp.yaml +++ /dev/null @@ -1,501 +0,0 @@ -# (C) Copyright 2024 NOAA/NWS/NCEP/EMC -# -# 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. - -observations: - - obs space: - name: bufr - obsdatain: "./prepbufr" - - exports: - #group_by_variable: prepbufrDataLvlCat - subsets: - #- ADPSFC # SURFACE LAND (SYNOPTIC, METAR) REPORTS - - SFCSHP # SURFACE MARINE (SHIP, BUOY, C-MAN/TIGE GAUGE PLATFORM) REPORTS - variables: - # MetaData - timestamp: - timeoffset: - timeOffset: "*/DHR" - transforms: - - scale: 3600 - referenceTime: "2024-06-01T00:00:00Z" - timeOffset: - query: "*/DHR" - transforms: - - scale: 3600 - longitude: - query: "*/XOB" - latitude: - query: "*/YOB" - stationIdentification: - query: "*/SID" - stationElevation: - query: "*/ELV" - #type: float - prepbufrReportType: - query: "*/TYP" - dumpReportType: - query: "*/T29" - prepbufrDataLvlCat: - query: "*/CAT" - - pressure: - query: "*/P___INFO/P__EVENT{1}/POB" - transforms: - - scale: 100 - stationPressure: - query: "*/P___INFO/P__EVENT{1}/POB" - transforms: - - scale: 100 - stationPressureQualityMarker: - query: "*/P___INFO/P__EVENT{1}/PQM" - stationPressureError: - query: "*/P___INFO/P__BACKG/POE" - transforms: - - scale: 100 - stationPressureTunedError: - query: "*/P___INFO/P__POSTP/POETU" - transforms: - - scale: 100 - - heightOfObservation: - query: "*/Z___INFO/Z__EVENT{1}/ZOB" - #type: float - heightOfObservationQualityMark: - query: "*/Z___INFO/Z__EVENT{1}/ZQM" - - specificHumidity: - query: "*/Q___INFO/Q__EVENT{1}/QOB" - type: float - transforms: - - scale: 0.000001 - # Assign fake Q errors - specificHumidityError: - query: "*/Q___INFO/Q__EVENT{1}/QOB" - type: float - transforms: - - scale: 0.0 - - offset: 999 - specificHumidityQualityMarker: - query: "*/Q___INFO/Q__EVENT{1}/QQM" - relativeHumidityError: - query: "*/Q___INFO/Q__BACKG/QOE" - transforms: - - scale: 0.1 - relativeHumidityTunedError: - query: "*/Q___INFO/Q__POSTP/QOETU" - transforms: - - scale: 0.1 - - dewpointTemperature: - query: "*/Q___INFO/TDO" - transforms: - - offset: 273.15 - - airTemperature: - query: "*/T___INFO/T__EVENT{1}/TOB" - transforms: - - offset: 273.15 - airTemperatureQualityMarker: - query: "*/T___INFO/T__EVENT{1}/TQM" - airTemperatureError: - query: "*/T___INFO/T__BACKG/TOE" - airTemperatureTunedError: - query: "*/T___INFO/T__POSTP/TOETU" - - windEastward: - query: "*/W___INFO/W__EVENT{1}/UOB" - windNorthward: - query: "*/W___INFO/W__EVENT{1}/VOB" - windQualityMarker: - query: "*/W___INFO/W__EVENT{1}/WQM" - windError: - query: "*/W___INFO/W__BACKG/WOE" - windTunedError: - query: "*/W___INFO/W__POSTP/WOETU" - transform: - - scale: 0.514444 - - pressureReducedToMeanSeaLevel: - query: "*/PMSL_SEQ/PMO" - transforms: - - scale: 100 - pressureReducedToMeanSeaLevelQualityMarker: - query: "*/PMSL_SEQ/PMQ" - - seaTemperature: - query: "*/SST_INFO/SSTEVENT{1}/SST1" - seaTemperatureQualityMarker: - query: "*/SST_INFO/SSTEVENT{1}/SSTQM" - seaTemperatureError: - query: "*/SST_INFO/SSTBACKG/SSTOE" - seaTemperatureMethod: - query: "*/SST_INFO/MSST" - depthBelowSeaSurface: - query: "*/SST_INFO/DBSS_SEQ/DBSS" - type: float - heightOfWaves: - query: "*/WAVE_SEQ/HOWV" - type: float - - presentWeather: - query: "*/PREWXSEQ{1}/PRWE" - - maximumWindGustSpeed: - query: "*/GUST1SEQ/MXGS" - - verticalSignificance: - query: "*/CLOUDSEQ{1}/VSSO" - cloudAmount: - query: "*/CLOUDSEQ{1}/CLAM" - heightOfBaseOfCloud: - query: "*/CLOUDSEQ{1}/HOCB" - type: float - cloudCoverTotal: - query: "*/CLOU2SEQ{1}/TOCC" - type: float - transforms: - - scale: 0.01 - heightAboveSurfaceOfBaseOfLowestCloud: - query: "*/CLOU2SEQ/HBLCS" - - ioda: - backend: netcdf - obsdataout: "./ioda_sfcshp.nc" - - dimensions: - - name: pevent_Dim - path: "*/P___INFO/P__EVENT" - - name: qevent_Dim - path: "*/Q___INFO/Q__EVENT" - - name: tevent_Dim - path: "*/T___INFO/T__EVENT" - - name: wevent_Dim - path: "*/W___INFO/W__EVENT" - - name: zevent_Dim - path: "*/Z___INFO/Z__EVENT" - - - variables: - - # MetaData - - name: "MetaData/dateTime" - coordinates: "longitude latitude" - source: variables/timestamp - longName: "Observation Time" - units: "seconds since 1970-01-01T00:00:00Z" - - - name: "MetaData/timeOffset" - coordinates: "longitude latitude" - source: variables/timeOffset - longName: "Observation Time Minus Reference Time" - units: "s" - - - name: "MetaData/stationIdentification" - coordinates: "longitude latitude" - source: variables/stationIdentification - longName: "Station ID" - units: "" - - - name: "MetaData/longitude" - coordinates: "longitude latitude" - source: variables/longitude - longName: "Longitude" - units: "degree_east" - range: [0, 360] - - - name: "MetaData/latitude" - coordinates: "longitude latitude" - source: variables/latitude - longName: "Latitude" - units: "degree_north" - range: [-90, 90] - - - name: "MetaData/stationElevation" - coordinates: "longitude latitude" - source: variables/stationElevation - longName: "Elevation of Station" - units: "m" - - - name: "MetaData/prepbufrReportType" - coordinates: "longitude latitude" - source: variables/prepbufrReportType - longName: "Prepbufr Report Type" - units: "" - - - name: "MetaData/dumpReportType" - coordinates: "longitude latitude" - source: variables/dumpReportType - longName: "Data Dump Report Type" - units: "" - - - name: "MetaData/prepbufrDataLvlCat" - coordinates: "longitude latitude" - source: variables/prepbufrDataLvlCat - longName: "Prepbufr Data Level Category" - units: "" - - - name: "MetaData/seaTemperatureMethod" - coordinates: "longitude latitude" - source: variables/seaTemperatureMethod - longName: "Method of Sea Temperature Measurement" - units: "" - - - name: "MetaData/height" - coordinates: "longitude latitude" - source: variables/heightOfObservation - longName: "Height" - units: "m" - - - name: "MetaData/pressure" - coordinates: "longitude latitude" - source: variables/pressure - longName: "Pressure" - units: "Pa" - - # ObsType - - name: "ObsType/specificHumidity" - coordinates: "longitude latitude" - source: variables/prepbufrReportType - longName: "specificHumidity Report Type" - units: "" - - - name: "ObsType/airTemperature" - coordinates: "longitude latitude" - source: variables/prepbufrReportType - longName: "airTemperature report Type" - units: "" - - - name: "ObsType/windEastward" - coordinates: "longitude latitude" - source: variables/prepbufrReportType - longName: "windEastward Report Type" - units: "" - - - name: "ObsType/windNorthward" - coordinates: "longitude latitude" - source: variables/prepbufrReportType - longName: "windNorthward Report Type" - units: "" - - - name: "ObsType/stationPressure" - coordinates: "longitude latitude" - source: variables/prepbufrReportType - longName: "Pressure" - units: "" - - # ObsValue - - name: "ObsValue/specificHumidity" - coordinates: "longitude latitude" - source: variables/specificHumidity - longName: "Specific Humidity" - units: "Kilogram Kilogram-1" - - - name: "ObsValue/airTemperature" - coordinates: "longitude latitude" - source: variables/airTemperature - longName: "Temperature" - units: "K" - - - name: "ObsValue/dewpointTemperature" - coordinates: "longitude latitude" - source: variables/dewpointTemperature - longName: "Dewpoint Temperature" - units: "K" - - - name: "ObsValue/windEastward" - coordinates: "longitude latitude" - source: variables/windEastward - longName: "Eastward Wind" - units: "m s-1" - - - name: "ObsValue/windNorthward" - coordinates: "longitude latitude" - source: variables/windNorthward - longName: "Northward Wind" - units: "m s-1" - - - name: "ObsValue/stationPressure" - coordinates: "longitude latitude" - source: variables/stationPressure - longName: "Station Pressure" - units: "Pa" - - - name: "ObsValue/pressureReducedToMeanSeaLevel" - coordinates: "longitude latitude" - source: variables/pressureReducedToMeanSeaLevel - longName: "Mean Sea-Level Pressure" - units: "Pa" - - - name: "ObsValue/seaTemperature" - coordinates: "longitude latitude" - source: variables/seaTemperature - longName: "Sea Temperature" - units: "K" - - - name: "ObsValue/depthBelowSeaSurface" - coordinates: "longitude latitude" - source: variables/depthBelowSeaSurface - longName: "Depth Below Sea Surface" - units: "m" - - - name: "ObsValue/heightOfWaves" - coordinates: "longitude latitude" - source: variables/heightOfWaves - longName: "Height of Waves" - units: "m" - - - name: "ObsValue/presentWeather" - coordinates: "longitude latitude" - source: variables/presentWeather - longName: "Description of Present Weather" - - - name: "ObsValue/maximumWindGustSpeed" - coordinates: "longitude latitude" - source: variables/maximumWindGustSpeed - longName: "Maximum Wind Gust Speed" - units: "m s-1" - - - name: "ObsValue/verticalSignificance" - coordinates: "longitude latitude" - source: variables/verticalSignificance - longName: "Description of Vertical Significance (Surface Observations)" - - - name: "ObsValue/cloudAmount" - coordinates: "longitude latitude" - source: variables/cloudAmount - longName: "Description of Cloud Amount" - - - name: "ObsValue/heightOfBaseOfCloud" - coordinates: "longitude latitude" - source: variables/heightOfBaseOfCloud - longName: "Height of Base of Cloud" - units: "m" - - - name: "ObsValue/cloudCoverTotal" - coordinates: "longitude latitude" - source: variables/cloudCoverTotal - longName: "Total Cloud Coverage" - units: "1" - - - name: "ObsValue/heightAboveSurfaceOfBaseOfLowestCloud" - coordinates: "longitude latitude" - source: variables/heightAboveSurfaceOfBaseOfLowestCloud - longName: "Height above Surface of Base of Lowest Cloud Seen" - - # Quality Marker - - name: "QualityMarker/stationPressure" - coordinates: "longitude latitude" - source: variables/stationPressureQualityMarker - longName: "Pressure Quality Marker" - - - name: "QualityMarker/height" - coordinates: "longitude latitude" - source: variables/heightOfObservationQualityMark - longName: "Height Quality Marker" - - - name: "QualityMarker/specificHumidity" - coordinates: "longitude latitude" - source: variables/specificHumidityQualityMarker - longName: "Specific Humidity Quality Marker" - - - name: "QualityMarker/airTemperature" - coordinates: "longitude latitude" - source: variables/airTemperatureQualityMarker - longName: "Temperature Quality Marker" - - - name: "QualityMarker/windEastward" - coordinates: "longitude latitude" - source: variables/windQualityMarker - longName: "windEastward Quality Marker" - - - name: "QualityMarker/windNorthward" - coordinates: "longitude latitude" - source: variables/windQualityMarker - longName: "windNorthward Quality Marker" - - - name: "QualityMarker/pressureReducedToMeanSeaLevel" - coordinates: "longitude latitude" - source: variables/pressureReducedToMeanSeaLevelQualityMarker - longName: "Mean Sea Level Pressure Quality Marker" - - - name: "QualityMarker/seaTemperature" - coordinates: "longitude latitude" - source: variables/seaTemperatureQualityMarker - longName: "Sea Temperature Quality Marker" - - # ObsError - - name: "ObsError/stationPressure" - coordinates: "longitude latitude" - source: variables/stationPressureError - longName: "Pressure Observation Error" - units: "Pa" - - - name: "ObsError/specificHumidity" - coordinates: "longitude latitude" - source: variables/specificHumidityError - longName: "Specific Humidity Error" - units: "kg kg-1" - - - name: "ObsError/relativeHumidity" - coordinates: "longitude latitude" - source: variables/relativeHumidityError - longName: "Relative Humidity Error" - units: "1" - - - name: "ObsError/airTemperature" - coordinates: "longitude latitude" - source: variables/airTemperatureError - longName: "Temperature Error" - units: "K" - - - name: "ObsError/windEastward" - coordinates: "longitude latitude" - source: variables/windError - longName: "Eastward wind error" - units: "m s-1" - - - name: "ObsError/windNorthward" - coordinates: "longitude latitude" - source: variables/windError - longName: "Northward wind error" - units: "m s-1" - - - name: "ObsError/seaTemperature" - coordinates: "longitude latitude" - source: variables/seaTemperatureError - longName: "Sea Temperature Observation Error" - units: "K" - -# # Tuned ObsError -# - name: "TunedObsError/stationPressure" -# coordinates: "longitude latitude" -# source: variables/stationPressureTunedError -# longName: "Analysis-Tuned Pressure Observation Error" -# units: "Pa" -# -# - name: "TunedObsError/relativeHumidity" -# coordinates: "longitude latitude" -# source: variables/relativeHumidityTunedError -# longName: "Analysis-Tuned Relative Humidity Error" -# units: "1" -# -# - name: "TunedObsError/airTemperature" -# coordinates: "longitude latitude" -# source: variables/airTemperatureTunedError -# longName: "Analysis-Tuned Temperature Error" -# units: "K" -# -# - name: "TunedObsError/windEastward" -# coordinates: "longitude latitude" -# source: variables/windTunedError -# longName: "Analysis-Tuned Eastward wind error" -# units: "m s-1" -# -# - name: "TunedObsError/windNorthward" -# coordinates: "longitude latitude" -# source: variables/windTunedError -# longName: "Analysis-Tuned Northward wind error" -# units: "m s-1" From 5133ece64736230d830c90b75472d02b750292bd Mon Sep 17 00:00:00 2001 From: tsga Date: Thu, 18 Jun 2026 18:45:17 +0000 Subject: [PATCH 49/98] remove b+inc copy from soil det config --- parm/soil/soil_det_config.yaml.j2 | 40 +++++-------------------------- 1 file changed, 6 insertions(+), 34 deletions(-) diff --git a/parm/soil/soil_det_config.yaml.j2 b/parm/soil/soil_det_config.yaml.j2 index b8b519d69..863199609 100644 --- a/parm/soil/soil_det_config.yaml.j2 +++ b/parm/soil/soil_det_config.yaml.j2 @@ -31,7 +31,6 @@ data_in: - ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/bkg/'] - ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/bkg/'] - ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/bkg/'] - - ['{{ COMIN_ATMOS_HISTORY_PREV }}/{{ GPREFIX }}csg_sfc.f006.nc', '{{ DATA }}/bkg/'] - ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile1.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile1.nc" ] - ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile2.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile2.nc" ] @@ -49,11 +48,11 @@ data_in: - ['{{ COMIN_ATMOS_HISTORY_PREV }}/{{ GPREFIX }}csg_atm.f006.nc', '{{ DATA }}/bkg/{{ GPREFIX }}csg_atm.f006.nc'] - ['{{ COMIN_ATMOS_HISTORY_PREV }}/{{ GPREFIX }}csg_sfc.f006.nc', '{{ DATA }}/bkg/{{ GPREFIX }}csg_sfc.f006.nc'] - - ['{{ COMIN_OBS }}/{{ OPREFIX }}h-12.smap_soil.nc', '{{ DATA }}/obs'] - - ['{{ COMIN_OBS }}/{{ OPREFIX }}h-6.smap_soil.nc', '{{ DATA }}/obs'] - - ['{{ COMIN_OBS }}/{{ OPREFIX }}h0.smap_soil.nc', '{{ DATA }}/obs'] - - ['{{ COMIN_OBS }}/{{ OPREFIX }}h6.smap_soil.nc', '{{ DATA }}/obs'] - - ['{{ COMIN_OBS }}/{{ OPREFIX }}h12.smap_soil.nc', '{{ DATA }}/obs'] +# - ['{{ COMIN_OBS }}/{{ OPREFIX }}h-12.smap_soil.nc', '{{ DATA }}/obs'] +# - ['{{ COMIN_OBS }}/{{ OPREFIX }}h-6.smap_soil.nc', '{{ DATA }}/obs'] +# - ['{{ COMIN_OBS }}/{{ OPREFIX }}h0.smap_soil.nc', '{{ DATA }}/obs'] +# - ['{{ COMIN_OBS }}/{{ OPREFIX }}h6.smap_soil.nc', '{{ DATA }}/obs'] +# - ['{{ COMIN_OBS }}/{{ OPREFIX }}h12.smap_soil.nc', '{{ DATA }}/obs'] data_out: @@ -83,37 +82,10 @@ data_out: '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc'] - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc'] - - # Analysis = bkg + inc required for tile-to-vector - - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc', '{{ COMIN_ATMOS_RESTART }}'] - - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc', '{{ COMIN_ATMOS_RESTART }}'] - - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc', '{{ COMIN_ATMOS_RESTART }}'] - - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc', '{{ COMIN_ATMOS_RESTART }}'] - - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc', '{{ COMIN_ATMOS_RESTART }}'] - - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', '{{ COMIN_ATMOS_RESTART }}'] - -{% endfor %} - -{% if DO_FINAL_SOILANL %} -{% for bkgtime in bkgtimes %} - # Final 3DVar Analysis - - ['{{ DATA }}/anl/soil_finanl.{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ bkgtime | to_fv3time }}.sfcanl_data.tile1.nc'] - - ['{{ DATA }}/anl/soil_finanl.{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ bkgtime | to_fv3time }}.sfcanl_data.tile2.nc'] - - ['{{ DATA }}/anl/soil_finanl.{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ bkgtime | to_fv3time }}.sfcanl_data.tile3.nc'] - - ['{{ DATA }}/anl/soil_finanl.{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ bkgtime | to_fv3time }}.sfcanl_data.tile4.nc'] - - ['{{ DATA }}/anl/soil_finanl.{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ bkgtime | to_fv3time }}.sfcanl_data.tile5.nc'] - - ['{{ DATA }}/anl/soil_finanl.{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ bkgtime | to_fv3time }}.sfcanl_data.tile6.nc'] {% endfor %} -{% endif %} copy_opt: - # Increments TODO: make this _req once options between csg and fv3 well handled + # Increments TODO: make this _req once choice between csg and fv3 finalized - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile1.nc'] - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', From 7abcd38a291454d764fc445005e7cf4501d3ea40 Mon Sep 17 00:00:00 2001 From: tsga Date: Thu, 18 Jun 2026 18:46:53 +0000 Subject: [PATCH 50/98] restore prepbufr --- parm/soil/prep/prepbufr_adpsfc.yaml | 501 ++++++++++++++++++++++++++++ parm/soil/prep/prepbufr_sfcshp.yaml | 501 ++++++++++++++++++++++++++++ 2 files changed, 1002 insertions(+) create mode 100644 parm/soil/prep/prepbufr_adpsfc.yaml create mode 100644 parm/soil/prep/prepbufr_sfcshp.yaml diff --git a/parm/soil/prep/prepbufr_adpsfc.yaml b/parm/soil/prep/prepbufr_adpsfc.yaml new file mode 100644 index 000000000..c567ac46b --- /dev/null +++ b/parm/soil/prep/prepbufr_adpsfc.yaml @@ -0,0 +1,501 @@ +# (C) Copyright 2024 NOAA/NWS/NCEP/EMC +# +# 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. + +observations: + - obs space: + name: bufr + obsdatain: "./prepbufr" + + exports: + #group_by_variable: prepbufrDataLvlCat + subsets: + - ADPSFC # SURFACE LAND (SYNOPTIC, METAR) REPORTS + #- SFCSHP # SURFACE MARINE (SHIP, BUOY, C-MAN/TIGE GAUGE PLATFORM) REPORTS + variables: + # MetaData + timestamp: + timeoffset: + timeOffset: "*/DHR" + transforms: + - scale: 3600 + referenceTime: "2024-06-01T00:00:00Z" + timeOffset: + query: "*/DHR" + transforms: + - scale: 3600 + longitude: + query: "*/XOB" + latitude: + query: "*/YOB" + stationIdentification: + query: "*/SID" + stationElevation: + query: "*/ELV" + #type: float + prepbufrReportType: + query: "*/TYP" + dumpReportType: + query: "*/T29" + prepbufrDataLvlCat: + query: "*/CAT" + + pressure: + query: "*/P___INFO/P__EVENT{1}/POB" + transforms: + - scale: 100 + stationPressure: + query: "*/P___INFO/P__EVENT{1}/POB" + transforms: + - scale: 100 + stationPressureQualityMarker: + query: "*/P___INFO/P__EVENT{1}/PQM" + stationPressureError: + query: "*/P___INFO/P__BACKG/POE" + transforms: + - scale: 100 + stationPressureTunedError: + query: "*/P___INFO/P__POSTP/POETU" + transforms: + - scale: 100 + + heightOfObservation: + query: "*/Z___INFO/Z__EVENT{1}/ZOB" + #type: float + heightOfObservationQualityMark: + query: "*/Z___INFO/Z__EVENT{1}/ZQM" + + specificHumidity: + query: "*/Q___INFO/Q__EVENT{1}/QOB" + type: float + transforms: + - scale: 0.000001 + # Assign fake Q errors + specificHumidityError: + query: "*/Q___INFO/Q__EVENT{1}/QOB" + type: float + transforms: + - scale: 0.0 + - offset: 999 + specificHumidityQualityMarker: + query: "*/Q___INFO/Q__EVENT{1}/QQM" + relativeHumidityError: + query: "*/Q___INFO/Q__BACKG/QOE" + transforms: + - scale: 0.1 + relativeHumidityTunedError: + query: "*/Q___INFO/Q__POSTP/QOETU" + transforms: + - scale: 0.1 + + dewpointTemperature: + query: "*/Q___INFO/TDO" + transforms: + - offset: 273.15 + + airTemperature: + query: "*/T___INFO/T__EVENT{1}/TOB" + transforms: + - offset: 273.15 + airTemperatureQualityMarker: + query: "*/T___INFO/T__EVENT{1}/TQM" + airTemperatureError: + query: "*/T___INFO/T__BACKG/TOE" + airTemperatureTunedError: + query: "*/T___INFO/T__POSTP/TOETU" + + windEastward: + query: "*/W___INFO/W__EVENT{1}/UOB" + windNorthward: + query: "*/W___INFO/W__EVENT{1}/VOB" + windQualityMarker: + query: "*/W___INFO/W__EVENT{1}/WQM" + windError: + query: "*/W___INFO/W__BACKG/WOE" + windTunedError: + query: "*/W___INFO/W__POSTP/WOETU" + transform: + - scale: 0.514444 + + pressureReducedToMeanSeaLevel: + query: "*/PMSL_SEQ/PMO" + transforms: + - scale: 100 + pressureReducedToMeanSeaLevelQualityMarker: + query: "*/PMSL_SEQ/PMQ" + + seaTemperature: + query: "*/SST_INFO/SSTEVENT{1}/SST1" + seaTemperatureQualityMarker: + query: "*/SST_INFO/SSTEVENT{1}/SSTQM" + seaTemperatureError: + query: "*/SST_INFO/SSTBACKG/SSTOE" + seaTemperatureMethod: + query: "*/SST_INFO/MSST" + depthBelowSeaSurface: + query: "*/SST_INFO/DBSS_SEQ/DBSS" + type: float + heightOfWaves: + query: "*/WAVE_SEQ/HOWV" + type: float + + presentWeather: + query: "*/PREWXSEQ{1}/PRWE" + + maximumWindGustSpeed: + query: "*/GUST1SEQ/MXGS" + + verticalSignificance: + query: "*/CLOUDSEQ{1}/VSSO" + cloudAmount: + query: "*/CLOUDSEQ{1}/CLAM" + heightOfBaseOfCloud: + query: "*/CLOUDSEQ{1}/HOCB" + type: float + cloudCoverTotal: + query: "*/CLOU2SEQ{1}/TOCC" + type: float + transforms: + - scale: 0.01 + heightAboveSurfaceOfBaseOfLowestCloud: + query: "*/CLOU2SEQ/HBLCS" + + ioda: + backend: netcdf + obsdataout: "./ioda_adpsfc.nc" + + dimensions: + - name: pevent_Dim + path: "*/P___INFO/P__EVENT" + - name: qevent_Dim + path: "*/Q___INFO/Q__EVENT" + - name: tevent_Dim + path: "*/T___INFO/T__EVENT" + - name: wevent_Dim + path: "*/W___INFO/W__EVENT" + - name: zevent_Dim + path: "*/Z___INFO/Z__EVENT" + + + variables: + + # MetaData + - name: "MetaData/dateTime" + coordinates: "longitude latitude" + source: variables/timestamp + longName: "Observation Time" + units: "seconds since 1970-01-01T00:00:00Z" + + - name: "MetaData/timeOffset" + coordinates: "longitude latitude" + source: variables/timeOffset + longName: "Observation Time Minus Reference Time" + units: "s" + + - name: "MetaData/stationIdentification" + coordinates: "longitude latitude" + source: variables/stationIdentification + longName: "Station ID" + units: "" + + - name: "MetaData/longitude" + coordinates: "longitude latitude" + source: variables/longitude + longName: "Longitude" + units: "degree_east" + range: [0, 360] + + - name: "MetaData/latitude" + coordinates: "longitude latitude" + source: variables/latitude + longName: "Latitude" + units: "degree_north" + range: [-90, 90] + + - name: "MetaData/stationElevation" + coordinates: "longitude latitude" + source: variables/stationElevation + longName: "Elevation of Station" + units: "m" + + - name: "MetaData/prepbufrReportType" + coordinates: "longitude latitude" + source: variables/prepbufrReportType + longName: "Prepbufr Report Type" + units: "" + + - name: "MetaData/dumpReportType" + coordinates: "longitude latitude" + source: variables/dumpReportType + longName: "Data Dump Report Type" + units: "" + + - name: "MetaData/prepbufrDataLvlCat" + coordinates: "longitude latitude" + source: variables/prepbufrDataLvlCat + longName: "Prepbufr Data Level Category" + units: "" + + - name: "MetaData/seaTemperatureMethod" + coordinates: "longitude latitude" + source: variables/seaTemperatureMethod + longName: "Method of Sea Temperature Measurement" + units: "" + + - name: "MetaData/height" + coordinates: "longitude latitude" + source: variables/heightOfObservation + longName: "Height" + units: "m" + + - name: "MetaData/pressure" + coordinates: "longitude latitude" + source: variables/pressure + longName: "Pressure" + units: "Pa" + + # ObsType + - name: "ObsType/specificHumidity" + coordinates: "longitude latitude" + source: variables/prepbufrReportType + longName: "specificHumidity Report Type" + units: "" + + - name: "ObsType/airTemperature" + coordinates: "longitude latitude" + source: variables/prepbufrReportType + longName: "airTemperature report Type" + units: "" + + - name: "ObsType/windEastward" + coordinates: "longitude latitude" + source: variables/prepbufrReportType + longName: "windEastward Report Type" + units: "" + + - name: "ObsType/windNorthward" + coordinates: "longitude latitude" + source: variables/prepbufrReportType + longName: "windNorthward Report Type" + units: "" + + - name: "ObsType/stationPressure" + coordinates: "longitude latitude" + source: variables/prepbufrReportType + longName: "Pressure" + units: "" + + # ObsValue + - name: "ObsValue/specificHumidity" + coordinates: "longitude latitude" + source: variables/specificHumidity + longName: "Specific Humidity" + units: "Kilogram Kilogram-1" + + - name: "ObsValue/airTemperature" + coordinates: "longitude latitude" + source: variables/airTemperature + longName: "Temperature" + units: "K" + + - name: "ObsValue/dewpointTemperature" + coordinates: "longitude latitude" + source: variables/dewpointTemperature + longName: "Dewpoint Temperature" + units: "K" + + - name: "ObsValue/windEastward" + coordinates: "longitude latitude" + source: variables/windEastward + longName: "Eastward Wind" + units: "m s-1" + + - name: "ObsValue/windNorthward" + coordinates: "longitude latitude" + source: variables/windNorthward + longName: "Northward Wind" + units: "m s-1" + + - name: "ObsValue/stationPressure" + coordinates: "longitude latitude" + source: variables/stationPressure + longName: "Station Pressure" + units: "Pa" + + - name: "ObsValue/pressureReducedToMeanSeaLevel" + coordinates: "longitude latitude" + source: variables/pressureReducedToMeanSeaLevel + longName: "Mean Sea-Level Pressure" + units: "Pa" + + - name: "ObsValue/seaTemperature" + coordinates: "longitude latitude" + source: variables/seaTemperature + longName: "Sea Temperature" + units: "K" + + - name: "ObsValue/depthBelowSeaSurface" + coordinates: "longitude latitude" + source: variables/depthBelowSeaSurface + longName: "Depth Below Sea Surface" + units: "m" + + - name: "ObsValue/heightOfWaves" + coordinates: "longitude latitude" + source: variables/heightOfWaves + longName: "Height of Waves" + units: "m" + + - name: "ObsValue/presentWeather" + coordinates: "longitude latitude" + source: variables/presentWeather + longName: "Description of Present Weather" + + - name: "ObsValue/maximumWindGustSpeed" + coordinates: "longitude latitude" + source: variables/maximumWindGustSpeed + longName: "Maximum Wind Gust Speed" + units: "m s-1" + + - name: "ObsValue/verticalSignificance" + coordinates: "longitude latitude" + source: variables/verticalSignificance + longName: "Description of Vertical Significance (Surface Observations)" + + - name: "ObsValue/cloudAmount" + coordinates: "longitude latitude" + source: variables/cloudAmount + longName: "Description of Cloud Amount" + + - name: "ObsValue/heightOfBaseOfCloud" + coordinates: "longitude latitude" + source: variables/heightOfBaseOfCloud + longName: "Height of Base of Cloud" + units: "m" + + - name: "ObsValue/cloudCoverTotal" + coordinates: "longitude latitude" + source: variables/cloudCoverTotal + longName: "Total Cloud Coverage" + units: "1" + + - name: "ObsValue/heightAboveSurfaceOfBaseOfLowestCloud" + coordinates: "longitude latitude" + source: variables/heightAboveSurfaceOfBaseOfLowestCloud + longName: "Height above Surface of Base of Lowest Cloud Seen" + + # Quality Marker + - name: "QualityMarker/stationPressure" + coordinates: "longitude latitude" + source: variables/stationPressureQualityMarker + longName: "Pressure Quality Marker" + + - name: "QualityMarker/height" + coordinates: "longitude latitude" + source: variables/heightOfObservationQualityMark + longName: "Height Quality Marker" + + - name: "QualityMarker/specificHumidity" + coordinates: "longitude latitude" + source: variables/specificHumidityQualityMarker + longName: "Specific Humidity Quality Marker" + + - name: "QualityMarker/airTemperature" + coordinates: "longitude latitude" + source: variables/airTemperatureQualityMarker + longName: "Temperature Quality Marker" + + - name: "QualityMarker/windEastward" + coordinates: "longitude latitude" + source: variables/windQualityMarker + longName: "windEastward Quality Marker" + + - name: "QualityMarker/windNorthward" + coordinates: "longitude latitude" + source: variables/windQualityMarker + longName: "windNorthward Quality Marker" + + - name: "QualityMarker/pressureReducedToMeanSeaLevel" + coordinates: "longitude latitude" + source: variables/pressureReducedToMeanSeaLevelQualityMarker + longName: "Mean Sea Level Pressure Quality Marker" + + - name: "QualityMarker/seaTemperature" + coordinates: "longitude latitude" + source: variables/seaTemperatureQualityMarker + longName: "Sea Temperature Quality Marker" + + # ObsError + - name: "ObsError/stationPressure" + coordinates: "longitude latitude" + source: variables/stationPressureError + longName: "Pressure Observation Error" + units: "Pa" + + - name: "ObsError/specificHumidity" + coordinates: "longitude latitude" + source: variables/specificHumidityError + longName: "Specific Humidity Error" + units: "kg kg-1" + + - name: "ObsError/relativeHumidity" + coordinates: "longitude latitude" + source: variables/relativeHumidityError + longName: "Relative Humidity Error" + units: "1" + + - name: "ObsError/airTemperature" + coordinates: "longitude latitude" + source: variables/airTemperatureError + longName: "Temperature Error" + units: "K" + + - name: "ObsError/windEastward" + coordinates: "longitude latitude" + source: variables/windError + longName: "Eastward wind error" + units: "m s-1" + + - name: "ObsError/windNorthward" + coordinates: "longitude latitude" + source: variables/windError + longName: "Northward wind error" + units: "m s-1" + + - name: "ObsError/seaTemperature" + coordinates: "longitude latitude" + source: variables/seaTemperatureError + longName: "Sea Temperature Observation Error" + units: "K" + +# # Tuned ObsError +# - name: "TunedObsError/stationPressure" +# coordinates: "longitude latitude" +# source: variables/stationPressureTunedError +# longName: "Analysis-Tuned Pressure Observation Error" +# units: "Pa" +# +# - name: "TunedObsError/relativeHumidity" +# coordinates: "longitude latitude" +# source: variables/relativeHumidityTunedError +# longName: "Analysis-Tuned Relative Humidity Error" +# units: "1" +# +# - name: "TunedObsError/airTemperature" +# coordinates: "longitude latitude" +# source: variables/airTemperatureTunedError +# longName: "Analysis-Tuned Temperature Error" +# units: "K" +# +# - name: "TunedObsError/windEastward" +# coordinates: "longitude latitude" +# source: variables/windTunedError +# longName: "Analysis-Tuned Eastward wind error" +# units: "m s-1" +# +# - name: "TunedObsError/windNorthward" +# coordinates: "longitude latitude" +# source: variables/windTunedError +# longName: "Analysis-Tuned Northward wind error" +# units: "m s-1" diff --git a/parm/soil/prep/prepbufr_sfcshp.yaml b/parm/soil/prep/prepbufr_sfcshp.yaml new file mode 100644 index 000000000..7b84ea004 --- /dev/null +++ b/parm/soil/prep/prepbufr_sfcshp.yaml @@ -0,0 +1,501 @@ +# (C) Copyright 2024 NOAA/NWS/NCEP/EMC +# +# 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. + +observations: + - obs space: + name: bufr + obsdatain: "./prepbufr" + + exports: + #group_by_variable: prepbufrDataLvlCat + subsets: + #- ADPSFC # SURFACE LAND (SYNOPTIC, METAR) REPORTS + - SFCSHP # SURFACE MARINE (SHIP, BUOY, C-MAN/TIGE GAUGE PLATFORM) REPORTS + variables: + # MetaData + timestamp: + timeoffset: + timeOffset: "*/DHR" + transforms: + - scale: 3600 + referenceTime: "2024-06-01T00:00:00Z" + timeOffset: + query: "*/DHR" + transforms: + - scale: 3600 + longitude: + query: "*/XOB" + latitude: + query: "*/YOB" + stationIdentification: + query: "*/SID" + stationElevation: + query: "*/ELV" + #type: float + prepbufrReportType: + query: "*/TYP" + dumpReportType: + query: "*/T29" + prepbufrDataLvlCat: + query: "*/CAT" + + pressure: + query: "*/P___INFO/P__EVENT{1}/POB" + transforms: + - scale: 100 + stationPressure: + query: "*/P___INFO/P__EVENT{1}/POB" + transforms: + - scale: 100 + stationPressureQualityMarker: + query: "*/P___INFO/P__EVENT{1}/PQM" + stationPressureError: + query: "*/P___INFO/P__BACKG/POE" + transforms: + - scale: 100 + stationPressureTunedError: + query: "*/P___INFO/P__POSTP/POETU" + transforms: + - scale: 100 + + heightOfObservation: + query: "*/Z___INFO/Z__EVENT{1}/ZOB" + #type: float + heightOfObservationQualityMark: + query: "*/Z___INFO/Z__EVENT{1}/ZQM" + + specificHumidity: + query: "*/Q___INFO/Q__EVENT{1}/QOB" + type: float + transforms: + - scale: 0.000001 + # Assign fake Q errors + specificHumidityError: + query: "*/Q___INFO/Q__EVENT{1}/QOB" + type: float + transforms: + - scale: 0.0 + - offset: 999 + specificHumidityQualityMarker: + query: "*/Q___INFO/Q__EVENT{1}/QQM" + relativeHumidityError: + query: "*/Q___INFO/Q__BACKG/QOE" + transforms: + - scale: 0.1 + relativeHumidityTunedError: + query: "*/Q___INFO/Q__POSTP/QOETU" + transforms: + - scale: 0.1 + + dewpointTemperature: + query: "*/Q___INFO/TDO" + transforms: + - offset: 273.15 + + airTemperature: + query: "*/T___INFO/T__EVENT{1}/TOB" + transforms: + - offset: 273.15 + airTemperatureQualityMarker: + query: "*/T___INFO/T__EVENT{1}/TQM" + airTemperatureError: + query: "*/T___INFO/T__BACKG/TOE" + airTemperatureTunedError: + query: "*/T___INFO/T__POSTP/TOETU" + + windEastward: + query: "*/W___INFO/W__EVENT{1}/UOB" + windNorthward: + query: "*/W___INFO/W__EVENT{1}/VOB" + windQualityMarker: + query: "*/W___INFO/W__EVENT{1}/WQM" + windError: + query: "*/W___INFO/W__BACKG/WOE" + windTunedError: + query: "*/W___INFO/W__POSTP/WOETU" + transform: + - scale: 0.514444 + + pressureReducedToMeanSeaLevel: + query: "*/PMSL_SEQ/PMO" + transforms: + - scale: 100 + pressureReducedToMeanSeaLevelQualityMarker: + query: "*/PMSL_SEQ/PMQ" + + seaTemperature: + query: "*/SST_INFO/SSTEVENT{1}/SST1" + seaTemperatureQualityMarker: + query: "*/SST_INFO/SSTEVENT{1}/SSTQM" + seaTemperatureError: + query: "*/SST_INFO/SSTBACKG/SSTOE" + seaTemperatureMethod: + query: "*/SST_INFO/MSST" + depthBelowSeaSurface: + query: "*/SST_INFO/DBSS_SEQ/DBSS" + type: float + heightOfWaves: + query: "*/WAVE_SEQ/HOWV" + type: float + + presentWeather: + query: "*/PREWXSEQ{1}/PRWE" + + maximumWindGustSpeed: + query: "*/GUST1SEQ/MXGS" + + verticalSignificance: + query: "*/CLOUDSEQ{1}/VSSO" + cloudAmount: + query: "*/CLOUDSEQ{1}/CLAM" + heightOfBaseOfCloud: + query: "*/CLOUDSEQ{1}/HOCB" + type: float + cloudCoverTotal: + query: "*/CLOU2SEQ{1}/TOCC" + type: float + transforms: + - scale: 0.01 + heightAboveSurfaceOfBaseOfLowestCloud: + query: "*/CLOU2SEQ/HBLCS" + + ioda: + backend: netcdf + obsdataout: "./ioda_sfcshp.nc" + + dimensions: + - name: pevent_Dim + path: "*/P___INFO/P__EVENT" + - name: qevent_Dim + path: "*/Q___INFO/Q__EVENT" + - name: tevent_Dim + path: "*/T___INFO/T__EVENT" + - name: wevent_Dim + path: "*/W___INFO/W__EVENT" + - name: zevent_Dim + path: "*/Z___INFO/Z__EVENT" + + + variables: + + # MetaData + - name: "MetaData/dateTime" + coordinates: "longitude latitude" + source: variables/timestamp + longName: "Observation Time" + units: "seconds since 1970-01-01T00:00:00Z" + + - name: "MetaData/timeOffset" + coordinates: "longitude latitude" + source: variables/timeOffset + longName: "Observation Time Minus Reference Time" + units: "s" + + - name: "MetaData/stationIdentification" + coordinates: "longitude latitude" + source: variables/stationIdentification + longName: "Station ID" + units: "" + + - name: "MetaData/longitude" + coordinates: "longitude latitude" + source: variables/longitude + longName: "Longitude" + units: "degree_east" + range: [0, 360] + + - name: "MetaData/latitude" + coordinates: "longitude latitude" + source: variables/latitude + longName: "Latitude" + units: "degree_north" + range: [-90, 90] + + - name: "MetaData/stationElevation" + coordinates: "longitude latitude" + source: variables/stationElevation + longName: "Elevation of Station" + units: "m" + + - name: "MetaData/prepbufrReportType" + coordinates: "longitude latitude" + source: variables/prepbufrReportType + longName: "Prepbufr Report Type" + units: "" + + - name: "MetaData/dumpReportType" + coordinates: "longitude latitude" + source: variables/dumpReportType + longName: "Data Dump Report Type" + units: "" + + - name: "MetaData/prepbufrDataLvlCat" + coordinates: "longitude latitude" + source: variables/prepbufrDataLvlCat + longName: "Prepbufr Data Level Category" + units: "" + + - name: "MetaData/seaTemperatureMethod" + coordinates: "longitude latitude" + source: variables/seaTemperatureMethod + longName: "Method of Sea Temperature Measurement" + units: "" + + - name: "MetaData/height" + coordinates: "longitude latitude" + source: variables/heightOfObservation + longName: "Height" + units: "m" + + - name: "MetaData/pressure" + coordinates: "longitude latitude" + source: variables/pressure + longName: "Pressure" + units: "Pa" + + # ObsType + - name: "ObsType/specificHumidity" + coordinates: "longitude latitude" + source: variables/prepbufrReportType + longName: "specificHumidity Report Type" + units: "" + + - name: "ObsType/airTemperature" + coordinates: "longitude latitude" + source: variables/prepbufrReportType + longName: "airTemperature report Type" + units: "" + + - name: "ObsType/windEastward" + coordinates: "longitude latitude" + source: variables/prepbufrReportType + longName: "windEastward Report Type" + units: "" + + - name: "ObsType/windNorthward" + coordinates: "longitude latitude" + source: variables/prepbufrReportType + longName: "windNorthward Report Type" + units: "" + + - name: "ObsType/stationPressure" + coordinates: "longitude latitude" + source: variables/prepbufrReportType + longName: "Pressure" + units: "" + + # ObsValue + - name: "ObsValue/specificHumidity" + coordinates: "longitude latitude" + source: variables/specificHumidity + longName: "Specific Humidity" + units: "Kilogram Kilogram-1" + + - name: "ObsValue/airTemperature" + coordinates: "longitude latitude" + source: variables/airTemperature + longName: "Temperature" + units: "K" + + - name: "ObsValue/dewpointTemperature" + coordinates: "longitude latitude" + source: variables/dewpointTemperature + longName: "Dewpoint Temperature" + units: "K" + + - name: "ObsValue/windEastward" + coordinates: "longitude latitude" + source: variables/windEastward + longName: "Eastward Wind" + units: "m s-1" + + - name: "ObsValue/windNorthward" + coordinates: "longitude latitude" + source: variables/windNorthward + longName: "Northward Wind" + units: "m s-1" + + - name: "ObsValue/stationPressure" + coordinates: "longitude latitude" + source: variables/stationPressure + longName: "Station Pressure" + units: "Pa" + + - name: "ObsValue/pressureReducedToMeanSeaLevel" + coordinates: "longitude latitude" + source: variables/pressureReducedToMeanSeaLevel + longName: "Mean Sea-Level Pressure" + units: "Pa" + + - name: "ObsValue/seaTemperature" + coordinates: "longitude latitude" + source: variables/seaTemperature + longName: "Sea Temperature" + units: "K" + + - name: "ObsValue/depthBelowSeaSurface" + coordinates: "longitude latitude" + source: variables/depthBelowSeaSurface + longName: "Depth Below Sea Surface" + units: "m" + + - name: "ObsValue/heightOfWaves" + coordinates: "longitude latitude" + source: variables/heightOfWaves + longName: "Height of Waves" + units: "m" + + - name: "ObsValue/presentWeather" + coordinates: "longitude latitude" + source: variables/presentWeather + longName: "Description of Present Weather" + + - name: "ObsValue/maximumWindGustSpeed" + coordinates: "longitude latitude" + source: variables/maximumWindGustSpeed + longName: "Maximum Wind Gust Speed" + units: "m s-1" + + - name: "ObsValue/verticalSignificance" + coordinates: "longitude latitude" + source: variables/verticalSignificance + longName: "Description of Vertical Significance (Surface Observations)" + + - name: "ObsValue/cloudAmount" + coordinates: "longitude latitude" + source: variables/cloudAmount + longName: "Description of Cloud Amount" + + - name: "ObsValue/heightOfBaseOfCloud" + coordinates: "longitude latitude" + source: variables/heightOfBaseOfCloud + longName: "Height of Base of Cloud" + units: "m" + + - name: "ObsValue/cloudCoverTotal" + coordinates: "longitude latitude" + source: variables/cloudCoverTotal + longName: "Total Cloud Coverage" + units: "1" + + - name: "ObsValue/heightAboveSurfaceOfBaseOfLowestCloud" + coordinates: "longitude latitude" + source: variables/heightAboveSurfaceOfBaseOfLowestCloud + longName: "Height above Surface of Base of Lowest Cloud Seen" + + # Quality Marker + - name: "QualityMarker/stationPressure" + coordinates: "longitude latitude" + source: variables/stationPressureQualityMarker + longName: "Pressure Quality Marker" + + - name: "QualityMarker/height" + coordinates: "longitude latitude" + source: variables/heightOfObservationQualityMark + longName: "Height Quality Marker" + + - name: "QualityMarker/specificHumidity" + coordinates: "longitude latitude" + source: variables/specificHumidityQualityMarker + longName: "Specific Humidity Quality Marker" + + - name: "QualityMarker/airTemperature" + coordinates: "longitude latitude" + source: variables/airTemperatureQualityMarker + longName: "Temperature Quality Marker" + + - name: "QualityMarker/windEastward" + coordinates: "longitude latitude" + source: variables/windQualityMarker + longName: "windEastward Quality Marker" + + - name: "QualityMarker/windNorthward" + coordinates: "longitude latitude" + source: variables/windQualityMarker + longName: "windNorthward Quality Marker" + + - name: "QualityMarker/pressureReducedToMeanSeaLevel" + coordinates: "longitude latitude" + source: variables/pressureReducedToMeanSeaLevelQualityMarker + longName: "Mean Sea Level Pressure Quality Marker" + + - name: "QualityMarker/seaTemperature" + coordinates: "longitude latitude" + source: variables/seaTemperatureQualityMarker + longName: "Sea Temperature Quality Marker" + + # ObsError + - name: "ObsError/stationPressure" + coordinates: "longitude latitude" + source: variables/stationPressureError + longName: "Pressure Observation Error" + units: "Pa" + + - name: "ObsError/specificHumidity" + coordinates: "longitude latitude" + source: variables/specificHumidityError + longName: "Specific Humidity Error" + units: "kg kg-1" + + - name: "ObsError/relativeHumidity" + coordinates: "longitude latitude" + source: variables/relativeHumidityError + longName: "Relative Humidity Error" + units: "1" + + - name: "ObsError/airTemperature" + coordinates: "longitude latitude" + source: variables/airTemperatureError + longName: "Temperature Error" + units: "K" + + - name: "ObsError/windEastward" + coordinates: "longitude latitude" + source: variables/windError + longName: "Eastward wind error" + units: "m s-1" + + - name: "ObsError/windNorthward" + coordinates: "longitude latitude" + source: variables/windError + longName: "Northward wind error" + units: "m s-1" + + - name: "ObsError/seaTemperature" + coordinates: "longitude latitude" + source: variables/seaTemperatureError + longName: "Sea Temperature Observation Error" + units: "K" + +# # Tuned ObsError +# - name: "TunedObsError/stationPressure" +# coordinates: "longitude latitude" +# source: variables/stationPressureTunedError +# longName: "Analysis-Tuned Pressure Observation Error" +# units: "Pa" +# +# - name: "TunedObsError/relativeHumidity" +# coordinates: "longitude latitude" +# source: variables/relativeHumidityTunedError +# longName: "Analysis-Tuned Relative Humidity Error" +# units: "1" +# +# - name: "TunedObsError/airTemperature" +# coordinates: "longitude latitude" +# source: variables/airTemperatureTunedError +# longName: "Analysis-Tuned Temperature Error" +# units: "K" +# +# - name: "TunedObsError/windEastward" +# coordinates: "longitude latitude" +# source: variables/windTunedError +# longName: "Analysis-Tuned Eastward wind error" +# units: "m s-1" +# +# - name: "TunedObsError/windNorthward" +# coordinates: "longitude latitude" +# source: variables/windTunedError +# longName: "Analysis-Tuned Northward wind error" +# units: "m s-1" From 2407c4dcb2c468b72f21c071a10c1b9caf82ed90 Mon Sep 17 00:00:00 2001 From: tsga Date: Thu, 18 Jun 2026 18:52:06 +0000 Subject: [PATCH 51/98] clean up soil letkf config --- parm/soil/soil_letkf_config.yaml.j2 | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/parm/soil/soil_letkf_config.yaml.j2 b/parm/soil/soil_letkf_config.yaml.j2 index 86d86fcd7..a54ff0e3f 100644 --- a/parm/soil/soil_letkf_config.yaml.j2 +++ b/parm/soil/soil_letkf_config.yaml.j2 @@ -6,16 +6,12 @@ jedi_config: jedi_args: ['fv3jedi', 'localensembleda'] jcb_base_yaml: '{{ PARMgfs }}/gdas/soil/jcb-base.yaml.j2' jcb_algo_yaml: '{{ PARMgfs }}/gdas/soil/jcb-prototype_lgetkf.yaml.j2' -# jcb_algo: 'local_ensemble_da' -# obs_list_yaml: '{{ OBS_LIST_YAML }}' soilletkfaddinc: rundir: '{{ DATA }}' exe_src: '{{ EXECgdas }}/fv3jedi_addincrement.x' mpi_cmd: '{{ APRUN_SOILLETKF_ADDINC }}' jcb_base_yaml: '{{ PARMgdas }}/soil/jcb-base.yaml.j2' -# jcb_algo: 'soil_lgetkf_addincrement' jcb_algo: 'soil_lgetkf_increment' -# jcb_algo: 'soil_fv3jedi_fv3inc_lgetkf' #TODO: add observer mode # soilensanlobs: @@ -155,10 +151,10 @@ data_in: # {% endfilter %} -# copy_opt: -## - ['{{ COMIN_ATMOS_HISTORY_PREV }}/{{ GPREFIX }}csg_atm.f006.nc', '{{ DATA }}/bkg/{{ GPREFIX }}csg_atm.f006.nc'] -## - ['{{ COMIN_ATMOS_HISTORY_PREV }}/{{ GPREFIX }}csg_sfc.f006.nc', '{{ DATA }}/bkg/{{ GPREFIX }}csg_sfc.f006.nc'] -# + copy_opt: +# - ['{{ COMIN_ATMOS_HISTORY_PREV }}/{{ GPREFIX }}csg_atm.f006.nc', '{{ DATA }}/bkg/{{ GPREFIX }}csg_atm.f006.nc'] +# - ['{{ COMIN_ATMOS_HISTORY_PREV }}/{{ GPREFIX }}csg_sfc.f006.nc', '{{ DATA }}/bkg/{{ GPREFIX }}csg_sfc.f006.nc'] + # - ['{{ COMIN_OBS }}/{{ OPREFIX }}h-12.smap_soil.nc', '{{ DATA }}/obs'] # - ['{{ COMIN_OBS }}/{{ OPREFIX }}h-6.smap_soil.nc', '{{ DATA }}/obs'] # - ['{{ COMIN_OBS }}/{{ OPREFIX }}h0.smap_soil.nc', '{{ DATA }}/obs'] @@ -194,13 +190,6 @@ data_out: '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc'] - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc'] -# bkg + inc required as bkg for next timestep - - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc', '{{ COMIN_ATMOS_RESTART }}/{{ memchar }}/'] - - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc', '{{ COMIN_ATMOS_RESTART }}/{{ memchar }}/'] - - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc', '{{ COMIN_ATMOS_RESTART }}/{{ memchar }}/'] - - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc', '{{ COMIN_ATMOS_RESTART }}/{{ memchar }}/'] - - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc', '{{ COMIN_ATMOS_RESTART }}/{{ memchar }}/'] - - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', '{{ COMIN_ATMOS_RESTART }}/{{ memchar }}/'] {% endfor %} {% endfor %} From ab936253d9f5564331aada4bb91bc09cd10db19a Mon Sep 17 00:00:00 2001 From: tsga Date: Mon, 22 Jun 2026 13:14:38 +0000 Subject: [PATCH 52/98] update soil det configs --- ...il_background.yaml.j2 => soil_background_csg.yaml.j2} | 0 parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml | 9 ++++++++- parm/soil/jcb-base.yaml.j2 | 2 +- parm/soil/soil_det_config.yaml.j2 | 2 +- parm/soil/soil_obs_list.yaml.j2 | 4 ++-- parm/soil/soil_stage_jedi_fix.yaml.j2 | 6 +++--- 6 files changed, 15 insertions(+), 8 deletions(-) rename parm/jcb-gdas/model/soil/{soil_background.yaml.j2 => soil_background_csg.yaml.j2} (100%) diff --git a/parm/jcb-gdas/model/soil/soil_background.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_csg.yaml.j2 similarity index 100% rename from parm/jcb-gdas/model/soil/soil_background.yaml.j2 rename to parm/jcb-gdas/model/soil/soil_background_csg.yaml.j2 diff --git a/parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml b/parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml index 4ad03228f..b088413c1 100644 --- a/parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml +++ b/parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml @@ -2,9 +2,16 @@ # ------------------- commissioned: 2015-04-01T00:00:00 -observer_type: satellite # Type of chronicle to use +#observer_type: satellite # Type of chronicle to use +observer_type: conventional # Type of chronicle to use window_option: max +# observation type initial configuration +# -------------------------------- +stations_to_reject: + totalSnowDepth: ['fakelist'] + # Chronicle of changes for this observation type # ---------------------------------------- + diff --git a/parm/soil/jcb-base.yaml.j2 b/parm/soil/jcb-base.yaml.j2 index 317cda668..7056786f0 100644 --- a/parm/soil/jcb-base.yaml.j2 +++ b/parm/soil/jcb-base.yaml.j2 @@ -65,7 +65,7 @@ soil_orog_prefix: "{{ CASE }}.mx{{ OCNRES }}" # Background soil_background_path: {{ soil_bkg_path }} soil_background_ensemble_path: ./bkg/mem%mem% -background_file: soil_background +background_file: soil_background_csg # Background error soil_bump_data_directory: "{{ DATA }}/berror" diff --git a/parm/soil/soil_det_config.yaml.j2 b/parm/soil/soil_det_config.yaml.j2 index 863199609..697b9fb86 100644 --- a/parm/soil/soil_det_config.yaml.j2 +++ b/parm/soil/soil_det_config.yaml.j2 @@ -60,7 +60,7 @@ data_out: # Configuration files - ['{{ DATA }}/soilanlvar.yaml', '{{ COMOUT_CONF }}/{{ APREFIX }}soilanlvar.yaml'] - ['{{ DATA }}/soilanladdinc.yaml', '{{ COMOUT_CONF }}/{{ APREFIX }}soilanladdinc.yaml'] - - ['{{ DATA }}/soil_obs_list.yaml.j2', '{{ COMOUT_CONF }}/{{ APREFIX }}soil_obs_list.yaml.j2'] +# - ['{{ DATA }}/soil_obs_list.yaml.j2', '{{ COMOUT_CONF }}/{{ APREFIX }}soil_obs_list.yaml.j2'] {% if DOIAU %} {% set bkgtimes = [ current_cycle, WINDOW_BEGIN ] %} diff --git a/parm/soil/soil_obs_list.yaml.j2 b/parm/soil/soil_obs_list.yaml.j2 index 57245495b..427eacc84 100644 --- a/parm/soil/soil_obs_list.yaml.j2 +++ b/parm/soil/soil_obs_list.yaml.j2 @@ -1,5 +1,5 @@ observations: -##- smap_soil +- smap_soil ##- t2m_soil ##- prepbufr_adpsfc -- adpsfc_air_temperature_at_2m_181_gsi +##- adpsfc_air_temperature_at_2m_181_gsi diff --git a/parm/soil/soil_stage_jedi_fix.yaml.j2 b/parm/soil/soil_stage_jedi_fix.yaml.j2 index 24ee6107a..25868471c 100644 --- a/parm/soil/soil_stage_jedi_fix.yaml.j2 +++ b/parm/soil/soil_stage_jedi_fix.yaml.j2 @@ -1,3 +1,3 @@ -- ['{{ FIXgdas }}/fv3files/akbk{{ npz }}.nc4', '{{ DATA }}/fv3jedi/akbk.nc4'] -- ['{{ FIXgdas }}/fv3files/fmsmpp.nml', '{{ DATA }}/fv3jedi/fmsmpp.nml'] -- ['{{ FIXgdas }}/fv3files/field_table_gfdl', '{{ DATA }}/fv3jedi/field_table'] +- ['{{ FIXgdas }}/fv3jedi/fv3files/akbk{{ npz }}.nc4', '{{ DATA }}/fv3jedi/akbk.nc4'] +- ['{{ FIXgdas }}/fv3jedi/fv3files/fmsmpp.nml', '{{ DATA }}/fv3jedi/fmsmpp.nml'] +- ['{{ FIXgdas }}/fv3jedi/fv3files/field_table_gfdl', '{{ DATA }}/fv3jedi/field_table'] From 17cecf420b266d9adb292f1c73d1fed58880039f Mon Sep 17 00:00:00 2001 From: tsga Date: Tue, 23 Jun 2026 12:12:32 +0000 Subject: [PATCH 53/98] add GPREFIX to history csg --- .../soil/soil_background_ensemble.yaml.j2 | 4 +- .../soil_ensemble_output_csg_common.yaml.j2 | 2 +- parm/soil/jcb-base.yaml.j2 | 1 + parm/soil/soil_letkf_config.yaml.j2 | 144 +++++++++--------- 4 files changed, 75 insertions(+), 76 deletions(-) diff --git a/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 index 41c5bf6cc..661f39c5c 100644 --- a/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 @@ -5,8 +5,8 @@ members from template: filetype: cube sphere history provider: ufs filenames: - - {{ soil_variational_history_prefix }}csg_atm.f006.nc - - {{ soil_variational_history_prefix }}csg_sfc.f006.nc + - {{ soil_ensemble_history_prefix }}csg_atm.f006.nc + - {{ soil_ensemble_history_prefix }}csg_sfc.f006.nc max allowable geometry difference: 1e-4 state variables: - soill1 diff --git a/parm/jcb-gdas/model/soil/soil_ensemble_output_csg_common.yaml.j2 b/parm/jcb-gdas/model/soil/soil_ensemble_output_csg_common.yaml.j2 index ff1063bf7..699456f22 100644 --- a/parm/jcb-gdas/model/soil/soil_ensemble_output_csg_common.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_ensemble_output_csg_common.yaml.j2 @@ -1,7 +1,7 @@ datapath: ./anl/mem%{member}% filetype: cube sphere history provider: ufs -filename: soilinc_{{ soil_variational_history_prefix }}csg_sfc.f006.nc +filename: soilinc_{{ soil_ensemble_history_prefix }}csg_sfc.f006.nc state variables: - soill1 - soill2 diff --git a/parm/soil/jcb-base.yaml.j2 b/parm/soil/jcb-base.yaml.j2 index 7056786f0..bcf3b1d57 100644 --- a/parm/soil/jcb-base.yaml.j2 +++ b/parm/soil/jcb-base.yaml.j2 @@ -57,6 +57,7 @@ soil_npy_anl: {{ npy_ges | default(49, true) }} soil_npz_anl: {{ npz_ges | default(127, true) }} soil_variational_history_prefix: "{{ GPREFIX }}" +soil_ensemble_history_prefix: "{{ GPREFIX_ENS }}" soil_fv3jedi_files_path: ./fv3jedi # Ideally this would be {{DATA}}/fv3jedi but FMS soil_orog_files_path: "{{ soil_bkg_path }}" diff --git a/parm/soil/soil_letkf_config.yaml.j2 b/parm/soil/soil_letkf_config.yaml.j2 index a54ff0e3f..f22e0031a 100644 --- a/parm/soil/soil_letkf_config.yaml.j2 +++ b/parm/soil/soil_letkf_config.yaml.j2 @@ -1,17 +1,17 @@ jedi_config: soilletkfanl: rundir: '{{ DATA }}' - exe_src: '{{ EXECgfs }}/gdas.x' + exe_src: '{{ EXECglobal }}/gdas.x' mpi_cmd: '{{ APRUN_SOILLETKFANL }}' jedi_args: ['fv3jedi', 'localensembleda'] - jcb_base_yaml: '{{ PARMgfs }}/gdas/soil/jcb-base.yaml.j2' - jcb_algo_yaml: '{{ PARMgfs }}/gdas/soil/jcb-prototype_lgetkf.yaml.j2' - soilletkfaddinc: - rundir: '{{ DATA }}' - exe_src: '{{ EXECgdas }}/fv3jedi_addincrement.x' - mpi_cmd: '{{ APRUN_SOILLETKF_ADDINC }}' - jcb_base_yaml: '{{ PARMgdas }}/soil/jcb-base.yaml.j2' - jcb_algo: 'soil_lgetkf_increment' + jcb_base_yaml: '{{ PARMglobal }}/gdas/soil/jcb-base.yaml.j2' + jcb_algo_yaml: '{{ PARMglobal }}/gdas/soil/jcb-prototype_lgetkf.yaml.j2' +# soilletkfaddinc: +# rundir: '{{ DATA }}' +# exe_src: '{{ EXECgdas }}/fv3jedi_addincrement.x' +# mpi_cmd: '{{ APRUN_SOILLETKF_ADDINC }}' +# jcb_base_yaml: '{{ PARMgdas }}/soil/jcb-base.yaml.j2' +# jcb_algo: 'soil_lgetkf_increment' #TODO: add observer mode # soilensanlobs: @@ -47,57 +47,57 @@ data_in: copy_req: {% for mem in range(1, NMEM_ENS + 1) %} - {% set gmem = mem+mem_offset %} - {% if gmem > NMEM_ENS_MAX %} - {% set gmem = gmem-NMEM_ENS_MAX %} - {% endif %} +# {% set gmem = mem+mem_offset %} +# {% if gmem > NMEM_ENS_MAX %} +# {% set gmem = gmem-NMEM_ENS_MAX %} +# {% endif %} + {% set tmpl_dict = ({ '${ROTDIR}': ROTDIR, + '${RUN}': RUN, + '${YMD}': previous_cycle | to_YMD, + '${HH}': previous_cycle | strftime('%H'), + '${MEMDIR}': 'mem%03d' | format(mem) }) %} # define variables # copy coupler file - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.coupler.res', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.coupler.res', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] # we need to copy them to two places, one serves as the basis for the analysis - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ GPREFIX }}csg_sfc.f006.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ GPREFIX }}csg_sfc.f006.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - + - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + + - ['{{ COM_ATMOS_HISTORY_TMPL | replace_tmpl(tmpl_dict) }}/{{ GPREFIX_ENS }}csg_atm.f006.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COM_ATMOS_HISTORY_TMPL | replace_tmpl(tmpl_dict) }}/{{ GPREFIX_ENS }}csg_sfc.f006.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] {% if DOIAU %} # if using IAU, also need backgrounds copied at the beginning of the window ##TODO: for soil IAU copy the actual restarts at the three time steps # we need to copy them to two places, one serves as the basis for the analysis - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] -#TODO: add time info/prefix for iau in csg - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ GPREFIX }}csg_sfc.f006.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/mem{{ '%03d' % gmem }}/{{ GPREFIX }}csg_sfc.f006.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - + - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] + - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] {% endif %} {% endfor %} {% filter indent(width=4) %} {% include 'soil_stage_jedi_fix.yaml.j2' %} {% include 'soil_stage_berror.yaml.j2' %} -{% include 'soil_stage_bufr2ioda_mapping.yaml.j2' %} +#{% include 'soil_stage_bufr2ioda_mapping.yaml.j2' %} {% endfilter %} - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}_mosaic.nc', '{{ DATA }}/orog/ens/'] @@ -151,23 +151,11 @@ data_in: # {% endfilter %} - copy_opt: -# - ['{{ COMIN_ATMOS_HISTORY_PREV }}/{{ GPREFIX }}csg_atm.f006.nc', '{{ DATA }}/bkg/{{ GPREFIX }}csg_atm.f006.nc'] -# - ['{{ COMIN_ATMOS_HISTORY_PREV }}/{{ GPREFIX }}csg_sfc.f006.nc', '{{ DATA }}/bkg/{{ GPREFIX }}csg_sfc.f006.nc'] - -# - ['{{ COMIN_OBS }}/{{ OPREFIX }}h-12.smap_soil.nc', '{{ DATA }}/obs'] -# - ['{{ COMIN_OBS }}/{{ OPREFIX }}h-6.smap_soil.nc', '{{ DATA }}/obs'] -# - ['{{ COMIN_OBS }}/{{ OPREFIX }}h0.smap_soil.nc', '{{ DATA }}/obs'] -# - ['{{ COMIN_OBS }}/{{ OPREFIX }}h6.smap_soil.nc', '{{ DATA }}/obs'] -# - ['{{ COMIN_OBS }}/{{ OPREFIX }}h12.smap_soil.nc', '{{ DATA }}/obs'] - data_out: copy_req: # Configuration files - ['{{ DATA }}/soilletkfanl.yaml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}soilletkfanl.yaml'] - - ['{{ DATA }}/soilletkfaddinc.yaml', '{{ COMOUT_CONF }}/{{ APREFIX }}soilanladdinc.yaml'] - - ['{{ DATA }}/soil_obs_list.yaml.j2', '{{ COMOUT_CONF }}/{{ APREFIX }}soil_obs_list.yaml.j2'] {% if DOIAU %} {% set bkgtimes = [ current_cycle, WINDOW_BEGIN ] %} @@ -177,19 +165,24 @@ data_out: {% for bkgtime in bkgtimes %} {% for imem in range(1, NMEM_ENS+1) %} {% set memchar = 'mem%03d' | format(imem) %} + {% set tmpl_dict = ({ '${ROTDIR}': ROTDIR, + '${RUN}': RUN, + '${YMD}': current_cycle | to_YMD, + '${HH}': current_cycle | strftime('%H'), + '${MEMDIR}': 'mem%03d' | format(imem) }) %} # Analysis - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc'] + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc'] - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc'] + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc'] - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc'] + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc'] - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc'] + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc'] - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc'] + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc'] - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc'] + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc'] {% endfor %} {% endfor %} @@ -198,22 +191,27 @@ data_out: {% for bkgtime in bkgtimes %} {% for imem in range(1, NMEM_ENS+1) %} {% set memchar = 'mem%03d' | format(imem) %} + {% set tmpl_dict = ({ '${ROTDIR}': ROTDIR, + '${RUN}': RUN, + '${YMD}': current_cycle | to_YMD, + '${HH}': current_cycle | strftime('%H'), + '${MEMDIR}': 'mem%03d' | format(imem) }) %} # Increments - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile1.nc'] + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile1.nc'] - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile2.nc'] + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile2.nc'] - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile3.nc'] + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile3.nc'] - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile4.nc'] + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile4.nc'] - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile5.nc'] + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile5.nc'] - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile6.nc'] + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile6.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/soilinc_{{ GPREFIX }}csg_sfc.f006.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ memchar }}/{{ current_cycle | to_fv3time }}.soil_increment.csg_sfc.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/soilinc_{{ GPREFIX_ENS }}csg_sfc.f006.nc', + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_increment.csg_sfc.nc'] {% endfor %} {% endfor %} From 38d55ab5eca71adce6d1b4e1e4e3f5659dece61a Mon Sep 17 00:00:00 2001 From: tsga Date: Mon, 29 Jun 2026 13:22:17 +0000 Subject: [PATCH 54/98] temporarily comment out atm csg file from soil bkg --- parm/jcb-gdas/model/soil/soil_background_csg.yaml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/jcb-gdas/model/soil/soil_background_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_csg.yaml.j2 index 249d5e230..82ab060d6 100644 --- a/parm/jcb-gdas/model/soil/soil_background_csg.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background_csg.yaml.j2 @@ -3,7 +3,7 @@ filetype: cube sphere history provider: ufs datetime: '{{ soil_background_time_iso }}' filenames: -- {{ soil_variational_history_prefix }}csg_atm.f006.nc +#- {{ soil_variational_history_prefix }}csg_atm.f006.nc - {{ soil_variational_history_prefix }}csg_sfc.f006.nc max allowable geometry difference: 1e-4 state variables: From e00f307a69f6e9b34150098b43287089bfa5edb9 Mon Sep 17 00:00:00 2001 From: tsga Date: Mon, 29 Jun 2026 15:02:37 +0000 Subject: [PATCH 55/98] add temp fv3jedi submod link --- .gitmodules | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index 519c33c31..0b604936e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -35,8 +35,8 @@ branch = develop [submodule "sorc/fv3-jedi"] path = sorc/fv3-jedi - url = https://github.com/tsga/fv3-jedi #https://github.com/jcsda/fv3-jedi.git - branch = soil_csg #develop + url = https://github.com/jcsda/fv3-jedi.git + branch = feature/add_soil_layers_fields #develop [submodule "sorc/soca"] path = sorc/soca url = https://github.com/NOAA-EMC/soca.git From 04ead17731dea842ba6b060fa4de842e0313160e Mon Sep 17 00:00:00 2001 From: tsga Date: Mon, 13 Jul 2026 15:24:34 +0000 Subject: [PATCH 56/98] update soil jcb-base with recent develop changes --- parm/soil/jcb-base.yaml.j2 | 92 ++++++++++++++++++++++++++++---------- 1 file changed, 69 insertions(+), 23 deletions(-) diff --git a/parm/soil/jcb-base.yaml.j2 b/parm/soil/jcb-base.yaml.j2 index bcf3b1d57..cf9dda3d6 100644 --- a/parm/soil/jcb-base.yaml.j2 +++ b/parm/soil/jcb-base.yaml.j2 @@ -10,13 +10,15 @@ app_path_observation_chronicle: "{{PARMgdas}}/jcb-gdas/observation_chronicle/soi # ------------------------------------------------------------ model_file: model_pseudo initial_condition_file: background # Initial conditions for 4D apps is background -final_increment_file: soil_final_increment_csg -output_mean_prior_file: soil_output_mean_prior_fms -posterior_output_file: soil_posterior_output_fms -output_ensemble_increments_file: soil_ensemble_increments_csg -output_increment_file: soil_output_increment_csg -output_variance_prior_file: soil_output_variance_prior_fms -output_variance_posterior_file: soil_output_variance_posterior_fms +# file type csg or fms +{% set _file_type = 'csg' %} +final_increment_file: soil_final_increment_{{ _file_type }} +output_mean_prior_file: soil_output_mean_prior_{{ _file_type }} +posterior_output_file: soil_posterior_output_{{ _file_type }} +output_ensemble_increments_file: soil_ensemble_increments_{{ _file_type }} +output_increment_file: soil_output_increment_{{ _file_type }} +output_variance_prior_file: soil_output_variance_prior_{{ _file_type }} +output_variance_posterior_file: soil_output_variance_posterior_{{ _file_type }} #jedi_increment_output: gaussian # Assimilation window @@ -37,15 +39,58 @@ soil_increment_time_fv3: "{{ bkg_time_fv3 }}" # Analysis standard things # ------------------------ -analysis_variables: [soill1, soill2, soilt1, soilt2] #soilMoistureVolumetric, slc, stc, air_temperature_at_2m] minimizer: DRPCG final_diagnostics_departures: anlmob final_prints_frequency: PT3H cost_type: 3D-Var number_of_outer_loops: 1 +# Analysis variables +{% set _analysis_vars_csg = ['soill1', 'soill2', 'soilt1', 'soilt2', 'air_temperature_at_2m', 'specfic_humidity_at_2m'] %} +{% set _analysis_vars_fv3 = ['soilMoistureVolumetric', 'stc', 'air_temperature_at_2m', 'specfic_humidity_at_2m'] %} + +{% if _file_type == 'csg' %} + analysis_variables: {{ _analysis_vars_csg }} +{% else %} + analysis_variables: {{ _analysis_vars_fv3 }} +{% endif %} + # Model things # ------------ + +# State variables +soil_state_variables_csg: {{ _analysis_vars_csg + ['slmsk', 'sheleg', 'vtype', 'stype', 'vfrac'] }} +soil_state_variables_fv3: {{ _analysis_vars_fv3 + ['slmsk', + 'sheleg', + 'vtype', + 'filtered_orography', + 'fraction_of_ice' + 'fraction_of_land', + 'totalSnowDepth'] }} + +# Increment variables +soil_increment_variables_csg: {{ _analysis_vars_csg }} +soil_increment_variables_fv3: {{ _analysis_vars_fv3 }} +soil_increment_variables_final_csg: {{ _analysis_vars_csg }} + ['slmsk', 'sheleg', 'vtype', 'stype', 'vfrac'] }} +soil_increment_variables_final_fv3: {{ _analysis_vars_fv3 }} + ['slmsk', 'sheleg', 'vtype', 'totalSnowDepth'] }} + + +# Variable IO names +soil_field_io_names_csg: + air_temperature_at_2m: tmp2m + specfic_humidity_at_2m: spfh2m + slmsk: land + sheleg: weasd + stype: sotyp + vfrac: veg + +soil_field_io_names_fv3: + soilMoistureVolumetric: smc + totalSnowDepth: snodl + filtered_orography: orog_filt + fraction_of_ice: fice + fraction_of_land: land_frac + # Geometry soil_layout_x: {{ layout_x | default(1, true) }} soil_layout_y: {{ layout_y | default(1, true) }} @@ -57,7 +102,6 @@ soil_npy_anl: {{ npy_ges | default(49, true) }} soil_npz_anl: {{ npz_ges | default(127, true) }} soil_variational_history_prefix: "{{ GPREFIX }}" -soil_ensemble_history_prefix: "{{ GPREFIX_ENS }}" soil_fv3jedi_files_path: ./fv3jedi # Ideally this would be {{DATA}}/fv3jedi but FMS soil_orog_files_path: "{{ soil_bkg_path }}" @@ -65,17 +109,15 @@ soil_orog_prefix: "{{ CASE }}.mx{{ OCNRES }}" # Background soil_background_path: {{ soil_bkg_path }} -soil_background_ensemble_path: ./bkg/mem%mem% -background_file: soil_background_csg +#background_file: soil_background_csg # Background error soil_bump_data_directory: "{{ DATA }}/berror" - -soil_background_error_file: "{{BERROR_YAML}}" -background_error_file: "{{BERROR_YAML}}" +soil_background_error_file: "{{ BERROR_YAML }}" +#background_error_file: "{{BERROR_YAML}}" # Forecasting -soil_forecast_length: "{{ SNOW_WINDOW_LENGTH }}" +soil_forecast_length: "{{ SOIL_FORECAST_LENGTH }}" soil_forecast_timestep: "{{ BKG_TSTEP }}" # Observation things @@ -96,8 +138,6 @@ soil_obsdataout_prefix: diag_ soil_obsdataout_suffix: "_{{ current_cycle | to_YMDH }}.nc" # Naming conventions for bias correction files -# note these are really for atm--see below//most may not be applicable for sfc-only DA -##TODO: not sure which of these are needed soil_obsbiasin_path: "{{DATA}}/obs/" soil_obsbiasin_prefix: "{{GPREFIX}}" soil_obsbiasin_suffix: ".satbias.nc" @@ -112,17 +152,23 @@ soil_obsbiasout_suffix: ".satbias.nc" soil_obsbiascovout_prefix: "{{APREFIX}}" soil_obsbiascovout_suffix: ".satbias_cov.nc" -# Ensemble mean things +# Ensemble things soil_number_ensemble_members: {{NMEM_ENS | default(1, true) }} +soil_background_ensemble_path: ./bkg/mem%mem% soil_analysis_ensemble_path: ./anl/mem%mem% +soil_ensemble_history_prefix: "{{ GPREFIX_ENS }}" +soil_ensemble_analysis_prefix: "{{ APREFIX_ENS }}" # Local Ensemble DA (LETKF) # ------------------------- -local_ensemble_da_solver: Deterministic LETKF #GETKF - -increment_variables: [soill1, soill2, soilt1, soilt2, air_temperature_at_2m, specfic_humidity_at_2m] -#soilMoistureVolumetric,slc,stc,air_temperature_at_2m,specfic_humidity_at_2m] #, smc, sphum] -#[ua,va,DZ,delp,t,ps,sphum,ice_wat,liq_wat,o3mr] +local_ensemble_da_solver: Deterministic LETKF #GETKF + +increment_variables: {{ analysis_variables }} +{% if _file_type == 'csg' %} + increment_variables: {{ _analysis_vars_csg }} +{% else %} + increment_variables: {{ _analysis_vars_fv3 }} +{% endif %} # Veritcal localization for GETKF vl_fraction_of_retained_variance: 0.750 From 238c73c15142aa93cb7fe7e8406696b21bfafad6 Mon Sep 17 00:00:00 2001 From: tsga Date: Mon, 13 Jul 2026 20:38:19 +0000 Subject: [PATCH 57/98] remove iau option (default) --- parm/soil/jcb-base.yaml.j2 | 1 + parm/soil/jcb-prototype_lgetkf.yaml.j2 | 9 +- parm/soil/soil_det_config.yaml.j2 | 62 +++---- parm/soil/soil_letkf_config.yaml.j2 | 158 ++++++------------ .../soil/soil_stage_bufr2ioda_mapping.yaml.j2 | 2 +- 5 files changed, 84 insertions(+), 148 deletions(-) diff --git a/parm/soil/jcb-base.yaml.j2 b/parm/soil/jcb-base.yaml.j2 index cf9dda3d6..1a05c3a33 100644 --- a/parm/soil/jcb-base.yaml.j2 +++ b/parm/soil/jcb-base.yaml.j2 @@ -12,6 +12,7 @@ model_file: model_pseudo initial_condition_file: background # Initial conditions for 4D apps is background # file type csg or fms {% set _file_type = 'csg' %} +soil_file_type: {{ _file_type }} final_increment_file: soil_final_increment_{{ _file_type }} output_mean_prior_file: soil_output_mean_prior_{{ _file_type }} posterior_output_file: soil_posterior_output_{{ _file_type }} diff --git a/parm/soil/jcb-prototype_lgetkf.yaml.j2 b/parm/soil/jcb-prototype_lgetkf.yaml.j2 index f82875c62..276511f03 100644 --- a/parm/soil/jcb-prototype_lgetkf.yaml.j2 +++ b/parm/soil/jcb-prototype_lgetkf.yaml.j2 @@ -1,26 +1,25 @@ # Use observations for lgetkf # --------------------------- -#app_path_observations: {{PARMgfs}}/gdas/jcb-gdas/observations/soil -#app_path_observation_chronicle: {{PARMgfs}}/gdas/jcb-gdas/observation_chronicle/soil +app_path_observations: {{PARMglobal}}/gdas/jcb-gdas/observations/soil +app_path_observation_chronicle: {{PARMglobal}}/gdas/jcb-gdas/observation_chronicle/soil ## Algorithm ## --------- algorithm: local_ensemble_da # ## Model things ## ------------ -#soil_background_ensemble_path: ./bkg/mem%mem% -#soil_analysis_ensemble_path: ./anl/mem%mem% +soil_background_ensemble_path: ./bkg/mem%mem% # Observation things # ------------------ #? does obs list yaml get constructed from settings? +use_linear_observer: true {% include OBS_LIST_YAML %} # Observation distribution and localization # TODO: distribution_type: "Halo" localization_method: "Horizontal Gaspari-Cohn" -#"Horizontal Box car" halo_size: 1250e3 loc_length_scale: 1250e3 max_nobs: 10000 diff --git a/parm/soil/soil_det_config.yaml.j2 b/parm/soil/soil_det_config.yaml.j2 index 697b9fb86..13302176e 100644 --- a/parm/soil/soil_det_config.yaml.j2 +++ b/parm/soil/soil_det_config.yaml.j2 @@ -7,12 +7,6 @@ jedi_config: jcb_base_yaml: '{{ PARMgdas }}/soil/jcb-base.yaml.j2' jcb_algo: '3dvar' obs_list_yaml: '{{ OBS_LIST_YAML }}' - soilanladdinc: - rundir: '{{ DATA }}' - exe_src: '{{ EXECgdas }}/fv3jedi_addincrement.x' - mpi_cmd: '{{ APRUN_SOIL_ADDINC }}' - jcb_base_yaml: '{{ PARMgdas }}/soil/jcb-base.yaml.j2' - jcb_algo: 'soil_addincrement' data_in: mkdir: @@ -24,6 +18,11 @@ data_in: - '{{ DATA }}/berror' copy_req: + +{% if soil_file_type == 'csg' %} + - ['{{ COMIN_ATMOS_HISTORY_PREV }}/{{ GPREFIX }}csg_atm.f006.nc', '{{ DATA }}/bkg/{{ GPREFIX }}csg_atm.f006.nc'] + - ['{{ COMIN_ATMOS_HISTORY_PREV }}/{{ GPREFIX }}csg_sfc.f006.nc', '{{ DATA }}/bkg/{{ GPREFIX }}csg_sfc.f006.nc'] +{% else %} - ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.coupler.res', '{{ DATA }}/bkg/'] - ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/bkg/'] - ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/bkg/'] @@ -31,13 +30,13 @@ data_in: - ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/bkg/'] - ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/bkg/'] - ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/bkg/'] - - ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile1.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile1.nc" ] - ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile2.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile2.nc" ] - ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile3.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile3.nc" ] - ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile4.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile4.nc" ] - ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile5.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile5.nc" ] - ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile6.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile6.nc" ] +{% endif %} {% filter indent(width=4) %} {% include 'soil_stage_jedi_fix.yaml.j2' %} @@ -45,9 +44,6 @@ data_in: {% endfilter %} copy_opt: - - ['{{ COMIN_ATMOS_HISTORY_PREV }}/{{ GPREFIX }}csg_atm.f006.nc', '{{ DATA }}/bkg/{{ GPREFIX }}csg_atm.f006.nc'] - - ['{{ COMIN_ATMOS_HISTORY_PREV }}/{{ GPREFIX }}csg_sfc.f006.nc', '{{ DATA }}/bkg/{{ GPREFIX }}csg_sfc.f006.nc'] - # - ['{{ COMIN_OBS }}/{{ OPREFIX }}h-12.smap_soil.nc', '{{ DATA }}/obs'] # - ['{{ COMIN_OBS }}/{{ OPREFIX }}h-6.smap_soil.nc', '{{ DATA }}/obs'] # - ['{{ COMIN_OBS }}/{{ OPREFIX }}h0.smap_soil.nc', '{{ DATA }}/obs'] @@ -62,30 +58,28 @@ data_out: - ['{{ DATA }}/soilanladdinc.yaml', '{{ COMOUT_CONF }}/{{ APREFIX }}soilanladdinc.yaml'] # - ['{{ DATA }}/soil_obs_list.yaml.j2', '{{ COMOUT_CONF }}/{{ APREFIX }}soil_obs_list.yaml.j2'] -{% if DOIAU %} - {% set bkgtimes = [ current_cycle, WINDOW_BEGIN ] %} +{% if soil_file_type == 'csg' %} + # Increments + - ['{{ DATA }}/anl/soilinc_{{ GPREFIX }}csg_sfc.f006.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.csg_sfc.nc'] + # Analysis = bkg + inc + - ['{{ DATA }}/anl/{{ GPREFIX }}csg_sfc.f006.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ current_cycle | to_fv3time }}.csg_sfc.nc'] {% else %} - {% set bkgtimes = [ current_cycle ] %} -{% endif %} - -{% for bkgtime in bkgtimes %} # Analysis = bkg + inc - - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc'] - - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc'] - - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc'] - - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc'] - - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc'] - - ['{{ DATA }}/anl/{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc'] -{% endfor %} - - copy_opt: - # Increments TODO: make this _req once choice between csg and fv3 finalized + - ['{{ DATA }}/anl/{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc'] + - ['{{ DATA }}/anl/{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc'] + - ['{{ DATA }}/anl/{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc'] + - ['{{ DATA }}/anl/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc'] + - ['{{ DATA }}/anl/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc'] + - ['{{ DATA }}/anl/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc'] + # Increments - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile1.nc'] - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', @@ -98,6 +92,4 @@ data_out: '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile5.nc'] - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile6.nc'] - - - ['{{ DATA }}/anl/soilinc_{{ GPREFIX }}csg_sfc.f006.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.csg_sfc.nc'] +{% endif %} diff --git a/parm/soil/soil_letkf_config.yaml.j2 b/parm/soil/soil_letkf_config.yaml.j2 index f22e0031a..374683e64 100644 --- a/parm/soil/soil_letkf_config.yaml.j2 +++ b/parm/soil/soil_letkf_config.yaml.j2 @@ -1,35 +1,12 @@ jedi_config: soilletkfanl: rundir: '{{ DATA }}' - exe_src: '{{ EXECglobal }}/gdas.x' + exe_src: '{{ EXECgdas }}/gdas.x' mpi_cmd: '{{ APRUN_SOILLETKFANL }}' jedi_args: ['fv3jedi', 'localensembleda'] jcb_base_yaml: '{{ PARMglobal }}/gdas/soil/jcb-base.yaml.j2' jcb_algo_yaml: '{{ PARMglobal }}/gdas/soil/jcb-prototype_lgetkf.yaml.j2' -# soilletkfaddinc: -# rundir: '{{ DATA }}' -# exe_src: '{{ EXECgdas }}/fv3jedi_addincrement.x' -# mpi_cmd: '{{ APRUN_SOILLETKF_ADDINC }}' -# jcb_base_yaml: '{{ PARMgdas }}/soil/jcb-base.yaml.j2' -# jcb_algo: 'soil_lgetkf_increment' - -#TODO: add observer mode -# soilensanlobs: -# rundir: '{{ DATA }}' -# exe_src: '{{ EXECgfs }}/gdas.x' -# mpi_cmd: '{{ APRUN_SOILENSANLOBS }}' -# jedi_args: ['fv3jedi', 'localensembleda'] -# jcb_base_yaml: '{{ PARMgfs }}/gdas/soil/jcb-base.yaml.j2' -# jcb_algo_yaml: '{{ PARMgfs }}/gdas/soil/jcb-prototype_lgetkf_observer.yaml.j2' -# obs_list_yaml: '{{ OBS_LIST_YAML }}' -# soilensanlsol: -# rundir: '{{ DATA }}' -# exe_src: '{{ EXECgfs }}/gdas.x' -# mpi_cmd: '{{ APRUN_SOILENSANLSOL }}' -# jedi_args: ['fv3jedi', 'localensembleda'] -# jcb_base_yaml: '{{ PARMgfs }}/gdas/soil/jcb-base.yaml.j2' -# jcb_algo_yaml: '{{ PARMgfs }}/gdas/soil/jcb-prototype_lgetkf_solver.yaml.j2' -# obs_list_yaml: '{{ OBS_LIST_YAML }}' +#TODO: add observer and sol mode data_in: mkdir: @@ -56,44 +33,22 @@ data_in: '${YMD}': previous_cycle | to_YMD, '${HH}': previous_cycle | strftime('%H'), '${MEMDIR}': 'mem%03d' | format(mem) }) %} - # define variables + {% if soil_file_type == 'csg' %} + - ['{{ COM_ATMOS_HISTORY_TMPL | replace_tmpl(tmpl_dict) }}/{{ GPREFIX_ENS }}csg_atm.f006.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + - ['{{ COM_ATMOS_HISTORY_TMPL | replace_tmpl(tmpl_dict) }}/{{ GPREFIX_ENS }}csg_sfc.f006.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] + {% else %} # copy coupler file - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.coupler.res', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - # we need to copy them to two places, one serves as the basis for the analysis - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - - ['{{ COM_ATMOS_HISTORY_TMPL | replace_tmpl(tmpl_dict) }}/{{ GPREFIX_ENS }}csg_atm.f006.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COM_ATMOS_HISTORY_TMPL | replace_tmpl(tmpl_dict) }}/{{ GPREFIX_ENS }}csg_sfc.f006.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - {% if DOIAU %} - # if using IAU, also need backgrounds copied at the beginning of the window -##TODO: for soil IAU copy the actual restarts at the three time steps - # we need to copy them to two places, one serves as the basis for the analysis - - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] - - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ WINDOW_BEGIN | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/anl/mem{{ '%03d' % mem }}/'] {% endif %} {% endfor %} + {% filter indent(width=4) %} {% include 'soil_stage_jedi_fix.yaml.j2' %} {% include 'soil_stage_berror.yaml.j2' %} @@ -151,67 +106,56 @@ data_in: # {% endfilter %} - data_out: copy_req: # Configuration files - ['{{ DATA }}/soilletkfanl.yaml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}soilletkfanl.yaml'] -{% if DOIAU %} - {% set bkgtimes = [ current_cycle, WINDOW_BEGIN ] %} -{% else %} - {% set bkgtimes = [ current_cycle ] %} -{% endif %} -{% for bkgtime in bkgtimes %} - {% for imem in range(1, NMEM_ENS+1) %} - {% set memchar = 'mem%03d' | format(imem) %} - {% set tmpl_dict = ({ '${ROTDIR}': ROTDIR, - '${RUN}': RUN, - '${YMD}': current_cycle | to_YMD, - '${HH}': current_cycle | strftime('%H'), - '${MEMDIR}': 'mem%03d' | format(imem) }) %} - # Analysis - - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc'] - {% endfor %} -{% endfor %} - - copy_opt: - # Increments TODO: make this _req once options between csg and fv3 well handled -{% for bkgtime in bkgtimes %} - {% for imem in range(1, NMEM_ENS+1) %} - {% set memchar = 'mem%03d' | format(imem) %} - {% set tmpl_dict = ({ '${ROTDIR}': ROTDIR, - '${RUN}': RUN, - '${YMD}': current_cycle | to_YMD, - '${HH}': current_cycle | strftime('%H'), - '${MEMDIR}': 'mem%03d' | format(imem) }) %} +{% for imem in range(1, NMEM_ENS+1) %} + {% set memchar = 'mem%03d' | format(imem) %} + {% set tmpl_dict = ({ '${ROTDIR}': ROTDIR, + '${RUN}': RUN, + '${YMD}': current_cycle | to_YMD, + '${HH}': current_cycle | strftime('%H'), + '${MEMDIR}': 'mem%03d' | format(imem) }) %} # Increments - - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile1.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile2.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile3.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile4.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile5.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ bkgtime | to_fv3time }}.soil_increment.sfc_data.tile6.nc'] - + {% if soil_file_type == 'csg' %} - ['{{ DATA }}/anl/{{ memchar }}/soilinc_{{ GPREFIX_ENS }}csg_sfc.f006.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_increment.csg_sfc.nc'] + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_inc.csg_sfc.nc'] + {% else %} + - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile1.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile2.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile3.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile4.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile5.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile6.nc'] + {% endif %} + + {% if DO_ADD_SOIL_INCR %} + # Copy soil analysis (for non-iau) + {% if soil_file_type == 'csg' %} + - ['{{ DATA }}/anl/{{ memchar }}/{{ GPREFIX_ENS }}csg_sfc.f006.nc', + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soilanl.csg_sfc.nc'] + {% else %} - {% endfor %} + - ['{{ DATA }}/anl/{{ memchar }}/{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc'] + {% endif %} + {% endif %} {% endfor %} diff --git a/parm/soil/soil_stage_bufr2ioda_mapping.yaml.j2 b/parm/soil/soil_stage_bufr2ioda_mapping.yaml.j2 index e9dbd2319..13bffd83d 100644 --- a/parm/soil/soil_stage_bufr2ioda_mapping.yaml.j2 +++ b/parm/soil/soil_stage_bufr2ioda_mapping.yaml.j2 @@ -1 +1 @@ -- ['{{PARMgfs}}/gdas/soil/prep/prepbufr_adpsfc.yaml', '{{ DATA }}/obs/'] +- ['{{PARMglobal}}/gdas/soil/prep/prepbufr_adpsfc.yaml', '{{ DATA }}/obs/'] From ed392e1606624740e2c10372578b22bffbc30598 Mon Sep 17 00:00:00 2001 From: tsga Date: Wed, 15 Jul 2026 14:19:54 +0000 Subject: [PATCH 58/98] add geopot height to states --- parm/soil/jcb-base.yaml.j2 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/parm/soil/jcb-base.yaml.j2 b/parm/soil/jcb-base.yaml.j2 index 1a05c3a33..e88efa8de 100644 --- a/parm/soil/jcb-base.yaml.j2 +++ b/parm/soil/jcb-base.yaml.j2 @@ -60,7 +60,9 @@ number_of_outer_loops: 1 # ------------ # State variables -soil_state_variables_csg: {{ _analysis_vars_csg + ['slmsk', 'sheleg', 'vtype', 'stype', 'vfrac'] }} +soil_state_variables_csg: {{ _analysis_vars_csg + ['slmsk', 'sheleg', 'vtype', 'stype', 'vfrac', + 'geopotential_height_at_surface', + 'skin_temperature_at_surface'] }} soil_state_variables_fv3: {{ _analysis_vars_fv3 + ['slmsk', 'sheleg', 'vtype', @@ -84,6 +86,8 @@ soil_field_io_names_csg: sheleg: weasd stype: sotyp vfrac: veg + geopotential_height_at_surface: hgtsfc + skin_temperature_at_surface: tmpsfc soil_field_io_names_fv3: soilMoistureVolumetric: smc From 33f1c71ad38f013d9d4b5afa3ba7fc5890ee29f4 Mon Sep 17 00:00:00 2001 From: tsga Date: Wed, 15 Jul 2026 14:21:55 +0000 Subject: [PATCH 59/98] separate fv3/csg files --- .../algorithm/soil/soil_addincrement.yaml.j2 | 29 ++----- .../soil/soil_3dvar_outer_loop_1.yaml.j2 | 4 +- .../model/soil/soil_background_csg.yaml.j2 | 31 +------- .../soil/soil_background_ensemble.yaml.j2 | 29 +------ .../soil/soil_background_ensemble_csg.yaml.j2 | 15 ++++ .../soil/soil_background_ensemble_fv3.yaml.j2 | 23 +----- .../soil/soil_background_error_ID.yaml.j2 | 26 ------- ...yaml => soil_background_error_csg.yaml.j2} | 0 ...yaml => soil_background_error_fv3.yaml.j2} | 16 ++-- .../soil/soil_background_error_soill1.yaml | 78 ------------------- ... soil_background_error_static_csg.yaml.j2} | 0 ... soil_background_error_static_fv3.yaml.j2} | 0 ...background_error_static_smcstctq2m.yaml.j2 | 65 ---------------- .../soil/soil_ensemble_increments_csg.yaml.j2 | 7 +- .../soil/soil_ensemble_increments_fms.yaml.j2 | 2 - .../soil/soil_ensemble_increments_fv3.yaml.j2 | 7 ++ .../soil_ensemble_output_csg_common.yaml.j2 | 31 -------- .../soil_ensemble_output_fms_common.yaml.j2 | 25 ------ .../soil/soil_final_increment_csg.yaml.j2 | 11 ++- ...ml.j2 => soil_final_increment_fv3.yaml.j2} | 0 parm/jcb-gdas/model/soil/soil_output.yaml.j2 | 28 ------- .../soil/soil_output_increment_csg.yaml.j2 | 7 +- 22 files changed, 59 insertions(+), 375 deletions(-) create mode 100644 parm/jcb-gdas/model/soil/soil_background_ensemble_csg.yaml.j2 delete mode 100644 parm/jcb-gdas/model/soil/soil_background_error_ID.yaml.j2 rename parm/jcb-gdas/model/soil/{soil_background_error.yaml => soil_background_error_csg.yaml.j2} (100%) rename parm/jcb-gdas/model/soil/{soil_background_error_smc.yaml => soil_background_error_fv3.yaml.j2} (71%) delete mode 100644 parm/jcb-gdas/model/soil/soil_background_error_soill1.yaml rename parm/jcb-gdas/model/soil/{soil_background_error_static_soill1.yaml.j2 => soil_background_error_static_csg.yaml.j2} (100%) rename parm/jcb-gdas/model/soil/{soil_background_error_smcstc.yaml => soil_background_error_static_fv3.yaml.j2} (100%) delete mode 100644 parm/jcb-gdas/model/soil/soil_background_error_static_smcstctq2m.yaml.j2 delete mode 100644 parm/jcb-gdas/model/soil/soil_ensemble_increments_fms.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_ensemble_increments_fv3.yaml.j2 delete mode 100644 parm/jcb-gdas/model/soil/soil_ensemble_output_csg_common.yaml.j2 delete mode 100644 parm/jcb-gdas/model/soil/soil_ensemble_output_fms_common.yaml.j2 rename parm/jcb-gdas/model/soil/{soil_final_increment_fms.yaml.j2 => soil_final_increment_fv3.yaml.j2} (100%) delete mode 100644 parm/jcb-gdas/model/soil/soil_output.yaml.j2 diff --git a/parm/jcb-gdas/algorithm/soil/soil_addincrement.yaml.j2 b/parm/jcb-gdas/algorithm/soil/soil_addincrement.yaml.j2 index a50dc8614..fff08b67a 100644 --- a/parm/jcb-gdas/algorithm/soil/soil_addincrement.yaml.j2 +++ b/parm/jcb-gdas/algorithm/soil/soil_addincrement.yaml.j2 @@ -21,33 +21,16 @@ increment geometry: npy: {{ soil_npy_anl }} npz: {{ soil_npz_anl }} state: + state variables: {{ soil_state_variables_fv3 }} + field io names: {{ soil_field_io_names_fv3 }} datapath: ./bkg filetype: fms restart skip coupler file: true datetime: '{{ soil_background_time_iso }}' filename_sfcd: {{ soil_background_time_fv3 }}.sfc_data.nc - state variables: &statevars - - soilMoistureVolumetric - - totalSnowDepth - - fraction_of_ice - - sheleg - - stc - - slmsk - - vtype - - air_temperature_at_2m - - specfic_humidity_at_2m - - slc - field io names: &fionames - soilMoistureVolumetric: smc - totalSnowDepth: snodl - fraction_of_ice: fice - air_temperature_at_2m: t2m - specfic_humidity_at_2m: q2m increment: - added variables: - - soilMoistureVolumetric - field io names: - soilMoistureVolumetric: smc + added variables: {{ soil_increment_variables_fv3 }} + field io names: {{ soil_field_io_names_fv3 }} datapath: ./anl filetype: fms restart skip coupler file: true @@ -63,5 +46,5 @@ output: filename is datetime templated: true datetime: '{{ soil_background_time_iso }}' filename_sfcd: {{ soil_background_time_fv3 }}.sfc_data.nc - state variables: *statevars - field io names: *fionames + state variables: {{ soil_increment_variables_fv3 }} + field io names: {{ soil_field_io_names_fv3 }} diff --git a/parm/jcb-gdas/model/soil/soil_3dvar_outer_loop_1.yaml.j2 b/parm/jcb-gdas/model/soil/soil_3dvar_outer_loop_1.yaml.j2 index 302fd4a33..fa51bd4b3 100644 --- a/parm/jcb-gdas/model/soil/soil_3dvar_outer_loop_1.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_3dvar_outer_loop_1.yaml.j2 @@ -20,9 +20,7 @@ state variables: - filtered_orography - fraction_of_land - field io names: - filtered_orography: orog_filt - fraction_of_land: land_frac + field io names: {{ soil_field_io_names_fv3 }} datapath: {{ soil_orog_files_path }}/ filename_orog: {{ soil_orog_prefix }}_oro_data.nc diagnostics: diff --git a/parm/jcb-gdas/model/soil/soil_background_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_csg.yaml.j2 index 82ab060d6..712809f7a 100644 --- a/parm/jcb-gdas/model/soil/soil_background_csg.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background_csg.yaml.j2 @@ -3,33 +3,8 @@ filetype: cube sphere history provider: ufs datetime: '{{ soil_background_time_iso }}' filenames: -#- {{ soil_variational_history_prefix }}csg_atm.f006.nc +- {{ soil_variational_history_prefix }}csg_atm.f006.nc - {{ soil_variational_history_prefix }}csg_sfc.f006.nc max allowable geometry difference: 1e-4 -state variables: -- soill1 -- soill2 -- soill3 -- soilt1 -- soilt2 -- soilt3 -- air_temperature_at_2m -- specfic_humidity_at_2m -- sheleg -- vtype -- slmsk -#- stype -#- vfrac -#- geopotential_height_at_surface -#- skin_temperature_at_surface -#filtered_orography -field io names: - #filtered_orography: orog_filt - air_temperature_at_2m: tmp2m - specfic_humidity_at_2m: spfh2m - slmsk: land - sheleg: weasd - #geopotential_height_at_surface: hgtsfc - #skin_temperature_at_surface: tmpsfc - #stype: sotyp - #vfrac: veg +state variables: {{ soil_state_variables_csg }} +field io names: {{ soil_field_io_names_csg }} diff --git a/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 index 661f39c5c..eb14ac196 100644 --- a/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 @@ -8,33 +8,8 @@ members from template: - {{ soil_ensemble_history_prefix }}csg_atm.f006.nc - {{ soil_ensemble_history_prefix }}csg_sfc.f006.nc max allowable geometry difference: 1e-4 - state variables: - - soill1 - - soill2 - - soill3 - - soilt1 - - soilt2 - - soilt3 - - air_temperature_at_2m - - specfic_humidity_at_2m - - sheleg - - vtype - - slmsk - #- stype - #- vfrac - #- geopotential_height_at_surface - #- skin_temperature_at_surface - #filtered_orography - field io names: - #filtered_orography: orog_filt - air_temperature_at_2m: tmp2m - specfic_humidity_at_2m: spfh2m - slmsk: land - sheleg: weasd - #geopotential_height_at_surface: hgtsfc - #skin_temperature_at_surface: tmpsfc - #stype: sotyp - #vfrac: veg + state variables: {{ soil_state_variables_csg }} + field io names: {{ soil_field_io_names_csg }} pattern: "{{ soil_ensemble_pattern | default("%mem%", true) }}" nmembers: {{ soil_number_ensemble_members }} zero padding: 3 diff --git a/parm/jcb-gdas/model/soil/soil_background_ensemble_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_ensemble_csg.yaml.j2 new file mode 100644 index 000000000..eb14ac196 --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_background_ensemble_csg.yaml.j2 @@ -0,0 +1,15 @@ +members from template: + template: + datetime: '{{ soil_background_time_iso }}' + datapath: {{ soil_background_ensemble_path }} + filetype: cube sphere history + provider: ufs + filenames: + - {{ soil_ensemble_history_prefix }}csg_atm.f006.nc + - {{ soil_ensemble_history_prefix }}csg_sfc.f006.nc + max allowable geometry difference: 1e-4 + state variables: {{ soil_state_variables_csg }} + field io names: {{ soil_field_io_names_csg }} + pattern: "{{ soil_ensemble_pattern | default("%mem%", true) }}" + nmembers: {{ soil_number_ensemble_members }} + zero padding: 3 diff --git a/parm/jcb-gdas/model/soil/soil_background_ensemble_fv3.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_ensemble_fv3.yaml.j2 index 49a1a7a23..d41ae0e49 100644 --- a/parm/jcb-gdas/model/soil/soil_background_ensemble_fv3.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background_ensemble_fv3.yaml.j2 @@ -3,27 +3,8 @@ members from template: datetime: '{{ soil_background_time_iso }}' filetype: fms restart skip coupler file: true - state variables: &state_vars - - soilMoistureVolumetric - - stc - - slc - - totalSnowDepth - - sheleg - - vtype - - slmsk - - filtered_orography - - fraction_of_ice - - fraction_of_land - - air_temperature_at_2m - - specfic_humidity_at_2m - field io names: &field_ios - soilMoistureVolumetric: smc - totalSnowDepth: snodl - filtered_orography: orog_filt - fraction_of_ice: fice - fraction_of_land: land_frac - air_temperature_at_2m: t2m - specfic_humidity_at_2m: q2m + state variables: {{ soil_state_variables_fv3 }} + field io names: {{ soil_field_io_names_fv3 }} datapath: {{ soil_background_ensemble_path }} filename is datetime templated: true filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' diff --git a/parm/jcb-gdas/model/soil/soil_background_error_ID.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_error_ID.yaml.j2 deleted file mode 100644 index e9e090120..000000000 --- a/parm/jcb-gdas/model/soil/soil_background_error_ID.yaml.j2 +++ /dev/null @@ -1,26 +0,0 @@ -covariance model: SABER -saber central block: - saber block name: ID -saber outer blocks: -- saber block name: BUMP_StdDev - read: - drivers: - compute variance: true - variance: - explicit stddev: true - stddev: - - variables: - - soilMoistureVolumetric - value: 0.05 - - variables: - - slc - value: 0.05 - - variables: - - stc - value: 2.0 - - variables: - - air_temperature_at_2m - value: 2.0 - - variables: - - specfic_humidity_at_2m - value: 0.1 diff --git a/parm/jcb-gdas/model/soil/soil_background_error.yaml b/parm/jcb-gdas/model/soil/soil_background_error_csg.yaml.j2 similarity index 100% rename from parm/jcb-gdas/model/soil/soil_background_error.yaml rename to parm/jcb-gdas/model/soil/soil_background_error_csg.yaml.j2 diff --git a/parm/jcb-gdas/model/soil/soil_background_error_smc.yaml b/parm/jcb-gdas/model/soil/soil_background_error_fv3.yaml.j2 similarity index 71% rename from parm/jcb-gdas/model/soil/soil_background_error_smc.yaml rename to parm/jcb-gdas/model/soil/soil_background_error_fv3.yaml.j2 index 75c387bfb..ba8169e71 100644 --- a/parm/jcb-gdas/model/soil/soil_background_error_smc.yaml +++ b/parm/jcb-gdas/model/soil/soil_background_error_fv3.yaml.j2 @@ -12,21 +12,18 @@ saber central block: resolution: 4 explicit length-scales: true horizontal length-scale: - - groups: - - soilMoistureVolumetric + - groups: {{ soil_det_increment_variables }} value: 1000000.0 vertical length-scale: - - groups: - - soilMoistureVolumetric + - groups: {{ soil_det_increment_variables }} value: 1500.0 interpolation type: - - groups: - - soilMoistureVolumetric + - groups: {{ soil_det_increment_variables }} type: c0 same horizontal convolution: true io: data directory: ./berror - files prefix: smc_bump_nicas_1000km.nc + files prefix: smc_bump_nicas_1000km_{{ soil_background_time_fv3 }} saber outer blocks: - saber block name: BUMP_StdDev read: @@ -35,6 +32,5 @@ saber outer blocks: variance: explicit stddev: true stddev: - - variables: - - soilMoistureVolumetric - value: 0.05 + - variables: {{ soil_det_increment_variables }} + value: 0.2 diff --git a/parm/jcb-gdas/model/soil/soil_background_error_soill1.yaml b/parm/jcb-gdas/model/soil/soil_background_error_soill1.yaml deleted file mode 100644 index 88123efa2..000000000 --- a/parm/jcb-gdas/model/soil/soil_background_error_soill1.yaml +++ /dev/null @@ -1,78 +0,0 @@ -covariance model: SABER -saber central block: - saber block name: BUMP_NICAS - read: - general: - universe length-scale: 250000.0 - drivers: - multivariate strategy: univariate - #compute nicas: true - read global nicas: true - #write global nicas: true - nicas: - resolution: 6 - max horizontal grid size: 250000 - explicit length-scales: true - horizontal length-scale: - - groups: - - soill1_shadowLevels - - soill2_shadowLevels - - soilt1_shadowLevels - - soilt2_shadowLevels - value: 250000. - vertical length-scale: - - groups: - - soill1_shadowLevels - - soill2_shadowLevels - - soilt1_shadowLevels - - soilt2_shadowLevels - value: 0.0 - interpolation type: - - groups: - - soill1_shadowLevels - - soill2_shadowLevels - - soilt1_shadowLevels - - soilt2_shadowLevels - type: c0 - same horizontal convolution: true - io: - data directory: ./berror - files prefix: smc_bump -saber outer blocks: -- saber block name: ShadowLevels - fields metadata: - soill1: - vert_coord: filtered_orography - soill2: - vert_coord: filtered_orography - soilt1: - vert_coord: filtered_orography - soilt2: - vert_coord: filtered_orography - calibration: - number of shadow levels: 50 - lowest shadow level: -450.0 - highest shadow level: 8850.0 - vertical length-scale: 700.0 -- saber block name: BUMP_StdDev - read: - drivers: - compute variance: true - variance: - explicit stddev: true - stddev: - - variables: - - soill1 - value: 0.05 - - variables: - - soill2 - value: 0.05 - - variables: - - soilt1 - value: 2.0 - - variables: - - soilt1 - value: 2.0 - - variables: - - soilt2 - value: 2.0 diff --git a/parm/jcb-gdas/model/soil/soil_background_error_static_soill1.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_error_static_csg.yaml.j2 similarity index 100% rename from parm/jcb-gdas/model/soil/soil_background_error_static_soill1.yaml.j2 rename to parm/jcb-gdas/model/soil/soil_background_error_static_csg.yaml.j2 diff --git a/parm/jcb-gdas/model/soil/soil_background_error_smcstc.yaml b/parm/jcb-gdas/model/soil/soil_background_error_static_fv3.yaml.j2 similarity index 100% rename from parm/jcb-gdas/model/soil/soil_background_error_smcstc.yaml rename to parm/jcb-gdas/model/soil/soil_background_error_static_fv3.yaml.j2 diff --git a/parm/jcb-gdas/model/soil/soil_background_error_static_smcstctq2m.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_error_static_smcstctq2m.yaml.j2 deleted file mode 100644 index 8ff505ae3..000000000 --- a/parm/jcb-gdas/model/soil/soil_background_error_static_smcstctq2m.yaml.j2 +++ /dev/null @@ -1,65 +0,0 @@ -covariance model: SABER -saber central block: - saber block name: BUMP_NICAS - read: #calibration - general: - universe length-scale: 250000.0 - drivers: - multivariate strategy: univariate - read global nicas: true #compute nicas: true - #write global nicas: true - nicas: - resolution: 6 - max horizontal grid size: 400000 - explicit length-scales: true - horizontal length-scale: - - groups: - - soilMoistureVolumetric - - slc - - stc - - air_temperature_at_2m - - specfic_humidity_at_2m - value: 250000.0 - vertical length-scale: - - groups: - - soilMoistureVolumetric - - slc - - stc - - air_temperature_at_2m - - specfic_humidity_at_2m - value: 800.0 - interpolation type: - - groups: - - soilMoistureVolumetric - - slc - - stc - - air_temperature_at_2m - - specfic_humidity_at_2m - type: c0 - same horizontal convolution: true - io: - data directory: ./berror - files prefix: smc_bump -saber outer blocks: -- saber block name: BUMP_StdDev - read: - drivers: - compute variance: true - variance: - explicit stddev: true - stddev: - - variables: - - soilMoistureVolumetric - value: 0.05 - - variables: - - slc - value: 0.05 - - variables: - - stc - value: 2.0 - - variables: - - air_temperature_at_2m - value: 2.0 - - variables: - - specfic_humidity_at_2m - value: 0.1 diff --git a/parm/jcb-gdas/model/soil/soil_ensemble_increments_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_ensemble_increments_csg.yaml.j2 index ec76f92b0..617732f56 100644 --- a/parm/jcb-gdas/model/soil/soil_ensemble_increments_csg.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_ensemble_increments_csg.yaml.j2 @@ -1 +1,6 @@ -{% include 'soil_ensemble_output_csg_common.yaml.j2' %} +datapath: ./anl/mem%{member}% +filetype: cube sphere history +provider: ufs +filename: soilinc_{{ soil_ensemble_history_prefix }}.nc +state variables: {{ soil_state_variables_csg }} +field io names: {{ soil_field_io_names_csg }} diff --git a/parm/jcb-gdas/model/soil/soil_ensemble_increments_fms.yaml.j2 b/parm/jcb-gdas/model/soil/soil_ensemble_increments_fms.yaml.j2 deleted file mode 100644 index c51d4eb35..000000000 --- a/parm/jcb-gdas/model/soil/soil_ensemble_increments_fms.yaml.j2 +++ /dev/null @@ -1,2 +0,0 @@ -prefix: soilinc -{% include 'soil_ensemble_output_fms_common.yaml.j2' %} diff --git a/parm/jcb-gdas/model/soil/soil_ensemble_increments_fv3.yaml.j2 b/parm/jcb-gdas/model/soil/soil_ensemble_increments_fv3.yaml.j2 new file mode 100644 index 000000000..2ec59d3c7 --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_ensemble_increments_fv3.yaml.j2 @@ -0,0 +1,7 @@ +prefix: soilinc +datapath: ./anl/mem%{member}% +filetype: fms restart +filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' +filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' +state variables: {{ soil_state_variables_fv3 }} +field io names: {{ soil_field_io_names_fv3 }} diff --git a/parm/jcb-gdas/model/soil/soil_ensemble_output_csg_common.yaml.j2 b/parm/jcb-gdas/model/soil/soil_ensemble_output_csg_common.yaml.j2 deleted file mode 100644 index 699456f22..000000000 --- a/parm/jcb-gdas/model/soil/soil_ensemble_output_csg_common.yaml.j2 +++ /dev/null @@ -1,31 +0,0 @@ -datapath: ./anl/mem%{member}% -filetype: cube sphere history -provider: ufs -filename: soilinc_{{ soil_ensemble_history_prefix }}csg_sfc.f006.nc -state variables: -- soill1 -- soill2 -- soill3 -- soilt1 -- soilt2 -- soilt3 -- air_temperature_at_2m -- specfic_humidity_at_2m -- sheleg -- vtype -- slmsk -#- stype -#- vfrac -#- geopotential_height_at_surface -#- skin_temperature_at_surface -#filtered_orography -field io names: - #filtered_orography: orog_filt - air_temperature_at_2m: tmp2m - specfic_humidity_at_2m: spfh2m - slmsk: land - sheleg: weasd - #geopotential_height_at_surface: hgtsfc - #skin_temperature_at_surface: tmpsfc - #stype: sotyp - #vfrac: veg diff --git a/parm/jcb-gdas/model/soil/soil_ensemble_output_fms_common.yaml.j2 b/parm/jcb-gdas/model/soil/soil_ensemble_output_fms_common.yaml.j2 deleted file mode 100644 index 080c15360..000000000 --- a/parm/jcb-gdas/model/soil/soil_ensemble_output_fms_common.yaml.j2 +++ /dev/null @@ -1,25 +0,0 @@ -datapath: ./anl/mem%{member}% -filetype: fms restart -filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' -filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' -state variables: -- soilMoistureVolumetric -- stc -- slc -- totalSnowDepth -- sheleg -- vtype -- slmsk -- filtered_orography -- fraction_of_ice -- fraction_of_land -- air_temperature_at_2m -- specfic_humidity_at_2m -field io names: - soilMoistureVolumetric: smc - totalSnowDepth: snodl - filtered_orography: orog_filt - fraction_of_ice: fice - fraction_of_land: land_frac - air_temperature_at_2m: t2m - specfic_humidity_at_2m: q2m diff --git a/parm/jcb-gdas/model/soil/soil_final_increment_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_final_increment_csg.yaml.j2 index 11265fb14..c184c9f04 100644 --- a/parm/jcb-gdas/model/soil/soil_final_increment_csg.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_final_increment_csg.yaml.j2 @@ -12,14 +12,13 @@ output: field io names: soilMoistureVolumetric: smc totalSnowDepth: snodl -# prefix: soilinc filetype: cube sphere history provider: ufs -# ufs soil nlev: 4 -# ufs fields split by level: -# - smc -# - stc - filename: soilinc_{{ soil_variational_history_prefix }}csg_sfc.f006.nc + ufs soil nlev: 4 + ufs fields split by level: + - smc + - stc + filename: soilinc_{{ soil_variational_history_prefix }}.nc geometry: fms initialization: diff --git a/parm/jcb-gdas/model/soil/soil_final_increment_fms.yaml.j2 b/parm/jcb-gdas/model/soil/soil_final_increment_fv3.yaml.j2 similarity index 100% rename from parm/jcb-gdas/model/soil/soil_final_increment_fms.yaml.j2 rename to parm/jcb-gdas/model/soil/soil_final_increment_fv3.yaml.j2 diff --git a/parm/jcb-gdas/model/soil/soil_output.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output.yaml.j2 deleted file mode 100644 index 96c396f6c..000000000 --- a/parm/jcb-gdas/model/soil/soil_output.yaml.j2 +++ /dev/null @@ -1,28 +0,0 @@ -state variables: -- soilMoistureVolumetric -- stc -- slc -- totalSnowDepth -- sheleg -- vtype -- slmsk -- filtered_orography -- fraction_of_ice -- fraction_of_land -- air_temperature_at_2m -- specfic_humidity_at_2m -field io names: - soilMoistureVolumetric: smc - totalSnowDepth: snodl - filtered_orography: orog_filt - fraction_of_ice: fice - fraction_of_land: land_frac - air_temperature_at_2m - specfic_humidity_at_2m -datapath: ./anl -prefix: soil_finanl -filetype: fms restart -datetime: '{{ soil_background_time_iso }}' -filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' -filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' -filename_orog: '{{ soil_orog_prefix }}_oro_data.nc' diff --git a/parm/jcb-gdas/model/soil/soil_output_increment_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_increment_csg.yaml.j2 index 6f6982a20..0ab748c57 100644 --- a/parm/jcb-gdas/model/soil/soil_output_increment_csg.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_output_increment_csg.yaml.j2 @@ -1,2 +1,7 @@ prefix: soilinc_ensmean -{% include 'soil_ensemble_output_csg_common.yaml.j2' %} +datapath: ./anl/ +filetype: cube sphere history +provider: ufs +filename: {{ soil_ensemble_history_prefix }}.nc +state variables: {{ soil_state_variables_csg }} +field io names: {{ soil_field_io_names_csg }} From 7d8dcd4cf4655cc4f98ec703fa8e8e29954a3503 Mon Sep 17 00:00:00 2001 From: tsga Date: Wed, 15 Jul 2026 14:53:12 +0000 Subject: [PATCH 60/98] add variance output --- parm/jcb-gdas/model/soil/soil_output_increment_fms.yaml.j2 | 2 -- parm/jcb-gdas/model/soil/soil_output_increment_fv3.yaml.j2 | 7 +++++++ parm/jcb-gdas/model/soil/soil_output_mean_prior.yaml.j2 | 7 +++++++ .../jcb-gdas/model/soil/soil_output_mean_prior_fms.yaml.j2 | 2 -- .../model/soil/soil_output_variance_posterior.yaml.j2 | 7 +++++++ .../model/soil/soil_output_variance_posterior_fms.yaml.j2 | 2 -- .../jcb-gdas/model/soil/soil_output_variance_prior.yaml.j2 | 7 +++++++ .../model/soil/soil_output_variance_prior_fms.yaml.j2 | 2 -- parm/jcb-gdas/model/soil/soil_posterior_output_csg.yaml.j2 | 7 +++++++ parm/jcb-gdas/model/soil/soil_posterior_output_fms.yaml.j2 | 2 -- parm/jcb-gdas/model/soil/soil_posterior_output_fv3.yaml.j2 | 7 +++++++ 11 files changed, 42 insertions(+), 10 deletions(-) delete mode 100644 parm/jcb-gdas/model/soil/soil_output_increment_fms.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_output_increment_fv3.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_output_mean_prior.yaml.j2 delete mode 100644 parm/jcb-gdas/model/soil/soil_output_mean_prior_fms.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_output_variance_posterior.yaml.j2 delete mode 100644 parm/jcb-gdas/model/soil/soil_output_variance_posterior_fms.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_output_variance_prior.yaml.j2 delete mode 100644 parm/jcb-gdas/model/soil/soil_output_variance_prior_fms.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_posterior_output_csg.yaml.j2 delete mode 100644 parm/jcb-gdas/model/soil/soil_posterior_output_fms.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_posterior_output_fv3.yaml.j2 diff --git a/parm/jcb-gdas/model/soil/soil_output_increment_fms.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_increment_fms.yaml.j2 deleted file mode 100644 index 6fe0e475e..000000000 --- a/parm/jcb-gdas/model/soil/soil_output_increment_fms.yaml.j2 +++ /dev/null @@ -1,2 +0,0 @@ -prefix: soilinc_ensmean -{% include 'soil_ensemble_output_fms_common.yaml.j2' %} diff --git a/parm/jcb-gdas/model/soil/soil_output_increment_fv3.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_increment_fv3.yaml.j2 new file mode 100644 index 000000000..83b5df36a --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_output_increment_fv3.yaml.j2 @@ -0,0 +1,7 @@ +prefix: soilinc_ensmean +datapath: ./anl/ +filetype: fms restart +filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' +filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' +state variables: {{ soil_state_variables_fv3 }} +field io names: {{ soil_field_io_names_fv3 }} diff --git a/parm/jcb-gdas/model/soil/soil_output_mean_prior.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_mean_prior.yaml.j2 new file mode 100644 index 000000000..8fa1ae35f --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_output_mean_prior.yaml.j2 @@ -0,0 +1,7 @@ +prefix: soil_prior_ensmean +datapath: ./anl/ +filetype: cube sphere history +provider: ufs +filename: {{ soil_ensemble_history_prefix }}.nc +state variables: {{ soil_state_variables_csg }} +field io names: {{ soil_field_io_names_csg }} diff --git a/parm/jcb-gdas/model/soil/soil_output_mean_prior_fms.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_mean_prior_fms.yaml.j2 deleted file mode 100644 index d28a0e09c..000000000 --- a/parm/jcb-gdas/model/soil/soil_output_mean_prior_fms.yaml.j2 +++ /dev/null @@ -1,2 +0,0 @@ -prefix: soil_ensmean_prior -{% include 'soil_ensemble_output_fms_common.yaml.j2' %} diff --git a/parm/jcb-gdas/model/soil/soil_output_variance_posterior.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_variance_posterior.yaml.j2 new file mode 100644 index 000000000..d6490f67d --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_output_variance_posterior.yaml.j2 @@ -0,0 +1,7 @@ +prefix: soil_ensvariance_posterior +datapath: ./anl/ +filetype: cube sphere history +provider: ufs +filename: soilinc_{{ soil_ensemble_history_prefix }}.nc +state variables: {{ soil_state_variables_csg }} +field io names: {{ soil_field_io_names_csg }} diff --git a/parm/jcb-gdas/model/soil/soil_output_variance_posterior_fms.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_variance_posterior_fms.yaml.j2 deleted file mode 100644 index fb4b989e0..000000000 --- a/parm/jcb-gdas/model/soil/soil_output_variance_posterior_fms.yaml.j2 +++ /dev/null @@ -1,2 +0,0 @@ -prefix: soil_ensvariance_posterior -{% include 'soil_ensemble_output_fms_common.yaml.j2' %} diff --git a/parm/jcb-gdas/model/soil/soil_output_variance_prior.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_variance_prior.yaml.j2 new file mode 100644 index 000000000..2a914becc --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_output_variance_prior.yaml.j2 @@ -0,0 +1,7 @@ +prefix: soil_ensvariance_prior +datapath: ./anl/ +filetype: cube sphere history +provider: ufs +filename: soilinc_{{ soil_ensemble_history_prefix }}.nc +state variables: {{ soil_state_variables_csg }} +field io names: {{ soil_field_io_names_csg }} diff --git a/parm/jcb-gdas/model/soil/soil_output_variance_prior_fms.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_variance_prior_fms.yaml.j2 deleted file mode 100644 index 644899794..000000000 --- a/parm/jcb-gdas/model/soil/soil_output_variance_prior_fms.yaml.j2 +++ /dev/null @@ -1,2 +0,0 @@ -prefix: soil_ensvariance_prior -{% include 'soil_ensemble_output_fms_common.yaml.j2' %} diff --git a/parm/jcb-gdas/model/soil/soil_posterior_output_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_posterior_output_csg.yaml.j2 new file mode 100644 index 000000000..420b17ab1 --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_posterior_output_csg.yaml.j2 @@ -0,0 +1,7 @@ +prefix: soil_ens_anl +datapath: ./anl/ +filetype: cube sphere history +provider: ufs +filename: {{ soil_ensemble_history_prefix }}.nc +state variables: {{ soil_state_variables_csg }} +field io names: {{ soil_field_io_names_csg }} diff --git a/parm/jcb-gdas/model/soil/soil_posterior_output_fms.yaml.j2 b/parm/jcb-gdas/model/soil/soil_posterior_output_fms.yaml.j2 deleted file mode 100644 index c1c194a2e..000000000 --- a/parm/jcb-gdas/model/soil/soil_posterior_output_fms.yaml.j2 +++ /dev/null @@ -1,2 +0,0 @@ -prefix: soil_ens_anl -{% include 'soil_ensemble_output_fms_common.yaml.j2' %} diff --git a/parm/jcb-gdas/model/soil/soil_posterior_output_fv3.yaml.j2 b/parm/jcb-gdas/model/soil/soil_posterior_output_fv3.yaml.j2 new file mode 100644 index 000000000..cb6d310de --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_posterior_output_fv3.yaml.j2 @@ -0,0 +1,7 @@ +prefix: soil_ens_anl +datapath: ./anl/ +filetype: fms restart +filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' +filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' +state variables: {{ soil_state_variables_fv3 }} +field io names: {{ soil_field_io_names_fv3 }} From 0241ba58c6871a47cfb6101810d8906b09fa149d Mon Sep 17 00:00:00 2001 From: tsga Date: Wed, 15 Jul 2026 15:03:14 +0000 Subject: [PATCH 61/98] edit veg exclude for smap sm --- .../observations/soil/smap_soil.yaml.j2 | 22 +-- .../observations/soil/smap_soil_smc.yaml.j2 | 180 ------------------ 2 files changed, 11 insertions(+), 191 deletions(-) delete mode 100644 parm/jcb-gdas/observations/soil/smap_soil_smc.yaml.j2 diff --git a/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 b/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 index bb448d109..d984f919f 100644 --- a/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 +++ b/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 @@ -131,17 +131,17 @@ flag: landice_check ignore: rejected observations - name: reject -# - filter: RejectList # exclude certain IGBP vegetation types -# where: -# - variable: -# name: GeoVaLs/vtype -# absolute_tolerance: 1.0e-3 -# is_close_to_any_of: [1, 2, 3, 4, 13, 15, 17] -# actions: -# - name: set -# flag: vegtype_check -# ignore: rejected observations -# - name: reject + - filter: RejectList # exclude land ice and water (IGBP vegetation types) + where: + - variable: + name: GeoVaLs/vtype + absolute_tolerance: 1.0e-3 + is_close_to_any_of: [0, 15, 17] #[0, 1, 2, 3, 4, 13, 15, 17] + actions: + - name: set + flag: vegtype_check + ignore: rejected observations + - name: reject obs post filters: # Bounds Check (ObsError) - filter: Bounds Check diff --git a/parm/jcb-gdas/observations/soil/smap_soil_smc.yaml.j2 b/parm/jcb-gdas/observations/soil/smap_soil_smc.yaml.j2 deleted file mode 100644 index 0688c649a..000000000 --- a/parm/jcb-gdas/observations/soil/smap_soil_smc.yaml.j2 +++ /dev/null @@ -1,180 +0,0 @@ -- - - # Observation Space (I/O) - # ----------------------- - obs space: - name: {{observation_from_jcb}} -{% if algorithm == "local_ensemble_da" %} - distribution: - name: {{distribution_type}} - halo size: "{{halo_size}}" -{% endif %} - obsdatain: - engine: - type: H5File - obsfile: "{{soil_obsdatain_path}}/{{soil_obsdatain_prefix}}{{observation_from_jcb}}.nc" - #missing file action: warn - obsdataout: - engine: - type: H5File - obsfile: "{{soil_obsdataout_path}}/{{soil_obsdataout_prefix}}{{observation_from_jcb}}{{soil_obsdataout_suffix}}" - simulated variables: [soilMoistureVolumetric] - # - - # Observation Operator - # -------------------- - obs operator: - name: Identity - # - linear obs operator: - name: Identity - - # localization TODO: generalize this condioned on da algo - # ------------ -{% if algorithm == "local_ensemble_da" %} - obs localizations: - - localization method: {{localization_method}} - lengthscale: {{loc_length_scale}} - max nobs: {{max_nobs}} -{% endif %} - - obs error: - covariance model: diagonal - - # Observation Filters (QC) - # ------------------------ - obs pre filters: - - filter: Create Diagnostic Flags - flags: - - name: missing_smc - initial value: false - - name: invalid_smc - initial value: false - - name: land_check - initial value: false - - name: landice_check - initial value: false - - name: seaice_check - initial value: false - - name: snow_check - initial value: false - - name: retrv_qual_check - initial value: false - - name: vegtype_check - initial value: false - - name: elevation_bkgdiff - initial value: false - - name: background_check - initial value: false - - filter: Perform Action - filter variables: - - name: soilMoistureVolumetric - action: - name: assign error - error parameter: 0.1 - - filter: Domain Check - where: - - variable: - name: ObsValue/soilMoistureVolumetric - value: is_valid - actions: - - name: set - flag: missing_smc - ignore: rejected observations - - name: reject - obs prior filters: - - filter: Bounds Check - filter variables: - - name: soilMoistureVolumetric - minvalue: 0.0 - maxvalue: 1.0 - actions: - - name: set - flag: invalid_smc - ignore: rejected observations - - name: reject - - filter: Domain Check # land only - where: - - variable: - name: GeoVaLs/fraction_of_land - minvalue: 0.5 - actions: - - name: set - flag: land_check - ignore: rejected observations - - name: reject - - filter: Domain Check # land only, no sea ice - where: - - variable: - name: GeoVaLs/fraction_of_ice - maxvalue: 0.0 - actions: - - name: set - flag: seaice_check - ignore: rejected observations - - name: reject - - filter: Domain Check # no snow - where: - - variable: - name: GeoVaLs/sheleg - maxvalue: 0.0 - actions: - - name: set - flag: snow_check - ignore: rejected observations - - name: reject - - filter: Domain Check # high-quality retrievals - where: - - variable: - name: PreQC/soilMoistureVolumetric - is_in: 0, 8 - actions: - - name: set - flag: retrv_qual_check - ignore: rejected observations - - name: reject - - filter: RejectList # no land-ice - where: - - variable: - name: GeoVaLs/vtype - minvalue: 14.5 - maxvalue: 15.5 - actions: - - name: set - flag: landice_check - ignore: rejected observations - - name: reject - obs post filters: - # Bounds Check (ObsError) - - filter: Bounds Check - udescriptor: "bounds_check_ObsError" - filter variables: - - name: soilMoistureVolumetric - test variables: - - name: ObsErrorData/soilMoistureVolumetric - minvalue: 0.0 - maxvalue: 0.2 - action: - name: reject - - # Bounds Check (ObsValue) - - filter: Bounds Check - udescriptor: "bounds_check_ObsValue" - filter variables: - - name: soilMoistureVolumetric - minvalue: 0.02 - maxvalue: 0.5 - action: - name: reject - - - filter: Background Check # gross error check - filter variables: - - name: soilMoistureVolumetric - #threshold: 5 - absolute threshold: 0.5 - bias correction parameter: 1.0 - actions: - - name: set - flag: background_check - ignore: rejected observations - - name: reject From 4b15e0734e3dc5c06c267aca246b850bfa61347d Mon Sep 17 00:00:00 2001 From: tsga Date: Wed, 15 Jul 2026 15:05:11 +0000 Subject: [PATCH 62/98] fix soill name --- parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml b/parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml index b088413c1..56ac32a34 100644 --- a/parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml +++ b/parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml @@ -10,7 +10,7 @@ window_option: max # observation type initial configuration # -------------------------------- stations_to_reject: - totalSnowDepth: ['fakelist'] + soill1: ['fakelist'] # Chronicle of changes for this observation type # ---------------------------------------- From d50a801700792e9138bae6c2f2a261582f356c37 Mon Sep 17 00:00:00 2001 From: tsga Date: Fri, 17 Jul 2026 13:32:55 +0000 Subject: [PATCH 63/98] edit state fields --- parm/soil/jcb-base.yaml.j2 | 49 ++++++++++++++----------------- parm/soil/soil_det_config.yaml.j2 | 4 +-- 2 files changed, 24 insertions(+), 29 deletions(-) diff --git a/parm/soil/jcb-base.yaml.j2 b/parm/soil/jcb-base.yaml.j2 index e88efa8de..310714f38 100644 --- a/parm/soil/jcb-base.yaml.j2 +++ b/parm/soil/jcb-base.yaml.j2 @@ -1,10 +1,11 @@ # Search path for model and obs for JCB # ------------------------------------- -algorithm_path: "{{PARMgdas}}/jcb-algorithms" -app_path_algorithm: "{{PARMgdas}}/jcb-gdas/algorithm/soil" -app_path_model: "{{PARMgdas}}/jcb-gdas/model/soil" -app_path_observations: "{{PARMgdas}}/jcb-gdas/observations/soil" -app_path_observation_chronicle: "{{PARMgdas}}/jcb-gdas/observation_chronicle/soil" +algorithm_path: "{{PARMglobal}}/gdas/jcb-algorithms" +app_path_algorithm: "{{PARMglobal}}/gdas/jcb-gdas/algorithm/soil" +app_path_model: "{{PARMglobal}}/gdas/jcb-gdas/model/soil" +app_path_observations: "{{PARMglobal}}/gdas/jcb-gdas/observations/soil" +app_path_observation_chronicle: "{{PARMglobal}}/gdas/jcb-gdas/observation_chronicle/soil" + # Places where we deviate from the generic file name of a yaml # ------------------------------------------------------------ @@ -50,32 +51,26 @@ number_of_outer_loops: 1 {% set _analysis_vars_csg = ['soill1', 'soill2', 'soilt1', 'soilt2', 'air_temperature_at_2m', 'specfic_humidity_at_2m'] %} {% set _analysis_vars_fv3 = ['soilMoistureVolumetric', 'stc', 'air_temperature_at_2m', 'specfic_humidity_at_2m'] %} -{% if _file_type == 'csg' %} - analysis_variables: {{ _analysis_vars_csg }} -{% else %} - analysis_variables: {{ _analysis_vars_fv3 }} -{% endif %} +#{% if _file_type == 'csg' %} +analysis_variables: {{ _analysis_vars_csg }} +#{% else %} +# analysis_variables: {{ _analysis_vars_fv3 }} +#{% endif %} # Model things # ------------ # State variables -soil_state_variables_csg: {{ _analysis_vars_csg + ['slmsk', 'sheleg', 'vtype', 'stype', 'vfrac', - 'geopotential_height_at_surface', - 'skin_temperature_at_surface'] }} -soil_state_variables_fv3: {{ _analysis_vars_fv3 + ['slmsk', - 'sheleg', - 'vtype', - 'filtered_orography', - 'fraction_of_ice' - 'fraction_of_land', - 'totalSnowDepth'] }} +soil_state_variables_csg: ['soill1', 'soill2', 'soilt1', 'soilt2', 'air_temperature_at_2m', 'specfic_humidity_at_2m', 'slmsk', 'sheleg', 'vtype', 'stype', 'vfrac','geopotential_height_at_surface', 'skin_temperature_at_surface'] +#soil_state_variables_csg: {{ _analysis_vars_csg + ['slmsk', 'sheleg', 'vtype', 'stype', 'vfrac','geopotential_height_at_surface', 'skin_temperature_at_surface'] }} +#soil_state_variables_fv3: {{ _analysis_vars_fv3 + ['slmsk', 'sheleg', 'vtype', 'filtered_orography', 'fraction_of_ice', 'fraction_of_land', 'totalSnowDepth'] }} # Increment variables soil_increment_variables_csg: {{ _analysis_vars_csg }} soil_increment_variables_fv3: {{ _analysis_vars_fv3 }} -soil_increment_variables_final_csg: {{ _analysis_vars_csg }} + ['slmsk', 'sheleg', 'vtype', 'stype', 'vfrac'] }} -soil_increment_variables_final_fv3: {{ _analysis_vars_fv3 }} + ['slmsk', 'sheleg', 'vtype', 'totalSnowDepth'] }} +soil_increment_variables_final_csg: ['soill1', 'soill2', 'soilt1', 'soilt2', 'air_temperature_at_2m', 'specfic_humidity_at_2m', 'slmsk','slmsk', 'sheleg', 'vtype', 'stype', 'vfrac'] +#soil_increment_variables_final_csg: {{ _analysis_vars_csg }} + ['slmsk', 'sheleg', 'vtype', 'stype', 'vfrac'] }} +#soil_increment_variables_final_fv3: {{ _analysis_vars_fv3 }} + ['slmsk', 'sheleg', 'vtype', 'totalSnowDepth'] }} # Variable IO names @@ -169,11 +164,11 @@ soil_ensemble_analysis_prefix: "{{ APREFIX_ENS }}" local_ensemble_da_solver: Deterministic LETKF #GETKF increment_variables: {{ analysis_variables }} -{% if _file_type == 'csg' %} - increment_variables: {{ _analysis_vars_csg }} -{% else %} - increment_variables: {{ _analysis_vars_fv3 }} -{% endif %} +#{% if _file_type == 'csg' %} +increment_variables: {{ _analysis_vars_csg }} +#{% else %} +# increment_variables: {{ _analysis_vars_fv3 }} +#{% endif %} # Veritcal localization for GETKF vl_fraction_of_retained_variance: 0.750 diff --git a/parm/soil/soil_det_config.yaml.j2 b/parm/soil/soil_det_config.yaml.j2 index 13302176e..ee1d90cb2 100644 --- a/parm/soil/soil_det_config.yaml.j2 +++ b/parm/soil/soil_det_config.yaml.j2 @@ -1,10 +1,10 @@ jedi_config: soilanlvar: rundir: '{{ DATA }}' - exe_src: '{{ EXECgdas }}/gdas.x' + exe_src: '{{ EXECglobal }}/gdas.x' mpi_cmd: '{{ APRUN_SOILANL }}' jedi_args: ['fv3jedi', 'variational'] - jcb_base_yaml: '{{ PARMgdas }}/soil/jcb-base.yaml.j2' + jcb_base_yaml: '{{ PARMglobal }}/gdas/soil/jcb-base.yaml.j2' jcb_algo: '3dvar' obs_list_yaml: '{{ OBS_LIST_YAML }}' From eee403e494309cfab0cc5f561b557fc9e64fd186 Mon Sep 17 00:00:00 2001 From: tsga Date: Mon, 20 Jul 2026 12:39:09 +0000 Subject: [PATCH 64/98] use gaussian grid for var incrments --- .../soil/soil_final_increment_csg.yaml.j2 | 26 ++------- .../soil_final_increment_gaussian.yaml.j2 | 33 +++++++++++ .../soil/soil_output_increment_csg.yaml.j2 | 2 +- parm/soil/soil_det_config.yaml.j2 | 57 +++++++++++-------- parm/soil/soil_letkf_config.yaml.j2 | 20 ++++--- 5 files changed, 87 insertions(+), 51 deletions(-) create mode 100644 parm/jcb-gdas/model/soil/soil_final_increment_gaussian.yaml.j2 diff --git a/parm/jcb-gdas/model/soil/soil_final_increment_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_final_increment_csg.yaml.j2 index c184c9f04..d7ae371d1 100644 --- a/parm/jcb-gdas/model/soil/soil_final_increment_csg.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_final_increment_csg.yaml.j2 @@ -1,24 +1,10 @@ output: state component: - datapath: ./anl - state variables: - - soilMoistureVolumetric - - slc - - stc - - totalSnowDepth - - sheleg - - vtype - - slmsk - field io names: - soilMoistureVolumetric: smc - totalSnowDepth: snodl filetype: cube sphere history provider: ufs - ufs soil nlev: 4 - ufs fields split by level: - - smc - - stc - filename: soilinc_{{ soil_variational_history_prefix }}.nc + datapath: ./anl + filename: soilinc_{{ soil_variational_history_prefix }}nc + field io names: {{ soil_field_io_names_csg }} geometry: fms initialization: @@ -28,6 +14,6 @@ geometry: layout: - {{ soil_layout_x }} - {{ soil_layout_y }} - npx: {{ soil_npx_ges }} - npy: {{ soil_npy_ges }} - npz: {{ soil_npz_ges }} + npx: {{ soil_npx_anl }} + npy: {{ soil_npy_anl }} + npz: {{ soil_npz_anl }} diff --git a/parm/jcb-gdas/model/soil/soil_final_increment_gaussian.yaml.j2 b/parm/jcb-gdas/model/soil/soil_final_increment_gaussian.yaml.j2 new file mode 100644 index 000000000..bb38f0ba8 --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_final_increment_gaussian.yaml.j2 @@ -0,0 +1,33 @@ +grid type: regular gaussian +local interpolator type: oops unstructured grid interpolator +number of latitude gridpoints: {{ (soil_npy_anl | int) - 1 }} #96 +#resolution in degrees: {{ soil_gaussian_latres }} #0.9375 +datapath: ./anl +prefix: {{ soil_gaussian_increment_prefix }} +#filename: {{ soil_gaussian_increment_prefix }} +all model levels: true +date colons: false +variables to output: +- soilt1 +- soilt2 +- soill1 +- soill2 +field io names: + soilt1: stc1_inc + soilt2: stc2_inc + soill1: slc1_inc + soill2: slc2_inc +#type: inc +#exp: 3dvar-soil + +#geometry: +# fms initialization: +# namelist filename: "{{ soil_fv3jedi_files_path }}/fmsmpp.nml" +# field table filename: "{{ soil_fv3jedi_files_path }}/field_table" +# akbk: "{{ soil_fv3jedi_files_path }}/akbk.nc4" +# layout: +# - {{ soil_layout_x }} +# - {{ soil_layout_y }} +# npx: {{ soil_npx_anl }} +# npy: {{ soil_npy_anl }} +# npz: {{ soil_npz_anl }} diff --git a/parm/jcb-gdas/model/soil/soil_output_increment_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_increment_csg.yaml.j2 index 0ab748c57..852bdbe22 100644 --- a/parm/jcb-gdas/model/soil/soil_output_increment_csg.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_output_increment_csg.yaml.j2 @@ -2,6 +2,6 @@ prefix: soilinc_ensmean datapath: ./anl/ filetype: cube sphere history provider: ufs -filename: {{ soil_ensemble_history_prefix }}.nc +filename: {{ soil_ensemble_history_prefix }}nc state variables: {{ soil_state_variables_csg }} field io names: {{ soil_field_io_names_csg }} diff --git a/parm/soil/soil_det_config.yaml.j2 b/parm/soil/soil_det_config.yaml.j2 index ee1d90cb2..da108b215 100644 --- a/parm/soil/soil_det_config.yaml.j2 +++ b/parm/soil/soil_det_config.yaml.j2 @@ -19,7 +19,7 @@ data_in: copy_req: -{% if soil_file_type == 'csg' %} +{% if SOIL_FILE_TYPE == 'csg' %} - ['{{ COMIN_ATMOS_HISTORY_PREV }}/{{ GPREFIX }}csg_atm.f006.nc', '{{ DATA }}/bkg/{{ GPREFIX }}csg_atm.f006.nc'] - ['{{ COMIN_ATMOS_HISTORY_PREV }}/{{ GPREFIX }}csg_sfc.f006.nc', '{{ DATA }}/bkg/{{ GPREFIX }}csg_sfc.f006.nc'] {% else %} @@ -30,13 +30,13 @@ data_in: - ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/bkg/'] - ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/bkg/'] - ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/bkg/'] +{% endif %} - ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile1.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile1.nc" ] - ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile2.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile2.nc" ] - ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile3.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile3.nc" ] - ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile4.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile4.nc" ] - ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile5.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile5.nc" ] - ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile6.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile6.nc" ] -{% endif %} {% filter indent(width=4) %} {% include 'soil_stage_jedi_fix.yaml.j2' %} @@ -55,18 +55,41 @@ data_out: copy_req: # Configuration files - ['{{ DATA }}/soilanlvar.yaml', '{{ COMOUT_CONF }}/{{ APREFIX }}soilanlvar.yaml'] - - ['{{ DATA }}/soilanladdinc.yaml', '{{ COMOUT_CONF }}/{{ APREFIX }}soilanladdinc.yaml'] +# - ['{{ DATA }}/soilanladdinc.yaml', '{{ COMOUT_CONF }}/{{ APREFIX }}soilanladdinc.yaml'] # - ['{{ DATA }}/soil_obs_list.yaml.j2', '{{ COMOUT_CONF }}/{{ APREFIX }}soil_obs_list.yaml.j2'] -{% if soil_file_type == 'csg' %} - # Increments - - ['{{ DATA }}/anl/soilinc_{{ GPREFIX }}csg_sfc.f006.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.csg_sfc.nc'] - # Analysis = bkg + inc +# Increments +{% if SOIL_FILE_TYPE == 'csg' %} + - ['{{ DATA }}/anl/soilinc_{{ GPREFIX }}nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment_csg.sfci006.nc'] + - ['{{ DATA }}/anl/soilinc_{{ GPREFIX }}nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ APREFIX }}jedi_increment.sfc.i006.nc'] + + - ['{{ DATA }}/anl/sfcinc.{{ current_cycle | to_YMD }}T{{ current_cycle | strftime('%H') }}0000Z.gaussian.modelLevels.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment_gaussian.sfci006.nc'] + - ['{{ DATA }}/anl/sfcinc.{{ current_cycle | to_YMD }}T{{ current_cycle | strftime('%H') }}0000Z.gaussian.modelLevels.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ APREFIX }}increment.sfc.i006.nc'] +{% else %} + - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile1.nc'] + - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile2.nc'] + - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile3.nc'] + - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile4.nc'] + - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile5.nc'] + - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile6.nc'] +{% endif %} + +{% if DO_ADD_SOIL_INCR %} +# Copy soil analysis (for non-iau) # Analysis = bkg + inc + {% if SOIL_FILE_TYPE == 'csg' %} - ['{{ DATA }}/anl/{{ GPREFIX }}csg_sfc.f006.nc', '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ current_cycle | to_fv3time }}.csg_sfc.nc'] -{% else %} - # Analysis = bkg + inc + {% else %} - ['{{ DATA }}/anl/{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc'] - ['{{ DATA }}/anl/{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', @@ -79,17 +102,5 @@ data_out: '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc'] - ['{{ DATA }}/anl/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc'] - # Increments - - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile1.nc'] - - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile2.nc'] - - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile3.nc'] - - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile4.nc'] - - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile5.nc'] - - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile6.nc'] + {% endif %} {% endif %} diff --git a/parm/soil/soil_letkf_config.yaml.j2 b/parm/soil/soil_letkf_config.yaml.j2 index 374683e64..8b0530aa6 100644 --- a/parm/soil/soil_letkf_config.yaml.j2 +++ b/parm/soil/soil_letkf_config.yaml.j2 @@ -33,7 +33,7 @@ data_in: '${YMD}': previous_cycle | to_YMD, '${HH}': previous_cycle | strftime('%H'), '${MEMDIR}': 'mem%03d' | format(mem) }) %} - {% if soil_file_type == 'csg' %} + {% if SOIL_FILE_TYPE == 'csg' %} - ['{{ COM_ATMOS_HISTORY_TMPL | replace_tmpl(tmpl_dict) }}/{{ GPREFIX_ENS }}csg_atm.f006.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - ['{{ COM_ATMOS_HISTORY_TMPL | replace_tmpl(tmpl_dict) }}/{{ GPREFIX_ENS }}csg_sfc.f006.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] {% else %} @@ -119,9 +119,16 @@ data_out: '${HH}': current_cycle | strftime('%H'), '${MEMDIR}': 'mem%03d' | format(imem) }) %} # Increments - {% if soil_file_type == 'csg' %} - - ['{{ DATA }}/anl/{{ memchar }}/soilinc_{{ GPREFIX_ENS }}csg_sfc.f006.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_inc.csg_sfc.nc'] + {% if SOIL_FILE_TYPE == 'csg' %} + - ['{{ DATA }}/anl/{{ memchar }}/soilinc_{{ GPREFIX_ENS }}nc', + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_increment_csg.sfci006.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/soilinc_{{ GPREFIX_ENS }}nc', + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ APREFIX }}jedi_increment.sfc.i006.nc'] + + - ['{{ DATA }}/anl/{{ memchar }}/sfcinc.{{ current_cycle | to_YMD }}T{{ current_cycle | strftime('%H') }}0000Z.gaussian.modelLevels.nc', + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_increment_gaussian.sfci006.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/sfcinc.{{ current_cycle | to_YMD }}T{{ current_cycle | strftime('%H') }}0000Z.gaussian.modelLevels.nc', + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ APREFIX }}increment.sfc.i006.nc'] {% else %} - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile1.nc'] @@ -137,13 +144,12 @@ data_out: '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile6.nc'] {% endif %} + # Copy soil analysis (for non-iau) {% if DO_ADD_SOIL_INCR %} - # Copy soil analysis (for non-iau) - {% if soil_file_type == 'csg' %} + {% if SOIL_FILE_TYPE == 'csg' %} - ['{{ DATA }}/anl/{{ memchar }}/{{ GPREFIX_ENS }}csg_sfc.f006.nc', '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soilanl.csg_sfc.nc'] {% else %} - - ['{{ DATA }}/anl/{{ memchar }}/{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc'] - ['{{ DATA }}/anl/{{ memchar }}/{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', From 3cff1aef0fd55e2cc6cdf6e250b9160f74be48c9 Mon Sep 17 00:00:00 2001 From: tsga Date: Mon, 20 Jul 2026 12:39:34 +0000 Subject: [PATCH 65/98] write both csg and gaussian inc for now --- parm/soil/jcb-base.yaml.j2 | 46 ++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/parm/soil/jcb-base.yaml.j2 b/parm/soil/jcb-base.yaml.j2 index 310714f38..c835d1e93 100644 --- a/parm/soil/jcb-base.yaml.j2 +++ b/parm/soil/jcb-base.yaml.j2 @@ -11,10 +11,10 @@ app_path_observation_chronicle: "{{PARMglobal}}/gdas/jcb-gdas/observation_chroni # ------------------------------------------------------------ model_file: model_pseudo initial_condition_file: background # Initial conditions for 4D apps is background -# file type csg or fms -{% set _file_type = 'csg' %} -soil_file_type: {{ _file_type }} +# file type csg or fv3 +{% set _file_type = SOIL_FILE_TYPE %} final_increment_file: soil_final_increment_{{ _file_type }} +#final_increment_file: soil_final_increment_gaussian output_mean_prior_file: soil_output_mean_prior_{{ _file_type }} posterior_output_file: soil_posterior_output_{{ _file_type }} output_ensemble_increments_file: soil_ensemble_increments_{{ _file_type }} @@ -22,6 +22,8 @@ output_increment_file: soil_output_increment_{{ _file_type }} output_variance_prior_file: soil_output_variance_prior_{{ _file_type }} output_variance_posterior_file: soil_output_variance_posterior_{{ _file_type }} #jedi_increment_output: gaussian +final_increment_to_latlon_file: soil_final_increment_gaussian +#final_analysis_to_latlon_file: soil_final_analysis_latlon # Assimilation window # ------------------- @@ -48,14 +50,15 @@ cost_type: 3D-Var number_of_outer_loops: 1 # Analysis variables -{% set _analysis_vars_csg = ['soill1', 'soill2', 'soilt1', 'soilt2', 'air_temperature_at_2m', 'specfic_humidity_at_2m'] %} +{% set _analysis_vars_csg = ['soill1', + 'soill2', + 'soilt1', + 'soilt2'] %} +# 'air_temperature_at_2m', +# 'specfic_humidity_at_2m'] %} {% set _analysis_vars_fv3 = ['soilMoistureVolumetric', 'stc', 'air_temperature_at_2m', 'specfic_humidity_at_2m'] %} -#{% if _file_type == 'csg' %} analysis_variables: {{ _analysis_vars_csg }} -#{% else %} -# analysis_variables: {{ _analysis_vars_fv3 }} -#{% endif %} # Model things # ------------ @@ -97,24 +100,29 @@ soil_layout_y: {{ layout_y | default(1, true) }} soil_npx_ges: {{ npx_ges | default(49, true) }} soil_npy_ges: {{ npy_ges | default(49, true) }} soil_npz_ges: {{ npz_ges | default(127, true) }} -soil_npx_anl: {{ npx_ges | default(49, true) }} -soil_npy_anl: {{ npy_ges | default(49, true) }} -soil_npz_anl: {{ npz_ges | default(127, true) }} +soil_npx_his: {{ npx_his | default(49, true) }} +soil_npy_his: {{ npy_his | default(49, true) }} +soil_npz_his: {{ npz_his | default(127, true) }} +soil_npx_anl: {{ npx_anl | default(49, true) }} +soil_npy_anl: {{ npy_anl | default(49, true) }} +soil_npz_anl: {{ npz_anl | default(127, true) }} + +soil_gaussian_latres: {{ GAUSSIAN_LATRES | default(0.9375, true) }} soil_variational_history_prefix: "{{ GPREFIX }}" soil_fv3jedi_files_path: ./fv3jedi # Ideally this would be {{DATA}}/fv3jedi but FMS -soil_orog_files_path: "{{ soil_bkg_path }}" +soil_orog_files_path: "{{ DATA }}/bkg" soil_orog_prefix: "{{ CASE }}.mx{{ OCNRES }}" # Background -soil_background_path: {{ soil_bkg_path }} -#background_file: soil_background_csg +soil_background_path: ./bkg +background_file: soil_background_csg # Background error soil_bump_data_directory: "{{ DATA }}/berror" -soil_background_error_file: "{{ BERROR_YAML }}" -#background_error_file: "{{BERROR_YAML}}" +#soil_background_error_file: "{{ BERROR_YAML }}" +background_error_file: "{{BERROR_YAML}}" # Forecasting soil_forecast_length: "{{ SOIL_FORECAST_LENGTH }}" @@ -162,8 +170,7 @@ soil_ensemble_analysis_prefix: "{{ APREFIX_ENS }}" # Local Ensemble DA (LETKF) # ------------------------- local_ensemble_da_solver: Deterministic LETKF #GETKF - -increment_variables: {{ analysis_variables }} + #{% if _file_type == 'csg' %} increment_variables: {{ _analysis_vars_csg }} #{% else %} @@ -194,6 +201,7 @@ driver_do_test_prints: false #(default true) # Diagnostics soil_increment_path: ./anl soil_increment_ensemble_path: ./anl/mem%mem% -soil_increment_prefix: "soilinc" +soil_increment_prefix: "{{ SOIL_INC_PREFIX }}" +soil_gaussian_increment_prefix: "{{ SOIL_GINC_PREFIX }}" #posterior_output_gaussian: "./mem%{member}%/soilanl." # From 81fd1af80f5864f14537de10348cb54b07bc0c09 Mon Sep 17 00:00:00 2001 From: tsga Date: Mon, 20 Jul 2026 20:26:38 +0000 Subject: [PATCH 66/98] write soil letkf inc on gaussian grid --- .../soil/soil_ensemble_increments_csg.yaml.j2 | 2 +- .../soil_ensemble_increments_gaussian.yaml.j2 | 6 +++ .../soil/soil_output_increment_csg.yaml.j2 | 5 +-- .../soil_output_increment_gaussian.yaml.j2 | 6 +++ parm/soil/jcb-base.yaml.j2 | 6 ++- parm/soil/soil_letkf_config.yaml.j2 | 37 +++++++++++++++---- 6 files changed, 48 insertions(+), 14 deletions(-) create mode 100644 parm/jcb-gdas/model/soil/soil_ensemble_increments_gaussian.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_output_increment_gaussian.yaml.j2 diff --git a/parm/jcb-gdas/model/soil/soil_ensemble_increments_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_ensemble_increments_csg.yaml.j2 index 617732f56..ac1a13b5f 100644 --- a/parm/jcb-gdas/model/soil/soil_ensemble_increments_csg.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_ensemble_increments_csg.yaml.j2 @@ -1,6 +1,6 @@ datapath: ./anl/mem%{member}% filetype: cube sphere history provider: ufs -filename: soilinc_{{ soil_ensemble_history_prefix }}.nc +filename: soilinc_{{ soil_ensemble_history_prefix }}nc state variables: {{ soil_state_variables_csg }} field io names: {{ soil_field_io_names_csg }} diff --git a/parm/jcb-gdas/model/soil/soil_ensemble_increments_gaussian.yaml.j2 b/parm/jcb-gdas/model/soil/soil_ensemble_increments_gaussian.yaml.j2 new file mode 100644 index 000000000..af064412b --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_ensemble_increments_gaussian.yaml.j2 @@ -0,0 +1,6 @@ +datapath: ./anl/mem%{member}% +filetype: auxgrid +gridtype: gaussian +filename: ./anl/mem%{member}%/sfcinc. +state variables: {{ soil_state_variables_csg }} +field io names: {{ soil_field_io_names_csg }} diff --git a/parm/jcb-gdas/model/soil/soil_output_increment_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_increment_csg.yaml.j2 index 852bdbe22..a0e6eb7bf 100644 --- a/parm/jcb-gdas/model/soil/soil_output_increment_csg.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_output_increment_csg.yaml.j2 @@ -1,7 +1,6 @@ -prefix: soilinc_ensmean -datapath: ./anl/ +datapath: ./anl/mem%{member}% filetype: cube sphere history provider: ufs -filename: {{ soil_ensemble_history_prefix }}nc +filename: soilinc_ensmean_{{ soil_ensemble_history_prefix }}nc state variables: {{ soil_state_variables_csg }} field io names: {{ soil_field_io_names_csg }} diff --git a/parm/jcb-gdas/model/soil/soil_output_increment_gaussian.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_increment_gaussian.yaml.j2 new file mode 100644 index 000000000..317b1154d --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_output_increment_gaussian.yaml.j2 @@ -0,0 +1,6 @@ +datapath: ./anl/mem000 +filetype: auxgrid +gridtype: gaussian +filename: ./anl/mem000/sfcinc_ensmean. +state variables: {{ soil_state_variables_csg }} +field io names: {{ soil_field_io_names_csg }} diff --git a/parm/soil/jcb-base.yaml.j2 b/parm/soil/jcb-base.yaml.j2 index c835d1e93..21d823848 100644 --- a/parm/soil/jcb-base.yaml.j2 +++ b/parm/soil/jcb-base.yaml.j2 @@ -17,13 +17,15 @@ final_increment_file: soil_final_increment_{{ _file_type }} #final_increment_file: soil_final_increment_gaussian output_mean_prior_file: soil_output_mean_prior_{{ _file_type }} posterior_output_file: soil_posterior_output_{{ _file_type }} -output_ensemble_increments_file: soil_ensemble_increments_{{ _file_type }} -output_increment_file: soil_output_increment_{{ _file_type }} +#output_ensemble_increments_file: soil_ensemble_increments_{{ _file_type }} +#output_increment_file: soil_output_increment_{{ _file_type }} output_variance_prior_file: soil_output_variance_prior_{{ _file_type }} output_variance_posterior_file: soil_output_variance_posterior_{{ _file_type }} #jedi_increment_output: gaussian final_increment_to_latlon_file: soil_final_increment_gaussian #final_analysis_to_latlon_file: soil_final_analysis_latlon +output_ensemble_increments_file: soil_ensemble_increments_gaussian +output_increment_file: soil_output_increment_gaussian # Assimilation window # ------------------- diff --git a/parm/soil/soil_letkf_config.yaml.j2 b/parm/soil/soil_letkf_config.yaml.j2 index 8b0530aa6..e8f0a0185 100644 --- a/parm/soil/soil_letkf_config.yaml.j2 +++ b/parm/soil/soil_letkf_config.yaml.j2 @@ -1,7 +1,7 @@ jedi_config: soilletkfanl: rundir: '{{ DATA }}' - exe_src: '{{ EXECgdas }}/gdas.x' + exe_src: '{{ EXECglobal }}/gdas.x' mpi_cmd: '{{ APRUN_SOILLETKFANL }}' jedi_args: ['fv3jedi', 'localensembleda'] jcb_base_yaml: '{{ PARMglobal }}/gdas/soil/jcb-base.yaml.j2' @@ -110,6 +110,27 @@ data_out: copy_req: # Configuration files - ['{{ DATA }}/soilletkfanl.yaml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}soilletkfanl.yaml'] + + # ens mean increment + {% if SOIL_FILE_TYPE == 'csg' %} + - ['{{ DATA }}/anl/mem000/sfcinc_ensmean.{{ current_cycle | to_YMD }}_{{ current_cycle | strftime('%H') }}0000z.nc4', + '{{ COMOUT_ATMOS_ANALYSIS_ENS }}/{{ current_cycle | to_fv3time }}.soil_increment_gaussian.sfci006.nc'] + - ['{{ DATA }}/anl/mem000/sfcinc_ensmean.{{ current_cycle | to_YMD }}_{{ current_cycle | strftime('%H') }}0000z.nc4', + '{{ COMOUT_ATMOS_ANALYSIS_ENS }}/{{ APREFIX_ENS }}increment.sfc.i006.nc'] + {% else %} + - ['{{ DATA }}/anl/mem000/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', + '{{ COMOUT_ATMOS_ANALYSIS_ENS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile1.nc'] + - ['{{ DATA }}/anl/mem000/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', + '{{ COMOUT_ATMOS_ANALYSIS_ENS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile2.nc'] + - ['{{ DATA }}/anl/mem000/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', + '{{ COMOUT_ATMOS_ANALYSIS_ENS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile3.nc'] + - ['{{ DATA }}/anl/mem000/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', + '{{ COMOUT_ATMOS_ANALYSIS_ENS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile4.nc'] + - ['{{ DATA }}/anl/mem000/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', + '{{ COMOUT_ATMOS_ANALYSIS_ENS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile5.nc'] + - ['{{ DATA }}/anl/mem000/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', + '{{ COMOUT_ATMOS_ANALYSIS_ENS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile6.nc'] + {% endif %} {% for imem in range(1, NMEM_ENS+1) %} {% set memchar = 'mem%03d' | format(imem) %} @@ -120,15 +141,15 @@ data_out: '${MEMDIR}': 'mem%03d' | format(imem) }) %} # Increments {% if SOIL_FILE_TYPE == 'csg' %} - - ['{{ DATA }}/anl/{{ memchar }}/soilinc_{{ GPREFIX_ENS }}nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_increment_csg.sfci006.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/soilinc_{{ GPREFIX_ENS }}nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ APREFIX }}jedi_increment.sfc.i006.nc'] + #- ['{{ DATA }}/anl/{{ memchar }}/soilinc_{{ GPREFIX_ENS }}nc', + # '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_increment_csg.sfci006.nc'] + #- ['{{ DATA }}/anl/{{ memchar }}/soilinc_{{ GPREFIX_ENS }}nc', + # '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ APREFIX_ENS }}jedi_increment.sfc.i006.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/sfcinc.{{ current_cycle | to_YMD }}T{{ current_cycle | strftime('%H') }}0000Z.gaussian.modelLevels.nc', + - ['{{ DATA }}/anl/{{ memchar }}/sfcinc.{{ current_cycle | to_YMD }}_{{ current_cycle | strftime('%H') }}0000z.nc4', '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_increment_gaussian.sfci006.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/sfcinc.{{ current_cycle | to_YMD }}T{{ current_cycle | strftime('%H') }}0000Z.gaussian.modelLevels.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ APREFIX }}increment.sfc.i006.nc'] + - ['{{ DATA }}/anl/{{ memchar }}/sfcinc.{{ current_cycle | to_YMD }}_{{ current_cycle | strftime('%H') }}0000z.nc4', + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ APREFIX_ENS }}increment.sfc.i006.nc'] {% else %} - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile1.nc'] From 06157466b0139e1aea26f8ea8714ddc4be5cba6b Mon Sep 17 00:00:00 2001 From: tsga Date: Wed, 22 Jul 2026 15:41:47 +0000 Subject: [PATCH 67/98] update fv3-jedi --- sorc/fv3-jedi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sorc/fv3-jedi b/sorc/fv3-jedi index 642a9708b..75efc5586 160000 --- a/sorc/fv3-jedi +++ b/sorc/fv3-jedi @@ -1 +1 @@ -Subproject commit 642a9708b1e355012ad92c2e457a2e5815914ecb +Subproject commit 75efc5586050300d80cf5e7d83884b02c767c471 From 5637501df048b390ba9553f93fd344cc3aa0115a Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Tue, 28 Jul 2026 11:51:46 -0400 Subject: [PATCH 68/98] keep only soill1 --- .../soil_background_error_static_csg.yaml.j2 | 26 ------------------- 1 file changed, 26 deletions(-) diff --git a/parm/jcb-gdas/model/soil/soil_background_error_static_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_error_static_csg.yaml.j2 index 3a9fc043a..b5d12cef0 100644 --- a/parm/jcb-gdas/model/soil/soil_background_error_static_csg.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background_error_static_csg.yaml.j2 @@ -6,9 +6,7 @@ saber central block: universe length-scale: 250000.0 drivers: multivariate strategy: univariate - #compute nicas: true read global nicas: true - #write global nicas: true nicas: resolution: 6 max horizontal grid size: 250000 @@ -16,23 +14,14 @@ saber central block: horizontal length-scale: - groups: - soill1_shadowLevels - - soill2_shadowLevels - - soilt1_shadowLevels - - soilt2_shadowLevels value: 250000. vertical length-scale: - groups: - soill1_shadowLevels - - soill2_shadowLevels - - soilt1_shadowLevels - - soilt2_shadowLevels value: 0.0 interpolation type: - groups: - soill1_shadowLevels - - soill2_shadowLevels - - soilt1_shadowLevels - - soilt2_shadowLevels type: c0 same horizontal convolution: true io: @@ -43,12 +32,6 @@ saber outer blocks: fields metadata: soill1: vert_coord: filtered_orography - soill2: - vert_coord: filtered_orography - soilt1: - vert_coord: filtered_orography - soilt2: - vert_coord: filtered_orography calibration: number of shadow levels: 50 lowest shadow level: -450.0 @@ -64,12 +47,3 @@ saber outer blocks: - variables: - soill1 value: 0.05 - - variables: - - soill2 - value: 0.05 - - variables: - - soilt1 - value: 2.0 - - variables: - - soilt2 - value: 2.0 From aad5dd0b261963c429e24a79ede87763b4157240 Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Tue, 28 Jul 2026 11:53:40 -0400 Subject: [PATCH 69/98] keep only soilm --- .../soil_background_error_static_fv3.yaml.j2 | 25 ++----------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/parm/jcb-gdas/model/soil/soil_background_error_static_fv3.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_error_static_fv3.yaml.j2 index 8ff505ae3..c8cf686f5 100644 --- a/parm/jcb-gdas/model/soil/soil_background_error_static_fv3.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background_error_static_fv3.yaml.j2 @@ -1,13 +1,12 @@ covariance model: SABER saber central block: saber block name: BUMP_NICAS - read: #calibration + read: general: universe length-scale: 250000.0 drivers: multivariate strategy: univariate - read global nicas: true #compute nicas: true - #write global nicas: true + read global nicas: true nicas: resolution: 6 max horizontal grid size: 400000 @@ -15,26 +14,14 @@ saber central block: horizontal length-scale: - groups: - soilMoistureVolumetric - - slc - - stc - - air_temperature_at_2m - - specfic_humidity_at_2m value: 250000.0 vertical length-scale: - groups: - soilMoistureVolumetric - - slc - - stc - - air_temperature_at_2m - - specfic_humidity_at_2m value: 800.0 interpolation type: - groups: - soilMoistureVolumetric - - slc - - stc - - air_temperature_at_2m - - specfic_humidity_at_2m type: c0 same horizontal convolution: true io: @@ -51,14 +38,6 @@ saber outer blocks: - variables: - soilMoistureVolumetric value: 0.05 - - variables: - - slc - value: 0.05 - - variables: - - stc - value: 2.0 - - variables: - - air_temperature_at_2m value: 2.0 - variables: - specfic_humidity_at_2m From 927a62fc6927b4c1a6054a32fb949493b13d7e44 Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Tue, 28 Jul 2026 11:57:14 -0400 Subject: [PATCH 70/98] keep one static soil background error fv3 file --- .../soil/soil_background_error_fv3.yaml.j2 | 36 ------------------- 1 file changed, 36 deletions(-) delete mode 100644 parm/jcb-gdas/model/soil/soil_background_error_fv3.yaml.j2 diff --git a/parm/jcb-gdas/model/soil/soil_background_error_fv3.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_error_fv3.yaml.j2 deleted file mode 100644 index ba8169e71..000000000 --- a/parm/jcb-gdas/model/soil/soil_background_error_fv3.yaml.j2 +++ /dev/null @@ -1,36 +0,0 @@ -covariance model: SABER -saber central block: - saber block name: BUMP_NICAS - calibration: #read: - general: - universe length-scale: 5000000.0 - drivers: - multivariate strategy: univariate - compute nicas: true #read global nicas: true - write global nicas: true - nicas: - resolution: 4 - explicit length-scales: true - horizontal length-scale: - - groups: {{ soil_det_increment_variables }} - value: 1000000.0 - vertical length-scale: - - groups: {{ soil_det_increment_variables }} - value: 1500.0 - interpolation type: - - groups: {{ soil_det_increment_variables }} - type: c0 - same horizontal convolution: true - io: - data directory: ./berror - files prefix: smc_bump_nicas_1000km_{{ soil_background_time_fv3 }} -saber outer blocks: -- saber block name: BUMP_StdDev - read: - drivers: - compute variance: true - variance: - explicit stddev: true - stddev: - - variables: {{ soil_det_increment_variables }} - value: 0.2 From 22fa5f893dbd7c25ffe34c8942621a06f8ad4813 Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Tue, 28 Jul 2026 11:57:40 -0400 Subject: [PATCH 71/98] keep one static soil background error csg file --- .../soil/soil_background_error_csg.yaml.j2 | 73 ------------------- 1 file changed, 73 deletions(-) delete mode 100644 parm/jcb-gdas/model/soil/soil_background_error_csg.yaml.j2 diff --git a/parm/jcb-gdas/model/soil/soil_background_error_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_error_csg.yaml.j2 deleted file mode 100644 index d3f4cff32..000000000 --- a/parm/jcb-gdas/model/soil/soil_background_error_csg.yaml.j2 +++ /dev/null @@ -1,73 +0,0 @@ -covariance model: SABER -saber central block: - saber block name: BUMP_NICAS - read: - general: - universe length-scale: 250000.0 - drivers: - multivariate strategy: univariate - read global nicas: true - nicas: - resolution: 6 - max horizontal grid size: 400000 - explicit length-scales: true - horizontal length-scale: - - groups: - - soill1_shadowLevels - - soill2_shadowLevels - - soilt1_shadowLevels - - soilt2_shadowLevels - value: 250000.0 - vertical length-scale: - - groups: - - soill1_shadowLevels - - soill2_shadowLevels - - soilt1_shadowLevels - - soilt2_shadowLevels - value: 0.0 - interpolation type: - - groups: - - soill1_shadowLevels - - soill2_shadowLevels - - soilt1_shadowLevels - - soilt2_shadowLevels - type: c0 - same horizontal convolution: true - io: - data directory: ./berror - files prefix: smc_bump -saber outer blocks: -- saber block name: ShadowLevels - fields metadata: - soill1: - vert_coord: filtered_orography - soill2: - vert_coord: filtered_orography - soilt1: - vert_coord: filtered_orography - soilt2: - vert_coord: filtered_orography - calibration: - number of shadow levels: 50 - lowest shadow level: -450.0 - highest shadow level: 8850.0 - vertical length-scale: 800.0 -- saber block name: BUMP_StdDev - read: - drivers: - compute variance: true - variance: - explicit stddev: true - stddev: - - variables: - - soill1 - value: 0.05 - - variables: - - soill2 - value: 0.05 - - variables: - - soilt1 - value: 2.0 - - variables: - - soilt2 - value: 2.0 From 3feaca813e22c70ef0731a08f97b1f40074afc83 Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Tue, 28 Jul 2026 11:58:14 -0400 Subject: [PATCH 72/98] delete extra file --- .../model/soil/soil_background_fv3.yaml.j2 | 28 ------------------- 1 file changed, 28 deletions(-) delete mode 100644 parm/jcb-gdas/model/soil/soil_background_fv3.yaml.j2 diff --git a/parm/jcb-gdas/model/soil/soil_background_fv3.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_fv3.yaml.j2 deleted file mode 100644 index 6a5b14614..000000000 --- a/parm/jcb-gdas/model/soil/soil_background_fv3.yaml.j2 +++ /dev/null @@ -1,28 +0,0 @@ -datapath: {{ soil_background_path }} -filetype: fms restart -skip coupler file: true -datetime: '{{ soil_background_time_iso }}' -state variables: -- soilMoistureVolumetric -- slc -- stc -- totalSnowDepth -- sheleg -- vtype -- slmsk -- filtered_orography -- fraction_of_ice -- fraction_of_land -- air_temperature_at_2m -- specfic_humidity_at_2m -field io names: - soilMoistureVolumetric: smc - totalSnowDepth: snodl - filtered_orography: orog_filt - fraction_of_ice: fice - fraction_of_land: land_frac - air_temperature_at_2m: t2m - specfic_humidity_at_2m: q2m -filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' -filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' -filename_orog: '{{ soil_orog_prefix }}_oro_data.nc' From 49f57693a32712c4fd9735c4874f4e894c390997 Mon Sep 17 00:00:00 2001 From: tsga Date: Tue, 28 Jul 2026 16:09:42 +0000 Subject: [PATCH 73/98] Revert "delete extra file" This reverts commit 3feaca813e22c70ef0731a08f97b1f40074afc83. --- .../model/soil/soil_background_fv3.yaml.j2 | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 parm/jcb-gdas/model/soil/soil_background_fv3.yaml.j2 diff --git a/parm/jcb-gdas/model/soil/soil_background_fv3.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_fv3.yaml.j2 new file mode 100644 index 000000000..6a5b14614 --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_background_fv3.yaml.j2 @@ -0,0 +1,28 @@ +datapath: {{ soil_background_path }} +filetype: fms restart +skip coupler file: true +datetime: '{{ soil_background_time_iso }}' +state variables: +- soilMoistureVolumetric +- slc +- stc +- totalSnowDepth +- sheleg +- vtype +- slmsk +- filtered_orography +- fraction_of_ice +- fraction_of_land +- air_temperature_at_2m +- specfic_humidity_at_2m +field io names: + soilMoistureVolumetric: smc + totalSnowDepth: snodl + filtered_orography: orog_filt + fraction_of_ice: fice + fraction_of_land: land_frac + air_temperature_at_2m: t2m + specfic_humidity_at_2m: q2m +filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' +filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' +filename_orog: '{{ soil_orog_prefix }}_oro_data.nc' From a00411c569a1a4575eb1b1be0da03eb6e16f997c Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Tue, 28 Jul 2026 12:14:46 -0400 Subject: [PATCH 74/98] clean up --- .../soil/soil_final_increment_gaussian.yaml.j2 | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/parm/jcb-gdas/model/soil/soil_final_increment_gaussian.yaml.j2 b/parm/jcb-gdas/model/soil/soil_final_increment_gaussian.yaml.j2 index bb38f0ba8..68854fa9f 100644 --- a/parm/jcb-gdas/model/soil/soil_final_increment_gaussian.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_final_increment_gaussian.yaml.j2 @@ -1,10 +1,8 @@ grid type: regular gaussian local interpolator type: oops unstructured grid interpolator -number of latitude gridpoints: {{ (soil_npy_anl | int) - 1 }} #96 -#resolution in degrees: {{ soil_gaussian_latres }} #0.9375 +number of latitude gridpoints: {{ (soil_npy_anl | int) - 1 }} datapath: ./anl prefix: {{ soil_gaussian_increment_prefix }} -#filename: {{ soil_gaussian_increment_prefix }} all model levels: true date colons: false variables to output: @@ -17,17 +15,3 @@ field io names: soilt2: stc2_inc soill1: slc1_inc soill2: slc2_inc -#type: inc -#exp: 3dvar-soil - -#geometry: -# fms initialization: -# namelist filename: "{{ soil_fv3jedi_files_path }}/fmsmpp.nml" -# field table filename: "{{ soil_fv3jedi_files_path }}/field_table" -# akbk: "{{ soil_fv3jedi_files_path }}/akbk.nc4" -# layout: -# - {{ soil_layout_x }} -# - {{ soil_layout_y }} -# npx: {{ soil_npx_anl }} -# npy: {{ soil_npy_anl }} -# npz: {{ soil_npz_anl }} From daab17614bda930cabc0a88f55709c333da6e1d4 Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Tue, 28 Jul 2026 12:16:42 -0400 Subject: [PATCH 75/98] add comment on obs type Added comment regarding observer_type requirement. --- parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml b/parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml index 56ac32a34..57fc61b72 100644 --- a/parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml +++ b/parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml @@ -3,6 +3,7 @@ commissioned: 2015-04-01T00:00:00 #observer_type: satellite # Type of chronicle to use +# specifying this as satellite requires more info in obs yaml; so keeping it conventiona for now. observer_type: conventional # Type of chronicle to use window_option: max From 9d14d7e901f36cc2e3c506097a98579c55e420d9 Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Tue, 28 Jul 2026 12:20:09 -0400 Subject: [PATCH 76/98] remove extra commented lines and add reminder to fix obs name --- parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 b/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 index d984f919f..f2c0c6728 100644 --- a/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 +++ b/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 @@ -14,9 +14,6 @@ type: H5File obsfile: "{{soil_obsdatain_path}}/{{soil_obsdatain_prefix}}{{observation_from_jcb}}.nc" missing file action: warn -# obsgrouping: -# group variables: -# - stationIdentification obsdataout: write multiple files: false engine: @@ -25,7 +22,8 @@ allow overwrite: true io pool: max pool size: 1 - observed variables: + #TODO: change these to include alias names with SoilMoistureVolumetric + observed variables: - soill1 simulated variables: - soill1 @@ -34,9 +32,6 @@ # -------------------- obs operator: name: Identity -# linear obs operator: -# name: Identity - # # localization TODO: generalize this condioned on da algo # ------------ From 3c6a15135ab796fd3034e77e98d4c5fdaf4b1859 Mon Sep 17 00:00:00 2001 From: tsga Date: Tue, 28 Jul 2026 16:23:31 +0000 Subject: [PATCH 77/98] remove unused prep files --- parm/soil/prep/prepbufr_adpsfc.yaml | 501 ---------------------------- parm/soil/prep/prepbufr_sfcshp.yaml | 501 ---------------------------- 2 files changed, 1002 deletions(-) delete mode 100644 parm/soil/prep/prepbufr_adpsfc.yaml delete mode 100644 parm/soil/prep/prepbufr_sfcshp.yaml diff --git a/parm/soil/prep/prepbufr_adpsfc.yaml b/parm/soil/prep/prepbufr_adpsfc.yaml deleted file mode 100644 index c567ac46b..000000000 --- a/parm/soil/prep/prepbufr_adpsfc.yaml +++ /dev/null @@ -1,501 +0,0 @@ -# (C) Copyright 2024 NOAA/NWS/NCEP/EMC -# -# 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. - -observations: - - obs space: - name: bufr - obsdatain: "./prepbufr" - - exports: - #group_by_variable: prepbufrDataLvlCat - subsets: - - ADPSFC # SURFACE LAND (SYNOPTIC, METAR) REPORTS - #- SFCSHP # SURFACE MARINE (SHIP, BUOY, C-MAN/TIGE GAUGE PLATFORM) REPORTS - variables: - # MetaData - timestamp: - timeoffset: - timeOffset: "*/DHR" - transforms: - - scale: 3600 - referenceTime: "2024-06-01T00:00:00Z" - timeOffset: - query: "*/DHR" - transforms: - - scale: 3600 - longitude: - query: "*/XOB" - latitude: - query: "*/YOB" - stationIdentification: - query: "*/SID" - stationElevation: - query: "*/ELV" - #type: float - prepbufrReportType: - query: "*/TYP" - dumpReportType: - query: "*/T29" - prepbufrDataLvlCat: - query: "*/CAT" - - pressure: - query: "*/P___INFO/P__EVENT{1}/POB" - transforms: - - scale: 100 - stationPressure: - query: "*/P___INFO/P__EVENT{1}/POB" - transforms: - - scale: 100 - stationPressureQualityMarker: - query: "*/P___INFO/P__EVENT{1}/PQM" - stationPressureError: - query: "*/P___INFO/P__BACKG/POE" - transforms: - - scale: 100 - stationPressureTunedError: - query: "*/P___INFO/P__POSTP/POETU" - transforms: - - scale: 100 - - heightOfObservation: - query: "*/Z___INFO/Z__EVENT{1}/ZOB" - #type: float - heightOfObservationQualityMark: - query: "*/Z___INFO/Z__EVENT{1}/ZQM" - - specificHumidity: - query: "*/Q___INFO/Q__EVENT{1}/QOB" - type: float - transforms: - - scale: 0.000001 - # Assign fake Q errors - specificHumidityError: - query: "*/Q___INFO/Q__EVENT{1}/QOB" - type: float - transforms: - - scale: 0.0 - - offset: 999 - specificHumidityQualityMarker: - query: "*/Q___INFO/Q__EVENT{1}/QQM" - relativeHumidityError: - query: "*/Q___INFO/Q__BACKG/QOE" - transforms: - - scale: 0.1 - relativeHumidityTunedError: - query: "*/Q___INFO/Q__POSTP/QOETU" - transforms: - - scale: 0.1 - - dewpointTemperature: - query: "*/Q___INFO/TDO" - transforms: - - offset: 273.15 - - airTemperature: - query: "*/T___INFO/T__EVENT{1}/TOB" - transforms: - - offset: 273.15 - airTemperatureQualityMarker: - query: "*/T___INFO/T__EVENT{1}/TQM" - airTemperatureError: - query: "*/T___INFO/T__BACKG/TOE" - airTemperatureTunedError: - query: "*/T___INFO/T__POSTP/TOETU" - - windEastward: - query: "*/W___INFO/W__EVENT{1}/UOB" - windNorthward: - query: "*/W___INFO/W__EVENT{1}/VOB" - windQualityMarker: - query: "*/W___INFO/W__EVENT{1}/WQM" - windError: - query: "*/W___INFO/W__BACKG/WOE" - windTunedError: - query: "*/W___INFO/W__POSTP/WOETU" - transform: - - scale: 0.514444 - - pressureReducedToMeanSeaLevel: - query: "*/PMSL_SEQ/PMO" - transforms: - - scale: 100 - pressureReducedToMeanSeaLevelQualityMarker: - query: "*/PMSL_SEQ/PMQ" - - seaTemperature: - query: "*/SST_INFO/SSTEVENT{1}/SST1" - seaTemperatureQualityMarker: - query: "*/SST_INFO/SSTEVENT{1}/SSTQM" - seaTemperatureError: - query: "*/SST_INFO/SSTBACKG/SSTOE" - seaTemperatureMethod: - query: "*/SST_INFO/MSST" - depthBelowSeaSurface: - query: "*/SST_INFO/DBSS_SEQ/DBSS" - type: float - heightOfWaves: - query: "*/WAVE_SEQ/HOWV" - type: float - - presentWeather: - query: "*/PREWXSEQ{1}/PRWE" - - maximumWindGustSpeed: - query: "*/GUST1SEQ/MXGS" - - verticalSignificance: - query: "*/CLOUDSEQ{1}/VSSO" - cloudAmount: - query: "*/CLOUDSEQ{1}/CLAM" - heightOfBaseOfCloud: - query: "*/CLOUDSEQ{1}/HOCB" - type: float - cloudCoverTotal: - query: "*/CLOU2SEQ{1}/TOCC" - type: float - transforms: - - scale: 0.01 - heightAboveSurfaceOfBaseOfLowestCloud: - query: "*/CLOU2SEQ/HBLCS" - - ioda: - backend: netcdf - obsdataout: "./ioda_adpsfc.nc" - - dimensions: - - name: pevent_Dim - path: "*/P___INFO/P__EVENT" - - name: qevent_Dim - path: "*/Q___INFO/Q__EVENT" - - name: tevent_Dim - path: "*/T___INFO/T__EVENT" - - name: wevent_Dim - path: "*/W___INFO/W__EVENT" - - name: zevent_Dim - path: "*/Z___INFO/Z__EVENT" - - - variables: - - # MetaData - - name: "MetaData/dateTime" - coordinates: "longitude latitude" - source: variables/timestamp - longName: "Observation Time" - units: "seconds since 1970-01-01T00:00:00Z" - - - name: "MetaData/timeOffset" - coordinates: "longitude latitude" - source: variables/timeOffset - longName: "Observation Time Minus Reference Time" - units: "s" - - - name: "MetaData/stationIdentification" - coordinates: "longitude latitude" - source: variables/stationIdentification - longName: "Station ID" - units: "" - - - name: "MetaData/longitude" - coordinates: "longitude latitude" - source: variables/longitude - longName: "Longitude" - units: "degree_east" - range: [0, 360] - - - name: "MetaData/latitude" - coordinates: "longitude latitude" - source: variables/latitude - longName: "Latitude" - units: "degree_north" - range: [-90, 90] - - - name: "MetaData/stationElevation" - coordinates: "longitude latitude" - source: variables/stationElevation - longName: "Elevation of Station" - units: "m" - - - name: "MetaData/prepbufrReportType" - coordinates: "longitude latitude" - source: variables/prepbufrReportType - longName: "Prepbufr Report Type" - units: "" - - - name: "MetaData/dumpReportType" - coordinates: "longitude latitude" - source: variables/dumpReportType - longName: "Data Dump Report Type" - units: "" - - - name: "MetaData/prepbufrDataLvlCat" - coordinates: "longitude latitude" - source: variables/prepbufrDataLvlCat - longName: "Prepbufr Data Level Category" - units: "" - - - name: "MetaData/seaTemperatureMethod" - coordinates: "longitude latitude" - source: variables/seaTemperatureMethod - longName: "Method of Sea Temperature Measurement" - units: "" - - - name: "MetaData/height" - coordinates: "longitude latitude" - source: variables/heightOfObservation - longName: "Height" - units: "m" - - - name: "MetaData/pressure" - coordinates: "longitude latitude" - source: variables/pressure - longName: "Pressure" - units: "Pa" - - # ObsType - - name: "ObsType/specificHumidity" - coordinates: "longitude latitude" - source: variables/prepbufrReportType - longName: "specificHumidity Report Type" - units: "" - - - name: "ObsType/airTemperature" - coordinates: "longitude latitude" - source: variables/prepbufrReportType - longName: "airTemperature report Type" - units: "" - - - name: "ObsType/windEastward" - coordinates: "longitude latitude" - source: variables/prepbufrReportType - longName: "windEastward Report Type" - units: "" - - - name: "ObsType/windNorthward" - coordinates: "longitude latitude" - source: variables/prepbufrReportType - longName: "windNorthward Report Type" - units: "" - - - name: "ObsType/stationPressure" - coordinates: "longitude latitude" - source: variables/prepbufrReportType - longName: "Pressure" - units: "" - - # ObsValue - - name: "ObsValue/specificHumidity" - coordinates: "longitude latitude" - source: variables/specificHumidity - longName: "Specific Humidity" - units: "Kilogram Kilogram-1" - - - name: "ObsValue/airTemperature" - coordinates: "longitude latitude" - source: variables/airTemperature - longName: "Temperature" - units: "K" - - - name: "ObsValue/dewpointTemperature" - coordinates: "longitude latitude" - source: variables/dewpointTemperature - longName: "Dewpoint Temperature" - units: "K" - - - name: "ObsValue/windEastward" - coordinates: "longitude latitude" - source: variables/windEastward - longName: "Eastward Wind" - units: "m s-1" - - - name: "ObsValue/windNorthward" - coordinates: "longitude latitude" - source: variables/windNorthward - longName: "Northward Wind" - units: "m s-1" - - - name: "ObsValue/stationPressure" - coordinates: "longitude latitude" - source: variables/stationPressure - longName: "Station Pressure" - units: "Pa" - - - name: "ObsValue/pressureReducedToMeanSeaLevel" - coordinates: "longitude latitude" - source: variables/pressureReducedToMeanSeaLevel - longName: "Mean Sea-Level Pressure" - units: "Pa" - - - name: "ObsValue/seaTemperature" - coordinates: "longitude latitude" - source: variables/seaTemperature - longName: "Sea Temperature" - units: "K" - - - name: "ObsValue/depthBelowSeaSurface" - coordinates: "longitude latitude" - source: variables/depthBelowSeaSurface - longName: "Depth Below Sea Surface" - units: "m" - - - name: "ObsValue/heightOfWaves" - coordinates: "longitude latitude" - source: variables/heightOfWaves - longName: "Height of Waves" - units: "m" - - - name: "ObsValue/presentWeather" - coordinates: "longitude latitude" - source: variables/presentWeather - longName: "Description of Present Weather" - - - name: "ObsValue/maximumWindGustSpeed" - coordinates: "longitude latitude" - source: variables/maximumWindGustSpeed - longName: "Maximum Wind Gust Speed" - units: "m s-1" - - - name: "ObsValue/verticalSignificance" - coordinates: "longitude latitude" - source: variables/verticalSignificance - longName: "Description of Vertical Significance (Surface Observations)" - - - name: "ObsValue/cloudAmount" - coordinates: "longitude latitude" - source: variables/cloudAmount - longName: "Description of Cloud Amount" - - - name: "ObsValue/heightOfBaseOfCloud" - coordinates: "longitude latitude" - source: variables/heightOfBaseOfCloud - longName: "Height of Base of Cloud" - units: "m" - - - name: "ObsValue/cloudCoverTotal" - coordinates: "longitude latitude" - source: variables/cloudCoverTotal - longName: "Total Cloud Coverage" - units: "1" - - - name: "ObsValue/heightAboveSurfaceOfBaseOfLowestCloud" - coordinates: "longitude latitude" - source: variables/heightAboveSurfaceOfBaseOfLowestCloud - longName: "Height above Surface of Base of Lowest Cloud Seen" - - # Quality Marker - - name: "QualityMarker/stationPressure" - coordinates: "longitude latitude" - source: variables/stationPressureQualityMarker - longName: "Pressure Quality Marker" - - - name: "QualityMarker/height" - coordinates: "longitude latitude" - source: variables/heightOfObservationQualityMark - longName: "Height Quality Marker" - - - name: "QualityMarker/specificHumidity" - coordinates: "longitude latitude" - source: variables/specificHumidityQualityMarker - longName: "Specific Humidity Quality Marker" - - - name: "QualityMarker/airTemperature" - coordinates: "longitude latitude" - source: variables/airTemperatureQualityMarker - longName: "Temperature Quality Marker" - - - name: "QualityMarker/windEastward" - coordinates: "longitude latitude" - source: variables/windQualityMarker - longName: "windEastward Quality Marker" - - - name: "QualityMarker/windNorthward" - coordinates: "longitude latitude" - source: variables/windQualityMarker - longName: "windNorthward Quality Marker" - - - name: "QualityMarker/pressureReducedToMeanSeaLevel" - coordinates: "longitude latitude" - source: variables/pressureReducedToMeanSeaLevelQualityMarker - longName: "Mean Sea Level Pressure Quality Marker" - - - name: "QualityMarker/seaTemperature" - coordinates: "longitude latitude" - source: variables/seaTemperatureQualityMarker - longName: "Sea Temperature Quality Marker" - - # ObsError - - name: "ObsError/stationPressure" - coordinates: "longitude latitude" - source: variables/stationPressureError - longName: "Pressure Observation Error" - units: "Pa" - - - name: "ObsError/specificHumidity" - coordinates: "longitude latitude" - source: variables/specificHumidityError - longName: "Specific Humidity Error" - units: "kg kg-1" - - - name: "ObsError/relativeHumidity" - coordinates: "longitude latitude" - source: variables/relativeHumidityError - longName: "Relative Humidity Error" - units: "1" - - - name: "ObsError/airTemperature" - coordinates: "longitude latitude" - source: variables/airTemperatureError - longName: "Temperature Error" - units: "K" - - - name: "ObsError/windEastward" - coordinates: "longitude latitude" - source: variables/windError - longName: "Eastward wind error" - units: "m s-1" - - - name: "ObsError/windNorthward" - coordinates: "longitude latitude" - source: variables/windError - longName: "Northward wind error" - units: "m s-1" - - - name: "ObsError/seaTemperature" - coordinates: "longitude latitude" - source: variables/seaTemperatureError - longName: "Sea Temperature Observation Error" - units: "K" - -# # Tuned ObsError -# - name: "TunedObsError/stationPressure" -# coordinates: "longitude latitude" -# source: variables/stationPressureTunedError -# longName: "Analysis-Tuned Pressure Observation Error" -# units: "Pa" -# -# - name: "TunedObsError/relativeHumidity" -# coordinates: "longitude latitude" -# source: variables/relativeHumidityTunedError -# longName: "Analysis-Tuned Relative Humidity Error" -# units: "1" -# -# - name: "TunedObsError/airTemperature" -# coordinates: "longitude latitude" -# source: variables/airTemperatureTunedError -# longName: "Analysis-Tuned Temperature Error" -# units: "K" -# -# - name: "TunedObsError/windEastward" -# coordinates: "longitude latitude" -# source: variables/windTunedError -# longName: "Analysis-Tuned Eastward wind error" -# units: "m s-1" -# -# - name: "TunedObsError/windNorthward" -# coordinates: "longitude latitude" -# source: variables/windTunedError -# longName: "Analysis-Tuned Northward wind error" -# units: "m s-1" diff --git a/parm/soil/prep/prepbufr_sfcshp.yaml b/parm/soil/prep/prepbufr_sfcshp.yaml deleted file mode 100644 index 7b84ea004..000000000 --- a/parm/soil/prep/prepbufr_sfcshp.yaml +++ /dev/null @@ -1,501 +0,0 @@ -# (C) Copyright 2024 NOAA/NWS/NCEP/EMC -# -# 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. - -observations: - - obs space: - name: bufr - obsdatain: "./prepbufr" - - exports: - #group_by_variable: prepbufrDataLvlCat - subsets: - #- ADPSFC # SURFACE LAND (SYNOPTIC, METAR) REPORTS - - SFCSHP # SURFACE MARINE (SHIP, BUOY, C-MAN/TIGE GAUGE PLATFORM) REPORTS - variables: - # MetaData - timestamp: - timeoffset: - timeOffset: "*/DHR" - transforms: - - scale: 3600 - referenceTime: "2024-06-01T00:00:00Z" - timeOffset: - query: "*/DHR" - transforms: - - scale: 3600 - longitude: - query: "*/XOB" - latitude: - query: "*/YOB" - stationIdentification: - query: "*/SID" - stationElevation: - query: "*/ELV" - #type: float - prepbufrReportType: - query: "*/TYP" - dumpReportType: - query: "*/T29" - prepbufrDataLvlCat: - query: "*/CAT" - - pressure: - query: "*/P___INFO/P__EVENT{1}/POB" - transforms: - - scale: 100 - stationPressure: - query: "*/P___INFO/P__EVENT{1}/POB" - transforms: - - scale: 100 - stationPressureQualityMarker: - query: "*/P___INFO/P__EVENT{1}/PQM" - stationPressureError: - query: "*/P___INFO/P__BACKG/POE" - transforms: - - scale: 100 - stationPressureTunedError: - query: "*/P___INFO/P__POSTP/POETU" - transforms: - - scale: 100 - - heightOfObservation: - query: "*/Z___INFO/Z__EVENT{1}/ZOB" - #type: float - heightOfObservationQualityMark: - query: "*/Z___INFO/Z__EVENT{1}/ZQM" - - specificHumidity: - query: "*/Q___INFO/Q__EVENT{1}/QOB" - type: float - transforms: - - scale: 0.000001 - # Assign fake Q errors - specificHumidityError: - query: "*/Q___INFO/Q__EVENT{1}/QOB" - type: float - transforms: - - scale: 0.0 - - offset: 999 - specificHumidityQualityMarker: - query: "*/Q___INFO/Q__EVENT{1}/QQM" - relativeHumidityError: - query: "*/Q___INFO/Q__BACKG/QOE" - transforms: - - scale: 0.1 - relativeHumidityTunedError: - query: "*/Q___INFO/Q__POSTP/QOETU" - transforms: - - scale: 0.1 - - dewpointTemperature: - query: "*/Q___INFO/TDO" - transforms: - - offset: 273.15 - - airTemperature: - query: "*/T___INFO/T__EVENT{1}/TOB" - transforms: - - offset: 273.15 - airTemperatureQualityMarker: - query: "*/T___INFO/T__EVENT{1}/TQM" - airTemperatureError: - query: "*/T___INFO/T__BACKG/TOE" - airTemperatureTunedError: - query: "*/T___INFO/T__POSTP/TOETU" - - windEastward: - query: "*/W___INFO/W__EVENT{1}/UOB" - windNorthward: - query: "*/W___INFO/W__EVENT{1}/VOB" - windQualityMarker: - query: "*/W___INFO/W__EVENT{1}/WQM" - windError: - query: "*/W___INFO/W__BACKG/WOE" - windTunedError: - query: "*/W___INFO/W__POSTP/WOETU" - transform: - - scale: 0.514444 - - pressureReducedToMeanSeaLevel: - query: "*/PMSL_SEQ/PMO" - transforms: - - scale: 100 - pressureReducedToMeanSeaLevelQualityMarker: - query: "*/PMSL_SEQ/PMQ" - - seaTemperature: - query: "*/SST_INFO/SSTEVENT{1}/SST1" - seaTemperatureQualityMarker: - query: "*/SST_INFO/SSTEVENT{1}/SSTQM" - seaTemperatureError: - query: "*/SST_INFO/SSTBACKG/SSTOE" - seaTemperatureMethod: - query: "*/SST_INFO/MSST" - depthBelowSeaSurface: - query: "*/SST_INFO/DBSS_SEQ/DBSS" - type: float - heightOfWaves: - query: "*/WAVE_SEQ/HOWV" - type: float - - presentWeather: - query: "*/PREWXSEQ{1}/PRWE" - - maximumWindGustSpeed: - query: "*/GUST1SEQ/MXGS" - - verticalSignificance: - query: "*/CLOUDSEQ{1}/VSSO" - cloudAmount: - query: "*/CLOUDSEQ{1}/CLAM" - heightOfBaseOfCloud: - query: "*/CLOUDSEQ{1}/HOCB" - type: float - cloudCoverTotal: - query: "*/CLOU2SEQ{1}/TOCC" - type: float - transforms: - - scale: 0.01 - heightAboveSurfaceOfBaseOfLowestCloud: - query: "*/CLOU2SEQ/HBLCS" - - ioda: - backend: netcdf - obsdataout: "./ioda_sfcshp.nc" - - dimensions: - - name: pevent_Dim - path: "*/P___INFO/P__EVENT" - - name: qevent_Dim - path: "*/Q___INFO/Q__EVENT" - - name: tevent_Dim - path: "*/T___INFO/T__EVENT" - - name: wevent_Dim - path: "*/W___INFO/W__EVENT" - - name: zevent_Dim - path: "*/Z___INFO/Z__EVENT" - - - variables: - - # MetaData - - name: "MetaData/dateTime" - coordinates: "longitude latitude" - source: variables/timestamp - longName: "Observation Time" - units: "seconds since 1970-01-01T00:00:00Z" - - - name: "MetaData/timeOffset" - coordinates: "longitude latitude" - source: variables/timeOffset - longName: "Observation Time Minus Reference Time" - units: "s" - - - name: "MetaData/stationIdentification" - coordinates: "longitude latitude" - source: variables/stationIdentification - longName: "Station ID" - units: "" - - - name: "MetaData/longitude" - coordinates: "longitude latitude" - source: variables/longitude - longName: "Longitude" - units: "degree_east" - range: [0, 360] - - - name: "MetaData/latitude" - coordinates: "longitude latitude" - source: variables/latitude - longName: "Latitude" - units: "degree_north" - range: [-90, 90] - - - name: "MetaData/stationElevation" - coordinates: "longitude latitude" - source: variables/stationElevation - longName: "Elevation of Station" - units: "m" - - - name: "MetaData/prepbufrReportType" - coordinates: "longitude latitude" - source: variables/prepbufrReportType - longName: "Prepbufr Report Type" - units: "" - - - name: "MetaData/dumpReportType" - coordinates: "longitude latitude" - source: variables/dumpReportType - longName: "Data Dump Report Type" - units: "" - - - name: "MetaData/prepbufrDataLvlCat" - coordinates: "longitude latitude" - source: variables/prepbufrDataLvlCat - longName: "Prepbufr Data Level Category" - units: "" - - - name: "MetaData/seaTemperatureMethod" - coordinates: "longitude latitude" - source: variables/seaTemperatureMethod - longName: "Method of Sea Temperature Measurement" - units: "" - - - name: "MetaData/height" - coordinates: "longitude latitude" - source: variables/heightOfObservation - longName: "Height" - units: "m" - - - name: "MetaData/pressure" - coordinates: "longitude latitude" - source: variables/pressure - longName: "Pressure" - units: "Pa" - - # ObsType - - name: "ObsType/specificHumidity" - coordinates: "longitude latitude" - source: variables/prepbufrReportType - longName: "specificHumidity Report Type" - units: "" - - - name: "ObsType/airTemperature" - coordinates: "longitude latitude" - source: variables/prepbufrReportType - longName: "airTemperature report Type" - units: "" - - - name: "ObsType/windEastward" - coordinates: "longitude latitude" - source: variables/prepbufrReportType - longName: "windEastward Report Type" - units: "" - - - name: "ObsType/windNorthward" - coordinates: "longitude latitude" - source: variables/prepbufrReportType - longName: "windNorthward Report Type" - units: "" - - - name: "ObsType/stationPressure" - coordinates: "longitude latitude" - source: variables/prepbufrReportType - longName: "Pressure" - units: "" - - # ObsValue - - name: "ObsValue/specificHumidity" - coordinates: "longitude latitude" - source: variables/specificHumidity - longName: "Specific Humidity" - units: "Kilogram Kilogram-1" - - - name: "ObsValue/airTemperature" - coordinates: "longitude latitude" - source: variables/airTemperature - longName: "Temperature" - units: "K" - - - name: "ObsValue/dewpointTemperature" - coordinates: "longitude latitude" - source: variables/dewpointTemperature - longName: "Dewpoint Temperature" - units: "K" - - - name: "ObsValue/windEastward" - coordinates: "longitude latitude" - source: variables/windEastward - longName: "Eastward Wind" - units: "m s-1" - - - name: "ObsValue/windNorthward" - coordinates: "longitude latitude" - source: variables/windNorthward - longName: "Northward Wind" - units: "m s-1" - - - name: "ObsValue/stationPressure" - coordinates: "longitude latitude" - source: variables/stationPressure - longName: "Station Pressure" - units: "Pa" - - - name: "ObsValue/pressureReducedToMeanSeaLevel" - coordinates: "longitude latitude" - source: variables/pressureReducedToMeanSeaLevel - longName: "Mean Sea-Level Pressure" - units: "Pa" - - - name: "ObsValue/seaTemperature" - coordinates: "longitude latitude" - source: variables/seaTemperature - longName: "Sea Temperature" - units: "K" - - - name: "ObsValue/depthBelowSeaSurface" - coordinates: "longitude latitude" - source: variables/depthBelowSeaSurface - longName: "Depth Below Sea Surface" - units: "m" - - - name: "ObsValue/heightOfWaves" - coordinates: "longitude latitude" - source: variables/heightOfWaves - longName: "Height of Waves" - units: "m" - - - name: "ObsValue/presentWeather" - coordinates: "longitude latitude" - source: variables/presentWeather - longName: "Description of Present Weather" - - - name: "ObsValue/maximumWindGustSpeed" - coordinates: "longitude latitude" - source: variables/maximumWindGustSpeed - longName: "Maximum Wind Gust Speed" - units: "m s-1" - - - name: "ObsValue/verticalSignificance" - coordinates: "longitude latitude" - source: variables/verticalSignificance - longName: "Description of Vertical Significance (Surface Observations)" - - - name: "ObsValue/cloudAmount" - coordinates: "longitude latitude" - source: variables/cloudAmount - longName: "Description of Cloud Amount" - - - name: "ObsValue/heightOfBaseOfCloud" - coordinates: "longitude latitude" - source: variables/heightOfBaseOfCloud - longName: "Height of Base of Cloud" - units: "m" - - - name: "ObsValue/cloudCoverTotal" - coordinates: "longitude latitude" - source: variables/cloudCoverTotal - longName: "Total Cloud Coverage" - units: "1" - - - name: "ObsValue/heightAboveSurfaceOfBaseOfLowestCloud" - coordinates: "longitude latitude" - source: variables/heightAboveSurfaceOfBaseOfLowestCloud - longName: "Height above Surface of Base of Lowest Cloud Seen" - - # Quality Marker - - name: "QualityMarker/stationPressure" - coordinates: "longitude latitude" - source: variables/stationPressureQualityMarker - longName: "Pressure Quality Marker" - - - name: "QualityMarker/height" - coordinates: "longitude latitude" - source: variables/heightOfObservationQualityMark - longName: "Height Quality Marker" - - - name: "QualityMarker/specificHumidity" - coordinates: "longitude latitude" - source: variables/specificHumidityQualityMarker - longName: "Specific Humidity Quality Marker" - - - name: "QualityMarker/airTemperature" - coordinates: "longitude latitude" - source: variables/airTemperatureQualityMarker - longName: "Temperature Quality Marker" - - - name: "QualityMarker/windEastward" - coordinates: "longitude latitude" - source: variables/windQualityMarker - longName: "windEastward Quality Marker" - - - name: "QualityMarker/windNorthward" - coordinates: "longitude latitude" - source: variables/windQualityMarker - longName: "windNorthward Quality Marker" - - - name: "QualityMarker/pressureReducedToMeanSeaLevel" - coordinates: "longitude latitude" - source: variables/pressureReducedToMeanSeaLevelQualityMarker - longName: "Mean Sea Level Pressure Quality Marker" - - - name: "QualityMarker/seaTemperature" - coordinates: "longitude latitude" - source: variables/seaTemperatureQualityMarker - longName: "Sea Temperature Quality Marker" - - # ObsError - - name: "ObsError/stationPressure" - coordinates: "longitude latitude" - source: variables/stationPressureError - longName: "Pressure Observation Error" - units: "Pa" - - - name: "ObsError/specificHumidity" - coordinates: "longitude latitude" - source: variables/specificHumidityError - longName: "Specific Humidity Error" - units: "kg kg-1" - - - name: "ObsError/relativeHumidity" - coordinates: "longitude latitude" - source: variables/relativeHumidityError - longName: "Relative Humidity Error" - units: "1" - - - name: "ObsError/airTemperature" - coordinates: "longitude latitude" - source: variables/airTemperatureError - longName: "Temperature Error" - units: "K" - - - name: "ObsError/windEastward" - coordinates: "longitude latitude" - source: variables/windError - longName: "Eastward wind error" - units: "m s-1" - - - name: "ObsError/windNorthward" - coordinates: "longitude latitude" - source: variables/windError - longName: "Northward wind error" - units: "m s-1" - - - name: "ObsError/seaTemperature" - coordinates: "longitude latitude" - source: variables/seaTemperatureError - longName: "Sea Temperature Observation Error" - units: "K" - -# # Tuned ObsError -# - name: "TunedObsError/stationPressure" -# coordinates: "longitude latitude" -# source: variables/stationPressureTunedError -# longName: "Analysis-Tuned Pressure Observation Error" -# units: "Pa" -# -# - name: "TunedObsError/relativeHumidity" -# coordinates: "longitude latitude" -# source: variables/relativeHumidityTunedError -# longName: "Analysis-Tuned Relative Humidity Error" -# units: "1" -# -# - name: "TunedObsError/airTemperature" -# coordinates: "longitude latitude" -# source: variables/airTemperatureTunedError -# longName: "Analysis-Tuned Temperature Error" -# units: "K" -# -# - name: "TunedObsError/windEastward" -# coordinates: "longitude latitude" -# source: variables/windTunedError -# longName: "Analysis-Tuned Eastward wind error" -# units: "m s-1" -# -# - name: "TunedObsError/windNorthward" -# coordinates: "longitude latitude" -# source: variables/windTunedError -# longName: "Analysis-Tuned Northward wind error" -# units: "m s-1" From 317ee3f2ecfd3b42cffb48fd76b34ea6e0dbbcca Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Thu, 30 Jul 2026 09:23:03 -0400 Subject: [PATCH 78/98] Use alias in variable mapping for SMAP SMC --- parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 b/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 index f2c0c6728..e28bc9d74 100644 --- a/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 +++ b/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 @@ -23,10 +23,11 @@ io pool: max pool size: 1 #TODO: change these to include alias names with SoilMoistureVolumetric - observed variables: - - soill1 simulated variables: - soill1 + variable maps: + - name: soilMoistureVolumetric + alias: soill1 # Observation Operator # -------------------- From e8cb5837053112e01292cca51cc2b274669ecea0 Mon Sep 17 00:00:00 2001 From: tsga Date: Thu, 30 Jul 2026 19:56:58 +0000 Subject: [PATCH 79/98] update submodule link to develop --- .gitmodules | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitmodules b/.gitmodules index 0b604936e..adc55563c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -36,15 +36,15 @@ [submodule "sorc/fv3-jedi"] path = sorc/fv3-jedi url = https://github.com/jcsda/fv3-jedi.git - branch = feature/add_soil_layers_fields #develop + branch = develop [submodule "sorc/soca"] path = sorc/soca url = https://github.com/NOAA-EMC/soca.git branch = dev/emc [submodule "sorc/land-jediincr"] path = sorc/land-jediincr - url = https://github.com/tsga/land-apply_jedi_incr #https://github.com/NOAA-EMC/land-apply_jedi_incr.git - branch = soilinc #develop + url = https://github.com/NOAA-EMC/land-apply_jedi_incr.git + branch = develop [submodule "sorc/crtm"] path = sorc/crtm url = https://github.com/jcsda/crtm.git From 337ed941a34ec4c0bdf6f58aefb2143eb73c3249 Mon Sep 17 00:00:00 2001 From: tsga Date: Thu, 30 Jul 2026 20:05:46 +0000 Subject: [PATCH 80/98] update fv3-jedi --- sorc/fv3-jedi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sorc/fv3-jedi b/sorc/fv3-jedi index 75efc5586..7da2854f8 160000 --- a/sorc/fv3-jedi +++ b/sorc/fv3-jedi @@ -1 +1 @@ -Subproject commit 75efc5586050300d80cf5e7d83884b02c767c471 +Subproject commit 7da2854f80eafb8906a035bc886413ab1db841f4 From 04c5cf42d4cb0ebb0894853a7a58aa5e8784a241 Mon Sep 17 00:00:00 2001 From: tsga Date: Thu, 30 Jul 2026 20:34:57 +0000 Subject: [PATCH 81/98] simplify: remove T2m and support only csg files --- parm/soil/jcb-base.yaml.j2 | 61 +++---------- parm/soil/soil_det_config.yaml.j2 | 60 ------------- parm/soil/soil_letkf_config.yaml.j2 | 127 +--------------------------- 3 files changed, 16 insertions(+), 232 deletions(-) diff --git a/parm/soil/jcb-base.yaml.j2 b/parm/soil/jcb-base.yaml.j2 index 21d823848..5b0b4cf79 100644 --- a/parm/soil/jcb-base.yaml.j2 +++ b/parm/soil/jcb-base.yaml.j2 @@ -11,21 +11,18 @@ app_path_observation_chronicle: "{{PARMglobal}}/gdas/jcb-gdas/observation_chroni # ------------------------------------------------------------ model_file: model_pseudo initial_condition_file: background # Initial conditions for 4D apps is background -# file type csg or fv3 -{% set _file_type = SOIL_FILE_TYPE %} -final_increment_file: soil_final_increment_{{ _file_type }} -#final_increment_file: soil_final_increment_gaussian -output_mean_prior_file: soil_output_mean_prior_{{ _file_type }} -posterior_output_file: soil_posterior_output_{{ _file_type }} -#output_ensemble_increments_file: soil_ensemble_increments_{{ _file_type }} -#output_increment_file: soil_output_increment_{{ _file_type }} -output_variance_prior_file: soil_output_variance_prior_{{ _file_type }} -output_variance_posterior_file: soil_output_variance_posterior_{{ _file_type }} +final_increment_file: soil_final_increment_csg +output_mean_prior_file: soil_output_mean_prior_csg +posterior_output_file: soil_posterior_output_csg +output_ensemble_increments_file: soil_ensemble_increments_csg +output_increment_file: soil_output_increment_csg +output_variance_prior_file: soil_output_variance_prior_csg +output_variance_posterior_file: soil_output_variance_posterior_csg #jedi_increment_output: gaussian final_increment_to_latlon_file: soil_final_increment_gaussian #final_analysis_to_latlon_file: soil_final_analysis_latlon -output_ensemble_increments_file: soil_ensemble_increments_gaussian -output_increment_file: soil_output_increment_gaussian +#output_ensemble_increments_file: soil_ensemble_increments_gaussian +#output_increment_file: soil_output_increment_gaussian # Assimilation window # ------------------- @@ -52,49 +49,23 @@ cost_type: 3D-Var number_of_outer_loops: 1 # Analysis variables -{% set _analysis_vars_csg = ['soill1', - 'soill2', - 'soilt1', - 'soilt2'] %} -# 'air_temperature_at_2m', -# 'specfic_humidity_at_2m'] %} -{% set _analysis_vars_fv3 = ['soilMoistureVolumetric', 'stc', 'air_temperature_at_2m', 'specfic_humidity_at_2m'] %} - -analysis_variables: {{ _analysis_vars_csg }} +analysis_variables: ['soill1', 'soilt1'] # Model things # ------------ - # State variables -soil_state_variables_csg: ['soill1', 'soill2', 'soilt1', 'soilt2', 'air_temperature_at_2m', 'specfic_humidity_at_2m', 'slmsk', 'sheleg', 'vtype', 'stype', 'vfrac','geopotential_height_at_surface', 'skin_temperature_at_surface'] -#soil_state_variables_csg: {{ _analysis_vars_csg + ['slmsk', 'sheleg', 'vtype', 'stype', 'vfrac','geopotential_height_at_surface', 'skin_temperature_at_surface'] }} -#soil_state_variables_fv3: {{ _analysis_vars_fv3 + ['slmsk', 'sheleg', 'vtype', 'filtered_orography', 'fraction_of_ice', 'fraction_of_land', 'totalSnowDepth'] }} +soil_state_variables_csg: ['soill1', 'soill2', 'soilt1', 'soilt2', 'slmsk', 'sheleg', 'vtype', 'stype', 'vfrac'] # Increment variables -soil_increment_variables_csg: {{ _analysis_vars_csg }} -soil_increment_variables_fv3: {{ _analysis_vars_fv3 }} -soil_increment_variables_final_csg: ['soill1', 'soill2', 'soilt1', 'soilt2', 'air_temperature_at_2m', 'specfic_humidity_at_2m', 'slmsk','slmsk', 'sheleg', 'vtype', 'stype', 'vfrac'] -#soil_increment_variables_final_csg: {{ _analysis_vars_csg }} + ['slmsk', 'sheleg', 'vtype', 'stype', 'vfrac'] }} -#soil_increment_variables_final_fv3: {{ _analysis_vars_fv3 }} + ['slmsk', 'sheleg', 'vtype', 'totalSnowDepth'] }} - +soil_increment_variables_csg: ['soill1', 'soilt1'] +soil_increment_variables_final_csg: ['soill1', 'soill2', 'soilt1', 'soilt2', 'slmsk', 'sheleg', 'vtype', 'stype', 'vfrac'] # Variable IO names soil_field_io_names_csg: - air_temperature_at_2m: tmp2m - specfic_humidity_at_2m: spfh2m slmsk: land sheleg: weasd stype: sotyp vfrac: veg - geopotential_height_at_surface: hgtsfc - skin_temperature_at_surface: tmpsfc - -soil_field_io_names_fv3: - soilMoistureVolumetric: smc - totalSnowDepth: snodl - filtered_orography: orog_filt - fraction_of_ice: fice - fraction_of_land: land_frac # Geometry soil_layout_x: {{ layout_x | default(1, true) }} @@ -173,11 +144,7 @@ soil_ensemble_analysis_prefix: "{{ APREFIX_ENS }}" # ------------------------- local_ensemble_da_solver: Deterministic LETKF #GETKF -#{% if _file_type == 'csg' %} -increment_variables: {{ _analysis_vars_csg }} -#{% else %} -# increment_variables: {{ _analysis_vars_fv3 }} -#{% endif %} +increment_variables: ['soill1', 'soill2', 'soilt1', 'soilt2'] # Veritcal localization for GETKF vl_fraction_of_retained_variance: 0.750 diff --git a/parm/soil/soil_det_config.yaml.j2 b/parm/soil/soil_det_config.yaml.j2 index da108b215..5b5783a20 100644 --- a/parm/soil/soil_det_config.yaml.j2 +++ b/parm/soil/soil_det_config.yaml.j2 @@ -19,88 +19,28 @@ data_in: copy_req: -{% if SOIL_FILE_TYPE == 'csg' %} - ['{{ COMIN_ATMOS_HISTORY_PREV }}/{{ GPREFIX }}csg_atm.f006.nc', '{{ DATA }}/bkg/{{ GPREFIX }}csg_atm.f006.nc'] - ['{{ COMIN_ATMOS_HISTORY_PREV }}/{{ GPREFIX }}csg_sfc.f006.nc', '{{ DATA }}/bkg/{{ GPREFIX }}csg_sfc.f006.nc'] -{% else %} - - ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.coupler.res', '{{ DATA }}/bkg/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/bkg/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/bkg/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/bkg/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/bkg/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/bkg/'] - - ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/bkg/'] -{% endif %} - - ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile1.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile1.nc" ] - - ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile2.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile2.nc" ] - - ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile3.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile3.nc" ] - - ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile4.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile4.nc" ] - - ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile5.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile5.nc" ] - - ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile6.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile6.nc" ] {% filter indent(width=4) %} {% include 'soil_stage_jedi_fix.yaml.j2' %} {% include 'soil_stage_berror.yaml.j2' %} {% endfilter %} - copy_opt: -# - ['{{ COMIN_OBS }}/{{ OPREFIX }}h-12.smap_soil.nc', '{{ DATA }}/obs'] -# - ['{{ COMIN_OBS }}/{{ OPREFIX }}h-6.smap_soil.nc', '{{ DATA }}/obs'] -# - ['{{ COMIN_OBS }}/{{ OPREFIX }}h0.smap_soil.nc', '{{ DATA }}/obs'] -# - ['{{ COMIN_OBS }}/{{ OPREFIX }}h6.smap_soil.nc', '{{ DATA }}/obs'] -# - ['{{ COMIN_OBS }}/{{ OPREFIX }}h12.smap_soil.nc', '{{ DATA }}/obs'] - data_out: copy_req: # Configuration files - ['{{ DATA }}/soilanlvar.yaml', '{{ COMOUT_CONF }}/{{ APREFIX }}soilanlvar.yaml'] -# - ['{{ DATA }}/soilanladdinc.yaml', '{{ COMOUT_CONF }}/{{ APREFIX }}soilanladdinc.yaml'] -# - ['{{ DATA }}/soil_obs_list.yaml.j2', '{{ COMOUT_CONF }}/{{ APREFIX }}soil_obs_list.yaml.j2'] # Increments -{% if SOIL_FILE_TYPE == 'csg' %} - - ['{{ DATA }}/anl/soilinc_{{ GPREFIX }}nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment_csg.sfci006.nc'] - ['{{ DATA }}/anl/soilinc_{{ GPREFIX }}nc', '{{ COMOUT_SOIL_ANALYSIS }}/{{ APREFIX }}jedi_increment.sfc.i006.nc'] - - - ['{{ DATA }}/anl/sfcinc.{{ current_cycle | to_YMD }}T{{ current_cycle | strftime('%H') }}0000Z.gaussian.modelLevels.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment_gaussian.sfci006.nc'] - ['{{ DATA }}/anl/sfcinc.{{ current_cycle | to_YMD }}T{{ current_cycle | strftime('%H') }}0000Z.gaussian.modelLevels.nc', '{{ COMOUT_SOIL_ANALYSIS }}/{{ APREFIX }}increment.sfc.i006.nc'] -{% else %} - - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile1.nc'] - - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile2.nc'] - - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile3.nc'] - - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile4.nc'] - - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile5.nc'] - - ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile6.nc'] -{% endif %} {% if DO_ADD_SOIL_INCR %} # Copy soil analysis (for non-iau) # Analysis = bkg + inc - {% if SOIL_FILE_TYPE == 'csg' %} - ['{{ DATA }}/anl/{{ GPREFIX }}csg_sfc.f006.nc', '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ current_cycle | to_fv3time }}.csg_sfc.nc'] - {% else %} - - ['{{ DATA }}/anl/{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc'] - - ['{{ DATA }}/anl/{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc'] - - ['{{ DATA }}/anl/{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc'] - - ['{{ DATA }}/anl/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc'] - - ['{{ DATA }}/anl/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc'] - - ['{{ DATA }}/anl/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', - '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc'] - {% endif %} {% endif %} diff --git a/parm/soil/soil_letkf_config.yaml.j2 b/parm/soil/soil_letkf_config.yaml.j2 index e8f0a0185..1d91ba7bd 100644 --- a/parm/soil/soil_letkf_config.yaml.j2 +++ b/parm/soil/soil_letkf_config.yaml.j2 @@ -6,7 +6,6 @@ jedi_config: jedi_args: ['fv3jedi', 'localensembleda'] jcb_base_yaml: '{{ PARMglobal }}/gdas/soil/jcb-base.yaml.j2' jcb_algo_yaml: '{{ PARMglobal }}/gdas/soil/jcb-prototype_lgetkf.yaml.j2' -#TODO: add observer and sol mode data_in: mkdir: @@ -24,113 +23,29 @@ data_in: copy_req: {% for mem in range(1, NMEM_ENS + 1) %} -# {% set gmem = mem+mem_offset %} -# {% if gmem > NMEM_ENS_MAX %} -# {% set gmem = gmem-NMEM_ENS_MAX %} -# {% endif %} {% set tmpl_dict = ({ '${ROTDIR}': ROTDIR, '${RUN}': RUN, '${YMD}': previous_cycle | to_YMD, '${HH}': previous_cycle | strftime('%H'), '${MEMDIR}': 'mem%03d' | format(mem) }) %} - {% if SOIL_FILE_TYPE == 'csg' %} - ['{{ COM_ATMOS_HISTORY_TMPL | replace_tmpl(tmpl_dict) }}/{{ GPREFIX_ENS }}csg_atm.f006.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - ['{{ COM_ATMOS_HISTORY_TMPL | replace_tmpl(tmpl_dict) }}/{{ GPREFIX_ENS }}csg_sfc.f006.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - {% else %} - # copy coupler file - - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.coupler.res', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - - ['{{ COM_ATMOS_RESTART_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/bkg/mem{{ '%03d' % mem }}/'] - {% endif %} {% endfor %} - {% filter indent(width=4) %} {% include 'soil_stage_jedi_fix.yaml.j2' %} {% include 'soil_stage_berror.yaml.j2' %} #{% include 'soil_stage_bufr2ioda_mapping.yaml.j2' %} {% endfilter %} - - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}_mosaic.nc', '{{ DATA }}/orog/ens/'] - - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}_grid.tile1.nc', '{{ DATA }}/orog/ens/'] - - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}_grid.tile2.nc', '{{ DATA }}/orog/ens/'] - - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}_grid.tile3.nc', '{{ DATA }}/orog/ens/'] - - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}_grid.tile4.nc', '{{ DATA }}/orog/ens/'] - - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}_grid.tile5.nc', '{{ DATA }}/orog/ens/'] - - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}_grid.tile6.nc', '{{ DATA }}/orog/ens/'] - - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile1.nc', '{{ DATA }}/orog/ens/' ] - - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile2.nc', '{{ DATA }}/orog/ens/' ] - - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile3.nc', '{{ DATA }}/orog/ens/' ] - - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile4.nc', '{{ DATA }}/orog/ens/' ] - - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile5.nc', '{{ DATA }}/orog/ens/' ] - - ['{{ FIXorog }}/{{ CASE_ENS }}/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile6.nc', '{{ DATA }}/orog/ens/' ] - - link_req: -{% for imem in range(1, NMEM_ENS+1) %} - {% set memchar = 'mem%03d' | format(imem) %} - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_mosaic.nc', '{{ DATA }}/bkg/{{ memchar }}/'] - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile1.nc', '{{ DATA }}/bkg/{{ memchar }}/'] - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile2.nc', '{{ DATA }}/bkg/{{ memchar }}/'] - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile3.nc', '{{ DATA }}/bkg/{{ memchar }}/'] - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile4.nc', '{{ DATA }}/bkg/{{ memchar }}/'] - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile5.nc', '{{ DATA }}/bkg/{{ memchar }}/'] - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile6.nc', '{{ DATA }}/bkg/{{ memchar }}/'] - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile1.nc', '{{ DATA }}/bkg/{{ memchar }}/'] - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile2.nc', '{{ DATA }}/bkg/{{ memchar }}/'] - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile3.nc', '{{ DATA }}/bkg/{{ memchar }}/'] - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile4.nc', '{{ DATA }}/bkg/{{ memchar }}/'] - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile5.nc', '{{ DATA }}/bkg/{{ memchar }}/'] - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile6.nc', '{{ DATA }}/bkg/{{ memchar }}/'] -{% endfor %} - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_mosaic.nc', '{{ DATA }}/bkg/ensmean/'] - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile1.nc', '{{ DATA }}/bkg/ensmean/'] - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile2.nc', '{{ DATA }}/bkg/ensmean/'] - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile3.nc', '{{ DATA }}/bkg/ensmean/'] - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile4.nc', '{{ DATA }}/bkg/ensmean/'] - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile5.nc', '{{ DATA }}/bkg/ensmean/'] - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}_grid.tile6.nc', '{{ DATA }}/bkg/ensmean/'] - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile1.nc', '{{ DATA }}/bkg/ensmean/'] - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile2.nc', '{{ DATA }}/bkg/ensmean/'] - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile3.nc', '{{ DATA }}/bkg/ensmean/'] - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile4.nc', '{{ DATA }}/bkg/ensmean/'] - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile5.nc', '{{ DATA }}/bkg/ensmean/'] - - ['{{ DATA }}/orog/ens/{{ CASE_ENS }}.mx{{ OCNRES }}_oro_data.tile6.nc', '{{ DATA }}/bkg/ensmean/'] - -# copy_opt: -# {% filter indent(width=4) %} -# {% include 'soil_stage_obs.yaml.j2' %} -# {% endfilter %} - - data_out: copy_req: # Configuration files - ['{{ DATA }}/soilletkfanl.yaml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}soilletkfanl.yaml'] # ens mean increment - {% if SOIL_FILE_TYPE == 'csg' %} - - ['{{ DATA }}/anl/mem000/sfcinc_ensmean.{{ current_cycle | to_YMD }}_{{ current_cycle | strftime('%H') }}0000z.nc4', - '{{ COMOUT_ATMOS_ANALYSIS_ENS }}/{{ current_cycle | to_fv3time }}.soil_increment_gaussian.sfci006.nc'] - ['{{ DATA }}/anl/mem000/sfcinc_ensmean.{{ current_cycle | to_YMD }}_{{ current_cycle | strftime('%H') }}0000z.nc4', '{{ COMOUT_ATMOS_ANALYSIS_ENS }}/{{ APREFIX_ENS }}increment.sfc.i006.nc'] - {% else %} - - ['{{ DATA }}/anl/mem000/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', - '{{ COMOUT_ATMOS_ANALYSIS_ENS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile1.nc'] - - ['{{ DATA }}/anl/mem000/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', - '{{ COMOUT_ATMOS_ANALYSIS_ENS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile2.nc'] - - ['{{ DATA }}/anl/mem000/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', - '{{ COMOUT_ATMOS_ANALYSIS_ENS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile3.nc'] - - ['{{ DATA }}/anl/mem000/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', - '{{ COMOUT_ATMOS_ANALYSIS_ENS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile4.nc'] - - ['{{ DATA }}/anl/mem000/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', - '{{ COMOUT_ATMOS_ANALYSIS_ENS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile5.nc'] - - ['{{ DATA }}/anl/mem000/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', - '{{ COMOUT_ATMOS_ANALYSIS_ENS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile6.nc'] - {% endif %} {% for imem in range(1, NMEM_ENS+1) %} {% set memchar = 'mem%03d' | format(imem) %} @@ -140,49 +55,11 @@ data_out: '${HH}': current_cycle | strftime('%H'), '${MEMDIR}': 'mem%03d' | format(imem) }) %} # Increments - {% if SOIL_FILE_TYPE == 'csg' %} - #- ['{{ DATA }}/anl/{{ memchar }}/soilinc_{{ GPREFIX_ENS }}nc', - # '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_increment_csg.sfci006.nc'] - #- ['{{ DATA }}/anl/{{ memchar }}/soilinc_{{ GPREFIX_ENS }}nc', - # '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ APREFIX_ENS }}jedi_increment.sfc.i006.nc'] - - - ['{{ DATA }}/anl/{{ memchar }}/sfcinc.{{ current_cycle | to_YMD }}_{{ current_cycle | strftime('%H') }}0000z.nc4', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_increment_gaussian.sfci006.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/sfcinc.{{ current_cycle | to_YMD }}_{{ current_cycle | strftime('%H') }}0000z.nc4', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ APREFIX_ENS }}increment.sfc.i006.nc'] - {% else %} - - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile1.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile2.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile3.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile4.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile5.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile6.nc'] - {% endif %} + - ['{{ DATA }}/anl/{{ memchar }}/soilinc_{{ GPREFIX_ENS }}nc', + '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ APREFIX_ENS }}jedi_increment.sfc.i006.nc'] # Copy soil analysis (for non-iau) {% if DO_ADD_SOIL_INCR %} - {% if SOIL_FILE_TYPE == 'csg' %} - ['{{ DATA }}/anl/{{ memchar }}/{{ GPREFIX_ENS }}csg_sfc.f006.nc', '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soilanl.csg_sfc.nc'] - {% else %} - - ['{{ DATA }}/anl/{{ memchar }}/{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc'] - - ['{{ DATA }}/anl/{{ memchar }}/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', - '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/soilanl.{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc'] - {% endif %} - {% endif %} {% endfor %} From 923591ec264ad85c8b4d6775f3d9968b5803cea1 Mon Sep 17 00:00:00 2001 From: tsga Date: Thu, 30 Jul 2026 20:38:11 +0000 Subject: [PATCH 82/98] remove fv3 from model files --- .../soil/soil_background_ensemble_fv3.yaml.j2 | 16 ------- .../soil_background_error_static_fv3.yaml.j2 | 44 ------------------- .../model/soil/soil_background_fv3.yaml.j2 | 28 ------------ .../soil/soil_ensemble_increments_fv3.yaml.j2 | 7 --- .../soil/soil_final_increment_fv3.yaml.j2 | 30 ------------- .../soil/soil_output_increment_fv3.yaml.j2 | 7 --- .../soil/soil_posterior_output_fv3.yaml.j2 | 7 --- 7 files changed, 139 deletions(-) delete mode 100644 parm/jcb-gdas/model/soil/soil_background_ensemble_fv3.yaml.j2 delete mode 100644 parm/jcb-gdas/model/soil/soil_background_error_static_fv3.yaml.j2 delete mode 100644 parm/jcb-gdas/model/soil/soil_background_fv3.yaml.j2 delete mode 100644 parm/jcb-gdas/model/soil/soil_ensemble_increments_fv3.yaml.j2 delete mode 100644 parm/jcb-gdas/model/soil/soil_final_increment_fv3.yaml.j2 delete mode 100644 parm/jcb-gdas/model/soil/soil_output_increment_fv3.yaml.j2 delete mode 100644 parm/jcb-gdas/model/soil/soil_posterior_output_fv3.yaml.j2 diff --git a/parm/jcb-gdas/model/soil/soil_background_ensemble_fv3.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_ensemble_fv3.yaml.j2 deleted file mode 100644 index d41ae0e49..000000000 --- a/parm/jcb-gdas/model/soil/soil_background_ensemble_fv3.yaml.j2 +++ /dev/null @@ -1,16 +0,0 @@ -members from template: - template: - datetime: '{{ soil_background_time_iso }}' - filetype: fms restart - skip coupler file: true - state variables: {{ soil_state_variables_fv3 }} - field io names: {{ soil_field_io_names_fv3 }} - datapath: {{ soil_background_ensemble_path }} - filename is datetime templated: true - filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' - filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' - filename_orog: '{{ soil_orog_prefix }}_oro_data.nc' - max allowable geometry difference: 1e-4 - pattern: "{{ soil_ensemble_pattern | default("%mem%", true) }}" - nmembers: {{ soil_number_ensemble_members }} - zero padding: 3 diff --git a/parm/jcb-gdas/model/soil/soil_background_error_static_fv3.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_error_static_fv3.yaml.j2 deleted file mode 100644 index c8cf686f5..000000000 --- a/parm/jcb-gdas/model/soil/soil_background_error_static_fv3.yaml.j2 +++ /dev/null @@ -1,44 +0,0 @@ -covariance model: SABER -saber central block: - saber block name: BUMP_NICAS - read: - general: - universe length-scale: 250000.0 - drivers: - multivariate strategy: univariate - read global nicas: true - nicas: - resolution: 6 - max horizontal grid size: 400000 - explicit length-scales: true - horizontal length-scale: - - groups: - - soilMoistureVolumetric - value: 250000.0 - vertical length-scale: - - groups: - - soilMoistureVolumetric - value: 800.0 - interpolation type: - - groups: - - soilMoistureVolumetric - type: c0 - same horizontal convolution: true - io: - data directory: ./berror - files prefix: smc_bump -saber outer blocks: -- saber block name: BUMP_StdDev - read: - drivers: - compute variance: true - variance: - explicit stddev: true - stddev: - - variables: - - soilMoistureVolumetric - value: 0.05 - value: 2.0 - - variables: - - specfic_humidity_at_2m - value: 0.1 diff --git a/parm/jcb-gdas/model/soil/soil_background_fv3.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_fv3.yaml.j2 deleted file mode 100644 index 6a5b14614..000000000 --- a/parm/jcb-gdas/model/soil/soil_background_fv3.yaml.j2 +++ /dev/null @@ -1,28 +0,0 @@ -datapath: {{ soil_background_path }} -filetype: fms restart -skip coupler file: true -datetime: '{{ soil_background_time_iso }}' -state variables: -- soilMoistureVolumetric -- slc -- stc -- totalSnowDepth -- sheleg -- vtype -- slmsk -- filtered_orography -- fraction_of_ice -- fraction_of_land -- air_temperature_at_2m -- specfic_humidity_at_2m -field io names: - soilMoistureVolumetric: smc - totalSnowDepth: snodl - filtered_orography: orog_filt - fraction_of_ice: fice - fraction_of_land: land_frac - air_temperature_at_2m: t2m - specfic_humidity_at_2m: q2m -filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' -filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' -filename_orog: '{{ soil_orog_prefix }}_oro_data.nc' diff --git a/parm/jcb-gdas/model/soil/soil_ensemble_increments_fv3.yaml.j2 b/parm/jcb-gdas/model/soil/soil_ensemble_increments_fv3.yaml.j2 deleted file mode 100644 index 2ec59d3c7..000000000 --- a/parm/jcb-gdas/model/soil/soil_ensemble_increments_fv3.yaml.j2 +++ /dev/null @@ -1,7 +0,0 @@ -prefix: soilinc -datapath: ./anl/mem%{member}% -filetype: fms restart -filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' -filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' -state variables: {{ soil_state_variables_fv3 }} -field io names: {{ soil_field_io_names_fv3 }} diff --git a/parm/jcb-gdas/model/soil/soil_final_increment_fv3.yaml.j2 b/parm/jcb-gdas/model/soil/soil_final_increment_fv3.yaml.j2 deleted file mode 100644 index 3ecd58f47..000000000 --- a/parm/jcb-gdas/model/soil/soil_final_increment_fv3.yaml.j2 +++ /dev/null @@ -1,30 +0,0 @@ -output: - state component: - datapath: ./anl - state variables: - - soilMoistureVolumetric - - slc - - stc - - totalSnowDepth - - sheleg - - vtype - - slmsk - field io names: - soilMoistureVolumetric: smc - totalSnowDepth: snodl - prefix: soilinc - filetype: fms restart - filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' - filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' - -geometry: - fms initialization: - namelist filename: "{{ soil_fv3jedi_files_path }}/fmsmpp.nml" - field table filename: "{{ soil_fv3jedi_files_path }}/field_table" - akbk: "{{ soil_fv3jedi_files_path }}/akbk.nc4" - layout: - - {{ soil_layout_x }} - - {{ soil_layout_y }} - npx: {{ soil_npx_ges }} - npy: {{ soil_npy_ges }} - npz: {{ soil_npz_ges }} diff --git a/parm/jcb-gdas/model/soil/soil_output_increment_fv3.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_increment_fv3.yaml.j2 deleted file mode 100644 index 83b5df36a..000000000 --- a/parm/jcb-gdas/model/soil/soil_output_increment_fv3.yaml.j2 +++ /dev/null @@ -1,7 +0,0 @@ -prefix: soilinc_ensmean -datapath: ./anl/ -filetype: fms restart -filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' -filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' -state variables: {{ soil_state_variables_fv3 }} -field io names: {{ soil_field_io_names_fv3 }} diff --git a/parm/jcb-gdas/model/soil/soil_posterior_output_fv3.yaml.j2 b/parm/jcb-gdas/model/soil/soil_posterior_output_fv3.yaml.j2 deleted file mode 100644 index cb6d310de..000000000 --- a/parm/jcb-gdas/model/soil/soil_posterior_output_fv3.yaml.j2 +++ /dev/null @@ -1,7 +0,0 @@ -prefix: soil_ens_anl -datapath: ./anl/ -filetype: fms restart -filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' -filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' -state variables: {{ soil_state_variables_fv3 }} -field io names: {{ soil_field_io_names_fv3 }} From 5d020515df7bc7c7bba2416d98d88e40956b852d Mon Sep 17 00:00:00 2001 From: tsga Date: Thu, 30 Jul 2026 21:28:14 +0000 Subject: [PATCH 83/98] remove orog --- .../model/soil/soil_3dvar_outer_loop_1.yaml.j2 | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/parm/jcb-gdas/model/soil/soil_3dvar_outer_loop_1.yaml.j2 b/parm/jcb-gdas/model/soil/soil_3dvar_outer_loop_1.yaml.j2 index fa51bd4b3..a4981d504 100644 --- a/parm/jcb-gdas/model/soil/soil_3dvar_outer_loop_1.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_3dvar_outer_loop_1.yaml.j2 @@ -12,16 +12,5 @@ npx: {{ soil_npx_anl }} npy: {{ soil_npy_anl }} npz: {{ soil_npz_anl }} - time invariant fields: - state fields: - datetime: '{{ soil_background_time_iso }}' - filetype: fms restart - skip coupler file: true - state variables: - - filtered_orography - - fraction_of_land - field io names: {{ soil_field_io_names_fv3 }} - datapath: {{ soil_orog_files_path }}/ - filename_orog: {{ soil_orog_prefix }}_oro_data.nc diagnostics: departures: bkgmob From 3cb3b0b451e3c1594064ef2653cbbc6b44b55dfb Mon Sep 17 00:00:00 2001 From: tsga Date: Thu, 30 Jul 2026 21:43:42 +0000 Subject: [PATCH 84/98] fix output file names; remove unused ones --- .../model/soil/soil_background_ensemble.yaml.j2 | 15 --------------- parm/jcb-gdas/model/soil/soil_output.yaml.j2 | 9 --------- .../model/soil/soil_output_mean_prior.yaml.j2 | 7 ------- .../soil/soil_output_variance_posterior.yaml.j2 | 7 ------- .../model/soil/soil_output_variance_prior.yaml.j2 | 7 ------- parm/soil/jcb-base.yaml.j2 | 1 + 6 files changed, 1 insertion(+), 45 deletions(-) delete mode 100644 parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 delete mode 100644 parm/jcb-gdas/model/soil/soil_output.yaml.j2 delete mode 100644 parm/jcb-gdas/model/soil/soil_output_mean_prior.yaml.j2 delete mode 100644 parm/jcb-gdas/model/soil/soil_output_variance_posterior.yaml.j2 delete mode 100644 parm/jcb-gdas/model/soil/soil_output_variance_prior.yaml.j2 diff --git a/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 deleted file mode 100644 index eb14ac196..000000000 --- a/parm/jcb-gdas/model/soil/soil_background_ensemble.yaml.j2 +++ /dev/null @@ -1,15 +0,0 @@ -members from template: - template: - datetime: '{{ soil_background_time_iso }}' - datapath: {{ soil_background_ensemble_path }} - filetype: cube sphere history - provider: ufs - filenames: - - {{ soil_ensemble_history_prefix }}csg_atm.f006.nc - - {{ soil_ensemble_history_prefix }}csg_sfc.f006.nc - max allowable geometry difference: 1e-4 - state variables: {{ soil_state_variables_csg }} - field io names: {{ soil_field_io_names_csg }} - pattern: "{{ soil_ensemble_pattern | default("%mem%", true) }}" - nmembers: {{ soil_number_ensemble_members }} - zero padding: 3 diff --git a/parm/jcb-gdas/model/soil/soil_output.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output.yaml.j2 deleted file mode 100644 index a860f789d..000000000 --- a/parm/jcb-gdas/model/soil/soil_output.yaml.j2 +++ /dev/null @@ -1,9 +0,0 @@ -state variables: {{ soil_det_state_variables }} -field io names: {{ soil_field_io_names }} -datapath: ./anl -prefix: soil_finanl -filetype: fms restart -datetime: '{{ soil_background_time_iso }}' -filename_sfcd: '{{ soil_background_time_fv3 }}.sfc_data.nc' -filename_cplr: '{{ soil_background_time_fv3 }}.coupler.res' -filename_orog: '{{ soil_orog_prefix }}_oro_data.nc' diff --git a/parm/jcb-gdas/model/soil/soil_output_mean_prior.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_mean_prior.yaml.j2 deleted file mode 100644 index 8fa1ae35f..000000000 --- a/parm/jcb-gdas/model/soil/soil_output_mean_prior.yaml.j2 +++ /dev/null @@ -1,7 +0,0 @@ -prefix: soil_prior_ensmean -datapath: ./anl/ -filetype: cube sphere history -provider: ufs -filename: {{ soil_ensemble_history_prefix }}.nc -state variables: {{ soil_state_variables_csg }} -field io names: {{ soil_field_io_names_csg }} diff --git a/parm/jcb-gdas/model/soil/soil_output_variance_posterior.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_variance_posterior.yaml.j2 deleted file mode 100644 index d6490f67d..000000000 --- a/parm/jcb-gdas/model/soil/soil_output_variance_posterior.yaml.j2 +++ /dev/null @@ -1,7 +0,0 @@ -prefix: soil_ensvariance_posterior -datapath: ./anl/ -filetype: cube sphere history -provider: ufs -filename: soilinc_{{ soil_ensemble_history_prefix }}.nc -state variables: {{ soil_state_variables_csg }} -field io names: {{ soil_field_io_names_csg }} diff --git a/parm/jcb-gdas/model/soil/soil_output_variance_prior.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_variance_prior.yaml.j2 deleted file mode 100644 index 2a914becc..000000000 --- a/parm/jcb-gdas/model/soil/soil_output_variance_prior.yaml.j2 +++ /dev/null @@ -1,7 +0,0 @@ -prefix: soil_ensvariance_prior -datapath: ./anl/ -filetype: cube sphere history -provider: ufs -filename: soilinc_{{ soil_ensemble_history_prefix }}.nc -state variables: {{ soil_state_variables_csg }} -field io names: {{ soil_field_io_names_csg }} diff --git a/parm/soil/jcb-base.yaml.j2 b/parm/soil/jcb-base.yaml.j2 index 5b0b4cf79..670b828dc 100644 --- a/parm/soil/jcb-base.yaml.j2 +++ b/parm/soil/jcb-base.yaml.j2 @@ -136,6 +136,7 @@ soil_obsbiascovout_suffix: ".satbias_cov.nc" # Ensemble things soil_number_ensemble_members: {{NMEM_ENS | default(1, true) }} soil_background_ensemble_path: ./bkg/mem%mem% +background_ensemble_file: soil_background_ensemble_csg soil_analysis_ensemble_path: ./anl/mem%mem% soil_ensemble_history_prefix: "{{ GPREFIX_ENS }}" soil_ensemble_analysis_prefix: "{{ APREFIX_ENS }}" From 494e59f9f2b870e985916ce571ceaa8dc37e880e Mon Sep 17 00:00:00 2001 From: tsga Date: Thu, 30 Jul 2026 21:45:02 +0000 Subject: [PATCH 85/98] add csg variance output files --- .../jcb-gdas/model/soil/soil_output_mean_prior_csg.yaml.j2 | 7 +++++++ .../model/soil/soil_output_variance_posterior_csg.yaml.j2 | 7 +++++++ .../model/soil/soil_output_variance_prior_csg.yaml.j2 | 7 +++++++ 3 files changed, 21 insertions(+) create mode 100644 parm/jcb-gdas/model/soil/soil_output_mean_prior_csg.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_output_variance_posterior_csg.yaml.j2 create mode 100644 parm/jcb-gdas/model/soil/soil_output_variance_prior_csg.yaml.j2 diff --git a/parm/jcb-gdas/model/soil/soil_output_mean_prior_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_mean_prior_csg.yaml.j2 new file mode 100644 index 000000000..8fa1ae35f --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_output_mean_prior_csg.yaml.j2 @@ -0,0 +1,7 @@ +prefix: soil_prior_ensmean +datapath: ./anl/ +filetype: cube sphere history +provider: ufs +filename: {{ soil_ensemble_history_prefix }}.nc +state variables: {{ soil_state_variables_csg }} +field io names: {{ soil_field_io_names_csg }} diff --git a/parm/jcb-gdas/model/soil/soil_output_variance_posterior_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_variance_posterior_csg.yaml.j2 new file mode 100644 index 000000000..d6490f67d --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_output_variance_posterior_csg.yaml.j2 @@ -0,0 +1,7 @@ +prefix: soil_ensvariance_posterior +datapath: ./anl/ +filetype: cube sphere history +provider: ufs +filename: soilinc_{{ soil_ensemble_history_prefix }}.nc +state variables: {{ soil_state_variables_csg }} +field io names: {{ soil_field_io_names_csg }} diff --git a/parm/jcb-gdas/model/soil/soil_output_variance_prior_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_variance_prior_csg.yaml.j2 new file mode 100644 index 000000000..2a914becc --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_output_variance_prior_csg.yaml.j2 @@ -0,0 +1,7 @@ +prefix: soil_ensvariance_prior +datapath: ./anl/ +filetype: cube sphere history +provider: ufs +filename: soilinc_{{ soil_ensemble_history_prefix }}.nc +state variables: {{ soil_state_variables_csg }} +field io names: {{ soil_field_io_names_csg }} From 37ca0a25de10e208e5766727fb68c82899390988 Mon Sep 17 00:00:00 2001 From: tsga Date: Fri, 31 Jul 2026 14:14:37 +0000 Subject: [PATCH 86/98] gaussian inc for soill1 --- .../soil_background_error_static_csg.yaml.j2 | 34 +++++-------- ...ackground_error_static_shadlev_csg.yaml.j2 | 49 +++++++++++++++++++ .../soil_final_increment_gaussian.yaml.j2 | 6 --- parm/soil/jcb-base.yaml.j2 | 2 +- 4 files changed, 62 insertions(+), 29 deletions(-) create mode 100644 parm/jcb-gdas/model/soil/soil_background_error_static_shadlev_csg.yaml.j2 diff --git a/parm/jcb-gdas/model/soil/soil_background_error_static_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_error_static_csg.yaml.j2 index b5d12cef0..74ff83e38 100644 --- a/parm/jcb-gdas/model/soil/soil_background_error_static_csg.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background_error_static_csg.yaml.j2 @@ -3,40 +3,30 @@ saber central block: saber block name: BUMP_NICAS read: general: - universe length-scale: 250000.0 + universe length-scale: 5000000.0 drivers: multivariate strategy: univariate read global nicas: true nicas: - resolution: 6 - max horizontal grid size: 250000 + resolution: 4 explicit length-scales: true horizontal length-scale: - - groups: - - soill1_shadowLevels - value: 250000. + - groups: + - soill1 + value: 1000000.0 vertical length-scale: - - groups: - - soill1_shadowLevels - value: 0.0 + - groups: + - soill1 + value: 1500.0 interpolation type: - - groups: - - soill1_shadowLevels + - groups: + - soill1 type: c0 same horizontal convolution: true io: - data directory: ./berror + data directory: ./berror files prefix: smc_bump saber outer blocks: -- saber block name: ShadowLevels - fields metadata: - soill1: - vert_coord: filtered_orography - calibration: - number of shadow levels: 50 - lowest shadow level: -450.0 - highest shadow level: 8850.0 - vertical length-scale: 700.0 - saber block name: BUMP_StdDev read: drivers: @@ -44,6 +34,6 @@ saber outer blocks: variance: explicit stddev: true stddev: - - variables: + - variables: - soill1 value: 0.05 diff --git a/parm/jcb-gdas/model/soil/soil_background_error_static_shadlev_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_error_static_shadlev_csg.yaml.j2 new file mode 100644 index 000000000..b5d12cef0 --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_background_error_static_shadlev_csg.yaml.j2 @@ -0,0 +1,49 @@ +covariance model: SABER +saber central block: + saber block name: BUMP_NICAS + read: + general: + universe length-scale: 250000.0 + drivers: + multivariate strategy: univariate + read global nicas: true + nicas: + resolution: 6 + max horizontal grid size: 250000 + explicit length-scales: true + horizontal length-scale: + - groups: + - soill1_shadowLevels + value: 250000. + vertical length-scale: + - groups: + - soill1_shadowLevels + value: 0.0 + interpolation type: + - groups: + - soill1_shadowLevels + type: c0 + same horizontal convolution: true + io: + data directory: ./berror + files prefix: smc_bump +saber outer blocks: +- saber block name: ShadowLevels + fields metadata: + soill1: + vert_coord: filtered_orography + calibration: + number of shadow levels: 50 + lowest shadow level: -450.0 + highest shadow level: 8850.0 + vertical length-scale: 700.0 +- saber block name: BUMP_StdDev + read: + drivers: + compute variance: true + variance: + explicit stddev: true + stddev: + - variables: + - soill1 + value: 0.05 diff --git a/parm/jcb-gdas/model/soil/soil_final_increment_gaussian.yaml.j2 b/parm/jcb-gdas/model/soil/soil_final_increment_gaussian.yaml.j2 index 68854fa9f..a90f8a690 100644 --- a/parm/jcb-gdas/model/soil/soil_final_increment_gaussian.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_final_increment_gaussian.yaml.j2 @@ -6,12 +6,6 @@ prefix: {{ soil_gaussian_increment_prefix }} all model levels: true date colons: false variables to output: -- soilt1 -- soilt2 - soill1 -- soill2 field io names: - soilt1: stc1_inc - soilt2: stc2_inc soill1: slc1_inc - soill2: slc2_inc diff --git a/parm/soil/jcb-base.yaml.j2 b/parm/soil/jcb-base.yaml.j2 index 670b828dc..6c9338d6d 100644 --- a/parm/soil/jcb-base.yaml.j2 +++ b/parm/soil/jcb-base.yaml.j2 @@ -49,7 +49,7 @@ cost_type: 3D-Var number_of_outer_loops: 1 # Analysis variables -analysis_variables: ['soill1', 'soilt1'] +analysis_variables: ['soill1'] #, 'soilt1'] # Model things # ------------ From 09c77b2e62bd0c32cfbfde718a192bb0c5081b61 Mon Sep 17 00:00:00 2001 From: tsga Date: Fri, 31 Jul 2026 15:59:48 +0000 Subject: [PATCH 87/98] consolidate soil state var names --- .../model/soil/soil_background_csg.yaml.j2 | 4 +-- .../soil/soil_background_ensemble_csg.yaml.j2 | 4 +-- .../soil/soil_ensemble_increments_csg.yaml.j2 | 4 +-- .../soil_ensemble_increments_gaussian.yaml.j2 | 4 +-- .../soil/soil_final_increment_csg.yaml.j2 | 2 +- .../soil/soil_output_increment_csg.yaml.j2 | 4 +-- .../soil_output_increment_gaussian.yaml.j2 | 4 +-- .../soil/soil_output_mean_prior_csg.yaml.j2 | 4 +-- ...soil_output_variance_posterior_csg.yaml.j2 | 4 +-- .../soil_output_variance_prior_csg.yaml.j2 | 4 +-- .../soil/soil_posterior_output_csg.yaml.j2 | 4 +-- parm/soil/jcb-base.yaml.j2 | 26 +++++++++++++++---- parm/soil/soil_letkf_config.yaml.j2 | 5 ++-- 13 files changed, 45 insertions(+), 28 deletions(-) diff --git a/parm/jcb-gdas/model/soil/soil_background_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_csg.yaml.j2 index 712809f7a..0a4da9dd3 100644 --- a/parm/jcb-gdas/model/soil/soil_background_csg.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background_csg.yaml.j2 @@ -6,5 +6,5 @@ filenames: - {{ soil_variational_history_prefix }}csg_atm.f006.nc - {{ soil_variational_history_prefix }}csg_sfc.f006.nc max allowable geometry difference: 1e-4 -state variables: {{ soil_state_variables_csg }} -field io names: {{ soil_field_io_names_csg }} +state variables: {{ soil_state_variables }} +field io names: {{ soil_field_io_names }} diff --git a/parm/jcb-gdas/model/soil/soil_background_ensemble_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_ensemble_csg.yaml.j2 index eb14ac196..43652d67c 100644 --- a/parm/jcb-gdas/model/soil/soil_background_ensemble_csg.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background_ensemble_csg.yaml.j2 @@ -8,8 +8,8 @@ members from template: - {{ soil_ensemble_history_prefix }}csg_atm.f006.nc - {{ soil_ensemble_history_prefix }}csg_sfc.f006.nc max allowable geometry difference: 1e-4 - state variables: {{ soil_state_variables_csg }} - field io names: {{ soil_field_io_names_csg }} + state variables: {{ soil_state_variables }} + field io names: {{ soil_field_io_names }} pattern: "{{ soil_ensemble_pattern | default("%mem%", true) }}" nmembers: {{ soil_number_ensemble_members }} zero padding: 3 diff --git a/parm/jcb-gdas/model/soil/soil_ensemble_increments_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_ensemble_increments_csg.yaml.j2 index ac1a13b5f..4343465bc 100644 --- a/parm/jcb-gdas/model/soil/soil_ensemble_increments_csg.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_ensemble_increments_csg.yaml.j2 @@ -2,5 +2,5 @@ datapath: ./anl/mem%{member}% filetype: cube sphere history provider: ufs filename: soilinc_{{ soil_ensemble_history_prefix }}nc -state variables: {{ soil_state_variables_csg }} -field io names: {{ soil_field_io_names_csg }} +state variables: {{ soil_state_variables }} +field io names: {{ soil_field_io_names }} diff --git a/parm/jcb-gdas/model/soil/soil_ensemble_increments_gaussian.yaml.j2 b/parm/jcb-gdas/model/soil/soil_ensemble_increments_gaussian.yaml.j2 index af064412b..dcc138c91 100644 --- a/parm/jcb-gdas/model/soil/soil_ensemble_increments_gaussian.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_ensemble_increments_gaussian.yaml.j2 @@ -2,5 +2,5 @@ datapath: ./anl/mem%{member}% filetype: auxgrid gridtype: gaussian filename: ./anl/mem%{member}%/sfcinc. -state variables: {{ soil_state_variables_csg }} -field io names: {{ soil_field_io_names_csg }} +state variables: {{ soil_state_variables }} +field io names: {{ soil_field_io_names }} diff --git a/parm/jcb-gdas/model/soil/soil_final_increment_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_final_increment_csg.yaml.j2 index d7ae371d1..60f0153b7 100644 --- a/parm/jcb-gdas/model/soil/soil_final_increment_csg.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_final_increment_csg.yaml.j2 @@ -4,7 +4,7 @@ output: provider: ufs datapath: ./anl filename: soilinc_{{ soil_variational_history_prefix }}nc - field io names: {{ soil_field_io_names_csg }} + field io names: {{ soil_field_io_names }} geometry: fms initialization: diff --git a/parm/jcb-gdas/model/soil/soil_output_increment_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_increment_csg.yaml.j2 index a0e6eb7bf..d961551cf 100644 --- a/parm/jcb-gdas/model/soil/soil_output_increment_csg.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_output_increment_csg.yaml.j2 @@ -2,5 +2,5 @@ datapath: ./anl/mem%{member}% filetype: cube sphere history provider: ufs filename: soilinc_ensmean_{{ soil_ensemble_history_prefix }}nc -state variables: {{ soil_state_variables_csg }} -field io names: {{ soil_field_io_names_csg }} +state variables: {{ soil_state_variables }} +field io names: {{ soil_field_io_names }} diff --git a/parm/jcb-gdas/model/soil/soil_output_increment_gaussian.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_increment_gaussian.yaml.j2 index 317b1154d..a96105f3b 100644 --- a/parm/jcb-gdas/model/soil/soil_output_increment_gaussian.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_output_increment_gaussian.yaml.j2 @@ -2,5 +2,5 @@ datapath: ./anl/mem000 filetype: auxgrid gridtype: gaussian filename: ./anl/mem000/sfcinc_ensmean. -state variables: {{ soil_state_variables_csg }} -field io names: {{ soil_field_io_names_csg }} +state variables: {{ soil_state_variables }} +field io names: {{ soil_field_io_names }} diff --git a/parm/jcb-gdas/model/soil/soil_output_mean_prior_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_mean_prior_csg.yaml.j2 index 8fa1ae35f..1ac4e09b6 100644 --- a/parm/jcb-gdas/model/soil/soil_output_mean_prior_csg.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_output_mean_prior_csg.yaml.j2 @@ -3,5 +3,5 @@ datapath: ./anl/ filetype: cube sphere history provider: ufs filename: {{ soil_ensemble_history_prefix }}.nc -state variables: {{ soil_state_variables_csg }} -field io names: {{ soil_field_io_names_csg }} +state variables: {{ soil_state_variables }} +field io names: {{ soil_field_io_names }} diff --git a/parm/jcb-gdas/model/soil/soil_output_variance_posterior_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_variance_posterior_csg.yaml.j2 index d6490f67d..588aab93a 100644 --- a/parm/jcb-gdas/model/soil/soil_output_variance_posterior_csg.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_output_variance_posterior_csg.yaml.j2 @@ -3,5 +3,5 @@ datapath: ./anl/ filetype: cube sphere history provider: ufs filename: soilinc_{{ soil_ensemble_history_prefix }}.nc -state variables: {{ soil_state_variables_csg }} -field io names: {{ soil_field_io_names_csg }} +state variables: {{ soil_state_variables }} +field io names: {{ soil_field_io_names }} diff --git a/parm/jcb-gdas/model/soil/soil_output_variance_prior_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_variance_prior_csg.yaml.j2 index 2a914becc..6d2f71cd2 100644 --- a/parm/jcb-gdas/model/soil/soil_output_variance_prior_csg.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_output_variance_prior_csg.yaml.j2 @@ -3,5 +3,5 @@ datapath: ./anl/ filetype: cube sphere history provider: ufs filename: soilinc_{{ soil_ensemble_history_prefix }}.nc -state variables: {{ soil_state_variables_csg }} -field io names: {{ soil_field_io_names_csg }} +state variables: {{ soil_state_variables }} +field io names: {{ soil_field_io_names }} diff --git a/parm/jcb-gdas/model/soil/soil_posterior_output_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_posterior_output_csg.yaml.j2 index 420b17ab1..a7d19d62a 100644 --- a/parm/jcb-gdas/model/soil/soil_posterior_output_csg.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_posterior_output_csg.yaml.j2 @@ -3,5 +3,5 @@ datapath: ./anl/ filetype: cube sphere history provider: ufs filename: {{ soil_ensemble_history_prefix }}.nc -state variables: {{ soil_state_variables_csg }} -field io names: {{ soil_field_io_names_csg }} +state variables: {{ soil_state_variables }} +field io names: {{ soil_field_io_names }} diff --git a/parm/soil/jcb-base.yaml.j2 b/parm/soil/jcb-base.yaml.j2 index 6c9338d6d..5631e20df 100644 --- a/parm/soil/jcb-base.yaml.j2 +++ b/parm/soil/jcb-base.yaml.j2 @@ -49,19 +49,35 @@ cost_type: 3D-Var number_of_outer_loops: 1 # Analysis variables -analysis_variables: ['soill1'] #, 'soilt1'] +{% set _analysis_vars = ['soill1'] %} +analysis_variables: {{ _analysis_vars }} # Model things # ------------ + # State variables -soil_state_variables_csg: ['soill1', 'soill2', 'soilt1', 'soilt2', 'slmsk', 'sheleg', 'vtype', 'stype', 'vfrac'] +soil_state_variables: {{ _analysis_vars + ['soill2', + 'soilt1', + 'soilt2', + 'slmsk', + 'sheleg', + 'vtype', + 'stype', + 'vfrac'] }} # Increment variables -soil_increment_variables_csg: ['soill1', 'soilt1'] -soil_increment_variables_final_csg: ['soill1', 'soill2', 'soilt1', 'soilt2', 'slmsk', 'sheleg', 'vtype', 'stype', 'vfrac'] +soil_det_increment_variables: {{ _analysis_vars }} +soil_det_increment_variables_final: {{ _analysis_vars + ['soill2', + 'soilt1', + 'soilt2', + 'slmsk', + 'sheleg', + 'vtype', + 'stype', + 'vfrac'] }} # Variable IO names -soil_field_io_names_csg: +soil_field_io_names: slmsk: land sheleg: weasd stype: sotyp diff --git a/parm/soil/soil_letkf_config.yaml.j2 b/parm/soil/soil_letkf_config.yaml.j2 index 1d91ba7bd..7bf3b42e7 100644 --- a/parm/soil/soil_letkf_config.yaml.j2 +++ b/parm/soil/soil_letkf_config.yaml.j2 @@ -44,8 +44,8 @@ data_out: - ['{{ DATA }}/soilletkfanl.yaml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}soilletkfanl.yaml'] # ens mean increment - - ['{{ DATA }}/anl/mem000/sfcinc_ensmean.{{ current_cycle | to_YMD }}_{{ current_cycle | strftime('%H') }}0000z.nc4', - '{{ COMOUT_ATMOS_ANALYSIS_ENS }}/{{ APREFIX_ENS }}increment.sfc.i006.nc'] + - ['{{ DATA }}/anl/mem000/soilinc_ensmean_{{ GPREFIX_ENS }}nc', + '{{ COMOUT_ATMOS_ANALYSIS_ENS }}/{{ APREFIX_ENS }}jedi_increment.sfc.i006.nc'] {% for imem in range(1, NMEM_ENS+1) %} {% set memchar = 'mem%03d' | format(imem) %} @@ -62,4 +62,5 @@ data_out: {% if DO_ADD_SOIL_INCR %} - ['{{ DATA }}/anl/{{ memchar }}/{{ GPREFIX_ENS }}csg_sfc.f006.nc', '{{ COM_ATMOS_ANALYSIS_TMPL | replace_tmpl(tmpl_dict) }}/{{ current_cycle | to_fv3time }}.soilanl.csg_sfc.nc'] + {% endif %} {% endfor %} From 2ab75544e6b0330f384e5e233e7ea2d05e347023 Mon Sep 17 00:00:00 2001 From: tsga Date: Fri, 31 Jul 2026 16:13:49 +0000 Subject: [PATCH 88/98] edit halo size --- parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml | 2 +- parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 | 2 +- parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml b/parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml index 57fc61b72..d864e1bc5 100644 --- a/parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml +++ b/parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml @@ -3,7 +3,7 @@ commissioned: 2015-04-01T00:00:00 #observer_type: satellite # Type of chronicle to use -# specifying this as satellite requires more info in obs yaml; so keeping it conventiona for now. +# specifying this as satellite requires more info in obs yaml; so keeping it conventional for now. observer_type: conventional # Type of chronicle to use window_option: max diff --git a/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 b/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 index 1c9cba37e..dcfbef809 100644 --- a/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 +++ b/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 @@ -7,7 +7,7 @@ {% if algorithm == "local_ensemble_da" %} distribution: name: {{distribution_type}} - halo size: "{{halo_size}}" + halo size: {{halo_size}} {% endif %} obsdatain: engine: diff --git a/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 b/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 index e28bc9d74..7c12be450 100644 --- a/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 +++ b/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 @@ -7,7 +7,7 @@ {% if algorithm == "local_ensemble_da" %} distribution: name: {{distribution_type}} - halo size: "{{halo_size}}" + halo size: {{halo_size}} {% endif %} obsdatain: engine: From 362c8d0982f473be558364620a14b7e846f32755 Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Tue, 4 Aug 2026 10:26:45 -0400 Subject: [PATCH 89/98] Delete old soil increment config --- .../algorithm/soil/soil_addincrement.yaml.j2 | 50 ------------------- 1 file changed, 50 deletions(-) delete mode 100644 parm/jcb-gdas/algorithm/soil/soil_addincrement.yaml.j2 diff --git a/parm/jcb-gdas/algorithm/soil/soil_addincrement.yaml.j2 b/parm/jcb-gdas/algorithm/soil/soil_addincrement.yaml.j2 deleted file mode 100644 index fff08b67a..000000000 --- a/parm/jcb-gdas/algorithm/soil/soil_addincrement.yaml.j2 +++ /dev/null @@ -1,50 +0,0 @@ -state geometry: - fms initialization: - namelist filename: ./fv3jedi/fmsmpp.nml - field table filename: ./fv3jedi/field_table - akbk: ./fv3jedi/akbk.nc4 - layout: - - {{ soil_layout_x }} - - {{ soil_layout_y }} - npx: {{ soil_npx_ges }} - npy: {{ soil_npy_ges }} - npz: {{ soil_npz_ges }} -increment geometry: - fms initialization: - namelist filename: ./fv3jedi/fmsmpp.nml - field table filename: ./fv3jedi/field_table - akbk: ./fv3jedi/akbk.nc4 - layout: - - {{ soil_layout_x }} - - {{ soil_layout_y }} - npx: {{ soil_npx_anl }} - npy: {{ soil_npy_anl }} - npz: {{ soil_npz_anl }} -state: - state variables: {{ soil_state_variables_fv3 }} - field io names: {{ soil_field_io_names_fv3 }} - datapath: ./bkg - filetype: fms restart - skip coupler file: true - datetime: '{{ soil_background_time_iso }}' - filename_sfcd: {{ soil_background_time_fv3 }}.sfc_data.nc -increment: - added variables: {{ soil_increment_variables_fv3 }} - field io names: {{ soil_field_io_names_fv3 }} - datapath: ./anl - filetype: fms restart - skip coupler file: true - prefix: soilinc - filename is datetime templated: true - datetime: '{{ soil_background_time_iso }}' - filename_sfcd: {{ soil_background_time_fv3 }}.sfc_data.nc -output: - datapath: ./anl - prefix: soilanl - filetype: fms restart - skip coupler file: true - filename is datetime templated: true - datetime: '{{ soil_background_time_iso }}' - filename_sfcd: {{ soil_background_time_fv3 }}.sfc_data.nc - state variables: {{ soil_increment_variables_fv3 }} - field io names: {{ soil_field_io_names_fv3 }} From 784abeafc5ec83dcf4a621d1c33de86259964397 Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Tue, 4 Aug 2026 10:43:27 -0400 Subject: [PATCH 90/98] Delete commented out items --- parm/snow/jcb-base.yaml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/snow/jcb-base.yaml.j2 b/parm/snow/jcb-base.yaml.j2 index f7aef3839..1a23d9c0a 100644 --- a/parm/snow/jcb-base.yaml.j2 +++ b/parm/snow/jcb-base.yaml.j2 @@ -144,7 +144,7 @@ snow_number_ensemble_members: {{NMEM_ENS | default(1, true) }} # ------------------------- local_ensemble_da_solver: Deterministic GETKF -increment_variables: [totalSnowDepth,vtype,slmsk] #[ua,va,DZ,delp,t,ps,sphum,ice_wat,liq_wat,o3mr] +increment_variables: [totalSnowDepth,vtype,slmsk] # Veritcal localization for GETKF vl_fraction_of_retained_variance: 0.750 From afc2bdd3aaee709cbd7d249f6daf1a4496d64991 Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Tue, 4 Aug 2026 10:44:15 -0400 Subject: [PATCH 91/98] Delete commented out lines --- parm/soil/soil_obs_list.yaml.j2 | 3 --- 1 file changed, 3 deletions(-) diff --git a/parm/soil/soil_obs_list.yaml.j2 b/parm/soil/soil_obs_list.yaml.j2 index 427eacc84..233073e73 100644 --- a/parm/soil/soil_obs_list.yaml.j2 +++ b/parm/soil/soil_obs_list.yaml.j2 @@ -1,5 +1,2 @@ observations: - smap_soil -##- t2m_soil -##- prepbufr_adpsfc -##- adpsfc_air_temperature_at_2m_181_gsi From 3ab8f41d1b0edaf6c8b2303e172528d40964569b Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Tue, 4 Aug 2026 10:46:02 -0400 Subject: [PATCH 92/98] change name --- parm/soil/soil_obs_list.yaml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/soil/soil_obs_list.yaml.j2 b/parm/soil/soil_obs_list.yaml.j2 index 233073e73..9f97f75f8 100644 --- a/parm/soil/soil_obs_list.yaml.j2 +++ b/parm/soil/soil_obs_list.yaml.j2 @@ -1,2 +1,2 @@ observations: -- smap_soil +- map_soilmoisture From 6d0c2f700acb1ddc97a0331d76eb2a74fa970598 Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Tue, 4 Aug 2026 10:46:45 -0400 Subject: [PATCH 93/98] fix name --- parm/soil/soil_obs_list.yaml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/soil/soil_obs_list.yaml.j2 b/parm/soil/soil_obs_list.yaml.j2 index 9f97f75f8..dc6aad095 100644 --- a/parm/soil/soil_obs_list.yaml.j2 +++ b/parm/soil/soil_obs_list.yaml.j2 @@ -1,2 +1,2 @@ observations: -- map_soilmoisture +- smap_soilmoisture From b1aae8504d09991446b0de288262db0b9b23545f Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Tue, 4 Aug 2026 10:47:55 -0400 Subject: [PATCH 94/98] rename smap_soil obs config file --- .../soil/{smap_soil.yaml.j2 => map_soilmoisture.yaml.j2} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename parm/jcb-gdas/observations/soil/{smap_soil.yaml.j2 => map_soilmoisture.yaml.j2} (100%) diff --git a/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 b/parm/jcb-gdas/observations/soil/map_soilmoisture.yaml.j2 similarity index 100% rename from parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 rename to parm/jcb-gdas/observations/soil/map_soilmoisture.yaml.j2 From ec9b9fee64df5dd6bd5c390efadc624371c330cd Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Tue, 4 Aug 2026 12:08:18 -0400 Subject: [PATCH 95/98] add comment on npz --- parm/soil/jcb-base.yaml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/soil/jcb-base.yaml.j2 b/parm/soil/jcb-base.yaml.j2 index 5631e20df..3f09302a3 100644 --- a/parm/soil/jcb-base.yaml.j2 +++ b/parm/soil/jcb-base.yaml.j2 @@ -88,7 +88,7 @@ soil_layout_x: {{ layout_x | default(1, true) }} soil_layout_y: {{ layout_y | default(1, true) }} soil_npx_ges: {{ npx_ges | default(49, true) }} soil_npy_ges: {{ npy_ges | default(49, true) }} -soil_npz_ges: {{ npz_ges | default(127, true) }} +soil_npz_ges: {{ npz_ges | default(127, true) }} #note this is atm vertical layers, not soil layers soil_npx_his: {{ npx_his | default(49, true) }} soil_npy_his: {{ npy_his | default(49, true) }} soil_npz_his: {{ npz_his | default(127, true) }} From 53b70a96023cbabb034f2beeffe9cd2a4f3c41b5 Mon Sep 17 00:00:00 2001 From: tsga Date: Wed, 5 Aug 2026 13:48:23 +0000 Subject: [PATCH 96/98] fix smap satellite obs chronicle --- .../observation_chronicle/soil/smap_soil.yaml | 18 ------------------ .../soil/smap_soilmoisture.yaml | 15 +++++++++++++++ ...sture.yaml.j2 => smap_soilmoisture.yaml.j2} | 0 3 files changed, 15 insertions(+), 18 deletions(-) delete mode 100644 parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml create mode 100644 parm/jcb-gdas/observation_chronicle/soil/smap_soilmoisture.yaml rename parm/jcb-gdas/observations/soil/{map_soilmoisture.yaml.j2 => smap_soilmoisture.yaml.j2} (100%) diff --git a/parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml b/parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml deleted file mode 100644 index d864e1bc5..000000000 --- a/parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml +++ /dev/null @@ -1,18 +0,0 @@ -# Instrument metadata -# ------------------- -commissioned: 2015-04-01T00:00:00 - -#observer_type: satellite # Type of chronicle to use -# specifying this as satellite requires more info in obs yaml; so keeping it conventional for now. -observer_type: conventional # Type of chronicle to use - -window_option: max - -# observation type initial configuration -# -------------------------------- -stations_to_reject: - soill1: ['fakelist'] - -# Chronicle of changes for this observation type -# ---------------------------------------- - diff --git a/parm/jcb-gdas/observation_chronicle/soil/smap_soilmoisture.yaml b/parm/jcb-gdas/observation_chronicle/soil/smap_soilmoisture.yaml new file mode 100644 index 000000000..5fee8d6ac --- /dev/null +++ b/parm/jcb-gdas/observation_chronicle/soil/smap_soilmoisture.yaml @@ -0,0 +1,15 @@ +# Instrument metadata +# ------------------- +commissioned: 2015-04-01T00:00:00 + +observer_type: satellite # Type of chronicle to use + +channel_variables: + simulated: min + +channel_values: + 1: [true] + +# Chronicle of changes for this observation type +# ---------------------------------------- +chronicles: [] diff --git a/parm/jcb-gdas/observations/soil/map_soilmoisture.yaml.j2 b/parm/jcb-gdas/observations/soil/smap_soilmoisture.yaml.j2 similarity index 100% rename from parm/jcb-gdas/observations/soil/map_soilmoisture.yaml.j2 rename to parm/jcb-gdas/observations/soil/smap_soilmoisture.yaml.j2 From f8e601f8f21c12bab37de678fd6ace455ff7ed36 Mon Sep 17 00:00:00 2001 From: "Tseganeh Z. Gichamo" Date: Thu, 6 Aug 2026 08:58:24 -0400 Subject: [PATCH 97/98] use predefined snow state vars from jcb-base --- .../model/snow/snow_background_ensemble.yaml.j2 | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/parm/jcb-gdas/model/snow/snow_background_ensemble.yaml.j2 b/parm/jcb-gdas/model/snow/snow_background_ensemble.yaml.j2 index ce7dcab86..a45901909 100644 --- a/parm/jcb-gdas/model/snow/snow_background_ensemble.yaml.j2 +++ b/parm/jcb-gdas/model/snow/snow_background_ensemble.yaml.j2 @@ -3,21 +3,8 @@ members from template: datetime: '{{ snow_background_time_iso }}' filetype: fms restart skip coupler file: true -# provider: ufs - state variables: - - totalSnowDepth - - vtype - - slmsk - - sheleg - - filtered_orography - - fraction_of_ice - - fraction_of_land - - stc - field io names: - totalSnowDepth: snodl - filtered_orography: orog_filt - fraction_of_ice: fice - fraction_of_land: land_frac + state variables: {{ snow_det_state_variables }} + field io names: {{ snow_field_io_names }} datapath: {{ snow_background_ensemble_path }} filename is datetime templated: true filename_sfcd: '{{ snow_background_time_fv3 }}.sfc_data.nc' From f0405e68f67da829f24d28fab0a1fadbeb98be23 Mon Sep 17 00:00:00 2001 From: tsga Date: Thu, 6 Aug 2026 09:09:30 -0400 Subject: [PATCH 98/98] clean up --- parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 | 10 +++++----- .../observations/soil/smap_soilmoisture.yaml.j2 | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 b/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 index dcfbef809..81ebc6756 100644 --- a/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 +++ b/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 @@ -6,8 +6,8 @@ name: {{observation_from_jcb}} {% if algorithm == "local_ensemble_da" %} distribution: - name: {{distribution_type}} - halo size: {{halo_size}} + name: {{ distribution_type }} + halo size: {{ halo_size }} {% endif %} obsdatain: engine: @@ -30,9 +30,9 @@ # ------------ {% if algorithm == "local_ensemble_da" %} obs localizations: - - localization method: {{localization_method}} - lengthscale: {{loc_length_scale}} - max nobs: {{max_nobs}} + - localization method: {{ localization_method }} + lengthscale: {{ loc_length_scale }} + max nobs: {{ max_nobs }} {% endif %} # Observation Filters (QC) diff --git a/parm/jcb-gdas/observations/soil/smap_soilmoisture.yaml.j2 b/parm/jcb-gdas/observations/soil/smap_soilmoisture.yaml.j2 index 7c12be450..2c28b8dcb 100644 --- a/parm/jcb-gdas/observations/soil/smap_soilmoisture.yaml.j2 +++ b/parm/jcb-gdas/observations/soil/smap_soilmoisture.yaml.j2 @@ -6,8 +6,8 @@ name: {{observation_from_jcb}} {% if algorithm == "local_ensemble_da" %} distribution: - name: {{distribution_type}} - halo size: {{halo_size}} + name: {{ distribution_type }} + halo size: {{ halo_size }} {% endif %} obsdatain: engine: @@ -38,9 +38,9 @@ # ------------ {% if algorithm == "local_ensemble_da" %} obs localizations: - - localization method: {{localization_method}} - lengthscale: {{loc_length_scale}} - max nobs: {{max_nobs}} + - localization method: {{ localization_method }} + lengthscale: {{ loc_length_scale }} + max nobs: {{ max_nobs }} {% endif %} obs error: