Skip to content

Commit

Permalink
Merge pull request #47 from spencerkclark/noahmp/prescribed-snow-albe…
Browse files Browse the repository at this point in the history
…do-option

Add option to use a prescribed snow albedo with Noah-MP
  • Loading branch information
lharris4 authored Jun 17, 2024
2 parents 8c9dfc5 + a906be2 commit 573746a
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 14 deletions.
2 changes: 1 addition & 1 deletion GFS_layer/GFS_typedefs.F90
Original file line number Diff line number Diff line change
Expand Up @@ -606,7 +606,7 @@ module GFS_typedefs
integer :: iopt_frz !supercooled liquid water (1-> ny06; 2->koren99)
integer :: iopt_inf !frozen soil permeability (1-> ny06; 2->koren99)
integer :: iopt_rad !radiation transfer (1->gap=f(3d,cosz); 2->gap=0; 3->gap=1-fveg)
integer :: iopt_alb !snow surface albedo (1->bats; 2->class)
integer :: iopt_alb !snow surface albedo (1->bats; 2->class; 3->climatology)
integer :: iopt_snf !rainfall & snowfall (1-jordan91; 2->bats; 3->noah)
integer :: iopt_tbot !lower boundary of soil temperature (1->zero-flux; 2->noah)
integer :: iopt_stc !snow/soil temperature time scheme (only layer 1)
Expand Down
24 changes: 15 additions & 9 deletions gsmphys/module_sf_noahmp_glacier.f90
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ module noahmp_glacier_globals

! =====================================options for different schemes================================
! options for ground snow surface albedo
! 1-> bats; 2 -> class
! 1 -> bats; 2 -> class; 3 -> prescribed from fix file climatology

integer :: opt_alb != 2 !(suggested 2)

