Skip to content

Commit 5fa85ef

Browse files
authored
Add smap soil moisture config files to jcb-gdas (#2011)
# Description This PR adds config files for SMAP soil moisture data type. The changes here are intended to be used for JEDI soil DA in the land offline workflow. The corresponding pygfs changes are included in the PR NOAA-PSL/land-offline_workflow#58 The changes here are only addition of soil config files and do not directly affect any of the tests, but the two related CI tests **C96C48_hybatmsnowDA** and **C96C48_hybatmsoilDA** were run and pass on URSA. # Companion PRs [jcb-gdas #218](NOAA-EMC/jcb-gdas#218) [land-offline workflow #58](NOAA-PSL/land-offline_workflow#58) # Issues <!-- Enter any issues referenced or resolved by this PR here. Use keywords "Resolves" or "Refs". Refs [NOAA-PSL/land-DA_update/issues/37](NOAA-PSL/land-DA_update#37) --> # Automated CI tests to run in Global Workflow <!-- Which Global Workflow CI tests are required to adequately test this PR? --> - [ ] atm_jjob <!-- JEDI atm single cycle DA !--> - [ ] C96C48_ufs_hybatmDA <!-- JEDI atm cycled DA !--> - [x] C96C48_hybatmsnowDA <!-- JEDI snow cycled DA !--> - [x] C96C48_hybatmsoilDA <!-- JEDI soil cycled DA with warm start !--> - [ ] C96_gcafs_cycled <!-- JEDI aerosol cycled DA !--> - [ ] C48mx500_3DVarAOWCDA <!-- JEDI low-res marine 3DVar cycled DA !--> - [ ] C48mx500_hybAOWCDA <!-- JEDI marine hybrid envar cycled DA !--> - [ ] C96C48_ufsgsi_hybatmDA <!-- JEDI atm Var with GSI EnKF cycled DA !--> - [ ] C96C48_hybatmDA <!-- GSI atm cycled DA !-->
1 parent c30d56c commit 5fa85ef

6 files changed

Lines changed: 252 additions & 0 deletions

parm/soil/jcb-base.yaml.j2

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
# Search path for model and obs for JCB
2+
# -------------------------------------
3+
algorithm_path: "{{PARMgdas}}/jcb-algorithms"
4+
app_path_algorithm: "{{PARMgdas}}/jcb-gdas/algorithm/soil"
5+
app_path_model: "{{PARMgdas}}/jcb-gdas/model/soil"
6+
app_path_observations: "{{PARMgdas}}/jcb-gdas/observations/soil"
7+
app_path_observation_chronicle: "{{PARMgdas}}/jcb-gdas/observation_chronicle/soil"
8+
9+
10+
# Places where we deviate from the generic file name of a yaml
11+
# ------------------------------------------------------------
12+
final_increment_file: soil_final_increment_fms
13+
model_file: model_pseudo
14+
initial_condition_file: background # Initial conditions for 4D apps is background
15+
output_file: soil_output
16+
17+
# Assimilation window
18+
# -------------------
19+
window_begin: "{{ WINDOW_BEGIN | to_isotime }}"
20+
window_length: "{{ WINDOW_LENGTH }}"
21+
bound_to_include: begin
22+
23+
# Default background time is for 3D applications
24+
{% set bkg_time_iso = current_cycle | to_isotime %}
25+
{% set bkg_time_fv3 = current_cycle | to_fv3time %}
26+
{% set bkg_time_julian = current_cycle | to_julian %}
27+
soil_background_time_iso: "{{ bkg_time_iso }}"
28+
soil_background_time_fv3: "{{ bkg_time_fv3 }}"
29+
soil_background_time_julian: "{{ bkg_time_julian }}"
30+
soil_increment_time_iso: "{{ bkg_time_iso }}"
31+
soil_increment_time_fv3: "{{ bkg_time_fv3 }}"
32+
33+
34+
# Analysis standard things
35+
# ------------------------
36+
analysis_variables: [soilMoistureVolumetric]
37+
minimizer: DRPCG
38+
final_diagnostics_departures: anlmob
39+
final_prints_frequency: PT3H
40+
cost_type: 3D-Var
41+
number_of_outer_loops: 1
42+
43+
# Model things
44+
# ------------
45+
# Geometry
46+
soil_layout_x: {{ layout_x | default(1, true) }}
47+
soil_layout_y: {{ layout_y | default(1, true) }}
48+
soil_npx_ges: {{ npx_ges | default(49, true) }}
49+
soil_npy_ges: {{ npy_ges | default(49, true) }}
50+
soil_npz_ges: {{ npz_ges | default(127, true) }}
51+
soil_npx_anl: {{ npx_ges | default(49, true) }}
52+
soil_npy_anl: {{ npy_ges | default(49, true) }}
53+
soil_npz_anl: {{ npz_ges | default(127, true) }}
54+
55+
soil_variational_history_prefix: "{{ GPREFIX }}"
56+
57+
soil_fv3jedi_files_path: ./fv3jedi # Ideally this would be {{DATA}}/fv3jedi but FMS
58+
soil_orog_files_path: "{{ soil_bkg_path }}"
59+
soil_orog_prefix: "{{ CASE }}.mx{{ OCNRES }}"
60+
61+
# Background
62+
soil_background_path: {{ soil_bkg_path }}
63+
background_ensemble_path: ./ens/mem%mem%
64+
65+
# Background error
66+
soil_bump_data_directory: "{{ DATA }}/berror"
67+
number_ensemble_members: {{ NMEM_ENS | default(1, true) }}
68+
69+
soil_background_error_file: "{{BERROR_YAML}}"
70+
71+
# Forecasting
72+
soil_forecast_length: "{{ SNOW_WINDOW_LENGTH }}"
73+
soil_forecast_timestep: "{{ BKG_TSTEP }}"
74+
75+
76+
# Observation things
77+
# ------------------
78+
observations: all_observations
79+
80+
crtm_coefficient_path: "{{ DATA }}/crtm/"
81+
82+
# Naming conventions for observational files
83+
soil_obsdataroot_path: "{{COMIN_OBS}}"
84+
soil_obsdatain_path: "{{DATA}}/obs"
85+
soil_obsdatain_prefix: "{{OPREFIX}}"
86+
soil_obsdatain_suffix: "" #.tm00.bufr_d"
87+
soil_obsdataout_path: "{{DATA}}/diags"
88+
soil_prepobs_path: "{{DATA}}/prep"
89+
soil_obsdataout_prefix: diag_
90+
soil_obsdataout_suffix: "_{{ current_cycle | to_YMDH }}.nc"
91+
92+
# Naming conventions for bias correction files
93+
soil_obsbiasin_path: "{{DATA}}/obs/"
94+
soil_obsbiasin_prefix: "{{GPREFIX}}"
95+
soil_obsbiasin_suffix: ".satbias.nc"
96+
soil_obstlapsein_prefix: "{{GPREFIX}}"
97+
soil_obstlapsein_suffix: ".tlapse.txt"
98+
soil_obsbiascovin_prefix: "{{GPREFIX}}"
99+
soil_obsbiascovin_suffix: ".satbias_cov.nc"
100+
101+
soil_obsbiasout_path: "{{DATA}}/bc/"
102+
soil_obsbiasout_prefix: "{{APREFIX}}"
103+
soil_obsbiasout_suffix: ".satbias.nc"
104+
soil_obsbiascovout_prefix: "{{APREFIX}}"
105+
soil_obsbiascovout_suffix: ".satbias_cov.nc"
106+
107+
# Ensemble mean things
108+
soil_number_ensemble_members: {{NMEM_ENS}}
109+
110+
# Local Ensemble DA (LETKF)
111+
# -------------------------
112+
local_ensemble_da_solver: Deterministic GETKF
113+
114+
increment_variables: [ua,va,DZ,delp,t,ps,sphum,ice_wat,liq_wat,o3mr]
115+
116+
# Veritcal localization for GETKF
117+
vl_fraction_of_retained_variance: 0.750
118+
vl_lengthscale: 2.1
119+
vl_lengthscale_units: logp
120+
inflation_rtps: 0.85
121+
inflation_rtpp: 0.0
122+
inflation_mult: 1.0
123+
124+
# Driver
125+
driver_update_obs_config_with_geometry_info: true
126+
driver_save_posterior_mean: false
127+
driver_save_posterior_ensemble: false
128+
driver_save_prior_mean: false
129+
driver_save_posterior_mean_increment: false
130+
driver_save_posterior_ensemble_increments: true
131+
132+
# Diagnostics
133+
ensemble_increment_prefix: "./anl/mem%{member}%/soilinc."
134+
#posterior_output_gaussian: "./mem%{member}%/soilanl."

parm/soil/soil_det_config.yaml.j2

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
jedi_config:
2+
soilanlvar:
3+
rundir: '{{ DATA }}'
4+
exe_src: '{{ EXECgdas }}/gdas.x'
5+
mpi_cmd: '{{ APRUN_SOILANL }}'
6+
jedi_args: ['fv3jedi', 'variational']
7+
jcb_base_yaml: '{{ PARMgdas }}/soil/jcb-base.yaml.j2'
8+
jcb_algo: '3dvar'
9+
obs_list_yaml: '{{ OBS_LIST_YAML }}'
10+
soilanladdinc:
11+
rundir: '{{ DATA }}'
12+
exe_src: '{{ EXECgdas }}/fv3jedi_addincrement.x'
13+
mpi_cmd: '{{ APRUN_SOIL_ADDINC }}'
14+
jcb_base_yaml: '{{ PARMgdas }}/soil/jcb-base.yaml.j2'
15+
jcb_algo: soil_addincrement
16+
17+
data_in:
18+
mkdir:
19+
- '{{ DATA }}/bkg'
20+
- '{{ DATA }}/anl'
21+
- '{{ DATA }}/obs'
22+
- '{{ DATA }}/diags'
23+
- '{{ DATA }}/fv3jedi'
24+
- '{{ DATA }}/berror'
25+
26+
copy:
27+
- ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.coupler.res', '{{ DATA }}/bkg/']
28+
- ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc', '{{ DATA }}/bkg/']
29+
- ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc', '{{ DATA }}/bkg/']
30+
- ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc', '{{ DATA }}/bkg/']
31+
- ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc', '{{ DATA }}/bkg/']
32+
- ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc', '{{ DATA }}/bkg/']
33+
- ['{{ COMIN_ATMOS_RESTART_PREV }}/{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc', '{{ DATA }}/bkg/']
34+
35+
- ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile1.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile1.nc" ]
36+
- ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile2.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile2.nc" ]
37+
- ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile3.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile3.nc" ]
38+
- ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile4.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile4.nc" ]
39+
- ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile5.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile5.nc" ]
40+
- ["{{ FIXorog }}/{{ CASE }}/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile6.nc", "{{ DATA }}/bkg/{{ CASE }}.mx{{ OCNRES }}_oro_data.tile6.nc" ]
41+
42+
{% filter indent(width=4) %}
43+
{% include 'soil_stage_jedi_fix.yaml.j2' %}
44+
{% include 'soil_stage_berror.yaml.j2' %}
45+
{% endfilter %}
46+
47+
copy_opt:
48+
{% filter indent(width=4) %}
49+
{% include 'soil_stage_obs.yaml.j2' %}
50+
{% endfilter %}
51+
52+
data_out:
53+
copy:
54+
# Configuration files
55+
- ['{{ DATA }}/soilanlvar.yaml', '{{ COMOUT_CONF }}/{{ APREFIX }}soilanlvar.yaml']
56+
- ['{{ DATA }}/soilanladdinc.yaml', '{{ COMOUT_CONF }}/{{ APREFIX }}soilanladdinc.yaml']
57+
- ['{{ DATA }}/soil_obs_list.yaml.j2', '{{ COMOUT_CONF }}/{{ APREFIX }}soil_obs_list.yaml.j2']
58+
59+
# Increments
60+
- ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile1.nc',
61+
'{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile1.nc']
62+
- ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile2.nc',
63+
'{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile2.nc']
64+
- ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile3.nc',
65+
'{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile3.nc']
66+
- ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile4.nc',
67+
'{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile4.nc']
68+
- ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile5.nc',
69+
'{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile5.nc']
70+
- ['{{ DATA }}/anl/soilinc.{{ current_cycle | to_fv3time }}.sfc_data.tile6.nc',
71+
'{{ COMOUT_SOIL_ANALYSIS }}/{{ current_cycle | to_fv3time }}.soil_increment.sfc_data.tile6.nc']
72+
73+
{% if DOIAU %}
74+
{% set bkgtimes = [ current_cycle, WINDOW_BEGIN ] %}
75+
{% else %}
76+
{% set bkgtimes = [ current_cycle ] %}
77+
{% endif %}
78+
{% for bkgtime in bkgtimes %}
79+
# Analysis = bkg + inc
80+
- ['{{ DATA }}/anl/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc',
81+
'{{ COMOUT_SOIL_ANALYSIS }}/{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc']
82+
- ['{{ DATA }}/anl/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc',
83+
'{{ COMOUT_SOIL_ANALYSIS }}/{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc']
84+
- ['{{ DATA }}/anl/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc',
85+
'{{ COMOUT_SOIL_ANALYSIS }}/{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc']
86+
- ['{{ DATA }}/anl/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc',
87+
'{{ COMOUT_SOIL_ANALYSIS }}/{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc']
88+
- ['{{ DATA }}/anl/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc',
89+
'{{ COMOUT_SOIL_ANALYSIS }}/{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc']
90+
- ['{{ DATA }}/anl/soilanl.{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc',
91+
'{{ COMOUT_SOIL_ANALYSIS }}/{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc']
92+
{% endfor %}
93+
{% if DO_FINAL_SOILANL %}
94+
{% for bkgtime in bkgtimes %}
95+
# Final 3DVar Analysis
96+
- ['{{ DATA }}/anl/soil_finanl.{{ bkgtime | to_fv3time }}.sfc_data.tile1.nc',
97+
'{{ COMOUT_SOIL_ANALYSIS }}/{{ bkgtime | to_fv3time }}.sfcanl_data.tile1.nc']
98+
- ['{{ DATA }}/anl/soil_finanl.{{ bkgtime | to_fv3time }}.sfc_data.tile2.nc',
99+
'{{ COMOUT_SOIL_ANALYSIS }}/{{ bkgtime | to_fv3time }}.sfcanl_data.tile2.nc']
100+
- ['{{ DATA }}/anl/soil_finanl.{{ bkgtime | to_fv3time }}.sfc_data.tile3.nc',
101+
'{{ COMOUT_SOIL_ANALYSIS }}/{{ bkgtime | to_fv3time }}.sfcanl_data.tile3.nc']
102+
- ['{{ DATA }}/anl/soil_finanl.{{ bkgtime | to_fv3time }}.sfc_data.tile4.nc',
103+
'{{ COMOUT_SOIL_ANALYSIS }}/{{ bkgtime | to_fv3time }}.sfcanl_data.tile4.nc']
104+
- ['{{ DATA }}/anl/soil_finanl.{{ bkgtime | to_fv3time }}.sfc_data.tile5.nc',
105+
'{{ COMOUT_SOIL_ANALYSIS }}/{{ bkgtime | to_fv3time }}.sfcanl_data.tile5.nc']
106+
- ['{{ DATA }}/anl/soil_finanl.{{ bkgtime | to_fv3time }}.sfc_data.tile6.nc',
107+
'{{ COMOUT_SOIL_ANALYSIS }}/{{ bkgtime | to_fv3time }}.sfcanl_data.tile6.nc']
108+
{% endfor %}
109+
{% endif %}

parm/soil/soil_obs_list.yaml.j2

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
observations:
2+
- smap_soil
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
- ['{{ BCOV_DIR }}/smc_bump_nicas_1000km.nc', '{{ DATA }}/berror']
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
- ['{{ FIXgdas }}/fv3files/akbk{{ npz }}.nc4', '{{ DATA }}/fv3jedi/akbk.nc4']
2+
- ['{{ FIXgdas }}/fv3files/fmsmpp.nml', '{{ DATA }}/fv3jedi/fmsmpp.nml']
3+
- ['{{ FIXgdas }}/fv3files/field_table_gfdl', '{{ DATA }}/fv3jedi/field_table']

parm/soil/soil_stage_obs.yaml.j2

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{% for ob_name in observations %}
2+
- ['{{ COMIN_OBS }}/{{ OPREFIX }}{{ ob_name }}.nc', '{{ DATA }}/obs']
3+
{% endfor %}

0 commit comments

Comments
 (0)