Skip to content

Commit

Permalink
Added a variable to RUC LSM that keeps track of snow-free points: sno…
Browse files Browse the repository at this point in the history
…wfree.
  • Loading branch information
tanyasmirnova committed Jan 9, 2024
1 parent 53062d6 commit 368d894
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 9 deletions.
30 changes: 26 additions & 4 deletions physics/SFC_Models/Land/RUC/lsm_ruc.F90
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,7 @@ subroutine lsm_ruc_run & ! inputs
& semisbase, semis_lnd, semis_ice, sfalb_lnd, sfalb_ice, &
& sncovr1_lnd, weasd_lnd, snwdph_lnd, tskin_lnd, &
& sncovr1_ice, weasd_ice, snwdph_ice, tskin_ice, &
& snowfree, &
! for land
& smois, tsice, tslb, sh2o, keepfr, smfrkeep, & ! on RUC levels
& canopy, trans, tsurf_lnd, tsnow_lnd, z0rl_lnd, &
Expand Down Expand Up @@ -419,7 +420,7 @@ subroutine lsm_ruc_run & ! inputs
real (kind_phys), dimension(:), intent(in) :: zs
real (kind_phys), dimension(:), intent(in) :: srflag
real (kind_phys), dimension(:), intent(inout) :: &
& canopy, trans, smcwlt2, smcref2, laixy, &
& canopy, trans, smcwlt2, smcref2, laixy, snowfree, &
! for land
& weasd_lnd, snwdph_lnd, tskin_lnd, &
& tsurf_lnd, z0rl_lnd, tsnow_lnd, &
Expand Down Expand Up @@ -513,7 +514,7 @@ subroutine lsm_ruc_run & ! inputs
& fire_heat_flux1d, &
& sneqv_lnd, snoalb1d_lnd, snowh_lnd, snoh_lnd, tsnav_lnd, &
& snomlt_lnd, sncovr_lnd, soilw, soilm, ssoil_lnd, &
& soilt_lnd, tbot, &
& soilt_lnd, tbot, nosnow, &
& xlai, swdn, z0_lnd, znt_lnd, rhosnfr, infiltr, &
& precipfr, snfallac_lnd, acsn_lnd, soilt1_lnd, chklowq, &
& qsfc_lnd, qsg_lnd, qvg_lnd, qcg_lnd, smcwlt, smcref
Expand Down Expand Up @@ -1139,6 +1140,17 @@ subroutine lsm_ruc_run & ! inputs
sneqv_lnd(i,j)=zero
endif

!-- check if initially the point is snow-free (=1) or covered with snow (=0)
if(kdt == 1) then
if(snowh_lnd(i,j)==zero) then
snowfree(i) = one
else
snowfree(i) = zero
endif
endif

nosnow(i,j) = snowfree(i)

