Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/gsi/apply_scaledepwgts.f90
Original file line number Diff line number Diff line change
Expand Up @@ -47,15 +47,15 @@ subroutine init_mult_spc_wgts(jcap_in)
use hybrid_ensemble_parameters,only: use_localization_grid
use gridmod,only: use_sp_eqspace
use general_specmod, only: general_init_spec_vars
use constants, only: zero,half,one,two,three,rearth,pi
use constants, only: zero,half,one,two,three,rearth,pi,tiny_r_kind
use constants, only: rad2deg
use mpimod, only: mype
use general_sub2grid_mod, only: general_sub2grid_create_info
use egrid2agrid_mod,only: g_create_egrid2agrid
use general_sub2grid_mod, only: sub2grid_info
use gsi_io, only: verbose
use hybrid_ensemble_parameters, only: nsclgrp
use hybrid_ensemble_parameters, only: spc_multwgt,spcwgt_params,i_ensloccov4scl
use hybrid_ensemble_parameters, only: spc_multwgt,spcwgt_params,r_ensloccov4scl
implicit none

integer(i_kind),intent(in ) :: jcap_in
Expand All @@ -68,7 +68,7 @@ subroutine init_mult_spc_wgts(jcap_in)
integer(i_kind) :: l_sum_spc_weights

! Spectral scale decomposition is differernt between SDL-cross and SDL-nocross
if( i_ensloccov4scl == 1 )then
if( r_ensloccov4scl < tiny_r_kind )then
l_sum_spc_weights = 1
else
l_sum_spc_weights = 0
Expand Down
31 changes: 18 additions & 13 deletions src/gsi/gsimod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ module gsimod
readin_beta,use_localization_grid,use_gfs_ens,q_hyb_ens,i_en_perts_io, &
l_ens_in_diff_time,ensemble_path,ens_fast_read,sst_staticB,limqens, &
ntotensgrp,nsclgrp,naensgrp,ngvarloc,ntlevs_ens,naensloc, &
i_ensloccov4tim,i_ensloccov4var,i_ensloccov4scl,l_timloc_opt,&
r_ensloccov4tim,r_ensloccov4var,r_ensloccov4scl,l_timloc_opt,&
vdl_scale,vloc_varlist,&
global_spectral_filter_sd,assign_vdl_nml,parallelization_over_ensmembers
use hybrid_ensemble_parameters,only : l_both_fv3sar_gfs_ens,n_ens_gfs,n_ens_fv3sar,weight_ens_gfs,weight_ens_fv3sar
Expand Down Expand Up @@ -1368,23 +1368,28 @@ module gsimod
! l_timloc_opt - if true, then turn on time-dependent localization
! ngvarloc - number of variable-dependent localization lengths
! naensloc - total number of spatial localization lengths and scale separation lengths (should be naensgrp+nsclgrp-1)
! i_ensloccov4tim - flag of cross-temporal localization
! =0: cross-temporal covariance is retained
! =1: cross-temporal covariance is zero
! i_ensloccov4var - flag of cross-variable localization
! =0: cross-variable covariance is retained
! =1: cross-variable covariance is zero
! i_ensloccov4scl - flag of cross-scale localization
! =0: cross-scale covariance is retained
! =1: cross-scale covariance is zero
!
! r_ensloccov4tim - factor multiplying to cross-time covariance
! For example,
! =0.0: cross-time covariance is decreased to zero
! =0.5: cross-time covariance is decreased to half
! =1.0: cross-time covariance is retained
! r_ensloccov4var - factor multiplying to cross-variable covariance
! For example,
! =0.0: cross-variable covariance is decreased to zero
! =0.5: cross-variable covariance is decreased to half
! =1.0: cross-variable covariance is retained
! r_ensloccov4scl - factor multiplying to cross-scale covariance
! For example,
! =0.0: cross-scale covariance is decreased to zero
! =0.5: cross-scale covariance is decreased to half
! =1.0: cross-scale covariance is retained
! global_spectral_filter_sd - if true, use spectral filter function for
! scale decomposition in the global application (Huang et al. 2021)
! assign_vdl_nml - if true, vdl_scale, and vloc_varlist will be used for
! assigning variable-dependent localization upon SDL in gsiparm.anl.
! This method described in (Wang and Wang 2022, JAMES) is
! equivalent to, but different from the method associated
! with the parameter i_ensloccov4var.
! with the parameter r_ensloccov4var.
! vloc_varlist - list of control variables using the same localization length,
! effective only with assign_vdl_nml=.true. For example,
! vloc_varlist(1,:) = 'sf','vp','ps','t',
Expand Down Expand Up @@ -1415,7 +1420,7 @@ module gsimod
grid_ratio_ens, &
oz_univ_static,write_ens_sprd,use_localization_grid,use_gfs_ens, &
i_en_perts_io,l_ens_in_diff_time,ensemble_path,ens_fast_read,sst_staticB,limqens, &
nsclgrp,l_timloc_opt,ngvarloc,naensloc,i_ensloccov4tim,i_ensloccov4var,i_ensloccov4scl,&
nsclgrp,l_timloc_opt,ngvarloc,naensloc,r_ensloccov4tim,r_ensloccov4var,r_ensloccov4scl,&
vdl_scale,vloc_varlist,&
global_spectral_filter_sd,assign_vdl_nml,parallelization_over_ensmembers

