Skip to content

Commit

Permalink
Merge pull request NOAA-GSL#78 from ufs-community/ufs/dev
Browse files Browse the repository at this point in the history
sync with the ufs/dev
  • Loading branch information
HelinWei-NOAA authored Jul 10, 2023
2 parents 0a873da + c4ae129 commit e9803fc
Show file tree
Hide file tree
Showing 7 changed files with 168 additions and 76 deletions.
67 changes: 33 additions & 34 deletions CODEOWNERS

Large diffs are not rendered by default.

5 changes: 4 additions & 1 deletion physics/GFS_phys_time_vary.fv3.F90
Original file line number Diff line number Diff line change
Expand Up @@ -919,7 +919,10 @@ subroutine GFS_phys_time_vary_timestep_init (
fhour, iflip, jindx1_aer, jindx2_aer, &
ddy_aer, iindx1_aer, &
iindx2_aer, ddx_aer, &
levs, prsl, aer_nm)
levs, prsl, aer_nm, errmsg, errflg)
if(errflg /= 0) then
return
endif
endif

!> - Call gcycle() to repopulate specific time-varying surface properties for AMIP/forecast runs
Expand Down
151 changes: 119 additions & 32 deletions physics/aerinterp.F90
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,26 @@ module aerinterp

contains

logical function netcdf_check(status, errmsg, errflg, why)
use netcdf
implicit none
character(len=*), intent(inout) :: errmsg
integer, intent(out) :: errflg
integer, intent(in) :: status
character(len=*), intent(in) :: why

netcdf_check = (status == NF90_NOERR)

if(netcdf_check) then
errflg = 0
errmsg = ' '
else
errflg = 1
errmsg = trim(why) // ': ' // trim(nf90_strerror(status))
endif

END function netcdf_check

SUBROUTINE read_aerdata (me, master, iflip, idate, errmsg, errflg)
use machine, only: kind_phys, kind_io4, kind_io8
use aerclm_def
Expand All @@ -26,12 +46,16 @@ SUBROUTINE read_aerdata (me, master, iflip, idate, errmsg, errflg)
integer, intent(inout) :: errflg

!--- locals
integer :: ncid, varid, ndims, dim1, dim2, dim3, hmx
integer :: ncid, varid, ndims, hmx
integer :: i, j, k, n, ii, imon, klev
character :: fname*50, mn*2, vname*10
logical :: file_exist
integer :: dimids(NF90_MAX_VAR_DIMS)
integer :: dimlen(NF90_MAX_VAR_DIMS)

errflg = 0
errmsg = ' '

