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 new file mode 100644 index 000000000..f065f10fd --- /dev/null +++ b/parm/jcb-gdas/model/snow/norest_snow_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/snow/snow_background_ensemble.yaml.j2 b/parm/jcb-gdas/model/snow/snow_background_ensemble.yaml.j2 new file mode 100644 index 000000000..f0ad26f11 --- /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..401278fc1 --- /dev/null +++ b/parm/jcb-gdas/model/snow/snow_ensemble_increments_fms.yaml.j2 @@ -0,0 +1,2 @@ +prefix: snowinc +{% include 'snow_ensemble_output_fms_common.yaml.j2' %} diff --git a/parm/jcb-gdas/model/snow/snow_ensemble_output_fms_common.yaml.j2 b/parm/jcb-gdas/model/snow/snow_ensemble_output_fms_common.yaml.j2 new file mode 100644 index 000000000..ea7e19fe2 --- /dev/null +++ b/parm/jcb-gdas/model/snow/snow_ensemble_output_fms_common.yaml.j2 @@ -0,0 +1,10 @@ +datapath: ./anl/mem%{member}% +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_increment_fms.yaml.j2 b/parm/jcb-gdas/model/snow/snow_output_increment_fms.yaml.j2 new file mode 100644 index 000000000..462363d2c --- /dev/null +++ b/parm/jcb-gdas/model/snow/snow_output_increment_fms.yaml.j2 @@ -0,0 +1,2 @@ +prefix: snowinc_ensmean +{% include 'snow_ensemble_output_fms_common.yaml.j2' %} 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 new file mode 100644 index 000000000..905601106 --- /dev/null +++ b/parm/jcb-gdas/model/snow/snow_output_variance_posterior_fms.yaml.j2 @@ -0,0 +1,2 @@ +prefix: snow_ensvariance_posterior +{% 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 new file mode 100644 index 000000000..cc236d0df --- /dev/null +++ b/parm/jcb-gdas/model/snow/snow_output_variance_prior_fms.yaml.j2 @@ -0,0 +1,2 @@ +prefix: snow_ensvariance_prior +{% 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 new file mode 100644 index 000000000..3bfc4e49b --- /dev/null +++ b/parm/jcb-gdas/model/snow/snow_posterior_output_fms.yaml.j2 @@ -0,0 +1,2 @@ +prefix: snow_ens_anl +{% include 'snow_ensemble_output_fms_common.yaml.j2' %} 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-base.yaml.j2 b/parm/snow/jcb-base.yaml.j2 index 1067a721e..a486e6041 100644 --- a/parm/snow/jcb-base.yaml.j2 +++ b/parm/snow/jcb-base.yaml.j2 @@ -9,10 +9,16 @@ 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 - +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 +output_variance_prior_file: snow_output_variance_prior_fms +output_variance_posterior_file: snow_output_variance_posterior_fms +#jedi_increment_output: gaussian # Assimilation window # ------------------- @@ -30,7 +36,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 +65,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,13 +109,14 @@ 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 | default(1, true) }} #do we need the one below? +#number_ensemble_members: {{ NMEM_ENS | default(1, true) }} # Local Ensemble DA (LETKF) # ------------------------- 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 @@ -123,12 +128,17 @@ 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}%/snowinc." +#ensemble_increment_prefix: "./anl/mem%{member}%/snowinc." #posterior_output_gaussian: "./mem%{member}%/snowanl." diff --git a/parm/snow/jcb-prototype_lgetkf.yaml.j2 b/parm/snow/jcb-prototype_lgetkf.yaml.j2 new file mode 100644 index 000000000..46a5f7227 --- /dev/null +++ b/parm/snow/jcb-prototype_lgetkf.yaml.j2 @@ -0,0 +1,29 @@ +# 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 %} + +# 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/snow/jcb-prototype_lgetkf_observer.yaml.j2 b/parm/snow/jcb-prototype_lgetkf_observer.yaml.j2 new file mode 100644 index 000000000..5883a56f2 --- /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/snow +app_path_observation_chronicle: {{PARMgfs}}/gdas/jcb-gdas/observation_chronicle/snow/{{cycle}} + +# 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..d4cc92ae0 --- /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/snow +app_path_observation_chronicle: {{PARMgfs}}/gdas/jcb-gdas/observation_chronicle/snow/{{cycle}} + +# Algorithm +# --------- +algorithm: local_ensemble_da_solver + +# Model things +# ------------ +atmosphere_background_ensemble_path: ./bkg/mem%mem% + +# Naming conventions for observation files +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 + +# Observation things +# ------------------ +{% include OBS_LIST_YAML %} + +# Testing things +# -------------- +{% if DO_TEST_MODE %} +{% include SOL_JEDI_TEST_YAML %} +{% endif %} 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_ens_obs_dist_localizations.yaml.j2 b/parm/snow/snow_ens_obs_dist_localizations.yaml.j2 new file mode 100644 index 000000000..2f8805f97 --- /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_letkf_config.yaml.j2 b/parm/snow/snow_letkf_config.yaml.j2 new file mode 100644 index 000000000..930e667a0 --- /dev/null +++ b/parm/snow/snow_letkf_config.yaml.j2 @@ -0,0 +1,193 @@ +jedi_config: + snowletkfanl: + rundir: '{{ DATA }}' + exe_src: '{{ EXECgfs }}/gdas.x' + 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' + 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' +#TODO: add observer mode +# 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 }}' + +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 '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 }}/snowletkfanl.yaml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}snowletkfanl.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 %} + +{% 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 %}