Skip to content

Commit

Permalink
Merge pull request NOAA-GSL#4 from hafs-community/feature/regional_en…
Browse files Browse the repository at this point in the history
…sda_dualres

Feature/regional ensda dualres
  • Loading branch information
BinLiu-NOAA committed Feb 16, 2021
2 parents 8e5e1e1 + 8b0c604 commit 5252bab
Show file tree
Hide file tree
Showing 6 changed files with 384 additions and 122 deletions.
74 changes: 51 additions & 23 deletions src/gsi/cplr_get_fv3_regional_ensperts.f90
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar)
!
! program history log:
! 2011-08-31 todling - revisit en_perts (single-prec) in light of extended bundle
! 2021-02-01 Lu & Wang - modify functions for hafs dual ens. POC: xuguang.wang@ou.edu
!
! input argument list:
!
Expand Down Expand Up @@ -330,9 +331,9 @@ subroutine general_read_fv3_regional(this,fv3_filenameginput,g_ps,g_u,g_v,g_tv,g
use gridmod, only: eta1_ll,eta2_ll
use constants, only: zero,one,fv,zero_single,one_tenth,h300
use hybrid_ensemble_parameters, only: grd_ens,q_hyb_ens
use hybrid_ensemble_parameters, only: fv3sar_ensemble_opt
use hybrid_ensemble_parameters, only: fv3sar_ensemble_opt,dual_res

use mpimod, only: mpi_comm_world,mpi_rtype
use mpimod, only: mpi_comm_world,mpi_rtype,mype
use netcdf_mod, only: nc_check
use gsi_rfv3io_mod,only: type_fv3regfilenameg
use gsi_rfv3io_mod,only:n2d
Expand Down Expand Up @@ -391,42 +392,69 @@ subroutine general_read_fv3_regional(this,fv3_filenameginput,g_ps,g_u,g_v,g_tv,g


!cltthinktobe should be contained in variable like grd_ens


if(fv3sar_ensemble_opt == 0 ) then
call gsi_fv3ncdf_readuv(dynvars,g_u,g_v)
else
call gsi_fv3ncdf_readuv_v1(dynvars,g_u,g_v)
endif
if(fv3sar_ensemble_opt == 0) then
call gsi_fv3ncdf_read(dynvars,'T','t',g_tsen,mype_t)
if (dual_res) then
if(fv3sar_ensemble_opt == 0 ) then
call gsi_fv3ncdf_readuv(dynvars,g_u,g_v,grd_ens%lat2,grd_ens%lon2,.true.)
else
call gsi_fv3ncdf_readuv_v1(dynvars,g_u,g_v,grd_ens%lat2,grd_ens%lon2,.true.)
endif
if(fv3sar_ensemble_opt == 0) then
call gsi_fv3ncdf_read(dynvars,'T','t',g_tsen,mype_t,grd_ens%lat2,grd_ens%lon2,.true.)
else
call gsi_fv3ncdf_read_v1(dynvars,'t','T',g_tsen,mype_t,grd_ens%lat2,grd_ens%lon2,.true.)
endif
else
call gsi_fv3ncdf_read_v1(dynvars,'t','T',g_tsen,mype_t)
endif
if(fv3sar_ensemble_opt == 0 ) then
call gsi_fv3ncdf_readuv(dynvars,g_u,g_v,grd_ens%lat2,grd_ens%lon2,.false.)
else
call gsi_fv3ncdf_readuv_v1(dynvars,g_u,g_v,grd_ens%lat2,grd_ens%lon2,.false.)
endif
if(fv3sar_ensemble_opt == 0) then
call gsi_fv3ncdf_read(dynvars,'T','t',g_tsen,mype_t,grd_ens%lat2,grd_ens%lon2,.false.)
else
call gsi_fv3ncdf_read_v1(dynvars,'t','T',g_tsen,mype_t,grd_ens%lat2,grd_ens%lon2,.false.)
endif
end if
if (fv3sar_ensemble_opt == 0) then
call gsi_fv3ncdf_read(dynvars,'DELP','delp',g_prsi,mype_p)
if (dual_res) then
call gsi_fv3ncdf_read(dynvars,'DELP','delp',g_prsi,mype_p,grd_ens%lat2,grd_ens%lon2,.true.)
else
call gsi_fv3ncdf_read(dynvars,'DELP','delp',g_prsi,mype_p,grd_ens%lat2,grd_ens%lon2,.false.)
end if
g_prsi(:,:,grd_ens%nsig+1)=eta1_ll(grd_ens%nsig+1) !thinkto be done , should use eta1_ll from ensemble grid
do i=grd_ens%nsig,1,-1
g_prsi(:,:,i)=g_prsi(:,:,i)*0.001_r_kind+g_prsi(:,:,i+1)
enddo
g_ps(:,:)=g_prsi(:,:,1)
else ! for the ensemble processed frm CHGRES
call gsi_fv3ncdf2d_read_v1(dynvars,'ps','PS',g_ps,mype_p)
if (dual_res) then
call gsi_fv3ncdf2d_read_v1(dynvars,'ps','PS',g_ps,mype_p,grd_ens%lat2,grd_ens%lon2,.true.)
else
call gsi_fv3ncdf2d_read_v1(dynvars,'ps','PS',g_ps,mype_p,grd_ens%lat2,grd_ens%lon2,.false.)
end if
g_ps=g_ps*0.001_r_kind
do k=1,grd_ens%nsig+1
g_prsi(:,:,k)=eta1_ll(k)+eta2_ll(k)*g_ps
enddo


endif

if(fv3sar_ensemble_opt == 0) then
call gsi_fv3ncdf_read(tracers,'SPHUM','sphum',g_q,mype_q)
call gsi_fv3ncdf_read(tracers,'O3MR','o3mr',g_oz,mype_oz)
if (dual_res) then
if(fv3sar_ensemble_opt == 0) then
call gsi_fv3ncdf_read(tracers,'SPHUM','sphum',g_q,mype_q,grd_ens%lat2,grd_ens%lon2,.true.)
call gsi_fv3ncdf_read(tracers,'O3MR','o3mr',g_oz,mype_oz,grd_ens%lat2,grd_ens%lon2,.true.)
else
call gsi_fv3ncdf_read_v1(tracers,'sphum','SPHUM',g_q,mype_q,grd_ens%lat2,grd_ens%lon2,.true.)
call gsi_fv3ncdf_read_v1(tracers,'o3mr','O3MR',g_oz,mype_oz,grd_ens%lat2,grd_ens%lon2,.true.)
endif
else
call gsi_fv3ncdf_read_v1(tracers,'sphum','SPHUM',g_q,mype_q)
call gsi_fv3ncdf_read_v1(tracers,'o3mr','O3MR',g_oz,mype_oz)
endif
if(fv3sar_ensemble_opt == 0) then
call gsi_fv3ncdf_read(tracers,'SPHUM','sphum',g_q,mype_q,grd_ens%lat2,grd_ens%lon2,.false.)
call gsi_fv3ncdf_read(tracers,'O3MR','o3mr',g_oz,mype_oz,grd_ens%lat2,grd_ens%lon2,.false.)
else
call gsi_fv3ncdf_read_v1(tracers,'sphum','SPHUM',g_q,mype_q,grd_ens%lat2,grd_ens%lon2,.false.)
call gsi_fv3ncdf_read_v1(tracers,'o3mr','O3MR',g_oz,mype_oz,grd_ens%lat2,grd_ens%lon2,.false.)
endif
end if

!! tsen2tv !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
do k=1,grd_ens%nsig
Expand Down
6 changes: 6 additions & 0 deletions src/gsi/general_commvars_mod.f90
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ module general_commvars_mod
! program history log:
! 2012-06-25 parrish
! 2013-10-24 todling - move vars ltosj/i to from gridmod here; same for load and fill routines
! 2021-02-01 Lu & Wang - add vars for hafs dual ens. POC: xuguang.wang@ou.edu
!
! Subroutines Included:
! sub init_general_commvars - initialize type(sub2grid_info) structure variables
Expand Down Expand Up @@ -62,11 +63,13 @@ module general_commvars_mod
public :: filluv2_ns
public :: load_grid
public :: ltosj_s,ltosi_s,ltosj,ltosi
public :: ltosj_sens,ltosi_sens

integer(i_kind),allocatable,dimension(:):: ltosi ! lats in iglobal array excluding buffer
integer(i_kind),allocatable,dimension(:):: ltosj ! lons in iglobal array excluding buffer
integer(i_kind),allocatable,dimension(:):: ltosi_s ! lats in itotsub array including buffer
integer(i_kind),allocatable,dimension(:):: ltosj_s ! lons in itotsub array including buffer
integer(i_kind),allocatable,dimension(:):: ltosj_sens,ltosi_sens ! lats/lons for ens

! Declare types

Expand Down Expand Up @@ -196,6 +199,7 @@ subroutine init_general_commvars
displs_s=s2g_raf%displs_s
itotsub=s2g_raf%itotsub
allocate(ltosi_s(itotsub),ltosj_s(itotsub))
allocate(ltosi_sens(itotsub),ltosj_sens(itotsub))
ltosi_s=s2g_raf%ltosi_s
ltosj_s=s2g_raf%ltosj_s

Expand Down Expand Up @@ -352,6 +356,8 @@ subroutine destroy_general_commvars
implicit none

deallocate(ltosi,ltosj,ltosi_s,ltosj_s)
if (allocated(ltosj_sens)) deallocate(ltosj_sens)
if (allocated(ltosi_sens)) deallocate(ltosi_sens)
deallocate(levs_id,nvar_id,nvar_pe)
call general_sub2grid_destroy_info(s2g_cv,s_ref=s2g_raf)
call general_sub2grid_destroy_info(s2g2,s_ref=s2g_raf)
Expand Down
12 changes: 11 additions & 1 deletion src/gsi/gridmod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ module gridmod
! 2019-04-19 martin - add use_fv3_aero option to distingiush between NGAC and FV3-Chem
! 2019-09-04 martin - add write_fv3_incr to write netCDF increment rather than analysis in NEMSIO format
! 2019-09-23 martin - add use_gfs_ncio to read global first guess from netCDF file
! 2021-02-01 Lu & Wang - add vars for hafs dual ens. POC: xuguang.wang@ou.edu
!
!
!
Expand Down Expand Up @@ -132,6 +133,7 @@ module gridmod
! set passed variables to public
public :: nnnn1o,iglobal,itotsub,ijn,ijn_s,lat2,lon2,lat1,lon1,nsig,nsig_soil
public :: ncloud,nlat,nlon,ntracer,displs_s,displs_g
public :: ijn_sens,ijnens,displs_sens
public :: bk5,regional,latlon11,latlon1n,twodvar_regional
public :: netcdf,nems_nmmb_regional,wrf_mass_regional,wrf_nmm_regional,cmaq_regional
public :: aeta2_ll,pdtop_ll,pt_ll,eta1_ll,eta2_ll,aeta1_ll,idsl5,ck5,ak5
Expand Down Expand Up @@ -283,6 +285,9 @@ module gridmod
integer(i_kind),allocatable,dimension(:):: isd_g ! displacement for send to global
integer(i_kind),allocatable,dimension(:):: displs_s ! displacement for send from subdomain
integer(i_kind),allocatable,dimension(:):: displs_g ! displacement for receive on global grid
integer(i_kind),allocatable,dimension(:):: ijn_sens
integer(i_kind),allocatable,dimension(:):: ijnens
integer(i_kind),allocatable,dimension(:):: displs_sens

integer(i_kind),dimension(200):: nlayers ! number of RTM layers per model layer
! (k=1 is near surface layer), default is 1
Expand Down Expand Up @@ -924,7 +929,8 @@ subroutine create_mapping(npe)
allocate(periodic_s(npe),jstart(npe),istart(npe),&
ilat1(npe),jlon1(npe),&
ijn_s(npe),irc_s(npe),ird_s(npe),displs_s(npe),&
ijn(npe),isc_g(npe),isd_g(npe),displs_g(npe))
ijn(npe),isc_g(npe),isd_g(npe),displs_g(npe), &
ijn_sens(npe),ijnens(npe),displs_sens(npe))

do i=1,npe
periodic_s(i)= .false.
Expand All @@ -940,6 +946,9 @@ subroutine create_mapping(npe)
isc_g(i) = 0
isd_g(i) = 0
displs_g(i) = 0
ijn_sens(i) = 0
displs_sens(i)= 0
ijnens(i) = 0
end do

return
Expand Down Expand Up @@ -980,6 +989,7 @@ subroutine destroy_mapping
deallocate(periodic_s,jstart,istart,ilat1,jlon1,&
ijn_s,irc_s,ird_s,displs_s,&
ijn,isc_g,isd_g,displs_g)
deallocate(ijn_sens,ijnens,displs_sens)

return
end subroutine destroy_mapping
Expand Down
Loading

0 comments on commit 5252bab

Please sign in to comment.