integer, allocatable :: invardims(:)
!
!! ===================================================================
if (me == master) then
Expand Down Expand Up @@ -60,25 +84,37 @@ SUBROUTINE read_aerdata (me, master, iflip, idate, errmsg, errflg)
!! fetch dim spec and lat/lon from m01 data set
!! ===================================================================
fname=trim("aeroclim.m"//'01'//".nc")
call nf_open(fname , nf90_NOWRITE, ncid)
ncid = -1
if(.not.netcdf_check(nf90_open(fname , nf90_NOWRITE, ncid), &
errmsg, errflg, 'open '//trim(fname))) then
return
endif

vname = trim(specname(1))
call nf_inq_varid(ncid, vname, varid)
call nf_inq_varndims(ncid, varid, ndims)

if(.not. allocated(invardims)) allocate(invardims(3))
call nf_inq_vardimid(ncid,varid,invardims)
call nf_inq_dimlen(ncid, invardims(1), dim1)
call nf_inq_dimlen(ncid, invardims(2), dim2)
call nf_inq_dimlen(ncid, invardims(3), dim3)
varid = -1
if(.not.netcdf_check(nf90_inq_varid(ncid, vname, varid), &
errmsg, errflg, 'find id of '//trim(vname)//' var')) then
return
endif
ndims = 0
if(.not.netcdf_check(nf90_inquire_variable(ncid, varid, ndims=ndims, dimids=dimids), &
errmsg, errflg, 'inquire details about '//trim(vname)//' var')) then
return
endif
do i=1,ndims
if(.not.netcdf_check(nf90_inquire_dimension(ncid, dimids(i), len=dimlen(i)), &
errmsg, errflg, 'inquire details about dimension')) then
return
endif
enddo

! specify latsaer, lonsaer, hmx
lonsaer = dim1
latsaer = dim2
levsw = dim3
lonsaer = dimlen(1)
latsaer = dimlen(2)
levsw = dimlen(3)

if(me==master) then
print *, 'MERRA2 dim: ',dim1, dim2, dim3
print *, 'MERRA2 dim: ',dimlen(1:ndims)
endif

! allocate arrays
Expand All @@ -89,11 +125,29 @@ SUBROUTINE read_aerdata (me, master, iflip, idate, errmsg, errflg)
endif

! construct lat/lon array
call nf_inq_varid(ncid, 'lat', varid)
call nf_get_var(ncid, varid, aer_lat)
call nf_inq_varid(ncid, 'lon', varid)
call nf_get_var(ncid, varid, aer_lon)
call nf_close(ncid)
varid = -1
if(.not.netcdf_check(nf90_inq_varid(ncid, 'lat', varid), &
errmsg, errflg, 'find id of lat var')) then
return
endif
aer_lat = 0
if(.not.netcdf_check(nf90_get_var(ncid, varid, aer_lat, (/ 1, 1, 1 /), (/latsaer, 1, 1/)), &
errmsg, errflg, 'read lat var')) then
return
endif
varid = -1
if(.not.netcdf_check(nf90_inq_varid(ncid, 'lon', varid), &
errmsg, errflg, 'find id of lon var')) then
return
endif
aer_lon = 0
if(.not.netcdf_check(nf90_get_var(ncid, varid, aer_lon, (/ 1, 1, 1 /), (/lonsaer, 1, 1/)), &
errmsg, errflg, 'read lon var')) then
return
endif
if(.not.netcdf_check(nf90_close(ncid), errmsg, errflg, 'close '//trim(fname))) then
return
endif
END SUBROUTINE read_aerdata
!
!**********************************************************************
Expand Down Expand Up @@ -157,8 +211,10 @@ SUBROUTINE read_aerdataf ( me, master, iflip, idate, FHOUR, errmsg, errflg)
n1 = n2 - 1
if (n2 > 12) n2 = n2 -12
!! ===================================================================
call read_netfaer(n1, iflip, 1)
call read_netfaer(n2, iflip, 2)
call read_netfaer(n1, iflip, 1, errmsg, errflg)
if(errflg/=0) return
call read_netfaer(n2, iflip, 2, errmsg, errflg)
if(errflg/=0) return
!! ===================================================================
n1sv=n1
n2sv=n2
Expand Down Expand Up @@ -224,12 +280,14 @@ END SUBROUTINE setindxaer
!**********************************************************************
!
SUBROUTINE aerinterpol( me,master,nthrds,npts,IDATE,FHOUR,iflip, jindx1,jindx2, &
ddy,iindx1,iindx2,ddx,lev,prsl,aerout)
ddy,iindx1,iindx2,ddx,lev,prsl,aerout, errmsg,errflg)
!
use machine, only: kind_phys, kind_io4, kind_io8
use aerclm_def

implicit none
integer, intent(inout) :: errflg
character(*), intent(inout) :: errmsg
integer, intent(in) :: iflip
integer i1,i2, iday,j,j1,j2,l,npts,nc,n1,n2,lev,k,i,ii, klev
real(kind=kind_phys) fhour,temj, tx1, tx2,temi, tem
Expand All @@ -252,6 +310,8 @@ SUBROUTINE aerinterpol( me,master,nthrds,npts,IDATE,FHOUR,iflip, jindx1,jindx2,
integer w3kindreal,w3kindint

!
errflg = 0
errmsg = ' '
IDAT = 0
IDAT(1) = IDATE(4)
IDAT(2) = IDATE(2)
Expand Down Expand Up @@ -298,7 +358,7 @@ SUBROUTINE aerinterpol( me,master,nthrds,npts,IDATE,FHOUR,iflip, jindx1,jindx2,
enddo !j-loop (lat)
ENDDO ! ii-loop (ntracaerm)
!! ===================================================================
call read_netfaer(n2, iflip, 2)
call read_netfaer(n2, iflip, 2, errmsg, errflg)
n1sv=n1
n2sv=n2
end if
Expand Down Expand Up @@ -390,11 +450,13 @@ SUBROUTINE aerinterpol( me,master,nthrds,npts,IDATE,FHOUR,iflip, jindx1,jindx2,
RETURN
END SUBROUTINE aerinterpol

subroutine read_netfaer(nf, iflip,nt)
subroutine read_netfaer(nf, iflip,nt, errmsg,errflg)
use machine, only: kind_phys, kind_io4, kind_io8
use aerclm_def
use netcdf
integer, intent(in) :: iflip, nf, nt
integer, intent(inout) :: errflg
character(*), intent(inout) :: errmsg
integer :: ncid, varid, i,j,k,ii,klev
character :: fname*50, mn*2, vname*10
real(kind=kind_io4),allocatable,dimension(:,:,:) :: buff
Expand All @@ -406,13 +468,30 @@ subroutine read_netfaer(nf, iflip,nt)
allocate (pres_tmp(lonsaer, levsw))
allocate (buffx(lonsaer, latsaer, levsw, 1))

errflg = 0
errmsg = ' '
buff = 0
pres_tmp = 0
buffx = 0

write(mn,'(i2.2)') nf
fname=trim("aeroclim.m"//mn//".nc")
call nf_open(fname , nf90_NOWRITE, ncid)
ncid = -1
if(.not.netcdf_check(nf90_open(fname , nf90_NOWRITE, ncid), &
errmsg, errflg, 'open '//trim(fname))) then
return
endif

! ====> construct 3-d pressure array (Pa)
call nf_inq_varid(ncid, "DELP", varid)
call nf_get_var(ncid, varid, buff)
varid = -1
if(.not.netcdf_check(nf90_inq_varid(ncid, "DELP", varid), &
errmsg, errflg, 'find id of DELP var')) then
return
endif
if(.not.netcdf_check(nf90_get_var(ncid, varid, buff), &
errmsg, errflg, 'read DELP var')) then
return
endif

do j = jamin, jamax
do i = iamin, iamax
Expand Down Expand Up @@ -441,8 +520,15 @@ subroutine read_netfaer(nf, iflip,nt)
! for GFS, iflip 0: toa to sfc; 1: sfc to toa
DO ii = 1, ntrcaerm
vname=trim(specname(ii))
call nf_inq_varid(ncid, vname, varid)
call nf_get_var(ncid, varid, buffx)
varid = -1
if(.not.netcdf_check(nf90_inq_varid(ncid, vname, varid), &
errmsg, errflg, 'get id of '//trim(vname)//' var')) then
return
endif
if(.not.netcdf_check(nf90_get_var(ncid, varid, buffx), &
errmsg, errflg, 'read '//trim(vname)//' var')) then
return
endif

do j = jamin, jamax
do k = 1, levsaer
Expand All @@ -464,10 +550,11 @@ subroutine read_netfaer(nf, iflip,nt)
ENDDO ! ii-loop (ntracaerm)

! close the file
call nf_close(ncid)
if(.not.netcdf_check(nf90_close(ncid), errmsg, errflg, 'close '//trim(fname))) then
return
endif
deallocate (buff, pres_tmp)
deallocate (buffx)
return
END SUBROUTINE read_netfaer

end module aerinterp
Expand Down
7 changes: 5 additions & 2 deletions physics/docs/pdftxt/suite_input.nml.txt
Original file line number Diff line number Diff line change
Expand Up @@ -394,11 +394,14 @@ show some variables in the namelist that must match the SDF.
<tr><td>cnvcld <td>see \a GFS_typedefs.F90 <td>flag for convective cloud <td>.false.
<tr><td>lgfdlmprad <td>gfs_rrtmg_pre <td>flag for GFDL mp scheme and radiation consistency <td>.false.
<tr><td>nssl_cccn <td>mp_nssl <td>CCN concentration (m^-3) <td>0.6e9
<tr><td>nssl_alphah <td>mp_nssl <td>graupel shape parameter <td>0.0
<tr><td>nssl_alphahl <td>mp_nssl <td>hail shape parameter <td>1.0
<tr><td>nssl_alphar <td>mp_nssl <td>rain PSD shape parameter <td>0.0
<tr><td>nssl_alphah <td>mp_nssl <td>graupel PSD shape parameter <td>0.0
<tr><td>nssl_alphahl <td>mp_nssl <td>hail PSD shape parameter <td>1.0
<tr><td>nssl_hail_on <td>mp_nssl <td>NSSL flag to activate the hail category <td>.false.
<tr><td>nssl_ccn_on <td>mp_nssl <td>NSSL flag to activate the CCN category <td>.true.
<tr><td>nssl_invertccn <td>mp_nssl <td>NSSL flag to treat CCN as activated or unactivated <td>.true.
<tr><td>nssl_ehw0 <td>mp_nssl <td>NSSL graupel-droplet collection efficiency <td>0.9
<tr><td>nssl_ehlw0 <td>mp_nssl <td>NSSL hail-droplet collection efficiency <td>0.9
<tr><td colspan="4" align= center>\b Parameters \b related \b to \b gravity \b drag \b scheme \b options
<tr><td>knob_ugwp_version <td>cires_ugwp <td>parameter selects a version of the UGWP implementation in FV3GFS-127L \n
<ul>
Expand Down
2 changes: 1 addition & 1 deletion physics/module_mp_nssl_2mom.F90
Original file line number Diff line number Diff line change
Expand Up @@ -1228,7 +1228,7 @@ SUBROUTINE nssl_2mom_init( &
rho_qh = nssl_params(8)
rho_qhl = nssl_params(9)
rho_qs = nssl_params(10)
alphar = nssl_params(14)
alphar = nssl_params(15)

! ipelec = Nint(nssl_params(11))
! isaund = Nint(nssl_params(12))
Expand Down
8 changes: 4 additions & 4 deletions physics/mp_nssl.F90
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ subroutine mp_nssl_init(ncol, nlev, errflg, errmsg, threads, restart, &
con_t0c, con_cliq, con_csol, con_eps, &
imp_physics, imp_physics_nssl, &
nssl_cccn, nssl_alphah, nssl_alphahl, &
nssl_alphar, nssl_ehw0_in, nssl_ehlw0_in, &
nssl_alphar, nssl_ehw0, nssl_ehlw0, &
nssl_ccn_on, nssl_hail_on, nssl_invertccn )


Expand All @@ -53,7 +53,7 @@ subroutine mp_nssl_init(ncol, nlev, errflg, errmsg, threads, restart, &
integer, intent(in) :: imp_physics
integer, intent(in) :: imp_physics_nssl
real(kind_phys), intent(in) :: nssl_cccn, nssl_alphah, nssl_alphahl
real(kind_phys), intent(in) :: nssl_alphar, nssl_ehw0_in, nssl_ehlw0_in
real(kind_phys), intent(in) :: nssl_alphar, nssl_ehw0, nssl_ehlw0
logical, intent(in) :: nssl_ccn_on, nssl_hail_on, nssl_invertccn

! Local variables: dimensions used in nssl_init
Expand Down Expand Up @@ -117,7 +117,7 @@ subroutine mp_nssl_init(ncol, nlev, errflg, errmsg, threads, restart, &
nssl_params(11) = 0 ! nssl_ipelec_tmp
nssl_params(12) = 11 ! nssl_isaund
nssl_params(13) = 0 ! 1= turn on cccna; 0 = turn off
nssl_params(14) = nssl_alphar
nssl_params(15) = nssl_alphar

nssl_qccn = nssl_cccn/1.225
! if (mpirank==mpiroot) then
Expand All @@ -132,7 +132,7 @@ subroutine mp_nssl_init(ncol, nlev, errflg, errmsg, threads, restart, &

! write(0,*) 'call nssl_2mom_init'
CALL nssl_2mom_init(ims,ime, jms,jme, kms,kme,nssl_params,ipctmp=5,mixphase=0, &
ihvol=ihailv,nssl_ehw0=nssl_ehw0_in,nssl_ehlw0=nssl_ehlw0_in,errmsg=errmsg,errflg=errflg,myrank=mpirank,mpiroot=mpiroot)
ihvol=ihailv,nssl_ehw0=nssl_ehw0,nssl_ehlw0=nssl_ehlw0,errmsg=errmsg,errflg=errflg,myrank=mpirank,mpiroot=mpiroot)

! For restart runs, the init is done here
if (restart) then
Expand Down
4 changes: 2 additions & 2 deletions physics/mp_nssl.meta
Original file line number Diff line number Diff line change
Expand Up @@ -173,15 +173,15 @@
type = real
kind = kind_phys
intent = in
[nssl_ehw0_in]
[nssl_ehw0]
standard_name = nssl_graupel_collection_efficiency
long_name = graupel droplet collection efficiency in NSSL microphysics scheme
units = none
dimensions = ()
type = real
kind = kind_phys
intent = in
[nssl_ehlw0_in]
[nssl_ehlw0]
standard_name = nssl_hail_collection_efficiency
long_name = hail droplet collection efficiency in NSSL microphysics scheme
units = none
Expand Down

0 comments on commit e9803fc

Please sign in to comment.