diff --git a/ccpp/data/GFS_typedefs.F90 b/ccpp/data/GFS_typedefs.F90 index 2dcad7717..c71df59f8 100644 --- a/ccpp/data/GFS_typedefs.F90 +++ b/ccpp/data/GFS_typedefs.F90 @@ -1542,6 +1542,7 @@ module GFS_typedefs real (kind=kind_phys), pointer :: evbsa (:) => null() !< noah lsm diagnostics real (kind=kind_phys), pointer :: evcwa (:) => null() !< noah lsm diagnostics real (kind=kind_phys), pointer :: snohfa (:) => null() !< noah lsm diagnostics + real (kind=kind_phys), pointer :: paha (:) => null() !< noah lsm diagnostics real (kind=kind_phys), pointer :: transa (:) => null() !< noah lsm diagnostics real (kind=kind_phys), pointer :: sbsnoa (:) => null() !< noah lsm diagnostics real (kind=kind_phys), pointer :: snowca (:) => null() !< noah lsm diagnostics @@ -1560,6 +1561,10 @@ module GFS_typedefs real (kind=kind_phys), pointer :: suntim (:) => null() !< sunshine duration time (s) real (kind=kind_phys), pointer :: runoff (:) => null() !< total water runoff real (kind=kind_phys), pointer :: ep (:) => null() !< potential evaporation + real (kind=kind_phys), pointer :: tecan (:) => null() !< total evaporation of intercepted water + real (kind=kind_phys), pointer :: tetran (:) => null() !< total transpiration rate + real (kind=kind_phys), pointer :: tedir (:) => null() !< total soil surface evaporation rate + real (kind=kind_phys), pointer :: twa (:) => null() !< total water storage in aquifer real (kind=kind_phys), pointer :: cldwrk (:) => null() !< cloud workfunction (valid only with sas) real (kind=kind_phys), pointer :: dugwd (:) => null() !< vertically integrated u change by OGWD real (kind=kind_phys), pointer :: dvgwd (:) => null() !< vertically integrated v change by OGWD @@ -1626,6 +1631,7 @@ module GFS_typedefs real (kind=kind_phys), pointer :: dtsfci (:) => null() !< instantaneous sfc sensible heat flux real (kind=kind_phys), pointer :: dqsfci (:) => null() !< instantaneous sfc latent heat flux real (kind=kind_phys), pointer :: gfluxi (:) => null() !< instantaneous sfc ground heat flux + real (kind=kind_phys), pointer :: pahi (:) => null() !< instantaneous precipitation advected heat flux real (kind=kind_phys), pointer :: epi (:) => null() !< instantaneous sfc potential evaporation real (kind=kind_phys), pointer :: smcwlt2(:) => null() !< wilting point (volumetric) real (kind=kind_phys), pointer :: smcref2(:) => null() !< soil moisture threshold (volumetric) @@ -1870,6 +1876,10 @@ module GFS_typedefs real (kind=kind_phys), pointer :: evap_water(:) => null() !< real (kind=kind_phys), pointer :: evbs(:) => null() !< real (kind=kind_phys), pointer :: evcw(:) => null() !< + real (kind=kind_phys), pointer :: pah(:) => null() !< + real (kind=kind_phys), pointer :: ecan(:) => null() !< + real (kind=kind_phys), pointer :: etran(:) => null() !< + real (kind=kind_phys), pointer :: edir(:) => null() !< real (kind=kind_phys), pointer :: faerlw(:,:,:,:) => null() !< real (kind=kind_phys), pointer :: faersw(:,:,:,:) => null() !< real (kind=kind_phys), pointer :: ffhh_ice(:) => null() !< @@ -6430,6 +6440,9 @@ subroutine diag_create (Diag, IM, Model) allocate (Diag%ulwsfc (IM)) allocate (Diag%suntim (IM)) allocate (Diag%runoff (IM)) + allocate (Diag%tecan (IM)) + allocate (Diag%tetran (IM)) + allocate (Diag%tedir (IM)) allocate (Diag%ep (IM)) allocate (Diag%cldwrk (IM)) allocate (Diag%dugwd (IM)) @@ -6491,6 +6504,12 @@ subroutine diag_create (Diag, IM, Model) allocate (Diag%tdoms (IM)) allocate (Diag%zmtnblck (IM)) + if(Model%lsm == Model%lsm_noahmp) then + allocate (Diag%paha (IM)) + allocate (Diag%twa (IM)) + allocate (Diag%pahi (IM)) + endif + ! F-A MP scheme if (Model%imp_physics == Model%imp_physics_fer_hires) then allocate (Diag%train (IM,Model%levs)) @@ -6694,6 +6713,9 @@ subroutine diag_phys_zero (Diag, Model, linit, iauwindow_center) Diag%ulwsfc = zero Diag%suntim = zero Diag%runoff = zero + Diag%tecan = zero + Diag%tetran = zero + Diag%tedir = zero Diag%ep = zero Diag%cldwrk = zero Diag%dugwd = zero @@ -6748,6 +6770,12 @@ subroutine diag_phys_zero (Diag, Model, linit, iauwindow_center) Diag%tdomip = zero Diag%tdoms = zero + if(Model%lsm == Model%lsm_noahmp)then + Diag%paha = zero + Diag%twa = zero + Diag%pahi = zero + endif + if (Model%imp_physics == Model%imp_physics_fer_hires) then Diag%train = zero end if @@ -6976,6 +7004,10 @@ subroutine interstitial_create (Interstitial, IM, Model) allocate (Interstitial%evap_water (IM)) allocate (Interstitial%evbs (IM)) allocate (Interstitial%evcw (IM)) + allocate (Interstitial%pah (IM)) + allocate (Interstitial%ecan (IM)) + allocate (Interstitial%etran (IM)) + allocate (Interstitial%edir (IM)) allocate (Interstitial%faerlw (IM,Model%levr+LTP,NBDLW,NF_AELW)) allocate (Interstitial%faersw (IM,Model%levr+LTP,NBDSW,NF_AESW)) allocate (Interstitial%ffhh_ice (IM)) @@ -7665,6 +7697,10 @@ subroutine interstitial_phys_reset (Interstitial, Model) Interstitial%evap_water = Model%huge Interstitial%evbs = clear_val Interstitial%evcw = clear_val + Interstitial%pah = clear_val + Interstitial%ecan = clear_val + Interstitial%etran = clear_val + Interstitial%edir = clear_val Interstitial%ffhh_ice = Model%huge Interstitial%ffhh_land = Model%huge Interstitial%ffhh_water = Model%huge diff --git a/ccpp/data/GFS_typedefs.meta b/ccpp/data/GFS_typedefs.meta index b446d6e79..b898cdb58 100644 --- a/ccpp/data/GFS_typedefs.meta +++ b/ccpp/data/GFS_typedefs.meta @@ -6375,6 +6375,14 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys +[paha] + standard_name = cumulative_precipitation_advected_heat_flux_multiplied_by_timestep + long_name = cumulative precipitation advected heat flux multiplied by timestep + units = W m-2 s + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (control_for_land_surface_scheme == identifier_for_noahmp_land_surface_scheme) [transa] standard_name = cumulative_transpiration_flux_multiplied_by_timestep long_name = cumulative total plant transpiration rate multiplied by timestep @@ -6551,6 +6559,35 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys +[tecan] + standard_name = total_evaporation_of_intercepted_water + long_name = total evaporation of intercepted water + units = kg m-2 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys +[tetran] + standard_name = total_transpiration_rate + long_name = total transpiration rate + units = kg m-2 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys +[tedir] + standard_name = total_soil_surface_evaporation_rate + long_name = total soil surface evaporation rate + units = kg m-2 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys +[twa] + standard_name = total_water_storage_in_aquifer + long_name = total water storage in aquifer + units = kg m-2 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (control_for_land_surface_scheme == identifier_for_noahmp_land_surface_scheme) [cldwrk] standard_name = cumulative_cloud_work_function long_name = cumulative cloud work function (valid only with sas) @@ -6838,6 +6875,14 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys +[pahi] + standard_name = instantaneous_total_precipitation_advected_heat + long_name = instantaneous precipitation advected heat - total + units = W m-2 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (control_for_land_surface_scheme == identifier_for_noahmp_land_surface_scheme) [epi] standard_name = instantaneous_surface_potential_evaporation long_name = instantaneous sfc potential evaporation @@ -8174,6 +8219,34 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys +[pah] + standard_name = total_precipitation_advected_heat + long_name = precipitation advected heat - total + units = W m-2 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys +[ecan] + standard_name = evaporation_of_intercepted_water + long_name = evaporation of intercepted water + units = kg m-2 s-1 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys +[etran] + standard_name = transpiration_rate + long_name = transpiration rate + units = kg m-2 s-1 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys +[edir] + standard_name = soil_surface_evaporation_rate + long_name = soil surface evaporation rate + units = kg m-2 s-1 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys [faerlw] standard_name = aerosol_optical_properties_for_longwave_bands_01_16 long_name = aerosol optical properties for longwave bands 01-16 diff --git a/ccpp/driver/GFS_diagnostics.F90 b/ccpp/driver/GFS_diagnostics.F90 index 529700ca9..d8c77176d 100644 --- a/ccpp/driver/GFS_diagnostics.F90 +++ b/ccpp/driver/GFS_diagnostics.F90 @@ -977,6 +977,20 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop do nb = 1,nblks ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%snohfa(:) enddo + + if (Model%lsm == Model%lsm_noahmp) then + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'pah_ave' + ExtDiag(idx)%desc = ' Total Precipitation Advected Heat - GFS lsm' + ExtDiag(idx)%unit = 'W/m**2' + ExtDiag(idx)%mod_name = 'gfs_phys' + ExtDiag(idx)%time_avg = .TRUE. + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%paha(:) + enddo + endif idx = idx + 1 ExtDiag(idx)%axes = 2 @@ -1199,6 +1213,52 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%runoff(:) enddo + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'ecan_acc' + ExtDiag(idx)%desc = 'total evaporation of intercepted water' + ExtDiag(idx)%unit = 'kg/m**2' + ExtDiag(idx)%mod_name = 'gfs_phys' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%tecan(:) + enddo + + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'etran_acc' + ExtDiag(idx)%desc = 'total plant transpiration' + ExtDiag(idx)%unit = 'kg/m**2' + ExtDiag(idx)%mod_name = 'gfs_phys' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%tetran(:) + enddo + + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'edir_acc' + ExtDiag(idx)%desc = 'total soil surface evaporation' + ExtDiag(idx)%unit = 'kg/m**2' + ExtDiag(idx)%mod_name = 'gfs_phys' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%tedir(:) + enddo + + if (Model%lsm == Model%lsm_noahmp) then + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'wa_acc' + ExtDiag(idx)%desc = 'total water storage in aquifer' + ExtDiag(idx)%unit = 'kg/m**2' + ExtDiag(idx)%mod_name = 'gfs_phys' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%twa(:) + enddo + endif + idx = idx + 1 ExtDiag(idx)%axes = 2 ExtDiag(idx)%name = 'pevpr_ave' @@ -1856,6 +1916,19 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%gfluxi(:) enddo + if (Model%lsm == Model%lsm_noahmp) then + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'pahi' + ExtDiag(idx)%desc = 'instantaneous precipitation advected heat flux' + ExtDiag(idx)%unit = 'W/m**2' + ExtDiag(idx)%mod_name = 'gfs_phys' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%pahi(:) + enddo + endif + idx = idx + 1 ExtDiag(idx)%axes = 2 ExtDiag(idx)%name = 'pevpr' @@ -2739,6 +2812,17 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop ExtDiag(idx)%data(nb)%int2 => Sfcprop(nb)%stype(:) enddo + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'lfrac' + ExtDiag(idx)%desc = 'land fraction' + ExtDiag(idx)%unit = 'fraction [0:1]' + ExtDiag(idx)%mod_name = 'gfs_sfc' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => Sfcprop(nb)%landfrac(:) + enddo + idx = idx + 1 ExtDiag(idx)%axes = 2 ExtDiag(idx)%name = 'q2m' diff --git a/ccpp/physics b/ccpp/physics index aeef84441..d9e667677 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit aeef8444189b6d571bc5db2da65a66c34cf254cc +Subproject commit d9e66767701232a1172c5b572c441fd10a4f7c0a diff --git a/io/post_gfs.F90 b/io/post_gfs.F90 index 9cca1521b..08079d9c9 100644 --- a/io/post_gfs.F90 +++ b/io/post_gfs.F90 @@ -347,8 +347,8 @@ subroutine set_postvars_gfs(wrt_int_state,mpicomp,setvar_atmfile, & use vrbls2d, only: f, pd, sigt4, fis, pblh, ustar, z0, ths, qs, twbs,& qwbs, avgcprate, cprate, avgprec, prec, lspa, sno,& cldefi, th10, q10, tshltr, pshltr, tshltr, albase,& - avgalbedo, avgtcdc, czen, czmean, mxsnal, radot, & - cfrach, cfracl, cfracm, avgcfrach, qshltr, & + avgalbedo, avgtcdc, czen, czmean, mxsnal,landfrac,& + radot, cfrach, cfracl, cfracm, avgcfrach, qshltr, & avgcfracl, avgcfracm, cnvcfr, islope, cmc, grnflx,& vegfrc, acfrcv, ncfrcv, acfrst, ncfrst, ssroff, & bgroff, rlwin, & @@ -360,10 +360,11 @@ subroutine set_postvars_gfs(wrt_int_state,mpicomp,setvar_atmfile, & acsnow, acsnom, sst, thz0, qz0, uz0, vz0, ptop, & htop, pbot, hbot, ptopl, pbotl, ttopl, ptopm, & pbotm, ttopm, ptoph, pboth, pblcfr, ttoph, runoff,& + tecan, tetran, tedir, twa, & maxtshltr, mintshltr, maxrhshltr, minrhshltr, & dzice, smcwlt, suntime, fieldcapa, htopd, hbotd, & htops, hbots, aswintoa, maxqshltr, minqshltr, & - acond, sr, u10h, v10h, avgedir, avgecan, & + acond, sr, u10h, v10h, avgedir, avgecan,paha,pahi,& avgetrans, avgesnow, avgprec_cont, avgcprate_cont,& avisbeamswin, avisdiffswin, airbeamswin, airdiffswin, & alwoutc, alwtoac, aswoutc, aswtoac, alwinc, aswinc,& @@ -1081,6 +1082,18 @@ subroutine set_postvars_gfs(wrt_int_state,mpicomp,setvar_atmfile, & enddo endif + ! land fraction + if(trim(fieldname)=='lfrac') then + !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,spval,landfrac,arrayr42d,sm) + do j=jsta,jend + do i=ista, iend + landfrac(i,j) = arrayr42d(i,j) + if (sm(i,j) /= 0.0) landfrac(i,j) = spval + enddo + enddo + endif + + ! ave high cloud fraction if(trim(fieldname)=='tcdc_avehcl') then !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,spval,avgcfrach,arrayr42d) @@ -1797,6 +1810,50 @@ subroutine set_postvars_gfs(wrt_int_state,mpicomp,setvar_atmfile, & enddo endif + ! accumulated evaporation of intercepted water + if(trim(fieldname)=='ecan_acc') then + !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,spval,tecan,arrayr42d,sm) + do j=jsta,jend + do i=ista, iend + tecan(i,j) = arrayr42d(i,j) + if (sm(i,j) /= 0.0) tecan(i,j) = spval + enddo + enddo + endif + + ! accumulated plant transpiration + if(trim(fieldname)=='etran_acc') then + !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,spval,tetran,arrayr42d,sm) + do j=jsta,jend + do i=ista, iend + tetran(i,j) = arrayr42d(i,j) + if (sm(i,j) /= 0.0) tetran(i,j) = spval + enddo + enddo + endif + + ! accumulated soil surface evaporation + if(trim(fieldname)=='edir_acc') then + !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,spval,tedir,arrayr42d,sm) + do j=jsta,jend + do i=ista, iend + tedir(i,j) = arrayr42d(i,j) + if (sm(i,j) /= 0.0) tedir(i,j) = spval + enddo + enddo + endif + + ! total water storage in aquifer + if(trim(fieldname)=='wa_acc') then + !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,spval,twa,arrayr42d,sm) + do j=jsta,jend + do i=ista, iend + twa(i,j) = arrayr42d(i,j) + if (sm(i,j) /= 0.0) twa(i,j) = spval + enddo + enddo + endif + ! shelter max temperature if(trim(fieldname)=='tmax_max2m') then !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,maxtshltr,arrayr42d) @@ -2012,6 +2069,28 @@ subroutine set_postvars_gfs(wrt_int_state,mpicomp,setvar_atmfile, & enddo endif + ! AVERAGED PRECIP ADVECTED HEAT FLUX + if(trim(fieldname)=='pah_ave') then + !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,spval,paha,arrayr42d,sm) + do j=jsta,jend + do i=ista, iend + paha(i,j) = arrayr42d(i,j) + if (sm(i,j) /= 0.0) paha(i,j) = spval + enddo + enddo + endif + + ! instantaneous PRECIP ADVECTED HEAT FLUX + if(trim(fieldname)=='pahi') then + !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,spval,pahi,arrayr42d,sm) + do j=jsta,jend + do i=ista, iend + pahi(i,j) = arrayr42d(i,j) + if (sm(i,j) /= 0.0) pahi(i,j) = spval + enddo + enddo + endif + ! plant transpiration if(trim(fieldname)=='trans_ave') then !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,spval,avgetrans,arrayr42d,sm)