if (debug_print) then
!-- diagnostics for a land test point with known lat/lon
!if (kdt < 10) then
Expand Down Expand Up @@ -1172,7 +1184,7 @@ subroutine lsm_ruc_run & ! inputs
& zs, prcp(i,j), sneqv_lnd(i,j), snowh_lnd(i,j), &
& sncovr_lnd(i,j), &
& ffrozp(i,j), frpcpn, &
& rhosnfr(i,j), precipfr(i,j), exticeden, &
& rhosnfr(i,j), precipfr(i,j), exticeden, nosnow(i,j), &
! --- inputs:
& orog(i,j), stdev(i,j), &
& conflx2(i,1,j), sfcprs(i,1,j), sfctmp(i,1,j), q2(i,1,j), &
Expand Down Expand Up @@ -1319,6 +1331,7 @@ subroutine lsm_ruc_run & ! inputs
canopy(i) = cmc(i,j) ! mm
weasd_lnd(i) = sneqv_lnd(i,j) ! mm
sncovr1_lnd(i) = sncovr_lnd(i,j)
snowfree(i) = nosnow(i,j)
! ---- ... outside RUC LSM, roughness uses cm as unit
! (update after snow's effect)
z0rl_lnd(i) = znt_lnd(i,j)*100._kind_phys
Expand Down Expand Up @@ -1456,6 +1469,14 @@ subroutine lsm_ruc_run & ! inputs
if(abs(sneqv_ice(i,j))<1e-20_kind_phys) then
sneqv_ice(i,j)=zero
endif
if(kdt == 1) then
if(snowh_ice(i,j)==zero) then
snowfree(i) = one
else
snowfree(i) = zero
endif
endif
nosnow(i,j) = snowfree(i)

!> - Call RUC LSM lsmruc() for ice.
call lsmruc(xlat_d(i),xlon_d(i), &
Expand All @@ -1464,7 +1485,7 @@ subroutine lsm_ruc_run & ! inputs
& zs, prcp(i,j), sneqv_ice(i,j), snowh_ice(i,j), &
& sncovr_ice(i,j), &
& ffrozp(i,j), frpcpn, &
& rhosnfr(i,j), precipfr(i,j), exticeden, &
& rhosnfr(i,j), precipfr(i,j), exticeden, nosnow(i,j), &
! --- inputs:
& orog(i,j), stdev(i,j), &
& conflx2(i,1,j), sfcprs(i,1,j), sfctmp(i,1,j), q2(i,1,j), &
Expand Down Expand Up @@ -1520,6 +1541,7 @@ subroutine lsm_ruc_run & ! inputs
snwdph_ice(i) = snowh_ice(i,j) * rhoh2o
weasd_ice(i) = sneqv_ice(i,j) ! kg m-2
sncovr1_ice(i) = sncovr_ice(i,j)
snowfree(i) = nosnow(i,j)
z0rl_ice(i) = znt_ice(i,j)*100._kind_phys ! cm
!-- semis_ice is with snow effect
semis_ice(i) = sfcems_ice(i,j)
Expand Down
8 changes: 8 additions & 0 deletions physics/SFC_Models/Land/RUC/lsm_ruc.meta
Original file line number Diff line number Diff line change
Expand Up @@ -642,6 +642,14 @@
dimensions = ()
type = logical
intent = in
[snowfree]
standard_name = initially_snow_free_point
long_name = a snow-free point at the beginning of the forecast
units = flag
dimensions = (horizontal_loop_extent)
type = real
kind = kind_phys
intent = inout
[lsoil_ruc]
standard_name = vertical_dimension_of_soil_internal_to_land_surface_scheme
long_name = number of soil layers internal to land surface model
Expand Down
14 changes: 9 additions & 5 deletions physics/SFC_Models/Land/RUC/module_sf_ruclsm.F90
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ SUBROUTINE LSMRUC(xlat,xlon, &
DT,init,lsm_cold_start,KTAU,iter,NSL, &
graupelncv,snowncv,rainncv,raincv, &
ZS,RAINBL,SNOW,SNOWH,SNOWC,FRZFRAC,frpcpn, &
rhosnf,precipfr,exticeden, hgt,stdev, &
rhosnf,precipfr,exticeden,snowfree,hgt,stdev, &
Z3D,P8W,T3D,QV3D,QC3D,RHO3D,EMISBCK, &
GLW,GSWdn,GSW,EMISS,CHKLOWQ, CHS, &
FLQC,FLHC,rhonewsn_ex,mosaic_lu, &
Expand Down Expand Up @@ -247,6 +247,7 @@ SUBROUTINE LSMRUC(xlat,xlon, &

real (kind_phys), DIMENSION( 1:nsl), INTENT(IN ) :: ZS

real (kind_phys), DIMENSION( ims:ime ), INTENT(INOUT) :: snowfree
real (kind_phys), DIMENSION( ims:ime , jms:jme ), &
INTENT(INOUT) :: &
SNOW, &
Expand Down Expand Up @@ -363,6 +364,7 @@ SUBROUTINE LSMRUC(xlat,xlon, &
WILT, &
CANWATR, &
SNOWFRAC, &
NOSNOW, &
SNHEI, &
SNWE

Expand Down Expand Up @@ -675,6 +677,7 @@ SUBROUTINE LSMRUC(xlat,xlon, &
SNWE=SNOW(I,J)*1.E-3_kind_phys
SNHEI=SNOWH(I,J)
CANWATR=CANWAT(I,J)*1.E-3_kind_phys
nosnow = snowfree(i)

SNOWFRAC=SNOWC(I,J)
RHOSNFALL=RHOSNF(I,J)
Expand Down Expand Up @@ -957,7 +960,7 @@ SUBROUTINE LSMRUC(xlat,xlon, &
nzs,nddzs,nroot,meltfactor, & !added meltfactor
isncond_opt,isncovr_opt, &
iland,isoil,ivgtyp(i,j),isltyp(i,j), &
PRCPMS, NEWSNMS,SNWE,SNHEI,SNOWFRAC, &
PRCPMS, NEWSNMS,SNWE,SNHEI,SNOWFRAC,nosnow, &
exticeden,RHOSN,RHONEWSN_ex(I),RHONEWSN, &
RHOSNFALL,snowrat,grauprat,icerat,curat, &
PATM,TABS,QVATM,QCATM,RHO, &
Expand Down Expand Up @@ -1213,7 +1216,7 @@ SUBROUTINE SFCTMP (debug_print, delt,ktau,conflx,i,j, & !--- input varia
nzs,nddzs,nroot,meltfactor, &
isncond_opt,isncovr_opt, &
ILAND,ISOIL,IVGTYP,ISLTYP,PRCPMS, &
NEWSNMS,SNWE,SNHEI,SNOWFRAC, &
NEWSNMS,SNWE,SNHEI,SNOWFRAC,snowfree, &
exticeden,RHOSN,RHONEWSN_ex,RHONEWSN,RHOSNFALL, &
snowrat,grauprat,icerat,curat, &
PATM,TABS,QVATM,QCATM,rho, &
Expand Down Expand Up @@ -1277,6 +1280,7 @@ SUBROUTINE SFCTMP (debug_print, delt,ktau,conflx,i,j, & !--- input varia
EMISBCK, &
MAVAIL, &
SNOWFRAC, &
snowfree, &
ALB_SNOW, &
ALB, &
CST
Expand Down Expand Up @@ -1686,7 +1690,7 @@ SUBROUTINE SFCTMP (debug_print, delt,ktau,conflx,i,j, & !--- input varia
snowfrac = tanh( snhei/(10._kind_phys * facsnf *(rhosn/rhonewsn)**m))
endif

if(newsn > zero ) then
if(snowfree == one .and. newsn > zero ) then
SNOWFRACnewsn=MIN(one,SNHEI/SNHEI_CRIT_newsn)
endif

Expand All @@ -1700,7 +1704,7 @@ SUBROUTINE SFCTMP (debug_print, delt,ktau,conflx,i,j, & !--- input varia
if(snowfrac < 0.75_kind_phys) snow_mosaic = one

KEEP_SNOW_ALBEDO = zero
IF (NEWSN > zero .and. snowfracnewsn > 0.99_kind_phys .and. rhosnfall < 450._kind_phys) THEN
IF (snowfree == one .and. snowfracnewsn > 0.99_kind_phys .and. rhosnfall < 450._kind_phys) THEN
! new snow
KEEP_SNOW_ALBEDO = one
! turn off separate treatment of snow covered and snow-free portions of the grid cell
Expand Down

0 comments on commit 368d894

Please sign in to comment.