Expand Down Expand Up @@ -106,6 +106,7 @@ subroutine noahmp_glacier (&
iloc ,jloc ,cosz ,nsnow ,nsoil ,dt , & ! in : time/space/model-related
sfctmp ,sfcprs ,uu ,vv ,q2 ,soldn , & ! in : forcing
prcp ,lwdn ,tbot ,zlvl ,ficeold ,zsoil , & ! in : forcing
snoalb , & ! in : forcing
qsnow ,sneqvo ,albold ,cm ,ch ,isnow , & ! in/out :
sneqv ,smc ,zsnso ,snowh ,snice ,snliq , & ! in/out :
tg ,stc ,sh2o ,tauss ,qsfc , & ! in/out :
Expand Down Expand Up @@ -139,7 +140,7 @@ subroutine noahmp_glacier (&
real (kind=kind_phys) , intent(in) :: zlvl !reference height (m)
real (kind=kind_phys), dimension(-nsnow+1: 0), intent(in) :: ficeold!ice fraction at last timestep
real (kind=kind_phys), dimension( 1:nsoil), intent(in) :: zsoil !layer-bottom depth from soil surf (m)

real (kind=kind_phys) , intent(in) :: snoalb !prescribed snow albedo (only used if iopt_alb = 3)

! input/output : need arbitary intial values
real (kind=kind_phys) , intent(inout) :: qsnow !snowfall [mm/s]
Expand Down Expand Up @@ -235,7 +236,7 @@ subroutine noahmp_glacier (&
call energy_glacier (nsnow ,nsoil ,isnow ,dt ,qsnow ,rhoair , & !in
eair ,sfcprs ,qair ,sfctmp ,lwdn ,uu , & !in
vv ,solad ,solai ,cosz ,zlvl , & !in
tbot ,zbot ,zsnso ,dzsnso , & !in
tbot ,zbot ,zsnso ,dzsnso ,snoalb , & !in
tg ,stc ,snowh ,sneqv ,sneqvo ,sh2o , & !inout
smc ,snice ,snliq ,albold ,cm ,ch , & !inout
tauss ,qsfc , & !inout
Expand Down Expand Up @@ -346,7 +347,7 @@ end subroutine atm_glacier
subroutine energy_glacier (nsnow ,nsoil ,isnow ,dt ,qsnow ,rhoair , & !in
eair ,sfcprs ,qair ,sfctmp ,lwdn ,uu , & !in
vv ,solad ,solai ,cosz ,zref , & !in
tbot ,zbot ,zsnso ,dzsnso , & !in
tbot ,zbot ,zsnso ,dzsnso ,snoalb , & !in
tg ,stc ,snowh ,sneqv ,sneqvo ,sh2o , & !inout
smc ,snice ,snliq ,albold ,cm ,ch , & !inout
tauss ,qsfc , & !inout
Expand Down Expand Up @@ -384,6 +385,7 @@ subroutine energy_glacier (nsnow ,nsoil ,isnow ,dt ,qsnow ,rhoair , & !i
real (kind=kind_phys) , intent(in) :: zbot !depth for tbot [m]
real (kind=kind_phys) , dimension(-nsnow+1:nsoil), intent(in) :: zsnso !layer-bottom depth from snow surf [m]
real (kind=kind_phys) , dimension(-nsnow+1:nsoil), intent(in) :: dzsnso !depth of snow & soil layer-bottom [m]
real (kind=kind_phys) , intent(in) :: snoalb !prescribed snow albedo (only used if iopt_alb = 3)

! input & output
real (kind=kind_phys) , intent(inout) :: tg !ground temperature (k)
Expand Down Expand Up @@ -462,7 +464,7 @@ subroutine energy_glacier (nsnow ,nsoil ,isnow ,dt ,qsnow ,rhoair , & !i
! solar radiation: absorbed & reflected by the ground

call radiation_glacier (dt ,tg ,sneqvo ,sneqv ,cosz , & !in
qsnow ,solad ,solai , & !in
qsnow ,solad ,solai ,snoalb , & !in
albold ,tauss , & !inout
sag ,fsr ,fsa , albsnd ,albsni) !out

Expand Down Expand Up @@ -658,7 +660,7 @@ subroutine csnow_glacier (isnow ,nsnow ,nsoil ,snice ,snliq ,dzsnso ,
end subroutine csnow_glacier
!===================================================================================================
subroutine radiation_glacier (dt ,tg ,sneqvo ,sneqv ,cosz , & !in
qsnow ,solad ,solai , & !in
qsnow ,solad ,solai ,snoalb , & !in
albold ,tauss , & !inout
sag ,fsr ,fsa , albsnd ,albsni) !out
! --------------------------------------------------------------------------------------------------
Expand All @@ -673,6 +675,7 @@ subroutine radiation_glacier (dt ,tg ,sneqvo ,sneqv ,cosz , & !i
real (kind=kind_phys), intent(in) :: qsnow !snowfall (mm/s)
real (kind=kind_phys), dimension(1:2) , intent(in) :: solad !incoming direct solar radiation (w/m2)
real (kind=kind_phys), dimension(1:2) , intent(in) :: solai !incoming diffuse solar radiation (w/m2)
real (kind=kind_phys), intent(in) :: snoalb !prescribed snow albedo (only used if iopt_alb = 3)

! inout
real (kind=kind_phys), intent(inout) :: albold !snow albedo at last time step (class type)
Expand Down Expand Up @@ -714,11 +717,14 @@ subroutine radiation_glacier (dt ,tg ,sneqvo ,sneqv ,cosz , & !i

call snow_age_glacier (dt,tg,sneqvo,sneqv,tauss,fage)

if(opt_alb == 1) &
if(opt_alb == 1) then
call snowalb_bats_glacier (nband,cosz,fage,albsnd,albsni)
if(opt_alb == 2) then
else if(opt_alb == 2) then
call snowalb_class_glacier(nband,qsnow,dt,alb,albold,albsnd,albsni)
albold = alb
else if(opt_alb == 3) then
albsnd = snoalb
albsni = snoalb
end if

endif
Expand Down Expand Up @@ -3034,7 +3040,7 @@ subroutine noahmp_options_glacier(iopt_alb ,iopt_snf ,iopt_tbot, iopt_stc, iop

implicit none

integer, intent(in) :: iopt_alb !snow surface albedo (1->bats; 2->class)
integer, intent(in) :: iopt_alb !snow surface albedo (1->bats; 2->class; 3->climatology)
integer, intent(in) :: iopt_snf !rainfall & snowfall (1-jordan91; 2->bats; 3->noah)
integer, intent(in) :: iopt_tbot !lower boundary of soil temperature (1->zero-flux; 2->noah)
integer, intent(in) :: iopt_stc !snow/soil temperature time scheme (only layer 1)
Expand Down
23 changes: 19 additions & 4 deletions gsmphys/module_sf_noahmplsm.f90
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,8 @@ module module_sf_noahmplsm

integer :: opt_alb ! options for ground snow surface albedo
! 1 -> bats
! **2 -> class
! **2 -> class
! 3 -> prescribed from fix file climatology

integer :: opt_snf ! options for partitioning precipitation into rainfall & snowfall
! **1 -> jordan (1991)
Expand Down Expand Up @@ -285,6 +286,7 @@ subroutine noahmp_sflx (parameters, &
qc , soldn , lwdn , & ! in : forcing
prcpconv, prcpnonc, prcpshcv, prcpsnow, prcpgrpl, prcphail, & ! in : forcing
tbot , co2air , o2air , foln , ficeold , zlvl , & ! in : forcing
snoalb , & ! in : forcing
albold , sneqvo , & ! in/out :
stc , sh2o , smc , tah , eah , fwet , & ! in/out :
canliq , canice , tv , tg , qsfc , qsnow , & ! in/out :
Expand Down Expand Up @@ -355,6 +357,7 @@ subroutine noahmp_sflx (parameters, &
real (kind=kind_phys) , intent(in) :: dz8w !thickness of lowest layer
real (kind=kind_phys) , intent(in) :: dx
real (kind=kind_phys) , intent(in) :: shdmax !yearly max vegetation fraction
real (kind=kind_phys) , intent(in) :: snoalb ! prescribed snow albedo (only used if iopt_alb = 3)
!jref:end


Expand Down Expand Up @@ -637,6 +640,7 @@ subroutine noahmp_sflx (parameters, &
elai ,esai ,fwet ,foln , & !in
fveg ,pahv ,pahg ,pahb , & !in
qsnow ,dzsnso ,lat ,canliq ,canice ,iloc, jloc , & !in
snoalb , & !in
z0wrf , &
imelt ,snicev ,snliqv ,epore ,t2m ,fsno , & !out
sav ,sag ,qmelt ,fsa ,fsr ,taux , & !out
Expand Down Expand Up @@ -1338,6 +1342,7 @@ subroutine energy (parameters,ice ,vegtyp ,ist ,nsnow ,nsoil , & !in
elai ,esai ,fwet ,foln , & !in
fveg ,pahv ,pahg ,pahb , & !in
qsnow ,dzsnso ,lat ,canliq ,canice ,iloc , jloc, & !in
snoalb , & !in
z0wrf , &
imelt ,snicev ,snliqv ,epore ,t2m ,fsno , & !out
sav ,sag ,qmelt ,fsa ,fsr ,taux , & !out
Expand Down Expand Up @@ -1443,6 +1448,7 @@ subroutine energy (parameters,ice ,vegtyp ,ist ,nsnow ,nsoil , & !in
real (kind=kind_phys) , intent(in) :: dx !horisontal resolution
real (kind=kind_phys) , intent(in) :: dz8w !thickness of lowest layer
real (kind=kind_phys) , intent(in) :: q2 !mixing ratio (kg/kg)
real (kind=kind_phys) , intent(in) :: snoalb !prescribed snow albedo (only used if iopt_alb = 3)
!jref:end

! outputs
Expand Down Expand Up @@ -1703,6 +1709,7 @@ subroutine energy (parameters,ice ,vegtyp ,ist ,nsnow ,nsoil , & !in
tg ,tv ,fsno ,qsnow ,fwet , & !in
elai ,esai ,smc ,solad ,solai , & !in
fveg ,iloc ,jloc , & !in
snoalb , & !in
albold ,tauss , & !inout
fsun ,laisun ,laisha ,parsun ,parsha , & !out
sav ,sag ,fsr ,fsa ,fsrv , &
Expand Down Expand Up @@ -2244,6 +2251,7 @@ subroutine radiation (parameters,vegtyp ,ist ,ice ,nsoil , & !in
tg ,tv ,fsno ,qsnow ,fwet , & !in
elai ,esai ,smc ,solad ,solai , & !in
fveg ,iloc ,jloc , & !in
snoalb , & !in
albold ,tauss , & !inout
fsun ,laisun ,laisha ,parsun ,parsha , & !out
sav ,sag ,fsr ,fsa ,fsrv , &
Expand Down Expand Up @@ -2276,6 +2284,7 @@ subroutine radiation (parameters,vegtyp ,ist ,ice ,nsoil , & !in
real (kind=kind_phys), dimension(1:2) , intent(in) :: solai !incoming diffuse solar radiation (w/m2)
real (kind=kind_phys), intent(in) :: fsno !snow cover fraction (-)
real (kind=kind_phys), intent(in) :: fveg !green vegetation fraction [0.0-1.0]
real (kind=kind_phys), intent(in) :: snoalb !prescribed snow albedo (only used if iopt_alb = 3)

! inout
real (kind=kind_phys), intent(inout) :: albold !snow albedo at last time step (class type)
Expand Down Expand Up @@ -2332,6 +2341,7 @@ subroutine radiation (parameters,vegtyp ,ist ,ice ,nsoil , & !in
tg ,tv ,snowh ,fsno ,fwet , & !in
smc ,sneqvo ,sneqv ,qsnow ,fveg , & !in
iloc ,jloc , & !in
snoalb , & !in
albold ,tauss , & !inout
albgrd ,albgri ,albd ,albi ,fabd , & !out
fabi ,ftdd ,ftid ,ftii ,fsun , & !) !out
Expand Down Expand Up @@ -2368,6 +2378,7 @@ subroutine albedo (parameters,vegtyp ,ist ,ice ,nsoil , & !in
tg ,tv ,snowh ,fsno ,fwet , & !in
smc ,sneqvo ,sneqv ,qsnow ,fveg , & !in
iloc ,jloc , & !in
snoalb , & !in
albold ,tauss , & !inout
albgrd ,albgri ,albd ,albi ,fabd , & !out
fabi ,ftdd ,ftid ,ftii ,fsun , & !out
Expand Down Expand Up @@ -2404,6 +2415,7 @@ subroutine albedo (parameters,vegtyp ,ist ,ice ,nsoil , & !in
real (kind=kind_phys), intent(in) :: sneqv !snow mass (mm)
real (kind=kind_phys), intent(in) :: fveg !green vegetation fraction [0.0-1.0]
real (kind=kind_phys), dimension(1:nsoil), intent(in) :: smc !volumetric soil water (m3/m3)
real (kind=kind_phys), intent(in) :: snoalb !prescribed snow albedo (only used if iopt_alb = 3)

! inout
real (kind=kind_phys), intent(inout) :: albold !snow albedo at last time step (class type)
Expand Down Expand Up @@ -2492,11 +2504,14 @@ subroutine albedo (parameters,vegtyp ,ist ,ice ,nsoil , & !in

! snow albedos: only if cosz > 0 and fsno > 0

if(opt_alb == 1) &
if(opt_alb == 1) then
call snowalb_bats (parameters,nband, fsno,cosz,fage,albsnd,albsni)
if(opt_alb == 2) then
else if(opt_alb == 2) then
call snowalb_class (parameters,nband,qsnow,dt,alb,albold,albsnd,albsni,iloc,jloc)
albold = alb
else if(opt_alb == 3) then
albsnd = snoalb
albsni = snoalb
end if

! ground surface albedo
Expand Down Expand Up @@ -8203,7 +8218,7 @@ subroutine noahmp_options(idveg ,iopt_crs ,iopt_btr ,iopt_run ,iopt_sfc
integer, intent(in) :: iopt_frz !supercooled liquid water (1-> ny06; 2->koren99)
integer, intent(in) :: iopt_inf !frozen soil permeability (1-> ny06; 2->koren99)
integer, intent(in) :: iopt_rad !radiation transfer (1->gap=f(3d,cosz); 2->gap=0; 3->gap=1-fveg)
integer, intent(in) :: iopt_alb !snow surface albedo (1->bats; 2->class)
integer, intent(in) :: iopt_alb !snow surface albedo (1->bats; 2->class; 3->climatology)
integer, intent(in) :: iopt_snf !rainfall & snowfall (1-jordan91; 2->bats; 3->noah)
integer, intent(in) :: iopt_tbot !lower boundary of soil temperature (1->zero-flux; 2->noah)

Expand Down
2 changes: 2 additions & 0 deletions gsmphys/sfc_noahmp_drv.f
Original file line number Diff line number Diff line change
Expand Up @@ -596,6 +596,7 @@ subroutine noahmpdrv &
& i ,1 ,cosz ,nsnow ,nsoil ,delt , & ! in : time/space/model-related
& sfctmp ,sfcprs ,uu ,vv ,q2 ,swdn , & ! in : forcing
& prcp ,lwdn ,tbot ,zlvl ,ficeold ,zsoil , & ! in : forcing
& snoalb1d, & ! in : forcing
& qsnowx ,sneqvox ,alboldx ,cmx ,chx ,isnowx, & ! in/out :sneqvox + alboldx -LST
& swe ,smsoil ,zsnsox ,snowh ,snicex ,snliqx , & ! in/out : sneqvx + snowhx are avgd
& tgx ,tsnsox ,slsoil ,taussx ,qsfc1d , & ! in/out :
Expand Down Expand Up @@ -664,6 +665,7 @@ subroutine noahmpdrv &
& qc , swdn , lwdn ,& ! in : forcing
& pconv , pnonc , pshcv , psnow , pgrpl , phail ,& ! in : forcing
& tbot , co2pp , o2pp , foln , ficeold , zlvl ,& ! in : forcing
& snoalb1d ,& ! in : forcing
& alboldx , sneqvox ,& ! in/out :
& tsnsox , slsoil , smsoil , tahx , eahx , fwetx ,& ! in/out :
& canliqx , canicex , tvx , tgx , qsfc1d , qsnowx ,& ! in/out :
Expand Down

0 comments on commit 573746a

Please sign in to comment.