-
Notifications
You must be signed in to change notification settings - Fork 25
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add options for Mixed Ensemble and Scale/Variable-Dependent Localization #451
Changes from 1 commit
4fda327
b46f252
91791b2
e81c805
c6084ab
10d6c2a
2f6fdef
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
met_guess:: | ||
!var level crtm_use desc orig_name | ||
ps 1 -1 surface_pressure ps | ||
z 1 -1 geopotential_height phis | ||
u 65 2 zonal_wind u | ||
v 65 2 meridional_wind v | ||
w 65 2 vertical velocity w | ||
tv 65 2 virtual_temperature tv | ||
q 65 2 specific_humidity sphu | ||
oz 65 2 ozone ozone | ||
delp 65 -1 fv3 del pressure delp | ||
t2m 1 -1 2-m_T t2m | ||
q2m 1 -1 2-m_Q q2m | ||
ql 65 10 cloud_condensate QCLOUD | ||
qr 65 10 rain QRAIN | ||
qs 65 10 snow QSNOW | ||
qi 65 10 ice QICE | ||
qg 65 10 graupel QGRAUP | ||
dbz 65 10 reflectivity REFL_10CM | ||
:: | ||
|
||
state_derivatives:: | ||
!var level src | ||
ps 1 met_guess | ||
u 65 met_guess | ||
v 65 met_guess | ||
tv 65 met_guess | ||
q 65 met_guess | ||
oz 65 met_guess | ||
cw 65 met_guess | ||
prse 66 met_guess | ||
:: | ||
|
||
state_tendencies:: | ||
!var levels source | ||
u 65 met_guess | ||
v 65 met_guess | ||
tv 65 met_guess | ||
q 65 met_guess | ||
oz 65 met_guess | ||
prse 66 met_guess | ||
:: | ||
|
||
state_vector:: | ||
!var level itracer source funcof | ||
u 65 0 met_guess u | ||
v 65 0 met_guess v | ||
w 65 0 met_guess w | ||
tv 65 0 met_guess tv | ||
tsen 65 0 met_guess tv,q | ||
q 65 1 met_guess q | ||
oz 65 1 met_guess oz | ||
prse 66 0 met_guess prse | ||
ps 1 0 met_guess prse | ||
sst 1 0 met_guess sst | ||
qr 65 1 met_guess qr | ||
ql 65 1 met_guess qc | ||
qs 65 1 met_guess qs | ||
qi 65 1 met_guess qi | ||
qg 65 1 met_guess qg | ||
dbz 65 1 met_guess dbz | ||
:: | ||
|
||
control_vector:: | ||
!var level itracer as/tsfc_sdv an_amp0 source funcof | ||
sf 65 0 0.90 -1.0 state u,v | ||
vp 65 0 0.90 -1.0 state u,v | ||
ps 1 0 1.00 -1.0 state prse | ||
t 65 0 1.40 -1.0 state tv | ||
q 65 1 0.80 -1.0 state q | ||
sst 1 0 1.00 -1.0 state sst | ||
stl 1 0 1.00 -1.0 motley sst | ||
sti 1 0 1.00 -1.0 motley sst | ||
w 65 11 1.00 -1.0 state w | ||
qr 65 11 1.00 -1.0 state qr | ||
qs 65 11 1.00 -1.0 state qs | ||
qi 65 11 1.00 -1.0 state qi | ||
qg 65 11 1.00 -1.0 state qg | ||
ql 65 11 1.00 -1.0 state qc | ||
dbz 65 11 1.00 -1.0 state dbz | ||
:: |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -187,6 +187,10 @@ else | |
BKTYPE=1 # cold start | ||
fi | ||
|
||
if [ ${ob_type} != "conv" ]; then #not using GDAS | ||
l_both_fv3sar_gfs_ens=.false. | ||
fi | ||
|
||
#--------------------------------------------------------------------- | ||
# | ||
# decide regional_ensemble_option: global ensemble (1) or FV3LAM ensemble (5) | ||
|
@@ -237,10 +241,11 @@ if [[ ${regional_ensemble_option:-1} -eq 5 ]]; then | |
if [[ $ifound -ne ${NUM_ENS_MEMBERS} ]]; then | ||
print_info_msg "Not enough FV3_LAM ensembles, will fall to GDAS" | ||
regional_ensemble_option=1 | ||
l_both_fv3sar_gfs_ens=.false. | ||
fi | ||
fi | ||
# | ||
if [[ ${regional_ensemble_option:-1} -eq 1 ]]; then #using GDAS | ||
if [[ ${regional_ensemble_option:-1} -eq 1 || ${l_both_fv3sar_gfs_ens} = ".true." ]]; then #using GDAS | ||
#----------------------------------------------------------------------- | ||
# Make a list of the latest GFS EnKF ensemble | ||
#----------------------------------------------------------------------- | ||
|
@@ -340,20 +345,29 @@ niter2=50 | |
lread_obs_save=.false. | ||
lread_obs_skip=.false. | ||
if_model_dbz=.false. | ||
nummem_gfs=0 | ||
nummem_fv3sar=0 | ||
anav_type=${ob_type} | ||
|
||
# Determine if hybrid option is available | ||
memname='atmf009' | ||
|
||
if [ ${regional_ensemble_option:-1} -eq 5 ] && [ ${BKTYPE} != 1 ]; then | ||
nummem=$NUM_ENS_MEMBERS | ||
if [ ${l_both_fv3sar_gfs_ens} = ".true." ]; then | ||
nummem_gfs=$(more filelist03 | wc -l) | ||
nummem_gfs=$((nummem_gfs - 3 )) | ||
fi | ||
nummem_fv3sar=$NUM_ENS_MEMBERS | ||
nummem=`expr ${nummem_gfs} + ${nummem_fv3sar}` | ||
print_info_msg "$VERBOSE" "Do hybrid with FV3LAM ensemble" | ||
ifhyb=.true. | ||
print_info_msg "$VERBOSE" " Cycle ${YYYYMMDDHH}: GSI hybrid uses FV3LAM ensemble with n_ens=${nummem}" | ||
grid_ratio_ens="1" | ||
ens_fast_read=.true. | ||
else | ||
nummem=$(more filelist03 | wc -l) | ||
nummem=$((nummem - 3 )) | ||
nummem_gfs=$(more filelist03 | wc -l) | ||
nummem_gfs=$((nummem_gfs - 3 )) | ||
nummem=${nummem_gfs} | ||
if [[ ${nummem} -ge ${HYBENSMEM_NMIN} ]]; then | ||
print_info_msg "$VERBOSE" "Do hybrid with ${memname}" | ||
ifhyb=.true. | ||
|
@@ -362,6 +376,9 @@ else | |
print_info_msg "$VERBOSE" " Cycle ${YYYYMMDDHH}: GSI does pure 3DVAR." | ||
print_info_msg "$VERBOSE" " Hybrid needs at least ${HYBENSMEM_NMIN} ${memname} ensembles, only ${nummem} available" | ||
fi | ||
if [[ ${anav_type} == "all" ]]; then | ||
anav_type="conv" | ||
fi | ||
fi | ||
|
||
# | ||
|
@@ -392,6 +409,17 @@ if [ ${BKTYPE} -eq 1 ]; then # cold start uses background from INPUT | |
fv3lam_bg_type=1 | ||
else # cycle uses background from restart | ||
if [ "${IO_LAYOUT_Y}" == "1" ]; then | ||
if [ -r "${bkpath}/bk_${ob_type}_fv_core.res.tile1.nc" ]; then | ||
cp_vrfy -f ${bkpath}/bk_${ob_type}_fv_core.res.tile1.nc ${bkpath}/fv_core.res.tile1.nc | ||
cp_vrfy -f ${bkpath}/bk_${ob_type}_fv_tracer.res.tile1.nc ${bkpath}/fv_tracer.res.tile1.nc | ||
cp_vrfy -f ${bkpath}/bk_${ob_type}_sfc_data.nc ${bkpath}/sfc_data.nc | ||
cp_vrfy -f ${bkpath}/bk_${ob_type}_phy_data.nc ${bkpath}/phy_data.nc | ||
else | ||
cp_vrfy ${bkpath}/fv_core.res.tile1.nc ${bkpath}/bk_${ob_type}_fv_core.res.tile1.nc | ||
cp_vrfy ${bkpath}/fv_tracer.res.tile1.nc ${bkpath}/bk_${ob_type}_fv_tracer.res.tile1.nc | ||
cp_vrfy ${bkpath}/sfc_data.nc ${bkpath}/bk_${ob_type}_sfc_data.nc | ||
cp_vrfy ${bkpath}/phy_data.nc ${bkpath}/bk_${ob_type}_phy_data.nc | ||
fi | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Prep_cyc builds the background and make a link to original background files (named as bk_*). There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. "bk_*" built in prep_cyc is just a link before doing "ncatted -a checksum". To keep the "ncatted" files, this copy process is required. On Orion, overwriting these files by GSI analysis is often failed and this job is automatically rerun. To prevent the duplicate overwriting in the rerun, I added this copy process. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I still cannot figure out why this part of copy needed? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In this job, restart files are overwritten. Therefore, if this job is failed after outputting restart files, updated restart files are used as the first guess of EnVar in the rerun job by accident. In fact, such situation frequently occurred on Orion. To prevent from that issue, I added this part. |
||
ln_vrfy -snf ${bkpath}/fv_core.res.tile1.nc fv3_dynvars | ||
ln_vrfy -snf ${bkpath}/fv_tracer.res.tile1.nc fv3_tracer | ||
ln_vrfy -snf ${bkpath}/sfc_data.nc fv3_sfcdata | ||
|
@@ -459,7 +487,7 @@ else | |
esac | ||
fi | ||
|
||
if [[ ${gsi_type} == "OBSERVER" || ${ob_type} == "conv" ]]; then | ||
if [[ ${gsi_type} == "OBSERVER" || ${anav_type} == "conv" || ${anav_type} == "all" ]]; then | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Using "all" as analysis variable is too general. As this application doing all the thing and cannot be extended? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I renamed 'all' to 'conv_dbz'. |
||
|
||
obs_files_source[0]=${obspath_tmp}/${obsfileprefix}.t${HH}${SUBH}z.prepbufr.tm00 | ||
obs_files_target[0]=prepbufr | ||
|
@@ -472,15 +500,19 @@ if [[ ${gsi_type} == "OBSERVER" || ${ob_type} == "conv" ]]; then | |
obs_files_source[${obs_number}]=${obspath_tmp}/${obsfileprefix}.t${HH}${SUBH}z.nexrad.tm00.bufr_d | ||
obs_files_target[${obs_number}]=l2rwbufr | ||
|
||
if [ ${DO_ENKF_RADAR_REF} == "TRUE" ]; then | ||
if [[ ${DO_ENKF_RADAR_REF} == "TRUE" || ${anav_type} == "all" ]]; then | ||
obs_number=${#obs_files_source[@]} | ||
obs_files_source[${obs_number}]=${cycle_dir}/process_radarref/00/Gridded_ref.nc | ||
if [ ${cycle_type} == "spinup" ]; then | ||
obs_files_source[${obs_number}]=${cycle_dir}/process_radarref_spinup/00/Gridded_ref.nc | ||
else | ||
obs_files_source[${obs_number}]=${cycle_dir}/process_radarref/00/Gridded_ref.nc | ||
fi | ||
obs_files_target[${obs_number}]=dbzobs.nc | ||
fi | ||
|
||
else | ||
|
||
if [ ${ob_type} == "radardbz" ]; then | ||
if [ ${anav_type} == "radardbz" ]; then | ||
|
||
if [ ${cycle_type} == "spinup" ]; then | ||
obs_files_source[0]=${cycle_dir}/process_radarref_spinup/00/Gridded_ref.nc | ||
|
@@ -604,20 +636,31 @@ if [ ${DO_ENKF_RADAR_REF} == "TRUE" ]; then | |
beta1_inv=0.0 | ||
if_model_dbz=.true. | ||
fi | ||
if [[ ${gsi_type} == "ANALYSIS" && ${ob_type} == "radardbz" ]]; then | ||
if [[ ${gsi_type} == "ANALYSIS" && ${anav_type} == "radardbz" ]]; then | ||
ANAVINFO=${FIX_GSI}/${ENKF_ANAVINFO_DBZ_FN} | ||
miter=1 | ||
niter1=100 | ||
niter2=0 | ||
bkgerr_vs=0.1 | ||
bkgerr_hzscl="0.4,0.5,0.6" | ||
beta1_inv=0.0 | ||
ens_h=4.10790 | ||
ens_v=-0.30125 | ||
readin_localization=.false. | ||
ens_h=${ens_h_radardbz} | ||
ens_v=${ens_v_radardbz} | ||
nsclgrp=1 | ||
ngvarloc=1 | ||
i_ensloccov4tim=0 | ||
i_ensloccov4var=0 | ||
i_ensloccov4scl=0 | ||
q_hyb_ens=.true. | ||
if_model_dbz=.true. | ||
fi | ||
if [[ ${gsi_type} == "ANALYSIS" && ${anav_type} == "all" ]]; then | ||
ANAVINFO=${FIX_GSI}/${ANAVINFO_ALL_FN} | ||
beta1_inv=0.0 | ||
if_model_dbz=.true. | ||
fi | ||
naensloc=`expr ${nsclgrp} \* ${ngvarloc} + ${nsclgrp} - 1` | ||
CONVINFO=${FIX_GSI}/${CONVINFO_FN} | ||
HYBENSINFO=${FIX_GSI}/${HYBENSINFO_FN} | ||
OBERROR=${FIX_GSI}/${OBERROR_FN} | ||
|
@@ -871,6 +914,9 @@ cat fort.208 fort.210 fort.211 fort.212 fort.213 fort.220 > $comout/rrfs_a.t${HH | |
#----------------------------------------------------------------------- | ||
# | ||
touch gsi_complete.txt | ||
if [[ ${anav_type} == "radardbz" || ${anav_type} == "all" ]]; then | ||
touch gsi_complete_radar.txt # for nonvarcldanl | ||
fi | ||
# | ||
#----------------------------------------------------------------------- | ||
# | ||
|
@@ -933,23 +979,10 @@ if [ $netcdf_diag = ".true." ]; then | |
listall_cnv="conv_ps conv_q conv_t conv_uv conv_pw conv_rw conv_sst conv_dbz" | ||
listall_rad="hirs2_n14 msu_n14 sndr_g08 sndr_g11 sndr_g11 sndr_g12 sndr_g13 sndr_g08_prep sndr_g11_prep sndr_g12_prep sndr_g13_prep sndrd1_g11 sndrd2_g11 sndrd3_g11 sndrd4_g11 sndrd1_g15 sndrd2_g15 sndrd3_g15 sndrd4_g15 sndrd1_g13 sndrd2_g13 sndrd3_g13 sndrd4_g13 hirs3_n15 hirs3_n16 hirs3_n17 amsua_n15 amsua_n16 amsua_n17 amsua_n18 amsua_n19 amsua_metop-a amsua_metop-b amsua_metop-c amsub_n15 amsub_n16 amsub_n17 hsb_aqua airs_aqua amsua_aqua imgr_g08 imgr_g11 imgr_g12 pcp_ssmi_dmsp pcp_tmi_trmm conv sbuv2_n16 sbuv2_n17 sbuv2_n18 omi_aura ssmi_f13 ssmi_f14 ssmi_f15 hirs4_n18 hirs4_metop-a mhs_n18 mhs_n19 mhs_metop-a mhs_metop-b mhs_metop-c amsre_low_aqua amsre_mid_aqua amsre_hig_aqua ssmis_las_f16 ssmis_uas_f16 ssmis_img_f16 ssmis_env_f16 iasi_metop-a iasi_metop-b iasi_metop-c seviri_m08 seviri_m09 seviri_m10 seviri_m11 cris_npp atms_npp ssmis_f17 cris-fsr_npp cris-fsr_n20 atms_n20 abi_g16" | ||
|
||
cat_exec="${EXECDIR}/nc_diag_cat.x" | ||
|
||
if [ -f $cat_exec ]; then | ||
print_info_msg "$VERBOSE" " | ||
Copying the nc_diag_cat executable to the run directory..." | ||
cp_vrfy ${cat_exec} ${analworkdir}/nc_diag_cat.x | ||
else | ||
print_err_msg_exit "\ | ||
The nc_diag_cat executable specified in cat_exec does not exist: | ||
cat_exec = \"$cat_exec\" | ||
Build GSI and rerun." | ||
fi | ||
|
||
for type in $listall_cnv; do | ||
count=$(ls pe*.${type}_${loop}.nc4 | wc -l) | ||
if [[ $count -gt 0 ]]; then | ||
${APRUN} ./nc_diag_cat.x -o diag_${type}_${string}.${YYYYMMDDHH}.nc4 pe*.${type}_${loop}.nc4 | ||
${APRUN} nc_diag_cat.x -o diag_${type}_${string}.${YYYYMMDDHH}.nc4 pe*.${type}_${loop}.nc4 | ||
gzip diag_${type}_${string}.${YYYYMMDDHH}.nc4* | ||
cp diag_${type}_${string}.${YYYYMMDDHH}.nc4.gz $comout | ||
echo "diag_${type}_${string}.${YYYYMMDDHH}.nc4*" >> listcnv | ||
|
@@ -960,7 +993,7 @@ if [ $netcdf_diag = ".true." ]; then | |
for type in $listall_rad; do | ||
count=$(ls pe*.${type}_${loop}.nc4 | wc -l) | ||
if [[ $count -gt 0 ]]; then | ||
${APRUN} ./nc_diag_cat.x -o diag_${type}_${string}.${YYYYMMDDHH}.nc4 pe*.${type}_${loop}.nc4 | ||
${APRUN} nc_diag_cat.x -o diag_${type}_${string}.${YYYYMMDDHH}.nc4 pe*.${type}_${loop}.nc4 | ||
gzip diag_${type}_${string}.${YYYYMMDDHH}.nc4* | ||
cp diag_${type}_${string}.${YYYYMMDDHH}.nc4.gz $comout | ||
echo "diag_${type}_${string}.${YYYYMMDDHH}.nc4*" >> listrad | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -35,11 +35,11 @@ fi | |
|
||
if [[ $MACHINE == "orion" ]] ; then | ||
ACCOUNT=wrfruc | ||
PARTITION_ANALYSIS=orion | ||
QUEUE_ANALYSIS="batch" | ||
QUEUE_WGRIB2="batch" | ||
QUEUE_GRAPHICS="batch" | ||
QUEUE_POST="batch" | ||
NCORES_PER_NODE=24 | ||
fi | ||
|
||
if [[ $MACHINE == "wcoss2" ]] ; then | ||
|
@@ -76,6 +76,29 @@ DO_SOIL_ADJUST="TRUE" | |
DO_RADDA="FALSE" | ||
DO_BUFRSND="FALSE" | ||
|
||
l_both_fv3sar_gfs_ens=.false. #if true, ensemble size is increased with GDAS ensemble | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This part is added in three configuration files: RRFS_CONUS_13km, RRFS_CONUS_3km, RRFS_CONUS_3km.2022HWT. If they are same or mostly same, can make a separate file just like There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I made a separated file (set_rrfs_config_SDL_VDL_MixEn.sh) for setting of MixEn/SDL/VDL. |
||
nsclgrp=1 #number of scales for scale-dependent localization | ||
ngvarloc=1 #number of scales for variable-dependent localization | ||
if [[ ${ngvarloc} == "1" ]] && [[ ${nsclgrp} == "2" ]]; then | ||
readin_localization=.false. | ||
ens_h="328.632,82.1580,82.1580" | ||
ens_v="-0.30125,-0.30125,0.0" | ||
ens_h_radardbz="4.10790" | ||
ens_v_radardbz="-0.30125" | ||
elif [[ ${ngvarloc} == "2" ]] && [[ ${nsclgrp} == "1" ]]; then | ||
readin_localization=.false. | ||
ens_h="82.1580,4.10790" | ||
ens_v="-0.30125,-0.30125" | ||
i_ensloccov4var=1 | ||
DO_ENVAR_RADAR_REF_ONCE="TRUE" | ||
elif [[ ${ngvarloc} == "2" ]] && [[ ${nsclgrp} == "2" ]]; then | ||
readin_localization=.false. | ||
ens_h="328.632,82.1580,4.10790,4.10790,82.1580" | ||
ens_v="-0.30125,-0.30125,-0.30125,-0.30125,0.0" | ||
i_ensloccov4var=1 | ||
DO_ENVAR_RADAR_REF_ONCE="TRUE" | ||
fi | ||
|
||
QUILTING="TRUE" | ||
CCPP_PHYS_SUITE="FV3_HRRR" | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
About the name of this file: should have a name fit to the application. Using "_all" is too general.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I renamed 'all' to 'conv_dbz'.