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 37b15f13e..000000000 --- a/parm/jcb-gdas/algorithm/soil/soil_addincrement.yaml.j2 +++ /dev/null @@ -1,51 +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 }} -state: - state variables: {{ soil_det_increment_variables }} - field io names: {{ soil_field_io_names }} - 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_det_increment_variables }} - field io names: {{ soil_field_io_names }} - 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_addincrement_state_variables }} - field io names: {{ soil_field_io_names }} 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..a45901909 --- /dev/null +++ b/parm/jcb-gdas/model/snow/snow_background_ensemble.yaml.j2 @@ -0,0 +1,16 @@ +members from template: + template: + datetime: '{{ snow_background_time_iso }}' + filetype: fms restart + skip coupler file: true + 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' + 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/model/soil/soil_3dvar_outer_loop_1.yaml.j2 b/parm/jcb-gdas/model/soil/soil_3dvar_outer_loop_1.yaml.j2 index 8dd306dbe..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 }} - datapath: {{ soil_orog_files_path }}/ - filename_orog: {{ soil_orog_prefix }}_oro_data.nc diagnostics: departures: bkgmob diff --git a/parm/jcb-gdas/model/soil/soil_background.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background.yaml.j2 deleted file mode 100644 index 7957a9a9d..000000000 --- a/parm/jcb-gdas/model/soil/soil_background.yaml.j2 +++ /dev/null @@ -1,9 +0,0 @@ -datapath: {{ soil_background_path }} -filetype: fms restart -skip coupler file: true -datetime: '{{ soil_background_time_iso }}' -state variables: {{ soil_det_state_variables }} -field io names: {{ soil_field_io_names }} -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_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_csg.yaml.j2 new file mode 100644 index 000000000..0a4da9dd3 --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_background_csg.yaml.j2 @@ -0,0 +1,10 @@ +datapath: {{ soil_background_path }} +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 +max allowable geometry difference: 1e-4 +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 new file mode 100644 index 000000000..43652d67c --- /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 }} + 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_background_error.yaml.j2 b/parm/jcb-gdas/model/soil/soil_background_error_static_csg.yaml.j2 similarity index 60% rename from parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 rename to parm/jcb-gdas/model/soil/soil_background_error_static_csg.yaml.j2 index ba8169e71..74ff83e38 100644 --- a/parm/jcb-gdas/model/soil/soil_background_error.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_background_error_static_csg.yaml.j2 @@ -1,29 +1,31 @@ covariance model: SABER saber central block: saber block name: BUMP_NICAS - calibration: #read: + read: general: universe length-scale: 5000000.0 drivers: multivariate strategy: univariate - compute nicas: true #read global nicas: true - write global nicas: true + read global nicas: true nicas: resolution: 4 explicit length-scales: true horizontal length-scale: - - groups: {{ soil_det_increment_variables }} + - groups: + - soill1 value: 1000000.0 vertical length-scale: - - groups: {{ soil_det_increment_variables }} + - groups: + - soill1 value: 1500.0 interpolation type: - - groups: {{ soil_det_increment_variables }} + - groups: + - soill1 type: c0 same horizontal convolution: true io: data directory: ./berror - files prefix: smc_bump_nicas_1000km_{{ soil_background_time_fv3 }} + files prefix: smc_bump saber outer blocks: - saber block name: BUMP_StdDev read: @@ -32,5 +34,6 @@ saber outer blocks: variance: explicit stddev: true stddev: - - variables: {{ soil_det_increment_variables }} - value: 0.2 + - 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_ensemble_increments_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_ensemble_increments_csg.yaml.j2 new file mode 100644 index 000000000..4343465bc --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_ensemble_increments_csg.yaml.j2 @@ -0,0 +1,6 @@ +datapath: ./anl/mem%{member}% +filetype: cube sphere history +provider: ufs +filename: soilinc_{{ soil_ensemble_history_prefix }}nc +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 new file mode 100644 index 000000000..dcc138c91 --- /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 }} +field io names: {{ soil_field_io_names }} diff --git a/parm/jcb-gdas/model/soil/soil_final_increment_fms.yaml.j2 b/parm/jcb-gdas/model/soil/soil_final_increment_csg.yaml.j2 similarity index 53% rename from parm/jcb-gdas/model/soil/soil_final_increment_fms.yaml.j2 rename to parm/jcb-gdas/model/soil/soil_final_increment_csg.yaml.j2 index 7623c70a3..60f0153b7 100644 --- a/parm/jcb-gdas/model/soil/soil_final_increment_fms.yaml.j2 +++ b/parm/jcb-gdas/model/soil/soil_final_increment_csg.yaml.j2 @@ -1,12 +1,11 @@ output: state component: + filetype: cube sphere history + provider: ufs 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: {{ soil_det_increment_variables_final }} + filename: soilinc_{{ soil_variational_history_prefix }}nc field io names: {{ soil_field_io_names }} + geometry: fms initialization: namelist filename: "{{ soil_fv3jedi_files_path }}/fmsmpp.nml" @@ -15,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..a90f8a690 --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_final_increment_gaussian.yaml.j2 @@ -0,0 +1,11 @@ +grid type: regular gaussian +local interpolator type: oops unstructured grid interpolator +number of latitude gridpoints: {{ (soil_npy_anl | int) - 1 }} +datapath: ./anl +prefix: {{ soil_gaussian_increment_prefix }} +all model levels: true +date colons: false +variables to output: +- soill1 +field io names: + soill1: slc1_inc 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_increment_csg.yaml.j2 b/parm/jcb-gdas/model/soil/soil_output_increment_csg.yaml.j2 new file mode 100644 index 000000000..d961551cf --- /dev/null +++ b/parm/jcb-gdas/model/soil/soil_output_increment_csg.yaml.j2 @@ -0,0 +1,6 @@ +datapath: ./anl/mem%{member}% +filetype: cube sphere history +provider: ufs +filename: soilinc_ensmean_{{ soil_ensemble_history_prefix }}nc +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 new file mode 100644 index 000000000..a96105f3b --- /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 }} +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 new file mode 100644 index 000000000..1ac4e09b6 --- /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 }} +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 new file mode 100644 index 000000000..588aab93a --- /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 }} +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 new file mode 100644 index 000000000..6d2f71cd2 --- /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 }} +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 new file mode 100644 index 000000000..a7d19d62a --- /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 }} +field io names: {{ soil_field_io_names }} diff --git a/parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml b/parm/jcb-gdas/observation_chronicle/soil/smap_soilmoisture.yaml similarity index 73% rename from parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml rename to parm/jcb-gdas/observation_chronicle/soil/smap_soilmoisture.yaml index 4ad03228f..5fee8d6ac 100644 --- a/parm/jcb-gdas/observation_chronicle/soil/smap_soil.yaml +++ b/parm/jcb-gdas/observation_chronicle/soil/smap_soilmoisture.yaml @@ -4,7 +4,12 @@ commissioned: 2015-04-01T00:00:00 observer_type: satellite # Type of chronicle to use -window_option: max +channel_variables: + simulated: min + +channel_values: + 1: [true] # Chronicle of changes for this observation type # ---------------------------------------- +chronicles: [] diff --git a/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 b/parm/jcb-gdas/observations/snow/ghcn_snow.yaml.j2 index 4016841b9..81ebc6756 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/jcb-gdas/observations/soil/smap_soil.yaml.j2 b/parm/jcb-gdas/observations/soil/smap_soilmoisture.yaml.j2 similarity index 64% rename from parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 rename to parm/jcb-gdas/observations/soil/smap_soilmoisture.yaml.j2 index 385063747..2c28b8dcb 100644 --- a/parm/jcb-gdas/observations/soil/smap_soil.yaml.j2 +++ b/parm/jcb-gdas/observations/soil/smap_soilmoisture.yaml.j2 @@ -4,23 +4,47 @@ # ----------------------- 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: + 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 + #TODO: change these to include alias names with SoilMoistureVolumetric + simulated variables: + - soill1 + variable maps: + - name: soilMoistureVolumetric + alias: soill1 # Observation Operator # -------------------- 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) # ------------------------ @@ -29,18 +53,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 @@ -49,20 +67,18 @@ 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 + - name: soill1 action: name: assign error - error parameter: 0.20 + error parameter: 0.04 - filter: Domain Check where: - variable: - name: ObsValue/soilMoistureVolumetric + name: ObsValue/soill1 value: is_valid actions: - name: set @@ -72,7 +88,7 @@ obs prior filters: - filter: Bounds Check filter variables: - - name: soilMoistureVolumetric + - name: soill1 minvalue: 0.0 maxvalue: 1.0 actions: @@ -80,26 +96,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 # 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: @@ -113,7 +109,7 @@ - filter: Domain Check # high-quality retrievals where: - variable: - name: PreQC/soilMoistureVolumetric + name: PreQC/soill1 is_in: 0, 8 actions: - name: set @@ -131,21 +127,45 @@ flag: landice_check ignore: rejected observations - name: reject - - filter: RejectList # exclude certain IGBP vegetation types + - 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: [1, 2, 3, 4, 13, 15, 17] + 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 + udescriptor: "bounds_check_ObsError" + filter variables: + - name: soill1 + test variables: + - name: ObsErrorData/soill1 + minvalue: 0.0 + maxvalue: 0.2 + action: + name: reject + + # Bounds Check (ObsValue) + - filter: Bounds Check + udescriptor: "bounds_check_ObsValue" + filter variables: + - name: soill1 + test variables: + - name: ObsValue/soill1 + minvalue: 0.02 + maxvalue: 0.5 + action: + name: reject + - 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/snow/jcb-base.yaml.j2 b/parm/snow/jcb-base.yaml.j2 index eb84b3125..1a23d9c0a 100644 --- a/parm/snow/jcb-base.yaml.j2 +++ b/parm/snow/jcb-base.yaml.j2 @@ -9,10 +9,16 @@ app_path_observation_chronicle: "{{PARMglobal}}/gdas/jcb-gdas/observation_chroni # 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 # ------------------------ minimizer: DRPCG @@ -91,19 +96,16 @@ snow_orog_prefix: "{{ CASE }}.mx{{ OCNRES }}" # Background snow_background_path: {{snow_bkg_path}} -background_ensemble_path: ./ens/mem%mem% +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 snow_forecast_length: "{{ SNOW_WINDOW_LENGTH }}" snow_forecast_timestep: "{{ BKG_TSTEP }}" - # Observation things # ------------------ observations: all_observations @@ -136,13 +138,13 @@ 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) }} # Local Ensemble DA (LETKF) # ------------------------- local_ensemble_da_solver: Deterministic GETKF -increment_variables: {{ _analysis_vars }} # dummy for now +increment_variables: [totalSnowDepth,vtype,slmsk] # Veritcal localization for GETKF vl_fraction_of_retained_variance: 0.750 @@ -154,12 +156,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 %} diff --git a/parm/soil/apply_incr_nml.j2 b/parm/soil/apply_incr_nml.j2 new file mode 100644 index 000000000..5273c9f10 --- /dev/null +++ b/parm/soil/apply_incr_nml.j2 @@ -0,0 +1,19 @@ +&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 }}", + csg_increment = {{ csg_increment }} +/ diff --git a/parm/soil/jcb-base.yaml.j2 b/parm/soil/jcb-base.yaml.j2 index 381a24806..3f09302a3 100644 --- a/parm/soil/jcb-base.yaml.j2 +++ b/parm/soil/jcb-base.yaml.j2 @@ -1,18 +1,28 @@ # 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 # ------------------------------------------------------------ -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_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 # Assimilation window # ------------------- @@ -30,7 +40,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 # ------------------------ minimizer: DRPCG @@ -40,69 +49,74 @@ cost_type: 3D-Var number_of_outer_loops: 1 # Analysis variables -{% set _analysis_vars = ['soilMoistureVolumetric'] %} +{% set _analysis_vars = ['soill1'] %} analysis_variables: {{ _analysis_vars }} # Model things # ------------ # State variables -soil_det_state_variables: {{ _analysis_vars + ['slmsk', - 'sheleg', - 'vtype', - 'stc', - 'filtered_orography', - 'fraction_of_ice' - 'fraction_of_land', - 'totalSnowDepth'] }} +soil_state_variables: {{ _analysis_vars + ['soill2', + 'soilt1', + 'soilt2', + 'slmsk', + 'sheleg', + 'vtype', + 'stype', + 'vfrac'] }} # Increment variables soil_det_increment_variables: {{ _analysis_vars }} -soil_det_increment_variables_final: {{ _analysis_vars + ['slmsk', +soil_det_increment_variables_final: {{ _analysis_vars + ['soill2', + 'soilt1', + 'soilt2', + 'slmsk', 'sheleg', 'vtype', - 'stc', - 'totalSnowDepth'] }} + 'stype', + 'vfrac'] }} # Variable IO names soil_field_io_names: - soilMoistureVolumetric: smc - totalSnowDepth: snodl - filtered_orography: orog_filt - fraction_of_ice: fice - fraction_of_land: land_frac + slmsk: land + sheleg: weasd + stype: sotyp + vfrac: veg # Geometry 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_npx_anl: {{ npx_ges | default(49, true) }} -soil_npy_anl: {{ npy_ges | default(49, true) }} -soil_npz_anl: {{ 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) }} +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_ensemble_path: ./ens/mem%mem% +soil_background_path: ./bkg +background_file: soil_background_csg # Background error soil_bump_data_directory: "{{ DATA }}/berror" -number_ensemble_members: {{ NMEM_ENS | default(1, true) }} - -soil_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 # ------------------ observations: all_observations @@ -113,7 +127,8 @@ crtm_coefficient_path: "{{ DATA }}/crtm/" 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_ @@ -134,14 +149,19 @@ soil_obsbiasout_suffix: ".satbias.nc" soil_obsbiascovout_prefix: "{{APREFIX}}" soil_obsbiascovout_suffix: ".satbias_cov.nc" -# Ensemble mean things -soil_number_ensemble_members: {{NMEM_ENS}} +# 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 }}" # Local Ensemble DA (LETKF) # ------------------------- -local_ensemble_da_solver: Deterministic GETKF - -increment_variables: {{ _analysis_vars}} # dummy for now +local_ensemble_da_solver: Deterministic LETKF #GETKF + +increment_variables: ['soill1', 'soill2', 'soilt1', 'soilt2'] # Veritcal localization for GETKF vl_fraction_of_retained_variance: 0.750 @@ -153,12 +173,21 @@ 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: false #true +driver_save_posterior_ensemble: false #true +driver_save_posterior_mean_increment: true driver_save_posterior_ensemble_increments: true +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 # Diagnostics -ensemble_increment_prefix: "./anl/mem%{member}%/soilinc." +soil_increment_path: ./anl +soil_increment_ensemble_path: ./anl/mem%mem% +soil_increment_prefix: "{{ SOIL_INC_PREFIX }}" +soil_gaussian_increment_prefix: "{{ SOIL_GINC_PREFIX }}" #posterior_output_gaussian: "./mem%{member}%/soilanl." +# diff --git a/parm/soil/jcb-prototype_lgetkf.yaml.j2 b/parm/soil/jcb-prototype_lgetkf.yaml.j2 new file mode 100644 index 000000000..276511f03 --- /dev/null +++ b/parm/soil/jcb-prototype_lgetkf.yaml.j2 @@ -0,0 +1,31 @@ +# Use observations for lgetkf +# --------------------------- +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% + +# 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" +halo_size: 1250e3 +loc_length_scale: 1250e3 +max_nobs: 10000 + +# Testing things +# -------------- +{% if DO_TEST_MODE %} +{% include LETKF_JEDI_TEST_YAML %} +{% endif %} diff --git a/parm/soil/soil_det_config.yaml.j2 b/parm/soil/soil_det_config.yaml.j2 index 6b7133762..5b5783a20 100644 --- a/parm/soil/soil_det_config.yaml.j2 +++ b/parm/soil/soil_det_config.yaml.j2 @@ -1,18 +1,12 @@ 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 }}' - 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: @@ -23,87 +17,30 @@ data_in: - '{{ DATA }}/fv3jedi' - '{{ DATA }}/berror' - copy: - - ['{{ 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/'] + copy_req: - - ["{{ 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" ] + - ['{{ 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'] {% 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'] - - ['{{ 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'] +# Increments + - ['{{ 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 }}/{{ APREFIX }}increment.sfc.i006.nc'] -{% if DOIAU %} - {% set bkgtimes = [ current_cycle, WINDOW_BEGIN ] %} -{% else %} - {% set bkgtimes = [ current_cycle ] %} -{% 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'] -{% 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 %} +{% if DO_ADD_SOIL_INCR %} +# Copy soil analysis (for non-iau) # Analysis = bkg + inc + - ['{{ DATA }}/anl/{{ GPREFIX }}csg_sfc.f006.nc', + '{{ COMOUT_SOIL_ANALYSIS }}/soilanl.{{ current_cycle | to_fv3time }}.csg_sfc.nc'] {% endif %} 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..7bf3b42e7 --- /dev/null +++ b/parm/soil/soil_letkf_config.yaml.j2 @@ -0,0 +1,66 @@ +jedi_config: + soilletkfanl: + rundir: '{{ DATA }}' + exe_src: '{{ EXECglobal }}/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' + +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 tmpl_dict = ({ '${ROTDIR}': ROTDIR, + '${RUN}': RUN, + '${YMD}': previous_cycle | to_YMD, + '${HH}': previous_cycle | strftime('%H'), + '${MEMDIR}': 'mem%03d' | format(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 }}/'] +{% 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 %} + +data_out: + copy_req: + # Configuration files + - ['{{ DATA }}/soilletkfanl.yaml', '{{ COMOUT_CONF }}/{{ APREFIX_ENS }}soilletkfanl.yaml'] + + # ens mean increment + - ['{{ 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) %} + {% 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_{{ 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 %} + - ['{{ 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 %} diff --git a/parm/soil/soil_obs_list.yaml.j2 b/parm/soil/soil_obs_list.yaml.j2 index 233073e73..dc6aad095 100644 --- a/parm/soil/soil_obs_list.yaml.j2 +++ b/parm/soil/soil_obs_list.yaml.j2 @@ -1,2 +1,2 @@ observations: -- smap_soil +- smap_soilmoisture 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'] 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..13bffd83d --- /dev/null +++ b/parm/soil/soil_stage_bufr2ioda_mapping.yaml.j2 @@ -0,0 +1 @@ +- ['{{PARMglobal}}/gdas/soil/prep/prepbufr_adpsfc.yaml', '{{ DATA }}/obs/'] 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']