Expand Down
35 changes: 7 additions & 28 deletions src/gsi/hybrid_ensemble_isotropic.F90
Original file line number Diff line number Diff line change
Expand Up @@ -5553,7 +5553,7 @@ subroutine setup_ensgrp2aensgrp
!
!$$$ end documentation block
use constants, only: zero,one
use hybrid_ensemble_parameters, only: l_timloc_opt,i_ensloccov4tim,i_ensloccov4var,i_ensloccov4scl
use hybrid_ensemble_parameters, only: l_timloc_opt,r_ensloccov4tim,r_ensloccov4var,r_ensloccov4scl
use hybrid_ensemble_parameters, only: ensloccov4tim,ensloccov4var,ensloccov4scl
use hybrid_ensemble_parameters, only: ntotensgrp,naensgrp,ntlevs_ens,nsclgrp,ngvarloc
use hybrid_ensemble_parameters, only: ensgrp2aensgrp
Expand Down Expand Up @@ -5596,33 +5596,12 @@ subroutine setup_ensgrp2aensgrp
enddo
enddo

if (i_ensloccov4tim==0) then
ensloccov4tim=one
elseif (i_ensloccov4tim==1)then
ensloccov4tim=zero
ensloccov4tim(1)=one
else
write(6,*)'setup_ensgrp2aensgrp: wrong i_ensloccov4tim'
call stop2(666)
endif
if (i_ensloccov4var==0) then
ensloccov4var=one
elseif (i_ensloccov4var==1)then
ensloccov4var=zero
ensloccov4var(1)=one
else
write(6,*)'setup_ensgrp2aensgrp: wrong i_ensloccov4var'
call stop2(666)
endif
if (i_ensloccov4scl==0) then
ensloccov4scl=one
elseif (i_ensloccov4scl==1)then
ensloccov4scl=zero
ensloccov4scl(1)=one
else
write(6,*)'setup_ensgrp2aensgrp: wrong i_ensloccov4scl'
call stop2(666)
endif
ensloccov4tim=r_ensloccov4tim
ensloccov4tim(1)=one
ensloccov4var=r_ensloccov4var
ensloccov4var(1)=one
ensloccov4scl=r_ensloccov4scl
ensloccov4scl(1)=one

do itim2=1,ntimloc
do itim1=1,ntimloc
Expand Down
35 changes: 22 additions & 13 deletions src/gsi/hybrid_ensemble_parameters.f90
Original file line number Diff line number Diff line change
Expand Up @@ -134,15 +134,21 @@ module hybrid_ensemble_parameters
! l_timloc_opt: if true, then turn on time-dependent localization
! ngvarloc: number of variable-dependent localization lengths
! naensloc: total number of spatial localization lengths and scale separation lengths (should be naensgrp+nsclgrp-1)
! i_ensloccov4tim: flag of cross-temporal localization
! =0: cross-temporal covariance is retained
! =1: cross-temporal covariance is zero
! i_ensloccov4var: flag of cross-variable localization
! =0: cross-variable covariance is retained
! =1: cross-variable covariance is zero
! i_ensloccov4scl: flag of cross-scale localization
! =0: cross-scale covariance is retained
! =1: cross-scale covariance is zero
! r_ensloccov4tim: factor multiplying to cross-time covariance
! For example,
! =0.0: cross-time covariance is decreased to zero
! =0.5: cross-time covariance is decreased to half
! =1.0: cross-time covariance is retained
! r_ensloccov4var: factor multiplying to cross-variable covariance
! For example,
! =0.0: cross-variable covariance is decreased to zero
! =0.5: cross-variable covariance is decreased to half
! =1.0: cross-variable covariance is retained
! r_ensloccov4scl: factor multiplying to cross-scale covariance
! For example,
! =0.0: cross-scale covariance is decreased to zero
! =0.5: cross-scale covariance is decreased to half
! =1.0: cross-scale covariance is retained
!=====================================================================================================
!
!
Expand Down Expand Up @@ -326,7 +332,7 @@ module hybrid_ensemble_parameters
public :: ensloccov4tim,ensloccov4var,ensloccov4scl
public :: alphacvarsclgrpmat
public :: l_timloc_opt
public :: i_ensloccov4tim,i_ensloccov4var,i_ensloccov4scl
public :: r_ensloccov4tim,r_ensloccov4var,r_ensloccov4scl
public :: idaen3d,idaen2d
public :: ens_fast_read
public :: parallelization_over_ensmembers
Expand Down Expand Up @@ -395,9 +401,9 @@ module hybrid_ensemble_parameters
integer(i_kind) :: ntotensgrp=1
integer(i_kind) :: naensloc=1
integer(i_kind) :: ngvarloc=1
integer(i_kind) :: i_ensloccov4tim=0
integer(i_kind) :: i_ensloccov4var=0
integer(i_kind) :: i_ensloccov4scl=0
real(r_kind) :: r_ensloccov4tim
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@shoyokota , why are those options changed to real numbers? When they are supposed to be used as real numbers in some situations , we can always use real function to convert integer to real version. But their basic usages are used as options with many equality evaluations. While equality for real numbers are risky or at least not be encouraged to be used. So, any compelling reasons for this change ?

real(r_kind) :: r_ensloccov4var
real(r_kind) :: r_ensloccov4scl
integer(i_kind),allocatable,dimension(:) :: idaen3d,idaen2d

real(r_kind),allocatable,dimension(:,:) :: spc_multwgt
Expand Down Expand Up @@ -501,6 +507,9 @@ subroutine init_hybrid_ensemble_parameters
n_ens_fv3sar=0
weight_ens_gfs=one
weight_ens_fv3sar=one
r_ensloccov4tim=one
r_ensloccov4var=one
r_ensloccov4scl=one
vdl_scale = 0
vloc_varlist = 'aaa'
global_spectral_filter_sd=.false.
Expand Down