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
29 changes: 26 additions & 3 deletions physics/GFS_PBL_generic.F90
Original file line number Diff line number Diff line change
Expand Up @@ -395,8 +395,8 @@ subroutine GFS_PBL_generic_post_run (im, levs, nvdiff, ntrac,
ntqv, ntcw, ntiw, ntrw, ntsw, ntlnc, ntinc, ntrnc, ntsnc, ntgnc, ntwa, ntia, ntgl, ntoz, ntke, ntkev,nqrimef, &
trans_aero, ntchs, ntchm, ntccn, nthl, nthnc, ntgv, nthv, &
imp_physics, imp_physics_gfdl, imp_physics_thompson, imp_physics_wsm6, imp_physics_zhao_carr, imp_physics_mg, &
imp_physics_fer_hires, imp_physics_nssl, nssl_ccn_on, &
ltaerosol, nssl_hail_on, cplflx, cplchm, lssav, flag_for_pbl_generic_tend, ldiag3d, lsidea, hybedmf, do_shoc, satmedmf,&
imp_physics_fer_hires, imp_physics_nssl, nssl_ccn_on, ltaerosol, nssl_hail_on, &
cplflx, cplaqm, cplchm, lssav, flag_for_pbl_generic_tend, ldiag3d, lsidea, hybedmf, do_shoc, satmedmf, &
shinhong, do_ysu, dvdftra, dusfc1, dvsfc1, dtsfc1, dqsfc1, dtf, dudt, dvdt, dtdt, htrsw, htrlw, xmu, &
dqdt, dusfc_cpl, dvsfc_cpl, dtsfc_cpl, dtend, dtidx, index_of_temperature, index_of_x_wind, index_of_y_wind, &
index_of_process_pbl, dqsfc_cpl, dusfci_cpl, dvsfci_cpl, dtsfci_cpl, dqsfci_cpl, dusfc_diag, dvsfc_diag, dtsfc_diag, &
Expand All @@ -419,7 +419,7 @@ subroutine GFS_PBL_generic_post_run (im, levs, nvdiff, ntrac,
integer, intent(in) :: imp_physics_zhao_carr, imp_physics_mg, imp_physics_fer_hires
integer, intent(in) :: imp_physics_nssl
logical, intent(in) :: nssl_ccn_on, nssl_hail_on
logical, intent(in) :: ltaerosol, cplflx, cplchm, lssav, ldiag3d, lsidea
logical, intent(in) :: ltaerosol, cplflx, cplaqm, cplchm, lssav, ldiag3d, lsidea
logical, intent(in) :: hybedmf, do_shoc, satmedmf, shinhong, do_ysu

logical, intent(in) :: flag_for_pbl_generic_tend
Expand Down Expand Up @@ -741,6 +741,29 @@ subroutine GFS_PBL_generic_post_run (im, levs, nvdiff, ntrac,
end if
end if

if (cplaqm .and. .not.cplflx) then
do i=1,im
if (oceanfrac(i) > zero) then ! Ocean only, NO LAKES
if ( .not. wet(i)) then ! no open water
if (kdt > 1) then !use results from CICE
dtsfci_cpl(i) = dtsfc_cice(i)
dqsfci_cpl(i) = dqsfc_cice(i)
else !use PBL fluxes when CICE fluxes is unavailable
dtsfci_cpl(i) = dtsfc1(i)*hffac(i)
dqsfci_cpl(i) = dqsfc1(i)
end if
elseif (icy(i) .or. dry(i)) then ! use stress_ocean from sfc_diff for opw component at mixed point
rho = prsl(i,1) / (rd*t1(i)*(one+fvirt*max(q1(i), qmin)))
dtsfci_cpl(i) = cp * rho * hflx_wat(i) ! sensible heat flux over open ocean
dqsfci_cpl(i) = hvap * rho * evap_wat(i) ! latent heat flux over open ocean
else ! use results from PBL scheme for 100% open ocean
dtsfci_cpl(i) = dtsfc1(i)*hffac(i)
dqsfci_cpl(i) = dqsfc1(i)
endif
endif ! Ocean only, NO LAKES
enddo
end if

!-------------------------------------------------------lssav if loop ----------
if (lssav) then
do i=1,im
Expand Down
7 changes: 7 additions & 0 deletions physics/GFS_PBL_generic.meta
Original file line number Diff line number Diff line change
Expand Up @@ -728,6 +728,13 @@
dimensions = ()
type = logical
intent = in
[cplaqm]
standard_name = flag_for_air_quality_coupling
long_name = flag controlling cplaqm collection (default off)
units = flag
dimensions = ()
type = logical
intent = in
[cplchm]
standard_name = flag_for_chemistry_coupling
long_name = flag controlling cplchm collection (default off)
Expand Down
32 changes: 30 additions & 2 deletions physics/GFS_surface_generic.F90
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,7 @@ end subroutine GFS_surface_generic_post_finalize
!> \section arg_table_GFS_surface_generic_post_run Argument Table
!! \htmlinclude GFS_surface_generic_post_run.html
!!
subroutine GFS_surface_generic_post_run (im, cplflx, cplchm, cplwav, lssav, dry, icy, wet, &
subroutine GFS_surface_generic_post_run (im, cplflx, cplaqm, cplchm, cplwav, lssav, dry, icy, wet, &
lsm, lsm_noahmp, dtf, ep1d, gflx, tgrs_1, qgrs_1, ugrs_1, vgrs_1, &
adjsfcdlw, adjsfcdsw, adjnirbmd, adjnirdfd, adjvisbmd, adjvisdfd, adjsfculw, adjsfculw_wat, adjnirbmu, adjnirdfu, &
adjvisbmu, adjvisdfu, t2m, q2m, u10m, v10m, tsfc, tsfc_wat, pgr, xcosz, evbs, evcw, trans, sbsno, snowc, snohf, pah, pahi, &
Expand All @@ -288,7 +288,7 @@ subroutine GFS_surface_generic_post_run (im, cplflx, cplchm, cplwav, lssav, dry,
implicit none

integer, intent(in) :: im
logical, intent(in) :: cplflx, cplchm, cplwav, lssav
logical, intent(in) :: cplflx, cplaqm, cplchm, cplwav, lssav
logical, dimension(:), intent(in) :: dry, icy, wet
integer, intent(in) :: lsm, lsm_noahmp
real(kind=kind_phys), intent(in) :: dtf
Expand Down Expand Up @@ -416,6 +416,34 @@ subroutine GFS_surface_generic_post_run (im, cplflx, cplchm, cplwav, lssav, dry,
enddo
endif

if (cplaqm .and. .not.cplflx) then
do i=1,im
t2mi_cpl (i) = t2m(i)
q2mi_cpl (i) = q2m(i)
psurfi_cpl (i) = pgr(i)
if (wet(i)) then ! some open water
! --- compute open water albedo
xcosz_loc = max( zero, min( one, xcosz(i) ))
ocalnirdf_cpl = 0.06_kind_phys
ocalnirbm_cpl = max(albdf, 0.026_kind_phys/(xcosz_loc**1.7_kind_phys+0.065_kind_phys) &
& + 0.15_kind_phys * (xcosz_loc-0.1_kind_phys) * (xcosz_loc-0.5_kind_phys) &
& * (xcosz_loc-one))
ocalvisdf_cpl = 0.06_kind_phys
ocalvisbm_cpl = ocalnirbm_cpl

nswsfci_cpl(i) = adjnirbmd(i) * (one-ocalnirbm_cpl) + &
adjnirdfd(i) * (one-ocalnirdf_cpl) + &
adjvisbmd(i) * (one-ocalvisbm_cpl) + &
adjvisdfd(i) * (one-ocalvisdf_cpl)
else
nswsfci_cpl(i) = adjnirbmd(i) - adjnirbmu(i) + &
adjnirdfd(i) - adjnirdfu(i) + &
adjvisbmd(i) - adjvisbmu(i) + &
adjvisdfd(i) - adjvisdfu(i)
endif
enddo
endif

if (lssav) then
do i=1,im
gflux(i) = gflux(i) + gflx(i) * dtf
Expand Down
7 changes: 7 additions & 0 deletions physics/GFS_surface_generic.meta
Original file line number Diff line number Diff line change
Expand Up @@ -558,6 +558,13 @@
dimensions = ()
type = logical
intent = in
[cplaqm]
standard_name = flag_for_air_quality_coupling
long_name = flag controlling cplaqm collection (default off)
units = flag
dimensions = ()
type = logical
intent = in
[cplchm]
standard_name = flag_for_chemistry_coupling
long_name = flag controlling cplchm collection (default off)
Expand Down
12 changes: 9 additions & 3 deletions physics/sfc_drv.f
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,8 @@ end subroutine lsm_noah_finalize
! smcwlt2 - real, dry soil moisture threshold im !
! smcref2 - real, soil moisture threshold im !
! wet1 - real, normalized soil wetness im !
! lai - real, leaf area index (dimensionless) im !
! rca - real, canopy resistance (s/m) im !
! !
! ==================== end of description ===================== !

Expand Down Expand Up @@ -225,7 +227,7 @@ subroutine lsm_noah_run &
! --- outputs:
& sncovr1, qsurf, gflux, drain, evap, hflx, ep, runoff, &
& cmm, chh, evbs, evcw, sbsno, snowc, stm, snohf, &
& smcwlt2, smcref2, wet1, errmsg, errflg &
& smcwlt2, smcref2, wet1, lai, rca, errmsg, errflg &
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.

Do we need to make the same change for the other two land surface models?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

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.

Eventually. The AQM model has only been tested with Noah.

Copy link
Copy Markdown
Contributor

@HelinWei-NOAA HelinWei-NOAA Mar 25, 2022

Choose a reason for hiding this comment

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

Noah-MP will replace Noah in all future implementations. It has been used since PT7. So I am not sure the AQM will be included in PT8. If so the same changes have to be made to Noah-MP.

& )
!
!use machine , only : kind_phys
Expand Down Expand Up @@ -282,7 +284,7 @@ subroutine lsm_noah_run &
real (kind=kind_phys), dimension(:), intent(inout) :: sncovr1, &
& qsurf, gflux, drain, evap, hflx, ep, runoff, cmm, chh, &
& evbs, evcw, sbsno, snowc, stm, snohf, smcwlt2, smcref2, &
& wet1
& wet1, lai, rca

character(len=*), intent(out) :: errmsg
integer, intent(out) :: errflg
Expand Down Expand Up @@ -552,6 +554,8 @@ subroutine lsm_noah_run &
!!\n ssoil - soil heat flux (\f$W m^{-2}\f$: negative if downward from surface)
!!\n runoff1 - surface runoff (\f$m s^{-1}\f$), not infiltrating the surface
!!\n runoff2 - subsurface runoff (\f$m s^{-1}\f$), drainage out bottom
!!\n xlai - leaf area index (dimensionless)
!!\n rca - canopy resistance (s/m)

evap(i) = eta
hflx(i) = sheat
Expand Down Expand Up @@ -590,6 +594,9 @@ subroutine lsm_noah_run &
! ---- ... outside sflx, roughness uses cm as unit (update after snow's effect)
zorl(i) = z0*100.0_kind_phys

lai(i) = xlai
rca(i) = rc

!> - Do not return the following output fields to parent model:
!!\n ec - canopy water evaporation (m s-1)
!!\n edir - direct soil evaporation (m s-1)
Expand All @@ -610,7 +617,6 @@ subroutine lsm_noah_run &
!!\n rc - canopy resistance (s m-1)
!!\n pc - plant coefficient (unitless fraction, 0-1) where pc*etp
!! = actual transp
!!\n xlai - leaf area index (dimensionless)
!!\n rsmin - minimum canopy resistance (s m-1)
!!\n rcs - incoming solar rc factor (dimensionless)
!!\n rct - air temperature rc factor (dimensionless)
Expand Down
16 changes: 16 additions & 0 deletions physics/sfc_drv.meta
Original file line number Diff line number Diff line change
Expand Up @@ -734,6 +734,22 @@
type = real
kind = kind_phys
intent = inout
[lai]
standard_name = leaf_area_index
long_name = leaf area index
units = none
dimensions = (horizontal_loop_extent)
type = real
kind = kind_phys
intent = inout
[rca]
standard_name = aerodynamic_resistance_in_canopy
long_name = canopy resistance
units = s m-1
dimensions = (horizontal_loop_extent)
type = real
kind = kind_phys
intent = inout
[errmsg]
standard_name = ccpp_error_message
long_name = error message for error handling in CCPP
Expand Down