diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000..4e323edda7 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "phys/noahmp"] + path = phys/noahmp + url = https://github.com/NCAR/noahmp diff --git a/Makefile b/Makefile index 5b9b5faf4c..505f19ad5e 100644 --- a/Makefile +++ b/Makefile @@ -108,6 +108,22 @@ framework_only : configcheck wrf : framework_only $(MAKE) MODULE_DIRS="$(ALL_MODULES)" physics + if [ \( ! -f run/MPTABLE.TBL \) -o \ + \( ! -f phys/module_sf_noahmpdrv.F \) -o \ + \( ! -f phys/module_sf_noahmp_glacier.F \) -o \ + \( ! -f phys/module_sf_noahmp_groundwater.F \) -o \ + \( ! -f phys/module_sf_noahmplsm.F \) ] ; then \ + echo " " ; \ + echo "------------------------------------------------------------------------------" ; \ + echo "Error Error Error NoahMP submodule files not populating WRF directories" ; \ + echo "------------------------------------------------------------------------------" ; \ + echo " " ; \ + exit 31 ; \ + else \ + echo "------------------------------------------------------------------------------" ; \ + echo "NoahMP submodule files populating WRF directories" ; \ + echo "------------------------------------------------------------------------------" ; \ + fi if [ $(WRF_CHEM) -eq 1 ] ; then $(MAKE) MODULE_DIRS="$(ALL_MODULES)" chemics ; fi if [ $(WRF_EM_CORE) -eq 1 ] ; then $(MAKE) MODULE_DIRS="$(ALL_MODULES)" em_core ; fi if [ $(WRF_HYDRO) -eq 1 ] ; then $(MAKE) MODULE_DIRS="$(ALL_MODULES)" wrf_hydro ; fi @@ -1009,20 +1025,20 @@ chemics : physics : @ echo '--------------------------------------' if [ $(WRF_CHEM) -eq 0 ] ; then \ - ( cd phys ; $(MAKE) CF2=" " ) ; \ + ( cd phys ; $(MAKE) submodules ; $(MAKE) CF2=" " ) ; \ if [ $(WRF_CMAQ) -eq 1 ] ; then \ @ echo '----------- make cmaq ----------------' ; \ ( rm -f main/libcmaqlib.a; cd cmaq ; $(MAKE) -f Makefile.twoway ) ; \ fi \ else \ - ( cd phys ; $(MAKE) CF2="$(CHEM_FILES2)" ) ; \ + ( cd phys ; $(MAKE) submodules ; $(MAKE) CF2="$(CHEM_FILES2)" ) ; \ fi physics_plus : if [ $(WRF_PLUS_CORE) -eq 0 ] ; then \ - ( cd phys ; $(MAKE) PHYS_PLUS=" " PHYS_MP=" " PHYS_BL=" " PHYS_CU=" " ) ; \ + ( cd phys ; $(MAKE) submodules ; $(MAKE) PHYS_PLUS=" " PHYS_MP=" " PHYS_BL=" " PHYS_CU=" " ) ; \ else \ - ( cd phys ; $(MAKE) PHYS_PLUS="$(MODS4)" PHYS_MP="$(MODMP)" PHYS_BL="$(MODBL)" PHYS_CU="$(MODCU)" ) ; \ + ( cd phys ; $(MAKE) submodules ; $(MAKE) PHYS_PLUS="$(MODS4)" PHYS_MP="$(MODMP)" PHYS_BL="$(MODBL)" PHYS_CU="$(MODCU)" ) ; \ fi wrftlmadj : diff --git a/clean b/clean index dfca83e375..6ce8142cd6 100755 --- a/clean +++ b/clean @@ -80,6 +80,9 @@ if ( "$arg" == '-a' || "$arg" == '-aa' ) then /bin/rm -f configure.wrf.backup /bin/rm -f Registry/Registry.backup /bin/rm -f run/namelist.input.backup.* + /bin/rm -f phys/module_sf_noahmpdrv.F phys/module_sf_noahmp_glacier.F \ + phys/module_sf_noahmp_groundwater.F phys/module_sf_noahmplsm.F \ + run/MPTABLE.TBL endif endif diff --git a/phys/Makefile b/phys/Makefile index b91e1bcbab..17c2c6660b 100644 --- a/phys/Makefile +++ b/phys/Makefile @@ -240,6 +240,20 @@ include ../configure.wrf non_nmm : $(MODULES) $(FIRE_MODULES) $(WIND_MODULES) $(OBJS) $(DIAGNOSTIC_MODULES_EM) +submodules : + @if [ \( ! -f module_sf_noahmpdrv.F \) -o \( ! -f module_sf_noahmp_glacier.F \) -o \ + \( ! -f module_sf_noahmp_groundwater.F \) -o \( ! -f module_sf_noahmplsm.F \) ] ; then \ + echo Pulling in NoahMP submodule ; \ + ( cd .. ; git submodule update --init --recursive ) ; \ + ln -sf noahmp/drivers/wrf/module_sf_noahmpdrv.F . ; \ + ln -sf noahmp/src/module_sf_noahmp_glacier.F . ; \ + ln -sf noahmp/src/module_sf_noahmp_groundwater.F . ; \ + ln -sf noahmp/src/module_sf_noahmplsm.F . ; \ + ( cd ../run ; ln -sf ../phys/noahmp/parameters/MPTABLE.TBL . ) ; \ + else \ + echo No action required for NoahMP submodule ; \ + fi + clean: @ echo 'use the clean script' diff --git a/phys/module_sf_noahmp_glacier.F b/phys/module_sf_noahmp_glacier.F deleted file mode 100644 index 8142dd8322..0000000000 --- a/phys/module_sf_noahmp_glacier.F +++ /dev/null @@ -1,3075 +0,0 @@ -MODULE NOAHMP_GLACIER_GLOBALS - - implicit none - -! ================================================================================================== -!------------------------------------------------------------------------------------------! -! Physical Constants: ! -!------------------------------------------------------------------------------------------! - - REAL, PARAMETER :: GRAV = 9.80616 !acceleration due to gravity (m/s2) - REAL, PARAMETER :: SB = 5.67E-08 !Stefan-Boltzmann constant (w/m2/k4) - REAL, PARAMETER :: VKC = 0.40 !von Karman constant - REAL, PARAMETER :: TFRZ = 273.16 !freezing/melting point (k) - REAL, PARAMETER :: HSUB = 2.8440E06 !latent heat of sublimation (j/kg) - REAL, PARAMETER :: HVAP = 2.5104E06 !latent heat of vaporization (j/kg) - REAL, PARAMETER :: HFUS = 0.3336E06 !latent heat of fusion (j/kg) - REAL, PARAMETER :: CWAT = 4.188E06 !specific heat capacity of water (j/m3/k) - REAL, PARAMETER :: CICE = 2.094E06 !specific heat capacity of ice (j/m3/k) - REAL, PARAMETER :: CPAIR = 1004.64 !heat capacity dry air at const pres (j/kg/k) - REAL, PARAMETER :: TKWAT = 0.6 !thermal conductivity of water (w/m/k) - REAL, PARAMETER :: TKICE = 2.2 !thermal conductivity of ice (w/m/k) - REAL, PARAMETER :: TKAIR = 0.023 !thermal conductivity of air (w/m/k) - REAL, PARAMETER :: RAIR = 287.04 !gas constant for dry air (j/kg/k) - REAL, PARAMETER :: RW = 461.269 !gas constant for water vapor (j/kg/k) - REAL, PARAMETER :: DENH2O = 1000. !density of water (kg/m3) - REAL, PARAMETER :: DENICE = 917. !density of ice (kg/m3) - -! =====================================options for different schemes================================ - -! options for ground snow surface albedo -! 1-> BATS; 2 -> CLASS - - INTEGER :: OPT_ALB != 2 !(suggested 2) - -! options for partitioning precipitation into rainfall & snowfall -! 1 -> Jordan (1991); 2 -> BATS: when SFCTMP SFCTMP zero heat flux from bottom (ZBOT and TBOT not used) -! 2 -> TBOT at ZBOT (8m) read from a file (original Noah) - - INTEGER :: OPT_TBOT != 2 !(suggested 2) - -! options for snow/soil temperature time scheme (only layer 1) -! 1 -> semi-implicit; 2 -> full implicit (original Noah) - - INTEGER :: OPT_STC != 1 !(suggested 1) - -! options for glacier treatment -! 1 -> include phase change of ice; 2 -> ice treatment more like original Noah - - INTEGER :: OPT_GLA != 1 !(suggested 1) - -! adjustable parameters for snow processes - - REAL, PARAMETER :: Z0SNO = 0.002 !snow surface roughness length (m) (0.002) - REAL, PARAMETER :: SSI = 0.03 !liquid water holding capacity for snowpack (m3/m3) (0.03) - REAL, PARAMETER :: SWEMX = 1.00 !new snow mass to fully cover old snow (mm) - !equivalent to 10mm depth (density = 100 kg/m3) - -!------------------------------------------------------------------------------------------! -END MODULE NOAHMP_GLACIER_GLOBALS -!------------------------------------------------------------------------------------------! - -MODULE NOAHMP_GLACIER_ROUTINES - USE NOAHMP_GLACIER_GLOBALS - IMPLICIT NONE - - public :: NOAHMP_OPTIONS_GLACIER - public :: NOAHMP_GLACIER - - private :: ATM_GLACIER - private :: ENERGY_GLACIER - private :: THERMOPROP_GLACIER - private :: CSNOW_GLACIER - private :: RADIATION_GLACIER - private :: SNOW_AGE_GLACIER - private :: SNOWALB_BATS_GLACIER - private :: SNOWALB_CLASS_GLACIER - private :: GLACIER_FLUX - private :: SFCDIF1_GLACIER - private :: TSNOSOI_GLACIER - private :: HRT_GLACIER - private :: HSTEP_GLACIER - private :: ROSR12_GLACIER - private :: PHASECHANGE_GLACIER - - private :: WATER_GLACIER - private :: SNOWWATER_GLACIER - private :: SNOWFALL_GLACIER - private :: COMBINE_GLACIER - private :: DIVIDE_GLACIER - private :: COMBO_GLACIER - private :: COMPACT_GLACIER - private :: SNOWH2O_GLACIER - - private :: ERROR_GLACIER - -contains -! -! ================================================================================================== - - 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 - QSNOW ,SNEQVO ,ALBOLD ,CM ,CH ,ISNOW , & ! IN/OUT : - SNEQV ,SMC ,ZSNSO ,SNOWH ,SNICE ,SNLIQ , & ! IN/OUT : - TG ,STC ,SH2O ,TAUSS ,QSFC , & ! IN/OUT : - FSA ,FSR ,FIRA ,FSH ,FGEV ,SSOIL , & ! OUT : - TRAD ,EDIR ,RUNSRF ,RUNSUB ,SAG ,ALBEDO , & ! OUT : - QSNBOT ,PONDING ,PONDING1,PONDING2,T2M ,Q2E , & ! OUT : - EMISSI, FPICE, CH2B & ! OUT : -#ifdef WRF_HYDRO - , sfcheadrt & -#endif - ) - -! -------------------------------------------------------------------------------------------------- -! Initial code: Guo-Yue Niu, Oct. 2007 -! Modified to glacier: Michael Barlage, June 2012 -! -------------------------------------------------------------------------------------------------- - implicit none -! -------------------------------------------------------------------------------------------------- -! input - INTEGER , INTENT(IN) :: ILOC !grid index - INTEGER , INTENT(IN) :: JLOC !grid index - REAL , INTENT(IN) :: COSZ !cosine solar zenith angle [0-1] - INTEGER , INTENT(IN) :: NSNOW !maximum no. of snow layers - INTEGER , INTENT(IN) :: NSOIL !no. of soil layers - REAL , INTENT(IN) :: DT !time step [sec] - REAL , INTENT(IN) :: SFCTMP !surface air temperature [K] - REAL , INTENT(IN) :: SFCPRS !pressure (pa) - REAL , INTENT(IN) :: UU !wind speed in eastward dir (m/s) - REAL , INTENT(IN) :: VV !wind speed in northward dir (m/s) - REAL , INTENT(IN) :: Q2 !mixing ratio (kg/kg) lowest model layer - REAL , INTENT(IN) :: SOLDN !downward shortwave radiation (w/m2) - REAL , INTENT(IN) :: PRCP !precipitation rate (kg m-2 s-1) - REAL , INTENT(IN) :: LWDN !downward longwave radiation (w/m2) - REAL , INTENT(IN) :: TBOT !bottom condition for soil temp. [K] - REAL , INTENT(IN) :: ZLVL !reference height (m) - REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: FICEOLD!ice fraction at last timestep - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: ZSOIL !layer-bottom depth from soil surf (m) - -#ifdef WRF_HYDRO - REAL , INTENT(INOUT) :: sfcheadrt -#endif - -! input/output : need arbitary intial values - REAL , INTENT(INOUT) :: QSNOW !snowfall [mm/s] - REAL , INTENT(INOUT) :: SNEQVO !snow mass at last time step (mm) - REAL , INTENT(INOUT) :: ALBOLD !snow albedo at last time step (CLASS type) - REAL , INTENT(INOUT) :: CM !momentum drag coefficient - REAL , INTENT(INOUT) :: CH !sensible heat exchange coefficient - -! prognostic variables - INTEGER , INTENT(INOUT) :: ISNOW !actual no. of snow layers [-] - REAL , INTENT(INOUT) :: SNEQV !snow water eqv. [mm] - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SMC !soil moisture (ice + liq.) [m3/m3] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: ZSNSO !layer-bottom depth from snow surf [m] - REAL , INTENT(INOUT) :: SNOWH !snow height [m] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNICE !snow layer ice [mm] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNLIQ !snow layer liquid water [mm] - REAL , INTENT(INOUT) :: TG !ground temperature (k) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow/soil temperature [k] - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SH2O !liquid soil moisture [m3/m3] - REAL , INTENT(INOUT) :: TAUSS !non-dimensional snow age - REAL , INTENT(INOUT) :: QSFC !mixing ratio at lowest model layer - -! output - REAL , INTENT(OUT) :: FSA !total absorbed solar radiation (w/m2) - REAL , INTENT(OUT) :: FSR !total reflected solar radiation (w/m2) - REAL , INTENT(OUT) :: FIRA !total net LW rad (w/m2) [+ to atm] - REAL , INTENT(OUT) :: FSH !total sensible heat (w/m2) [+ to atm] - REAL , INTENT(OUT) :: FGEV !ground evap heat (w/m2) [+ to atm] - REAL , INTENT(OUT) :: SSOIL !ground heat flux (w/m2) [+ to soil] - REAL , INTENT(OUT) :: TRAD !surface radiative temperature (k) - REAL , INTENT(OUT) :: EDIR !soil surface evaporation rate (mm/s] - REAL , INTENT(OUT) :: RUNSRF !surface runoff [mm/s] - REAL , INTENT(OUT) :: RUNSUB !baseflow (saturation excess) [mm/s] - REAL , INTENT(OUT) :: SAG !solar rad absorbed by ground (w/m2) - REAL , INTENT(OUT) :: ALBEDO !surface albedo [-] - REAL , INTENT(OUT) :: QSNBOT !snowmelt [mm/s] - REAL , INTENT(OUT) :: PONDING!surface ponding [mm] - REAL , INTENT(OUT) :: PONDING1!surface ponding [mm] - REAL , INTENT(OUT) :: PONDING2!surface ponding [mm] - REAL , INTENT(OUT) :: T2M !2-m air temperature over bare ground part [k] - REAL , INTENT(OUT) :: Q2E - REAL , INTENT(OUT) :: EMISSI - REAL , INTENT(OUT) :: FPICE - REAL , INTENT(OUT) :: CH2B - -! local - INTEGER :: IZ !do-loop index - INTEGER, DIMENSION(-NSNOW+1:NSOIL) :: IMELT !phase change index [1-melt; 2-freeze] - REAL :: RHOAIR !density air (kg/m3) - REAL, DIMENSION(-NSNOW+1:NSOIL) :: DZSNSO !snow/soil layer thickness [m] - REAL :: THAIR !potential temperature (k) - REAL :: QAIR !specific humidity (kg/kg) (q2/(1+q2)) - REAL :: EAIR !vapor pressure air (pa) - REAL, DIMENSION( 1: 2) :: SOLAD !incoming direct solar rad (w/m2) - REAL, DIMENSION( 1: 2) :: SOLAI !incoming diffuse solar rad (w/m2) - REAL, DIMENSION( 1:NSOIL) :: SICE !soil ice content (m3/m3) - REAL, DIMENSION(-NSNOW+1: 0) :: SNICEV !partial volume ice of snow [m3/m3] - REAL, DIMENSION(-NSNOW+1: 0) :: SNLIQV !partial volume liq of snow [m3/m3] - REAL, DIMENSION(-NSNOW+1: 0) :: EPORE !effective porosity [m3/m3] - REAL :: QDEW !ground surface dew rate [mm/s] - REAL :: QVAP !ground surface evap. rate [mm/s] - REAL :: LATHEA !latent heat [j/kg] - REAL :: QMELT !internal pack melt - REAL :: SWDOWN !downward solar [w/m2] - REAL :: BEG_WB !beginning water for error check - REAL :: ZBOT = -8.0 - - CHARACTER*256 message - -! -------------------------------------------------------------------------------------------------- -! re-process atmospheric forcing - - CALL ATM_GLACIER (SFCPRS ,SFCTMP ,Q2 ,SOLDN ,COSZ ,THAIR , & - QAIR ,EAIR ,RHOAIR ,SOLAD ,SOLAI ,SWDOWN ) - - BEG_WB = SNEQV - -! snow/soil layer thickness (m); interface depth: ZSNSO < 0; layer thickness DZSNSO > 0 - - DO IZ = ISNOW+1, NSOIL - IF(IZ == ISNOW+1) THEN - DZSNSO(IZ) = - ZSNSO(IZ) - ELSE - DZSNSO(IZ) = ZSNSO(IZ-1) - ZSNSO(IZ) - END IF - END DO - -! compute energy budget (momentum & energy fluxes and phase changes) - - 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 - TG ,STC ,SNOWH ,SNEQV ,SNEQVO ,SH2O , & !inout - SMC ,SNICE ,SNLIQ ,ALBOLD ,CM ,CH , & !inout - TAUSS ,QSFC , & !inout - IMELT ,SNICEV ,SNLIQV ,EPORE ,QMELT ,PONDING, & !out - SAG ,FSA ,FSR ,FIRA ,FSH ,FGEV , & !out - TRAD ,T2M ,SSOIL ,LATHEA ,Q2E ,EMISSI, CH2B ) !out - - SICE = MAX(0.0, SMC - SH2O) - SNEQVO = SNEQV - - QVAP = MAX( FGEV/LATHEA, 0.) ! positive part of fgev [mm/s] > 0 - QDEW = ABS( MIN(FGEV/LATHEA, 0.)) ! negative part of fgev [mm/s] > 0 - EDIR = QVAP - QDEW - -! compute water budgets (water storages, ET components, and runoff) - - CALL WATER_GLACIER (NSNOW ,NSOIL ,IMELT ,DT ,PRCP ,SFCTMP , & !in - QVAP ,QDEW ,FICEOLD,ZSOIL , & !in - ISNOW ,SNOWH ,SNEQV ,SNICE ,SNLIQ ,STC , & !inout - DZSNSO ,SH2O ,SICE ,PONDING,ZSNSO ,FSH , & !inout - RUNSRF ,RUNSUB ,QSNOW ,PONDING1 ,PONDING2,QSNBOT,FPICE & !out -#ifdef WRF_HYDRO - , sfcheadrt & -#endif - ) - - IF(OPT_GLA == 2) THEN - EDIR = QVAP - QDEW - FGEV = EDIR * LATHEA - END IF - - IF(MAXVAL(SICE) < 0.0001) THEN - WRITE(message,*) "GLACIER HAS MELTED AT:",ILOC,JLOC," ARE YOU SURE THIS SHOULD BE A GLACIER POINT?" - CALL wrf_debug(10,TRIM(message)) - END IF - -! water and energy balance check - - CALL ERROR_GLACIER (ILOC ,JLOC ,SWDOWN ,FSA ,FSR ,FIRA , & - FSH ,FGEV ,SSOIL ,SAG ,PRCP ,EDIR , & - RUNSRF ,RUNSUB ,SNEQV ,DT ,BEG_WB ) - - IF(SNOWH <= 1.E-6 .OR. SNEQV <= 1.E-3) THEN - SNOWH = 0.0 - SNEQV = 0.0 - END IF - - IF(SWDOWN.NE.0.) THEN - ALBEDO = FSR / SWDOWN - ELSE - ALBEDO = -999.9 - END IF - - - END SUBROUTINE NOAHMP_GLACIER -! ================================================================================================== - SUBROUTINE ATM_GLACIER (SFCPRS ,SFCTMP ,Q2 ,SOLDN ,COSZ ,THAIR , & - QAIR ,EAIR ,RHOAIR ,SOLAD ,SOLAI , & - SWDOWN ) -! -------------------------------------------------------------------------------------------------- -! re-process atmospheric forcing -! -------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------------- -! inputs - - REAL , INTENT(IN) :: SFCPRS !pressure (pa) - REAL , INTENT(IN) :: SFCTMP !surface air temperature [k] - REAL , INTENT(IN) :: Q2 !mixing ratio (kg/kg) - REAL , INTENT(IN) :: SOLDN !downward shortwave radiation (w/m2) - REAL , INTENT(IN) :: COSZ !cosine solar zenith angle [0-1] - -! outputs - - REAL , INTENT(OUT) :: THAIR !potential temperature (k) - REAL , INTENT(OUT) :: QAIR !specific humidity (kg/kg) (q2/(1+q2)) - REAL , INTENT(OUT) :: EAIR !vapor pressure air (pa) - REAL, DIMENSION( 1: 2), INTENT(OUT) :: SOLAD !incoming direct solar radiation (w/m2) - REAL, DIMENSION( 1: 2), INTENT(OUT) :: SOLAI !incoming diffuse solar radiation (w/m2) - REAL , INTENT(OUT) :: RHOAIR !density air (kg/m3) - REAL , INTENT(OUT) :: SWDOWN !downward solar filtered by sun angle [w/m2] - -!locals - - REAL :: PAIR !atm bottom level pressure (pa) -! -------------------------------------------------------------------------------------------------- - - PAIR = SFCPRS ! atm bottom level pressure (pa) - THAIR = SFCTMP * (SFCPRS/PAIR)**(RAIR/CPAIR) -! QAIR = Q2 / (1.0+Q2) ! mixing ratio to specific humidity [kg/kg] - QAIR = Q2 ! In WRF, driver converts to specific humidity - - EAIR = QAIR*SFCPRS / (0.622+0.378*QAIR) - RHOAIR = (SFCPRS-0.378*EAIR) / (RAIR*SFCTMP) - - IF(COSZ <= 0.) THEN - SWDOWN = 0. - ELSE - SWDOWN = SOLDN - END IF - - SOLAD(1) = SWDOWN*0.7*0.5 ! direct vis - SOLAD(2) = SWDOWN*0.7*0.5 ! direct nir - SOLAI(1) = SWDOWN*0.3*0.5 ! diffuse vis - SOLAI(2) = SWDOWN*0.3*0.5 ! diffuse nir - - 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 - TG ,STC ,SNOWH ,SNEQV ,SNEQVO ,SH2O , & !inout - SMC ,SNICE ,SNLIQ ,ALBOLD ,CM ,CH , & !inout - TAUSS ,QSFC , & !inout - IMELT ,SNICEV ,SNLIQV ,EPORE ,QMELT ,PONDING, & !out - SAG ,FSA ,FSR ,FIRA ,FSH ,FGEV , & !out - TRAD ,T2M ,SSOIL ,LATHEA ,Q2E ,EMISSI, CH2B ) !out - -! -------------------------------------------------------------------------------------------------- -! -------------------------------------------------------------------------------------------------- -! USE NOAHMP_VEG_PARAMETERS -! USE NOAHMP_RAD_PARAMETERS -! -------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------------- -! inputs - INTEGER , INTENT(IN) :: NSNOW !maximum no. of snow layers - INTEGER , INTENT(IN) :: NSOIL !number of soil layers - INTEGER , INTENT(IN) :: ISNOW !actual no. of snow layers - REAL , INTENT(IN) :: DT !time step [sec] - REAL , INTENT(IN) :: QSNOW !snowfall on the ground (mm/s) - REAL , INTENT(IN) :: RHOAIR !density air (kg/m3) - REAL , INTENT(IN) :: EAIR !vapor pressure air (pa) - REAL , INTENT(IN) :: SFCPRS !pressure (pa) - REAL , INTENT(IN) :: QAIR !specific humidity (kg/kg) - REAL , INTENT(IN) :: SFCTMP !air temperature (k) - REAL , INTENT(IN) :: LWDN !downward longwave radiation (w/m2) - REAL , INTENT(IN) :: UU !wind speed in e-w dir (m/s) - REAL , INTENT(IN) :: VV !wind speed in n-s dir (m/s) - REAL , DIMENSION( 1: 2), INTENT(IN) :: SOLAD !incoming direct solar rad. (w/m2) - REAL , DIMENSION( 1: 2), INTENT(IN) :: SOLAI !incoming diffuse solar rad. (w/m2) - REAL , INTENT(IN) :: COSZ !cosine solar zenith angle (0-1) - REAL , INTENT(IN) :: ZREF !reference height (m) - REAL , INTENT(IN) :: TBOT !bottom condition for soil temp. (k) - REAL , INTENT(IN) :: ZBOT !depth for TBOT [m] - REAL , DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: ZSNSO !layer-bottom depth from snow surf [m] - REAL , DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !depth of snow & soil layer-bottom [m] - -! input & output - REAL , INTENT(INOUT) :: TG !ground temperature (k) - REAL , DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow/soil temperature [k] - REAL , INTENT(INOUT) :: SNOWH !snow height [m] - REAL , INTENT(INOUT) :: SNEQV !snow mass (mm) - REAL , INTENT(INOUT) :: SNEQVO !snow mass at last time step (mm) - REAL , DIMENSION( 1:NSOIL), INTENT(INOUT) :: SH2O !liquid soil moisture [m3/m3] - REAL , DIMENSION( 1:NSOIL), INTENT(INOUT) :: SMC !soil moisture (ice + liq.) [m3/m3] - REAL , DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNICE !snow ice mass (kg/m2) - REAL , DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNLIQ !snow liq mass (kg/m2) - REAL , INTENT(INOUT) :: ALBOLD !snow albedo at last time step(CLASS type) - REAL , INTENT(INOUT) :: CM !momentum drag coefficient - REAL , INTENT(INOUT) :: CH !sensible heat exchange coefficient - REAL , INTENT(INOUT) :: TAUSS !snow aging factor - REAL , INTENT(INOUT) :: QSFC !mixing ratio at lowest model layer - -! outputs - INTEGER, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: IMELT !phase change index [1-melt; 2-freeze] - REAL , DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: SNICEV !partial volume ice [m3/m3] - REAL , DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: SNLIQV !partial volume liq. water [m3/m3] - REAL , DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: EPORE !effective porosity [m3/m3] - REAL , INTENT(OUT) :: QMELT !snowmelt [mm/s] - REAL , INTENT(OUT) :: PONDING!pounding at ground [mm] - REAL , INTENT(OUT) :: SAG !solar rad. absorbed by ground (w/m2) - REAL , INTENT(OUT) :: FSA !tot. absorbed solar radiation (w/m2) - REAL , INTENT(OUT) :: FSR !tot. reflected solar radiation (w/m2) - REAL , INTENT(OUT) :: FIRA !total net LW. rad (w/m2) [+ to atm] - REAL , INTENT(OUT) :: FSH !total sensible heat (w/m2) [+ to atm] - REAL , INTENT(OUT) :: FGEV !ground evaporation (w/m2) [+ to atm] - REAL , INTENT(OUT) :: TRAD !radiative temperature (k) - REAL , INTENT(OUT) :: T2M !2 m height air temperature (k) - REAL , INTENT(OUT) :: SSOIL !ground heat flux (w/m2) [+ to soil] - REAL , INTENT(OUT) :: LATHEA !latent heat vap./sublimation (j/kg) - REAL , INTENT(OUT) :: Q2E - REAL , INTENT(OUT) :: EMISSI - REAL , INTENT(OUT) :: CH2B !sensible heat conductance, canopy air to ZLVL air (m/s) - - -! local - REAL :: UR !wind speed at height ZLVL (m/s) - REAL :: ZLVL !reference height (m) - REAL :: RSURF !ground surface resistance (s/m) - REAL :: ZPD !zero plane displacement (m) - REAL :: Z0MG !z0 momentum, ground (m) - REAL :: EMG !ground emissivity - REAL :: FIRE !emitted IR (w/m2) - REAL, DIMENSION(-NSNOW+1:NSOIL) :: FACT !temporary used in phase change - REAL, DIMENSION(-NSNOW+1:NSOIL) :: DF !thermal conductivity [w/m/k] - REAL, DIMENSION(-NSNOW+1:NSOIL) :: HCPCT !heat capacity [j/m3/k] - REAL :: GAMMA !psychrometric constant (pa/k) - REAL :: RHSUR !raltive humidity in surface soil/snow air space (-) - -! --------------------------------------------------------------------------------------------------- - -! wind speed at reference height: ur >= 1 - - UR = MAX( SQRT(UU**2.+VV**2.), 1. ) - -! roughness length and displacement height - - Z0MG = Z0SNO - ZPD = SNOWH - - ZLVL = ZPD + ZREF - -! Thermal properties of soil, snow, lake, and frozen soil - - CALL THERMOPROP_GLACIER (NSOIL ,NSNOW ,ISNOW ,DZSNSO , & !in - DT ,SNOWH ,SNICE ,SNLIQ , & !in - DF ,HCPCT ,SNICEV ,SNLIQV ,EPORE , & !out - FACT ) !out - -! Solar radiation: absorbed & reflected by the ground - - CALL RADIATION_GLACIER (DT ,TG ,SNEQVO ,SNEQV ,COSZ , & !in - QSNOW ,SOLAD ,SOLAI , & !in - ALBOLD ,TAUSS , & !inout - SAG ,FSR ,FSA) !out - -! vegetation and ground emissivity - - EMG = 0.98 - -! soil surface resistance for ground evap. - - RHSUR = 1.0 - RSURF = 1.0 - -! set psychrometric constant - - LATHEA = HSUB - GAMMA = CPAIR*SFCPRS/(0.622*LATHEA) - -! Surface temperatures of the ground and energy fluxes - - CALL GLACIER_FLUX (NSOIL ,NSNOW ,EMG ,ISNOW ,DF ,DZSNSO ,Z0MG , & !in - ZLVL ,ZPD ,QAIR ,SFCTMP ,RHOAIR ,SFCPRS , & !in - UR ,GAMMA ,RSURF ,LWDN ,RHSUR ,SMC , & !in - EAIR ,STC ,SAG ,SNOWH ,LATHEA ,SH2O , & !in - CM ,CH ,TG ,QSFC , & !inout - FIRA ,FSH ,FGEV ,SSOIL , & !out - T2M ,Q2E ,CH2B) !out - -!energy balance at surface: SAG=(IRB+SHB+EVB+GHB) - - FIRE = LWDN + FIRA - - IF(FIRE <=0.) call wrf_error_fatal("STOP in Noah-MP: emitted longwave <0") - - ! Compute a net emissivity - EMISSI = EMG - - ! When we're computing a TRAD, subtract from the emitted IR the - ! reflected portion of the incoming LWDN, so we're just - ! considering the IR originating in the canopy/ground system. - - TRAD = ( ( FIRE - (1-EMISSI)*LWDN ) / (EMISSI*SB) ) ** 0.25 - -! 3L snow & 4L soil temperatures - - CALL TSNOSOI_GLACIER (NSOIL ,NSNOW ,ISNOW ,DT ,TBOT , & !in - SSOIL ,SNOWH ,ZBOT ,ZSNSO ,DF , & !in - HCPCT , & !in - STC ) !inout - -! adjusting snow surface temperature - IF(OPT_STC == 2) THEN - IF (SNOWH > 0.05 .AND. TG > TFRZ) TG = TFRZ - END IF - -! Energy released or consumed by snow & ice - - CALL PHASECHANGE_GLACIER (NSNOW ,NSOIL ,ISNOW ,DT ,FACT , & !in - DZSNSO , & !in - STC ,SNICE ,SNLIQ ,SNEQV ,SNOWH , & !inout - SMC ,SH2O , & !inout - QMELT ,IMELT ,PONDING ) !out - - - END SUBROUTINE ENERGY_GLACIER -! ================================================================================================== - SUBROUTINE THERMOPROP_GLACIER (NSOIL ,NSNOW ,ISNOW ,DZSNSO , & !in - DT ,SNOWH ,SNICE ,SNLIQ , & !in - DF ,HCPCT ,SNICEV ,SNLIQV ,EPORE , & !out - FACT ) !out -! ------------------------------------------------------------------------------------------------- -! ------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------------- -! inputs - INTEGER , INTENT(IN) :: NSOIL !number of soil layers - INTEGER , INTENT(IN) :: NSNOW !maximum no. of snow layers - INTEGER , INTENT(IN) :: ISNOW !actual no. of snow layers - REAL , INTENT(IN) :: DT !time step [s] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: SNICE !snow ice mass (kg/m2) - REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: SNLIQ !snow liq mass (kg/m2) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !thickness of snow/soil layers [m] - REAL , INTENT(IN) :: SNOWH !snow height [m] - -! outputs - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: DF !thermal conductivity [w/m/k] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: HCPCT !heat capacity [j/m3/k] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: SNICEV !partial volume of ice [m3/m3] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: SNLIQV !partial volume of liquid water [m3/m3] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: EPORE !effective porosity [m3/m3] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: FACT !computing energy for phase change -! -------------------------------------------------------------------------------------------------- -! locals - - INTEGER :: IZ, IZ2 - REAL, DIMENSION(-NSNOW+1: 0) :: CVSNO !volumetric specific heat (j/m3/k) - REAL, DIMENSION(-NSNOW+1: 0) :: TKSNO !snow thermal conductivity (j/m3/k) - REAL :: ZMID !mid-point soil depth -! -------------------------------------------------------------------------------------------------- - -! compute snow thermal conductivity and heat capacity - - CALL CSNOW_GLACIER (ISNOW ,NSNOW ,NSOIL ,SNICE ,SNLIQ ,DZSNSO , & !in - TKSNO ,CVSNO ,SNICEV ,SNLIQV ,EPORE ) !out - - DO IZ = ISNOW+1, 0 - DF (IZ) = TKSNO(IZ) - HCPCT(IZ) = CVSNO(IZ) - END DO - -! compute soil thermal properties (using Noah glacial ice approximations) - - DO IZ = 1, NSOIL - ZMID = 0.5 * (DZSNSO(IZ)) - DO IZ2 = 1, IZ-1 - ZMID = ZMID + DZSNSO(IZ2) - END DO - HCPCT(IZ) = 1.E6 * ( 0.8194 + 0.1309*ZMID ) - DF(IZ) = 0.32333 + ( 0.10073 * ZMID ) - END DO - -! combine a temporary variable used for melting/freezing of snow and frozen soil - - DO IZ = ISNOW+1,NSOIL - FACT(IZ) = DT/(HCPCT(IZ)*DZSNSO(IZ)) - END DO - -! snow/soil interface - - IF(ISNOW == 0) THEN - DF(1) = (DF(1)*DZSNSO(1)+0.35*SNOWH) / (SNOWH +DZSNSO(1)) - ELSE - DF(1) = (DF(1)*DZSNSO(1)+DF(0)*DZSNSO(0)) / (DZSNSO(0)+DZSNSO(1)) - END IF - - - END SUBROUTINE THERMOPROP_GLACIER -! ================================================================================================== -! -------------------------------------------------------------------------------------------------- - SUBROUTINE CSNOW_GLACIER (ISNOW ,NSNOW ,NSOIL ,SNICE ,SNLIQ ,DZSNSO , & !in - TKSNO ,CVSNO ,SNICEV ,SNLIQV ,EPORE ) !out -! -------------------------------------------------------------------------------------------------- -! Snow bulk density,volumetric capacity, and thermal conductivity -!--------------------------------------------------------------------------------------------------- - IMPLICIT NONE -!--------------------------------------------------------------------------------------------------- -! inputs - - INTEGER, INTENT(IN) :: ISNOW !number of snow layers (-) - INTEGER , INTENT(IN) :: NSNOW !maximum no. of snow layers - INTEGER , INTENT(IN) :: NSOIL !number of soil layers - REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: SNICE !snow ice mass (kg/m2) - REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: SNLIQ !snow liq mass (kg/m2) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !snow/soil layer thickness [m] - -! outputs - - REAL, DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: CVSNO !volumetric specific heat (j/m3/k) - REAL, DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: TKSNO !thermal conductivity (w/m/k) - REAL, DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: SNICEV !partial volume of ice [m3/m3] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: SNLIQV !partial volume of liquid water [m3/m3] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: EPORE !effective porosity [m3/m3] - -! locals - - INTEGER :: IZ - REAL, DIMENSION(-NSNOW+1: 0) :: BDSNOI !bulk density of snow(kg/m3) - -!--------------------------------------------------------------------------------------------------- -! thermal capacity of snow - - DO IZ = ISNOW+1, 0 - SNICEV(IZ) = MIN(1., SNICE(IZ)/(DZSNSO(IZ)*DENICE) ) - EPORE(IZ) = 1. - SNICEV(IZ) - SNLIQV(IZ) = MIN(EPORE(IZ),SNLIQ(IZ)/(DZSNSO(IZ)*DENH2O)) - ENDDO - - DO IZ = ISNOW+1, 0 - BDSNOI(IZ) = (SNICE(IZ)+SNLIQ(IZ))/DZSNSO(IZ) - CVSNO(IZ) = CICE*SNICEV(IZ)+CWAT*SNLIQV(IZ) -! CVSNO(IZ) = 0.525E06 ! constant - enddo - -! thermal conductivity of snow - - DO IZ = ISNOW+1, 0 - TKSNO(IZ) = 3.2217E-6*BDSNOI(IZ)**2. ! Stieglitz(yen,1965) -! TKSNO(IZ) = 2E-2+2.5E-6*BDSNOI(IZ)*BDSNOI(IZ) ! Anderson, 1976 -! TKSNO(IZ) = 0.35 ! constant -! TKSNO(IZ) = 2.576E-6*BDSNOI(IZ)**2. + 0.074 ! Verseghy (1991) -! TKSNO(IZ) = 2.22*(BDSNOI(IZ)/1000.)**1.88 ! Douvill(Yen, 1981) - ENDDO - - END SUBROUTINE CSNOW_GLACIER -!=================================================================================================== - SUBROUTINE RADIATION_GLACIER (DT ,TG ,SNEQVO ,SNEQV ,COSZ , & !in - QSNOW ,SOLAD ,SOLAI , & !in - ALBOLD ,TAUSS , & !inout - SAG ,FSR ,FSA) !out -! -------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------------- -! input - REAL, INTENT(IN) :: DT !time step [s] - REAL, INTENT(IN) :: TG !ground temperature (k) - REAL, INTENT(IN) :: SNEQVO !snow mass at last time step(mm) - REAL, INTENT(IN) :: SNEQV !snow mass (mm) - REAL, INTENT(IN) :: COSZ !cosine solar zenith angle (0-1) - REAL, INTENT(IN) :: QSNOW !snowfall (mm/s) - REAL, DIMENSION(1:2) , INTENT(IN) :: SOLAD !incoming direct solar radiation (w/m2) - REAL, DIMENSION(1:2) , INTENT(IN) :: SOLAI !incoming diffuse solar radiation (w/m2) - -! inout - REAL, INTENT(INOUT) :: ALBOLD !snow albedo at last time step (CLASS type) - REAL, INTENT(INOUT) :: TAUSS !non-dimensional snow age - -! output - REAL, INTENT(OUT) :: SAG !solar radiation absorbed by ground (w/m2) - REAL, INTENT(OUT) :: FSR !total reflected solar radiation (w/m2) - REAL, INTENT(OUT) :: FSA !total absorbed solar radiation (w/m2) - -! local - INTEGER :: IB !number of radiation bands - INTEGER :: NBAND !number of radiation bands - REAL :: FAGE !snow age function (0 - new snow) - REAL, DIMENSION(1:2) :: ALBSND !snow albedo (direct) - REAL, DIMENSION(1:2) :: ALBSNI !snow albedo (diffuse) - REAL :: ALB !current CLASS albedo - REAL :: ABS !temporary absorbed rad - REAL :: REF !temporary reflected rad - REAL :: FSNO !snow-cover fraction, = 1 if any snow - REAL, DIMENSION(1:2) :: ALBICE !albedo land ice: 1=vis, 2=nir - - REAL,PARAMETER :: MPE = 1.E-6 - -! -------------------------------------------------------------------------------------------------- - - NBAND = 2 - ALBSND = 0.0 - ALBSNI = 0.0 - ALBICE(1) = 0.80 !albedo land ice: 1=vis, 2=nir - ALBICE(2) = 0.55 - -! snow age - - CALL SNOW_AGE_GLACIER (DT,TG,SNEQVO,SNEQV,TAUSS,FAGE) - -! snow albedos: age even when sun is not present - - IF(OPT_ALB == 1) & - CALL SNOWALB_BATS_GLACIER (NBAND,COSZ,FAGE,ALBSND,ALBSNI) - IF(OPT_ALB == 2) THEN - CALL SNOWALB_CLASS_GLACIER(NBAND,QSNOW,DT,ALB,ALBOLD,ALBSND,ALBSNI) - ALBOLD = ALB - END IF - -! zero summed solar fluxes - - SAG = 0. - FSA = 0. - FSR = 0. - - FSNO = 0.0 - IF(SNEQV > 0.0) FSNO = 1.0 - -! loop over nband wavebands - - DO IB = 1, NBAND - - ALBSND(IB) = ALBICE(IB)*(1.-FSNO) + ALBSND(IB)*FSNO - ALBSNI(IB) = ALBICE(IB)*(1.-FSNO) + ALBSNI(IB)*FSNO - -! solar radiation absorbed by ground surface - - ABS = SOLAD(IB)*(1.-ALBSND(IB)) + SOLAI(IB)*(1.-ALBSNI(IB)) - SAG = SAG + ABS - FSA = FSA + ABS - - REF = SOLAD(IB)*ALBSND(IB) + SOLAI(IB)*ALBSNI(IB) - FSR = FSR + REF - - END DO - - END SUBROUTINE RADIATION_GLACIER -! ================================================================================================== - SUBROUTINE SNOW_AGE_GLACIER (DT,TG,SNEQVO,SNEQV,TAUSS,FAGE) -! -------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! ------------------------ code history ------------------------------------------------------------ -! from BATS -! ------------------------ input/output variables -------------------------------------------------- -!input - REAL, INTENT(IN) :: DT !main time step (s) - REAL, INTENT(IN) :: TG !ground temperature (k) - REAL, INTENT(IN) :: SNEQVO !snow mass at last time step(mm) - REAL, INTENT(IN) :: SNEQV !snow water per unit ground area (mm) - -! inout - REAL, INTENT(INOUT) :: TAUSS !non-dimensional snow age - -!output - REAL, INTENT(OUT) :: FAGE !snow age - -!local - REAL :: TAGE !total aging effects - REAL :: AGE1 !effects of grain growth due to vapor diffusion - REAL :: AGE2 !effects of grain growth at freezing of melt water - REAL :: AGE3 !effects of soot - REAL :: DELA !temporary variable - REAL :: SGE !temporary variable - REAL :: DELS !temporary variable - REAL :: DELA0 !temporary variable - REAL :: ARG !temporary variable -! See Yang et al. (1997) J.of Climate for detail. -!--------------------------------------------------------------------------------------------------- - - IF(SNEQV.LE.0.0) THEN - TAUSS = 0. - ELSE IF (SNEQV.GT.800.) THEN - TAUSS = 0. - ELSE -! TAUSS = 0. - DELA0 = 1.E-6*DT - ARG = 5.E3*(1./TFRZ-1./TG) - AGE1 = EXP(ARG) - AGE2 = EXP(AMIN1(0.,10.*ARG)) - AGE3 = 0.3 - TAGE = AGE1+AGE2+AGE3 - DELA = DELA0*TAGE - DELS = AMAX1(0.0,SNEQV-SNEQVO) / SWEMX - SGE = (TAUSS+DELA)*(1.0-DELS) - TAUSS = AMAX1(0.,SGE) - ENDIF - - FAGE= TAUSS/(TAUSS+1.) - - END SUBROUTINE SNOW_AGE_GLACIER -! ================================================================================================== -! -------------------------------------------------------------------------------------------------- - SUBROUTINE SNOWALB_BATS_GLACIER (NBAND,COSZ,FAGE,ALBSND,ALBSNI) -! -------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------------- -! input - - INTEGER,INTENT(IN) :: NBAND !number of waveband classes - - REAL,INTENT(IN) :: COSZ !cosine solar zenith angle - REAL,INTENT(IN) :: FAGE !snow age correction - -! output - - REAL, DIMENSION(1:2),INTENT(OUT) :: ALBSND !snow albedo for direct(1=vis, 2=nir) - REAL, DIMENSION(1:2),INTENT(OUT) :: ALBSNI !snow albedo for diffuse -! --------------------------------------------------------------------------------------------- - - REAL :: FZEN !zenith angle correction - REAL :: CF1 !temperary variable - REAL :: SL2 !2.*SL - REAL :: SL1 !1/SL - REAL :: SL !adjustable parameter - REAL, PARAMETER :: C1 = 0.2 !default in BATS - REAL, PARAMETER :: C2 = 0.5 !default in BATS -! REAL, PARAMETER :: C1 = 0.2 * 2. ! double the default to match Sleepers River's -! REAL, PARAMETER :: C2 = 0.5 * 2. ! snow surface albedo (double aging effects) -! --------------------------------------------------------------------------------------------- -! zero albedos for all points - - ALBSND(1: NBAND) = 0. - ALBSNI(1: NBAND) = 0. - -! when cosz > 0 - - SL=2.0 - SL1=1./SL - SL2=2.*SL - CF1=((1.+SL1)/(1.+SL2*COSZ)-SL1) - FZEN=AMAX1(CF1,0.) - - ALBSNI(1)=0.95*(1.-C1*FAGE) - ALBSNI(2)=0.65*(1.-C2*FAGE) - - ALBSND(1)=ALBSNI(1)+0.4*FZEN*(1.-ALBSNI(1)) ! vis direct - ALBSND(2)=ALBSNI(2)+0.4*FZEN*(1.-ALBSNI(2)) ! nir direct - - END SUBROUTINE SNOWALB_BATS_GLACIER -! ================================================================================================== -! -------------------------------------------------------------------------------------------------- - SUBROUTINE SNOWALB_CLASS_GLACIER (NBAND,QSNOW,DT,ALB,ALBOLD,ALBSND,ALBSNI) -! -------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------------- -! input - - INTEGER,INTENT(IN) :: NBAND !number of waveband classes - - REAL,INTENT(IN) :: QSNOW !snowfall (mm/s) - REAL,INTENT(IN) :: DT !time step (sec) - REAL,INTENT(IN) :: ALBOLD !snow albedo at last time step - -! in & out - - REAL, INTENT(INOUT) :: ALB ! -! output - - REAL, DIMENSION(1:2),INTENT(OUT) :: ALBSND !snow albedo for direct(1=vis, 2=nir) - REAL, DIMENSION(1:2),INTENT(OUT) :: ALBSNI !snow albedo for diffuse -! --------------------------------------------------------------------------------------------- - -! --------------------------------------------------------------------------------------------- -! zero albedos for all points - - ALBSND(1: NBAND) = 0. - ALBSNI(1: NBAND) = 0. - -! when cosz > 0 - - ALB = 0.55 + (ALBOLD-0.55) * EXP(-0.01*DT/3600.) - -! 1 mm fresh snow(SWE) -- 10mm snow depth, assumed the fresh snow density 100kg/m3 -! here assume 1cm snow depth will fully cover the old snow - - IF (QSNOW > 0.) then - ALB = ALB + MIN(QSNOW*DT,SWEMX) * (0.84-ALB)/(SWEMX) - ENDIF - - ALBSNI(1)= ALB ! vis diffuse - ALBSNI(2)= ALB ! nir diffuse - ALBSND(1)= ALB ! vis direct - ALBSND(2)= ALB ! nir direct - - END SUBROUTINE SNOWALB_CLASS_GLACIER -! ================================================================================================== - SUBROUTINE GLACIER_FLUX (NSOIL ,NSNOW ,EMG ,ISNOW ,DF ,DZSNSO ,Z0M , & !in - ZLVL ,ZPD ,QAIR ,SFCTMP ,RHOAIR ,SFCPRS , & !in - UR ,GAMMA ,RSURF ,LWDN ,RHSUR ,SMC , & !in - EAIR ,STC ,SAG ,SNOWH ,LATHEA ,SH2O , & !in - CM ,CH ,TGB ,QSFC , & !inout - IRB ,SHB ,EVB ,GHB , & !out - T2MB ,Q2B ,EHB2) !out - -! -------------------------------------------------------------------------------------------------- -! use newton-raphson iteration to solve ground (tg) temperature -! that balances the surface energy budgets for glacier. - -! bare soil: -! -SAB + IRB[TG] + SHB[TG] + EVB[TG] + GHB[TG] = 0 -! ---------------------------------------------------------------------- -! USE MODULE_MODEL_CONSTANTS -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! input - INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers - INTEGER, INTENT(IN) :: NSOIL !number of soil layers - REAL, INTENT(IN) :: EMG !ground emissivity - INTEGER, INTENT(IN) :: ISNOW !actual no. of snow layers - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DF !thermal conductivity of snow/soil (w/m/k) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !thickness of snow/soil layers (m) - REAL, INTENT(IN) :: Z0M !roughness length, momentum, ground (m) - REAL, INTENT(IN) :: ZLVL !reference height (m) - REAL, INTENT(IN) :: ZPD !zero plane displacement (m) - REAL, INTENT(IN) :: QAIR !specific humidity at height zlvl (kg/kg) - REAL, INTENT(IN) :: SFCTMP !air temperature at reference height (k) - REAL, INTENT(IN) :: RHOAIR !density air (kg/m3) - REAL, INTENT(IN) :: SFCPRS !density air (kg/m3) - REAL, INTENT(IN) :: UR !wind speed at height zlvl (m/s) - REAL, INTENT(IN) :: GAMMA !psychrometric constant (pa/k) - REAL, INTENT(IN) :: RSURF !ground surface resistance (s/m) - REAL, INTENT(IN) :: LWDN !atmospheric longwave radiation (w/m2) - REAL, INTENT(IN) :: RHSUR !raltive humidity in surface soil/snow air space (-) - REAL, INTENT(IN) :: EAIR !vapor pressure air at height (pa) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: STC !soil/snow temperature (k) - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: SMC !soil moisture - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: SH2O !soil liquid water - REAL, INTENT(IN) :: SAG !solar radiation absorbed by ground (w/m2) - REAL, INTENT(IN) :: SNOWH !actual snow depth [m] - REAL, INTENT(IN) :: LATHEA !latent heat of vaporization/subli (j/kg) - -! input/output - REAL, INTENT(INOUT) :: CM !momentum drag coefficient - REAL, INTENT(INOUT) :: CH !sensible heat exchange coefficient - REAL, INTENT(INOUT) :: TGB !ground temperature (k) - REAL, INTENT(INOUT) :: QSFC !mixing ratio at lowest model layer - -! output -! -SAB + IRB[TG] + SHB[TG] + EVB[TG] + GHB[TG] = 0 - REAL, INTENT(OUT) :: IRB !net longwave rad (w/m2) [+ to atm] - REAL, INTENT(OUT) :: SHB !sensible heat flux (w/m2) [+ to atm] - REAL, INTENT(OUT) :: EVB !latent heat flux (w/m2) [+ to atm] - REAL, INTENT(OUT) :: GHB !ground heat flux (w/m2) [+ to soil] - REAL, INTENT(OUT) :: T2MB !2 m height air temperature (k) - REAL, INTENT(OUT) :: Q2B !bare ground heat conductance - REAL, INTENT(OUT) :: EHB2 !sensible heat conductance for diagnostics - - -! local variables - INTEGER :: NITERB !number of iterations for surface temperature - REAL :: MPE !prevents overflow error if division by zero - REAL :: DTG !change in tg, last iteration (k) - INTEGER :: MOZSGN !number of times MOZ changes sign - REAL :: MOZOLD !Monin-Obukhov stability parameter from prior iteration - REAL :: FM2 !Monin-Obukhov momentum adjustment at 2m - REAL :: FH2 !Monin-Obukhov heat adjustment at 2m - REAL :: CH2 !Surface exchange at 2m - REAL :: H !temporary sensible heat flux (w/m2) - REAL :: FV !friction velocity (m/s) - REAL :: CIR !coefficients for ir as function of ts**4 - REAL :: CGH !coefficients for st as function of ts - REAL :: CSH !coefficients for sh as function of ts - REAL :: CEV !coefficients for ev as function of esat[ts] - REAL :: CQ2B ! - INTEGER :: ITER !iteration index - REAL :: Z0H !roughness length, sensible heat, ground (m) - REAL :: MOZ !Monin-Obukhov stability parameter - REAL :: FM !momentum stability correction, weighted by prior iters - REAL :: FH !sen heat stability correction, weighted by prior iters - REAL :: RAMB !aerodynamic resistance for momentum (s/m) - REAL :: RAHB !aerodynamic resistance for sensible heat (s/m) - REAL :: RAWB !aerodynamic resistance for water vapor (s/m) - REAL :: ESTG !saturation vapor pressure at tg (pa) - REAL :: DESTG !d(es)/dt at tg (pa/K) - REAL :: ESATW !es for water - REAL :: ESATI !es for ice - REAL :: DSATW !d(es)/dt at tg (pa/K) for water - REAL :: DSATI !d(es)/dt at tg (pa/K) for ice - REAL :: A !temporary calculation - REAL :: B !temporary calculation - REAL :: T, TDC !Kelvin to degree Celsius with limit -50 to +50 - REAL, DIMENSION( 1:NSOIL) :: SICE !soil ice - - TDC(T) = MIN( 50., MAX(-50.,(T-TFRZ)) ) - -! ----------------------------------------------------------------- -! initialization variables that do not depend on stability iteration -! ----------------------------------------------------------------- - NITERB = 5 - MPE = 1E-6 - DTG = 0. - MOZ = 0. - MOZSGN = 0 - MOZOLD = 0. - H = 0. - FV = 0.1 - - CIR = EMG*SB - CGH = 2.*DF(ISNOW+1)/DZSNSO(ISNOW+1) - -! ----------------------------------------------------------------- - loop3: DO ITER = 1, NITERB ! begin stability iteration - - Z0H = Z0M - -! For now, only allow SFCDIF1 until others can be fixed - - CALL SFCDIF1_GLACIER(ITER ,ZLVL ,ZPD ,Z0H ,Z0M , & !in - QAIR ,SFCTMP ,H ,RHOAIR ,MPE ,UR , & !in - & MOZ ,MOZSGN ,FM ,FH ,FM2 ,FH2 , & !inout - & FV ,CM ,CH ,CH2) !out - - RAMB = MAX(1.,1./(CM*UR)) - RAHB = MAX(1.,1./(CH*UR)) - RAWB = RAHB - -! es and d(es)/dt evaluated at tg - - T = TDC(TGB) - CALL ESAT(T, ESATW, ESATI, DSATW, DSATI) - IF (T .GT. 0.) THEN - ESTG = ESATW - DESTG = DSATW - ELSE - ESTG = ESATI - DESTG = DSATI - END IF - - CSH = RHOAIR*CPAIR/RAHB - IF(SNOWH > 0.0 .OR. OPT_GLA == 1) THEN - CEV = RHOAIR*CPAIR/GAMMA/(RSURF+RAWB) - ELSE - CEV = 0.0 ! don't allow any sublimation of glacier in opt_gla=2 - END IF - -! surface fluxes and dtg - - IRB = CIR * TGB**4 - EMG*LWDN - SHB = CSH * (TGB - SFCTMP ) - EVB = CEV * (ESTG*RHSUR - EAIR ) - GHB = CGH * (TGB - STC(ISNOW+1)) - - B = SAG-IRB-SHB-EVB-GHB - A = 4.*CIR*TGB**3 + CSH + CEV*DESTG + CGH - DTG = B/A - - IRB = IRB + 4.*CIR*TGB**3*DTG - SHB = SHB + CSH*DTG - EVB = EVB + CEV*DESTG*DTG - GHB = GHB + CGH*DTG - -! update ground surface temperature - TGB = TGB + DTG - -! for M-O length - H = CSH * (TGB - SFCTMP) - - T = TDC(TGB) - CALL ESAT(T, ESATW, ESATI, DSATW, DSATI) - IF (T .GT. 0.) THEN - ESTG = ESATW - ELSE - ESTG = ESATI - END IF - QSFC = 0.622*(ESTG*RHSUR)/(SFCPRS-0.378*(ESTG*RHSUR)) - - END DO loop3 ! end stability iteration -! ----------------------------------------------------------------- - -! if snow on ground and TG > TFRZ: reset TG = TFRZ. reevaluate ground fluxes. - - SICE = SMC - SH2O - IF(OPT_STC == 1 .OR. OPT_STC ==3) THEN - IF ((MAXVAL(SICE) > 0.0 .OR. SNOWH > 0.0) .AND. TGB > TFRZ .AND. OPT_GLA == 1) THEN - TGB = TFRZ - T = TDC(TGB) ! MB: recalculate ESTG - CALL ESAT(T, ESATW, ESATI, DSATW, DSATI) - ESTG = ESATI - QSFC = 0.622*(ESTG*RHSUR)/(SFCPRS-0.378*(ESTG*RHSUR)) - IRB = CIR * TGB**4 - EMG*LWDN - SHB = CSH * (TGB - SFCTMP) - EVB = CEV * (ESTG*RHSUR - EAIR ) !ESTG reevaluate ? - GHB = SAG - (IRB+SHB+EVB) - END IF - END IF - -! 2m air temperature - EHB2 = FV*VKC/(LOG((2.+Z0H)/Z0H)-FH2) - CQ2B = EHB2 - IF (EHB2.lt.1.E-5 ) THEN - T2MB = TGB - Q2B = QSFC - ELSE - T2MB = TGB - SHB/(RHOAIR*CPAIR) * 1./EHB2 - Q2B = QSFC - EVB/(LATHEA*RHOAIR)*(1./CQ2B + RSURF) - ENDIF - -! update CH - CH = 1./RAHB - - END SUBROUTINE GLACIER_FLUX -! ================================================================================================== - SUBROUTINE ESAT(T, ESW, ESI, DESW, DESI) -!--------------------------------------------------------------------------------------------------- -! use polynomials to calculate saturation vapor pressure and derivative with -! respect to temperature: over water when t > 0 c and over ice when t <= 0 c - IMPLICIT NONE -!--------------------------------------------------------------------------------------------------- -! in - - REAL, intent(in) :: T !temperature - -!out - - REAL, intent(out) :: ESW !saturation vapor pressure over water (pa) - REAL, intent(out) :: ESI !saturation vapor pressure over ice (pa) - REAL, intent(out) :: DESW !d(esat)/dt over water (pa/K) - REAL, intent(out) :: DESI !d(esat)/dt over ice (pa/K) - -! local - - REAL :: A0,A1,A2,A3,A4,A5,A6 !coefficients for esat over water - REAL :: B0,B1,B2,B3,B4,B5,B6 !coefficients for esat over ice - REAL :: C0,C1,C2,C3,C4,C5,C6 !coefficients for dsat over water - REAL :: D0,D1,D2,D3,D4,D5,D6 !coefficients for dsat over ice - - PARAMETER (A0=6.107799961 , A1=4.436518521E-01, & - A2=1.428945805E-02, A3=2.650648471E-04, & - A4=3.031240396E-06, A5=2.034080948E-08, & - A6=6.136820929E-11) - - PARAMETER (B0=6.109177956 , B1=5.034698970E-01, & - B2=1.886013408E-02, B3=4.176223716E-04, & - B4=5.824720280E-06, B5=4.838803174E-08, & - B6=1.838826904E-10) - - PARAMETER (C0= 4.438099984E-01, C1=2.857002636E-02, & - C2= 7.938054040E-04, C3=1.215215065E-05, & - C4= 1.036561403E-07, C5=3.532421810e-10, & - C6=-7.090244804E-13) - - PARAMETER (D0=5.030305237E-01, D1=3.773255020E-02, & - D2=1.267995369E-03, D3=2.477563108E-05, & - D4=3.005693132E-07, D5=2.158542548E-09, & - D6=7.131097725E-12) - - ESW = 100.*(A0+T*(A1+T*(A2+T*(A3+T*(A4+T*(A5+T*A6)))))) - ESI = 100.*(B0+T*(B1+T*(B2+T*(B3+T*(B4+T*(B5+T*B6)))))) - DESW = 100.*(C0+T*(C1+T*(C2+T*(C3+T*(C4+T*(C5+T*C6)))))) - DESI = 100.*(D0+T*(D1+T*(D2+T*(D3+T*(D4+T*(D5+T*D6)))))) - - END SUBROUTINE ESAT -! ================================================================================================== - - SUBROUTINE SFCDIF1_GLACIER(ITER ,ZLVL ,ZPD ,Z0H ,Z0M , & !in - QAIR ,SFCTMP ,H ,RHOAIR ,MPE ,UR , & !in - & MOZ ,MOZSGN ,FM ,FH ,FM2 ,FH2 , & !inout - & FV ,CM ,CH ,CH2 ) !out -! ------------------------------------------------------------------------------------------------- -! computing surface drag coefficient CM for momentum and CH for heat -! ------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! ------------------------------------------------------------------------------------------------- -! inputs - INTEGER, INTENT(IN) :: ITER !iteration index - REAL, INTENT(IN) :: ZLVL !reference height (m) - REAL, INTENT(IN) :: ZPD !zero plane displacement (m) - REAL, INTENT(IN) :: Z0H !roughness length, sensible heat, ground (m) - REAL, INTENT(IN) :: Z0M !roughness length, momentum, ground (m) - REAL, INTENT(IN) :: QAIR !specific humidity at reference height (kg/kg) - REAL, INTENT(IN) :: SFCTMP !temperature at reference height (k) - REAL, INTENT(IN) :: H !sensible heat flux (w/m2) [+ to atm] - REAL, INTENT(IN) :: RHOAIR !density air (kg/m**3) - REAL, INTENT(IN) :: MPE !prevents overflow error if division by zero - REAL, INTENT(IN) :: UR !wind speed (m/s) - -! in & out - REAL, INTENT(INOUT) :: MOZ !Monin-Obukhov stability (z/L) - INTEGER, INTENT(INOUT) :: MOZSGN !number of times moz changes sign - REAL, INTENT(INOUT) :: FM !momentum stability correction, weighted by prior iters - REAL, INTENT(INOUT) :: FH !sen heat stability correction, weighted by prior iters - REAL, INTENT(INOUT) :: FM2 !sen heat stability correction, weighted by prior iters - REAL, INTENT(INOUT) :: FH2 !sen heat stability correction, weighted by prior iters - -! outputs - REAL, INTENT(OUT) :: FV !friction velocity (m/s) - REAL, INTENT(OUT) :: CM !drag coefficient for momentum - REAL, INTENT(OUT) :: CH !drag coefficient for heat - REAL, INTENT(OUT) :: CH2 !drag coefficient for heat - -! locals - REAL :: MOZOLD !Monin-Obukhov stability parameter from prior iteration - REAL :: TMPCM !temporary calculation for CM - REAL :: TMPCH !temporary calculation for CH - REAL :: MOL !Monin-Obukhov length (m) - REAL :: TVIR !temporary virtual temperature (k) - REAL :: TMP1,TMP2,TMP3 !temporary calculation - REAL :: FMNEW !stability correction factor, momentum, for current moz - REAL :: FHNEW !stability correction factor, sen heat, for current moz - REAL :: MOZ2 !2/L - REAL :: TMPCM2 !temporary calculation for CM2 - REAL :: TMPCH2 !temporary calculation for CH2 - REAL :: FM2NEW !stability correction factor, momentum, for current moz - REAL :: FH2NEW !stability correction factor, sen heat, for current moz - REAL :: TMP12,TMP22,TMP32 !temporary calculation - - REAL :: CMFM, CHFH, CM2FM2, CH2FH2 - - -! ------------------------------------------------------------------------------------------------- -! Monin-Obukhov stability parameter moz for next iteration - - MOZOLD = MOZ - - IF(ZLVL <= ZPD) THEN - write(*,*) 'critical glacier problem: ZLVL <= ZPD; model stops', zlvl, zpd - call wrf_error_fatal("STOP in Noah-MP glacier") - ENDIF - - TMPCM = LOG((ZLVL-ZPD) / Z0M) - TMPCH = LOG((ZLVL-ZPD) / Z0H) - TMPCM2 = LOG((2.0 + Z0M) / Z0M) - TMPCH2 = LOG((2.0 + Z0H) / Z0H) - - IF(ITER == 1) THEN - FV = 0.0 - MOZ = 0.0 - MOL = 0.0 - MOZ2 = 0.0 - ELSE - TVIR = (1. + 0.61*QAIR) * SFCTMP - TMP1 = VKC * (GRAV/TVIR) * H/(RHOAIR*CPAIR) - IF (ABS(TMP1) .LE. MPE) TMP1 = MPE - MOL = -1. * FV**3 / TMP1 - MOZ = MIN( (ZLVL-ZPD)/MOL, 1.) - MOZ2 = MIN( (2.0 + Z0H)/MOL, 1.) - ENDIF - -! accumulate number of times moz changes sign. - - IF (MOZOLD*MOZ .LT. 0.) MOZSGN = MOZSGN+1 - IF (MOZSGN .GE. 2) THEN - MOZ = 0. - FM = 0. - FH = 0. - MOZ2 = 0. - FM2 = 0. - FH2 = 0. - ENDIF - -! evaluate stability-dependent variables using moz from prior iteration - IF (MOZ .LT. 0.) THEN - TMP1 = (1. - 16.*MOZ)**0.25 - TMP2 = LOG((1.+TMP1*TMP1)/2.) - TMP3 = LOG((1.+TMP1)/2.) - FMNEW = 2.*TMP3 + TMP2 - 2.*ATAN(TMP1) + 1.5707963 - FHNEW = 2*TMP2 - -! 2-meter - TMP12 = (1. - 16.*MOZ2)**0.25 - TMP22 = LOG((1.+TMP12*TMP12)/2.) - TMP32 = LOG((1.+TMP12)/2.) - FM2NEW = 2.*TMP32 + TMP22 - 2.*ATAN(TMP12) + 1.5707963 - FH2NEW = 2*TMP22 - ELSE - FMNEW = -5.*MOZ - FHNEW = FMNEW - FM2NEW = -5.*MOZ2 - FH2NEW = FM2NEW - ENDIF - -! except for first iteration, weight stability factors for previous -! iteration to help avoid flip-flops from one iteration to the next - - IF (ITER == 1) THEN - FM = FMNEW - FH = FHNEW - FM2 = FM2NEW - FH2 = FH2NEW - ELSE - FM = 0.5 * (FM+FMNEW) - FH = 0.5 * (FH+FHNEW) - FM2 = 0.5 * (FM2+FM2NEW) - FH2 = 0.5 * (FH2+FH2NEW) - ENDIF - -! exchange coefficients - - FH = MIN(FH,0.9*TMPCH) - FM = MIN(FM,0.9*TMPCM) - FH2 = MIN(FH2,0.9*TMPCH2) - FM2 = MIN(FM2,0.9*TMPCM2) - - CMFM = TMPCM-FM - CHFH = TMPCH-FH - CM2FM2 = TMPCM2-FM2 - CH2FH2 = TMPCH2-FH2 - IF(ABS(CMFM) <= MPE) CMFM = MPE - IF(ABS(CHFH) <= MPE) CHFH = MPE - IF(ABS(CM2FM2) <= MPE) CM2FM2 = MPE - IF(ABS(CH2FH2) <= MPE) CH2FH2 = MPE - CM = VKC*VKC/(CMFM*CMFM) - CH = VKC*VKC/(CMFM*CHFH) - CH2 = VKC*VKC/(CM2FM2*CH2FH2) - -! friction velocity - - FV = UR * SQRT(CM) - CH2 = VKC*FV/CH2FH2 - - END SUBROUTINE SFCDIF1_GLACIER -! ================================================================================================== - SUBROUTINE TSNOSOI_GLACIER (NSOIL ,NSNOW ,ISNOW ,DT ,TBOT , & !in - SSOIL ,SNOWH ,ZBOT ,ZSNSO ,DF , & !in - HCPCT , & !in - STC ) !inout -! -------------------------------------------------------------------------------------------------- -! Compute snow (up to 3L) and soil (4L) temperature. Note that snow temperatures -! during melting season may exceed melting point (TFRZ) but later in PHASECHANGE -! subroutine the snow temperatures are reset to TFRZ for melting snow. -! -------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------------- -!input - - INTEGER, INTENT(IN) :: NSOIL !no of soil layers (4) - INTEGER, INTENT(IN) :: NSNOW !maximum no of snow layers (3) - INTEGER, INTENT(IN) :: ISNOW !actual no of snow layers - - REAL, INTENT(IN) :: DT !time step (s) - REAL, INTENT(IN) :: TBOT ! - REAL, INTENT(IN) :: SSOIL !ground heat flux (w/m2) - REAL, INTENT(IN) :: SNOWH !snow depth (m) - REAL, INTENT(IN) :: ZBOT !from soil surface (m) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: ZSNSO !layer-bot. depth from snow surf.(m) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DF !thermal conductivity - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: HCPCT !heat capacity (J/m3/k) - -!input and output - - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC - -!local - - INTEGER :: IZ - REAL :: ZBOTSNO !ZBOT from snow surface - REAL, DIMENSION(-NSNOW+1:NSOIL) :: AI, BI, CI, RHSTS - REAL :: EFLXB !energy influx from soil bottom (w/m2) - REAL, DIMENSION(-NSNOW+1:NSOIL) :: PHI !light through water (w/m2) - -! ---------------------------------------------------------------------- - -! prescribe solar penetration into ice/snow - - PHI(ISNOW+1:NSOIL) = 0. - -! adjust ZBOT from soil surface to ZBOTSNO from snow surface - - ZBOTSNO = ZBOT - SNOWH !from snow surface - -! compute ice temperatures - - CALL HRT_GLACIER (NSNOW ,NSOIL ,ISNOW ,ZSNSO , & - STC ,TBOT ,ZBOTSNO ,DF , & - HCPCT ,SSOIL ,PHI , & - AI ,BI ,CI ,RHSTS , & - EFLXB ) - - CALL HSTEP_GLACIER (NSNOW ,NSOIL ,ISNOW ,DT , & - AI ,BI ,CI ,RHSTS , & - STC ) - - END SUBROUTINE TSNOSOI_GLACIER -! ================================================================================================== -! ---------------------------------------------------------------------- - SUBROUTINE HRT_GLACIER (NSNOW ,NSOIL ,ISNOW ,ZSNSO , & !in - STC ,TBOT ,ZBOT ,DF , & !in - HCPCT ,SSOIL ,PHI , & !in - AI ,BI ,CI ,RHSTS , & !out - BOTFLX ) !out -! ---------------------------------------------------------------------- -! ---------------------------------------------------------------------- -! calculate the right hand side of the time tendency term of the soil -! thermal diffusion equation. also to compute ( prepare ) the matrix -! coefficients for the tri-diagonal matrix of the implicit time scheme. -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! input - - INTEGER, INTENT(IN) :: NSOIL !no of soil layers (4) - INTEGER, INTENT(IN) :: NSNOW !maximum no of snow layers (3) - INTEGER, INTENT(IN) :: ISNOW !actual no of snow layers - REAL, INTENT(IN) :: TBOT !bottom soil temp. at ZBOT (k) - REAL, INTENT(IN) :: ZBOT !depth of lower boundary condition (m) - !from soil surface not snow surface - REAL, INTENT(IN) :: SSOIL !ground heat flux (w/m2) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: ZSNSO !depth of layer-bottom of snow/soil (m) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: STC !snow/soil temperature (k) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DF !thermal conductivity [w/m/k] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: HCPCT !heat capacity [j/m3/k] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: PHI !light through water (w/m2) - -! output - - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: RHSTS !right-hand side of the matrix - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: AI !left-hand side coefficient - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: BI !left-hand side coefficient - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: CI !left-hand side coefficient - REAL, INTENT(OUT) :: BOTFLX !energy influx from soil bottom (w/m2) - -! local - - INTEGER :: K - REAL, DIMENSION(-NSNOW+1:NSOIL) :: DDZ - REAL, DIMENSION(-NSNOW+1:NSOIL) :: DENOM - REAL, DIMENSION(-NSNOW+1:NSOIL) :: DTSDZ - REAL, DIMENSION(-NSNOW+1:NSOIL) :: EFLUX - REAL :: TEMP1 -! ---------------------------------------------------------------------- - - DO K = ISNOW+1, NSOIL - IF (K == ISNOW+1) THEN - DENOM(K) = - ZSNSO(K) * HCPCT(K) - TEMP1 = - ZSNSO(K+1) - DDZ(K) = 2.0 / TEMP1 - DTSDZ(K) = 2.0 * (STC(K) - STC(K+1)) / TEMP1 - EFLUX(K) = DF(K) * DTSDZ(K) - SSOIL - PHI(K) - ELSE IF (K < NSOIL) THEN - DENOM(K) = (ZSNSO(K-1) - ZSNSO(K)) * HCPCT(K) - TEMP1 = ZSNSO(K-1) - ZSNSO(K+1) - DDZ(K) = 2.0 / TEMP1 - DTSDZ(K) = 2.0 * (STC(K) - STC(K+1)) / TEMP1 - EFLUX(K) = (DF(K)*DTSDZ(K) - DF(K-1)*DTSDZ(K-1)) - PHI(K) - ELSE IF (K == NSOIL) THEN - DENOM(K) = (ZSNSO(K-1) - ZSNSO(K)) * HCPCT(K) - TEMP1 = ZSNSO(K-1) - ZSNSO(K) - IF(OPT_TBOT == 1) THEN - BOTFLX = 0. - END IF - IF(OPT_TBOT == 2) THEN - DTSDZ(K) = (STC(K) - TBOT) / ( 0.5*(ZSNSO(K-1)+ZSNSO(K)) - ZBOT) - BOTFLX = -DF(K) * DTSDZ(K) - END IF - EFLUX(K) = (-BOTFLX - DF(K-1)*DTSDZ(K-1) ) - PHI(K) - END IF - END DO - - DO K = ISNOW+1, NSOIL - IF (K == ISNOW+1) THEN - AI(K) = 0.0 - CI(K) = - DF(K) * DDZ(K) / DENOM(K) - IF (OPT_STC == 1 .OR. OPT_STC == 3) THEN - BI(K) = - CI(K) - END IF - IF (OPT_STC == 2) THEN - BI(K) = - CI(K) + DF(K)/(0.5*ZSNSO(K)*ZSNSO(K)*HCPCT(K)) - END IF - ELSE IF (K < NSOIL) THEN - AI(K) = - DF(K-1) * DDZ(K-1) / DENOM(K) - CI(K) = - DF(K ) * DDZ(K ) / DENOM(K) - BI(K) = - (AI(K) + CI (K)) - ELSE IF (K == NSOIL) THEN - AI(K) = - DF(K-1) * DDZ(K-1) / DENOM(K) - CI(K) = 0.0 - BI(K) = - (AI(K) + CI(K)) - END IF - RHSTS(K) = EFLUX(K)/ (-DENOM(K)) - END DO - - END SUBROUTINE HRT_GLACIER -! ================================================================================================== -! ---------------------------------------------------------------------- - SUBROUTINE HSTEP_GLACIER (NSNOW ,NSOIL ,ISNOW ,DT , & !in - AI ,BI ,CI ,RHSTS , & !inout - STC ) !inout -! ---------------------------------------------------------------------- -! CALCULATE/UPDATE THE SOIL TEMPERATURE FIELD. -! ---------------------------------------------------------------------- - implicit none -! ---------------------------------------------------------------------- -! input - - INTEGER, INTENT(IN) :: NSOIL - INTEGER, INTENT(IN) :: NSNOW - INTEGER, INTENT(IN) :: ISNOW - REAL, INTENT(IN) :: DT - -! output & input - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: AI - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: BI - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: CI - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: RHSTS - -! local - INTEGER :: K - REAL, DIMENSION(-NSNOW+1:NSOIL) :: RHSTSIN - REAL, DIMENSION(-NSNOW+1:NSOIL) :: CIIN -! ---------------------------------------------------------------------- - - DO K = ISNOW+1,NSOIL - RHSTS(K) = RHSTS(K) * DT - AI(K) = AI(K) * DT - BI(K) = 1. + BI(K) * DT - CI(K) = CI(K) * DT - END DO - -! copy values for input variables before call to rosr12 - - DO K = ISNOW+1,NSOIL - RHSTSIN(K) = RHSTS(K) - CIIN(K) = CI(K) - END DO - -! solve the tri-diagonal matrix equation - - CALL ROSR12_GLACIER (CI,AI,BI,CIIN,RHSTSIN,RHSTS,ISNOW+1,NSOIL,NSNOW) - -! update snow & soil temperature - - DO K = ISNOW+1,NSOIL - STC (K) = STC (K) + CI (K) - END DO - - END SUBROUTINE HSTEP_GLACIER -! ================================================================================================== - SUBROUTINE ROSR12_GLACIER (P,A,B,C,D,DELTA,NTOP,NSOIL,NSNOW) -! ---------------------------------------------------------------------- -! SUBROUTINE ROSR12 -! ---------------------------------------------------------------------- -! INVERT (SOLVE) THE TRI-DIAGONAL MATRIX PROBLEM SHOWN BELOW: -! ### ### ### ### ### ### -! #B(1), C(1), 0 , 0 , 0 , . . . , 0 # # # # # -! #A(2), B(2), C(2), 0 , 0 , . . . , 0 # # # # # -! # 0 , A(3), B(3), C(3), 0 , . . . , 0 # # # # D(3) # -! # 0 , 0 , A(4), B(4), C(4), . . . , 0 # # P(4) # # D(4) # -! # 0 , 0 , 0 , A(5), B(5), . . . , 0 # # P(5) # # D(5) # -! # . . # # . # = # . # -! # . . # # . # # . # -! # . . # # . # # . # -! # 0 , . . . , 0 , A(M-2), B(M-2), C(M-2), 0 # #P(M-2)# #D(M-2)# -! # 0 , . . . , 0 , 0 , A(M-1), B(M-1), C(M-1)# #P(M-1)# #D(M-1)# -! # 0 , . . . , 0 , 0 , 0 , A(M) , B(M) # # P(M) # # D(M) # -! ### ### ### ### ### ### -! ---------------------------------------------------------------------- - IMPLICIT NONE - - INTEGER, INTENT(IN) :: NTOP - INTEGER, INTENT(IN) :: NSOIL,NSNOW - INTEGER :: K, KK - - REAL, DIMENSION(-NSNOW+1:NSOIL),INTENT(IN):: A, B, D - REAL, DIMENSION(-NSNOW+1:NSOIL),INTENT(INOUT):: C,P,DELTA - -! ---------------------------------------------------------------------- -! INITIALIZE EQN COEF C FOR THE LOWEST SOIL LAYER -! ---------------------------------------------------------------------- - C (NSOIL) = 0.0 - P (NTOP) = - C (NTOP) / B (NTOP) -! ---------------------------------------------------------------------- -! SOLVE THE COEFS FOR THE 1ST SOIL LAYER -! ---------------------------------------------------------------------- - DELTA (NTOP) = D (NTOP) / B (NTOP) -! ---------------------------------------------------------------------- -! SOLVE THE COEFS FOR SOIL LAYERS 2 THRU NSOIL -! ---------------------------------------------------------------------- - DO K = NTOP+1,NSOIL - P (K) = - C (K) * ( 1.0 / (B (K) + A (K) * P (K -1)) ) - DELTA (K) = (D (K) - A (K)* DELTA (K -1))* (1.0/ (B (K) + A (K)& - * P (K -1))) - END DO -! ---------------------------------------------------------------------- -! SET P TO DELTA FOR LOWEST SOIL LAYER -! ---------------------------------------------------------------------- - P (NSOIL) = DELTA (NSOIL) -! ---------------------------------------------------------------------- -! ADJUST P FOR SOIL LAYERS 2 THRU NSOIL -! ---------------------------------------------------------------------- - DO K = NTOP+1,NSOIL - KK = NSOIL - K + (NTOP-1) + 1 - P (KK) = P (KK) * P (KK +1) + DELTA (KK) - END DO -! ---------------------------------------------------------------------- - END SUBROUTINE ROSR12_GLACIER -! ---------------------------------------------------------------------- -! ================================================================================================== - SUBROUTINE PHASECHANGE_GLACIER (NSNOW ,NSOIL ,ISNOW ,DT ,FACT , & !in - DZSNSO , & !in - STC ,SNICE ,SNLIQ ,SNEQV ,SNOWH , & !inout - SMC ,SH2O , & !inout - QMELT ,IMELT ,PONDING ) !out -! ---------------------------------------------------------------------- -! melting/freezing of snow water and soil water -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! inputs - - INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers [=3] - INTEGER, INTENT(IN) :: NSOIL !No. of soil layers [=4] - INTEGER, INTENT(IN) :: ISNOW !actual no. of snow layers [<=3] - REAL, INTENT(IN) :: DT !land model time step (sec) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: FACT !temporary - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !snow/soil layer thickness [m] - -! inputs/outputs - - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow/soil layer temperature [k] - REAL, DIMENSION(-NSNOW+1:0) , INTENT(INOUT) :: SNICE !snow layer ice [mm] - REAL, DIMENSION(-NSNOW+1:0) , INTENT(INOUT) :: SNLIQ !snow layer liquid water [mm] - REAL, INTENT(INOUT) :: SNEQV - REAL, INTENT(INOUT) :: SNOWH - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SH2O !soil liquid water [m3/m3] - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SMC !total soil water [m3/m3] - -! outputs - REAL, INTENT(OUT) :: QMELT !snowmelt rate [mm/s] - INTEGER, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: IMELT !phase change index - REAL, INTENT(OUT) :: PONDING!snowmelt when snow has no layer [mm] - -! local - - INTEGER :: J,K !do loop index - REAL, DIMENSION(-NSNOW+1:NSOIL) :: HM !energy residual [w/m2] - REAL, DIMENSION(-NSNOW+1:NSOIL) :: XM !melting or freezing water [kg/m2] - REAL, DIMENSION(-NSNOW+1:NSOIL) :: WMASS0 - REAL, DIMENSION(-NSNOW+1:NSOIL) :: WICE0 - REAL, DIMENSION(-NSNOW+1:NSOIL) :: WLIQ0 - REAL, DIMENSION(-NSNOW+1:NSOIL) :: MICE !soil/snow ice mass [mm] - REAL, DIMENSION(-NSNOW+1:NSOIL) :: MLIQ !soil/snow liquid water mass [mm] - REAL, DIMENSION(-NSNOW+1:NSOIL) :: HEATR !energy residual or loss after melting/freezing - REAL :: TEMP1 !temporary variables [kg/m2] - REAL :: PROPOR - REAL :: XMF !total latent heat of phase change - -! ---------------------------------------------------------------------- -! Initialization - - QMELT = 0. - PONDING = 0. - XMF = 0. - - DO J = ISNOW+1,0 ! all snow layers - MICE(J) = SNICE(J) - MLIQ(J) = SNLIQ(J) - END DO - - DO J = ISNOW+1,0 ! all snow layers; do ice later - IMELT(J) = 0 - HM(J) = 0. - XM(J) = 0. - WICE0(J) = MICE(J) - WLIQ0(J) = MLIQ(J) - WMASS0(J) = MICE(J) + MLIQ(J) - ENDDO - - DO J = ISNOW+1,0 - IF (MICE(J) > 0. .AND. STC(J) >= TFRZ) THEN ! melting - IMELT(J) = 1 - ENDIF - IF (MLIQ(J) > 0. .AND. STC(J) < TFRZ) THEN ! freezing - IMELT(J) = 2 - ENDIF - - ENDDO - -! Calculate the energy surplus and loss for melting and freezing - - DO J = ISNOW+1,0 - IF (IMELT(J) > 0) THEN - HM(J) = (STC(J)-TFRZ)/FACT(J) - STC(J) = TFRZ - ENDIF - - IF (IMELT(J) == 1 .AND. HM(J) < 0.) THEN - HM(J) = 0. - IMELT(J) = 0 - ENDIF - IF (IMELT(J) == 2 .AND. HM(J) > 0.) THEN - HM(J) = 0. - IMELT(J) = 0 - ENDIF - XM(J) = HM(J)*DT/HFUS - ENDDO - -! The rate of melting and freezing for snow without a layer, opt_gla==1 treated below - -IF (OPT_GLA == 2) THEN - - IF (ISNOW == 0 .AND. SNEQV > 0. .AND. STC(1) >= TFRZ) THEN - HM(1) = (STC(1)-TFRZ)/FACT(1) ! available heat - STC(1) = TFRZ ! set T to freezing - XM(1) = HM(1)*DT/HFUS ! total snow melt possible - - TEMP1 = SNEQV - SNEQV = MAX(0.,TEMP1-XM(1)) ! snow remaining - PROPOR = SNEQV/TEMP1 ! fraction melted - SNOWH = MAX(0.,PROPOR * SNOWH) ! new snow height - HEATR(1) = HM(1) - HFUS*(TEMP1-SNEQV)/DT ! excess heat - IF (HEATR(1) > 0.) THEN - XM(1) = HEATR(1)*DT/HFUS - STC(1) = STC(1) + FACT(1)*HEATR(1) ! re-heat ice - ELSE - XM(1) = 0. ! heat used up - HM(1) = 0. - ENDIF - QMELT = MAX(0.,(TEMP1-SNEQV))/DT ! melted snow rate - XMF = HFUS*QMELT ! melted snow energy - PONDING = TEMP1-SNEQV ! melt water - ENDIF - -END IF ! OPT_GLA == 2 - -! The rate of melting and freezing for snow - - DO J = ISNOW+1,0 - IF (IMELT(J) > 0 .AND. ABS(HM(J)) > 0.) THEN - - HEATR(J) = 0. - IF (XM(J) > 0.) THEN - MICE(J) = MAX(0., WICE0(J)-XM(J)) - HEATR(J) = HM(J) - HFUS*(WICE0(J)-MICE(J))/DT - ELSE IF (XM(J) < 0.) THEN - MICE(J) = MIN(WMASS0(J), WICE0(J)-XM(J)) - HEATR(J) = HM(J) - HFUS*(WICE0(J)-MICE(J))/DT - ENDIF - - MLIQ(J) = MAX(0.,WMASS0(J)-MICE(J)) - - IF (ABS(HEATR(J)) > 0.) THEN - STC(J) = STC(J) + FACT(J)*HEATR(J) - IF (MLIQ(J)*MICE(J)>0.) STC(J) = TFRZ - ENDIF - - QMELT = QMELT + MAX(0.,(WICE0(J)-MICE(J)))/DT - - ENDIF - ENDDO - -IF (OPT_GLA == 1) THEN ! operate on the ice layers - - DO J = 1, NSOIL ! all soil layers - MLIQ(J) = SH2O(J) * DZSNSO(J) * 1000. - MICE(J) = (SMC(J) - SH2O(J)) * DZSNSO(J) * 1000. - END DO - - DO J = 1,NSOIL ! all layers - IMELT(J) = 0 - HM(J) = 0. - XM(J) = 0. - WICE0(J) = MICE(J) - WLIQ0(J) = MLIQ(J) - WMASS0(J) = MICE(J) + MLIQ(J) - ENDDO - - DO J = 1,NSOIL - IF (MICE(J) > 0. .AND. STC(J) >= TFRZ) THEN ! melting - IMELT(J) = 1 - ENDIF - IF (MLIQ(J) > 0. .AND. STC(J) < TFRZ) THEN ! freezing - IMELT(J) = 2 - ENDIF - - ! If snow exists, but its thickness is not enough to create a layer - IF (ISNOW == 0 .AND. SNEQV > 0. .AND. J == 1) THEN - IF (STC(J) >= TFRZ) THEN - IMELT(J) = 1 - ENDIF - ENDIF - ENDDO - -! Calculate the energy surplus and loss for melting and freezing - - DO J = 1,NSOIL - IF (IMELT(J) > 0) THEN - HM(J) = (STC(J)-TFRZ)/FACT(J) - STC(J) = TFRZ - ENDIF - - IF (IMELT(J) == 1 .AND. HM(J) < 0.) THEN - HM(J) = 0. - IMELT(J) = 0 - ENDIF - IF (IMELT(J) == 2 .AND. HM(J) > 0.) THEN - HM(J) = 0. - IMELT(J) = 0 - ENDIF - XM(J) = HM(J)*DT/HFUS - ENDDO - -! The rate of melting and freezing for snow without a layer, needs more work. - - IF (ISNOW == 0 .AND. SNEQV > 0. .AND. XM(1) > 0.) THEN - TEMP1 = SNEQV - SNEQV = MAX(0.,TEMP1-XM(1)) - PROPOR = SNEQV/TEMP1 - SNOWH = MAX(0.,PROPOR * SNOWH) - HEATR(1) = HM(1) - HFUS*(TEMP1-SNEQV)/DT - IF (HEATR(1) > 0.) THEN - XM(1) = HEATR(1)*DT/HFUS - HM(1) = HEATR(1) - IMELT(1) = 1 - ELSE - XM(1) = 0. - HM(1) = 0. - IMELT(1) = 0 - ENDIF - QMELT = MAX(0.,(TEMP1-SNEQV))/DT - XMF = HFUS*QMELT - PONDING = TEMP1-SNEQV - ENDIF - -! The rate of melting and freezing for soil - - DO J = 1,NSOIL - IF (IMELT(J) > 0 .AND. ABS(HM(J)) > 0.) THEN - - HEATR(J) = 0. - IF (XM(J) > 0.) THEN - MICE(J) = MAX(0., WICE0(J)-XM(J)) - HEATR(J) = HM(J) - HFUS*(WICE0(J)-MICE(J))/DT - ELSE IF (XM(J) < 0.) THEN - MICE(J) = MIN(WMASS0(J), WICE0(J)-XM(J)) - HEATR(J) = HM(J) - HFUS*(WICE0(J)-MICE(J))/DT - ENDIF - - MLIQ(J) = MAX(0.,WMASS0(J)-MICE(J)) - - IF (ABS(HEATR(J)) > 0.) THEN - STC(J) = STC(J) + FACT(J)*HEATR(J) - IF (J <= 0) THEN ! snow - IF (MLIQ(J)*MICE(J)>0.) STC(J) = TFRZ - END IF - ENDIF - - IF (J > 0) XMF = XMF + HFUS * (WICE0(J)-MICE(J))/DT - - IF (J < 1) THEN - QMELT = QMELT + MAX(0.,(WICE0(J)-MICE(J)))/DT - ENDIF - ENDIF - ENDDO - HEATR = 0.0 - XM = 0.0 - -! Deal with residuals in ice/soil - -! FIRST REMOVE EXCESS HEAT BY REDUCING TEMPERATURE OF LAYERS - - IF (ANY(STC(1:4) > TFRZ) .AND. ANY(STC(1:4) < TFRZ)) THEN - DO J = 1,NSOIL - IF ( STC(J) > TFRZ ) THEN - HEATR(J) = (STC(J)-TFRZ)/FACT(J) - DO K = 1,NSOIL - IF (J .NE. K .AND. STC(K) < TFRZ .AND. HEATR(J) > 0.1) THEN - HEATR(K) = (STC(K)-TFRZ)/FACT(K) - IF (ABS(HEATR(K)) > HEATR(J)) THEN ! LAYER ABSORBS ALL - HEATR(K) = HEATR(K) + HEATR(J) - STC(K) = TFRZ + HEATR(K)*FACT(K) - HEATR(J) = 0.0 - ELSE - HEATR(J) = HEATR(J) + HEATR(K) - HEATR(K) = 0.0 - STC(K) = TFRZ - END IF - END IF - END DO - STC(J) = TFRZ + HEATR(J)*FACT(J) - END IF - END DO - END IF - -! NOW REMOVE EXCESS COLD BY INCREASING TEMPERATURE OF LAYERS (MAY NOT BE NECESSARY WITH ABOVE LOOP) - - IF (ANY(STC(1:4) > TFRZ) .AND. ANY(STC(1:4) < TFRZ)) THEN - DO J = 1,NSOIL - IF ( STC(J) < TFRZ ) THEN - HEATR(J) = (STC(J)-TFRZ)/FACT(J) - DO K = 1,NSOIL - IF (J .NE. K .AND. STC(K) > TFRZ .AND. HEATR(J) < -0.1) THEN - HEATR(K) = (STC(K)-TFRZ)/FACT(K) - IF (HEATR(K) > ABS(HEATR(J))) THEN ! LAYER ABSORBS ALL - HEATR(K) = HEATR(K) + HEATR(J) - STC(K) = TFRZ + HEATR(K)*FACT(K) - HEATR(J) = 0.0 - ELSE - HEATR(J) = HEATR(J) + HEATR(K) - HEATR(K) = 0.0 - STC(K) = TFRZ - END IF - END IF - END DO - STC(J) = TFRZ + HEATR(J)*FACT(J) - END IF - END DO - END IF - -! NOW REMOVE EXCESS HEAT BY MELTING ICE - - IF (ANY(STC(1:4) > TFRZ) .AND. ANY(MICE(1:4) > 0.)) THEN - DO J = 1,NSOIL - IF ( STC(J) > TFRZ ) THEN - HEATR(J) = (STC(J)-TFRZ)/FACT(J) - XM(J) = HEATR(J)*DT/HFUS - DO K = 1,NSOIL - IF (J .NE. K .AND. MICE(K) > 0. .AND. XM(J) > 0.1) THEN - IF (MICE(K) > XM(J)) THEN ! LAYER ABSORBS ALL - MICE(K) = MICE(K) - XM(J) - XMF = XMF + HFUS * XM(J)/DT - STC(K) = TFRZ - XM(J) = 0.0 - ELSE - XM(J) = XM(J) - MICE(K) - XMF = XMF + HFUS * MICE(K)/DT - MICE(K) = 0.0 - STC(K) = TFRZ - END IF - MLIQ(K) = MAX(0.,WMASS0(K)-MICE(K)) - END IF - END DO - HEATR(J) = XM(J)*HFUS/DT - STC(J) = TFRZ + HEATR(J)*FACT(J) - END IF - END DO - END IF - -! NOW REMOVE EXCESS COLD BY FREEZING LIQUID OF LAYERS (MAY NOT BE NECESSARY WITH ABOVE LOOP) - - IF (ANY(STC(1:4) < TFRZ) .AND. ANY(MLIQ(1:4) > 0.)) THEN - DO J = 1,NSOIL - IF ( STC(J) < TFRZ ) THEN - HEATR(J) = (STC(J)-TFRZ)/FACT(J) - XM(J) = HEATR(J)*DT/HFUS - DO K = 1,NSOIL - IF (J .NE. K .AND. MLIQ(K) > 0. .AND. XM(J) < -0.1) THEN - IF (MLIQ(K) > ABS(XM(J))) THEN ! LAYER ABSORBS ALL - MICE(K) = MICE(K) - XM(J) - XMF = XMF + HFUS * XM(J)/DT - STC(K) = TFRZ - XM(J) = 0.0 - ELSE - XM(J) = XM(J) + MLIQ(K) - XMF = XMF - HFUS * MLIQ(K)/DT - MICE(K) = WMASS0(K) - STC(K) = TFRZ - END IF - MLIQ(K) = MAX(0.,WMASS0(K)-MICE(K)) - END IF - END DO - HEATR(J) = XM(J)*HFUS/DT - STC(J) = TFRZ + HEATR(J)*FACT(J) - END IF - END DO - END IF - -END IF ! OPT_GLA == 1 - - DO J = ISNOW+1,0 ! snow - SNLIQ(J) = MLIQ(J) - SNICE(J) = MICE(J) - END DO - - DO J = 1, NSOIL ! soil - IF(OPT_GLA == 1) THEN - SH2O(J) = MLIQ(J) / (1000. * DZSNSO(J)) - SH2O(J) = MAX(0.0,MIN(1.0,SH2O(J))) -! SMC(J) = (MLIQ(J) + MICE(J)) / (1000. * DZSNSO(J)) - ELSEIF(OPT_GLA == 2) THEN - SH2O(J) = 0.0 ! ice, assume all frozen...forever - END IF - SMC(J) = 1.0 - END DO - - END SUBROUTINE PHASECHANGE_GLACIER -! ================================================================================================== - SUBROUTINE WATER_GLACIER (NSNOW ,NSOIL ,IMELT ,DT ,PRCP ,SFCTMP , & !in - QVAP ,QDEW ,FICEOLD,ZSOIL , & !in - ISNOW ,SNOWH ,SNEQV ,SNICE ,SNLIQ ,STC , & !inout - DZSNSO ,SH2O ,SICE ,PONDING,ZSNSO ,FSH , & !inout - RUNSRF ,RUNSUB ,QSNOW ,PONDING1 ,PONDING2,QSNBOT,FPICE & !out -#ifdef WRF_HYDRO - , sfcheadrt & -#endif - ) !out -! ---------------------------------------------------------------------- -! Code history: -! Initial code: Guo-Yue Niu, Oct. 2007 -! ---------------------------------------------------------------------- - implicit none -! ---------------------------------------------------------------------- -! input - INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers - INTEGER, INTENT(IN) :: NSOIL !no. of soil layers - INTEGER, DIMENSION(-NSNOW+1:0) , INTENT(IN) :: IMELT !melting state index [1-melt; 2-freeze] - REAL, INTENT(IN) :: DT !main time step (s) - REAL, INTENT(IN) :: PRCP !precipitation (mm/s) - REAL, INTENT(IN) :: SFCTMP !surface air temperature [k] - REAL, INTENT(INOUT) :: QVAP !soil surface evaporation rate[mm/s] - REAL, INTENT(INOUT) :: QDEW !soil surface dew rate[mm/s] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: FICEOLD !ice fraction at last timestep - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: ZSOIL !layer-bottom depth from soil surf (m) - -! input/output - INTEGER, INTENT(INOUT) :: ISNOW !actual no. of snow layers - REAL, INTENT(INOUT) :: SNOWH !snow height [m] - REAL, INTENT(INOUT) :: SNEQV !snow water eqv. [mm] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNICE !snow layer ice [mm] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNLIQ !snow layer liquid water [mm] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow/soil layer temperature [k] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: DZSNSO !snow/soil layer thickness [m] - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SH2O !soil liquid water content [m3/m3] - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SICE !soil ice content [m3/m3] - REAL , INTENT(INOUT) :: PONDING ![mm] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: ZSNSO !layer-bottom depth from snow surf [m] - REAL , INTENT(INOUT) :: FSH !total sensible heat (w/m2) [+ to atm] - -! output - REAL, INTENT(OUT) :: RUNSRF !surface runoff [mm/s] - REAL, INTENT(OUT) :: RUNSUB !baseflow (sturation excess) [mm/s] - REAL, INTENT(OUT) :: QSNOW !snow at ground srf (mm/s) [+] - REAL, INTENT(OUT) :: PONDING1 - REAL, INTENT(OUT) :: PONDING2 - REAL, INTENT(OUT) :: QSNBOT !melting water out of snow bottom [mm/s] - REAL, INTENT(OUT) :: FPICE !precipitation frozen fraction - -! local - REAL :: QRAIN !rain at ground srf (mm) [+] - REAL :: QSEVA !soil surface evap rate [mm/s] - REAL :: QSDEW !soil surface dew rate [mm/s] - REAL :: QSNFRO !snow surface frost rate[mm/s] - REAL :: QSNSUB !snow surface sublimation rate [mm/s] - REAL :: SNOWHIN !snow depth increasing rate (m/s) - REAL :: SNOFLOW !glacier flow [mm/s] - REAL :: BDFALL !density of new snow (mm water/m snow) - REAL :: REPLACE !replacement water due to sublimation of glacier - REAL, DIMENSION( 1:NSOIL) :: SICE_SAVE !soil ice content [m3/m3] - REAL, DIMENSION( 1:NSOIL) :: SH2O_SAVE !soil liquid water content [m3/m3] - INTEGER :: ILEV - -#ifdef WRF_HYDRO - REAL , INTENT(INOUT) :: sfcheadrt -#endif - -! ---------------------------------------------------------------------- -! initialize - - SNOFLOW = 0. - RUNSUB = 0. - RUNSRF = 0. - SICE_SAVE = SICE - SH2O_SAVE = SH2O - -! -------------------------------------------------------------------- -! partition precipitation into rain and snow (from CANWATER) - -! Jordan (1991) - - IF(OPT_SNF == 1 .OR. OPT_SNF == 4) THEN - IF(SFCTMP > TFRZ+2.5)THEN - FPICE = 0. - ELSE - IF(SFCTMP <= TFRZ+0.5)THEN - FPICE = 1.0 - ELSE IF(SFCTMP <= TFRZ+2.)THEN - FPICE = 1.-(-54.632 + 0.2*SFCTMP) - ELSE - FPICE = 0.6 - ENDIF - ENDIF - ENDIF - - IF(OPT_SNF == 2) THEN - IF(SFCTMP >= TFRZ+2.2) THEN - FPICE = 0. - ELSE - FPICE = 1.0 - ENDIF - ENDIF - - IF(OPT_SNF == 3) THEN - IF(SFCTMP >= TFRZ) THEN - FPICE = 0. - ELSE - FPICE = 1.0 - ENDIF - ENDIF -! print*, 'fpice: ',fpice - -! Hedstrom NR and JW Pomeroy (1998), Hydrol. Processes, 12, 1611-1625 -! fresh snow density - - BDFALL = MIN(120.,67.92+51.25*EXP((SFCTMP-TFRZ)/2.59)) !MB: change to MIN v3.7 - - QRAIN = PRCP * (1.-FPICE) - QSNOW = PRCP * FPICE - SNOWHIN = QSNOW/BDFALL -! print *, 'qrain, qsnow',qrain,qsnow,qrain*dt,qsnow*dt - -! sublimation, frost, evaporation, and dew - - QSNSUB = QVAP ! send total sublimation/frost to SNOWWATER and deal with it there - QSNFRO = QDEW - - CALL SNOWWATER_GLACIER (NSNOW ,NSOIL ,IMELT ,DT ,SFCTMP , & !in - SNOWHIN,QSNOW ,QSNFRO ,QSNSUB ,QRAIN , & !in - FICEOLD,ZSOIL , & !in - ISNOW ,SNOWH ,SNEQV ,SNICE ,SNLIQ , & !inout - SH2O ,SICE ,STC ,DZSNSO ,ZSNSO , & !inout - FSH , & !inout - QSNBOT ,SNOFLOW,PONDING1 ,PONDING2) !out - - !PONDING: melting water from snow when there is no layer - - RUNSRF = (PONDING+PONDING1+PONDING2)/DT - - IF(ISNOW == 0) THEN - RUNSRF = RUNSRF + QSNBOT + QRAIN - ELSE - RUNSRF = RUNSRF + QSNBOT - ENDIF - -#ifdef WRF_HYDRO - RUNSRF = RUNSRF + sfcheadrt/DT !sfcheadrt units (mm) -#endif - - IF(OPT_GLA == 1) THEN - REPLACE = 0.0 - DO ILEV = 1,NSOIL - REPLACE = REPLACE + DZSNSO(ILEV)*(SICE(ILEV) - SICE_SAVE(ILEV) + SH2O(ILEV) - SH2O_SAVE(ILEV)) - END DO - REPLACE = REPLACE * 1000.0 / DT ! convert to [mm/s] - - SICE = MIN(1.0,SICE_SAVE) - ELSEIF(OPT_GLA == 2) THEN - SICE = 1.0 - END IF - SH2O = 1.0 - SICE - - ! use RUNSUB as a water balancer, SNOFLOW is snow that disappears, REPLACE is - ! water from below that replaces glacier loss - - IF(OPT_GLA == 1) THEN - RUNSUB = SNOFLOW + REPLACE - ELSEIF(OPT_GLA == 2) THEN - RUNSUB = SNOFLOW - QVAP = QSNSUB - QDEW = QSNFRO - END IF - - END SUBROUTINE WATER_GLACIER -! ================================================================================================== -! ---------------------------------------------------------------------- - SUBROUTINE SNOWWATER_GLACIER (NSNOW ,NSOIL ,IMELT ,DT ,SFCTMP , & !in - SNOWHIN,QSNOW ,QSNFRO ,QSNSUB ,QRAIN , & !in - FICEOLD,ZSOIL , & !in - ISNOW ,SNOWH ,SNEQV ,SNICE ,SNLIQ , & !inout - SH2O ,SICE ,STC ,DZSNSO ,ZSNSO , & !inout - FSH , & !inout - QSNBOT ,SNOFLOW,PONDING1 ,PONDING2) !out -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! input - INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers - INTEGER, INTENT(IN) :: NSOIL !no. of soil layers - INTEGER, DIMENSION(-NSNOW+1:0) , INTENT(IN) :: IMELT !melting state index [0-no melt;1-melt] - REAL, INTENT(IN) :: DT !time step (s) - REAL, INTENT(IN) :: SFCTMP !surface air temperature [k] - REAL, INTENT(IN) :: SNOWHIN!snow depth increasing rate (m/s) - REAL, INTENT(IN) :: QSNOW !snow at ground srf (mm/s) [+] - REAL, INTENT(INOUT) :: QSNFRO !snow surface frost rate[mm/s] - REAL, INTENT(INOUT) :: QSNSUB !snow surface sublimation rate[mm/s] - REAL, INTENT(IN) :: QRAIN !snow surface rain rate[mm/s] - REAL, DIMENSION(-NSNOW+1:0) , INTENT(IN) :: FICEOLD!ice fraction at last timestep - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: ZSOIL !layer-bottom depth from soil surf (m) - -! input & output - INTEGER, INTENT(INOUT) :: ISNOW !actual no. of snow layers - REAL, INTENT(INOUT) :: SNOWH !snow height [m] - REAL, INTENT(INOUT) :: SNEQV !snow water eqv. [mm] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNICE !snow layer ice [mm] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNLIQ !snow layer liquid water [mm] - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SH2O !soil liquid moisture (m3/m3) - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SICE !soil ice moisture (m3/m3) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow layer temperature [k] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: DZSNSO !snow/soil layer thickness [m] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: ZSNSO !layer-bottom depth from snow surf [m] - REAL , INTENT(INOUT) :: FSH !total sensible heat (w/m2) [+ to atm] - -! output - REAL, INTENT(OUT) :: QSNBOT !melting water out of snow bottom [mm/s] - REAL, INTENT(OUT) :: SNOFLOW!glacier flow [mm] - REAL, INTENT(OUT) :: PONDING1 - REAL, INTENT(OUT) :: PONDING2 - -! local - INTEGER :: IZ - REAL :: BDSNOW !bulk density of snow (kg/m3) -! ---------------------------------------------------------------------- - SNOFLOW = 0.0 - PONDING1 = 0.0 - PONDING2 = 0.0 - - CALL SNOWFALL_GLACIER (NSOIL ,NSNOW ,DT ,QSNOW ,SNOWHIN, & !in - SFCTMP , & !in - ISNOW ,SNOWH ,DZSNSO ,STC ,SNICE , & !inout - SNLIQ ,SNEQV ) !inout - - IF(ISNOW < 0) THEN !WHEN MORE THAN ONE LAYER - CALL COMPACT_GLACIER (NSNOW ,NSOIL ,DT ,STC ,SNICE , & !in - SNLIQ ,IMELT ,FICEOLD, & !in - ISNOW ,DZSNSO ) !inout - - CALL COMBINE_GLACIER (NSNOW ,NSOIL , & !in - ISNOW ,SH2O ,STC ,SNICE ,SNLIQ , & !inout - DZSNSO ,SICE ,SNOWH ,SNEQV , & !inout - PONDING1 ,PONDING2) !out - - CALL DIVIDE_GLACIER (NSNOW ,NSOIL , & !in - ISNOW ,STC ,SNICE ,SNLIQ ,DZSNSO ) !inout - END IF - -!SET EMPTY SNOW LAYERS TO ZERO - - DO IZ = -NSNOW+1, ISNOW - SNICE(IZ) = 0. - SNLIQ(IZ) = 0. - STC(IZ) = 0. - DZSNSO(IZ)= 0. - ZSNSO(IZ) = 0. - ENDDO - - CALL SNOWH2O_GLACIER (NSNOW ,NSOIL ,DT ,QSNFRO ,QSNSUB , & !in - QRAIN , & !in - ISNOW ,DZSNSO ,SNOWH ,SNEQV ,SNICE , & !inout - SNLIQ ,SH2O ,SICE ,STC , & !inout - PONDING1 ,PONDING2 ,FSH , & !inout - QSNBOT ) !out - -!to obtain equilibrium state of snow in glacier region - - IF(SNEQV > 5000.0) THEN ! 5000 mm -> maximum water depth - BDSNOW = SNICE(0) / DZSNSO(0) - SNOFLOW = (SNEQV - 5000.0) - SNICE(0) = SNICE(0) - SNOFLOW - DZSNSO(0) = DZSNSO(0) - SNOFLOW/BDSNOW - SNOFLOW = SNOFLOW / DT - END IF - -! sum up snow mass for layered snow - - IF(ISNOW /= 0) THEN - SNEQV = 0. - DO IZ = ISNOW+1,0 - SNEQV = SNEQV + SNICE(IZ) + SNLIQ(IZ) - ENDDO - END IF - -! Reset ZSNSO and layer thinkness DZSNSO - - DO IZ = ISNOW+1, 0 - DZSNSO(IZ) = -DZSNSO(IZ) - END DO - - DZSNSO(1) = ZSOIL(1) - DO IZ = 2,NSOIL - DZSNSO(IZ) = (ZSOIL(IZ) - ZSOIL(IZ-1)) - END DO - - ZSNSO(ISNOW+1) = DZSNSO(ISNOW+1) - DO IZ = ISNOW+2 ,NSOIL - ZSNSO(IZ) = ZSNSO(IZ-1) + DZSNSO(IZ) - ENDDO - - DO IZ = ISNOW+1 ,NSOIL - DZSNSO(IZ) = -DZSNSO(IZ) - END DO - - END SUBROUTINE SNOWWATER_GLACIER -! ================================================================================================== - SUBROUTINE SNOWFALL_GLACIER (NSOIL ,NSNOW ,DT ,QSNOW ,SNOWHIN , & !in - SFCTMP , & !in - ISNOW ,SNOWH ,DZSNSO ,STC ,SNICE , & !inout - SNLIQ ,SNEQV ) !inout -! ---------------------------------------------------------------------- -! snow depth and density to account for the new snowfall. -! new values of snow depth & density returned. -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! input - - INTEGER, INTENT(IN) :: NSOIL !no. of soil layers - INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers - REAL, INTENT(IN) :: DT !main time step (s) - REAL, INTENT(IN) :: QSNOW !snow at ground srf (mm/s) [+] - REAL, INTENT(IN) :: SNOWHIN!snow depth increasing rate (m/s) - REAL, INTENT(IN) :: SFCTMP !surface air temperature [k] - -! input and output - - INTEGER, INTENT(INOUT) :: ISNOW !actual no. of snow layers - REAL, INTENT(INOUT) :: SNOWH !snow depth [m] - REAL, INTENT(INOUT) :: SNEQV !swow water equivalent [m] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: DZSNSO !thickness of snow/soil layers (m) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow layer temperature [k] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNICE !snow layer ice [mm] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNLIQ !snow layer liquid water [mm] - -! local - - INTEGER :: NEWNODE ! 0-no new layers, 1-creating new layers -! ---------------------------------------------------------------------- - NEWNODE = 0 - -! shallow snow / no layer - - IF(ISNOW == 0 .and. QSNOW > 0.) THEN - SNOWH = SNOWH + SNOWHIN * DT - SNEQV = SNEQV + QSNOW * DT - END IF - -! creating a new layer - - IF(ISNOW == 0 .AND. QSNOW>0. .AND. SNOWH >= 0.05) THEN - ISNOW = -1 - NEWNODE = 1 - DZSNSO(0)= SNOWH - SNOWH = 0. - STC(0) = MIN(273.16, SFCTMP) ! temporary setup - SNICE(0) = SNEQV - SNLIQ(0) = 0. - END IF - -! snow with layers - - IF(ISNOW < 0 .AND. NEWNODE == 0 .AND. QSNOW > 0.) then - SNICE(ISNOW+1) = SNICE(ISNOW+1) + QSNOW * DT - DZSNSO(ISNOW+1) = DZSNSO(ISNOW+1) + SNOWHIN * DT - ENDIF - -! ---------------------------------------------------------------------- - END SUBROUTINE SNOWFALL_GLACIER -! ================================================================================================== -! ---------------------------------------------------------------------- - SUBROUTINE COMPACT_GLACIER (NSNOW ,NSOIL ,DT ,STC ,SNICE , & !in - SNLIQ ,IMELT ,FICEOLD, & !in - ISNOW ,DZSNSO ) !inout -! ---------------------------------------------------------------------- -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! input - INTEGER, INTENT(IN) :: NSOIL !no. of soil layers [ =4] - INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers [ =3] - INTEGER, DIMENSION(-NSNOW+1:0) , INTENT(IN) :: IMELT !melting state index [0-no melt;1-melt] - REAL, INTENT(IN) :: DT !time step (sec) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: STC !snow layer temperature [k] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: SNICE !snow layer ice [mm] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: SNLIQ !snow layer liquid water [mm] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: FICEOLD!ice fraction at last timestep - -! input and output - INTEGER, INTENT(INOUT) :: ISNOW ! actual no. of snow layers - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: DZSNSO ! snow layer thickness [m] - -! local - REAL, PARAMETER :: C2 = 21.e-3 ![m3/kg] ! default 21.e-3 - REAL, PARAMETER :: C3 = 2.5e-6 ![1/s] - REAL, PARAMETER :: C4 = 0.04 ![1/k] - REAL, PARAMETER :: C5 = 2.0 ! - REAL, PARAMETER :: DM = 100.0 !upper Limit on destructive metamorphism compaction [kg/m3] - REAL, PARAMETER :: ETA0 = 0.8e+6 !viscosity coefficient [kg-s/m2] - !according to Anderson, it is between 0.52e6~1.38e6 - REAL :: BURDEN !pressure of overlying snow [kg/m2] - REAL :: DDZ1 !rate of settling of snow pack due to destructive metamorphism. - REAL :: DDZ2 !rate of compaction of snow pack due to overburden. - REAL :: DDZ3 !rate of compaction of snow pack due to melt [1/s] - REAL :: DEXPF !EXPF=exp(-c4*(273.15-STC)). - REAL :: TD !STC - TFRZ [K] - REAL :: PDZDTC !nodal rate of change in fractional-thickness due to compaction [fraction/s] - REAL :: VOID !void (1 - SNICE - SNLIQ) - REAL :: WX !water mass (ice + liquid) [kg/m2] - REAL :: BI !partial density of ice [kg/m3] - REAL, DIMENSION(-NSNOW+1:0) :: FICE !fraction of ice at current time step - - INTEGER :: J - -! ---------------------------------------------------------------------- - BURDEN = 0.0 - - DO J = ISNOW+1, 0 - - WX = SNICE(J) + SNLIQ(J) - FICE(J) = SNICE(J) / WX - VOID = 1. - (SNICE(J)/DENICE + SNLIQ(J)/DENH2O) / DZSNSO(J) - - ! Allow compaction only for non-saturated node and higher ice lens node. - IF (VOID > 0.001 .AND. SNICE(J) > 0.1) THEN - BI = SNICE(J) / DZSNSO(J) - TD = MAX(0.,TFRZ-STC(J)) - DEXPF = EXP(-C4*TD) - - ! Settling as a result of destructive metamorphism - - DDZ1 = -C3*DEXPF - - IF (BI > DM) DDZ1 = DDZ1*EXP(-46.0E-3*(BI-DM)) - - ! Liquid water term - - IF (SNLIQ(J) > 0.01*DZSNSO(J)) DDZ1=DDZ1*C5 - - ! Compaction due to overburden - - DDZ2 = -(BURDEN+0.5*WX)*EXP(-0.08*TD-C2*BI)/ETA0 ! 0.5*WX -> self-burden - - ! Compaction occurring during melt - - IF (IMELT(J) == 1) THEN - DDZ3 = MAX(0.,(FICEOLD(J) - FICE(J))/MAX(1.E-6,FICEOLD(J))) - DDZ3 = - DDZ3/DT ! sometimes too large - ELSE - DDZ3 = 0. - END IF - - ! Time rate of fractional change in DZ (units of s-1) - - PDZDTC = (DDZ1 + DDZ2 + DDZ3)*DT - PDZDTC = MAX(-0.5,PDZDTC) - - ! The change in DZ due to compaction - - DZSNSO(J) = DZSNSO(J)*(1.+PDZDTC) - END IF - - ! Pressure of overlying snow - - BURDEN = BURDEN + WX - - END DO - - END SUBROUTINE COMPACT_GLACIER -! ================================================================================================== - SUBROUTINE COMBINE_GLACIER (NSNOW ,NSOIL , & !in - ISNOW ,SH2O ,STC ,SNICE ,SNLIQ , & !inout - DZSNSO ,SICE ,SNOWH ,SNEQV , & !inout - PONDING1 ,PONDING2) !inout -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! input - - INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers - INTEGER, INTENT(IN) :: NSOIL !no. of soil layers - -! input and output - - INTEGER, INTENT(INOUT) :: ISNOW !actual no. of snow layers - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SH2O !soil liquid moisture (m3/m3) - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SICE !soil ice moisture (m3/m3) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow layer temperature [k] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNICE !snow layer ice [mm] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNLIQ !snow layer liquid water [mm] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: DZSNSO!snow layer depth [m] - REAL, INTENT(INOUT) :: SNEQV !snow water equivalent [m] - REAL, INTENT(INOUT) :: SNOWH !snow depth [m] - REAL, INTENT(INOUT) :: PONDING1 - REAL, INTENT(INOUT) :: PONDING2 - -! local variables: - - INTEGER :: I,J,K,L ! node indices - INTEGER :: ISNOW_OLD ! number of top snow layer - INTEGER :: MSSI ! node index - INTEGER :: NEIBOR ! adjacent node selected for combination - REAL :: ZWICE ! total ice mass in snow - REAL :: ZWLIQ ! total liquid water in snow - REAL :: DZMIN(3) ! minimum of top snow layer - DATA DZMIN /0.045, 0.05, 0.2/ -! DATA DZMIN /0.025, 0.025, 0.1/ ! MB: change limit -!----------------------------------------------------------------------- - - ISNOW_OLD = ISNOW - - DO J = ISNOW_OLD+1,0 - IF (SNICE(J) <= .1) THEN - IF(J /= 0) THEN - SNLIQ(J+1) = SNLIQ(J+1) + SNLIQ(J) - SNICE(J+1) = SNICE(J+1) + SNICE(J) - ELSE - IF (ISNOW_OLD < -1) THEN - SNLIQ(J-1) = SNLIQ(J-1) + SNLIQ(J) - SNICE(J-1) = SNICE(J-1) + SNICE(J) - ELSE - PONDING1 = PONDING1 + SNLIQ(J) ! ISNOW WILL GET SET TO ZERO BELOW - SNEQV = SNICE(J) ! PONDING WILL GET ADDED TO PONDING FROM - SNOWH = DZSNSO(J) ! PHASECHANGE WHICH SHOULD BE ZERO HERE - SNLIQ(J) = 0.0 ! BECAUSE THERE IT WAS ONLY CALCULATED - SNICE(J) = 0.0 ! FOR THIN SNOW - DZSNSO(J) = 0.0 - ENDIF -! SH2O(1) = SH2O(1)+SNLIQ(J)/(DZSNSO(1)*1000.) -! SICE(1) = SICE(1)+SNICE(J)/(DZSNSO(1)*1000.) - ENDIF - - ! shift all elements above this down by one. - IF (J > ISNOW+1 .AND. ISNOW < -1) THEN - DO I = J, ISNOW+2, -1 - STC(I) = STC(I-1) - SNLIQ(I) = SNLIQ(I-1) - SNICE(I) = SNICE(I-1) - DZSNSO(I)= DZSNSO(I-1) - END DO - END IF - ISNOW = ISNOW + 1 - END IF - END DO - -! to conserve water in case of too large surface sublimation - - IF(SICE(1) < 0.) THEN - SH2O(1) = SH2O(1) + SICE(1) - SICE(1) = 0. - END IF - - IF(ISNOW ==0) RETURN ! MB: get out if no longer multi-layer - - SNEQV = 0. - SNOWH = 0. - ZWICE = 0. - ZWLIQ = 0. - - DO J = ISNOW+1,0 - SNEQV = SNEQV + SNICE(J) + SNLIQ(J) - SNOWH = SNOWH + DZSNSO(J) - ZWICE = ZWICE + SNICE(J) - ZWLIQ = ZWLIQ + SNLIQ(J) - END DO - -! check the snow depth - all snow gone -! the liquid water assumes ponding on soil surface. - -! IF (SNOWH < 0.025 .AND. ISNOW < 0 ) THEN ! MB: change limit - IF (SNOWH < 0.05 .AND. ISNOW < 0 ) THEN - ISNOW = 0 - SNEQV = ZWICE - PONDING2 = PONDING2 + ZWLIQ ! LIMIT OF ISNOW < 0 MEANS INPUT PONDING - IF(SNEQV <= 0.) SNOWH = 0. ! SHOULD BE ZERO; SEE ABOVE - END IF - -! IF (SNOWH < 0.05 ) THEN -! ISNOW = 0 -! SNEQV = ZWICE -! SH2O(1) = SH2O(1) + ZWLIQ / (DZSNSO(1) * 1000.) -! IF(SNEQV <= 0.) SNOWH = 0. -! END IF - -! check the snow depth - snow layers combined - - IF (ISNOW < -1) THEN - - ISNOW_OLD = ISNOW - MSSI = 1 - - DO I = ISNOW_OLD+1,0 - IF (DZSNSO(I) < DZMIN(MSSI)) THEN - - IF (I == ISNOW+1) THEN - NEIBOR = I + 1 - ELSE IF (I == 0) THEN - NEIBOR = I - 1 - ELSE - NEIBOR = I + 1 - IF ((DZSNSO(I-1)+DZSNSO(I)) < (DZSNSO(I+1)+DZSNSO(I))) NEIBOR = I-1 - END IF - - ! Node l and j are combined and stored as node j. - IF (NEIBOR > I) THEN - J = NEIBOR - L = I - ELSE - J = I - L = NEIBOR - END IF - - CALL COMBO_GLACIER (DZSNSO(J), SNLIQ(J), SNICE(J), & - STC(J), DZSNSO(L), SNLIQ(L), SNICE(L), STC(L) ) - - ! Now shift all elements above this down one. - IF (J-1 > ISNOW+1) THEN - DO K = J-1, ISNOW+2, -1 - STC(K) = STC(K-1) - SNICE(K) = SNICE(K-1) - SNLIQ(K) = SNLIQ(K-1) - DZSNSO(K) = DZSNSO(K-1) - END DO - END IF - - ! Decrease the number of snow layers - ISNOW = ISNOW + 1 - IF (ISNOW >= -1) EXIT - ELSE - - ! The layer thickness is greater than the prescribed minimum value - MSSI = MSSI + 1 - - END IF - END DO - - END IF - - END SUBROUTINE COMBINE_GLACIER -! ================================================================================================== - -! ---------------------------------------------------------------------- - SUBROUTINE COMBO_GLACIER(DZ, WLIQ, WICE, T, DZ2, WLIQ2, WICE2, T2) -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- - -! ----------------------------------------------------------------------s -! input - - REAL, INTENT(IN) :: DZ2 !nodal thickness of 2 elements being combined [m] - REAL, INTENT(IN) :: WLIQ2 !liquid water of element 2 [kg/m2] - REAL, INTENT(IN) :: WICE2 !ice of element 2 [kg/m2] - REAL, INTENT(IN) :: T2 !nodal temperature of element 2 [k] - REAL, INTENT(INOUT) :: DZ !nodal thickness of 1 elements being combined [m] - REAL, INTENT(INOUT) :: WLIQ !liquid water of element 1 - REAL, INTENT(INOUT) :: WICE !ice of element 1 [kg/m2] - REAL, INTENT(INOUT) :: T !node temperature of element 1 [k] - -! local - - REAL :: DZC !total thickness of nodes 1 and 2 (DZC=DZ+DZ2). - REAL :: WLIQC !combined liquid water [kg/m2] - REAL :: WICEC !combined ice [kg/m2] - REAL :: TC !combined node temperature [k] - REAL :: H !enthalpy of element 1 [J/m2] - REAL :: H2 !enthalpy of element 2 [J/m2] - REAL :: HC !temporary - -!----------------------------------------------------------------------- - - DZC = DZ+DZ2 - WICEC = (WICE+WICE2) - WLIQC = (WLIQ+WLIQ2) - H = (CICE*WICE+CWAT*WLIQ) * (T-TFRZ)+HFUS*WLIQ - H2= (CICE*WICE2+CWAT*WLIQ2) * (T2-TFRZ)+HFUS*WLIQ2 - - HC = H + H2 - IF(HC < 0.)THEN - TC = TFRZ + HC/(CICE*WICEC + CWAT*WLIQC) - ELSE IF (HC.LE.HFUS*WLIQC) THEN - TC = TFRZ - ELSE - TC = TFRZ + (HC - HFUS*WLIQC) / (CICE*WICEC + CWAT*WLIQC) - END IF - - DZ = DZC - WICE = WICEC - WLIQ = WLIQC - T = TC - - END SUBROUTINE COMBO_GLACIER -! ================================================================================================== - SUBROUTINE DIVIDE_GLACIER (NSNOW ,NSOIL , & !in - ISNOW ,STC ,SNICE ,SNLIQ ,DZSNSO ) !inout -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! input - - INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers [ =3] - INTEGER, INTENT(IN) :: NSOIL !no. of soil layers [ =4] - -! input and output - - INTEGER , INTENT(INOUT) :: ISNOW !actual no. of snow layers - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow layer temperature [k] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNICE !snow layer ice [mm] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNLIQ !snow layer liquid water [mm] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: DZSNSO!snow layer depth [m] - -! local variables: - - INTEGER :: J !indices - INTEGER :: MSNO !number of layer (top) to MSNO (bot) - REAL :: DRR !thickness of the combined [m] - REAL, DIMENSION( 1:NSNOW) :: DZ !snow layer thickness [m] - REAL, DIMENSION( 1:NSNOW) :: SWICE !partial volume of ice [m3/m3] - REAL, DIMENSION( 1:NSNOW) :: SWLIQ !partial volume of liquid water [m3/m3] - REAL, DIMENSION( 1:NSNOW) :: TSNO !node temperature [k] - REAL :: ZWICE !temporary - REAL :: ZWLIQ !temporary - REAL :: PROPOR!temporary - REAL :: DTDZ !temporary -! ---------------------------------------------------------------------- - - DO J = 1,NSNOW - IF (J <= ABS(ISNOW)) THEN - DZ(J) = DZSNSO(J+ISNOW) - SWICE(J) = SNICE(J+ISNOW) - SWLIQ(J) = SNLIQ(J+ISNOW) - TSNO(J) = STC(J+ISNOW) - END IF - END DO - - MSNO = ABS(ISNOW) - - IF (MSNO == 1) THEN - ! Specify a new snow layer - IF (DZ(1) > 0.05) THEN - MSNO = 2 - DZ(1) = DZ(1)/2. - SWICE(1) = SWICE(1)/2. - SWLIQ(1) = SWLIQ(1)/2. - DZ(2) = DZ(1) - SWICE(2) = SWICE(1) - SWLIQ(2) = SWLIQ(1) - TSNO(2) = TSNO(1) - END IF - END IF - - IF (MSNO > 1) THEN - IF (DZ(1) > 0.05) THEN - DRR = DZ(1) - 0.05 - PROPOR = DRR/DZ(1) - ZWICE = PROPOR*SWICE(1) - ZWLIQ = PROPOR*SWLIQ(1) - PROPOR = 0.05/DZ(1) - SWICE(1) = PROPOR*SWICE(1) - SWLIQ(1) = PROPOR*SWLIQ(1) - DZ(1) = 0.05 - - CALL COMBO_GLACIER (DZ(2), SWLIQ(2), SWICE(2), TSNO(2), DRR, & - ZWLIQ, ZWICE, TSNO(1)) - - ! subdivide a new layer -! IF (MSNO <= 2 .AND. DZ(2) > 0.20) THEN ! MB: change limit - IF (MSNO <= 2 .AND. DZ(2) > 0.10) THEN - MSNO = 3 - DTDZ = (TSNO(1) - TSNO(2))/((DZ(1)+DZ(2))/2.) - DZ(2) = DZ(2)/2. - SWICE(2) = SWICE(2)/2. - SWLIQ(2) = SWLIQ(2)/2. - DZ(3) = DZ(2) - SWICE(3) = SWICE(2) - SWLIQ(3) = SWLIQ(2) - TSNO(3) = TSNO(2) - DTDZ*DZ(2)/2. - IF (TSNO(3) >= TFRZ) THEN - TSNO(3) = TSNO(2) - ELSE - TSNO(2) = TSNO(2) + DTDZ*DZ(2)/2. - ENDIF - - END IF - END IF - END IF - - IF (MSNO > 2) THEN - IF (DZ(2) > 0.2) THEN - DRR = DZ(2) - 0.2 - PROPOR = DRR/DZ(2) - ZWICE = PROPOR*SWICE(2) - ZWLIQ = PROPOR*SWLIQ(2) - PROPOR = 0.2/DZ(2) - SWICE(2) = PROPOR*SWICE(2) - SWLIQ(2) = PROPOR*SWLIQ(2) - DZ(2) = 0.2 - CALL COMBO_GLACIER (DZ(3), SWLIQ(3), SWICE(3), TSNO(3), DRR, & - ZWLIQ, ZWICE, TSNO(2)) - END IF - END IF - - ISNOW = -MSNO - - DO J = ISNOW+1,0 - DZSNSO(J) = DZ(J-ISNOW) - SNICE(J) = SWICE(J-ISNOW) - SNLIQ(J) = SWLIQ(J-ISNOW) - STC(J) = TSNO(J-ISNOW) - END DO - - -! DO J = ISNOW+1,NSOIL -! WRITE(*,'(I5,7F10.3)') J, DZSNSO(J), SNICE(J), SNLIQ(J),STC(J) -! END DO - - END SUBROUTINE DIVIDE_GLACIER -! ================================================================================================== - SUBROUTINE SNOWH2O_GLACIER (NSNOW ,NSOIL ,DT ,QSNFRO ,QSNSUB , & !in - QRAIN , & !in - ISNOW ,DZSNSO ,SNOWH ,SNEQV ,SNICE , & !inout - SNLIQ ,SH2O ,SICE ,STC , & !inout - PONDING1 ,PONDING2 ,FSH , & !inout - QSNBOT ) !out -! ---------------------------------------------------------------------- -! Renew the mass of ice lens (SNICE) and liquid (SNLIQ) of the -! surface snow layer resulting from sublimation (frost) / evaporation (dew) -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! input - - INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers[=3] - INTEGER, INTENT(IN) :: NSOIL !No. of soil layers[=4] - REAL, INTENT(IN) :: DT !time step - REAL, INTENT(INOUT) :: QSNFRO !snow surface frost rate[mm/s] - REAL, INTENT(INOUT) :: QSNSUB !snow surface sublimation rate[mm/s] - REAL, INTENT(IN) :: QRAIN !snow surface rain rate[mm/s] - -! output - - REAL, INTENT(OUT) :: QSNBOT !melting water out of snow bottom [mm/s] - -! input and output - - INTEGER, INTENT(INOUT) :: ISNOW !actual no. of snow layers - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: DZSNSO ! snow layer depth [m] - REAL, INTENT(INOUT) :: SNOWH !snow height [m] - REAL, INTENT(INOUT) :: SNEQV !snow water eqv. [mm] - REAL, DIMENSION(-NSNOW+1:0), INTENT(INOUT) :: SNICE !snow layer ice [mm] - REAL, DIMENSION(-NSNOW+1:0), INTENT(INOUT) :: SNLIQ !snow layer liquid water [mm] - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SH2O !soil liquid moisture (m3/m3) - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SICE !soil ice moisture (m3/m3) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow layer temperature [k] - REAL, INTENT(INOUT) :: PONDING1 - REAL, INTENT(INOUT) :: PONDING2 - REAL, INTENT(INOUT) :: FSH !total sensible heat (w/m2) [+ to atm] - -! local variables: - - INTEGER :: J !do loop/array indices - REAL :: QIN !water flow into the element (mm/s) - REAL :: QOUT !water flow out of the element (mm/s) - REAL :: WGDIF !ice mass after minus sublimation - REAL, DIMENSION(-NSNOW+1:0) :: VOL_LIQ !partial volume of liquid water in layer - REAL, DIMENSION(-NSNOW+1:0) :: VOL_ICE !partial volume of ice lens in layer - REAL, DIMENSION(-NSNOW+1:0) :: EPORE !effective porosity = porosity - VOL_ICE - REAL :: PROPOR, TEMP -! ---------------------------------------------------------------------- - -!for the case when SNEQV becomes '0' after 'COMBINE' - - IF(SNEQV == 0.) THEN - IF(OPT_GLA == 1) THEN - SICE(1) = SICE(1) + (QSNFRO-QSNSUB)*DT/(DZSNSO(1)*1000.) - ELSEIF(OPT_GLA == 2) THEN - FSH = FSH - (QSNFRO-QSNSUB)*HSUB - QSNFRO = 0.0 - QSNSUB = 0.0 - END IF - END IF - -! for shallow snow without a layer -! snow surface sublimation may be larger than existing snow mass. To conserve water, -! excessive sublimation is used to reduce soil water. Smaller time steps would tend -! to aviod this problem. - - IF(ISNOW == 0 .and. SNEQV > 0.) THEN - IF(OPT_GLA == 1) THEN - TEMP = SNEQV - SNEQV = SNEQV - QSNSUB*DT + QSNFRO*DT - PROPOR = SNEQV/TEMP - SNOWH = MAX(0.,PROPOR * SNOWH) - ELSEIF(OPT_GLA == 2) THEN - FSH = FSH - (QSNFRO-QSNSUB)*HSUB - QSNFRO = 0.0 - QSNSUB = 0.0 - END IF - - IF(SNEQV < 0.) THEN - SICE(1) = SICE(1) + SNEQV/(DZSNSO(1)*1000.) - SNEQV = 0. - SNOWH = 0. - END IF - IF(SICE(1) < 0.) THEN - SH2O(1) = SH2O(1) + SICE(1) - SICE(1) = 0. - END IF - END IF - - IF(SNOWH <= 1.E-8 .OR. SNEQV <= 1.E-6) THEN - SNOWH = 0.0 - SNEQV = 0.0 - END IF - -! for deep snow - - IF ( ISNOW < 0 ) THEN !KWM added this IF statement to prevent out-of-bounds array references - - WGDIF = SNICE(ISNOW+1) - QSNSUB*DT + QSNFRO*DT - SNICE(ISNOW+1) = WGDIF - IF (WGDIF < 1.e-6 .and. ISNOW <0) THEN - CALL COMBINE_GLACIER (NSNOW ,NSOIL , & !in - ISNOW ,SH2O ,STC ,SNICE ,SNLIQ , & !inout - DZSNSO ,SICE ,SNOWH ,SNEQV , & !inout - PONDING1, PONDING2 ) !inout - ENDIF - !KWM: Subroutine COMBINE can change ISNOW to make it 0 again? - IF ( ISNOW < 0 ) THEN !KWM added this IF statement to prevent out-of-bounds array references - SNLIQ(ISNOW+1) = SNLIQ(ISNOW+1) + QRAIN * DT - SNLIQ(ISNOW+1) = MAX(0., SNLIQ(ISNOW+1)) - ENDIF - - ENDIF !KWM -- Can the ENDIF be moved toward the end of the subroutine (Just set QSNBOT=0)? - -! Porosity and partial volume - - !KWM Looks to me like loop index / IF test can be simplified. - - DO J = -NSNOW+1, 0 - IF (J >= ISNOW+1) THEN - VOL_ICE(J) = MIN(1., SNICE(J)/(DZSNSO(J)*DENICE)) - EPORE(J) = 1. - VOL_ICE(J) - VOL_LIQ(J) = MIN(EPORE(J),SNLIQ(J)/(DZSNSO(J)*DENH2O)) - END IF - END DO - - QIN = 0. - QOUT = 0. - - !KWM Looks to me like loop index / IF test can be simplified. - - DO J = -NSNOW+1, 0 - IF (J >= ISNOW+1) THEN - SNLIQ(J) = SNLIQ(J) + QIN - IF (J <= -1) THEN - IF (EPORE(J) < 0.05 .OR. EPORE(J+1) < 0.05) THEN - QOUT = 0. - ELSE - QOUT = MAX(0.,(VOL_LIQ(J)-SSI*EPORE(J))*DZSNSO(J)) - QOUT = MIN(QOUT,(1.-VOL_ICE(J+1)-VOL_LIQ(J+1))*DZSNSO(J+1)) - END IF - ELSE - QOUT = MAX(0.,(VOL_LIQ(J) - SSI*EPORE(J))*DZSNSO(J)) - END IF - QOUT = QOUT*1000. - SNLIQ(J) = SNLIQ(J) - QOUT - QIN = QOUT - END IF - END DO - -! Liquid water from snow bottom to soil - - QSNBOT = QOUT / DT ! mm/s - - END SUBROUTINE SNOWH2O_GLACIER -! ********************* end of water subroutines ****************************************** -! ================================================================================================== - SUBROUTINE ERROR_GLACIER (ILOC ,JLOC ,SWDOWN ,FSA ,FSR ,FIRA , & - FSH ,FGEV ,SSOIL ,SAG ,PRCP ,EDIR , & - RUNSRF ,RUNSUB ,SNEQV ,DT ,BEG_WB ) -! -------------------------------------------------------------------------------------------------- -! check surface energy balance and water balance -! -------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------------- -! inputs - INTEGER , INTENT(IN) :: ILOC !grid index - INTEGER , INTENT(IN) :: JLOC !grid index - REAL , INTENT(IN) :: SWDOWN !downward solar filtered by sun angle [w/m2] - REAL , INTENT(IN) :: FSA !total absorbed solar radiation (w/m2) - REAL , INTENT(IN) :: FSR !total reflected solar radiation (w/m2) - REAL , INTENT(IN) :: FIRA !total net longwave rad (w/m2) [+ to atm] - REAL , INTENT(IN) :: FSH !total sensible heat (w/m2) [+ to atm] - REAL , INTENT(IN) :: FGEV !ground evaporation heat (w/m2) [+ to atm] - REAL , INTENT(IN) :: SSOIL !ground heat flux (w/m2) [+ to soil] - REAL , INTENT(IN) :: SAG - - REAL , INTENT(IN) :: PRCP !precipitation rate (kg m-2 s-1) - REAL , INTENT(IN) :: EDIR !soil surface evaporation rate[mm/s] - REAL , INTENT(IN) :: RUNSRF !surface runoff [mm/s] - REAL , INTENT(IN) :: RUNSUB !baseflow (saturation excess) [mm/s] - REAL , INTENT(IN) :: SNEQV !snow water eqv. [mm] - REAL , INTENT(IN) :: DT !time step [sec] - REAL , INTENT(IN) :: BEG_WB !water storage at begin of a timesetp [mm] - - REAL :: END_WB !water storage at end of a timestep [mm] - REAL :: ERRWAT !error in water balance [mm/timestep] - REAL :: ERRENG !error in surface energy balance [w/m2] - REAL :: ERRSW !error in shortwave radiation balance [w/m2] - CHARACTER(len=256) :: message -! -------------------------------------------------------------------------------------------------- - ERRSW = SWDOWN - (FSA + FSR) - IF (ERRSW > 0.01) THEN ! w/m2 - WRITE(*,*) "SAG =",SAG - WRITE(*,*) "FSA =",FSA - WRITE(*,*) "FSR =",FSR - WRITE(message,*) 'ERRSW =',ERRSW - call wrf_message(trim(message)) - call wrf_error_fatal("Radiation budget problem in NOAHMP GLACIER") - END IF - - ERRENG = SAG-(FIRA+FSH+FGEV+SSOIL) - IF(ERRENG > 0.01) THEN - write(message,*) 'ERRENG =',ERRENG - call wrf_message(trim(message)) - WRITE(message,'(i6,1x,i6,1x,5F10.4)')ILOC,JLOC,SAG,FIRA,FSH,FGEV,SSOIL - call wrf_message(trim(message)) - call wrf_error_fatal("Energy budget problem in NOAHMP GLACIER") - END IF - - END_WB = SNEQV - ERRWAT = END_WB-BEG_WB-(PRCP-EDIR-RUNSRF-RUNSUB)*DT - -#ifndef WRF_HYDRO - IF(ABS(ERRWAT) > 0.1) THEN - if (ERRWAT > 0) then - call wrf_message ('The model is gaining water (ERRWAT is positive)') - else - call wrf_message('The model is losing water (ERRWAT is negative)') - endif - write(message, *) 'ERRWAT =',ERRWAT, "kg m{-2} timestep{-1}" - call wrf_message(trim(message)) - WRITE(message,'(" I J END_WB BEG_WB PRCP EDIR RUNSRF RUNSUB")') - call wrf_message(trim(message)) - WRITE(message,'(i6,1x,i6,1x,2f15.3,4f11.5)')ILOC,JLOC,END_WB,BEG_WB,PRCP*DT,& - EDIR*DT,RUNSRF*DT,RUNSUB*DT - call wrf_message(trim(message)) - call wrf_error_fatal("Water budget problem in NOAHMP GLACIER") - END IF -#endif - - END SUBROUTINE ERROR_GLACIER -! ================================================================================================== - - SUBROUTINE NOAHMP_OPTIONS_GLACIER(iopt_alb ,iopt_snf ,iopt_tbot, iopt_stc, iopt_gla ) - - IMPLICIT NONE - - INTEGER, INTENT(IN) :: iopt_alb !snow surface albedo (1->BATS; 2->CLASS) - 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) - ! 1 -> semi-implicit; 2 -> full implicit (original Noah) - INTEGER, INTENT(IN) :: IOPT_GLA ! glacier option (1->phase change; 2->simple) - -! ------------------------------------------------------------------------------------------------- - - opt_alb = iopt_alb - opt_snf = iopt_snf - opt_tbot = iopt_tbot - opt_stc = iopt_stc - opt_gla = iopt_gla - - end subroutine noahmp_options_glacier - -END MODULE NOAHMP_GLACIER_ROUTINES -! ================================================================================================== - -MODULE MODULE_SF_NOAHMP_GLACIER - - USE NOAHMP_GLACIER_ROUTINES - USE NOAHMP_GLACIER_GLOBALS - -END MODULE MODULE_SF_NOAHMP_GLACIER diff --git a/phys/module_sf_noahmp_groundwater.F b/phys/module_sf_noahmp_groundwater.F deleted file mode 100644 index 2980039570..0000000000 --- a/phys/module_sf_noahmp_groundwater.F +++ /dev/null @@ -1,614 +0,0 @@ -MODULE module_sf_noahmp_groundwater -!=============================================================================== -! Module to calculate lateral groundwater flow and the flux between groundwater and rivers -! plus the routine to update soil moisture and water table due to those two fluxes -! according to the Miguez-Macho & Fan groundwater scheme (Miguez-Macho et al., JGR 2007). -! Module written by Gonzalo Miguez-Macho , U. de Santiago de Compostela, Galicia, Spain -! November 2012 -!=============================================================================== - -CONTAINS - - SUBROUTINE WTABLE_mmf_noahmp (NSOIL ,XLAND ,XICE ,XICE_THRESHOLD ,ISICE ,& !in - ISLTYP ,SMOISEQ ,DZS ,WTDDT ,& !in - FDEPTH ,AREA ,TOPO ,ISURBAN ,IVGTYP ,& !in - RIVERCOND ,RIVERBED ,EQWTD ,PEXP ,& !in - SMOIS ,SH2OXY ,SMCWTD ,WTD , QLAT, QRF ,& !inout - DEEPRECH ,QSPRING ,QSLAT ,QRFS ,QSPRINGS ,RECH ,& !inout - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) - -! ---------------------------------------------------------------------- - USE NOAHMP_TABLES, ONLY: BEXP_TABLE, DKSAT_TABLE, SMCMAX_TABLE,PSISAT_TABLE, SMCWLT_TABLE -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! IN only - - INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, & - & ims,ime, jms,jme, kms,kme, & - & its,ite, jts,jte, kts,kte - REAL, INTENT(IN) :: WTDDT - REAL, INTENT(IN) :: XICE_THRESHOLD - INTEGER, INTENT(IN ) :: ISICE - REAL, DIMENSION( ims:ime, jms:jme ) , & - & INTENT(IN ) :: XLAND, & - XICE - INTEGER, DIMENSION( ims:ime, jms:jme ) , & - INTENT(IN ) :: ISLTYP, & - IVGTYP - INTEGER, INTENT(IN) :: nsoil - INTEGER, INTENT(IN) :: ISURBAN - REAL, DIMENSION( ims:ime , 1:nsoil, jms:jme ), & - & INTENT(IN) :: SMOISEQ - REAL, DIMENSION(1:nsoil), INTENT(IN) :: DZS - REAL, DIMENSION( ims:ime, jms:jme ) , & - & INTENT(IN) :: FDEPTH, & - AREA, & - TOPO, & - EQWTD, & - PEXP, & - RIVERBED, & - RIVERCOND - -! IN and OUT - - REAL, DIMENSION( ims:ime , 1:nsoil, jms:jme ), & - & INTENT(INOUT) :: SMOIS, & - & SH2OXY - - - REAL, DIMENSION( ims:ime, jms:jme ) , & - & INTENT(INOUT) :: WTD, & - SMCWTD, & - DEEPRECH, & - QSLAT, & - QRFS, & - QSPRINGS, & - RECH - -!OUT - - REAL, DIMENSION( ims:ime, jms:jme ) , & - & INTENT(OUT) :: QRF, & !groundwater - river water flux - QSPRING !water springing at the surface from groundwater convergence in the column - -!LOCAL - - INTEGER :: I,J,K - REAL, DIMENSION( 0:NSOIL) :: ZSOIL !depth of soil layer-bottom [m] - REAL, DIMENSION( 1:NSOIL) :: SMCEQ !equilibrium soil water content [m3/m3] - REAL, DIMENSION( 1:NSOIL) :: SMC,SH2O - REAL :: DELTAT,RCOND,TOTWATER,PSI & - ,WFLUXDEEP,WCNDDEEP,DDZ,SMCWTDMID & - ,WPLUS,WMINUS - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: QLAT - INTEGER, DIMENSION( ims:ime, jms:jme ) :: LANDMASK !-1 for water (ice or no ice) and glacial areas, 1 for land where the LSM does its soil moisture calculations. - - REAL :: BEXP,DKSAT,PSISAT,SMCMAX,SMCWLT - - DELTAT = WTDDT * 60. !timestep in seconds for this calculation - - ZSOIL(0) = 0. - ZSOIL(1) = -DZS(1) - DO K = 2, NSOIL - ZSOIL(K) = -DZS(K) + ZSOIL(K-1) - END DO - - WHERE(XLAND-1.5.LT.0..AND.XICE.LT. XICE_THRESHOLD.AND.IVGTYP.NE.ISICE) - LANDMASK=1 - ELSEWHERE - LANDMASK=-1 - ENDWHERE - -!Calculate lateral flow - - QLAT = 0. -CALL LATERALFLOW(ISLTYP,WTD,QLAT,FDEPTH,TOPO,LANDMASK,DELTAT,AREA & - ,ids,ide,jds,jde,kds,kde & - ,ims,ime,jms,jme,kms,kme & - ,its,ite,jts,jte,kts,kte ) - - -!compute flux from grounwater to rivers in the cell - - DO J=jts,jte - DO I=its,ite - IF(LANDMASK(I,J).GT.0)THEN - IF(WTD(I,J) .GT. RIVERBED(I,J) .AND. EQWTD(I,J) .GT. RIVERBED(I,J)) THEN - RCOND = RIVERCOND(I,J) * EXP(PEXP(I,J)*(WTD(I,J)-EQWTD(I,J))) - ELSE - RCOND = RIVERCOND(I,J) - ENDIF - QRF(I,J) = RCOND * (WTD(I,J)-RIVERBED(I,J)) * DELTAT/AREA(I,J) -!for now, dont allow it to go from river to groundwater - QRF(I,J) = MAX(QRF(I,J),0.) - ELSE - QRF(I,J) = 0. - ENDIF - ENDDO - ENDDO - - - DO J=jts,jte - DO I=its,ite - IF(LANDMASK(I,J).GT.0)THEN - - BEXP = BEXP_TABLE (ISLTYP(I,J)) - DKSAT = DKSAT_TABLE (ISLTYP(I,J)) - PSISAT = -1.0*PSISAT_TABLE (ISLTYP(I,J)) - SMCMAX = SMCMAX_TABLE (ISLTYP(I,J)) - SMCWLT = SMCWLT_TABLE (ISLTYP(I,J)) - - IF(IVGTYP(I,J)==ISURBAN)THEN - SMCMAX = 0.45 - SMCWLT = 0.40 - ENDIF - -!for deep water table calculate recharge - IF(WTD(I,J) < ZSOIL(NSOIL)-DZS(NSOIL))THEN -!assume all liquid if the wtd is deep - DDZ = ZSOIL(NSOIL)-WTD(I,J) - SMCWTDMID = 0.5 * (SMCWTD(I,J) + SMCMAX ) - PSI = PSISAT * ( SMCMAX / SMCWTD(I,J) ) ** BEXP - WCNDDEEP = DKSAT * ( SMCWTDMID / SMCMAX ) ** (2.0*BEXP + 3.0) - WFLUXDEEP = - DELTAT * WCNDDEEP * ( (PSISAT-PSI) / DDZ - 1.) -!update deep soil moisture - SMCWTD(I,J) = SMCWTD(I,J) + (DEEPRECH(I,J) - WFLUXDEEP) / DDZ - WPLUS = MAX((SMCWTD(I,J)-SMCMAX), 0.0) * DDZ - WMINUS = MAX((1.E-4-SMCWTD(I,J)), 0.0) * DDZ - SMCWTD(I,J) = MAX( MIN(SMCWTD(I,J),SMCMAX) , 1.E-4) - WFLUXDEEP = WFLUXDEEP + WPLUS - WMINUS - DEEPRECH(I,J) = WFLUXDEEP - ENDIF - - -!Total water flux to or from groundwater in the cell - TOTWATER = QLAT(I,J) - QRF(I,J) + DEEPRECH(I,J) - - SMC(1:NSOIL) = SMOIS(I,1:NSOIL,J) - SH2O(1:NSOIL) = SH2OXY(I,1:NSOIL,J) - SMCEQ(1:NSOIL) = SMOISEQ(I,1:NSOIL,J) - -!Update the water table depth and soil moisture - CALL UPDATEWTD ( NSOIL, DZS , ZSOIL, SMCEQ, SMCMAX, SMCWLT, PSISAT, BEXP ,I , J , &!in - TOTWATER, WTD(I,J), SMC, SH2O, SMCWTD(I,J) , &!inout - QSPRING(I,J) ) !out - -!now update soil moisture - SMOIS(I,1:NSOIL,J) = SMC(1:NSOIL) - SH2OXY(I,1:NSOIL,J) = SH2O(1:NSOIL) - - ENDIF - ENDDO - ENDDO - -!accumulate fluxes for output - - DO J=jts,jte - DO I=its,ite - QSLAT(I,J) = QSLAT(I,J) + QLAT(I,J)*1.E3 - QRFS(I,J) = QRFS(I,J) + QRF(I,J)*1.E3 - QSPRINGS(I,J) = QSPRINGS(I,J) + QSPRING(I,J)*1.E3 - RECH(I,J) = RECH(I,J) + DEEPRECH(I,J)*1.E3 -!zero out DEEPRECH - DEEPRECH(I,J) =0. - ENDDO - ENDDO - - -END SUBROUTINE WTABLE_mmf_noahmp -! ================================================================================================== -! ---------------------------------------------------------------------- - SUBROUTINE LATERALFLOW (ISLTYP,WTD,QLAT,FDEPTH,TOPO,LANDMASK,DELTAT,AREA & - ,ids,ide,jds,jde,kds,kde & - ,ims,ime,jms,jme,kms,kme & - ,its,ite,jts,jte,kts,kte ) -! ---------------------------------------------------------------------- - USE NOAHMP_TABLES, ONLY : DKSAT_TABLE -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! input - INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, & - & ims,ime, jms,jme, kms,kme, & - & its,ite, jts,jte, kts,kte - REAL , INTENT(IN) :: DELTAT - INTEGER, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: ISLTYP, LANDMASK - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: FDEPTH,WTD,TOPO,AREA - -!output - REAL, DIMENSION( ims:ime , jms:jme ), INTENT(OUT) :: QLAT - -!local - INTEGER :: I, J, itsh,iteh,jtsh,jteh - REAL :: Q,KLAT - REAL, DIMENSION( ims:ime , jms:jme ) :: KCELL, HEAD - - REAL, DIMENSION(19) :: KLATFACTOR - DATA KLATFACTOR /2.,3.,4.,10.,10.,12.,14.,20.,24.,28.,40.,48.,2.,0.,10.,0.,20.,2.,2./ - - REAL, PARAMETER :: PI = 3.14159265 - REAL, PARAMETER :: FANGLE = 0.22754493 ! = 0.5*sqrt(0.5*tan(pi/8)) - -itsh=max(its-1,ids) -iteh=min(ite+1,ide-1) -jtsh=max(jts-1,jds) -jteh=min(jte+1,jde-1) - - - DO J=jtsh,jteh - DO I=itsh,iteh - IF(FDEPTH(I,J).GT.0.)THEN - KLAT = DKSAT_TABLE(ISLTYP(I,J)) * KLATFACTOR(ISLTYP(I,J)) - IF(WTD(I,J) < -1.5)THEN - KCELL(I,J) = FDEPTH(I,J) * KLAT * EXP( (WTD(I,J) + 1.5) / FDEPTH(I,J) ) - ELSE - KCELL(I,J) = KLAT * ( WTD(I,J) + 1.5 + FDEPTH(I,J) ) - ENDIF - ELSE - KCELL(i,J) = 0. - ENDIF - - HEAD(I,J) = TOPO(I,J) + WTD(I,J) - ENDDO - ENDDO - -itsh=max(its,ids+1) -iteh=min(ite,ide-2) -jtsh=max(jts,jds+1) -jteh=min(jte,jde-2) - - DO J=jtsh,jteh - DO I=itsh,iteh - IF(LANDMASK(I,J).GT.0)THEN - Q=0. - - Q = Q + (KCELL(I-1,J+1)+KCELL(I,J)) & - * (HEAD(I-1,J+1)-HEAD(I,J))/SQRT(2.) - - Q = Q + (KCELL(I-1,J)+KCELL(I,J)) & - * (HEAD(I-1,J)-HEAD(I,J)) - - Q = Q + (KCELL(I-1,J-1)+KCELL(I,J)) & - * (HEAD(I-1,J-1)-HEAD(I,J))/SQRT(2.) - - Q = Q + (KCELL(I,J+1)+KCELL(I,J)) & - * (HEAD(I,J+1)-HEAD(I,J)) - - Q = Q + (KCELL(I,J-1)+KCELL(I,J)) & - * (HEAD(I,J-1)-HEAD(I,J)) - - Q = Q + (KCELL(I+1,J+1)+KCELL(I,J)) & - * (HEAD(I+1,J+1)-HEAD(I,J))/SQRT(2.) - - Q = Q + (KCELL(I+1,J)+KCELL(I,J)) & - * (HEAD(I+1,J)-HEAD(I,J)) - - Q = Q + (KCELL(I+1,J-1)+KCELL(I,J)) & - * (HEAD(I+1,J-1)-HEAD(I,J))/SQRT(2.) - - - QLAT(I,J) = FANGLE* Q * DELTAT / AREA(I,J) - ENDIF - ENDDO - ENDDO - - -END SUBROUTINE LATERALFLOW -! ================================================================================================== -! ---------------------------------------------------------------------- - SUBROUTINE UPDATEWTD (NSOIL, DZS, ZSOIL ,SMCEQ ,& !in - SMCMAX, SMCWLT, PSISAT, BEXP ,ILOC ,JLOC ,& !in - TOTWATER, WTD ,SMC, SH2O ,SMCWTD ,& !inout - QSPRING ) !out -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! input - INTEGER, INTENT(IN) :: NSOIL !no. of soil layers - INTEGER, INTENT(IN) :: ILOC, JLOC - REAL, INTENT(IN) :: SMCMAX - REAL, INTENT(IN) :: SMCWLT - REAL, INTENT(IN) :: PSISAT - REAL, INTENT(IN) :: BEXP - REAL, DIMENSION( 0:NSOIL), INTENT(IN) :: ZSOIL !depth of soil layer-bottom [m] - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: SMCEQ !equilibrium soil water content [m3/m3] - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: DZS ! soil layer thickness [m] -! input-output - REAL , INTENT(INOUT) :: TOTWATER - REAL , INTENT(INOUT) :: WTD - REAL , INTENT(INOUT) :: SMCWTD - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SMC - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SH2O -! output - REAL , INTENT(OUT) :: QSPRING -!local - INTEGER :: K - INTEGER :: K1 - INTEGER :: IWTD - INTEGER :: KWTD - REAL :: MAXWATUP, MAXWATDW ,WTDOLD - REAL :: WGPMID - REAL :: SYIELDDW - REAL :: DZUP - REAL :: SMCEQDEEP - REAL, DIMENSION( 1:NSOIL) :: SICE -! ------------------------------------------------------------- - - - - QSPRING=0. - - SICE = SMC - SH2O - -iwtd=1 - -!case 1: totwater > 0 (water table going up): -IF(totwater.gt.0.)then - - - if(wtd.ge.zsoil(nsoil))then - - do k=nsoil-1,1,-1 - if(wtd.lt.zsoil(k))exit - enddo - iwtd=k - kwtd=iwtd+1 - -!max water that fits in the layer - maxwatup=dzs(kwtd)*(smcmax-smc(kwtd)) - - if(totwater.le.maxwatup)then - smc(kwtd) = smc(kwtd) + totwater / dzs(kwtd) - smc(kwtd) = min(smc(kwtd),smcmax) - if(smc(kwtd).gt.smceq(kwtd))wtd = min ( ( smc(kwtd)*dzs(kwtd) & - - smceq(kwtd)*zsoil(iwtd) + smcmax*zsoil(kwtd) ) / & - ( smcmax-smceq(kwtd) ) , zsoil(iwtd) ) - totwater=0. - else !water enough to saturate the layer - smc(kwtd) = smcmax - totwater=totwater-maxwatup - k1=iwtd - do k=k1,0,-1 - wtd = zsoil(k) - iwtd=k-1 - if(k.eq.0)exit - maxwatup=dzs(k)*(smcmax-smc(k)) - if(totwater.le.maxwatup)then - smc(k) = smc(k) + totwater / dzs(k) - smc(k) = min(smc(k),smcmax) - if(smc(k).gt.smceq(k))wtd = min ( ( smc(k)*dzs(k) & - - smceq(k)*zsoil(iwtd) + smcmax*zsoil(k) ) / & - ( smcmax-smceq(k) ) , zsoil(iwtd) ) - totwater=0. - exit - else - smc(k) = smcmax - totwater=totwater-maxwatup - endif - - enddo - - endif - - elseif(wtd.ge.zsoil(nsoil)-dzs(nsoil))then ! wtd below bottom of soil model - - !gmmequilibrium soil moisture content - smceqdeep = smcmax * ( psisat / & - (psisat - dzs(nsoil)) ) ** (1./bexp) -! smceqdeep = max(smceqdeep,smcwlt) - smceqdeep = max(smceqdeep,1.E-4) - - maxwatup=(smcmax-smcwtd)*dzs(nsoil) - - if(totwater.le.maxwatup)then - smcwtd = smcwtd + totwater / dzs(nsoil) - smcwtd = min(smcwtd,smcmax) - if(smcwtd.gt.smceqdeep)wtd = min( ( smcwtd*dzs(nsoil) & - - smceqdeep*zsoil(nsoil) + smcmax*(zsoil(nsoil)-dzs(nsoil)) ) / & - ( smcmax-smceqdeep ) , zsoil(nsoil) ) - totwater=0. - else - smcwtd=smcmax - totwater=totwater-maxwatup - do k=nsoil,0,-1 - wtd=zsoil(k) - iwtd=k-1 - if(k.eq.0)exit - maxwatup=dzs(k)*(smcmax-smc(k)) - if(totwater.le.maxwatup)then - smc(k) = min(smc(k) + totwater / dzs(k),smcmax) - if(smc(k).gt.smceq(k))wtd = min ( ( smc(k)*dzs(k) & - - smceq(k)*zsoil(iwtd) + smcmax*zsoil(k) ) / & - ( smcmax-smceq(k) ) , zsoil(iwtd) ) - totwater=0. - exit - else - smc(k) = smcmax - totwater=totwater-maxwatup - endif - enddo - endif - -!deep water table - else - - maxwatup=(smcmax-smcwtd)*(zsoil(nsoil)-dzs(nsoil)-wtd) - if(totwater.le.maxwatup)then - wtd = wtd + totwater/(smcmax-smcwtd) - totwater=0. - else - totwater=totwater-maxwatup - wtd=zsoil(nsoil)-dzs(nsoil) - maxwatup=(smcmax-smcwtd)*dzs(nsoil) - if(totwater.le.maxwatup)then - - !gmmequilibrium soil moisture content - smceqdeep = smcmax * ( psisat / & - (psisat - dzs(nsoil)) ) ** (1./bexp) -! smceqdeep = max(smceqdeep,smcwlt) - smceqdeep = max(smceqdeep,1.E-4) - - smcwtd = smcwtd + totwater / dzs(nsoil) - smcwtd = min(smcwtd,smcmax) - wtd = ( smcwtd*dzs(nsoil) & - - smceqdeep*zsoil(nsoil) + smcmax*(zsoil(nsoil)-dzs(nsoil)) ) / & - ( smcmax-smceqdeep ) - totwater=0. - else - smcwtd=smcmax - totwater=totwater-maxwatup - do k=nsoil,0,-1 - wtd=zsoil(k) - iwtd=k-1 - if(k.eq.0)exit - maxwatup=dzs(k)*(smcmax-smc(k)) - - if(totwater.le.maxwatup)then - smc(k) = smc(k) + totwater / dzs(k) - smc(k) = min(smc(k),smcmax) - if(smc(k).gt.smceq(k))wtd = ( smc(k)*dzs(k) & - - smceq(k)*zsoil(iwtd) + smcmax*zsoil(k) ) / & - ( smcmax-smceq(k) ) - totwater=0. - exit - else - smc(k) = smcmax - totwater=totwater-maxwatup - endif - enddo - endif - endif - endif - -!water springing at the surface - qspring=totwater - -!case 2: totwater < 0 (water table going down): -ELSEIF(totwater.lt.0.)then - - - if(wtd.ge.zsoil(nsoil))then !wtd in the resolved layers - - do k=nsoil-1,1,-1 - if(wtd.lt.zsoil(k))exit - enddo - iwtd=k - - k1=iwtd+1 - do kwtd=k1,nsoil - -!max water that the layer can yield - maxwatdw=dzs(kwtd)*(smc(kwtd)-max(smceq(kwtd),sice(kwtd))) - - if(-totwater.le.maxwatdw)then - smc(kwtd) = smc(kwtd) + totwater / dzs(kwtd) - if(smc(kwtd).gt.smceq(kwtd))then - wtd = ( smc(kwtd)*dzs(kwtd) & - - smceq(kwtd)*zsoil(iwtd) + smcmax*zsoil(kwtd) ) / & - ( smcmax-smceq(kwtd) ) - else - wtd=zsoil(kwtd) - iwtd=iwtd+1 - endif - totwater=0. - exit - else - wtd = zsoil(kwtd) - iwtd=iwtd+1 - if(maxwatdw.ge.0.)then - smc(kwtd) = smc(kwtd) + maxwatdw / dzs(kwtd) - totwater = totwater + maxwatdw - endif - endif - - enddo - - if(iwtd.eq.nsoil.and.totwater.lt.0.)then - !gmmequilibrium soil moisture content - smceqdeep = smcmax * ( psisat / & - (psisat - dzs(nsoil)) ) ** (1./bexp) -! smceqdeep = max(smceqdeep,smcwlt) - smceqdeep = max(smceqdeep,1.E-4) - - maxwatdw=dzs(nsoil)*(smcwtd-smceqdeep) - - if(-totwater.le.maxwatdw)then - - smcwtd = smcwtd + totwater / dzs(nsoil) - wtd = max( ( smcwtd*dzs(nsoil) & - - smceqdeep*zsoil(nsoil) + smcmax*(zsoil(nsoil)-dzs(nsoil)) ) / & - ( smcmax-smceqdeep ) , zsoil(nsoil)-dzs(nsoil) ) - - else - - wtd=zsoil(nsoil)-dzs(nsoil) - smcwtd = smcwtd + totwater / dzs(nsoil) -!and now even further down - dzup=(smceqdeep-smcwtd)*dzs(nsoil)/(smcmax-smceqdeep) - wtd=wtd-dzup - smcwtd=smceqdeep - - endif - - endif - - - - elseif(wtd.ge.zsoil(nsoil)-dzs(nsoil))then - -!if wtd was already below the bottom of the resolved soil crust - !gmmequilibrium soil moisture content - smceqdeep = smcmax * ( psisat / & - (psisat - dzs(nsoil)) ) ** (1./bexp) -! smceqdeep = max(smceqdeep,smcwlt) - smceqdeep = max(smceqdeep,1.E-4) - - maxwatdw=dzs(nsoil)*(smcwtd-smceqdeep) - - if(-totwater.le.maxwatdw)then - - smcwtd = smcwtd + totwater / dzs(nsoil) - wtd = max( ( smcwtd*dzs(nsoil) & - - smceqdeep*zsoil(nsoil) + smcmax*(zsoil(nsoil)-dzs(nsoil)) ) / & - ( smcmax-smceqdeep ) , zsoil(nsoil)-dzs(nsoil) ) - - else - - wtd=zsoil(nsoil)-dzs(nsoil) - smcwtd = smcwtd + totwater / dzs(nsoil) -!and now even further down - dzup=(smceqdeep-smcwtd)*dzs(nsoil)/(smcmax-smceqdeep) - wtd=wtd-dzup - smcwtd=smceqdeep - - endif - - else -!gmmequilibrium soil moisture content - wgpmid = smcmax * ( psisat / & - (psisat - (zsoil(nsoil)-wtd)) ) ** (1./bexp) -! wgpmid=max(wgpmid,smcwlt) - wgpmid=max(wgpmid,1.E-4) - syielddw=smcmax-wgpmid - wtdold=wtd - wtd = wtdold + totwater/syielddw -!update wtdwgp - smcwtd = (smcwtd*(zsoil(nsoil)-wtdold)+wgpmid*(wtdold-wtd) ) / (zsoil(nsoil)-wtd) - - endif - - qspring=0. - -ENDIF - - SH2O = SMC - SICE - - -END SUBROUTINE UPDATEWTD - -! ---------------------------------------------------------------------- - -END MODULE module_sf_noahmp_groundwater diff --git a/phys/module_sf_noahmpdrv.F b/phys/module_sf_noahmpdrv.F deleted file mode 100644 index 7a0f0ab510..0000000000 --- a/phys/module_sf_noahmpdrv.F +++ /dev/null @@ -1,3726 +0,0 @@ -MODULE module_sf_noahmpdrv - -!------------------------------- -#if ( WRF_CHEM == 1 ) - USE module_data_gocart_dust -#endif -!------------------------------- - -! -CONTAINS -! - SUBROUTINE noahmplsm(ITIMESTEP, YR, JULIAN, COSZIN,XLAT,XLONG, & ! IN : Time/Space-related - DZ8W, DT, DZS, NSOIL, DX, & ! IN : Model configuration - IVGTYP, ISLTYP, VEGFRA, VEGMAX, TMN, & ! IN : Vegetation/Soil characteristics - XLAND, XICE,XICE_THRES, CROPCAT, & ! IN : Vegetation/Soil characteristics - PLANTING, HARVEST,SEASON_GDD, & - IDVEG, IOPT_CRS, IOPT_BTR, IOPT_RUN, IOPT_SFC, IOPT_FRZ, & ! IN : User options - IOPT_INF, IOPT_RAD, IOPT_ALB, IOPT_SNF,IOPT_TBOT, IOPT_STC, & ! IN : User options - IOPT_GLA, IOPT_RSF, IOPT_SOIL,IOPT_PEDO,IOPT_CROP, IOPT_IRR, & ! IN : User options - IOPT_IRRM, IOPT_INFDV, IOPT_TDRN,soiltstep, & ! IN : User options - IZ0TLND, SF_URBAN_PHYSICS, & ! IN : User options - SOILCOMP, SOILCL1, SOILCL2, SOILCL3, SOILCL4, & ! IN : User options - T3D, QV3D, U_PHY, V_PHY, SWDOWN, SWDDIR,& - SWDDIF, GLW, & ! IN : Forcing - P8W3D,PRECIP_IN, SR, & ! IN : Forcing - IRFRACT, SIFRACT, MIFRACT, FIFRACT, & ! IN : Noah MP only - TSK, HFX, QFX, LH, GRDFLX, SMSTAV, & ! IN/OUT LSM eqv - SMSTOT,SFCRUNOFF, UDRUNOFF, ALBEDO, SNOWC, SMOIS, & ! IN/OUT LSM eqv - SH2O, TSLB, SNOW, SNOWH, CANWAT, ACSNOM, & ! IN/OUT LSM eqv - ACSNOW, EMISS, QSFC, & ! IN/OUT LSM eqv - Z0, ZNT, & ! IN/OUT LSM eqv - IRNUMSI, IRNUMMI, IRNUMFI, IRWATSI, IRWATMI, IRWATFI, & ! IN/OUT Noah MP only - IRELOSS, IRSIVOL, IRMIVOL, IRFIVOL, IRRSPLH, LLANDUSE, & ! IN/OUT Noah MP only - ISNOWXY, TVXY, TGXY, CANICEXY, CANLIQXY, EAHXY, & ! IN/OUT Noah MP only - TAHXY, CMXY, CHXY, FWETXY, SNEQVOXY, ALBOLDXY, & ! IN/OUT Noah MP only - QSNOWXY, QRAINXY, WSLAKEXY, ZWTXY, WAXY, WTXY, TSNOXY, & ! IN/OUT Noah MP only - ZSNSOXY, SNICEXY, SNLIQXY, LFMASSXY, RTMASSXY, STMASSXY, & ! IN/OUT Noah MP only - WOODXY, STBLCPXY, FASTCPXY, XLAIXY, XSAIXY, TAUSSXY, & ! IN/OUT Noah MP only - SMOISEQ, SMCWTDXY,DEEPRECHXY, RECHXY, GRAINXY, GDDXY,PGSXY, & ! IN/OUT Noah MP only - GECROS_STATE, & ! IN/OUT gecros model - QTDRAIN, TD_FRACTION, & ! IN/OUT tile drainage - T2MVXY, T2MBXY, Q2MVXY, Q2MBXY, & ! OUT Noah MP only - TRADXY, NEEXY, GPPXY, NPPXY, FVEGXY, RUNSFXY, & ! OUT Noah MP only - RUNSBXY, ECANXY, EDIRXY, ETRANXY, FSAXY, FIRAXY, & ! OUT Noah MP only - APARXY, PSNXY, SAVXY, SAGXY, RSSUNXY, RSSHAXY, & ! OUT Noah MP only - BGAPXY, WGAPXY, TGVXY, TGBXY, CHVXY, CHBXY, & ! OUT Noah MP only - SHGXY, SHCXY, SHBXY, EVGXY, EVBXY, GHVXY, & ! OUT Noah MP only - GHBXY, IRGXY, IRCXY, IRBXY, TRXY, EVCXY, & ! OUT Noah MP only - CHLEAFXY, CHUCXY, CHV2XY, CHB2XY, RS, & ! OUT Noah MP only - QINTSXY ,QINTRXY ,QDRIPSXY ,& - QDRIPRXY ,QTHROSXY ,QTHRORXY ,& - QSNSUBXY ,QSNFROXY ,QSUBCXY ,& - QFROCXY ,QEVACXY ,QDEWCXY ,QFRZCXY ,QMELTCXY ,& - QSNBOTXY ,PONDINGXY ,PAHXY ,PAHGXY, PAHVXY, PAHBXY,& - FPICEXY,RAINLSM,SNOWLSM,FORCTLSM ,FORCQLSM,FORCPLSM,FORCZLSM,FORCWLSM,& - ACC_SSOILXY, ACC_QINSURXY, ACC_QSEVAXY, ACC_ETRANIXY, EFLXBXY, & - SOILENERGY, SNOWENERGY, CANHSXY, & - ACC_DWATERXY, ACC_PRCPXY, ACC_ECANXY, ACC_ETRANXY, ACC_EDIRXY, & -! BEXP_3D,SMCDRY_3D,SMCWLT_3D,SMCREF_3D,SMCMAX_3D, & ! placeholders to activate 3D soil -! DKSAT_3D,DWSAT_3D,PSISAT_3D,QUARTZ_3D, & -! REFDK_2D,REFKDT_2D, & -! IRR_FRAC_2D,IRR_HAR_2D,IRR_LAI_2D,IRR_MAD_2D,FILOSS_2D, & -! SPRIR_RATE_2D,MICIR_RATE_2D,FIRTFAC_2D,IR_RAIN_2D, & -! BVIC_2D,AXAJ_2D,BXAJ_2D,XXAJ_2D,BDVIC_2D,GDVIC_2D,BBVIC_2D,& -! KLAT_FAC,TDSMC_FAC,TD_DC,TD_DCOEF,TD_DDRAIN,TD_RADI,TD_SPAC, & -#ifdef WRF_HYDRO - sfcheadrt,INFXSRT,soldrain,qtiledrain,ZWATBLE2D, & -#endif - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte, & - MP_RAINC, MP_RAINNC, MP_SHCV, MP_SNOW, MP_GRAUP, MP_HAIL ) -!---------------------------------------------------------------- - USE MODULE_SF_NOAHMPLSM -! USE MODULE_SF_NOAHMPLSM, only: noahmp_options, NOAHMP_SFLX, noahmp_parameters - USE module_sf_noahmp_glacier - USE NOAHMP_TABLES, ONLY: ISICE_TABLE, CO2_TABLE, O2_TABLE, DEFAULT_CROP_TABLE, ISCROP_TABLE, ISURBAN_TABLE, NATURAL_TABLE, & - LCZ_1_TABLE,LCZ_2_TABLE,LCZ_3_TABLE,LCZ_4_TABLE,LCZ_5_TABLE,LCZ_6_TABLE,LCZ_7_TABLE,LCZ_8_TABLE, & - LCZ_9_TABLE,LCZ_10_TABLE,LCZ_11_TABLE - - USE module_sf_urban, only: IRI_SCHEME - USE module_ra_gfdleta, only: cal_mon_day -!---------------------------------------------------------------- - IMPLICIT NONE -!---------------------------------------------------------------- - -! IN only - - INTEGER, INTENT(IN ) :: ITIMESTEP ! timestep number - INTEGER, INTENT(IN ) :: YR ! 4-digit year - REAL, INTENT(IN ) :: JULIAN ! Julian day - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: COSZIN ! cosine zenith angle - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: XLAT ! latitude [rad] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: XLONG ! latitude [rad] - REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: DZ8W ! thickness of atmo layers [m] - REAL, INTENT(IN ) :: DT ! timestep [s] - REAL, DIMENSION(1:nsoil), INTENT(IN ) :: DZS ! thickness of soil layers [m] - INTEGER, INTENT(IN ) :: NSOIL ! number of soil layers - REAL, INTENT(IN ) :: DX ! horizontal grid spacing [m] - INTEGER, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: IVGTYP ! vegetation type - INTEGER, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: ISLTYP ! soil type - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: VEGFRA ! vegetation fraction [] - REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN ) :: VEGMAX ! annual max vegetation fraction [] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: TMN ! deep soil temperature [K] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: XLAND ! =2 ocean; =1 land/seaice - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: XICE ! fraction of grid that is seaice - REAL, INTENT(IN ) :: XICE_THRES! fraction of grid determining seaice - INTEGER, INTENT(IN ) :: IDVEG ! dynamic vegetation (1 -> off ; 2 -> on) with opt_crs = 1 - INTEGER, INTENT(IN ) :: IOPT_CRS ! canopy stomatal resistance (1-> Ball-Berry; 2->Jarvis) - INTEGER, INTENT(IN ) :: IOPT_BTR ! soil moisture factor for stomatal resistance (1-> Noah; 2-> CLM; 3-> SSiB) - INTEGER, INTENT(IN ) :: IOPT_RUN ! runoff and groundwater (1->SIMGM; 2->SIMTOP; 3->Schaake96; 4->BATS) - INTEGER, INTENT(IN ) :: IOPT_SFC ! surface layer drag coeff (CH & CM) (1->M-O; 2->Chen97) - 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_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 - INTEGER, INTENT(IN ) :: IOPT_GLA ! glacier option (1->phase change; 2->simple) - INTEGER, INTENT(IN ) :: IOPT_RSF ! surface resistance (1->Sakaguchi/Zeng; 2->Seller; 3->mod Sellers; 4->1+snow) - INTEGER, INTENT(IN ) :: IOPT_SOIL ! soil configuration option - INTEGER, INTENT(IN ) :: IOPT_PEDO ! soil pedotransfer function option - INTEGER, INTENT(IN ) :: IOPT_CROP ! crop model option (0->none; 1->Liu et al.; 2->Gecros) - INTEGER, INTENT(IN ) :: IOPT_IRR ! irrigation scheme (0->none; >1 irrigation scheme ON) - INTEGER, INTENT(IN ) :: IOPT_IRRM ! irrigation method - INTEGER, INTENT(IN ) :: IOPT_INFDV! infiltration options for dynamic VIC infiltration (1->Philip; 2-> Green-Ampt;3->Smith-Parlange) - INTEGER, INTENT(IN ) :: IOPT_TDRN ! tile drainage (0-> no tile drainage; 1-> simple tile drainage;2->Hooghoudt's) - REAL, INTENT(IN ) :: soiltstep ! soil timestep (s), default:0->same as main model timestep - INTEGER, INTENT(IN ) :: IZ0TLND ! option of Chen adjustment of Czil (not used) - INTEGER, INTENT(IN ) :: sf_urban_physics ! urban physics option - REAL, DIMENSION( ims:ime, 8, jms:jme ), INTENT(IN ) :: SOILCOMP ! soil sand and clay percentage - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: SOILCL1 ! soil texture in layer 1 - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: SOILCL2 ! soil texture in layer 2 - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: SOILCL3 ! soil texture in layer 3 - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: SOILCL4 ! soil texture in layer 4 - REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: T3D ! 3D atmospheric temperature valid at mid-levels [K] - REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: QV3D ! 3D water vapor mixing ratio [kg/kg_dry] - REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: U_PHY ! 3D U wind component [m/s] - REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: V_PHY ! 3D V wind component [m/s] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: SWDOWN ! solar down at surface [W m-2] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: SWDDIF ! solar down at surface [W m-2] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: SWDDIR ! solar down at surface [W m-2] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: GLW ! longwave down at surface [W m-2] - REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: P8W3D ! 3D pressure, valid at interface [Pa] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: PRECIP_IN ! total input precipitation [mm] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: SR ! frozen precipitation ratio [-] - -!Optional Detailed Precipitation Partitioning Inputs - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ), OPTIONAL :: MP_RAINC ! convective precipitation entering land model [mm] ! MB/AN : v3.7 - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ), OPTIONAL :: MP_RAINNC ! large-scale precipitation entering land model [mm]! MB/AN : v3.7 - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ), OPTIONAL :: MP_SHCV ! shallow conv precip entering land model [mm] ! MB/AN : v3.7 - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ), OPTIONAL :: MP_SNOW ! snow precipitation entering land model [mm] ! MB/AN : v3.7 - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ), OPTIONAL :: MP_GRAUP ! graupel precipitation entering land model [mm] ! MB/AN : v3.7 - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ), OPTIONAL :: MP_HAIL ! hail precipitation entering land model [mm] ! MB/AN : v3.7 - -! Crop Model - INTEGER, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: CROPCAT ! crop catagory - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: PLANTING ! planting date - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: HARVEST ! harvest date - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: SEASON_GDD! growing season GDD - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: GRAINXY ! mass of grain XING [g/m2] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: GDDXY ! growing degree days XING (based on 10C) - INTEGER, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: PGSXY - -! gecros model - REAL, DIMENSION( ims:ime, 60,jms:jme ), INTENT(INOUT) :: gecros_state ! gecros crop - -!Tile drain variables - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: QTDRAIN - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: TD_FRACTION - -#ifdef WRF_HYDRO - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: sfcheadrt,INFXSRT,soldrain,qtiledrain,ZWATBLE2D ! for WRF-Hydro -#endif -! placeholders for 3D soil -! REAL, DIMENSION( ims:ime, 1:nsoil, jms:jme ), INTENT(IN) :: BEXP_3D ! C-H B exponent -! REAL, DIMENSION( ims:ime, 1:nsoil, jms:jme ), INTENT(IN) :: SMCDRY_3D ! Soil Moisture Limit: Dry -! REAL, DIMENSION( ims:ime, 1:nsoil, jms:jme ), INTENT(IN) :: SMCWLT_3D ! Soil Moisture Limit: Wilt -! REAL, DIMENSION( ims:ime, 1:nsoil, jms:jme ), INTENT(IN) :: SMCREF_3D ! Soil Moisture Limit: Reference -! REAL, DIMENSION( ims:ime, 1:nsoil, jms:jme ), INTENT(IN) :: SMCMAX_3D ! Soil Moisture Limit: Max -! REAL, DIMENSION( ims:ime, 1:nsoil, jms:jme ), INTENT(IN) :: DKSAT_3D ! Saturated Soil Conductivity -! REAL, DIMENSION( ims:ime, 1:nsoil, jms:jme ), INTENT(IN) :: DWSAT_3D ! Saturated Soil Diffusivity -! REAL, DIMENSION( ims:ime, 1:nsoil, jms:jme ), INTENT(IN) :: PSISAT_3D ! Saturated Matric Potential -! REAL, DIMENSION( ims:ime, 1:nsoil, jms:jme ), INTENT(IN) :: QUARTZ_3D ! Soil quartz content -! REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: REFDK_2D ! Reference Soil Conductivity -! REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: REFKDT_2D ! Soil Infiltration Parameter -! REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: BVIC_2D ! VIC model infiltration parameter [-] for opt_run=6 -! REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: AXAJ_2D ! Xinanjiang: Tension water distribution inflection parameter [-] for opt_run=7 -! REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: BXAJ_2D ! Xinanjiang: Tension water distribution shape parameter [-] for opt_run=7 -! REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: XXAJ_2D ! Xinanjiang: Free water distribution shape parameter [-] for opt_run=7 -! REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: BDVIC_2D ! VIC model infiltration parameter [-] -! REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: GDVIC_2D ! Mean Capillary Drive (m) for infiltration models -! REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: BBVIC_2D ! DVIC heterogeniety paramater [-] - -! placeholders for 2D irrigation parameters -! REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: IRR_FRAC_2D ! irrigation Fraction -! REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: IRR_HAR_2D ! number of days before harvest date to stop irrigation -! REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: IRR_LAI_2D ! Minimum lai to trigger irrigation -! REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: IRR_MAD_2D ! management allowable deficit (0-1) -! REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: FILOSS_2D ! fraction of flood irrigation loss (0-1) -! REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: SPRIR_RATE_2D ! mm/h, sprinkler irrigation rate -! REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: MICIR_RATE_2D ! mm/h, micro irrigation rate -! REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: FIRTFAC_2D ! flood application rate factor -! REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: IR_RAIN_2D ! maximum precipitation to stop irrigation trigger - -! placeholders for 2D tile drainage parameters -! REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: KLAT_FAC ! factor multiplier to hydraulic conductivity -! REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: TDSMC_FAC ! factor multiplier to field capacity -! REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: TD_DC ! drainage coefficient for simple -! REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: TD_DCOEF ! drainge coefficient for Hooghoudt -! REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: TD_DDRAIN ! depth of drain -! REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: TD_RADI ! tile radius -! REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: TD_SPAC ! tile spacing - -! INOUT (with generic LSM equivalent) - - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TSK ! surface radiative temperature [K] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: HFX ! sensible heat flux [W m-2] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: QFX ! latent heat flux [kg s-1 m-2] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: LH ! latent heat flux [W m-2] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: GRDFLX ! ground/snow heat flux [W m-2] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: SMSTAV ! soil moisture avail. [not used] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: SMSTOT ! total soil water [mm][not used] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: SFCRUNOFF ! accumulated surface runoff [m] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: UDRUNOFF ! accumulated sub-surface runoff [m] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ALBEDO ! total grid albedo [] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: SNOWC ! snow cover fraction [] - REAL, DIMENSION( ims:ime, 1:nsoil, jms:jme ), INTENT(INOUT) :: SMOIS ! volumetric soil moisture [m3/m3] - REAL, DIMENSION( ims:ime, 1:nsoil, jms:jme ), INTENT(INOUT) :: SH2O ! volumetric liquid soil moisture [m3/m3] - REAL, DIMENSION( ims:ime, 1:nsoil, jms:jme ), INTENT(INOUT) :: TSLB ! soil temperature [K] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: SNOW ! snow water equivalent [mm] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: SNOWH ! physical snow depth [m] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CANWAT ! total canopy water + ice [mm] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ACSNOM ! accumulated snow melt leaving pack - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ACSNOW ! accumulated snow on grid - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: EMISS ! surface bulk emissivity - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: QSFC ! bulk surface specific humidity - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: Z0 ! combined z0 sent to coupled model - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ZNT ! combined z0 sent to coupled model - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: RS ! Total stomatal resistance (s/m) - - INTEGER, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ISNOWXY ! actual no. of snow layers - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TVXY ! vegetation leaf temperature - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TGXY ! bulk ground surface temperature - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CANICEXY ! canopy-intercepted ice (mm) - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CANLIQXY ! canopy-intercepted liquid water (mm) - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: EAHXY ! canopy air vapor pressure (pa) - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TAHXY ! canopy air temperature (k) - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CMXY ! bulk momentum drag coefficient - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CHXY ! bulk sensible heat exchange coefficient - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: FWETXY ! wetted or snowed fraction of the canopy (-) - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: SNEQVOXY ! snow mass at last time step(mm h2o) - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ALBOLDXY ! snow albedo at last time step (-) - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: QSNOWXY ! snowfall on the ground [mm/s] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: QRAINXY ! rainfall on the ground [mm/s] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: WSLAKEXY ! lake water storage [mm] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ZWTXY ! water table depth [m] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: WAXY ! water in the "aquifer" [mm] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: WTXY ! groundwater storage [mm] - REAL, DIMENSION( ims:ime,-2:0, jms:jme ), INTENT(INOUT) :: TSNOXY ! snow temperature [K] - REAL, DIMENSION( ims:ime,-2:NSOIL, jms:jme ), INTENT(INOUT) :: ZSNSOXY ! snow layer depth [m] - REAL, DIMENSION( ims:ime,-2:0, jms:jme ), INTENT(INOUT) :: SNICEXY ! snow layer ice [mm] - REAL, DIMENSION( ims:ime,-2:0, jms:jme ), INTENT(INOUT) :: SNLIQXY ! snow layer liquid water [mm] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: LFMASSXY ! leaf mass [g/m2] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: RTMASSXY ! mass of fine roots [g/m2] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: STMASSXY ! stem mass [g/m2] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: WOODXY ! mass of wood (incl. woody roots) [g/m2] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: STBLCPXY ! stable carbon in deep soil [g/m2] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: FASTCPXY ! short-lived carbon, shallow soil [g/m2] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: XLAIXY ! leaf area index - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: XSAIXY ! stem area index - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TAUSSXY ! snow age factor - REAL, DIMENSION( ims:ime, 1:nsoil, jms:jme ), INTENT(INOUT) :: SMOISEQ ! eq volumetric soil moisture [m3/m3] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: SMCWTDXY ! soil moisture content in the layer to the water table when deep - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: DEEPRECHXY ! recharge to the water table when deep - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: RECHXY ! recharge to the water table (diagnostic) - -! OUT (with no Noah LSM equivalent) - - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: T2MVXY ! 2m temperature of vegetation part - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: T2MBXY ! 2m temperature of bare ground part - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: Q2MVXY ! 2m mixing ratio of vegetation part - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: Q2MBXY ! 2m mixing ratio of bare ground part - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: TRADXY ! surface radiative temperature (k) - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: NEEXY ! net ecosys exchange (g/m2/s CO2) - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: GPPXY ! gross primary assimilation [g/m2/s C] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: NPPXY ! net primary productivity [g/m2/s C] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: FVEGXY ! Noah-MP vegetation fraction [-] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: RUNSFXY ! surface runoff [mm] per soil timestep - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: RUNSBXY ! subsurface runoff [mm] per soil timestep - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: ECANXY ! evaporation of intercepted water (mm/s) - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: EDIRXY ! soil surface evaporation rate (mm/s] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: ETRANXY ! transpiration rate (mm/s) - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: FSAXY ! total absorbed solar radiation (w/m2) - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: FIRAXY ! total net longwave rad (w/m2) [+ to atm] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: APARXY ! photosyn active energy by canopy (w/m2) - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: PSNXY ! total photosynthesis (umol co2/m2/s) [+] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: SAVXY ! solar rad absorbed by veg. (w/m2) - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: SAGXY ! solar rad absorbed by ground (w/m2) - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: RSSUNXY ! sunlit leaf stomatal resistance (s/m) - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: RSSHAXY ! shaded leaf stomatal resistance (s/m) - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: BGAPXY ! between gap fraction - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: WGAPXY ! within gap fraction - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: TGVXY ! under canopy ground temperature[K] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: TGBXY ! bare ground temperature [K] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: CHVXY ! sensible heat exchange coefficient vegetated - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: CHBXY ! sensible heat exchange coefficient bare-ground - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: SHGXY ! veg ground sen. heat [w/m2] [+ to atm] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: SHCXY ! canopy sen. heat [w/m2] [+ to atm] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: SHBXY ! bare sensible heat [w/m2] [+ to atm] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: EVGXY ! veg ground evap. heat [w/m2] [+ to atm] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: EVBXY ! bare soil evaporation [w/m2] [+ to atm] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: GHVXY ! veg ground heat flux [w/m2] [+ to soil] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: GHBXY ! bare ground heat flux [w/m2] [+ to soil] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: IRGXY ! veg ground net LW rad. [w/m2] [+ to atm] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: IRCXY ! canopy net LW rad. [w/m2] [+ to atm] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: IRBXY ! bare net longwave rad. [w/m2] [+ to atm] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: TRXY ! transpiration [w/m2] [+ to atm] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: EVCXY ! canopy evaporation heat [w/m2] [+ to atm] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: CHLEAFXY ! leaf exchange coefficient - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: CHUCXY ! under canopy exchange coefficient - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: CHV2XY ! veg 2m exchange coefficient - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: CHB2XY ! bare 2m exchange coefficient -! additional output variables - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: PAHXY ! precipitation advected heat - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: PAHGXY ! precipitation advected heat - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: PAHBXY ! precipitation advected heat - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: PAHVXY ! precipitation advected heat - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: QINTSXY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: QINTRXY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: QDRIPSXY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: QDRIPRXY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: QTHROSXY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: QTHRORXY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: QSNSUBXY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: QSNFROXY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: QSUBCXY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: QFROCXY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: QEVACXY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: QDEWCXY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: QFRZCXY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: QMELTCXY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: QSNBOTXY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: PONDINGXY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: FPICEXY !fraction of ice in precip - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: RAINLSM !rain rate (mm/s) AJN - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: SNOWLSM !liquid equivalent snow rate (mm/s) AJN - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: FORCTLSM - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: FORCQLSM - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: FORCPLSM - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: FORCZLSM - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: FORCWLSM - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ACC_SSOILXY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ACC_QINSURXY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ACC_QSEVAXY - REAL, DIMENSION( ims:ime, 1:NSOIL, jms:jme ), INTENT(INOUT) :: ACC_ETRANIXY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: EFLXBXY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: SOILENERGY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: SNOWENERGY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: CANHSXY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ACC_DWATERXY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ACC_PRCPXY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ACC_ECANXY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ACC_ETRANXY - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ACC_EDIRXY - - INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, & ! d -> domain - & ims,ime, jms,jme, kms,kme, & ! m -> memory - & its,ite, jts,jte, kts,kte ! t -> tile - -!2D inout irrigation variables - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: IRFRACT ! irrigation fraction - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: SIFRACT ! sprinkler irrigation fraction - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: MIFRACT ! micro irrigation fraction - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: FIFRACT ! flood irrigation fraction - INTEGER, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: IRNUMSI ! irrigation event number, Sprinkler - INTEGER, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: IRNUMMI ! irrigation event number, Micro - INTEGER, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: IRNUMFI ! irrigation event number, Flood - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: IRWATSI ! irrigation water amount [m] to be applied, Sprinkler - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: IRWATMI ! irrigation water amount [m] to be applied, Micro - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: IRWATFI ! irrigation water amount [m] to be applied, Flood - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: IRELOSS ! loss of irrigation water to evaporation,sprinkler [m/timestep] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: IRSIVOL ! amount of irrigation by sprinkler (mm) - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: IRMIVOL ! amount of irrigation by micro (mm) - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: IRFIVOL ! amount of irrigation by micro (mm) - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: IRRSPLH ! latent heating from sprinkler evaporation (w/m2) - CHARACTER(LEN=256), INTENT(IN) :: LLANDUSE ! landuse data name (USGS or MODIS_IGBP) - -!ID local irrigation variables - REAL :: IRRFRA ! irrigation fraction - REAL :: SIFAC ! sprinkler irrigation fraction - REAL :: MIFAC ! micro irrigation fraction - REAL :: FIFAC ! flood irrigation fraction - INTEGER :: IRCNTSI ! irrigation event number, Sprinkler - INTEGER :: IRCNTMI ! irrigation event number, Micro - INTEGER :: IRCNTFI ! irrigation event number, Flood - REAL :: IRAMTSI ! irrigation water amount [m] to be applied, Sprinkler - REAL :: IRAMTMI ! irrigation water amount [m] to be applied, Micro - REAL :: IRAMTFI ! irrigation water amount [m] to be applied, Flood - REAL :: IREVPLOS ! loss of irrigation water to evaporation,sprinkler [m/timestep] - REAL :: IRSIRATE ! rate of irrigation by sprinkler [m/timestep] - REAL :: IRMIRATE ! rate of irrigation by micro [m/timestep] - REAL :: IRFIRATE ! rate of irrigation by micro [m/timestep] - REAL :: FIRR ! latent heating due to sprinkler evaporation (w m-2) - REAL :: EIRR ! evaporation due to sprinkler evaporation (mm/s) - -! 1D equivalent of 2D/3D fields - -! IN only - - REAL :: COSZ ! cosine zenith angle - REAL :: LAT ! latitude [rad] - REAL :: Z_ML ! model height [m] - INTEGER :: VEGTYP ! vegetation type - INTEGER, DIMENSION(NSOIL) :: SOILTYP ! soil type - INTEGER :: CROPTYPE ! crop type - REAL :: FVEG ! vegetation fraction [-] - REAL :: FVGMAX ! annual max vegetation fraction [] - REAL :: TBOT ! deep soil temperature [K] - REAL :: T_ML ! temperature valid at mid-levels [K] - REAL :: Q_ML ! water vapor mixing ratio [kg/kg_dry] - REAL :: U_ML ! U wind component [m/s] - REAL :: V_ML ! V wind component [m/s] - REAL :: SWDN ! solar down at surface [W m-2] - REAL :: LWDN ! longwave down at surface [W m-2] - REAL :: P_ML ! pressure, valid at interface [Pa] - REAL :: PSFC ! surface pressure [Pa] - REAL :: PRCP ! total precipitation entering [mm] ! MB/AN : v3.7 - REAL :: PRCPCONV ! convective precipitation entering [mm] ! MB/AN : v3.7 - REAL :: PRCPNONC ! non-convective precipitation entering [mm] ! MB/AN : v3.7 - REAL :: PRCPSHCV ! shallow convective precip entering [mm] ! MB/AN : v3.7 - REAL :: PRCPSNOW ! snow entering land model [mm] ! MB/AN : v3.7 - REAL :: PRCPGRPL ! graupel entering land model [mm] ! MB/AN : v3.7 - REAL :: PRCPHAIL ! hail entering land model [mm] ! MB/AN : v3.7 - REAL :: PRCPOTHR ! other precip, e.g. fog [mm] ! MB/AN : v3.7 - -! INOUT (with generic LSM equivalent) - - REAL :: FSH ! total sensible heat (w/m2) [+ to atm] - REAL :: SSOIL ! soil heat heat (w/m2) - REAL :: SALB ! surface albedo (-) - REAL :: FSNO ! snow cover fraction (-) - REAL, DIMENSION( 1:NSOIL) :: SMCEQ ! eq vol. soil moisture (m3/m3) - REAL, DIMENSION( 1:NSOIL) :: SMC ! vol. soil moisture (m3/m3) - REAL, DIMENSION( 1:NSOIL) :: SMH2O ! vol. soil liquid water (m3/m3) - REAL, DIMENSION(-2:NSOIL) :: STC ! snow/soil tmperatures - REAL :: SWE ! snow water equivalent (mm) - REAL :: SNDPTH ! snow depth (m) - REAL :: EMISSI ! net surface emissivity - REAL :: QSFC1D ! bulk surface specific humidity - -! INOUT (with no Noah LSM equivalent) - - INTEGER :: ISNOW ! actual no. of snow layers - REAL :: TV ! vegetation canopy temperature - REAL :: TG ! ground surface temperature - REAL :: CANICE ! canopy-intercepted ice (mm) - REAL :: CANLIQ ! canopy-intercepted liquid water (mm) - REAL :: EAH ! canopy air vapor pressure (pa) - REAL :: TAH ! canopy air temperature (k) - REAL :: CM ! momentum drag coefficient - REAL :: CH ! sensible heat exchange coefficient - REAL :: FWET ! wetted or snowed fraction of the canopy (-) - REAL :: SNEQVO ! snow mass at last time step(mm h2o) - REAL :: ALBOLD ! snow albedo at last time step (-) - REAL :: QSNOW ! snowfall on the ground [mm/s] - REAL :: QRAIN ! rainfall on the ground [mm/s] - REAL :: WSLAKE ! lake water storage [mm] - REAL :: ZWT ! water table depth [m] - REAL :: WA ! water in the "aquifer" [mm] - REAL :: WT ! groundwater storage [mm] - REAL :: SMCWTD ! soil moisture content in the layer to the water table when deep - REAL :: DEEPRECH ! recharge to the water table when deep - REAL :: RECH ! recharge to the water table (diagnostic) - REAL, DIMENSION(-2:NSOIL) :: ZSNSO ! snow layer depth [m] - REAL, DIMENSION(-2: 0) :: SNICE ! snow layer ice [mm] - REAL, DIMENSION(-2: 0) :: SNLIQ ! snow layer liquid water [mm] - REAL :: LFMASS ! leaf mass [g/m2] - REAL :: RTMASS ! mass of fine roots [g/m2] - REAL :: STMASS ! stem mass [g/m2] - REAL :: WOOD ! mass of wood (incl. woody roots) [g/m2] - REAL :: GRAIN ! mass of grain XING [g/m2] - REAL :: GDD ! mass of grain XING[g/m2] - INTEGER :: PGS !stem respiration [g/m2/s] - REAL :: STBLCP ! stable carbon in deep soil [g/m2] - REAL :: FASTCP ! short-lived carbon, shallow soil [g/m2] - REAL :: PLAI ! leaf area index - REAL :: PSAI ! stem area index - REAL :: TAUSS ! non-dimensional snow age - -! tile drainage - REAL :: QTLDRN ! tile drainage (mm) - REAL :: TDFRACMP ! tile drainage map -#ifdef WRF_HYDRO - REAL :: WATBLED ! water table depth for tile drainage -#endif - -! OUT (with no Noah LSM equivalent) - - REAL :: Z0WRF ! combined z0 sent to coupled model - REAL :: T2MV ! 2m temperature of vegetation part - REAL :: T2MB ! 2m temperature of bare ground part - REAL :: Q2MV ! 2m mixing ratio of vegetation part - REAL :: Q2MB ! 2m mixing ratio of bare ground part - REAL :: TRAD ! surface radiative temperature (k) - REAL :: NEE ! net ecosys exchange (g/m2/s CO2) - REAL :: GPP ! gross primary assimilation [g/m2/s C] - REAL :: NPP ! net primary productivity [g/m2/s C] - REAL :: FVEGMP ! greenness vegetation fraction [-] - REAL :: RUNSF ! surface runoff [mm] per soil timestep - REAL :: RUNSB ! subsurface runoff [mm] per soil timestep - REAL :: ECAN ! evaporation of intercepted water (mm/s) - REAL :: ETRAN ! transpiration rate (mm/s) - REAL :: ESOIL ! soil surface evaporation rate (mm/s] - REAL :: FSA ! total absorbed solar radiation (w/m2) - REAL :: FIRA ! total net longwave rad (w/m2) [+ to atm] - REAL :: APAR ! photosyn active energy by canopy (w/m2) - REAL :: PSN ! total photosynthesis (umol co2/m2/s) [+] - REAL :: SAV ! solar rad absorbed by veg. (w/m2) - REAL :: SAG ! solar rad absorbed by ground (w/m2) - REAL :: RSSUN ! sunlit leaf stomatal resistance (s/m) - REAL :: RSSHA ! shaded leaf stomatal resistance (s/m) - REAL, DIMENSION(1:2) :: ALBSND ! snow albedo (direct) - REAL, DIMENSION(1:2) :: ALBSNI ! snow albedo (diffuse) - REAL :: RB ! leaf boundary layer resistance (s/m) - REAL :: LAISUN ! sunlit leaf area index (m2/m2) - REAL :: LAISHA ! shaded leaf area index (m2/m2) - REAL :: BGAP ! between gap fraction - REAL :: WGAP ! within gap fraction - REAL :: TGV ! under canopy ground temperature[K] - REAL :: TGB ! bare ground temperature [K] - REAL :: CHV ! sensible heat exchange coefficient vegetated - REAL :: CHB ! sensible heat exchange coefficient bare-ground - REAL :: IRC ! canopy net LW rad. [w/m2] [+ to atm] - REAL :: IRG ! veg ground net LW rad. [w/m2] [+ to atm] - REAL :: SHC ! canopy sen. heat [w/m2] [+ to atm] - REAL :: SHG ! veg ground sen. heat [w/m2] [+ to atm] - REAL :: EVG ! veg ground evap. heat [w/m2] [+ to atm] - REAL :: GHV ! veg ground heat flux [w/m2] [+ to soil] - REAL :: IRB ! bare net longwave rad. [w/m2] [+ to atm] - REAL :: SHB ! bare sensible heat [w/m2] [+ to atm] - REAL :: EVB ! bare evaporation heat [w/m2] [+ to atm] - REAL :: GHB ! bare ground heat flux [w/m2] [+ to soil] - REAL :: TR ! transpiration [w/m2] [+ to atm] - REAL :: EVC ! canopy evaporation heat [w/m2] [+ to atm] - REAL :: CHLEAF ! leaf exchange coefficient - REAL :: CHUC ! under canopy exchange coefficient - REAL :: CHV2 ! veg 2m exchange coefficient - REAL :: CHB2 ! bare 2m exchange coefficient - REAL :: QINTS - REAL :: QINTR - REAL :: QDRIPS - REAL :: QDRIPR - REAL :: QTHROS - REAL :: QTHROR - REAL :: QSNSUB - REAL :: QSNFRO - REAL :: QEVAC - REAL :: QDEWC - REAL :: QSUBC - REAL :: QFROC - REAL :: QFRZC - REAL :: QMELTC - REAL :: PAHV !precipitation advected heat - vegetation net (W/m2) - REAL :: PAHG !precipitation advected heat - under canopy net (W/m2) - REAL :: PAHB !precipitation advected heat - bare ground net (W/m2) - REAL :: PAH !precipitation advected heat - total (W/m2) - REAL :: RAININ !rain rate (mm/s) - REAL :: SNOWIN !liquid equivalent snow rate (mm/s) - REAL :: ACC_SSOIL - REAL :: ACC_QINSUR - REAL :: ACC_QSEVA - REAL, DIMENSION( 1:NSOIL) :: ACC_ETRANI !transpiration rate (mm/s) [+] - REAL :: EFLXB - REAL :: XMF - REAL, DIMENSION( -2:NSOIL ) :: HCPCT - REAL :: DZSNSO - REAL :: CANHS ! canopy heat storage change (w/m2) - REAL :: ACC_DWATER - REAL :: ACC_PRCP - REAL :: ACC_ECAN - REAL :: ACC_ETRAN - REAL :: ACC_EDIR - -! Intermediate terms - REAL :: FPICE ! snow fraction of precip - REAL :: FCEV ! canopy evaporation heat (w/m2) [+ to atm] - REAL :: FGEV ! ground evaporation heat (w/m2) [+ to atm] - REAL :: FCTR ! transpiration heat flux (w/m2) [+ to atm] - REAL :: QSNBOT ! snowmelt out bottom of pack [mm/s] - REAL :: PONDING ! snowmelt with no pack [mm] - REAL :: PONDING1 ! snowmelt with no pack [mm] - REAL :: PONDING2 ! snowmelt with no pack [mm] - -! Local terms - - REAL, DIMENSION(1:60) :: gecros1d ! gecros crop - REAL :: gecros_dd ,gecros_tbem,gecros_emb ,gecros_ema, & - gecros_ds1,gecros_ds2 ,gecros_ds1x,gecros_ds2x - - REAL :: FSR ! total reflected solar radiation (w/m2) - REAL, DIMENSION(-2:0) :: FICEOLD ! snow layer ice fraction [] - REAL :: CO2PP ! CO2 partial pressure [Pa] - REAL :: O2PP ! O2 partial pressure [Pa] - REAL, DIMENSION(1:NSOIL) :: ZSOIL ! depth to soil interfaces [m] - REAL :: FOLN ! nitrogen saturation [%] - - REAL :: QC ! cloud specific humidity for MYJ [not used] - REAL :: PBLH ! PBL height for MYJ [not used] - REAL :: DZ8W1D ! model level heights for MYJ [not used] - - INTEGER :: I - INTEGER :: J - INTEGER :: K - INTEGER :: ICE - INTEGER :: SLOPETYP - LOGICAL :: IPRINT - - INTEGER :: SOILCOLOR ! soil color index - INTEGER :: IST ! surface type 1-soil; 2-lake - INTEGER :: YEARLEN - REAL :: SOLAR_TIME - INTEGER :: JMONTH, JDAY - - INTEGER, PARAMETER :: NSNOW = 3 ! number of snow layers fixed to 3 - REAL, PARAMETER :: undefined_value = -1.E36 - - REAL, DIMENSION( 1:nsoil ) :: SAND - REAL, DIMENSION( 1:nsoil ) :: CLAY - REAL, DIMENSION( 1:nsoil ) :: ORGM - - type(noahmp_parameters) :: parameters - - -! ---------------------------------------------------------------------- - - CALL NOAHMP_OPTIONS(IDVEG ,IOPT_CRS ,IOPT_BTR ,IOPT_RUN ,IOPT_SFC ,IOPT_FRZ , & - IOPT_INF ,IOPT_RAD ,IOPT_ALB ,IOPT_SNF ,IOPT_TBOT, IOPT_STC , & - IOPT_RSF ,IOPT_SOIL ,IOPT_PEDO ,IOPT_CROP ,IOPT_IRR , IOPT_IRRM , & - IOPT_INFDV,IOPT_TDRN ) - - IPRINT = .false. ! debug printout - -! for using soil update timestep difference from noahmp main timestep - calculate_soil = .false. - soil_update_steps = nint(soiltstep/DT) ! 3600 = 1 hour - soil_update_steps = max(soil_update_steps,1) - if( soil_update_steps == 1 .or. & - (soil_update_steps > 1 .and. mod(itimestep,soil_update_steps) == 1) ) then - ACC_SSOILXY = 0.0 - ACC_QINSURXY = 0.0 - ACC_QSEVAXY = 0.0 - ACC_ETRANIXY = 0.0 - ACC_DWATERXY = 0.0 - ACC_PRCPXY = 0.0 - ACC_ECANXY = 0.0 - ACC_ETRANXY = 0.0 - ACC_EDIRXY = 0.0 - end if - - if (mod(itimestep,soil_update_steps) == 0) calculate_soil = .true. -! end soil timestep - - YEARLEN = 365 ! find length of year for phenology (also S Hemisphere) - if (mod(YR,4) == 0) then - YEARLEN = 366 - if (mod(YR,100) == 0) then - YEARLEN = 365 - if (mod(YR,400) == 0) then - YEARLEN = 366 - endif - endif - endif - - ZSOIL(1) = -DZS(1) ! depth to soil interfaces (<0) [m] - DO K = 2, NSOIL - ZSOIL(K) = -DZS(K) + ZSOIL(K-1) - END DO - - JLOOP : DO J=jts,jte - - IF(ITIMESTEP == 1)THEN - DO I=its,ite - IF((XLAND(I,J)-1.5) >= 0.) THEN ! Open water case - IF(XICE(I,J) == 1. .AND. IPRINT) PRINT *,' sea-ice at water point, I=',I,'J=',J - SMSTAV(I,J) = 1.0 - SMSTOT(I,J) = 1.0 - DO K = 1, NSOIL - SMOIS(I,K,J) = 1.0 - TSLB(I,K,J) = 273.16 - ENDDO - ELSE - IF(XICE(I,J) == 1.) THEN ! Sea-ice case - SMSTAV(I,J) = 1.0 - SMSTOT(I,J) = 1.0 - DO K = 1, NSOIL - SMOIS(I,K,J) = 1.0 - ENDDO - ENDIF - ENDIF - ENDDO - ENDIF ! end of initialization over ocean - - -!----------------------------------------------------------------------- - ILOOP : DO I = its, ite - - IF (XICE(I,J) >= XICE_THRES) THEN - ICE = 1 ! Sea-ice point - - SH2O (i,1:NSOIL,j) = 1.0 - XLAIXY(i,j) = 0.01 - - CYCLE ILOOP ! Skip any processing at sea-ice points - - ELSE - - IF((XLAND(I,J)-1.5) >= 0.) CYCLE ILOOP ! Open water case - -! 2D to 1D - -! IN only - - COSZ = COSZIN (I,J) ! cos zenith angle [] - LAT = XLAT (I,J) ! latitude [rad] - Z_ML = 0.5*DZ8W(I,1,J) ! DZ8W: thickness of full levels; ZLVL forcing height [m] - VEGTYP = IVGTYP(I,J) ! vegetation type - if(iopt_soil == 1) then - SOILTYP= ISLTYP(I,J) ! soil type same in all layers - elseif(iopt_soil == 2) then - SOILTYP(1) = nint(SOILCL1(I,J)) ! soil type in layer1 - SOILTYP(2) = nint(SOILCL2(I,J)) ! soil type in layer2 - SOILTYP(3) = nint(SOILCL3(I,J)) ! soil type in layer3 - SOILTYP(4) = nint(SOILCL4(I,J)) ! soil type in layer4 - elseif(iopt_soil == 3) then - SOILTYP= ISLTYP(I,J) ! to initialize with default - end if - FVEG = VEGFRA(I,J)/100. ! vegetation fraction [0-1] - FVGMAX = VEGMAX (I,J)/100. ! Vegetation fraction annual max [0-1] - TBOT = TMN(I,J) ! Fixed deep soil temperature for land - T_ML = T3D(I,1,J) ! temperature defined at intermediate level [K] - Q_ML = QV3D(I,1,J)/(1.0+QV3D(I,1,J)) ! convert from mixing ratio to specific humidity [kg/kg] - U_ML = U_PHY(I,1,J) ! u-wind at interface [m/s] - V_ML = V_PHY(I,1,J) ! v-wind at interface [m/s] - SWDN = SWDOWN(I,J) ! shortwave down from SW scheme [W/m2] - LWDN = GLW(I,J) ! total longwave down from LW scheme [W/m2] - P_ML =(P8W3D(I,KTS+1,J)+P8W3D(I,KTS,J))*0.5 ! surface pressure defined at intermediate level [Pa] - ! consistent with temperature, mixing ratio - PSFC = P8W3D(I,1,J) ! surface pressure defined a full levels [Pa] - PRCP = PRECIP_IN (I,J) / DT ! timestep total precip rate (glacier) [mm/s]! MB: v3.7 - - CROPTYPE = 0 - IF (IOPT_CROP > 0 .AND. VEGTYP == ISCROP_TABLE) CROPTYPE = DEFAULT_CROP_TABLE ! default croptype is generic dynamic vegetation crop - IF (IOPT_CROP > 0 .AND. CROPCAT(I,J) > 0) THEN - CROPTYPE = CROPCAT(I,J) ! crop type - VEGTYP = ISCROP_TABLE - FVGMAX = 0.95 - FVEG = 0.95 - END IF - - IF (PRESENT(MP_RAINC) .AND. PRESENT(MP_RAINNC) .AND. PRESENT(MP_SHCV) .AND. & - PRESENT(MP_SNOW) .AND. PRESENT(MP_GRAUP) .AND. PRESENT(MP_HAIL) ) THEN - - PRCPCONV = MP_RAINC (I,J)/DT ! timestep convective precip rate [mm/s] ! MB: v3.7 - PRCPNONC = MP_RAINNC(I,J)/DT ! timestep non-convective precip rate [mm/s] ! MB: v3.7 - PRCPSHCV = MP_SHCV(I,J) /DT ! timestep shallow conv precip rate [mm/s] ! MB: v3.7 - PRCPSNOW = MP_SNOW(I,J) /DT ! timestep snow precip rate [mm/s] ! MB: v3.7 - PRCPGRPL = MP_GRAUP(I,J) /DT ! timestep graupel precip rate [mm/s] ! MB: v3.7 - PRCPHAIL = MP_HAIL(I,J) /DT ! timestep hail precip rate [mm/s] ! MB: v3.7 - - PRCPOTHR = PRCP - PRCPCONV - PRCPNONC - PRCPSHCV ! take care of other (fog) contained in rainbl - PRCPOTHR = MAX(0.0,PRCPOTHR) - PRCPNONC = PRCPNONC + PRCPOTHR - PRCPSNOW = PRCPSNOW + SR(I,J) * PRCPOTHR - ELSE - PRCPCONV = 0. - PRCPNONC = PRCP - PRCPSHCV = 0. - PRCPSNOW = SR(I,J) * PRCP - PRCPGRPL = 0. - PRCPHAIL = 0. - ENDIF - -! IN/OUT fields - - ISNOW = ISNOWXY (I,J) ! snow layers [] - SMC ( 1:NSOIL) = SMOIS (I, 1:NSOIL,J) ! soil total moisture [m3/m3] - SMH2O( 1:NSOIL) = SH2O (I, 1:NSOIL,J) ! soil liquid moisture [m3/m3] - STC (-NSNOW+1: 0) = TSNOXY (I,-NSNOW+1: 0,J) ! snow temperatures [K] - STC ( 1:NSOIL) = TSLB (I, 1:NSOIL,J) ! soil temperatures [K] - SWE = SNOW (I,J) ! snow water equivalent [mm] - SNDPTH = SNOWH (I,J) ! snow depth [m] - QSFC1D = QSFC (I,J) - -! INOUT (with no Noah LSM equivalent) - - TV = TVXY (I,J) ! leaf temperature [K] - TG = TGXY (I,J) ! ground temperature [K] - CANLIQ = CANLIQXY(I,J) ! canopy liquid water [mm] - CANICE = CANICEXY(I,J) ! canopy frozen water [mm] - EAH = EAHXY (I,J) ! canopy vapor pressure [Pa] - TAH = TAHXY (I,J) ! canopy temperature [K] - CM = CMXY (I,J) ! avg. momentum exchange (MP only) [m/s] - CH = CHXY (I,J) ! avg. heat exchange (MP only) [m/s] - FWET = FWETXY (I,J) ! canopy fraction wet or snow - SNEQVO = SNEQVOXY(I,J) ! SWE previous timestep - ALBOLD = ALBOLDXY(I,J) ! albedo previous timestep, for snow aging - QSNOW = QSNOWXY (I,J) ! snow falling on ground - QRAIN = QRAINXY (I,J) ! rain falling on ground - WSLAKE = WSLAKEXY(I,J) ! lake water storage (can be neg.) (mm) - ZWT = ZWTXY (I,J) ! depth to water table [m] - WA = WAXY (I,J) ! water storage in aquifer [mm] - WT = WTXY (I,J) ! water in aquifer&saturated soil [mm] - ZSNSO(-NSNOW+1:NSOIL) = ZSNSOXY (I,-NSNOW+1:NSOIL,J) ! depth to layer interface - SNICE(-NSNOW+1: 0) = SNICEXY (I,-NSNOW+1: 0,J) ! snow layer ice content - SNLIQ(-NSNOW+1: 0) = SNLIQXY (I,-NSNOW+1: 0,J) ! snow layer water content - LFMASS = LFMASSXY(I,J) ! leaf mass - RTMASS = RTMASSXY(I,J) ! root mass - STMASS = STMASSXY(I,J) ! stem mass - WOOD = WOODXY (I,J) ! mass of wood (incl. woody roots) [g/m2] - STBLCP = STBLCPXY(I,J) ! stable carbon pool - FASTCP = FASTCPXY(I,J) ! fast carbon pool - PLAI = XLAIXY (I,J) ! leaf area index [-] (no snow effects) - PSAI = XSAIXY (I,J) ! stem area index [-] (no snow effects) - TAUSS = TAUSSXY (I,J) ! non-dimensional snow age - SMCEQ( 1:NSOIL) = SMOISEQ (I, 1:NSOIL,J) - SMCWTD = SMCWTDXY(I,J) - RECH = 0. - DEEPRECH = 0. - ACC_SSOIL = ACC_SSOILXY (I,J) ! surface heat flux - ACC_QSEVA = ACC_QSEVAXY (I,J) - ACC_QINSUR = ACC_QINSURXY(I,J) - ACC_ETRANI = ACC_ETRANIXY(I,:,J) - ACC_DWATER = ACC_DWATERXY(I,J) - ACC_PRCP = ACC_PRCPXY (I,J) - ACC_ECAN = ACC_ECANXY (I,J) - ACC_ETRAN = ACC_ETRANXY (I,J) - ACC_EDIR = ACC_EDIRXY (I,J) - -! tile drainage - QTLDRN = 0. ! tile drainage (mm) - TDFRACMP = TD_FRACTION(I,J) ! tile drainage map -#ifdef WRF_HYDRO - WATBLED = ZWATBLE2D (I,J) ! water table depth for tile drainage -#endif - -! irrigation vars - IRRFRA = IRFRACT(I,J) ! irrigation fraction - SIFAC = SIFRACT(I,J) ! sprinkler irrigation fraction - MIFAC = MIFRACT(I,J) ! micro irrigation fraction - FIFAC = FIFRACT(I,J) ! flood irrigation fraction - IRCNTSI = IRNUMSI(I,J) ! irrigation event number, Sprinkler - IRCNTMI = IRNUMMI(I,J) ! irrigation event number, Micro - IRCNTFI = IRNUMFI(I,J) ! irrigation event number, Flood - IRAMTSI = IRWATSI(I,J) ! irrigation water amount [m] to be applied, Sprinkler - IRAMTMI = IRWATMI(I,J) ! irrigation water amount [m] to be applied, Micro - IRAMTFI = IRWATFI(I,J) ! irrigation water amount [m] to be applied, Flood - IREVPLOS = 0.0 ! loss of irrigation water to evaporation,sprinkler [m/timestep] - IRSIRATE = 0.0 ! rate of irrigation by sprinkler (mm) - IRMIRATE = 0.0 ! rate of irrigation by micro (mm) - IRFIRATE = 0.0 ! rate of irrigation by micro (mm) - FIRR = 0.0 ! latent heating due to sprinkler evaporation (W m-2) - EIRR = 0.0 ! evaporation from sprinkler (mm/s) - - if(iopt_crop == 2) then ! gecros crop model - - gecros1d(1:60) = gecros_state(I,1:60,J) ! Gecros variables 2D -> local - - if(croptype == 1) then - gecros_dd = 2.5 - gecros_tbem = 2.0 - gecros_emb = 10.2 - gecros_ema = 40.0 - gecros_ds1 = 2.1 !BBCH 92 - gecros_ds2 = 2.0 !BBCH 90 - gecros_ds1x = 0.0 - gecros_ds2x = 10.0 - end if - - if(croptype == 2) then - gecros_dd = 5.0 - gecros_tbem = 8.0 - gecros_emb = 15.0 - gecros_ema = 6.0 - gecros_ds1 = 1.78 !BBCH 85 - gecros_ds2 = 1.63 !BBCH 80 - gecros_ds1x = 0.0 - gecros_ds2x = 14.0 - end if - - end if - - SLOPETYP = 1 ! set underground runoff slope term - IST = 1 ! MP surface type: 1 = land; 2 = lake - SOILCOLOR = 4 ! soil color: assuming a middle color category ????????? - - IF(any(SOILTYP == 14) .AND. XICE(I,J) == 0.) THEN - IF(IPRINT) PRINT *, ' SOIL TYPE FOUND TO BE WATER AT A LAND-POINT' - IF(IPRINT) PRINT *, i,j,'RESET SOIL in surfce.F' - SOILTYP = 7 - ENDIF - IF( IVGTYP(I,J) == ISURBAN_TABLE .or. IVGTYP(I,J) == LCZ_1_TABLE .or. IVGTYP(I,J) == LCZ_2_TABLE .or. & - IVGTYP(I,J) == LCZ_3_TABLE .or. IVGTYP(I,J) == LCZ_4_TABLE .or. IVGTYP(I,J) == LCZ_5_TABLE .or. & - IVGTYP(I,J) == LCZ_6_TABLE .or. IVGTYP(I,J) == LCZ_7_TABLE .or. IVGTYP(I,J) == LCZ_8_TABLE .or. & - IVGTYP(I,J) == LCZ_9_TABLE .or. IVGTYP(I,J) == LCZ_10_TABLE .or. IVGTYP(I,J) == LCZ_11_TABLE ) THEN - - - IF(SF_URBAN_PHYSICS == 0 ) THEN - VEGTYP = ISURBAN_TABLE - ELSE - VEGTYP = NATURAL_TABLE ! set urban vegetation type based on table natural - FVGMAX = 0.96 - ENDIF - - ENDIF - -! placeholders for 3D soil -! parameters%bexp = BEXP_3D (I,1:NSOIL,J) ! C-H B exponent -! parameters%smcdry = SMCDRY_3D(I,1:NSOIL,J) ! Soil Moisture Limit: Dry -! parameters%smcwlt = SMCWLT_3D(I,1:NSOIL,J) ! Soil Moisture Limit: Wilt -! parameters%smcref = SMCREF_3D(I,1:NSOIL,J) ! Soil Moisture Limit: Reference -! parameters%smcmax = SMCMAX_3D(I,1:NSOIL,J) ! Soil Moisture Limit: Max -! parameters%dksat = DKSAT_3D (I,1:NSOIL,J) ! Saturated Soil Conductivity -! parameters%dwsat = DWSAT_3D (I,1:NSOIL,J) ! Saturated Soil Diffusivity -! parameters%psisat = PSISAT_3D(I,1:NSOIL,J) ! Saturated Matric Potential -! parameters%quartz = QUARTZ_3D(I,1:NSOIL,J) ! Soil quartz content -! parameters%refdk = REFDK_2D (I,J) ! Reference Soil Conductivity -! parameters%refkdt = REFKDT_2D(I,J) ! Soil Infiltration Parameter - -! placeholders for 2D additional runoff parameters -! parameters%BVIC = BVIC_2D(I,J) ! VIC model infiltration parameter [-] -! parameters%axaj = AXAJ_2D(I,J) ! Xinanjiang: Tension water distribution inflection parameter [-] -! parameters%bxaj = BXAJ_2D(I,J) ! Xinanjiang: Tension water distribution shape parameter [-] -! parameters%xxaj = XXAJ_2D(I,J) ! Xinanjiang: Free water distribution shape parameter [-] -! parameters%BDVIC = BDVIC_2D(I,J) ! VIC model infiltration parameter [-] -! parameters%GDVIC = GDVIC_2D(I,J) ! Mean Capillary Drive for infiltration models [m] -! parameters%BBVIC = BBVIC_2D(I,J) ! DVIC heterogeniety parameter for infiltraton [-] - -! placeholders for 2D irrigation params -! parameters%IRR_FRAC = IRR_FRAC_2D(I,J) ! irrigation Fraction -! parameters%IRR_HAR = IRR_HAR_2D(I,J) ! number of days before harvest date to stop irrigation -! parameters%IRR_LAI = IRR_LAI_2D(I,J) ! Minimum lai to trigger irrigation -! parameters%IRR_MAD = IRR_MAD_2D(I,J) ! management allowable deficit (0-1) -! parameters%FILOSS = FILOSS_2D(I,J) ! fraction of flood irrigation loss (0-1) -! parameters%SPRIR_RATE = SPRIR_RATE_2D(I,J) ! mm/h, sprinkler irrigation rate -! parameters%MICIR_RATE = MICIR_RATE_2D(I,J) ! mm/h, micro irrigation rate -! parameters%FIRTFAC = FIRTFAC_2D(I,J) ! flood application rate factor -! parameters%IR_RAIN = IR_RAIN_2D(I,J) ! maximum precipitation to stop irrigation trigger - -! placeholders for 2D tile drainage parameters -! parameters%klat_fac = KLAT_FAC (I,J) ! factor multiplier to hydraulic conductivity -! parameters%tdsmc_fac = TDSMC_FAC(I,J) ! factor multiplier to field capacity -! parameters%td_dc = TD_DC (I,J) ! drainage coefficient for simple -! parameters%td_dcoef = TD_DCOEF (I,J) ! drainge coefficient for Hooghoudt -! parameters%td_ddrain = TD_DDRAIN(I,J) ! depth of drain -! parameters%td_radi = TD_RADI (I,J) ! tile radius -! parameters%td_spac = TD_SPAC (I,J) ! tile spacing - - - CALL TRANSFER_MP_PARAMETERS(VEGTYP,SOILTYP,SLOPETYP,SOILCOLOR,CROPTYPE,parameters) - - if(iopt_soil == 3 .and. .not. parameters%urban_flag) then - - sand = 0.01 * soilcomp(i,1:4,j) - clay = 0.01 * soilcomp(i,5:8,j) - orgm = 0.0 - - if(opt_pedo == 1) call pedotransfer_sr2006(nsoil,sand,clay,orgm,parameters) - - end if - - GRAIN = GRAINXY (I,J) ! mass of grain XING [g/m2] - GDD = GDDXY (I,J) ! growing degree days XING - PGS = PGSXY (I,J) ! growing degree days XING - - if(iopt_crop == 1 .and. croptype > 0) then - parameters%PLTDAY = PLANTING(I,J) - parameters%HSDAY = HARVEST (I,J) - parameters%GDDS1 = SEASON_GDD(I,J) / 1770.0 * parameters%GDDS1 - parameters%GDDS2 = SEASON_GDD(I,J) / 1770.0 * parameters%GDDS2 - parameters%GDDS3 = SEASON_GDD(I,J) / 1770.0 * parameters%GDDS3 - parameters%GDDS4 = SEASON_GDD(I,J) / 1770.0 * parameters%GDDS4 - parameters%GDDS5 = SEASON_GDD(I,J) / 1770.0 * parameters%GDDS5 - end if - - if(iopt_irr == 2) then - parameters%PLTDAY = PLANTING(I,J) - parameters%HSDAY = HARVEST (I,J) - end if - -!=== hydrological processes for vegetation in urban model === -!=== irrigate vegetaion only in urban area, MAY-SEP, 9-11pm - - IF( IVGTYP(I,J) == ISURBAN_TABLE .or. IVGTYP(I,J) == LCZ_1_TABLE .or. IVGTYP(I,J) == LCZ_2_TABLE .or. & - IVGTYP(I,J) == LCZ_3_TABLE .or. IVGTYP(I,J) == LCZ_4_TABLE .or. IVGTYP(I,J) == LCZ_5_TABLE .or. & - IVGTYP(I,J) == LCZ_6_TABLE .or. IVGTYP(I,J) == LCZ_7_TABLE .or. IVGTYP(I,J) == LCZ_8_TABLE .or. & - IVGTYP(I,J) == LCZ_9_TABLE .or. IVGTYP(I,J) == LCZ_10_TABLE .or. IVGTYP(I,J) == LCZ_11_TABLE ) THEN - - IF(SF_URBAN_PHYSICS > 0 .AND. IRI_SCHEME == 1 ) THEN - SOLAR_TIME = (JULIAN - INT(JULIAN))*24 + XLONG(I,J)/15.0 - IF(SOLAR_TIME < 0.) SOLAR_TIME = SOLAR_TIME + 24. - CALL CAL_MON_DAY(INT(JULIAN),YR,JMONTH,JDAY) - IF (SOLAR_TIME >= 21. .AND. SOLAR_TIME <= 23. .AND. JMONTH >= 5 .AND. JMONTH <= 9) THEN - SMC(1) = max(SMC(1),parameters%SMCREF(1)) - SMC(2) = max(SMC(2),parameters%SMCREF(2)) - ENDIF - ENDIF - - ENDIF - -! Initialized local - - FICEOLD = 0.0 - FICEOLD(ISNOW+1:0) = SNICEXY(I,ISNOW+1:0,J) & ! snow ice fraction - /(SNICEXY(I,ISNOW+1:0,J)+SNLIQXY(I,ISNOW+1:0,J)) - CO2PP = CO2_TABLE * P_ML ! partial pressure co2 [Pa] - O2PP = O2_TABLE * P_ML ! partial pressure o2 [Pa] - FOLN = 1.0 ! for now, set to nitrogen saturation - QC = undefined_value ! test dummy value - PBLH = undefined_value ! test dummy value ! PBL height - DZ8W1D = DZ8W (I,1,J) ! thickness of atmospheric layers - - IF(VEGTYP == 25) FVEG = 0.0 ! Set playa, lava, sand to bare - IF(VEGTYP == 25) PLAI = 0.0 - IF(VEGTYP == 26) FVEG = 0.0 ! hard coded for USGS - IF(VEGTYP == 26) PLAI = 0.0 - IF(VEGTYP == 27) FVEG = 0.0 - IF(VEGTYP == 27) PLAI = 0.0 - - IF ( VEGTYP == ISICE_TABLE ) THEN - ICE = -1 ! Land-ice point - CALL NOAHMP_OPTIONS_GLACIER(IOPT_ALB ,IOPT_SNF ,IOPT_TBOT, IOPT_STC, IOPT_GLA ) - - TBOT = MIN(TBOT,263.15) ! set deep temp to at most -10C - CALL NOAHMP_GLACIER( I, J, COSZ, NSNOW, NSOIL, DT, & ! IN : Time/Space/Model-related - T_ML, P_ML, U_ML, V_ML, Q_ML, SWDN, & ! IN : Forcing - PRCP, LWDN, TBOT, Z_ML, FICEOLD, ZSOIL, & ! IN : Forcing - QSNOW, SNEQVO, ALBOLD, CM, CH, ISNOW, & ! IN/OUT : - SWE, SMC, ZSNSO, SNDPTH, SNICE, SNLIQ, & ! IN/OUT : - TG, STC, SMH2O, TAUSS, QSFC1D, & ! IN/OUT : - FSA, FSR, FIRA, FSH, FGEV, SSOIL, & ! OUT : - TRAD, ESOIL, RUNSF, RUNSB, SAG, SALB, & ! OUT : - QSNBOT,PONDING,PONDING1,PONDING2, T2MB, Q2MB, & ! OUT : - EMISSI, FPICE, CHB2 & ! OUT : -#ifdef WRF_HYDRO - , sfcheadrt(i,j) & -#endif - ) - - FSNO = 1.0 - TV = undefined_value ! Output from standard Noah-MP undefined for glacier points - TGB = TG - CANICE = undefined_value - CANLIQ = undefined_value - EAH = undefined_value - TAH = undefined_value - FWET = undefined_value - WSLAKE = undefined_value -! ZWT = undefined_value - WA = undefined_value - WT = undefined_value - LFMASS = undefined_value - RTMASS = undefined_value - STMASS = undefined_value - WOOD = undefined_value - QTLDRN = undefined_value - GRAIN = undefined_value - GDD = undefined_value - STBLCP = undefined_value - FASTCP = undefined_value - PLAI = undefined_value - PSAI = undefined_value - T2MV = undefined_value - Q2MV = undefined_value - NEE = undefined_value - GPP = undefined_value - NPP = undefined_value - FVEGMP = 0.0 - ECAN = 0.0 - ETRAN = 0.0 - APAR = undefined_value - PSN = undefined_value - SAV = 0.0 - RSSUN = undefined_value - RSSHA = undefined_value - RB = undefined_value - LAISUN = undefined_value - LAISHA = undefined_value - RS(I,J)= undefined_value - BGAP = undefined_value - WGAP = undefined_value - TGV = undefined_value - CHV = undefined_value - CHB = CH - IRC = 0.0 - IRG = 0.0 - SHC = 0.0 - SHG = 0.0 - EVG = 0.0 - GHV = 0.0 - CANHS = 0.0 - IRB = FIRA - SHB = FSH - EVB = FGEV - GHB = SSOIL - TR = 0.0 - EVC = 0.0 - PAH = 0.0 - PAHG = 0.0 - PAHB = 0.0 - PAHV = 0.0 - CHLEAF = undefined_value - CHUC = undefined_value - CHV2 = undefined_value - FCEV = 0.0 - FCTR = 0.0 - Z0WRF = 0.002 - QFX(I,J) = ESOIL - LH (I,J) = FGEV - QINTS = 0.0 - QINTR = 0.0 - QDRIPS = 0.0 - QDRIPR = 0.0 - QTHROS = PRCP * FPICE - QTHROR = PRCP * (1.0 - FPICE) - QSNSUB = MAX( ESOIL, 0.) - QSNFRO = ABS( MIN(ESOIL, 0.)) - QSUBC = 0.0 - QFROC = 0.0 - QFRZC = 0.0 - QMELTC = 0.0 - QEVAC = 0.0 - QDEWC = 0.0 - RAININ = PRCP * (1.0 - FPICE) - SNOWIN = PRCP * FPICE - CANICE = 0.0 - CANLIQ = 0.0 - QTLDRN = 0.0 - RUNSF = RUNSF * dt - RUNSB = RUNSB * dt - ELSE - ICE=0 ! Neither sea ice or land ice. - CALL NOAHMP_SFLX (parameters, & - I , J , LAT , YEARLEN , JULIAN , COSZ , & ! IN : Time/Space-related - DT , DX , DZ8W1D , NSOIL , ZSOIL , NSNOW , & ! IN : Model configuration - FVEG , FVGMAX , VEGTYP , ICE , IST , CROPTYPE, & ! IN : Vegetation/Soil characteristics - SMCEQ , & ! IN : Vegetation/Soil characteristics - T_ML , P_ML , PSFC , U_ML , V_ML , Q_ML , & ! IN : Forcing - QC , SWDN , LWDN , & ! IN : Forcing - PRCPCONV, PRCPNONC, PRCPSHCV, PRCPSNOW, PRCPGRPL, PRCPHAIL, & ! IN : Forcing - TBOT , CO2PP , O2PP , FOLN , FICEOLD , Z_ML , & ! IN : Forcing - IRRFRA , SIFAC , MIFAC , FIFAC , LLANDUSE, & ! IN : Irrigation: fractions - ALBOLD , SNEQVO , & ! IN/OUT : - STC , SMH2O , SMC , TAH , EAH , FWET , & ! IN/OUT : - CANLIQ , CANICE , TV , TG , QSFC1D , QSNOW , & ! IN/OUT : - QRAIN , & ! IN/OUT : - ISNOW , ZSNSO , SNDPTH , SWE , SNICE , SNLIQ , & ! IN/OUT : - ZWT , WA , WT , WSLAKE , LFMASS , RTMASS , & ! IN/OUT : - STMASS , WOOD , STBLCP , FASTCP , PLAI , PSAI , & ! IN/OUT : - CM , CH , TAUSS , & ! IN/OUT : - GRAIN , GDD , PGS , & ! IN/OUT - SMCWTD ,DEEPRECH , RECH , & ! IN/OUT : - GECROS1D, & ! IN/OUT : - QTLDRN , TDFRACMP, & ! IN/OUT : tile drainage - Z0WRF , & ! OUT : - IRCNTSI , IRCNTMI , IRCNTFI , IRAMTSI , IRAMTMI , IRAMTFI , & ! IN/OUT : Irrigation: vars - IRSIRATE, IRMIRATE, IRFIRATE, FIRR , EIRR , & ! IN/OUT : Irrigation: vars - FSA , FSR , FIRA , FSH , SSOIL , FCEV , & ! OUT : - FGEV , FCTR , ECAN , ETRAN , ESOIL , TRAD , & ! OUT : - TGB , TGV , T2MV , T2MB , Q2MV , Q2MB , & ! OUT : - RUNSF , RUNSB , APAR , PSN , SAV , SAG , & ! OUT : - FSNO , NEE , GPP , NPP , FVEGMP , SALB , & ! OUT : - QSNBOT , PONDING , PONDING1, PONDING2, RSSUN , RSSHA , & ! OUT : - ALBSND , ALBSNI , & ! OUT : - BGAP , WGAP , CHV , CHB , EMISSI , & ! OUT : - SHG , SHC , SHB , EVG , EVB , GHV , & ! OUT : - GHB , IRG , IRC , IRB , TR , EVC , & ! OUT : - CHLEAF , CHUC , CHV2 , CHB2 , FPICE , PAHV , & ! OUT : - PAHG , PAHB , PAH , LAISUN , LAISHA , RB , & ! OUT : - QINTS , QINTR , QDRIPS , QDRIPR , QTHROS , QTHROR , & ! OUT : - QSNSUB , QSNFRO , QSUBC , QFROC , QFRZC , QMELTC , & ! OUT : - QEVAC , QDEWC , & ! OUT : - RAININ , SNOWIN , ACC_SSOIL, ACC_QINSUR, ACC_QSEVA , & ! OUT : - ACC_ETRANI, HCPCT , EFLXB , CANHS , & ! OUT : - ACC_DWATER, ACC_PRCP, ACC_ECAN, ACC_ETRAN, ACC_EDIR & ! INOUT -#ifdef WRF_HYDRO - , sfcheadrt(i,j), WATBLED & -#endif - ) ! OUT : - - QFX(I,J) = ECAN + ESOIL + ETRAN + EIRR - LH(I,J) = FCEV + FGEV + FCTR + FIRR - - ENDIF ! glacial split ends - -#ifdef WRF_HYDRO -!AD_CHANGE: Glacier cells can produce small negative subsurface runoff for mass balance. -! This will crash channel routing, so only pass along positive runoff. - !soldrain(i,j) = max(RUNSB*dt, 0.0) !mm , underground runoff - soldrain(i,j) = max(RUNSB, 0.0) !mm , underground runoff - INFXSRT(i,j) = RUNSF !*dt !mm , surface runoff - qtiledrain (i,j) = QTLDRN !*dt !mm, tile drainage -#endif - - -! INPUT/OUTPUT - - TSK (I,J) = TRAD - HFX (I,J) = FSH - GRDFLX (I,J) = SSOIL - SMSTAV (I,J) = 0.0 ! [maintained as Noah consistency] - SMSTOT (I,J) = 0.0 ! [maintained as Noah consistency] - SFCRUNOFF(I,J) = SFCRUNOFF(I,J) + RUNSF !* DT - UDRUNOFF (I,J) = UDRUNOFF(I,J) + RUNSB !* DT - QTDRAIN (I,J) = QTDRAIN (I,J) + QTLDRN !* DT - IF ( SALB > -999 ) THEN - ALBEDO(I,J) = SALB - ENDIF - SNOWC (I,J) = FSNO - SMOIS (I, 1:NSOIL,J) = SMC ( 1:NSOIL) - SH2O (I, 1:NSOIL,J) = SMH2O ( 1:NSOIL) - TSLB (I, 1:NSOIL,J) = STC ( 1:NSOIL) - SNOW (I,J) = SWE - SNOWH (I,J) = SNDPTH - CANWAT (I,J) = CANLIQ + CANICE - ACSNOW (I,J) = ACSNOW(I,J) + PRECIP_IN(I,J) * FPICE - ACSNOM (I,J) = ACSNOM(I,J) + QSNBOT*DT + PONDING + PONDING1 + PONDING2 - EMISS (I,J) = EMISSI - QSFC (I,J) = QSFC1D - - ISNOWXY (I,J) = ISNOW - TVXY (I,J) = TV - TGXY (I,J) = TG - CANLIQXY (I,J) = CANLIQ - CANICEXY (I,J) = CANICE - EAHXY (I,J) = EAH - TAHXY (I,J) = TAH - CMXY (I,J) = CM - CHXY (I,J) = CH - FWETXY (I,J) = FWET - SNEQVOXY (I,J) = SNEQVO - ALBOLDXY (I,J) = ALBOLD - QSNOWXY (I,J) = QSNOW - QRAINXY (I,J) = QRAIN - WSLAKEXY (I,J) = WSLAKE - ZWTXY (I,J) = ZWT - WAXY (I,J) = WA - WTXY (I,J) = WT - TSNOXY (I,-NSNOW+1: 0,J) = STC (-NSNOW+1: 0) - ZSNSOXY (I,-NSNOW+1:NSOIL,J) = ZSNSO (-NSNOW+1:NSOIL) - SNICEXY (I,-NSNOW+1: 0,J) = SNICE (-NSNOW+1: 0) - SNLIQXY (I,-NSNOW+1: 0,J) = SNLIQ (-NSNOW+1: 0) - LFMASSXY (I,J) = LFMASS - RTMASSXY (I,J) = RTMASS - STMASSXY (I,J) = STMASS - WOODXY (I,J) = WOOD - STBLCPXY (I,J) = STBLCP - FASTCPXY (I,J) = FASTCP - XLAIXY (I,J) = PLAI - XSAIXY (I,J) = PSAI - TAUSSXY (I,J) = TAUSS - -! OUTPUT - Z0 (I,J) = Z0WRF - ZNT (I,J) = Z0WRF - T2MVXY (I,J) = T2MV - T2MBXY (I,J) = T2MB - Q2MVXY (I,J) = Q2MV/(1.0 - Q2MV) ! specific humidity to mixing ratio - Q2MBXY (I,J) = Q2MB/(1.0 - Q2MB) ! consistent with registry def of Q2 - TRADXY (I,J) = TRAD - NEEXY (I,J) = NEE - GPPXY (I,J) = GPP - NPPXY (I,J) = NPP - FVEGXY (I,J) = FVEGMP - RUNSFXY (I,J) = RUNSF - RUNSBXY (I,J) = RUNSB - ECANXY (I,J) = ECAN - EDIRXY (I,J) = ESOIL - ETRANXY (I,J) = ETRAN - FSAXY (I,J) = FSA - FIRAXY (I,J) = FIRA - APARXY (I,J) = APAR - PSNXY (I,J) = PSN - SAVXY (I,J) = SAV - SAGXY (I,J) = SAG - RSSUNXY (I,J) = RSSUN - RSSHAXY (I,J) = RSSHA - LAISUN = MAX(LAISUN, 0.0) - LAISHA = MAX(LAISHA, 0.0) - RB = MAX(RB, 0.0) -! New Calculation of total Canopy/Stomatal Conductance Based on Bonan et al. (2011) -! -- Inverse of Canopy Resistance (below) - IF(RSSUN .le. 0.0 .or. RSSHA .le. 0.0 .or. LAISUN .eq. 0.0 .or. LAISHA .eq. 0.0) THEN - RS (I,J) = 0.0 - ELSE - RS (I,J) = ((1.0/(RSSUN+RB)*LAISUN) + ((1.0/(RSSHA+RB))*LAISHA)) - RS (I,J) = 1.0/RS(I,J) !Resistance - ENDIF - BGAPXY (I,J) = BGAP - WGAPXY (I,J) = WGAP - TGVXY (I,J) = TGV - TGBXY (I,J) = TGB - CHVXY (I,J) = CHV - CHBXY (I,J) = CHB - IRCXY (I,J) = IRC - IRGXY (I,J) = IRG - SHCXY (I,J) = SHC - SHGXY (I,J) = SHG - EVGXY (I,J) = EVG - GHVXY (I,J) = GHV - IRBXY (I,J) = IRB - SHBXY (I,J) = SHB - EVBXY (I,J) = EVB - GHBXY (I,J) = GHB - canhsxy (I,J) = CANHS - TRXY (I,J) = TR - EVCXY (I,J) = EVC - CHLEAFXY (I,J) = CHLEAF - CHUCXY (I,J) = CHUC - CHV2XY (I,J) = CHV2 - CHB2XY (I,J) = CHB2 - PAHXY (I,J) = PAH - PAHGXY (I,J) = PAHG - PAHBXY (I,J) = PAHB - PAHVXY (I,J) = PAHV - QINTSXY (I,J) = QINTS - QINTRXY (I,J) = QINTR - QDRIPSXY (I,J) = QDRIPS - QDRIPRXY (I,J) = QDRIPR - QTHROSXY (I,J) = QTHROS - QTHRORXY (I,J) = QTHROR - QSNSUBXY (I,J) = QSNSUB - QSNFROXY (I,J) = QSNFRO - QSUBCXY (I,J) = QSUBC - QFROCXY (I,J) = QFROC - QEVACXY (I,J) = QEVAC - QDEWCXY (I,J) = QDEWC - QFRZCXY (I,J) = QFRZC - QMELTCXY (I,J) = QMELTC - QSNBOTXY (I,J) = QSNBOT - PONDINGXY (I,J) = PONDING + PONDING1 + PONDING2 - FPICEXY (I,J) = FPICE - RAINLSM (I,J) = RAININ - SNOWLSM (I,J) = SNOWIN - FORCTLSM (I,J) = T_ML - FORCQLSM (I,J) = Q_ML - FORCPLSM (I,J) = P_ML - FORCZLSM (I,J) = Z_ML - FORCWLSM (I,J) = SQRT(U_ML*U_ML + V_ML*V_ML) - RECHXY (I,J) = RECHXY(I,J) + RECH*1.E3 !RECHARGE TO THE WATER TABLE - DEEPRECHXY(I,J) = DEEPRECHXY(I,J) + DEEPRECH - SMCWTDXY(I,J) = SMCWTD - ACC_SSOILXY (I,J) = ACC_SSOIL - ACC_QINSURXY(I,J) = ACC_QINSUR - ACC_QSEVAXY (I,J) = ACC_QSEVA - ACC_ETRANIXY(I,:,J) = ACC_ETRANI - ACC_DWATERXY(I,J) = ACC_DWATER - ACC_PRCPXY (I,J) = ACC_PRCP - ACC_ECANXY (I,J) = ACC_ECAN - ACC_ETRANXY (I,J) = ACC_ETRAN - ACC_EDIRXY (I,J) = ACC_EDIR - EFLXBXY (I,J) = EFLXB - SNOWENERGY(I,J) = 0.0 - SOILENERGY(I,J) = 0.0 - DO K = ISNOW+1, NSOIL - IF(K == ISNOW+1) THEN - DZSNSO = - ZSNSO(K) - ELSE - DZSNSO = ZSNSO(K-1) - ZSNSO(K) - END IF - IF(K >= 1) THEN - SOILENERGY(I,J) = SOILENERGY(I,J) + DZSNSO * HCPCT(K) * (STC(K)-273.16) * 0.001 - ELSE - SNOWENERGY(I,J) = SNOWENERGY(I,J) + DZSNSO * HCPCT(K) * (STC(K)-273.16) * 0.001 - END IF - ENDDO - - GRAINXY (I,J) = GRAIN !GRAIN XING - GDDXY (I,J) = GDD !XING - PGSXY (I,J) = PGS - - ! irrigation - IRNUMSI(I,J) = IRCNTSI - IRNUMMI(I,J) = IRCNTMI - IRNUMFI(I,J) = IRCNTFI - IRWATSI(I,J) = IRAMTSI - IRWATMI(I,J) = IRAMTMI - IRWATFI(I,J) = IRAMTFI - IRSIVOL(I,J) = IRSIVOL(I,J)+(IRSIRATE*1000.0) - IRMIVOL(I,J) = IRMIVOL(I,J)+(IRMIRATE*1000.0) - IRFIVOL(I,J) = IRFIVOL(I,J)+(IRFIRATE*1000.0) - IRELOSS(I,J) = IRELOSS(I,J)+(EIRR*DT) ! mm - IRRSPLH(I,J) = IRRSPLH(I,J)+(FIRR*DT) ! Joules/m^2 - - if(iopt_crop == 2) then ! gecros crop model - - !*** Check for harvest - if ((gecros1d(1) >= gecros_ds1).and.(gecros1d(42) < 0)) then - if (checkIfHarvest(gecros_state, DT, gecros_ds1, gecros_ds2, gecros_ds1x, & - gecros_ds2x) == 1) then - - call gecros_reinit(gecros1d) - endif - endif - - gecros_state (i,1:60,j) = gecros1d(1:60) - end if - - ENDIF ! endif of land-sea test - - ENDDO ILOOP ! of I loop - ENDDO JLOOP ! of J loop - -!------------------------------------------------------ - END SUBROUTINE noahmplsm -!------------------------------------------------------ - -SUBROUTINE TRANSFER_MP_PARAMETERS(VEGTYPE,SOILTYPE,SLOPETYPE,SOILCOLOR,CROPTYPE,parameters) - - USE NOAHMP_TABLES - USE MODULE_SF_NOAHMPLSM - - implicit none - - INTEGER, INTENT(IN) :: VEGTYPE - INTEGER, INTENT(IN) :: SOILTYPE(4) - INTEGER, INTENT(IN) :: SLOPETYPE - INTEGER, INTENT(IN) :: SOILCOLOR - INTEGER, INTENT(IN) :: CROPTYPE - - type (noahmp_parameters), intent(inout) :: parameters - - REAL :: REFDK - REAL :: REFKDT - REAL :: FRZK - REAL :: FRZFACT - INTEGER :: ISOIL - - parameters%ISWATER = ISWATER_TABLE - parameters%ISBARREN = ISBARREN_TABLE - parameters%ISICE = ISICE_TABLE - parameters%ISCROP = ISCROP_TABLE - parameters%EBLFOREST = EBLFOREST_TABLE - - parameters%URBAN_FLAG = .FALSE. - IF( VEGTYPE == ISURBAN_TABLE .or. VEGTYPE == LCZ_1_TABLE .or. VEGTYPE == LCZ_2_TABLE .or. & - VEGTYPE == LCZ_3_TABLE .or. VEGTYPE == LCZ_4_TABLE .or. VEGTYPE == LCZ_5_TABLE .or. & - VEGTYPE == LCZ_6_TABLE .or. VEGTYPE == LCZ_7_TABLE .or. VEGTYPE == LCZ_8_TABLE .or. & - VEGTYPE == LCZ_9_TABLE .or. VEGTYPE == LCZ_10_TABLE .or. VEGTYPE == LCZ_11_TABLE ) THEN - parameters%URBAN_FLAG = .TRUE. - ENDIF - -!------------------------------------------------------------------------------------------! -! Transfer veg parameters -!------------------------------------------------------------------------------------------! - - parameters%CH2OP = CH2OP_TABLE(VEGTYPE) !maximum intercepted h2o per unit lai+sai (mm) - parameters%DLEAF = DLEAF_TABLE(VEGTYPE) !characteristic leaf dimension (m) - parameters%Z0MVT = Z0MVT_TABLE(VEGTYPE) !momentum roughness length (m) - parameters%HVT = HVT_TABLE(VEGTYPE) !top of canopy (m) - parameters%HVB = HVB_TABLE(VEGTYPE) !bottom of canopy (m) - parameters%DEN = DEN_TABLE(VEGTYPE) !tree density (no. of trunks per m2) - parameters%RC = RC_TABLE(VEGTYPE) !tree crown radius (m) - parameters%MFSNO = MFSNO_TABLE(VEGTYPE) !snowmelt m parameter () - parameters%SCFFAC = SCFFAC_TABLE(VEGTYPE) !snow cover factor (m) (originally hard-coded 2.5*z0 in SCF formulation) - parameters%SAIM = SAIM_TABLE(VEGTYPE,:) !monthly stem area index, one-sided - parameters%LAIM = LAIM_TABLE(VEGTYPE,:) !monthly leaf area index, one-sided - parameters%SLA = SLA_TABLE(VEGTYPE) !single-side leaf area per Kg [m2/kg] - parameters%DILEFC = DILEFC_TABLE(VEGTYPE) !coeficient for leaf stress death [1/s] - parameters%DILEFW = DILEFW_TABLE(VEGTYPE) !coeficient for leaf stress death [1/s] - parameters%FRAGR = FRAGR_TABLE(VEGTYPE) !fraction of growth respiration !original was 0.3 - parameters%LTOVRC = LTOVRC_TABLE(VEGTYPE) !leaf turnover [1/s] - - parameters%C3PSN = C3PSN_TABLE(VEGTYPE) !photosynthetic pathway: 0. = c4, 1. = c3 - parameters%KC25 = KC25_TABLE(VEGTYPE) !co2 michaelis-menten constant at 25c (pa) - parameters%AKC = AKC_TABLE(VEGTYPE) !q10 for kc25 - parameters%KO25 = KO25_TABLE(VEGTYPE) !o2 michaelis-menten constant at 25c (pa) - parameters%AKO = AKO_TABLE(VEGTYPE) !q10 for ko25 - parameters%VCMX25 = VCMX25_TABLE(VEGTYPE) !maximum rate of carboxylation at 25c (umol co2/m**2/s) - parameters%AVCMX = AVCMX_TABLE(VEGTYPE) !q10 for vcmx25 - parameters%BP = BP_TABLE(VEGTYPE) !minimum leaf conductance (umol/m**2/s) - parameters%MP = MP_TABLE(VEGTYPE) !slope of conductance-to-photosynthesis relationship - parameters%QE25 = QE25_TABLE(VEGTYPE) !quantum efficiency at 25c (umol co2 / umol photon) - parameters%AQE = AQE_TABLE(VEGTYPE) !q10 for qe25 - parameters%RMF25 = RMF25_TABLE(VEGTYPE) !leaf maintenance respiration at 25c (umol co2/m**2/s) - parameters%RMS25 = RMS25_TABLE(VEGTYPE) !stem maintenance respiration at 25c (umol co2/kg bio/s) - parameters%RMR25 = RMR25_TABLE(VEGTYPE) !root maintenance respiration at 25c (umol co2/kg bio/s) - parameters%ARM = ARM_TABLE(VEGTYPE) !q10 for maintenance respiration - parameters%FOLNMX = FOLNMX_TABLE(VEGTYPE) !foliage nitrogen concentration when f(n)=1 (%) - parameters%TMIN = TMIN_TABLE(VEGTYPE) !minimum temperature for photosynthesis (k) - - parameters%XL = XL_TABLE(VEGTYPE) !leaf/stem orientation index - parameters%RHOL = RHOL_TABLE(VEGTYPE,:) !leaf reflectance: 1=vis, 2=nir - parameters%RHOS = RHOS_TABLE(VEGTYPE,:) !stem reflectance: 1=vis, 2=nir - parameters%TAUL = TAUL_TABLE(VEGTYPE,:) !leaf transmittance: 1=vis, 2=nir - parameters%TAUS = TAUS_TABLE(VEGTYPE,:) !stem transmittance: 1=vis, 2=nir - - parameters%MRP = MRP_TABLE(VEGTYPE) !microbial respiration parameter (umol co2 /kg c/ s) - parameters%CWPVT = CWPVT_TABLE(VEGTYPE) !empirical canopy wind parameter - - parameters%WRRAT = WRRAT_TABLE(VEGTYPE) !wood to non-wood ratio - parameters%WDPOOL = WDPOOL_TABLE(VEGTYPE) !wood pool (switch 1 or 0) depending on woody or not [-] - parameters%TDLEF = TDLEF_TABLE(VEGTYPE) !characteristic T for leaf freezing [K] - - parameters%NROOT = NROOT_TABLE(VEGTYPE) !number of soil layers with root present - parameters%RGL = RGL_TABLE(VEGTYPE) !Parameter used in radiation stress function - parameters%RSMIN = RS_TABLE(VEGTYPE) !Minimum stomatal resistance [s m-1] - parameters%HS = HS_TABLE(VEGTYPE) !Parameter used in vapor pressure deficit function - parameters%TOPT = TOPT_TABLE(VEGTYPE) !Optimum transpiration air temperature [K] - parameters%RSMAX = RSMAX_TABLE(VEGTYPE) !Maximal stomatal resistance [s m-1] - -!------------------------------------------------------------------------------------------! -! Transfer rad parameters -!------------------------------------------------------------------------------------------! - - parameters%ALBSAT = ALBSAT_TABLE(SOILCOLOR,:) - parameters%ALBDRY = ALBDRY_TABLE(SOILCOLOR,:) - parameters%ALBICE = ALBICE_TABLE - parameters%ALBLAK = ALBLAK_TABLE - parameters%OMEGAS = OMEGAS_TABLE - parameters%BETADS = BETADS_TABLE - parameters%BETAIS = BETAIS_TABLE - parameters%EG = EG_TABLE - -!------------------------------------------------------------------------------------------! -! Transfer crop parameters -!------------------------------------------------------------------------------------------! - - IF(CROPTYPE > 0) THEN - parameters%PLTDAY = PLTDAY_TABLE(CROPTYPE) ! Planting date - parameters%HSDAY = HSDAY_TABLE(CROPTYPE) ! Harvest date - parameters%PLANTPOP = PLANTPOP_TABLE(CROPTYPE) ! Plant density [per ha] - used? - parameters%IRRI = IRRI_TABLE(CROPTYPE) ! Irrigation strategy 0= non-irrigation 1=irrigation (no water-stress) - parameters%GDDTBASE = GDDTBASE_TABLE(CROPTYPE) ! Base temperature for GDD accumulation [C] - parameters%GDDTCUT = GDDTCUT_TABLE(CROPTYPE) ! Upper temperature for GDD accumulation [C] - parameters%GDDS1 = GDDS1_TABLE(CROPTYPE) ! GDD from seeding to emergence - parameters%GDDS2 = GDDS2_TABLE(CROPTYPE) ! GDD from seeding to initial vegetative - parameters%GDDS3 = GDDS3_TABLE(CROPTYPE) ! GDD from seeding to post vegetative - parameters%GDDS4 = GDDS4_TABLE(CROPTYPE) ! GDD from seeding to intial reproductive - parameters%GDDS5 = GDDS5_TABLE(CROPTYPE) ! GDD from seeding to pysical maturity - parameters%C3PSN = C3PSNI_TABLE(CROPTYPE) ! parameters from stomata ! Zhe Zhang 2020-07-13 - parameters%KC25 = KC25I_TABLE(CROPTYPE) - parameters%AKC = AKCI_TABLE(CROPTYPE) - parameters%KO25 = KO25I_TABLE(CROPTYPE) - parameters%AKO = AKOI_TABLE(CROPTYPE) - parameters%AVCMX = AVCMXI_TABLE(CROPTYPE) - parameters%VCMX25 = VCMX25I_TABLE(CROPTYPE) - parameters%BP = BPI_TABLE(CROPTYPE) - parameters%MP = MPI_TABLE(CROPTYPE) - parameters%FOLNMX = FOLNMXI_TABLE(CROPTYPE) - parameters%QE25 = QE25I_TABLE(CROPTYPE) ! ends here - parameters%C3C4 = C3C4_TABLE(CROPTYPE) ! photosynthetic pathway: 1. = c3 2. = c4 - parameters%AREF = AREF_TABLE(CROPTYPE) ! reference maximum CO2 assimulation rate - parameters%PSNRF = PSNRF_TABLE(CROPTYPE) ! CO2 assimulation reduction factor(0-1) (caused by non-modeling part,e.g.pest,weeds) - parameters%I2PAR = I2PAR_TABLE(CROPTYPE) ! Fraction of incoming solar radiation to photosynthetically active radiation - parameters%TASSIM0 = TASSIM0_TABLE(CROPTYPE) ! Minimum temperature for CO2 assimulation [C] - parameters%TASSIM1 = TASSIM1_TABLE(CROPTYPE) ! CO2 assimulation linearly increasing until temperature reaches T1 [C] - parameters%TASSIM2 = TASSIM2_TABLE(CROPTYPE) ! CO2 assmilation rate remain at Aref until temperature reaches T2 [C] - parameters%K = K_TABLE(CROPTYPE) ! light extinction coefficient - parameters%EPSI = EPSI_TABLE(CROPTYPE) ! initial light use efficiency - parameters%Q10MR = Q10MR_TABLE(CROPTYPE) ! q10 for maintainance respiration - parameters%FOLN_MX = FOLN_MX_TABLE(CROPTYPE) ! foliage nitrogen concentration when f(n)=1 (%) - parameters%LEFREEZ = LEFREEZ_TABLE(CROPTYPE) ! characteristic T for leaf freezing [K] - parameters%DILE_FC = DILE_FC_TABLE(CROPTYPE,:) ! coeficient for temperature leaf stress death [1/s] - parameters%DILE_FW = DILE_FW_TABLE(CROPTYPE,:) ! coeficient for water leaf stress death [1/s] - parameters%FRA_GR = FRA_GR_TABLE(CROPTYPE) ! fraction of growth respiration - parameters%LF_OVRC = LF_OVRC_TABLE(CROPTYPE,:) ! fraction of leaf turnover [1/s] - parameters%ST_OVRC = ST_OVRC_TABLE(CROPTYPE,:) ! fraction of stem turnover [1/s] - parameters%RT_OVRC = RT_OVRC_TABLE(CROPTYPE,:) ! fraction of root tunrover [1/s] - parameters%LFMR25 = LFMR25_TABLE(CROPTYPE) ! leaf maintenance respiration at 25C [umol CO2/m**2 /s] - parameters%STMR25 = STMR25_TABLE(CROPTYPE) ! stem maintenance respiration at 25C [umol CO2/kg bio/s] - parameters%RTMR25 = RTMR25_TABLE(CROPTYPE) ! root maintenance respiration at 25C [umol CO2/kg bio/s] - parameters%GRAINMR25 = GRAINMR25_TABLE(CROPTYPE) ! grain maintenance respiration at 25C [umol CO2/kg bio/s] - parameters%LFPT = LFPT_TABLE(CROPTYPE,:) ! fraction of carbohydrate flux to leaf - parameters%STPT = STPT_TABLE(CROPTYPE,:) ! fraction of carbohydrate flux to stem - parameters%RTPT = RTPT_TABLE(CROPTYPE,:) ! fraction of carbohydrate flux to root - parameters%GRAINPT = GRAINPT_TABLE(CROPTYPE,:) ! fraction of carbohydrate flux to grain - parameters%LFCT = LFCT_TABLE(CROPTYPE,:) ! fraction of translocation to grain ! Zhe Zhang 2020-07-13 - parameters%STCT = STCT_TABLE(CROPTYPE,:) ! fraction of translocation to grain - parameters%RTCT = RTCT_TABLE(CROPTYPE,:) ! fraction of translocation to grain - parameters%BIO2LAI = BIO2LAI_TABLE(CROPTYPE) ! leaf are per living leaf biomass [m^2/kg] - END IF - -!------------------------------------------------------------------------------------------! -! Transfer global parameters -!------------------------------------------------------------------------------------------! - - parameters%CO2 = CO2_TABLE - parameters%O2 = O2_TABLE - parameters%TIMEAN = TIMEAN_TABLE - parameters%FSATMX = FSATMX_TABLE - parameters%Z0SNO = Z0SNO_TABLE - parameters%SSI = SSI_TABLE - parameters%SNOW_RET_FAC = SNOW_RET_FAC_TABLE - parameters%SNOW_EMIS = SNOW_EMIS_TABLE - parameters%SWEMX = SWEMX_TABLE - parameters%TAU0 = TAU0_TABLE - parameters%GRAIN_GROWTH = GRAIN_GROWTH_TABLE - parameters%EXTRA_GROWTH = EXTRA_GROWTH_TABLE - parameters%DIRT_SOOT = DIRT_SOOT_TABLE - parameters%BATS_COSZ = BATS_COSZ_TABLE - parameters%BATS_VIS_NEW = BATS_VIS_NEW_TABLE - parameters%BATS_NIR_NEW = BATS_NIR_NEW_TABLE - parameters%BATS_VIS_AGE = BATS_VIS_AGE_TABLE - parameters%BATS_NIR_AGE = BATS_NIR_AGE_TABLE - parameters%BATS_VIS_DIR = BATS_VIS_DIR_TABLE - parameters%BATS_NIR_DIR = BATS_NIR_DIR_TABLE - parameters%RSURF_SNOW = RSURF_SNOW_TABLE - parameters%RSURF_EXP = RSURF_EXP_TABLE - -! ---------------------------------------------------------------------- -! Transfer soil parameters -! ---------------------------------------------------------------------- - - do isoil = 1, size(soiltype) - parameters%BEXP(isoil) = BEXP_TABLE (SOILTYPE(isoil)) - parameters%DKSAT(isoil) = DKSAT_TABLE (SOILTYPE(isoil)) - parameters%DWSAT(isoil) = DWSAT_TABLE (SOILTYPE(isoil)) - parameters%PSISAT(isoil) = PSISAT_TABLE (SOILTYPE(isoil)) - parameters%QUARTZ(isoil) = QUARTZ_TABLE (SOILTYPE(isoil)) - parameters%SMCDRY(isoil) = SMCDRY_TABLE (SOILTYPE(isoil)) - parameters%SMCMAX(isoil) = SMCMAX_TABLE (SOILTYPE(isoil)) - parameters%SMCREF(isoil) = SMCREF_TABLE (SOILTYPE(isoil)) - parameters%SMCWLT(isoil) = SMCWLT_TABLE (SOILTYPE(isoil)) - end do - parameters%F1 = F1_TABLE(SOILTYPE(1)) - parameters%REFDK = REFDK_TABLE - parameters%REFKDT = REFKDT_TABLE - parameters%BVIC = BVIC_TABLE(SOILTYPE(1)) - parameters%AXAJ = AXAJ_TABLE(SOILTYPE(1)) - parameters%BXAJ = BXAJ_TABLE(SOILTYPE(1)) - parameters%XXAJ = XXAJ_TABLE(SOILTYPE(1)) - parameters%BDVIC = BDVIC_TABLE(SOILTYPE(1)) - parameters%GDVIC = GDVIC_TABLE(SOILTYPE(1)) - parameters%BBVIC = BBVIC_TABLE(SOILTYPE(1)) - -!------------------------------------------------------------------------------------------! -! Transfer irrigation parameters -!------------------------------------------------------------------------------------------! - parameters%IRR_FRAC = IRR_FRAC_TABLE ! irrigation Fraction - parameters%IRR_HAR = IRR_HAR_TABLE ! number of days before harvest date to stop irrigation - parameters%IRR_LAI = IRR_LAI_TABLE ! minimum lai to trigger irrigation - parameters%IRR_MAD = IRR_MAD_TABLE ! management allowable deficit (0-1) - parameters%FILOSS = FILOSS_TABLE ! fraction of flood irrigation loss (0-1) - parameters%SPRIR_RATE = SPRIR_RATE_TABLE ! mm/h, sprinkler irrigation rate - parameters%MICIR_RATE = MICIR_RATE_TABLE ! mm/h, micro irrigation rate - parameters%FIRTFAC = FIRTFAC_TABLE ! flood application rate factor - parameters%IR_RAIN = IR_RAIN_TABLE ! maximum precipitation to stop irrigation trigger - -!------------------------------------------------------------------------------------------! -! Transfer tiledrain parameters -!------------------------------------------------------------------------------------------! - parameters%KLAT_FAC = KLAT_FAC_TABLE(SOILTYPE(1)) - parameters%TDSMC_FAC = TDSMCFAC_TABLE(SOILTYPE(1)) - parameters%TD_DC = TD_DC_TABLE(SOILTYPE(1)) - parameters%TD_DCOEF = TD_DCOEF_TABLE(SOILTYPE(1)) - parameters%TD_RADI = TD_RADI_TABLE(SOILTYPE(1)) - parameters%TD_SPAC = TD_SPAC_TABLE(SOILTYPE(1)) - parameters%TD_DDRAIN = TD_DDRAIN_TABLE(SOILTYPE(1)) - parameters%TD_DEPTH = TD_DEPTH_TABLE(SOILTYPE(1)) - parameters%TD_ADEPTH = TD_ADEPTH_TABLE(SOILTYPE(1)) - parameters%DRAIN_LAYER_OPT = DRAIN_LAYER_OPT_TABLE - parameters%TD_D = TD_D_TABLE(SOILTYPE(1)) - -! ---------------------------------------------------------------------- -! Transfer GENPARM parameters -! ---------------------------------------------------------------------- - parameters%CSOIL = CSOIL_TABLE - parameters%ZBOT = ZBOT_TABLE - parameters%CZIL = CZIL_TABLE - - FRZK = FRZK_TABLE - parameters%KDT = parameters%REFKDT * parameters%DKSAT(1) / parameters%REFDK - parameters%SLOPE = SLOPE_TABLE(SLOPETYPE) - - IF(parameters%URBAN_FLAG)THEN ! Hardcoding some urban parameters for soil - parameters%SMCMAX = 0.45 - parameters%SMCREF = 0.42 - parameters%SMCWLT = 0.40 - parameters%SMCDRY = 0.40 - parameters%CSOIL = 3.E6 - ENDIF - -! adjust FRZK parameter to actual soil type: FRZK * FRZFACT - - IF(SOILTYPE(1) /= 14) then - FRZFACT = (parameters%SMCMAX(1) / parameters%SMCREF(1)) * (0.412 / 0.468) - parameters%FRZX = FRZK * FRZFACT - END IF - - END SUBROUTINE TRANSFER_MP_PARAMETERS - -SUBROUTINE PEDOTRANSFER_SR2006(nsoil,sand,clay,orgm,parameters) - - use module_sf_noahmplsm - use noahmp_tables - - implicit none - - integer, intent(in ) :: nsoil ! number of soil layers - real, dimension( 1:nsoil ), intent(inout) :: sand - real, dimension( 1:nsoil ), intent(inout) :: clay - real, dimension( 1:nsoil ), intent(inout) :: orgm - - real, dimension( 1:nsoil ) :: theta_1500t - real, dimension( 1:nsoil ) :: theta_1500 - real, dimension( 1:nsoil ) :: theta_33t - real, dimension( 1:nsoil ) :: theta_33 - real, dimension( 1:nsoil ) :: theta_s33t - real, dimension( 1:nsoil ) :: theta_s33 - real, dimension( 1:nsoil ) :: psi_et - real, dimension( 1:nsoil ) :: psi_e - - type(noahmp_parameters), intent(inout) :: parameters - integer :: k - - do k = 1,4 - if(sand(k) <= 0 .or. clay(k) <= 0) then - sand(k) = 0.41 - clay(k) = 0.18 - end if - if(orgm(k) <= 0 ) orgm(k) = 0.0 - end do - - theta_1500t = sr2006_theta_1500t_a*sand & - + sr2006_theta_1500t_b*clay & - + sr2006_theta_1500t_c*orgm & - + sr2006_theta_1500t_d*sand*orgm & - + sr2006_theta_1500t_e*clay*orgm & - + sr2006_theta_1500t_f*sand*clay & - + sr2006_theta_1500t_g - - theta_1500 = theta_1500t & - + sr2006_theta_1500_a*theta_1500t & - + sr2006_theta_1500_b - - theta_33t = sr2006_theta_33t_a*sand & - + sr2006_theta_33t_b*clay & - + sr2006_theta_33t_c*orgm & - + sr2006_theta_33t_d*sand*orgm & - + sr2006_theta_33t_e*clay*orgm & - + sr2006_theta_33t_f*sand*clay & - + sr2006_theta_33t_g - - theta_33 = theta_33t & - + sr2006_theta_33_a*theta_33t*theta_33t & - + sr2006_theta_33_b*theta_33t & - + sr2006_theta_33_c - - theta_s33t = sr2006_theta_s33t_a*sand & - + sr2006_theta_s33t_b*clay & - + sr2006_theta_s33t_c*orgm & - + sr2006_theta_s33t_d*sand*orgm & - + sr2006_theta_s33t_e*clay*orgm & - + sr2006_theta_s33t_f*sand*clay & - + sr2006_theta_s33t_g - - theta_s33 = theta_s33t & - + sr2006_theta_s33_a*theta_s33t & - + sr2006_theta_s33_b - - psi_et = sr2006_psi_et_a*sand & - + sr2006_psi_et_b*clay & - + sr2006_psi_et_c*theta_s33 & - + sr2006_psi_et_d*sand*theta_s33 & - + sr2006_psi_et_e*clay*theta_s33 & - + sr2006_psi_et_f*sand*clay & - + sr2006_psi_et_g - - psi_e = psi_et & - + sr2006_psi_e_a*psi_et*psi_et & - + sr2006_psi_e_b*psi_et & - + sr2006_psi_e_c - - parameters%smcwlt = theta_1500 - parameters%smcref = theta_33 - parameters%smcmax = theta_33 & - + theta_s33 & - + sr2006_smcmax_a*sand & - + sr2006_smcmax_b - - parameters%bexp = 3.816712826 / (log(theta_33) - log(theta_1500) ) - parameters%psisat = psi_e - parameters%dksat = 1930.0 * (parameters%smcmax - theta_33) ** (3.0 - 1.0/parameters%bexp) - parameters%quartz = sand - -! Units conversion - - parameters%psisat = max(0.1,parameters%psisat) ! arbitrarily impose a limit of 0.1kpa - parameters%psisat = 0.101997 * parameters%psisat ! convert kpa to m - parameters%dksat = parameters%dksat / 3600000.0 ! convert mm/h to m/s - parameters%dwsat = parameters%dksat * parameters%psisat *parameters%bexp / parameters%smcmax ! units should be m*m/s - parameters%smcdry = parameters%smcwlt - -! Introducing somewhat arbitrary limits (based on SOILPARM) to prevent bad things - - parameters%smcmax = max(0.32 ,min(parameters%smcmax, 0.50 )) - parameters%smcref = max(0.17 ,min(parameters%smcref,parameters%smcmax )) - parameters%smcwlt = max(0.01 ,min(parameters%smcwlt,parameters%smcref )) - parameters%smcdry = max(0.01 ,min(parameters%smcdry,parameters%smcref )) - parameters%bexp = max(2.50 ,min(parameters%bexp, 12.0 )) - parameters%psisat = max(0.03 ,min(parameters%psisat, 1.00 )) - parameters%dksat = max(5.e-7,min(parameters%dksat, 1.e-5)) - parameters%dwsat = max(1.e-6,min(parameters%dwsat, 3.e-5)) - parameters%quartz = max(0.05 ,min(parameters%quartz, 0.95 )) - - END SUBROUTINE PEDOTRANSFER_SR2006 - - SUBROUTINE NOAHMP_INIT ( MMINLU, SNOW , SNOWH , CANWAT , ISLTYP , IVGTYP, XLAT, & - TSLB , SMOIS , SH2O , DZS , FNDSOILW , FNDSNOWH , & - TSK, isnowxy , tvxy ,tgxy ,canicexy , TMN, XICE, & - canliqxy ,eahxy ,tahxy ,cmxy ,chxy , & - fwetxy ,sneqvoxy ,alboldxy ,qsnowxy, qrainxy, wslakexy, zwtxy, waxy, & - wtxy ,tsnoxy ,zsnsoxy ,snicexy ,snliqxy ,lfmassxy ,rtmassxy , & - stmassxy ,woodxy ,stblcpxy ,fastcpxy ,xsaixy ,lai , & - grainxy ,gddxy , & - croptype ,cropcat , & - irnumsi ,irnummi ,irnumfi ,irwatsi, & - irwatmi ,irwatfi ,ireloss ,irsivol, & - irmivol ,irfivol ,irrsplh , & -!jref:start - t2mvxy ,t2mbxy ,chstarxy, & -!jref:end - NSOIL, restart, & - allowed_to_read , iopt_run, iopt_crop, iopt_irr, iopt_irrm, & - sf_urban_physics, & ! urban scheme - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte, & - smoiseq ,smcwtdxy ,rechxy ,deeprechxy, qtdrain, areaxy, dx, dy, msftx, msfty,& ! Optional groundwater - wtddt ,stepwtd ,dt ,qrfsxy ,qspringsxy , qslatxy , & ! Optional groundwater - fdepthxy ,ht ,riverbedxy ,eqzwt ,rivercondxy ,pexpxy , & ! Optional groundwater - rechclim, & ! Optional groundwater - gecros_state) ! Optional gecros crop - - USE NOAHMP_TABLES - use module_sf_gecros, only: seednc,sla0,slnmin,ffat,flig,foac,fmin,npl,seedw,eg,fcrsh,seednc,lnci,cfv - - - IMPLICIT NONE - -! Initializing Canopy air temperature to 287 K seems dangerous to me [KWM]. - - INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, & - & ims,ime, jms,jme, kms,kme, & - & its,ite, jts,jte, kts,kte - - INTEGER, INTENT(IN) :: NSOIL, iopt_run, iopt_crop, iopt_irr, iopt_irrm - - LOGICAL, INTENT(IN) :: restart, & - & allowed_to_read - INTEGER, INTENT(IN) :: sf_urban_physics ! urban, by yizhou - - REAL, DIMENSION( NSOIL), INTENT(IN) :: DZS ! Thickness of the soil layers [m] - REAL, INTENT(IN) , OPTIONAL :: DX, DY - REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(IN) , OPTIONAL :: MSFTX,MSFTY - - REAL, DIMENSION( ims:ime, NSOIL, jms:jme ) , & - & INTENT(INOUT) :: SMOIS, & - & SH2O, & - & TSLB - - REAL, DIMENSION( ims:ime, jms:jme ) , & - & INTENT(INOUT) :: SNOW, & - & SNOWH, & - & CANWAT - - INTEGER, DIMENSION( ims:ime, jms:jme ), & - & INTENT(IN) :: ISLTYP, & - IVGTYP - - LOGICAL, INTENT(IN) :: FNDSOILW, & - & FNDSNOWH - - REAL, DIMENSION(ims:ime,jms:jme), INTENT(IN) :: XLAT !latitude - REAL, DIMENSION(ims:ime,jms:jme), INTENT(IN) :: TSK !skin temperature (k) - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: TMN !deep soil temperature (k) - REAL, DIMENSION(ims:ime,jms:jme), INTENT(IN) :: XICE !sea ice fraction - INTEGER, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: isnowxy !actual no. of snow layers - REAL, DIMENSION(ims:ime,-2:NSOIL,jms:jme), INTENT(INOUT) :: zsnsoxy !snow layer depth [m] - REAL, DIMENSION(ims:ime,-2: 0,jms:jme), INTENT(INOUT) :: tsnoxy !snow temperature [K] - REAL, DIMENSION(ims:ime,-2: 0,jms:jme), INTENT(INOUT) :: snicexy !snow layer ice [mm] - REAL, DIMENSION(ims:ime,-2: 0,jms:jme), INTENT(INOUT) :: snliqxy !snow layer liquid water [mm] - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: tvxy !vegetation canopy temperature - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: tgxy !ground surface temperature - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: canicexy !canopy-intercepted ice (mm) - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: canliqxy !canopy-intercepted liquid water (mm) - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: eahxy !canopy air vapor pressure (pa) - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: tahxy !canopy air temperature (k) - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: cmxy !momentum drag coefficient - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: chxy !sensible heat exchange coefficient - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: fwetxy !wetted or snowed fraction of the canopy (-) - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: sneqvoxy !snow mass at last time step(mm h2o) - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: alboldxy !snow albedo at last time step (-) - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: qsnowxy !snowfall on the ground [mm/s] - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: qrainxy !rainfall on the ground [mm/s] - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: wslakexy !lake water storage [mm] - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: zwtxy !water table depth [m] - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: waxy !water in the "aquifer" [mm] - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: wtxy !groundwater storage [mm] - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: lfmassxy !leaf mass [g/m2] - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: rtmassxy !mass of fine roots [g/m2] - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: stmassxy !stem mass [g/m2] - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: woodxy !mass of wood (incl. woody roots) [g/m2] - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: grainxy !mass of grain [g/m2] !XING - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: gddxy !growing degree days !XING - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: stblcpxy !stable carbon in deep soil [g/m2] - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: fastcpxy !short-lived carbon, shallow soil [g/m2] - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: xsaixy !stem area index - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: lai !leaf area index - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: qtdrain !tile drainage (mm) - - INTEGER, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: cropcat - REAL , DIMENSION(ims:ime,5,jms:jme), INTENT(IN ) :: croptype - - INTEGER, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: irnumsi - INTEGER, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: irnummi - INTEGER, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: irnumfi - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: irwatsi - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: irwatmi - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: irwatfi - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: ireloss - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: irsivol - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: irmivol - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: irfivol - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: irrsplh - -! IOPT_RUN = 5 option - - REAL, DIMENSION(ims:ime,1:nsoil,jms:jme), INTENT(INOUT) , OPTIONAL :: smoiseq !equilibrium soil moisture content [m3m-3] - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) , OPTIONAL :: smcwtdxy !deep soil moisture content [m3m-3] - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) , OPTIONAL :: deeprechxy !deep recharge [m] - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) , OPTIONAL :: rechxy !accumulated recharge [mm] - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) , OPTIONAL :: qrfsxy !accumulated flux from groundwater to rivers [mm] - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) , OPTIONAL :: qspringsxy !accumulated seeping water [mm] - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) , OPTIONAL :: qslatxy !accumulated lateral flow [mm] - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) , OPTIONAL :: areaxy !grid cell area [m2] - REAL, DIMENSION(ims:ime,jms:jme), INTENT(IN) , OPTIONAL :: FDEPTHXY !efolding depth for transmissivity (m) - REAL, DIMENSION(ims:ime,jms:jme), INTENT(IN) , OPTIONAL :: HT !terrain height (m) - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) , OPTIONAL :: RIVERBEDXY !riverbed depth (m) - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) , OPTIONAL :: EQZWT !equilibrium water table depth (m) - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT), OPTIONAL :: RIVERCONDXY !river conductance - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT), OPTIONAL :: PEXPXY !factor for river conductance - REAL, DIMENSION(ims:ime,jms:jme), INTENT(IN) , OPTIONAL :: rechclim - - REAL, DIMENSION(ims:ime,60,jms:jme), INTENT(INOUT), OPTIONAL :: gecros_state ! Optional gecros crop - - INTEGER, INTENT(OUT) , OPTIONAL :: STEPWTD - REAL, INTENT(IN) , OPTIONAL :: DT, WTDDT - -!jref:start - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: t2mvxy !2m temperature vegetation part (k) - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: t2mbxy !2m temperature bare ground part (k) - REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: chstarxy !dummy -!jref:end - - - REAL, DIMENSION(1:NSOIL) :: ZSOIL ! Depth of the soil layer bottom (m) from - ! the surface (negative) - - REAL :: BEXP, SMCMAX, PSISAT - REAL :: FK, masslai,masssai - -! gecros local variables - REAL :: hti,rdi,fpro,lncmin,fcar,cfo,clvi,crti,ygo,nlvi,laii,nrti,slnbi - - - REAL, PARAMETER :: BLIM = 5.5 - REAL, PARAMETER :: HLICE = 3.335E5 - REAL, PARAMETER :: GRAV = 9.81 - REAL, PARAMETER :: T0 = 273.15 - - INTEGER :: errflag, i,j,itf,jtf,ns - - character(len=240) :: err_message - character(len=4) :: MMINSL - character(len=*), intent(in) :: MMINLU - MMINSL='STAS' - - call read_mp_veg_parameters(trim(MMINLU)) - call read_mp_soil_parameters() - call read_mp_rad_parameters() - call read_mp_global_parameters() - call read_mp_crop_parameters() - call read_tiledrain_parameters() - call read_mp_optional_parameters() - if(iopt_irr >= 1) call read_mp_irrigation_parameters() - - IF( .NOT. restart ) THEN - - itf=min0(ite,ide-1) - jtf=min0(jte,jde-1) - - ! - ! initialize physical snow height SNOWH - ! - IF(.NOT.FNDSNOWH)THEN - ! If no SNOWH do the following - CALL wrf_message( 'SNOW HEIGHT NOT FOUND - VALUE DEFINED IN LSMINIT' ) - DO J = jts,jtf - DO I = its,itf - SNOWH(I,J)=SNOW(I,J)*0.005 ! SNOW in mm and SNOWH in m - ENDDO - ENDDO - ENDIF - - - ! Check if snow/snowh are consistent and cap SWE at 2000mm; - ! the Noah-MP code does it internally but if we don't do it here, problems ensue - DO J = jts,jtf - DO I = its,itf - IF ( SNOW(i,j) > 0. .AND. SNOWH(i,j) == 0. .OR. SNOWH(i,j) > 0. .AND. SNOW(i,j) == 0.) THEN - WRITE(err_message,*)"problem with initial snow fields: snow/snowh>0 while snowh/snow=0 at i,j" & - ,i,j,snow(i,j),snowh(i,j) - CALL wrf_message(err_message) - ENDIF - IF ( SNOW( i,j ) > 2000.0 ) THEN - SNOWH(I,J) = SNOWH(I,J) * 2000.0 / SNOW(I,J) ! SNOW in mm and SNOWH in m - SNOW (I,J) = 2000.0 ! cap SNOW at 2000, maintain density - ENDIF - ENDDO - ENDDO - - errflag = 0 - DO j = jts,jtf - DO i = its,itf - IF ( ISLTYP( i,j ) .LT. 1 ) THEN - errflag = 1 - WRITE(err_message,*)"module_sf_noahlsm.F: lsminit: out of range ISLTYP ",i,j,ISLTYP( i,j ) - CALL wrf_message(err_message) - ENDIF - ENDDO - ENDDO - IF ( errflag .EQ. 1 ) THEN - CALL wrf_error_fatal( "module_sf_noahlsm.F: lsminit: out of range value "// & - "of ISLTYP. Is this field in the input?" ) - ENDIF -! GAC-->LATERALFLOW -! 20130219 - No longer need this - see module_data_gocart_dust -!#if ( WRF_CHEM == 1 ) -! ! -! ! need this parameter for dust parameterization in wrf/chem -! ! -! do I=1,NSLTYPE -! porosity(i)=maxsmc(i) -! enddo -!#endif -! <--GAC - -! initialize soil liquid water content SH2O - - DO J = jts , jtf - DO I = its , itf - IF(IVGTYP(I,J)==ISICE_TABLE .AND. XICE(I,J) <= 0.0) THEN - DO NS=1, NSOIL - SMOIS(I,NS,J) = 1.0 ! glacier starts all frozen - SH2O(I,NS,J) = 0.0 - TSLB(I,NS,J) = MIN(TSLB(I,NS,J),263.15) ! set glacier temp to at most -10C - END DO - !TMN(I,J) = MIN(TMN(I,J),263.15) ! set deep temp to at most -10C - SNOW(I,J) = MAX(SNOW(I,J), 10.0) ! set SWE to at least 10mm - SNOWH(I,J)=SNOW(I,J)*0.01 ! SNOW in mm and SNOWH in m - ELSE - - BEXP = BEXP_TABLE(ISLTYP(I,J)) - SMCMAX = SMCMAX_TABLE(ISLTYP(I,J)) - PSISAT = PSISAT_TABLE(ISLTYP(I,J)) - - DO NS=1, NSOIL - IF ( SMOIS(I,NS,J) > SMCMAX ) SMOIS(I,NS,J) = SMCMAX - END DO - IF ( ( BEXP > 0.0 ) .AND. ( SMCMAX > 0.0 ) .AND. ( PSISAT > 0.0 ) ) THEN - DO NS=1, NSOIL - IF ( TSLB(I,NS,J) < 273.149 ) THEN ! Use explicit as initial soil ice - FK=(( (HLICE/(GRAV*(-PSISAT))) * & - ((TSLB(I,NS,J)-T0)/TSLB(I,NS,J)) )**(-1/BEXP) )*SMCMAX - FK = MAX(FK, 0.02) - SH2O(I,NS,J) = MIN( FK, SMOIS(I,NS,J) ) - ELSE - SH2O(I,NS,J)=SMOIS(I,NS,J) - ENDIF - END DO - ELSE - DO NS=1, NSOIL - SH2O(I,NS,J)=SMOIS(I,NS,J) - END DO - ENDIF - ENDIF - ENDDO - ENDDO -! ENDIF - - - DO J = jts,jtf - DO I = its,itf - qtdrain (I,J) = 0. - tvxy (I,J) = TSK(I,J) - if(snow(i,j) > 0.0 .and. tsk(i,j) > 273.15) tvxy(I,J) = 273.15 - tgxy (I,J) = TSK(I,J) - if(snow(i,j) > 0.0 .and. tsk(i,j) > 273.15) tgxy(I,J) = 273.15 - CANWAT (I,J) = 0.0 - canliqxy (I,J) = CANWAT(I,J) - canicexy (I,J) = 0. - eahxy (I,J) = 2000. - tahxy (I,J) = TSK(I,J) - if(snow(i,j) > 0.0 .and. tsk(i,j) > 273.15) tahxy(I,J) = 273.15 -! tahxy (I,J) = 287. -!jref:start - t2mvxy (I,J) = TSK(I,J) - if(snow(i,j) > 0.0 .and. tsk(i,j) > 273.15) t2mvxy(I,J) = 273.15 - t2mbxy (I,J) = TSK(I,J) - if(snow(i,j) > 0.0 .and. tsk(i,j) > 273.15) t2mbxy(I,J) = 273.15 - chstarxy (I,J) = 0.1 -!jref:end - - cmxy (I,J) = 0.0 - chxy (I,J) = 0.0 - fwetxy (I,J) = 0.0 - sneqvoxy (I,J) = 0.0 - alboldxy (I,J) = 0.65 - qsnowxy (I,J) = 0.0 - qrainxy (I,J) = 0.0 - wslakexy (I,J) = 0.0 - - if(iopt_run.ne.5) then - waxy (I,J) = 4900. !??? - wtxy (I,J) = waxy(i,j) !??? - zwtxy (I,J) = (25. + 2.0) - waxy(i,j)/1000/0.2 !??? - else - waxy (I,J) = 0. - wtxy (I,J) = 0. - areaxy (I,J) = (DX * DY) / ( MSFTX(I,J) * MSFTY(I,J) ) - endif - - IF(IVGTYP(I,J) == ISBARREN_TABLE .OR. IVGTYP(I,J) == ISICE_TABLE .OR. & - ( SF_URBAN_PHYSICS == 0 .AND. IVGTYP(I,J) == ISURBAN_TABLE ) .OR. & - IVGTYP(I,J) == ISWATER_TABLE ) THEN - - lai (I,J) = 0.0 - xsaixy (I,J) = 0.0 - lfmassxy (I,J) = 0.0 - stmassxy (I,J) = 0.0 - rtmassxy (I,J) = 0.0 - woodxy (I,J) = 0.0 - stblcpxy (I,J) = 0.0 - fastcpxy (I,J) = 0.0 - grainxy (I,J) = 1E-10 - gddxy (I,J) = 0 - cropcat (I,J) = 0 - - ELSE - - lai (I,J) = max(lai(i,j),0.05) ! at least start with 0.05 for arbitrary initialization (v3.7) - xsaixy (I,J) = max(0.1*lai(I,J),0.05) ! MB: arbitrarily initialize SAI using input LAI (v3.7) - masslai = 1000. / max(SLA_TABLE(IVGTYP(I,J)),1.0) ! conversion from lai to mass (v3.7) - lfmassxy (I,J) = lai(i,j)*masslai ! use LAI to initialize (v3.7) - masssai = 1000. / 3.0 ! conversion from lai to mass (v3.7) - stmassxy (I,J) = xsaixy(i,j)*masssai ! use SAI to initialize (v3.7) - rtmassxy (I,J) = 500.0 ! these are all arbitrary and probably should be - woodxy (I,J) = 500.0 ! in the table or read from initialization - stblcpxy (I,J) = 1000.0 ! - fastcpxy (I,J) = 1000.0 ! - grainxy (I,J) = 1E-10 - gddxy (I,J) = 0 - -! Initialize crop for Liu crop model - - if(iopt_crop == 1 ) then - cropcat (i,j) = default_crop_table - if(croptype(i,5,j) >= 0.5) then - rtmassxy(i,j) = 0.0 - woodxy (i,j) = 0.0 - - if( croptype(i,1,j) > croptype(i,2,j) .and. & - croptype(i,1,j) > croptype(i,3,j) .and. & - croptype(i,1,j) > croptype(i,4,j) ) then ! choose corn - - cropcat (i,j) = 1 - lfmassxy(i,j) = lai(i,j)/0.015 ! Initialize lfmass Zhe Zhang 2020-07-13 - stmassxy(i,j) = xsaixy(i,j)/0.003 - - elseif(croptype(i,2,j) > croptype(i,1,j) .and. & - croptype(i,2,j) > croptype(i,3,j) .and. & - croptype(i,2,j) > croptype(i,4,j) ) then ! choose soybean - - cropcat (i,j) = 2 - lfmassxy(i,j) = lai(i,j)/0.030 ! Initialize lfmass Zhe Zhang 2020-07-13 - stmassxy(i,j) = xsaixy(i,j)/0.003 - - else - - cropcat (i,j) = default_crop_table - lfmassxy(i,j) = lai(i,j)/0.035 - stmassxy(i,j) = xsaixy(i,j)/0.003 - - end if - - end if - end if - -! Initialize cropcat for gecros crop model - - if(iopt_crop == 2) then - cropcat (i,j) = 0 - if(croptype(i,5,j) >= 0.5) then - if(croptype(i,3,j) > 0.0) cropcat(i,j) = 1 ! if any wheat, set to wheat - if(croptype(i,1,j) > croptype(i,3,j)) cropcat(i,j) = 2 ! change to maize - end if - - hti = 0.01 - rdi = 10. - fpro = 6.25*seednc - lncmin = sla0*slnmin - fcar = 1.-fpro-ffat-flig-foac-fmin - cfo = 0.444*fcar+0.531*fpro+0.774*ffat+0.667*flig+0.368*foac - clvi = npl * seedw * cfo * eg * fcrsh - crti = npl * seedw * cfo * eg * (1.-fcrsh) - ygo = cfo/(1.275*fcar+1.887*fpro+3.189*ffat+2.231*flig+0.954* & - foac)*30./12. - nlvi = min(0.75 * npl * seedw * eg * seednc, lnci * clvi/cfv) - laii = clvi/cfv*sla0 - nrti = npl * seedw * eg * seednc - nlvi - slnbi = nlvi/laii - - call gecros_init(xlat(i,j),hti,rdi,clvi,crti,nlvi,laii,nrti,slnbi,gecros_state(i,:,j)) - - end if - -! Noah-MP irrigation scheme !pvk - if(iopt_irr >= 1 .and. iopt_irr <= 3) then - if(iopt_irrm == 0 .or. iopt_irrm ==1) then ! sprinkler - irnumsi(i,j) = 0 - irwatsi(i,j) = 0. - ireloss(i,j) = 0. - irrsplh(i,j) = 0. - else if (iopt_irrm == 0 .or. iopt_irrm ==2) then ! micro or drip - irnummi(i,j) = 0 - irwatmi(i,j) = 0. - irmivol(i,j) = 0. - else if (iopt_irrm == 0 .or. iopt_irrm ==3) then ! flood - irnumfi(i,j) = 0 - irwatfi(i,j) = 0. - irfivol(i,j) = 0. - end if - end if - - END IF - - enddo - enddo - - - ! Given the soil layer thicknesses (in DZS), initialize the soil layer - ! depths from the surface. - ZSOIL(1) = -DZS(1) ! negative - DO NS=2, NSOIL - ZSOIL(NS) = ZSOIL(NS-1) - DZS(NS) - END DO - - ! Initialize snow/soil layer arrays ZSNSOXY, TSNOXY, SNICEXY, SNLIQXY, - ! and ISNOWXY - CALL snow_init ( ims , ime , jms , jme , its , itf , jts , jtf , 3 , & - & NSOIL , zsoil , snow , tgxy , snowh , & - & zsnsoxy , tsnoxy , snicexy , snliqxy , isnowxy ) - - !initialize arrays for groundwater dynamics iopt_run=5 - - if(iopt_run.eq.5) then - IF ( PRESENT(smoiseq) .AND. & - PRESENT(smcwtdxy) .AND. & - PRESENT(rechxy) .AND. & - PRESENT(deeprechxy) .AND. & - PRESENT(areaxy) .AND. & - PRESENT(dx) .AND. & - PRESENT(dy) .AND. & - PRESENT(msftx) .AND. & - PRESENT(msfty) .AND. & - PRESENT(wtddt) .AND. & - PRESENT(stepwtd) .AND. & - PRESENT(dt) .AND. & - PRESENT(qrfsxy) .AND. & - PRESENT(qspringsxy) .AND. & - PRESENT(qslatxy) .AND. & - PRESENT(fdepthxy) .AND. & - PRESENT(ht) .AND. & - PRESENT(riverbedxy) .AND. & - PRESENT(eqzwt) .AND. & - PRESENT(rivercondxy) .AND. & - PRESENT(pexpxy) .AND. & - PRESENT(rechclim) ) THEN - - STEPWTD = nint(WTDDT*60./DT) - STEPWTD = max(STEPWTD,1) - - ELSE - CALL wrf_error_fatal ('Not enough fields to use groundwater option in Noah-MP') - END IF - endif - - ENDIF - - END SUBROUTINE NOAHMP_INIT - -!------------------------------------------------------------------------------------------ -!------------------------------------------------------------------------------------------ - - SUBROUTINE SNOW_INIT ( ims , ime , jms , jme , its , itf , jts , jtf , & - & NSNOW , NSOIL , ZSOIL , SWE , TGXY , SNODEP , & - & ZSNSOXY , TSNOXY , SNICEXY ,SNLIQXY , ISNOWXY ) -!------------------------------------------------------------------------------------------ -! Initialize snow arrays for Noah-MP LSM, based in input SNOWDEP, NSNOW -! ISNOWXY is an index array, indicating the index of the top snow layer. Valid indices -! for snow layers range from 0 (no snow) and -1 (shallow snow) to (-NSNOW)+1 (deep snow). -! TSNOXY holds the temperature of the snow layer. Snow layers are initialized with -! temperature = ground temperature [?]. Snow-free levels in the array have value 0.0 -! SNICEXY is the frozen content of a snow layer. Initial estimate based on SNODEP and SWE -! SNLIQXY is the liquid content of a snow layer. Initialized to 0.0 -! ZNSNOXY is the layer depth from the surface. -!------------------------------------------------------------------------------------------ - IMPLICIT NONE -!------------------------------------------------------------------------------------------ - INTEGER, INTENT(IN) :: ims, ime, jms, jme - INTEGER, INTENT(IN) :: its, itf, jts, jtf - INTEGER, INTENT(IN) :: NSNOW - INTEGER, INTENT(IN) :: NSOIL - REAL, INTENT(IN), DIMENSION(ims:ime, jms:jme) :: SWE - REAL, INTENT(IN), DIMENSION(ims:ime, jms:jme) :: SNODEP - REAL, INTENT(IN), DIMENSION(ims:ime, jms:jme) :: TGXY - REAL, INTENT(IN), DIMENSION(1:NSOIL) :: ZSOIL - - INTEGER, INTENT(OUT), DIMENSION(ims:ime, jms:jme) :: ISNOWXY ! Top snow layer index - REAL, INTENT(OUT), DIMENSION(ims:ime, -NSNOW+1:NSOIL,jms:jme) :: ZSNSOXY ! Snow/soil layer depth from surface [m] - REAL, INTENT(OUT), DIMENSION(ims:ime, -NSNOW+1: 0,jms:jme) :: TSNOXY ! Snow layer temperature [K] - REAL, INTENT(OUT), DIMENSION(ims:ime, -NSNOW+1: 0,jms:jme) :: SNICEXY ! Snow layer ice content [mm] - REAL, INTENT(OUT), DIMENSION(ims:ime, -NSNOW+1: 0,jms:jme) :: SNLIQXY ! snow layer liquid content [mm] - -! Local variables: -! DZSNO holds the thicknesses of the various snow layers. -! DZSNOSO holds the thicknesses of the various soil/snow layers. - INTEGER :: I,J,IZ - REAL, DIMENSION(-NSNOW+1: 0) :: DZSNO - REAL, DIMENSION(-NSNOW+1:NSOIL) :: DZSNSO - -!------------------------------------------------------------------------------------------ - - DO J = jts , jtf - DO I = its , itf - IF ( SNODEP(I,J) < 0.025 ) THEN - ISNOWXY(I,J) = 0 - DZSNO(-NSNOW+1:0) = 0. - ELSE - IF ( ( SNODEP(I,J) >= 0.025 ) .AND. ( SNODEP(I,J) <= 0.05 ) ) THEN - ISNOWXY(I,J) = -1 - DZSNO(0) = SNODEP(I,J) - ELSE IF ( ( SNODEP(I,J) > 0.05 ) .AND. ( SNODEP(I,J) <= 0.10 ) ) THEN - ISNOWXY(I,J) = -2 - DZSNO(-1) = SNODEP(I,J)/2. - DZSNO( 0) = SNODEP(I,J)/2. - ELSE IF ( (SNODEP(I,J) > 0.10 ) .AND. ( SNODEP(I,J) <= 0.25 ) ) THEN - ISNOWXY(I,J) = -2 - DZSNO(-1) = 0.05 - DZSNO( 0) = SNODEP(I,J) - DZSNO(-1) - ELSE IF ( ( SNODEP(I,J) > 0.25 ) .AND. ( SNODEP(I,J) <= 0.45 ) ) THEN - ISNOWXY(I,J) = -3 - DZSNO(-2) = 0.05 - DZSNO(-1) = 0.5*(SNODEP(I,J)-DZSNO(-2)) - DZSNO( 0) = 0.5*(SNODEP(I,J)-DZSNO(-2)) - ELSE IF ( SNODEP(I,J) > 0.45 ) THEN - ISNOWXY(I,J) = -3 - DZSNO(-2) = 0.05 - DZSNO(-1) = 0.20 - DZSNO( 0) = SNODEP(I,J) - DZSNO(-1) - DZSNO(-2) - ELSE - CALL wrf_error_fatal("Problem with the logic assigning snow layers.") - END IF - END IF - - TSNOXY (I,-NSNOW+1:0,J) = 0. - SNICEXY(I,-NSNOW+1:0,J) = 0. - SNLIQXY(I,-NSNOW+1:0,J) = 0. - DO IZ = ISNOWXY(I,J)+1 , 0 - TSNOXY(I,IZ,J) = TGXY(I,J) ! [k] - SNLIQXY(I,IZ,J) = 0.00 - SNICEXY(I,IZ,J) = 1.00 * DZSNO(IZ) * (SWE(I,J)/SNODEP(I,J)) ! [kg/m3] - END DO - - ! Assign local variable DZSNSO, the soil/snow layer thicknesses, for snow layers - DO IZ = ISNOWXY(I,J)+1 , 0 - DZSNSO(IZ) = -DZSNO(IZ) - END DO - - ! Assign local variable DZSNSO, the soil/snow layer thicknesses, for soil layers - DZSNSO(1) = ZSOIL(1) - DO IZ = 2 , NSOIL - DZSNSO(IZ) = (ZSOIL(IZ) - ZSOIL(IZ-1)) - END DO - - ! Assign ZSNSOXY, the layer depths, for soil and snow layers - ZSNSOXY(I,ISNOWXY(I,J)+1,J) = DZSNSO(ISNOWXY(I,J)+1) - DO IZ = ISNOWXY(I,J)+2 , NSOIL - ZSNSOXY(I,IZ,J) = ZSNSOXY(I,IZ-1,J) + DZSNSO(IZ) - ENDDO - - END DO - END DO - - END SUBROUTINE SNOW_INIT -! ================================================================================================== -! ---------------------------------------------------------------------- - SUBROUTINE GROUNDWATER_INIT ( & - & GRID, NSOIL , DZS, ISLTYP, IVGTYP, WTDDT , & - & FDEPTH, TOPO, RIVERBED, EQWTD, RIVERCOND, PEXP , AREA ,WTD , & - & SMOIS,SH2O, SMOISEQ, SMCWTDXY, & - & QLATXY, QSLATXY, QRFXY, QRFSXY, & - & DEEPRECHXY, RECHXY , QSPRINGXY, QSPRINGSXY, & - & rechclim , & - & ids,ide, jds,jde, kds,kde, & - & ims,ime, jms,jme, kms,kme, & - & ips,ipe, jps,jpe, kps,kpe, & - & its,ite, jts,jte, kts,kte ) - - - USE NOAHMP_TABLES, ONLY : BEXP_TABLE,SMCMAX_TABLE,PSISAT_TABLE,SMCWLT_TABLE,DWSAT_TABLE,DKSAT_TABLE, & - ISURBAN_TABLE, ISICE_TABLE ,ISWATER_TABLE - USE module_sf_noahmp_groundwater, ONLY : LATERALFLOW - USE module_domain, only: domain -#if (EM_CORE == 1) -#ifdef DM_PARALLEL - USE module_dm , ONLY : ntasks_x,ntasks_y,local_communicator,mytask,ntasks - USE module_comm_dm , ONLY : halo_em_hydro_noahmp_sub -#endif -#endif - -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- - - INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, & - & ims,ime, jms,jme, kms,kme, & - & ips,ipe, jps,jpe, kps,kpe, & - & its,ite, jts,jte, kts,kte - TYPE(domain) , TARGET :: grid ! state - INTEGER, INTENT(IN) :: NSOIL - REAL, INTENT(IN) :: WTDDT - REAL, INTENT(IN), DIMENSION(1:NSOIL) :: DZS - INTEGER, INTENT(IN), DIMENSION(ims:ime, jms:jme) :: ISLTYP, IVGTYP - REAL, INTENT(IN), DIMENSION(ims:ime, jms:jme) :: FDEPTH, TOPO , AREA - REAL, INTENT(IN), DIMENSION(ims:ime, jms:jme) :: rechclim - REAL, INTENT(OUT), DIMENSION(ims:ime, jms:jme) :: RIVERCOND - REAL, INTENT(INOUT), DIMENSION(ims:ime, jms:jme) :: WTD, RIVERBED, EQWTD, PEXP - REAL, DIMENSION( ims:ime , 1:nsoil, jms:jme ), & - & INTENT(INOUT) :: SMOIS, & - & SH2O, & - & SMOISEQ - REAL, INTENT(INOUT), DIMENSION(ims:ime, jms:jme) :: & - SMCWTDXY, & - DEEPRECHXY, & - RECHXY, & - QSLATXY, & - QRFSXY, & - QSPRINGSXY, & - QLATXY, & - QRFXY, & - QSPRINGXY - -! local - INTEGER :: I,J,K,ITER,itf,jtf, NITER, NCOUNT,NS - REAL :: BEXP,SMCMAX,PSISAT,SMCWLT,DWSAT,DKSAT - REAL :: FRLIQ,SMCEQDEEP - REAL :: DELTAT,RCOND,TOTWATER - REAL :: AA,BBB,CC,DD,DX,FUNC,DFUNC,DDZ,EXPON,SMC,FLUX - REAL, DIMENSION(1:NSOIL) :: SMCEQ,ZSOIL - REAL, DIMENSION( ims:ime, jms:jme ) :: QLAT, QRF - INTEGER, DIMENSION( ims:ime, jms:jme ) :: LANDMASK !-1 for water (ice or no ice) and glacial areas, 1 for land where the LSM does its soil moisture calculations - - ! Given the soil layer thicknesses (in DZS), calculate the soil layer - ! depths from the surface. - ZSOIL(1) = -DZS(1) ! negative - DO NS=2, NSOIL - ZSOIL(NS) = ZSOIL(NS-1) - DZS(NS) - END DO - - - itf=min0(ite,ide-1) - jtf=min0(jte,jde-1) - - - WHERE(IVGTYP.NE.ISWATER_TABLE.AND.IVGTYP.NE.ISICE_TABLE) - LANDMASK=1 - ELSEWHERE - LANDMASK=-1 - ENDWHERE - - PEXP = 1.0 - - DELTAT=365.*24*3600. !1 year - -!readjust the raw aggregated water table from hires, so that it is better compatible with topography - -!use WTD here, to use the lateral communication routine - WTD=EQWTD - - NCOUNT=0 - - DO NITER=1,500 - -#if (EM_CORE == 1) -#ifdef DM_PARALLEL -# include "HALO_EM_HYDRO_NOAHMP.inc" -#endif -#endif - -!Calculate lateral flow - -IF(NCOUNT.GT.0.OR.NITER.eq.1)THEN - QLAT = 0. - CALL LATERALFLOW(ISLTYP,WTD,QLAT,FDEPTH,TOPO,LANDMASK,DELTAT,AREA & - ,ids,ide,jds,jde,kds,kde & - ,ims,ime,jms,jme,kms,kme & - ,its,ite,jts,jte,kts,kte ) - - NCOUNT=0 - DO J=jts,jtf - DO I=its,itf - IF(LANDMASK(I,J).GT.0)THEN - IF(QLAT(i,j).GT.1.e-2)THEN - NCOUNT=NCOUNT+1 - WTD(i,j)=min(WTD(i,j)+0.25,0.) - ENDIF - ENDIF - ENDDO - ENDDO -ENDIF - - ENDDO - -#if (EM_CORE == 1) -#ifdef DM_PARALLEL -# include "HALO_EM_HYDRO_NOAHMP.inc" -#endif -#endif - -EQWTD=WTD - -!after adjusting, where qlat > 1cm/year now wtd is at the surface. -!it may still happen that qlat + rech > 0 and eqwtd-rbed <0. There the wtd can -!rise to the surface (poor drainage) but the et will then increase. - - -!now, calculate rcond: - - DO J=jts,jtf - DO I=its,itf - - DDZ = EQWTD(I,J)- ( RIVERBED(I,J)-TOPO(I,J) ) -!dont allow riverbed above water table - IF(DDZ.LT.0.)then - RIVERBED(I,J)=TOPO(I,J)+EQWTD(I,J) - DDZ=0. - ENDIF - - - TOTWATER = AREA(I,J)*(QLAT(I,J)+RECHCLIM(I,J)*0.001)/DELTAT - - IF (TOTWATER.GT.0) THEN - RIVERCOND(I,J) = TOTWATER / MAX(DDZ,0.05) - ELSE - RIVERCOND(I,J)=0.01 -!and make riverbed equal to eqwtd, otherwise qrf might be too big... - RIVERBED(I,J)=TOPO(I,J)+EQWTD(I,J) - ENDIF - - - ENDDO - ENDDO - -!make riverbed to be height down from the surface instead of above sea level - - RIVERBED = min( RIVERBED-TOPO, 0.) - -!now recompute lateral flow and flow to rivers to initialize deep soil moisture - - DELTAT = WTDDT * 60. !timestep in seconds for this calculation - - -!recalculate lateral flow - - QLAT = 0. - CALL LATERALFLOW(ISLTYP,WTD,QLAT,FDEPTH,TOPO,LANDMASK,DELTAT,AREA & - ,ids,ide,jds,jde,kds,kde & - ,ims,ime,jms,jme,kms,kme & - ,its,ite,jts,jte,kts,kte ) - -!compute flux from grounwater to rivers in the cell - - DO J=jts,jtf - DO I=its,itf - IF(LANDMASK(I,J).GT.0)THEN - IF(WTD(I,J) .GT. RIVERBED(I,J) .AND. EQWTD(I,J) .GT. RIVERBED(I,J)) THEN - RCOND = RIVERCOND(I,J) * EXP(PEXP(I,J)*(WTD(I,J)-EQWTD(I,J))) - ELSE - RCOND = RIVERCOND(I,J) - ENDIF - QRF(I,J) = RCOND * (WTD(I,J)-RIVERBED(I,J)) * DELTAT/AREA(I,J) -!for now, dont allow it to go from river to groundwater - QRF(I,J) = MAX(QRF(I,J),0.) - ELSE - QRF(I,J) = 0. - ENDIF - ENDDO - ENDDO - -!now compute eq. soil moisture, change soil moisture to be compatible with the water table and compute deep soil moisture - - DO J = jts,jtf - DO I = its,itf - BEXP = BEXP_TABLE(ISLTYP(I,J)) - SMCMAX = SMCMAX_TABLE(ISLTYP(I,J)) - SMCWLT = SMCWLT_TABLE(ISLTYP(I,J)) - IF(IVGTYP(I,J)==ISURBAN_TABLE)THEN - SMCMAX = 0.45 - SMCWLT = 0.40 - ENDIF - DWSAT = DWSAT_TABLE(ISLTYP(I,J)) - DKSAT = DKSAT_TABLE(ISLTYP(I,J)) - PSISAT = -PSISAT_TABLE(ISLTYP(I,J)) - IF ( ( BEXP > 0.0 ) .AND. ( smcmax > 0.0 ) .AND. ( -psisat > 0.0 ) ) THEN - !initialize equilibrium soil moisture for water table diagnostic - CALL EQSMOISTURE(NSOIL , ZSOIL , SMCMAX , SMCWLT ,DWSAT, DKSAT ,BEXP , & !in - SMCEQ ) !out - - SMOISEQ (I,1:NSOIL,J) = SMCEQ (1:NSOIL) - - - !make sure that below the water table the layers are saturated and initialize the deep soil moisture - IF(WTD(I,J) < ZSOIL(NSOIL)-DZS(NSOIL)) THEN - -!initialize deep soil moisture so that the flux compensates qlat+qrf -!use Newton-Raphson method to find soil moisture - - EXPON = 2. * BEXP + 3. - DDZ = ZSOIL(NSOIL) - WTD(I,J) - CC = PSISAT/DDZ - FLUX = (QLAT(I,J)-QRF(I,J))/DELTAT - - SMC = 0.5 * SMCMAX - - DO ITER = 1, 100 - DD = (SMC+SMCMAX)/(2.*SMCMAX) - AA = -DKSAT * DD ** EXPON - BBB = CC * ( (SMCMAX/SMC)**BEXP - 1. ) + 1. - FUNC = AA * BBB - FLUX - DFUNC = -DKSAT * (EXPON/(2.*SMCMAX)) * DD ** (EXPON - 1.) * BBB & - + AA * CC * (-BEXP) * SMCMAX ** BEXP * SMC ** (-BEXP-1.) - - DX = FUNC/DFUNC - SMC = SMC - DX - IF ( ABS (DX) < 1.E-6)EXIT - ENDDO - - SMCWTDXY(I,J) = MAX(SMC,1.E-4) - - ELSEIF(WTD(I,J) < ZSOIL(NSOIL))THEN - SMCEQDEEP = SMCMAX * ( PSISAT / ( PSISAT - DZS(NSOIL) ) ) ** (1./BEXP) -! SMCEQDEEP = MAX(SMCEQDEEP,SMCWLT) - SMCEQDEEP = MAX(SMCEQDEEP,1.E-4) - SMCWTDXY(I,J) = SMCMAX * ( WTD(I,J) - (ZSOIL(NSOIL)-DZS(NSOIL))) + & - SMCEQDEEP * (ZSOIL(NSOIL) - WTD(I,J)) - - ELSE !water table within the resolved layers - SMCWTDXY(I,J) = SMCMAX - DO K=NSOIL,2,-1 - IF(WTD(I,J) .GE. ZSOIL(K-1))THEN - FRLIQ = SH2O(I,K,J) / SMOIS(I,K,J) - SMOIS(I,K,J) = SMCMAX - SH2O(I,K,J) = SMCMAX * FRLIQ - ELSE - IF(SMOIS(I,K,J).LT.SMCEQ(K))THEN - WTD(I,J) = ZSOIL(K) - ELSE - WTD(I,J) = ( SMOIS(I,K,J)*DZS(K) - SMCEQ(K)*ZSOIL(K-1) + SMCMAX*ZSOIL(K) ) / & - (SMCMAX - SMCEQ(K)) - ENDIF - EXIT - ENDIF - ENDDO - ENDIF - ELSE - SMOISEQ (I,1:NSOIL,J) = SMCMAX - SMCWTDXY(I,J) = SMCMAX - WTD(I,J) = 0.0 - ENDIF - -!zero out some arrays - - QLATXY(I,J) = 0.0 - QSLATXY(I,J) = 0.0 - QRFXY(I,J) = 0.0 - QRFSXY(I,J) = 0.0 - DEEPRECHXY(I,J) = 0.0 - RECHXY(I,J) = 0.0 - QSPRINGXY(I,J) = 0.0 - QSPRINGSXY(I,J) = 0.0 - - ENDDO - ENDDO - - - - - END SUBROUTINE GROUNDWATER_INIT -! ================================================================================================== -! ---------------------------------------------------------------------- - SUBROUTINE EQSMOISTURE(NSOIL , ZSOIL , SMCMAX , SMCWLT, DWSAT , DKSAT ,BEXP , & !in - SMCEQ ) !out -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! input - INTEGER, INTENT(IN) :: NSOIL !no. of soil layers - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: ZSOIL !depth of soil layer-bottom [m] - REAL, INTENT(IN) :: SMCMAX , SMCWLT, BEXP , DWSAT, DKSAT -!output - REAL, DIMENSION( 1:NSOIL), INTENT(OUT) :: SMCEQ !equilibrium soil water content [m3/m3] -!local - INTEGER :: K , ITER - REAL :: DDZ , SMC, FUNC, DFUNC , AA, BB , EXPON, DX - -!gmmcompute equilibrium soil moisture content for the layer when wtd=zsoil(k) - - - DO K=1,NSOIL - - IF ( K == 1 )THEN - DDZ = -ZSOIL(K+1) * 0.5 - ELSEIF ( K < NSOIL ) THEN - DDZ = ( ZSOIL(K-1) - ZSOIL(K+1) ) * 0.5 - ELSE - DDZ = ZSOIL(K-1) - ZSOIL(K) - ENDIF - -!use Newton-Raphson method to find eq soil moisture - - EXPON = BEXP +1. - AA = DWSAT/DDZ - BB = DKSAT / SMCMAX ** EXPON - - SMC = 0.5 * SMCMAX - - DO ITER = 1, 100 - FUNC = (SMC - SMCMAX) * AA + BB * SMC ** EXPON - DFUNC = AA + BB * EXPON * SMC ** BEXP - - DX = FUNC/DFUNC - SMC = SMC - DX - IF ( ABS (DX) < 1.E-6)EXIT - ENDDO - -! SMCEQ(K) = MIN(MAX(SMC,SMCWLT),SMCMAX*0.99) - SMCEQ(K) = MIN(MAX(SMC,1.E-4),SMCMAX*0.99) - ENDDO - -END SUBROUTINE EQSMOISTURE - -! gecros initialization routines - -SUBROUTINE gecros_init(xlat,hti,rdi,clvi,crti,nlvi,laii,nrti,slnbi,state_gecros) -implicit none -REAL, INTENT(IN) :: HTI -REAL, INTENT(IN) :: RDI -REAL, INTENT(IN) :: CLVI -REAL, INTENT(IN) :: CRTI -REAL, INTENT(IN) :: NLVI -REAL, INTENT(IN) :: LAII -REAL, INTENT(IN) :: NRTI -REAL, INTENT(IN) :: SLNBI -REAL, INTENT(IN) :: XLAT -REAL, DIMENSION(1:60), INTENT(INOUT) :: STATE_GECROS - - !Inititalization of Gecros variables - STATE_GECROS(1) = 0. !DS - STATE_GECROS(2) = 0. !CTDURDI, HTI, CLVI, CRTI, NLVI, LAII, NRTI, SLNBI, - STATE_GECROS(3) = 0. !CVDU - STATE_GECROS(4) = CLVI !CLV - STATE_GECROS(5) = 0. !CLVD - STATE_GECROS(6) = 0. !CSST - STATE_GECROS(7) = 0. !CSO - STATE_GECROS(8) = CRTI !CSRT - STATE_GECROS(9) = 0. !CRTD - STATE_GECROS(10) = 0. !CLVDS - STATE_GECROS(11) = NRTI !NRT - STATE_GECROS(12) = 0. !NST - STATE_GECROS(13) = NLVI !NLV - STATE_GECROS(14) = 0. !NSO - STATE_GECROS(15) = NLVI !TNLV - STATE_GECROS(16) = 0. !NLVD - STATE_GECROS(17) = 0. !NRTD - STATE_GECROS(18) = 0. !CRVS - STATE_GECROS(19) = 0. !CRVR - STATE_GECROS(20) = 0. !NREOE - STATE_GECROS(21) = 0. !NREOF - STATE_GECROS(22) = 0. !DCDSR - STATE_GECROS(23) = 0. !DCDTR - STATE_GECROS(24) = SLNBI !SLNB - STATE_GECROS(25) = LAII !LAIC - STATE_GECROS(26) = 0. !RMUL - STATE_GECROS(27) = 0. !NDEMP - STATE_GECROS(28) = 0. !NSUPP - STATE_GECROS(29) = 0. !NFIXT - STATE_GECROS(30) = 0. !NFIXR - STATE_GECROS(31) = 0. !DCDTP - STATE_GECROS(32) = 0.01 !HTI - STATE_GECROS(33) = RDI !RDI - STATE_GECROS(34) = 0. !TPCAN - STATE_GECROS(35) = 0. !TRESP - STATE_GECROS(36) = 0. !TNUPT - STATE_GECROS(37) = 0. !LITNT - STATE_GECROS(38) = 0. !daysSinceDS1 - STATE_GECROS(39) = 0. !daysSinceDS2 - STATE_GECROS(40) = -1. !drilled -1:false, 1:true - STATE_GECROS(41) = -1. !emerged -1:false, 1:true - STATE_GECROS(42) = -1. !harvested -1:false, 1:true - STATE_GECROS(43) = 0. !TTEM - STATE_GECROS(44) = XLAT !GLAT - STATE_GECROS(45) = 0. !WSO - STATE_GECROS(46) = 0. !WSTRAW - STATE_GECROS(47) = 0. !GrainNC - STATE_GECROS(48) = 0. !StrawNC - STATE_GECROS(49) = 0.01 !GLAI - STATE_GECROS(50) = 0.01 !TLAI - STATE_GECROS(51) = HTI !Fields 51-58 set for reinitialization - STATE_GECROS(52) = RDI - STATE_GECROS(53) = CLVI - STATE_GECROS(54) = CRTI - STATE_GECROS(55) = NRTI - STATE_GECROS(56) = NLVI - STATE_GECROS(57) = SLNBI - STATE_GECROS(58) = LAII - -END SUBROUTINE gecros_init - -SUBROUTINE gecros_reinit(STATE_GECROS) -implicit none -REAL, DIMENSION(1:60), INTENT(INOUT) :: STATE_GECROS - - !Re-inititalization of Gecros variables after harvest - STATE_GECROS(1) = 0. !DS - STATE_GECROS(2) = 0. !CTDU - STATE_GECROS(3) = 0. !CVDU - STATE_GECROS(4) = STATE_GECROS(53) !CLV - STATE_GECROS(5) = 0. !CLVD - STATE_GECROS(6) = 0. !CSST - STATE_GECROS(7) = 0. !CSO - STATE_GECROS(8) = STATE_GECROS(54) !CRT - STATE_GECROS(9) = 0. !CRTD - STATE_GECROS(10) = 0. !CLVDS - STATE_GECROS(11) = STATE_GECROS(55)!NRT - STATE_GECROS(12) = 0. !NST - STATE_GECROS(13) = STATE_GECROS(56)!NLV - STATE_GECROS(14) = 0. !NSO - STATE_GECROS(15) = STATE_GECROS(56)!TNLV - STATE_GECROS(16) = 0. !NLVD - STATE_GECROS(17) = 0. !NRTD - STATE_GECROS(18) = 0. !CRVS - STATE_GECROS(19) = 0. !CRVR - STATE_GECROS(20) = 0. !NREOE - STATE_GECROS(21) = 0. !NREOF - STATE_GECROS(22) = 0. !DCDSR - STATE_GECROS(23) = 0. !DCDTR - STATE_GECROS(24) = STATE_GECROS(57)!SLNB - STATE_GECROS(25) = STATE_GECROS(58)!LAIC - STATE_GECROS(26) = 0. !RMUL - STATE_GECROS(27) = 0. !NDEMP - STATE_GECROS(28) = 0. !NSUPP - STATE_GECROS(29) = 0. !NFIXT - STATE_GECROS(30) = 0. !NFIXR - STATE_GECROS(31) = 0. !DCDTP - STATE_GECROS(32) = STATE_GECROS(51)!HT - STATE_GECROS(33) = STATE_GECROS(52)!ROOTD - STATE_GECROS(34) = 0. !TPCAN - STATE_GECROS(35) = 0. !TRESP - STATE_GECROS(36) = 0. !TNUPT - STATE_GECROS(37) = 0. !LITNT - STATE_GECROS(38) = 0. !daysSinceDS1 - STATE_GECROS(39) = 0. !daysSinceDS2 - STATE_GECROS(40) = -1. !drilled -1:false, 1:true - STATE_GECROS(41) = -1. !emerged -1:false, 1:true - STATE_GECROS(42) = 1. !harvested -1:false, 1:true - STATE_GECROS(43) = 0. !TTEM - STATE_GECROS(45) = 0. !WSO - STATE_GECROS(46) = 0. !WSTRAW - STATE_GECROS(47) = 0. !GrainNC - STATE_GECROS(48) = 0. !StrawNC - STATE_GECROS(49) = 0.01 !GLAI - STATE_GECROS(50) = 0.01 !TLAI - -END SUBROUTINE gecros_reinit - -!***Function for HARVEST DATES: - -!Determine if crop is to be harvested today -!function to be called once a day -!return codes: 0 - no, 1- yes -!requires two counters 'daysSinceDS2', 'daysSinceDS1' , zero-initialized to be maintained within caller -!STATE_GECROS(1) = current DS -!STATE_GECROS(38)=daysSinceDS1 -!STATE_GECROS(39)=daysSinceDS2 - -function checkIfHarvest(STATE_GECROS, DT, harvestDS1, harvestDS2, harvestDS1ExtraDays, harvestDS2ExtraDays) -implicit none -real :: DT, harvestDS1, harvestDS2 -real :: daysSinceDS1, daysSinceDS2 -real :: harvestDS1ExtraDays, harvestDS2ExtraDays -integer :: checkIfHarvest -REAL, DIMENSION(1:60), INTENT(INOUT) :: STATE_GECROS - - - !***check whether maturity (DS1) has been reached - if (STATE_GECROS(1) >= harvestDS1) then - - if (STATE_GECROS(38) >= harvestDS1ExtraDays) then - checkIfHarvest=1 - !if we are > DS1, but not over the limit, increase the counter of days - else - STATE_GECROS(38) = STATE_GECROS(38) + DT/86400. - endif - else - - !if maturity has not been reached, but we are close (> DS2) - !check the number of days for which we have been > DS2 - !and harvest in case we are over the limit given for that stage - !(in case that maturity will not be reached at all) - - checkIfHarvest=0 - if (STATE_GECROS(1) >= harvestDS2 ) then - - if (STATE_GECROS(39) >= harvestDS2ExtraDays) then - checkIfHarvest=1 - else !if we are > DS2, but not over the limit, increase the counter of days - STATE_GECROS(39) = STATE_GECROS(39) + DT/86400. - checkIfHarvest=0 - endif - endif - endif - return -end function checkIfHarvest - -!------------------------------------------------------------------------------------------ - - SUBROUTINE noahmp_urban(sf_urban_physics, NSOIL, IVGTYP, ITIMESTEP, & ! IN : Model configuration - DT, COSZ_URB2D, XLAT_URB2D, & ! IN : Time/Space-related - T3D, QV3D, U_PHY, V_PHY, SWDOWN, & ! IN : Forcing - SWDDIR, SWDDIF, & - GLW, P8W3D, RAINBL, DZ8W, ZNT, & ! IN : Forcing - TSK, HFX, QFX, LH, GRDFLX, & ! IN/OUT : LSM - ALBEDO, EMISS, QSFC, & ! IN/OUT : LSM - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte, & - cmr_sfcdif, chr_sfcdif, cmc_sfcdif, & - chc_sfcdif, cmgr_sfcdif, chgr_sfcdif, & - tr_urb2d, tb_urb2d, tg_urb2d, & !H urban - tc_urb2d, qc_urb2d, uc_urb2d, & !H urban - xxxr_urb2d, xxxb_urb2d, xxxg_urb2d, xxxc_urb2d, & !H urban - trl_urb3d, tbl_urb3d, tgl_urb3d, & !H urban - sh_urb2d, lh_urb2d, g_urb2d, rn_urb2d, ts_urb2d, & !H urban - psim_urb2d, psih_urb2d, u10_urb2d, v10_urb2d, & !O urban - GZ1OZ0_urb2d, AKMS_URB2D, & !O urban - th2_urb2d, q2_urb2d, ust_urb2d, & !O urban - declin_urb, omg_urb2d, & !I urban - num_roof_layers,num_wall_layers,num_road_layers, & !I urban - dzr, dzb, dzg, & !I urban - cmcr_urb2d, tgr_urb2d, tgrl_urb3d, smr_urb3d, & !H urban - drelr_urb2d, drelb_urb2d, drelg_urb2d, & !H urban - flxhumr_urb2d, flxhumb_urb2d, flxhumg_urb2d, & !H urban - julian, julyr, & !H urban - frc_urb2d, utype_urb2d, & !I urban - chs, chs2, cqs2, & !H - num_urban_ndm, urban_map_zrd, urban_map_zwd, urban_map_gd, & !I multi-layer urban - urban_map_zd, urban_map_zdf, urban_map_bd, urban_map_wd, & !I multi-layer urban - urban_map_gbd, urban_map_fbd, urban_map_zgrd, & !I multi-layer urban - num_urban_hi, & !I multi-layer urban - trb_urb4d, tw1_urb4d, tw2_urb4d, tgb_urb4d, & !H multi-layer urban - tlev_urb3d, qlev_urb3d, & !H multi-layer urban - tw1lev_urb3d, tw2lev_urb3d, & !H multi-layer urban - tglev_urb3d, tflev_urb3d, & !H multi-layer urban - sf_ac_urb3d, lf_ac_urb3d, cm_ac_urb3d, & !H multi-layer urban - sfvent_urb3d, lfvent_urb3d, & !H multi-layer urban - sfwin1_urb3d, sfwin2_urb3d, & !H multi-layer urban - sfw1_urb3d, sfw2_urb3d, sfr_urb3d, sfg_urb3d, & !H multi-layer urban - ep_pv_urb3d, t_pv_urb3d, & !RMS - trv_urb4d, qr_urb4d, qgr_urb3d, tgr_urb3d, & !RMS - drain_urb4d, draingr_urb3d, sfrv_urb3d, lfrv_urb3d, & !RMS - dgr_urb3d, dg_urb3d, lfr_urb3d, lfg_urb3d, & !RMS - lp_urb2d, hi_urb2d, lb_urb2d, hgt_urb2d, & !H multi-layer urban - mh_urb2d, stdh_urb2d, lf_urb2d, & !SLUCM - th_phy, rho, p_phy, ust, & !I multi-layer urban - gmt, julday, xlong, xlat, & !I multi-layer urban - a_u_bep, a_v_bep, a_t_bep, a_q_bep, & !O multi-layer urban - a_e_bep, b_u_bep, b_v_bep, & !O multi-layer urban - b_t_bep, b_q_bep, b_e_bep, dlg_bep, & !O multi-layer urban - dl_u_bep, sf_bep, vl_bep & !O multi-layer urban - ) - - USE module_sf_urban, only: urban - USE module_sf_bep, only: bep - USE module_sf_bep_bem, only: bep_bem - USE module_ra_gfdleta, only: cal_mon_day - USE NOAHMP_TABLES, ONLY: ISURBAN_TABLE - USE module_model_constants, only: KARMAN, CP, XLV -!---------------------------------------------------------------- - IMPLICIT NONE -!---------------------------------------------------------------- - - INTEGER, INTENT(IN ) :: sf_urban_physics ! urban physics option - INTEGER, INTENT(IN ) :: NSOIL ! number of soil layers - INTEGER, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: IVGTYP ! vegetation type - INTEGER, INTENT(IN ) :: ITIMESTEP ! timestep number - REAL, INTENT(IN ) :: DT ! timestep [s] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: COSZ_URB2D - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: XLAT_URB2D - REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: T3D ! 3D atmospheric temperature valid at mid-levels [K] - REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: QV3D ! 3D water vapor mixing ratio [kg/kg_dry] - REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: U_PHY ! 3D U wind component [m/s] - REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: V_PHY ! 3D V wind component [m/s] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: SWDOWN ! solar down at surface [W m-2] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: SWDDIF ! solar down at surface [W m-2] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: SWDDIR ! solar down at surface [W m-2] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: GLW ! longwave down at surface [W m-2] - REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: P8W3D ! 3D pressure, valid at interface [Pa] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: RAINBL ! total input precipitation [mm] - REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: DZ8W ! thickness of atmo layers [m] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ZNT ! combined z0 sent to coupled model - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TSK ! surface radiative temperature [K] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: HFX ! sensible heat flux [W m-2] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: QFX ! latent heat flux [kg s-1 m-2] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: LH ! latent heat flux [W m-2] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: GRDFLX ! ground/snow heat flux [W m-2] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ALBEDO ! total grid albedo [] - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: EMISS ! surface bulk emissivity - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: QSFC ! bulk surface mixing ratio - - INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, & ! d -> domain - & ims,ime, jms,jme, kms,kme, & ! m -> memory - & its,ite, jts,jte, kts,kte ! t -> tile - -! input variables surface_driver --> lsm - - INTEGER, INTENT(IN ) :: num_roof_layers - INTEGER, INTENT(IN ) :: num_wall_layers - INTEGER, INTENT(IN ) :: num_road_layers - - INTEGER, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: UTYPE_URB2D - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: FRC_URB2D - - REAL, OPTIONAL, DIMENSION(1:num_roof_layers), INTENT(IN ) :: DZR - REAL, OPTIONAL, DIMENSION(1:num_wall_layers), INTENT(IN ) :: DZB - REAL, OPTIONAL, DIMENSION(1:num_road_layers), INTENT(IN ) :: DZG - REAL, OPTIONAL, INTENT(IN ) :: DECLIN_URB - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: OMG_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: TH_PHY - REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: P_PHY - REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: RHO - - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: UST - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CHS, CHS2, CQS2 - - INTEGER, INTENT(IN ) :: julian, julyr !urban - -! local variables lsm --> urban - - INTEGER :: UTYPE_URB ! urban type [urban=1, suburban=2, rural=3] - REAL :: TA_URB ! potential temp at 1st atmospheric level [K] - REAL :: QA_URB ! mixing ratio at 1st atmospheric level [kg/kg] - REAL :: UA_URB ! wind speed at 1st atmospheric level [m/s] - REAL :: U1_URB ! u at 1st atmospheric level [m/s] - REAL :: V1_URB ! v at 1st atmospheric level [m/s] - REAL :: SSG_URB ! downward total short wave radiation [W/m/m] - REAL :: LLG_URB ! downward long wave radiation [W/m/m] - REAL :: RAIN_URB ! precipitation [mm/h] - REAL :: RHOO_URB ! air density [kg/m^3] - REAL :: ZA_URB ! first atmospheric level [m] - REAL :: DELT_URB ! time step [s] - REAL :: SSGD_URB ! downward direct short wave radiation [W/m/m] - REAL :: SSGQ_URB ! downward diffuse short wave radiation [W/m/m] - REAL :: XLAT_URB ! latitude [deg] - REAL :: COSZ_URB ! cosz - REAL :: OMG_URB ! hour angle - REAL :: ZNT_URB ! roughness length [m] - REAL :: TR_URB - REAL :: TB_URB - REAL :: TG_URB - REAL :: TC_URB - REAL :: QC_URB - REAL :: UC_URB - REAL :: XXXR_URB - REAL :: XXXB_URB - REAL :: XXXG_URB - REAL :: XXXC_URB - REAL, DIMENSION(1:num_roof_layers) :: TRL_URB ! roof layer temp [K] - REAL, DIMENSION(1:num_wall_layers) :: TBL_URB ! wall layer temp [K] - REAL, DIMENSION(1:num_road_layers) :: TGL_URB ! road layer temp [K] - LOGICAL :: LSOLAR_URB - -!===hydrological variable for single layer UCM=== - - INTEGER :: jmonth, jday - REAL :: DRELR_URB - REAL :: DRELB_URB - REAL :: DRELG_URB - REAL :: FLXHUMR_URB - REAL :: FLXHUMB_URB - REAL :: FLXHUMG_URB - REAL :: CMCR_URB - REAL :: TGR_URB - - REAL, DIMENSION(1:num_roof_layers) :: SMR_URB ! green roof layer moisture - REAL, DIMENSION(1:num_roof_layers) :: TGRL_URB ! green roof layer temp [K] - - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: DRELR_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: DRELB_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: DRELG_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: FLXHUMR_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: FLXHUMB_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: FLXHUMG_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CMCR_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TGR_URB2D - - REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_roof_layers, jms:jme ), INTENT(INOUT) :: TGRL_URB3D - REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_roof_layers, jms:jme ), INTENT(INOUT) :: SMR_URB3D - - -! state variable surface_driver <--> lsm <--> urban - - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TR_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TB_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TG_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TC_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: QC_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: UC_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: XXXR_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: XXXB_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: XXXG_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: XXXC_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: SH_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: LH_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: G_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: RN_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TS_URB2D - - REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_roof_layers, jms:jme ), INTENT(INOUT) :: TRL_URB3D - REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_wall_layers, jms:jme ), INTENT(INOUT) :: TBL_URB3D - REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_road_layers, jms:jme ), INTENT(INOUT) :: TGL_URB3D - -! output variable lsm --> surface_driver - - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: PSIM_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: PSIH_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: GZ1OZ0_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: U10_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: V10_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: TH2_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: Q2_URB2D - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: AKMS_URB2D - REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: UST_URB2D - - -! output variables urban --> lsm - - REAL :: TS_URB ! surface radiative temperature [K] - REAL :: QS_URB ! surface humidity [-] - REAL :: SH_URB ! sensible heat flux [W/m/m] - REAL :: LH_URB ! latent heat flux [W/m/m] - REAL :: LH_KINEMATIC_URB ! latent heat flux, kinetic [kg/m/m/s] - REAL :: SW_URB ! upward short wave radiation flux [W/m/m] - REAL :: ALB_URB ! time-varying albedo [fraction] - REAL :: LW_URB ! upward long wave radiation flux [W/m/m] - REAL :: G_URB ! heat flux into the ground [W/m/m] - REAL :: RN_URB ! net radiation [W/m/m] - REAL :: PSIM_URB ! shear f for momentum [-] - REAL :: PSIH_URB ! shear f for heat [-] - REAL :: GZ1OZ0_URB ! shear f for heat [-] - REAL :: U10_URB ! wind u component at 10 m [m/s] - REAL :: V10_URB ! wind v component at 10 m [m/s] - REAL :: TH2_URB ! potential temperature at 2 m [K] - REAL :: Q2_URB ! humidity at 2 m [-] - REAL :: CHS_URB - REAL :: CHS2_URB - REAL :: UST_URB - -! NUDAPT Parameters urban --> lam - - REAL :: mh_urb - REAL :: stdh_urb - REAL :: lp_urb - REAL :: hgt_urb - REAL, DIMENSION(4) :: lf_urb - -! Local variables - - INTEGER :: I,J,K - REAL :: Q1 - -! Noah UA changes - - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CMR_SFCDIF - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CHR_SFCDIF - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CMGR_SFCDIF - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CHGR_SFCDIF - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CMC_SFCDIF - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CHC_SFCDIF - -! Variables for multi-layer UCM - - REAL, OPTIONAL, INTENT(IN ) :: GMT - INTEGER, OPTIONAL, INTENT(IN ) :: JULDAY - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: XLAT, XLONG - INTEGER, INTENT(IN ) :: num_urban_ndm - INTEGER, INTENT(IN ) :: urban_map_zrd - INTEGER, INTENT(IN ) :: urban_map_zwd - INTEGER, INTENT(IN ) :: urban_map_gd - INTEGER, INTENT(IN ) :: urban_map_zd - INTEGER, INTENT(IN ) :: urban_map_zdf - INTEGER, INTENT(IN ) :: urban_map_bd - INTEGER, INTENT(IN ) :: urban_map_wd - INTEGER, INTENT(IN ) :: urban_map_gbd - INTEGER, INTENT(IN ) :: urban_map_fbd - INTEGER, INTENT(IN ) :: urban_map_zgrd - INTEGER, INTENT(IN ) :: NUM_URBAN_HI - REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_hi, jms:jme ), INTENT(IN ) :: hi_urb2d - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: lp_urb2d - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: lb_urb2d - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: hgt_urb2d - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: mh_urb2d - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: stdh_urb2d - REAL, OPTIONAL, DIMENSION( ims:ime, 4, jms:jme ), INTENT(IN ) :: lf_urb2d - - REAL, OPTIONAL, DIMENSION( ims:ime, 1:urban_map_zrd, jms:jme ), INTENT(INOUT) :: trb_urb4d - REAL, OPTIONAL, DIMENSION( ims:ime, 1:urban_map_zwd, jms:jme ), INTENT(INOUT) :: tw1_urb4d - REAL, OPTIONAL, DIMENSION( ims:ime, 1:urban_map_zwd, jms:jme ), INTENT(INOUT) :: tw2_urb4d - REAL, OPTIONAL, DIMENSION( ims:ime, 1:urban_map_gd , jms:jme ), INTENT(INOUT) :: tgb_urb4d - REAL, OPTIONAL, DIMENSION( ims:ime, 1:urban_map_bd , jms:jme ), INTENT(INOUT) :: tlev_urb3d - REAL, OPTIONAL, DIMENSION( ims:ime, 1:urban_map_bd , jms:jme ), INTENT(INOUT) :: qlev_urb3d - REAL, OPTIONAL, DIMENSION( ims:ime, 1:urban_map_wd , jms:jme ), INTENT(INOUT) :: tw1lev_urb3d - REAL, OPTIONAL, DIMENSION( ims:ime, 1:urban_map_wd , jms:jme ), INTENT(INOUT) :: tw2lev_urb3d - REAL, OPTIONAL, DIMENSION( ims:ime, 1:urban_map_gbd, jms:jme ), INTENT(INOUT) :: tglev_urb3d - REAL, OPTIONAL, DIMENSION( ims:ime, 1:urban_map_fbd, jms:jme ), INTENT(INOUT) :: tflev_urb3d - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: lf_ac_urb3d - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: sf_ac_urb3d - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: cm_ac_urb3d - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: sfvent_urb3d - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: lfvent_urb3d - REAL, OPTIONAL, DIMENSION( ims:ime, 1:urban_map_wd , jms:jme ), INTENT(INOUT) :: sfwin1_urb3d - REAL, OPTIONAL, DIMENSION( ims:ime, 1:urban_map_wd , jms:jme ), INTENT(INOUT) :: sfwin2_urb3d - REAL, OPTIONAL, DIMENSION( ims:ime, 1:urban_map_zd , jms:jme ), INTENT(INOUT) :: sfw1_urb3d - REAL, OPTIONAL, DIMENSION( ims:ime, 1:urban_map_zd , jms:jme ), INTENT(INOUT) :: sfw2_urb3d - REAL, OPTIONAL, DIMENSION( ims:ime, 1:urban_map_zdf, jms:jme ), INTENT(INOUT) :: sfr_urb3d - REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_ndm, jms:jme ), INTENT(INOUT) :: sfg_urb3d - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ep_pv_urb3d !GRZ - REAL, OPTIONAL, DIMENSION( ims:ime, 1:urban_map_zdf, jms:jme ), INTENT(INOUT) :: t_pv_urb3d !GRZ - REAL, OPTIONAL, DIMENSION( ims:ime, 1:urban_map_zgrd, jms:jme ),INTENT(INOUT) :: trv_urb4d !GRZ - REAL, OPTIONAL, DIMENSION( ims:ime, 1:urban_map_zgrd, jms:jme ),INTENT(INOUT) :: qr_urb4d !GRZ - REAL, OPTIONAL, DIMENSION( ims:ime,jms:jme ), INTENT(INOUT) :: qgr_urb3d !GRZ - REAL, OPTIONAL, DIMENSION( ims:ime,jms:jme ), INTENT(INOUT) :: tgr_urb3d !GRZ - REAL, OPTIONAL, DIMENSION( ims:ime, 1:urban_map_zdf, jms:jme ),INTENT(INOUT) :: drain_urb4d !GRZ - REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: draingr_urb3d !GRZ - REAL, OPTIONAL, DIMENSION( ims:ime, 1:urban_map_zdf, jms:jme ),INTENT(INOUT) :: sfrv_urb3d !GRZ - REAL, OPTIONAL, DIMENSION( ims:ime, 1:urban_map_zdf, jms:jme ),INTENT(INOUT) :: lfrv_urb3d !GRZ - REAL, OPTIONAL, DIMENSION( ims:ime, 1:urban_map_zdf, jms:jme ),INTENT(INOUT) :: dgr_urb3d !GRZ - REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_ndm, jms:jme ),INTENT(INOUT) :: dg_urb3d !GRZ - REAL, OPTIONAL, DIMENSION( ims:ime, 1:urban_map_zdf, jms:jme ),INTENT(INOUT) :: lfr_urb3d !GRZ - REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_ndm, jms:jme ),INTENT(INOUT) :: lfg_urb3d !GRZ - REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) :: a_u_bep !Implicit momemtum component X-direction - REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) :: a_v_bep !Implicit momemtum component Y-direction - REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) :: a_t_bep !Implicit component pot. temperature - REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) :: a_q_bep !Implicit momemtum component X-direction - REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) :: a_e_bep !Implicit component TKE - REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) :: b_u_bep !Explicit momentum component X-direction - REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) :: b_v_bep !Explicit momentum component Y-direction - REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) :: b_t_bep !Explicit component pot. temperature - REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) :: b_q_bep !Implicit momemtum component Y-direction - REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) :: b_e_bep !Explicit component TKE - REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) :: vl_bep !Fraction air volume in grid cell - REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) :: dlg_bep !Height above ground - REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) :: sf_bep !Fraction air at the face of grid cell - REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) :: dl_u_bep !Length scale - -! Local variables for multi-layer UCM - - REAL, DIMENSION( its:ite, jts:jte) :: HFX_RURAL,GRDFLX_RURAL ! ,LH_RURAL,RN_RURAL - REAL, DIMENSION( its:ite, jts:jte) :: QFX_RURAL ! ,QSFC_RURAL,UMOM_RURAL,VMOM_RURAL - REAL, DIMENSION( its:ite, jts:jte) :: ALB_RURAL,EMISS_RURAL,TSK_RURAL ! ,UST_RURAL - REAL, DIMENSION( its:ite, jts:jte) :: HFX_URB,UMOM_URB,VMOM_URB - REAL, DIMENSION( its:ite, jts:jte) :: QFX_URB - REAL, DIMENSION( its:ite, jts:jte) :: EMISS_URB - REAL, DIMENSION( its:ite, jts:jte) :: RL_UP_URB - REAL, DIMENSION( its:ite, jts:jte) :: RS_ABS_URB - REAL, DIMENSION( its:ite, jts:jte) :: GRDFLX_URB - - REAL :: SIGMA_SB,RL_UP_RURAL,RL_UP_TOT,RS_ABS_TOT,UMOM,VMOM - REAL :: r1,r2,r3 - REAL :: CMR_URB, CHR_URB, CMC_URB, CHC_URB, CMGR_URB, CHGR_URB - REAL :: frc_urb,lb_urb - REAL :: check - - character(len=80) :: message - - DO J=JTS,JTE - DO I=ITS,ITE - HFX_RURAL(I,J) = HFX(I,J) - QFX_RURAL(I,J) = QFX(I,J) - GRDFLX_RURAL(I,J) = GRDFLX(I,J) - EMISS_RURAL(I,J) = EMISS(I,J) - TSK_RURAL(I,J) = TSK(I,J) - ALB_RURAL(I,J) = ALBEDO(I,J) - END DO - END DO - -IF (SF_URBAN_PHYSICS == 1 ) THEN ! Beginning of UCM CALL if block - -!-------------------------------------- -! URBAN CANOPY MODEL START -!-------------------------------------- - -JLOOP : DO J = jts, jte - -ILOOP : DO I = its, ite - - - IF( IVGTYP(I,J) == ISURBAN_TABLE .or. IVGTYP(I,J) == 31 .or. & - IVGTYP(I,J) == 32 .or. IVGTYP(I,J) == 33 ) THEN - - UTYPE_URB = UTYPE_URB2D(I,J) !urban type (low, high or industrial) - - TA_URB = T3D(I,1,J) ! [K] - QA_URB = QV3D(I,1,J)/(1.0+QV3D(I,1,J)) ! [kg/kg] - UA_URB = SQRT(U_PHY(I,1,J)**2.+V_PHY(I,1,J)**2.) - U1_URB = U_PHY(I,1,J) - V1_URB = V_PHY(I,1,J) - IF(UA_URB < 1.) UA_URB=1. ! [m/s] - SSG_URB = SWDOWN(I,J) ! [W/m/m] - SSGD_URB = 0.8*SWDOWN(I,J) ! [W/m/m] - SSGQ_URB = SSG_URB-SSGD_URB ! [W/m/m] - LLG_URB = GLW(I,J) ! [W/m/m] - RAIN_URB = RAINBL(I,J) ! [mm] - RHOO_URB = (P8W3D(I,KTS+1,J)+P8W3D(I,KTS,J))*0.5 / (287.04 * TA_URB * (1.0+ 0.61 * QA_URB)) ![kg/m/m/m] - ZA_URB = 0.5*DZ8W(I,1,J) ! [m] - DELT_URB = DT ! [sec] - XLAT_URB = XLAT_URB2D(I,J) ! [deg] - COSZ_URB = COSZ_URB2D(I,J) - OMG_URB = OMG_URB2D(I,J) - ZNT_URB = ZNT(I,J) - - LSOLAR_URB = .FALSE. - - TR_URB = TR_URB2D(I,J) - TB_URB = TB_URB2D(I,J) - TG_URB = TG_URB2D(I,J) - TC_URB = TC_URB2D(I,J) - QC_URB = QC_URB2D(I,J) - UC_URB = UC_URB2D(I,J) - - TGR_URB = TGR_URB2D(I,J) - CMCR_URB = CMCR_URB2D(I,J) - FLXHUMR_URB = FLXHUMR_URB2D(I,J) - FLXHUMB_URB = FLXHUMB_URB2D(I,J) - FLXHUMG_URB = FLXHUMG_URB2D(I,J) - DRELR_URB = DRELR_URB2D(I,J) - DRELB_URB = DRELB_URB2D(I,J) - DRELG_URB = DRELG_URB2D(I,J) - - DO K = 1,num_roof_layers - TRL_URB(K) = TRL_URB3D(I,K,J) - SMR_URB(K) = SMR_URB3D(I,K,J) - TGRL_URB(K)= TGRL_URB3D(I,K,J) - END DO - - DO K = 1,num_wall_layers - TBL_URB(K) = TBL_URB3D(I,K,J) - END DO - - DO K = 1,num_road_layers - TGL_URB(K) = TGL_URB3D(I,K,J) - END DO - - XXXR_URB = XXXR_URB2D(I,J) - XXXB_URB = XXXB_URB2D(I,J) - XXXG_URB = XXXG_URB2D(I,J) - XXXC_URB = XXXC_URB2D(I,J) - -! Limits to avoid dividing by small number - IF (CHS(I,J) < 1.0E-02) THEN - CHS(I,J) = 1.0E-02 - ENDIF - IF (CHS2(I,J) < 1.0E-02) THEN - CHS2(I,J) = 1.0E-02 - ENDIF - IF (CQS2(I,J) < 1.0E-02) THEN - CQS2(I,J) = 1.0E-02 - ENDIF - - CHS_URB = CHS(I,J) - CHS2(I,J)= CQS2(I,J) - CHS2_URB = CHS2(I,J) - IF (PRESENT(CMR_SFCDIF)) THEN - CMR_URB = CMR_SFCDIF(I,J) - CHR_URB = CHR_SFCDIF(I,J) - CMGR_URB = CMGR_SFCDIF(I,J) - CHGR_URB = CHGR_SFCDIF(I,J) - CMC_URB = CMC_SFCDIF(I,J) - CHC_URB = CHC_SFCDIF(I,J) - ENDIF - -! NUDAPT for SLUCM - - MH_URB = MH_URB2D(I,J) - STDH_URB = STDH_URB2D(I,J) - LP_URB = LP_URB2D(I,J) - HGT_URB = HGT_URB2D(I,J) - LF_URB = 0.0 - DO K = 1,4 - LF_URB(K) = LF_URB2D(I,K,J) - ENDDO - FRC_URB = FRC_URB2D(I,J) - LB_URB = LB_URB2D(I,J) - CHECK = 0 - IF (I.EQ.73.AND.J.EQ.125)THEN - CHECK = 1 - END IF - -! Call urban - - CALL cal_mon_day(julian,julyr,jmonth,jday) - CALL urban(LSOLAR_URB, & ! I - num_roof_layers, num_wall_layers, num_road_layers, & ! C - DZR, DZB, DZG, & ! C - UTYPE_URB, TA_URB, QA_URB, UA_URB, U1_URB, V1_URB, SSG_URB, & ! I - SSGD_URB, SSGQ_URB, LLG_URB, RAIN_URB, RHOO_URB, & ! I - ZA_URB, DECLIN_URB, COSZ_URB, OMG_URB, & ! I - XLAT_URB, DELT_URB, ZNT_URB, & ! I - CHS_URB, CHS2_URB, & ! I - TR_URB, TB_URB, TG_URB, TC_URB, QC_URB, UC_URB, & ! H - TRL_URB, TBL_URB, TGL_URB, & ! H - XXXR_URB, XXXB_URB, XXXG_URB, XXXC_URB, & ! H - TS_URB, QS_URB, SH_URB, LH_URB, LH_KINEMATIC_URB, & ! O - SW_URB, ALB_URB, LW_URB, G_URB, RN_URB, PSIM_URB, PSIH_URB, & ! O - GZ1OZ0_URB, & !O - CMR_URB, CHR_URB, CMC_URB, CHC_URB, & - U10_URB, V10_URB, TH2_URB, Q2_URB, & ! O - UST_URB, mh_urb, stdh_urb, lf_urb, lp_urb, & ! 0 - hgt_urb, frc_urb, lb_urb, check, CMCR_URB,TGR_URB, & ! H - TGRL_URB, SMR_URB, CMGR_URB, CHGR_URB, jmonth, & ! H - DRELR_URB, DRELB_URB, & ! H - DRELG_URB,FLXHUMR_URB,FLXHUMB_URB,FLXHUMG_URB ) - - TS_URB2D(I,J) = TS_URB - - ALBEDO(I,J) = FRC_URB2D(I,J) * ALB_URB + (1-FRC_URB2D(I,J)) * ALBEDO(I,J) ![-] - HFX(I,J) = FRC_URB2D(I,J) * SH_URB + (1-FRC_URB2D(I,J)) * HFX(I,J) ![W/m/m] - QFX(I,J) = FRC_URB2D(I,J) * LH_KINEMATIC_URB & - + (1-FRC_URB2D(I,J))* QFX(I,J) ![kg/m/m/s] - LH(I,J) = FRC_URB2D(I,J) * LH_URB + (1-FRC_URB2D(I,J)) * LH(I,J) ![W/m/m] - GRDFLX(I,J) = FRC_URB2D(I,J) * (G_URB) + (1-FRC_URB2D(I,J)) * GRDFLX(I,J) ![W/m/m] - TSK(I,J) = FRC_URB2D(I,J) * TS_URB + (1-FRC_URB2D(I,J)) * TSK(I,J) ![K] -! Q1 = QSFC(I,J)/(1.0+QSFC(I,J)) -! Q1 = FRC_URB2D(I,J) * QS_URB + (1-FRC_URB2D(I,J)) * Q1 ![-] - -! Convert QSFC back to mixing ratio - -! QSFC(I,J) = Q1/(1.0-Q1) - QSFC(I,J)= FRC_URB2D(I,J)*QS_URB+(1-FRC_URB2D(I,J))*QSFC(I,J) !! QSFC(I,J)=QSFC1D - UST(I,J) = FRC_URB2D(I,J) * UST_URB + (1-FRC_URB2D(I,J)) * UST(I,J) ![m/s] - -! Renew Urban State Variables - - TR_URB2D(I,J) = TR_URB - TB_URB2D(I,J) = TB_URB - TG_URB2D(I,J) = TG_URB - TC_URB2D(I,J) = TC_URB - QC_URB2D(I,J) = QC_URB - UC_URB2D(I,J) = UC_URB - - TGR_URB2D(I,J) = TGR_URB - CMCR_URB2D(I,J) = CMCR_URB - FLXHUMR_URB2D(I,J) = FLXHUMR_URB - FLXHUMB_URB2D(I,J) = FLXHUMB_URB - FLXHUMG_URB2D(I,J) = FLXHUMG_URB - DRELR_URB2D(I,J) = DRELR_URB - DRELB_URB2D(I,J) = DRELB_URB - DRELG_URB2D(I,J) = DRELG_URB - - DO K = 1,num_roof_layers - TRL_URB3D(I,K,J) = TRL_URB(K) - SMR_URB3D(I,K,J) = SMR_URB(K) - TGRL_URB3D(I,K,J)= TGRL_URB(K) - END DO - DO K = 1,num_wall_layers - TBL_URB3D(I,K,J) = TBL_URB(K) - END DO - DO K = 1,num_road_layers - TGL_URB3D(I,K,J) = TGL_URB(K) - END DO - - XXXR_URB2D(I,J) = XXXR_URB - XXXB_URB2D(I,J) = XXXB_URB - XXXG_URB2D(I,J) = XXXG_URB - XXXC_URB2D(I,J) = XXXC_URB - - SH_URB2D(I,J) = SH_URB - LH_URB2D(I,J) = LH_URB - G_URB2D(I,J) = G_URB - RN_URB2D(I,J) = RN_URB - PSIM_URB2D(I,J) = PSIM_URB - PSIH_URB2D(I,J) = PSIH_URB - GZ1OZ0_URB2D(I,J) = GZ1OZ0_URB - U10_URB2D(I,J) = U10_URB - V10_URB2D(I,J) = V10_URB - TH2_URB2D(I,J) = TH2_URB - Q2_URB2D(I,J) = Q2_URB - UST_URB2D(I,J) = UST_URB - AKMS_URB2D(I,J) = KARMAN * UST_URB2D(I,J)/(GZ1OZ0_URB2D(I,J)-PSIM_URB2D(I,J)) - IF (PRESENT(CMR_SFCDIF)) THEN - CMR_SFCDIF(I,J) = CMR_URB - CHR_SFCDIF(I,J) = CHR_URB - CMGR_SFCDIF(I,J) = CMGR_URB - CHGR_SFCDIF(I,J) = CHGR_URB - CMC_SFCDIF(I,J) = CMC_URB - CHC_SFCDIF(I,J) = CHC_URB - ENDIF - - ENDIF ! urban land used type block - -ENDDO ILOOP ! of I loop -ENDDO JLOOP ! of J loop - -ENDIF ! sf_urban_physics = 1 block - -!-------------------------------------- -! URBAN CANOPY MODEL END -!-------------------------------------- - -!-------------------------------------- -! URBAN BEP and BEM MODEL BEGIN -!-------------------------------------- - -IF (SF_URBAN_PHYSICS == 2) THEN - -DO J=JTS,JTE -DO I=ITS,ITE - - EMISS_URB(I,J) = 0. - RL_UP_URB(I,J) = 0. - RS_ABS_URB(I,J) = 0. - GRDFLX_URB(I,J) = 0. - B_Q_BEP(I,KTS:KTE,J) = 0. - -END DO -END DO - - CALL BEP(frc_urb2d, utype_urb2d, itimestep, dz8w, & - dt, u_phy, v_phy, & - th_phy, rho, p_phy, swdown, glw, & - gmt, julday, xlong, xlat, & - declin_urb, cosz_urb2d, omg_urb2d, & - num_urban_ndm, urban_map_zrd, urban_map_zwd, urban_map_gd, & - urban_map_zd, urban_map_zdf, urban_map_bd, urban_map_wd, & - urban_map_gbd, urban_map_fbd, num_urban_hi, & - trb_urb4d, tw1_urb4d, tw2_urb4d, tgb_urb4d, & - sfw1_urb3d, sfw2_urb3d, sfr_urb3d, sfg_urb3d, & - lp_urb2d, hi_urb2d, lb_urb2d, hgt_urb2d, & - a_u_bep, a_v_bep, a_t_bep, & - a_e_bep, b_u_bep, b_v_bep, & - b_t_bep, b_e_bep, b_q_bep, dlg_bep, & - dl_u_bep, sf_bep, vl_bep, & - rl_up_urb, rs_abs_urb, emiss_urb, grdflx_urb, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) - -ENDIF ! SF_URBAN_PHYSICS == 2 - -IF (SF_URBAN_PHYSICS == 3) THEN - -DO J=JTS,JTE -DO I=ITS,ITE - - EMISS_URB(I,J) = 0. - RL_UP_URB(I,J) = 0. - RS_ABS_URB(I,J) = 0. - GRDFLX_URB(I,J) = 0. - B_Q_BEP(I,KTS:KTE,J) = 0. - -END DO -END DO - - CALL BEP_BEM( frc_urb2d, utype_urb2d, itimestep, dz8w, & - dt, u_phy, v_phy, & - th_phy, rho, p_phy, swdown, glw, & - gmt, julday, xlong, xlat, & - declin_urb, cosz_urb2d, omg_urb2d, & - num_urban_ndm, urban_map_zrd, urban_map_zwd, urban_map_gd, & - urban_map_zd, urban_map_zdf, urban_map_bd, urban_map_wd, & - urban_map_gbd, urban_map_fbd, urban_map_zgrd,num_urban_hi, & - trb_urb4d, tw1_urb4d, tw2_urb4d, tgb_urb4d, & - tlev_urb3d, qlev_urb3d, tw1lev_urb3d, tw2lev_urb3d, & - tglev_urb3d, tflev_urb3d, sf_ac_urb3d, lf_ac_urb3d, & - cm_ac_urb3d, sfvent_urb3d, lfvent_urb3d, & - sfwin1_urb3d, sfwin2_urb3d, & - sfw1_urb3d, sfw2_urb3d, sfr_urb3d, sfg_urb3d, & - ep_pv_urb3d, t_pv_urb3d, & !RMS - trv_urb4d, qr_urb4d, qgr_urb3d, tgr_urb3d, & !RMS - drain_urb4d,draingr_urb3d, sfrv_urb3d, lfrv_urb3d, & !RMS - dgr_urb3d, dg_urb3d, lfr_urb3d, lfg_urb3d, & !RMS - rainbl, swddir, swddif, & - lp_urb2d, hi_urb2d, lb_urb2d, hgt_urb2d, & - a_u_bep, a_v_bep, a_t_bep, & - a_e_bep, b_u_bep, b_v_bep, & - b_t_bep, b_e_bep, b_q_bep, dlg_bep, & - dl_u_bep, sf_bep, vl_bep, & - rl_up_urb, rs_abs_urb, emiss_urb, grdflx_urb, qv3d, & - ids,ide, jds,jde, kds,kde, & - ims,ime, jms,jme, kms,kme, & - its,ite, jts,jte, kts,kte ) - -ENDIF ! SF_URBAN_PHYSICS == 3 - -IF((SF_URBAN_PHYSICS == 2).OR.(SF_URBAN_PHYSICS == 3))THEN - - sigma_sb=5.67e-08 - do j = jts, jte - do i = its, ite - UMOM_URB(I,J) = 0. - VMOM_URB(I,J) = 0. - HFX_URB(I,J) = 0. - QFX_URB(I,J) = 0. - - do k=kts,kte - a_u_bep(i,k,j) = a_u_bep(i,k,j)*frc_urb2d(i,j) - a_v_bep(i,k,j) = a_v_bep(i,k,j)*frc_urb2d(i,j) - a_t_bep(i,k,j) = a_t_bep(i,k,j)*frc_urb2d(i,j) - a_q_bep(i,k,j) = 0. - a_e_bep(i,k,j) = 0. - b_u_bep(i,k,j) = b_u_bep(i,k,j)*frc_urb2d(i,j) - b_v_bep(i,k,j) = b_v_bep(i,k,j)*frc_urb2d(i,j) - b_t_bep(i,k,j) = b_t_bep(i,k,j)*frc_urb2d(i,j) - b_q_bep(i,k,j) = b_q_bep(i,k,j)*frc_urb2d(i,j) - b_e_bep(i,k,j) = b_e_bep(i,k,j)*frc_urb2d(i,j) - HFX_URB(I,J) = HFX_URB(I,J) + B_T_BEP(I,K,J)*RHO(I,K,J)*CP*DZ8W(I,K,J)*VL_BEP(I,K,J) - QFX_URB(I,J) = QFX_URB(I,J) + B_Q_BEP(I,K,J)*DZ8W(I,K,J)*VL_BEP(I,K,J) - UMOM_URB(I,J) = UMOM_URB(I,J)+ (A_U_BEP(I,K,J)*U_PHY(I,K,J)+B_U_BEP(I,K,J))*DZ8W(I,K,J)*VL_BEP(I,K,J) - VMOM_URB(I,J) = VMOM_URB(I,J)+ (A_V_BEP(I,K,J)*V_PHY(I,K,J)+B_V_BEP(I,K,J))*DZ8W(I,K,J)*VL_BEP(I,K,J) - vl_bep(i,k,j) = (1.-frc_urb2d(i,j)) + vl_bep(i,k,j)*frc_urb2d(i,j) - sf_bep(i,k,j) = (1.-frc_urb2d(i,j)) + sf_bep(i,k,j)*frc_urb2d(i,j) - end do - - a_u_bep(i,1,j) = (1.-frc_urb2d(i,j))*(-ust(I,J)*ust(I,J))/dz8w(i,1,j)/ & - ((u_phy(i,1,j)**2+v_phy(i,1,j)**2.)**.5)+a_u_bep(i,1,j) - - a_v_bep(i,1,j) = (1.-frc_urb2d(i,j))*(-ust(I,J)*ust(I,J))/dz8w(i,1,j)/ & - ((u_phy(i,1,j)**2+v_phy(i,1,j)**2.)**.5)+a_v_bep(i,1,j) - - b_t_bep(i,1,j) = (1.-frc_urb2d(i,j))*hfx_rural(i,j)/dz8w(i,1,j)/rho(i,1,j)/CP+ & - b_t_bep(i,1,j) - - b_q_bep(i,1,j) = (1.-frc_urb2d(i,j))*qfx_rural(i,j)/dz8w(i,1,j)/rho(i,1,j)+b_q_bep(i,1,j) - - umom = (1.-frc_urb2d(i,j))*ust(i,j)*ust(i,j)*u_phy(i,1,j)/ & - ((u_phy(i,1,j)**2+v_phy(i,1,j)**2.)**.5)+umom_urb(i,j) - - vmom = (1.-frc_urb2d(i,j))*ust(i,j)*ust(i,j)*v_phy(i,1,j)/ & - ((u_phy(i,1,j)**2+v_phy(i,1,j)**2.)**.5)+vmom_urb(i,j) - sf_bep(i,1,j) = 1. - -! using the emissivity and the total longwave upward radiation estimate the averaged skin temperature - - IF (FRC_URB2D(I,J).GT.0.) THEN - rl_up_rural = -emiss_rural(i,j)*sigma_sb*(tsk_rural(i,j)**4.)-(1.-emiss_rural(i,j))*glw(i,j) - rl_up_tot = (1.-frc_urb2d(i,j))*rl_up_rural + frc_urb2d(i,j)*rl_up_urb(i,j) - emiss(i,j) = (1.-frc_urb2d(i,j))*emiss_rural(i,j)+ frc_urb2d(i,j)*emiss_urb(i,j) - ts_urb2d(i,j) = (max(0.,(-rl_up_urb(i,j)-(1.-emiss_urb(i,j))*glw(i,j))/emiss_urb(i,j)/sigma_sb))**0.25 - tsk(i,j) = (max(0., (-1.*rl_up_tot-(1.-emiss(i,j))*glw(i,j) )/emiss(i,j)/sigma_sb))**.25 - rs_abs_tot = (1.-frc_urb2d(i,j))*swdown(i,j)*(1.-albedo(i,j))+frc_urb2d(i,j)*rs_abs_urb(i,j) - - if(swdown(i,j) > 0.)then - albedo(i,j) = 1.-rs_abs_tot/swdown(i,j) - else - albedo(i,j) = alb_rural(i,j) - endif - -! rename *_urb to sh_urb2d,lh_urb2d,g_urb2d,rn_urb2d - - grdflx(i,j) = (1.-frc_urb2d(i,j))*grdflx_rural(i,j)+ frc_urb2d(i,j)*grdflx_urb(i,j) - qfx(i,j) = (1.-frc_urb2d(i,j))*qfx_rural(i,j) + qfx_urb(i,j) - lh(i,j) = qfx(i,j)*xlv - hfx(i,j) = hfx_urb(i,j) + (1-frc_urb2d(i,j))*hfx_rural(i,j) ![W/m/m] - sh_urb2d(i,j) = hfx_urb(i,j)/frc_urb2d(i,j) - lh_urb2d(i,j) = qfx_urb(i,j)*xlv/frc_urb2d(i,j) - g_urb2d(i,j) = grdflx_urb(i,j) - rn_urb2d(i,j) = rs_abs_urb(i,j)+emiss_urb(i,j)*glw(i,j)-rl_up_urb(i,j) - ust(i,j) = (umom**2.+vmom**2.)**.25 - - ELSE - - sh_urb2d(i,j) = 0. - lh_urb2d(i,j) = 0. - g_urb2d(i,j) = 0. - rn_urb2d(i,j) = 0. - - ENDIF - - enddo ! jloop - enddo ! iloop - -ENDIF ! SF_URBAN_PHYSICS == 2 or 3 - -!-------------------------------------- -! URBAN BEP and BEM MODEL END -!-------------------------------------- - - -END SUBROUTINE noahmp_urban - -!------------------------------------------------------------------------------------------ -! -END MODULE module_sf_noahmpdrv diff --git a/phys/module_sf_noahmplsm.F b/phys/module_sf_noahmplsm.F deleted file mode 100644 index d41e7737ae..0000000000 --- a/phys/module_sf_noahmplsm.F +++ /dev/null @@ -1,12348 +0,0 @@ -! Program Name: -! Author(s)/Contact(s): -! Abstract: -! History Log: -! -! Usage: -! Parameters: -! Input Files: -! -! Output Files: -! -! -! Condition codes: -! -! If appropriate, descriptive troubleshooting instructions or -! likely causes for failures could be mentioned here with the -! appropriate error code -! -! User controllable options: - -MODULE MODULE_SF_NOAHMPLSM - - use module_sf_gecros, only : gecros - - IMPLICIT NONE - - public :: noahmp_options - public :: NOAHMP_SFLX - - private :: ATM - private :: PHENOLOGY - private :: PRECIP_HEAT - private :: ENERGY - private :: THERMOPROP - private :: CSNOW - private :: TDFCND - private :: RADIATION - private :: ALBEDO - private :: SNOW_AGE - private :: SNOWALB_BATS - private :: SNOWALB_CLASS - private :: GROUNDALB - private :: TWOSTREAM - private :: SURRAD - private :: VEGE_FLUX - private :: SFCDIF1 - private :: SFCDIF2 - private :: STOMATA - private :: CANRES - private :: ESAT - private :: RAGRB - private :: BARE_FLUX - private :: TSNOSOI - private :: HRT - private :: HSTEP - private :: ROSR12 - private :: PHASECHANGE - private :: FRH2O - - private :: WATER - private :: CANWATER - private :: SNOWWATER - private :: SNOWFALL - private :: COMBINE - private :: DIVIDE - private :: COMBO - private :: COMPACT - private :: SNOWH2O - private :: SOILWATER - private :: ZWTEQ - private :: INFIL - private :: SRT - private :: WDFCND1 - private :: WDFCND2 - private :: SSTEP - private :: GROUNDWATER - private :: SHALLOWWATERTABLE - - private :: CARBON - private :: CO2FLUX -! private :: BVOCFLUX -! private :: CH4FLUX - - private :: ERROR - -! =====================================options for different schemes================================ -! **recommended - - INTEGER :: DVEG ! options for dynamic vegetation: - ! 1 -> off (use table LAI; use FVEG = SHDFAC from input) - ! 2 -> on (together with OPT_CRS = 1) - ! 3 -> off (use table LAI; calculate FVEG) - ! **4 -> off (use table LAI; use maximum vegetation fraction) - ! **5 -> on (use maximum vegetation fraction) - ! 6 -> on (use FVEG = SHDFAC from input) - ! 7 -> off (use input LAI; use FVEG = SHDFAC from input) - ! 8 -> off (use input LAI; calculate FVEG) - ! 9 -> off (use input LAI; use maximum vegetation fraction) - - INTEGER :: OPT_CRS ! options for canopy stomatal resistance - ! **1 -> Ball-Berry - ! 2 -> Jarvis - - INTEGER :: OPT_BTR ! options for soil moisture factor for stomatal resistance - ! **1 -> Noah (soil moisture) - ! 2 -> CLM (matric potential) - ! 3 -> SSiB (matric potential) - - INTEGER :: OPT_RUN ! options for runoff and groundwater - ! **1 -> TOPMODEL with groundwater (Niu et al. 2007 JGR) ; - ! 2 -> TOPMODEL with an equilibrium water table (Niu et al. 2005 JGR) ; - ! 3 -> original surface and subsurface runoff (free drainage) - ! 4 -> BATS surface and subsurface runoff (free drainage) - ! 5 -> Miguez-Macho&Fan groundwater scheme (Miguez-Macho et al. 2007 JGR; Fan et al. 2007 JGR) - ! (needs further testing for public use) - ! 6 -> Variable Infiltration Capacity Model surface runoff scheme (Wood et al., 1992, JGR) - ! 7 -> Xiananjiang Infiltration and surface runoff scheme ((Jayawardena and Zhou, 2000) - ! 8 -> Dynamic VIC surface runoff scheme (Liang and Xie, 2001) - - INTEGER :: OPT_SFC ! options for surface layer drag coeff (CH & CM) - ! **1 -> M-O - ! **2 -> original Noah (Chen97) - ! **3 -> MYJ consistent; 4->YSU consistent. MB: removed in v3.7 for further testing - - INTEGER :: OPT_FRZ ! options for supercooled liquid water (or ice fraction) - ! **1 -> no iteration (Niu and Yang, 2006 JHM) - ! 2 -> Koren's iteration - - INTEGER :: OPT_INF ! options for frozen soil permeability - ! **1 -> linear effects, more permeable (Niu and Yang, 2006, JHM) - ! 2 -> nonlinear effects, less permeable (old) - - INTEGER :: OPT_RAD ! options for radiation transfer - ! 1 -> modified two-stream (gap = F(solar angle, 3D structure ...)<1-FVEG) - ! 2 -> two-stream applied to grid-cell (gap = 0) - ! **3 -> two-stream applied to vegetated fraction (gap=1-FVEG) - - INTEGER :: OPT_ALB ! options for ground snow surface albedo - ! 1 -> BATS - ! **2 -> CLASS - - INTEGER :: OPT_SNF ! options for partitioning precipitation into rainfall & snowfall - ! **1 -> Jordan (1991) - ! 2 -> BATS: when SFCTMP SFCTMP < TFRZ - ! 4 -> Use WRF microphysics output - ! 5 -> Use wetbulb temperature (Wang et al., 2019 GRL) C.He, 12/18/2020 - - INTEGER :: OPT_TBOT ! options for lower boundary condition of soil temperature - ! 1 -> zero heat flux from bottom (ZBOT and TBOT not used) - ! **2 -> TBOT at ZBOT (8m) read from a file (original Noah) - - INTEGER :: OPT_STC ! options for snow/soil temperature time scheme (only layer 1) - ! **1 -> semi-implicit; flux top boundary condition - ! 2 -> full implicit (original Noah); temperature top boundary condition - ! 3 -> same as 1, but FSNO for TS calculation (generally improves snow; v3.7) - - INTEGER :: OPT_RSF ! options for surface resistent to evaporation/sublimation - ! **1 -> Sakaguchi and Zeng, 2009 - ! 2 -> Sellers (1992) - ! 3 -> adjusted Sellers to decrease RSURF for wet soil - ! 4 -> option 1 for non-snow; rsurf = rsurf_snow for snow (set in MPTABLE); AD v3.8 - - INTEGER :: OPT_SOIL ! options for defining soil properties - ! **1 -> use input dominant soil texture - ! 2 -> use input soil texture that varies with depth - ! 3 -> use soil composition (sand, clay, orgm) and pedotransfer functions (OPT_PEDO) - ! 4 -> use input soil properties (BEXP_3D, SMCMAX_3D, etc.) - - INTEGER :: OPT_PEDO ! options for pedotransfer functions (used when OPT_SOIL = 3) - ! **1 -> Saxton and Rawls (2006) - - INTEGER :: OPT_CROP ! options for crop model - ! **0 -> No crop model, will run default dynamic vegetation - ! 1 -> Liu, et al. 2016 - ! 2 -> Gecros (Genotype-by-Environment interaction on CROp growth Simulator) Yin and van Laar, 2005 - - INTEGER :: OPT_IRR ! options for irrigation - ! **0 -> No irrigation - ! 1 -> Irrigation ON - ! 2 -> irrigation trigger based on crop season Planting and harvesting dates - ! *3 -> irrigation trigger based on LAI threshold - - INTEGER :: OPT_IRRM ! options for irrigation method - ! **0 -> method based on geo_em fractions - ! 1 -> sprinkler method - ! 2 -> micro/drip irrigation - ! 3 -> surface flooding - - INTEGER :: OPT_INFDV! options for infiltration in dynamic VIC runoff scheme - ! **1 -> Philip scheme - ! 2 -> Green-Ampt scheme - ! 3 -> Smith-Parlange scheme - - INTEGER :: OPT_TDRN ! options for crop model (currently only tested & calibrated to work with opt_run=3) - ! **0 -> No tile drainage - ! 1 -> on (simple scheme) - ! 2 -> on (Hooghoudt's scheme) - -!------------------------------------------------------------------------------------------! -! Physical Constants: ! -!------------------------------------------------------------------------------------------! - - REAL, PARAMETER :: GRAV = 9.80616 !acceleration due to gravity (m/s2) - REAL, PARAMETER :: SB = 5.67E-08 !Stefan-Boltzmann constant (w/m2/k4) - REAL, PARAMETER :: VKC = 0.40 !von Karman constant - REAL, PARAMETER :: TFRZ = 273.16 !freezing/melting point (k) - REAL, PARAMETER :: HSUB = 2.8440E06 !latent heat of sublimation (j/kg) - REAL, PARAMETER :: HVAP = 2.5104E06 !latent heat of vaporization (j/kg) - REAL, PARAMETER :: HFUS = 0.3336E06 !latent heat of fusion (j/kg) - REAL, PARAMETER :: CWAT = 4.188E06 !specific heat capacity of water (j/m3/k) - REAL, PARAMETER :: CICE = 2.094E06 !specific heat capacity of ice (j/m3/k) - REAL, PARAMETER :: CPAIR = 1004.64 !heat capacity dry air at const pres (j/kg/k) - REAL, PARAMETER :: TKWAT = 0.6 !thermal conductivity of water (w/m/k) - REAL, PARAMETER :: TKICE = 2.2 !thermal conductivity of ice (w/m/k) - REAL, PARAMETER :: TKAIR = 0.023 !thermal conductivity of air (w/m/k) (not used MB: 20140718) - REAL, PARAMETER :: RAIR = 287.04 !gas constant for dry air (j/kg/k) - REAL, PARAMETER :: RW = 461.269 !gas constant for water vapor (j/kg/k) - REAL, PARAMETER :: DENH2O = 1000.0 !density of water (kg/m3) - REAL, PARAMETER :: DENICE = 917.0 !density of ice (kg/m3) - - INTEGER, PRIVATE, PARAMETER :: MBAND = 2 - INTEGER, PRIVATE, PARAMETER :: NSOIL = 4 - INTEGER, PRIVATE, PARAMETER :: NSTAGE = 8 - -! add control for a different soil timestep capability - logical :: calculate_soil - integer :: soil_update_steps - - TYPE noahmp_parameters ! define a NoahMP parameters type - -!------------------------------------------------------------------------------------------! -! From the veg section of MPTABLE.TBL -!------------------------------------------------------------------------------------------! - - LOGICAL :: URBAN_FLAG - INTEGER :: ISWATER - INTEGER :: ISBARREN - INTEGER :: ISICE - INTEGER :: ISCROP - INTEGER :: EBLFOREST - REAL :: CH2OP !maximum intercepted h2o per unit lai+sai (mm) - REAL :: DLEAF !characteristic leaf dimension (m) - REAL :: Z0MVT !momentum roughness length (m) - REAL :: HVT !top of canopy (m) - REAL :: HVB !bottom of canopy (m) - REAL :: DEN !tree density (no. of trunks per m2) - REAL :: RC !tree crown radius (m) - REAL :: MFSNO !snowmelt m parameter () - REAL :: SCFFAC !snow cover factor (m) (originally hard-coded 2.5*z0 in SCF formulation) - REAL :: SAIM(12) !monthly stem area index, one-sided - REAL :: LAIM(12) !monthly leaf area index, one-sided - REAL :: SLA !single-side leaf area per Kg [m2/kg] - REAL :: DILEFC !coeficient for leaf stress death [1/s] - REAL :: DILEFW !coeficient for leaf stress death [1/s] - REAL :: FRAGR !fraction of growth respiration !original was 0.3 - REAL :: LTOVRC !leaf turnover [1/s] - REAL :: C3PSN !photosynthetic pathway: 0. = c4, 1. = c3 - REAL :: KC25 !co2 michaelis-menten constant at 25c (pa) - REAL :: AKC !q10 for kc25 - REAL :: KO25 !o2 michaelis-menten constant at 25c (pa) - REAL :: AKO !q10 for ko25 - REAL :: VCMX25 !maximum rate of carboxylation at 25c (umol co2/m**2/s) - REAL :: AVCMX !q10 for vcmx25 - REAL :: BP !minimum leaf conductance (umol/m**2/s) - REAL :: MP !slope of conductance-to-photosynthesis relationship - REAL :: QE25 !quantum efficiency at 25c (umol co2 / umol photon) - REAL :: AQE !q10 for qe25 - REAL :: RMF25 !leaf maintenance respiration at 25c (umol co2/m**2/s) - REAL :: RMS25 !stem maintenance respiration at 25c (umol co2/kg bio/s) - REAL :: RMR25 !root maintenance respiration at 25c (umol co2/kg bio/s) - REAL :: ARM !q10 for maintenance respiration - REAL :: FOLNMX !foliage nitrogen concentration when f(n)=1 (%) - REAL :: TMIN !minimum temperature for photosynthesis (k) - REAL :: XL !leaf/stem orientation index - REAL :: RHOL(MBAND) !leaf reflectance: 1=vis, 2=nir - REAL :: RHOS(MBAND) !stem reflectance: 1=vis, 2=nir - REAL :: TAUL(MBAND) !leaf transmittance: 1=vis, 2=nir - REAL :: TAUS(MBAND) !stem transmittance: 1=vis, 2=nir - REAL :: MRP !microbial respiration parameter (umol co2 /kg c/ s) - REAL :: CWPVT !empirical canopy wind parameter - REAL :: WRRAT !wood to non-wood ratio - REAL :: WDPOOL !wood pool (switch 1 or 0) depending on woody or not [-] - REAL :: TDLEF !characteristic T for leaf freezing [K] - INTEGER :: NROOT !number of soil layers with root present - REAL :: RGL !Parameter used in radiation stress function - REAL :: RSMIN !Minimum stomatal resistance [s m-1] - REAL :: HS !Parameter used in vapor pressure deficit function - REAL :: TOPT !Optimum transpiration air temperature [K] - REAL :: RSMAX !Maximal stomatal resistance [s m-1] - REAL :: SLAREA - REAL :: EPS(5) - -!------------------------------------------------------------------------------------------! -! From the rad section of MPTABLE.TBL -!------------------------------------------------------------------------------------------! - - REAL :: ALBSAT(MBAND) !saturated soil albedos: 1=vis, 2=nir - REAL :: ALBDRY(MBAND) !dry soil albedos: 1=vis, 2=nir - REAL :: ALBICE(MBAND) !albedo land ice: 1=vis, 2=nir - REAL :: ALBLAK(MBAND) !albedo frozen lakes: 1=vis, 2=nir - REAL :: OMEGAS(MBAND) !two-stream parameter omega for snow - REAL :: BETADS !two-stream parameter betad for snow - REAL :: BETAIS !two-stream parameter betad for snow - REAL :: EG(2) !emissivity - -!------------------------------------------------------------------------------------------! -! From the globals section of MPTABLE.TBL -!------------------------------------------------------------------------------------------! - - REAL :: CO2 !co2 partial pressure - REAL :: O2 !o2 partial pressure - REAL :: TIMEAN !gridcell mean topgraphic index (global mean) - REAL :: FSATMX !maximum surface saturated fraction (global mean) - REAL :: Z0SNO !snow surface roughness length (m) (0.002) - REAL :: SSI !liquid water holding capacity for snowpack (m3/m3) - REAL :: SNOW_RET_FAC !snowpack water release timescale factor (1/s) - REAL :: SNOW_EMIS !snow emissivity - REAL :: SWEMX !new snow mass to fully cover old snow (mm) - REAL :: TAU0 !tau0 from Yang97 eqn. 10a - REAL :: GRAIN_GROWTH !growth from vapor diffusion Yang97 eqn. 10b - REAL :: EXTRA_GROWTH !extra growth near freezing Yang97 eqn. 10c - REAL :: DIRT_SOOT !dirt and soot term Yang97 eqn. 10d - REAL :: BATS_COSZ !zenith angle snow albedo adjustment; b in Yang97 eqn. 15 - REAL :: BATS_VIS_NEW !new snow visible albedo - REAL :: BATS_NIR_NEW !new snow NIR albedo - REAL :: BATS_VIS_AGE !age factor for diffuse visible snow albedo Yang97 eqn. 17 - REAL :: BATS_NIR_AGE !age factor for diffuse NIR snow albedo Yang97 eqn. 18 - REAL :: BATS_VIS_DIR !cosz factor for direct visible snow albedo Yang97 eqn. 15 - REAL :: BATS_NIR_DIR !cosz factor for direct NIR snow albedo Yang97 eqn. 16 - REAL :: RSURF_SNOW !surface resistance for snow(s/m) - REAL :: RSURF_EXP !exponent in the shape parameter for soil resistance option 1 - -!------------------------------------------------------------------------------------------! -! From the irrigation section of MPTABLE.TBL -!------------------------------------------------------------------------------------------! - REAL :: IRR_FRAC ! irrigation Fraction - INTEGER :: IRR_HAR ! number of days before harvest date to stop irrigation - REAL :: IRR_LAI ! Minimum lai to trigger irrigation - REAL :: IRR_MAD ! management allowable deficit (0-1) - REAL :: FILOSS ! fraction of flood irrigation loss (0-1) - REAL :: SPRIR_RATE ! mm/h, sprinkler irrigation rate - REAL :: MICIR_RATE ! mm/h, micro irrigation rate - REAL :: FIRTFAC ! flood application rate factor - REAL :: IR_RAIN ! maximum precipitation to stop irrigation trigger - -!------------------------------------------------------------------------------------------! -! From the crop section of MPTABLE.TBL -!------------------------------------------------------------------------------------------! - - INTEGER :: PLTDAY ! Planting date - INTEGER :: HSDAY ! Harvest date - REAL :: PLANTPOP ! Plant density [per ha] - used? - REAL :: IRRI ! Irrigation strategy 0= non-irrigation 1=irrigation (no water-stress) - REAL :: GDDTBASE ! Base temperature for GDD accumulation [C] - REAL :: GDDTCUT ! Upper temperature for GDD accumulation [C] - REAL :: GDDS1 ! GDD from seeding to emergence - REAL :: GDDS2 ! GDD from seeding to initial vegetative - REAL :: GDDS3 ! GDD from seeding to post vegetative - REAL :: GDDS4 ! GDD from seeding to intial reproductive - REAL :: GDDS5 ! GDD from seeding to pysical maturity - INTEGER :: C3C4 ! photosynthetic pathway: 1 = c3 2 = c4 - REAL :: AREF ! reference maximum CO2 assimulation rate - REAL :: PSNRF ! CO2 assimulation reduction factor(0-1) (caused by non-modeling part,e.g.pest,weeds) - REAL :: I2PAR ! Fraction of incoming solar radiation to photosynthetically active radiation - REAL :: TASSIM0 ! Minimum temperature for CO2 assimulation [C] - REAL :: TASSIM1 ! CO2 assimulation linearly increasing until temperature reaches T1 [C] - REAL :: TASSIM2 ! CO2 assmilation rate remain at Aref until temperature reaches T2 [C] - REAL :: K ! light extinction coefficient - REAL :: EPSI ! initial light use efficiency - REAL :: Q10MR ! q10 for maintainance respiration - REAL :: FOLN_MX ! foliage nitrogen concentration when f(n)=1 (%) - REAL :: LEFREEZ ! characteristic T for leaf freezing [K] - REAL :: DILE_FC(NSTAGE) ! coeficient for temperature leaf stress death [1/s] - REAL :: DILE_FW(NSTAGE) ! coeficient for water leaf stress death [1/s] - REAL :: FRA_GR ! fraction of growth respiration - REAL :: LF_OVRC(NSTAGE) ! fraction of leaf turnover [1/s] - REAL :: ST_OVRC(NSTAGE) ! fraction of stem turnover [1/s] - REAL :: RT_OVRC(NSTAGE) ! fraction of root tunrover [1/s] - REAL :: LFMR25 ! leaf maintenance respiration at 25C [umol CO2/m**2 /s] - REAL :: STMR25 ! stem maintenance respiration at 25C [umol CO2/kg bio/s] - REAL :: RTMR25 ! root maintenance respiration at 25C [umol CO2/kg bio/s] - REAL :: GRAINMR25 ! grain maintenance respiration at 25C [umol CO2/kg bio/s] - REAL :: LFPT(NSTAGE) ! fraction of carbohydrate flux to leaf - REAL :: STPT(NSTAGE) ! fraction of carbohydrate flux to stem - REAL :: RTPT(NSTAGE) ! fraction of carbohydrate flux to root - REAL :: LFCT(NSTAGE) ! fraction of carbohydrate flux transallocate from leaf to grain ! Zhe Zhang 2020-07-13 - REAL :: STCT(NSTAGE) ! fraction of carbohydrate flux transallocate from stem to grain - REAL :: RTCT(NSTAGE) ! fraction of carbohydrate flux transallocate from root to grain - REAL :: GRAINPT(NSTAGE) ! fraction of carbohydrate flux to grain - REAL :: BIO2LAI ! leaf are per living leaf biomass [m^2/kg] - -!------------------------------------------------------------------------------------------! -! From the SOILPARM.TBL tables, as functions of soil category. -!------------------------------------------------------------------------------------------! - REAL :: BEXP(NSOIL) !B parameter - REAL :: SMCDRY(NSOIL) !dry soil moisture threshold where direct evap from top - !layer ends (volumetric) (not used MB: 20140718) - REAL :: SMCWLT(NSOIL) !wilting point soil moisture (volumetric) - REAL :: SMCREF(NSOIL) !reference soil moisture (field capacity) (volumetric) - REAL :: SMCMAX(NSOIL) !porosity, saturated value of soil moisture (volumetric) - REAL :: PSISAT(NSOIL) !saturated soil matric potential - REAL :: DKSAT(NSOIL) !saturated soil hydraulic conductivity - REAL :: DWSAT(NSOIL) !saturated soil hydraulic diffusivity - REAL :: QUARTZ(NSOIL) !soil quartz content - REAL :: F1 !soil thermal diffusivity/conductivity coef (not used MB: 20140718) - REAL :: BVIC !VIC model infiltration parameter for opt_run=6 - REAL :: AXAJ !Xinanjiang: Tension water distribution inflection parameter [-] for opt_run=7 - REAL :: BXAJ !Xinanjiang: Tension water distribution shape parameter [-] for opt_run=7 - REAL :: XXAJ !Xinanjiang: Free water distribution shape parameter [-] for opt_run=7 - REAL :: BDVIC !DVIC model infiltration parameter [-] for opt_run=8 - REAL :: GDVIC !Mean Capillary Drive (m) for infiltration models for opt_run=8 - REAL :: BBVIC !DVIC heterogeniety parameter for infiltration for opt_run=8 - -!------------------------------------------------------------------------------------------! -! From the GENPARM.TBL file -!------------------------------------------------------------------------------------------! - REAL :: SLOPE !slope index (0 - 1) - REAL :: CSOIL !vol. soil heat capacity [j/m3/K] - REAL :: ZBOT !Depth (m) of lower boundary soil temperature - REAL :: CZIL !Calculate roughness length of heat - REAL :: REFDK - REAL :: REFKDT - REAL :: KDT !used in compute maximum infiltration rate (in INFIL) - REAL :: FRZX !used in compute maximum infiltration rate (in INFIL) - -!------------------------------------------------------------------------------------------! -! From the tiledrain section of the MPTABLE.TBL file -!------------------------------------------------------------------------------------------! - REAL :: TDSMC_FAC - REAL :: TD_DC - INTEGER :: TD_DEPTH - INTEGER :: DRAIN_LAYER_OPT - REAL :: TD_DCOEF ! m d^-1, drainage coefficent - REAL :: TD_D ! m, depth to impervious layer from drain water level (D) - REAL :: TD_ADEPTH ! m, actual depth of impervious layer from land surface - REAL :: TD_RADI ! m, effective radius of drains (ro) - REAL :: TD_SPAC ! m, distance between two drain tubes or tiles (L) - REAL :: TD_DDRAIN ! m, Depth of drain - REAL :: KLAT_FAC ! multiplication factor to determine conk(j1,j) from sol_k(j1,j) for HRU - - - END TYPE noahmp_parameters - -contains -! -!== begin noahmp_sflx ============================================================================== - - SUBROUTINE NOAHMP_SFLX (parameters, & - ILOC , JLOC , LAT , YEARLEN , JULIAN , COSZ , & ! IN : Time/Space-related - DT , DX , DZ8W , NSOIL , ZSOIL , NSNOW , & ! IN : Model configuration - SHDFAC , SHDMAX , VEGTYP , ICE , IST , CROPTYPE, & ! IN : Vegetation/Soil characteristics - SMCEQ , & ! IN : Vegetation/Soil characteristics - SFCTMP , SFCPRS , PSFC , UU , VV , Q2 , & ! IN : Forcing - QC , SOLDN , LWDN , & ! IN : Forcing - PRCPCONV, PRCPNONC, PRCPSHCV, PRCPSNOW, PRCPGRPL, PRCPHAIL, & ! IN : Forcing - TBOT , CO2AIR , O2AIR , FOLN , FICEOLD , ZLVL , & ! IN : Forcing - IRRFRA , SIFRA , MIFRA , FIFRA , LLANDUSE, & ! IN : Irrigation: fractions - ALBOLD , SNEQVO , & ! IN/OUT : - STC , SH2O , SMC , TAH , EAH , FWET , & ! IN/OUT : - CANLIQ , CANICE , TV , TG , QSFC , QSNOW , & ! IN/OUT : - QRAIN , & ! IN/OUT : - ISNOW , ZSNSO , SNOWH , SNEQV , SNICE , SNLIQ , & ! IN/OUT : - ZWT , WA , WT , WSLAKE , LFMASS , RTMASS , & ! IN/OUT : - STMASS , WOOD , STBLCP , FASTCP , LAI , SAI , & ! IN/OUT : - CM , CH , TAUSS , & ! IN/OUT : - GRAIN , GDD , PGS , & ! IN/OUT - SMCWTD ,DEEPRECH , RECH , & ! IN/OUT : - GECROS1D, & ! IN/OUT : - QTLDRN , TDFRACMP, & ! IN/OUT : - Z0WRF , & ! OUT : - IRCNTSI , IRCNTMI , IRCNTFI , IRAMTSI , IRAMTMI , IRAMTFI , & ! IN/OUT : Irrigation: vars - IRSIRATE, IRMIRATE, IRFIRATE, FIRR , EIRR , & ! IN/OUT : Irrigation: vars - FSA , FSR , FIRA , FSH , SSOIL , FCEV , & ! OUT : - FGEV , FCTR , ECAN , ETRAN , EDIR , TRAD , & ! OUT : - TGB , TGV , T2MV , T2MB , Q2V , Q2B , & ! OUT : - RUNSRF , RUNSUB , APAR , PSN , SAV , SAG , & ! OUT : - FSNO , NEE , GPP , NPP , FVEG , ALBEDO , & ! OUT : - QSNBOT , PONDING , PONDING1, PONDING2, RSSUN , RSSHA , & ! OUT : - ALBSND , ALBSNI , & ! OUT : - BGAP , WGAP , CHV , CHB , EMISSI , & ! OUT : - SHG , SHC , SHB , EVG , EVB , GHV , & ! OUT : - GHB , IRG , IRC , IRB , TR , EVC , & ! OUT : - CHLEAF , CHUC , CHV2 , CHB2 , FPICE , PAHV , & ! OUT : - PAHG , PAHB , PAH , LAISUN , LAISHA , RB , & ! OUT - QINTS , QINTR , QDRIPS , QDRIPR , QTHROS , QTHROR , & ! OUT : - QSNSUB , QSNFRO , QSUBC , QFROC , QFRZC , QMELTC , & ! OUT : - QEVAC , QDEWC , & ! OUT - RAIN , SNOW , ACC_SSOIL, ACC_QINSUR, ACC_QSEVA , & ! OUT - ACC_ETRANI, HCPCT , EFLXB , CANHS , & ! OUT : - ACC_DWATER, ACC_PRCP, ACC_ECAN, ACC_ETRAN, ACC_EDIR & ! INOUT -#ifdef WRF_HYDRO - ,SFCHEADRT, WATBLED & ! IN/OUT : -#endif - ) - -! -------------------------------------------------------------------------------------------------- -! Initial code: Guo-Yue Niu, Oct. 2007 -! -------------------------------------------------------------------------------------------------- - - implicit none -! -------------------------------------------------------------------------------------------------- -! input - type (noahmp_parameters), INTENT(IN) :: parameters - - INTEGER , INTENT(IN) :: ICE !ice (ice = 1) - INTEGER , INTENT(IN) :: IST !surface type 1->soil; 2->lake - INTEGER , INTENT(IN) :: VEGTYP !vegetation type - INTEGER , INTENT(IN) :: CROPTYPE !crop type - INTEGER , INTENT(IN) :: NSNOW !maximum no. of snow layers - INTEGER , INTENT(IN) :: NSOIL !no. of soil layers - INTEGER , INTENT(IN) :: ILOC !grid index - INTEGER , INTENT(IN) :: JLOC !grid index - REAL , INTENT(IN) :: DT !time step [sec] - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: ZSOIL !layer-bottom depth from soil surf (m) - REAL , INTENT(IN) :: Q2 !mixing ratio (kg/kg) lowest model layer - REAL , INTENT(IN) :: SFCTMP !surface air temperature [K] - REAL , INTENT(IN) :: UU !wind speed in eastward dir (m/s) - REAL , INTENT(IN) :: VV !wind speed in northward dir (m/s) - REAL , INTENT(IN) :: SOLDN !downward shortwave radiation (w/m2) - REAL , INTENT(IN) :: LWDN !downward longwave radiation (w/m2) - REAL , INTENT(IN) :: SFCPRS !pressure (pa) - REAL , INTENT(INOUT) :: ZLVL !reference height (m) - REAL , INTENT(IN) :: COSZ !cosine solar zenith angle [0-1] - REAL , INTENT(IN) :: TBOT !bottom condition for soil temp. [K] - REAL , INTENT(IN) :: FOLN !foliage nitrogen (%) [1-saturated] - REAL , INTENT(IN) :: SHDFAC !green vegetation fraction [0.0-1.0] - INTEGER , INTENT(IN) :: YEARLEN!Number of days in the particular year. - REAL , INTENT(IN) :: JULIAN !Julian day of year (floating point) - REAL , INTENT(IN) :: LAT !latitude (radians) - REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: FICEOLD!ice fraction at last timestep - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: SMCEQ !equilibrium soil water content [m3/m3] - REAL , INTENT(IN) :: PRCPCONV ! convective precipitation entering [mm/s] ! MB/AN : v3.7 - REAL , INTENT(IN) :: PRCPNONC ! non-convective precipitation entering [mm/s] ! MB/AN : v3.7 - REAL , INTENT(IN) :: PRCPSHCV ! shallow convective precip entering [mm/s] ! MB/AN : v3.7 - REAL , INTENT(IN) :: PRCPSNOW ! snow entering land model [mm/s] ! MB/AN : v3.7 - REAL , INTENT(IN) :: PRCPGRPL ! graupel entering land model [mm/s] ! MB/AN : v3.7 - REAL , INTENT(IN) :: PRCPHAIL ! hail entering land model [mm/s] ! MB/AN : v3.7 - -!jref:start; in - REAL , INTENT(IN) :: QC !cloud water mixing ratio - REAL , INTENT(INOUT) :: QSFC !mixing ratio at lowest model layer - REAL , INTENT(IN) :: PSFC !pressure at lowest model layer - REAL , INTENT(IN) :: DZ8W !thickness of lowest layer - REAL , INTENT(IN) :: DX - REAL , INTENT(IN) :: SHDMAX !yearly max vegetation fraction -!jref:end - -#ifdef WRF_HYDRO - REAL , INTENT(INOUT) :: sfcheadrt, WATBLED -#endif - -! input/output : need arbitary intial values - REAL , INTENT(INOUT) :: QSNOW !snowfall [mm/s] - REAL , INTENT(INOUT) :: QRAIN !rain at ground surface (mm/s) - REAL , INTENT(INOUT) :: FWET !wetted or snowed fraction of canopy (-) - REAL , INTENT(INOUT) :: SNEQVO !snow mass at last time step (mm) - REAL , INTENT(INOUT) :: EAH !canopy air vapor pressure (pa) - REAL , INTENT(INOUT) :: TAH !canopy air tmeperature (k) - REAL , INTENT(INOUT) :: ALBOLD !snow albedo at last time step (CLASS type) - REAL , INTENT(INOUT) :: CM !momentum drag coefficient - REAL , INTENT(INOUT) :: CH !sensible heat exchange coefficient - REAL , INTENT(INOUT) :: TAUSS !non-dimensional snow age - -! prognostic variables - INTEGER , INTENT(INOUT) :: ISNOW !actual no. of snow layers [-] - REAL , INTENT(INOUT) :: CANLIQ !intercepted liquid water (mm) - REAL , INTENT(INOUT) :: CANICE !intercepted ice mass (mm) - REAL , INTENT(INOUT) :: SNEQV !snow water eqv. [mm] - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SMC !soil moisture (ice + liq.) [m3/m3] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: ZSNSO !layer-bottom depth from snow surf [m] - REAL , INTENT(INOUT) :: SNOWH !snow height [m] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNICE !snow layer ice [mm] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNLIQ !snow layer liquid water [mm] - REAL , INTENT(INOUT) :: TV !vegetation temperature (k) - REAL , INTENT(INOUT) :: TG !ground temperature (k) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow/soil temperature [k] - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SH2O !liquid soil moisture [m3/m3] - REAL , INTENT(INOUT) :: ZWT !depth to water table [m] - REAL , INTENT(INOUT) :: WA !water storage in aquifer [mm] - REAL , INTENT(INOUT) :: WT !water in aquifer&saturated soil [mm] - REAL , INTENT(INOUT) :: WSLAKE !lake water storage (can be neg.) (mm) - REAL, INTENT(INOUT) :: SMCWTD !soil water content between bottom of the soil and water table [m3/m3] - REAL, INTENT(INOUT) :: DEEPRECH !recharge to or from the water table when deep [m] - REAL, INTENT(INOUT) :: RECH !recharge to or from the water table when shallow [m] (diagnostic) - REAL , INTENT(INOUT) :: ACC_SSOIL !ground heat flux (w/m2) [+ to soil] - REAL , INTENT(INOUT) :: ACC_QINSUR !water input on soil surface [m/s] - REAL , INTENT(INOUT) :: ACC_QSEVA !soil surface evap rate [mm/s] - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: ACC_ETRANI !transpiration rate (mm/s) [+] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT( OUT) :: HCPCT !heat capacity [j/m3/k] - REAL , INTENT( OUT) :: EFLXB !energy influx from soil bottom (w/m2) - REAL , INTENT(INOUT) :: ACC_DWATER !accumulated water change for canopy, snow, soil mm/timestep(soil) - REAL , INTENT(INOUT) :: ACC_PRCP !accumulated precip mm/timestep(soil) - REAL , INTENT(INOUT) :: ACC_ECAN !accumulated net canopy evapo mm/timestep(soil) - REAL , INTENT(INOUT) :: ACC_ETRAN !accumulated transpiration mm/timestep(soil) - REAL , INTENT(INOUT) :: ACC_EDIR !accumulated net soil/snow evapo mm/timestep(soil) - - REAL, DIMENSION(1:60) , INTENT(INOUT) :: gecros1d !gecros crop - -! output - REAL , INTENT(OUT) :: Z0WRF !combined z0 sent to coupled model - REAL , INTENT(OUT) :: FSA !total absorbed solar radiation (w/m2) - REAL , INTENT(OUT) :: FSR !total reflected solar radiation (w/m2) - REAL , INTENT(OUT) :: FIRA !total net LW rad (w/m2) [+ to atm] - REAL , INTENT(OUT) :: FSH !total sensible heat (w/m2) [+ to atm] - REAL , INTENT(OUT) :: FCEV !canopy evap heat (w/m2) [+ to atm] - REAL , INTENT(OUT) :: FGEV !ground evap heat (w/m2) [+ to atm] - REAL , INTENT(OUT) :: FCTR !transpiration heat (w/m2) [+ to atm] - REAL , INTENT(OUT) :: SSOIL !ground heat flux (w/m2) [+ to soil] - REAL , INTENT(OUT) :: TRAD !surface radiative temperature (k) - REAL :: TS !surface temperature (k) - REAL , INTENT(OUT) :: ECAN !evaporation of intercepted water (mm/s) - REAL , INTENT(OUT) :: ETRAN !transpiration rate (mm/s) - REAL , INTENT(OUT) :: EDIR !soil surface evaporation rate (mm/s] - REAL , INTENT(OUT) :: RUNSRF !surface runoff [mm] per soil timestep - REAL , INTENT(OUT) :: RUNSUB !baseflow (saturation excess) [mm] per soil timestep - REAL , INTENT(OUT) :: PSN !total photosynthesis (umol co2/m2/s) [+] - REAL , INTENT(OUT) :: APAR !photosyn active energy by canopy (w/m2) - REAL , INTENT(OUT) :: SAV !solar rad absorbed by veg. (w/m2) - REAL , INTENT(OUT) :: SAG !solar rad absorbed by ground (w/m2) - REAL , INTENT(OUT) :: FSNO !snow cover fraction on the ground (-) - REAL , INTENT(OUT) :: FVEG !green vegetation fraction [0.0-1.0] - REAL , INTENT(OUT) :: ALBEDO !surface albedo [-] - REAL :: ERRWAT !water error [kg m{-2}] - REAL , INTENT(OUT) :: QSNBOT !snowmelt out bottom of pack [mm/s] - REAL , INTENT(OUT) :: PONDING!surface ponding [mm] - REAL , INTENT(OUT) :: PONDING1!surface ponding [mm] - REAL , INTENT(OUT) :: PONDING2!surface ponding [mm] - REAL , INTENT(OUT) :: RB ! leaf boundary layer resistance (s/m) - REAL , INTENT(OUT) :: LAISUN ! sunlit leaf area index (m2/m2) - REAL , INTENT(OUT) :: LAISHA ! shaded leaf area index (m2/m2) - -!jref:start; output - REAL , INTENT(OUT) :: T2MV !2-m air temperature over vegetated part [k] - REAL , INTENT(OUT) :: T2MB !2-m air temperature over bare ground part [k] - REAL, INTENT(OUT) :: RSSUN !sunlit leaf stomatal resistance (s/m) - REAL, INTENT(OUT) :: RSSHA !shaded leaf stomatal resistance (s/m) - REAL, INTENT(OUT) :: BGAP - REAL, INTENT(OUT) :: WGAP - REAL, DIMENSION(1:2) , INTENT(OUT) :: ALBSND !snow albedo (direct) - REAL, DIMENSION(1:2) , INTENT(OUT) :: ALBSNI !snow albedo (diffuse) - REAL, INTENT(OUT) :: TGV - REAL, INTENT(OUT) :: TGB - REAL :: Q1 - REAL, INTENT(OUT) :: EMISSI -!jref:end - -! local - INTEGER :: IZ !do-loop index - INTEGER, DIMENSION(-NSNOW+1:NSOIL) :: IMELT !phase change index [1-melt; 2-freeze] - REAL :: CMC !intercepted water (CANICE+CANLIQ) (mm) - REAL :: TAUX !wind stress: e-w (n/m2) - REAL :: TAUY !wind stress: n-s (n/m2) - REAL :: RHOAIR !density air (kg/m3) -! REAL, DIMENSION( 1: 5) :: VOCFLX !voc fluxes [ug C m-2 h-1] - REAL, DIMENSION(-NSNOW+1:NSOIL) :: DZSNSO !snow/soil layer thickness [m] - REAL :: THAIR !potential temperature (k) - REAL :: QAIR !specific humidity (kg/kg) (q2/(1+q2)) - REAL :: EAIR !vapor pressure air (pa) - REAL, DIMENSION( 1: 2) :: SOLAD !incoming direct solar rad (w/m2) - REAL, DIMENSION( 1: 2) :: SOLAI !incoming diffuse solar rad (w/m2) - REAL :: QPRECC !convective precipitation (mm/s) - REAL :: QPRECL !large-scale precipitation (mm/s) - REAL :: IGS !growing season index (0=off, 1=on) - REAL :: ELAI !leaf area index, after burying by snow - REAL :: ESAI !stem area index, after burying by snow - REAL :: BEVAP !soil water evaporation factor (0 - 1) - REAL, DIMENSION( 1:NSOIL) :: BTRANI !Soil water transpiration factor (0 - 1) - REAL :: BTRAN !soil water transpiration factor (0 - 1) - REAL :: QIN !groundwater recharge [mm/s] - REAL :: QDIS !groundwater discharge [mm/s] - REAL, DIMENSION( 1:NSOIL) :: SICE !soil ice content (m3/m3) - REAL, DIMENSION(-NSNOW+1: 0) :: SNICEV !partial volume ice of snow [m3/m3] - REAL, DIMENSION(-NSNOW+1: 0) :: SNLIQV !partial volume liq of snow [m3/m3] - REAL, DIMENSION(-NSNOW+1: 0) :: EPORE !effective porosity [m3/m3] - REAL :: TOTSC !total soil carbon (g/m2) - REAL :: TOTLB !total living carbon (g/m2) - REAL :: T2M !2-meter air temperature (k) - REAL :: QDEW !ground surface dew rate [mm/s] - REAL :: QVAP !ground surface evap. rate [mm/s] - REAL :: LATHEA !latent heat [j/kg] - REAL :: SWDOWN !downward solar [w/m2] - REAL :: QMELT !snowmelt [mm/s] - REAL :: BEG_WB !water storage at begin of a step [mm] - REAL,INTENT(OUT) :: IRC !canopy net LW rad. [w/m2] [+ to atm] - REAL,INTENT(OUT) :: IRG !ground net LW rad. [w/m2] [+ to atm] - REAL,INTENT(OUT) :: SHC !canopy sen. heat [w/m2] [+ to atm] - REAL,INTENT(OUT) :: SHG !ground sen. heat [w/m2] [+ to atm] - REAL,INTENT(OUT) :: EVG !ground evap. heat [w/m2] [+ to atm] - REAL,INTENT(OUT) :: GHV !ground heat flux [w/m2] [+ to soil] - REAL,INTENT(OUT) :: IRB !net longwave rad. [w/m2] [+ to atm] - REAL,INTENT(OUT) :: SHB !sensible heat [w/m2] [+ to atm] - REAL,INTENT(OUT) :: EVB !evaporation heat [w/m2] [+ to atm] - REAL,INTENT(OUT) :: GHB !ground heat flux [w/m2] [+ to soil] - REAL,INTENT(OUT) :: EVC !canopy evap. heat [w/m2] [+ to atm] - REAL,INTENT(OUT) :: TR !transpiration heat [w/m2] [+ to atm] - REAL, INTENT(OUT) :: FPICE !snow fraction in precipitation - REAL, INTENT(OUT) :: PAHV !precipitation advected heat - vegetation net (W/m2) - REAL, INTENT(OUT) :: PAHG !precipitation advected heat - under canopy net (W/m2) - REAL, INTENT(OUT) :: PAHB !precipitation advected heat - bare ground net (W/m2) - REAL, INTENT(OUT) :: PAH !precipitation advected heat - total (W/m2) - REAL, INTENT(OUT) :: QSNSUB - REAL, INTENT(OUT) :: QSNFRO - REAL, INTENT(OUT) :: QSUBC - REAL, INTENT(OUT) :: QFROC - REAL, INTENT(OUT) :: QFRZC - REAL, INTENT(OUT) :: QMELTC - REAL, INTENT(OUT) :: QEVAC - REAL, INTENT(OUT) :: QDEWC - -!jref:start - REAL :: FSRV - REAL :: FSRG - REAL,INTENT(OUT) :: Q2V - REAL,INTENT(OUT) :: Q2B - REAL :: Q2E - REAL :: QFX - REAL,INTENT(OUT) :: CHV !sensible heat exchange coefficient over vegetated fraction - REAL,INTENT(OUT) :: CHB !sensible heat exchange coefficient over bare-ground - REAL,INTENT(OUT) :: CHLEAF !leaf exchange coefficient - REAL,INTENT(OUT) :: CHUC !under canopy exchange coefficient - REAL,INTENT(OUT) :: CHV2 !sensible heat exchange coefficient over vegetated fraction - REAL,INTENT(OUT) :: CHB2 !sensible heat exchange coefficient over bare-ground -!jref:end - -! carbon -! inputs - REAL , INTENT(IN) :: CO2AIR !atmospheric co2 concentration (pa) - REAL , INTENT(IN) :: O2AIR !atmospheric o2 concentration (pa) - -! inputs and outputs : prognostic variables - REAL , INTENT(INOUT) :: LFMASS !leaf mass [g/m2] - REAL , INTENT(INOUT) :: RTMASS !mass of fine roots [g/m2] - REAL , INTENT(INOUT) :: STMASS !stem mass [g/m2] - REAL , INTENT(INOUT) :: WOOD !mass of wood (incl. woody roots) [g/m2] - REAL , INTENT(INOUT) :: STBLCP !stable carbon in deep soil [g/m2] - REAL , INTENT(INOUT) :: FASTCP !short-lived carbon, shallow soil [g/m2] - REAL , INTENT(INOUT) :: LAI !leaf area index [-] - REAL , INTENT(INOUT) :: SAI !stem area index [-] - REAL , INTENT(INOUT) :: GRAIN !grain mass [g/m2] - REAL , INTENT(INOUT) :: GDD !growing degree days - INTEGER , INTENT(INOUT) :: PGS !plant growing stage [-] - -! Tile drainage - REAL , INTENT(INOUT) :: QTLDRN !tile drainage [mm] per soil timestep - REAL , INTENT(IN) :: TDFRACMP !tile drain fraction map - -! irrigation variables - REAL , INTENT(IN) :: IRRFRA ! irrigation fraction - REAL , INTENT(IN) :: SIFRA ! sprinkler irrigation fraction - REAL , INTENT(IN) :: MIFRA ! micro irrigation fraction - REAL , INTENT(IN) :: FIFRA ! flood irrigation fraction - INTEGER , INTENT(INOUT) :: IRCNTSI ! irrigation event number, Sprinkler - INTEGER , INTENT(INOUT) :: IRCNTMI ! irrigation event number, Micro - INTEGER , INTENT(INOUT) :: IRCNTFI ! irrigation event number, Flood - REAL , INTENT(INOUT) :: IRAMTSI ! irrigation water amount [m] to be applied, Sprinkler - REAL , INTENT(INOUT) :: IRAMTMI ! irrigation water amount [m] to be applied, Micro - REAL , INTENT(INOUT) :: IRAMTFI ! irrigation water amount [m] to be applied, Flood - REAL , INTENT(INOUT) :: IRSIRATE ! rate of irrigation by sprinkler [m/timestep] - REAL , INTENT(INOUT) :: IRMIRATE ! rate of irrigation by micro [m/timestep] - REAL , INTENT(INOUT) :: IRFIRATE ! rate of irrigation by micro [m/timestep] - REAL , INTENT(INOUT) :: FIRR ! irrigation:latent heating due to sprinkler evaporation [w/m2] - REAL , INTENT(INOUT) :: EIRR ! evaporation of irrigation water to evaporation,sprinkler [mm/s] - CHARACTER(LEN=256) , INTENT(IN) :: LLANDUSE ! landuse data name (USGS or MODIS_IGBP) - REAL :: IREVPLOS ! loss of irrigation water to evaporation,sprinkler [m/timestep] - REAL :: SIFAC ! sprinkler irrigation fraction (local) - REAL :: MIFAC ! micro irrigation fraction (local) - REAL :: FIFAC ! flood irrigation fraction (local) - -! outputs - REAL , INTENT(OUT) :: NEE !net ecosys exchange (g/m2/s CO2) - REAL , INTENT(OUT) :: GPP !net instantaneous assimilation [g/m2/s C] - REAL , INTENT(OUT) :: NPP !net primary productivity [g/m2/s C] - REAL :: AUTORS !net ecosystem respiration (g/m2/s C) - REAL :: HETERS !organic respiration (g/m2/s C) - REAL :: TROOT !root-zone averaged temperature (k) - REAL :: BDFALL !bulk density of new snow (kg/m3) ! MB/AN: v3.7 - REAL , INTENT(OUT) :: RAIN !rain rate (mm/s) ! MB/AN: v3.7 - REAL , INTENT(OUT) :: SNOW !liquid equivalent snow rate (mm/s) ! MB/AN: v3.7 - REAL :: FP ! MB/AN: v3.7 - REAL :: PRCP ! MB/AN: v3.7 -!more local variables for precip heat MB - REAL , INTENT(OUT) :: QINTR !interception rate for rain (mm/s) - REAL , INTENT(OUT) :: QDRIPR !drip rate for rain (mm/s) - REAL , INTENT(OUT) :: QTHROR !throughfall for rain (mm/s) - REAL , INTENT(OUT) :: QINTS !interception (loading) rate for snowfall (mm/s) - REAL , INTENT(OUT) :: QDRIPS !drip (unloading) rate for intercepted snow (mm/s) - REAL , INTENT(OUT) :: QTHROS !throughfall of snowfall (mm/s) - REAL :: SNOWHIN !snow depth increasing rate (m/s) - REAL :: LATHEAV !latent heat vap./sublimation (j/kg) - REAL :: LATHEAG !latent heat vap./sublimation (j/kg) - LOGICAL :: FROZEN_GROUND ! used to define latent heat pathway - LOGICAL :: FROZEN_CANOPY ! used to define latent heat pathway - LOGICAL :: dveg_active ! flag to run dynamic vegetation - LOGICAL :: crop_active ! flag to run crop model - LOGICAL :: CROPLU ! flag to identify croplands - REAL :: SIFCUK ! Sprinkler fraction for unknown irrigation methods - REAL :: FB - -! add canopy heat storage (C.He added based on GY Niu's communication) - REAL , INTENT(OUT) :: CANHS ! canopy heat storage change w/m2 - - ! INTENT (OUT) variables need to be assigned a value. These normally get assigned values - ! only if DVEG == 2. - nee = 0.0 - npp = 0.0 - gpp = 0.0 - PAHV = 0.0 - PAHG = 0.0 - PAHB = 0.0 - PAH = 0.0 - CROPLU = .FALSE. - CANHS = 0.0 - -! -------------------------------------------------------------------------------------------------- -! re-process atmospheric forcing - - CALL ATM (parameters,SFCPRS ,SFCTMP ,Q2 , & - PRCPCONV, PRCPNONC,PRCPSHCV,PRCPSNOW,PRCPGRPL,PRCPHAIL, & - SOLDN ,COSZ ,THAIR ,QAIR , & - EAIR ,RHOAIR ,QPRECC ,QPRECL ,SOLAD ,SOLAI , & - SWDOWN ,BDFALL ,RAIN ,SNOW ,FP ,FPICE , PRCP ) - -! snow/soil layer thickness (m) - - DO IZ = ISNOW+1, NSOIL - IF(IZ == ISNOW+1) THEN - DZSNSO(IZ) = - ZSNSO(IZ) - ELSE - DZSNSO(IZ) = ZSNSO(IZ-1) - ZSNSO(IZ) - END IF - END DO - -! root-zone temperature - - TROOT = 0. - DO IZ=1,parameters%NROOT - TROOT = TROOT + STC(IZ)*DZSNSO(IZ)/(-ZSOIL(parameters%NROOT)) - ENDDO - -! total water storage for water balance check - - IF(IST == 1) THEN - BEG_WB = CANLIQ + CANICE + SNEQV + WA - DO IZ = 1,NSOIL - BEG_WB = BEG_WB + SMC(IZ) * DZSNSO(IZ) * 1000.0 - END DO - END IF - -! vegetation phenology - - CALL PHENOLOGY (parameters,VEGTYP ,croptype, SNOWH , TV , LAT , YEARLEN , JULIAN , & !in - LAI , SAI , TROOT , ELAI , ESAI ,IGS, PGS) - -!input GVF should be consistent with LAI - IF(DVEG == 1 .or. DVEG == 6 .or. DVEG == 7) THEN - FVEG = SHDFAC - IF(FVEG <= 0.05) FVEG = 0.05 - ELSE IF (DVEG == 2 .or. DVEG == 3 .or. DVEG == 8) THEN - FVEG = 1.-EXP(-0.52*(LAI+SAI)) - IF(FVEG <= 0.05) FVEG = 0.05 - ELSE IF (DVEG == 4 .or. DVEG == 5 .or. DVEG == 9) THEN - FVEG = SHDMAX - IF(FVEG <= 0.05) FVEG = 0.05 - ELSE - WRITE(*,*) "-------- FATAL CALLED IN SFLX -----------" - CALL wrf_error_fatal("Namelist parameter DVEG unknown") - ENDIF - IF(OPT_CROP > 0 .and. CROPTYPE > 0) THEN - FVEG = SHDMAX - IF(FVEG <= 0.05) FVEG = 0.05 - ENDIF - IF(parameters%urban_flag .OR. VEGTYP == parameters%ISBARREN) FVEG = 0.0 - IF(ELAI+ESAI == 0.0) FVEG = 0.0 - -! Calling dynamic irrigation scheme-prasanth - IF ( TRIM(LLANDUSE) == "USGS" ) THEN - IF(VEGTYP .GE. 3 .AND. VEGTYP .LE. 6) CROPLU = .TRUE. - ELSE IF ( TRIM(LLANDUSE) == "MODIFIED_IGBP_MODIS_NOAH") THEN - IF(VEGTYP == 12 .OR. VEGTYP == 14) CROPLU = .TRUE. - END IF - - SIFAC = SIFRA - MIFAC = MIFRA - FIFAC = FIFRA - -! If OPT_IRRM = 0 and if methods are unknown for certain area, then use sprinkler irrigation method - IF((OPT_IRRM .EQ. 0) .AND. (SIFAC .EQ. 0.0) .AND. (MIFAC .EQ. 0.0) .AND. (FIFAC .EQ. 0.0) & - .AND. (IRRFRA .GE. parameters%IRR_FRAC)) THEN - SIFAC = 1.0 - END IF - -! choose method based on user namelist choice - IF(OPT_IRRM .EQ. 1) THEN - SIFAC = 1.0 - MIFAC = 0.0 - FIFAC = 0.0 - ELSE IF(OPT_IRRM .EQ. 2) THEN - SIFAC = 0.0 - MIFAC = 1.0 - FIFAC = 0.0 - ELSE IF(OPT_IRRM .EQ. 3) THEN - SIFAC = 0.0 - MIFAC = 0.0 - FIFAC = 1.0 - END IF - -! trigger irrigation only at soil timestep to be consistent for solving soil water - if (calculate_soil) then - ! Call triggering function - IF((CROPLU .EQV. .TRUE.) .AND. (IRRFRA .GE. parameters%IRR_FRAC) .AND. & - (RAIN .LT. (parameters%IR_RAIN/3600.0)) .AND. ((IRAMTSI+IRAMTMI+IRAMTFI) .EQ. 0.0) )THEN - CALL TRIGGER_IRRIGATION(parameters,NSOIL,ZSOIL,SH2O,FVEG,JULIAN,IRRFRA,LAI, & !in - SIFAC,MIFAC,FIFAC, & !in - IRCNTSI,IRCNTMI,IRCNTFI, & !inout - IRAMTSI,IRAMTMI,IRAMTFI) !inout - END IF - ! set irrigation off if parameters%IR_RAIN mm/h for this time step and irr triggered last time step - IF((RAIN .GE. (parameters%IR_RAIN/3600.0)) .OR. (IRRFRA .LT. parameters%IRR_FRAC))THEN - IRAMTSI = 0.0 - IRAMTMI = 0.0 - IRAMTFI = 0.0 - END IF - endif - - ! call sprinkler irrigation before CANWAT/PRECIP_HEAT to have canopy interception - IF((CROPLU .EQV. .TRUE.) .AND. (IRAMTSI .GT. 0.0)) THEN - CALL SPRINKLER_IRRIGATION(parameters,NSOIL,DT,SH2O,SMC,SICE,& !in - SFCTMP,UU,VV,EAIR,SIFAC, & !in - IRAMTSI,IREVPLOS,IRSIRATE) !inout - RAIN = RAIN + (IRSIRATE*1000.0/DT) ![mm/s] - ! cooling and humidification due to sprinkler evaporation, per m^2 calculation - FIRR = IREVPLOS*1000.0*HVAP/DT ! heat used for evaporation (W/m2) - EIRR = IREVPLOS*1000.0/DT ! sprinkler evaporation (mm/s) - END IF -! call for micro irrigation and flood irrigation are implemented in WATER subroutine -! end irrigation call-prasanth - - CALL PRECIP_HEAT(parameters,ILOC ,JLOC ,VEGTYP ,DT ,UU ,VV , & !in - ELAI ,ESAI ,FVEG ,IST , & !in - BDFALL ,RAIN ,SNOW ,FP , & !in - CANLIQ ,CANICE ,TV ,SFCTMP ,TG , & !in - QINTR ,QDRIPR ,QTHROR ,QINTS ,QDRIPS ,QTHROS , & !out - PAHV ,PAHG ,PAHB ,QRAIN ,QSNOW ,SNOWHIN, & !out - FWET ,CMC ) !out - -! compute energy budget (momentum & energy fluxes and phase changes) - - CALL ENERGY (parameters,ICE ,VEGTYP ,IST ,NSNOW ,NSOIL , & !in - ISNOW ,DT ,RHOAIR ,SFCPRS ,QAIR , & !in - SFCTMP ,THAIR ,LWDN ,UU ,VV ,ZLVL , & !in - CO2AIR ,O2AIR ,SOLAD ,SOLAI ,COSZ ,IGS , & !in - EAIR ,TBOT ,ZSNSO ,ZSOIL , & !in - ELAI ,ESAI ,FWET ,FOLN , & !in - FVEG ,PAHV ,PAHG ,PAHB , & !in - QSNOW ,DZSNSO ,LAT ,CANLIQ ,CANICE ,iloc, jloc ,& !in - Z0WRF , & !out - IMELT ,SNICEV ,SNLIQV ,EPORE ,T2M ,FSNO , & !out - SAV ,SAG ,QMELT ,FSA ,FSR ,TAUX , & !out - TAUY ,FIRA ,FSH ,FCEV ,FGEV ,FCTR , & !out - TRAD ,PSN ,APAR ,SSOIL ,BTRANI ,BTRAN , & !out - PONDING,TS ,LATHEAV , LATHEAG , frozen_canopy,frozen_ground, & !out - TV ,TG ,STC ,SNOWH ,EAH ,TAH , & !inout - SNEQVO ,SNEQV ,SH2O ,SMC ,SNICE ,SNLIQ , & !inout - ALBOLD ,CM ,CH ,DX ,DZ8W ,Q2 , & !inout - TAUSS ,LAISUN ,LAISHA ,RB , & !inout -!jref:start - QC ,QSFC ,PSFC , & !in - T2MV ,T2MB ,FSRV , & !out - FSRG ,RSSUN ,RSSHA ,ALBSND ,ALBSNI, BGAP ,WGAP,TGV,TGB,& !out - Q1 ,Q2V ,Q2B ,Q2E ,CHV ,CHB , & !out - EMISSI ,PAH ,CANHS , & !out - SHG,SHC,SHB,EVG,EVB,GHV,GHB,IRG,IRC,IRB,TR,EVC,CHLEAF,CHUC,CHV2,CHB2,& - EFLXB, HCPCT, ACC_SSOIL, & - JULIAN, SWDOWN, PRCP, FB, GECROS1D ) -!jref:end - - SICE(:) = MAX(0.0, SMC(:) - SH2O(:)) - SNEQVO = SNEQV - - QVAP = MAX( FGEV/LATHEAG, 0.0) ! positive part of fgev; Barlage change to ground v3.6 - QDEW = ABS( MIN(FGEV/LATHEAG, 0.0)) ! negative part of fgev - EDIR = QVAP - QDEW - -! compute water budgets (water storages, ET components, and runoff) - - CALL WATER (parameters,VEGTYP ,NSNOW ,NSOIL ,IMELT ,DT ,UU , & !in - VV ,FCEV ,FCTR ,QPRECC ,QPRECL ,ELAI , & !in - ESAI ,SFCTMP ,QVAP ,QDEW ,ZSOIL ,BTRANI , & !in - IRRFRA ,MIFAC ,FIFAC ,CROPLU , & !in - FICEOLD,PONDING,TG ,IST ,FVEG ,iloc,jloc , SMCEQ , & !in - BDFALL ,FP ,RAIN ,SNOW , & !in MB/AN: v3.7 - QSNOW ,QRAIN ,SNOWHIN,LATHEAV,LATHEAG,frozen_canopy,frozen_ground, & !in MB - DX ,TDFRACMP, & !in PVK tile drainage - ISNOW ,CANLIQ ,CANICE ,TV ,SNOWH ,SNEQV , & !inout - SNICE ,SNLIQ ,STC ,ZSNSO ,SH2O ,SMC , & !inout - SICE ,ZWT ,WA ,WT ,DZSNSO ,WSLAKE , & !inout - SMCWTD ,DEEPRECH,RECH , & !inout - IRAMTFI,IRAMTMI ,IRFIRATE ,IRMIRATE, & !inout - CMC ,ECAN ,ETRAN ,FWET ,RUNSRF ,RUNSUB , & !out - QIN ,QDIS ,PONDING1 ,PONDING2, & - QSNBOT ,QTLDRN , & - QSNSUB ,QSNFRO ,QSUBC ,QFROC ,QFRZC ,QMELTC , & - QEVAC ,QDEWC ,ACC_QINSUR ,ACC_QSEVA,ACC_ETRANI & -#ifdef WRF_HYDRO - ,sfcheadrt,WATBLED & -#endif - ) !out - - -! compute carbon budgets (carbon storages and co2 & bvoc fluxes) - - crop_active = .false. - dveg_active = .false. - IF (DVEG == 2 .OR. DVEG == 5 .OR. DVEG == 6) dveg_active = .true. - IF (OPT_CROP > 0 .and. CROPTYPE > 0) THEN - crop_active = .true. - dveg_active = .false. - ENDIF - - IF (dveg_active) THEN - CALL CARBON (parameters,NSNOW ,NSOIL ,VEGTYP ,DT ,ZSOIL , & !in - DZSNSO ,STC ,SMC ,TV ,TG ,PSN , & !in - FOLN ,BTRAN ,APAR ,FVEG ,IGS , & !in - TROOT ,IST ,LAT ,iloc ,jloc , & !in - LFMASS ,RTMASS ,STMASS ,WOOD ,STBLCP ,FASTCP , & !inout - GPP ,NPP ,NEE ,AUTORS ,HETERS ,TOTSC , & !out - TOTLB ,LAI ,SAI ) !out - END IF - - IF (OPT_CROP == 1 .and. crop_active) THEN - CALL CARBON_CROP (parameters,NSNOW ,NSOIL ,VEGTYP ,DT ,ZSOIL ,JULIAN , & !in - DZSNSO ,STC ,SMC ,TV ,PSN ,FOLN ,BTRAN , & !in - SOLDN ,T2M , & !in - LFMASS ,RTMASS ,STMASS ,WOOD ,STBLCP ,FASTCP ,GRAIN , & !inout - LAI ,SAI ,GDD , & !inout - GPP ,NPP ,NEE ,AUTORS ,HETERS ,TOTSC ,TOTLB, PGS ) !out - END IF - -! before waterbalance check add irrigation water to precipitation - IF((CROPLU .EQV. .TRUE.) .AND. (IRRFRA .GE. parameters%IRR_FRAC))THEN - PRCP = PRCP + (IRSIRATE*1000.0/DT) ! irrigation - FSH = FSH - FIRR ! (W/m2) - END IF - -! water and energy balance check - - CALL ERROR (parameters,SWDOWN ,FSA ,FSR ,FIRA ,FSH ,FCEV , & !in - FGEV ,FCTR ,SSOIL ,BEG_WB ,CANLIQ ,CANICE , & !in - SNEQV ,WA ,SMC ,DZSNSO ,PRCP ,ECAN , & !in - ETRAN ,EDIR ,RUNSRF ,RUNSUB ,DT ,NSOIL , & !in - QTLDRN , & !in - NSNOW ,IST ,ERRWAT ,ILOC ,JLOC ,FVEG , & - SAV ,SAG ,FSRV ,FSRG ,ZWT ,PAH , & - PAHV ,PAHG ,PAHB ,FIRR ,CANHS , & - IRMIRATE, IRFIRATE, ACC_DWATER, ACC_PRCP, ACC_ECAN, & - ACC_ETRAN, ACC_EDIR ) !in ( Except ERRWAT, which is out ) - -! urban - jref - QFX = ETRAN + ECAN + EDIR - IF ( parameters%urban_flag ) THEN - QSFC = QFX/(RHOAIR*CH) + QAIR - Q2B = QSFC - END IF - - IF(SNOWH <= 1.E-6 .OR. SNEQV <= 1.E-6) THEN - SNOWH = 0.0 - SNEQV = 0.0 - END IF - - IF(SWDOWN.NE.0.0) THEN - ALBEDO = FSR / SWDOWN - ELSE - ALBEDO = -999.9 - END IF - - - END SUBROUTINE NOAHMP_SFLX - -!== begin atm ====================================================================================== - - SUBROUTINE ATM (parameters,SFCPRS ,SFCTMP ,Q2 , & - PRCPCONV,PRCPNONC ,PRCPSHCV,PRCPSNOW,PRCPGRPL,PRCPHAIL , & - SOLDN ,COSZ ,THAIR ,QAIR , & - EAIR ,RHOAIR ,QPRECC ,QPRECL ,SOLAD , SOLAI , & - SWDOWN ,BDFALL ,RAIN ,SNOW ,FP , FPICE ,PRCP ) -! -------------------------------------------------------------------------------------------------- -! re-process atmospheric forcing -! ---------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------------- -! inputs - - type (noahmp_parameters) , INTENT(IN) :: parameters - REAL , INTENT(IN) :: SFCPRS !pressure (pa) - REAL , INTENT(IN) :: SFCTMP !surface air temperature [k] - REAL , INTENT(IN) :: Q2 !mixing ratio (kg/kg) - REAL , INTENT(IN) :: PRCPCONV ! convective precipitation entering [mm/s] ! MB/AN : v3.7 - REAL , INTENT(IN) :: PRCPNONC ! non-convective precipitation entering [mm/s] ! MB/AN : v3.7 - REAL , INTENT(IN) :: PRCPSHCV ! shallow convective precip entering [mm/s] ! MB/AN : v3.7 - REAL , INTENT(IN) :: PRCPSNOW ! snow entering land model [mm/s] ! MB/AN : v3.7 - REAL , INTENT(IN) :: PRCPGRPL ! graupel entering land model [mm/s] ! MB/AN : v3.7 - REAL , INTENT(IN) :: PRCPHAIL ! hail entering land model [mm/s] ! MB/AN : v3.7 - REAL , INTENT(IN) :: SOLDN !downward shortwave radiation (w/m2) - REAL , INTENT(IN) :: COSZ !cosine solar zenith angle [0-1] - -! outputs - - REAL , INTENT(OUT) :: THAIR !potential temperature (k) - REAL , INTENT(OUT) :: QAIR !specific humidity (kg/kg) (q2/(1+q2)) - REAL , INTENT(OUT) :: EAIR !vapor pressure air (pa) - REAL , INTENT(OUT) :: RHOAIR !density air (kg/m3) - REAL , INTENT(OUT) :: QPRECC !convective precipitation (mm/s) - REAL , INTENT(OUT) :: QPRECL !large-scale precipitation (mm/s) - REAL, DIMENSION( 1: 2), INTENT(OUT) :: SOLAD !incoming direct solar radiation (w/m2) - REAL, DIMENSION( 1: 2), INTENT(OUT) :: SOLAI !incoming diffuse solar radiation (w/m2) - REAL , INTENT(OUT) :: SWDOWN !downward solar filtered by sun angle [w/m2] - REAL , INTENT(OUT) :: BDFALL !!bulk density of snowfall (kg/m3) AJN - REAL , INTENT(OUT) :: RAIN !rainfall (mm/s) AJN - REAL , INTENT(OUT) :: SNOW !liquid equivalent snowfall (mm/s) AJN - REAL , INTENT(OUT) :: FP !fraction of area receiving precipitation AJN - REAL , INTENT(OUT) :: FPICE !fraction of ice AJN - REAL , INTENT(OUT) :: PRCP !total precipitation [mm/s] ! MB/AN : v3.7 - -!locals - - REAL :: PAIR !atm bottom level pressure (pa) - REAL :: PRCP_FROZEN !total frozen precipitation [mm/s] ! MB/AN : v3.7 - REAL, PARAMETER :: RHO_GRPL = 500.0 ! graupel bulk density [kg/m3] ! MB/AN : v3.7 - REAL, PARAMETER :: RHO_HAIL = 917.0 ! hail bulk density [kg/m3] ! MB/AN : v3.7 -! wet-bulb scheme Wang et al., 2019 GRL, C.He, 12/18/2020 - REAL :: ESATAIR ! saturated vapor pressure of air - REAL :: LATHEA ! latent heat of vapor/sublimation - REAL :: GAMMA_b ! (cp*p)/(eps*L) - REAL :: TDC ! air temperature [C] - REAL :: TWET ! wetbulb temperature - INTEGER :: ITER - INTEGER, PARAMETER :: NITER = 10 ! iterations for Twet calculation - -! -------------------------------------------------------------------------------------------------- - -!jref: seems like PAIR should be P1000mb?? - PAIR = SFCPRS ! atm bottom level pressure (pa) - THAIR = SFCTMP * (SFCPRS/PAIR)**(RAIR/CPAIR) - - QAIR = Q2 ! In WRF, driver converts to specific humidity - - EAIR = QAIR*SFCPRS / (0.622+0.378*QAIR) - RHOAIR = (SFCPRS-0.378*EAIR) / (RAIR*SFCTMP) - - IF(COSZ <= 0.0) THEN - SWDOWN = 0.0 - ELSE - SWDOWN = SOLDN - END IF - - SOLAD(1) = SWDOWN*0.7*0.5 ! direct vis - SOLAD(2) = SWDOWN*0.7*0.5 ! direct nir - SOLAI(1) = SWDOWN*0.3*0.5 ! diffuse vis - SOLAI(2) = SWDOWN*0.3*0.5 ! diffuse nir - - PRCP = PRCPCONV + PRCPNONC + PRCPSHCV - - IF(OPT_SNF == 4) THEN - QPRECC = PRCPCONV + PRCPSHCV - QPRECL = PRCPNONC - ELSE - QPRECC = 0.10 * PRCP ! should be from the atmospheric model - QPRECL = 0.90 * PRCP ! should be from the atmospheric model - END IF - -! fractional area that receives precipitation (see, Niu et al. 2005) - - FP = 0.0 - IF(QPRECC + QPRECL > 0.0) & - FP = (QPRECC + QPRECL) / (10.0*QPRECC + QPRECL) - -! partition precipitation into rain and snow. Moved from CANWAT MB/AN: v3.7 - -! Jordan (1991) - - IF(OPT_SNF == 1) THEN - IF(SFCTMP > TFRZ+2.5)THEN - FPICE = 0.0 - ELSE - IF(SFCTMP <= TFRZ+0.5)THEN - FPICE = 1.0 - ELSE IF(SFCTMP <= TFRZ+2.0)THEN - FPICE = 1.0-(-54.632 + 0.2*SFCTMP) - ELSE - FPICE = 0.6 - ENDIF - ENDIF - ENDIF - - IF(OPT_SNF == 2) THEN - IF(SFCTMP >= TFRZ+2.2) THEN - FPICE = 0.0 - ELSE - FPICE = 1.0 - ENDIF - ENDIF - - IF(OPT_SNF == 3) THEN - IF(SFCTMP >= TFRZ) THEN - FPICE = 0.0 - ELSE - FPICE = 1.0 - ENDIF - ENDIF - -! Hedstrom NR and JW Pomeroy (1998), Hydrol. Processes, 12, 1611-1625 -! fresh snow density - - BDFALL = MIN(120.0,67.92+51.25*EXP((SFCTMP-TFRZ)/2.59)) !MB/AN: change to MIN - IF(OPT_SNF == 4) THEN - PRCP_FROZEN = PRCPSNOW + PRCPGRPL + PRCPHAIL - IF(PRCPNONC > 0.0 .and. PRCP_FROZEN > 0.0) THEN - FPICE = MIN(1.0,PRCP_FROZEN/PRCPNONC) - FPICE = MAX(0.0,FPICE) - BDFALL = BDFALL*(PRCPSNOW/PRCP_FROZEN) + RHO_GRPL*(PRCPGRPL/PRCP_FROZEN) + & - RHO_HAIL*(PRCPHAIL/PRCP_FROZEN) - ELSE - FPICE = 0.0 - ENDIF - - ENDIF - -! wet-bulb scheme (Wang et al., 2019 GRL), C.He, 12/18/2020 - IF(OPT_SNF == 5) THEN - TDC = MIN( 50.0, MAX(-50.0,(SFCTMP-TFRZ)) ) !Kelvin to degree Celsius with limit -50 to +50 - IF (SFCTMP > TFRZ) THEN - LATHEA = HVAP - ELSE - LATHEA = HSUB - END IF - GAMMA_b = CPAIR*SFCPRS/(0.622*LATHEA) - TWET = TDC - 5.0 ! first guess wetbulb temperature - DO ITER = 1, NITER - ESATAIR = 610.8 * EXP((17.27*TWET)/(237.3+TWET)) - TWET = TWET - (ESATAIR-EAIR)/ GAMMA_b ! Wang et al., 2019 GRL Eq.2 - END DO - FPICE = 1.0/(1.0+6.99E-5*exp(2.0*(TWET+3.97))) ! Wang et al., 2019 GRL Eq. 1 - ENDIF - - RAIN = PRCP * (1.0-FPICE) - SNOW = PRCP * FPICE - - - END SUBROUTINE ATM - -!== begin phenology ================================================================================ - - SUBROUTINE PHENOLOGY (parameters,VEGTYP ,croptype, SNOWH , TV , LAT , YEARLEN , JULIAN , & !in - LAI , SAI , TROOT , ELAI , ESAI , IGS, PGS) - -! -------------------------------------------------------------------------------------------------- -! vegetation phenology considering vegeation canopy being buries by snow and evolution in time -! -------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------------- -! inputs - type (noahmp_parameters), intent(in) :: parameters - INTEGER , INTENT(IN ) :: VEGTYP !vegetation type - INTEGER , INTENT(IN ) :: CROPTYPE !vegetation type - REAL , INTENT(IN ) :: SNOWH !snow height [m] - REAL , INTENT(IN ) :: TV !vegetation temperature (k) - REAL , INTENT(IN ) :: LAT !latitude (radians) - INTEGER , INTENT(IN ) :: YEARLEN!Number of days in the particular year - REAL , INTENT(IN ) :: JULIAN !Julian day of year (fractional) ( 0 <= JULIAN < YEARLEN ) - real , INTENT(IN ) :: TROOT !root-zone averaged temperature (k) - REAL , INTENT(INOUT) :: LAI !LAI, unadjusted for burying by snow - REAL , INTENT(INOUT) :: SAI !SAI, unadjusted for burying by snow - -! outputs - REAL , INTENT(OUT ) :: ELAI !leaf area index, after burying by snow - REAL , INTENT(OUT ) :: ESAI !stem area index, after burying by snow - REAL , INTENT(OUT ) :: IGS !growing season index (0=off, 1=on) - INTEGER , INTENT(IN ) :: PGS !plant growing stage - -! locals - - REAL :: DB !thickness of canopy buried by snow (m) - REAL :: FB !fraction of canopy buried by snow - REAL :: SNOWHC !critical snow depth at which short vege - !is fully covered by snow - - INTEGER :: K !index - INTEGER :: IT1,IT2 !interpolation months - REAL :: DAY !current day of year ( 0 <= DAY < YEARLEN ) - REAL :: WT1,WT2 !interpolation weights - REAL :: T !current month (1.00, ..., 12.00) -! -------------------------------------------------------------------------------------------------- - -IF (CROPTYPE == 0) THEN - - IF ( DVEG == 1 .or. DVEG == 3 .or. DVEG == 4 ) THEN - - IF (LAT >= 0.0) THEN - ! Northern Hemisphere - DAY = JULIAN - ELSE - ! Southern Hemisphere. DAY is shifted by 1/2 year. - DAY = MOD ( JULIAN + ( 0.5 * YEARLEN ) , REAL(YEARLEN) ) - ENDIF - - T = 12.0 * DAY / REAL(YEARLEN) - IT1 = T + 0.5 - IT2 = IT1 + 1 - WT1 = (IT1+0.5) - T - WT2 = 1.0-WT1 - IF (IT1 .LT. 1) IT1 = 12 - IF (IT2 .GT. 12) IT2 = 1 - - LAI = WT1*parameters%LAIM(IT1) + WT2*parameters%LAIM(IT2) - SAI = WT1*parameters%SAIM(IT1) + WT2*parameters%SAIM(IT2) - ENDIF - - IF(DVEG == 7 .or. DVEG == 8 .or. DVEG == 9) THEN - SAI = MAX(0.05,0.1 * LAI) ! when reading LAI, set SAI to 10% LAI, but not below 0.05 MB: v3.8 - IF (LAI < 0.05) SAI = 0.0 ! if LAI below minimum, make sure SAI = 0 - ENDIF - - IF (SAI < 0.05) SAI = 0.0 ! MB: SAI CHECK, change to 0.05 v3.6 - IF (LAI < 0.05 .OR. SAI == 0.0) LAI = 0.0 ! MB: LAI CHECK - - IF ( ( VEGTYP == parameters%iswater ) .OR. ( VEGTYP == parameters%ISBARREN ) .OR. & - ( VEGTYP == parameters%ISICE ) .or. ( parameters%urban_flag ) ) THEN - LAI = 0.0 - SAI = 0.0 - ENDIF - -ENDIF ! CROPTYPE == 0 - -!buried by snow - - DB = MIN( MAX(SNOWH - parameters%HVB,0.0), parameters%HVT-parameters%HVB ) - FB = DB / MAX(1.E-06,parameters%HVT-parameters%HVB) - - IF(parameters%HVT> 0.0 .AND. parameters%HVT <= 1.0) THEN !MB: change to 1.0 and 0.2 to reflect - SNOWHC = parameters%HVT*EXP(-SNOWH/0.2) ! changes to HVT in MPTABLE - FB = MIN(SNOWH,SNOWHC)/SNOWHC - ENDIF - - ELAI = LAI*(1.0-FB) - ESAI = SAI*(1.0-FB) - IF (ESAI < 0.05 .and. CROPTYPE == 0) ESAI = 0.0 ! MB: ESAI CHECK, change to 0.05 v3.6 - IF ((ELAI < 0.05 .OR. ESAI == 0.0) .and. CROPTYPE == 0) ELAI = 0.0 ! MB: LAI CHECK - -! set growing season flag - - IF ((TV .GT. parameters%TMIN .and. CROPTYPE == 0).or.(PGS > 2 .and. PGS < 7 .and. CROPTYPE > 0)) THEN - IGS = 1. - ELSE - IGS = 0. - ENDIF - - END SUBROUTINE PHENOLOGY - -!== begin precip_heat ============================================================================== - - SUBROUTINE PRECIP_HEAT (parameters,ILOC ,JLOC ,VEGTYP ,DT ,UU ,VV , & !in - ELAI ,ESAI ,FVEG ,IST , & !in - BDFALL ,RAIN ,SNOW ,FP , & !in - CANLIQ ,CANICE ,TV ,SFCTMP ,TG , & !in - QINTR ,QDRIPR ,QTHROR ,QINTS ,QDRIPS ,QTHROS , & !out - PAHV ,PAHG ,PAHB ,QRAIN ,QSNOW ,SNOWHIN, & !out - FWET ,CMC ) !out - -! ------------------------ code history ------------------------------ -! Michael Barlage: Oct 2013 - split CANWATER to calculate precip movement for -! tracking of advected heat -! -------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! ------------------------ input/output variables -------------------- -! input - type (noahmp_parameters), intent(in) :: parameters - INTEGER,INTENT(IN) :: ILOC !grid index - INTEGER,INTENT(IN) :: JLOC !grid index - INTEGER,INTENT(IN) :: VEGTYP !vegetation type - INTEGER,INTENT(IN) :: IST !surface type 1-soil; 2-lake - REAL, INTENT(IN) :: DT !main time step (s) - REAL, INTENT(IN) :: UU !u-direction wind speed [m/s] - REAL, INTENT(IN) :: VV !v-direction wind speed [m/s] - REAL, INTENT(IN) :: ELAI !leaf area index, after burying by snow - REAL, INTENT(IN) :: ESAI !stem area index, after burying by snow - REAL, INTENT(IN) :: FVEG !greeness vegetation fraction (-) - REAL, INTENT(IN) :: BDFALL !bulk density of snowfall (kg/m3) - REAL, INTENT(IN) :: RAIN !rainfall (mm/s) - REAL, INTENT(IN) :: SNOW !snowfall (mm/s) - REAL, INTENT(IN) :: FP !fraction of the gridcell that receives precipitation - REAL, INTENT(IN) :: TV !vegetation temperature (k) - REAL, INTENT(IN) :: SFCTMP !model-level temperature (k) - REAL, INTENT(IN) :: TG !ground temperature (k) - -! input & output - REAL, INTENT(INOUT) :: CANLIQ !intercepted liquid water (mm) - REAL, INTENT(INOUT) :: CANICE !intercepted ice mass (mm) - -! output - REAL, INTENT(OUT) :: QINTR !interception rate for rain (mm/s) - REAL, INTENT(OUT) :: QDRIPR !drip rate for rain (mm/s) - REAL, INTENT(OUT) :: QTHROR !throughfall for rain (mm/s) - REAL, INTENT(OUT) :: QINTS !interception (loading) rate for snowfall (mm/s) - REAL, INTENT(OUT) :: QDRIPS !drip (unloading) rate for intercepted snow (mm/s) - REAL, INTENT(OUT) :: QTHROS !throughfall of snowfall (mm/s) - REAL, INTENT(OUT) :: PAHV !precipitation advected heat - vegetation net (W/m2) - REAL, INTENT(OUT) :: PAHG !precipitation advected heat - under canopy net (W/m2) - REAL, INTENT(OUT) :: PAHB !precipitation advected heat - bare ground net (W/m2) - REAL, INTENT(OUT) :: QRAIN !rain at ground srf (mm/s) [+] - REAL, INTENT(OUT) :: QSNOW !snow at ground srf (mm/s) [+] - REAL, INTENT(OUT) :: SNOWHIN !snow depth increasing rate (m/s) - REAL, INTENT(OUT) :: FWET !wetted or snowed fraction of the canopy (-) - REAL, INTENT(OUT) :: CMC !intercepted water (mm) -! -------------------------------------------------------------------- - -! ------------------------ local variables --------------------------- - REAL :: MAXSNO !canopy capacity for snow interception (mm) - REAL :: MAXLIQ !canopy capacity for rain interception (mm) - REAL :: FT !temperature factor for unloading rate - REAL :: FV !wind factor for unloading rate - REAL :: PAH_AC !precipitation advected heat - air to canopy (W/m2) - REAL :: PAH_CG !precipitation advected heat - canopy to ground (W/m2) - REAL :: PAH_AG !precipitation advected heat - air to ground (W/m2) - REAL :: ICEDRIP !canice unloading -! -------------------------------------------------------------------- -! initialization - - QINTR = 0.0 - QDRIPR = 0.0 - QTHROR = 0.0 - QINTR = 0.0 - QINTS = 0.0 - QDRIPS = 0.0 - QTHROS = 0.0 - PAH_AC = 0.0 - PAH_CG = 0.0 - PAH_AG = 0.0 - PAHV = 0.0 - PAHG = 0.0 - PAHB = 0.0 - QRAIN = 0.0 - QSNOW = 0.0 - SNOWHIN = 0.0 - ICEDRIP = 0.0 - -! --------------------------- liquid water ------------------------------ -! maximum canopy water - - MAXLIQ = parameters%CH2OP * (ELAI+ ESAI) - -! average interception and throughfall - - IF((ELAI+ ESAI) .GT. 0.0) THEN - QINTR = FVEG * RAIN * FP ! interception capability - QINTR = MIN(QINTR, (MAXLIQ - CANLIQ)/DT * (1.0-EXP(-RAIN*DT/MAXLIQ)) ) - QINTR = MAX(QINTR, 0.0) - QDRIPR = FVEG * RAIN - QINTR - QTHROR = (1.0-FVEG) * RAIN - CANLIQ=MAX(0.0,CANLIQ+QINTR*DT) - ELSE - QINTR = 0.0 - QDRIPR = 0.0 - QTHROR = RAIN - IF(CANLIQ > 0.0) THEN ! FOR CASE OF CANOPY GETTING BURIED - QDRIPR = QDRIPR + CANLIQ/DT - CANLIQ = 0.0 - END IF - END IF - -! heat transported by liquid water - - PAH_AC = FVEG * RAIN * (CWAT/1000.0) * (SFCTMP - TV) - PAH_CG = QDRIPR * (CWAT/1000.0) * (TV - TG) - PAH_AG = QTHROR * (CWAT/1000.0) * (SFCTMP - TG) - -! --------------------------- canopy ice ------------------------------ -! for canopy ice - - MAXSNO = 6.6*(0.27+46.0/BDFALL) * (ELAI+ ESAI) - - IF((ELAI+ ESAI) .GT. 0.0) THEN - QINTS = FVEG * SNOW * FP - QINTS = MIN(QINTS, (MAXSNO - CANICE)/DT * (1.0-EXP(-SNOW*DT/MAXSNO)) ) - QINTS = MAX(QINTS, 0.0) - FT = MAX(0.0,(TV - 270.15) / 1.87E5) - FV = SQRT(UU*UU + VV*VV) / 1.56E5 - ! MB: changed below to reflect the rain assumption that all precip gets intercepted - ICEDRIP = MAX(0.0,CANICE) * (FV+FT) !MB: removed /DT - ICEDRIP = MIN(CANICE/DT + QINTS, ICEDRIP) !C.He: add constraint to keep water balance - QDRIPS = (FVEG * SNOW - QINTS) + ICEDRIP - QTHROS = (1.0-FVEG) * SNOW - CANICE= MAX(0.0,CANICE + (QINTS - ICEDRIP)*DT) - ELSE - QINTS = 0.0 - QDRIPS = 0.0 - QTHROS = SNOW - IF(CANICE > 0.0) THEN ! FOR CASE OF CANOPY GETTING BURIED - QDRIPS = QDRIPS + CANICE/DT - CANICE = 0.0 - END IF - ENDIF - -! wetted fraction of canopy - - IF(CANICE .GT. 0.0) THEN - FWET = MAX(0.0,CANICE) / MAX(MAXSNO,1.E-06) - ELSE - FWET = MAX(0.0,CANLIQ) / MAX(MAXLIQ,1.E-06) - ENDIF - FWET = MIN(FWET, 1.0) ** 0.667 - -! total canopy water - - CMC = CANLIQ + CANICE - -! heat transported by snow/ice - - PAH_AC = PAH_AC + FVEG * SNOW * (CICE/1000.0) * (SFCTMP - TV) - PAH_CG = PAH_CG + QDRIPS * (CICE/1000.0) * (TV - TG) - PAH_AG = PAH_AG + QTHROS * (CICE/1000.0) * (SFCTMP - TG) - - PAHV = PAH_AC - PAH_CG - PAHG = PAH_CG - PAHB = PAH_AG - - IF (FVEG > 0.0 .AND. FVEG < 1.0) THEN - PAHG = PAHG / FVEG ! these will be multiplied by fraction later - PAHB = PAHB / (1.0-FVEG) - ELSEIF (FVEG <= 0.0) THEN - PAHB = PAHG + PAHB ! for case of canopy getting buried - PAHG = 0.0 - PAHV = 0.0 - ELSEIF (FVEG >= 1.0) THEN - PAHB = 0.0 - END IF - - PAHV = MAX(PAHV,-20.0) ! Put some artificial limits here for stability - PAHV = MIN(PAHV,20.0) - PAHG = MAX(PAHG,-20.0) - PAHG = MIN(PAHG,20.0) - PAHB = MAX(PAHB,-20.0) - PAHB = MIN(PAHB,20.0) - -! rain or snow on the ground - - QRAIN = QDRIPR + QTHROR - QSNOW = QDRIPS + QTHROS - SNOWHIN = QSNOW/BDFALL - - IF (IST == 2 .AND. TG > TFRZ) THEN - QSNOW = 0.0 - SNOWHIN = 0.0 - END IF - - END SUBROUTINE PRECIP_HEAT - -!== begin error ==================================================================================== - - SUBROUTINE ERROR (parameters,SWDOWN ,FSA ,FSR ,FIRA ,FSH ,FCEV , & - FGEV ,FCTR ,SSOIL ,BEG_WB ,CANLIQ ,CANICE , & - SNEQV ,WA ,SMC ,DZSNSO ,PRCP ,ECAN , & - ETRAN ,EDIR ,RUNSRF ,RUNSUB ,DT ,NSOIL , & - QTLDRN , & - NSNOW ,IST ,ERRWAT, ILOC ,JLOC ,FVEG , & - SAV ,SAG ,FSRV ,FSRG ,ZWT ,PAH , & - PAHV ,PAHG ,PAHB ,FIRR ,CANHS , & - IRMIRATE, IRFIRATE, ACC_DWATER, ACC_PRCP, ACC_ECAN, & - ACC_ETRAN, ACC_EDIR ) -! -------------------------------------------------------------------------------------------------- -! check surface energy balance and water balance -! -------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------------- -! inputs - type (noahmp_parameters), intent(in) :: parameters - INTEGER , INTENT(IN) :: NSNOW !maximum no. of snow layers - INTEGER , INTENT(IN) :: NSOIL !number of soil layers - INTEGER , INTENT(IN) :: IST !surface type 1->soil; 2->lake - INTEGER , INTENT(IN) :: ILOC !grid index - INTEGER , INTENT(IN) :: JLOC !grid index - REAL , INTENT(IN) :: SWDOWN !downward solar filtered by sun angle [w/m2] - REAL , INTENT(IN) :: FSA !total absorbed solar radiation (w/m2) - REAL , INTENT(IN) :: FSR !total reflected solar radiation (w/m2) - REAL , INTENT(IN) :: FIRA !total net longwave rad (w/m2) [+ to atm] - REAL , INTENT(IN) :: FSH !total sensible heat (w/m2) [+ to atm] - REAL , INTENT(IN) :: FCEV !canopy evaporation heat (w/m2) [+ to atm] - REAL , INTENT(IN) :: FGEV !ground evaporation heat (w/m2) [+ to atm] - REAL , INTENT(IN) :: FCTR !transpiration heat flux (w/m2) [+ to atm] - REAL , INTENT(IN) :: SSOIL !ground heat flux (w/m2) [+ to soil] - REAL , INTENT(IN) :: FVEG - REAL , INTENT(IN) :: SAV - REAL , INTENT(IN) :: SAG - REAL , INTENT(IN) :: FSRV - REAL , INTENT(IN) :: FSRG - REAL , INTENT(IN) :: ZWT - - REAL , INTENT(IN) :: PRCP !precipitation rate (kg m-2 s-1) - REAL , INTENT(IN) :: ECAN !evaporation of intercepted water (mm/s) - REAL , INTENT(IN) :: ETRAN !transpiration rate (mm/s) - REAL , INTENT(IN) :: EDIR !soil surface evaporation rate[mm/s] - REAL , INTENT(IN) :: RUNSRF !surface runoff [mm] per soil timestep - REAL , INTENT(IN) :: RUNSUB !baseflow (saturation excess) [mm] per soil timestep - REAL , INTENT(IN) :: QTLDRN !tile drainage [mm] per soil timestep - REAL , INTENT(IN) :: CANLIQ !intercepted liquid water (mm) - REAL , INTENT(IN) :: CANICE !intercepted ice mass (mm) - REAL , INTENT(IN) :: SNEQV !snow water eqv. [mm] - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: SMC !soil moisture (ice + liq.) [m3/m3] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !snow/soil layer thickness [m] - REAL , INTENT(IN) :: WA !water storage in aquifer [mm] - REAL , INTENT(IN) :: DT !time step [sec] - REAL , INTENT(IN) :: BEG_WB !water storage at begin of a timesetp [mm] - REAL , INTENT(OUT) :: ERRWAT !error in water balance [mm/timestep] - REAL, INTENT(IN) :: PAH !precipitation advected heat - total (W/m2) - REAL, INTENT(IN) :: PAHV !precipitation advected heat - total (W/m2) - REAL, INTENT(IN) :: PAHG !precipitation advected heat - total (W/m2) - REAL, INTENT(IN) :: PAHB !precipitation advected heat - total (W/m2) - REAL , INTENT(IN) :: FIRR !latent heating due to sprinkler evaporation (w/m2) [+ to atm] - REAL , INTENT(IN) :: CANHS !canopy heat storage change (w/m2) C.He added based on GY Niu's communication - REAL , INTENT(IN) :: IRMIRATE ! micro irrigation amount m/timestep(soil) - REAL , INTENT(IN) :: IRFIRATE ! flood irrigation amount m/timestep(soil) - REAL , INTENT(INOUT) :: ACC_DWATER ! accumulated water change for canopy, snow, soil mm/timestep(soil) - REAL , INTENT(INOUT) :: ACC_PRCP ! accumulated precip mm/timestep(soil) - REAL , INTENT(INOUT) :: ACC_ECAN ! accumulated net canopy evapo mm/timestep(soil) - REAL , INTENT(INOUT) :: ACC_ETRAN ! accumulated transpiration mm/timestep(soil) - REAL , INTENT(INOUT) :: ACC_EDIR ! accumulated net soil/snow evapo mm/timestep(soil) - -!local - INTEGER :: IZ !do-loop index - REAL :: END_WB !water storage at end of a timestep [mm] - !KWM REAL :: ERRWAT !error in water balance [mm/timestep] - REAL :: ERRENG !error in surface energy balance [w/m2] - REAL :: ERRSW !error in shortwave radiation balance [w/m2] - REAL :: FSRVG - CHARACTER(len=256) :: message -! -------------------------------------------------------------------------------------------------- -!jref:start - ERRSW = SWDOWN - (FSA + FSR) -! ERRSW = SWDOWN - (SAV+SAG + FSRV+FSRG) - - IF (ABS(ERRSW) > 0.01) THEN ! w/m2 - WRITE(*,*) "VEGETATION!" - WRITE(*,*) "SWDOWN*FVEG =",SWDOWN*FVEG - WRITE(*,*) "FVEG*(SAV+SAG) =",FVEG*SAV + SAG - WRITE(*,*) "FVEG*(FSRV +FSRG)=",FVEG*FSRV + FSRG - WRITE(*,*) "GROUND!" - WRITE(*,*) "(1-.FVEG)*SWDOWN =",(1.-FVEG)*SWDOWN - WRITE(*,*) "(1.-FVEG)*SAG =",(1.-FVEG)*SAG - WRITE(*,*) "(1.-FVEG)*FSRG=",(1.-FVEG)*FSRG - WRITE(*,*) "FSRV =",FSRV - WRITE(*,*) "FSRG =",FSRG - WRITE(*,*) "FSR =",FSR - WRITE(*,*) "SAV =",SAV - WRITE(*,*) "SAG =",SAG - WRITE(*,*) "FSA =",FSA -!jref:end - WRITE(message,*) 'ERRSW =',ERRSW - call wrf_message(trim(message)) - call wrf_error_fatal("Stop in Noah-MP") - END IF - - ERRENG = SAV+SAG-(FIRA+FSH+FCEV+FGEV+FCTR+SSOIL+FIRR+CANHS) +PAH -! ERRENG = FVEG*SAV+SAG-(FIRA+FSH+FCEV+FGEV+FCTR+SSOIL) - - IF(ABS(ERRENG) > 0.01) THEN - write(message,*) 'ERRENG =',ERRENG,' at i,j: ',ILOC,JLOC - call wrf_message(trim(message)) - WRITE(message,'(a17,F10.4)') "Net solar: ",FSA - call wrf_message(trim(message)) - WRITE(message,'(a17,F10.4)') "Net longwave: ",FIRA - call wrf_message(trim(message)) - WRITE(message,'(a17,F10.4)') "Total sensible: ",FSH - call wrf_message(trim(message)) - WRITE(message,'(a17,F10.4)') "Canopy evap: ",FCEV - call wrf_message(trim(message)) - WRITE(message,'(a17,F10.4)') "Ground evap: ",FGEV - call wrf_message(trim(message)) - WRITE(message,'(a17,F10.4)') "Transpiration: ",FCTR - call wrf_message(trim(message)) - WRITE(message,'(a17,F10.4)') "Total ground: ",SSOIL - call wrf_message(trim(message)) - WRITE(message,'(a17,F10.4)') "Sprinkler: ",FIRR - call wrf_message(trim(message)) - WRITE(message,'(a17,F10.4)') "Canopy Heat Storage: ",CANHS - call wrf_message(trim(message)) - WRITE(message,'(a17,4F10.4)') "Precip advected: ",PAH,PAHV,PAHG,PAHB - call wrf_message(trim(message)) - WRITE(message,'(a17,F10.4)') "Precip: ",PRCP - call wrf_message(trim(message)) - WRITE(message,'(a17,F10.4)') "Veg fraction: ",FVEG - call wrf_message(trim(message)) - call wrf_error_fatal("Energy budget problem in NOAHMP LSM") - END IF - -! only water balance check for soil timestep - IF (IST == 1) THEN !soil - END_WB = CANLIQ + CANICE + SNEQV + WA - DO IZ = 1,NSOIL - END_WB = END_WB + SMC(IZ) * DZSNSO(IZ) * 1000.0 - END DO - ! accumualted water change (only for canopy and snow during non-soil timestep) - ACC_DWATER = ACC_DWATER + (END_WB - BEG_WB) ! snow, canopy, and soil water change - ACC_PRCP = ACC_PRCP + PRCP * DT ! accumulated precip - ACC_ECAN = ACC_ECAN + ECAN * DT ! accumulated canopy evapo - ACC_ETRAN = ACC_ETRAN + ETRAN * DT ! accumulated transpiration - ACC_EDIR = ACC_EDIR + EDIR * DT ! accumulated soil evapo - - if (calculate_soil) then - ERRWAT = ACC_DWATER - (ACC_PRCP + IRFIRATE*1000.0 + IRMIRATE*1000.0 - ACC_ECAN - & - ACC_ETRAN - ACC_EDIR - RUNSRF - RUNSUB - QTLDRN) - -#ifndef WRF_HYDRO - IF(ABS(ERRWAT) > 0.1) THEN - if (ERRWAT > 0) then - call wrf_message ('The model is gaining water (ERRWAT is positive)') - else - call wrf_message('The model is losing water (ERRWAT is negative)') - endif - write(message, *) 'ERRWAT =',ERRWAT, "kg m{-2} timestep{-1}" - call wrf_message(trim(message)) - WRITE(message, & - '(" I J END-BEG PRCP IRMIRATE IRFIRATE ECAN EDIR ETRAN RUNSRF RUNSUB ZWT QTLDRN")') - call wrf_message(trim(message)) - WRITE(message,'(i6,i6,f10.3,10f10.5)')ILOC,JLOC,ACC_DWATER,ACC_PRCP,IRMIRATE*1000.0,& - IRFIRATE*1000.0,ACC_ECAN,ACC_EDIR,ACC_ETRAN,RUNSRF,RUNSUB,ZWT,QTLDRN - call wrf_message(trim(message)) - call wrf_error_fatal("Water budget problem in NOAHMP LSM") - END IF -#endif - - endif ! calculate_soil - - ELSE !KWM - ERRWAT = 0.0 !KWM - ENDIF - - END SUBROUTINE ERROR - -!== begin energy =================================================================================== - - SUBROUTINE ENERGY (parameters,ICE ,VEGTYP ,IST ,NSNOW ,NSOIL , & !in - ISNOW ,DT ,RHOAIR ,SFCPRS ,QAIR , & !in - SFCTMP ,THAIR ,LWDN ,UU ,VV ,ZREF , & !in - CO2AIR ,O2AIR ,SOLAD ,SOLAI ,COSZ ,IGS , & !in - EAIR ,TBOT ,ZSNSO ,ZSOIL , & !in - ELAI ,ESAI ,FWET ,FOLN , & !in - FVEG ,PAHV ,PAHG ,PAHB , & !in - QSNOW ,DZSNSO ,LAT ,CANLIQ ,CANICE ,ILOC , JLOC, & !in - Z0WRF , & - IMELT ,SNICEV ,SNLIQV ,EPORE ,T2M ,FSNO , & !out - SAV ,SAG ,QMELT ,FSA ,FSR ,TAUX , & !out - TAUY ,FIRA ,FSH ,FCEV ,FGEV ,FCTR , & !out - TRAD ,PSN ,APAR ,SSOIL ,BTRANI ,BTRAN , & !out - PONDING,TS ,LATHEAV , LATHEAG , frozen_canopy,frozen_ground, & !out - TV ,TG ,STC ,SNOWH ,EAH ,TAH , & !inout - SNEQVO ,SNEQV ,SH2O ,SMC ,SNICE ,SNLIQ , & !inout - ALBOLD ,CM ,CH ,DX ,DZ8W ,Q2 , & !inout - TAUSS ,LAISUN ,LAISHA ,RB , & !inout -!jref:start - QC ,QSFC ,PSFC , & !in - T2MV ,T2MB ,FSRV , & - FSRG ,RSSUN ,RSSHA ,ALBSND ,ALBSNI,BGAP ,WGAP,TGV,TGB,& - Q1 ,Q2V ,Q2B ,Q2E ,CHV ,CHB, EMISSI, PAH, CANHS, & - SHG,SHC,SHB,EVG,EVB,GHV,GHB,IRG,IRC,IRB,TR,EVC,CHLEAF,CHUC,CHV2,CHB2, & - EFLXB ,HCPCT ,ACC_SSOIL, & - JULIAN, SWDOWN, PRCP, FB, GECROS1D ) -!jref:end - -! -------------------------------------------------------------------------------------------------- -! we use different approaches to deal with subgrid features of radiation transfer and turbulent -! transfer. We use 'tile' approach to compute turbulent fluxes, while we use modified two- -! stream to compute radiation transfer. Tile approach, assemblying vegetation canopies together, -! may expose too much ground surfaces (either covered by snow or grass) to solar radiation. The -! modified two-stream assumes vegetation covers fully the gridcell but with gaps between tree -! crowns. -! -------------------------------------------------------------------------------------------------- -! turbulence transfer : 'tile' approach to compute energy fluxes in vegetated fraction and -! bare fraction separately and then sum them up weighted by fraction -! -------------------------------------- -! / O O O O O O O O / / -! / | | | | | | | | / / -! / O O O O O O O O / / -! / | | |tile1| | | | / tile2 / -! / O O O O O O O O / bare / -! / | | | vegetated | | / / -! / O O O O O O O O / / -! / | | | | | | | | / / -! -------------------------------------- -! -------------------------------------------------------------------------------------------------- -! radiation transfer : modified two-stream (Yang and Friedl, 2003, JGR; Niu ang Yang, 2004, JGR) -! -------------------------------------- two-stream treats leaves as -! / O O O O O O O O / cloud over the entire grid-cell, -! / | | | | | | | | / while the modified two-stream -! / O O O O O O O O / aggregates cloudy leaves into -! / | | | | | | | | / tree crowns with gaps (as shown in -! / O O O O O O O O / the left figure). We assume these -! / | | | | | | | | / tree crowns are evenly distributed -! / O O O O O O O O / within the gridcell with 100% veg -! / | | | | | | | | / fraction, but with gaps. The 'tile' -! -------------------------------------- approach overlaps too much shadows. -! -------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------------- -! inputs - type (noahmp_parameters), intent(in) :: parameters - integer , INTENT(IN) :: ILOC - integer , INTENT(IN) :: JLOC - INTEGER , INTENT(IN) :: ICE !ice (ice = 1) - INTEGER , INTENT(IN) :: VEGTYP !vegetation physiology type - INTEGER , INTENT(IN) :: IST !surface type: 1->soil; 2->lake - INTEGER , INTENT(IN) :: NSNOW !maximum no. of snow layers - INTEGER , INTENT(IN) :: NSOIL !number of soil layers - INTEGER , INTENT(IN) :: ISNOW !actual no. of snow layers - REAL , INTENT(IN) :: DT !time step [sec] - REAL , INTENT(IN) :: QSNOW !snowfall on the ground (mm/s) - REAL , INTENT(IN) :: RHOAIR !density air (kg/m3) - REAL , INTENT(IN) :: EAIR !vapor pressure air (pa) - REAL , INTENT(IN) :: SFCPRS !pressure (pa) - REAL , INTENT(IN) :: QAIR !specific humidity (kg/kg) - REAL , INTENT(IN) :: SFCTMP !air temperature (k) - REAL , INTENT(IN) :: THAIR !potential temperature (k) - REAL , INTENT(IN) :: LWDN !downward longwave radiation (w/m2) - REAL , INTENT(IN) :: UU !wind speed in e-w dir (m/s) - REAL , INTENT(IN) :: VV !wind speed in n-s dir (m/s) - REAL , DIMENSION( 1: 2), INTENT(IN) :: SOLAD !incoming direct solar rad. (w/m2) - REAL , DIMENSION( 1: 2), INTENT(IN) :: SOLAI !incoming diffuse solar rad. (w/m2) - REAL , INTENT(IN) :: COSZ !cosine solar zenith angle (0-1) - REAL , INTENT(IN) :: ELAI !LAI adjusted for burying by snow - REAL , INTENT(IN) :: ESAI !LAI adjusted for burying by snow - REAL , INTENT(IN) :: FWET !fraction of canopy that is wet [-] - REAL , INTENT(IN) :: FVEG !greeness vegetation fraction (-) - REAL , INTENT(IN) :: LAT !latitude (radians) - REAL , INTENT(IN) :: CANLIQ !canopy-intercepted liquid water (mm) - REAL , INTENT(IN) :: CANICE !canopy-intercepted ice mass (mm) - REAL , INTENT(IN) :: FOLN !foliage nitrogen (%) - REAL , INTENT(IN) :: CO2AIR !atmospheric co2 concentration (pa) - REAL , INTENT(IN) :: O2AIR !atmospheric o2 concentration (pa) - REAL , INTENT(IN) :: IGS !growing season index (0=off, 1=on) - - REAL , INTENT(IN) :: ZREF !reference height (m) - REAL , INTENT(IN) :: TBOT !bottom condition for soil temp. (k) - REAL , DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: ZSNSO !layer-bottom depth from snow surf [m] - REAL , DIMENSION( 1:NSOIL), INTENT(IN) :: ZSOIL !layer-bottom depth from soil surf [m] - REAL , DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !depth of snow & soil layer-bottom [m] - REAL, INTENT(IN) :: PAHV !precipitation advected heat - vegetation net (W/m2) - REAL, INTENT(IN) :: PAHG !precipitation advected heat - under canopy net (W/m2) - REAL, INTENT(IN) :: PAHB !precipitation advected heat - bare ground net (W/m2) - -!jref:start; in - REAL , INTENT(IN) :: QC !cloud water mixing ratio - REAL , INTENT(INOUT) :: QSFC !mixing ratio at lowest model layer - REAL , INTENT(IN) :: PSFC !pressure at lowest model layer - REAL , INTENT(IN) :: DX !horisontal resolution - REAL , INTENT(IN) :: DZ8W !thickness of lowest layer - REAL , INTENT(IN) :: Q2 !mixing ratio (kg/kg) -!jref:end - -! outputs - REAL , INTENT(OUT) :: Z0WRF !combined z0 sent to coupled model - INTEGER, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: IMELT !phase change index [1-melt; 2-freeze] - REAL , DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: SNICEV !partial volume ice [m3/m3] - REAL , DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: SNLIQV !partial volume liq. water [m3/m3] - REAL , DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: EPORE !effective porosity [m3/m3] - REAL , INTENT(OUT) :: FSNO !snow cover fraction (-) - REAL , INTENT(OUT) :: QMELT !snowmelt [mm/s] - REAL , INTENT(OUT) :: PONDING!pounding at ground [mm] - REAL , INTENT(OUT) :: SAV !solar rad. absorbed by veg. (w/m2) - REAL , INTENT(OUT) :: SAG !solar rad. absorbed by ground (w/m2) - REAL , INTENT(OUT) :: FSA !tot. absorbed solar radiation (w/m2) - REAL , INTENT(OUT) :: FSR !tot. reflected solar radiation (w/m2) - REAL , INTENT(OUT) :: TAUX !wind stress: e-w (n/m2) - REAL , INTENT(OUT) :: TAUY !wind stress: n-s (n/m2) - REAL , INTENT(OUT) :: FIRA !total net LW. rad (w/m2) [+ to atm] - REAL , INTENT(OUT) :: FSH !total sensible heat (w/m2) [+ to atm] - REAL , INTENT(OUT) :: FCEV !canopy evaporation (w/m2) [+ to atm] - REAL , INTENT(OUT) :: FGEV !ground evaporation (w/m2) [+ to atm] - REAL , INTENT(OUT) :: FCTR !transpiration (w/m2) [+ to atm] - REAL , INTENT(OUT) :: TRAD !radiative temperature (k) - REAL , INTENT(OUT) :: T2M !2 m height air temperature (k) - REAL , INTENT(OUT) :: PSN !total photosyn. (umolco2/m2/s) [+] - REAL , INTENT(OUT) :: APAR !total photosyn. active energy (w/m2) - REAL , INTENT(OUT) :: SSOIL !ground heat flux (w/m2) [+ to soil] - REAL , DIMENSION( 1:NSOIL), INTENT(OUT) :: BTRANI !soil water transpiration factor (0-1) - REAL , INTENT(OUT) :: BTRAN !soil water transpiration factor (0-1) -! REAL , INTENT(OUT) :: LATHEA !latent heat vap./sublimation (j/kg) - REAL , INTENT(OUT) :: LATHEAV !latent heat vap./sublimation (j/kg) - REAL , INTENT(OUT) :: LATHEAG !latent heat vap./sublimation (j/kg) - LOGICAL , INTENT(OUT) :: FROZEN_GROUND ! used to define latent heat pathway - LOGICAL , INTENT(OUT) :: FROZEN_CANOPY ! used to define latent heat pathway - REAL , INTENT(OUT) :: EFLXB !energy influx from soil bottom (w/m2) - REAL , INTENT(INOUT) :: ACC_SSOIL !energy influx from soil bottom (w/m2) - -!jref:start - REAL , INTENT(OUT) :: FSRV !veg. reflected solar radiation (w/m2) - REAL , INTENT(OUT) :: FSRG !ground reflected solar radiation (w/m2) - REAL, INTENT(OUT) :: RSSUN !sunlit leaf stomatal resistance (s/m) - REAL, INTENT(OUT) :: RSSHA !shaded leaf stomatal resistance (s/m) -!jref:end - out for debug - -!jref:start; output - REAL , INTENT(OUT) :: T2MV !2-m air temperature over vegetated part [k] - REAL , INTENT(OUT) :: T2MB !2-m air temperature over bare ground part [k] - REAL , INTENT(OUT) :: BGAP - REAL , INTENT(OUT) :: WGAP - REAL, DIMENSION(1:2) , INTENT(OUT) :: ALBSND !snow albedo (direct) - REAL, DIMENSION(1:2) , INTENT(OUT) :: ALBSNI !snow albedo (diffuse) -!jref:end - - REAL , INTENT(OUT) :: CANHS ! canopy heat storage change (w/m2) C.He added based on GY Niu's communication - -! input & output - REAL , INTENT(INOUT) :: TS !surface temperature (k) - REAL , INTENT(INOUT) :: TV !vegetation temperature (k) - REAL , INTENT(INOUT) :: TG !ground temperature (k) - REAL , DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow/soil temperature [k] - REAL , INTENT(INOUT) :: SNOWH !snow height [m] - REAL , INTENT(INOUT) :: SNEQV !snow mass (mm) - REAL , INTENT(INOUT) :: SNEQVO !snow mass at last time step (mm) - REAL , DIMENSION( 1:NSOIL), INTENT(INOUT) :: SH2O !liquid soil moisture [m3/m3] - REAL , DIMENSION( 1:NSOIL), INTENT(INOUT) :: SMC !soil moisture (ice + liq.) [m3/m3] - REAL , DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNICE !snow ice mass (kg/m2) - REAL , DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNLIQ !snow liq mass (kg/m2) - REAL , INTENT(INOUT) :: EAH !canopy air vapor pressure (pa) - REAL , INTENT(INOUT) :: TAH !canopy air temperature (k) - REAL , INTENT(INOUT) :: ALBOLD !snow albedo at last time step(CLASS type) - REAL , INTENT(INOUT) :: TAUSS !non-dimensional snow age - REAL , INTENT(INOUT) :: CM !momentum drag coefficient - REAL , INTENT(INOUT) :: CH !sensible heat exchange coefficient - REAL , INTENT(INOUT) :: Q1 - REAL , INTENT(INOUT) :: RB !leaf boundary layer resistance (s/m) - REAL , INTENT(INOUT) :: LAISUN !sunlit leaf area index (m2/m2) - REAL , INTENT(INOUT) :: LAISHA !shaded leaf area index (m2/m2) -! REAL :: Q2E - REAL, INTENT(OUT) :: EMISSI - REAL, INTENT(OUT) :: PAH !precipitation advected heat - total (W/m2) - -! local - INTEGER :: IZ !do-loop index - LOGICAL :: VEG !true if vegetated surface - REAL :: UR !wind speed at height ZLVL (m/s) - REAL :: ZLVL !reference height (m) - REAL :: FSUN !sunlit fraction of canopy [-] - ! REAL :: RB !leaf boundary layer resistance (s/m) - REAL :: RSURF !ground surface resistance (s/m) - REAL :: L_RSURF!Dry-layer thickness for computing RSURF (Sakaguchi and Zeng, 2009) - REAL :: D_RSURF!Reduced vapor diffusivity in soil for computing RSURF (SZ09) - REAL :: BEVAP !soil water evaporation factor (0- 1) - REAL :: MOL !Monin-Obukhov length (m) - REAL :: VAI !sum of LAI + stem area index [m2/m2] - REAL :: CWP !canopy wind extinction parameter - REAL :: ZPD !zero plane displacement (m) - REAL :: Z0M !z0 momentum (m) - REAL :: ZPDG !zero plane displacement (m) - REAL :: Z0MG !z0 momentum, ground (m) - REAL :: EMV !vegetation emissivity - REAL :: EMG !ground emissivity - REAL :: FIRE !emitted IR (w/m2) - - REAL :: PSNSUN !sunlit photosynthesis (umolco2/m2/s) - REAL :: PSNSHA !shaded photosynthesis (umolco2/m2/s) -!jref:start - for debug -! REAL :: RSSUN !sunlit stomatal resistance (s/m) -! REAL :: RSSHA !shaded stomatal resistance (s/m) -!jref:end - for debug - REAL :: PARSUN !par absorbed per sunlit LAI (w/m2) - REAL :: PARSHA !par absorbed per shaded LAI (w/m2) - - REAL, DIMENSION(-NSNOW+1:NSOIL) :: FACT !temporary used in phase change - REAL, DIMENSION(-NSNOW+1:NSOIL) :: DF !thermal conductivity [w/m/k] - REAL, DIMENSION(-NSNOW+1:NSOIL) , INTENT(OUT) :: HCPCT !heat capacity [j/m3/k] - REAL :: BDSNO !bulk density of snow (kg/m3) - REAL :: FMELT !melting factor for snow cover frac - REAL :: GX !temporary variable - REAL, DIMENSION(-NSNOW+1:NSOIL) :: PHI !light through water (w/m2) -! REAL :: GAMMA !psychrometric constant (pa/k) - REAL :: GAMMAV !psychrometric constant (pa/k) - REAL :: GAMMAG !psychrometric constant (pa/k) - REAL :: PSI !surface layer soil matrix potential (m) - REAL :: RHSUR !raltive humidity in surface soil/snow air space (-) - -! temperature and fluxes over vegetated fraction - - REAL :: TAUXV !wind stress: e-w dir [n/m2] - REAL :: TAUYV !wind stress: n-s dir [n/m2] - REAL,INTENT(OUT) :: IRC !canopy net LW rad. [w/m2] [+ to atm] - REAL,INTENT(OUT) :: IRG !ground net LW rad. [w/m2] [+ to atm] - REAL,INTENT(OUT) :: SHC !canopy sen. heat [w/m2] [+ to atm] - REAL,INTENT(OUT) :: SHG !ground sen. heat [w/m2] [+ to atm] -!jref:start - REAL,INTENT(OUT) :: Q2V - REAL,INTENT(OUT) :: Q2B - REAL,INTENT(OUT) :: Q2E -!jref:end - REAL,INTENT(OUT) :: EVC !canopy evap. heat [w/m2] [+ to atm] - REAL,INTENT(OUT) :: EVG !ground evap. heat [w/m2] [+ to atm] - REAL,INTENT(OUT) :: TR !transpiration heat [w/m2] [+ to atm] - REAL,INTENT(OUT) :: GHV !ground heat flux [w/m2] [+ to soil] - REAL,INTENT(OUT) :: TGV !ground surface temp. [k] - REAL :: CMV !momentum drag coefficient - REAL,INTENT(OUT) :: CHV !sensible heat exchange coefficient - -! temperature and fluxes over bare soil fraction - - REAL :: TAUXB !wind stress: e-w dir [n/m2] - REAL :: TAUYB !wind stress: n-s dir [n/m2] - REAL,INTENT(OUT) :: IRB !net longwave rad. [w/m2] [+ to atm] - REAL,INTENT(OUT) :: SHB !sensible heat [w/m2] [+ to atm] - REAL,INTENT(OUT) :: EVB !evaporation heat [w/m2] [+ to atm] - REAL,INTENT(OUT) :: GHB !ground heat flux [w/m2] [+ to soil] - REAL,INTENT(OUT) :: TGB !ground surface temp. [k] - REAL :: CMB !momentum drag coefficient - REAL,INTENT(OUT) :: CHB !sensible heat exchange coefficient - REAL,INTENT(OUT) :: CHLEAF !leaf exchange coefficient - REAL,INTENT(OUT) :: CHUC !under canopy exchange coefficient -!jref:start - REAL,INTENT(OUT) :: CHV2 !sensible heat conductance, canopy air to ZLVL air (m/s) - REAL,INTENT(OUT) :: CHB2 !sensible heat conductance, canopy air to ZLVL air (m/s) - REAL :: noahmpres - - real :: dt_soil - real :: ssoil_avg - - REAL, INTENT(IN) :: JULIAN, SWDOWN, PRCP, FB - REAL,DIMENSION(1:60),INTENT(INOUT) :: GECROS1D - -!jref:end - - REAL, PARAMETER :: MPE = 1.E-6 - REAL, PARAMETER :: PSIWLT = -150.0 !metric potential for wilting point (m) - REAL, PARAMETER :: Z0 = 0.002 ! Bare-soil roughness length (m) (i.e., under the canopy) - -! --------------------------------------------------------------------------------------------------- -! initialize fluxes from veg. fraction - - TAUXV = 0.0 - TAUYV = 0.0 - IRC = 0.0 - SHC = 0.0 - IRG = 0.0 - SHG = 0.0 - EVG = 0.0 - EVC = 0.0 - TR = 0.0 - GHV = 0.0 - PSNSUN = 0.0 - PSNSHA = 0.0 - T2MV = 0.0 - Q2V = 0.0 - CHV = 0.0 - CHLEAF = 0.0 - CHUC = 0.0 - CHV2 = 0.0 - RB = 0.0 - -! wind speed at reference height: ur >= 1 - - UR = MAX( SQRT(UU**2.0 + VV**2.0), 1.0 ) - -! vegetated or non-vegetated - - VAI = ELAI + ESAI - VEG = .FALSE. - IF(VAI > 0.0) VEG = .TRUE. - -! ground snow cover fraction [Niu and Yang, 2007, JGR] - - FSNO = 0.0 - IF(SNOWH .GT. 0.0) THEN - BDSNO = SNEQV / SNOWH - FMELT = (BDSNO/100.0)**parameters%MFSNO - !FSNO = TANH( SNOWH /(2.5* Z0 * FMELT)) - FSNO = TANH( SNOWH /(parameters%SCFFAC * FMELT)) ! C.He: bring hard-coded 2.5*z0 to MPTABLE tunable parameter SCFFAC - ENDIF - -! ground roughness length - - IF(IST == 2) THEN - IF(TG .LE. TFRZ) THEN - Z0MG = 0.01 * (1.0-FSNO) + FSNO * parameters%Z0SNO - ELSE - Z0MG = 0.01 - END IF - ELSE - Z0MG = Z0 * (1.0-FSNO) + FSNO * parameters%Z0SNO - END IF - -! roughness length and displacement height - - ZPDG = SNOWH - IF(VEG) THEN - Z0M = parameters%Z0MVT - ZPD = 0.65 * parameters%HVT - IF(SNOWH.GT.ZPD) ZPD = SNOWH - ELSE - Z0M = Z0MG - ZPD = ZPDG - END IF - -! special case for urban - - IF (parameters%urban_flag) THEN - Z0MG = parameters%Z0MVT - ZPDG = 0.65 * parameters%HVT - Z0M = Z0MG - ZPD = ZPDG - END IF - - ZLVL = MAX(ZPD,parameters%HVT) + ZREF - IF(ZPDG >= ZLVL) ZLVL = ZPDG + ZREF -! UR = UR*LOG(ZLVL/Z0M)/LOG(10./Z0M) !input UR is at 10m - -! canopy wind absorption coeffcient - - CWP = parameters%CWPVT - -! Thermal properties of soil, snow, lake, and frozen soil - - CALL THERMOPROP (parameters,NSOIL ,NSNOW ,ISNOW ,IST ,DZSNSO , & !in - DT ,SNOWH ,SNICE ,SNLIQ , & !in - SMC ,SH2O ,TG ,STC ,UR , & !in - LAT ,Z0M ,ZLVL ,VEGTYP , & !in - DF ,HCPCT ,SNICEV ,SNLIQV ,EPORE , & !out - FACT ) !out - -! Solar radiation: absorbed & reflected by the ground and canopy - - CALL RADIATION (parameters,VEGTYP ,IST ,ICE ,NSOIL , & !in - SNEQVO ,SNEQV ,DT ,COSZ ,SNOWH , & !in - TG ,TV ,FSNO ,QSNOW ,FWET , & !in - ELAI ,ESAI ,SMC ,SOLAD ,SOLAI , & !in - FVEG ,ILOC ,JLOC , & !in - ALBOLD ,TAUSS , & !inout - FSUN ,LAISUN ,LAISHA ,PARSUN ,PARSHA , & !out - SAV ,SAG ,FSR ,FSA ,FSRV , & - FSRG ,ALBSND ,ALBSNI ,BGAP ,WGAP ) !out - -! vegetation and ground emissivity - - EMV = 1.0 - EXP(-(ELAI+ESAI)/1.0) - IF (ICE == 1) THEN - EMG = 0.98*(1.0-FSNO) + parameters%SNOW_EMIS*FSNO ! move hard-coded snow emissivity as a global parameter to MPTABLE - ELSE - EMG = parameters%EG(IST)*(1.0-FSNO) + parameters%SNOW_EMIS*FSNO - END IF - -! soil moisture factor controlling stomatal resistance - - BTRAN = 0.0 - - IF(IST ==1 ) THEN - DO IZ = 1, parameters%NROOT - IF(OPT_BTR == 1) then ! Noah - GX = (SH2O(IZ)-parameters%SMCWLT(IZ)) / (parameters%SMCREF(IZ)-parameters%SMCWLT(IZ)) - END IF - IF(OPT_BTR == 2) then ! CLM - PSI = MAX(PSIWLT,-parameters%PSISAT(IZ)*(MAX(0.01,SH2O(IZ))/parameters%SMCMAX(IZ))**(-parameters%BEXP(IZ)) ) - GX = (1.0-PSI/PSIWLT)/(1.0+parameters%PSISAT(IZ)/PSIWLT) - END IF - IF(OPT_BTR == 3) then ! SSiB - PSI = MAX(PSIWLT,-parameters%PSISAT(IZ)*(MAX(0.01,SH2O(IZ))/parameters%SMCMAX(IZ))**(-parameters%BEXP(IZ)) ) - GX = 1.0-EXP(-5.8*(LOG(PSIWLT/PSI))) - END IF - - GX = MIN(1.0,MAX(0.0,GX)) - BTRANI(IZ) = MAX(MPE,DZSNSO(IZ) / (-ZSOIL(parameters%NROOT)) * GX) - BTRAN = BTRAN + BTRANI(IZ) - END DO - BTRAN = MAX(MPE,BTRAN) - - BTRANI(1:parameters%NROOT) = BTRANI(1:parameters%NROOT)/BTRAN - END IF - -! soil surface resistance for ground evap. - - BEVAP = MAX(0.0,SH2O(1)/parameters%SMCMAX(1)) - IF(IST == 2) THEN - RSURF = 1.0 ! avoid being divided by 0 - RHSUR = 1.0 - ELSE - - IF(OPT_RSF == 1 .OR. OPT_RSF == 4) THEN - ! RSURF based on Sakaguchi and Zeng, 2009 - ! taking the "residual water content" to be the wilting point, - ! and correcting the exponent on the D term (typo in SZ09 ?) - L_RSURF = (-ZSOIL(1)) * ( exp ( (1.0 - MIN(1.0,SH2O(1)/parameters%SMCMAX(1))) ** parameters%RSURF_EXP ) - 1.0 ) / ( 2.71828 - 1.0 ) - D_RSURF = 2.2E-5 * parameters%SMCMAX(1) * parameters%SMCMAX(1) * ( 1.0 - parameters%SMCWLT(1) / parameters%SMCMAX(1) ) ** (2.0+3.0/parameters%BEXP(1)) - RSURF = L_RSURF / D_RSURF - ELSEIF(OPT_RSF == 2) THEN - RSURF = FSNO * 1.0 + (1.-FSNO)* EXP(8.25-4.225*BEVAP) !Sellers (1992) ! Older RSURF computations - ELSEIF(OPT_RSF == 3) THEN - RSURF = FSNO * 1.0 + (1.-FSNO)* EXP(8.25-6.0 *BEVAP) !adjusted to decrease RSURF for wet soil - ENDIF - - IF(OPT_RSF == 4) THEN ! AD: FSNO weighted; snow RSURF set in MPTABLE v3.8 - RSURF = 1.0 / (FSNO * (1.0/parameters%RSURF_SNOW) + (1.0-FSNO) * (1.0/max(RSURF, 0.001))) - ENDIF - - IF(SH2O(1) < 0.01 .and. SNOWH == 0.0) RSURF = 1.E6 - PSI = -parameters%PSISAT(1)*(MAX(0.01,SH2O(1))/parameters%SMCMAX(1))**(-parameters%BEXP(1)) - RHSUR = FSNO + (1.0-FSNO) * EXP(PSI*GRAV/(RW*TG)) - END IF - -! urban - jref - IF (parameters%urban_flag .and. SNOWH == 0.0 ) THEN - RSURF = 1.E6 - ENDIF - -! set psychrometric constant - - IF (TV .GT. TFRZ) THEN ! Barlage: add distinction between ground and - LATHEAV = HVAP ! vegetation in v3.6 - frozen_canopy = .false. - ELSE - LATHEAV = HSUB - frozen_canopy = .true. - END IF - GAMMAV = CPAIR*SFCPRS/(0.622*LATHEAV) - - IF (TG .GT. TFRZ) THEN - LATHEAG = HVAP - frozen_ground = .false. - ELSE - LATHEAG = HSUB - frozen_ground = .true. - END IF - GAMMAG = CPAIR*SFCPRS/(0.622*LATHEAG) - -! IF (SFCTMP .GT. TFRZ) THEN -! LATHEA = HVAP -! ELSE -! LATHEA = HSUB -! END IF -! GAMMA = CPAIR*SFCPRS/(0.622*LATHEA) - -! Surface temperatures of the ground and canopy and energy fluxes - - IF (VEG .AND. FVEG > 0) THEN - TGV = TG - CMV = CM - CHV = CH - CALL VEGE_FLUX (parameters,NSNOW ,NSOIL ,ISNOW ,VEGTYP ,VEG , & !in - DT ,SAV ,SAG ,LWDN ,UR , & !in - UU ,VV ,SFCTMP ,THAIR ,QAIR , & !in - EAIR ,RHOAIR ,SNOWH ,VAI ,GAMMAV ,GAMMAG , & !in - FWET ,LAISUN ,LAISHA ,CWP ,DZSNSO , & !in - ZLVL ,ZPD ,Z0M ,FVEG , & !in - Z0MG ,EMV ,EMG ,CANLIQ ,FSNO, & !in - CANICE ,STC ,DF ,RSSUN ,RSSHA , & !in - RSURF ,LATHEAV ,LATHEAG ,PARSUN ,PARSHA ,IGS , & !in - FOLN ,CO2AIR ,O2AIR ,BTRAN ,SFCPRS , & !in - RHSUR ,ILOC ,JLOC ,Q2 ,PAHV ,PAHG , & !in - EAH ,TAH ,TV ,TGV ,CMV , & !inout - CHV ,DX ,DZ8W , & !inout - TAUXV ,TAUYV ,IRG ,IRC ,SHG , & !out - SHC ,EVG ,EVC ,TR ,GHV , & !out - T2MV ,PSNSUN ,PSNSHA ,CANHS , & !out -!jref:start - QC ,QSFC ,PSFC , & !in - Q2V ,CHV2, CHLEAF, CHUC, & - SH2O,JULIAN, SWDOWN, PRCP, FB, FSR, GECROS1D) ! Gecros -!jref:end - END IF - - TGB = TG - CMB = CM - CHB = CH - CALL BARE_FLUX (parameters,NSNOW ,NSOIL ,ISNOW ,DT ,SAG , & !in - LWDN ,UR ,UU ,VV ,SFCTMP , & !in - THAIR ,QAIR ,EAIR ,RHOAIR ,SNOWH , & !in - DZSNSO ,ZLVL ,ZPDG ,Z0MG ,FSNO, & !in - EMG ,STC ,DF ,RSURF ,LATHEAG , & !in - GAMMAG ,RHSUR ,ILOC ,JLOC ,Q2 ,PAHB , & !in - TGB ,CMB ,CHB , & !inout - TAUXB ,TAUYB ,IRB ,SHB ,EVB , & !out - GHB ,T2MB ,DX ,DZ8W ,VEGTYP , & !out -!jref:start - QC ,QSFC ,PSFC , & !in - SFCPRS ,Q2B, CHB2) !in -!jref:end - -!energy balance at vege canopy: SAV =(IRC+SHC+EVC+TR) *FVEG at FVEG -!energy balance at vege ground: SAG* FVEG =(IRG+SHG+EVG+GHV) *FVEG at FVEG -!energy balance at bare ground: SAG*(1.-FVEG)=(IRB+SHB+EVB+GHB)*(1.-FVEG) at 1-FVEG - - IF (VEG .AND. FVEG > 0) THEN - TAUX = FVEG * TAUXV + (1.0 - FVEG) * TAUXB - TAUY = FVEG * TAUYV + (1.0 - FVEG) * TAUYB - FIRA = FVEG * IRG + (1.0 - FVEG) * IRB + IRC - FSH = FVEG * SHG + (1.0 - FVEG) * SHB + SHC - FGEV = FVEG * EVG + (1.0 - FVEG) * EVB - SSOIL = FVEG * GHV + (1.0 - FVEG) * GHB - FCEV = EVC - FCTR = TR - PAH = FVEG * PAHG + (1.0 - FVEG) * PAHB + PAHV - TG = FVEG * TGV + (1.0 - FVEG) * TGB - T2M = FVEG * T2MV + (1.0 - FVEG) * T2MB - TS = FVEG * TV + (1.0 - FVEG) * TGB - CM = FVEG * CMV + (1.0 - FVEG) * CMB ! better way to average? - CH = FVEG * CHV + (1.0 - FVEG) * CHB - Q1 = FVEG * (EAH*0.622/(SFCPRS - 0.378*EAH)) + (1.0 - FVEG)*QSFC - Q2E = FVEG * Q2V + (1.0 - FVEG) * Q2B - Z0WRF = Z0M - ELSE - TAUX = TAUXB - TAUY = TAUYB - FIRA = IRB - FSH = SHB - FGEV = EVB - SSOIL = GHB - TG = TGB - T2M = T2MB - FCEV = 0. - FCTR = 0. - PAH = PAHB - TS = TG - CM = CMB - CH = CHB - Q1 = QSFC - Q2E = Q2B - RSSUN = 0.0 - RSSHA = 0.0 - TGV = TGB - CHV = CHB - Z0WRF = Z0MG - END IF - - FIRE = LWDN + FIRA - - IF(FIRE <=0.0) THEN - WRITE(6,*) 'emitted longwave <0; skin T may be wrong due to inconsistent' - WRITE(6,*) 'input of SHDFAC with LAI' - WRITE(6,*) ILOC, JLOC, 'SHDFAC=',FVEG,'VAI=',VAI,'TV=',TV,'TG=',TG - WRITE(6,*) 'LWDN=',LWDN,'FIRA=',FIRA,'SNOWH=',SNOWH - call wrf_error_fatal("STOP in Noah-MP") - END IF - - ! Compute a net emissivity - EMISSI = FVEG * ( EMG*(1-EMV) + EMV + EMV*(1-EMV)*(1-EMG) ) + & - (1-FVEG) * EMG - - ! When we're computing a TRAD, subtract from the emitted IR the - ! reflected portion of the incoming LWDN, so we're just - ! considering the IR originating in the canopy/ground system. - - TRAD = ( ( FIRE - (1-EMISSI)*LWDN ) / (EMISSI*SB) ) ** 0.25 - - ! Old TRAD calculation not taking into account Emissivity: - ! TRAD = (FIRE/SB)**0.25 - - APAR = PARSUN*LAISUN + PARSHA*LAISHA - PSN = PSNSUN*LAISUN + PSNSHA*LAISHA - -! 3L snow & 4L soil temperatures -! added soil timestep capability - EFLXB = 0.0 - ACC_SSOIL = ACC_SSOIL + SSOIL -! starting the soil timestep - if(calculate_soil) then - - SSOIL_avg = ACC_SSOIL / soil_update_steps - DT_soil = DT * soil_update_steps - - CALL TSNOSOI (parameters,ICE ,NSOIL ,NSNOW ,ISNOW ,IST , & !in - TBOT ,ZSNSO ,SSOIL_avg ,DF ,HCPCT , & !in - SAG ,DT_soil ,SNOWH ,DZSNSO , & !in - TG ,ILOC ,JLOC , & !in - STC ,EFLXB ) !inout - - EFLXB = EFLXB * DT_soil - end if - -! adjusting snow surface temperature - IF(OPT_STC == 2) THEN - IF (SNOWH > 0.05 .AND. TG > TFRZ) THEN - TGV = TFRZ - TGB = TFRZ - IF (VEG .AND. FVEG > 0) THEN - TG = FVEG * TGV + (1.0 - FVEG) * TGB - TS = FVEG * TV + (1.0 - FVEG) * TGB - ELSE - TG = TGB - TS = TGB - END IF - END IF - END IF - -! Energy released or consumed by snow & frozen soil - - CALL PHASECHANGE (parameters,NSNOW ,NSOIL ,ISNOW ,DT ,FACT , & !in - DZSNSO ,HCPCT ,IST ,ILOC ,JLOC , & !in - STC ,SNICE ,SNLIQ ,SNEQV ,SNOWH , & !inout - SMC ,SH2O , & !inout - QMELT ,IMELT ,PONDING ) !out - - - END SUBROUTINE ENERGY - -!== begin thermoprop =============================================================================== - - SUBROUTINE THERMOPROP (parameters,NSOIL ,NSNOW ,ISNOW ,IST ,DZSNSO , & !in - DT ,SNOWH ,SNICE ,SNLIQ , & !in - SMC ,SH2O ,TG ,STC ,UR , & !in - LAT ,Z0M ,ZLVL ,VEGTYP , & !in - DF ,HCPCT ,SNICEV ,SNLIQV ,EPORE , & !out - FACT ) !out -! ------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------------- -! inputs - type (noahmp_parameters), intent(in) :: parameters - INTEGER , INTENT(IN) :: NSOIL !number of soil layers - INTEGER , INTENT(IN) :: NSNOW !maximum no. of snow layers - INTEGER , INTENT(IN) :: ISNOW !actual no. of snow layers - INTEGER , INTENT(IN) :: IST !surface type - REAL , INTENT(IN) :: DT !time step [s] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: SNICE !snow ice mass (kg/m2) - REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: SNLIQ !snow liq mass (kg/m2) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !thickness of snow/soil layers [m] - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: SMC !soil moisture (ice + liq.) [m3/m3] - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: SH2O !liquid soil moisture [m3/m3] - REAL , INTENT(IN) :: SNOWH !snow height [m] - REAL, INTENT(IN) :: TG !surface temperature (k) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: STC !snow/soil/lake temp. (k) - REAL, INTENT(IN) :: UR !wind speed at ZLVL (m/s) - REAL, INTENT(IN) :: LAT !latitude (radians) - REAL, INTENT(IN) :: Z0M !roughness length (m) - REAL, INTENT(IN) :: ZLVL !reference height (m) - INTEGER , INTENT(IN) :: VEGTYP !vegtyp type - -! outputs - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: DF !thermal conductivity [w/m/k] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: HCPCT !heat capacity [j/m3/k] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: SNICEV !partial volume of ice [m3/m3] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: SNLIQV !partial volume of liquid water [m3/m3] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: EPORE !effective porosity [m3/m3] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: FACT !computing energy for phase change -! -------------------------------------------------------------------------------------------------- -! locals - - INTEGER :: IZ - REAL, DIMENSION(-NSNOW+1: 0) :: CVSNO !volumetric specific heat (j/m3/k) - REAL, DIMENSION(-NSNOW+1: 0) :: TKSNO !snow thermal conductivity (j/m3/k) - REAL, DIMENSION( 1:NSOIL) :: SICE !soil ice content -! -------------------------------------------------------------------------------------------------- - - HCPCT = 0.0 - DF = 0.0 - -! compute snow thermal conductivity and heat capacity - - CALL CSNOW (parameters,ISNOW ,NSNOW ,NSOIL ,SNICE ,SNLIQ ,DZSNSO , & !in - TKSNO ,CVSNO ,SNICEV ,SNLIQV ,EPORE ) !out - - DO IZ = ISNOW+1, 0 - DF (IZ) = TKSNO(IZ) - HCPCT(IZ) = CVSNO(IZ) - END DO - -! compute soil thermal properties - - DO IZ = 1, NSOIL - SICE(IZ) = SMC(IZ) - SH2O(IZ) - HCPCT(IZ) = SH2O(IZ)*CWAT + (1.0-parameters%SMCMAX(IZ))*parameters%CSOIL & - + (parameters%SMCMAX(IZ)-SMC(IZ))*CPAIR + SICE(IZ)*CICE - CALL TDFCND (parameters,IZ,DF(IZ), SMC(IZ), SH2O(IZ)) - END DO - - IF ( parameters%urban_flag ) THEN - DO IZ = 1,NSOIL - DF(IZ) = 3.24 - END DO - ENDIF - -! heat flux reduction effect from the overlying green canopy, adapted from -! section 2.1.2 of Peters-Lidard et al. (1997, JGR, VOL 102(D4)). -! not in use because of the separation of the canopy layer from the ground. -! but this may represent the effects of leaf litter (Niu comments) -! DF1 = DF1 * EXP (SBETA * SHDFAC) - -! compute lake thermal properties -! (no consideration of turbulent mixing for this version) - - IF(IST == 2) THEN - DO IZ = 1, NSOIL - IF(STC(IZ) > TFRZ) THEN - HCPCT(IZ) = CWAT - DF(IZ) = TKWAT !+ KEDDY * CWAT - ELSE - HCPCT(IZ) = CICE - DF(IZ) = TKICE - END IF - END DO - END IF - -! combine a temporary variable used for melting/freezing of snow and frozen soil - - DO IZ = ISNOW+1,NSOIL - FACT(IZ) = DT/(HCPCT(IZ)*DZSNSO(IZ)) - END DO - -! snow/soil interface - - IF(ISNOW == 0) THEN - DF(1) = (DF(1)*DZSNSO(1)+0.35*SNOWH) / (SNOWH +DZSNSO(1)) - ELSE - DF(1) = (DF(1)*DZSNSO(1)+DF(0)*DZSNSO(0)) / (DZSNSO(0)+DZSNSO(1)) - END IF - - - END SUBROUTINE THERMOPROP - -!== begin csnow ==================================================================================== - - SUBROUTINE CSNOW (parameters,ISNOW ,NSNOW ,NSOIL ,SNICE ,SNLIQ ,DZSNSO , & !in - TKSNO ,CVSNO ,SNICEV ,SNLIQV ,EPORE ) !out -! -------------------------------------------------------------------------------------------------- -! Snow bulk density,volumetric capacity, and thermal conductivity -!--------------------------------------------------------------------------------------------------- - IMPLICIT NONE -!--------------------------------------------------------------------------------------------------- -! inputs - - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: ISNOW !number of snow layers (-) - INTEGER , INTENT(IN) :: NSNOW !maximum no. of snow layers - INTEGER , INTENT(IN) :: NSOIL !number of soil layers - REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: SNICE !snow ice mass (kg/m2) - REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: SNLIQ !snow liq mass (kg/m2) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !snow/soil layer thickness [m] - -! outputs - - REAL, DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: CVSNO !volumetric specific heat (j/m3/k) - REAL, DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: TKSNO !thermal conductivity (w/m/k) - REAL, DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: SNICEV !partial volume of ice [m3/m3] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: SNLIQV !partial volume of liquid water [m3/m3] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(OUT) :: EPORE !effective porosity [m3/m3] - -! locals - - INTEGER :: IZ - REAL, DIMENSION(-NSNOW+1: 0) :: BDSNOI !bulk density of snow(kg/m3) - -!--------------------------------------------------------------------------------------------------- -! thermal capacity of snow - - DO IZ = ISNOW+1, 0 - SNICEV(IZ) = MIN(1.0, SNICE(IZ)/(DZSNSO(IZ)*DENICE) ) - EPORE(IZ) = 1.0 - SNICEV(IZ) - SNLIQV(IZ) = MIN(EPORE(IZ),SNLIQ(IZ)/(DZSNSO(IZ)*DENH2O)) - ENDDO - - DO IZ = ISNOW+1, 0 - BDSNOI(IZ) = (SNICE(IZ)+SNLIQ(IZ))/DZSNSO(IZ) - CVSNO(IZ) = CICE*SNICEV(IZ)+CWAT*SNLIQV(IZ) -! CVSNO(IZ) = 0.525E06 ! constant - enddo - -! thermal conductivity of snow - - DO IZ = ISNOW+1, 0 - TKSNO(IZ) = 3.2217E-6*BDSNOI(IZ)**2.0 ! Stieglitz(yen,1965) -! TKSNO(IZ) = 2E-2+2.5E-6*BDSNOI(IZ)*BDSNOI(IZ) ! Anderson, 1976 -! TKSNO(IZ) = 0.35 ! constant -! TKSNO(IZ) = 2.576E-6*BDSNOI(IZ)**2. + 0.074 ! Verseghy (1991) -! TKSNO(IZ) = 2.22*(BDSNOI(IZ)/1000.)**1.88 ! Douvill(Yen, 1981) - ENDDO - - END SUBROUTINE CSNOW - -!== begin tdfcnd =================================================================================== - - SUBROUTINE TDFCND (parameters, ISOIL, DF, SMC, SH2O) -! -------------------------------------------------------------------------------------------------- -! Calculate thermal diffusivity and conductivity of the soil. -! Peters-Lidard approach (Peters-Lidard et al., 1998) -! -------------------------------------------------------------------------------------------------- -! Code history: -! June 2001 changes: frozen soil condition. -! -------------------------------------------------------------------------------------------------- - IMPLICIT NONE - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: ISOIL ! soil layer - REAL, INTENT(IN) :: SMC ! total soil water - REAL, INTENT(IN) :: SH2O ! liq. soil water - REAL, INTENT(OUT) :: DF ! thermal diffusivity - -! local variables - REAL :: AKE - REAL :: GAMMD - REAL :: THKDRY - REAL :: THKO ! thermal conductivity for other soil components - REAL :: THKQTZ ! thermal conductivity for quartz - REAL :: THKSAT ! - REAL :: THKS ! thermal conductivity for the solids - REAL :: THKW ! water thermal conductivity - REAL :: SATRATIO - REAL :: XU - REAL :: XUNFROZ -! -------------------------------------------------------------------------------------------------- -! We now get quartz as an input argument (set in routine redprm): -! DATA QUARTZ /0.82, 0.10, 0.25, 0.60, 0.52, -! & 0.35, 0.60, 0.40, 0.82/ -! -------------------------------------------------------------------------------------------------- -! If the soil has any moisture content compute a partial sum/product -! otherwise use a constant value which works well with most soils -! -------------------------------------------------------------------------------------------------- -! QUARTZ ....QUARTZ CONTENT (SOIL TYPE DEPENDENT) -! -------------------------------------------------------------------------------------------------- -! USE AS IN PETERS-LIDARD, 1998 (MODIF. FROM JOHANSEN, 1975). - -! PABLO GRUNMANN, 08/17/98 -! Refs.: -! Farouki, O.T.,1986: Thermal properties of soils. Series on Rock -! and Soil Mechanics, Vol. 11, Trans Tech, 136 pp. -! Johansen, O., 1975: Thermal conductivity of soils. PH.D. Thesis, -! University of Trondheim, -! Peters-Lidard, C. D., et al., 1998: The effect of soil thermal -! conductivity parameterization on surface energy fluxes -! and temperatures. Journal of The Atmospheric Sciences, -! Vol. 55, pp. 1209-1224. -! -------------------------------------------------------------------------------------------------- -! NEEDS PARAMETERS -! POROSITY(SOIL TYPE): -! POROS = SMCMAX -! SATURATION RATIO: -! PARAMETERS W/(M.K) - SATRATIO = SMC / parameters%SMCMAX(ISOIL) - THKW = 0.57 -! IF (QUARTZ .LE. 0.2) THKO = 3.0 - THKO = 2.0 -! SOLIDS' CONDUCTIVITY -! QUARTZ' CONDUCTIVITY - THKQTZ = 7.7 - -! UNFROZEN FRACTION (FROM 1., i.e., 100%LIQUID, TO 0. (100% FROZEN)) - THKS = (THKQTZ ** parameters%QUARTZ(ISOIL))* (THKO ** (1.0 - parameters%QUARTZ(ISOIL))) - -! UNFROZEN VOLUME FOR SATURATION (POROSITY*XUNFROZ) - XUNFROZ = 1.0 ! Prevent divide by zero (suggested by D. Mocko) - IF(SMC > 0.0) XUNFROZ = SH2O / SMC -! SATURATED THERMAL CONDUCTIVITY - XU = XUNFROZ * parameters%SMCMAX(ISOIL) - -! DRY DENSITY IN KG/M3 - THKSAT = THKS ** (1.0 - parameters%SMCMAX(ISOIL))* TKICE ** (parameters%SMCMAX(ISOIL) - XU)* THKW ** & - (XU) - -! DRY THERMAL CONDUCTIVITY IN W.M-1.K-1 - GAMMD = (1.0 - parameters%SMCMAX(ISOIL))*2700.0 - - THKDRY = (0.135* GAMMD+ 64.7)/ (2700.0 - 0.947* GAMMD) -! FROZEN - IF ( (SH2O + 0.0005) < SMC ) THEN - AKE = SATRATIO -! UNFROZEN -! RANGE OF VALIDITY FOR THE KERSTEN NUMBER (AKE) - ELSE - -! KERSTEN NUMBER (USING "FINE" FORMULA, VALID FOR SOILS CONTAINING AT -! LEAST 5% OF PARTICLES WITH DIAMETER LESS THAN 2.E-6 METERS.) -! (FOR "COARSE" FORMULA, SEE PETERS-LIDARD ET AL., 1998). - - IF ( SATRATIO > 0.1 ) THEN - - AKE = LOG10 (SATRATIO) + 1.0 - -! USE K = KDRY - ELSE - - AKE = 0.0 - END IF -! THERMAL CONDUCTIVITY - - END IF - - DF = AKE * (THKSAT - THKDRY) + THKDRY - - - end subroutine TDFCND - -!== begin radiation ================================================================================ - - SUBROUTINE RADIATION (parameters,VEGTYP ,IST ,ICE ,NSOIL , & !in - SNEQVO ,SNEQV ,DT ,COSZ ,SNOWH , & !in - TG ,TV ,FSNO ,QSNOW ,FWET , & !in - ELAI ,ESAI ,SMC ,SOLAD ,SOLAI , & !in - FVEG ,ILOC ,JLOC , & !in - ALBOLD ,TAUSS , & !inout - FSUN ,LAISUN ,LAISHA ,PARSUN ,PARSHA , & !out - SAV ,SAG ,FSR ,FSA ,FSRV , & - FSRG ,ALBSND ,ALBSNI ,BGAP ,WGAP ) !out -! -------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------------- -! input - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: ILOC - INTEGER, INTENT(IN) :: JLOC - INTEGER, INTENT(IN) :: VEGTYP !vegetation type - INTEGER, INTENT(IN) :: IST !surface type - INTEGER, INTENT(IN) :: ICE !ice (ice = 1) - INTEGER, INTENT(IN) :: NSOIL !number of soil layers - - REAL, INTENT(IN) :: DT !time step [s] - REAL, INTENT(IN) :: QSNOW !snowfall (mm/s) - REAL, INTENT(IN) :: SNEQVO !snow mass at last time step(mm) - REAL, INTENT(IN) :: SNEQV !snow mass (mm) - REAL, INTENT(IN) :: SNOWH !snow height (mm) - REAL, INTENT(IN) :: COSZ !cosine solar zenith angle (0-1) - REAL, INTENT(IN) :: TG !ground temperature (k) - REAL, INTENT(IN) :: TV !vegetation temperature (k) - REAL, INTENT(IN) :: ELAI !LAI, one-sided, adjusted for burying by snow - REAL, INTENT(IN) :: ESAI !SAI, one-sided, adjusted for burying by snow - REAL, INTENT(IN) :: FWET !fraction of canopy that is wet - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SMC !volumetric soil water [m3/m3] - REAL, DIMENSION(1:2) , INTENT(IN) :: SOLAD !incoming direct solar radiation (w/m2) - REAL, DIMENSION(1:2) , INTENT(IN) :: SOLAI !incoming diffuse solar radiation (w/m2) - REAL, INTENT(IN) :: FSNO !snow cover fraction (-) - REAL, INTENT(IN) :: FVEG !green vegetation fraction [0.0-1.0] - -! inout - REAL, INTENT(INOUT) :: ALBOLD !snow albedo at last time step (CLASS type) - REAL, INTENT(INOUT) :: TAUSS !non-dimensional snow age. - -! output - REAL, INTENT(OUT) :: FSUN !sunlit fraction of canopy (-) - REAL, INTENT(OUT) :: LAISUN !sunlit leaf area (-) - REAL, INTENT(OUT) :: LAISHA !shaded leaf area (-) - REAL, INTENT(OUT) :: PARSUN !average absorbed par for sunlit leaves (w/m2) - REAL, INTENT(OUT) :: PARSHA !average absorbed par for shaded leaves (w/m2) - REAL, INTENT(OUT) :: SAV !solar radiation absorbed by vegetation (w/m2) - REAL, INTENT(OUT) :: SAG !solar radiation absorbed by ground (w/m2) - REAL, INTENT(OUT) :: FSA !total absorbed solar radiation (w/m2) - REAL, INTENT(OUT) :: FSR !total reflected solar radiation (w/m2) - -!jref:start - REAL, INTENT(OUT) :: FSRV !veg. reflected solar radiation (w/m2) - REAL, INTENT(OUT) :: FSRG !ground reflected solar radiation (w/m2) - REAL, INTENT(OUT) :: BGAP - REAL, INTENT(OUT) :: WGAP - REAL, DIMENSION(1:2), INTENT(OUT) :: ALBSND !snow albedo (direct) - REAL, DIMENSION(1:2), INTENT(OUT) :: ALBSNI !snow albedo (diffuse) -!jref:end - -! local - REAL :: FAGE !snow age function (0 - new snow) - REAL, DIMENSION(1:2) :: ALBGRD !ground albedo (direct) - REAL, DIMENSION(1:2) :: ALBGRI !ground albedo (diffuse) - REAL, DIMENSION(1:2) :: ALBD !surface albedo (direct) - REAL, DIMENSION(1:2) :: ALBI !surface albedo (diffuse) - REAL, DIMENSION(1:2) :: FABD !flux abs by veg (per unit direct flux) - REAL, DIMENSION(1:2) :: FABI !flux abs by veg (per unit diffuse flux) - REAL, DIMENSION(1:2) :: FTDD !down direct flux below veg (per unit dir flux) - REAL, DIMENSION(1:2) :: FTID !down diffuse flux below veg (per unit dir flux) - REAL, DIMENSION(1:2) :: FTII !down diffuse flux below veg (per unit dif flux) -!jref:start - REAL, DIMENSION(1:2) :: FREVI - REAL, DIMENSION(1:2) :: FREVD - REAL, DIMENSION(1:2) :: FREGI - REAL, DIMENSION(1:2) :: FREGD -!jref:end - - REAL :: FSHA !shaded fraction of canopy - REAL :: VAI !total LAI + stem area index, one sided - - REAL,PARAMETER :: MPE = 1.0E-6 - LOGICAL VEG !true: vegetated for surface temperature calculation - -! -------------------------------------------------------------------------------------------------- - -! surface abeldo - - CALL ALBEDO (parameters,VEGTYP ,IST ,ICE ,NSOIL , & !in - DT ,COSZ ,FAGE ,ELAI ,ESAI , & !in - TG ,TV ,SNOWH ,FSNO ,FWET , & !in - SMC ,SNEQVO ,SNEQV ,QSNOW ,FVEG , & !in - ILOC ,JLOC , & !in - ALBOLD ,TAUSS , & !inout - ALBGRD ,ALBGRI ,ALBD ,ALBI ,FABD , & !out - FABI ,FTDD ,FTID ,FTII ,FSUN , & !) !out - FREVI ,FREVD ,FREGD ,FREGI ,BGAP , & !inout - WGAP ,ALBSND ,ALBSNI ) - -! surface radiation - - FSHA = 1.0-FSUN - LAISUN = ELAI*FSUN - LAISHA = ELAI*FSHA - VAI = ELAI+ ESAI - IF (VAI .GT. 0.0) THEN - VEG = .TRUE. - ELSE - VEG = .FALSE. - END IF - - CALL SURRAD (parameters,MPE ,FSUN ,FSHA ,ELAI ,VAI , & !in - LAISUN ,LAISHA ,SOLAD ,SOLAI ,FABD , & !in - FABI ,FTDD ,FTID ,FTII ,ALBGRD , & !in - ALBGRI ,ALBD ,ALBI ,ILOC ,JLOC , & !in - PARSUN ,PARSHA ,SAV ,SAG ,FSA , & !out - FSR , & !out - FREVI ,FREVD ,FREGD ,FREGI ,FSRV , & !inout - FSRG) - - END SUBROUTINE RADIATION - -!== begin albedo =================================================================================== - - SUBROUTINE ALBEDO (parameters,VEGTYP ,IST ,ICE ,NSOIL , & !in - DT ,COSZ ,FAGE ,ELAI ,ESAI , & !in - TG ,TV ,SNOWH ,FSNO ,FWET , & !in - SMC ,SNEQVO ,SNEQV ,QSNOW ,FVEG , & !in - ILOC ,JLOC , & !in - ALBOLD ,TAUSS , & !inout - ALBGRD ,ALBGRI ,ALBD ,ALBI ,FABD , & !out - FABI ,FTDD ,FTID ,FTII ,FSUN , & !out - FREVI ,FREVD ,FREGD ,FREGI ,BGAP , & !out - WGAP ,ALBSND ,ALBSNI ) - -! -------------------------------------------------------------------------------------------------- -! surface albedos. also fluxes (per unit incoming direct and diffuse -! radiation) reflected, transmitted, and absorbed by vegetation. -! also sunlit fraction of the canopy. -! -------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------------- -! input - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: ILOC - INTEGER, INTENT(IN) :: JLOC - INTEGER, INTENT(IN) :: NSOIL !number of soil layers - INTEGER, INTENT(IN) :: VEGTYP !vegetation type - INTEGER, INTENT(IN) :: IST !surface type - INTEGER, INTENT(IN) :: ICE !ice (ice = 1) - - REAL, INTENT(IN) :: DT !time step [sec] - REAL, INTENT(IN) :: QSNOW !snowfall - REAL, INTENT(IN) :: COSZ !cosine solar zenith angle for next time step - REAL, INTENT(IN) :: SNOWH !snow height (mm) - REAL, INTENT(IN) :: TG !ground temperature (k) - REAL, INTENT(IN) :: TV !vegetation temperature (k) - REAL, INTENT(IN) :: ELAI !LAI, one-sided, adjusted for burying by snow - REAL, INTENT(IN) :: ESAI !SAI, one-sided, adjusted for burying by snow - REAL, INTENT(IN) :: FSNO !fraction of grid covered by snow - REAL, INTENT(IN) :: FWET !fraction of canopy that is wet - REAL, INTENT(IN) :: SNEQVO !snow mass at last time step(mm) - REAL, INTENT(IN) :: SNEQV !snow mass (mm) - REAL, INTENT(IN) :: FVEG !green vegetation fraction [0.0-1.0] - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SMC !volumetric soil water (m3/m3) - -! inout - REAL, INTENT(INOUT) :: ALBOLD !snow albedo at last time step (CLASS type) - REAL, INTENT(INOUT) :: TAUSS !non-dimensional snow age - -! output - REAL, DIMENSION(1: 2), INTENT(OUT) :: ALBGRD !ground albedo (direct) - REAL, DIMENSION(1: 2), INTENT(OUT) :: ALBGRI !ground albedo (diffuse) - REAL, DIMENSION(1: 2), INTENT(OUT) :: ALBD !surface albedo (direct) - REAL, DIMENSION(1: 2), INTENT(OUT) :: ALBI !surface albedo (diffuse) - REAL, DIMENSION(1: 2), INTENT(OUT) :: FABD !flux abs by veg (per unit direct flux) - REAL, DIMENSION(1: 2), INTENT(OUT) :: FABI !flux abs by veg (per unit diffuse flux) - REAL, DIMENSION(1: 2), INTENT(OUT) :: FTDD !down direct flux below veg (per unit dir flux) - REAL, DIMENSION(1: 2), INTENT(OUT) :: FTID !down diffuse flux below veg (per unit dir flux) - REAL, DIMENSION(1: 2), INTENT(OUT) :: FTII !down diffuse flux below veg (per unit dif flux) - REAL, INTENT(OUT) :: FSUN !sunlit fraction of canopy (-) -!jref:start - REAL, DIMENSION(1: 2), INTENT(OUT) :: FREVD - REAL, DIMENSION(1: 2), INTENT(OUT) :: FREVI - REAL, DIMENSION(1: 2), INTENT(OUT) :: FREGD - REAL, DIMENSION(1: 2), INTENT(OUT) :: FREGI - REAL, INTENT(OUT) :: BGAP - REAL, INTENT(OUT) :: WGAP -!jref:end - -! ------------------------------------------------------------------------ -! ------------------------ local variables ------------------------------- -! local - REAL :: FAGE !snow age function - REAL :: ALB - INTEGER :: IB !indices - INTEGER :: NBAND !number of solar radiation wave bands - INTEGER :: IC !direct beam: ic=0; diffuse: ic=1 - - REAL :: WL !fraction of LAI+SAI that is LAI - REAL :: WS !fraction of LAI+SAI that is SAI - REAL :: MPE !prevents overflow for division by zero - - REAL, DIMENSION(1:2) :: RHO !leaf/stem reflectance weighted by fraction LAI and SAI - REAL, DIMENSION(1:2) :: TAU !leaf/stem transmittance weighted by fraction LAI and SAI - REAL, DIMENSION(1:2) :: FTDI !down direct flux below veg per unit dif flux = 0 - REAL, DIMENSION(1:2), INTENT(OUT) :: ALBSND !snow albedo (direct) - REAL, DIMENSION(1:2), INTENT(OUT) :: ALBSNI !snow albedo (diffuse) - - REAL :: VAI !ELAI+ESAI - REAL :: GDIR !average projected leaf/stem area in solar direction - REAL :: EXT !optical depth direct beam per unit leaf + stem area - -! -------------------------------------------------------------------------------------------------- - - NBAND = 2 - MPE = 1.0E-06 - BGAP = 0.0 - WGAP = 0.0 - -! initialize output because solar radiation only done if COSZ > 0 - - DO IB = 1, NBAND - ALBD(IB) = 0.0 - ALBI(IB) = 0.0 - ALBGRD(IB) = 0.0 - ALBGRI(IB) = 0.0 - ALBSND(IB) = 0.0 - ALBSNI(IB) = 0.0 - FABD(IB) = 0.0 - FABI(IB) = 0.0 - FTDD(IB) = 0.0 - FTID(IB) = 0.0 - FTII(IB) = 0.0 - IF (IB.EQ.1) FSUN = 0.0 - END DO - - IF(COSZ <= 0) GOTO 100 - -! weight reflectance/transmittance by LAI and SAI - - DO IB = 1, NBAND - VAI = ELAI + ESAI - WL = ELAI / MAX(VAI,MPE) - WS = ESAI / MAX(VAI,MPE) - RHO(IB) = MAX(parameters%RHOL(IB)*WL+parameters%RHOS(IB)*WS, MPE) - TAU(IB) = MAX(parameters%TAUL(IB)*WL+parameters%TAUS(IB)*WS, MPE) - END DO - -! snow age - - CALL SNOW_AGE (parameters,DT,TG,SNEQVO,SNEQV,TAUSS,FAGE) - -! snow albedos: only if COSZ > 0 and FSNO > 0 - - IF(OPT_ALB == 1) & - CALL SNOWALB_BATS (parameters,NBAND, FSNO,COSZ,FAGE,ALBSND,ALBSNI) - IF(OPT_ALB == 2) THEN - CALL SNOWALB_CLASS (parameters,NBAND,QSNOW,DT,ALB,ALBOLD,ALBSND,ALBSNI,ILOC,JLOC) - ALBOLD = ALB - END IF - -! ground surface albedo - - CALL GROUNDALB (parameters,NSOIL ,NBAND ,ICE ,IST , & !in - FSNO ,SMC ,ALBSND ,ALBSNI ,COSZ , & !in - TG ,ILOC ,JLOC , & !in - ALBGRD ,ALBGRI ) !out - -! loop over NBAND wavebands to calculate surface albedos and solar -! fluxes for unit incoming direct (IC=0) and diffuse flux (IC=1) - - DO IB = 1, NBAND - IC = 0 ! direct - CALL TWOSTREAM (parameters,IB ,IC ,VEGTYP ,COSZ ,VAI , & !in - FWET ,TV ,ALBGRD ,ALBGRI ,RHO , & !in - TAU ,FVEG ,IST ,ILOC ,JLOC , & !in - FABD ,ALBD ,FTDD ,FTID ,GDIR , &!) !out - FREVD ,FREGD ,BGAP ,WGAP) - - IC = 1 ! diffuse - CALL TWOSTREAM (parameters,IB ,IC ,VEGTYP ,COSZ ,VAI , & !in - FWET ,TV ,ALBGRD ,ALBGRI ,RHO , & !in - TAU ,FVEG ,IST ,ILOC ,JLOC , & !in - FABI ,ALBI ,FTDI ,FTII ,GDIR , & !) !out - FREVI ,FREGI ,BGAP ,WGAP) - - END DO - -! sunlit fraction of canopy. set FSUN = 0 if FSUN < 0.01. - - EXT = GDIR/COSZ * SQRT(1.0-RHO(1)-TAU(1)) - FSUN = (1.0-EXP(-EXT*VAI)) / MAX(EXT*VAI,MPE) - EXT = FSUN - - IF (EXT .LT. 0.01) THEN - WL = 0.0 - ELSE - WL = EXT - END IF - FSUN = WL - -100 CONTINUE - - END SUBROUTINE ALBEDO - -!== begin surrad =================================================================================== - - SUBROUTINE SURRAD (parameters,MPE ,FSUN ,FSHA ,ELAI ,VAI , & !in - LAISUN ,LAISHA ,SOLAD ,SOLAI ,FABD , & !in - FABI ,FTDD ,FTID ,FTII ,ALBGRD , & !in - ALBGRI ,ALBD ,ALBI ,ILOC ,JLOC , & !in - PARSUN ,PARSHA ,SAV ,SAG ,FSA , & !out - FSR , & !) !out - FREVI ,FREVD ,FREGD ,FREGI ,FSRV , & - FSRG) !inout - -! -------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------------- -! input - - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: ILOC - INTEGER, INTENT(IN) :: JLOC - REAL, INTENT(IN) :: MPE !prevents underflow errors if division by zero - - REAL, INTENT(IN) :: FSUN !sunlit fraction of canopy - REAL, INTENT(IN) :: FSHA !shaded fraction of canopy - REAL, INTENT(IN) :: ELAI !leaf area, one-sided - REAL, INTENT(IN) :: VAI !leaf + stem area, one-sided - REAL, INTENT(IN) :: LAISUN !sunlit leaf area index, one-sided - REAL, INTENT(IN) :: LAISHA !shaded leaf area index, one-sided - - REAL, DIMENSION(1:2), INTENT(IN) :: SOLAD !incoming direct solar radiation (w/m2) - REAL, DIMENSION(1:2), INTENT(IN) :: SOLAI !incoming diffuse solar radiation (w/m2) - REAL, DIMENSION(1:2), INTENT(IN) :: FABD !flux abs by veg (per unit incoming direct flux) - REAL, DIMENSION(1:2), INTENT(IN) :: FABI !flux abs by veg (per unit incoming diffuse flux) - REAL, DIMENSION(1:2), INTENT(IN) :: FTDD !down dir flux below veg (per incoming dir flux) - REAL, DIMENSION(1:2), INTENT(IN) :: FTID !down dif flux below veg (per incoming dir flux) - REAL, DIMENSION(1:2), INTENT(IN) :: FTII !down dif flux below veg (per incoming dif flux) - REAL, DIMENSION(1:2), INTENT(IN) :: ALBGRD !ground albedo (direct) - REAL, DIMENSION(1:2), INTENT(IN) :: ALBGRI !ground albedo (diffuse) - REAL, DIMENSION(1:2), INTENT(IN) :: ALBD !overall surface albedo (direct) - REAL, DIMENSION(1:2), INTENT(IN) :: ALBI !overall surface albedo (diffuse) - - REAL, DIMENSION(1:2), INTENT(IN) :: FREVD !overall surface albedo veg (direct) - REAL, DIMENSION(1:2), INTENT(IN) :: FREVI !overall surface albedo veg (diffuse) - REAL, DIMENSION(1:2), INTENT(IN) :: FREGD !overall surface albedo grd (direct) - REAL, DIMENSION(1:2), INTENT(IN) :: FREGI !overall surface albedo grd (diffuse) - -! output - - REAL, INTENT(OUT) :: PARSUN !average absorbed par for sunlit leaves (w/m2) - REAL, INTENT(OUT) :: PARSHA !average absorbed par for shaded leaves (w/m2) - REAL, INTENT(OUT) :: SAV !solar radiation absorbed by vegetation (w/m2) - REAL, INTENT(OUT) :: SAG !solar radiation absorbed by ground (w/m2) - REAL, INTENT(OUT) :: FSA !total absorbed solar radiation (w/m2) - REAL, INTENT(OUT) :: FSR !total reflected solar radiation (w/m2) - REAL, INTENT(OUT) :: FSRV !reflected solar radiation by vegetation - REAL, INTENT(OUT) :: FSRG !reflected solar radiation by ground - -! ------------------------ local variables ---------------------------------------------------- - INTEGER :: IB !waveband number (1=vis, 2=nir) - INTEGER :: NBAND !number of solar radiation waveband classes - - REAL :: ABS !absorbed solar radiation (w/m2) - REAL :: RNIR !reflected solar radiation [nir] (w/m2) - REAL :: RVIS !reflected solar radiation [vis] (w/m2) - REAL :: LAIFRA !leaf area fraction of canopy - REAL :: TRD !transmitted solar radiation: direct (w/m2) - REAL :: TRI !transmitted solar radiation: diffuse (w/m2) - REAL, DIMENSION(1:2) :: CAD !direct beam absorbed by canopy (w/m2) - REAL, DIMENSION(1:2) :: CAI !diffuse radiation absorbed by canopy (w/m2) -! --------------------------------------------------------------------------------------------- - NBAND = 2 - -! zero summed solar fluxes - - SAG = 0.0 - SAV = 0.0 - FSA = 0.0 - -! loop over nband wavebands - - DO IB = 1, NBAND - -! absorbed by canopy - - CAD(IB) = SOLAD(IB)*FABD(IB) - CAI(IB) = SOLAI(IB)*FABI(IB) - SAV = SAV + CAD(IB) + CAI(IB) - FSA = FSA + CAD(IB) + CAI(IB) - -! transmitted solar fluxes incident on ground - - TRD = SOLAD(IB)*FTDD(IB) - TRI = SOLAD(IB)*FTID(IB) + SOLAI(IB)*FTII(IB) - -! solar radiation absorbed by ground surface - - ABS = TRD*(1.0-ALBGRD(IB)) + TRI*(1.0-ALBGRI(IB)) - SAG = SAG + ABS - FSA = FSA + ABS - END DO - -! partition visible canopy absorption to sunlit and shaded fractions -! to get average absorbed par for sunlit and shaded leaves - - LAIFRA = ELAI / MAX(VAI,MPE) - IF (FSUN .GT. 0.0) THEN - PARSUN = (CAD(1)+FSUN*CAI(1)) * LAIFRA / MAX(LAISUN,MPE) - PARSHA = (FSHA*CAI(1))*LAIFRA / MAX(LAISHA,MPE) - ELSE - PARSUN = 0.0 - PARSHA = (CAD(1)+CAI(1))*LAIFRA /MAX(LAISHA,MPE) - ENDIF - -! reflected solar radiation - - RVIS = ALBD(1)*SOLAD(1) + ALBI(1)*SOLAI(1) - RNIR = ALBD(2)*SOLAD(2) + ALBI(2)*SOLAI(2) - FSR = RVIS + RNIR - -! reflected solar radiation of veg. and ground (combined ground) - FSRV = FREVD(1)*SOLAD(1)+FREVI(1)*SOLAI(1)+FREVD(2)*SOLAD(2)+FREVI(2)*SOLAI(2) - FSRG = FREGD(1)*SOLAD(1)+FREGI(1)*SOLAI(1)+FREGD(2)*SOLAD(2)+FREGI(2)*SOLAI(2) - - - END SUBROUTINE SURRAD - -!== begin snow_age ================================================================================= - - SUBROUTINE SNOW_AGE (parameters,DT,TG,SNEQVO,SNEQV,TAUSS,FAGE) -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ------------------------ code history ------------------------------------------------------------ -! from BATS -! ------------------------ input/output variables -------------------------------------------------- -!input - type (noahmp_parameters), intent(in) :: parameters - REAL, INTENT(IN) :: DT !main time step (s) - REAL, INTENT(IN) :: TG !ground temperature (k) - REAL, INTENT(IN) :: SNEQVO !snow mass at last time step(mm) - REAL, INTENT(IN) :: SNEQV !snow water per unit ground area (mm) - -!output - REAL, INTENT(OUT) :: FAGE !snow age - -!input/output - REAL, INTENT(INOUT) :: TAUSS !non-dimensional snow age -!local - REAL :: TAGE !total aging effects - REAL :: AGE1 !effects of grain growth due to vapor diffusion - REAL :: AGE2 !effects of grain growth at freezing of melt water - REAL :: AGE3 !effects of soot - REAL :: DELA !temporary variable - REAL :: SGE !temporary variable - REAL :: DELS !temporary variable - REAL :: DELA0 !temporary variable - REAL :: ARG !temporary variable -! See Yang et al. (1997) J.of Climate for detail. -!--------------------------------------------------------------------------------------------------- - - IF(SNEQV.LE.0.0) THEN - TAUSS = 0.0 - ELSE - DELA0 = DT/parameters%TAU0 - ARG = parameters%GRAIN_GROWTH*(1.0/TFRZ-1.0/TG) - AGE1 = EXP(ARG) - AGE2 = EXP(AMIN1(0.0,parameters%EXTRA_GROWTH*ARG)) - AGE3 = parameters%DIRT_SOOT - TAGE = AGE1+AGE2+AGE3 - DELA = DELA0*TAGE - DELS = AMAX1(0.0,SNEQV-SNEQVO) / parameters%SWEMX - SGE = (TAUSS+DELA)*(1.0-DELS) - TAUSS = AMAX1(0.0,SGE) - ENDIF - - FAGE= TAUSS/(TAUSS+1.0) - - END SUBROUTINE SNOW_AGE - -!== begin snowalb_bats ============================================================================= - - SUBROUTINE SNOWALB_BATS (parameters,NBAND,FSNO,COSZ,FAGE,ALBSND,ALBSNI) -! -------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------------- -! input - - type (noahmp_parameters), intent(in) :: parameters - INTEGER,INTENT(IN) :: NBAND !number of waveband classes - - REAL,INTENT(IN) :: COSZ !cosine solar zenith angle - REAL,INTENT(IN) :: FSNO !snow cover fraction (-) - REAL,INTENT(IN) :: FAGE !snow age correction - -! output - - REAL, DIMENSION(1:2),INTENT(OUT) :: ALBSND !snow albedo for direct(1=vis, 2=nir) - REAL, DIMENSION(1:2),INTENT(OUT) :: ALBSNI !snow albedo for diffuse -! --------------------------------------------------------------------------------------------- - -! ------------------------ local variables ---------------------------------------------------- - INTEGER :: IB !waveband class - - REAL :: FZEN !zenith angle correction - REAL :: CF1 !temperary variable - REAL :: SL2 !2.*SL - REAL :: SL1 !1/SL - REAL :: SL !adjustable parameter -! REAL, PARAMETER :: C1 = 0.2 !default in BATS -! REAL, PARAMETER :: C2 = 0.5 !default in BATS -! REAL, PARAMETER :: C1 = 0.2 * 2. ! double the default to match Sleepers River's -! REAL, PARAMETER :: C2 = 0.5 * 2. ! snow surface albedo (double aging effects) -! --------------------------------------------------------------------------------------------- -! zero albedos for all points - - ALBSND(1: NBAND) = 0.0 - ALBSNI(1: NBAND) = 0.0 - -! when cosz > 0 - - SL=parameters%BATS_COSZ - SL1=1.0/SL - SL2=2.0*SL - CF1=((1.0+SL1)/(1.0+SL2*COSZ)-SL1) - FZEN=AMAX1(CF1,0.0) - - ALBSNI(1)=parameters%BATS_VIS_NEW*(1.0-parameters%BATS_VIS_AGE*FAGE) - ALBSNI(2)=parameters%BATS_NIR_NEW*(1.0-parameters%BATS_NIR_AGE*FAGE) - - ALBSND(1)=ALBSNI(1)+parameters%BATS_VIS_DIR*FZEN*(1.0-ALBSNI(1)) ! vis direct - ALBSND(2)=ALBSNI(2)+parameters%BATS_NIR_DIR*FZEN*(1.0-ALBSNI(2)) ! nir direct - - END SUBROUTINE SNOWALB_BATS - -!== begin snowalb_class ============================================================================ - - SUBROUTINE SNOWALB_CLASS (parameters,NBAND,QSNOW,DT,ALB,ALBOLD,ALBSND,ALBSNI,ILOC,JLOC) -! ---------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------------- -! input - - type (noahmp_parameters), intent(in) :: parameters - INTEGER,INTENT(IN) :: ILOC !grid index - INTEGER,INTENT(IN) :: JLOC !grid index - INTEGER,INTENT(IN) :: NBAND !number of waveband classes - - REAL,INTENT(IN) :: QSNOW !snowfall (mm/s) - REAL,INTENT(IN) :: DT !time step (sec) - REAL,INTENT(IN) :: ALBOLD !snow albedo at last time step - -! in & out - - REAL, INTENT(INOUT) :: ALB ! -! output - - REAL, DIMENSION(1:2),INTENT(OUT) :: ALBSND !snow albedo for direct(1=vis, 2=nir) - REAL, DIMENSION(1:2),INTENT(OUT) :: ALBSNI !snow albedo for diffuse -! --------------------------------------------------------------------------------------------- - -! ------------------------ local variables ---------------------------------------------------- - INTEGER :: IB !waveband class - -! --------------------------------------------------------------------------------------------- -! zero albedos for all points - - ALBSND(1: NBAND) = 0.0 - ALBSNI(1: NBAND) = 0.0 - -! when cosz > 0 - - ALB = 0.55 + (ALBOLD-0.55) * EXP(-0.01*DT/3600.0) - -! 1 mm fresh snow(SWE) -- 10mm snow depth, assumed the fresh snow density 100kg/m3 -! here assume 1cm snow depth will fully cover the old snow - - IF (QSNOW > 0.0) then - ALB = ALB + MIN(QSNOW,parameters%SWEMX/DT) * (0.84-ALB)/(parameters%SWEMX/DT) - ENDIF - - ALBSNI(1)= ALB ! vis diffuse - ALBSNI(2)= ALB ! nir diffuse - ALBSND(1)= ALB ! vis direct - ALBSND(2)= ALB ! nir direct - - END SUBROUTINE SNOWALB_CLASS - -!== begin groundalb ================================================================================ - - SUBROUTINE GROUNDALB (parameters,NSOIL ,NBAND ,ICE ,IST , & !in - FSNO ,SMC ,ALBSND ,ALBSNI ,COSZ , & !in - TG ,ILOC ,JLOC , & !in - ALBGRD ,ALBGRI ) !out -! -------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------------- -!input - - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: ILOC !grid index - INTEGER, INTENT(IN) :: JLOC !grid index - INTEGER, INTENT(IN) :: NSOIL !number of soil layers - INTEGER, INTENT(IN) :: NBAND !number of solar radiation waveband classes - INTEGER, INTENT(IN) :: ICE !value of ist for land ice - INTEGER, INTENT(IN) :: IST !surface type - REAL, INTENT(IN) :: FSNO !fraction of surface covered with snow (-) - REAL, INTENT(IN) :: TG !ground temperature (k) - REAL, INTENT(IN) :: COSZ !cosine solar zenith angle (0-1) - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SMC !volumetric soil water content (m3/m3) - REAL, DIMENSION(1: 2), INTENT(IN) :: ALBSND !direct beam snow albedo (vis, nir) - REAL, DIMENSION(1: 2), INTENT(IN) :: ALBSNI !diffuse snow albedo (vis, nir) - -!output - - REAL, DIMENSION(1: 2), INTENT(OUT) :: ALBGRD !ground albedo (direct beam: vis, nir) - REAL, DIMENSION(1: 2), INTENT(OUT) :: ALBGRI !ground albedo (diffuse: vis, nir) - -!local - - INTEGER :: IB !waveband number (1=vis, 2=nir) - REAL :: INC !soil water correction factor for soil albedo - REAL :: ALBSOD !soil albedo (direct) - REAL :: ALBSOI !soil albedo (diffuse) -! -------------------------------------------------------------------------------------------------- - - DO IB = 1, NBAND - INC = MAX(0.11-0.40*SMC(1), 0.0) - IF (IST .EQ. 1) THEN !soil - ALBSOD = MIN(parameters%ALBSAT(IB)+INC,parameters%ALBDRY(IB)) - ALBSOI = ALBSOD - ELSE IF (TG .GT. TFRZ) THEN !unfrozen lake, wetland - ALBSOD = 0.06/(MAX(0.01,COSZ)**1.7 + 0.15) - ALBSOI = 0.06 - ELSE !frozen lake, wetland - ALBSOD = parameters%ALBLAK(IB) - ALBSOI = ALBSOD - END IF - - ALBGRD(IB) = ALBSOD*(1.-FSNO) + ALBSND(IB)*FSNO - ALBGRI(IB) = ALBSOI*(1.-FSNO) + ALBSNI(IB)*FSNO - END DO - - END SUBROUTINE GROUNDALB - -!== begin twostream ================================================================================ - - SUBROUTINE TWOSTREAM (parameters,IB ,IC ,VEGTYP ,COSZ ,VAI , & !in - FWET ,T ,ALBGRD ,ALBGRI ,RHO , & !in - TAU ,FVEG ,IST ,ILOC ,JLOC , & !in - FAB ,FRE ,FTD ,FTI ,GDIR , & !) !out - FREV ,FREG ,BGAP ,WGAP) - -! -------------------------------------------------------------------------------------------------- -! use two-stream approximation of Dickinson (1983) Adv Geophysics -! 25:305-353 and Sellers (1985) Int J Remote Sensing 6:1335-1372 -! to calculate fluxes absorbed by vegetation, reflected by vegetation, -! and transmitted through vegetation for unit incoming direct or diffuse -! flux given an underlying surface with known albedo. -! -------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------------- -! input - - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: ILOC !grid index - INTEGER, INTENT(IN) :: JLOC !grid index - INTEGER, INTENT(IN) :: IST !surface type - INTEGER, INTENT(IN) :: IB !waveband number - INTEGER, INTENT(IN) :: IC !0=unit incoming direct; 1=unit incoming diffuse - INTEGER, INTENT(IN) :: VEGTYP !vegetation type - - REAL, INTENT(IN) :: COSZ !cosine of direct zenith angle (0-1) - REAL, INTENT(IN) :: VAI !one-sided leaf+stem area index (m2/m2) - REAL, INTENT(IN) :: FWET !fraction of lai, sai that is wetted (-) - REAL, INTENT(IN) :: T !surface temperature (k) - - REAL, DIMENSION(1:2), INTENT(IN) :: ALBGRD !direct albedo of underlying surface (-) - REAL, DIMENSION(1:2), INTENT(IN) :: ALBGRI !diffuse albedo of underlying surface (-) - REAL, DIMENSION(1:2), INTENT(IN) :: RHO !leaf+stem reflectance - REAL, DIMENSION(1:2), INTENT(IN) :: TAU !leaf+stem transmittance - REAL, INTENT(IN) :: FVEG !green vegetation fraction [0.0-1.0] - -! output - - REAL, DIMENSION(1:2), INTENT(OUT) :: FAB !flux abs by veg layer (per unit incoming flux) - REAL, DIMENSION(1:2), INTENT(OUT) :: FRE !flux refl above veg layer (per unit incoming flux) - REAL, DIMENSION(1:2), INTENT(OUT) :: FTD !down dir flux below veg layer (per unit in flux) - REAL, DIMENSION(1:2), INTENT(OUT) :: FTI !down dif flux below veg layer (per unit in flux) - REAL, INTENT(OUT) :: GDIR !projected leaf+stem area in solar direction - REAL, DIMENSION(1:2), INTENT(OUT) :: FREV !flux reflected by veg layer (per unit incoming flux) - REAL, DIMENSION(1:2), INTENT(OUT) :: FREG !flux reflected by ground (per unit incoming flux) - -! local - REAL :: OMEGA !fraction of intercepted radiation that is scattered - REAL :: OMEGAL !omega for leaves - REAL :: BETAI !upscatter parameter for diffuse radiation - REAL :: BETAIL !betai for leaves - REAL :: BETAD !upscatter parameter for direct beam radiation - REAL :: BETADL !betad for leaves - REAL :: EXT !optical depth of direct beam per unit leaf area - REAL :: AVMU !average diffuse optical depth - - REAL :: COSZI !0.001 <= cosz <= 1.000 - REAL :: ASU !single scattering albedo - REAL :: CHIL ! -0.4 <= xl <= 0.6 - - REAL :: TMP0,TMP1,TMP2,TMP3,TMP4,TMP5,TMP6,TMP7,TMP8,TMP9 - REAL :: P1,P2,P3,P4,S1,S2,U1,U2,U3 - REAL :: B,C,D,D1,D2,F,H,H1,H2,H3,H4,H5,H6,H7,H8,H9,H10 - REAL :: PHI1,PHI2,SIGMA - REAL :: FTDS,FTIS,FRES - REAL :: DENFVEG - REAL :: VAI_SPREAD -!jref:start - REAL :: FREVEG,FREBAR,FTDVEG,FTIVEG,FTDBAR,FTIBAR - REAL :: THETAZ -!jref:end - -! variables for the modified two-stream scheme -! Niu and Yang (2004), JGR - - REAL, PARAMETER :: PAI = 3.14159265 - REAL :: HD !crown depth (m) - REAL :: BB !vertical crown radius (m) - REAL :: THETAP !angle conversion from SZA - REAL :: FA !foliage volume density (m-1) - REAL :: NEWVAI !effective LSAI (-) - - REAL,INTENT(INOUT) :: BGAP !between canopy gap fraction for beam (-) - REAL,INTENT(INOUT) :: WGAP !within canopy gap fraction for beam (-) - - REAL :: KOPEN !gap fraction for diffue light (-) - REAL :: GAP !total gap fraction for beam ( <=1-shafac ) - -! ----------------------------------------------------------------- -! compute within and between gaps - VAI_SPREAD = VAI - if(VAI == 0.0) THEN - GAP = 1.0 - KOPEN = 1.0 - ELSE - IF(OPT_RAD == 1) THEN - DENFVEG = -LOG(MAX(1.0-FVEG,0.01))/(PAI*parameters%RC**2) - HD = parameters%HVT - parameters%HVB - BB = 0.5 * HD - THETAP = ATAN(BB/parameters%RC * TAN(ACOS(MAX(0.01,COSZ))) ) - ! BGAP = EXP(-parameters%DEN * PAI * parameters%RC**2/COS(THETAP) ) - BGAP = EXP(-DENFVEG * PAI * parameters%RC**2/COS(THETAP) ) - FA = VAI/(1.33 * PAI * parameters%RC**3.0 *(BB/parameters%RC)*DENFVEG) - NEWVAI = HD*FA - WGAP = (1.0-BGAP) * EXP(-0.5*NEWVAI/COSZ) - GAP = MIN(1.0-FVEG, BGAP+WGAP) - - KOPEN = 0.05 - END IF - - IF(OPT_RAD == 2) THEN - GAP = 0.0 - KOPEN = 0.0 - END IF - - IF(OPT_RAD == 3) THEN - GAP = 1.0-FVEG - KOPEN = 1.0-FVEG - END IF - end if - -! calculate two-stream parameters OMEGA, BETAD, BETAI, AVMU, GDIR, EXT. -! OMEGA, BETAD, BETAI are adjusted for snow. values for OMEGA*BETAD -! and OMEGA*BETAI are calculated and then divided by the new OMEGA -! because the product OMEGA*BETAI, OMEGA*BETAD is used in solution. -! also, the transmittances and reflectances (TAU, RHO) are linear -! weights of leaf and stem values. - - COSZI = MAX(0.001, COSZ) - CHIL = MIN( MAX(parameters%XL, -0.4), 0.6) - IF (ABS(CHIL) .LE. 0.01) CHIL = 0.01 - PHI1 = 0.5 - 0.633*CHIL - 0.330*CHIL*CHIL - PHI2 = 0.877 * (1.0-2.0*PHI1) - GDIR = PHI1 + PHI2*COSZI - EXT = GDIR/COSZI - AVMU = ( 1.0 - PHI1/PHI2 * LOG((PHI1+PHI2)/PHI1) ) / PHI2 - OMEGAL = RHO(IB) + TAU(IB) - TMP0 = GDIR + PHI2*COSZI - TMP1 = PHI1*COSZI - ASU = 0.5*OMEGAL*GDIR/TMP0 * ( 1.0-TMP1/TMP0*LOG((TMP1+TMP0)/TMP1) ) - BETADL = (1.0+AVMU*EXT)/(OMEGAL*AVMU*EXT)*ASU - BETAIL = 0.5 * ( RHO(IB)+TAU(IB) + (RHO(IB)-TAU(IB)) & - * ((1.0+CHIL)/2.0)**2 ) / OMEGAL - -! adjust omega, betad, and betai for intercepted snow - - IF (T .GT. TFRZ) THEN !no snow - TMP0 = OMEGAL - TMP1 = BETADL - TMP2 = BETAIL - ELSE - TMP0 = (1.0-FWET)*OMEGAL + FWET*parameters%OMEGAS(IB) - TMP1 = ( (1.0-FWET)*OMEGAL*BETADL + FWET*parameters%OMEGAS(IB)*parameters%BETADS ) / TMP0 - TMP2 = ( (1.0-FWET)*OMEGAL*BETAIL + FWET*parameters%OMEGAS(IB)*parameters%BETAIS ) / TMP0 - END IF - - OMEGA = TMP0 - BETAD = TMP1 - BETAI = TMP2 - -! absorbed, reflected, transmitted fluxes per unit incoming radiation - - B = 1.0 - OMEGA + OMEGA*BETAI - C = OMEGA*BETAI - TMP0 = AVMU*EXT - D = TMP0 * OMEGA*BETAD - F = TMP0 * OMEGA*(1.0-BETAD) - TMP1 = B*B - C*C - H = SQRT(TMP1) / AVMU - SIGMA = TMP0*TMP0 - TMP1 - if ( ABS (SIGMA) < 1.0e-6 ) SIGMA = SIGN(1.0e-6,SIGMA) - P1 = B + AVMU*H - P2 = B - AVMU*H - P3 = B + TMP0 - P4 = B - TMP0 - S1 = EXP(-H*VAI) - S2 = EXP(-EXT*VAI) - IF (IC .EQ. 0) THEN - U1 = B - C/ALBGRD(IB) - U2 = B - C*ALBGRD(IB) - U3 = F + C*ALBGRD(IB) - ELSE - U1 = B - C/ALBGRI(IB) - U2 = B - C*ALBGRI(IB) - U3 = F + C*ALBGRI(IB) - END IF - TMP2 = U1 - AVMU*H - TMP3 = U1 + AVMU*H - D1 = P1*TMP2/S1 - P2*TMP3*S1 - TMP4 = U2 + AVMU*H - TMP5 = U2 - AVMU*H - D2 = TMP4/S1 - TMP5*S1 - H1 = -D*P4 - C*F - TMP6 = D - H1*P3/SIGMA - TMP7 = ( D - C - H1/SIGMA*(U1+TMP0) ) * S2 - H2 = ( TMP6*TMP2/S1 - P2*TMP7 ) / D1 - H3 = - ( TMP6*TMP3*S1 - P1*TMP7 ) / D1 - H4 = -F*P3 - C*D - TMP8 = H4/SIGMA - TMP9 = ( U3 - TMP8*(U2-TMP0) ) * S2 - H5 = - ( TMP8*TMP4/S1 + TMP9 ) / D2 - H6 = ( TMP8*TMP5*S1 + TMP9 ) / D2 - H7 = (C*TMP2) / (D1*S1) - H8 = (-C*TMP3*S1) / D1 - H9 = TMP4 / (D2*S1) - H10 = (-TMP5*S1) / D2 - -! downward direct and diffuse fluxes below vegetation -! Niu and Yang (2004), JGR. - - IF (IC .EQ. 0) THEN - FTDS = S2 *(1.0-GAP) + GAP - FTIS = (H4*S2/SIGMA + H5*S1 + H6/S1)*(1.0-GAP) - ELSE - FTDS = 0.0 - FTIS = (H9*S1 + H10/S1)*(1.0-KOPEN) + KOPEN - END IF - FTD(IB) = FTDS - FTI(IB) = FTIS - -! flux reflected by the surface (veg. and ground) - - IF (IC .EQ. 0) THEN - FRES = (H1/SIGMA + H2 + H3)*(1.0-GAP ) + ALBGRD(IB)*GAP - FREVEG = (H1/SIGMA + H2 + H3)*(1.0-GAP ) - FREBAR = ALBGRD(IB)*GAP !jref - separate veg. and ground reflection - ELSE - FRES = (H7 + H8) *(1.0-KOPEN) + ALBGRI(IB)*KOPEN - FREVEG = (H7 + H8) *(1.0-KOPEN) + ALBGRI(IB)*KOPEN - FREBAR = 0 !jref - separate veg. and ground reflection - END IF - FRE(IB) = FRES - - FREV(IB) = FREVEG - FREG(IB) = FREBAR - -! flux absorbed by vegetation - - FAB(IB) = 1.0 - FRE(IB) - (1.0-ALBGRD(IB))*FTD(IB) & - - (1.0-ALBGRI(IB))*FTI(IB) - - - END SUBROUTINE TWOSTREAM - -!== begin vege_flux ================================================================================ - - SUBROUTINE VEGE_FLUX(parameters,NSNOW ,NSOIL ,ISNOW ,VEGTYP ,VEG , & !in - DT ,SAV ,SAG ,LWDN ,UR , & !in - UU ,VV ,SFCTMP ,THAIR ,QAIR , & !in - EAIR ,RHOAIR ,SNOWH ,VAI ,GAMMAV ,GAMMAG, & !in - FWET ,LAISUN ,LAISHA ,CWP ,DZSNSO , & !in - ZLVL ,ZPD ,Z0M ,FVEG , & !in - Z0MG ,EMV ,EMG ,CANLIQ ,FSNO, & !in - CANICE ,STC ,DF ,RSSUN ,RSSHA , & !in - RSURF ,LATHEAV ,LATHEAG ,PARSUN ,PARSHA ,IGS , & !in - FOLN ,CO2AIR ,O2AIR ,BTRAN ,SFCPRS , & !in - RHSUR ,ILOC ,JLOC ,Q2 ,PAHV ,PAHG , & !in - EAH ,TAH ,TV ,TG ,CM , & !inout - CH ,DX ,DZ8W , & !inout - TAUXV ,TAUYV ,IRG ,IRC ,SHG , & !out - SHC ,EVG ,EVC ,TR ,GH , & !out - T2MV ,PSNSUN ,PSNSHA ,CANHS , & !out - QC ,QSFC ,PSFC , & !in - Q2V ,CAH2 ,CHLEAF ,CHUC, & !inout - SH2O ,JULIAN, SWDOWN, PRCP, FB, FSR, GECROS1D) ! Gecros - -! -------------------------------------------------------------------------------------------------- -! use newton-raphson iteration to solve for vegetation (tv) and -! ground (tg) temperatures that balance the surface energy budgets - -! vegetated: -! -SAV + IRC[TV] + SHC[TV] + EVC[TV] + TR[TV] + CANHS[TV] = 0 -! -SAG + IRG[TG] + SHG[TG] + EVG[TG] + GH[TG] = 0 -! -------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------------- -! input - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: ILOC !grid index - INTEGER, INTENT(IN) :: JLOC !grid index - LOGICAL, INTENT(IN) :: VEG !true if vegetated surface - INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers - INTEGER, INTENT(IN) :: NSOIL !number of soil layers - INTEGER, INTENT(IN) :: ISNOW !actual no. of snow layers - INTEGER, INTENT(IN) :: VEGTYP !vegetation physiology type - REAL, INTENT(IN) :: FVEG !greeness vegetation fraction (-) - REAL, INTENT(INOUT) :: SAV !solar rad absorbed by veg (w/m2) - REAL, INTENT(INOUT) :: SAG !solar rad absorbed by ground (w/m2) - REAL, INTENT(IN) :: LWDN !atmospheric longwave radiation (w/m2) - REAL, INTENT(IN) :: UR !wind speed at height zlvl (m/s) - REAL, INTENT(IN) :: UU !wind speed in eastward dir (m/s) - REAL, INTENT(IN) :: VV !wind speed in northward dir (m/s) - REAL, INTENT(IN) :: SFCTMP !air temperature at reference height (k) - REAL, INTENT(IN) :: THAIR !potential temp at reference height (k) - REAL, INTENT(IN) :: EAIR !vapor pressure air at zlvl (pa) - REAL, INTENT(IN) :: QAIR !specific humidity at zlvl (kg/kg) - REAL, INTENT(IN) :: RHOAIR !density air (kg/m**3) - REAL, INTENT(IN) :: DT !time step (s) - REAL, INTENT(IN) :: FSNO !snow fraction - - REAL, INTENT(IN) :: SNOWH !actual snow depth [m] - REAL, INTENT(IN) :: FWET !wetted fraction of canopy - REAL, INTENT(IN) :: CWP !canopy wind parameter - - REAL, INTENT(IN) :: VAI !total leaf area index + stem area index - REAL, INTENT(IN) :: LAISUN !sunlit leaf area index, one-sided (m2/m2) - REAL, INTENT(IN) :: LAISHA !shaded leaf area index, one-sided (m2/m2) - REAL, INTENT(IN) :: ZLVL !reference height (m) - REAL, INTENT(IN) :: ZPD !zero plane displacement (m) - REAL, INTENT(IN) :: Z0M !roughness length, momentum (m) - REAL, INTENT(IN) :: Z0MG !roughness length, momentum, ground (m) - REAL, INTENT(IN) :: EMV !vegetation emissivity - REAL, INTENT(IN) :: EMG !ground emissivity - - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: STC !soil/snow temperature (k) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DF !thermal conductivity of snow/soil (w/m/k) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !thinkness of snow/soil layers (m) - REAL, INTENT(IN) :: CANLIQ !intercepted liquid water (mm) - REAL, INTENT(IN) :: CANICE !intercepted ice mass (mm) - REAL, INTENT(IN) :: RSURF !ground surface resistance (s/m) -! REAL, INTENT(IN) :: GAMMA !psychrometric constant (pa/K) -! REAL, INTENT(IN) :: LATHEA !latent heat of vaporization/subli (j/kg) - REAL, INTENT(IN) :: GAMMAV !psychrometric constant (pa/K) - REAL, INTENT(IN) :: LATHEAV !latent heat of vaporization/subli (j/kg) - REAL, INTENT(IN) :: GAMMAG !psychrometric constant (pa/K) - REAL, INTENT(IN) :: LATHEAG !latent heat of vaporization/subli (j/kg) - REAL, INTENT(IN) :: PARSUN !par absorbed per unit sunlit lai (w/m2) - REAL, INTENT(IN) :: PARSHA !par absorbed per unit shaded lai (w/m2) - REAL, INTENT(IN) :: FOLN !foliage nitrogen (%) - REAL, INTENT(IN) :: CO2AIR !atmospheric co2 concentration (pa) - REAL, INTENT(IN) :: O2AIR !atmospheric o2 concentration (pa) - REAL, INTENT(IN) :: IGS !growing season index (0=off, 1=on) - REAL, INTENT(IN) :: SFCPRS !pressure (pa) - REAL, INTENT(IN) :: BTRAN !soil water transpiration factor (0 to 1) - REAL, INTENT(IN) :: RHSUR !raltive humidity in surface soil/snow air space (-) - - REAL , INTENT(IN) :: QC !cloud water mixing ratio - REAL , INTENT(IN) :: PSFC !pressure at lowest model layer - REAL , INTENT(IN) :: DX !grid spacing - REAL , INTENT(IN) :: Q2 !mixing ratio (kg/kg) - REAL , INTENT(IN) :: DZ8W !thickness of lowest layer - REAL , INTENT(INOUT) :: QSFC !mixing ratio at lowest model layer - REAL, INTENT(IN) :: PAHV !precipitation advected heat - canopy net IN (W/m2) - REAL, INTENT(IN) :: PAHG !precipitation advected heat - ground net IN (W/m2) - -! input/output - REAL, INTENT(INOUT) :: EAH !canopy air vapor pressure (pa) - REAL, INTENT(INOUT) :: TAH !canopy air temperature (k) - REAL, INTENT(INOUT) :: TV !vegetation temperature (k) - REAL, INTENT(INOUT) :: TG !ground temperature (k) - REAL, INTENT(INOUT) :: CM !momentum drag coefficient - REAL, INTENT(INOUT) :: CH !sensible heat exchange coefficient - -! output -! -FSA + FIRA + FSH + (FCEV + FCTR + FGEV) + FCST + SSOIL + CANHS = 0 - REAL, INTENT(OUT) :: TAUXV !wind stress: e-w (n/m2) - REAL, INTENT(OUT) :: TAUYV !wind stress: n-s (n/m2) - REAL, INTENT(OUT) :: IRC !net longwave radiation (w/m2) [+= to atm] - REAL, INTENT(OUT) :: SHC !sensible heat flux (w/m2) [+= to atm] - REAL, INTENT(OUT) :: EVC !evaporation heat flux (w/m2) [+= to atm] - REAL, INTENT(OUT) :: IRG !net longwave radiation (w/m2) [+= to atm] - REAL, INTENT(OUT) :: SHG !sensible heat flux (w/m2) [+= to atm] - REAL, INTENT(OUT) :: EVG !evaporation heat flux (w/m2) [+= to atm] - REAL, INTENT(OUT) :: TR !transpiration heat flux (w/m2)[+= to atm] - REAL, INTENT(OUT) :: GH !ground heat (w/m2) [+ = to soil] - REAL, INTENT(OUT) :: T2MV !2 m height air temperature (k) - REAL, INTENT(OUT) :: PSNSUN !sunlit leaf photosynthesis (umolco2/m2/s) - REAL, INTENT(OUT) :: PSNSHA !shaded leaf photosynthesis (umolco2/m2/s) - REAL, INTENT(OUT) :: CHLEAF !leaf exchange coefficient - REAL, INTENT(OUT) :: CHUC !under canopy exchange coefficient - REAL, INTENT(OUT) :: CANHS ! canopy heat storage change (w/m2) C.He added based on GY Niu's communication - REAL, INTENT(OUT) :: Q2V - REAL :: CAH !sensible heat conductance, canopy air to ZLVL air (m/s) - REAL :: U10V !10 m wind speed in eastward dir (m/s) - REAL :: V10V !10 m wind speed in eastward dir (m/s) - REAL :: WSPD - -! ------------------------ local variables ---------------------------------------------------- - REAL :: CW !water vapor exchange coefficient - REAL :: FV !friction velocity (m/s) - REAL :: WSTAR !friction velocity n vertical direction (m/s) (only for SFCDIF2) - REAL :: Z0H !roughness length, sensible heat (m) - REAL :: Z0HG !roughness length, sensible heat (m) - REAL :: RB !bulk leaf boundary layer resistance (s/m) - REAL :: RAMC !aerodynamic resistance for momentum (s/m) - REAL :: RAHC !aerodynamic resistance for sensible heat (s/m) - REAL :: RAWC !aerodynamic resistance for water vapor (s/m) - REAL :: RAMG !aerodynamic resistance for momentum (s/m) - REAL :: RAHG !aerodynamic resistance for sensible heat (s/m) - REAL :: RAWG !aerodynamic resistance for water vapor (s/m) - - REAL, INTENT(OUT) :: RSSUN !sunlit leaf stomatal resistance (s/m) - REAL, INTENT(OUT) :: RSSHA !shaded leaf stomatal resistance (s/m) - - REAL :: MOL !Monin-Obukhov length (m) - REAL :: DTV !change in tv, last iteration (k) - REAL :: DTG !change in tg, last iteration (k) - - REAL :: AIR,CIR !coefficients for ir as function of ts**4 - REAL :: CSH !coefficients for sh as function of ts - REAL :: CEV !coefficients for ev as function of esat[ts] - REAL :: CGH !coefficients for st as function of ts - REAL :: ATR,CTR !coefficients for tr as function of esat[ts] - REAL :: ATA,BTA !coefficients for tah as function of ts - REAL :: AEA,BEA !coefficients for eah as function of esat[ts] - - REAL :: ESTV !saturation vapor pressure at tv (pa) - REAL :: ESTG !saturation vapor pressure at tg (pa) - REAL :: DESTV !d(es)/dt at ts (pa/k) - REAL :: DESTG !d(es)/dt at tg (pa/k) - REAL :: ESATW !es for water - REAL :: ESATI !es for ice - REAL :: DSATW !d(es)/dt at tg (pa/k) for water - REAL :: DSATI !d(es)/dt at tg (pa/k) for ice - - REAL :: FM !momentum stability correction, weighted by prior iters - REAL :: FH !sen heat stability correction, weighted by prior iters - REAL :: FHG !sen heat stability correction, ground - REAL :: HCAN !canopy height (m) [note: hcan >= z0mg] - - REAL :: A !temporary calculation - REAL :: B !temporary calculation - REAL :: CVH !sensible heat conductance, leaf surface to canopy air (m/s) - REAL :: CAW !latent heat conductance, canopy air ZLVL air (m/s) - REAL :: CTW !transpiration conductance, leaf to canopy air (m/s) - REAL :: CEW !evaporation conductance, leaf to canopy air (m/s) - REAL :: CGW !latent heat conductance, ground to canopy air (m/s) - REAL :: COND !sum of conductances (s/m) - REAL :: UC !wind speed at top of canopy (m/s) - REAL :: KH !turbulent transfer coefficient, sensible heat, (m2/s) - REAL :: H !temporary sensible heat flux (w/m2) - REAL :: HG !temporary sensible heat flux (w/m2) - REAL :: MOZ !Monin-Obukhov stability parameter - REAL :: MOZG !Monin-Obukhov stability parameter - REAL :: MOZOLD !Monin-Obukhov stability parameter from prior iteration - REAL :: FM2 !Monin-Obukhov momentum adjustment at 2m - REAL :: FH2 !Monin-Obukhov heat adjustment at 2m - REAL :: CH2 !Surface exchange at 2m - REAL :: THSTAR !Surface exchange at 2m - - REAL :: THVAIR - REAL :: THAH - REAL :: RAHC2 !aerodynamic resistance for sensible heat (s/m) - REAL :: RAWC2 !aerodynamic resistance for water vapor (s/m) - REAL, INTENT(OUT):: CAH2 !sensible heat conductance for diagnostics - REAL :: CH2V !exchange coefficient for 2m over vegetation. - REAL :: CQ2V !exchange coefficient for 2m over vegetation. - REAL :: EAH2 !2m vapor pressure over canopy - REAL :: QFX !moisture flux - REAL :: E1 - REAL :: HCV !canopy heat capacity j/m2/k, C.He added - - REAL :: VAIE !total leaf area index + stem area index,effective - REAL :: LAISUNE !sunlit leaf area index, one-sided (m2/m2),effective - REAL :: LAISHAE !shaded leaf area index, one-sided (m2/m2),effective - - INTEGER :: K !index - INTEGER :: ITER !iteration index - -!jref - NITERC test from 5 to 20 - INTEGER, PARAMETER :: NITERC = 20 !number of iterations for surface temperature -!jref - NITERG test from 3-5 - INTEGER, PARAMETER :: NITERG = 5 !number of iterations for ground temperature - INTEGER :: MOZSGN !number of times MOZ changes sign - REAL :: MPE !prevents overflow error if division by zero - - INTEGER :: LITER !Last iteration - - REAL, INTENT(IN) :: JULIAN, SWDOWN, PRCP, FB - REAL, INTENT(INOUT) :: FSR - REAL,DIMENSION(1:60), INTENT(INOUT) :: GECROS1D - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SH2O !soil liquid water - - REAL :: ROOTD, WUL, WLL, Thickness, TLAIE, GLAIE, TLAI, GLAI, FRSU - INTEGER :: NROOT, J - - - REAL :: T, TDC !Kelvin to degree Celsius with limit -50 to +50 - - character(len=80) :: message - - TDC(T) = MIN( 50.0, MAX(-50.0,(T-TFRZ)) ) -! --------------------------------------------------------------------------------------------- - - MPE = 1E-6 - LITER = 0 - FV = 0.1 - -! --------------------------------------------------------------------------------------------- -! initialization variables that do not depend on stability iteration -! --------------------------------------------------------------------------------------------- - DTV = 0.0 - DTG = 0.0 - MOZ = 0.0 - MOZSGN = 0 - MOZOLD = 0.0 - FH2 = 0.0 - HG = 0.0 - H = 0.0 - QFX = 0.0 - -! limit LAI - - VAIE = MIN(6.0,VAI ) - LAISUNE = MIN(6.0,LAISUN) - LAISHAE = MIN(6.0,LAISHA) - -! saturation vapor pressure at ground temperature - - T = TDC(TG) - CALL ESAT(T, ESATW, ESATI, DSATW, DSATI) - IF (T .GT. 0.0) THEN - ESTG = ESATW - ELSE - ESTG = ESATI - END IF - -!jref - consistent surface specific humidity for sfcdif3 and sfcdif4 - - QSFC = 0.622*EAIR/(PSFC-0.378*EAIR) - -! canopy height - - HCAN = parameters%HVT - UC = UR*LOG(HCAN/Z0M)/LOG(ZLVL/Z0M) - UC = UR*LOG((HCAN-ZPD+Z0M)/Z0M)/LOG(ZLVL/Z0M) ! MB: add ZPD v3.7 - IF((HCAN-ZPD) <= 0.0) THEN - WRITE(message,*) "CRITICAL PROBLEM: HCAN <= ZPD" - call wrf_message ( message ) - WRITE(message,*) 'i,j point=',ILOC, JLOC - call wrf_message ( message ) - WRITE(message,*) 'HCAN =',HCAN - call wrf_message ( message ) - WRITE(message,*) 'ZPD =',ZPD - call wrf_message ( message ) - write (message, *) 'SNOWH =',SNOWH - call wrf_message ( message ) - call wrf_error_fatal ( "CRITICAL PROBLEM IN MODULE_SF_NOAHMPLSM:VEGEFLUX" ) - END IF - -! prepare for longwave rad. - - AIR = -EMV*(1.0+(1.0-EMV)*(1.0-EMG))*LWDN - EMV*EMG*SB*TG**4 - CIR = (2.0-EMV*(1.0-EMG))*EMV*SB -! --------------------------------------------------------------------------------------------- - loop1: DO ITER = 1, NITERC ! begin stability iteration - - IF(ITER == 1) THEN - Z0H = Z0M - Z0HG = Z0MG - ELSE - Z0H = Z0M !* EXP(-CZIL*0.4*258.2*SQRT(FV*Z0M)) - Z0HG = Z0MG !* EXP(-CZIL*0.4*258.2*SQRT(FV*Z0MG)) - END IF - -! aerodyn resistances between heights zlvl and d+z0v - - IF(OPT_SFC == 1) THEN - CALL SFCDIF1(parameters,ITER ,SFCTMP ,RHOAIR ,H ,QAIR , & !in - ZLVL ,ZPD ,Z0M ,Z0H ,UR , & !in - MPE ,ILOC ,JLOC , & !in - MOZ ,MOZSGN ,FM ,FH ,FM2,FH2, & !inout - CM ,CH ,FV ,CH2 ) !out - ENDIF - - IF(OPT_SFC == 2) THEN - CALL SFCDIF2(parameters,ITER ,Z0M ,TAH ,THAIR ,UR , & !in - ZLVL ,ILOC ,JLOC , & !in - CM ,CH ,MOZ ,WSTAR , & !in - FV ) !out - ! Undo the multiplication by windspeed that SFCDIF2 - ! applies to exchange coefficients CH and CM: - CH = CH / UR - CM = CM / UR - ENDIF - - RAMC = MAX(1.0,1.0/(CM*UR)) - RAHC = MAX(1.0,1.0/(CH*UR)) - RAWC = RAHC - -! aerodyn resistance between heights z0g and d+z0v, RAG, and leaf -! boundary layer resistance, RB - - CALL RAGRB(parameters,ITER ,VAIE ,RHOAIR ,HG ,TAH , & !in - ZPD ,Z0MG ,Z0HG ,HCAN ,UC , & !in - Z0H ,FV ,CWP ,VEGTYP ,MPE , & !in - TV ,MOZG ,FHG ,ILOC ,JLOC , & !inout - RAMG ,RAHG ,RAWG ,RB ) !out - -! es and d(es)/dt evaluated at tv - - T = TDC(TV) - CALL ESAT(T, ESATW, ESATI, DSATW, DSATI) - IF (T .GT. 0.0) THEN - ESTV = ESATW - DESTV = DSATW - ELSE - ESTV = ESATI - DESTV = DSATI - END IF - -! stomatal resistance - - IF(ITER == 1) THEN - IF (OPT_CRS == 1) then ! Ball-Berry - CALL STOMATA (parameters,VEGTYP,MPE ,PARSUN ,FOLN ,ILOC , JLOC , & !in - TV ,ESTV ,EAH ,SFCTMP,SFCPRS, & !in - O2AIR ,CO2AIR,IGS ,BTRAN ,RB , & !in - RSSUN ,PSNSUN) !out - - CALL STOMATA (parameters,VEGTYP,MPE ,PARSHA ,FOLN ,ILOC , JLOC , & !in - TV ,ESTV ,EAH ,SFCTMP,SFCPRS, & !in - O2AIR ,CO2AIR,IGS ,BTRAN ,RB , & !in - RSSHA ,PSNSHA) !out - END IF - - IF (OPT_CRS == 2) then ! Jarvis - CALL CANRES (parameters,PARSUN,TV ,BTRAN ,EAH ,SFCPRS, & !in - RSSUN ,PSNSUN,ILOC ,JLOC ) !out - - CALL CANRES (parameters,PARSHA,TV ,BTRAN ,EAH ,SFCPRS, & !in - RSSHA ,PSNSHA,ILOC ,JLOC ) !out - END IF - - ! Call Gecros - IF (opt_crop == 2) then - IF ((GECROS1D(41) .GT. 0).and.(GECROS1D(42) .LT. 0.0)) then !Gecros - Thickness = 0.0 - NROOT = 0 - ROOTD = GECROS1D(33) - WUL = 0.0 - WLL = 0.0 - - DO J = 1,NSOIL - Thickness = Thickness + DZSNSO (J) - if (Thickness .lt. ROOTD/100.0) then - NROOT = NROOT + 1 - endif - ENDDO - - NROOT = NROOT + 1 - NROOT = MAX(1,NROOT) - - Thickness = 0.0 - - DO J = 1,NROOT - Thickness = Thickness + DZSNSO (J) - if (Thickness .gt. ROOTD/100.0) then - WUL = WUL + ((ROOTD/100.0-Thickness+DZSNSO(J))*1000.0*(SH2O(J)-parameters%SMCWLT(J))) - else - WUL = WUL + (DZSNSO(J)*1000.0*(SH2O(J)-parameters%SMCWLT(J))) - endif - ENDDO - - DO J = 1,NSOIL - WLL = WLL + (DZSNSO(J)*1000.0*(SH2O(J)-parameters%SMCWLT(J))) - ENDDO - WLL = WLL - WUL - - CALL gecros (JULIAN, DT, 1, RB, RAHC, RAHG+RSURF, FB, SNOWH , & !I - UR, SFCTMP, EAIR, SWDOWN, LWDN, PRCP, WUL, WLL , & !I - parameters%SMCWLT(1), parameters%DLEAF , & !I - GECROS1D , & !H - SAV, SAG, FSR, FRSU, RSSUN, RSSHA) !O - - GLAI = GECROS1D(49) - TLAI = GECROS1D(50) - - ! effective LAIs - TLAIE = MIN(6.0,TLAI / FVEG) - GLAIE = MIN(6.0,GLAI / FVEG) - ENDIF - ENDIF - - END IF - -! prepare for sensible heat flux above veg. - - CAH = 1.0/RAHC - CVH = 2.0*VAIE/RB - CGH = 1.0/RAHG - COND = CAH + CVH + CGH - ATA = (SFCTMP*CAH + TG*CGH) / COND - BTA = CVH/COND - CSH = (1.0-BTA)*RHOAIR*CPAIR*CVH - -! prepare for latent heat flux above veg. - - CAW = 1.0/RAWC - CEW = FWET*VAIE/RB - - IF (OPT_CROP /= 2) THEN - CTW = (1.0-FWET)*(LAISUNE/(RB+RSSUN) + LAISHAE/(RB+RSSHA)) - ELSE - !RSSUN and RSSHA are in resistance per unit LAI in the Jarvis and Ball-Berry!. RSSUN and RSSHA of Gecros are in s/m - CTW = (1.0-FWET)*(1.0/(RB/(FRSU*GLAIE)+RSSUN) + 1.0/(RB/((1.0-FRSU)*GLAIE)+RSSHA)) !transpiration conductance leaf to canopy air - ENDIF - CGW = 1.0/(RAWG+RSURF) - COND = CAW + CEW + CTW + CGW - AEA = (EAIR*CAW + ESTG*CGW) / COND - BEA = (CEW+CTW)/COND - CEV = (1.0-BEA)*CEW*RHOAIR*CPAIR/GAMMAV ! Barlage: change to vegetation v3.6 - CTR = (1.0-BEA)*CTW*RHOAIR*CPAIR/GAMMAV - -! evaluate surface fluxes with current temperature and solve for dts - - TAH = ATA + BTA*TV ! canopy air T. - EAH = AEA + BEA*ESTV ! canopy air e - - IRC = FVEG*(AIR + CIR*TV**4) - SHC = FVEG*RHOAIR*CPAIR*CVH * ( TV-TAH) - EVC = FVEG*RHOAIR*CPAIR*CEW * (ESTV-EAH) / GAMMAV ! Barlage: change to v in v3.6 - TR = FVEG*RHOAIR*CPAIR*CTW * (ESTV-EAH) / GAMMAV - IF (TV > TFRZ) THEN - EVC = MIN(CANLIQ*LATHEAV/DT,EVC) ! Barlage: add if block for canice in v3.6 - ELSE - EVC = MIN(CANICE*LATHEAV/DT,EVC) - END IF - ! canopy heat capacity - HCV = 0.02*VAIE*CWAT + CANLIQ*CWAT/DENH2O + CANICE*CICE/DENICE !j/m2/k - - B = SAV-IRC-SHC-EVC-TR+PAHV !additional w/m2 -! A = FVEG*(4.0*CIR*TV**3 + CSH + (CEV+CTR)*DESTV) !volumetric heat capacity - A = FVEG*(4.0*CIR*TV**3 + CSH + (CEV+CTR)*DESTV) + HCV/DT ! total volumetric heat capacity, add canopy heat capacity, more stable - DTV = B/A - - IRC = IRC + FVEG*4.0*CIR*TV**3*DTV - SHC = SHC + FVEG*CSH*DTV - EVC = EVC + FVEG*CEV*DESTV*DTV - TR = TR + FVEG*CTR*DESTV*DTV - CANHS = DTV * HCV/DT ! w/m2 canopy heat storage change - -! update vegetation surface temperature - TV = TV + DTV -! TAH = ATA + BTA*TV ! canopy air T; update here for consistency - -! for computing M-O length in the next iteration - H = RHOAIR*CPAIR*(TAH - SFCTMP) /RAHC - HG = RHOAIR*CPAIR*(TG - TAH) /RAHG - -! consistent specific humidity from canopy air vapor pressure - QSFC = (0.622*EAH)/(SFCPRS-0.378*EAH) - - IF (LITER == 1) THEN - exit loop1 - ENDIF - IF (ITER >= 5 .AND. ABS(DTV) <= 0.01 .AND. LITER == 0) THEN - LITER = 1 - ENDIF - - END DO loop1 ! end stability iteration - -! under-canopy fluxes and tg - - AIR = - EMG*(1.0-EMV)*LWDN - EMG*EMV*SB*TV**4 - CIR = EMG*SB - CSH = RHOAIR*CPAIR/RAHG - CEV = RHOAIR*CPAIR / (GAMMAG*(RAWG+RSURF)) ! Barlage: change to ground v3.6 - CGH = 2.0*DF(ISNOW+1)/DZSNSO(ISNOW+1) - - loop2: DO ITER = 1, NITERG - - T = TDC(TG) - CALL ESAT(T, ESATW, ESATI, DSATW, DSATI) - IF (T .GT. 0.0) THEN - ESTG = ESATW - DESTG = DSATW - ELSE - ESTG = ESATI - DESTG = DSATI - END IF - - IRG = CIR*TG**4 + AIR - SHG = CSH * (TG - TAH ) - EVG = CEV * (ESTG*RHSUR - EAH ) - GH = CGH * (TG - STC(ISNOW+1)) - - B = SAG-IRG-SHG-EVG-GH+PAHG - A = 4.0*CIR*TG**3+CSH+CEV*DESTG+CGH - DTG = B/A - - IRG = IRG + 4.0*CIR*TG**3*DTG - SHG = SHG + CSH*DTG - EVG = EVG + CEV*DESTG*DTG - GH = GH + CGH*DTG - TG = TG + DTG - - END DO loop2 - -! TAH = (CAH*SFCTMP + CVH*TV + CGH*TG)/(CAH + CVH + CGH) - -! if snow on ground and TG > TFRZ: reset TG = TFRZ. reevaluate ground fluxes. - - IF(OPT_STC == 1 .OR. OPT_STC == 3) THEN - IF (SNOWH > 0.05 .AND. TG > TFRZ) THEN - IF(OPT_STC == 1) TG = TFRZ - IF(OPT_STC == 3) TG = (1.0-FSNO)*TG + FSNO*TFRZ ! MB: allow TG>0C during melt v3.7 - IRG = CIR*TG**4 - EMG*(1.0-EMV)*LWDN - EMG*EMV*SB*TV**4 - SHG = CSH * (TG - TAH) - EVG = CEV * (ESTG*RHSUR - EAH) - GH = SAG+PAHG - (IRG+SHG+EVG) - END IF - END IF - -! wind stresses - - TAUXV = -RHOAIR*CM*UR*UU - TAUYV = -RHOAIR*CM*UR*VV - -! consistent vegetation air temperature and vapor pressure since TG is not consistent with the TAH/EAH -! calculation. -! TAH = SFCTMP + (SHG+SHC)/(RHOAIR*CPAIR*CAH) -! TAH = SFCTMP + (SHG*FVEG+SHC)/(RHOAIR*CPAIR*CAH) ! ground flux need fveg -! EAH = EAIR + (EVC+FVEG*(TR+EVG))/(RHOAIR*CAW*CPAIR/GAMMAG ) -! QFX = (QSFC-QAIR)*RHOAIR*CAW !*CPAIR/GAMMAG - -! 2m temperature over vegetation ( corrected for low CQ2V values ) - IF (OPT_SFC == 1 .OR. OPT_SFC == 2) THEN -! CAH2 = FV*1./VKC*LOG((2.+Z0H)/Z0H) - CAH2 = FV*VKC/LOG((2.0+Z0H)/Z0H) - CAH2 = FV*VKC/(LOG((2.0+Z0H)/Z0H)-FH2) - CQ2V = CAH2 - IF (CAH2 .LT. 1.0E-5 ) THEN - T2MV = TAH -! Q2V = (EAH*0.622/(SFCPRS - 0.378*EAH)) - Q2V = QSFC - ELSE - T2MV = TAH - (SHG+SHC/FVEG)/(RHOAIR*CPAIR) * 1.0/CAH2 -! Q2V = (EAH*0.622/(SFCPRS - 0.378*EAH))- QFX/(RHOAIR*FV)* 1./VKC * LOG((2.+Z0H)/Z0H) - Q2V = QSFC - ((EVC+TR)/FVEG+EVG)/(LATHEAV*RHOAIR) * 1.0/CQ2V - ENDIF - ENDIF - -! update CH for output - CH = CAH - CHLEAF = CVH - CHUC = 1.0/RAHG - - END SUBROUTINE VEGE_FLUX - -!== begin bare_flux ================================================================================ - - SUBROUTINE BARE_FLUX (parameters,NSNOW ,NSOIL ,ISNOW ,DT ,SAG , & !in - LWDN ,UR ,UU ,VV ,SFCTMP , & !in - THAIR ,QAIR ,EAIR ,RHOAIR ,SNOWH , & !in - DZSNSO ,ZLVL ,ZPD ,Z0M ,FSNO , & !in - EMG ,STC ,DF ,RSURF ,LATHEA , & !in - GAMMA ,RHSUR ,ILOC ,JLOC ,Q2 ,PAHB , & !in - TGB ,CM ,CH , & !inout - TAUXB ,TAUYB ,IRB ,SHB ,EVB , & !out - GHB ,T2MB ,DX ,DZ8W ,IVGTYP , & !out - QC ,QSFC ,PSFC , & !in - SFCPRS ,Q2B ,EHB2 ) !in - -! -------------------------------------------------------------------------------------------------- -! use newton-raphson iteration to solve ground (tg) temperature -! that balances the surface energy budgets for bare soil fraction. - -! bare soil: -! -SAB + IRB[TG] + SHB[TG] + EVB[TG] + GHB[TG] = 0 -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! input - type (noahmp_parameters), intent(in) :: parameters - integer , INTENT(IN) :: ILOC !grid index - integer , INTENT(IN) :: JLOC !grid index - INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers - INTEGER, INTENT(IN) :: NSOIL !number of soil layers - INTEGER, INTENT(IN) :: ISNOW !actual no. of snow layers - REAL, INTENT(IN) :: DT !time step (s) - REAL, INTENT(IN) :: SAG !solar radiation absorbed by ground (w/m2) - REAL, INTENT(IN) :: LWDN !atmospheric longwave radiation (w/m2) - REAL, INTENT(IN) :: UR !wind speed at height zlvl (m/s) - REAL, INTENT(IN) :: UU !wind speed in eastward dir (m/s) - REAL, INTENT(IN) :: VV !wind speed in northward dir (m/s) - REAL, INTENT(IN) :: SFCTMP !air temperature at reference height (k) - REAL, INTENT(IN) :: THAIR !potential temperature at height zlvl (k) - REAL, INTENT(IN) :: QAIR !specific humidity at height zlvl (kg/kg) - REAL, INTENT(IN) :: EAIR !vapor pressure air at height (pa) - REAL, INTENT(IN) :: RHOAIR !density air (kg/m3) - REAL, INTENT(IN) :: SNOWH !actual snow depth [m] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !thickness of snow/soil layers (m) - REAL, INTENT(IN) :: ZLVL !reference height (m) - REAL, INTENT(IN) :: ZPD !zero plane displacement (m) - REAL, INTENT(IN) :: Z0M !roughness length, momentum, ground (m) - REAL, INTENT(IN) :: EMG !ground emissivity - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: STC !soil/snow temperature (k) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DF !thermal conductivity of snow/soil (w/m/k) - REAL, INTENT(IN) :: RSURF !ground surface resistance (s/m) - REAL, INTENT(IN) :: LATHEA !latent heat of vaporization/subli (j/kg) - REAL, INTENT(IN) :: GAMMA !psychrometric constant (pa/k) - REAL, INTENT(IN) :: RHSUR !raltive humidity in surface soil/snow air space (-) - REAL, INTENT(IN) :: FSNO !snow fraction - -!jref:start; in - INTEGER , INTENT(IN) :: IVGTYP - REAL , INTENT(IN) :: QC !cloud water mixing ratio - REAL , INTENT(INOUT) :: QSFC !mixing ratio at lowest model layer - REAL , INTENT(IN) :: PSFC !pressure at lowest model layer - REAL , INTENT(IN) :: SFCPRS !pressure at lowest model layer - REAL , INTENT(IN) :: DX !horisontal grid spacing - REAL , INTENT(IN) :: Q2 !mixing ratio (kg/kg) - REAL , INTENT(IN) :: DZ8W !thickness of lowest layer -!jref:end - REAL, INTENT(IN) :: PAHB !precipitation advected heat - ground net IN (W/m2) - -! input/output - REAL, INTENT(INOUT) :: TGB !ground temperature (k) - REAL, INTENT(INOUT) :: CM !momentum drag coefficient - REAL, INTENT(INOUT) :: CH !sensible heat exchange coefficient - -! output -! -SAB + IRB[TG] + SHB[TG] + EVB[TG] + GHB[TG] = 0 - - REAL, INTENT(OUT) :: TAUXB !wind stress: e-w (n/m2) - REAL, INTENT(OUT) :: TAUYB !wind stress: n-s (n/m2) - REAL, INTENT(OUT) :: IRB !net longwave rad (w/m2) [+ to atm] - REAL, INTENT(OUT) :: SHB !sensible heat flux (w/m2) [+ to atm] - REAL, INTENT(OUT) :: EVB !latent heat flux (w/m2) [+ to atm] - REAL, INTENT(OUT) :: GHB !ground heat flux (w/m2) [+ to soil] - REAL, INTENT(OUT) :: T2MB !2 m height air temperature (k) -!jref:start - REAL, INTENT(OUT) :: Q2B !bare ground heat conductance - REAL :: EHB !bare ground heat conductance - REAL :: U10B !10 m wind speed in eastward dir (m/s) - REAL :: V10B !10 m wind speed in eastward dir (m/s) - REAL :: WSPD -!jref:end - -! local variables - - REAL :: TAUX !wind stress: e-w (n/m2) - REAL :: TAUY !wind stress: n-s (n/m2) - REAL :: FIRA !total net longwave rad (w/m2) [+ to atm] - REAL :: FSH !total sensible heat flux (w/m2) [+ to atm] - REAL :: FGEV !ground evaporation heat flux (w/m2)[+ to atm] - REAL :: SSOIL !soil heat flux (w/m2) [+ to soil] - REAL :: FIRE !emitted ir (w/m2) - REAL :: TRAD !radiative temperature (k) - REAL :: TAH !"surface" temperature at height z0h+zpd (k) - - REAL :: CW !water vapor exchange coefficient - REAL :: FV !friction velocity (m/s) - REAL :: WSTAR !friction velocity n vertical direction (m/s) (only for SFCDIF2) - REAL :: Z0H !roughness length, sensible heat, ground (m) - REAL :: RB !bulk leaf boundary layer resistance (s/m) - REAL :: RAMB !aerodynamic resistance for momentum (s/m) - REAL :: RAHB !aerodynamic resistance for sensible heat (s/m) - REAL :: RAWB !aerodynamic resistance for water vapor (s/m) - REAL :: MOL !Monin-Obukhov length (m) - REAL :: DTG !change in tg, last iteration (k) - - REAL :: CIR !coefficients for ir as function of ts**4 - REAL :: CSH !coefficients for sh as function of ts - REAL :: CEV !coefficients for ev as function of esat[ts] - REAL :: CGH !coefficients for st as function of ts - -!jref:start - REAL :: RAHB2 !aerodynamic resistance for sensible heat 2m (s/m) - REAL :: RAWB2 !aerodynamic resistance for water vapor 2m (s/m) - REAL,INTENT(OUT) :: EHB2 !sensible heat conductance for diagnostics - REAL :: CH2B !exchange coefficient for 2m temp. - REAL :: CQ2B !exchange coefficient for 2m temp. - REAL :: THVAIR !virtual potential air temp - REAL :: THGH !potential ground temp - REAL :: EMB !momentum conductance - REAL :: QFX !moisture flux - REAL :: ESTG2 !saturation vapor pressure at 2m (pa) - INTEGER :: VEGTYP !vegetation type set to isbarren - REAL :: E1 -!jref:end - - REAL :: ESTG !saturation vapor pressure at tg (pa) - REAL :: DESTG !d(es)/dt at tg (pa/K) - REAL :: ESATW !es for water - REAL :: ESATI !es for ice - REAL :: DSATW !d(es)/dt at tg (pa/K) for water - REAL :: DSATI !d(es)/dt at tg (pa/K) for ice - - REAL :: A !temporary calculation - REAL :: B !temporary calculation - REAL :: H !temporary sensible heat flux (w/m2) - REAL :: MOZ !Monin-Obukhov stability parameter - REAL :: MOZOLD !Monin-Obukhov stability parameter from prior iteration - REAL :: FM !momentum stability correction, weighted by prior iters - REAL :: FH !sen heat stability correction, weighted by prior iters - INTEGER :: MOZSGN !number of times MOZ changes sign - REAL :: FM2 !Monin-Obukhov momentum adjustment at 2m - REAL :: FH2 !Monin-Obukhov heat adjustment at 2m - REAL :: CH2 !Surface exchange at 2m - - INTEGER :: ITER !iteration index - INTEGER :: NITERB !number of iterations for surface temperature - REAL :: MPE !prevents overflow error if division by zero -!jref:start -! DATA NITERB /3/ - DATA NITERB /5/ - SAVE NITERB - REAL :: T, TDC !Kelvin to degree Celsius with limit -50 to +50 - TDC(T) = MIN( 50.0, MAX(-50.0,(T-TFRZ)) ) - -! ----------------------------------------------------------------- -! initialization variables that do not depend on stability iteration -! ----------------------------------------------------------------- - MPE = 1E-6 - DTG = 0.0 - MOZ = 0.0 - MOZSGN = 0 - MOZOLD = 0.0 - FH2 = 0.0 - H = 0.0 - QFX = 0.0 - FV = 0.1 - - CIR = EMG*SB - CGH = 2.0*DF(ISNOW+1)/DZSNSO(ISNOW+1) - -! ----------------------------------------------------------------- - loop3: DO ITER = 1, NITERB ! begin stability iteration - - IF(ITER == 1) THEN - Z0H = Z0M - ELSE - Z0H = Z0M !* EXP(-CZIL*0.4*258.2*SQRT(FV*Z0M)) - END IF - - IF(OPT_SFC == 1) THEN - CALL SFCDIF1(parameters,ITER ,SFCTMP ,RHOAIR ,H ,QAIR , & !in - ZLVL ,ZPD ,Z0M ,Z0H ,UR , & !in - MPE ,ILOC ,JLOC , & !in - MOZ ,MOZSGN ,FM ,FH ,FM2,FH2, & !inout - CM ,CH ,FV ,CH2 ) !out - ENDIF - - IF(OPT_SFC == 2) THEN - CALL SFCDIF2(parameters,ITER ,Z0M ,TGB ,THAIR ,UR , & !in - ZLVL ,ILOC ,JLOC , & !in - CM ,CH ,MOZ ,WSTAR , & !in - FV ) !out - ! Undo the multiplication by windspeed that SFCDIF2 - ! applies to exchange coefficients CH and CM: - CH = CH / UR - CM = CM / UR - IF(SNOWH > 0.0) THEN - CM = MIN(0.01,CM) ! CM & CH are too large, causing - CH = MIN(0.01,CH) ! computational instability - END IF - - ENDIF - - RAMB = MAX(1.0,1.0/(CM*UR)) - RAHB = MAX(1.0,1.0/(CH*UR)) - RAWB = RAHB - -!jref - variables for diagnostics - EMB = 1.0/RAMB - EHB = 1.0/RAHB - -! es and d(es)/dt evaluated at tg - - T = TDC(TGB) - CALL ESAT(T, ESATW, ESATI, DSATW, DSATI) - IF (T .GT. 0.0) THEN - ESTG = ESATW - DESTG = DSATW - ELSE - ESTG = ESATI - DESTG = DSATI - END IF - - CSH = RHOAIR*CPAIR/RAHB - CEV = RHOAIR*CPAIR/GAMMA/(RSURF+RAWB) - -! surface fluxes and dtg - - IRB = CIR * TGB**4 - EMG*LWDN - SHB = CSH * (TGB - SFCTMP ) - EVB = CEV * (ESTG*RHSUR - EAIR ) - GHB = CGH * (TGB - STC(ISNOW+1)) - - B = SAG-IRB-SHB-EVB-GHB+PAHB - A = 4.0*CIR*TGB**3 + CSH + CEV*DESTG + CGH - DTG = B/A - - IRB = IRB + 4.0*CIR*TGB**3*DTG - SHB = SHB + CSH*DTG - EVB = EVB + CEV*DESTG*DTG - GHB = GHB + CGH*DTG - -! update ground surface temperature - TGB = TGB + DTG - -! for M-O length - H = CSH * (TGB - SFCTMP) - - T = TDC(TGB) - CALL ESAT(T, ESATW, ESATI, DSATW, DSATI) - IF (T .GT. 0.0) THEN - ESTG = ESATW - ELSE - ESTG = ESATI - END IF - QSFC = 0.622*(ESTG*RHSUR)/(PSFC-0.378*(ESTG*RHSUR)) - - QFX = (QSFC-QAIR)*CEV*GAMMA/CPAIR - - END DO loop3 ! end stability iteration -! ----------------------------------------------------------------- - -! if snow on ground and TG > TFRZ: reset TG = TFRZ. reevaluate ground fluxes. - - IF(OPT_STC == 1 .OR. OPT_STC == 3) THEN - IF (SNOWH > 0.05 .AND. TGB > TFRZ) THEN - IF(OPT_STC == 1) TGB = TFRZ - IF(OPT_STC == 3) TGB = (1.0-FSNO)*TGB + FSNO*TFRZ ! MB: allow TG>0C during melt v3.7 - IRB = CIR * TGB**4 - EMG*LWDN - SHB = CSH * (TGB - SFCTMP) - EVB = CEV * (ESTG*RHSUR - EAIR ) !ESTG reevaluate ? - GHB = SAG+PAHB - (IRB+SHB+EVB) - END IF - END IF - -! wind stresses - - TAUXB = -RHOAIR*CM*UR*UU - TAUYB = -RHOAIR*CM*UR*VV - -!jref:start; errors in original equation corrected. -! 2m air temperature - IF(OPT_SFC == 1 .OR. OPT_SFC ==2) THEN - EHB2 = FV*VKC/LOG((2.0+Z0H)/Z0H) - EHB2 = FV*VKC/(LOG((2.0+Z0H)/Z0H)-FH2) - CQ2B = EHB2 - IF (EHB2 .lt. 1.0E-5 ) THEN - T2MB = TGB - Q2B = QSFC - ELSE - T2MB = TGB - SHB/(RHOAIR*CPAIR) * 1.0/EHB2 - Q2B = QSFC - EVB/(LATHEA*RHOAIR)*(1.0/CQ2B + RSURF) - ENDIF - IF (parameters%urban_flag) Q2B = QSFC - END IF - -! update CH - CH = EHB - - END SUBROUTINE BARE_FLUX - -!== begin ragrb ==================================================================================== - - SUBROUTINE RAGRB(parameters,ITER ,VAI ,RHOAIR ,HG ,TAH , & !in - ZPD ,Z0MG ,Z0HG ,HCAN ,UC , & !in - Z0H ,FV ,CWP ,VEGTYP ,MPE , & !in - TV ,MOZG ,FHG ,ILOC ,JLOC , & !inout - RAMG ,RAHG ,RAWG ,RB ) !out -! -------------------------------------------------------------------------------------------------- -! compute under-canopy aerodynamic resistance RAG and leaf boundary layer -! resistance RB -! -------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------------- -! inputs - - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: ILOC !grid index - INTEGER, INTENT(IN) :: JLOC !grid index - INTEGER, INTENT(IN) :: ITER !iteration index - INTEGER, INTENT(IN) :: VEGTYP !vegetation physiology type - REAL, INTENT(IN) :: VAI !total LAI + stem area index, one sided - REAL, INTENT(IN) :: RHOAIR !density air (kg/m3) - REAL, INTENT(IN) :: HG !ground sensible heat flux (w/m2) - REAL, INTENT(IN) :: TV !vegetation temperature (k) - REAL, INTENT(IN) :: TAH !air temperature at height z0h+zpd (k) - REAL, INTENT(IN) :: ZPD !zero plane displacement (m) - REAL, INTENT(IN) :: Z0MG !roughness length, momentum, ground (m) - REAL, INTENT(IN) :: HCAN !canopy height (m) [note: hcan >= z0mg] - REAL, INTENT(IN) :: UC !wind speed at top of canopy (m/s) - REAL, INTENT(IN) :: Z0H !roughness length, sensible heat (m) - REAL, INTENT(IN) :: Z0HG !roughness length, sensible heat, ground (m) - REAL, INTENT(IN) :: FV !friction velocity (m/s) - REAL, INTENT(IN) :: CWP !canopy wind parameter - REAL, INTENT(IN) :: MPE !prevents overflow error if division by zero - -! in & out - - REAL, INTENT(INOUT) :: MOZG !Monin-Obukhov stability parameter - REAL, INTENT(INOUT) :: FHG !stability correction - -! outputs - REAL :: RAMG !aerodynamic resistance for momentum (s/m) - REAL :: RAHG !aerodynamic resistance for sensible heat (s/m) - REAL :: RAWG !aerodynamic resistance for water vapor (s/m) - REAL :: RB !bulk leaf boundary layer resistance (s/m) - - - REAL :: KH !turbulent transfer coefficient, sensible heat, (m2/s) - REAL :: TMP1 !temporary calculation - REAL :: TMP2 !temporary calculation - REAL :: TMPRAH2 !temporary calculation for aerodynamic resistances - REAL :: TMPRB !temporary calculation for rb - real :: MOLG,FHGNEW,CWPC -! -------------------------------------------------------------------------------------------------- -! stability correction to below canopy resistance - - MOZG = 0.0 - MOLG = 0.0 - - IF(ITER > 1) THEN - TMP1 = VKC * (GRAV/TAH) * HG/(RHOAIR*CPAIR) - IF (ABS(TMP1) .LE. MPE) TMP1 = MPE - MOLG = -1.0 * FV**3 / TMP1 - MOZG = MIN( (ZPD-Z0MG)/MOLG, 1.0) - END IF - - IF (MOZG < 0.0) THEN - FHGNEW = (1.0 - 15.0*MOZG)**(-0.25) - ELSE - FHGNEW = 1.0+ 4.7*MOZG - ENDIF - - IF (ITER == 1) THEN - FHG = FHGNEW - ELSE - FHG = 0.5 * (FHG+FHGNEW) - ENDIF - - CWPC = (CWP * VAI * HCAN * FHG)**0.5 -! CWPC = (CWP*FHG)**0.5 - - TMP1 = EXP( -CWPC*Z0HG/HCAN ) - TMP2 = EXP( -CWPC*(Z0H+ZPD)/HCAN ) - TMPRAH2 = HCAN*EXP(CWPC) / CWPC * (TMP1-TMP2) - -! aerodynamic resistances raw and rah between heights zpd+z0h and z0hg. - - KH = MAX ( VKC*FV*(HCAN-ZPD), MPE ) - RAMG = 0.0 - RAHG = TMPRAH2 / KH - RAWG = RAHG - -! leaf boundary layer resistance - - TMPRB = CWPC*50.0 / (1.0 - EXP(-CWPC/2.0)) - RB = TMPRB * SQRT(parameters%DLEAF/UC) - RB = MIN(MAX(RB, 5.0),50.0) ! limit RB to 5-50, typically RB<50 - - END SUBROUTINE RAGRB - -!== begin sfcdif1 ================================================================================== - - SUBROUTINE SFCDIF1(parameters,ITER ,SFCTMP ,RHOAIR ,H ,QAIR , & !in - & ZLVL ,ZPD ,Z0M ,Z0H ,UR , & !in - & MPE ,ILOC ,JLOC , & !in - & MOZ ,MOZSGN ,FM ,FH ,FM2,FH2, & !inout - & CM ,CH ,FV ,CH2 ) !out -! ------------------------------------------------------------------------------------------------- -! computing surface drag coefficient CM for momentum and CH for heat -! ------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! ------------------------------------------------------------------------------------------------- -! inputs - - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: ILOC !grid index - INTEGER, INTENT(IN) :: JLOC !grid index - INTEGER, INTENT(IN) :: ITER !iteration index - REAL, INTENT(IN) :: SFCTMP !temperature at reference height (k) - REAL, INTENT(IN) :: RHOAIR !density air (kg/m**3) - REAL, INTENT(IN) :: H !sensible heat flux (w/m2) [+ to atm] - REAL, INTENT(IN) :: QAIR !specific humidity at reference height (kg/kg) - REAL, INTENT(IN) :: ZLVL !reference height (m) - REAL, INTENT(IN) :: ZPD !zero plane displacement (m) - REAL, INTENT(IN) :: Z0H !roughness length, sensible heat, ground (m) - REAL, INTENT(IN) :: Z0M !roughness length, momentum, ground (m) - REAL, INTENT(IN) :: UR !wind speed (m/s) - REAL, INTENT(IN) :: MPE !prevents overflow error if division by zero -! in & out - - INTEGER, INTENT(INOUT) :: MOZSGN !number of times moz changes sign - REAL, INTENT(INOUT) :: MOZ !Monin-Obukhov stability (z/L) - REAL, INTENT(INOUT) :: FM !momentum stability correction, weighted by prior iters - REAL, INTENT(INOUT) :: FH !sen heat stability correction, weighted by prior iters - REAL, INTENT(INOUT) :: FM2 !sen heat stability correction, weighted by prior iters - REAL, INTENT(INOUT) :: FH2 !sen heat stability correction, weighted by prior iters - -! outputs - - REAL, INTENT(OUT) :: CM !drag coefficient for momentum - REAL, INTENT(OUT) :: CH !drag coefficient for heat - REAL, INTENT(OUT) :: FV !friction velocity (m/s) - REAL, INTENT(OUT) :: CH2 !drag coefficient for heat - -! locals - REAL :: MOL !Monin-Obukhov length (m) - REAL :: TMPCM !temporary calculation for CM - REAL :: TMPCH !temporary calculation for CH - REAL :: FMNEW !stability correction factor, momentum, for current moz - REAL :: FHNEW !stability correction factor, sen heat, for current moz - REAL :: MOZOLD !Monin-Obukhov stability parameter from prior iteration - REAL :: TMP1,TMP2,TMP3,TMP4,TMP5 !temporary calculation - REAL :: TVIR !temporary virtual temperature (k) - REAL :: MOZ2 !2/L - REAL :: TMPCM2 !temporary calculation for CM2 - REAL :: TMPCH2 !temporary calculation for CH2 - REAL :: FM2NEW !stability correction factor, momentum, for current moz - REAL :: FH2NEW !stability correction factor, sen heat, for current moz - REAL :: TMP12,TMP22,TMP32 !temporary calculation - - REAL :: CMFM, CHFH, CM2FM2, CH2FH2 -! ------------------------------------------------------------------------------------------------- -! Monin-Obukhov stability parameter moz for next iteration - - MOZOLD = MOZ - - IF(ZLVL <= ZPD) THEN - write(*,*) 'WARNING: critical problem: ZLVL <= ZPD; model stops' - call wrf_error_fatal("STOP in Noah-MP") - ENDIF - - TMPCM = LOG((ZLVL-ZPD) / Z0M) - TMPCH = LOG((ZLVL-ZPD) / Z0H) - TMPCM2 = LOG((2.0 + Z0M) / Z0M) - TMPCH2 = LOG((2.0 + Z0H) / Z0H) - - IF(ITER == 1) THEN - FV = 0.0 - MOZ = 0.0 - MOL = 0.0 - MOZ2 = 0.0 - ELSE - TVIR = (1.0 + 0.61*QAIR) * SFCTMP - TMP1 = VKC * (GRAV/TVIR) * H/(RHOAIR*CPAIR) - IF (ABS(TMP1) .LE. MPE) TMP1 = MPE - MOL = -1.0 * FV**3 / TMP1 - MOZ = MIN( (ZLVL-ZPD)/MOL, 1.0) - MOZ2 = MIN( (2.0 + Z0H)/MOL, 1.0) - ENDIF - -! accumulate number of times moz changes sign. - - IF (MOZOLD*MOZ .LT. 0.0) MOZSGN = MOZSGN+1 - IF (MOZSGN .GE. 2) THEN - MOZ = 0.0 - FM = 0.0 - FH = 0.0 - MOZ2 = 0.0 - FM2 = 0.0 - FH2 = 0.0 - ENDIF - -! evaluate stability-dependent variables using moz from prior iteration - IF (MOZ .LT. 0.0) THEN - TMP1 = (1.0 - 16.0*MOZ)**0.25 - TMP2 = LOG((1.0+TMP1*TMP1)/2.0) - TMP3 = LOG((1.0+TMP1)/2.0) - FMNEW = 2.0*TMP3 + TMP2 - 2.0*ATAN(TMP1) + 1.5707963 - FHNEW = 2*TMP2 - -! 2-meter - TMP12 = (1.0 - 16.0*MOZ2)**0.25 - TMP22 = LOG((1.0+TMP12*TMP12)/2.0) - TMP32 = LOG((1.0+TMP12)/2.0) - FM2NEW = 2.0*TMP32 + TMP22 - 2.0*ATAN(TMP12) + 1.5707963 - FH2NEW = 2*TMP22 - ELSE - FMNEW = -5.0*MOZ - FHNEW = FMNEW - FM2NEW = -5.0*MOZ2 - FH2NEW = FM2NEW - ENDIF - -! except for first iteration, weight stability factors for previous -! iteration to help avoid flip-flops from one iteration to the next - - IF (ITER == 1) THEN - FM = FMNEW - FH = FHNEW - FM2 = FM2NEW - FH2 = FH2NEW - ELSE - FM = 0.5 * (FM+FMNEW) - FH = 0.5 * (FH+FHNEW) - FM2 = 0.5 * (FM2+FM2NEW) - FH2 = 0.5 * (FH2+FH2NEW) - ENDIF - -! exchange coefficients - - FH = MIN(FH,0.9*TMPCH) - FM = MIN(FM,0.9*TMPCM) - FH2 = MIN(FH2,0.9*TMPCH2) - FM2 = MIN(FM2,0.9*TMPCM2) - - CMFM = TMPCM-FM - CHFH = TMPCH-FH - CM2FM2 = TMPCM2-FM2 - CH2FH2 = TMPCH2-FH2 - IF(ABS(CMFM) <= MPE) CMFM = MPE - IF(ABS(CHFH) <= MPE) CHFH = MPE - IF(ABS(CM2FM2) <= MPE) CM2FM2 = MPE - IF(ABS(CH2FH2) <= MPE) CH2FH2 = MPE - CM = VKC*VKC/(CMFM*CMFM) - CH = VKC*VKC/(CMFM*CHFH) - CH2 = VKC*VKC/(CM2FM2*CH2FH2) - -! friction velocity - - FV = UR * SQRT(CM) - CH2 = VKC*FV/CH2FH2 - - END SUBROUTINE SFCDIF1 - -!== begin sfcdif2 ================================================================================== - - SUBROUTINE SFCDIF2(parameters,ITER ,Z0 ,THZ0 ,THLM ,SFCSPD , & !in - ZLM ,ILOC ,JLOC , & !in - AKMS ,AKHS ,RLMO ,WSTAR2 , & !in - USTAR ) !out - -! ------------------------------------------------------------------------------------------------- -! SUBROUTINE SFCDIF (renamed SFCDIF_off to avoid clash with Eta PBL) -! ------------------------------------------------------------------------------------------------- -! CALCULATE SURFACE LAYER EXCHANGE COEFFICIENTS VIA ITERATIVE PROCESS. -! SEE CHEN ET AL (1997, BLM) -! ------------------------------------------------------------------------------------------------- - IMPLICIT NONE - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: ILOC - INTEGER, INTENT(IN) :: JLOC - INTEGER, INTENT(IN) :: ITER - REAL, INTENT(IN) :: ZLM, Z0, THZ0, THLM, SFCSPD - REAL, intent(INOUT) :: AKMS - REAL, intent(INOUT) :: AKHS - REAL, intent(INOUT) :: RLMO - REAL, intent(INOUT) :: WSTAR2 - REAL, intent(OUT) :: USTAR - - REAL ZZ, PSLMU, PSLMS, PSLHU, PSLHS - REAL XX, PSPMU, YY, PSPMS, PSPHU, PSPHS - REAL ZILFC, ZU, ZT, RDZ, CXCH - REAL DTHV, DU2, BTGH, ZSLU, ZSLT, RLOGU, RLOGT - REAL ZETALT, ZETALU, ZETAU, ZETAT, XLU4, XLT4, XU4, XT4 - - REAL XLU, XLT, XU, XT, PSMZ, SIMM, PSHZ, SIMH, USTARK, RLMN, & - & RLMA - - INTEGER ILECH, ITR - - INTEGER, PARAMETER :: ITRMX = 5 - REAL, PARAMETER :: WWST = 1.2 - REAL, PARAMETER :: WWST2 = WWST * WWST - REAL, PARAMETER :: VKRM = 0.40 - REAL, PARAMETER :: EXCM = 0.001 - REAL, PARAMETER :: BETA = 1.0 / 270.0 - REAL, PARAMETER :: BTG = BETA * GRAV - REAL, PARAMETER :: ELFC = VKRM * BTG - REAL, PARAMETER :: WOLD = 0.15 - REAL, PARAMETER :: WNEW = 1.0 - WOLD - REAL, PARAMETER :: PIHF = 3.14159265 / 2.0 - REAL, PARAMETER :: EPSU2 = 1.0E-4 - REAL, PARAMETER :: EPSUST = 0.07 - REAL, PARAMETER :: EPSIT = 1.0E-4 - REAL, PARAMETER :: EPSA = 1.0E-8 - REAL, PARAMETER :: ZTMIN = -5.0 - REAL, PARAMETER :: ZTMAX = 1.0 - REAL, PARAMETER :: HPBL = 1000.0 - REAL, PARAMETER :: SQVISC = 258.2 - REAL, PARAMETER :: RIC = 0.183 - REAL, PARAMETER :: RRIC = 1.0 / RIC - REAL, PARAMETER :: FHNEU = 0.8 - REAL, PARAMETER :: RFC = 0.191 - REAL, PARAMETER :: RFAC = RIC / ( FHNEU * RFC * RFC ) - -! ---------------------------------------------------------------------- -! NOTE: THE TWO CODE BLOCKS BELOW DEFINE FUNCTIONS -! ---------------------------------------------------------------------- -! LECH'S SURFACE FUNCTIONS - PSLMU (ZZ)= -0.96* log (1.0-4.5* ZZ) - PSLMS (ZZ)= ZZ * RRIC -2.076* (1.0 -1.0/ (ZZ +1.0)) - PSLHU (ZZ)= -0.96* log (1.0-4.5* ZZ) - PSLHS (ZZ)= ZZ * RFAC -2.076* (1.0 -1.0/ (ZZ +1.0)) -! PAULSON'S SURFACE FUNCTIONS - PSPMU (XX)= -2.0* log ( (XX +1.0)*0.5) - log ( (XX * XX +1.0)*0.5) & - & +2.0* ATAN (XX) & - &- PIHF - PSPMS (YY)= 5.0* YY - PSPHU (XX)= -2.0* log ( (XX * XX +1.0)*0.5) - PSPHS (YY)= 5.0* YY - -! THIS ROUTINE SFCDIF CAN HANDLE BOTH OVER OPEN WATER (SEA, OCEAN) AND -! OVER SOLID SURFACE (LAND, SEA-ICE). -! ---------------------------------------------------------------------- -! ZTFC: RATIO OF ZOH/ZOM LESS OR EQUAL THAN 1 -! C......ZTFC=0.1 -! CZIL: CONSTANT C IN Zilitinkevich, S. S.1995,:NOTE ABOUT ZT -! ---------------------------------------------------------------------- - ILECH = 0 - -! ---------------------------------------------------------------------- - ZILFC = - parameters%CZIL * VKRM * SQVISC - ZU = Z0 - RDZ = 1.0/ ZLM - CXCH = EXCM * RDZ - DTHV = THLM - THZ0 - -! BELJARS CORRECTION OF USTAR - DU2 = MAX (SFCSPD * SFCSPD,EPSU2) - BTGH = BTG * HPBL - - IF(ITER == 1) THEN - IF (BTGH * AKHS * DTHV .ne. 0.0) THEN - WSTAR2 = WWST2* ABS (BTGH * AKHS * DTHV)** (2.0/3.0) - ELSE - WSTAR2 = 0.0 - END IF - USTAR = MAX (SQRT (AKMS * SQRT (DU2+ WSTAR2)),EPSUST) - RLMO = ELFC * AKHS * DTHV / USTAR **3 - END IF - -! ZILITINKEVITCH APPROACH FOR ZT - ZT = MAX(1.0E-6,EXP (ZILFC * SQRT (USTAR * Z0))* Z0) - ZSLU = ZLM + ZU - ZSLT = ZLM + ZT - RLOGU = log (ZSLU / ZU) - RLOGT = log (ZSLT / ZT) - -! ---------------------------------------------------------------------- -! 1./MONIN-OBUKKHOV LENGTH-SCALE -! ---------------------------------------------------------------------- - ZETALT = MAX (ZSLT * RLMO,ZTMIN) - RLMO = ZETALT / ZSLT - ZETALU = ZSLU * RLMO - ZETAU = ZU * RLMO - ZETAT = ZT * RLMO - - IF (ILECH .eq. 0) THEN - IF (RLMO .lt. 0.0)THEN - XLU4 = 1.0 -16.0* ZETALU - XLT4 = 1.0 -16.0* ZETALT - XU4 = 1.0 -16.0* ZETAU - XT4 = 1.0 -16.0* ZETAT - XLU = SQRT (SQRT (XLU4)) - XLT = SQRT (SQRT (XLT4)) - XU = SQRT (SQRT (XU4)) - - XT = SQRT (SQRT (XT4)) - PSMZ = PSPMU (XU) - SIMM = PSPMU (XLU) - PSMZ + RLOGU - PSHZ = PSPHU (XT) - SIMH = PSPHU (XLT) - PSHZ + RLOGT - ELSE - ZETALU = MIN (ZETALU,ZTMAX) - ZETALT = MIN (ZETALT,ZTMAX) - ZETAU = MIN (ZETAU,ZTMAX/(ZSLU/ZU)) ! Barlage: add limit on ZETAU/ZETAT - ZETAT = MIN (ZETAT,ZTMAX/(ZSLT/ZT)) ! Barlage: prevent SIMM/SIMH < 0 - PSMZ = PSPMS (ZETAU) - SIMM = PSPMS (ZETALU) - PSMZ + RLOGU - PSHZ = PSPHS (ZETAT) - SIMH = PSPHS (ZETALT) - PSHZ + RLOGT - END IF -! ---------------------------------------------------------------------- -! LECH'S FUNCTIONS -! ---------------------------------------------------------------------- - ELSE - IF (RLMO .lt. 0.0)THEN - PSMZ = PSLMU (ZETAU) - SIMM = PSLMU (ZETALU) - PSMZ + RLOGU - PSHZ = PSLHU (ZETAT) - SIMH = PSLHU (ZETALT) - PSHZ + RLOGT - ELSE - ZETALU = MIN (ZETALU,ZTMAX) - ZETALT = MIN (ZETALT,ZTMAX) - PSMZ = PSLMS (ZETAU) - SIMM = PSLMS (ZETALU) - PSMZ + RLOGU - PSHZ = PSLHS (ZETAT) - SIMH = PSLHS (ZETALT) - PSHZ + RLOGT - END IF -! ---------------------------------------------------------------------- - END IF - -! ---------------------------------------------------------------------- -! BELJAARS CORRECTION FOR USTAR -! ---------------------------------------------------------------------- - USTAR = MAX (SQRT (AKMS * SQRT (DU2+ WSTAR2)),EPSUST) - -! ZILITINKEVITCH FIX FOR ZT - ZT = MAX(1.0E-6,EXP (ZILFC * SQRT (USTAR * Z0))* Z0) - ZSLT = ZLM + ZT -!----------------------------------------------------------------------- - RLOGT = log (ZSLT / ZT) - USTARK = USTAR * VKRM - IF(SIMM < 1.0e-6) SIMM = 1.0e-6 ! Limit stability function - AKMS = MAX (USTARK / SIMM,CXCH) -!----------------------------------------------------------------------- -! IF STATEMENTS TO AVOID TANGENT LINEAR PROBLEMS NEAR ZERO -!----------------------------------------------------------------------- - IF(SIMH < 1.0e-6) SIMH = 1.0e-6 ! Limit stability function - AKHS = MAX (USTARK / SIMH,CXCH) - - IF (BTGH * AKHS * DTHV .ne. 0.0) THEN - WSTAR2 = WWST2* ABS (BTGH * AKHS * DTHV)** (2.0/3.0) - ELSE - WSTAR2 = 0.0 - END IF -!----------------------------------------------------------------------- - RLMN = ELFC * AKHS * DTHV / USTAR **3 -!----------------------------------------------------------------------- -! IF(ABS((RLMN-RLMO)/RLMA).LT.EPSIT) GO TO 110 -!----------------------------------------------------------------------- - RLMA = RLMO * WOLD+ RLMN * WNEW -!----------------------------------------------------------------------- - RLMO = RLMA - -! END DO -! ---------------------------------------------------------------------- - END SUBROUTINE SFCDIF2 - -!== begin esat ===================================================================================== - - SUBROUTINE ESAT(T, ESW, ESI, DESW, DESI) -!--------------------------------------------------------------------------------------------------- -! use polynomials to calculate saturation vapor pressure and derivative with -! respect to temperature: over water when t > 0 c and over ice when t <= 0 c - IMPLICIT NONE -!--------------------------------------------------------------------------------------------------- -! in - - REAL, intent(in) :: T !temperature - -!out - - REAL, intent(out) :: ESW !saturation vapor pressure over water (pa) - REAL, intent(out) :: ESI !saturation vapor pressure over ice (pa) - REAL, intent(out) :: DESW !d(esat)/dt over water (pa/K) - REAL, intent(out) :: DESI !d(esat)/dt over ice (pa/K) - -! local - - REAL :: A0,A1,A2,A3,A4,A5,A6 !coefficients for esat over water - REAL :: B0,B1,B2,B3,B4,B5,B6 !coefficients for esat over ice - REAL :: C0,C1,C2,C3,C4,C5,C6 !coefficients for dsat over water - REAL :: D0,D1,D2,D3,D4,D5,D6 !coefficients for dsat over ice - - PARAMETER (A0=6.107799961 , A1=4.436518521E-01, & - A2=1.428945805E-02, A3=2.650648471E-04, & - A4=3.031240396E-06, A5=2.034080948E-08, & - A6=6.136820929E-11) - - PARAMETER (B0=6.109177956 , B1=5.034698970E-01, & - B2=1.886013408E-02, B3=4.176223716E-04, & - B4=5.824720280E-06, B5=4.838803174E-08, & - B6=1.838826904E-10) - - PARAMETER (C0= 4.438099984E-01, C1=2.857002636E-02, & - C2= 7.938054040E-04, C3=1.215215065E-05, & - C4= 1.036561403E-07, C5=3.532421810e-10, & - C6=-7.090244804E-13) - - PARAMETER (D0=5.030305237E-01, D1=3.773255020E-02, & - D2=1.267995369E-03, D3=2.477563108E-05, & - D4=3.005693132E-07, D5=2.158542548E-09, & - D6=7.131097725E-12) - - ESW = 100.0*(A0+T*(A1+T*(A2+T*(A3+T*(A4+T*(A5+T*A6)))))) - ESI = 100.0*(B0+T*(B1+T*(B2+T*(B3+T*(B4+T*(B5+T*B6)))))) - DESW = 100.0*(C0+T*(C1+T*(C2+T*(C3+T*(C4+T*(C5+T*C6)))))) - DESI = 100.0*(D0+T*(D1+T*(D2+T*(D3+T*(D4+T*(D5+T*D6)))))) - - END SUBROUTINE ESAT - -!== begin stomata ================================================================================== - - SUBROUTINE STOMATA (parameters,VEGTYP ,MPE ,APAR ,FOLN ,ILOC , JLOC, & !in - TV ,EI ,EA ,SFCTMP ,SFCPRS , & !in - O2 ,CO2 ,IGS ,BTRAN ,RB , & !in - RS ,PSN ) !out -! -------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------------- -! input - type (noahmp_parameters), intent(in) :: parameters - INTEGER,INTENT(IN) :: ILOC !grid index - INTEGER,INTENT(IN) :: JLOC !grid index - INTEGER,INTENT(IN) :: VEGTYP !vegetation physiology type - - REAL, INTENT(IN) :: IGS !growing season index (0=off, 1=on) - REAL, INTENT(IN) :: MPE !prevents division by zero errors - - REAL, INTENT(IN) :: TV !foliage temperature (k) - REAL, INTENT(IN) :: EI !vapor pressure inside leaf (sat vapor press at tv) (pa) - REAL, INTENT(IN) :: EA !vapor pressure of canopy air (pa) - REAL, INTENT(IN) :: APAR !par absorbed per unit lai (w/m2) - REAL, INTENT(IN) :: O2 !atmospheric o2 concentration (pa) - REAL, INTENT(IN) :: CO2 !atmospheric co2 concentration (pa) - REAL, INTENT(IN) :: SFCPRS !air pressure at reference height (pa) - REAL, INTENT(IN) :: SFCTMP !air temperature at reference height (k) - REAL, INTENT(IN) :: BTRAN !soil water transpiration factor (0 to 1) - REAL, INTENT(IN) :: FOLN !foliage nitrogen concentration (%) - REAL, INTENT(IN) :: RB !boundary layer resistance (s/m) - -! output - REAL, INTENT(OUT) :: RS !leaf stomatal resistance (s/m) - REAL, INTENT(OUT) :: PSN !foliage photosynthesis (umol co2 /m2/ s) [always +] - -! in&out - REAL :: RLB !boundary layer resistance (s m2 / umol) -! --------------------------------------------------------------------------------------------- - -! ------------------------ local variables ---------------------------------------------------- - INTEGER :: ITER !iteration index - INTEGER :: NITER !number of iterations - - DATA NITER /3/ - SAVE NITER - - REAL :: AB !used in statement functions - REAL :: BC !used in statement functions - REAL :: F1 !generic temperature response (statement function) - REAL :: F2 !generic temperature inhibition (statement function) - REAL :: TC !foliage temperature (degree Celsius) - REAL :: CS !co2 concentration at leaf surface (pa) - REAL :: KC !co2 Michaelis-Menten constant (pa) - REAL :: KO !o2 Michaelis-Menten constant (pa) - REAL :: A,B,C,Q !intermediate calculations for RS - REAL :: R1,R2 !roots for RS - REAL :: FNF !foliage nitrogen adjustment factor (0 to 1) - REAL :: PPF !absorb photosynthetic photon flux (umol photons/m2/s) - REAL :: WC !Rubisco limited photosynthesis (umol co2/m2/s) - REAL :: WJ !light limited photosynthesis (umol co2/m2/s) - REAL :: WE !export limited photosynthesis (umol co2/m2/s) - REAL :: CP !co2 compensation point (pa) - REAL :: CI !internal co2 (pa) - REAL :: AWC !intermediate calculation for wc - REAL :: VCMX !maximum rate of carbonylation (umol co2/m2/s) - REAL :: J !electron transport (umol co2/m2/s) - REAL :: CEA !constrain ea or else model blows up - REAL :: CF !s m2/umol -> s/m - - F1(AB,BC) = AB**((BC-25.0)/10.0) - F2(AB) = 1.0 + EXP((-2.2E05+710.0*(AB+273.16))/(8.314*(AB+273.16))) - REAL :: T -! --------------------------------------------------------------------------------------------- - -! initialize RS=RSMAX and PSN=0 because will only do calculations -! for APAR > 0, in which case RS <= RSMAX and PSN >= 0 - - CF = SFCPRS/(8.314*SFCTMP)*1.0e06 - RS = 1.0/parameters%BP * CF - PSN = 0.0 - - IF (APAR .LE. 0.0) RETURN - - FNF = MIN( FOLN/MAX(MPE,parameters%FOLNMX), 1.0 ) - TC = TV-TFRZ - PPF = 4.6*APAR - J = PPF*parameters%QE25 - KC = parameters%KC25 * F1(parameters%AKC,TC) - KO = parameters%KO25 * F1(parameters%AKO,TC) - AWC = KC * (1.0+O2/KO) - CP = 0.5*KC/KO*O2*0.21 - VCMX = parameters%VCMX25 / F2(TC) * FNF * BTRAN * F1(parameters%AVCMX,TC) - -! first guess ci - - CI = 0.7*CO2*parameters%C3PSN + 0.4*CO2*(1.0-parameters%C3PSN) - -! rb: s/m -> s m**2 / umol - - RLB = RB/CF - -! constrain ea - - CEA = MAX(0.25*EI*parameters%C3PSN+0.40*EI*(1.0-parameters%C3PSN), MIN(EA,EI) ) - -! ci iteration -!jref: C3PSN is equal to 1 for all veg types. - DO ITER = 1, NITER - WJ = MAX(CI-CP,0.0)*J/(CI+2.0*CP)*parameters%C3PSN + J*(1.0-parameters%C3PSN) - WC = MAX(CI-CP,0.0)*VCMX/(CI+AWC)*parameters%C3PSN + VCMX*(1.0-parameters%C3PSN) - WE = 0.5*VCMX*parameters%C3PSN + 4000.0*VCMX*CI/SFCPRS*(1.0-parameters%C3PSN) - PSN = MIN(WJ,WC,WE) * IGS - - CS = MAX( CO2-1.37*RLB*SFCPRS*PSN, MPE ) - A = parameters%MP*PSN*SFCPRS*CEA / (CS*EI) + parameters%BP - B = ( parameters%MP*PSN*SFCPRS/CS + parameters%BP ) * RLB - 1.0 - C = -RLB - IF (B .GE. 0.0) THEN - Q = -0.5*( B + SQRT(B*B-4.0*A*C) ) - ELSE - Q = -0.5*( B - SQRT(B*B-4.0*A*C) ) - END IF - R1 = Q/A - R2 = C/Q - RS = MAX(R1,R2) - CI = MAX( CS-PSN*SFCPRS*1.65*RS, 0.0 ) - END DO - -! rs, rb: s m**2 / umol -> s/m - - RS = RS*CF - - END SUBROUTINE STOMATA - -!== begin canres =================================================================================== - - SUBROUTINE CANRES (parameters,PAR ,SFCTMP,RCSOIL ,EAH ,SFCPRS , & !in - RC ,PSN ,ILOC ,JLOC ) !out - -! -------------------------------------------------------------------------------------------------- -! calculate canopy resistance which depends on incoming solar radiation, -! air temperature, atmospheric water vapor pressure deficit at the -! lowest model level, and soil moisture (preferably unfrozen soil -! moisture rather than total) -! -------------------------------------------------------------------------------------------------- -! source: Jarvis (1976), Noilhan and Planton (1989, MWR), Jacquemin and -! Noilhan (1990, BLM). Chen et al (1996, JGR, Vol 101(D3), 7251-7268), -! eqns 12-14 and table 2 of sec. 3.1.2 -! -------------------------------------------------------------------------------------------------- -!niu USE module_Noahlsm_utility -! -------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------------- -! inputs - - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: ILOC !grid index - INTEGER, INTENT(IN) :: JLOC !grid index - REAL, INTENT(IN) :: PAR !par absorbed per unit sunlit lai (w/m2) - REAL, INTENT(IN) :: SFCTMP !canopy air temperature - REAL, INTENT(IN) :: SFCPRS !surface pressure (pa) - REAL, INTENT(IN) :: EAH !water vapor pressure (pa) - REAL, INTENT(IN) :: RCSOIL !soil moisture stress factor - -!outputs - - REAL, INTENT(OUT) :: RC !canopy resistance per unit LAI - REAL, INTENT(OUT) :: PSN !foliage photosynthesis (umolco2/m2/s) - -!local - - REAL :: RCQ - REAL :: RCS - REAL :: RCT - REAL :: FF - REAL :: Q2 !water vapor mixing ratio (kg/kg) - REAL :: Q2SAT !saturation Q2 - REAL :: DQSDT2 !d(Q2SAT)/d(T) - -! RSMIN, RSMAX, TOPT, RGL, HS are canopy stress parameters set in REDPRM -! ---------------------------------------------------------------------- -! initialize canopy resistance multiplier terms. -! ---------------------------------------------------------------------- - RC = 0.0 - RCS = 0.0 - RCT = 0.0 - RCQ = 0.0 - -! compute Q2 and Q2SAT - - Q2 = 0.622 * EAH / (SFCPRS - 0.378 * EAH) !specific humidity [kg/kg] - Q2 = Q2 / (1.0 + Q2) !mixing ratio [kg/kg] - - CALL CALHUM(parameters,SFCTMP, SFCPRS, Q2SAT, DQSDT2) - -! contribution due to incoming solar radiation - - FF = 2.0 * PAR / parameters%RGL - RCS = (FF + parameters%RSMIN / parameters%RSMAX) / (1.0+ FF) - RCS = MAX (RCS,0.0001) - -! contribution due to air temperature - - RCT = 1.0- 0.0016* ( (parameters%TOPT - SFCTMP)**2.0) - RCT = MAX (RCT,0.0001) - -! contribution due to vapor pressure deficit - - RCQ = 1.0/ (1.0+ parameters%HS * MAX(0.0,Q2SAT-Q2)) - RCQ = MAX (RCQ,0.01) - -! determine canopy resistance due to all factors - - RC = parameters%RSMIN / (RCS * RCT * RCQ * RCSOIL) - PSN = -999.99 ! PSN not applied for dynamic carbon - - END SUBROUTINE CANRES - -!== begin calhum =================================================================================== - - SUBROUTINE CALHUM(parameters,SFCTMP, SFCPRS, Q2SAT, DQSDT2) - - IMPLICIT NONE - - type (noahmp_parameters), intent(in) :: parameters - REAL, INTENT(IN) :: SFCTMP, SFCPRS - REAL, INTENT(OUT) :: Q2SAT, DQSDT2 - REAL, PARAMETER :: A2=17.67,A3=273.15,A4=29.65, ELWV=2.501E6, & - A23M4=A2*(A3-A4), E0=0.611, RV=461.0, & - EPSILON=0.622 - REAL :: ES, SFCPRSX - -! Q2SAT: saturated mixing ratio - ES = E0 * EXP ( ELWV/RV*(1.0/A3 - 1.0/SFCTMP) ) -! convert SFCPRS from Pa to KPa - SFCPRSX = SFCPRS*1.0E-3 - Q2SAT = EPSILON * ES / (SFCPRSX-ES) -! convert from g/g to g/kg - Q2SAT = Q2SAT * 1.0E3 -! Q2SAT is currently a 'mixing ratio' - -! DQSDT2 is calculated assuming Q2SAT is a specific humidity - DQSDT2=(Q2SAT/(1+Q2SAT))*A23M4/(SFCTMP-A4)**2 - -! DG Q2SAT needs to be in g/g when returned for SFLX - Q2SAT = Q2SAT / 1.0E3 - - END SUBROUTINE CALHUM - -!== begin tsnosoi ================================================================================== - - SUBROUTINE TSNOSOI (parameters,ICE ,NSOIL ,NSNOW ,ISNOW ,IST , & !in - TBOT ,ZSNSO ,SSOIL ,DF ,HCPCT , & !in - SAG ,DT ,SNOWH ,DZSNSO , & !in - TG ,ILOC ,JLOC , & !in - STC ,EFLXB ) !inout -! -------------------------------------------------------------------------------------------------- -! Compute snow (up to 3L) and soil (4L) temperature. Note that snow temperatures -! during melting season may exceed melting point (TFRZ) but later in PHASECHANGE -! subroutine the snow temperatures are reset to TFRZ for melting snow. -! -------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------------- -!input - - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: ILOC - INTEGER, INTENT(IN) :: JLOC - INTEGER, INTENT(IN) :: ICE ! - INTEGER, INTENT(IN) :: NSOIL !no of soil layers (4) - INTEGER, INTENT(IN) :: NSNOW !maximum no of snow layers (3) - INTEGER, INTENT(IN) :: ISNOW !actual no of snow layers - INTEGER, INTENT(IN) :: IST !surface type - - REAL, INTENT(IN) :: DT !time step (s) - REAL, INTENT(IN) :: TBOT ! - REAL, INTENT(IN) :: SSOIL !ground heat flux (w/m2) - REAL, INTENT(IN) :: SAG !solar rad. absorbed by ground (w/m2) - REAL, INTENT(IN) :: SNOWH !snow depth (m) - REAL, INTENT(IN) :: TG !ground temperature (k) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: ZSNSO !layer-bot. depth from snow surf.(m) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !snow/soil layer thickness (m) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DF !thermal conductivity - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: HCPCT !heat capacity (J/m3/k) - REAL, INTENT(OUT) :: EFLXB !energy influx from soil bottom (w/m2) - -!input and output - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC - -!local - INTEGER :: IZ - REAL :: ZBOTSNO !ZBOT from snow surface - REAL, DIMENSION(-NSNOW+1:NSOIL) :: AI, BI, CI, RHSTS - REAL, DIMENSION(-NSNOW+1:NSOIL) :: PHI !light through water (w/m2) - - REAL, DIMENSION(-NSNOW+1:NSOIL) :: TBEG - REAL :: ERR_EST !heat storage error (w/m2) - REAL :: SSOIL2 !ground heat flux (w/m2) (for energy check) - REAL :: EFLXB2 !heat flux from the bottom (w/m2) (for energy check) - character(len=256) :: message -! ---------------------------------------------------------------------- -! compute solar penetration through water, needs more work - - PHI(ISNOW+1:NSOIL) = 0.0 - -! adjust ZBOT from soil surface to ZBOTSNO from snow surface - - ZBOTSNO = parameters%ZBOT - SNOWH !from snow surface - -! snow/soil heat storage for energy balance check - - DO IZ = ISNOW+1, NSOIL - TBEG(IZ) = STC(IZ) - ENDDO - -! compute soil temperatures - - CALL HRT (parameters,NSNOW ,NSOIL ,ISNOW ,ZSNSO , & - STC ,TBOT ,ZBOTSNO ,DT , & - DF ,HCPCT ,SSOIL ,PHI , & - AI ,BI ,CI ,RHSTS , & - EFLXB ) - - CALL HSTEP (parameters,NSNOW ,NSOIL ,ISNOW ,DT , & - AI ,BI ,CI ,RHSTS , & - STC ) - -! update ground heat flux just for energy check, but not for final output -! otherwise, it would break the surface energy balance - - IF(OPT_TBOT == 1) THEN - EFLXB2 = 0.0 - ELSE IF(OPT_TBOT == 2) THEN - EFLXB2 = DF(NSOIL)*(TBOT-STC(NSOIL)) / & - (0.5*(ZSNSO(NSOIL-1)+ZSNSO(NSOIL)) - ZBOTSNO) - END IF - - ! Skip the energy balance check for now, until we can make it work - ! right for small time steps. - return - -! energy balance check - - ERR_EST = 0.0 - DO IZ = ISNOW+1, NSOIL - ERR_EST = ERR_EST + (STC(IZ)-TBEG(IZ)) * DZSNSO(IZ) * HCPCT(IZ) / DT - ENDDO - - if (OPT_STC == 1 .OR. OPT_STC == 3) THEN ! semi-implicit - ERR_EST = ERR_EST - (SSOIL +EFLXB) - ELSE ! full-implicit - SSOIL2 = DF(ISNOW+1)*(TG-STC(ISNOW+1))/(0.5*DZSNSO(ISNOW+1)) !M. Barlage - ERR_EST = ERR_EST - (SSOIL2+EFLXB2) - ENDIF - - IF (ABS(ERR_EST) > 1.0) THEN ! W/m2 - WRITE(message,*) 'TSNOSOI is losing(-)/gaining(+) false energy',ERR_EST,' W/m2' - call wrf_message(trim(message)) - WRITE(message,'(i6,1x,i6,1x,i3,F18.13,5F20.12)') & - ILOC, JLOC, IST,ERR_EST,SSOIL,SNOWH,TG,STC(ISNOW+1),EFLXB - call wrf_message(trim(message)) - !niu STOP - END IF - - END SUBROUTINE TSNOSOI - -!== begin hrt ====================================================================================== - - SUBROUTINE HRT (parameters,NSNOW ,NSOIL ,ISNOW ,ZSNSO , & - STC ,TBOT ,ZBOT ,DT , & - DF ,HCPCT ,SSOIL ,PHI , & - AI ,BI ,CI ,RHSTS , & - BOTFLX ) -! ---------------------------------------------------------------------- -! ---------------------------------------------------------------------- -! calculate the right hand side of the time tendency term of the soil -! thermal diffusion equation. also to compute ( prepare ) the matrix -! coefficients for the tri-diagonal matrix of the implicit time scheme. -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! input - - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: NSOIL !no of soil layers (4) - INTEGER, INTENT(IN) :: NSNOW !maximum no of snow layers (3) - INTEGER, INTENT(IN) :: ISNOW !actual no of snow layers - REAL, INTENT(IN) :: TBOT !bottom soil temp. at ZBOT (k) - REAL, INTENT(IN) :: ZBOT !depth of lower boundary condition (m) - !from soil surface not snow surface - REAL, INTENT(IN) :: DT !time step (s) - REAL, INTENT(IN) :: SSOIL !ground heat flux (w/m2) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: ZSNSO !depth of layer-bottom of snow/soil (m) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: STC !snow/soil temperature (k) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DF !thermal conductivity [w/m/k] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: HCPCT !heat capacity [j/m3/k] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: PHI !light through water (w/m2) - -! output - - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: RHSTS !right-hand side of the matrix - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: AI !left-hand side coefficient - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: BI !left-hand side coefficient - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: CI !left-hand side coefficient - REAL, INTENT(OUT) :: BOTFLX !energy influx from soil bottom (w/m2) - -! local - - INTEGER :: K - REAL, DIMENSION(-NSNOW+1:NSOIL) :: DDZ - REAL, DIMENSION(-NSNOW+1:NSOIL) :: DZ - REAL, DIMENSION(-NSNOW+1:NSOIL) :: DENOM - REAL, DIMENSION(-NSNOW+1:NSOIL) :: DTSDZ - REAL, DIMENSION(-NSNOW+1:NSOIL) :: EFLUX - REAL :: TEMP1 -! ---------------------------------------------------------------------- - - DO K = ISNOW+1, NSOIL - IF (K == ISNOW+1) THEN - DENOM(K) = - ZSNSO(K) * HCPCT(K) - TEMP1 = - ZSNSO(K+1) - DDZ(K) = 2.0 / TEMP1 - DTSDZ(K) = 2.0 * (STC(K) - STC(K+1)) / TEMP1 - EFLUX(K) = DF(K) * DTSDZ(K) - SSOIL - PHI(K) - ELSE IF (K < NSOIL) THEN - DENOM(K) = (ZSNSO(K-1) - ZSNSO(K)) * HCPCT(K) - TEMP1 = ZSNSO(K-1) - ZSNSO(K+1) - DDZ(K) = 2.0 / TEMP1 - DTSDZ(K) = 2.0 * (STC(K) - STC(K+1)) / TEMP1 - EFLUX(K) = (DF(K)*DTSDZ(K) - DF(K-1)*DTSDZ(K-1)) - PHI(K) - ELSE IF (K == NSOIL) THEN - DENOM(K) = (ZSNSO(K-1) - ZSNSO(K)) * HCPCT(K) - TEMP1 = ZSNSO(K-1) - ZSNSO(K) - IF(OPT_TBOT == 1) THEN - BOTFLX = 0.0 - END IF - IF(OPT_TBOT == 2) THEN - DTSDZ(K) = (STC(K) - TBOT) / ( 0.5*(ZSNSO(K-1)+ZSNSO(K)) - ZBOT) - BOTFLX = -DF(K) * DTSDZ(K) - END IF - EFLUX(K) = (-BOTFLX - DF(K-1)*DTSDZ(K-1) ) - PHI(K) - END IF - END DO - - DO K = ISNOW+1, NSOIL - IF (K == ISNOW+1) THEN - AI(K) = 0.0 - CI(K) = - DF(K) * DDZ(K) / DENOM(K) - IF (OPT_STC == 1 .OR. OPT_STC == 3 ) THEN - BI(K) = - CI(K) - END IF - IF (OPT_STC == 2) THEN - BI(K) = - CI(K) + DF(K)/(0.5*ZSNSO(K)*ZSNSO(K)*HCPCT(K)) - END IF - ELSE IF (K < NSOIL) THEN - AI(K) = - DF(K-1) * DDZ(K-1) / DENOM(K) - CI(K) = - DF(K ) * DDZ(K ) / DENOM(K) - BI(K) = - (AI(K) + CI (K)) - ELSE IF (K == NSOIL) THEN - AI(K) = - DF(K-1) * DDZ(K-1) / DENOM(K) - CI(K) = 0.0 - BI(K) = - (AI(K) + CI(K)) - END IF - RHSTS(K) = EFLUX(K)/ (-DENOM(K)) - END DO - - END SUBROUTINE HRT - -!== begin hstep ==================================================================================== - - SUBROUTINE HSTEP (parameters,NSNOW ,NSOIL ,ISNOW ,DT , & - AI ,BI ,CI ,RHSTS , & - STC ) -! ---------------------------------------------------------------------- -! CALCULATE/UPDATE THE SOIL TEMPERATURE FIELD. -! ---------------------------------------------------------------------- - implicit none -! ---------------------------------------------------------------------- -! input - - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: NSOIL - INTEGER, INTENT(IN) :: NSNOW - INTEGER, INTENT(IN) :: ISNOW - REAL, INTENT(IN) :: DT - -! output & input - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: RHSTS - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: AI - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: BI - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: CI - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC - -! local - INTEGER :: K - REAL, DIMENSION(-NSNOW+1:NSOIL) :: RHSTSIN - REAL, DIMENSION(-NSNOW+1:NSOIL) :: CIIN -! ---------------------------------------------------------------------- - - DO K = ISNOW+1,NSOIL - RHSTS(K) = RHSTS(K) * DT - AI(K) = AI(K) * DT - BI(K) = 1.0 + BI(K) * DT - CI(K) = CI(K) * DT - END DO - -! copy values for input variables before call to rosr12 - - DO K = ISNOW+1,NSOIL - RHSTSIN(K) = RHSTS(K) - CIIN(K) = CI(K) - END DO - -! solve the tri-diagonal matrix equation - - CALL ROSR12 (CI,AI,BI,CIIN,RHSTSIN,RHSTS,ISNOW+1,NSOIL,NSNOW) - -! update snow & soil temperature - - DO K = ISNOW+1,NSOIL - STC (K) = STC (K) + CI (K) - END DO - - END SUBROUTINE HSTEP - -!== begin rosr12 =================================================================================== - - SUBROUTINE ROSR12 (P,A,B,C,D,DELTA,NTOP,NSOIL,NSNOW) -! ---------------------------------------------------------------------- -! SUBROUTINE ROSR12 -! ---------------------------------------------------------------------- -! INVERT (SOLVE) THE TRI-DIAGONAL MATRIX PROBLEM SHOWN BELOW: -! ### ### ### ### ### ### -! #B(1), C(1), 0 , 0 , 0 , . . . , 0 # # # # # -! #A(2), B(2), C(2), 0 , 0 , . . . , 0 # # # # # -! # 0 , A(3), B(3), C(3), 0 , . . . , 0 # # # # D(3) # -! # 0 , 0 , A(4), B(4), C(4), . . . , 0 # # P(4) # # D(4) # -! # 0 , 0 , 0 , A(5), B(5), . . . , 0 # # P(5) # # D(5) # -! # . . # # . # = # . # -! # . . # # . # # . # -! # . . # # . # # . # -! # 0 , . . . , 0 , A(M-2), B(M-2), C(M-2), 0 # #P(M-2)# #D(M-2)# -! # 0 , . . . , 0 , 0 , A(M-1), B(M-1), C(M-1)# #P(M-1)# #D(M-1)# -! # 0 , . . . , 0 , 0 , 0 , A(M) , B(M) # # P(M) # # D(M) # -! ### ### ### ### ### ### -! ---------------------------------------------------------------------- - IMPLICIT NONE - - INTEGER, INTENT(IN) :: NTOP - INTEGER, INTENT(IN) :: NSOIL,NSNOW - INTEGER :: K, KK - - REAL, DIMENSION(-NSNOW+1:NSOIL),INTENT(IN):: A, B, D - REAL, DIMENSION(-NSNOW+1:NSOIL),INTENT(INOUT):: C,P,DELTA - -! ---------------------------------------------------------------------- -! INITIALIZE EQN COEF C FOR THE LOWEST SOIL LAYER -! ---------------------------------------------------------------------- - C (NSOIL) = 0.0 - P (NTOP) = - C (NTOP) / B (NTOP) -! ---------------------------------------------------------------------- -! SOLVE THE COEFS FOR THE 1ST SOIL LAYER -! ---------------------------------------------------------------------- - DELTA (NTOP) = D (NTOP) / B (NTOP) -! ---------------------------------------------------------------------- -! SOLVE THE COEFS FOR SOIL LAYERS 2 THRU NSOIL -! ---------------------------------------------------------------------- - DO K = NTOP+1,NSOIL - P (K) = - C (K) * ( 1.0 / (B (K) + A (K) * P (K -1)) ) - DELTA (K) = (D (K) - A (K)* DELTA (K -1))* (1.0/ (B (K) + A (K)& - * P (K -1))) - END DO -! ---------------------------------------------------------------------- -! SET P TO DELTA FOR LOWEST SOIL LAYER -! ---------------------------------------------------------------------- - P (NSOIL) = DELTA (NSOIL) -! ---------------------------------------------------------------------- -! ADJUST P FOR SOIL LAYERS 2 THRU NSOIL -! ---------------------------------------------------------------------- - DO K = NTOP+1,NSOIL - KK = NSOIL - K + (NTOP-1) + 1 - P (KK) = P (KK) * P (KK +1) + DELTA (KK) - END DO -! ---------------------------------------------------------------------- - END SUBROUTINE ROSR12 - -!== begin phasechange ============================================================================== - - SUBROUTINE PHASECHANGE (parameters,NSNOW ,NSOIL ,ISNOW ,DT ,FACT , & !in - DZSNSO ,HCPCT ,IST ,ILOC ,JLOC , & !in - STC ,SNICE ,SNLIQ ,SNEQV ,SNOWH , & !inout - SMC ,SH2O , & !inout - QMELT ,IMELT ,PONDING ) !out -! ---------------------------------------------------------------------- -! melting/freezing of snow water and soil water -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! inputs - - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: ILOC !grid index - INTEGER, INTENT(IN) :: JLOC !grid index - INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers [=3] - INTEGER, INTENT(IN) :: NSOIL !No. of soil layers [=4] - INTEGER, INTENT(IN) :: ISNOW !actual no. of snow layers [<=3] - INTEGER, INTENT(IN) :: IST !surface type: 1->soil; 2->lake - REAL, INTENT(IN) :: DT !land model time step (sec) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: FACT !temporary - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !snow/soil layer thickness [m] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: HCPCT !heat capacity (J/m3/k) - -! outputs - INTEGER, DIMENSION(-NSNOW+1:NSOIL), INTENT(OUT) :: IMELT !phase change index - REAL, INTENT(OUT) :: QMELT !snowmelt rate [mm/s] - REAL, INTENT(OUT) :: PONDING!snowmelt when snow has no layer [mm] - -! inputs and outputs - - REAL, INTENT(INOUT) :: SNEQV - REAL, INTENT(INOUT) :: SNOWH - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow/soil layer temperature [k] - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SH2O !soil liquid water [m3/m3] - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SMC !total soil water [m3/m3] - REAL, DIMENSION(-NSNOW+1:0) , INTENT(INOUT) :: SNICE !snow layer ice [mm] - REAL, DIMENSION(-NSNOW+1:0) , INTENT(INOUT) :: SNLIQ !snow layer liquid water [mm] - -! local - - INTEGER :: J !do loop index - REAL, DIMENSION(-NSNOW+1:NSOIL) :: HM !energy residual [w/m2] - REAL, DIMENSION(-NSNOW+1:NSOIL) :: XM !melting or freezing water [kg/m2] - REAL, DIMENSION(-NSNOW+1:NSOIL) :: WMASS0 - REAL, DIMENSION(-NSNOW+1:NSOIL) :: WICE0 - REAL, DIMENSION(-NSNOW+1:NSOIL) :: WLIQ0 - REAL, DIMENSION(-NSNOW+1:NSOIL) :: MICE !soil/snow ice mass [mm] - REAL, DIMENSION(-NSNOW+1:NSOIL) :: MLIQ !soil/snow liquid water mass [mm] - REAL, DIMENSION(-NSNOW+1:NSOIL) :: SUPERCOOL !supercooled water in soil (kg/m2) - REAL :: HEATR !energy residual or loss after melting/freezing - REAL :: TEMP1 !temporary variables [kg/m2] - REAL :: PROPOR - REAL :: SMP !frozen water potential (mm) - REAL :: XMF !total latent heat of phase change - -! ---------------------------------------------------------------------- -! Initialization - - QMELT = 0.0 - PONDING = 0.0 - XMF = 0.0 - - DO J = -NSNOW+1, NSOIL - SUPERCOOL(J) = 0.0 - END DO - - DO J = ISNOW+1,0 ! all layers - MICE(J) = SNICE(J) - MLIQ(J) = SNLIQ(J) - END DO - - DO J = 1, NSOIL ! soil - MLIQ(J) = SH2O(J) * DZSNSO(J) * 1000.0 - MICE(J) = (SMC(J) - SH2O(J)) * DZSNSO(J) * 1000.0 - END DO - - DO J = ISNOW+1,NSOIL ! all layers - IMELT(J) = 0 - HM(J) = 0.0 - XM(J) = 0.0 - WICE0(J) = MICE(J) - WLIQ0(J) = MLIQ(J) - WMASS0(J) = MICE(J) + MLIQ(J) - ENDDO - - if(ist == 1) then - DO J = 1,NSOIL - IF (OPT_FRZ == 1) THEN - IF(STC(J) < TFRZ) THEN - SMP = HFUS*(TFRZ-STC(J))/(GRAV*STC(J)) !(m) - SUPERCOOL(J) = parameters%SMCMAX(J)*(SMP/parameters%PSISAT(J))**(-1.0/parameters%BEXP(J)) - SUPERCOOL(J) = SUPERCOOL(J)*DZSNSO(J)*1000.0 !(mm) - END IF - END IF - IF (OPT_FRZ == 2) THEN - IF(STC(J) < TFRZ) THEN - CALL FRH2O (parameters,J,SUPERCOOL(J),STC(J),SMC(J),SH2O(J)) - SUPERCOOL(J) = SUPERCOOL(J)*DZSNSO(J)*1000.0 !(mm) - END IF - END IF - ENDDO - end if - - DO J = ISNOW+1,NSOIL - IF (MICE(J) > 0.0 .AND. STC(J) >= TFRZ) THEN !melting - IMELT(J) = 1 - ENDIF - IF (MLIQ(J) > SUPERCOOL(J) .AND. STC(J) < TFRZ) THEN - IMELT(J) = 2 - ENDIF - - ! If snow exists, but its thickness is not enough to create a layer - IF (ISNOW == 0 .AND. SNEQV > 0.0 .AND. J == 1) THEN - IF (STC(J) >= TFRZ) THEN - IMELT(J) = 1 - ENDIF - ENDIF - ENDDO - -! Calculate the energy surplus and loss for melting and freezing - - DO J = ISNOW+1,NSOIL - IF (IMELT(J) > 0) THEN - HM(J) = (STC(J)-TFRZ)/FACT(J) - STC(J) = TFRZ - ENDIF - - IF (IMELT(J) == 1 .AND. HM(J) < 0.0) THEN - HM(J) = 0.0 - IMELT(J) = 0 - ENDIF - IF (IMELT(J) == 2 .AND. HM(J) > 0.0) THEN - HM(J) = 0.0 - IMELT(J) = 0 - ENDIF - XM(J) = HM(J)*DT/HFUS - ENDDO - -! The rate of melting and freezing for snow without a layer, needs more work. - - IF (ISNOW == 0 .AND. SNEQV > 0.0 .AND. XM(1) > 0.0) THEN - TEMP1 = SNEQV - SNEQV = MAX(0.0,TEMP1-XM(1)) - PROPOR = SNEQV/TEMP1 - SNOWH = MAX(0.0,PROPOR * SNOWH) - SNOWH = MIN(MAX(SNOWH,SNEQV/500.0),SNEQV/50.0) ! limit adjustment to a reasonable density - HEATR = HM(1) - HFUS*(TEMP1-SNEQV)/DT - IF (HEATR > 0.0) THEN - XM(1) = HEATR*DT/HFUS - HM(1) = HEATR - ELSE - XM(1) = 0.0 - HM(1) = 0.0 - ENDIF - QMELT = MAX(0.0,(TEMP1-SNEQV))/DT - XMF = HFUS*QMELT - PONDING = TEMP1-SNEQV - ENDIF - -! The rate of melting and freezing for snow and soil - - DO J = ISNOW+1,NSOIL - IF (IMELT(J) > 0 .AND. ABS(HM(J)) > 0.0) THEN - - HEATR = 0.0 - IF (XM(J) > 0.0) THEN - MICE(J) = MAX(0.0, WICE0(J)-XM(J)) - HEATR = HM(J) - HFUS*(WICE0(J)-MICE(J))/DT - ELSE IF (XM(J) < 0.0) THEN - IF (J <= 0) THEN ! snow - MICE(J) = MIN(WMASS0(J), WICE0(J)-XM(J)) - ELSE ! soil - IF (WMASS0(J) < SUPERCOOL(J)) THEN - MICE(J) = 0.0 - ELSE - MICE(J) = MIN(WMASS0(J) - SUPERCOOL(J),WICE0(J)-XM(J)) - MICE(J) = MAX(MICE(J),0.0) - ENDIF - ENDIF - HEATR = HM(J) - HFUS*(WICE0(J)-MICE(J))/DT - ENDIF - - MLIQ(J) = MAX(0.0,WMASS0(J)-MICE(J)) - - IF (ABS(HEATR) > 0.0) THEN - STC(J) = STC(J) + FACT(J)*HEATR - IF (J <= 0) THEN ! snow - IF (MLIQ(J)*MICE(J)>0.0) STC(J) = TFRZ - IF (MICE(J) == 0.0) THEN ! BARLAGE - STC(J) = TFRZ ! BARLAGE - HM(J+1) = HM(J+1) + HEATR ! BARLAGE - XM(J+1) = HM(J+1)*DT/HFUS ! BARLAGE - ENDIF - END IF - ENDIF - - XMF = XMF + HFUS * (WICE0(J)-MICE(J))/DT - - IF (J < 1) THEN - QMELT = QMELT + MAX(0.0,(WICE0(J)-MICE(J)))/DT - ENDIF - ENDIF - ENDDO - - DO J = ISNOW+1,0 ! snow - SNLIQ(J) = MLIQ(J) - SNICE(J) = MICE(J) - END DO - - DO J = 1, NSOIL ! soil - SH2O(J) = MLIQ(J) / (1000.0 * DZSNSO(J)) - SMC(J) = (MLIQ(J) + MICE(J)) / (1000.0 * DZSNSO(J)) - END DO - - END SUBROUTINE PHASECHANGE - -!== begin frh2o ==================================================================================== - - SUBROUTINE FRH2O (parameters,ISOIL,FREE,TKELV,SMC,SH2O) - -! ---------------------------------------------------------------------- -! SUBROUTINE FRH2O -! ---------------------------------------------------------------------- -! CALCULATE AMOUNT OF SUPERCOOLED LIQUID SOIL WATER CONTENT IF -! TEMPERATURE IS BELOW 273.15K (TFRZ). REQUIRES NEWTON-TYPE ITERATION -! TO SOLVE THE NONLINEAR IMPLICIT EQUATION GIVEN IN EQN 17 OF KOREN ET AL -! (1999, JGR, VOL 104(D16), 19569-19585). -! ---------------------------------------------------------------------- -! NEW VERSION (JUNE 2001): MUCH FASTER AND MORE ACCURATE NEWTON -! ITERATION ACHIEVED BY FIRST TAKING LOG OF EQN CITED ABOVE -- LESS THAN -! 4 (TYPICALLY 1 OR 2) ITERATIONS ACHIEVES CONVERGENCE. ALSO, EXPLICIT -! 1-STEP SOLUTION OPTION FOR SPECIAL CASE OF PARAMETER CK=0, WHICH -! REDUCES THE ORIGINAL IMPLICIT EQUATION TO A SIMPLER EXPLICIT FORM, -! KNOWN AS THE "FLERCHINGER EQN". IMPROVED HANDLING OF SOLUTION IN THE -! LIMIT OF FREEZING POINT TEMPERATURE TFRZ. -! ---------------------------------------------------------------------- -! INPUT: - -! TKELV.........TEMPERATURE (Kelvin) -! SMC...........TOTAL SOIL MOISTURE CONTENT (VOLUMETRIC) -! SH2O..........LIQUID SOIL MOISTURE CONTENT (VOLUMETRIC) -! B.............SOIL TYPE "B" PARAMETER (FROM REDPRM) -! PSISAT........SATURATED SOIL MATRIC POTENTIAL (FROM REDPRM) - -! OUTPUT: -! FREE..........SUPERCOOLED LIQUID WATER CONTENT [m3/m3] -! ---------------------------------------------------------------------- - IMPLICIT NONE - type (noahmp_parameters), intent(in) :: parameters - INTEGER,INTENT(IN) :: ISOIL - REAL, INTENT(IN) :: SH2O,SMC,TKELV - REAL, INTENT(OUT) :: FREE - REAL :: BX,DENOM,DF,DSWL,FK,SWL,SWLK - INTEGER :: NLOG,KCOUNT -! PARAMETER(CK = 0.0) - REAL, PARAMETER :: CK = 8.0, BLIM = 5.5, ERROR = 0.005, & - DICE = 920.0 - CHARACTER(LEN=80) :: message - -! ---------------------------------------------------------------------- -! LIMITS ON PARAMETER B: B < 5.5 (use parameter BLIM) -! SIMULATIONS SHOWED IF B > 5.5 UNFROZEN WATER CONTENT IS -! NON-REALISTICALLY HIGH AT VERY LOW TEMPERATURES. -! ---------------------------------------------------------------------- - BX = parameters%BEXP(ISOIL) -! ---------------------------------------------------------------------- -! INITIALIZING ITERATIONS COUNTER AND ITERATIVE SOLUTION FLAG. -! ---------------------------------------------------------------------- - - IF (parameters%BEXP(ISOIL) > BLIM) BX = BLIM - NLOG = 0 - -! ---------------------------------------------------------------------- -! IF TEMPERATURE NOT SIGNIFICANTLY BELOW FREEZING (TFRZ), SH2O = SMC -! ---------------------------------------------------------------------- - KCOUNT = 0 - IF (TKELV > (TFRZ- 1.0E-3)) THEN - FREE = SMC - ELSE - -! ---------------------------------------------------------------------- -! OPTION 1: ITERATED SOLUTION IN KOREN ET AL, JGR, 1999, EQN 17 -! ---------------------------------------------------------------------- -! INITIAL GUESS FOR SWL (frozen content) -! ---------------------------------------------------------------------- - IF (CK /= 0.0) THEN - SWL = SMC - SH2O -! ---------------------------------------------------------------------- -! KEEP WITHIN BOUNDS. -! ---------------------------------------------------------------------- - IF (SWL > (SMC -0.02)) SWL = SMC -0.02 -! ---------------------------------------------------------------------- -! START OF ITERATIONS -! ---------------------------------------------------------------------- - IF (SWL < 0.0) SWL = 0.0 -1001 Continue - IF (.NOT.( (NLOG < 10) .AND. (KCOUNT == 0))) goto 1002 - NLOG = NLOG +1 - DF = ALOG ( ( parameters%PSISAT(ISOIL) * GRAV / HFUS ) * ( ( 1.0 + CK * SWL )**2.0) * & - ( parameters%SMCMAX(ISOIL) / (SMC - SWL) )** BX) - ALOG ( - ( & - TKELV - TFRZ)/ TKELV) - DENOM = 2.0 * CK / ( 1.0 + CK * SWL ) + BX / ( SMC - SWL ) - SWLK = SWL - DF / DENOM -! ---------------------------------------------------------------------- -! BOUNDS USEFUL FOR MATHEMATICAL SOLUTION. -! ---------------------------------------------------------------------- - IF (SWLK > (SMC -0.02)) SWLK = SMC - 0.02 - IF (SWLK < 0.0) SWLK = 0.0 - -! ---------------------------------------------------------------------- -! MATHEMATICAL SOLUTION BOUNDS APPLIED. -! ---------------------------------------------------------------------- - DSWL = ABS (SWLK - SWL) -! IF MORE THAN 10 ITERATIONS, USE EXPLICIT METHOD (CK=0 APPROX.) -! WHEN DSWL LESS OR EQ. ERROR, NO MORE ITERATIONS REQUIRED. -! ---------------------------------------------------------------------- - SWL = SWLK - IF ( DSWL <= ERROR ) THEN - KCOUNT = KCOUNT +1 - END IF -! ---------------------------------------------------------------------- -! END OF ITERATIONS -! ---------------------------------------------------------------------- -! BOUNDS APPLIED WITHIN DO-BLOCK ARE VALID FOR PHYSICAL SOLUTION. -! ---------------------------------------------------------------------- - goto 1001 -1002 continue - FREE = SMC - SWL - END IF -! ---------------------------------------------------------------------- -! END OPTION 1 -! ---------------------------------------------------------------------- -! ---------------------------------------------------------------------- -! OPTION 2: EXPLICIT SOLUTION FOR FLERCHINGER EQ. i.e. CK=0 -! IN KOREN ET AL., JGR, 1999, EQN 17 -! APPLY PHYSICAL BOUNDS TO FLERCHINGER SOLUTION -! ---------------------------------------------------------------------- - IF (KCOUNT == 0) THEN - write(message, '("Flerchinger used in NEW version. Iterations=", I6)') NLOG - call wrf_message(trim(message)) - FK = ( ( (HFUS / (GRAV * ( - parameters%PSISAT(ISOIL))))* & - ( (TKELV - TFRZ)/ TKELV))** ( -1.0/ BX))* parameters%SMCMAX(ISOIL) - IF (FK < 0.02) FK = 0.02 - FREE = MIN (FK, SMC) -! ---------------------------------------------------------------------- -! END OPTION 2 -! ---------------------------------------------------------------------- - END IF - END IF -! ---------------------------------------------------------------------- - END SUBROUTINE FRH2O -! ---------------------------------------------------------------------- -! ================================================================================================== -! **********************End of energy subroutines*********************** -! ================================================================================================== - -!== begin water ==================================================================================== - - SUBROUTINE WATER (parameters,VEGTYP ,NSNOW ,NSOIL ,IMELT ,DT ,UU , & !in - VV ,FCEV ,FCTR ,QPRECC ,QPRECL ,ELAI , & !in - ESAI ,SFCTMP ,QVAP ,QDEW ,ZSOIL ,BTRANI , & !in - IRRFRA ,MIFAC ,FIFAC ,CROPLU , & !in - FICEOLD,PONDING,TG ,IST ,FVEG ,ILOC ,JLOC ,SMCEQ , & !in - BDFALL ,FP ,RAIN ,SNOW, & !in MB/AN: v3.7 - QSNOW ,QRAIN ,SNOWHIN,LATHEAV,LATHEAG,frozen_canopy,frozen_ground, & !in MB - DX ,TDFRACMP, & - ISNOW ,CANLIQ ,CANICE ,TV ,SNOWH ,SNEQV , & !inout - SNICE ,SNLIQ ,STC ,ZSNSO ,SH2O ,SMC , & !inout - SICE ,ZWT ,WA ,WT ,DZSNSO ,WSLAKE , & !inout - SMCWTD ,DEEPRECH,RECH , & !inout - IRAMTFI,IRAMTMI ,IRFIRATE ,IRMIRATE, & !inout - CMC ,ECAN ,ETRAN ,FWET ,RUNSRF ,RUNSUB , & !out - QIN ,QDIS ,PONDING1 ,PONDING2, & - QSNBOT ,QTLDRN , & - QSNSUB ,QSNFRO ,QSUBC ,QFROC ,QFRZC ,QMELTC , & - QEVAC ,QDEWC ,ACC_QINSUR,ACC_QSEVA ,ACC_ETRANI & -#ifdef WRF_HYDRO - ,sfcheadrt ,WATBLED & -#endif - ) !out -! ---------------------------------------------------------------------- -! Code history: -! Initial code: Guo-Yue Niu, Oct. 2007 -! ---------------------------------------------------------------------- - implicit none -! ---------------------------------------------------------------------- -! input - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: ILOC !grid index - INTEGER, INTENT(IN) :: JLOC !grid index - INTEGER, INTENT(IN) :: VEGTYP !vegetation type - INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers - INTEGER , INTENT(IN) :: IST !surface type 1-soil; 2-lake - INTEGER, INTENT(IN) :: NSOIL !no. of soil layers - INTEGER, DIMENSION(-NSNOW+1:0) , INTENT(IN) :: IMELT !melting state index [1-melt; 2-freeze] - REAL, INTENT(IN) :: DT !main time step (s) - REAL, INTENT(IN) :: UU !u-direction wind speed [m/s] - REAL, INTENT(IN) :: VV !v-direction wind speed [m/s] - REAL, INTENT(IN) :: FCEV !canopy evaporation (w/m2) [+ to atm ] - REAL, INTENT(IN) :: FCTR !transpiration (w/m2) [+ to atm] - REAL, INTENT(IN) :: QPRECC !convective precipitation (mm/s) - REAL, INTENT(IN) :: QPRECL !large-scale precipitation (mm/s) - REAL, INTENT(IN) :: ELAI !leaf area index, after burying by snow - REAL, INTENT(IN) :: ESAI !stem area index, after burying by snow - REAL, INTENT(IN) :: SFCTMP !surface air temperature [k] - REAL, INTENT(IN) :: QVAP !soil surface evaporation rate[mm/s] - REAL, INTENT(IN) :: QDEW !soil surface dew rate[mm/s] - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: ZSOIL !depth of layer-bottom from soil surface - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: BTRANI !soil water stress factor (0 to 1) - REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: FICEOLD !ice fraction at last timestep - REAL , INTENT(IN) :: TG !ground temperature (k) - REAL , INTENT(IN) :: FVEG !greeness vegetation fraction (-) - REAL , INTENT(IN) :: BDFALL !bulk density of snowfall (kg/m3) ! MB/AN: v3.7 - REAL , INTENT(IN) :: FP !fraction of the gridcell that receives precipitation ! MB/AN: v3.7 - REAL , INTENT(IN) :: RAIN !rainfall (mm/s) ! MB/AN: v3.7 - REAL , INTENT(IN) :: SNOW !snowfall (mm/s) ! MB/AN: v3.7 - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: SMCEQ !equilibrium soil water content [m3/m3] (used in m-m&f groundwater dynamics) - REAL , INTENT(IN) :: QSNOW !snow at ground srf (mm/s) [+] - REAL , INTENT(IN) :: QRAIN !rain at ground srf (mm) [+] - REAL , INTENT(IN) :: SNOWHIN !snow depth increasing rate (m/s) - -! input/output - INTEGER, INTENT(INOUT) :: ISNOW !actual no. of snow layers - REAL, INTENT(INOUT) :: CANLIQ !intercepted liquid water (mm) - REAL, INTENT(INOUT) :: CANICE !intercepted ice mass (mm) - REAL, INTENT(INOUT) :: TV !vegetation temperature (k) - REAL, INTENT(INOUT) :: SNOWH !snow height [m] - REAL, INTENT(INOUT) :: SNEQV !snow water eqv. [mm] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNICE !snow layer ice [mm] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNLIQ !snow layer liquid water [mm] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow/soil layer temperature [k] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: ZSNSO !depth of snow/soil layer-bottom - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: DZSNSO !snow/soil layer thickness [m] - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SH2O !soil liquid water content [m3/m3] - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SICE !soil ice content [m3/m3] - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SMC !total soil water content [m3/m3] - REAL, INTENT(INOUT) :: ZWT !the depth to water table [m] - REAL, INTENT(INOUT) :: WA !water storage in aquifer [mm] - REAL, INTENT(INOUT) :: WT !water storage in aquifer - !+ stuarated soil [mm] - REAL, INTENT(INOUT) :: WSLAKE !water storage in lake (can be -) (mm) - REAL , INTENT(INOUT) :: PONDING ![mm] - REAL, INTENT(INOUT) :: SMCWTD !soil water content between bottom of the soil and water table [m3/m3] - REAL, INTENT(INOUT) :: DEEPRECH !recharge to or from the water table when deep [m] - REAL, INTENT(INOUT) :: RECH !recharge to or from the water table when shallow [m] (diagnostic) - REAL, INTENT(INOUT) :: QTLDRN !tile drainage (mm) per soil timestep - REAL, INTENT(IN) :: DX - REAL, INTENT(IN) :: TDFRACMP !tile drain fraction map - -! output - REAL, INTENT(OUT) :: CMC !intercepted water per ground area (mm) - REAL, INTENT(OUT) :: ECAN !evap of intercepted water (mm/s) [+] - REAL, INTENT(OUT) :: ETRAN !transpiration rate (mm/s) [+] - REAL, INTENT(OUT) :: FWET !wetted/snowed fraction of canopy (-) - REAL, INTENT(OUT) :: RUNSRF !surface runoff [mm] per soil timestep - REAL, INTENT(OUT) :: RUNSUB !baseflow (sturation excess) [mm] per soil timestep - REAL, INTENT(OUT) :: QIN !groundwater recharge [mm/s] - REAL, INTENT(OUT) :: QDIS !groundwater discharge [mm/s] - REAL, INTENT(OUT) :: PONDING1 - REAL, INTENT(OUT) :: PONDING2 - REAL, INTENT(OUT) :: QSNBOT !melting water out of snow bottom [mm/s] - REAL , INTENT(IN) :: LATHEAV !latent heat vap./sublimation (j/kg) - REAL , INTENT(IN) :: LATHEAG !latent heat vap./sublimation (j/kg) - LOGICAL , INTENT(IN) :: FROZEN_GROUND ! used to define latent heat pathway - LOGICAL , INTENT(IN) :: FROZEN_CANOPY ! used to define latent heat pathway - REAL, INTENT(OUT) :: QEVAC !evaporation rate (mm/s) - REAL, INTENT(OUT) :: QDEWC !dew rate (mm/s) - REAL, INTENT(OUT) :: QFROC !frost rate (mm/s) - REAL, INTENT(OUT) :: QSUBC !sublimation rate (mm/s) - REAL, INTENT(OUT) :: QMELTC !melting rate of canopy snow (mm/s) - REAL, INTENT(OUT) :: QFRZC !refreezing rate of canopy liquid water (mm/s) - REAL, INTENT(INOUT) :: ACC_QINSUR !water input on soil surface [m/s] - REAL, INTENT(INOUT) :: ACC_QSEVA !soil surface evap rate [mm/s] - REAL, DIMENSION( 1:NSOIL) , INTENT(INOUT):: ACC_ETRANI !transpiration rate (mm/s) [+] - -! irrigation - REAL, INTENT(IN) :: IRRFRA ! irrigation fraction - REAL, INTENT(IN) :: MIFAC ! micro irrigation fraction - REAL, INTENT(IN) :: FIFAC ! flood irrigation fraction - REAL, INTENT(INOUT):: IRAMTFI ! irrigation water amount [m] to be applied, Sprinkler - REAL, INTENT(INOUT):: IRAMTMI ! irrigation water amount [m] to be applied, Micro - REAL, INTENT(INOUT):: IRFIRATE ! rate of irrigation by micro [m/timestep] - REAL, INTENT(INOUT):: IRMIRATE ! rate of irrigation by micro [m/timestep] - LOGICAL, INTENT(IN) :: CROPLU ! flag to identify croplands - -! local - INTEGER :: IZ - REAL :: QINSUR !water input on soil surface [m/s] - REAL :: QSEVA !soil surface evap rate [mm/s] - REAL :: QSDEW !soil surface dew rate [mm/s] - REAL :: QSNFRO !snow surface frost rate[mm/s] - REAL :: QSNSUB !snow surface sublimation rate [mm/s] - REAL, DIMENSION( 1:NSOIL) :: ETRANI !transpiration rate (mm/s) [+] - REAL, DIMENSION( 1:NSOIL) :: WCND !hydraulic conductivity (m/s) - REAL :: QDRAIN !soil-bottom free drainage [mm/s] - REAL :: SNOFLOW !glacier flow [mm/s] - REAL :: FCRMAX !maximum of FCR (-) - real :: dt_soil - real :: qinsur_avg - real :: qseva_avg - real, dimension(1:nsoil) :: etrani_avg - - REAL, PARAMETER :: WSLMAX = 5000.0 !maximum lake water storage (mm) - -#ifdef WRF_HYDRO - REAL , INTENT(INOUT) :: sfcheadrt, WATBLED -#endif - -! ---------------------------------------------------------------------- -! initialize - - ETRANI(1:NSOIL) = 0.0 - SNOFLOW = 0.0 - RUNSUB = 0.0 - RUNSRF = 0.0 - QINSUR = 0.0 - QTLDRN = 0.0 - -! canopy-intercepted snowfall/rainfall, drips, and throughfall - - CALL CANWATER (parameters,VEGTYP ,DT , & !in - FCEV ,FCTR ,ELAI , & !in - ESAI ,TG ,FVEG ,ILOC , JLOC, & !in - BDFALL ,FROZEN_CANOPY , & !in - CANLIQ ,CANICE ,TV , & !inout - CMC ,ECAN ,ETRAN , & !out - FWET , QSUBC, QFROC, QFRZC, QMELTC, QEVAC, QDEWC ) !out - -! sublimation, frost, evaporation, and dew - - QSNSUB = 0.0 - IF (SNEQV > 0.0) THEN - QSNSUB = MIN(QVAP, SNEQV/DT) - ENDIF - QSEVA = QVAP-QSNSUB - - QSNFRO = 0.0 - IF (SNEQV > 0.0) THEN - QSNFRO = QDEW - ENDIF - QSDEW = QDEW - QSNFRO - - CALL SNOWWATER (parameters,NSNOW ,NSOIL ,IMELT ,DT ,ZSOIL , & !in - & SFCTMP ,SNOWHIN,QSNOW ,QSNFRO ,QSNSUB , & !in - & QRAIN ,FICEOLD,ILOC ,JLOC , & !in - & ISNOW ,SNOWH ,SNEQV ,SNICE ,SNLIQ , & !inout - & SH2O ,SICE ,STC ,ZSNSO ,DZSNSO , & !inout - & QSNBOT ,SNOFLOW,PONDING1 ,PONDING2) !out - - IF(FROZEN_GROUND) THEN - SICE(1) = SICE(1) + (QSDEW-QSEVA)*DT/(DZSNSO(1)*1000.0) - QSDEW = 0.0 - QSEVA = 0.0 - IF(SICE(1) < 0.0) THEN - SH2O(1) = SH2O(1) + SICE(1) - SICE(1) = 0.0 - END IF - SMC(1) = SH2O(1) + SICE(1) - END IF - -! convert units (mm/s -> m/s) - - !PONDING: melting water from snow when there is no layer - QINSUR = (PONDING+PONDING1+PONDING2)/DT * 0.001 - - IF(ISNOW == 0) THEN - QINSUR = QINSUR+(QSNBOT + QSDEW + QRAIN) * 0.001 - ELSE - QINSUR = QINSUR+(QSNBOT + QSDEW) * 0.001 - ENDIF - - QSEVA = QSEVA * 0.001 - - DO IZ = 1, parameters%NROOT - ETRANI(IZ) = ETRAN * BTRANI(IZ) * 0.001 - ENDDO - -#ifdef WRF_HYDRO - QINSUR = QINSUR+sfcheadrt/DT*0.001 !sfcheadrt units (m) -#endif - -! added soil timestep capability - ACC_QINSUR = ACC_QINSUR + QINSUR - ACC_QSEVA = ACC_QSEVA + QSEVA - ACC_ETRANI = ACC_ETRANI + ETRANI - - ! start soil calculation timestep - if(calculate_soil) then - - DT_soil = DT * soil_update_steps - - ! irrigation: call flood irrigation-pvk - IF((CROPLU .EQV. .TRUE.) .AND. (IRAMTFI .GT. 0.0))THEN - ! call flood irrigation and add to QINSUR - CALL FLOOD_IRRIGATION(parameters,NSOIL,DT_soil,SH2O,SMC,SICE,FIFAC,& !in - IRAMTFI,IRFIRATE) !inout - ACC_QINSUR = ACC_QINSUR + IRFIRATE/Dt_soil * soil_update_steps - END IF - - ! irrigation: call micro irrigation-pvk - IF((CROPLU .EQV. .TRUE.) .AND. (IRAMTMI .GT. 0.0))THEN - ! call micro irrigation, assuming we implement drip in first layer - ! of the Noah-MP. Change layer 1 moisture wrt to MI rate-pvk - CALL MICRO_IRRIGATION(parameters,NSOIL,DT_soil,SH2O,SMC,SICE,MIFAC, & !in - IRAMTMI,IRMIRATE) !inout - SH2O(1) = SH2O(1) + (IRMIRATE/(-1*ZSOIL(1))) - END IF - - QSEVA_avg = ACC_QSEVA / soil_update_steps - QINSUR_avg = ACC_QINSUR / soil_update_steps - ETRANI_avg = ACC_ETRANI / soil_update_steps - - ! lake/soil water balances - IF (IST == 2) THEN ! lake - RUNSRF = 0.0 - IF(WSLAKE >= WSLMAX) RUNSRF = QINSUR_avg*1000.0*Dt_soil ! mm per soil timestep - WSLAKE = WSLAKE + (QINSUR_avg-QSEVA_avg)*1000.0*Dt_soil - RUNSRF !mm per soil timestep - ELSE ! soil - CALL SOILWATER (parameters,NSOIL ,NSNOW ,DT_soil ,ZSOIL ,DZSNSO , & !in - QINSUR_avg,QSEVA_avg,ETRANI_avg,SICE ,ILOC , JLOC , & !in - TDFRACMP,DX , & !in - SH2O ,SMC ,ZWT ,VEGTYP , & !inout - SMCWTD, DEEPRECH, & !inout - RUNSRF ,QDRAIN ,RUNSUB ,WCND ,FCRMAX, QTLDRN & !out -#ifdef WRF_HYDRO - ,WATBLED & !in for tile drainage -#endif - ) - - IF(OPT_RUN == 1) THEN - CALL GROUNDWATER (parameters,NSNOW ,NSOIL ,DT_soil ,SICE ,ZSOIL , & !in - STC ,WCND ,FCRMAX ,ILOC ,JLOC , & !in - SH2O ,ZWT ,WA ,WT , & !inout - QIN ,QDIS ) !out - RUNSUB = QDIS !mm/s - END IF - - IF(OPT_RUN == 3 .or. OPT_RUN == 4 .or. & - OPT_RUN == 6 .or. OPT_RUN == 7 .or. OPT_RUN == 8) THEN - RUNSUB = RUNSUB + QDRAIN !mm/s - END IF - - DO IZ = 1,NSOIL - SMC(IZ) = SH2O(IZ) + SICE(IZ) - ENDDO - - IF(OPT_RUN == 5) THEN - CALL SHALLOWWATERTABLE (parameters,NSNOW ,NSOIL, ZSOIL, DT_soil , & !in - DZSNSO ,SMCEQ ,ILOC , JLOC , & !in - SMC ,ZWT ,SMCWTD ,RECH, QDRAIN ) !inout - - SH2O(NSOIL) = SMC(NSOIL) - SICE(NSOIL) - RUNSUB = RUNSUB + QDRAIN !it really comes from subroutine watertable, which is not called with the same frequency as the soil routines here - WA = 0.0 - ENDIF - - RUNSRF = RUNSRF * dt_soil - RUNSUB = RUNSUB * dt_soil - QTLDRN = QTLDRN * dt_soil - ENDIF - - endif ! soil calculation timestep - - RUNSUB = RUNSUB + SNOFLOW*DT !mm/s - - END SUBROUTINE WATER - -!== begin canwater ================================================================================= - - SUBROUTINE CANWATER (parameters,VEGTYP ,DT , & !in - FCEV ,FCTR ,ELAI , & !in - ESAI ,TG ,FVEG ,ILOC , JLOC , & !in - BDFALL ,FROZEN_CANOPY , & !in - CANLIQ ,CANICE ,TV , & !inout - CMC ,ECAN ,ETRAN , & !out - FWET , QSUBC, QFROC, QFRZC, QMELTC, QEVAC, QDEWC ) !out - -! ------------------------ code history ------------------------------ -! canopy hydrology -! -------------------------------------------------------------------- - IMPLICIT NONE -! ------------------------ input/output variables -------------------- -! input - type (noahmp_parameters), intent(in) :: parameters - INTEGER,INTENT(IN) :: ILOC !grid index - INTEGER,INTENT(IN) :: JLOC !grid index - INTEGER,INTENT(IN) :: VEGTYP !vegetation type - REAL, INTENT(IN) :: DT !main time step (s) - REAL, INTENT(IN) :: FCEV !canopy evaporation (w/m2) [+ = to atm] - REAL, INTENT(IN) :: FCTR !transpiration (w/m2) [+ = to atm] - REAL, INTENT(IN) :: ELAI !leaf area index, after burying by snow - REAL, INTENT(IN) :: ESAI !stem area index, after burying by snow - REAL, INTENT(IN) :: TG !ground temperature (k) - REAL, INTENT(IN) :: FVEG !greeness vegetation fraction (-) - LOGICAL , INTENT(IN) :: FROZEN_CANOPY ! used to define latent heat pathway - REAL , INTENT(IN) :: BDFALL !bulk density of snowfall (kg/m3) ! MB/AN: v3.7 - -! input & output - REAL, INTENT(INOUT) :: CANLIQ !intercepted liquid water (mm) - REAL, INTENT(INOUT) :: CANICE !intercepted ice mass (mm) - REAL, INTENT(INOUT) :: TV !vegetation temperature (k) - -! output - REAL, INTENT(OUT) :: CMC !intercepted water (mm) - REAL, INTENT(OUT) :: ECAN !evaporation of intercepted water (mm/s) [+] - REAL, INTENT(OUT) :: ETRAN !transpiration rate (mm/s) [+] - REAL, INTENT(OUT) :: FWET !wetted or snowed fraction of the canopy (-) -! -------------------------------------------------------------------- - -! ------------------------ local variables --------------------------- - REAL :: MAXSNO !canopy capacity for snow interception (mm) - REAL :: MAXLIQ !canopy capacity for rain interception (mm) - REAL, INTENT(OUT) :: QEVAC !evaporation rate (mm/s) - REAL, INTENT(OUT) :: QDEWC !dew rate (mm/s) - REAL, INTENT(OUT) :: QFROC !frost rate (mm/s) - REAL, INTENT(OUT) :: QSUBC !sublimation rate (mm/s) - REAL, INTENT(OUT) :: QMELTC !melting rate of canopy snow (mm/s) - REAL, INTENT(OUT) :: QFRZC !refreezing rate of canopy liquid water (mm/s) - REAL :: CANMAS !total canopy mass (kg/m2) -! -------------------------------------------------------------------- -! initialization - - ECAN = 0.0 - -! --------------------------- liquid water ------------------------------ -! maximum canopy water - - MAXLIQ = parameters%CH2OP * (ELAI+ ESAI) - -! evaporation, transpiration, and dew - - IF (.NOT.FROZEN_CANOPY) THEN ! Barlage: change to frozen_canopy - ETRAN = MAX( FCTR/HVAP, 0.0 ) - QEVAC = MAX( FCEV/HVAP, 0.0 ) - QDEWC = ABS( MIN( FCEV/HVAP, 0.0 ) ) - QSUBC = 0.0 - QFROC = 0.0 - ELSE - ETRAN = MAX( FCTR/HSUB, 0.0 ) - QEVAC = 0.0 - QDEWC = 0.0 - QSUBC = MAX( FCEV/HSUB, 0.0 ) - QFROC = ABS( MIN( FCEV/HSUB, 0.0 ) ) - ENDIF - -! canopy water balance. for convenience allow dew to bring CANLIQ above -! maxh2o or else would have to re-adjust drip - - QEVAC = MIN(CANLIQ/DT,QEVAC) - CANLIQ=MAX(0.0,CANLIQ+(QDEWC-QEVAC)*DT) - IF(CANLIQ <= 1.0E-06) CANLIQ = 0.0 - -! --------------------------- canopy ice ------------------------------ -! for canopy ice - - MAXSNO = 6.6*(0.27+46.0/BDFALL) * (ELAI+ ESAI) - - QSUBC = MIN(CANICE/DT,QSUBC) - CANICE= MAX(0.0,CANICE + (QFROC-QSUBC)*DT) - IF(CANICE .LE. 1.0E-6) CANICE = 0.0 - -! wetted fraction of canopy - - IF( (CANICE .GT. 0.0) .AND. (CANICE .GE. CANLIQ) ) THEN - FWET = MAX(0.0,CANICE) / MAX(MAXSNO,1.0E-06) - ELSE - FWET = MAX(0.0,CANLIQ) / MAX(MAXLIQ,1.0E-06) - ENDIF - FWET = MIN(FWET, 1.0) ** 0.667 - -! phase change - - QMELTC = 0.0 - QFRZC = 0.0 - CMC = CANLIQ + CANICE - - IF(CANICE .GT. 1.0E-6 .AND. TV .GT. TFRZ) THEN - QMELTC = MIN(CANICE/DT,(TV-TFRZ)*CICE*CANICE/DENICE/(DT*HFUS)) - CANICE = MAX(0.0, CANICE - QMELTC*DT) - CANLIQ = MAX(0.0, CMC - CANICE) - TV = FWET*TFRZ + (1.0-FWET)*TV - ENDIF - - IF(CANLIQ .GT. 1.0E-6 .AND. TV .LT. TFRZ) THEN - QFRZC = MIN(CANLIQ/DT,(TFRZ-TV)*CWAT*CANLIQ/DENH2O/(DT*HFUS)) - CANLIQ = MAX(0.0, CANLIQ - QFRZC*DT) - CANICE = MAX(0.0, CMC - CANLIQ) - TV = FWET*TFRZ + (1.0-FWET)*TV - ENDIF - -! total canopy water - - CMC = CANLIQ + CANICE - -! total canopy evaporation - - ECAN = QEVAC + QSUBC - QDEWC - QFROC - - END SUBROUTINE CANWATER - -!== begin snowwater ================================================================================ - - SUBROUTINE SNOWWATER (parameters,NSNOW ,NSOIL ,IMELT ,DT ,ZSOIL , & !in - SFCTMP ,SNOWHIN,QSNOW ,QSNFRO ,QSNSUB , & !in - QRAIN ,FICEOLD,ILOC ,JLOC , & !in - ISNOW ,SNOWH ,SNEQV ,SNICE ,SNLIQ , & !inout - SH2O ,SICE ,STC ,ZSNSO ,DZSNSO , & !inout - QSNBOT ,SNOFLOW,PONDING1 ,PONDING2) !out -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! input - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: ILOC !grid index - INTEGER, INTENT(IN) :: JLOC !grid index - INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers - INTEGER, INTENT(IN) :: NSOIL !no. of soil layers - INTEGER, DIMENSION(-NSNOW+1:0) , INTENT(IN) :: IMELT !melting state index [0-no melt;1-melt] - REAL, INTENT(IN) :: DT !time step (s) - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: ZSOIL !depth of layer-bottom from soil surface - REAL, INTENT(IN) :: SFCTMP !surface air temperature [k] - REAL, INTENT(IN) :: SNOWHIN!snow depth increasing rate (m/s) - REAL, INTENT(IN) :: QSNOW !snow at ground srf (mm/s) [+] - REAL, INTENT(IN) :: QSNFRO !snow surface frost rate[mm/s] - REAL, INTENT(IN) :: QSNSUB !snow surface sublimation rate[mm/s] - REAL, INTENT(IN) :: QRAIN !snow surface rain rate[mm/s] - REAL, DIMENSION(-NSNOW+1:0) , INTENT(IN) :: FICEOLD!ice fraction at last timestep - -! input & output - INTEGER, INTENT(INOUT) :: ISNOW !actual no. of snow layers - REAL, INTENT(INOUT) :: SNOWH !snow height [m] - REAL, INTENT(INOUT) :: SNEQV !snow water eqv. [mm] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNICE !snow layer ice [mm] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNLIQ !snow layer liquid water [mm] - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SH2O !soil liquid moisture (m3/m3) - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SICE !soil ice moisture (m3/m3) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow layer temperature [k] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: ZSNSO !depth of snow/soil layer-bottom - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: DZSNSO !snow/soil layer thickness [m] - -! output - REAL, INTENT(OUT) :: QSNBOT !melting water out of snow bottom [mm/s] - REAL, INTENT(OUT) :: SNOFLOW!glacier flow [mm] - REAL, INTENT(OUT) :: PONDING1 - REAL, INTENT(OUT) :: PONDING2 - -! local - INTEGER :: IZ,i - REAL :: BDSNOW !bulk density of snow (kg/m3) -! ---------------------------------------------------------------------- - SNOFLOW = 0.0 - PONDING1 = 0.0 - PONDING2 = 0.0 - - CALL SNOWFALL (parameters,NSOIL ,NSNOW ,DT ,QSNOW ,SNOWHIN, & !in - SFCTMP ,ILOC ,JLOC , & !in - ISNOW ,SNOWH ,DZSNSO ,STC ,SNICE , & !inout - SNLIQ ,SNEQV ) !inout - -! MB: do each if block separately - - IF(ISNOW < 0) & ! when multi-layer - CALL COMPACT (parameters,NSNOW ,NSOIL ,DT ,STC ,SNICE , & !in - SNLIQ ,ZSOIL ,IMELT ,FICEOLD,ILOC , JLOC ,& !in - ISNOW ,DZSNSO ,ZSNSO ) !inout - - IF(ISNOW < 0) & !when multi-layer - CALL COMBINE (parameters,NSNOW ,NSOIL ,ILOC ,JLOC , & !in - ISNOW ,SH2O ,STC ,SNICE ,SNLIQ , & !inout - DZSNSO ,SICE ,SNOWH ,SNEQV , & !inout - PONDING1 ,PONDING2) !out - - IF(ISNOW < 0) & !when multi-layer - CALL DIVIDE (parameters,NSNOW ,NSOIL , & !in - ISNOW ,STC ,SNICE ,SNLIQ ,DZSNSO ) !inout - - CALL SNOWH2O (parameters,NSNOW ,NSOIL ,DT ,QSNFRO ,QSNSUB , & !in - QRAIN ,ILOC ,JLOC , & !in - ISNOW ,DZSNSO ,SNOWH ,SNEQV ,SNICE , & !inout - SNLIQ ,SH2O ,SICE ,STC , & !inout - QSNBOT ,PONDING1 ,PONDING2) !out - -!set empty snow layers to zero - - do iz = -nsnow+1, isnow - snice(iz) = 0.0 - snliq(iz) = 0.0 - stc(iz) = 0.0 - dzsnso(iz)= 0.0 - zsnso(iz) = 0.0 - enddo - -!to obtain equilibrium state of snow in glacier region - - IF(SNEQV > 5000.0) THEN ! 5000 mm -> maximum water depth - BDSNOW = SNICE(0) / DZSNSO(0) - SNOFLOW = (SNEQV - 5000.0) - SNICE(0) = SNICE(0) - SNOFLOW - DZSNSO(0) = DZSNSO(0) - SNOFLOW/BDSNOW - SNOFLOW = SNOFLOW / DT - END IF - -! sum up snow mass for layered snow - - IF(ISNOW < 0) THEN ! MB: only do for multi-layer - SNEQV = 0.0 - DO IZ = ISNOW+1,0 - SNEQV = SNEQV + SNICE(IZ) + SNLIQ(IZ) - ENDDO - END IF - -! Reset ZSNSO and layer thinkness DZSNSO - - DO IZ = ISNOW+1, 0 - DZSNSO(IZ) = -DZSNSO(IZ) - END DO - - DZSNSO(1) = ZSOIL(1) - DO IZ = 2,NSOIL - DZSNSO(IZ) = (ZSOIL(IZ) - ZSOIL(IZ-1)) - END DO - - ZSNSO(ISNOW+1) = DZSNSO(ISNOW+1) - DO IZ = ISNOW+2 ,NSOIL - ZSNSO(IZ) = ZSNSO(IZ-1) + DZSNSO(IZ) - ENDDO - - DO IZ = ISNOW+1 ,NSOIL - DZSNSO(IZ) = -DZSNSO(IZ) - END DO - -! C.He: update SNOWH for multi-layer snow - IF ( ISNOW < 0 ) THEN - SNOWH = 0.0 - DO IZ = ISNOW+1, 0 - SNOWH = SNOWH + DZSNSO(IZ) - ENDDO - END IF - - END SUBROUTINE SNOWWATER - -!== begin snowfall ================================================================================= - - SUBROUTINE SNOWFALL (parameters,NSOIL ,NSNOW ,DT ,QSNOW ,SNOWHIN , & !in - SFCTMP ,ILOC ,JLOC , & !in - ISNOW ,SNOWH ,DZSNSO ,STC ,SNICE , & !inout - SNLIQ ,SNEQV ) !inout -! ---------------------------------------------------------------------- -! snow depth and density to account for the new snowfall. -! new values of snow depth & density returned. -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! input - - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: ILOC !grid index - INTEGER, INTENT(IN) :: JLOC !grid index - INTEGER, INTENT(IN) :: NSOIL !no. of soil layers - INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers - REAL, INTENT(IN) :: DT !main time step (s) - REAL, INTENT(IN) :: QSNOW !snow at ground srf (mm/s) [+] - REAL, INTENT(IN) :: SNOWHIN!snow depth increasing rate (m/s) - REAL, INTENT(IN) :: SFCTMP !surface air temperature [k] - -! input and output - - INTEGER, INTENT(INOUT) :: ISNOW !actual no. of snow layers - REAL, INTENT(INOUT) :: SNOWH !snow depth [m] - REAL, INTENT(INOUT) :: SNEQV !swow water equivalent [m] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: DZSNSO !thickness of snow/soil layers (m) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow layer temperature [k] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNICE !snow layer ice [mm] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNLIQ !snow layer liquid water [mm] - -! local - - INTEGER :: NEWNODE ! 0-no new layers, 1-creating new layers -! ---------------------------------------------------------------------- - NEWNODE = 0 - -! shallow snow / no layer - - IF(ISNOW == 0 .and. QSNOW > 0.0) THEN - SNOWH = SNOWH + SNOWHIN * DT - SNEQV = SNEQV + QSNOW * DT - END IF - -! creating a new layer - -! IF(ISNOW == 0 .AND. QSNOW>0. .AND. SNOWH >= 0.05) THEN -! IF(ISNOW == 0 .AND. QSNOW>0.0 .AND. SNOWH >= 0.025) THEN !MB: change limit - IF(ISNOW == 0 .AND. SNOWH >= 0.025) THEN ! C.He: remove QSNOW>0 to allow adjusting ISNOW based on SNOWH when no snowfall. - ISNOW = -1 - NEWNODE = 1 - DZSNSO(0)= SNOWH - SNOWH = 0.0 - STC(0) = MIN(273.16, SFCTMP) ! temporary setup - SNICE(0) = SNEQV - SNLIQ(0) = 0.0 - END IF - -! snow with layers - - IF(ISNOW < 0 .AND. NEWNODE == 0 .AND. QSNOW > 0.0) then - SNICE(ISNOW+1) = SNICE(ISNOW+1) + QSNOW * DT - DZSNSO(ISNOW+1) = DZSNSO(ISNOW+1) + SNOWHIN * DT - ENDIF - -! ---------------------------------------------------------------------- - END SUBROUTINE SNOWFALL - -!== begin combine ================================================================================== - - SUBROUTINE COMBINE (parameters,NSNOW ,NSOIL ,ILOC ,JLOC , & !in - ISNOW ,SH2O ,STC ,SNICE ,SNLIQ , & !inout - DZSNSO ,SICE ,SNOWH ,SNEQV , & !inout - PONDING1 ,PONDING2) !out -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! input - - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: ILOC - INTEGER, INTENT(IN) :: JLOC - INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers - INTEGER, INTENT(IN) :: NSOIL !no. of soil layers - -! input and output - - INTEGER, INTENT(INOUT) :: ISNOW !actual no. of snow layers - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SH2O !soil liquid moisture (m3/m3) - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SICE !soil ice moisture (m3/m3) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow layer temperature [k] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNICE !snow layer ice [mm] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNLIQ !snow layer liquid water [mm] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: DZSNSO!snow layer depth [m] - REAL, INTENT(INOUT) :: sneqv !snow water equivalent [m] - REAL, INTENT(INOUT) :: snowh !snow depth [m] - REAL, INTENT(OUT) :: PONDING1 - REAL, INTENT(OUT) :: PONDING2 - -! local variables: - - INTEGER :: I,J,K,L ! node indices - INTEGER :: ISNOW_OLD ! number of top snow layer - INTEGER :: MSSI ! node index - INTEGER :: NEIBOR ! adjacent node selected for combination - REAL :: ZWICE ! total ice mass in snow - REAL :: ZWLIQ ! total liquid water in snow - - REAL :: DZMIN(3) ! minimum of top snow layer -! DATA DZMIN /0.045, 0.05, 0.2/ - DATA DZMIN /0.025, 0.025, 0.1/ ! MB: change limit -!----------------------------------------------------------------------- - - ISNOW_OLD = ISNOW - - DO J = ISNOW_OLD+1,0 - IF (SNICE(J) <= 0.1) THEN - IF(J /= 0) THEN - SNLIQ(J+1) = SNLIQ(J+1) + SNLIQ(J) - SNICE(J+1) = SNICE(J+1) + SNICE(J) - DZSNSO(J+1) = DZSNSO(J+1) + DZSNSO(J) - ELSE - IF (ISNOW_OLD < -1) THEN ! MB/KM: change to ISNOW - SNLIQ(J-1) = SNLIQ(J-1) + SNLIQ(J) - SNICE(J-1) = SNICE(J-1) + SNICE(J) - DZSNSO(J-1) = DZSNSO(J-1) + DZSNSO(J) - ELSE - IF(SNICE(J) >= 0.0) THEN - PONDING1 = SNLIQ(J) ! ISNOW WILL GET SET TO ZERO BELOW; PONDING1 WILL GET - SNEQV = SNICE(J) ! ADDED TO PONDING FROM PHASECHANGE PONDING SHOULD BE - SNOWH = DZSNSO(J) ! ZERO HERE BECAUSE IT WAS CALCULATED FOR THIN SNOW - ELSE ! SNICE OVER-SUBLIMATED EARLIER - PONDING1 = SNLIQ(J) + SNICE(J) - IF(PONDING1 < 0.0) THEN ! IF SNICE AND SNLIQ SUBLIMATES REMOVE FROM SOIL - SICE(1) = MAX(0.0,SICE(1)+PONDING1/(DZSNSO(1)*1000.0)) - PONDING1 = 0.0 - END IF - SNEQV = 0.0 - SNOWH = 0.0 - END IF - SNLIQ(J) = 0.0 - SNICE(J) = 0.0 - DZSNSO(J) = 0.0 - ENDIF -! SH2O(1) = SH2O(1)+SNLIQ(J)/(DZSNSO(1)*1000.0) -! SICE(1) = SICE(1)+SNICE(J)/(DZSNSO(1)*1000.0) - ENDIF - - ! shift all elements above this down by one. - IF (J > ISNOW+1 .AND. ISNOW < -1) THEN - DO I = J, ISNOW+2, -1 - STC(I) = STC(I-1) - SNLIQ(I) = SNLIQ(I-1) - SNICE(I) = SNICE(I-1) - DZSNSO(I)= DZSNSO(I-1) - END DO - END IF - ISNOW = ISNOW + 1 - END IF - END DO - -! to conserve water in case of too large surface sublimation - - IF(SICE(1) < 0.0) THEN - SH2O(1) = SH2O(1) + SICE(1) - SICE(1) = 0.0 - END IF - - IF(ISNOW ==0) RETURN ! MB: get out if no longer multi-layer - - SNEQV = 0.0 - SNOWH = 0.0 - ZWICE = 0.0 - ZWLIQ = 0.0 - - DO J = ISNOW+1,0 - SNEQV = SNEQV + SNICE(J) + SNLIQ(J) - SNOWH = SNOWH + DZSNSO(J) - ZWICE = ZWICE + SNICE(J) - ZWLIQ = ZWLIQ + SNLIQ(J) - END DO - -! check the snow depth - all snow gone -! the liquid water assumes ponding on soil surface. - - IF (SNOWH < 0.025 .AND. ISNOW < 0 ) THEN ! MB: change limit -! IF (SNOWH < 0.05 .AND. ISNOW < 0 ) THEN - ISNOW = 0 - SNEQV = ZWICE - PONDING2 = ZWLIQ ! LIMIT OF ISNOW < 0 MEANS INPUT PONDING - IF(SNEQV <= 0.0) SNOWH = 0.0 ! SHOULD BE ZERO; SEE ABOVE - END IF - - -! check the snow depth - snow layers combined - - IF (ISNOW < -1) THEN - - ISNOW_OLD = ISNOW - MSSI = 1 - - DO I = ISNOW_OLD+1,0 - IF (DZSNSO(I) < DZMIN(MSSI)) THEN - - IF (I == ISNOW+1) THEN - NEIBOR = I + 1 - ELSE IF (I == 0) THEN - NEIBOR = I - 1 - ELSE - NEIBOR = I + 1 - IF ((DZSNSO(I-1)+DZSNSO(I)) < (DZSNSO(I+1)+DZSNSO(I))) NEIBOR = I-1 - END IF - - ! Node l and j are combined and stored as node j. - IF (NEIBOR > I) THEN - J = NEIBOR - L = I - ELSE - J = I - L = NEIBOR - END IF - - CALL COMBO (parameters,DZSNSO(J), SNLIQ(J), SNICE(J), & - STC(J), DZSNSO(L), SNLIQ(L), SNICE(L), STC(L) ) - - ! Now shift all elements above this down one. - IF (J-1 > ISNOW+1) THEN - DO K = J-1, ISNOW+2, -1 - STC(K) = STC(K-1) - SNICE(K) = SNICE(K-1) - SNLIQ(K) = SNLIQ(K-1) - DZSNSO(K) = DZSNSO(K-1) - END DO - END IF - - ! Decrease the number of snow layers - ISNOW = ISNOW + 1 - IF (ISNOW >= -1) EXIT - ELSE - - ! The layer thickness is greater than the prescribed minimum value - MSSI = MSSI + 1 - - END IF - END DO - - END IF - - END SUBROUTINE COMBINE - -!== begin divide =================================================================================== - - SUBROUTINE DIVIDE (parameters,NSNOW ,NSOIL , & !in - ISNOW ,STC ,SNICE ,SNLIQ ,DZSNSO ) !inout -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! input - - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers [ =3] - INTEGER, INTENT(IN) :: NSOIL !no. of soil layers [ =4] - -! input and output - - INTEGER , INTENT(INOUT) :: ISNOW !actual no. of snow layers - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow layer temperature [k] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNICE !snow layer ice [mm] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(INOUT) :: SNLIQ !snow layer liquid water [mm] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: DZSNSO!snow layer depth [m] - -! local variables: - - INTEGER :: J !indices - INTEGER :: MSNO !number of layer (top) to MSNO (bot) - REAL :: DRR !thickness of the combined [m] - REAL, DIMENSION( 1:NSNOW) :: DZ !snow layer thickness [m] - REAL, DIMENSION( 1:NSNOW) :: SWICE !partial volume of ice [m3/m3] - REAL, DIMENSION( 1:NSNOW) :: SWLIQ !partial volume of liquid water [m3/m3] - REAL, DIMENSION( 1:NSNOW) :: TSNO !node temperature [k] - REAL :: ZWICE !temporary - REAL :: ZWLIQ !temporary - REAL :: PROPOR!temporary - REAL :: DTDZ !temporary -! ---------------------------------------------------------------------- - - DO J = 1,NSNOW - IF (J <= ABS(ISNOW)) THEN - DZ(J) = DZSNSO(J+ISNOW) - SWICE(J) = SNICE(J+ISNOW) - SWLIQ(J) = SNLIQ(J+ISNOW) - TSNO(J) = STC(J+ISNOW) - END IF - END DO - - MSNO = ABS(ISNOW) - - IF (MSNO == 1) THEN - ! Specify a new snow layer - IF (DZ(1) > 0.05) THEN - MSNO = 2 - DZ(1) = DZ(1)/2.0 - SWICE(1) = SWICE(1)/2.0 - SWLIQ(1) = SWLIQ(1)/2.0 - DZ(2) = DZ(1) - SWICE(2) = SWICE(1) - SWLIQ(2) = SWLIQ(1) - TSNO(2) = TSNO(1) - END IF - END IF - - IF (MSNO > 1) THEN - IF (DZ(1) > 0.05) THEN - DRR = DZ(1) - 0.05 - PROPOR = DRR/DZ(1) - ZWICE = PROPOR*SWICE(1) - ZWLIQ = PROPOR*SWLIQ(1) - PROPOR = 0.05/DZ(1) - SWICE(1) = PROPOR*SWICE(1) - SWLIQ(1) = PROPOR*SWLIQ(1) - DZ(1) = 0.05 - - CALL COMBO (parameters,DZ(2), SWLIQ(2), SWICE(2), TSNO(2), DRR, & - ZWLIQ, ZWICE, TSNO(1)) - - ! subdivide a new layer - IF (MSNO <= 2 .AND. DZ(2) > 0.20) THEN ! MB: change limit -! IF (MSNO <= 2 .AND. DZ(2) > 0.10) THEN - MSNO = 3 - DTDZ = (TSNO(1) - TSNO(2))/((DZ(1)+DZ(2))/2.0) - DZ(2) = DZ(2)/2.0 - SWICE(2) = SWICE(2)/2.0 - SWLIQ(2) = SWLIQ(2)/2.0 - DZ(3) = DZ(2) - SWICE(3) = SWICE(2) - SWLIQ(3) = SWLIQ(2) - TSNO(3) = TSNO(2) - DTDZ*DZ(2)/2.0 - IF (TSNO(3) >= TFRZ) THEN - TSNO(3) = TSNO(2) - ELSE - TSNO(2) = TSNO(2) + DTDZ*DZ(2)/2.0 - ENDIF - - END IF - END IF - END IF - - IF (MSNO > 2) THEN - IF (DZ(2) > 0.2) THEN - DRR = DZ(2) - 0.2 - PROPOR = DRR/DZ(2) - ZWICE = PROPOR*SWICE(2) - ZWLIQ = PROPOR*SWLIQ(2) - PROPOR = 0.2/DZ(2) - SWICE(2) = PROPOR*SWICE(2) - SWLIQ(2) = PROPOR*SWLIQ(2) - DZ(2) = 0.2 - CALL COMBO (parameters,DZ(3), SWLIQ(3), SWICE(3), TSNO(3), DRR, & - ZWLIQ, ZWICE, TSNO(2)) - END IF - END IF - - ISNOW = -MSNO - - DO J = ISNOW+1,0 - DZSNSO(J) = DZ(J-ISNOW) - SNICE(J) = SWICE(J-ISNOW) - SNLIQ(J) = SWLIQ(J-ISNOW) - STC(J) = TSNO(J-ISNOW) - END DO - - -! DO J = ISNOW+1,NSOIL -! WRITE(*,'(I5,7F10.3)') J, DZSNSO(J), SNICE(J), SNLIQ(J),STC(J) -! END DO - - END SUBROUTINE DIVIDE - -!== begin combo ==================================================================================== - - SUBROUTINE COMBO(parameters,DZ, WLIQ, WICE, T, DZ2, WLIQ2, WICE2, T2) -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- - -! ----------------------------------------------------------------------s -! input - - type (noahmp_parameters), intent(in) :: parameters - REAL, INTENT(IN) :: DZ2 !nodal thickness of 2 elements being combined [m] - REAL, INTENT(IN) :: WLIQ2 !liquid water of element 2 [kg/m2] - REAL, INTENT(IN) :: WICE2 !ice of element 2 [kg/m2] - REAL, INTENT(IN) :: T2 !nodal temperature of element 2 [k] - REAL, INTENT(INOUT) :: DZ !nodal thickness of 1 elements being combined [m] - REAL, INTENT(INOUT) :: WLIQ !liquid water of element 1 - REAL, INTENT(INOUT) :: WICE !ice of element 1 [kg/m2] - REAL, INTENT(INOUT) :: T !node temperature of element 1 [k] - -! local - - REAL :: DZC !total thickness of nodes 1 and 2 (DZC=DZ+DZ2). - REAL :: WLIQC !combined liquid water [kg/m2] - REAL :: WICEC !combined ice [kg/m2] - REAL :: TC !combined node temperature [k] - REAL :: H !enthalpy of element 1 [J/m2] - REAL :: H2 !enthalpy of element 2 [J/m2] - REAL :: HC !temporary - -!----------------------------------------------------------------------- - - DZC = DZ+DZ2 - WICEC = (WICE+WICE2) - WLIQC = (WLIQ+WLIQ2) - H = (CICE*WICE+CWAT*WLIQ) * (T-TFRZ)+HFUS*WLIQ - H2= (CICE*WICE2+CWAT*WLIQ2) * (T2-TFRZ)+HFUS*WLIQ2 - - HC = H + H2 - IF(HC < 0.0)THEN - TC = TFRZ + HC/(CICE*WICEC + CWAT*WLIQC) - ELSE IF (HC.LE.HFUS*WLIQC) THEN - TC = TFRZ - ELSE - TC = TFRZ + (HC - HFUS*WLIQC) / (CICE*WICEC + CWAT*WLIQC) - END IF - - DZ = DZC - WICE = WICEC - WLIQ = WLIQC - T = TC - - END SUBROUTINE COMBO - -!== begin compact ================================================================================== - - SUBROUTINE COMPACT (parameters,NSNOW ,NSOIL ,DT ,STC ,SNICE , & !in - SNLIQ ,ZSOIL ,IMELT ,FICEOLD,ILOC , JLOC , & !in - ISNOW ,DZSNSO ,ZSNSO ) !inout -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! input - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: ILOC !grid index - INTEGER, INTENT(IN) :: JLOC !grid index - INTEGER, INTENT(IN) :: NSOIL !no. of soil layers [ =4] - INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers [ =3] - INTEGER, DIMENSION(-NSNOW+1:0) , INTENT(IN) :: IMELT !melting state index [0-no melt;1-melt] - REAL, INTENT(IN) :: DT !time step (sec) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: STC !snow layer temperature [k] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: SNICE !snow layer ice [mm] - REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: SNLIQ !snow layer liquid water [mm] - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: ZSOIL !depth of layer-bottom from soil srf - REAL, DIMENSION(-NSNOW+1: 0), INTENT(IN) :: FICEOLD!ice fraction at last timestep - -! input and output - INTEGER, INTENT(INOUT) :: ISNOW ! actual no. of snow layers - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: DZSNSO ! snow layer thickness [m] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: ZSNSO ! depth of snow/soil layer-bottom - -! local - REAL, PARAMETER :: C2 = 21.0e-3 ![m3/kg] ! default 21.e-3 - REAL, PARAMETER :: C3 = 2.5e-6 ![1/s] - REAL, PARAMETER :: C4 = 0.04 ![1/k] - REAL, PARAMETER :: C5 = 2.0 ! - REAL, PARAMETER :: DM = 100.0 !upper Limit on destructive metamorphism compaction [kg/m3] -! REAL, PARAMETER :: ETA0 = 0.8e+6 !viscosity coefficient [kg-s/m2] - !according to Anderson, it is between 0.52e6~1.38e6 - REAL, PARAMETER :: ETA0 = 1.33e+6 ! C.He: optimized based on SNOTEL obs (He et al. 2021 JGR) - REAL :: BURDEN !pressure of overlying snow [kg/m2] - REAL :: DDZ1 !rate of settling of snow pack due to destructive metamorphism. - REAL :: DDZ2 !rate of compaction of snow pack due to overburden. - REAL :: DDZ3 !rate of compaction of snow pack due to melt [1/s] - REAL :: DEXPF !EXPF=exp(-c4*(273.15-STC)). - REAL :: TD !STC - TFRZ [K] - REAL :: PDZDTC !nodal rate of change in fractional-thickness due to compaction [fraction/s] - REAL :: VOID !void (1 - SNICE - SNLIQ) - REAL :: WX !water mass (ice + liquid) [kg/m2] - REAL :: BI !partial density of ice [kg/m3] - REAL, DIMENSION(-NSNOW+1:0) :: FICE !fraction of ice at current time step - - INTEGER :: J - -! ---------------------------------------------------------------------- - BURDEN = 0.0 - - DO J = ISNOW+1, 0 - - WX = SNICE(J) + SNLIQ(J) - FICE(J) = SNICE(J) / WX - VOID = 1.0 - (SNICE(J)/DENICE + SNLIQ(J)/DENH2O) / DZSNSO(J) - - ! Allow compaction only for non-saturated node and higher ice lens node. - IF (VOID > 0.001 .AND. SNICE(J) > 0.1) THEN - BI = SNICE(J) / DZSNSO(J) - TD = MAX(0.0,TFRZ-STC(J)) - DEXPF = EXP(-C4*TD) - - ! Settling as a result of destructive metamorphism - - DDZ1 = -C3*DEXPF - - IF (BI > DM) DDZ1 = DDZ1*EXP(-46.0E-3*(BI-DM)) - - ! Liquid water term - - IF (SNLIQ(J) > 0.01*DZSNSO(J)) DDZ1=DDZ1*C5 - - ! Compaction due to overburden - - DDZ2 = -(BURDEN+0.5*WX)*EXP(-0.08*TD-C2*BI)/ETA0 ! 0.5*WX -> self-burden - - ! Compaction occurring during melt - - IF (IMELT(J) == 1) THEN - DDZ3 = MAX(0.0,(FICEOLD(J) - FICE(J))/MAX(1.0E-6,FICEOLD(J))) - DDZ3 = - DDZ3/DT ! sometimes too large - ELSE - DDZ3 = 0.0 - END IF - - ! Time rate of fractional change in DZ (units of s-1) - - PDZDTC = (DDZ1 + DDZ2 + DDZ3)*DT - PDZDTC = MAX(-0.5,PDZDTC) - - ! The change in DZ due to compaction - - DZSNSO(J) = DZSNSO(J)*(1.0+PDZDTC) - DZSNSO(J) = max(DZSNSO(J),SNICE(J)/DENICE + SNLIQ(J)/DENH2O) - - ! C.He: constrain snow density to a reasonable range (50~500 kg/m3) - DZSNSO(J) = MIN(MAX(DZSNSO(J),(SNICE(J)+SNLIQ(J))/500.0),(SNICE(J)+SNLIQ(J))/50.0) - - END IF - - ! Pressure of overlying snow - - BURDEN = BURDEN + WX - - END DO - - END SUBROUTINE COMPACT - -!== begin snowh2o ================================================================================== - - SUBROUTINE SNOWH2O (parameters,NSNOW ,NSOIL ,DT ,QSNFRO ,QSNSUB , & !in - QRAIN ,ILOC ,JLOC , & !in - ISNOW ,DZSNSO ,SNOWH ,SNEQV ,SNICE , & !inout - SNLIQ ,SH2O ,SICE ,STC , & !inout - QSNBOT ,PONDING1 ,PONDING2) !out -! ---------------------------------------------------------------------- -! Renew the mass of ice lens (SNICE) and liquid (SNLIQ) of the -! surface snow layer resulting from sublimation (frost) / evaporation (dew) -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! input - - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: ILOC !grid index - INTEGER, INTENT(IN) :: JLOC !grid index - INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers[=3] - INTEGER, INTENT(IN) :: NSOIL !No. of soil layers[=4] - REAL, INTENT(IN) :: DT !time step - REAL, INTENT(IN) :: QSNFRO !snow surface frost rate[mm/s] - REAL, INTENT(IN) :: QSNSUB !snow surface sublimation rate[mm/s] - REAL, INTENT(IN) :: QRAIN !snow surface rain rate[mm/s] - -! output - - REAL, INTENT(OUT) :: QSNBOT !melting water out of snow bottom [mm/s] - -! input and output - - INTEGER, INTENT(INOUT) :: ISNOW !actual no. of snow layers - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: DZSNSO ! snow layer depth [m] - REAL, INTENT(INOUT) :: SNOWH !snow height [m] - REAL, INTENT(INOUT) :: SNEQV !snow water eqv. [mm] - REAL, DIMENSION(-NSNOW+1:0), INTENT(INOUT) :: SNICE !snow layer ice [mm] - REAL, DIMENSION(-NSNOW+1:0), INTENT(INOUT) :: SNLIQ !snow layer liquid water [mm] - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SH2O !soil liquid moisture (m3/m3) - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SICE !soil ice moisture (m3/m3) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(INOUT) :: STC !snow layer temperature [k] - -! local variables: - - INTEGER :: J !do loop/array indices - REAL :: QIN !water flow into the element (mm/s) - REAL :: QOUT !water flow out of the element (mm/s) - REAL :: WGDIF !ice mass after minus sublimation - REAL, DIMENSION(-NSNOW+1:0) :: VOL_LIQ !partial volume of liquid water in layer - REAL, DIMENSION(-NSNOW+1:0) :: VOL_ICE !partial volume of ice lens in layer - REAL, DIMENSION(-NSNOW+1:0) :: EPORE !effective porosity = porosity - VOL_ICE - REAL :: PROPOR, TEMP - REAL :: PONDING1, PONDING2 - REAL, PARAMETER :: max_liq_mass_fraction = 0.4 -! ---------------------------------------------------------------------- - -!for the case when SNEQV becomes '0' after 'COMBINE' - - IF(SNEQV == 0.0) THEN - SICE(1) = SICE(1) + (QSNFRO-QSNSUB)*DT/(DZSNSO(1)*1000.0) ! Barlage: SH2O->SICE v3.6 - IF(SICE(1) < 0.0) THEN - SH2O(1) = SH2O(1) + SICE(1) - SICE(1) = 0.0 - END IF - END IF - -! for shallow snow without a layer -! snow surface sublimation may be larger than existing snow mass. To conserve water, -! excessive sublimation is used to reduce soil water. Smaller time steps would tend -! to aviod this problem. - - IF(ISNOW == 0 .and. SNEQV > 0.0) THEN - TEMP = SNEQV - SNEQV = SNEQV - QSNSUB*DT + QSNFRO*DT - PROPOR = SNEQV/TEMP - SNOWH = MAX(0.0,PROPOR * SNOWH) - SNOWH = MIN(MAX(SNOWH,SNEQV/500.0),SNEQV/50.0) ! limit adjustment to a reasonable density - - IF(SNEQV < 0.0) THEN - SICE(1) = SICE(1) + SNEQV/(DZSNSO(1)*1000.0) - SNEQV = 0.0 - SNOWH = 0.0 - END IF - IF(SICE(1) < 0.0) THEN - SH2O(1) = SH2O(1) + SICE(1) - SICE(1) = 0.0 - END IF - END IF - - IF(SNOWH <= 1.0E-8 .OR. SNEQV <= 1.0E-6) THEN - SNOWH = 0.0 - SNEQV = 0.0 - END IF - -! for deep snow - - IF ( ISNOW < 0 ) THEN !KWM added this IF statement to prevent out-of-bounds array references - - WGDIF = SNICE(ISNOW+1) - QSNSUB*DT + QSNFRO*DT - SNICE(ISNOW+1) = WGDIF - IF (WGDIF < 1.0e-6 .and. ISNOW <0) THEN - CALL COMBINE (parameters,NSNOW ,NSOIL ,ILOC, JLOC , & !in - ISNOW ,SH2O ,STC ,SNICE ,SNLIQ , & !inout - DZSNSO ,SICE ,SNOWH ,SNEQV , & !inout - PONDING1, PONDING2 ) !out - ENDIF - !KWM: Subroutine COMBINE can change ISNOW to make it 0 again? - IF ( ISNOW < 0 ) THEN !KWM added this IF statement to prevent out-of-bounds array references - SNLIQ(ISNOW+1) = SNLIQ(ISNOW+1) + QRAIN * DT - SNLIQ(ISNOW+1) = MAX(0.0, SNLIQ(ISNOW+1)) - ENDIF - - ENDIF !KWM -- Can the ENDIF be moved toward the end of the subroutine (Just set QSNBOT=0)? - -! Porosity and partial volume - - DO J = ISNOW+1, 0 - VOL_ICE(J) = MIN(1.0, SNICE(J)/(DZSNSO(J)*DENICE)) - EPORE(J) = 1.0 - VOL_ICE(J) - END DO - - QIN = 0.0 - QOUT = 0.0 - - DO J = ISNOW+1, 0 - SNLIQ(J) = SNLIQ(J) + QIN - VOL_LIQ(J) = SNLIQ(J)/(DZSNSO(J)*DENH2O) - QOUT = MAX(0.0,(VOL_LIQ(J)-parameters%SSI*EPORE(J))*DZSNSO(J)) - IF(J == 0) THEN - QOUT = MAX((VOL_LIQ(J)- EPORE(J))*DZSNSO(J) , parameters%SNOW_RET_FAC*DT*QOUT) - END IF - QOUT = QOUT*DENH2O - SNLIQ(J) = SNLIQ(J) - QOUT - IF((SNLIQ(J)/(SNICE(J)+SNLIQ(J))) > max_liq_mass_fraction) THEN - QOUT = QOUT + (SNLIQ(J) - max_liq_mass_fraction/(1.0 - max_liq_mass_fraction)*SNICE(J)) - SNLIQ(J) = max_liq_mass_fraction/(1.0 - max_liq_mass_fraction)*SNICE(J) - ENDIF - QIN = QOUT - END DO - - DO J = ISNOW+1, 0 - DZSNSO(J) = MAX(DZSNSO(J),SNLIQ(J)/DENH2O + SNICE(J)/DENICE) - END DO - -! Liquid water from snow bottom to soil - - QSNBOT = QOUT / DT ! mm/s - - END SUBROUTINE SNOWH2O - -!== begin soilwater ================================================================================ - - SUBROUTINE SOILWATER (parameters,NSOIL ,NSNOW ,DT ,ZSOIL ,DZSNSO , & !in - QINSUR ,QSEVA ,ETRANI ,SICE ,ILOC , JLOC, & !in - TDFRACMP, DX , & !in - SH2O ,SMC ,ZWT ,VEGTYP , & !inout - SMCWTD, DEEPRECH, & !inout - RUNSRF ,QDRAIN ,RUNSUB ,WCND ,FCRMAX, QTLDRN & !out -#ifdef WRF_HYDRO - ,WATBLED & !in for tile drainage -#endif - ) - -! ---------------------------------------------------------------------- -! calculate surface runoff and soil moisture. -! ---------------------------------------------------------------------- -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! input - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: ILOC !grid index - INTEGER, INTENT(IN) :: JLOC !grid index - INTEGER, INTENT(IN) :: NSOIL !no. of soil layers - INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers - REAL, INTENT(IN) :: DT !time step (sec) - REAL, INTENT(IN) :: QINSUR !water input on soil surface [mm/s] - REAL, INTENT(IN) :: QSEVA !evap from soil surface [mm/s] - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: ZSOIL !depth of soil layer-bottom [m] - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: ETRANI !evapotranspiration from soil layers [mm/s] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !snow/soil layer depth [m] - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SICE !soil ice content [m3/m3] - REAL, INTENT(IN) :: DX - REAL, INTENT(IN) :: TDFRACMP! tile drainage map(fraction) - INTEGER, INTENT(IN) :: VEGTYP - -! input & output - REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: SH2O !soil liquid water content [m3/m3] - REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: SMC !total soil water content [m3/m3] - REAL, INTENT(INOUT) :: ZWT !water table depth [m] - REAL, INTENT(INOUT) :: SMCWTD !soil moisture between bottom of the soil and the water table [m3/m3] - REAL , INTENT(INOUT) :: DEEPRECH - REAL , INTENT(INOUT) :: QTLDRN ! tile drainage (mm) per soil timestep -#ifdef WRF_HYDRO - REAL , INTENT(INOUT) :: WATBLED!in for tile drainage -#endif - -! output - REAL, INTENT(OUT) :: QDRAIN !soil-bottom free drainage [mm/s] - REAL, INTENT(OUT) :: RUNSRF !surface runoff [mm] per soil timestep - REAL, INTENT(OUT) :: RUNSUB !subsurface runoff [mm] per soil timestep - REAL, INTENT(OUT) :: FCRMAX !maximum of FCR (-) - REAL, DIMENSION(1:NSOIL), INTENT(OUT) :: WCND !hydraulic conductivity (m/s) - -! local - INTEGER :: K,IZ !do-loop index - INTEGER :: ITER !iteration index - REAl :: DTFINE !fine time step (s) - REAL, DIMENSION(1:NSOIL) :: RHSTT !right-hand side term of the matrix - REAL, DIMENSION(1:NSOIL) :: AI !left-hand side term - REAL, DIMENSION(1:NSOIL) :: BI !left-hand side term - REAL, DIMENSION(1:NSOIL) :: CI !left-hand side term - - REAL :: FFF !runoff decay factor (m-1) - REAL :: RSBMX !baseflow coefficient [mm/s] - REAL :: PDDUM !infiltration rate at surface (m/s) - REAL :: FICE !ice fraction in frozen soil - REAL :: WPLUS !saturation excess of the total soil [m] - REAL :: RSAT !accumulation of WPLUS (saturation excess) [m] - REAL :: SICEMAX!maximum soil ice content (m3/m3) - REAL :: SH2OMIN!minimum soil liquid water content (m3/m3) - REAL :: WTSUB !sum of WCND(K)*DZSNSO(K) - REAL :: MH2O !water mass removal (mm) - REAL :: FSAT !fractional saturated area (-) - REAL, DIMENSION(1:NSOIL) :: MLIQ ! - REAL :: XS ! - REAL :: WATMIN ! - REAL :: QDRAIN_SAVE ! - REAL :: RUNSRF_SAVE ! - REAL :: EPORE !effective porosity [m3/m3] - REAL, DIMENSION(1:NSOIL) :: FCR !impermeable fraction due to frozen soil - INTEGER :: NITER !iteration times soil moisture (-) - REAL :: SMCTOT !2-m averaged soil moisture (m3/m3) - REAL :: DZTOT !2-m soil depth (m) - REAL :: FACC !accumulated infiltration rate (m/s) - REAL, PARAMETER :: A = 4.0 -! ---------------------------------------------------------------------- - RUNSRF = 0.0 - PDDUM = 0.0 - RSAT = 0.0 - -! for the case when snowmelt water is too large - - DO K = 1,NSOIL - EPORE = MAX ( 1.0E-4 , ( parameters%SMCMAX(K) - SICE(K) ) ) - RSAT = RSAT + MAX(0.0,SH2O(K)-EPORE)*DZSNSO(K) - SH2O(K) = MIN(EPORE,SH2O(K)) - END DO - -!impermeable fraction due to frozen soil - - DO K = 1,NSOIL - FICE = MIN(1.0,SICE(K)/parameters%SMCMAX(K)) - FCR(K) = MAX(0.0,EXP(-A*(1.-FICE))- EXP(-A)) / & - (1.0 - EXP(-A)) - END DO - -! maximum soil ice content and minimum liquid water of all layers - - SICEMAX = 0.0 - FCRMAX = 0.0 - SH2OMIN = parameters%SMCMAX(1) - DO K = 1,NSOIL - IF (SICE(K) > SICEMAX) SICEMAX = SICE(K) - IF (FCR(K) > FCRMAX) FCRMAX = FCR(K) - IF (SH2O(K) < SH2OMIN) SH2OMIN = SH2O(K) - END DO - -!subsurface runoff for runoff scheme option 2 - - IF(OPT_RUN == 2) THEN - FFF = 2.0 - RSBMX = 4.0 - CALL ZWTEQ (parameters,NSOIL ,NSNOW ,ZSOIL ,DZSNSO ,SH2O ,ZWT) - RUNSUB = (1.0-FCRMAX) * RSBMX * EXP(-parameters%TIMEAN) * EXP(-FFF*ZWT) ! mm/s - END IF - -!surface runoff and infiltration rate using different schemes - -!jref impermable surface at urban - IF ( parameters%urban_flag ) FCR(1)= 0.95 - - IF(OPT_RUN == 1) THEN -! FFF = 6.0 - FFF = parameters%BEXP(1) / 3.0 ! calibratable, C.He changed based on GY Niu's update -! FSAT = parameters%FSATMX*EXP(-0.5*FFF*(ZWT-2.0)) - FSAT = parameters%FSATMX*EXP(-0.5*FFF*ZWT) ! C.He changed based on GY Niu's update - IF(QINSUR > 0.0) THEN - RUNSRF = QINSUR * ( (1.0-FCR(1))*FSAT + FCR(1) ) - PDDUM = QINSUR - RUNSRF ! m/s - END IF - END IF - - IF(OPT_RUN == 5) THEN - FFF = 6.0 - FSAT = parameters%FSATMX*EXP(-0.5*FFF*MAX(-2.0-ZWT,0.0)) - IF(QINSUR > 0.) THEN - RUNSRF = QINSUR * ( (1.0-FCR(1))*FSAT + FCR(1) ) - PDDUM = QINSUR - RUNSRF ! m/s - END IF - END IF - - IF(OPT_RUN == 2) THEN - FFF = 2.0 - FSAT = parameters%FSATMX*EXP(-0.5*FFF*ZWT) - IF(QINSUR > 0.0) THEN - RUNSRF = QINSUR * ( (1.0-FCR(1))*FSAT + FCR(1) ) - PDDUM = QINSUR - RUNSRF ! m/s - END IF - END IF - - IF(OPT_RUN == 3) THEN - CALL INFIL (parameters,NSOIL ,DT ,ZSOIL ,SH2O ,SICE , & !in - SICEMAX,QINSUR , & !in - PDDUM ,RUNSRF ) !out - END IF - - IF(OPT_RUN == 4) THEN - SMCTOT = 0.0 - DZTOT = 0.0 - DO K = 1,NSOIL - DZTOT = DZTOT + DZSNSO(K) - SMCTOT = SMCTOT + SMC(K)/parameters%SMCMAX(K)*DZSNSO(K) - IF(DZTOT >= 2.0) EXIT - END DO - SMCTOT = SMCTOT/DZTOT - FSAT = MAX(0.01,SMCTOT) ** 4.0 !BATS - - IF(QINSUR > 0.0) THEN - RUNSRF = QINSUR * ((1.0-FCR(1))*FSAT+FCR(1)) - PDDUM = QINSUR - RUNSRF ! m/s - END IF - END IF - - IF (OPT_RUN == 6) THEN - CALL COMPUTE_VIC_SURFRUNOFF(parameters,DT,NSOIL,SMC,ZSOIL,QINSUR,FSAT,RUNSRF,PDDUM) - END IF - - IF (OPT_RUN == 7) THEN - CALL COMPUTE_XAJ_SURFRUNOFF(parameters,DT,FCR,NSOIL,SMC,ZSOIL,QINSUR,RUNSRF,PDDUM) - END IF - - IF(OPT_RUN == 8)THEN - FACC = 1E-06 - CALL DYNAMIC_VIC(parameters,DT,SMC,SH2O,SICE,SICEMAX,NSOIL,ZSOIL,QINSUR,FACC,PDDUM,RUNSRF) - END IF - -! determine iteration times and finer time step - - NITER = 1 - -! IF(OPT_INF == 1) THEN !OPT_INF =2 may cause water imbalance - NITER = 3 - IF (PDDUM*DT>DZSNSO(1)*parameters%SMCMAX(1) ) THEN - NITER = NITER*2 - END IF -! END IF - - DTFINE = DT / NITER - -! solve soil moisture - FACC = 1E-06 - QDRAIN_SAVE = 0.0 - RUNSRF_SAVE = 0.0 - - DO ITER = 1, NITER - IF(QINSUR > 0.0 .and. OPT_RUN == 3) THEN - CALL INFIL (parameters,NSOIL ,DTFINE ,ZSOIL ,SH2O ,SICE , & !in - SICEMAX,QINSUR , & !in - PDDUM ,RUNSRF ) !out - END IF - - IF(QINSUR > 0.0 .and. OPT_RUN == 6) THEN - CALL COMPUTE_VIC_SURFRUNOFF(parameters,DTFINE,NSOIL,SMC,ZSOIL,QINSUR,& !in - FSAT,RUNSRF,PDDUM) !out - END IF - - IF (QINSUR > 0.0 .AND. OPT_RUN == 7) THEN - CALL COMPUTE_XAJ_SURFRUNOFF(parameters,DTFINE,FCR,NSOIL,SMC,ZSOIL,QINSUR,& ! in - RUNSRF,PDDUM) ! out - END IF - - IF(QINSUR > 0.0 .and. OPT_RUN == 8) THEN - CALL DYNAMIC_VIC(parameters,DTFINE,SMC,SH2O,SICE,SICEMAX,NSOIL,& - ZSOIL,QINSUR,FACC,PDDUM,RUNSRF) - END IF - - CALL SRT (parameters,NSOIL ,ZSOIL ,DTFINE ,PDDUM ,ETRANI , & !in - QSEVA ,SH2O ,SMC ,ZWT ,FCR , & !in - SICEMAX,FCRMAX ,ILOC ,JLOC ,SMCWTD , & !in - RHSTT ,AI ,BI ,CI ,QDRAIN , & !out - WCND ) !out - - CALL SSTEP (parameters,NSOIL ,NSNOW ,DTFINE ,ZSOIL ,DZSNSO , & !in - SICE ,ILOC ,JLOC ,ZWT , & !in - SH2O ,SMC ,AI ,BI ,CI , & !inout - RHSTT ,SMCWTD ,QDRAIN ,DEEPRECH, & !inout - WPLUS) !out - RSAT = RSAT + WPLUS - QDRAIN_SAVE = QDRAIN_SAVE + QDRAIN - RUNSRF_SAVE = RUNSRF_SAVE + RUNSRF - END DO - - QDRAIN = QDRAIN_SAVE/NITER - RUNSRF = RUNSRF_SAVE/NITER - - RUNSRF = RUNSRF * 1000.0 + RSAT * 1000.0/DT ! m/s -> mm/s - QDRAIN = QDRAIN * 1000.0 - -! Calling tile drainage ! pvk - IF (OPT_TDRN == 1 .AND. TDFRACMP .GT. 0.3 .AND. OPT_RUN == 3) THEN - print*, "simple tile drain scheme is on" - CALL TILE_DRAIN (parameters,NSOIL,SH2O,SMC,SICE,ZSOIL,QTLDRN,DT) - ELSE IF (OPT_TDRN == 2 .AND. TDFRACMP .GT. 0.1 .AND. OPT_RUN == 3) THEN - print*, "Hooghoudt tile drain scheme is on" - CALL TILE_HOOGHOUDT (parameters,WCND,NSOIL,NSNOW,SH2O,SMC,SICE,& - ZSOIL,DZSNSO,DT,DX,QTLDRN,ZWT & -#ifdef WRF_HYDRO - ,WATBLED & -#endif - ) - END IF - -!WRF_HYDRO_DJG... -!yw INFXSRT = RUNSRF * DT !mm/s -> mm - -! removal of soil water due to groundwater flow (option 2) - - IF(OPT_RUN == 2) THEN - WTSUB = 0.0 - DO K = 1, NSOIL - WTSUB = WTSUB + WCND(K)*DZSNSO(K) - END DO - - DO K = 1, NSOIL - MH2O = RUNSUB*DT*(WCND(K)*DZSNSO(K))/WTSUB ! mm - SH2O(K) = SH2O(K) - MH2O/(DZSNSO(K)*1000.0) - END DO - END IF - -! Limit MLIQ to be greater than or equal to watmin. -! Get water needed to bring MLIQ equal WATMIN from lower layer. - - IF(OPT_RUN /= 1) THEN - DO IZ = 1, NSOIL - MLIQ(IZ) = SH2O(IZ)*DZSNSO(IZ)*1000.0 - END DO - - WATMIN = 0.01 ! mm - DO IZ = 1, NSOIL-1 - IF (MLIQ(IZ) .LT. 0.0) THEN - XS = WATMIN-MLIQ(IZ) - ELSE - XS = 0.0 - END IF - MLIQ(IZ ) = MLIQ(IZ ) + XS - MLIQ(IZ+1) = MLIQ(IZ+1) - XS - END DO - - IZ = NSOIL - IF (MLIQ(IZ) .LT. WATMIN) THEN - XS = WATMIN-MLIQ(IZ) - ELSE - XS = 0.0 - END IF - MLIQ(IZ) = MLIQ(IZ) + XS - RUNSUB = RUNSUB - XS/DT - IF(OPT_RUN == 5)DEEPRECH = DEEPRECH - XS*1.0E-3 - - DO IZ = 1, NSOIL - SH2O(IZ) = MLIQ(IZ) / (DZSNSO(IZ)*1000.0) - END DO - END IF - - END SUBROUTINE SOILWATER - -!== begin zwteq ==================================================================================== - - SUBROUTINE ZWTEQ (parameters,NSOIL ,NSNOW ,ZSOIL ,DZSNSO ,SH2O ,ZWT) -! ---------------------------------------------------------------------- -! calculate equilibrium water table depth (Niu et al., 2005) -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! input - - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: NSOIL !no. of soil layers - INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: ZSOIL !depth of soil layer-bottom [m] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !snow/soil layer depth [m] - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SH2O !soil liquid water content [m3/m3] - -! output - - REAL, INTENT(OUT) :: ZWT !water table depth [m] - -! locals - - INTEGER :: K !do-loop index - INTEGER, PARAMETER :: NFINE = 100 !no. of fine soil layers of 6m soil - REAL :: WD1 !water deficit from coarse (4-L) soil moisture profile - REAL :: WD2 !water deficit from fine (100-L) soil moisture profile - REAL :: DZFINE !layer thickness of the 100-L soil layers to 6.0 m - REAL :: TEMP !temporary variable - REAL, DIMENSION(1:NFINE) :: ZFINE !layer-bottom depth of the 100-L soil layers to 6.0 m -! ---------------------------------------------------------------------- - - WD1 = 0.0 - DO K = 1,NSOIL - WD1 = WD1 + (parameters%SMCMAX(1)-SH2O(K)) * DZSNSO(K) ! [m] - ENDDO - - DZFINE = 3.0 * (-ZSOIL(NSOIL)) / NFINE - do K =1,NFINE - ZFINE(K) = FLOAT(K) * DZFINE - ENDDO - - ZWT = -3.0*ZSOIL(NSOIL) - 0.001 ! initial value [m] - - WD2 = 0.0 - DO K = 1,NFINE - TEMP = 1.0 + (ZWT-ZFINE(K))/parameters%PSISAT(1) - WD2 = WD2 + parameters%SMCMAX(1)*(1.0-TEMP**(-1.0/parameters%BEXP(1)))*DZFINE - IF(ABS(WD2-WD1) .LE. 0.01) THEN - ZWT = ZFINE(K) - EXIT - ENDIF - ENDDO - - END SUBROUTINE ZWTEQ - -!== begin infil ==================================================================================== - - SUBROUTINE INFIL (parameters,NSOIL ,DT ,ZSOIL ,SH2O ,SICE , & !in - SICEMAX,QINSUR , & !in - PDDUM ,RUNSRF ) !out -! -------------------------------------------------------------------------------- -! compute inflitration rate at soil surface and surface runoff -! -------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------- -! inputs - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: NSOIL !no. of soil layers - REAL, INTENT(IN) :: DT !time step (sec) - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: ZSOIL !depth of soil layer-bottom [m] - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SH2O !soil liquid water content [m3/m3] - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SICE !soil ice content [m3/m3] - REAL, INTENT(IN) :: QINSUR !water input on soil surface [mm/s] - REAL, INTENT(IN) :: SICEMAX!maximum soil ice content (m3/m3) - -! outputs - REAL, INTENT(OUT) :: RUNSRF !surface runoff [mm/s] - REAL, INTENT(OUT) :: PDDUM !infiltration rate at surface - -! locals - INTEGER :: IALP1, J, JJ, K - REAL :: VAL - REAL :: DDT - REAL :: PX - REAL :: DT1, DD, DICE - REAL :: FCR - REAL :: SUM - REAL :: ACRT - REAL :: WDF - REAL :: WCND - REAL :: SMCAV - REAL :: INFMAX - REAL, DIMENSION(1:NSOIL) :: DMAX - INTEGER, PARAMETER :: CVFRZ = 3 -! -------------------------------------------------------------------------------- - - IF (QINSUR > 0.0) THEN - DT1 = DT /86400.0 - SMCAV = parameters%SMCMAX(1) - parameters%SMCWLT(1) - -! maximum infiltration rate - - DMAX(1)= -ZSOIL(1) * SMCAV - DICE = -ZSOIL(1) * SICE(1) - DMAX(1)= DMAX(1)* (1.0-(SH2O(1) + SICE(1) - parameters%SMCWLT(1))/SMCAV) - - DD = DMAX(1) - - DO K = 2,NSOIL - DICE = DICE + (ZSOIL(K-1) - ZSOIL(K) ) * SICE(K) - DMAX(K) = (ZSOIL(K-1) - ZSOIL(K)) * SMCAV - DMAX(K) = DMAX(K) * (1.0-(SH2O(K) + SICE(K) - parameters%SMCWLT(K))/SMCAV) - DD = DD + DMAX(K) - END DO - - VAL = (1.0 - EXP ( - parameters%KDT * DT1)) - DDT = DD * VAL - PX = MAX(0.0,QINSUR * DT) - INFMAX = (PX * (DDT / (PX + DDT)))/ DT - -! impermeable fraction due to frozen soil - - FCR = 1.0 - IF (DICE > 1.0E-2) THEN - ACRT = CVFRZ * parameters%FRZX / DICE - SUM = 1.0 - IALP1 = CVFRZ - 1 - DO J = 1,IALP1 - K = 1 - DO JJ = J +1,IALP1 - K = K * JJ - END DO - SUM = SUM + (ACRT ** (CVFRZ - J)) / FLOAT(K) - END DO - FCR = 1.0 - EXP (-ACRT) * SUM - END IF - -! correction of infiltration limitation - - INFMAX = INFMAX * FCR - -! jref for urban areas -! IF ( parameters%urban_flag ) INFMAX == INFMAX * 0.05 - - CALL WDFCND2 (parameters,WDF,WCND,SH2O(1),SICEMAX,1) - INFMAX = MAX (INFMAX,WCND) - INFMAX = MIN (INFMAX,PX) - - RUNSRF= MAX(0.0, QINSUR - INFMAX) - PDDUM = QINSUR - RUNSRF - - END IF - - END SUBROUTINE INFIL - -!== begin srt ====================================================================================== - - SUBROUTINE SRT (parameters,NSOIL ,ZSOIL ,DT ,PDDUM ,ETRANI , & !in - QSEVA ,SH2O ,SMC ,ZWT ,FCR , & !in - SICEMAX,FCRMAX ,ILOC ,JLOC ,SMCWTD , & !in - RHSTT ,AI ,BI ,CI ,QDRAIN , & !out - WCND ) !out -! ---------------------------------------------------------------------- -! calculate the right hand side of the time tendency term of the soil -! water diffusion equation. also to compute ( prepare ) the matrix -! coefficients for the tri-diagonal matrix of the implicit time scheme. -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -!input - - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: ILOC !grid index - INTEGER, INTENT(IN) :: JLOC !grid index - INTEGER, INTENT(IN) :: NSOIL - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: ZSOIL - REAL, INTENT(IN) :: DT - REAL, INTENT(IN) :: PDDUM - REAL, INTENT(IN) :: QSEVA - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: ETRANI - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SH2O - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SMC - REAL, INTENT(IN) :: ZWT ! water table depth [m] - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: FCR - REAL, INTENT(IN) :: FCRMAX !maximum of FCR (-) - REAL, INTENT(IN) :: SICEMAX!maximum soil ice content (m3/m3) - REAL, INTENT(IN) :: SMCWTD !soil moisture between bottom of the soil and the water table - -! output - - REAL, DIMENSION(1:NSOIL), INTENT(OUT) :: RHSTT - REAL, DIMENSION(1:NSOIL), INTENT(OUT) :: AI - REAL, DIMENSION(1:NSOIL), INTENT(OUT) :: BI - REAL, DIMENSION(1:NSOIL), INTENT(OUT) :: CI - REAL, DIMENSION(1:NSOIL), INTENT(OUT) :: WCND !hydraulic conductivity (m/s) - REAL, INTENT(OUT) :: QDRAIN !bottom drainage (m/s) - -! local - INTEGER :: K - REAL, DIMENSION(1:NSOIL) :: DDZ - REAL, DIMENSION(1:NSOIL) :: DENOM - REAL, DIMENSION(1:NSOIL) :: DSMDZ - REAL, DIMENSION(1:NSOIL) :: WFLUX - REAL, DIMENSION(1:NSOIL) :: WDF - REAL, DIMENSION(1:NSOIL) :: SMX - REAL :: TEMP1 - REAL :: SMXWTD !soil moisture between bottom of the soil and water table - REAL :: SMXBOT !soil moisture below bottom to calculate flux - -! Niu and Yang (2006), J. of Hydrometeorology -! ---------------------------------------------------------------------- - - IF(OPT_INF == 1) THEN - DO K = 1, NSOIL - CALL WDFCND1 (parameters,WDF(K),WCND(K),SMC(K),FCR(K),K) - SMX(K) = SMC(K) - END DO - IF(OPT_RUN == 5)SMXWTD=SMCWTD - END IF - - IF(OPT_INF == 2) THEN - DO K = 1, NSOIL - CALL WDFCND2 (parameters,WDF(K),WCND(K),SH2O(K),SICEMAX,K) - SMX(K) = SH2O(K) - END DO - IF(OPT_RUN == 5)SMXWTD=SMCWTD*SH2O(NSOIL)/SMC(NSOIL) !same liquid fraction as in the bottom layer - END IF - - DO K = 1, NSOIL - IF(K == 1) THEN - DENOM(K) = - ZSOIL (K) - TEMP1 = - ZSOIL (K+1) - DDZ(K) = 2.0 / TEMP1 - DSMDZ(K) = 2.0 * (SMX(K) - SMX(K+1)) / TEMP1 - WFLUX(K) = WDF(K) * DSMDZ(K) + WCND(K) - PDDUM + ETRANI(K) + QSEVA - ELSE IF (K < NSOIL) THEN - DENOM(k) = (ZSOIL(K-1) - ZSOIL(K)) - TEMP1 = (ZSOIL(K-1) - ZSOIL(K+1)) - DDZ(K) = 2.0 / TEMP1 - DSMDZ(K) = 2.0 * (SMX(K) - SMX(K+1)) / TEMP1 - WFLUX(K) = WDF(K ) * DSMDZ(K ) + WCND(K ) & - - WDF(K-1) * DSMDZ(K-1) - WCND(K-1) + ETRANI(K) - ELSE - DENOM(K) = (ZSOIL(K-1) - ZSOIL(K)) - IF(OPT_RUN == 1 .or. OPT_RUN == 2) THEN - QDRAIN = 0.0 - END IF - IF(OPT_RUN == 3 .OR. OPT_RUN == 6 .OR. OPT_RUN == 7 .OR. OPT_RUN == 8) THEN - QDRAIN = parameters%SLOPE*WCND(K) - END IF - IF(OPT_RUN == 4) THEN - QDRAIN = (1.0-FCRMAX)*WCND(K) - END IF - IF(OPT_RUN == 5) THEN !gmm new m-m&f water table dynamics formulation - TEMP1 = 2.0 * DENOM(K) - IF(ZWT < ZSOIL(NSOIL)-DENOM(NSOIL))THEN -!gmm interpolate from below, midway to the water table, to the middle of the auxiliary layer below the soil bottom - SMXBOT = SMX(K) - (SMX(K)-SMXWTD) * DENOM(K) * 2.0/ (DENOM(K) + ZSOIL(K) - ZWT) - ELSE - SMXBOT = SMXWTD - ENDIF - DSMDZ(K) = 2.0 * (SMX(K) - SMXBOT) / TEMP1 - QDRAIN = WDF(K ) * DSMDZ(K ) + WCND(K ) - END IF - - WFLUX(K) = -(WDF(K-1)*DSMDZ(K-1))-WCND(K-1)+ETRANI(K) + QDRAIN - END IF - END DO - - DO K = 1, NSOIL - IF(K == 1) THEN - AI(K) = 0.0 - BI(K) = WDF(K ) * DDZ(K ) / DENOM(K) - CI(K) = - BI (K) - ELSE IF (K < NSOIL) THEN - AI(K) = - WDF(K-1) * DDZ(K-1) / DENOM(K) - CI(K) = - WDF(K ) * DDZ(K ) / DENOM(K) - BI(K) = - ( AI (K) + CI (K) ) - ELSE - AI(K) = - WDF(K-1) * DDZ(K-1) / DENOM(K) - CI(K) = 0.0 - BI(K) = - ( AI (K) + CI (K) ) - END IF - RHSTT(K) = WFLUX(K) / (-DENOM(K)) - END DO - -! ---------------------------------------------------------------------- - END SUBROUTINE SRT - -!== begin sstep ==================================================================================== - - SUBROUTINE SSTEP (parameters,NSOIL ,NSNOW ,DT ,ZSOIL ,DZSNSO , & !in - SICE ,ILOC ,JLOC ,ZWT , & !in - SH2O ,SMC ,AI ,BI ,CI , & !inout - RHSTT ,SMCWTD ,QDRAIN ,DEEPRECH, & !inout - WPLUS ) !out - -! ---------------------------------------------------------------------- -! calculate/update soil moisture content values -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -!input - - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: ILOC !grid index - INTEGER, INTENT(IN) :: JLOC !grid index - INTEGER, INTENT(IN) :: NSOIL ! - INTEGER, INTENT(IN) :: NSNOW ! - REAL, INTENT(IN) :: DT - REAL, INTENT(IN) :: ZWT - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: ZSOIL - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: SICE - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO ! snow/soil layer thickness [m] - -!input and output - REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: SH2O - REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: SMC - REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: AI - REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: BI - REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: CI - REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: RHSTT - REAL , INTENT(INOUT) :: SMCWTD - REAL , INTENT(INOUT) :: QDRAIN - REAL , INTENT(INOUT) :: DEEPRECH - -!output - REAL, INTENT(OUT) :: WPLUS !saturation excess water (m) - -!local - INTEGER :: K - REAL, DIMENSION(1:NSOIL) :: RHSTTIN - REAL, DIMENSION(1:NSOIL) :: CIIN - REAL :: STOT - REAL :: EPORE - REAL :: WMINUS -! ---------------------------------------------------------------------- - WPLUS = 0.0 - - DO K = 1,NSOIL - RHSTT (K) = RHSTT(K) * DT - AI (K) = AI(K) * DT - BI (K) = 1.0 + BI(K) * DT - CI (K) = CI(K) * DT - END DO - -! copy values for input variables before calling rosr12 - - DO K = 1,NSOIL - RHSTTIN(k) = RHSTT(K) - CIIN(k) = CI(K) - END DO - -! call ROSR12 to solve the tri-diagonal matrix - - CALL ROSR12 (CI,AI,BI,CIIN,RHSTTIN,RHSTT,1,NSOIL,0) - - DO K = 1,NSOIL - SH2O(K) = SH2O(K) + CI(K) - ENDDO - -! excessive water above saturation in a layer is moved to -! its unsaturated layer like in a bucket - -!gmmwith opt_run=5 there is soil moisture below nsoil, to the water table - IF(OPT_RUN == 5) THEN - -!update smcwtd - - IF(ZWT < ZSOIL(NSOIL)-DZSNSO(NSOIL))THEN -!accumulate qdrain to update deep water table and soil moisture later - DEEPRECH = DEEPRECH + DT * QDRAIN - ELSE - SMCWTD = SMCWTD + DT * QDRAIN / DZSNSO(NSOIL) - WPLUS = MAX((SMCWTD-parameters%SMCMAX(NSOIL)), 0.0) * DZSNSO(NSOIL) - WMINUS = MAX((1.0E-4-SMCWTD), 0.0) * DZSNSO(NSOIL) - - SMCWTD = MAX( MIN(SMCWTD,parameters%SMCMAX(NSOIL)) , 1.0E-4) - SH2O(NSOIL) = SH2O(NSOIL) + WPLUS/DZSNSO(NSOIL) - -!reduce fluxes at the bottom boundaries accordingly - QDRAIN = QDRAIN - WPLUS/DT - DEEPRECH = DEEPRECH - WMINUS - ENDIF - - ENDIF - - DO K = NSOIL,2,-1 - EPORE = MAX ( 1.0E-4 , ( parameters%SMCMAX(K) - SICE(K) ) ) - WPLUS = MAX((SH2O(K)-EPORE), 0.0) * DZSNSO(K) - SH2O(K) = MIN(EPORE,SH2O(K)) - SH2O(K-1) = SH2O(K-1) + WPLUS/DZSNSO(K-1) - END DO - - EPORE = MAX ( 1.0E-4 , ( parameters%SMCMAX(1) - SICE(1) ) ) - WPLUS = MAX((SH2O(1)-EPORE), 0.0) * DZSNSO(1) - SH2O(1) = MIN(EPORE,SH2O(1)) - - IF(WPLUS > 0.0) THEN - SH2O(2) = SH2O(2) + WPLUS/DZSNSO(2) - DO K = 2,NSOIL-1 - EPORE = MAX ( 1.0E-4 , ( parameters%SMCMAX(K) - SICE(K) ) ) - WPLUS = MAX((SH2O(K)-EPORE), 0.0) * DZSNSO(K) - SH2O(K) = MIN(EPORE,SH2O(K)) - SH2O(K+1) = SH2O(K+1) + WPLUS/DZSNSO(K+1) - END DO - - EPORE = MAX ( 1.0E-4 , ( parameters%SMCMAX(NSOIL) - SICE(NSOIL) ) ) - WPLUS = MAX((SH2O(NSOIL)-EPORE), 0.0) * DZSNSO(NSOIL) - SH2O(NSOIL) = MIN(EPORE,SH2O(NSOIL)) - END IF - - SMC = SH2O + SICE - - END SUBROUTINE SSTEP - -!==begin VIC subroutines ========================================================================== - - SUBROUTINE COMPUTE_VIC_SURFRUNOFF(parameters,DT,NSOIL,SMC,ZSOIL,QINSUR,ASAT,RUNSRF,PDDUM) - -! ---------------------------------------------------------------------- -! Calculate the saturated area and runoff based on VIC runoff scheme. -! This scheme adopted from VIC model -! Author: Prasanth Valayamkunnath -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- - -! Inputs - TYPE (noahmp_parameters), INTENT(IN) :: parameters - INTEGER, INTENT(IN) :: NSOIL - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SMC - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: ZSOIL - REAL , INTENT(IN) :: QINSUR - REAL , INTENT(IN) :: DT - REAL , INTENT(OUT) :: ASAT -! Output - REAL , INTENT(INOUT):: RUNSRF - REAL , INTENT(INOUT):: PDDUM -!------------------------------------------------------------------------ -!local - REAL :: EX, I_0, I_MAX, BASIS, TOP_MOIST, TOP_MAX_MOIST - INTEGER :: IZ - -! Initialize Variables - EX = 0.0 - ASAT = 0.0 - I_MAX = 0.0 - I_0 = 0.0 - BASIS = 0.0 - TOP_MOIST = 0.0 - TOP_MAX_MOIST = 0.0 - RUNSRF = 0.0 - - DO IZ=1,NSOIL-2 - TOP_MOIST = TOP_MOIST + (SMC(IZ)*-1.0*ZSOIL(IZ)) ! m - TOP_MAX_MOIST = TOP_MAX_MOIST + (parameters%SMCMAX(IZ)*-1.0*ZSOIL(IZ)) ! m - END DO - - ! Saturated area from soil moisture - EX = parameters%BVIC/(1.0+parameters%BVIC) - ASAT = 1.0 - (( max(0.0,(1.0 - (TOP_MOIST/TOP_MAX_MOIST))))**EX) ! - ASAT = MAX(0.0, ASAT) - ASAT = MIN(1.0, ASAT) - - ! Infiltration for the previous time-step soil moisture based on ASAT - I_MAX = (1.0 + parameters%BVIC)*TOP_MAX_MOIST ! m - I_0 = I_MAX*(1.0 - (1.0 - ASAT)**(1.0/parameters%BVIC)) !m - - ! Solve for surface runoff - IF(QINSUR .EQ. 0.0) THEN - RUNSRF = 0.0 - ELSE IF(I_MAX .EQ. 0.0) THEN - RUNSRF = QINSUR*DT - ELSE IF( (I_0 + (QINSUR*DT)) .GT. I_MAX ) THEN - RUNSRF = (QINSUR*DT) - TOP_MAX_MOIST + TOP_MOIST - ELSE - BASIS = 1.0 - ((I_0 + (QINSUR*DT))/I_MAX) - RUNSRF = (QINSUR*DT) - TOP_MAX_MOIST + TOP_MOIST + & - TOP_MAX_MOIST*(basis**(1.0+parameters%BVIC)) - END IF - - RUNSRF = RUNSRF/(DT) ! m/s - IF (RUNSRF .LT. 0.0) RUNSRF = 0.0 - IF (RUNSRF .GT. QINSUR)RUNSRF = QINSUR - - PDDUM = QINSUR - RUNSRF ! m/s - - END SUBROUTINE COMPUTE_VIC_SURFRUNOFF - -! End VIC subroutines - -!== begin xinanjiag================================================================================= - - SUBROUTINE COMPUTE_XAJ_SURFRUNOFF(parameters,DT,FCR,NSOIL,SMC,ZSOIL,QINSUR,RUNSRF,PDDUM) - -! ---------------------------------------------------------------------- -! Calculate the saturated area and runoff based on Xinanjiag runoff scheme. -! Reference: Knoben, W. J., Freer, J. E., Fowler, K. J., Peel, M. C., & Woods, R. A. (2019). -! Modular Assessment of Rainfall-Runoff Models Toolbox (MARRMoT) v1. 2: -! an open-source, extendable framework providing implementations of 46 conceptual -! hydrologic models as continuous state-space formulations. -! ---------------------------------------------------------------------- -! Author: Prasanth Valayamkunnath -! Date: August 03, 2020 -! ---------------------------------------------------------------------- - - IMPLICIT NONE -! ---------------------------------------------------------------------- -! Inputs - TYPE (noahmp_parameters), INTENT(IN) :: parameters - INTEGER, INTENT(IN) :: NSOIL - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SMC - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: ZSOIL - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: FCR !fraction of imperviousness (-) = IMP - REAL , INTENT(IN) :: QINSUR - REAL , INTENT(IN) :: DT -! Output - REAL , INTENT(INOUT):: RUNSRF - REAL , INTENT(INOUT):: PDDUM -! local - REAL :: WM,WM_MAX,SM,SM_MAX,IRUNOFF,PRUNOFF - INTEGER :: IZ -!------------------------------------------------------------------------ - -!initialize - WM = 0.0 - WM_MAX = 0.0 - SM = 0.0 - SM_MAX = 0.0 - IRUNOFF = 0.0 - PRUNOFF = 0.0 - RUNSRF = 0.0 - - DO IZ=1,NSOIL-2 - IF ((SMC(IZ)-parameters%SMCREF(IZ)) .GT. 0.0) THEN ! soil moisture greater than field capacity - SM = SM + (SMC(IZ) - parameters%SMCREF(IZ) )*-1.0*ZSOIL(IZ) !m - WM = WM + (parameters%SMCREF(IZ)*-1.0*ZSOIL(IZ)) !m - ELSE - WM = WM + (SMC(IZ)*-1.0*ZSOIL(IZ)) - END IF - WM_MAX = WM_MAX + (parameters%SMCREF(IZ)*-1.0*ZSOIL(IZ)) - SM_MAX = SM_MAX + (parameters%SMCMAX(IZ) - parameters%SMCREF(IZ))*-1.0*ZSOIL(IZ) - END DO - WM = MIN(WM,WM_MAX) ! tension water (m) - SM = MIN(SM,SM_MAX) ! free water (m) - -! impervious surface runoff R_IMP - IRUNOFF = FCR(1)*QINSUR*DT - -! solve pervious surface runoff (m) based on Eq. (310) - IF ((WM/WM_MAX) .LE. (0.5-parameters%AXAJ))THEN - PRUNOFF = (1.0-FCR(1))*QINSUR*DT*((0.5-parameters%AXAJ)**(1.0-parameters%BXAJ))*((WM/WM_MAX)**parameters%BXAJ) - ELSE - PRUNOFF = (1.0-FCR(1))*QINSUR*DT*(1.0-(((0.5+parameters%AXAJ)**(1.0-parameters%BXAJ))*((1.0-(WM/WM_MAX))**parameters%BXAJ))) - END IF - -! estimate surface runoff based on Eq. (313) - IF(QINSUR .EQ. 0.0) THEN - RUNSRF = 0.0 - ELSE - RUNSRF = PRUNOFF*(1.0-((1.0-(SM/SM_MAX))**parameters%XXAJ))+IRUNOFF - END IF - RUNSRF = RUNSRF/DT !m/s - RUNSRF = MAX(0.0, RUNSRF) - RUNSRF = MIN(QINSUR, RUNSRF) - PDDUM = QINSUR - RUNSRF - - END SUBROUTINE COMPUTE_XAJ_SURFRUNOFF - -!== end xinanjiag ================================================================================== - -!== begin dynamic VIC ============================================================================== - - SUBROUTINE DYNAMIC_VIC(parameters,DT,SMC,SH2O,SICE,SICEMAX,NSOIL,ZSOIL,QINSUR,FACC,PDDUM,RUNSRF) - -! -------------------------------------------------------------------------------- -! compute inflitration rate at soil surface and estimate surface runoff based on -! Liang, X., & Xie, Z. (2001). A new surface runoff parameterization with subgrid-scale -! soil heterogeneity for land surface models. Advances in Water Resources, 24(9-10), 1173-1193. -! Author: Prasanth Valayamkunnath -! Date : August 3, 2020 -! -------------------------------------------------------------------------------- - - IMPLICIT NONE -! -------------------------------------------------------------------------------- -! inputs - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: NSOIL !no. of soil layers - REAL, INTENT(IN) :: DT !time step (sec) - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: ZSOIL !depth of soil layer-bottom [m] - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SH2O !soil liquid water content [m3/m3] - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SICE !soil ice content [m3/m3] - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SMC !soil moisture content [m3/m3] - REAL, INTENT(IN) :: QINSUR !water input on soil surface [m/s] - REAL, INTENT(IN) :: SICEMAX !maximum soil ice content (m3/m3) -! inouts - REAL, INTENT(INOUT) :: FACC !accumulated infiltration (m) -! outputs - REAL, INTENT(OUT) :: RUNSRF !surface runoff [mm/s] - REAL, INTENT(OUT) :: PDDUM !infiltration rate at surface -! locals - REAL :: BB !B parameter for infiltration scaling curve - REAL :: TOP_MOIST !actual water depth in top layers (m) - REAL :: TOP_MAX_MOIST !water depth in top layers (m) - REAL :: DP !water input on soil surface (m) - REAL :: I_0 !initial water depth (m) - REAL :: I_MAX !maximum water depth (m) - REAL :: FSUR !surface infiltration rate (m/s) - REAL :: FMAX !maximum infiltration rate (m/s) - REAL :: RUNOFFSAT !saturation excess runoff (m/s) - REAL :: RUNOFFINF !infiltration excess runoff (m/s) - REAL :: INFILTRTN !infiltration (m/s) - REAL :: TEMPR1 !temporary saturation excess runoff (m/s) - REAL :: TEMPR2 !temporary infiltration excess runoff (m/s) - REAL :: R1 !saturation excess runoff (m/s) - REAL :: R2 !infiltration excess runoff (m/s) - REAL :: YD !initial depth Y (m) - REAL :: YD_OLD !initial depth Y (m) - REAL :: YD0 !initial depth Y (m) - REAL :: TEMP1, ERROR - INTEGER :: IZ, IZMAX, INFLMAX -!--------------------------------------------------------------------------------- - - TOP_MOIST = 0.0 - TOP_MAX_MOIST = 0.0 - BB = 1.0 - DP = 0.0 - I_MAX = 0.0 - I_0 = 0.0 - RUNOFFSAT = 0.0 - RUNOFFINF = 0.0 - INFILTRTN = 0.0 - RUNSRF = 0.0 - IZMAX = 20 - ERROR = 1.388889E-07*DT ! 0.5 mm per hour time step - BB = parameters%BBVIC - - DO IZ=1,NSOIL-2 - TOP_MOIST = TOP_MOIST + (SMC(IZ)*-1.0*ZSOIL(IZ)) ! actual moisture in top layers, [m] - TOP_MAX_MOIST = TOP_MAX_MOIST + (parameters%SMCMAX(IZ)*-1.0*ZSOIL(IZ)) ! maximum moisture in top layers, [m] - END DO - - IF(TOP_MOIST .GT. TOP_MAX_MOIST) TOP_MOIST = TOP_MAX_MOIST - DP = QINSUR * DT ! precipitation depth, [m] - I_MAX = TOP_MAX_MOIST * (parameters%BDVIC+1.0) ! maximum infiltration capacity, im, [m], Eq. 14 - I_0 = I_MAX * (1.0-(1.0-(TOP_MOIST/TOP_MAX_MOIST)**(1.0/(1.0+parameters%BDVIC)))) ! infiltration capacity, i [m] in the Eq. 1 - ! I_MAX = CAP_minf ; I_0 = A - INFLMAX = 0 - - IF (OPT_INFDV .EQ. 1) THEN - CALL PHILIP_INFIL(parameters,NSOIL,SMC,SICE,QINSUR,DT,FACC,FSUR,INFLMAX) - ELSE IF (OPT_INFDV .EQ. 2) THEN - CALL GREEN_AMPT_INFIL(parameters,NSOIL,ZSOIL,SMC,SICE,QINSUR,FACC,FSUR,INFLMAX) - ELSE IF (OPT_INFDV .EQ. 3) THEN - CALL SMITH_PARLANGE_INFIL(parameters,NSOIL,ZSOIL,SMC,SICE,QINSUR,FACC,FSUR,INFLMAX) - END IF - - ! I_MM = FSUR; I_M = FMAX - FMAX = (BB+1.0)*FSUR - IF(DP .LE. 0.0) THEN - RUNOFFSAT = 0.0 - RUNOFFINF = 0.0 - INFILTRTN = 0.0 - GOTO 2001 - ELSE - IF((TOP_MOIST .GE. TOP_MAX_MOIST) .AND. (I_0 .GE. I_MAX)) THEN - TOP_MOIST = TOP_MAX_MOIST - I_0 = I_MAX - RUNOFFSAT = DP - RUNOFFINF = 0.0 - INFILTRTN = 0.0 - GOTO 2001 - ELSE - I_0 = I_MAX * (1.0-(1.0-(TOP_MOIST/TOP_MAX_MOIST)**(1.0/(1.0+parameters%BDVIC)))) - IF((DP+I_0) .GT. I_MAX)THEN - IF((FMAX*DT) .GE. DP) THEN - YD = I_MAX - I_0 - TEMPR1 = 0.0 - CALL RR1(parameters,I_0,I_MAX,YD,TEMPR1) - TEMP1 = I_MAX-I_0-TEMPR1-((FSUR*DT) * (1.0 - (1.0-((DP-TEMPR1)/(FMAX*DT))**(BB+1.0)))) - IF(TEMP1 .LE. 0.0) THEN - YD = I_MAX - I_0 - INFILTRTN = TOP_MAX_MOIST - TOP_MOIST - RUNOFFSAT = DP - INFILTRTN - RUNOFFINF = 0.0 - TOP_MOIST = TOP_MAX_MOIST - I_0 = I_MAX - GOTO 2001 - ELSE - YD = 0.0 - - DO IZ = 1,IZMAX ! loop : IITERATION1 - YD_OLD = YD - TEMPR1 = 0.0 - CALL RR1(parameters,I_0,I_MAX,YD,TEMPR1) - YD = TEMPR1 + ((FSUR*DT) * (1.0 - (1.0-((DP-TEMPR1)/(FMAX*DT))**(BB+1.0)))) - IF ((ABS(YD-YD_OLD) .LE. ERROR) .OR. (IZ .EQ. IZMAX)) THEN - GOTO 1003 - END IF - END DO - END IF - ELSE - TEMPR1 = 0.0 - CALL RR1(parameters,I_0,I_MAX,YD,TEMPR1) - IF((TEMPR1+(FMAX*DT)) .LE. DP) THEN - IF((I_MAX-I_0-TEMPR1-(FMAX*DT)) .LE. 0.0)THEN - YD = I_MAX - I_0 - INFILTRTN = TOP_MAX_MOIST - TOP_MOIST - RUNOFFSAT = DP - INFILTRTN - RUNOFFINF = 0.0 - TOP_MOIST = TOP_MAX_MOIST - I_0 = I_MAX - GOTO 2001 - ELSE - YD = 0.0 - - DO IZ = 1,IZMAX ! loop : IITERATION2 - YD_OLD = YD - TEMPR1 = 0.0 - CALL RR1(parameters,I_0,I_MAX,YD,TEMPR1) - YD = TEMPR1 + (FSUR*DT) - IF ((ABS(YD-YD_OLD) .LE. ERROR) .OR. (IZ .EQ. IZMAX)) THEN - GOTO 1003 - END IF - END DO - END IF - - ELSE - - YD = DP/2.0 - DO IZ = 1,IZMAX ! loop : IITERATION30 - YD_OLD = YD - TEMPR1 = 0.0 - CALL RR1(parameters,I_0,I_MAX,YD,TEMPR1) - YD = YD - TEMPR1 - (FSUR*DT) + DP - IF (YD .LE. 0.0) YD = 0.0 - IF (YD .GE. DP) YD = DP - IF ((ABS(YD-YD_OLD) .LE. ERROR) .OR. (IZ .EQ. IZMAX)) THEN - YD0 = YD - EXIT - END IF - END DO - DO IZ = 1,IZMAX ! loop : IITERATION3 - YD_OLD = YD - TEMPR1 = 0.0 - TEMPR2 = 0.0 - CALL RR1(parameters,I_0,I_MAX,YD,TEMPR1) - CALL RR2(YD,YD0,TEMPR1,FMAX,FSUR,DT,DP,BB,TEMPR2) - YD = DP - TEMPR2 - IF ((ABS(YD-YD_OLD) .LE. ERROR) .OR. (IZ .EQ. IZMAX)) THEN - GOTO 1003 - END IF - END DO -1003 IF(YD .LE. 0.0) YD = 0.0 - IF(YD .GE. DP) YD = DP - CALL RR1(parameters,I_0,I_MAX,YD,R1) - RUNOFFSAT = R1 - RUNOFFINF = DP - YD - INFILTRTN = YD - RUNOFFSAT - TOP_MOIST = TOP_MOIST + INFILTRTN - YD = I_0+YD - IF (TOP_MOIST .LE. 0.0) TOP_MOIST=0.0 - IF (TOP_MOIST .GE. TOP_MAX_MOIST) TOP_MOIST = TOP_MAX_MOIST - I_0 = I_MAX * (1.0-(1.0-(TOP_MOIST/TOP_MAX_MOIST)**(1.0/(1.0+parameters%BDVIC)))) - GOTO 2001 - END IF - END IF - - ELSE - IF((FMAX*DT) .GE. DP) THEN - YD = DP/2.0 - DO IZ = 1,IZMAX ! ITERATION1 - YD_OLD = YD - TEMPR1 = 0.0 - CALL RR1(parameters,I_0,I_MAX,YD,TEMPR1) - YD = TEMPR1 + ((FSUR*DT) * (1.0 - (1.0-((DP-TEMPR1)/(FMAX*DT))**(BB+1.0)))) - !print*,'YD=',YD,'YD_OLD=',YD_OLD,'ERROR=',ABS(YD - YD_OLD),'IZ=',IZ,'ERROR2=',ERROR,'DT=',DT - IF ((ABS(YD - YD_OLD) .LE. ERROR) .OR. (IZ .EQ. IZMAX)) THEN - GOTO 1004 - END IF - END DO - ELSE - TEMPR1 = 0.0 - CALL RR1(parameters,I_0,I_MAX,YD,TEMPR1) - IF((TEMPR1+(FMAX*DT)) .LE. DP)THEN - YD = DP/2.0 - DO IZ = 1,IZMAX ! ITERATION2 - YD_OLD = YD - TEMPR1 = 0.0 - CALL RR1(parameters,I_0,I_MAX,YD,TEMPR1) - YD = TEMPR1+(FSUR*DT) - IF((ABS(YD - YD_OLD) .LE. ERROR) .OR. (IZ .EQ. IZMAX)) THEN - GOTO 1004 - END IF - END DO - ELSE - YD = 0.0 - DO IZ = 1,IZMAX ! ITERATION30 - YD_OLD = YD - TEMPR1 = 0.0 - CALL RR1(parameters,I_0,I_MAX,YD,TEMPR1) - YD = (DP - (FMAX*DT)) + YD - TEMPR1 - IF(YD .LE. 0.0) YD = 0.0 - IF(YD .GE. DP) YD = DP - TEMPR1 = 0.0 - CALL RR1(parameters,I_0,I_MAX,YD,TEMPR1) - IF ((ABS(TEMPR1+(FMAX*DT)-DP) .LE. ERROR) .OR. (IZ .EQ. IZMAX)) THEN - YD0 = YD - EXIT - END IF - END DO - DO IZ = 1,IZMAX ! ITERATION3 - YD_OLD = YD - TEMPR1 = 0.0 - TEMPR2 = 0.0 - CALL RR1(parameters,I_0,I_MAX,YD,TEMPR1) - CALL RR2(YD,YD0,TEMPR1,FMAX,FSUR,DT,DP,BB,TEMPR2) - YD = DP - TEMPR2 - IF ((ABS(YD-YD_OLD) .LE. ERROR) .OR. (IZ .EQ. IZMAX)) THEN - GOTO 1004 - END IF - END DO - END IF - END IF -1004 IF(YD .LE. 0.0) YD = 0.0 - IF(YD .GE. DP) YD = DP - R1 = 0.0 - CALL RR1(parameters,I_0,I_MAX,YD,R1) - RUNOFFSAT = R1 - RUNOFFINF = DP - YD - INFILTRTN = YD - RUNOFFSAT - TOP_MOIST = TOP_MOIST + INFILTRTN - IF (TOP_MOIST .LE. 0.0) TOP_MOIST=0.0 - IF (TOP_MOIST .GE. TOP_MAX_MOIST) TOP_MOIST = TOP_MAX_MOIST - I_0 = I_MAX * (1.0-(1.0-(TOP_MOIST/TOP_MAX_MOIST)**(1.0/(1.0+parameters%BDVIC)))) - END IF - END IF - END IF - -2001 RUNSRF = (RUNOFFSAT + RUNOFFINF)/DT - RUNSRF = MIN(RUNSRF,QINSUR) - RUNSRF = MAX(RUNSRF,0.0) - PDDUM = QINSUR - RUNSRF - - END SUBROUTINE DYNAMIC_VIC - -! --------------------------- Runoff subroutines for dynamic VIC ---------------------------- - - SUBROUTINE RR1 (parameters,I_0,I_MAX,YD,R1) -!--------------------------------------------------------------------------------------------- -! This subroutine estimate saturation excess runoff, R1 -! Author: Prasanth Valayamkunnath -!--------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------- - type (noahmp_parameters), intent(in) :: parameters - REAL, INTENT(IN) :: I_0,I_MAX,YD - REAL, INTENT(OUT):: R1 - REAL :: TDEPTH -!------------------------------------------------------ - - TDEPTH = I_0 + YD - IF(TDEPTH .GT. I_MAX) TDEPTH = I_MAX - - !Saturation excess runoff , Eq 5. - R1 = YD - ( (I_MAX/(parameters%BDVIC+1.0)) * ( ((1.0 - (I_0/I_MAX))**(parameters%BDVIC+1.0)) & - - ((1.0 - (TDEPTH/I_MAX))**(parameters%BDVIC+1.0)))) - - IF (R1 .LT. 0.0) R1 = 0.0 - - END SUBROUTINE RR1 - -!--------------------------------------------------------------------------------------------- - SUBROUTINE RR2 (YD,Y0,R1,FMAX,FSUR,DT,DP,BB,R2) -!--------------------------------------------------------------------------------------------- -! This subroutine estimate infiltration excess runoff, R1 -! Author: Prasanth Valayamkunnath -!--------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------- - REAL, INTENT(IN) :: YD,Y0,R1,FMAX,FSUR,DT,DP,BB - REAL, INTENT(OUT):: R2 -!------------------------------------------------------ - - IF(YD .GE. Y0)THEN - R2 = DP - R1 - (FMAX*DT* (1.0 - ((1.0 - (DP-R1)/(FMAX*DT))**(BB+1.0)))) - ELSE - R2 = DP - R1 - (FMAX*DT) - END IF - - IF(R2 .LT. 0.0) R2 =0.0 - -END SUBROUTINE RR2 - -!== end dynamic VIC ================================================================================ - -!== begin smith-parlange infiltration =============================================================== - - SUBROUTINE SMITH_PARLANGE_INFIL(parameters,NSOIL,ZSOIL,SMC,SICE,QINSUR,FACC,FSUR,INFLMAX) - -!--------------------------------------------------------------------------------------------- -! This function estimate infiltration rate based on Smith-Parlange equation. We use its three -! parameter version of the equation (Eq. 6.25) from Smith, R.E. (2002) Infiltration Theory for -! Hydrologic Applications, Water Resources Monograph 15, AGU. -! Author: Prasanth Valayamkunnath -!--------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------- - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: NSOIL !no of soil layers (4) - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: ZSOIL !depth of soil layer-bottom [m] - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SMC !soil moisture content [m3/m3] - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SICE !soil ice content [m3/m3] - REAL, INTENT(IN) :: QINSUR !water input on soil surface [m/s] - INTEGER, INTENT(IN) :: INFLMAX!check for maximum infiltration at SMCWLT -! in outs - REAL, INTENT(INOUT) :: FACC !accumulated infiltration rate (m/s) -! outputs - REAL, INTENT(OUT) :: FSUR !surface infiltration rate (m/s) -! local variables - REAL :: WDF ! soil water diffusivity - REAL :: WCND ! soil water conductivity[m/s] - REAL :: GAM ! smith-parlang weighing parameter[-] - REAL :: JJ ! dummy variable - INTEGER :: ISOIL -!--------------------------------------------------------------------------------- - - ! smith-parlang weighing parameter, GAMMA - GAM = 0.82 - ISOIL = 1 - ! check whether we are estimating infiltration for current SMC or SMCWLT - IF (INFLMAX .EQ. 1)THEN ! not active for now as the maximum infiltration is estimated based on table values - - ! estimate initial soil hydraulic conductivty (Ki in the equation), WCND (m/s) - CALL WDFCND2 (parameters,WDF,WCND,parameters%SMCWLT(ISOIL),0.0,ISOIL) - - ! Maximum infiltrability based on the Eq. 6.25. (m/s) - JJ = parameters%GDVIC * (parameters%SMCMAX(ISOIL) - parameters%SMCWLT(ISOIL)) * -1.0 * ZSOIL(ISOIL) - FSUR = parameters%DKSAT(ISOIL) + (GAM * (parameters%DKSAT(ISOIL) - WCND) / (EXP(GAM * FACC / JJ) -1.0)) - - ! infiltration rate at surface - IF(parameters%DKSAT(ISOIL) .LT. QINSUR)THEN - FSUR = MIN(QINSUR,FSUR) - ELSE - FSUR = QINSUR - END IF - IF(FSUR .LT. 0.0) FSUR = WCND - - ELSE - - ! estimate initial soil hydraulic conductivty (Ki in the equation), WCND (m/s) - CALL WDFCND2 (parameters,WDF,WCND,SMC(ISOIL),SICE(ISOIL),ISOIL) - - ! Maximum infiltrability based on the Eq. 6.25. (m/s) - JJ = parameters%GDVIC * max(0.0,(parameters%SMCMAX(ISOIL) - SMC(ISOIL))) * -1.0 * ZSOIL(ISOIL) - - IF(JJ == 0.0)THEN ! infiltration at surface == saturated hydraulic conductivity - FSUR = WCND - ELSE - FSUR = parameters%DKSAT(ISOIL) + (GAM * (parameters%DKSAT(ISOIL) - WCND) / (EXP(GAM * FACC / JJ) -1.0)) - END IF - - ! infiltration rate at surface - IF(parameters%DKSAT(ISOIL) .LT. QINSUR)THEN - FSUR = MIN(QINSUR,FSUR) - ELSE - FSUR = QINSUR - END IF - - ! accumulated infiltration function - FACC = FACC + FSUR - - END IF - - END SUBROUTINE SMITH_PARLANGE_INFIL - -!== end smith-parlang infiltration ================================================================= - -!== begin Green_Ampt infiltration ================================================================== - - SUBROUTINE GREEN_AMPT_INFIL(parameters,NSOIL,ZSOIL,SMC,SICE,QINSUR,FACC,FSUR,INFLMAX) - -!------------------------------------------------------------------------------------------------- -! This function estimate infiltration rate based on Green-Ampt equation. We use its three -! parameter version of the smith-parlage equation (Eq. 6.25) from Smith, R.E. (2002) Infiltration Theory for -! Hydrologic Applications, Water Resources Monograph 15, AGU. Where gamma = 0, Eq 6.25 = Green-Ampt. -! Author: Prasanth Valayamkunnath -!------------------------------------------------------------------------------------------------- - IMPLICIT NONE -! ------------------------------------------------------------------------------------------------ - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: NSOIL !no of soil layers (4) - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: ZSOIL !depth of soil layer-bottom [m] - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SMC !soil moisture content [m3/m3] - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SICE !soil ice content [m3/m3] - REAL, INTENT(IN) :: QINSUR !water input on soil surface [m/s] - INTEGER, INTENT(IN) :: INFLMAX!check for maximum infiltration at SMCWLT -! in outs - REAL, INTENT(INOUT) :: FACC !accumulated infiltration rate (m/s) -! outputs - REAL, INTENT(OUT) :: FSUR !surface infiltration rate (m/s) -! local variables - REAL :: WDF ! soil water diffusivity - REAL :: WCND ! soil water conductivity[m/s] - REAL :: JJ ! dummy variable - INTEGER :: ISOIL -!--------------------------------------------------------------------------------- - - ISOIL = 1 - IF(INFLMAX .EQ. 1)THEN - - ! estimate initial soil hydraulic conductivty (Ki in the equation), WCND (m/s) - CALL WDFCND2 (parameters,WDF,WCND,parameters%SMCWLT(ISOIL),0.0,ISOIL) - - ! Maximum infiltrability based on the Eq. 6.25. (m/s) - JJ = parameters%GDVIC * (parameters%SMCMAX(ISOIL) - parameters%SMCWLT(ISOIL)) * -1.0 * ZSOIL(ISOIL) - FSUR = parameters%DKSAT(ISOIL) + ((JJ/1E-05) * (parameters%DKSAT(ISOIL) - WCND)) - - !maximum infiltration rate at surface - IF(FSUR .LT. 0.0) FSUR = WCND - - ELSE - - ! estimate initial soil hydraulic conductivty (Ki in the equation), WCND (m/s) - CALL WDFCND2 (parameters,WDF,WCND,SMC(ISOIL),SICE(ISOIL),ISOIL) - - ! Maximum infiltrability based on the Eq. 6.25. (m/s) - JJ = parameters%GDVIC * max(0.0,(parameters%SMCMAX(ISOIL) - SMC(ISOIL))) * -1.0 * ZSOIL(ISOIL) - FSUR = parameters%DKSAT(ISOIL) + ((JJ/FACC) * (parameters%DKSAT(ISOIL) - WCND)) - - ! infiltration rate at surface - IF(parameters%DKSAT(ISOIL) .LT. QINSUR)THEN - FSUR = MIN(QINSUR,FSUR) - ELSE - FSUR = QINSUR - END IF - ! accumulated infiltration function - FACC = FACC + FSUR - - END IF - - END SUBROUTINE GREEN_AMPT_INFIL - -!== end Green-Ampt infiltration ==================================================================== - -!== begin Philip's infiltration ==================================================================== - - SUBROUTINE PHILIP_INFIL(parameters,NSOIL,SMC,SICE,QINSUR,DT,FACC,FSUR,INFLMAX) - -!------------------------------------------------------------------------------------------------------- -! This function estimate infiltration rate based on Philip's two parameter equation (Eq. 2) presented in -! Valiantzas (2010). New linearized two-parameter infiltration equation for direct determination -! of conductivity and sorptivity, J. Hydrology. -! Author: Prasanth Valayamkunnath -!--------------------------------------------------------------------------------------------- - IMPLICIT NONE -! -------------------------------------------------------------------------------------------- - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: NSOIL !no of soil layers (4) - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SMC !soil moisture content [m3/m3] - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SICE !soil ice content [m3/m3] - REAL, INTENT(IN) :: QINSUR !water input on soil surface [m/s] - REAL, INTENT(IN) :: DT !time-step (sec) - INTEGER, INTENT(IN) :: INFLMAX!check for maximum infiltration at SMCWLT -! in outs - REAL, INTENT(INOUT) :: FACC !accumulated infiltration rate (m/s) -! outputs - REAL, INTENT(OUT) :: FSUR !surface infiltration rate (m/s) -! local variables - REAL :: WDF ! soil water diffusivity (m2/s) - REAL :: WCND ! soil water conductivity[m/s] - REAL :: SP ! sorptivity (LT^-1/2) - REAL :: AP ! intial hydraulic conductivity (m/s,L/T) - REAL :: FMAX ! Maximum infiltration (m/s) - INTEGER :: ISOIL -!--------------------------------------------------------------------------------- - - ISOIL = 1 - IF (INFLMAX .EQ. 1) THEN - - ! estimate initial soil hydraulic conductivty and diffusivity (Ki, D(theta) in the equation) - CALL WDFCND2 (parameters,WDF,WCND,parameters%SMCWLT(ISOIL),0.0,ISOIL) - - ! Sorptivity based on Eq. 10b from Kutílek, Miroslav, and Jana Valentová (1986) - ! Sorptivity approximations. Transport in Porous Media 1.1, 57-62. - SP = SQRT(2.0 * (parameters%SMCMAX(ISOIL) - parameters%SMCWLT(ISOIL)) * (parameters%DWSAT(ISOIL) - WDF)) - - ! Parameter A in Eq. 9 of Valiantzas (2010) is given by - AP = MIN(WCND, (2.0/3.0)*parameters%DKSAT(ISOIL)) - AP = MAX(AP, (1.0/3.0)*parameters%DKSAT(ISOIL)) - - ! Maximun infiltration rate, m - FSUR = (1.0/2.0)*SP*(DT**(-1.0/2.0))+AP ! m/s - IF(FSUR .LT. 0.0) FSUR = WCND - - ELSE - - ! estimate initial soil hydraulic conductivty and diffusivity (Ki, D(theta) in the equation) - CALL WDFCND2 (parameters,WDF,WCND,SMC(ISOIL),SICE(ISOIL),ISOIL) - - ! Sorptivity based on Eq. 10b from Kutílek, Miroslav, and Jana Valentová (1986) - ! Sorptivity approximations. Transport in Porous Media 1.1, 57-62. - SP = SQRT(2.0 * max(0.0,(parameters%SMCMAX(ISOIL) - SMC(ISOIL))) * (parameters%DWSAT(ISOIL) - WDF)) - - ! Parameter A in Eq. 9 of Valiantzas (2010) is given by - AP = MIN(WCND, (2.0/3.0)*parameters%DKSAT(ISOIL)) - AP = MAX(AP, (1.0/3.0)*parameters%DKSAT(ISOIL)) - - ! Maximun infiltration rate, m - FSUR = (1.0/2.0)*SP*(DT**(-1.0/2.0))+AP ! m/s - - ! infiltration rate at surface - IF(parameters%DKSAT(ISOIL) .LT. QINSUR)THEN - FSUR = MIN(QINSUR,FSUR) - ELSE - FSUR = QINSUR - END IF - ! accumulated infiltration function - FACC = FACC + FSUR - - END IF - - END SUBROUTINE PHILIP_INFIL - -!== end Phillips infiltration ====================================================================== - -!== begin tile_drain =============================================================================== - - SUBROUTINE TILE_DRAIN (parameters,NSOIL,SH2O,SMC,SICE,ZSOIL,QTLDRN,DT) - -! ---------------------------------------------------------------------- -! Calculate tile drainage discharge (mm) based on simple model ! pvk -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! inout - type (noahmp_parameters), intent(in) :: parameters - INTEGER,INTENT(IN) :: NSOIL - REAL, INTENT(IN) :: DT - REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: SH2O - REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: SMC - REAL,INTENT(INOUT) :: QTLDRN -! input - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SICE - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: ZSOIL -! local - INTEGER :: K - REAL :: TDRVOL ! temp variable for drainage volume (mm) - REAL,DIMENSION(1:NSOIL) :: OVRFC ! temp variable for volume of water above field capacity - REAL,DIMENSION(1:NSOIL) :: AVFC ! Available field capacity = FC - SICE (m3/m3) - REAL,DIMENSION(1:NSOIL) :: ZLAYER ! thickness of soil layer - REAL,DIMENSION(1:NSOIL) :: TDFRAC - REAL :: TDDC - REAL :: TDSUM -! ---------------------------------------------------------------------- - - TDRVOL = 0.0 - OVRFC = 0.0 - QTLDRN = 0.0 - ZLAYER = 0.0 - AVFC = 0.0 - TDSUM = 0.0 - TDFRAC = 0.0 - TDDC = parameters%TD_DC * DT/(24.0*3600.0) - - DO K = 1, NSOIL - IF (K == 1) THEN - ZLAYER(K) = -1.0 * ZSOIL(K) - ELSE - ZLAYER(K) = (ZSOIL(K-1)-ZSOIL(K)) - END IF - END DO - IF (parameters%DRAIN_LAYER_OPT == 0) THEN ! drainage from one specified layer in MPTABLE.TBL - !print*, "CASE = 1" - K = parameters%TD_DEPTH - AVFC(K) = parameters%SMCREF(K) - SICE (K) - OVRFC(K) = (SH2O(K) - (parameters%TDSMC_FAC*AVFC(K))) * ZLAYER(K) * 1000.0 ! mm - IF (OVRFC(K) > 0.0) THEN - IF (OVRFC(K) > TDDC) OVRFC(K) = TDDC - TDRVOL = TDRVOL + OVRFC(K) - SH2O(K) = SH2O(K) - (OVRFC(K)/(ZLAYER(K) * 1000.0)) - SMC(K) = SH2O(K) + SICE (K) - END IF - ELSE IF (parameters%DRAIN_LAYER_OPT == 1) THEN - !print*, "CASE = 2. Draining from layer 1 and 2" - DO K = 1, 2 - AVFC(K) = parameters%SMCREF(K) - SICE (K) - OVRFC(K) = (SH2O(K) - (parameters%TDSMC_FAC*AVFC(K))) * ZLAYER(K) * 1000.0 ! mm - IF(OVRFC(K) < 0.0) OVRFC(K) = 0.0 - TDSUM = TDSUM + OVRFC(K) - END DO - DO K = 1, 2 - IF(OVRFC(K) .NE. 0.0) THEN - TDFRAC(K) = OVRFC(K)/TDSUM - END IF - END DO - IF (TDSUM > 0.0) THEN - IF (TDSUM > TDDC) TDSUM = TDDC - TDRVOL = TDRVOL + TDSUM - DO K = 1, 2 - OVRFC(K) = TDFRAC(K)*TDSUM - SH2O(K) = SH2O(K) - (OVRFC(K)/(ZLAYER(K) * 1000.0)) - SMC(K) = SH2O(K) + SICE (K) - END DO - END IF - ELSE IF (parameters%DRAIN_LAYER_OPT == 2) THEN - !print*, "CASE = 3. Draining from layer 1 2 and 3" - DO K = 1, 3 - AVFC(K) = parameters%SMCREF(K) - SICE (K) - OVRFC(K) = (SH2O(K) - (parameters%TDSMC_FAC*AVFC(K))) * ZLAYER(K) * 1000.0 ! mm - IF(OVRFC(K) < 0.0) OVRFC(K) = 0.0 - TDSUM = TDSUM + OVRFC(K) - END DO - DO K = 1, 3 - IF(OVRFC(K) .NE. 0.0) THEN - TDFRAC(K) = OVRFC(K)/TDSUM - END IF - END DO - IF (TDSUM > 0.0) THEN - IF (TDSUM > TDDC) TDSUM = TDDC - TDRVOL = TDRVOL + TDSUM - DO K = 1, 3 - OVRFC(K) = TDFRAC(K)*TDSUM - SH2O(K) = SH2O(K) - (OVRFC(K)/(ZLAYER(K) * 1000.0)) - SMC(K) = SH2O(K) + SICE (K) - END DO - END IF - - ELSE IF (parameters%DRAIN_LAYER_OPT == 3) THEN - !print*, "CASE = 3. Draining from layer 2 and 3" - DO K = 2, 3 - AVFC(K) = parameters%SMCREF(K) - SICE (K) - OVRFC(K) = (SH2O(K) - (parameters%TDSMC_FAC*AVFC(K))) * ZLAYER(K) * 1000.0 ! mm - IF(OVRFC(K) < 0.0) OVRFC(K) = 0.0 - TDSUM = TDSUM + OVRFC(K) - END DO - DO K = 2, 3 - IF(OVRFC(K) .NE. 0.0) THEN - TDFRAC(K) = OVRFC(K)/TDSUM - END IF - END DO - IF (TDSUM > 0.0) THEN - IF (TDSUM > TDDC) TDSUM = TDDC - TDRVOL = TDRVOL + TDSUM - DO K = 2, 3 - OVRFC(K) = TDFRAC(K)*TDSUM - SH2O(K) = SH2O(K) - (OVRFC(K)/(ZLAYER(K) * 1000.0)) - SMC(K) = SH2O(K) + SICE (K) - END DO - END IF - ELSE IF (parameters%DRAIN_LAYER_OPT == 4) THEN - - !print*, "CASE = 4. Draining from layer 3 and 4" - DO K = 3, 4 - AVFC(K) = parameters%SMCREF(K) - SICE (K) - OVRFC(K) = (SH2O(K) - (parameters%TDSMC_FAC*AVFC(K))) * ZLAYER(K) * 1000.0 ! mm - IF(OVRFC(K) < 0.0) OVRFC(K) = 0.0 - TDSUM = TDSUM + OVRFC(K) - END DO - DO K = 3, 4 - IF(OVRFC(K) .NE. 0.0) THEN - TDFRAC(K) = OVRFC(K)/TDSUM - END IF - END DO - - - IF (TDSUM > 0.0) THEN - IF (TDSUM > TDDC) TDSUM = TDDC - TDRVOL = TDRVOL + TDSUM - - DO K = 3, 4 - OVRFC(K) = TDFRAC(K)*TDSUM - SH2O(K) = SH2O(K) - (OVRFC(K)/(ZLAYER(K) * 1000.0)) - SMC(K) = SH2O(K) + SICE (K) - END DO - END IF - - ELSE IF (parameters%DRAIN_LAYER_OPT == 5) THEN ! from all the four layers - - !print*, "CASE = 5 Draining from all four layers" - DO K = 1, 4 - AVFC(K) = parameters%SMCREF(K) - SICE (K) - OVRFC(K) = (SH2O(K) - (parameters%TDSMC_FAC*AVFC(K))) * ZLAYER(K) * 1000.0 ! mm - IF(OVRFC(K) < 0.0) OVRFC(K) = 0.0 - TDSUM = TDSUM + OVRFC(K) - END DO - DO K = 1, 4 - IF(OVRFC(K) .NE. 0.0) THEN - TDFRAC(K) = OVRFC(K)/TDSUM - END IF - END DO - - IF (TDSUM > 0.0) THEN - IF (TDSUM > TDDC) TDSUM = TDDC - TDRVOL = TDRVOL + TDSUM - DO K = 1, 4 - OVRFC(K) = TDFRAC(K)*TDSUM - SH2O(K) = SH2O(K) - (OVRFC(K)/(ZLAYER(K) * 1000.0)) - SMC(K) = SH2O(K) + SICE (K) - END DO - END IF - END IF - - QTLDRN = TDRVOL / DT - - END SUBROUTINE TILE_DRAIN - -!=================================================================================================== - - SUBROUTINE TILE_HOOGHOUDT (parameters,WCND,NSOIL,NSNOW,SH2O,SMC,SICE, & - ZSOIL,DZSNSO,DT,DX,QTLDRN,ZWT & -#ifdef WRF_HYDRO - ,WATBLED & -#endif - ) - -!------------------------------------------------------------------------------------------ -! calculate tile drainage discharge (mm) based on Hooghoudt's equation ! pvk -!------------------------------------------------------------------------------------------ - IMPLICIT NONE -!------------------------------------------------------------------------------------------ -! Definitions -!TD_SATZ = Thickness of saturated zone in layer considered ~ W -!TD_SPAC = Tile Drain SPACing ~ SDRAIN -!TD_HAIL = Height of water table in the drain Above Impermeable Layer (de) - -! HDRAIN -!TD_HEMD = Effective Height between water level in the drains to the water -! table MiDpoint ~ EM -!ZLAYER(K) = Thickness of layer K ~DZ(I) -!TD_DTWT = Depth To Water Table (cm) ~ TD_DTWT -!TD_FLUX = Drainge Flux cm/hr~ DFLUX -!TD_DEPTH = Effective Depth to impermeable layer from soil surface~ DEPTH -!TD_TTSZ = Total Thickness of Saturated Zone ~ DEEP -!KLAT = Lateral hydraulic conductivity, CONE -!KLATK = Lateral hydraulic conductivity of a specific layer ~ CONK -!DTOPL = Depth of top of the layer considered~ ABOVE -!TD_DC = Drainage Coefficient ~ DC -!TD_DDRN = Depth of drain ~ DDRAIN -!TD_ADEPTH = Actual depth to impermeable layer form surface. ADEPTH >= TD_DEPTH -!------------------------------------------------------------------------------------------ -! inout - type (noahmp_parameters), intent(in) :: parameters - INTEGER,INTENT(IN) :: NSOIL - INTEGER,INTENT(IN) :: NSNOW - REAL, INTENT(IN) :: DT - REAL, INTENT(IN) :: DX - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SICE - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: ZSOIL - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: DZSNSO - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: WCND - - REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: SH2O - REAL, DIMENSION(1:NSOIL), INTENT(INOUT) :: SMC - REAL, INTENT(INOUT) :: QTLDRN ! tile drain discharge mm/s - REAL, INTENT(INOUT) :: ZWT ! water table depth - -! local - INTEGER :: K - REAL, DIMENSION(1:NSOIL) :: TD_SATZ ! thickness of saturated zone - REAL, DIMENSION(1:NSOIL) :: KLATK ! lateral hydraulic ocnductivity kth layer - REAL :: TD_TTSZ ! total satutation thickness - REAL :: TD_LQ ! lateral flow - REAL :: DTOPL ! depth to top of the layer - REAL :: XX - REAL :: YY - REAL :: KLAT ! average lateral hydruaic conductivity - REAL :: TD_HAIL - REAL :: TD_DEPTH - REAL :: TD_HEMD - REAL,DIMENSION(1:NSOIL) :: ZLAYER - REAL,DIMENSION(1:NSOIL) :: OVRFC - INTEGER :: NDRAINS - REAL :: TDDC - REAL,DIMENSION(1:NSOIL) :: RMSH2O - REAL :: QTLDRN1 - REAL :: TD_DD - REAL :: OVRFCS -#ifdef WRF_HYDRO - REAL :: WATBLED ! water table depth estimated in WRF-Hydro fine grids -#endif -!---------------------------------------------------------------------------- - - TD_SATZ = 0.0 - DTOPL = 0.0 - TD_LQ = 0.0 - TD_TTSZ = 0.0 - TDDC = parameters%TD_DCOEF* 1000.0 * DT/(24.0 * 3600.0) ! m per day to mm per timestep - -! Thickness of soil layers - DO K = 1, NSOIL - IF (K == 1) THEN - ZLAYER(K) = -1.0 * ZSOIL(K) - ELSE - ZLAYER(K) = (ZSOIL(K-1)-ZSOIL(K)) - END IF - END DO - -#ifdef WRF_HYDRO -! Depth to water table, m - YY = WATBLED -#else - CALL TD_FINDZWAT(parameters,NSOIL,SMC,SH2O,SICE,ZSOIL,ZLAYER,ZWT) - !CALL ZWTEQ (parameters,NSOIL, NSNOW, ZSOIL, DZSNSO, SH2O, ZWT) -! Depth to water table, m - YY = ZWT -#endif - IF (YY .GT. parameters%TD_ADEPTH) YY = parameters%TD_ADEPTH - -! Depth of saturated zone - DO K=1, NSOIL - IF (YY .GT. (-1.0*ZSOIL(K))) THEN - TD_SATZ(K) = 0.0 - ELSE - TD_SATZ(K) = (-1.0*ZSOIL(K)) - YY - XX = (-1.0*ZSOIL(K)) - DTOPL - IF(TD_SATZ(K) .GT. XX) TD_SATZ(K) = XX - END IF - - DTOPL = -1.0*ZSOIL(K) - END DO -! amount of water over field capacity - OVRFCS = 0.0 - DO K=1, NSOIL - OVRFC(K) = (SH2O(K) - (parameters%SMCREF(K)-SICE(K))) * ZLAYER(K) * 1000.0 !mm - IF(OVRFC(K) .LT. 0.0)OVRFC(K) = 0.0 - OVRFCS = OVRFCS + OVRFC(K) - END DO - -! lateral hydr. conductivity and total lateral flow - DO K=1, NSOIL - KLATK(K)= WCND(K)*parameters%KLAT_FAC * DT ! m/s to m/timestep - TD_LQ = TD_LQ + (TD_SATZ(K) * KLATK(K)) - TD_TTSZ = TD_TTSZ + TD_SATZ(K) - END DO - - IF (TD_TTSZ .LT. 0.001) TD_TTSZ = 0.001 ! unit is m - IF (TD_LQ .LT. 0.001) TD_LQ = 0.0 ! unit is m - - KLAT = TD_LQ/TD_TTSZ ! lateral hydraulic conductivity per timestep - - TD_DD = parameters%TD_ADEPTH - parameters%TD_DDRAIN - - CALL TD_EQUIVALENT_DEPTH (TD_DD, & - parameters%TD_SPAC, & - parameters%TD_RADI, & - TD_HAIL) - - TD_DEPTH= TD_HAIL + parameters%TD_DDRAIN - TD_HEMD = parameters%TD_DDRAIN - YY - - IF (TD_HEMD .LE. 0.0) THEN - QTLDRN = 0.0 - ELSE - QTLDRN = ((8.0*KLAT*TD_HAIL*TD_HEMD) + (4.0*KLAT*TD_HEMD*TD_HEMD))& ! m per timestep - /(parameters%TD_SPAC*parameters%TD_SPAC) - END IF - - QTLDRN = QTLDRN * 1000.0 ! m per timestep to mm/timestep /one tile - - IF(QTLDRN .LE. 0.0) QTLDRN = 0.0 - IF(QTLDRN .GT. TDDC) QTLDRN = TDDC - - NDRAINS = INT(DX/parameters%TD_SPAC) - QTLDRN = QTLDRN * NDRAINS - IF(QTLDRN .GT. OVRFCS) QTLDRN = OVRFCS - -! update soil moisture after drainage: moisture drains from top to bottom - - QTLDRN1 = QTLDRN - - DO K=1, NSOIL - IF(QTLDRN1 .GT. 0.0) THEN - IF((TD_SATZ(K) .GT. 0.0) .AND. (OVRFC(K) .GT. 0.0)) THEN - - RMSH2O(K) = OVRFC(K) - QTLDRN1 ! remaining water after tile drain - - IF (RMSH2O(K) .GT. 0.0) THEN - SH2O(K) = (parameters%SMCREF(K) - SICE (K)) + RMSH2O(K)/(ZLAYER(K) * 1000.0) - SMC(K) = SH2O(K) + SICE (K) - EXIT - ELSE - SH2O(K) = (parameters%SMCREF(K) - SICE (K)) - SMC(K) = SH2O(K) + SICE (K) - QTLDRN1 = QTLDRN1 - OVRFC(K) - END IF - - END IF - END IF - END DO - - QTLDRN = QTLDRN/DT ![mm/s] - - END SUBROUTINE TILE_HOOGHOUDT - -!----------------------------------------------------------------------- - - SUBROUTINE TD_EQUIVALENT_DEPTH (TD_D,TD_L,TD_RD,TD_DE) - -! ---------------------------------------------------------------------- -! calculate tile drainage equivalent depth from d. -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- - REAL, INTENT(IN) :: TD_D - REAL, INTENT(IN) :: TD_L - REAL, INTENT(IN) :: TD_RD - REAL, INTENT(OUT) :: TD_DE - REAL :: PII = 22.0/7.0 - REAL :: TD_X - REAL :: TD_FX, EX,TERM - INTEGER :: I -!------------------------------------- - - TD_FX = 0.0 - EX = 0.0 - TERM = 0.0 - - TD_X = (2.0*PII*TD_D)/TD_L - - IF (TD_X .GT. 0.5) THEN - DO I=1,45,2 - EX = EXP(-2.0*I*TD_X) - TERM = (4.0*EX)/(I*(1.0-EX)) - TD_FX = TD_FX + TERM - IF(TERM .LT. 1.0E-6) THEN - TD_DE = ((PII*TD_L)/8.0)/(LOG(TD_L/(PII*TD_RD))+TD_FX) - EXIT - END IF - END DO - ELSE IF (TD_X .LT. 1.0E-8) THEN - TD_DE = TD_D - ELSE - TD_FX = ((PII*PII)/(4.0*TD_X))+(LOG(TD_X/(2.0*PII))) - TD_DE = ((PII*TD_L)/8.0)/(LOG(TD_L/(PII*TD_RD))+TD_FX) - END IF - - IF (TD_DE .LT. 0.0 .AND. I .LE. 2) TD_DE = TD_D - - END SUBROUTINE TD_EQUIVALENT_DEPTH - -!---------------------------------------------------------------------------- - - SUBROUTINE TD_FINDZWAT(parameters,NSOIL,SMC,SH2O,SICE,ZSOIL,SLDPTH,WATBLED) - -!---------------------------------------------------------------------------- -! Calculate watertable depth as on WRF-Hydro/NWM -!---------------------------------------------------------------------------- - IMPLICIT NONE - -!-------- DECLARATIONS ------------------------ - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: NSOIL - REAL, INTENT(IN), DIMENSION(NSOIL) :: SMC,SH2O,SICE - REAL, INTENT(IN), DIMENSION(NSOIL) :: ZSOIL - REAL, INTENT(IN), DIMENSION(NSOIL) :: SLDPTH - REAL, INTENT(OUT) :: WATBLED - REAL :: CWATAVAIL - INTEGER :: SATLYRCHK - -! Local Variables - INTEGER :: K,i,j -!------------------------------------------------------------ - - SATLYRCHK = 0 !set flag for sat. layers - CWATAVAIL = 0.0 !set wat avail for subsfc rtng = 0. - - DO K=NSOIL,1,-1 - IF ( (SMC(K).GE.parameters%SMCREF(K)).AND.& - (parameters%SMCREF(K) .GT.parameters%SMCWLT(K)) ) THEN - IF((SATLYRCHK .EQ.K+1) .OR. (K.EQ.NSOIL)) SATLYRCHK = K - END IF - END DO - - IF (SATLYRCHK .NE. 0) THEN - IF (SATLYRCHK .NE. 1) then ! soil column is partially sat. - WATBLED = -ZSOIL(SATLYRCHK-1) - ELSE ! soil column is fully saturated to sfc. - WATBLED = 0.0 - END IF - DO K = SATLYRCHK,NSOIL - CWATAVAIL = CWATAVAIL+(SMC(K)-parameters%SMCREF(K))*SLDPTH(K) - END DO - ELSE ! no saturated layers... - WATBLED = -ZSOIL(NSOIL) - SATLYRCHK = NSOIL + 1 - END IF - - END SUBROUTINE TD_FINDZWAT - -!== end tile drainage subroutines ================================================================== - -!== begin wdfcnd1 ================================================================================== - - SUBROUTINE WDFCND1 (parameters,WDF,WCND,SMC,FCR,ISOIL) -! ---------------------------------------------------------------------- -! calculate soil water diffusivity and soil hydraulic conductivity. -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! input - type (noahmp_parameters), intent(in) :: parameters - REAL,INTENT(IN) :: SMC - REAL,INTENT(IN) :: FCR - INTEGER,INTENT(IN) :: ISOIL - -! output - REAL,INTENT(OUT) :: WCND - REAL,INTENT(OUT) :: WDF - -! local - REAL :: EXPON - REAL :: FACTR - REAL :: VKWGT -! ---------------------------------------------------------------------- - -! soil water diffusivity - - FACTR = MAX(0.01, SMC/parameters%SMCMAX(ISOIL)) - EXPON = parameters%BEXP(ISOIL) + 2.0 - WDF = parameters%DWSAT(ISOIL) * FACTR ** EXPON - WDF = WDF * (1.0 - FCR) - -! hydraulic conductivity - - EXPON = 2.0*parameters%BEXP(ISOIL) + 3.0 - WCND = parameters%DKSAT(ISOIL) * FACTR ** EXPON - WCND = WCND * (1.0 - FCR) - - END SUBROUTINE WDFCND1 - -!== begin wdfcnd2 ================================================================================== - - SUBROUTINE WDFCND2 (parameters,WDF,WCND,SMC,SICE,ISOIL) -! ---------------------------------------------------------------------- -! calculate soil water diffusivity and soil hydraulic conductivity. -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! input - type (noahmp_parameters), intent(in) :: parameters - REAL,INTENT(IN) :: SMC - REAL,INTENT(IN) :: SICE - INTEGER,INTENT(IN) :: ISOIL - -! output - REAL,INTENT(OUT) :: WCND - REAL,INTENT(OUT) :: WDF - -! local - REAL :: EXPON - REAL :: FACTR1,FACTR2 - REAL :: VKWGT -! ---------------------------------------------------------------------- - -! soil water diffusivity - - FACTR1 = 0.05/parameters%SMCMAX(ISOIL) - FACTR2 = MAX(0.01, SMC/parameters%SMCMAX(ISOIL)) - FACTR1 = MIN(FACTR1,FACTR2) - EXPON = parameters%BEXP(ISOIL) + 2.0 - WDF = parameters%DWSAT(ISOIL) * FACTR2 ** EXPON - - IF (SICE > 0.0) THEN - VKWGT = 1.0/ (1.0 + (500.0* SICE)**3.0) - WDF = VKWGT * WDF + (1.-VKWGT)*parameters%DWSAT(ISOIL)*(FACTR1)**EXPON - END IF - -! hydraulic conductivity - - EXPON = 2.0*parameters%BEXP(ISOIL) + 3.0 - WCND = parameters%DKSAT(ISOIL) * FACTR2 ** EXPON - - END SUBROUTINE WDFCND2 - -!==========begin irrigation subroutines============================================================ - SUBROUTINE TRIGGER_IRRIGATION(parameters,NSOIL,ZSOIL,SH2O,FVEG, & !in - JULIAN,IRRFRA,LAI, & !in - SIFAC,MIFAC,FIFAC, & !in - IRCNTSI,IRCNTMI,IRCNTFI, & !inout - IRAMTSI,IRAMTMI,IRAMTFI) !inout - !----------------------------------------------------------------------------------------------- - ! This subroutine trigger irrigation if soil moisture less than the management allowable deficit - ! (MAD) and estimate irrigation water depth (m) using current rootzone soil moisture and field - ! capacity. There are two options here to trigger the irrigation scheme based on MAD - ! OPT_IRR = 1 -> if irrigated fraction > threshold fraction - ! OPT_IRR = 2 -> if irrigated fraction > threshold fraction and within crop season - ! OPT_IRR = 3 -> if irrigated fraction > threshold fraction and LAI > threshold LAI - ! Author: Prasanth Valayamkunnath (NCAR) - ! Date : 08/06/2020 - !----------------------------------------------------------------------------------------------- - IMPLICIT NONE - ! ---------------------------------------------------------------------------------------------- - ! inputs - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: NSOIL ! number of soil layers - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: ZSOIL ! depth of layers from surface, [m] - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SH2O ! volumteric liquid water content [%] - REAL, INTENT(IN) :: FVEG ! green vegetation fraction [-] - REAL, INTENT(IN) :: IRRFRA ! irrigated area fraction [-] - REAL, INTENT(IN) :: LAI ! leaf area index [m^2/m^2] - REAL, INTENT(IN) :: JULIAN ! julian day - REAL, INTENT(IN) :: SIFAC ! sprinkler irrigation fraction [-] - REAL, INTENT(IN) :: MIFAC ! micro irrigation fraction [-] - REAL, INTENT(IN) :: FIFAC ! flood irrigation fraction [-] - ! inouts - INTEGER, INTENT(INOUT):: IRCNTSI ! irrigation event number, Sprinkler - INTEGER, INTENT(INOUT):: IRCNTMI ! irrigation event number, Micro - INTEGER, INTENT(INOUT):: IRCNTFI ! irrigation event number, Flood - REAL, INTENT(INOUT):: IRAMTSI ! irrigation water amount [m] to be applied, Sprinkler - REAL, INTENT(INOUT):: IRAMTMI ! irrigation water amount [m] to be applied, Micro - REAL, INTENT(INOUT):: IRAMTFI ! irrigation water amount [m] to be applied, Flood - ! local - REAL :: SMCAVL ! available soil moisture [m] at timestep - REAL :: SMCLIM ! maximum available moisture [m] (FC-PWD) - REAL :: SMCSAT ! maximum saturation moisture [m] (POROSITY-FC) - REAL :: IRRWATAMT ! irrigation water amount [m] - LOGICAL :: IRR_ACTIVE ! irrigation check - INTEGER :: K - !--------------------------------------------------------------------------------------------- - IRR_ACTIVE = .TRUE. - - ! check if irrigation is can be activated or not - IF(OPT_IRR .EQ. 2)THEN - ! activate irrigation if within crop season - IF ((JULIAN .LT. parameters%PLTDAY).OR.& - (JULIAN .GT. (parameters%HSDAY - parameters%IRR_HAR))) IRR_ACTIVE = .FALSE. - ELSE IF (OPT_IRR .EQ. 3) THEN - - ! activate if LAI > threshold LAI - IF(LAI .LT. parameters%IRR_LAI) IRR_ACTIVE = .FALSE. - - ELSE IF ( (OPT_IRR .GT. 3) .OR. (OPT_IRR .LT. 1)) THEN - IRR_ACTIVE = .FALSE. - END IF - - IF(IRR_ACTIVE)THEN - SMCAVL = 0.0 - SMCLIM = 0.0 - ! estimate available water and field capacity for the root zone - SMCAVL = (SH2O(1)-parameters%SMCWLT(1))*-1.0*ZSOIL(1) ! current soil water (m) - SMCLIM = (parameters%SMCREF(1)-parameters%SMCWLT(1))*-1.0*ZSOIL(1) ! available water (m) - DO K = 2, parameters%NROOT - SMCAVL = SMCAVL + (SH2O(K)-parameters%SMCWLT(K))*(ZSOIL(K-1) - ZSOIL(K)) - SMCLIM = SMCLIM + (parameters%SMCREF(K)-parameters%SMCWLT(K))*(ZSOIL(K-1) - ZSOIL(K)) - END DO - - ! check if root zone soil moisture < MAD - IF((SMCAVL/SMCLIM) .LE. parameters%IRR_MAD) THEN - ! parameters%IRR_MAD- calibratable - ! amount of water need to be added to bring soil moisture back to - ! field capacity, i.e., irrigation water amount (m) - IRRWATAMT = (SMCLIM - SMCAVL)*IRRFRA*FVEG - ! sprinkler irrigation amount (m) based on 2D SIFAC - IF((IRAMTSI .EQ. 0.0) .AND. (SIFAC .GT. 0.0) .AND. (OPT_IRRM .EQ. 0)) THEN - IRAMTSI = SIFAC*IRRWATAMT - IRCNTSI = IRCNTSI + 1 - ! sprinkler irrigation amount (m) based on namelist choice - ELSE IF ((IRAMTSI .EQ. 0.0) .AND. (OPT_IRRM .EQ. 1)) THEN - IRAMTSI = IRRWATAMT - IRCNTSI = IRCNTSI + 1 - END IF - ! micro irrigation amount (m) based on 2D MIFAC - IF((IRAMTMI .EQ. 0.0) .AND. (MIFAC .GT. 0.0) .AND. (OPT_IRRM .EQ. 0)) THEN - IRAMTMI = MIFAC*IRRWATAMT - IRCNTMI = IRCNTMI + 1 - ! micro irrigation amount (m) based on namelist choice - ELSE IF ((IRAMTMI .EQ. 0.0) .AND. (OPT_IRRM .EQ. 2)) THEN - IRAMTMI = IRRWATAMT - IRCNTMI = IRCNTMI + 1 - END IF - ! flood irrigation amount (m): Assumed to saturate top two layers and - ! third layer to FC. As water moves from one end of the field to - ! another, surface layers will be saturated. - ! flood irrigation amount (m) based on 2D FIFAC - IF((IRAMTFI .EQ. 0.0) .AND. (FIFAC .GT. 0.0) .AND. (OPT_IRRM .EQ. 0)) THEN - IRAMTFI = FIFAC*(IRRWATAMT)*(1.0/(1.0-parameters%FILOSS)) - IRCNTFI = IRCNTFI + 1 - !flood irrigation amount (m) based on namelist choice - ELSE IF((IRAMTFI .EQ. 0.0) .AND. (OPT_IRRM .EQ. 3)) THEN - IRAMTFI = (IRRWATAMT)*(1.0/(1.0-parameters%FILOSS)) - IRCNTFI = IRCNTFI + 1 - END IF - ELSE - IRRWATAMT = 0.0 - IRAMTSI = 0.0 - IRAMTMI = 0.0 - IRAMTFI = 0.0 - END IF - END IF - END SUBROUTINE TRIGGER_IRRIGATION - - !============================================================================================================ - - SUBROUTINE SPRINKLER_IRRIGATION(parameters,NSOIL,DT,SH2O,SMC,SICE,& !in - T2,WINDU,WINDV,EAIR,SIFAC, & !in - IRAMTSI,IREVPLOS,IRSIRATE) !inout - !--------------------------------------------------------------------------------------------- - ! This subroutine estimate irrigation water depth (m) based on sprinkler method defined in - ! chapter 11 of NRCS, Part 623 National Engineering Handbook. Irrigation water will be applied - ! over the canopy considering, present soil moisture, infiltration rate of the soil, and - ! evaporative loss. This subroutine will be called before CANWAT subroutine to estimate them - ! canopy water storage loss. - ! Author: Prasanth Valayamkunnath (NCAR) - ! Date : 08/06/2020 - !--------------------------------------------------------------------------------------------- - IMPLICIT NONE - ! -------------------------------------------------------------------------------------------- - ! inputs - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: NSOIL - REAL, INTENT(IN) :: DT - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SH2O - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SMC - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SICE - REAL, INTENT(IN) :: T2 - REAL, INTENT(IN) :: WINDU - REAL, INTENT(IN) :: WINDV - REAL, INTENT(IN) :: EAIR - REAL, INTENT(IN) :: SIFAC ! sprinkler irrigation fraction - !inouts - REAL, INTENT(INOUT) :: IRAMTSI !total irrigation water amount [m] during this schedule - REAL, INTENT(INOUT) :: IREVPLOS !loss of irrigation water to evaporation,sprinkler [m/timestep] - REAL, INTENT(INOUT) :: IRSIRATE !rate of irrigation by sprinkler [m/timestep] - ! local - REAL :: FSUR !infiltration rate [m/s] - REAL :: TEMP_RATE - REAL :: WINDSPEED - REAL :: IRRLOSS !temporary var for irr loss [%] - REAL :: ESAT1 - !------------------------------------------------------------------------------------------- - ! estimate infiltration rate based on Philips Eq. - CALL IRR_PHILIP_INFIL(parameters,SMC,SH2O,SICE,DT,NSOIL,FSUR) - ! irrigation rate of sprinkler - TEMP_RATE = parameters%SPRIR_RATE*(1/1000.0)*DT/3600.0 !NRCS rate/time step - calibratable - IRSIRATE = MIN(FSUR*DT,IRAMTSI,TEMP_RATE) !Limit the application rate to minimum of infiltration rate - !and to the NRCS recommended rate, (m) - - ! evaporative loss from droplets: Based on Bavi et al., (2009). Evaporation - ! losses from sprinkler irrigation systems under various operating - ! conditions. Journal of Applied Sciences, 9(3), 597-600. - WINDSPEED = SQRT((WINDU**2.0)+(WINDV**2.0)) ! [m/s] - ESAT1 = 610.8*EXP((17.27*(T2-273.15))/(237.3+(T2-273.15))) ! [Pa] - IF(T2 .GT. 273.15)THEN ! Equation (3) - IRRLOSS = 4.375*(EXP(0.106*WINDSPEED))*(((ESAT1-EAIR)*0.01)**(-0.092))*((T2-273.15)**(-0.102)) ! [%] - ELSE ! Equation (4) - IRRLOSS = 4.337*(EXP(0.077*WINDSPEED))*(((ESAT1-EAIR)*0.01)**(-0.098)) ! [%] - END IF - ! Old PGI Fortran compiler does not support ISNAN - IF ( isnan_lsm(IRRLOSS) ) IRRLOSS=4.0 ! In case if IRRLOSS is NaN - IF ( (IRRLOSS .GT. 100.0) .OR. (IRRLOSS .LT. 0.0) ) IRRLOSS=4.0 ! In case if IRRLOSS is out of range - - ! Sprinkler water (m) for sprinkler fraction - IRSIRATE = IRSIRATE * SIFAC - IF(IRSIRATE .GE. IRAMTSI)THEN - IRSIRATE = IRAMTSI - IRAMTSI = 0.0 - ELSE - IRAMTSI = IRAMTSI - IRSIRATE - END IF - IREVPLOS = IRSIRATE*IRRLOSS*(1.0/100.0) - IRSIRATE = IRSIRATE-IREVPLOS - END SUBROUTINE SPRINKLER_IRRIGATION - - logical function isnan_lsm(arg1) - real,intent(in) :: arg1 - isnan_lsm = (arg1 .ne. arg1) - return - end function isnan_lsm - - !============================================================================================================ - - SUBROUTINE MICRO_IRRIGATION(parameters,NSOIL,DT,SH2O,SMC,SICE,MIFAC, & !in - IRAMTMI,IRMIRATE) !inout - !--------------------------------------------------------------------------------------------- - ! This subroutine estimate irrigation water depth (m) based on Micro irrigation method defined - ! in chapter 7 of NRCS, Part 623 National Engineering Handbook. Irrigation water will be applied - ! under the canopy, within first layer (at ~5 cm depth) considering current soil moisture. - ! This subroutine will be called after CANWAT. - ! Author: Prasanth Valayamkunnath (NCAR) - ! Date : 08/06/2020 - !--------------------------------------------------------------------------------------------- - IMPLICIT NONE - ! -------------------------------------------------------------------------------------------- - ! inputs - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: NSOIL - REAL, INTENT(IN) :: DT - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SH2O - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SMC - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SICE - REAL, INTENT(IN) :: MIFAC ! micro irrigation fraction - ! inout - REAL, INTENT(INOUT) :: IRAMTMI !irrigation water amount [m] - REAL, INTENT(INOUT) :: IRMIRATE !rate of irrigation by micro [m/time step] - ! local - REAL :: FSUR !infiltration rate [m/s] - REAL :: TEMP_RATE - !----------------------------------------------------------------------------------------------------- - ! estimate infiltration rate based on Philips Eq. - CALL IRR_PHILIP_INFIL(parameters,SMC,SH2O,SICE,DT,NSOIL,FSUR) - ! irrigation rate of micro irrigation - TEMP_RATE = parameters%MICIR_RATE*(1.0/1000.0)*DT/3600.0 !NRCS rate/time step - calibratable - IRMIRATE = MIN(0.5*FSUR*DT,IRAMTMI,TEMP_RATE) !Limit the application rate to minimum - !of 0.5*infiltration rate - !and to the NRCS recommended rate, (m) - IRMIRATE = IRMIRATE * MIFAC - IF(IRMIRATE .GE. IRAMTMI)THEN - IRMIRATE = IRAMTMI - IRAMTMI = 0.0 - ELSE - IRAMTMI = IRAMTMI - IRMIRATE - END IF - END SUBROUTINE MICRO_IRRIGATION - !============================================================================================================ - - SUBROUTINE FLOOD_IRRIGATION(parameters,NSOIL,DT,SH2O,SMC,SICE,FIFAC,& !in - IRAMTFI,IRFIRATE) !inout - !--------------------------------------------------------------------------------------------- - ! This subroutine estimate irrigation water depth (m) based on surface flooding irrigation method - ! defined in chapter 4 of NRCS, Part 623 National Engineering Handbook. Irrigation water will - ! be applied on the surface based on present soil moisture and infiltration rate of the soil. - ! This subroutine will be called after CANWAT subroutine to estimate them. Flooding or overland - ! flow is based on infiltration excess! - ! Author: Prasanth Valayamkunnath (NCAR) - ! Date : 08/06/2020 - !--------------------------------------------------------------------------------------------- - IMPLICIT NONE - ! -------------------------------------------------------------------------------------------- - ! inputs - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: NSOIL - REAL, INTENT(IN) :: DT - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SH2O - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SMC - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SICE - REAL, INTENT(IN) :: FIFAC !fraction of grid under micro irrigation(0 to 1) - ! inout - REAL, INTENT(INOUT) :: IRAMTFI !irrigation water amount [m] - REAL, INTENT(INOUT) :: IRFIRATE !irrigation water rate by micro [m/timestep] - ! local - REAL :: FSUR !infiltration rate [m/s] - REAL :: TEMP_RATE - !----------------------------------------------------------------------------------------------------- - ! estimate infiltration rate based on Philips Eq. - CALL IRR_PHILIP_INFIL(parameters,SMC,SH2O,SICE,DT,NSOIL,FSUR) - ! irrigation rate of flood irrigation. It should be - ! greater than infiltration rate to get infiltration - ! excess runoff at the time of application - IRFIRATE = FSUR*DT*parameters%FIRTFAC !Limit the application rate to - !fac*infiltration rate - IRFIRATE = IRFIRATE * FIFAC - IF(IRFIRATE .GE. IRAMTFI)THEN - IRFIRATE = IRAMTFI - IRAMTFI = 0.0 - ELSE - IRAMTFI = IRAMTFI - IRFIRATE - END IF - - END SUBROUTINE FLOOD_IRRIGATION - - !============================================================================================================ - SUBROUTINE IRR_PHILIP_INFIL(parameters,SMC,SH2O,SICE,DT,NSOIL, & ! in - FSUR) ! out - !--------------------------------------------------------------------------------------------- - ! This function estimate infiltration rate based on Philip's two parameter equation (Eq. 2) - ! presented in Valiantzas (2010). New linearized two-parameter infiltration equation for direct - ! determination of conductivity and sorptivity, J. Hydrology. - ! Author: Prasanth Valayamkunnath (NCAR) - ! Date : 08/06/2020 - !--------------------------------------------------------------------------------------------- - IMPLICIT NONE - ! -------------------------------------------------------------------------------------------- - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: NSOIL !number of soil layers - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SMC !soil moisture content [m3/m3] - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SH2O !soil water content [m3/m3] - REAL, DIMENSION(1:NSOIL), INTENT(IN) :: SICE !soil ice content [m3/m3] - REAL, INTENT(IN) :: DT !time-step (sec) - - ! outputs - REAL, INTENT(OUT):: FSUR !surface infiltration rate (m/s) - ! local variables - REAL :: WDF !soil water diffusivity (m2/s) - REAL :: WCND !soil water conductivity[m/s] - REAL :: SP !sorptivity (LT^-1/2) - REAL :: AP !intial hydraulic conductivity (m/s,L/T) - REAL :: SICEMAX - INTEGER :: ISOIL,K - !--------------------------------------------------------------------------------- - ! maximum ice fraction - SICEMAX = 0.0 - DO K = 1,NSOIL - IF (SICE(K) > SICEMAX) SICEMAX = SICE(K) - END DO - - ! estimate initial soil hydraulic conductivty and diffusivity (Ki, D(theta) in the equation) - ISOIL = 1 - CALL WDFCND2 (parameters,WDF,WCND,SH2O(ISOIL),SICEMAX,ISOIL) - - ! sorptivity based on Eq. 10b from Kutilek, Miroslav, and Jana Valentova (1986) - ! sorptivity approximations. Transport in Porous Media 1.1, 57-62. - SP = SQRT(2.0 * max(0.0,(parameters%SMCMAX(ISOIL) - SMC(ISOIL))) * (parameters%DWSAT(ISOIL) - WDF)) - - ! parameter A in Eq. 9 of Valiantzas (2010) is given by - AP = MIN(WCND,(2.0/3.0)*parameters%DKSAT(ISOIL)) - AP = MAX(AP,(1.0/3.0)*parameters%DKSAT(ISOIL)) - - ! maximun infiltration rate, m - FSUR = 0.5*SP*((DT)**(-0.5))+AP ! m/s - FSUR = MAX(0.0,FSUR) - !FSUR = MIN(WCND,FSUR) - - END SUBROUTINE IRR_PHILIP_INFIL - -!=========end irrigation subroutines================================================================ - -!== begin groundwater ============================================================================== - - SUBROUTINE GROUNDWATER(parameters,NSNOW ,NSOIL ,DT ,SICE ,ZSOIL , & !in - STC ,WCND ,FCRMAX ,ILOC ,JLOC , & !in - SH2O ,ZWT ,WA ,WT , & !inout - QIN ,QDIS ) !out -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! input - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: ILOC !grid index - INTEGER, INTENT(IN) :: JLOC !grid index - INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers - INTEGER, INTENT(IN) :: NSOIL !no. of soil layers - REAL, INTENT(IN) :: DT !timestep [sec] - REAL, INTENT(IN) :: FCRMAX!maximum FCR (-) - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: SICE !soil ice content [m3/m3] - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: ZSOIL !depth of soil layer-bottom [m] - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: WCND !hydraulic conductivity (m/s) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: STC !snow/soil temperature (k) - -! input and output - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SH2O !liquid soil water [m3/m3] - REAL, INTENT(INOUT) :: ZWT !the depth to water table [m] - REAL, INTENT(INOUT) :: WA !water storage in aquifer [mm] - REAL, INTENT(INOUT) :: WT !water storage in aquifer - !+ saturated soil [mm] -! output - REAL, INTENT(OUT) :: QIN !groundwater recharge [mm/s] - REAL, INTENT(OUT) :: QDIS !groundwater discharge [mm/s] - -! local - REAL :: FFF !runoff decay factor (m-1) - REAL :: RSBMX !baseflow coefficient [mm/s] - INTEGER :: IZ !do-loop index - INTEGER :: IWT !layer index above water table layer - REAL, DIMENSION( 1:NSOIL) :: DZMM !layer thickness [mm] - REAL, DIMENSION( 1:NSOIL) :: ZNODE !node depth [m] - REAL, DIMENSION( 1:NSOIL) :: MLIQ !liquid water mass [kg/m2 or mm] - REAL, DIMENSION( 1:NSOIL) :: EPORE !effective porosity [-] - REAL, DIMENSION( 1:NSOIL) :: HK !hydraulic conductivity [mm/s] - REAL, DIMENSION( 1:NSOIL) :: SMC !total soil water content [m3/m3] - REAL(KIND=8) :: S_NODE!degree of saturation of IWT layer - REAL :: DZSUM !cumulative depth above water table [m] - REAL :: SMPFZ !matric potential (frozen effects) [mm] - REAL :: KA !aquifer hydraulic conductivity [mm/s] - REAL :: WH_ZWT!water head at water table [mm] - REAL :: WH !water head at layer above ZWT [mm] - REAL :: WS !water used to fill air pore [mm] - REAL :: WTSUB !sum of HK*DZMM - REAL :: WATMIN!minimum soil vol soil moisture [m3/m3] - REAL :: XS !excessive water above saturation [mm] - REAL, PARAMETER :: ROUS = 0.2 !specific yield [-] -! REAL, PARAMETER :: CMIC = 0.20 !microprore content (0.0-1.0) - !0.0-close to free drainage - REAL, PARAMETER :: CMIC = 0.80 ! calibratable, C.He changed based on GY Niu's update -! ------------------------------------------------------------- - QDIS = 0.0 - QIN = 0.0 - -! Derive layer-bottom depth in [mm] -!KWM: Derive layer thickness in mm - - DZMM(1) = -ZSOIL(1)*1.0E3 - DO IZ = 2, NSOIL - DZMM(IZ) = 1.0E3 * (ZSOIL(IZ - 1) - ZSOIL(IZ)) - ENDDO - -! Derive node (middle) depth in [m] -!KWM: Positive number, depth below ground surface in m - ZNODE(1) = -ZSOIL(1) / 2.0 - DO IZ = 2, NSOIL - ZNODE(IZ) = -ZSOIL(IZ-1) + 0.5 * (ZSOIL(IZ-1) - ZSOIL(IZ)) - ENDDO - -! Convert volumetric soil moisture "sh2o" to mass - - DO IZ = 1, NSOIL - SMC(IZ) = SH2O(IZ) + SICE(IZ) - MLIQ(IZ) = SH2O(IZ) * DZMM(IZ) - EPORE(IZ) = MAX(0.01,parameters%SMCMAX(IZ) - SICE(IZ)) - HK(IZ) = 1.0E3*WCND(IZ) - ENDDO - -! The layer index of the first unsaturated layer, -! i.e., the layer right above the water table - - IWT = NSOIL - DO IZ = 2,NSOIL - IF(ZWT .LE. -ZSOIL(IZ) ) THEN - IWT = IZ-1 - EXIT - END IF - ENDDO - -! Groundwater discharge [mm/s] - -! FFF = 6.0 -! RSBMX = 5.0 - FFF = parameters%BEXP(IWT) / 3.0 ! calibratable, C.He changed based on GY Niu's update - RSBMX = HK(IWT) * 1.0e3 * EXP(3.0) ! mm/s, calibratable, C.He changed based on GY Niu's update - -! QDIS = (1.0-FCRMAX)*RSBMX*EXP(-parameters%TIMEAN)*EXP(-FFF*(ZWT-2.0)) - QDIS = (1.0-FCRMAX)*RSBMX*EXP(-parameters%TIMEAN)*EXP(-FFF*ZWT) ! C.He changed based on GY Niu's update - -! Matric potential at the layer above the water table - - S_NODE = MIN(1.0,SMC(IWT)/parameters%SMCMAX(IWT) ) - S_NODE = MAX(S_NODE,REAL(0.01,KIND=8)) - SMPFZ = -parameters%PSISAT(IWT)*1000.0*S_NODE**(-parameters%BEXP(IWT)) ! m --> mm - SMPFZ = MAX(-120000.0,CMIC*SMPFZ) - -! Recharge rate qin to groundwater - -! KA = HK(IWT) - KA = 2.0*(HK(IWT)*parameters%DKSAT(IWT)*1.0e3) / (HK(IWT)+parameters%DKSAT(IWT)*1.0e3) ! harmonic average, C.He changed based on GY Niu's update - - WH_ZWT = - ZWT * 1.0E3 !(mm) - WH = SMPFZ - ZNODE(IWT)*1.0E3 !(mm) - QIN = - KA * (WH_ZWT-WH) /((ZWT-ZNODE(IWT))*1.0E3) - QIN = MAX(-10.0/DT,MIN(10.0/DT,QIN)) - -! Water storage in the aquifer + saturated soil - - WT = WT + (QIN - QDIS) * DT !(mm) - - IF(IWT.EQ.NSOIL) THEN - WA = WA + (QIN - QDIS) * DT !(mm) - WT = WA - ZWT = (-ZSOIL(NSOIL) + 25.0) - WA/1000.0/ROUS !(m) - MLIQ(NSOIL) = MLIQ(NSOIL) - QIN * DT ! [mm] - - MLIQ(NSOIL) = MLIQ(NSOIL) + MAX(0.0,(WA - 5000.0)) - WA = MIN(WA, 5000.0) - ELSE - - IF (IWT.EQ.NSOIL-1) THEN - ZWT = -ZSOIL(NSOIL) & - - (WT-ROUS*1000*25.0) / (EPORE(NSOIL))/1000.0 - ELSE - WS = 0.0 ! water used to fill soil air pores - DO IZ = IWT+2,NSOIL - WS = WS + EPORE(IZ) * DZMM(IZ) - ENDDO - ZWT = -ZSOIL(IWT+1) & - - (WT-ROUS*1000.0*25.0-WS) /(EPORE(IWT+1))/1000.0 - ENDIF - - WTSUB = 0.0 - DO IZ = 1, NSOIL - WTSUB = WTSUB + HK(IZ)*DZMM(IZ) - END DO - - DO IZ = 1, NSOIL ! Removing subsurface runoff - MLIQ(IZ) = MLIQ(IZ) - QDIS*DT*HK(IZ)*DZMM(IZ)/WTSUB - END DO - END IF - - ZWT = MAX(1.5,ZWT) - -! -! Limit MLIQ to be greater than or equal to watmin. -! Get water needed to bring MLIQ equal WATMIN from lower layer. -! - WATMIN = 0.01 - DO IZ = 1, NSOIL-1 - IF (MLIQ(IZ) .LT. 0.0) THEN - XS = WATMIN-MLIQ(IZ) - ELSE - XS = 0.0 - END IF - MLIQ(IZ ) = MLIQ(IZ ) + XS - MLIQ(IZ+1) = MLIQ(IZ+1) - XS - END DO - - IZ = NSOIL - IF (MLIQ(IZ) .LT. WATMIN) THEN - XS = WATMIN-MLIQ(IZ) - ELSE - XS = 0.0 - END IF - MLIQ(IZ) = MLIQ(IZ) + XS - WA = WA - XS - WT = WT - XS - - DO IZ = 1, NSOIL - SH2O(IZ) = MLIQ(IZ) / DZMM(IZ) - END DO - - END SUBROUTINE GROUNDWATER - -!== begin shallowwatertable ======================================================================== - - SUBROUTINE SHALLOWWATERTABLE (parameters,NSNOW ,NSOIL ,ZSOIL, DT , & !in - DZSNSO ,SMCEQ ,ILOC ,JLOC , & !in - SMC ,WTD ,SMCWTD ,RECH, QDRAIN ) !inout -! ---------------------------------------------------------------------- -!Diagnoses water table depth and computes recharge when the water table is within the resolved soil layers, -!according to the Miguez-Macho&Fan scheme -! ---------------------------------------------------------------------- - IMPLICIT NONE -! ---------------------------------------------------------------------- -! input - type (noahmp_parameters), intent(in) :: parameters - INTEGER, INTENT(IN) :: NSNOW !maximum no. of snow layers - INTEGER, INTENT(IN) :: NSOIL !no. of soil layers - INTEGER, INTENT(IN) :: ILOC,JLOC - REAL, INTENT(IN) :: DT - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: ZSOIL !depth of soil layer-bottom [m] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO ! snow/soil layer thickness [m] - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: SMCEQ !equilibrium soil water content [m3/m3] - -! input and output - REAL, DIMENSION( 1:NSOIL), INTENT(INOUT) :: SMC !total soil water content [m3/m3] - REAL, INTENT(INOUT) :: WTD !the depth to water table [m] - REAL, INTENT(INOUT) :: SMCWTD !soil moisture between bottom of the soil and the water table [m3/m3] - REAL, INTENT(OUT) :: RECH ! groundwater recharge (net vertical flux across the water table), positive up - REAL, INTENT(INOUT) :: QDRAIN - -! local - INTEGER :: IZ !do-loop index - INTEGER :: IWTD !layer index above water table layer - INTEGER :: KWTD !layer index where the water table layer is - REAL :: WTDOLD - REAL :: DZUP - REAL :: SMCEQDEEP - REAL, DIMENSION( 0:NSOIL) :: ZSOIL0 -! ------------------------------------------------------------- - - -ZSOIL0(1:NSOIL) = ZSOIL(1:NSOIL) -ZSOIL0(0) = 0.0 - -!find the layer where the water table is - DO IZ=NSOIL,1,-1 - IF(WTD + 1.0E-6 < ZSOIL0(IZ)) EXIT - ENDDO - IWTD=IZ - - - KWTD=IWTD+1 !layer where the water table is - IF(KWTD.LE.NSOIL)THEN !wtd in the resolved layers - WTDOLD=WTD - IF(SMC(KWTD).GT.SMCEQ(KWTD))THEN - - IF(SMC(KWTD).EQ.parameters%SMCMAX(KWTD))THEN !wtd went to the layer above - WTD=ZSOIL0(IWTD) - RECH=-(WTDOLD-WTD) * (parameters%SMCMAX(KWTD)-SMCEQ(KWTD)) - IWTD=IWTD-1 - KWTD=KWTD-1 - IF(KWTD.GE.1)THEN - IF(SMC(KWTD).GT.SMCEQ(KWTD))THEN - WTDOLD=WTD - WTD = MIN( ( SMC(KWTD)*DZSNSO(KWTD) & - - SMCEQ(KWTD)*ZSOIL0(IWTD) + parameters%SMCMAX(KWTD)*ZSOIL0(KWTD) ) / & - ( parameters%SMCMAX(KWTD)-SMCEQ(KWTD) ), ZSOIL0(IWTD)) - RECH=RECH-(WTDOLD-WTD) * (parameters%SMCMAX(KWTD)-SMCEQ(KWTD)) - ENDIF - ENDIF - ELSE !wtd stays in the layer - WTD = MIN( ( SMC(KWTD)*DZSNSO(KWTD) & - - SMCEQ(KWTD)*ZSOIL0(IWTD) + parameters%SMCMAX(KWTD)*ZSOIL0(KWTD) ) / & - ( parameters%SMCMAX(KWTD)-SMCEQ(KWTD) ), ZSOIL0(IWTD)) - RECH=-(WTDOLD-WTD) * (parameters%SMCMAX(KWTD)-SMCEQ(KWTD)) - ENDIF - - ELSE !wtd has gone down to the layer below - WTD=ZSOIL0(KWTD) - RECH=-(WTDOLD-WTD) * (parameters%SMCMAX(KWTD)-SMCEQ(KWTD)) - KWTD=KWTD+1 - IWTD=IWTD+1 -!wtd crossed to the layer below. Now adjust it there - IF(KWTD.LE.NSOIL)THEN - WTDOLD=WTD - IF(SMC(KWTD).GT.SMCEQ(KWTD))THEN - WTD = MIN( ( SMC(KWTD)*DZSNSO(KWTD) & - - SMCEQ(KWTD)*ZSOIL0(IWTD) + parameters%SMCMAX(KWTD)*ZSOIL0(KWTD) ) / & - ( parameters%SMCMAX(KWTD)-SMCEQ(KWTD) ) , ZSOIL0(IWTD) ) - ELSE - WTD=ZSOIL0(KWTD) - ENDIF - RECH = RECH - (WTDOLD-WTD) * & - (parameters%SMCMAX(KWTD)-SMCEQ(KWTD)) - - ELSE - WTDOLD=WTD -!restore smoi to equilibrium value with water from the ficticious layer below -! SMCWTD=SMCWTD-(SMCEQ(NSOIL)-SMC(NSOIL)) -! QDRAIN = QDRAIN - 1000 * (SMCEQ(NSOIL)-SMC(NSOIL)) * DZSNSO(NSOIL) / DT -! SMC(NSOIL)=SMCEQ(NSOIL) -!adjust wtd in the ficticious layer below - SMCEQDEEP = parameters%SMCMAX(NSOIL) * ( -parameters%PSISAT(NSOIL) / ( -parameters%PSISAT(NSOIL) - DZSNSO(NSOIL) ) ) ** (1.0/parameters%BEXP(NSOIL)) - WTD = MIN( ( SMCWTD*DZSNSO(NSOIL) & - - SMCEQDEEP*ZSOIL0(NSOIL) + parameters%SMCMAX(NSOIL)*(ZSOIL0(NSOIL)-DZSNSO(NSOIL)) ) / & - ( parameters%SMCMAX(NSOIL)-SMCEQDEEP ) , ZSOIL0(NSOIL) ) - RECH = RECH - (WTDOLD-WTD) * & - (parameters%SMCMAX(NSOIL)-SMCEQDEEP) - ENDIF - - ENDIF - ELSEIF(WTD.GE.ZSOIL0(NSOIL)-DZSNSO(NSOIL))THEN -!if wtd was already below the bottom of the resolved soil crust - WTDOLD=WTD - SMCEQDEEP = parameters%SMCMAX(NSOIL) * ( -parameters%PSISAT(NSOIL) / ( -parameters%PSISAT(NSOIL) - DZSNSO(NSOIL) ) ) ** (1.0/parameters%BEXP(NSOIL)) - IF(SMCWTD.GT.SMCEQDEEP)THEN - WTD = MIN( ( SMCWTD*DZSNSO(NSOIL) & - - SMCEQDEEP*ZSOIL0(NSOIL) + parameters%SMCMAX(NSOIL)*(ZSOIL0(NSOIL)-DZSNSO(NSOIL)) ) / & - ( parameters%SMCMAX(NSOIL)-SMCEQDEEP ) , ZSOIL0(NSOIL) ) - RECH = -(WTDOLD-WTD) * (parameters%SMCMAX(NSOIL)-SMCEQDEEP) - ELSE - RECH = -(WTDOLD-(ZSOIL0(NSOIL)-DZSNSO(NSOIL))) * (parameters%SMCMAX(NSOIL)-SMCEQDEEP) - WTDOLD=ZSOIL0(NSOIL)-DZSNSO(NSOIL) -!and now even further down - DZUP=(SMCEQDEEP-SMCWTD)*DZSNSO(NSOIL)/(parameters%SMCMAX(NSOIL)-SMCEQDEEP) - WTD=WTDOLD-DZUP - RECH = RECH - (parameters%SMCMAX(NSOIL)-SMCEQDEEP)*DZUP - SMCWTD=SMCEQDEEP - ENDIF - - - ENDIF - -IF(IWTD .LT. NSOIL .AND. IWTD .GT. 0) THEN - SMCWTD=parameters%SMCMAX(IWTD) -ELSEIF(IWTD .LT. NSOIL .AND. IWTD .LE. 0) THEN - SMCWTD=parameters%SMCMAX(1) -END IF - -END SUBROUTINE SHALLOWWATERTABLE - -! ================================================================================================== -! ********************* end of water subroutines ****************************************** -! ================================================================================================== - -!== begin carbon =================================================================================== - - SUBROUTINE CARBON (parameters,NSNOW ,NSOIL ,VEGTYP ,DT ,ZSOIL , & !in - DZSNSO ,STC ,SMC ,TV ,TG ,PSN , & !in - FOLN ,BTRAN ,APAR ,FVEG ,IGS , & !in - TROOT ,IST ,LAT ,ILOC ,JLOC , & !in - LFMASS ,RTMASS ,STMASS ,WOOD ,STBLCP ,FASTCP , & !inout - GPP ,NPP ,NEE ,AUTORS ,HETERS ,TOTSC , & !out - TOTLB ,XLAI ,XSAI ) !out -! ------------------------------------------------------------------------------------------ - IMPLICIT NONE -! ------------------------------------------------------------------------------------------ -! inputs (carbon) - - type (noahmp_parameters), intent(in) :: parameters - INTEGER , INTENT(IN) :: ILOC !grid index - INTEGER , INTENT(IN) :: JLOC !grid index - INTEGER , INTENT(IN) :: VEGTYP !vegetation type - INTEGER , INTENT(IN) :: NSNOW !number of snow layers - INTEGER , INTENT(IN) :: NSOIL !number of soil layers - REAL , INTENT(IN) :: LAT !latitude (radians) - REAL , INTENT(IN) :: DT !time step (s) - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: ZSOIL !depth of layer-bottom from soil surface - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !snow/soil layer thickness [m] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: STC !snow/soil temperature [k] - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: SMC !soil moisture (ice + liq.) [m3/m3] - REAL , INTENT(IN) :: TV !vegetation temperature (k) - REAL , INTENT(IN) :: TG !ground temperature (k) - REAL , INTENT(IN) :: FOLN !foliage nitrogen (%) - REAL , INTENT(IN) :: BTRAN !soil water transpiration factor (0 to 1) - REAL , INTENT(IN) :: PSN !total leaf photosyn (umolco2/m2/s) [+] - REAL , INTENT(IN) :: APAR !PAR by canopy (w/m2) - REAL , INTENT(IN) :: IGS !growing season index (0=off, 1=on) - REAL , INTENT(IN) :: FVEG !vegetation greenness fraction - REAL , INTENT(IN) :: TROOT !root-zone averaged temperature (k) - INTEGER , INTENT(IN) :: IST !surface type 1->soil; 2->lake - -! input & output (carbon) - - REAL , INTENT(INOUT) :: LFMASS !leaf mass [g/m2] - REAL , INTENT(INOUT) :: RTMASS !mass of fine roots [g/m2] - REAL , INTENT(INOUT) :: STMASS !stem mass [g/m2] - REAL , INTENT(INOUT) :: WOOD !mass of wood (incl. woody roots) [g/m2] - REAL , INTENT(INOUT) :: STBLCP !stable carbon in deep soil [g/m2] - REAL , INTENT(INOUT) :: FASTCP !short-lived carbon in shallow soil [g/m2] - -! outputs: (carbon) - - REAL , INTENT(OUT) :: GPP !net instantaneous assimilation [g/m2/s C] - REAL , INTENT(OUT) :: NPP !net primary productivity [g/m2/s C] - REAL , INTENT(OUT) :: NEE !net ecosystem exchange [g/m2/s CO2] - REAL , INTENT(OUT) :: AUTORS !net ecosystem respiration [g/m2/s C] - REAL , INTENT(OUT) :: HETERS !organic respiration [g/m2/s C] - REAL , INTENT(OUT) :: TOTSC !total soil carbon [g/m2 C] - REAL , INTENT(OUT) :: TOTLB !total living carbon ([g/m2 C] - REAL , INTENT(OUT) :: XLAI !leaf area index [-] - REAL , INTENT(OUT) :: XSAI !stem area index [-] -! REAL , INTENT(OUT) :: VOCFLX(5) ! voc fluxes [ug C m-2 h-1] - -! local variables - - INTEGER :: J !do-loop index - REAL :: WROOT !root zone soil water [-] - REAL :: WSTRES !water stress coeficient [-] (1. for wilting ) - REAL :: LAPM !leaf area per unit mass [m2/g] -! ------------------------------------------------------------------------------------------ - - IF ( ( VEGTYP == parameters%iswater ) .OR. ( VEGTYP == parameters%ISBARREN ) .OR. & - ( VEGTYP == parameters%ISICE ) .or. (parameters%urban_flag) ) THEN - XLAI = 0.0 - XSAI = 0.0 - GPP = 0.0 - NPP = 0.0 - NEE = 0.0 - AUTORS = 0.0 - HETERS = 0.0 - TOTSC = 0.0 - TOTLB = 0.0 - LFMASS = 0.0 - RTMASS = 0.0 - STMASS = 0.0 - WOOD = 0.0 - STBLCP = 0.0 - FASTCP = 0.0 - - RETURN - END IF - - LAPM = parameters%SLA / 1000.0 ! m2/kg -> m2/g - -! water stress - - WSTRES = 1.0- BTRAN - - WROOT = 0.0 - DO J=1,parameters%NROOT - WROOT = WROOT + SMC(J)/parameters%SMCMAX(J) * DZSNSO(J) / (-ZSOIL(parameters%NROOT)) - ENDDO - - CALL CO2FLUX (parameters,NSNOW ,NSOIL ,VEGTYP ,IGS ,DT , & !in - DZSNSO ,STC ,PSN ,TROOT ,TV , & !in - WROOT ,WSTRES ,FOLN ,LAPM , & !in - LAT ,ILOC ,JLOC ,FVEG , & !in - XLAI ,XSAI ,LFMASS ,RTMASS ,STMASS , & !inout - FASTCP ,STBLCP ,WOOD , & !inout - GPP ,NPP ,NEE ,AUTORS ,HETERS , & !out - TOTSC ,TOTLB ) !out - -! CALL BVOC (parameters,VOCFLX, VEGTYP, VEGFAC, APAR, TV) -! CALL CH4 - - END SUBROUTINE CARBON - -!== begin co2flux ================================================================================== - - SUBROUTINE CO2FLUX (parameters,NSNOW ,NSOIL ,VEGTYP ,IGS ,DT , & !in - DZSNSO ,STC ,PSN ,TROOT ,TV , & !in - WROOT ,WSTRES ,FOLN ,LAPM , & !in - LAT ,ILOC ,JLOC ,FVEG , & !in - XLAI ,XSAI ,LFMASS ,RTMASS ,STMASS , & !inout - FASTCP ,STBLCP ,WOOD , & !inout - GPP ,NPP ,NEE ,AUTORS ,HETERS , & !out - TOTSC ,TOTLB ) !out -! ----------------------------------------------------------------------------------------- -! The original code is from RE Dickinson et al.(1998), modifed by Guo-Yue Niu, 2004 -! ----------------------------------------------------------------------------------------- - IMPLICIT NONE -! ----------------------------------------------------------------------------------------- - -! input - - type (noahmp_parameters), intent(in) :: parameters - INTEGER , INTENT(IN) :: ILOC !grid index - INTEGER , INTENT(IN) :: JLOC !grid index - INTEGER , INTENT(IN) :: VEGTYP !vegetation physiology type - INTEGER , INTENT(IN) :: NSNOW !number of snow layers - INTEGER , INTENT(IN) :: NSOIL !number of soil layers - REAL , INTENT(IN) :: DT !time step (s) - REAL , INTENT(IN) :: LAT !latitude (radians) - REAL , INTENT(IN) :: IGS !growing season index (0=off, 1=on) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !snow/soil layer thickness [m] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: STC !snow/soil temperature [k] - REAL , INTENT(IN) :: PSN !total leaf photosynthesis (umolco2/m2/s) - REAL , INTENT(IN) :: TROOT !root-zone averaged temperature (k) - REAL , INTENT(IN) :: TV !leaf temperature (k) - REAL , INTENT(IN) :: WROOT !root zone soil water - REAL , INTENT(IN) :: WSTRES !soil water stress - REAL , INTENT(IN) :: FOLN !foliage nitrogen (%) - REAL , INTENT(IN) :: LAPM !leaf area per unit mass [m2/g] - REAL , INTENT(IN) :: FVEG !vegetation greenness fraction - -! input and output - - REAL , INTENT(INOUT) :: XLAI !leaf area index from leaf carbon [-] - REAL , INTENT(INOUT) :: XSAI !stem area index from leaf carbon [-] - REAL , INTENT(INOUT) :: LFMASS !leaf mass [g/m2] - REAL , INTENT(INOUT) :: RTMASS !mass of fine roots [g/m2] - REAL , INTENT(INOUT) :: STMASS !stem mass [g/m2] - REAL , INTENT(INOUT) :: FASTCP !short lived carbon [g/m2] - REAL , INTENT(INOUT) :: STBLCP !stable carbon pool [g/m2] - REAL , INTENT(INOUT) :: WOOD !mass of wood (incl. woody roots) [g/m2] - -! output - - REAL , INTENT(OUT) :: GPP !net instantaneous assimilation [g/m2/s] - REAL , INTENT(OUT) :: NPP !net primary productivity [g/m2] - REAL , INTENT(OUT) :: NEE !net ecosystem exchange (autors+heters-gpp) - REAL , INTENT(OUT) :: AUTORS !net ecosystem resp. (maintance and growth) - REAL , INTENT(OUT) :: HETERS !organic respiration - REAL , INTENT(OUT) :: TOTSC !total soil carbon (g/m2) - REAL , INTENT(OUT) :: TOTLB !total living carbon (g/m2) - -! local - - REAL :: CFLUX !carbon flux to atmosphere [g/m2/s] - REAL :: LFMSMN !minimum leaf mass [g/m2] - REAL :: RSWOOD !wood respiration [g/m2] - REAL :: RSLEAF !leaf maintenance respiration per timestep [g/m2] - REAL :: RSROOT !fine root respiration per time step [g/m2] - REAL :: NPPL !leaf net primary productivity [g/m2/s] - REAL :: NPPR !root net primary productivity [g/m2/s] - REAL :: NPPW !wood net primary productivity [g/m2/s] - REAL :: NPPS !wood net primary productivity [g/m2/s] - REAL :: DIELF !death of leaf mass per time step [g/m2] - - REAL :: ADDNPPLF !leaf assimil after resp. losses removed [g/m2] - REAL :: ADDNPPST !stem assimil after resp. losses removed [g/m2] - REAL :: CARBFX !carbon assimilated per model step [g/m2] - REAL :: GRLEAF !growth respiration rate for leaf [g/m2/s] - REAL :: GRROOT !growth respiration rate for root [g/m2/s] - REAL :: GRWOOD !growth respiration rate for wood [g/m2/s] - REAL :: GRSTEM !growth respiration rate for stem [g/m2/s] - REAL :: LEAFPT !fraction of carbon allocated to leaves [-] - REAL :: LFDEL !maximum leaf mass available to change [g/m2/s] - REAL :: LFTOVR !stem turnover per time step [g/m2] - REAL :: STTOVR !stem turnover per time step [g/m2] - REAL :: WDTOVR !wood turnover per time step [g/m2] - REAL :: RSSOIL !soil respiration per time step [g/m2] - REAL :: RTTOVR !root carbon loss per time step by turnover [g/m2] - REAL :: STABLC !decay rate of fast carbon to slow carbon [g/m2/s] - REAL :: WOODF !calculated wood to root ratio [-] - REAL :: NONLEF !fraction of carbon to root and wood [-] - REAL :: ROOTPT !fraction of carbon flux to roots [-] - REAL :: WOODPT !fraction of carbon flux to wood [-] - REAL :: STEMPT !fraction of carbon flux to stem [-] - REAL :: RESP !leaf respiration [umol/m2/s] - REAL :: RSSTEM !stem respiration [g/m2/s] - - REAL :: FSW !soil water factor for microbial respiration - REAL :: FST !soil temperature factor for microbial respiration - REAL :: FNF !foliage nitrogen adjustemt to respiration (<= 1) - REAL :: TF !temperature factor - REAL :: RF !respiration reduction factor (<= 1) - REAL :: STDEL - REAL :: STMSMN - REAL :: SAPM !stem area per unit mass (m2/g) - REAL :: DIEST -! -------------------------- constants ------------------------------- - REAL :: BF !parameter for present wood allocation [-] - REAL :: RSWOODC !wood respiration coeficient [1/s] - REAL :: STOVRC !stem turnover coefficient [1/s] - REAL :: RSDRYC !degree of drying that reduces soil respiration [-] - REAL :: RTOVRC !root turnover coefficient [1/s] - REAL :: WSTRC !water stress coeficient [-] - REAL :: LAIMIN !minimum leaf area index [m2/m2] - REAL :: XSAMIN !minimum leaf area index [m2/m2] - REAL :: SC - REAL :: SD - REAL :: VEGFRAC - -! Respiration as a function of temperature - - real :: r,x - r(x) = exp(0.08*(x-298.16)) -! --------------------------------------------------------------------------------- - -! constants - RTOVRC = 2.0E-8 !original was 2.0e-8 - RSDRYC = 40.0 !original was 40.0 - RSWOODC = 3.0E-10 ! - BF = 0.90 !original was 0.90 ! carbon to roots - WSTRC = 100.0 - LAIMIN = 0.05 - XSAMIN = 0.05 ! MB: change to prevent vegetation from not growing back in spring - - SAPM = 3.*0.001 ! m2/kg -->m2/g - LFMSMN = laimin/lapm - STMSMN = xsamin/sapm -! --------------------------------------------------------------------------------- - -! respiration - - IF(IGS .EQ. 0.0) THEN - RF = 0.5 - ELSE - RF = 1.0 - ENDIF - - FNF = MIN( FOLN/MAX(1.0E-06,parameters%FOLNMX), 1.0 ) - TF = parameters%ARM**( (TV-298.16)/10.0 ) - RESP = parameters%RMF25 * TF * FNF * XLAI * RF * (1.-WSTRES) ! umol/m2/s - RSLEAF = MIN((LFMASS-LFMSMN)/DT,RESP*12.0e-6) ! g/m2/s - - RSROOT = parameters%RMR25*(RTMASS*1E-3)*TF *RF* 12.0e-6 ! g/m2/s - RSSTEM = parameters%RMS25*((STMASS-STMSMN)*1E-3)*TF *RF* 12.0e-6 ! g/m2/s - RSWOOD = RSWOODC * R(TV) * WOOD*parameters%WDPOOL - -! carbon assimilation -! 1 mole -> 12 g carbon or 44 g CO2; 1 umol -> 12.e-6 g carbon; - - CARBFX = PSN * 12.0e-6 ! umol co2 /m2/ s -> g/m2/s carbon - -! fraction of carbon into leaf versus nonleaf - - LEAFPT = EXP(0.01*(1.-EXP(0.75*XLAI))*XLAI) - IF(VEGTYP == parameters%EBLFOREST) LEAFPT = EXP(0.01*(1.-EXP(0.50*XLAI))*XLAI) - - NONLEF = 1.0 - LEAFPT - STEMPT = XLAI/10.0*LEAFPT - LEAFPT = LEAFPT - STEMPT - -! fraction of carbon into wood versus root - - IF(WOOD > 1.0e-6) THEN - WOODF = (1.0-EXP(-BF*(parameters%WRRAT*RTMASS/WOOD))/BF)*parameters%WDPOOL - ELSE - WOODF = parameters%WDPOOL - ENDIF - - ROOTPT = NONLEF*(1.0-WOODF) - WOODPT = NONLEF*WOODF - -! leaf and root turnover per time step - - LFTOVR = parameters%LTOVRC*5.0E-7*LFMASS - STTOVR = parameters%LTOVRC*5.0E-7*STMASS - RTTOVR = RTOVRC*RTMASS - WDTOVR = 9.5E-10*WOOD - -! seasonal leaf die rate dependent on temp and water stress -! water stress is set to 1 at permanent wilting point - - SC = EXP(-0.3*MAX(0.0,TV-parameters%TDLEF)) * (LFMASS/120.0) - SD = EXP((WSTRES-1.)*WSTRC) - DIELF = LFMASS*1.0E-6*(parameters%DILEFW * SD + parameters%DILEFC*SC) - DIEST = STMASS*1.0E-6*(parameters%DILEFW * SD + parameters%DILEFC*SC) - -! calculate growth respiration for leaf, rtmass and wood - - GRLEAF = MAX(0.0,parameters%FRAGR*(LEAFPT*CARBFX - RSLEAF)) - GRSTEM = MAX(0.0,parameters%FRAGR*(STEMPT*CARBFX - RSSTEM)) - GRROOT = MAX(0.0,parameters%FRAGR*(ROOTPT*CARBFX - RSROOT)) - GRWOOD = MAX(0.0,parameters%FRAGR*(WOODPT*CARBFX - RSWOOD)) - -! Impose lower T limit for photosynthesis - - ADDNPPLF = MAX(0.0,LEAFPT*CARBFX - GRLEAF-RSLEAF) - ADDNPPST = MAX(0.0,STEMPT*CARBFX - GRSTEM-RSSTEM) -! ADDNPPLF = LEAFPT*CARBFX - GRLEAF-RSLEAF ! MB: test Kjetil -! ADDNPPST = STEMPT*CARBFX - GRSTEM-RSSTEM ! MB: test Kjetil - IF(TV .LT. parameters%TMIN) ADDNPPLF =0.0 - IF(TV .LT. parameters%TMIN) ADDNPPST =0.0 - -! update leaf, root, and wood carbon -! avoid reducing leaf mass below its minimum value but conserve mass - - LFDEL = (LFMASS - LFMSMN)/DT - STDEL = (STMASS - STMSMN)/DT - DIELF = MIN(DIELF,LFDEL+ADDNPPLF-LFTOVR) - DIEST = MIN(DIEST,STDEL+ADDNPPST-STTOVR) - -! net primary productivities - - NPPL = MAX(ADDNPPLF,-LFDEL) - NPPS = MAX(ADDNPPST,-STDEL) - NPPR = ROOTPT*CARBFX - RSROOT - GRROOT - NPPW = WOODPT*CARBFX - RSWOOD - GRWOOD - -! masses of plant components - - LFMASS = LFMASS + (NPPL-LFTOVR-DIELF)*DT - STMASS = STMASS + (NPPS-STTOVR-DIEST)*DT ! g/m2 - RTMASS = RTMASS + (NPPR-RTTOVR) *DT - - IF(RTMASS.LT.0.0) THEN - RTTOVR = NPPR - RTMASS = 0.0 - ENDIF - WOOD = (WOOD+(NPPW-WDTOVR)*DT)*parameters%WDPOOL - -! soil carbon budgets - - FASTCP = FASTCP + (RTTOVR+LFTOVR+STTOVR+WDTOVR+DIELF+DIEST)*DT ! MB: add DIEST v3.7 - - FST = 2.0**( (STC(1)-283.16)/10.0 ) - FSW = WROOT / (0.20+WROOT) * 0.23 / (0.23+WROOT) - RSSOIL = FSW * FST * parameters%MRP* MAX(0.0,FASTCP*1.0E-3)*12.0E-6 - - STABLC = 0.1*RSSOIL - FASTCP = FASTCP - (RSSOIL + STABLC)*DT - STBLCP = STBLCP + STABLC*DT - -! total carbon flux - - CFLUX = - CARBFX + RSLEAF + RSROOT + RSWOOD + RSSTEM & ! MB: add RSSTEM,GRSTEM,0.9*RSSOIL v3.7 - + 0.9*RSSOIL + GRLEAF + GRROOT + GRWOOD + GRSTEM ! g/m2/s - -! for outputs - - GPP = CARBFX !g/m2/s C - NPP = NPPL + NPPW + NPPR +NPPS !g/m2/s C - AUTORS = RSROOT + RSWOOD + RSLEAF + RSSTEM + & !g/m2/s C MB: add RSSTEM, GRSTEM v3.7 - GRLEAF + GRROOT + GRWOOD + GRSTEM !g/m2/s C MB: add 0.9* v3.7 - HETERS = 0.9*RSSOIL !g/m2/s C - NEE = (AUTORS + HETERS - GPP)*44.0/12.0 !g/m2/s CO2 - TOTSC = FASTCP + STBLCP !g/m2 C - TOTLB = LFMASS + RTMASS +STMASS + WOOD !g/m2 C MB: add STMASS v3.7 - -! leaf area index and stem area index - - XLAI = MAX(LFMASS*LAPM,LAIMIN) - XSAI = MAX(STMASS*SAPM,XSAMIN) - - END SUBROUTINE CO2FLUX - -!== begin carbon_crop ============================================================================== - - SUBROUTINE CARBON_CROP (parameters,NSNOW ,NSOIL ,VEGTYP ,DT ,ZSOIL ,JULIAN , & !in - DZSNSO ,STC ,SMC ,TV ,PSN ,FOLN ,BTRAN , & !in - SOLDN ,T2M , & !in - LFMASS ,RTMASS ,STMASS ,WOOD ,STBLCP ,FASTCP ,GRAIN , & !inout - XLAI ,XSAI ,GDD , & !inout - GPP ,NPP ,NEE ,AUTORS ,HETERS ,TOTSC ,TOTLB, PGS ) !out -! ------------------------------------------------------------------------------------------ -! Initial crop version created by Xing Liu -! Initial crop version added by Barlage v3.8 - -! ------------------------------------------------------------------------------------------ - IMPLICIT NONE -! ------------------------------------------------------------------------------------------ -! inputs (carbon) - - type (noahmp_parameters), intent(in) :: parameters - INTEGER , INTENT(IN) :: NSNOW !number of snow layers - INTEGER , INTENT(IN) :: NSOIL !number of soil layers - INTEGER , INTENT(IN) :: VEGTYP !vegetation type - REAL , INTENT(IN) :: DT !time step (s) - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: ZSOIL !depth of layer-bottomfrom soil surface - REAL , INTENT(IN) :: JULIAN !Julian day of year(fractional) ( 0 <= JULIAN < YEARLEN ) - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: DZSNSO !snow/soil layerthickness [m] - REAL, DIMENSION(-NSNOW+1:NSOIL), INTENT(IN) :: STC !snow/soil temperature[k] - REAL, DIMENSION( 1:NSOIL), INTENT(IN) :: SMC !soil moisture (ice +liq.) [m3/m3] - REAL , INTENT(IN) :: TV !vegetation temperature(k) - REAL , INTENT(IN) :: PSN !total leaf photosyn(umolco2/m2/s) [+] - REAL , INTENT(IN) :: FOLN !foliage nitrogen (%) - REAL , INTENT(IN) :: BTRAN !soil watertranspiration factor (0 to 1) - REAL , INTENT(IN) :: SOLDN !Downward solar radiation - REAL , INTENT(IN) :: T2M !air temperature - -! input & output (carbon) - - REAL , INTENT(INOUT) :: LFMASS !leaf mass [g/m2] - REAL , INTENT(INOUT) :: RTMASS !mass of fine roots[g/m2] - REAL , INTENT(INOUT) :: STMASS !stem mass [g/m2] - REAL , INTENT(INOUT) :: WOOD !mass of wood (incl.woody roots) [g/m2] - REAL , INTENT(INOUT) :: STBLCP !stable carbon in deepsoil [g/m2] - REAL , INTENT(INOUT) :: FASTCP !short-lived carbon inshallow soil [g/m2] - REAL , INTENT(INOUT) :: GRAIN !mass of GRAIN [g/m2] - REAL , INTENT(INOUT) :: XLAI !leaf area index [-] - REAL , INTENT(INOUT) :: XSAI !stem area index [-] - REAL , INTENT(INOUT) :: GDD !growing degree days - -! outout - REAL , INTENT(OUT) :: GPP !net instantaneous assimilation [g/m2/s C] - REAL , INTENT(OUT) :: NPP !net primary productivity [g/m2/s C] - REAL , INTENT(OUT) :: NEE !net ecosystem exchange[g/m2/s CO2] - REAL , INTENT(OUT) :: AUTORS !net ecosystem respiration [g/m2/s C] - REAL , INTENT(OUT) :: HETERS !organic respiration[g/m2/s C] - REAL , INTENT(OUT) :: TOTSC !total soil carbon [g/m2C] - REAL , INTENT(OUT) :: TOTLB !total living carbon ([g/m2 C] - -! local variables - - INTEGER :: J !do-loop index - REAL :: WROOT !root zone soil water [-] - REAL :: WSTRES !water stress coeficient [-] (1. for wilting ) - INTEGER :: IPA !Planting index - INTEGER :: IHA !Havestindex(0=on,1=off) - INTEGER, INTENT(OUT) :: PGS !Plant growth stage - - REAL :: PSNCROP - -! ------------------------------------------------------------------------------------------ - IF ( ( VEGTYP == parameters%iswater ) .OR. ( VEGTYP == parameters%ISBARREN ) .OR. & - ( VEGTYP == parameters%ISICE ) .or. (parameters%urban_flag) ) THEN - XLAI = 0.0 - XSAI = 0.0 - GPP = 0.0 - NPP = 0.0 - NEE = 0.0 - AUTORS = 0.0 - HETERS = 0.0 - TOTSC = 0.0 - TOTLB = 0.0 - LFMASS = 0.0 - RTMASS = 0.0 - STMASS = 0.0 - WOOD = 0.0 - STBLCP = 0.0 - FASTCP = 0.0 - GRAIN = 0.0 - RETURN - END IF - -! water stress - - - WSTRES = 1.0- BTRAN - - WROOT = 0.0 - DO J=1,parameters%NROOT - WROOT = WROOT + SMC(J)/parameters%SMCMAX(J) * DZSNSO(J) / (-ZSOIL(parameters%NROOT)) - ENDDO - - CALL PSN_CROP ( parameters, & !in - SOLDN, XLAI, T2M, & !in - PSNCROP ) !out - - CALL GROWING_GDD (parameters, & !in - T2M , DT, JULIAN, & !in - GDD , & !inout - IPA , IHA, PGS) !out - - CALL CO2FLUX_CROP (parameters, & !in - DT ,STC(1) ,PSN ,TV ,WROOT ,WSTRES ,FOLN , & !in - IPA ,IHA ,PGS , & !in XING - XLAI ,XSAI ,LFMASS ,RTMASS ,STMASS , & !inout - FASTCP ,STBLCP ,WOOD ,GRAIN ,GDD , & !inout - GPP ,NPP ,NEE ,AUTORS ,HETERS , & !out - TOTSC ,TOTLB ) !out - - END SUBROUTINE CARBON_CROP - -!== begin co2flux_crop ============================================================================= - - SUBROUTINE CO2FLUX_CROP (parameters, & !in - DT ,STC ,PSN ,TV ,WROOT ,WSTRES ,FOLN , & !in - IPA ,IHA ,PGS , & !in XING - XLAI ,XSAI ,LFMASS ,RTMASS ,STMASS , & !inout - FASTCP ,STBLCP ,WOOD ,GRAIN ,GDD, & !inout - GPP ,NPP ,NEE ,AUTORS ,HETERS , & !out - TOTSC ,TOTLB ) !out -! ----------------------------------------------------------------------------------------- -! The original code from RE Dickinson et al.(1998) and Guo-Yue Niu(2004), -! modified by Xing Liu, 2014. -! -! ----------------------------------------------------------------------------------------- - IMPLICIT NONE -! ----------------------------------------------------------------------------------------- - -! input - - type (noahmp_parameters), intent(in) :: parameters - REAL , INTENT(IN) :: DT !time step (s) - REAL , INTENT(IN) :: STC !soil temperature[k] - REAL , INTENT(IN) :: PSN !total leaf photosynthesis (umolco2/m2/s) - REAL , INTENT(IN) :: TV !leaf temperature (k) - REAL , INTENT(IN) :: WROOT !root zone soil water - REAL , INTENT(IN) :: WSTRES !soil water stress - REAL , INTENT(IN) :: FOLN !foliage nitrogen (%) - INTEGER , INTENT(IN) :: IPA - INTEGER , INTENT(IN) :: IHA - INTEGER , INTENT(IN) :: PGS - -! input and output - - REAL , INTENT(INOUT) :: XLAI !leaf area index from leaf carbon [-] - REAL , INTENT(INOUT) :: XSAI !stem area index from leaf carbon [-] - REAL , INTENT(INOUT) :: LFMASS !leaf mass [g/m2] - REAL , INTENT(INOUT) :: RTMASS !mass of fine roots [g/m2] - REAL , INTENT(INOUT) :: STMASS !stem mass [g/m2] - REAL , INTENT(INOUT) :: FASTCP !short lived carbon [g/m2] - REAL , INTENT(INOUT) :: STBLCP !stable carbon pool [g/m2] - REAL , INTENT(INOUT) :: WOOD !mass of wood (incl. woody roots) [g/m2] - REAL , INTENT(INOUT) :: GRAIN !mass of grain (XING) [g/m2] - REAL , INTENT(INOUT) :: GDD !growing degree days (XING) - -! output - - REAL , INTENT(OUT) :: GPP !net instantaneous assimilation [g/m2/s] - REAL , INTENT(OUT) :: NPP !net primary productivity [g/m2] - REAL , INTENT(OUT) :: NEE !net ecosystem exchange (autors+heters-gpp) - REAL , INTENT(OUT) :: AUTORS !net ecosystem resp. (maintance and growth) - REAL , INTENT(OUT) :: HETERS !organic respiration - REAL , INTENT(OUT) :: TOTSC !total soil carbon (g/m2) - REAL , INTENT(OUT) :: TOTLB !total living carbon (g/m2) - -! local - - REAL :: CFLUX !carbon flux to atmosphere [g/m2/s] - REAL :: LFMSMN !minimum leaf mass [g/m2] - REAL :: RSWOOD !wood respiration [g/m2] - REAL :: RSLEAF !leaf maintenance respiration per timestep[g/m2] - REAL :: RSROOT !fine root respiration per time step [g/m2] - REAL :: RSGRAIN !grain respiration [g/m2] - REAL :: NPPL !leaf net primary productivity [g/m2/s] - REAL :: NPPR !root net primary productivity [g/m2/s] - REAL :: NPPW !wood net primary productivity [g/m2/s] - REAL :: NPPS !wood net primary productivity [g/m2/s] - REAL :: NPPG !grain net primary productivity [g/m2/s] - REAL :: DIELF !death of leaf mass per time step [g/m2] - - REAL :: ADDNPPLF !leaf assimil after resp. losses removed[g/m2] - REAL :: ADDNPPST !stem assimil after resp. losses removed[g/m2] - REAL :: CARBFX !carbon assimilated per model step [g/m2] - REAL :: CBHYDRAFX!carbonhydrate assimilated per model step [g/m2] - REAL :: GRLEAF !growth respiration rate for leaf [g/m2/s] - REAL :: GRROOT !growth respiration rate for root [g/m2/s] - REAL :: GRWOOD !growth respiration rate for wood [g/m2/s] - REAL :: GRSTEM !growth respiration rate for stem [g/m2/s] - REAL :: GRGRAIN !growth respiration rate for stem [g/m2/s] - REAL :: LEAFPT !fraction of carbon allocated to leaves [-] - REAL :: LFDEL !maximum leaf mass available to change[g/m2/s] - REAL :: LFTOVR !stem turnover per time step [g/m2] - REAL :: STTOVR !stem turnover per time step [g/m2] - REAL :: WDTOVR !wood turnover per time step [g/m2] - REAL :: GRTOVR !grainturnover per time step [g/m2] - REAL :: RSSOIL !soil respiration per time step [g/m2] - REAL :: RTTOVR !root carbon loss per time step by turnover[g/m2] - REAL :: STABLC !decay rate of fast carbon to slow carbon[g/m2/s] - REAL :: WOODF !calculated wood to root ratio [-] - REAL :: NONLEF !fraction of carbon to root and wood [-] - REAL :: RESP !leaf respiration [umol/m2/s] - REAL :: RSSTEM !stem respiration [g/m2/s] - - REAL :: FSW !soil water factor for microbial respiration - REAL :: FST !soil temperature factor for microbialrespiration - REAL :: FNF !foliage nitrogen adjustemt to respiration(<= 1) - REAL :: TF !temperature factor - REAL :: STDEL - REAL :: STMSMN - REAL :: SAPM !stem area per unit mass (m2/g) - REAL :: DIEST - REAL :: LFCONVERT !leaf to grain conversion ! Zhe Zhang 2020-07-13 - REAL :: STCONVERT !stem to grain conversion [g/m2/s] - REAL :: RTCONVERT !root to grain conversion [g/m2/s] -! -------------------------- constants ------------------------------- - REAL :: BF !parameter for present wood allocation [-] - REAL :: RSWOODC !wood respiration coeficient [1/s] - REAL :: STOVRC !stem turnover coefficient [1/s] - REAL :: RSDRYC !degree of drying that reduces soilrespiration [-] - REAL :: RTOVRC !root turnover coefficient [1/s] - REAL :: WSTRC !water stress coeficient [-] - REAL :: LAIMIN !minimum leaf area index [m2/m2] - REAL :: XSAMIN !minimum leaf area index [m2/m2] - REAL :: SC - REAL :: SD - REAL :: VEGFRAC - REAL :: TEMP - -! Respiration as a function of temperature - - real :: r,x - r(x) = exp(0.08*(x-298.16)) -! --------------------------------------------------------------------------------- - -! constants - RSDRYC = 40.0 !original was 40.0 - RSWOODC = 3.0E-10 ! - BF = 0.90 !original was 0.90 ! carbon to roots - WSTRC = 100.0 - LAIMIN = 0.05 - XSAMIN = 0.05 - - SAPM = 3.0*0.001 ! m2/kg -->m2/g - LFMSMN = laimin/0.035 - STMSMN = xsamin/sapm -! --------------------------------------------------------------------------------- - -! carbon assimilation -! 1 mole -> 12 g carbon or 44 g CO2 or 30 g CH20 - - CARBFX = PSN*12.0e-6!*IPA !umol co2 /m2/ s -> g/m2/s C - CBHYDRAFX = PSN*30.0e-6!*IPA - -! mainteinance respiration - FNF = MIN( FOLN/MAX(1.0E-06,parameters%FOLN_MX), 1.0 ) - TF = parameters%Q10MR**( (TV-298.16)/10.0 ) - RESP = parameters%LFMR25 * TF * FNF * XLAI * (1.-WSTRES) ! umol/m2/s - RSLEAF = MIN((LFMASS-LFMSMN)/DT,RESP*30.0e-6) ! g/m2/s - RSROOT = parameters%RTMR25*(RTMASS*1E-3)*TF * 30.0e-6 ! g/m2/s - RSSTEM = parameters%STMR25*(STMASS*1E-3)*TF * 30.0e-6 ! g/m2/s - RSGRAIN = parameters%GRAINMR25*(GRAIN*1E-3)*TF * 30.0e-6 ! g/m2/s - -! calculate growth respiration for leaf, rtmass and grain - - GRLEAF = MAX(0.0,parameters%FRA_GR*(parameters%LFPT(PGS)*CBHYDRAFX - RSLEAF)) - GRSTEM = MAX(0.0,parameters%FRA_GR*(parameters%STPT(PGS)*CBHYDRAFX - RSSTEM)) - GRROOT = MAX(0.0,parameters%FRA_GR*(parameters%RTPT(PGS)*CBHYDRAFX - RSROOT)) - GRGRAIN = MAX(0.0,parameters%FRA_GR*(parameters%GRAINPT(PGS)*CBHYDRAFX - RSGRAIN)) - -! leaf turnover, stem turnover, root turnover and leaf death caused by soil -! water and soil temperature stress - - LFTOVR = parameters%LF_OVRC(PGS)*1.0E-6*LFMASS - RTTOVR = parameters%RT_OVRC(PGS)*1.0E-6*RTMASS - STTOVR = parameters%ST_OVRC(PGS)*1.0E-6*STMASS - SC = EXP(-0.3*MAX(0.0,TV-parameters%LEFREEZ)) * (LFMASS/120.0) - SD = EXP((WSTRES-1.0)*WSTRC) - DIELF = LFMASS*1.0E-6*(parameters%DILE_FW(PGS) * SD + parameters%DILE_FC(PGS)*SC) - -! Allocation of CBHYDRAFX to leaf, stem, root and grain at each growth stage - - - ADDNPPLF = MAX(0.0,parameters%LFPT(PGS)*CBHYDRAFX - GRLEAF-RSLEAF) - ADDNPPLF = parameters%LFPT(PGS)*CBHYDRAFX - GRLEAF-RSLEAF - ADDNPPST = MAX(0.0,parameters%STPT(PGS)*CBHYDRAFX - GRSTEM-RSSTEM) - ADDNPPST = parameters%STPT(PGS)*CBHYDRAFX - GRSTEM-RSSTEM - - -! avoid reducing leaf mass below its minimum value but conserve mass - - LFDEL = (LFMASS - LFMSMN)/DT - STDEL = (STMASS - STMSMN)/DT - LFTOVR = MIN(LFTOVR,LFDEL+ADDNPPLF) - STTOVR = MIN(STTOVR,STDEL+ADDNPPST) - DIELF = MIN(DIELF,LFDEL+ADDNPPLF-LFTOVR) - -! net primary productivities - - NPPL = MAX(ADDNPPLF,-LFDEL) - NPPL = ADDNPPLF - NPPS = MAX(ADDNPPST,-STDEL) - NPPS = ADDNPPST - NPPR = parameters%RTPT(PGS)*CBHYDRAFX - RSROOT - GRROOT - NPPG = parameters%GRAINPT(PGS)*CBHYDRAFX - RSGRAIN - GRGRAIN - -! masses of plant components - - LFMASS = LFMASS + (NPPL-LFTOVR-DIELF)*DT - STMASS = STMASS + (NPPS-STTOVR)*DT ! g/m2 - RTMASS = RTMASS + (NPPR-RTTOVR)*DT - GRAIN = GRAIN + NPPG*DT - - GPP = CBHYDRAFX* 0.4 !!g/m2/s C 0.4=12/30, CH20 to C - - LFCONVERT = 0.0 ! Zhe Zhang 2020-07-13 - STCONVERT = 0.0 - RTCONVERT = 0.0 - LFCONVERT = LFMASS*(parameters%LFCT(PGS)*DT/3600.0) - STCONVERT = STMASS*(parameters%STCT(PGS)*DT/3600.0) - RTCONVERT = RTMASS*(parameters%RTCT(PGS)*DT/3600.0) - LFMASS = LFMASS - LFCONVERT - STMASS = STMASS - STCONVERT - RTMASS = RTMASS - RTCONVERT - GRAIN = GRAIN + STCONVERT + RTCONVERT + LFCONVERT - !IF(PGS==6) THEN - ! STCONVERT = STMASS*(0.00005*DT/3600.0) - ! STMASS = STMASS - STCONVERT - ! RTCONVERT = RTMASS*(0.0005*DT/3600.0) - ! RTMASS = RTMASS - RTCONVERT - ! GRAIN = GRAIN + STCONVERT + RTCONVERT - !END IF - - IF(RTMASS.LT.0.0) THEN - RTTOVR = NPPR - RTMASS = 0.0 - ENDIF - - IF(GRAIN.LT.0.0) THEN - GRAIN = 0.0 - ENDIF - - ! soil carbon budgets - -! IF(PGS == 1 .OR. PGS == 2 .OR. PGS == 8) THEN -! FASTCP=1000 -! ELSE - FASTCP = FASTCP + (RTTOVR+LFTOVR+STTOVR+DIELF)*DT -! END IF - FST = 2.0**( (STC-283.16)/10.0 ) - FSW = WROOT / (0.20+WROOT) * 0.23 / (0.23+WROOT) - RSSOIL = FSW * FST * parameters%MRP* MAX(0.0,FASTCP*1.0E-3)*12.0E-6 - - STABLC = 0.1*RSSOIL - FASTCP = FASTCP - (RSSOIL + STABLC)*DT - STBLCP = STBLCP + STABLC*DT - -! total carbon flux - - CFLUX = - CARBFX + RSLEAF + RSROOT + RSSTEM & - + RSSOIL + GRLEAF + GRROOT ! g/m2/s 0.4=12/30, CH20 to C - -! for outputs - !g/m2/s C - - NPP = (NPPL + NPPS+ NPPR +NPPG)*0.4 !!g/m2/s C 0.4=12/30, CH20 to C - - - AUTORS = RSROOT + RSGRAIN + RSLEAF + & !g/m2/s C - GRLEAF + GRROOT + GRGRAIN !g/m2/s C - - HETERS = RSSOIL !g/m2/s C - NEE = (AUTORS + HETERS - GPP)*44.0/30.0 !g/m2/s CO2 - TOTSC = FASTCP + STBLCP !g/m2 C - - TOTLB = LFMASS + RTMASS + GRAIN - -! leaf area index and stem area index - - XLAI = MAX(LFMASS*parameters%BIO2LAI,LAIMIN) - XSAI = MAX(STMASS*SAPM,XSAMIN) - - -!After harversting -! IF(PGS == 8 ) THEN -! LFMASS = 0.62 -! STMASS = 0 -! GRAIN = 0 -! END IF - -! IF(PGS == 1 .OR. PGS == 2 .OR. PGS == 8) THEN - IF(PGS == 8 .and. (GRAIN > 0.0 .or. LFMASS > 0 .or. STMASS > 0 .or. RTMASS > 0)) THEN - XLAI = 0.05 - XSAI = 0.05 - LFMASS = LFMSMN - STMASS = STMSMN - RTMASS = 0 - GRAIN = 0 - END IF - -END SUBROUTINE CO2FLUX_CROP - -!== begin growing_gdd ============================================================================== - - SUBROUTINE GROWING_GDD (parameters, & !in - T2M , DT, JULIAN, & !in - GDD , & !inout - IPA, IHA, PGS) !out -!=================================================================================================== - -! input - - type (noahmp_parameters), intent(in) :: parameters - REAL , INTENT(IN) :: T2M !Air temperature - REAL , INTENT(IN) :: DT !time step (s) - REAL , INTENT(IN) :: JULIAN !Julian day of year (fractional) ( 0 <= JULIAN < YEARLEN ) - -! input and output - - REAL , INTENT(INOUT) :: GDD !growing degress days - -! output - - INTEGER , INTENT(OUT) :: IPA !Planting index index(0=off, 1=on) - INTEGER , INTENT(OUT) :: IHA !Havestindex(0=on,1=off) - INTEGER , INTENT(OUT) :: PGS !Plant growth stage(1=S1,2=S2,3=S3) - -!local - - REAL :: GDDDAY !gap bewtween GDD and GDD8 - REAL :: DAYOFS2 !DAYS in stage2 - REAL :: TDIFF !temperature difference for growing degree days calculation - REAL :: TC - - TC = T2M - 273.15 - -!Havestindex(0=on,1=off) - - IPA = 1 - IHA = 1 - -!turn on/off the planting - - IF(JULIAN < parameters%PLTDAY) IPA = 0 - -!turn on/off the harvesting - IF(JULIAN >= parameters%HSDAY) IHA = 0 - -!Calculate the growing degree days - - IF(TC < parameters%GDDTBASE) THEN - TDIFF = 0.0 - ELSEIF(TC >= parameters%GDDTCUT) THEN - TDIFF = parameters%GDDTCUT - parameters%GDDTBASE - ELSE - TDIFF = TC - parameters%GDDTBASE - END IF - - GDD = (GDD + TDIFF * DT / 86400.0) * IPA * IHA - - GDDDAY = GDD - - ! Decide corn growth stage, based on Hybrid-Maize - ! PGS = 1 : Before planting - ! PGS = 2 : from tassel initiation to silking - ! PGS = 3 : from silking to effective grain filling - ! PGS = 4 : from effective grain filling to pysiological maturity - ! PGS = 5 : GDDM=1389 - ! PGS = 6 : - ! PGS = 7 : - ! PGS = 8 : - ! GDDM = 1389 - ! GDDM = 1555 - ! GDDSK = 0.41*GDDM +145.4+150 !from hybrid-maize - ! GDDS1 = ((GDDSK-96)/38.9-4)*21 - ! GDDS1 = 0.77*GDDSK - ! GDDS3 = GDDSK+170 - ! GDDS3 = 170 - - PGS = 1 ! MB: set PGS = 1 (for initialization during growing season when no GDD) - - IF(GDDDAY > 0.0) PGS = 2 - - IF(GDDDAY >= parameters%GDDS1) PGS = 3 - - IF(GDDDAY >= parameters%GDDS2) PGS = 4 - - IF(GDDDAY >= parameters%GDDS3) PGS = 5 - - IF(GDDDAY >= parameters%GDDS4) PGS = 6 - - IF(GDDDAY >= parameters%GDDS5) PGS = 7 - - IF(JULIAN >= parameters%HSDAY) PGS = 8 - - IF(JULIAN < parameters%PLTDAY) PGS = 1 - -END SUBROUTINE GROWING_GDD - -!== begin psn_crop ================================================================================= - -SUBROUTINE PSN_CROP ( parameters, & !in - SOLDN, XLAI,T2M, & !in - PSNCROP ) !out -!=================================================================================================== - -! input - - type (noahmp_parameters), intent(in) :: parameters - REAL , INTENT(IN) :: SOLDN ! downward solar radiation - REAL , INTENT(IN) :: XLAI ! LAI - REAL , INTENT(IN) :: T2M ! air temp - REAL , INTENT(OUT) :: PSNCROP ! - -!local - - REAL :: PAR ! photosynthetically active radiation (w/m2) 1 W m-2 = 0.0864 MJ m-2 day-1 - REAL :: Amax ! Maximum CO2 assimulation rate g/co2/s - REAL :: L1 ! Three Gaussian method - REAL :: L2 ! Three Gaussian method - REAL :: L3 ! Three Gaussian method - REAL :: I1 ! Three Gaussian method - REAL :: I2 ! Three Gaussian method - REAL :: I3 ! Three Gaussian method - REAL :: A1 ! Three Gaussian method - REAL :: A2 ! Three Gaussian method - REAL :: A3 ! Three Gaussian method - REAL :: A ! CO2 Assimulation - REAL :: TC - - TC = T2M - 273.15 - - PAR = parameters%I2PAR * SOLDN * 0.0036 !w to MJ m-2 - - IF(TC < parameters%TASSIM0) THEN - Amax = 1E-10 - ELSEIF(TC >= parameters%TASSIM0 .and. TC < parameters%TASSIM1) THEN - Amax = (TC - parameters%TASSIM0) * parameters%Aref / (parameters%TASSIM1 - parameters%TASSIM0) - ELSEIF(TC >= parameters%TASSIM1 .and. TC < parameters%TASSIM2) THEN - Amax = parameters%Aref - ELSE - Amax= parameters%Aref - 0.2 * (T2M - parameters%TASSIM2) - ENDIF - - Amax = max(amax,0.01) - - IF(XLAI <= 0.05) THEN - L1 = 0.1127 * 0.05 !use initial LAI(0.05), avoid error - L2 = 0.5 * 0.05 - L3 = 0.8873 * 0.05 - ELSE - L1 = 0.1127 * XLAI - L2 = 0.5 * XLAI - L3 = 0.8873 * XLAI - END IF - - I1 = parameters%k * PAR * exp(-parameters%k * L1) - I2 = parameters%k * PAR * exp(-parameters%k * L2) - I3 = parameters%k * PAR * exp(-parameters%k * L3) - - I1 = max(I1,1E-10) - I2 = max(I2,1E-10) - I3 = max(I3,1E-10) - - A1 = Amax * (1 - exp(-parameters%epsi * I1 / Amax)) - A2 = Amax * (1 - exp(-parameters%epsi * I2 / Amax)) * 1.6 - A3 = Amax * (1 - exp(-parameters%epsi * I3 / Amax)) - - IF (XLAI <= 0.05) THEN - A = (A1+A2+A3) / 3.6 * 0.05 - ELSEIF (XLAI > 0.05 .and. XLAI <= 4.0) THEN - A = (A1+A2+A3) / 3.6 * XLAI - ELSE - A = (A1+A2+A3) / 3.6 * 4 - END IF - - A = A * parameters%PSNRF ! Attainable - - PSNCROP = 6.313 * A ! (1/44) * 1000000)/3600 = 6.313 - -END SUBROUTINE PSN_CROP - -!== begin bvocflux ================================================================================= - -! SUBROUTINE BVOCFLUX(parameters,VOCFLX, VEGTYP, VEGFRAC, APAR, TV ) -! -! ------------------------------------------------------------------------------------------ -! implicit none -! ------------------------------------------------------------------------------------------ -! -! ------------------------ code history --------------------------- -! source file: BVOC -! purpose: BVOC emissions -! DESCRIPTION: -! Volatile organic compound emission -! This code simulates volatile organic compound emissions -! following the algorithm presented in Guenther, A., 1999: Modeling -! Biogenic Volatile Organic Compound Emissions to the Atmosphere. In -! Reactive Hydrocarbons in the Atmosphere, Ch. 3 -! This model relies on the assumption that 90% of isoprene and monoterpene -! emissions originate from canopy foliage: -! E = epsilon * gamma * density * delta -! The factor delta (longterm activity factor) applies to isoprene emission -! from deciduous plants only. We neglect this factor at the present time. -! This factor is discussed in Guenther (1997). -! Subroutine written to operate at the patch level. -! IN FINAL IMPLEMENTATION, REMEMBER: -! 1. may wish to call this routine only as freq. as rad. calculations -! 2. may wish to place epsilon values directly in pft-physiology file -! ------------------------ input/output variables ----------------- -! input -! integer ,INTENT(IN) :: vegtyp !vegetation type -! real ,INTENT(IN) :: vegfrac !green vegetation fraction [0.0-1.0] -! real ,INTENT(IN) :: apar !photosynthesis active energy by canopy (w/m2) -! real ,INTENT(IN) :: tv !vegetation canopy temperature (k) -! -! output -! real ,INTENT(OUT) :: vocflx(5) ! voc fluxes [ug C m-2 h-1] -! -! Local Variables -! -! real, parameter :: R = 8.314 ! univ. gas constant [J K-1 mol-1] -! real, parameter :: alpha = 0.0027 ! empirical coefficient -! real, parameter :: cl1 = 1.066 ! empirical coefficient -! real, parameter :: ct1 = 95000.0 ! empirical coefficient [J mol-1] -! real, parameter :: ct2 = 230000.0 ! empirical coefficient [J mol-1] -! real, parameter :: ct3 = 0.961 ! empirical coefficient -! real, parameter :: tm = 314.0 ! empirical coefficient [K] -! real, parameter :: tstd = 303.0 ! std temperature [K] -! real, parameter :: bet = 0.09 ! beta empirical coefficient [K-1] -! -! integer ivoc ! do-loop index -! integer ityp ! do-loop index -! real epsilon(5) -! real gamma(5) -! real density -! real elai -! real par,cl,reciprod,ct -! -! epsilon : -! -! do ivoc = 1, 5 -! epsilon(ivoc) = parameters%eps(VEGTYP,ivoc) -! end do -! -! gamma : Activity factor. Units [dimensionless] -! -! reciprod = 1. / (R * tv * tstd) -! ct = exp(ct1 * (tv - tstd) * reciprod) / & -! (ct3 + exp(ct2 * (tv - tm) * reciprod)) -! -! par = apar * 4.6 ! (multiply w/m2 by 4.6 to get umol/m2/s) -! cl = alpha * cl1 * par * (1. + alpha * alpha * par * par)**(-0.5) -! -! gamma(1) = cl * ct ! for isoprenes -! -! do ivoc = 2, 5 -! gamma(ivoc) = exp(bet * (tv - tstd)) -! end do -! -! Foliage density -! -! transform vegfrac to lai -! -! elai = max(0.0,-6.5/2.5*alog((1.-vegfrac))) -! density = elai / (parameters%slarea(VEGTYP) * 0.5) -! -! calculate the voc flux -! -! do ivoc = 1, 5 -! vocflx(ivoc) = epsilon(ivoc) * gamma(ivoc) * density -! end do -! -! end subroutine bvocflux -! ================================================================================================== - -!***************** SUBROUTINES FOR GECROS CROP SIMULATION *************** -!*----------------------------------------------------------------------* -!* SUBROUTINE EMERG * -!* Purpose: This subroutine calculates germination and emergence of * -!* the crop * -!* * -!* FORMAL PARAMETERS: (I=input,O=output,C=control,IN=init,T=time) * -!* * -!* name type meaning units class * -!* ---- ---- ------- ----- ----- * -!* nowdate C12 Actual date dd.mm.yy I * -!* DT R4 Time step of integration s I * -!* DD R4 Drilling depth cm I * -!* TSOIL R4 Soil temperature in first layer K I * -!* TBEM R4 Temperature threshold oC I * -!* EMA R4 Intercept of function for emergence oC I * -!* EMB R4 Slope of function for emergence oC I * -!* TTEM R4 Cumulative temperature sum for emergence oC I/O * -!* EMERGENCE LOG Flag for emergence - I/O * -!* STATE_GECROS(41) = emerged yes/no * -!* STATE_GECROS(43) = TTEM * -!*----------------------------------------------------------------------* - -SUBROUTINE EMERG(DT, TSOIL, DD, TBEM, EMA, EMB, STATE_GECROS) - IMPLICIT NONE - REAL, INTENT(IN) :: DT, TSOIL, DD, TBEM, EMA, EMB - REAL, DIMENSION(1:60), INTENT(INOUT) :: STATE_GECROS - REAL :: EMTH, TINT - SAVE - - IF ((TSOIL-273.15).LT.TBEM) THEN - ELSE - STATE_GECROS(43) = STATE_GECROS(43) + (TSOIL-273.15-TBEM)/(86400.0/DT) - ENDIF - - EMTH = EMA + EMB*DD - - IF (STATE_GECROS(43).GT.EMTH) THEN - STATE_GECROS(41)=1.0 - ELSE - STATE_GECROS(41)=-1.0 - ENDIF - - RETURN -END SUBROUTINE EMERG - -! ********************************* end of carbon subroutines ***************************** -! ================================================================================================== - -!== begin noahmp_options =========================================================================== - - subroutine noahmp_options( idveg ,iopt_crs ,iopt_btr ,iopt_run ,iopt_sfc ,iopt_frz , & - iopt_inf ,iopt_rad ,iopt_alb ,iopt_snf ,iopt_tbot ,iopt_stc , & - iopt_rsf ,iopt_soil ,iopt_pedo ,iopt_crop ,iopt_irr ,iopt_irrm, & - iopt_infdv, iopt_tdrn) - - implicit none - - INTEGER, INTENT(IN) :: idveg !dynamic vegetation (1 -> off ; 2 -> on) with opt_crs = 1 - INTEGER, INTENT(IN) :: iopt_crs !canopy stomatal resistance (1-> Ball-Berry; 2->Jarvis) - INTEGER, INTENT(IN) :: iopt_btr !soil moisture factor for stomatal resistance (1-> Noah; 2-> CLM; 3-> SSiB) - INTEGER, INTENT(IN) :: iopt_run !runoff and groundwater (1->SIMGM; 2->SIMTOP; 3->Schaake96; 4->BATS) - INTEGER, INTENT(IN) :: iopt_sfc !surface layer drag coeff (CH & CM) (1->M-O; 2->Chen97) - 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_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) - ! 1 -> semi-implicit; 2 -> full implicit (original Noah) - INTEGER, INTENT(IN) :: iopt_rsf !surface resistance (1->Sakaguchi/Zeng; 2->Seller; 3->mod Sellers; 4->1+snow) - INTEGER, INTENT(IN) :: iopt_soil !soil parameters set-up option - INTEGER, INTENT(IN) :: iopt_pedo !pedo-transfer function (1->Saxton and Rawls) - INTEGER, INTENT(IN) :: iopt_crop !crop model option (0->none; 1->Liu et al.; 2->Gecros) - INTEGER, INTENT(IN) :: iopt_irr ! 0 -> No irrigation; - ! 1 -> Irrigation ON; - ! 2 -> irrigation trigger based on crop season Planting and harvesting dates; - ! 3 -> irrigation trigger based on LAI threshold - INTEGER, INTENT(IN) :: iopt_irrm ! 0 -> all methods ON based on geo_em inputs - ! 1 -> sprinkler ON - ! 2 -> micro/drip ON - ! 3 -> flood irrigation ON - INTEGER, INTENT(IN) :: iopt_infdv!infiltration options for dynamic VIC (1->Philip; 2-> Green-Ampt;3->Smith-Parlange) - INTEGER, INTENT(IN) :: iopt_tdrn !tile drainage (0->none; 1-> simple 2->Hooghoudt's) -! ------------------------------------------------------------------------------------------------- - - dveg = idveg - - opt_crs = iopt_crs - opt_btr = iopt_btr - opt_run = iopt_run - opt_sfc = iopt_sfc - opt_frz = iopt_frz - opt_inf = iopt_inf - opt_rad = iopt_rad - opt_alb = iopt_alb - opt_snf = iopt_snf - opt_tbot = iopt_tbot - opt_stc = iopt_stc - opt_rsf = iopt_rsf - opt_soil = iopt_soil - opt_pedo = iopt_pedo - opt_crop = iopt_crop - opt_irr = iopt_irr - opt_irrm = iopt_irrm - opt_infdv= iopt_infdv - opt_tdrn = iopt_tdrn - - end subroutine noahmp_options - -END MODULE MODULE_SF_NOAHMPLSM - -MODULE NOAHMP_TABLES - - IMPLICIT NONE - - INTEGER, PRIVATE, PARAMETER :: MVT = 27 - INTEGER, PRIVATE, PARAMETER :: MBAND = 2 - INTEGER, PRIVATE, PARAMETER :: MSC = 8 - INTEGER, PRIVATE, PARAMETER :: MAX_SOILTYP = 30 - INTEGER, PRIVATE, PARAMETER :: NCROP = 5 - INTEGER, PRIVATE, PARAMETER :: NSTAGE = 8 - -! MPTABLE.TBL vegetation parameters - - INTEGER :: ISURBAN_TABLE - INTEGER :: ISWATER_TABLE - INTEGER :: ISBARREN_TABLE - INTEGER :: ISICE_TABLE - INTEGER :: ISCROP_TABLE - INTEGER :: EBLFOREST_TABLE - INTEGER :: NATURAL_TABLE - INTEGER :: LCZ_1_TABLE - INTEGER :: LCZ_2_TABLE - INTEGER :: LCZ_3_TABLE - INTEGER :: LCZ_4_TABLE - INTEGER :: LCZ_5_TABLE - INTEGER :: LCZ_6_TABLE - INTEGER :: LCZ_7_TABLE - INTEGER :: LCZ_8_TABLE - INTEGER :: LCZ_9_TABLE - INTEGER :: LCZ_10_TABLE - INTEGER :: LCZ_11_TABLE - - REAL :: CH2OP_TABLE(MVT) !maximum intercepted h2o per unit lai+sai (mm) - REAL :: DLEAF_TABLE(MVT) !characteristic leaf dimension (m) - REAL :: Z0MVT_TABLE(MVT) !momentum roughness length (m) - REAL :: HVT_TABLE(MVT) !top of canopy (m) - REAL :: HVB_TABLE(MVT) !bottom of canopy (m) - REAL :: DEN_TABLE(MVT) !tree density (no. of trunks per m2) - REAL :: RC_TABLE(MVT) !tree crown radius (m) - REAL :: MFSNO_TABLE(MVT) !snowmelt curve parameter () - REAL :: SCFFAC_TABLE(MVT) !snow cover factor (m) (replace original hard-coded 2.5*z0 in SCF formulation) - REAL :: SAIM_TABLE(MVT,12) !monthly stem area index, one-sided - REAL :: LAIM_TABLE(MVT,12) !monthly leaf area index, one-sided - REAL :: SLA_TABLE(MVT) !single-side leaf area per Kg [m2/kg] - REAL :: DILEFC_TABLE(MVT) !coeficient for leaf stress death [1/s] - REAL :: DILEFW_TABLE(MVT) !coeficient for leaf stress death [1/s] - REAL :: FRAGR_TABLE(MVT) !fraction of growth respiration !original was 0.3 - REAL :: LTOVRC_TABLE(MVT) !leaf turnover [1/s] - - REAL :: C3PSN_TABLE(MVT) !photosynthetic pathway: 0. = c4, 1. = c3 - REAL :: KC25_TABLE(MVT) !co2 michaelis-menten constant at 25c (pa) - REAL :: AKC_TABLE(MVT) !q10 for kc25 - REAL :: KO25_TABLE(MVT) !o2 michaelis-menten constant at 25c (pa) - REAL :: AKO_TABLE(MVT) !q10 for ko25 - REAL :: VCMX25_TABLE(MVT) !maximum rate of carboxylation at 25c (umol co2/m**2/s) - REAL :: AVCMX_TABLE(MVT) !q10 for vcmx25 - REAL :: BP_TABLE(MVT) !minimum leaf conductance (umol/m**2/s) - REAL :: MP_TABLE(MVT) !slope of conductance-to-photosynthesis relationship - REAL :: QE25_TABLE(MVT) !quantum efficiency at 25c (umol co2 / umol photon) - REAL :: AQE_TABLE(MVT) !q10 for qe25 - REAL :: RMF25_TABLE(MVT) !leaf maintenance respiration at 25c (umol co2/m**2/s) - REAL :: RMS25_TABLE(MVT) !stem maintenance respiration at 25c (umol co2/kg bio/s) - REAL :: RMR25_TABLE(MVT) !root maintenance respiration at 25c (umol co2/kg bio/s) - REAL :: ARM_TABLE(MVT) !q10 for maintenance respiration - REAL :: FOLNMX_TABLE(MVT) !foliage nitrogen concentration when f(n)=1 (%) - REAL :: TMIN_TABLE(MVT) !minimum temperature for photosynthesis (k) - - REAL :: XL_TABLE(MVT) !leaf/stem orientation index - REAL :: RHOL_TABLE(MVT,MBAND) !leaf reflectance: 1=vis, 2=nir - REAL :: RHOS_TABLE(MVT,MBAND) !stem reflectance: 1=vis, 2=nir - REAL :: TAUL_TABLE(MVT,MBAND) !leaf transmittance: 1=vis, 2=nir - REAL :: TAUS_TABLE(MVT,MBAND) !stem transmittance: 1=vis, 2=nir - - REAL :: MRP_TABLE(MVT) !microbial respiration parameter (umol co2 /kg c/ s) - REAL :: CWPVT_TABLE(MVT) !empirical canopy wind parameter - - REAL :: WRRAT_TABLE(MVT) !wood to non-wood ratio - REAL :: WDPOOL_TABLE(MVT) !wood pool (switch 1 or 0) depending on woody or not [-] - REAL :: TDLEF_TABLE(MVT) !characteristic T for leaf freezing [K] - - REAL :: NROOT_TABLE(MVT) !number of soil layers with root present - REAL :: RGL_TABLE(MVT) !Parameter used in radiation stress function - REAL :: RS_TABLE(MVT) !Minimum stomatal resistance [s m-1] - REAL :: HS_TABLE(MVT) !Parameter used in vapor pressure deficit function - REAL :: TOPT_TABLE(MVT) !Optimum transpiration air temperature [K] - REAL :: RSMAX_TABLE(MVT) !Maximal stomatal resistance [s m-1] - -! SOILPARM.TBL parameters - - INTEGER :: SLCATS - - REAL :: BEXP_TABLE(MAX_SOILTYP) !maximum intercepted h2o per unit lai+sai (mm) - REAL :: SMCDRY_TABLE(MAX_SOILTYP) !characteristic leaf dimension (m) - REAL :: F1_TABLE(MAX_SOILTYP) !momentum roughness length (m) - REAL :: SMCMAX_TABLE(MAX_SOILTYP) !top of canopy (m) - REAL :: SMCREF_TABLE(MAX_SOILTYP) !bottom of canopy (m) - REAL :: PSISAT_TABLE(MAX_SOILTYP) !tree density (no. of trunks per m2) - REAL :: DKSAT_TABLE(MAX_SOILTYP) !tree crown radius (m) - REAL :: DWSAT_TABLE(MAX_SOILTYP) !monthly stem area index, one-sided - REAL :: SMCWLT_TABLE(MAX_SOILTYP) !monthly leaf area index, one-sided - REAL :: QUARTZ_TABLE(MAX_SOILTYP) !single-side leaf area per Kg [m2/kg] - REAL :: BVIC_TABLE(MAX_SOILTYP) !VIC model infiltration parameter (-) for opt_run=6 - REAL :: AXAJ_TABLE(MAX_SOILTYP) !Xinanjiang: Tension water distribution inflection parameter [-] for opt_run=7 - REAL :: BXAJ_TABLE(MAX_SOILTYP) !Xinanjiang: Tension water distribution shape parameter [-] for opt_run=7 - REAL :: XXAJ_TABLE(MAX_SOILTYP) !Xinanjiang: Free water distribution shape parameter [-] for opt_run=7 - REAL :: BDVIC_TABLE(MAX_SOILTYP) !VIC model infiltration parameter (-) - REAL :: GDVIC_TABLE(MAX_SOILTYP) !mean capilary drive (m) - REAL :: BBVIC_TABLE(MAX_SOILTYP) !heterogeniety parameter for DVIC infiltration [-] - -! GENPARM.TBL parameters - - REAL :: SLOPE_TABLE(9) !slope factor for soil drainage - - REAL :: CSOIL_TABLE !Soil heat capacity [J m-3 K-1] - REAL :: REFDK_TABLE !Parameter in the surface runoff parameterization - REAL :: REFKDT_TABLE !Parameter in the surface runoff parameterization - REAL :: FRZK_TABLE !Frozen ground parameter - REAL :: ZBOT_TABLE !Depth [m] of lower boundary soil temperature - REAL :: CZIL_TABLE !Parameter used in the calculation of the roughness length for heat - -! MPTABLE.TBL radiation parameters - - REAL :: ALBSAT_TABLE(MSC,MBAND) !saturated soil albedos: 1=vis, 2=nir - REAL :: ALBDRY_TABLE(MSC,MBAND) !dry soil albedos: 1=vis, 2=nir - REAL :: ALBICE_TABLE(MBAND) !albedo land ice: 1=vis, 2=nir - REAL :: ALBLAK_TABLE(MBAND) !albedo frozen lakes: 1=vis, 2=nir - REAL :: OMEGAS_TABLE(MBAND) !two-stream parameter omega for snow - REAL :: BETADS_TABLE !two-stream parameter betad for snow - REAL :: BETAIS_TABLE !two-stream parameter betad for snow - REAL :: EG_TABLE(2) !emissivity - -! MPTABLE.TBL global parameters - - REAL :: CO2_TABLE !co2 partial pressure - REAL :: O2_TABLE !o2 partial pressure - REAL :: TIMEAN_TABLE !gridcell mean topgraphic index (global mean) - REAL :: FSATMX_TABLE !maximum surface saturated fraction (global mean) - REAL :: Z0SNO_TABLE !snow surface roughness length (m) (0.002) - REAL :: SSI_TABLE !liquid water holding capacity for snowpack (m3/m3) (0.03) - REAL :: SNOW_RET_FAC_TABLE !snowpack water release timescale factor (1/s) - REAL :: SNOW_EMIS_TABLE!snow emissivity - REAL :: SWEMX_TABLE !new snow mass to fully cover old snow (mm) - REAL :: TAU0_TABLE !tau0 from Yang97 eqn. 10a - REAL :: GRAIN_GROWTH_TABLE !growth from vapor diffusion Yang97 eqn. 10b - REAL :: EXTRA_GROWTH_TABLE !extra growth near freezing Yang97 eqn. 10c - REAL :: DIRT_SOOT_TABLE !dirt and soot term Yang97 eqn. 10d - REAL :: BATS_COSZ_TABLE !zenith angle snow albedo adjustment; b in Yang97 eqn. 15 - REAL :: BATS_VIS_NEW_TABLE !new snow visible albedo - REAL :: BATS_NIR_NEW_TABLE !new snow NIR albedo - REAL :: BATS_VIS_AGE_TABLE !age factor for diffuse visible snow albedo Yang97 eqn. 17 - REAL :: BATS_NIR_AGE_TABLE !age factor for diffuse NIR snow albedo Yang97 eqn. 18 - REAL :: BATS_VIS_DIR_TABLE !cosz factor for direct visible snow albedo Yang97 eqn. 15 - REAL :: BATS_NIR_DIR_TABLE !cosz factor for direct NIR snow albedo Yang97 eqn. 16 - REAL :: RSURF_SNOW_TABLE !surface resistance for snow(s/m) - REAL :: RSURF_EXP_TABLE !exponent in the shape parameter for soil resistance option 1 - -! MPTABLE.TBL irrigation parameters - - REAL :: IRR_FRAC_TABLE ! irrigation Fraction - INTEGER :: IRR_HAR_TABLE ! number of days before harvest date to stop irrigation - REAL :: IRR_LAI_TABLE ! Minimum lai to trigger irrigation - REAL :: IRR_MAD_TABLE ! management allowable deficit (0-1) - REAL :: FILOSS_TABLE ! fraction of flood irrigation loss (0-1) - REAL :: SPRIR_RATE_TABLE ! mm/h, sprinkler irrigation rate - REAL :: MICIR_RATE_TABLE ! mm/h, micro irrigation rate - REAL :: FIRTFAC_TABLE ! flood application rate factor - REAL :: IR_RAIN_TABLE ! maximum precipitation to stop irrigation trigger - -! MPTABLE.TBL crop parameters - - INTEGER :: DEFAULT_CROP_TABLE ! Default crop index - INTEGER :: PLTDAY_TABLE(NCROP) ! Planting date - INTEGER :: HSDAY_TABLE(NCROP) ! Harvest date - REAL :: PLANTPOP_TABLE(NCROP) ! Plant density [per ha] - used? - REAL :: IRRI_TABLE(NCROP) ! Irrigation strategy 0= non-irrigation 1=irrigation (no water-stress) - - REAL :: GDDTBASE_TABLE(NCROP) ! Base temperature for GDD accumulation [C] - REAL :: GDDTCUT_TABLE(NCROP) ! Upper temperature for GDD accumulation [C] - REAL :: GDDS1_TABLE(NCROP) ! GDD from seeding to emergence - REAL :: GDDS2_TABLE(NCROP) ! GDD from seeding to initial vegetative - REAL :: GDDS3_TABLE(NCROP) ! GDD from seeding to post vegetative - REAL :: GDDS4_TABLE(NCROP) ! GDD from seeding to intial reproductive - REAL :: GDDS5_TABLE(NCROP) ! GDD from seeding to pysical maturity - - REAL :: C3PSNI_TABLE(NCROP) !photosynthetic pathway: 0. = c4, 1. = c3 ! Zhe Zhang 2020-07-03 - REAL :: KC25I_TABLE(NCROP) !co2 michaelis-menten constant at 25c (pa) - REAL :: AKCI_TABLE(NCROP) !q10 for kc25 - REAL :: KO25I_TABLE(NCROP) !o2 michaelis-menten constant at 25c (pa) - REAL :: AKOI_TABLE(NCROP) !q10 for ko25 - REAL :: VCMX25I_TABLE(NCROP) !maximum rate of carboxylation at 25c (umol co2/m**2/s) - REAL :: AVCMXI_TABLE(NCROP) !q10 for vcmx25 - REAL :: BPI_TABLE(NCROP) !minimum leaf conductance (umol/m**2/s) - REAL :: MPI_TABLE(NCROP) !slope of conductance-to-photosynthesis relationship - REAL :: QE25I_TABLE(NCROP) !quantum efficiency at 25c (umol co2 / umol photon) - REAL :: FOLNMXI_TABLE(NCROP) !foliage nitrogen concentration when - - INTEGER :: C3C4_TABLE(NCROP) ! photosynthetic pathway: 1. = c3 2. = c4 - REAL :: AREF_TABLE(NCROP) ! reference maximum CO2 assimulation rate - REAL :: PSNRF_TABLE(NCROP) ! CO2 assimulation reduction factor(0-1) (caused by non-modeling part,e.g.pest,weeds) - REAL :: I2PAR_TABLE(NCROP) ! Fraction of incoming solar radiation to photosynthetically active radiation - REAL :: TASSIM0_TABLE(NCROP) ! Minimum temperature for CO2 assimulation [C] - REAL :: TASSIM1_TABLE(NCROP) ! CO2 assimulation linearly increasing until temperature reaches T1 [C] - REAL :: TASSIM2_TABLE(NCROP) ! CO2 assmilation rate remain at Aref until temperature reaches T2 [C] - REAL :: K_TABLE(NCROP) ! light extinction coefficient - REAL :: EPSI_TABLE(NCROP) ! initial light use efficiency - - REAL :: Q10MR_TABLE(NCROP) ! q10 for maintainance respiration - REAL :: FOLN_MX_TABLE(NCROP) ! foliage nitrogen concentration when f(n)=1 (%) - REAL :: LEFREEZ_TABLE(NCROP) ! characteristic T for leaf freezing [K] - - REAL :: DILE_FC_TABLE(NCROP,NSTAGE) ! coeficient for temperature leaf stress death [1/s] - REAL :: DILE_FW_TABLE(NCROP,NSTAGE) ! coeficient for water leaf stress death [1/s] - REAL :: FRA_GR_TABLE(NCROP) ! fraction of growth respiration - - REAL :: LF_OVRC_TABLE(NCROP,NSTAGE) ! fraction of leaf turnover [1/s] - REAL :: ST_OVRC_TABLE(NCROP,NSTAGE) ! fraction of stem turnover [1/s] - REAL :: RT_OVRC_TABLE(NCROP,NSTAGE) ! fraction of root tunrover [1/s] - REAL :: LFMR25_TABLE(NCROP) ! leaf maintenance respiration at 25C [umol CO2/m**2 /s] - REAL :: STMR25_TABLE(NCROP) ! stem maintenance respiration at 25C [umol CO2/kg bio/s] - REAL :: RTMR25_TABLE(NCROP) ! root maintenance respiration at 25C [umol CO2/kg bio/s] - REAL :: GRAINMR25_TABLE(NCROP) ! grain maintenance respiration at 25C [umol CO2/kg bio/s] - - REAL :: LFPT_TABLE(NCROP,NSTAGE) ! fraction of carbohydrate flux to leaf - REAL :: STPT_TABLE(NCROP,NSTAGE) ! fraction of carbohydrate flux to stem - REAL :: RTPT_TABLE(NCROP,NSTAGE) ! fraction of carbohydrate flux to root - REAL :: GRAINPT_TABLE(NCROP,NSTAGE) ! fraction of carbohydrate flux to grain - REAL :: LFCT_TABLE(NCROP,NSTAGE) ! fraction of carbohydrate translocation from leaf to grain ! Zhe Zhang 2020-07-13 - REAL :: STCT_TABLE(NCROP,NSTAGE) ! stem to grain - REAL :: RTCT_TABLE(NCROP,NSTAGE) ! root to grain - REAL :: BIO2LAI_TABLE(NCROP) ! leaf are per living leaf biomass [m^2/kg] - -! tile drainage parameters - REAL :: TDSMCFAC_TABLE(MAX_SOILTYP) - REAL :: TD_DC_TABLE(MAX_SOILTYP) - INTEGER :: TD_DEPTH_TABLE(MAX_SOILTYP) - INTEGER :: DRAIN_LAYER_OPT_TABLE - REAL :: TD_DCOEF_TABLE(MAX_SOILTYP) - REAL :: TD_D_TABLE(MAX_SOILTYP) - REAL :: TD_ADEPTH_TABLE(MAX_SOILTYP) - REAL :: TD_RADI_TABLE(MAX_SOILTYP) - REAL :: TD_SPAC_TABLE(MAX_SOILTYP) - REAL :: TD_DDRAIN_TABLE(MAX_SOILTYP) - REAL :: KLAT_FAC_TABLE(MAX_SOILTYP) - -! MPTABLE.TBL optional parameters - - REAL :: sr2006_theta_1500t_a ! sand coefficient - REAL :: sr2006_theta_1500t_b ! clay coefficient - REAL :: sr2006_theta_1500t_c ! orgm coefficient - REAL :: sr2006_theta_1500t_d ! sand*orgm coefficient - REAL :: sr2006_theta_1500t_e ! clay*orgm coefficient - REAL :: sr2006_theta_1500t_f ! sand*clay coefficient - REAL :: sr2006_theta_1500t_g ! constant adjustment - - REAL :: sr2006_theta_1500_a ! theta_1500t coefficient - REAL :: sr2006_theta_1500_b ! constant adjustment - - REAL :: sr2006_theta_33t_a ! sand coefficient - REAL :: sr2006_theta_33t_b ! clay coefficient - REAL :: sr2006_theta_33t_c ! orgm coefficient - REAL :: sr2006_theta_33t_d ! sand*orgm coefficient - REAL :: sr2006_theta_33t_e ! clay*orgm coefficient - REAL :: sr2006_theta_33t_f ! sand*clay coefficient - REAL :: sr2006_theta_33t_g ! constant adjustment - - REAL :: sr2006_theta_33_a ! theta_33t*theta_33t coefficient - REAL :: sr2006_theta_33_b ! theta_33t coefficient - REAL :: sr2006_theta_33_c ! constant adjustment - - REAL :: sr2006_theta_s33t_a ! sand coefficient - REAL :: sr2006_theta_s33t_b ! clay coefficient - REAL :: sr2006_theta_s33t_c ! orgm coefficient - REAL :: sr2006_theta_s33t_d ! sand*orgm coefficient - REAL :: sr2006_theta_s33t_e ! clay*orgm coefficient - REAL :: sr2006_theta_s33t_f ! sand*clay coefficient - REAL :: sr2006_theta_s33t_g ! constant adjustment - - REAL :: sr2006_theta_s33_a ! theta_s33t coefficient - REAL :: sr2006_theta_s33_b ! constant adjustment - - REAL :: sr2006_psi_et_a ! sand coefficient - REAL :: sr2006_psi_et_b ! clay coefficient - REAL :: sr2006_psi_et_c ! theta_s33 coefficient - REAL :: sr2006_psi_et_d ! sand*theta_s33 coefficient - REAL :: sr2006_psi_et_e ! clay*theta_s33 coefficient - REAL :: sr2006_psi_et_f ! sand*clay coefficient - REAL :: sr2006_psi_et_g ! constant adjustment - - REAL :: sr2006_psi_e_a ! psi_et*psi_et coefficient - REAL :: sr2006_psi_e_b ! psi_et coefficient - REAL :: sr2006_psi_e_c ! constant adjustment - - REAL :: sr2006_smcmax_a ! sand adjustment - REAL :: sr2006_smcmax_b ! constant adjustment - -CONTAINS - - subroutine read_mp_veg_parameters(DATASET_IDENTIFIER) - implicit none - character(len=*), intent(in) :: DATASET_IDENTIFIER - integer :: ierr - INTEGER :: IK,IM - logical :: file_named - - integer :: NVEG - character(len=256) :: VEG_DATASET_DESCRIPTION - - INTEGER :: ISURBAN - INTEGER :: ISWATER - INTEGER :: ISBARREN - INTEGER :: ISICE - INTEGER :: ISCROP - INTEGER :: EBLFOREST - INTEGER :: NATURAL - INTEGER :: LCZ_1 - INTEGER :: LCZ_2 - INTEGER :: LCZ_3 - INTEGER :: LCZ_4 - INTEGER :: LCZ_5 - INTEGER :: LCZ_6 - INTEGER :: LCZ_7 - INTEGER :: LCZ_8 - INTEGER :: LCZ_9 - INTEGER :: LCZ_10 - INTEGER :: LCZ_11 - - REAL, DIMENSION(MVT) :: SAI_JAN,SAI_FEB,SAI_MAR,SAI_APR,SAI_MAY,SAI_JUN, & - SAI_JUL,SAI_AUG,SAI_SEP,SAI_OCT,SAI_NOV,SAI_DEC - REAL, DIMENSION(MVT) :: LAI_JAN,LAI_FEB,LAI_MAR,LAI_APR,LAI_MAY,LAI_JUN, & - LAI_JUL,LAI_AUG,LAI_SEP,LAI_OCT,LAI_NOV,LAI_DEC - REAL, DIMENSION(MVT) :: RHOL_VIS, RHOL_NIR, RHOS_VIS, RHOS_NIR, & - TAUL_VIS, TAUL_NIR, TAUS_VIS, TAUS_NIR - REAL, DIMENSION(MVT) :: CH2OP, DLEAF, Z0MVT, HVT, HVB, DEN, RC, MFSNO, SCFFAC, XL, CWPVT, C3PSN, KC25, AKC, KO25, AKO, & - AVCMX, AQE, LTOVRC, DILEFC, DILEFW, RMF25 , SLA , FRAGR , TMIN , VCMX25, TDLEF , & - BP, MP, QE25, RMS25, RMR25, ARM, FOLNMX, WDPOOL, WRRAT, MRP, NROOT, RGL, RS, HS, TOPT, RSMAX, & - SLAREA, EPS1, EPS2, EPS3, EPS4, EPS5 - - NAMELIST / noahmp_usgs_veg_categories / VEG_DATASET_DESCRIPTION, NVEG - NAMELIST / noahmp_usgs_parameters / ISURBAN, ISWATER, ISBARREN, ISICE, ISCROP, EBLFOREST, NATURAL, & - LCZ_1,LCZ_2,LCZ_3,LCZ_4,LCZ_5,LCZ_6,LCZ_7,LCZ_8,LCZ_9,LCZ_10,LCZ_11,& - CH2OP, DLEAF, Z0MVT, HVT, HVB, DEN, RC, MFSNO, SCFFAC, XL, CWPVT, C3PSN, KC25, AKC, KO25, AKO, AVCMX, AQE, & - LTOVRC, DILEFC, DILEFW, RMF25 , SLA , FRAGR , TMIN , VCMX25, TDLEF , BP, MP, QE25, RMS25, RMR25, ARM, & - FOLNMX, WDPOOL, WRRAT, MRP, NROOT, RGL, RS, HS, TOPT, RSMAX, & - SAI_JAN, SAI_FEB, SAI_MAR, SAI_APR, SAI_MAY, SAI_JUN,SAI_JUL,SAI_AUG,SAI_SEP,SAI_OCT,SAI_NOV,SAI_DEC, & - LAI_JAN, LAI_FEB, LAI_MAR, LAI_APR, LAI_MAY, LAI_JUN,LAI_JUL,LAI_AUG,LAI_SEP,LAI_OCT,LAI_NOV,LAI_DEC, & - RHOL_VIS, RHOL_NIR, RHOS_VIS, RHOS_NIR, TAUL_VIS, TAUL_NIR, TAUS_VIS, TAUS_NIR, SLAREA, EPS1, EPS2, EPS3, EPS4, EPS5 - - NAMELIST / noahmp_modis_veg_categories / VEG_DATASET_DESCRIPTION, NVEG - NAMELIST / noahmp_modis_parameters / ISURBAN, ISWATER, ISBARREN, ISICE, ISCROP, EBLFOREST, NATURAL, & - LCZ_1,LCZ_2,LCZ_3,LCZ_4,LCZ_5,LCZ_6,LCZ_7,LCZ_8,LCZ_9,LCZ_10,LCZ_11, & - CH2OP, DLEAF, Z0MVT, HVT, HVB, DEN, RC, MFSNO, SCFFAC, XL, CWPVT, C3PSN, KC25, AKC, KO25, AKO, AVCMX, AQE, & - LTOVRC, DILEFC, DILEFW, RMF25 , SLA , FRAGR , TMIN , VCMX25, TDLEF , BP, MP, QE25, RMS25, RMR25, ARM, & - FOLNMX, WDPOOL, WRRAT, MRP, NROOT, RGL, RS, HS, TOPT, RSMAX, & - SAI_JAN, SAI_FEB, SAI_MAR, SAI_APR, SAI_MAY, SAI_JUN,SAI_JUL,SAI_AUG,SAI_SEP,SAI_OCT,SAI_NOV,SAI_DEC, & - LAI_JAN, LAI_FEB, LAI_MAR, LAI_APR, LAI_MAY, LAI_JUN,LAI_JUL,LAI_AUG,LAI_SEP,LAI_OCT,LAI_NOV,LAI_DEC, & - RHOL_VIS, RHOL_NIR, RHOS_VIS, RHOS_NIR, TAUL_VIS, TAUL_NIR, TAUS_VIS, TAUS_NIR, SLAREA, EPS1, EPS2, EPS3, EPS4, EPS5 - - ! Initialize our variables to bad values, so that if the namelist read fails, we come to a screeching halt as soon as we try to use anything. - CH2OP_TABLE = -1.0E36 - DLEAF_TABLE = -1.0E36 - Z0MVT_TABLE = -1.0E36 - HVT_TABLE = -1.0E36 - HVB_TABLE = -1.0E36 - DEN_TABLE = -1.0E36 - RC_TABLE = -1.0E36 - MFSNO_TABLE = -1.0E36 - SCFFAC_TABLE = -1.0E36 - RHOL_TABLE = -1.0E36 - RHOS_TABLE = -1.0E36 - TAUL_TABLE = -1.0E36 - TAUS_TABLE = -1.0E36 - XL_TABLE = -1.0E36 - CWPVT_TABLE = -1.0E36 - C3PSN_TABLE = -1.0E36 - KC25_TABLE = -1.0E36 - AKC_TABLE = -1.0E36 - KO25_TABLE = -1.0E36 - AKO_TABLE = -1.0E36 - AVCMX_TABLE = -1.0E36 - AQE_TABLE = -1.0E36 - LTOVRC_TABLE = -1.0E36 - DILEFC_TABLE = -1.0E36 - DILEFW_TABLE = -1.0E36 - RMF25_TABLE = -1.0E36 - SLA_TABLE = -1.0E36 - FRAGR_TABLE = -1.0E36 - TMIN_TABLE = -1.0E36 - VCMX25_TABLE = -1.0E36 - TDLEF_TABLE = -1.0E36 - BP_TABLE = -1.0E36 - MP_TABLE = -1.0E36 - QE25_TABLE = -1.0E36 - RMS25_TABLE = -1.0E36 - RMR25_TABLE = -1.0E36 - ARM_TABLE = -1.0E36 - FOLNMX_TABLE = -1.0E36 - WDPOOL_TABLE = -1.0E36 - WRRAT_TABLE = -1.0E36 - MRP_TABLE = -1.0E36 - SAIM_TABLE = -1.0E36 - LAIM_TABLE = -1.0E36 - NROOT_TABLE = -1.0E36 - RGL_TABLE = -1.0E36 - RS_TABLE = -1.0E36 - HS_TABLE = -1.0E36 - TOPT_TABLE = -1.0E36 - RSMAX_TABLE = -1.0E36 - ISURBAN_TABLE = -99999 - ISWATER_TABLE = -99999 - ISBARREN_TABLE = -99999 - ISICE_TABLE = -99999 - ISCROP_TABLE = -99999 - EBLFOREST_TABLE = -99999 - NATURAL_TABLE = -99999 - LCZ_1_TABLE = -99999 - LCZ_2_TABLE = -99999 - LCZ_3_TABLE = -99999 - LCZ_4_TABLE = -99999 - LCZ_5_TABLE = -99999 - LCZ_6_TABLE = -99999 - LCZ_7_TABLE = -99999 - LCZ_8_TABLE = -99999 - LCZ_9_TABLE = -99999 - LCZ_10_TABLE = -99999 - LCZ_11_TABLE = -99999 - - inquire( file='MPTABLE.TBL', exist=file_named ) - if ( file_named ) then - open(15, file="MPTABLE.TBL", status='old', form='formatted', action='read', iostat=ierr) - else - open(15, status='old', form='formatted', action='read', iostat=ierr) - end if - - if (ierr /= 0) then - write(*,'("WARNING: Cannot find file MPTABLE.TBL")') - call wrf_error_fatal("STOP in Noah-MP read_mp_veg_parameters") - endif - - if ( trim(DATASET_IDENTIFIER) == "USGS" ) then - read(15,noahmp_usgs_veg_categories) - read(15,noahmp_usgs_parameters) - else if ( trim(DATASET_IDENTIFIER) == "MODIFIED_IGBP_MODIS_NOAH" ) then - read(15,noahmp_modis_veg_categories) - read(15,noahmp_modis_parameters) - else - write(*,'("WARNING: Unrecognized DATASET_IDENTIFIER in subroutine READ_MP_VEG_PARAMETERS")') - write(*,'("WARNING: DATASET_IDENTIFIER = ''", A, "''")') trim(DATASET_IDENTIFIER) - call wrf_error_fatal("STOP in Noah-MP read_mp_veg_parameters") - endif - close(15) - - ISURBAN_TABLE = ISURBAN - ISWATER_TABLE = ISWATER - ISBARREN_TABLE = ISBARREN - ISICE_TABLE = ISICE - ISCROP_TABLE = ISCROP - EBLFOREST_TABLE = EBLFOREST - NATURAL_TABLE = NATURAL - LCZ_1_TABLE = LCZ_1 - LCZ_2_TABLE = LCZ_2 - LCZ_3_TABLE = LCZ_3 - LCZ_4_TABLE = LCZ_4 - LCZ_5_TABLE = LCZ_5 - LCZ_6_TABLE = LCZ_6 - LCZ_7_TABLE = LCZ_7 - LCZ_8_TABLE = LCZ_8 - LCZ_9_TABLE = LCZ_9 - LCZ_10_TABLE = LCZ_10 - LCZ_11_TABLE = LCZ_11 - - CH2OP_TABLE(1:NVEG) = CH2OP(1:NVEG) - DLEAF_TABLE(1:NVEG) = DLEAF(1:NVEG) - Z0MVT_TABLE(1:NVEG) = Z0MVT(1:NVEG) - HVT_TABLE(1:NVEG) = HVT(1:NVEG) - HVB_TABLE(1:NVEG) = HVB(1:NVEG) - DEN_TABLE(1:NVEG) = DEN(1:NVEG) - RC_TABLE(1:NVEG) = RC(1:NVEG) - MFSNO_TABLE(1:NVEG) = MFSNO(1:NVEG) - SCFFAC_TABLE(1:NVEG) = SCFFAC(1:NVEG) - XL_TABLE(1:NVEG) = XL(1:NVEG) - CWPVT_TABLE(1:NVEG) = CWPVT(1:NVEG) - C3PSN_TABLE(1:NVEG) = C3PSN(1:NVEG) - KC25_TABLE(1:NVEG) = KC25(1:NVEG) - AKC_TABLE(1:NVEG) = AKC(1:NVEG) - KO25_TABLE(1:NVEG) = KO25(1:NVEG) - AKO_TABLE(1:NVEG) = AKO(1:NVEG) - AVCMX_TABLE(1:NVEG) = AVCMX(1:NVEG) - AQE_TABLE(1:NVEG) = AQE(1:NVEG) - LTOVRC_TABLE(1:NVEG) = LTOVRC(1:NVEG) - DILEFC_TABLE(1:NVEG) = DILEFC(1:NVEG) - DILEFW_TABLE(1:NVEG) = DILEFW(1:NVEG) - RMF25_TABLE(1:NVEG) = RMF25(1:NVEG) - SLA_TABLE(1:NVEG) = SLA(1:NVEG) - FRAGR_TABLE(1:NVEG) = FRAGR(1:NVEG) - TMIN_TABLE(1:NVEG) = TMIN(1:NVEG) - VCMX25_TABLE(1:NVEG) = VCMX25(1:NVEG) - TDLEF_TABLE(1:NVEG) = TDLEF(1:NVEG) - BP_TABLE(1:NVEG) = BP(1:NVEG) - MP_TABLE(1:NVEG) = MP(1:NVEG) - QE25_TABLE(1:NVEG) = QE25(1:NVEG) - RMS25_TABLE(1:NVEG) = RMS25(1:NVEG) - RMR25_TABLE(1:NVEG) = RMR25(1:NVEG) - ARM_TABLE(1:NVEG) = ARM(1:NVEG) - FOLNMX_TABLE(1:NVEG) = FOLNMX(1:NVEG) - WDPOOL_TABLE(1:NVEG) = WDPOOL(1:NVEG) - WRRAT_TABLE(1:NVEG) = WRRAT(1:NVEG) - MRP_TABLE(1:NVEG) = MRP(1:NVEG) - NROOT_TABLE(1:NVEG) = NROOT(1:NVEG) - RGL_TABLE(1:NVEG) = RGL(1:NVEG) - RS_TABLE(1:NVEG) = RS(1:NVEG) - HS_TABLE(1:NVEG) = HS(1:NVEG) - TOPT_TABLE(1:NVEG) = TOPT(1:NVEG) - RSMAX_TABLE(1:NVEG) = RSMAX(1:NVEG) - - ! Put LAI and SAI into 2d array from monthly lines in table; same for canopy radiation properties - - SAIM_TABLE(1:NVEG, 1) = SAI_JAN(1:NVEG) - SAIM_TABLE(1:NVEG, 2) = SAI_FEB(1:NVEG) - SAIM_TABLE(1:NVEG, 3) = SAI_MAR(1:NVEG) - SAIM_TABLE(1:NVEG, 4) = SAI_APR(1:NVEG) - SAIM_TABLE(1:NVEG, 5) = SAI_MAY(1:NVEG) - SAIM_TABLE(1:NVEG, 6) = SAI_JUN(1:NVEG) - SAIM_TABLE(1:NVEG, 7) = SAI_JUL(1:NVEG) - SAIM_TABLE(1:NVEG, 8) = SAI_AUG(1:NVEG) - SAIM_TABLE(1:NVEG, 9) = SAI_SEP(1:NVEG) - SAIM_TABLE(1:NVEG,10) = SAI_OCT(1:NVEG) - SAIM_TABLE(1:NVEG,11) = SAI_NOV(1:NVEG) - SAIM_TABLE(1:NVEG,12) = SAI_DEC(1:NVEG) - - LAIM_TABLE(1:NVEG, 1) = LAI_JAN(1:NVEG) - LAIM_TABLE(1:NVEG, 2) = LAI_FEB(1:NVEG) - LAIM_TABLE(1:NVEG, 3) = LAI_MAR(1:NVEG) - LAIM_TABLE(1:NVEG, 4) = LAI_APR(1:NVEG) - LAIM_TABLE(1:NVEG, 5) = LAI_MAY(1:NVEG) - LAIM_TABLE(1:NVEG, 6) = LAI_JUN(1:NVEG) - LAIM_TABLE(1:NVEG, 7) = LAI_JUL(1:NVEG) - LAIM_TABLE(1:NVEG, 8) = LAI_AUG(1:NVEG) - LAIM_TABLE(1:NVEG, 9) = LAI_SEP(1:NVEG) - LAIM_TABLE(1:NVEG,10) = LAI_OCT(1:NVEG) - LAIM_TABLE(1:NVEG,11) = LAI_NOV(1:NVEG) - LAIM_TABLE(1:NVEG,12) = LAI_DEC(1:NVEG) - - RHOL_TABLE(1:NVEG,1) = RHOL_VIS(1:NVEG) !leaf reflectance: 1=vis, 2=nir - RHOL_TABLE(1:NVEG,2) = RHOL_NIR(1:NVEG) !leaf reflectance: 1=vis, 2=nir - RHOS_TABLE(1:NVEG,1) = RHOS_VIS(1:NVEG) !stem reflectance: 1=vis, 2=nir - RHOS_TABLE(1:NVEG,2) = RHOS_NIR(1:NVEG) !stem reflectance: 1=vis, 2=nir - TAUL_TABLE(1:NVEG,1) = TAUL_VIS(1:NVEG) !leaf transmittance: 1=vis, 2=nir - TAUL_TABLE(1:NVEG,2) = TAUL_NIR(1:NVEG) !leaf transmittance: 1=vis, 2=nir - TAUS_TABLE(1:NVEG,1) = TAUS_VIS(1:NVEG) !stem transmittance: 1=vis, 2=nir - TAUS_TABLE(1:NVEG,2) = TAUS_NIR(1:NVEG) !stem transmittance: 1=vis, 2=nir - - end subroutine read_mp_veg_parameters - - subroutine read_mp_soil_parameters() - IMPLICIT NONE - INTEGER :: IERR - CHARACTER*4 :: SLTYPE - INTEGER :: ITMP, NUM_SLOPE, LC - CHARACTER(len=256) :: message - logical :: file_named - - - ! Initialize our variables to bad values, so that if the namelist read fails, we come to a screeching halt as soon as we try to use anything. - BEXP_TABLE = -1.0E36 - SMCDRY_TABLE = -1.0E36 - F1_TABLE = -1.0E36 - SMCMAX_TABLE = -1.0E36 - SMCREF_TABLE = -1.0E36 - PSISAT_TABLE = -1.0E36 - DKSAT_TABLE = -1.0E36 - DWSAT_TABLE = -1.0E36 - SMCWLT_TABLE = -1.0E36 - QUARTZ_TABLE = -1.0E36 - SLOPE_TABLE = -1.0E36 - CSOIL_TABLE = -1.0E36 - REFDK_TABLE = -1.0E36 - REFKDT_TABLE = -1.0E36 - FRZK_TABLE = -1.0E36 - ZBOT_TABLE = -1.0E36 - CZIL_TABLE = -1.0E36 - BVIC_TABLE = -1.0E36 - AXAJ_TABLE = -1.0E36 - BXAJ_TABLE = -1.0E36 - XXAJ_TABLE = -1.0E36 - BDVIC_TABLE = -1.0E36 - GDVIC_TABLE = -1.0E36 - BBVIC_TABLE = -1.0E36 - -! -!-----READ IN SOIL PROPERTIES FROM SOILPARM.TBL -! - inquire( file='SOILPARM.TBL', exist=file_named ) - if ( file_named ) then - open(21, file='SOILPARM.TBL',form='formatted',status='old',iostat=ierr) - else - open(21, form='formatted',status='old',iostat=ierr) - end if - - IF(ierr .NE. 0 ) THEN - WRITE(message,FMT='(A)') 'module_sf_noahmpdrv.F: read_mp_soil_parameters: failure opening SOILPARM.TBL' - CALL wrf_error_fatal ( message ) - END IF - - READ (21,*) - READ (21,*) SLTYPE - READ (21,*) SLCATS - WRITE( message , * ) 'SOIL TEXTURE CLASSIFICATION = ', TRIM ( SLTYPE ) , ' FOUND', & - SLCATS,' CATEGORIES' - CALL wrf_message ( message ) - - DO LC=1,SLCATS - READ (21,*) ITMP,BEXP_TABLE(LC),SMCDRY_TABLE(LC),F1_TABLE(LC),SMCMAX_TABLE(LC), & - SMCREF_TABLE(LC),PSISAT_TABLE(LC),DKSAT_TABLE(LC), DWSAT_TABLE(LC), & - SMCWLT_TABLE(LC), QUARTZ_TABLE(LC),BVIC_TABLE(LC), AXAJ_TABLE(LC), & - BXAJ_TABLE(LC),XXAJ_TABLE(LC),BDVIC_TABLE(LC),BBVIC_TABLE(LC),GDVIC_TABLE(LC) - ENDDO - - CLOSE (21) - -! -!-----READ IN GENERAL PARAMETERS FROM GENPARM.TBL -! - inquire( file='GENPARM.TBL', exist=file_named ) - if ( file_named ) then - open(22, file='GENPARM.TBL',form='formatted',status='old',iostat=ierr) - else - open(22, form='formatted',status='old',iostat=ierr) - end if - - IF(ierr .NE. 0 ) THEN - WRITE(message,FMT='(A)') 'module_sf_noahlsm.F: read_mp_soil_parameters: failure opening GENPARM.TBL' - CALL wrf_error_fatal ( message ) - END IF - - READ (22,*) - READ (22,*) - READ (22,*) NUM_SLOPE - - DO LC=1,NUM_SLOPE - READ (22,*) SLOPE_TABLE(LC) - ENDDO - - READ (22,*) - READ (22,*) - READ (22,*) - READ (22,*) - READ (22,*) - READ (22,*) CSOIL_TABLE - READ (22,*) - READ (22,*) - READ (22,*) - READ (22,*) REFDK_TABLE - READ (22,*) - READ (22,*) REFKDT_TABLE - READ (22,*) - READ (22,*) FRZK_TABLE - READ (22,*) - READ (22,*) ZBOT_TABLE - READ (22,*) - READ (22,*) CZIL_TABLE - READ (22,*) - READ (22,*) - READ (22,*) - READ (22,*) - - CLOSE (22) - - end subroutine read_mp_soil_parameters - - subroutine read_mp_rad_parameters() - implicit none - integer :: ierr - logical :: file_named - - REAL :: ALBICE(MBAND),ALBLAK(MBAND),OMEGAS(MBAND),BETADS,BETAIS,EG(2) - REAL :: ALBSAT_VIS(MSC) - REAL :: ALBSAT_NIR(MSC) - REAL :: ALBDRY_VIS(MSC) - REAL :: ALBDRY_NIR(MSC) - - NAMELIST / noahmp_rad_parameters / ALBSAT_VIS,ALBSAT_NIR,ALBDRY_VIS,ALBDRY_NIR,ALBICE,ALBLAK,OMEGAS,BETADS,BETAIS,EG - - - ! Initialize our variables to bad values, so that if the namelist read fails, we come to a screeching halt as soon as we try to use anything. - ALBSAT_TABLE = -1.0E36 - ALBDRY_TABLE = -1.0E36 - ALBICE_TABLE = -1.0E36 - ALBLAK_TABLE = -1.0E36 - OMEGAS_TABLE = -1.0E36 - BETADS_TABLE = -1.0E36 - BETAIS_TABLE = -1.0E36 - EG_TABLE = -1.0E36 - - inquire( file='MPTABLE.TBL', exist=file_named ) - if ( file_named ) then - open(15, file="MPTABLE.TBL", status='old', form='formatted', action='read', iostat=ierr) - else - open(15, status='old', form='formatted', action='read', iostat=ierr) - end if - - if (ierr /= 0) then - write(*,'("WARNING: Cannot find file MPTABLE.TBL")') - call wrf_error_fatal("STOP in Noah-MP read_mp_rad_parameters") - endif - - read(15,noahmp_rad_parameters) - close(15) - - ALBSAT_TABLE(:,1) = ALBSAT_VIS ! saturated soil albedos: 1=vis, 2=nir - ALBSAT_TABLE(:,2) = ALBSAT_NIR ! saturated soil albedos: 1=vis, 2=nir - ALBDRY_TABLE(:,1) = ALBDRY_VIS ! dry soil albedos: 1=vis, 2=nir - ALBDRY_TABLE(:,2) = ALBDRY_NIR ! dry soil albedos: 1=vis, 2=nir - ALBICE_TABLE = ALBICE - ALBLAK_TABLE = ALBLAK - OMEGAS_TABLE = OMEGAS - BETADS_TABLE = BETADS - BETAIS_TABLE = BETAIS - EG_TABLE = EG - - end subroutine read_mp_rad_parameters - - subroutine read_mp_global_parameters() - implicit none - integer :: ierr - logical :: file_named - - REAL :: CO2,O2,TIMEAN,FSATMX,Z0SNO,SSI,SNOW_RET_FAC,SNOW_EMIS,& - SWEMX,TAU0,GRAIN_GROWTH,EXTRA_GROWTH,DIRT_SOOT,& - BATS_COSZ,BATS_VIS_NEW,BATS_NIR_NEW,BATS_VIS_AGE,BATS_NIR_AGE,BATS_VIS_DIR,BATS_NIR_DIR,& - RSURF_SNOW,RSURF_EXP - - NAMELIST / noahmp_global_parameters / CO2,O2,TIMEAN,FSATMX,Z0SNO,SSI,SNOW_RET_FAC,SNOW_EMIS,& - SWEMX,TAU0,GRAIN_GROWTH,EXTRA_GROWTH,DIRT_SOOT,& - BATS_COSZ,BATS_VIS_NEW,BATS_NIR_NEW,BATS_VIS_AGE,BATS_NIR_AGE,BATS_VIS_DIR,BATS_NIR_DIR,& - RSURF_SNOW,RSURF_EXP - - - ! Initialize our variables to bad values, so that if the namelist read fails, we come to a screeching halt as soon as we try to use anything. - CO2_TABLE = -1.0E36 - O2_TABLE = -1.0E36 - TIMEAN_TABLE = -1.0E36 - FSATMX_TABLE = -1.0E36 - Z0SNO_TABLE = -1.0E36 - SSI_TABLE = -1.0E36 -SNOW_RET_FAC_TABLE = -1.0E36 - SNOW_EMIS_TABLE = -1.0E36 - SWEMX_TABLE = -1.0E36 - TAU0_TABLE = -1.0E36 -GRAIN_GROWTH_TABLE = -1.0E36 -EXTRA_GROWTH_TABLE = -1.0E36 - DIRT_SOOT_TABLE = -1.0E36 - BATS_COSZ_TABLE = -1.0E36 -BATS_VIS_NEW_TABLE = -1.0E36 -BATS_NIR_NEW_TABLE = -1.0E36 -BATS_VIS_AGE_TABLE = -1.0E36 -BATS_NIR_AGE_TABLE = -1.0E36 -BATS_VIS_DIR_TABLE = -1.0E36 -BATS_NIR_DIR_TABLE = -1.0E36 -RSURF_SNOW_TABLE = -1.0E36 - RSURF_EXP_TABLE = -1.0E36 - - inquire( file='MPTABLE.TBL', exist=file_named ) - if ( file_named ) then - open(15, file="MPTABLE.TBL", status='old', form='formatted', action='read', iostat=ierr) - else - open(15, status='old', form='formatted', action='read', iostat=ierr) - end if - - if (ierr /= 0) then - write(*,'("WARNING: Cannot find file MPTABLE.TBL")') - call wrf_error_fatal("STOP in Noah-MP read_mp_global_parameters") - endif - - read(15,noahmp_global_parameters) - close(15) - - CO2_TABLE = CO2 - O2_TABLE = O2 - TIMEAN_TABLE = TIMEAN - FSATMX_TABLE = FSATMX - Z0SNO_TABLE = Z0SNO - SSI_TABLE = SSI -SNOW_RET_FAC_TABLE = SNOW_RET_FAC - SNOW_EMIS_TABLE = SNOW_EMIS - SWEMX_TABLE = SWEMX - TAU0_TABLE = TAU0 -GRAIN_GROWTH_TABLE = GRAIN_GROWTH -EXTRA_GROWTH_TABLE = EXTRA_GROWTH - DIRT_SOOT_TABLE = DIRT_SOOT - BATS_COSZ_TABLE = BATS_COSZ -BATS_VIS_NEW_TABLE = BATS_VIS_NEW -BATS_NIR_NEW_TABLE = BATS_NIR_NEW -BATS_VIS_AGE_TABLE = BATS_VIS_AGE -BATS_NIR_AGE_TABLE = BATS_NIR_AGE -BATS_VIS_DIR_TABLE = BATS_VIS_DIR -BATS_NIR_DIR_TABLE = BATS_NIR_DIR -RSURF_SNOW_TABLE = RSURF_SNOW - RSURF_EXP_TABLE = RSURF_EXP - - end subroutine read_mp_global_parameters - - subroutine read_mp_crop_parameters() - implicit none - integer :: ierr - logical :: file_named - - INTEGER :: DEFAULT_CROP - INTEGER, DIMENSION(NCROP) :: PLTDAY - INTEGER, DIMENSION(NCROP) :: HSDAY - REAL, DIMENSION(NCROP) :: PLANTPOP - REAL, DIMENSION(NCROP) :: IRRI - REAL, DIMENSION(NCROP) :: GDDTBASE - REAL, DIMENSION(NCROP) :: GDDTCUT - REAL, DIMENSION(NCROP) :: GDDS1 - REAL, DIMENSION(NCROP) :: GDDS2 - REAL, DIMENSION(NCROP) :: GDDS3 - REAL, DIMENSION(NCROP) :: GDDS4 - REAL, DIMENSION(NCROP) :: GDDS5 - REAL, DIMENSION(NCROP) :: C3PSN ! this session copied from stomata parameters Zhe Zhang 2020-07-13 - REAL, DIMENSION(NCROP) :: KC25 - REAL, DIMENSION(NCROP) :: AKC - REAL, DIMENSION(NCROP) :: KO25 - REAL, DIMENSION(NCROP) :: AKO - REAL, DIMENSION(NCROP) :: AVCMX - REAL, DIMENSION(NCROP) :: VCMX25 - REAL, DIMENSION(NCROP) :: BP - REAL, DIMENSION(NCROP) :: MP - REAL, DIMENSION(NCROP) :: FOLNMX - REAL, DIMENSION(NCROP) :: QE25 ! until here - INTEGER, DIMENSION(NCROP) :: C3C4 - REAL, DIMENSION(NCROP) :: AREF - REAL, DIMENSION(NCROP) :: PSNRF - REAL, DIMENSION(NCROP) :: I2PAR - REAL, DIMENSION(NCROP) :: TASSIM0 - REAL, DIMENSION(NCROP) :: TASSIM1 - REAL, DIMENSION(NCROP) :: TASSIM2 - REAL, DIMENSION(NCROP) :: K - REAL, DIMENSION(NCROP) :: EPSI - REAL, DIMENSION(NCROP) :: Q10MR - REAL, DIMENSION(NCROP) :: FOLN_MX - REAL, DIMENSION(NCROP) :: LEFREEZ - REAL, DIMENSION(NCROP) :: DILE_FC_S1,DILE_FC_S2,DILE_FC_S3,DILE_FC_S4,DILE_FC_S5,DILE_FC_S6,DILE_FC_S7,DILE_FC_S8 - REAL, DIMENSION(NCROP) :: DILE_FW_S1,DILE_FW_S2,DILE_FW_S3,DILE_FW_S4,DILE_FW_S5,DILE_FW_S6,DILE_FW_S7,DILE_FW_S8 - REAL, DIMENSION(NCROP) :: FRA_GR - REAL, DIMENSION(NCROP) :: LF_OVRC_S1,LF_OVRC_S2,LF_OVRC_S3,LF_OVRC_S4,LF_OVRC_S5,LF_OVRC_S6,LF_OVRC_S7,LF_OVRC_S8 - REAL, DIMENSION(NCROP) :: ST_OVRC_S1,ST_OVRC_S2,ST_OVRC_S3,ST_OVRC_S4,ST_OVRC_S5,ST_OVRC_S6,ST_OVRC_S7,ST_OVRC_S8 - REAL, DIMENSION(NCROP) :: RT_OVRC_S1,RT_OVRC_S2,RT_OVRC_S3,RT_OVRC_S4,RT_OVRC_S5,RT_OVRC_S6,RT_OVRC_S7,RT_OVRC_S8 - REAL, DIMENSION(NCROP) :: LFMR25 - REAL, DIMENSION(NCROP) :: STMR25 - REAL, DIMENSION(NCROP) :: RTMR25 - REAL, DIMENSION(NCROP) :: GRAINMR25 - REAL, DIMENSION(NCROP) :: LFPT_S1,LFPT_S2,LFPT_S3,LFPT_S4,LFPT_S5,LFPT_S6,LFPT_S7,LFPT_S8 - REAL, DIMENSION(NCROP) :: STPT_S1,STPT_S2,STPT_S3,STPT_S4,STPT_S5,STPT_S6,STPT_S7,STPT_S8 - REAL, DIMENSION(NCROP) :: RTPT_S1,RTPT_S2,RTPT_S3,RTPT_S4,RTPT_S5,RTPT_S6,RTPT_S7,RTPT_S8 - REAL, DIMENSION(NCROP) :: GRAINPT_S1,GRAINPT_S2,GRAINPT_S3,GRAINPT_S4,GRAINPT_S5,GRAINPT_S6,GRAINPT_S7,GRAINPT_S8 - REAL, DIMENSION(NCROP) :: LFCT_S1,LFCT_S2,LFCT_S3,LFCT_S4,LFCT_S5,LFCT_S6,LFCT_S7,LFCT_S8 - REAL, DIMENSION(NCROP) :: STCT_S1,STCT_S2,STCT_S3,STCT_S4,STCT_S5,STCT_S6,STCT_S7,STCT_S8 - REAL, DIMENSION(NCROP) :: RTCT_S1,RTCT_S2,RTCT_S3,RTCT_S4,RTCT_S5,RTCT_S6,RTCT_S7,RTCT_S8 - REAL, DIMENSION(NCROP) :: BIO2LAI - - -! NAMELIST / noahmp_crop_parameters /DEFAULT_CROP, PLTDAY, HSDAY, PLANTPOP, IRRI, GDDTBASE, GDDTCUT, GDDS1, GDDS2, & -! GDDS3, GDDS4, GDDS5, C3C4, AREF, PSNRF, I2PAR, TASSIM0, & -! TASSIM1, TASSIM2, K, EPSI, Q10MR, FOLN_MX, LEFREEZ, & -! Zhe Zhang 2020-07-13 - NAMELIST / noahmp_crop_parameters /DEFAULT_CROP, PLTDAY, HSDAY, PLANTPOP, IRRI, GDDTBASE, GDDTCUT, GDDS1, GDDS2, GDDS3, GDDS4, GDDS5, & ! - C3PSN, KC25, AKC, KO25, AKO, AVCMX, VCMX25, BP, MP, FOLNMX, QE25, & ! parameters added from stomata - C3C4, AREF, PSNRF, I2PAR, TASSIM0, & - TASSIM1, TASSIM2, K, EPSI, Q10MR, FOLN_MX, LEFREEZ, & - DILE_FC_S1,DILE_FC_S2,DILE_FC_S3,DILE_FC_S4,DILE_FC_S5,DILE_FC_S6,DILE_FC_S7,DILE_FC_S8, & - DILE_FW_S1,DILE_FW_S2,DILE_FW_S3,DILE_FW_S4,DILE_FW_S5,DILE_FW_S6,DILE_FW_S7,DILE_FW_S8, & - FRA_GR, & - LF_OVRC_S1,LF_OVRC_S2,LF_OVRC_S3,LF_OVRC_S4,LF_OVRC_S5,LF_OVRC_S6,LF_OVRC_S7,LF_OVRC_S8, & - ST_OVRC_S1,ST_OVRC_S2,ST_OVRC_S3,ST_OVRC_S4,ST_OVRC_S5,ST_OVRC_S6,ST_OVRC_S7,ST_OVRC_S8, & - RT_OVRC_S1,RT_OVRC_S2,RT_OVRC_S3,RT_OVRC_S4,RT_OVRC_S5,RT_OVRC_S6,RT_OVRC_S7,RT_OVRC_S8, & - LFMR25, STMR25, RTMR25, GRAINMR25, & - LFPT_S1, LFPT_S2, LFPT_S3, LFPT_S4, LFPT_S5, LFPT_S6, LFPT_S7, LFPT_S8, & - STPT_S1, STPT_S2, STPT_S3, STPT_S4, STPT_S5, STPT_S6, STPT_S7, STPT_S8, & - RTPT_S1, RTPT_S2, RTPT_S3, RTPT_S4, RTPT_S5, RTPT_S6, RTPT_S7, RTPT_S8, & - GRAINPT_S1,GRAINPT_S2,GRAINPT_S3,GRAINPT_S4,GRAINPT_S5,GRAINPT_S6,GRAINPT_S7,GRAINPT_S8, & - LFCT_S1,LFCT_S2,LFCT_S3,LFCT_S4,LFCT_S5,LFCT_S6,LFCT_S7,LFCT_S8, & - STCT_S1,STCT_S2,STCT_S3,STCT_S4,STCT_S5,STCT_S6,STCT_S7,STCT_S8, & - RTCT_S1,RTCT_S2,RTCT_S3,RTCT_S4,RTCT_S5,RTCT_S6,RTCT_S7,RTCT_S8, & - BIO2LAI - - - ! Initialize our variables to bad values, so that if the namelist read fails, we come to a screeching halt as soon as we try to use anything. - DEFAULT_CROP_TABLE = -99999 - PLTDAY_TABLE = -99999 - HSDAY_TABLE = -99999 - PLANTPOP_TABLE = -1.0E36 - IRRI_TABLE = -1.0E36 - GDDTBASE_TABLE = -1.0E36 - GDDTCUT_TABLE = -1.0E36 - GDDS1_TABLE = -1.0E36 - GDDS2_TABLE = -1.0E36 - GDDS3_TABLE = -1.0E36 - GDDS4_TABLE = -1.0E36 - GDDS5_TABLE = -1.0E36 - C3PSNI_TABLE = -1.0E36 ! parameter from PSN copied from stomata ! Zhe Zhang 2020-07-13 - KC25I_TABLE = -1.0E36 - AKCI_TABLE = -1.0E36 - KO25I_TABLE = -1.0E36 - AKOI_TABLE = -1.0E36 - AVCMXI_TABLE = -1.0E36 - VCMX25I_TABLE = -1.0E36 - BPI_TABLE = -1.0E36 - MPI_TABLE = -1.0E36 - FOLNMXI_TABLE = -1.0E36 - QE25I_TABLE = -1.0E36 ! ends here - C3C4_TABLE = -99999 - AREF_TABLE = -1.0E36 - PSNRF_TABLE = -1.0E36 - I2PAR_TABLE = -1.0E36 - TASSIM0_TABLE = -1.0E36 - TASSIM1_TABLE = -1.0E36 - TASSIM2_TABLE = -1.0E36 - K_TABLE = -1.0E36 - EPSI_TABLE = -1.0E36 - Q10MR_TABLE = -1.0E36 - FOLN_MX_TABLE = -1.0E36 - LEFREEZ_TABLE = -1.0E36 - DILE_FC_TABLE = -1.0E36 - DILE_FW_TABLE = -1.0E36 - FRA_GR_TABLE = -1.0E36 - LF_OVRC_TABLE = -1.0E36 - ST_OVRC_TABLE = -1.0E36 - RT_OVRC_TABLE = -1.0E36 - LFMR25_TABLE = -1.0E36 - STMR25_TABLE = -1.0E36 - RTMR25_TABLE = -1.0E36 - GRAINMR25_TABLE = -1.0E36 - LFPT_TABLE = -1.0E36 - STPT_TABLE = -1.0E36 - RTPT_TABLE = -1.0E36 - GRAINPT_TABLE = -1.0E36 - LFCT_TABLE = -1.0E36 ! convert start - STCT_TABLE = -1.0E36 - RTCT_TABLE = -1.0E36 ! convert end - BIO2LAI_TABLE = -1.0E36 - - - inquire( file='MPTABLE.TBL', exist=file_named ) - if ( file_named ) then - open(15, file="MPTABLE.TBL", status='old', form='formatted', action='read', iostat=ierr) - else - open(15, status='old', form='formatted', action='read', iostat=ierr) - end if - - if (ierr /= 0) then - write(*,'("WARNING: Cannot find file MPTABLE.TBL")') - call wrf_error_fatal("STOP in Noah-MP read_mp_crop_parameters") - endif - - read(15,noahmp_crop_parameters) - close(15) - - DEFAULT_CROP_TABLE = DEFAULT_CROP - PLTDAY_TABLE = PLTDAY - HSDAY_TABLE = HSDAY - PLANTPOP_TABLE = PLANTPOP - IRRI_TABLE = IRRI - GDDTBASE_TABLE = GDDTBASE - GDDTCUT_TABLE = GDDTCUT - GDDS1_TABLE = GDDS1 - GDDS2_TABLE = GDDS2 - GDDS3_TABLE = GDDS3 - GDDS4_TABLE = GDDS4 - GDDS5_TABLE = GDDS5 - C3PSNI_TABLE(1:5) = C3PSN(1:5) ! parameters from stomata ! Zhe Zhang 2020-07-13 - KC25I_TABLE(1:5) = KC25(1:5) - AKCI_TABLE(1:5) = AKC(1:5) - KO25I_TABLE(1:5) = KO25(1:5) - AKOI_TABLE(1:5) = AKO(1:5) - AVCMXI_TABLE(1:5) = AVCMX(1:5) - VCMX25I_TABLE(1:5) = VCMX25(1:5) - BPI_TABLE(1:5) = BP(1:5) - MPI_TABLE(1:5) = MP(1:5) - FOLNMXI_TABLE(1:5) = FOLNMX(1:5) - QE25I_TABLE(1:5) = QE25(1:5) ! ends here - C3C4_TABLE = C3C4 - AREF_TABLE = AREF - PSNRF_TABLE = PSNRF - I2PAR_TABLE = I2PAR - TASSIM0_TABLE = TASSIM0 - TASSIM1_TABLE = TASSIM1 - TASSIM2_TABLE = TASSIM2 - K_TABLE = K - EPSI_TABLE = EPSI - Q10MR_TABLE = Q10MR - FOLN_MX_TABLE = FOLN_MX - LEFREEZ_TABLE = LEFREEZ - DILE_FC_TABLE(:,1) = DILE_FC_S1 - DILE_FC_TABLE(:,2) = DILE_FC_S2 - DILE_FC_TABLE(:,3) = DILE_FC_S3 - DILE_FC_TABLE(:,4) = DILE_FC_S4 - DILE_FC_TABLE(:,5) = DILE_FC_S5 - DILE_FC_TABLE(:,6) = DILE_FC_S6 - DILE_FC_TABLE(:,7) = DILE_FC_S7 - DILE_FC_TABLE(:,8) = DILE_FC_S8 - DILE_FW_TABLE(:,1) = DILE_FW_S1 - DILE_FW_TABLE(:,2) = DILE_FW_S2 - DILE_FW_TABLE(:,3) = DILE_FW_S3 - DILE_FW_TABLE(:,4) = DILE_FW_S4 - DILE_FW_TABLE(:,5) = DILE_FW_S5 - DILE_FW_TABLE(:,6) = DILE_FW_S6 - DILE_FW_TABLE(:,7) = DILE_FW_S7 - DILE_FW_TABLE(:,8) = DILE_FW_S8 - FRA_GR_TABLE = FRA_GR - LF_OVRC_TABLE(:,1) = LF_OVRC_S1 - LF_OVRC_TABLE(:,2) = LF_OVRC_S2 - LF_OVRC_TABLE(:,3) = LF_OVRC_S3 - LF_OVRC_TABLE(:,4) = LF_OVRC_S4 - LF_OVRC_TABLE(:,5) = LF_OVRC_S5 - LF_OVRC_TABLE(:,6) = LF_OVRC_S6 - LF_OVRC_TABLE(:,7) = LF_OVRC_S7 - LF_OVRC_TABLE(:,8) = LF_OVRC_S8 - ST_OVRC_TABLE(:,1) = ST_OVRC_S1 - ST_OVRC_TABLE(:,2) = ST_OVRC_S2 - ST_OVRC_TABLE(:,3) = ST_OVRC_S3 - ST_OVRC_TABLE(:,4) = ST_OVRC_S4 - ST_OVRC_TABLE(:,5) = ST_OVRC_S5 - ST_OVRC_TABLE(:,6) = ST_OVRC_S6 - ST_OVRC_TABLE(:,7) = ST_OVRC_S7 - ST_OVRC_TABLE(:,8) = ST_OVRC_S8 - RT_OVRC_TABLE(:,1) = RT_OVRC_S1 - RT_OVRC_TABLE(:,2) = RT_OVRC_S2 - RT_OVRC_TABLE(:,3) = RT_OVRC_S3 - RT_OVRC_TABLE(:,4) = RT_OVRC_S4 - RT_OVRC_TABLE(:,5) = RT_OVRC_S5 - RT_OVRC_TABLE(:,6) = RT_OVRC_S6 - RT_OVRC_TABLE(:,7) = RT_OVRC_S7 - RT_OVRC_TABLE(:,8) = RT_OVRC_S8 - LFMR25_TABLE = LFMR25 - STMR25_TABLE = STMR25 - RTMR25_TABLE = RTMR25 - GRAINMR25_TABLE = GRAINMR25 - LFPT_TABLE(:,1) = LFPT_S1 - LFPT_TABLE(:,2) = LFPT_S2 - LFPT_TABLE(:,3) = LFPT_S3 - LFPT_TABLE(:,4) = LFPT_S4 - LFPT_TABLE(:,5) = LFPT_S5 - LFPT_TABLE(:,6) = LFPT_S6 - LFPT_TABLE(:,7) = LFPT_S7 - LFPT_TABLE(:,8) = LFPT_S8 - STPT_TABLE(:,1) = STPT_S1 - STPT_TABLE(:,2) = STPT_S2 - STPT_TABLE(:,3) = STPT_S3 - STPT_TABLE(:,4) = STPT_S4 - STPT_TABLE(:,5) = STPT_S5 - STPT_TABLE(:,6) = STPT_S6 - STPT_TABLE(:,7) = STPT_S7 - STPT_TABLE(:,8) = STPT_S8 - RTPT_TABLE(:,1) = RTPT_S1 - RTPT_TABLE(:,2) = RTPT_S2 - RTPT_TABLE(:,3) = RTPT_S3 - RTPT_TABLE(:,4) = RTPT_S4 - RTPT_TABLE(:,5) = RTPT_S5 - RTPT_TABLE(:,6) = RTPT_S6 - RTPT_TABLE(:,7) = RTPT_S7 - RTPT_TABLE(:,8) = RTPT_S8 - GRAINPT_TABLE(:,1) = GRAINPT_S1 - GRAINPT_TABLE(:,2) = GRAINPT_S2 - GRAINPT_TABLE(:,3) = GRAINPT_S3 - GRAINPT_TABLE(:,4) = GRAINPT_S4 - GRAINPT_TABLE(:,5) = GRAINPT_S5 - GRAINPT_TABLE(:,6) = GRAINPT_S6 - GRAINPT_TABLE(:,7) = GRAINPT_S7 - GRAINPT_TABLE(:,8) = GRAINPT_S8 - LFCT_TABLE(:,1) = LFCT_S1 - LFCT_TABLE(:,2) = LFCT_S2 - LFCT_TABLE(:,3) = LFCT_S3 - LFCT_TABLE(:,4) = LFCT_S4 - LFCT_TABLE(:,5) = LFCT_S5 - LFCT_TABLE(:,6) = LFCT_S6 - LFCT_TABLE(:,7) = LFCT_S7 - LFCT_TABLE(:,8) = LFCT_S8 - STCT_TABLE(:,1) = STCT_S1 - STCT_TABLE(:,2) = STCT_S2 - STCT_TABLE(:,3) = STCT_S3 - STCT_TABLE(:,4) = STCT_S4 - STCT_TABLE(:,5) = STCT_S5 - STCT_TABLE(:,6) = STCT_S6 - STCT_TABLE(:,7) = STCT_S7 - STCT_TABLE(:,8) = STCT_S8 - RTCT_TABLE(:,1) = RTCT_S1 - RTCT_TABLE(:,2) = RTCT_S2 - RTCT_TABLE(:,3) = RTCT_S3 - RTCT_TABLE(:,4) = RTCT_S4 - RTCT_TABLE(:,5) = RTCT_S5 - RTCT_TABLE(:,6) = RTCT_S6 - RTCT_TABLE(:,7) = RTCT_S7 - RTCT_TABLE(:,8) = RTCT_S8 - BIO2LAI_TABLE = BIO2LAI - - end subroutine read_mp_crop_parameters - - subroutine read_mp_irrigation_parameters() - implicit none - integer :: ierr - logical :: file_named - - REAL :: IRR_FRAC ! irrigation Fraction - INTEGER :: IRR_HAR ! number of days before harvest date to stop irrigation - REAL :: IRR_LAI ! Minimum lai to trigger irrigation - REAL :: IRR_MAD ! management allowable deficit (0-1) - REAL :: FILOSS ! fraction of flood irrigation loss (0-1) - REAL :: SPRIR_RATE ! mm/h, sprinkler irrigation rate - REAL :: MICIR_RATE ! mm/h, micro irrigation rate - REAL :: FIRTFAC ! flood application rate factor - REAL :: IR_RAIN ! maximum precipitation to stop irrigation trigger - - NAMELIST / noahmp_irrigation_parameters / IRR_FRAC, IRR_HAR, IRR_LAI, IRR_MAD, FILOSS, & - SPRIR_RATE, MICIR_RATE, FIRTFAC, IR_RAIN - - IRR_FRAC_TABLE = -1.0E36 ! irrigation Fraction - IRR_HAR_TABLE = 0 ! number of days before harvest date to stop irrigation - IRR_LAI_TABLE = -1.0E36 ! Minimum lai to trigger irrigation - IRR_MAD_TABLE = -1.0E36 ! management allowable deficit (0-1) - FILOSS_TABLE = -1.0E36 ! fraction of flood irrigation loss (0-1) - SPRIR_RATE_TABLE = -1.0E36 ! mm/h, sprinkler irrigation rate - MICIR_RATE_TABLE = -1.0E36 ! mm/h, micro irrigation rate - FIRTFAC_TABLE = -1.0E36 ! flood application rate factor - IR_RAIN_TABLE = -1.0E36 ! maximum precipitation to stop irrigation trigger - - inquire( file='MPTABLE.TBL', exist=file_named ) - if ( file_named ) then - open(15, file="MPTABLE.TBL", status='old', form='formatted', action='read', iostat=ierr) - else - open(15, status='old', form='formatted', action='read', iostat=ierr) - end if - - if (ierr /= 0) then - write(*,'("WARNING: Cannot find file MPTABLE.TBL")') - call wrf_error_fatal("STOP in Noah-MP read_mp_crop_parameters") - endif - - read(15,noahmp_irrigation_parameters) - close(15) - - if (FILOSS < 0.0 .or. FILOSS > 0.99 ) then - write(*,'("WARNING: FILOSS should be >0.0 and <0.99")') - call wrf_error_fatal("STOP in NoahMP_irrigation_parameters") - endif - - IRR_FRAC_TABLE = IRR_FRAC ! irrigation Fraction - IRR_HAR_TABLE = IRR_HAR ! number of days before harvest date to stop irrigation - IRR_LAI_TABLE = IRR_LAI ! Minimum lai to trigger irrigation - IRR_MAD_TABLE = IRR_MAD ! management allowable deficit (0-1) - FILOSS_TABLE = FILOSS ! fraction of flood irrigation loss (0-1) - SPRIR_RATE_TABLE = SPRIR_RATE ! mm/h, sprinkler irrigation rate - MICIR_RATE_TABLE = MICIR_RATE ! mm/h, micro irrigation rate - FIRTFAC_TABLE = FIRTFAC ! flood application rate factor - IR_RAIN_TABLE = IR_RAIN ! maximum precipitation to stop irrigation trigger - - end subroutine read_mp_irrigation_parameters - - subroutine read_tiledrain_parameters() - implicit none - integer :: ierr - logical :: file_named - REAL, DIMENSION(MAX_SOILTYP) :: TDSMC_FAC - INTEGER, DIMENSION(MAX_SOILTYP) :: TD_DEPTH - REAL, DIMENSION(MAX_SOILTYP) :: TD_DC - INTEGER :: DRAIN_LAYER_OPT - REAL, DIMENSION(MAX_SOILTYP) :: TD_DCOEF - REAL, DIMENSION(MAX_SOILTYP) :: TD_D - REAL, DIMENSION(MAX_SOILTYP) :: TD_ADEPTH - REAL, DIMENSION(MAX_SOILTYP) :: TD_RADI - REAL, DIMENSION(MAX_SOILTYP) :: TD_SPAC - REAL, DIMENSION(MAX_SOILTYP) :: TD_DDRAIN - REAL, DIMENSION(MAX_SOILTYP) :: KLAT_FAC - NAMELIST / noahmp_tiledrain_parameters /DRAIN_LAYER_OPT,TDSMC_FAC,TD_DEPTH,TD_DC,& - TD_DCOEF,TD_D,TD_ADEPTH,TD_RADI,TD_SPAC,TD_DDRAIN,& - KLAT_FAC - ! Initialize our variables to bad values, so that if the namelist read fails, we come to a screeching halt as soon as we try to use anything. - TDSMCFAC_TABLE = -99999 - TD_DEPTH_TABLE = -99999 - TD_DC_TABLE = -99999 - DRAIN_LAYER_OPT_TABLE = -99999 - TD_DCOEF_TABLE = -99999 - TD_D_TABLE = -99999 - TD_ADEPTH_TABLE = -99999 - TD_RADI_TABLE = -99999 - TD_SPAC_TABLE = -99999 - TD_DDRAIN_TABLE = -99999 - KLAT_FAC_TABLE = -99999 - - inquire( file='MPTABLE.TBL', exist=file_named ) - if ( file_named ) then - open(15, file="MPTABLE.TBL", status='old', form='formatted', action='read', iostat=ierr) - else - open(15, status='old', form='formatted', action='read', iostat=ierr) - end if - if (ierr /= 0) then - write(*,'("WARNING: Cannot find file MPTABLE.TBL")') - call wrf_error_fatal("STOP in Noah-MP read_tiledrain_parameters") - endif - read(15,noahmp_tiledrain_parameters) - close(15) - TDSMCFAC_TABLE = TDSMC_FAC - TD_DEPTH_TABLE = TD_DEPTH - DRAIN_LAYER_OPT_TABLE = DRAIN_LAYER_OPT - TD_DC_TABLE = TD_DC - - TD_DCOEF_TABLE = TD_DCOEF - TD_D_TABLE = TD_D - TD_ADEPTH_TABLE = TD_ADEPTH - TD_RADI_TABLE = TD_RADI - TD_SPAC_TABLE = TD_SPAC - TD_DDRAIN_TABLE = TD_DDRAIN - KLAT_FAC_TABLE = KLAT_FAC - - end subroutine read_tiledrain_parameters - - subroutine read_mp_optional_parameters() - implicit none - integer :: ierr - logical :: file_named - - NAMELIST / noahmp_optional_parameters / & - sr2006_theta_1500t_a, sr2006_theta_1500t_b, sr2006_theta_1500t_c, & - sr2006_theta_1500t_d, sr2006_theta_1500t_e, sr2006_theta_1500t_f, & - sr2006_theta_1500t_g , & - sr2006_theta_1500_a , sr2006_theta_1500_b , & - sr2006_theta_33t_a , sr2006_theta_33t_b , sr2006_theta_33t_c , & - sr2006_theta_33t_d , sr2006_theta_33t_e , sr2006_theta_33t_f , & - sr2006_theta_33t_g , & - sr2006_theta_33_a , sr2006_theta_33_b , sr2006_theta_33_c , & - sr2006_theta_s33t_a , sr2006_theta_s33t_b , sr2006_theta_s33t_c , & - sr2006_theta_s33t_d , sr2006_theta_s33t_e , sr2006_theta_s33t_f , & - sr2006_theta_s33t_g , & - sr2006_theta_s33_a , sr2006_theta_s33_b , & - sr2006_psi_et_a , sr2006_psi_et_b , sr2006_psi_et_c , & - sr2006_psi_et_d , sr2006_psi_et_e , sr2006_psi_et_f , & - sr2006_psi_et_g , & - sr2006_psi_e_a , sr2006_psi_e_b , sr2006_psi_e_c , & - sr2006_smcmax_a , sr2006_smcmax_b - - inquire( file='MPTABLE.TBL', exist=file_named ) - if ( file_named ) then - open(15, file="MPTABLE.TBL", status='old', form='formatted', action='read', iostat=ierr) - else - open(15, status='old', form='formatted', action='read', iostat=ierr) - end if - - if (ierr /= 0) then - write(*,'("WARNING: Cannot find file MPTABLE.TBL")') - call wrf_error_fatal("STOP in Noah-MP read_mp_optional_parameters") - endif - - read(15,noahmp_optional_parameters) - close(15) - - end subroutine read_mp_optional_parameters - -END MODULE NOAHMP_TABLES - diff --git a/phys/noahmp b/phys/noahmp new file mode 160000 index 0000000000..aed82e17e9 --- /dev/null +++ b/phys/noahmp @@ -0,0 +1 @@ +Subproject commit aed82e17e95b510beff8dc06438f7f331c660cab diff --git a/run/MPTABLE.TBL b/run/MPTABLE.TBL deleted file mode 100644 index 54bdbb3439..0000000000 --- a/run/MPTABLE.TBL +++ /dev/null @@ -1,646 +0,0 @@ -&noahmp_usgs_veg_categories - VEG_DATASET_DESCRIPTION = "USGS" - NVEG = 27 -/ -&noahmp_usgs_parameters - ! NVEG = 27 - ! 1: Urban and Built-Up Land - ! 2: Dryland Cropland and Pasture - ! 3: Irrigated Cropland and Pasture - ! 4: Mixed Dryland/Irrigated Cropland and Pasture - ! 5: Cropland/Grassland Mosaic - ! 6: Cropland/Woodland Mosaic - ! 7: Grassland - ! 8: Shrubland - ! 9: Mixed Shrubland/Grassland - ! 10: Savanna - ! 11: Deciduous Broadleaf Forest - ! 12: Deciduous Needleleaf Forest - ! 13: Evergreen Broadleaf Forest - ! 14: Evergreen Needleleaf Forest - ! 15: Mixed Forest - ! 16: Water Bodies - ! 17: Herbaceous Wetland - ! 18: Wooded Wetland - ! 19: Barren or Sparsely Vegetated - ! 20: Herbaceous Tundra - ! 21: Wooded Tundra - ! 22: Mixed Tundra - ! 23: Bare Ground Tundra - ! 24: Snow or Ice - ! 25: Playa - ! 26: Lava - ! 27: White Sand - - ISURBAN = 1 - ISWATER = 16 - ISBARREN = 19 - ISICE = 24 - ISCROP = 2 - EBLFOREST = 13 - NATURAL = 5 - LCZ_1 = 31 - LCZ_2 = 32 - LCZ_3 = 33 - LCZ_4 = 34 - LCZ_5 = 35 - LCZ_6 = 36 - LCZ_7 = 37 - LCZ_8 = 38 - LCZ_9 = 39 - LCZ_10 = 40 - LCZ_11 = 41 - - !--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - ! 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 - !--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - CH2OP = 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, - DLEAF = 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, - Z0MVT = 1.00, 0.15, 0.15, 0.15, 0.14, 0.50, 0.12, 0.06, 0.09, 0.50, 0.80, 0.85, 1.10, 1.09, 0.80, 0.00, 0.12, 0.50, 0.00, 0.10, 0.30, 0.20, 0.03, 0.00, 0.01, 0.00, 0.00, - HVT = 15.0, 2.00, 2.00, 2.00, 1.50, 8.00, 1.00, 1.10, 1.10, 10.0, 16.0, 18.0, 20.0, 20.0, 16.0, 0.00, 0.50, 10.0, 0.00, 0.50, 4.00, 2.00, 0.50, 0.00, 0.10, 0.00, 0.00, - HVB = 1.00, 0.10, 0.10, 0.10, 0.10, 0.15, 0.05, 0.10, 0.10, 0.10, 11.5, 7.00, 8.00, 8.50, 10.0, 0.00, 0.05, 0.10, 0.00, 0.10, 0.10, 0.10, 0.10, 0.00, 0.10, 0.00, 0.00, - DEN = 0.01, 25.0, 25.0, 25.0, 25.0, 25.0, 100., 10.0, 10.0, 0.02, 0.10, 0.28, 0.02, 0.28, 0.10, 0.01, 10.0, 0.10, 0.01, 1.00, 1.00, 1.00, 1.00, 0.00, 0.01, 0.01, 0.01, - RC = 1.00, 0.08, 0.08, 0.08, 0.08, 0.08, 0.03, 0.12, 0.12, 3.00, 1.40, 1.20, 3.60, 1.20, 1.40, 0.01, 0.10, 1.40, 0.01, 0.30, 0.30, 0.30, 0.30, 0.00, 0.01, 0.01, 0.01, -!MFSNO = 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, -! C. He 12/17/2020: optimized MFSNO values dependent on land type based on evaluation with SNOTEL SWE and MODIS SCF, surface albedo - MFSNO = 4.00, 3.00, 3.00, 3.00, 4.00, 4.00, 2.00, 2.00, 2.00, 2.00, 1.00, 1.00, 1.00, 1.00, 1.00, 3.00, 3.00, 3.00, 3.00, 3.50, 3.50, 3.50, 3.50, 2.50, 3.50, 3.50, 3.50, -! C. He 12/17/2020: optimized snow cover factor (m) in SCF formulation to replace original constant 2.5*z0,z0=0.002m, based on evaluation with SNOTEL SWE and MODIS SCF, surface albedo - SCFFAC= 0.042, 0.014, 0.014, 0.014, 0.026, 0.026, 0.020, 0.018, 0.016, 0.020, 0.008, 0.008, 0.008, 0.008, 0.008, 0.030, 0.020, 0.020, 0.016, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, - - ! Row 1: Vis - ! Row 2: Near IR - RHOL_VIS=0.00, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.07, 0.10, 0.10, 0.10, 0.07, 0.10, 0.07, 0.10, 0.00, 0.11, 0.10, 0.00, 0.10, 0.10, 0.10, 0.10, 0.00, 0.10, 0.00, 0.00, - RHOL_NIR=0.00, 0.58, 0.58, 0.58, 0.58, 0.58, 0.58, 0.35, 0.45, 0.45, 0.45, 0.35, 0.45, 0.35, 0.45, 0.00, 0.58, 0.45, 0.00, 0.45, 0.45, 0.45, 0.45, 0.00, 0.45, 0.00, 0.00, - - ! Row 1: Vis - ! Row 2: Near IR - RHOS_VIS=0.00, 0.36, 0.36, 0.36, 0.36, 0.36, 0.36, 0.16, 0.16, 0.16, 0.16, 0.16, 0.16, 0.16, 0.16, 0.00, 0.36, 0.16, 0.00, 0.16, 0.16, 0.16, 0.16, 0.00, 0.16, 0.00, 0.00, - RHOS_NIR=0.00, 0.58, 0.58, 0.58, 0.58, 0.58, 0.58, 0.39, 0.39, 0.39, 0.39, 0.39, 0.39, 0.39, 0.39, 0.00, 0.58, 0.39, 0.00, 0.39, 0.39, 0.39, 0.39, 0.00, 0.39, 0.00, 0.00, - - ! Row 1: Vis - ! Row 2: Near IR - TAUL_VIS=0.00, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.00, 0.07, 0.05, 0.00, 0.05, 0.05, 0.05, 0.05, 0.00, 0.05, 0.00, 0.00, - TAUL_NIR=0.00, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.10, 0.10, 0.25, 0.25, 0.10, 0.25, 0.10, 0.25, 0.00, 0.25, 0.25, 0.00, 0.25, 0.25, 0.25, 0.25, 0.00, 0.25, 0.00, 0.00, - - ! Row 1: Vis - ! Row 2: Near IR - TAUS_VIS=0.00, 0.220, 0.220, 0.220, 0.220, 0.220, 0.220, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.000, 0.220, 0.001, 0.000, 0.220, 0.001, 0.001, 0.001, 0.000, 0.001, 0.000, 0.000, - TAUS_NIR=0.00, 0.380, 0.380, 0.380, 0.380, 0.380, 0.380, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.000, 0.380, 0.001, 0.000, 0.380, 0.001, 0.001, 0.001, 0.000, 0.001, 0.000, 0.000, - - XL = 0.000, -0.30, -0.30, -0.30, -0.30, -0.30, -0.30, 0.010, 0.250, 0.010, 0.250, 0.010, 0.010, 0.010, 0.250, 0.000, -0.30, 0.250, 0.000, -0.30, 0.250, 0.250, 0.250, 0.000, 0.250, 0.000, 0.000, - ! make CWPVT vegetation dependent according to J. Goudriaan, Crop Micrometeorology: A Simulation Study (Simulation monographs), 1977). C. He, 12/17/2020 - CWPVT = 0.18, 1.67, 1.67, 1.67, 1.67, 0.5, 5.0, 1.0, 2.0, 1.0, 0.67, 0.18, 0.67, 0.18, 0.29, 0.18, 1.67, 0.67, 0.18, 1.67, 0.67, 1.00, 0.18, 0.18, 0.18, 0.18, 0.18, - C3PSN = 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, - KC25 = 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, - AKC = 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, - KO25 = 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, - AKO = 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, - AVCMX = 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, - AQE = 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, - - LTOVRC= 0.0, 1.2, 1.2, 1.2, 1.2, 1.30, 0.50, 0.65, 0.70, 0.65, 0.55, 0.2, 0.55, 0.5, 0.5, 0.0, 1.4, 1.4, 0.0, 1.2, 1.3, 1.4, 1.0, 0.0, 1.0, 0.0, 0.0, - DILEFC= 0.00, 0.50, 0.50, 0.50, 0.35, 0.20, 0.20, 0.20, 0.50, 0.50, 0.60, 1.80, 0.50, 1.20, 0.80, 0.00, 0.40, 0.40, 0.00, 0.40, 0.30, 0.40, 0.30, 0.00, 0.30, 0.00, 0.00, - DILEFW= 0.00, 0.20, 0.20, 0.20, 0.20, 0.20, 0.10, 0.20, 0.20, 0.50, 0.20, 0.20, 4.00, 0.20, 0.20, 0.00, 0.20, 0.20, 0.00, 0.20, 0.20, 0.20, 0.20, 0.00, 0.20, 0.00, 0.00, - RMF25 = 0.00, 1.00, 1.40, 1.45, 1.45, 1.45, 1.80, 0.26, 0.26, 0.80, 3.00, 4.00, 0.65, 3.00, 3.00, 0.00, 3.20, 3.20, 0.00, 3.20, 3.00, 3.00, 3.00, 0.00, 3.00, 0.00, 0.00, - SLA = 60, 80, 80, 80, 80, 80, 60, 60, 60, 50, 80, 80, 80, 80, 80, 0, 80, 80, 0, 80, 80, 80, 80, 0, 80, 0, 0, - FRAGR = 0.00, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.10, 0.20, 0.10, 0.10, 0.00, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.00, 0.10, 0.00, 0.00, - TMIN = 0, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 268, 273, 265, 268, 0, 268, 268, 0, 268, 268, 268, 268, 0, 268, 0, 0, - VCMX25= 0.00, 80.0, 80.0, 80.0, 60.0, 70.0, 40.0, 40.0, 40.0, 40.0, 60.0, 60.0, 60.0, 50.0, 55.0, 0.00, 50.0, 50.0, 0.00, 50.0, 50.0, 50.0, 50.0, 0.00, 50.0, 0.00, 0.00, - TDLEF = 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 268, 278, 278, 268, 0, 268, 268, 0, 268, 268, 268, 268, 0, 268, 0, 0, - BP = 1.E15, 2.E3, 2.E3, 2.E3, 2.E3, 2.E3, 2.E3, 2.E3, 2.E3, 2.E3, 2.E3, 2.E3, 2.E3, 2.E3, 2.E3, 1.E15, 2.E3, 2.E3, 2.E3, 2.E3, 2.E3, 2.E3, 2.E3, 1.E15, 2.E3, 1.E15, 1.E15, - MP = 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 6., 9., 6., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., - QE25 = 0., 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.00, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.00, 0.06, 0.00, 0.00, - RMS25 = 0.00, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.32, 0.10, 0.64, 0.30, 0.90, 0.80, 0.00, 0.10, 0.10, 0.00, 0.10, 0.10, 0.10, 0.00, 0.00, 0.00, 0.00, 0.00, - RMR25 = 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.20, 0.00, 0.00, 0.01, 0.01, 0.05, 0.05, 0.36, 0.03, 0.00, 0.00, 0.00, 0.00, 2.11, 2.11, 2.11, 0.00, 0.00, 0.00, 0.00, 0.00, - ARM = 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - FOLNMX= 0.00, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 0.00, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 0.00, 1.5, 0.00, 0.00, - WDPOOL= 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 0.00, 0.00, 1.00, 0.00, 0.00, 1.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, - WRRAT = 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 3.00, 3.00, 3.00, 30.0, 30.0, 30.0, 30.0, 30.0, 0.00, 0.00, 30.0, 0.00, 0.00, 3.00, 3.00, 0.00, 0.00, 0.00, 0.00, 0.00, - MRP = 0.00, 0.23, 0.23, 0.23, 0.23, 0.23, 0.17, 0.19, 0.19, 0.40, 0.40, 0.37, 0.23, 0.37, 0.30, 0.00, 0.17, 0.40, 0.00, 0.17, 0.23, 0.20, 0.00, 0.00, 0.20, 0.00, 0.00, - NROOT = 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 0, 2, 2, 1, 3, 3, 3, 2, 1, 1, 0, 0, - RGL = 999.0, 100.0, 100.0, 100.0, 100.0, 65.0, 100.0, 100.0, 100.0, 65.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 100.0, 30.0, 999.0, 100.0, 100.0, 100.0, 100.0, 999.0, 100.0, 999.0, 999.0, - RS = 200.0, 40.0, 40.0, 40.0, 40.0, 70.0, 40.0, 300.0, 170.0, 70.0, 100.0, 150.0, 150.0, 125.0, 125.0, 100.0, 40.0, 100.0, 999.0, 150.0, 150.0, 150.0, 200.0, 999.0, 40.0, 999.0, 999.0, - HS = 999.0, 36.25, 36.25, 36.25, 36.25, 44.14, 36.35, 42.00, 39.18, 54.53, 54.53, 47.35, 41.69, 47.35, 51.93, 51.75, 60.00, 51.93, 999.0, 42.00, 42.00, 42.00, 42.00, 999.0, 36.25, 999.0, 999.0, - TOPT = 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, - RSMAX = 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., - -! Monthly values, one row for each month: - SAI_JAN = 0.0, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.2, 0.2, 0.3, 0.4, 0.3, 0.5, 0.4, 0.4, 0.0, 0.2, 0.3, 0.0, 0.1, 0.2, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, - SAI_FEB = 0.0, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.2, 0.2, 0.3, 0.4, 0.3, 0.5, 0.4, 0.4, 0.0, 0.2, 0.3, 0.0, 0.1, 0.2, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, - SAI_MAR = 0.0, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.2, 0.2, 0.3, 0.4, 0.3, 0.5, 0.4, 0.4, 0.0, 0.2, 0.3, 0.0, 0.1, 0.2, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, - SAI_APR = 0.0, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.2, 0.2, 0.3, 0.4, 0.4, 0.5, 0.3, 0.4, 0.0, 0.2, 0.3, 0.0, 0.1, 0.2, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, - SAI_MAY = 0.0, 0.2, 0.2, 0.2, 0.3, 0.3, 0.3, 0.2, 0.2, 0.3, 0.4, 0.4, 0.5, 0.4, 0.4, 0.0, 0.3, 0.3, 0.0, 0.1, 0.2, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, - SAI_JUN = 0.0, 0.3, 0.3, 0.3, 0.4, 0.4, 0.4, 0.2, 0.3, 0.4, 0.4, 0.7, 0.5, 0.5, 0.4, 0.0, 0.4, 0.4, 0.0, 0.2, 0.2, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, - SAI_JUL = 0.0, 0.4, 0.4, 0.4, 0.6, 0.6, 0.8, 0.4, 0.6, 0.8, 0.9, 1.3, 0.5, 0.5, 0.7, 0.0, 0.6, 0.6, 0.0, 0.4, 0.4, 0.4, 0.0, 0.0, 0.0, 0.0, 0.0, - SAI_AUG = 0.0, 0.5, 0.5, 0.5, 0.9, 0.9, 1.3, 0.6, 0.9, 1.2, 1.2, 1.2, 0.5, 0.6, 0.8, 0.0, 0.9, 0.9, 0.0, 0.6, 0.6, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, - SAI_SEP = 0.0, 0.4, 0.4, 0.4, 0.7, 1.0, 1.1, 0.8, 1.0, 1.3, 1.6, 1.0, 0.5, 0.6, 1.0, 0.0, 0.7, 1.0, 0.0, 0.7, 0.8, 0.7, 0.0, 0.0, 0.0, 0.0, 0.0, - SAI_OCT = 0.0, 0.3, 0.3, 0.3, 0.3, 0.8, 0.4, 0.7, 0.6, 0.7, 1.4, 0.8, 0.5, 0.7, 1.0, 0.0, 0.3, 0.8, 0.0, 0.5, 0.7, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, - SAI_NOV = 0.0, 0.3, 0.3, 0.3, 0.3, 0.4, 0.4, 0.3, 0.3, 0.4, 0.6, 0.6, 0.5, 0.6, 0.5, 0.0, 0.3, 0.4, 0.0, 0.3, 0.3, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, - SAI_DEC = 0.0, 0.3, 0.3, 0.3, 0.3, 0.3, 0.4, 0.2, 0.3, 0.4, 0.4, 0.5, 0.5, 0.5, 0.4, 0.0, 0.3, 0.4, 0.0, 0.2, 0.2, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, - - LAI_JAN = 0.0, 0.0, 0.0, 0.0, 0.2, 0.0, 0.4, 0.0, 0.2, 0.3, 0.0, 0.0, 4.5, 4.0, 2.0, 0.0, 0.2, 0.2, 0.0, 0.2, 1.0, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, - LAI_FEB = 0.0, 0.0, 0.0, 0.0, 0.3, 0.0, 0.5, 0.0, 0.3, 0.3, 0.0, 0.0, 4.5, 4.0, 2.0, 0.0, 0.3, 0.3, 0.0, 0.3, 1.0, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, - LAI_MAR = 0.0, 0.0, 0.0, 0.0, 0.3, 0.2, 0.6, 0.2, 0.4, 0.5, 0.3, 0.0, 4.5, 4.0, 2.2, 0.0, 0.3, 0.3, 0.0, 0.3, 1.1, 0.7, 0.0, 0.0, 0.0, 0.0, 0.0, - LAI_APR = 0.0, 0.0, 0.0, 0.0, 0.4, 0.6, 0.7, 0.6, 0.7, 0.8, 1.2, 0.6, 4.5, 4.0, 2.6, 0.0, 0.4, 0.6, 0.0, 0.4, 1.3, 0.8, 0.0, 0.0, 0.0, 0.0, 0.0, - LAI_MAY = 0.0, 1.0, 1.0, 1.0, 1.1, 2.0, 1.2, 1.5, 1.4, 1.8, 3.0, 1.2, 4.5, 4.0, 3.5, 0.0, 1.1, 2.0, 0.0, 0.6, 1.7, 1.2, 0.0, 0.0, 0.0, 0.0, 0.0, - LAI_JUN = 0.0, 2.0, 2.0, 2.0, 2.5, 3.3, 3.0, 2.3, 2.6, 3.6, 4.7, 2.0, 4.5, 4.0, 4.3, 0.0, 2.5, 3.3, 0.0, 1.5, 2.1, 1.8, 0.0, 0.0, 0.0, 0.0, 0.0, - LAI_JUL = 0.0, 3.0, 3.0, 3.0, 3.2, 3.7, 3.5, 2.3, 2.9, 3.8, 4.5, 2.6, 4.5, 4.0, 4.3, 0.0, 3.2, 3.7, 0.0, 1.7, 2.1, 1.8, 0.0, 0.0, 0.0, 0.0, 0.0, - LAI_AUG = 0.0, 3.0, 3.0, 3.0, 2.2, 3.2, 1.5, 1.7, 1.6, 2.1, 3.4, 1.7, 4.5, 4.0, 3.7, 0.0, 2.2, 3.2, 0.0, 0.8, 1.8, 1.3, 0.0, 0.0, 0.0, 0.0, 0.0, - LAI_SEP = 0.0, 1.5, 1.5, 1.5, 1.1, 1.3, 0.7, 0.6, 0.7, 0.9, 1.2, 1.0, 4.5, 4.0, 2.6, 0.0, 1.1, 1.3, 0.0, 0.4, 1.3, 0.8, 0.0, 0.0, 0.0, 0.0, 0.0, - LAI_OCT = 0.0, 0.0, 0.0, 0.0, 0.3, 0.2, 0.6, 0.2, 0.4, 0.5, 0.3, 0.5, 4.5, 4.0, 2.2, 0.0, 0.3, 0.3, 0.0, 0.3, 1.1, 0.7, 0.0, 0.0, 0.0, 0.0, 0.0, - LAI_NOV = 0.0, 0.0, 0.0, 0.0, 0.3, 0.0, 0.5, 0.0, 0.3, 0.3, 0.0, 0.2, 4.5, 4.0, 2.0, 0.0, 0.3, 0.3, 0.0, 0.2, 1.0, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, - LAI_DEC = 0.0, 0.0, 0.0, 0.0, 0.2, 0.0, 0.4, 0.0, 0.2, 0.3, 0.0, 0.0, 4.5, 4.0, 2.0, 0.0, 0.2, 0.2, 0.0, 0.2, 1.0, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, - - SLAREA=0.0228,0.0200,0.0200,0.0295,0.0223,0.0277,0.0060,0.0227,0.0188,0.0236,0.0258,0.0200,0.0200,0.0090,0.0223,0.0422,0.0390, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, - -! Five types, one row for each type (BVOC currently not active). - EPS1 = 41.87, 0.00, 0.00, 2.52, 0.04, 17.11, 0.02, 21.62, 0.11, 22.80, 46.86, 0.00, 0.00, 0.46, 30.98, 2.31, 1.63, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, - EPS2 = 0.98, 0.00, 0.00, 0.16, 0.09, 0.28, 0.05, 0.92, 0.22, 0.59, 0.38, 0.00, 0.00, 3.34, 0.96, 1.47, 1.07, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, - EPS3 = 1.82, 0.00, 0.00, 0.23, 0.05, 0.81, 0.03, 1.73, 1.26, 1.37, 1.84, 0.00, 0.00, 1.85, 1.84, 1.70, 1.21, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, - EPS4 = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, - EPS5 = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -/ - -&noahmp_modis_veg_categories - VEG_DATASET_DESCRIPTION = "modified igbp modis noah" - NVEG = 20 -/ - -&noahmp_modis_parameters -! 1 'Evergreen Needleleaf Forest' -> USGS 14 -! 2, 'Evergreen Broadleaf Forest' -> USGS 13 -! 3, 'Deciduous Needleleaf Forest' -> USGS 12 -! 4, 'Deciduous Broadleaf Forest' -> USGS 11 -! 5, 'Mixed Forests' -> USGS 15 -! 6, 'Closed Shrublands' -> USGS 8 "shrubland" -! 7, 'Open Shrublands' -> USGS 9 "shrubland/grassland" -! 8, 'Woody Savannas' -> USGS 8 "shrubland" -! 9, 'Savannas' -> USGS 10 -! 10, 'Grasslands' -> USGS 7 -! 11 'Permanent wetlands' -> avg of USGS 17 and 18 (herb. wooded wetland) -! 12, 'Croplands' -> USGS 2 "dryland cropland" -! 13, 'Urban and Built-Up' -> USGS 1 -! 14 'cropland/natural vegetation mosaic' -> USGS 5 "cropland/grassland" -! 15, 'Snow and Ice' -> USGS 24 -! 16, 'Barren or Sparsely Vegetated' -> USGS 19 -! 17, 'Water' -> USGS 16 -! 18, 'Wooded Tundra' -> USGS 21 -! 19, 'Mixed Tundra' -> USGS 22 -! 20, 'Barren Tundra' -> USGS 23 - - ISURBAN = 13 - ISWATER = 17 - ISBARREN = 16 - ISICE = 15 - ISCROP = 12 - EBLFOREST = 2 - NATURAL = 14 - LCZ_1 = 31 - LCZ_2 = 32 - LCZ_3 = 33 - LCZ_4 = 34 - LCZ_5 = 35 - LCZ_6 = 36 - LCZ_7 = 37 - LCZ_8 = 38 - LCZ_9 = 39 - LCZ_10 = 40 - LCZ_11 = 41 - !--------------------------------------------------------------------------------------------------------------------------------------------------------------------- - ! 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 - !--------------------------------------------------------------------------------------------------------------------------------------------------------------------- - CH2OP = 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, - DLEAF = 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, - Z0MVT = 1.09, 1.10, 0.85, 0.80, 0.80, 0.20, 0.06, 0.60, 0.50, 0.12, 0.30, 0.15, 1.00, 0.14, 0.00, 0.00, 0.00, 0.30, 0.20, 0.03, - HVT = 20.0, 20.0, 18.0, 16.0, 16.0, 1.10, 1.10, 13.0, 10.0, 1.00, 5.00, 2.00, 15.0, 1.50, 0.00, 0.00, 0.00, 4.00, 2.00, 0.50, - HVB = 8.50, 8.00, 7.00, 11.5, 10.0, 0.10, 0.10, 0.10, 0.10, 0.05, 0.10, 0.10, 1.00, 0.10, 0.00, 0.00, 0.00, 0.30, 0.20, 0.10, - DEN = 0.28, 0.02, 0.28, 0.10, 0.10, 10.0, 10.0, 10.0, 0.02, 100., 5.05, 25.0, 0.01, 25.0, 0.00, 0.01, 0.01, 1.00, 1.00, 1.00, - RC = 1.20, 3.60, 1.20, 1.40, 1.40, 0.12, 0.12, 0.12, 3.00, 0.03, 0.75, 0.08, 1.00, 0.08, 0.00, 0.01, 0.01, 0.30, 0.30, 0.30, -!MFSNO = 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, -! C. He 12/17/2020: optimized MFSNO values dependent on land type based on evaluation with SNOTEL SWE and MODIS SCF, surface albedo - MFSNO = 1.00, 1.00, 1.00, 1.00, 1.00, 2.00, 2.00, 2.00, 2.00, 2.00, 3.00, 3.00, 4.00, 4.00, 2.50, 3.00, 3.00, 3.50, 3.50, 3.50, -! C. He 12/17/2020: optimized snow cover factor (m) in SCF formulation to replace original constant 2.5*z0,z0=0.002m, based on evaluation with SNOTEL SWE and MODIS SCF, surface albedo - SCFFAC = 0.008, 0.008, 0.008, 0.008, 0.008, 0.016, 0.016, 0.020, 0.020, 0.020, 0.020, 0.014, 0.042, 0.026, 0.030, 0.016, 0.030, 0.030, 0.030, 0.030, - - ! Row 1: Vis - ! Row 2: Near IR - RHOL_VIS=0.07, 0.10, 0.07, 0.10, 0.10, 0.07, 0.07, 0.07, 0.10, 0.11, 0.105, 0.11, 0.00, 0.11, 0.00, 0.00, 0.00, 0.10, 0.10, 0.10, - RHOL_NIR=0.35, 0.45, 0.35, 0.45, 0.45, 0.35, 0.35, 0.35, 0.45, 0.58, 0.515, 0.58, 0.00, 0.58, 0.00, 0.00, 0.00, 0.45, 0.45, 0.45, - - ! Row 1: Vis - ! Row 2: Near IR - RHOS_VIS=0.16, 0.16, 0.16, 0.16, 0.16, 0.16, 0.16, 0.16, 0.16, 0.36, 0.26, 0.36, 0.00, 0.36, 0.00, 0.00, 0.00, 0.16, 0.16, 0.16, - RHOS_NIR=0.39, 0.39, 0.39, 0.39, 0.39, 0.39, 0.39, 0.39, 0.39, 0.58, 0.485, 0.58, 0.00, 0.58, 0.00, 0.00, 0.00, 0.39, 0.39, 0.39, - - ! Row 1: Vis - ! Row 2: Near IR - TAUL_VIS=0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.07, 0.06, 0.07, 0.00, 0.07, 0.00, 0.00, 0.00, 0.05, 0.05, 0.05, - TAUL_NIR=0.10, 0.25, 0.10, 0.25, 0.25, 0.10, 0.10, 0.10, 0.25, 0.25, 0.25, 0.25, 0.00, 0.25, 0.00, 0.00, 0.00, 0.25, 0.25, 0.25, - - ! Row 1: Vis - ! Row 2: Near IR - TAUS_VIS=0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.220, 0.1105, 0.220, 0.000, 0.220, 0.000, 0.000, 0.000, 0.001, 0.001, 0.001, - TAUS_NIR=0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.380, 0.1905, 0.380, 0.000, 0.380, 0.000, 0.000, 0.000, 0.001, 0.001, 0.001, - - XL = 0.010, 0.010, 0.010, 0.250, 0.250, 0.010, 0.010, 0.010, 0.010, -0.30, -0.025, -0.30, 0.000, -0.30, 0.000, 0.000, 0.000, 0.250, 0.250, 0.250, -! make CWPVT vegetation dependent according to J. Goudriaan, Crop Micrometeorology: A Simulation Study (Simulation monographs), 1977). C. He, 12/17/2020 - CWPVT = 0.18, 0.67, 0.18, 0.67, 0.29, 1.0, 2.0, 1.3, 1.0, 5.0, 1.17, 1.67, 1.67, 1.67, 0.18, 0.18, 0.18, 0.67, 1.0, 0.18, - C3PSN = 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, - KC25 = 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, - AKC = 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, - KO25 = 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, - AKO = 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, - AVCMX = 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, - AQE = 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, - - LTOVRC= 0.5, 0.55, 0.2, 0.55, 0.5, 0.65, 0.65, 0.65, 0.65, 0.50, 1.4, 1.6, 0.0, 1.2, 0.0, 0.0, 0.0, 1.3, 1.4, 1.0, - DILEFC= 1.20, 0.50, 1.80, 0.60, 0.80, 0.20, 0.20, 0.20, 0.50, 0.20, 0.4, 0.50, 0.00, 0.35, 0.00, 0.00, 0.00, 0.30, 0.40, 0.30, - DILEFW= 0.20, 4.00, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.50, 0.10, 0.2, 0.20, 0.00, 0.20, 0.00, 0.00, 0.00, 0.20, 0.20, 0.20, - RMF25 = 3.00, 0.65, 4.00, 3.00, 3.00, 0.26, 0.26, 0.26, 0.80, 1.80, 3.2, 1.00, 0.00, 1.45, 0.00, 0.00, 0.00, 3.00, 3.00, 3.00, - SLA = 80, 80, 80, 80, 80, 60, 60, 60, 50, 60, 80, 80, 60, 80, 0, 0, 0, 80, 80, 80, - FRAGR = 0.10, 0.20, 0.10, 0.20, 0.10, 0.20, 0.20, 0.20, 0.20, 0.20, 0.1, 0.20, 0.00, 0.20, 0.00, 0.10, 0.00, 0.10, 0.10, 0.10, - TMIN = 265, 273, 268, 273, 268, 273, 273, 273, 273, 273, 268, 273, 0, 273, 0, 0, 0, 268, 268, 268, - VCMX25= 50.0, 60.0, 60.0, 60.0, 55.0, 40.0, 40.0, 40.0, 40.0, 40.0, 50.0, 80.0, 0.00, 60.0, 0.00, 0.00, 0.00, 50.0, 50.0, 50.0, - TDLEF = 278, 278, 268, 278, 268, 278, 278, 278, 278, 278, 268, 278, 278, 278, 0, 0, 0, 268, 268, 268, - BP = 2.E3, 2.E3, 2.E3, 2.E3, 2.E3, 2.E3, 2.E3, 2.E3, 2.E3, 2.E3, 2.E3, 2.E3, 1.E15, 2.E3, 1.E15, 2.E3, 1.E15, 2.E3, 2.E3, 2.E3, - MP = 6., 9., 6., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., - QE25 = 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.00, 0.06, 0.00, 0.06, 0.00, 0.06, 0.06, 0.06, - RMS25 = 0.90, 0.30, 0.64, 0.10, 0.80, 0.10, 0.10, 0.10, 0.32, 0.10, 0.10, 0.10, 0.00, 0.10, 0.00, 0.00, 0.00, 0.10, 0.10, 0.00, - RMR25 = 0.36, 0.05, 0.05, 0.01, 0.03, 0.00, 0.00, 0.00, 0.01, 1.20, 0.0, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 2.11, 2.11, 0.00, - ARM = 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, - FOLNMX= 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 0.00, 1.5, 0.00, 1.5, 0.00, 1.5, 1.5, 1.5, - WDPOOL= 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 0.00, 0.5, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.00, 0.00, - WRRAT = 30.0, 30.0, 30.0, 30.0, 30.0, 3.00, 3.00, 3.00, 3.00, 0.00, 15.0, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 3.00, 3.00, 0.00, - MRP = 0.37, 0.23, 0.37, 0.40, 0.30, 0.19, 0.19, 0.19, 0.40, 0.17, 0.285, 0.23, 0.00, 0.23, 0.00, 0.00, 0.00, 0.23, 0.20, 0.00, - NROOT = 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 2, 3, 1, 3, 1, 1, 0, 3, 3, 2, - RGL = 30.0, 30.0, 30.0, 30.0, 30.0, 100.0, 100.0, 100.0, 65.0, 100.0, 65.0, 100.0, 999.0, 100.0, 999.0, 999.0, 30.0, 100.0, 100.0, 100.0, - RS = 125.0, 150.0, 150.0, 100.0, 125.0, 300.0, 170.0, 300.0, 70.0, 40.0, 70.0, 40.0, 200.0, 40.0, 999.0, 999.0, 100.0, 150.0, 150.0, 200.0, - HS = 47.35, 41.69, 47.35, 54.53, 51.93, 42.00, 39.18, 42.00, 54.53, 36.35, 55.97, 36.25, 999.0, 36.25, 999.0, 999.0, 51.75, 42.00, 42.00, 42.00, - TOPT = 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, - RSMAX = 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., - -! Monthly values, one row for each month: - SAI_JAN = 0.4, 0.5, 0.3, 0.4, 0.4, 0.3, 0.2, 0.4, 0.3, 0.3, 0.3, 0.3, 0.0, 0.3, 0.0, 0.0, 0.0, 0.2, 0.1, 0.0, - SAI_FEB = 0.4, 0.5, 0.3, 0.4, 0.4, 0.3, 0.2, 0.4, 0.3, 0.3, 0.3, 0.3, 0.0, 0.3, 0.0, 0.0, 0.0, 0.2, 0.1, 0.0, - SAI_MAR = 0.4, 0.5, 0.3, 0.4, 0.4, 0.3, 0.2, 0.4, 0.3, 0.3, 0.3, 0.3, 0.0, 0.3, 0.0, 0.0, 0.0, 0.2, 0.1, 0.0, - SAI_APR = 0.3, 0.5, 0.4, 0.4, 0.4, 0.3, 0.2, 0.4, 0.3, 0.3, 0.3, 0.3, 0.0, 0.3, 0.0, 0.0, 0.0, 0.2, 0.1, 0.0, - SAI_MAY = 0.4, 0.5, 0.4, 0.4, 0.4, 0.3, 0.2, 0.4, 0.3, 0.3, 0.3, 0.3, 0.0, 0.3, 0.0, 0.0, 0.0, 0.2, 0.1, 0.0, - SAI_JUN = 0.5, 0.5, 0.7, 0.4, 0.4, 0.3, 0.2, 0.4, 0.4, 0.4, 0.4, 0.3, 0.0, 0.4, 0.0, 0.0, 0.0, 0.2, 0.2, 0.0, - SAI_JUL = 0.5, 0.5, 1.3, 0.9, 0.7, 0.6, 0.4, 0.7, 0.8, 0.8, 0.6, 0.4, 0.0, 0.6, 0.0, 0.0, 0.0, 0.4, 0.4, 0.0, - SAI_AUG = 0.6, 0.5, 1.2, 1.2, 0.8, 0.9, 0.6, 1.2, 1.2, 1.3, 0.9, 0.5, 0.0, 0.9, 0.0, 0.0, 0.0, 0.6, 0.6, 0.0, - SAI_SEP = 0.6, 0.5, 1.0, 1.6, 1.0, 1.2, 0.8, 1.4, 1.3, 1.1, 0.9, 0.4, 0.0, 0.7, 0.0, 0.0, 0.0, 0.8, 0.7, 0.0, - SAI_OCT = 0.7, 0.5, 0.8, 1.4, 1.0, 0.9, 0.7, 1.1, 0.7, 0.4, 0.6, 0.3, 0.0, 0.3, 0.0, 0.0, 0.0, 0.7, 0.5, 0.0, - SAI_NOV = 0.6, 0.5, 0.6, 0.6, 0.5, 0.4, 0.3, 0.5, 0.4, 0.4, 0.4, 0.3, 0.0, 0.3, 0.0, 0.0, 0.0, 0.3, 0.3, 0.0, - SAI_DEC = 0.5, 0.5, 0.5, 0.4, 0.4, 0.3, 0.2, 0.4, 0.4, 0.4, 0.3, 0.3, 0.0, 0.3, 0.0, 0.0, 0.0, 0.2, 0.2, 0.0, - - LAI_JAN = 4.0, 4.5, 0.0, 0.0, 2.0, 0.0, 0.0, 0.2, 0.3, 0.4, 0.2, 0.0, 0.0, 0.2, 0.0, 0.0, 0.0, 1.0, 0.6, 0.0, - LAI_FEB = 4.0, 4.5, 0.0, 0.0, 2.0, 0.0, 0.0, 0.2, 0.3, 0.5, 0.3, 0.0, 0.0, 0.3, 0.0, 0.0, 0.0, 1.0, 0.6, 0.0, - LAI_MAR = 4.0, 4.5, 0.0, 0.3, 2.2, 0.3, 0.2, 0.4, 0.5, 0.6, 0.3, 0.0, 0.0, 0.3, 0.0, 0.0, 0.0, 1.1, 0.7, 0.0, - LAI_APR = 4.0, 4.5, 0.6, 1.2, 2.6, 0.9, 0.6, 1.0, 0.8, 0.7, 0.5, 0.0, 0.0, 0.4, 0.0, 0.0, 0.0, 1.3, 0.8, 0.0, - LAI_MAY = 4.0, 4.5, 1.2, 3.0, 3.5, 2.2, 1.5, 2.4, 1.8, 1.2, 1.5, 1.0, 0.0, 1.1, 0.0, 0.0, 0.0, 1.7, 1.2, 0.0, - LAI_JUN = 4.0, 4.5, 2.0, 4.7, 4.3, 3.5, 2.3, 4.1, 3.6, 3.0, 2.9, 2.0, 0.0, 2.5, 0.0, 0.0, 0.0, 2.1, 1.8, 0.0, - LAI_JUL = 4.0, 4.5, 2.6, 4.5, 4.3, 3.5, 2.3, 4.1, 3.8, 3.5, 3.5, 3.0, 0.0, 3.2, 0.0, 0.0, 0.0, 2.1, 1.8, 0.0, - LAI_AUG = 4.0, 4.5, 1.7, 3.4, 3.7, 2.5, 1.7, 2.7, 2.1, 1.5, 2.7, 3.0, 0.0, 2.2, 0.0, 0.0, 0.0, 1.8, 1.3, 0.0, - LAI_SEP = 4.0, 4.5, 1.0, 1.2, 2.6, 0.9, 0.6, 1.0, 0.9, 0.7, 1.2, 1.5, 0.0, 1.1, 0.0, 0.0, 0.0, 1.3, 0.8, 0.0, - LAI_OCT = 4.0, 4.5, 0.5, 0.3, 2.2, 0.3, 0.2, 0.4, 0.5, 0.6, 0.3, 0.0, 0.0, 0.3, 0.0, 0.0, 0.0, 1.1, 0.7, 0.0, - LAI_NOV = 4.0, 4.5, 0.2, 0.0, 2.0, 0.0, 0.0, 0.2, 0.3, 0.5, 0.3, 0.0, 0.0, 0.3, 0.0, 0.0, 0.0, 1.0, 0.6, 0.0, - LAI_DEC = 4.0, 4.5, 0.0, 0.0, 2.0, 0.0, 0.0, 0.2, 0.3, 0.4, 0.2, 0.0, 0.0, 0.2, 0.0, 0.0, 0.0, 1.0, 0.6, 0.0, - - SLAREA=0.0090, 0.0200, 0.0200, 0.0258, 0.0223, 0.0227, 0.0188, 0.0227, 0.0236, 0.0060, 0.0295, 0.0200, 0.0228, 0.0223, 0.02, 0.02, 0.0422, 0.02, 0.02, 0.02, - -! Five types, one row for each type (BVOC currently not active). - EPS1 = 0.46, 0.00, 0.00, 46.86, 30.98, 21.62, 0.11, 21.62, 22.80, 0.02, 0.815, 0.00, 41.87, 0.04, 0.0, 0.0, 2.31, 0.0, 0.0, 0.0, - EPS2 = 3.34, 0.00, 0.00, 0.38, 0.96, 0.92, 0.22, 0.92, 0.59, 0.05, 0.535, 0.00, 0.98, 0.09, 0.0, 0.0, 1.47, 0.0, 0.0, 0.0, - EPS3 = 1.85, 0.00, 0.00, 1.84, 1.84, 1.73, 1.26, 1.73, 1.37, 0.03, 0.605, 0.00, 1.82, 0.05, 0.0, 0.0, 1.70, 0.0, 0.0, 0.0, - EPS4 = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, - EPS5 = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, - -/ - -&noahmp_rad_parameters - !------------------------------------------------------------------------------ - ! 1 2 3 4 5 6 7 8 soil color index for soil albedo - !------------------------------------------------------------------------------ - ALBSAT_VIS = 0.15, 0.11, 0.10, 0.09, 0.08, 0.07, 0.06, 0.05 ! saturated soil albedos - ALBSAT_NIR = 0.30, 0.22, 0.20, 0.18, 0.16, 0.14, 0.12, 0.10 ! saturated soil albedos - ALBDRY_VIS = 0.27, 0.22, 0.20, 0.18, 0.16, 0.14, 0.12, 0.10 ! dry soil albedos - ALBDRY_NIR = 0.54, 0.44, 0.40, 0.36, 0.32, 0.28, 0.24, 0.20 ! dry soil albedos - ALBICE = 0.80, 0.55 ! albedo land ice: 1=vis, 2=nir - ALBLAK = 0.60, 0.40 ! albedo frozen lakes: 1=vis, 2=nir - OMEGAS = 0.8 , 0.4 ! two-stream parameter omega for snow - BETADS = 0.5 ! two-stream parameter betad for snow - BETAIS = 0.5 ! two-stream parameter betaI for snow - EG = 0.97, 0.98 ! emissivity soil surface 1-soil;2-lake - -/ - -&noahmp_global_parameters - -! atmospheric constituants - - CO2 = 395.e-06 !co2 partial pressure - O2 = 0.209 !o2 partial pressure - -! runoff parameters used for SIMTOP and SIMGM: - - TIMEAN = 10.5 !gridcell mean topgraphic index (global mean) - FSATMX = 0.38 !maximum surface saturated fraction (global mean) - -! adjustable parameters for snow processes - - Z0SNO = 0.002 !snow surface roughness length (m) (0.002) - SSI = 0.03 !liquid water holding capacity for snowpack (m3/m3) (0.03) - SNOW_RET_FAC = 5.e-5 !snowpack water release timescale factor (1/s) - SNOW_EMIS = 0.95 !snow emissivity (bring from hard-coded value of 1.0 to here) - SWEMX = 1.00 !new snow mass to fully cover old snow (mm) - !equivalent to 10mm depth (density = 100 kg/m3) - TAU0 = 1.e6 !tau0 from Yang97 eqn. 10a - GRAIN_GROWTH = 5000. !growth from vapor diffusion Yang97 eqn. 10b - EXTRA_GROWTH = 10. !extra growth near freezing Yang97 eqn. 10c - DIRT_SOOT = 0.3 !dirt and soot term Yang97 eqn. 10d - BATS_COSZ = 2.0 !zenith angle snow albedo adjustment; b in Yang97 eqn. 15 - BATS_VIS_NEW = 0.95 !new snow visible albedo - BATS_NIR_NEW = 0.65 !new snow NIR albedo - BATS_VIS_AGE = 0.2 !age factor for diffuse visible snow albedo Yang97 eqn. 17 - BATS_NIR_AGE = 0.5 !age factor for diffuse NIR snow albedo Yang97 eqn. 18 - BATS_VIS_DIR = 0.4 !cosz factor for direct visible snow albedo Yang97 eqn. 15 - BATS_NIR_DIR = 0.4 !cosz factor for direct NIR snow albedo Yang97 eqn. 16 - RSURF_SNOW = 50.0 !surface resistence for snow [s/m] - RSURF_EXP = 5.0 !exponent in the shape parameter for soil resistance option 1 - -/ - -&noahmp_irrigation_parameters -IRR_FRAC = 0.10 ! irrigation Fraction -IRR_HAR = 20 ! number of days before harvest date to stop irrigation -IRR_LAI = 0.10 ! Minimum lai to trigger irrigation -IRR_MAD = 0.60 ! management allowable deficit (0.0-1.0) -FILOSS = 0.50 ! flood irrigation loss fraction (0.0-0.99) -SPRIR_RATE = 6.40 ! mm/h, sprinkler irrigation rate -MICIR_RATE = 1.38 ! mm/h, micro irrigation rate -FIRTFAC = 1.20 ! flood application rate factor -IR_RAIN = 1.00 ! maximum precipitation to stop irrigation trigger -/ - -&noahmp_crop_parameters - - ! NCROP = 5 - ! 1: Corn - ! 2: Soybean - ! 3: Sorghum - ! 4: Rice - ! 5: Winter wheat - -DEFAULT_CROP = 0 ! The default crop type(1-5); if zero, use generic dynamic vegetation - -!---------------------------------------------------------- -! 1 2 3 4 5 -!---------------------------------------------------------- - -PLTDAY = 111, 131, 111, 111, 111, ! Planting date -HSDAY = 300, 280, 300, 300, 300, ! Harvest date -PLANTPOP = 78.0, 78.0, 78.0, 78.0, 78.0, ! Plant density [per ha] - used? -IRRI = 0.0, 0.0, 0.0, 0.0, 0.0, ! Irrigation strategy 0= non-irrigation 1=irrigation (no water-stress) - -GDDTBASE = 10.0, 10.0, 10.0, 10.0, 10.0, ! Base temperature for GDD accumulation [C] -GDDTCUT = 30.0, 30.0, 30.0, 30.0, 30.0, ! Upper temperature for GDD accumulation [C] -GDDS1 = 50.0, 60.0, 50.0, 50.0, 50.0, ! GDD from seeding to emergence -GDDS2 = 625.0, 675.0, 718.0, 718.0, 718.0, ! GDD from seeding to initial vegetative -GDDS3 = 933.0, 1183.0, 933.0, 933.0, 933.0, ! GDD from seeding to post vegetative -GDDS4 = 1103.0, 1253.0, 1103.0, 1103.0, 1103.0, ! GDD from seeding to intial reproductive -GDDS5 = 1555.0, 1605.0, 1555.0, 1555.0, 1555.0, ! GDD from seeding to pysical maturity -C3PSN = 0.0, 1.0, 1.0, 1.0, 1.0, ! transfer crop-specific photosynthetic parameters -KC25 = 30.0, 30.0, 30.0, 30.0, 30.0, ! Zhe Zhang -AKC = 2.1, 2.1, 2.1, 2.1, 2.1, ! 2020-02-05 -KO25 = 3.E4, 3.E4, 3.E4, 3.E4, 3.E4, ! -AKO = 1.2, 1.2, 1.2, 1.2, 1.2, ! -AVCMX = 2.4, 2.4, 2.4, 2.4, 2.4, ! -VCMX25 = 60.0, 80.0, 60.0, 60.0, 55.0, ! -BP = 4.E4, 1.E4, 2.E3, 2.E3, 2.E3, ! -MP = 4., 9., 6., 9., 9., ! -FOLNMX = 1.5, 1.5, 1.5, 1.5, 1.5, ! -QE25 = 0.05, 0.06, 0.06, 0.06, 0.06, ! -C3C4 = 2, 1, 2, 2, 2, ! photosynthetic pathway: 1. = c3 2. = c4 -Aref = 7.0, 7.0, 7.0, 7.0, 7.0, ! reference maximum CO2 assimulation rate -PSNRF = 0.85, 0.85, 0.85, 0.85, 0.85, ! CO2 assimulation reduction factor(0-1) (caused by non-modeling part,e.g.pest,weeds) -I2PAR = 0.5, 0.5, 0.5, 0.5, 0.5, ! Fraction of incoming solar radiation to photosynthetically active radiation -TASSIM0 = 8.0, 8.0, 8.0, 8.0, 8.0, ! Minimum temperature for CO2 assimulation [C] -TASSIM1 = 18.0, 18.0, 18.0, 18.0, 18.0, ! CO2 assimulation linearly increasing until temperature reaches T1 [C] -TASSIM2 = 30.0, 30.0, 30.0, 30.0, 30.0, ! CO2 assmilation rate remain at Aref until temperature reaches T2 [C] -K = 0.55, 0.55, 0.55, 0.55, 0.55, ! light extinction coefficient -EPSI = 12.5, 12.5, 12.5, 12.5, 12.5, ! initial light use efficiency - -Q10MR = 2.0, 2.0, 2.0, 2.0, 2.0, ! q10 for maintainance respiration -FOLN_MX = 1.5, 1.5, 1.5, 1.5, 1.5, ! foliage nitrogen concentration when f(n)=1 (%) -LEFREEZ = 268, 268, 268, 268, 268, ! characteristic T for leaf freezing [K] - -DILE_FC_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! coeficient for temperature leaf stress death [1/s] -DILE_FC_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! One row for each of 8 stages -DILE_FC_S3 = 0.0, 0.0, 0.0, 0.0, 0.0, -DILE_FC_S4 = 0.0, 0.0, 0.0, 0.0, 0.0, -DILE_FC_S5 = 0.5, 0.5, 0.5, 0.5, 0.5, -DILE_FC_S6 = 0.5, 0.5, 0.5, 0.5, 0.5, -DILE_FC_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, -DILE_FC_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, - -DILE_FW_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! coeficient for water leaf stress death [1/s] -DILE_FW_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! One row for each of 8 stages -DILE_FW_S3 = 0.0, 0.0, 0.0, 0.0, 0.0, -DILE_FW_S4 = 0.0, 0.0, 0.0, 0.0, 0.0, -DILE_FW_S5 = 0.2, 0.2, 0.2, 0.2, 0.2, -DILE_FW_S6 = 0.2, 0.2, 0.2, 0.2, 0.2, -DILE_FW_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, -DILE_FW_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, - -FRA_GR = 0.2, 0.2, 0.2, 0.2, 0.2, ! fraction of growth respiration - -LF_OVRC_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of leaf turnover [1/s] -LF_OVRC_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! One row for each of 8 stages -LF_OVRC_S3 = 0.0, 0.0, 0.0, 0.0, 0.0, -LF_OVRC_S4 = 0.0, 0.0, 0.0, 0.0, 0.0, -LF_OVRC_S5 = 0.2, 0.2, 0.48, 0.48, 0.48, -LF_OVRC_S6 = 0.3, 0.3, 0.48, 0.48, 0.48, -LF_OVRC_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, -LF_OVRC_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, - -ST_OVRC_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of stem turnover [1/s] -ST_OVRC_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! One row for each of 8 stages -ST_OVRC_S3 = 0.0, 0.0, 0.0, 0.0, 0.0, -ST_OVRC_S4 = 0.0, 0.0, 0.0, 0.0, 0.0, -ST_OVRC_S5 = 0.2, 0.12, 0.12, 0.12, 0.12, -ST_OVRC_S6 = 0.3, 0.06, 0.06, 0.06, 0.06, -ST_OVRC_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, -ST_OVRC_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, - -RT_OVRC_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of root tunrover [1/s] -RT_OVRC_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! One row for each of 8 stages -RT_OVRC_S3 = 0.0, 0.0, 0.0, 0.0, 0.0, -RT_OVRC_S4 = 0.0, 0.0, 0.0, 0.0, 0.0, -RT_OVRC_S5 = 0.12, 0.12, 0.12, 0.12, 0.12, -RT_OVRC_S6 = 0.06, 0.06, 0.06, 0.06, 0.06, -RT_OVRC_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, -RT_OVRC_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, - -LFMR25 = 0.8, 1.0, 1.0, 1.0, 1.0, ! leaf maintenance respiration at 25C [umol CO2/m**2 /s] -STMR25 = 0.05, 0.05, 0.1, 0.1, 0.1, ! stem maintenance respiration at 25C [umol CO2/kg bio/s] -RTMR25 = 0.05, 0.05, 0.0, 0.0, 0.0, ! root maintenance respiration at 25C [umol CO2/kg bio/s] -GRAINMR25 = 0.0, 0.0, 0.1, 0.1, 0.1, ! grain maintenance respiration at 25C [umol CO2/kg bio/s] - -LFPT_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to leaf -LFPT_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! One row for each of 8 stages -LFPT_S3 = 0.36, 0.4, 0.4, 0.4, 0.4, -LFPT_S4 = 0.1, 0.2, 0.2, 0.2, 0.2, -LFPT_S5 = 0.0, 0.0, 0.0, 0.0, 0.0, -LFPT_S6 = 0.0, 0.0, 0.0, 0.0, 0.0, -LFPT_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, -LFPT_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, - -STPT_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to stem -STPT_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! One row for each of 8 stages -STPT_S3 = 0.24, 0.2, 0.2, 0.2, 0.2, -STPT_S4 = 0.6, 0.5, 0.5, 0.5, 0.5, -STPT_S5 = 0.0, 0.0, 0.15, 0.15, 0.15, -STPT_S6 = 0.0, 0.0, 0.05, 0.05, 0.05, -STPT_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, -STPT_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, - -RTPT_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to root -RTPT_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! One row for each of 8 stages -RTPT_S3 = 0.4, 0.4, 0.4, 0.4, 0.4, -RTPT_S4 = 0.3, 0.3, 0.3, 0.3, 0.3, -RTPT_S5 = 0.05, 0.05, 0.05, 0.05, 0.05, -RTPT_S6 = 0.0, 0.0, 0.05, 0.05, 0.05, -RTPT_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, -RTPT_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, - -GRAINPT_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to grain -GRAINPT_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! One row for each of 8 stages -GRAINPT_S3 = 0.0, 0.0, 0.0, 0.0, 0.0, -GRAINPT_S4 = 0.0, 0.0, 0.0, 0.0, 0.0, -GRAINPT_S5 = 0.95, 0.95, 0.8, 0.8, 0.8, -GRAINPT_S6 = 1.0, 1.0, 0.9, 0.9, 0.9, -GRAINPT_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, -GRAINPT_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, - -LFCT_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! carbohydrate translocation -LFCT_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, -LFCT_S3 = 0.0, 0.0, 0.4, 0.4, 0.4, -LFCT_S4 = 0.0, 0.0, 0.3, 0.3, 0.3, -LFCT_S5 = 0.0, 0.0, 0.05, 0.05, 0.05, -LFCT_S6 = 0.0, 0.0, 0.05, 0.05, 0.05, -LFCT_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, -LFCT_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, - -STCT_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! carbohydrate translocation -STCT_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, -STCT_S3 = 0.0, 0.0, 0.4, 0.4, 0.4, -STCT_S4 = 0.0, 0.0, 0.3, 0.3, 0.3, -STCT_S5 = 0.0, 0.0, 0.05, 0.05, 0.05, -STCT_S6 = 0.0, 0.0, 0.05, 0.05, 0.05, -STCT_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, -STCT_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, - -RTCT_S1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! carbohydrate translocation -RTCT_S2 = 0.0, 0.0, 0.0, 0.0, 0.0, -RTCT_S3 = 0.0, 0.0, 0.4, 0.4, 0.4, -RTCT_S4 = 0.0, 0.0, 0.3, 0.3, 0.3, -RTCT_S5 = 0.0, 0.0, 0.05, 0.05, 0.05, -RTCT_S6 = 0.0, 0.0, 0.05, 0.05, 0.05, -RTCT_S7 = 0.0, 0.0, 0.0, 0.0, 0.0, -RTCT_S8 = 0.0, 0.0, 0.0, 0.0, 0.0, - -BIO2LAI = 0.015, 0.030, 0.015, 0.015, 0.015, ! leaf are per living leaf biomass [m^2/kg] - -/ - -&noahmp_tiledrain_parameters -!-----------------------------------! -! For simple drainage model ! -!-----------------------------------! -DRAIN_LAYER_OPT = 4 - ! 0 - from one specified layer by TD_DEPTH, - ! 1 - from layers 1 & 2, - ! 2 - from layer layers 1, 2, and 3 - ! 3 - from layer 2 and 3 - ! 4 - from layer layers 3, 4 - ! 5 - from all the four layers -!-------------------------------------------------------------------------------------------------------------------------------------------------------------------- ! -! 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ! -!-------------------------------------------------------------------------------------------------------------------------------------------------------------------- ! -TDSMC_FAC = 0.90, 0.90, 0.90, 0.90, 0.90, 1.25, 0.90, 1.0, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90 ! corresponds to number of soil types SOILPARAM.TBL -TD_DEPTH = 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ! depth of drain tube from the soil surface -TD_DC = 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20. ! drainage coefficient (mm d^-1) -!-------------------------------------------------------------------------------------------------------------------------------------------------------------------- ! -! -!-------------------------------------! -! For Hooghoudt tile drain model ! -!-------------------------------------! -!-------------------------------------------------------------------------------------------------------------------------------------------------------------------- -TD_DCOEF = 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07 ! m d^-1, drainage coefficent -TD_D = 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00 ! m, depth to impe layer from drain water level (D) -TD_ADEPTH = 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00 ! m, actual depth of imp layer from land surface -TD_RADI = 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07 ! m, effective radius of drains (ro) -TD_SPAC = 60.0, 55.0, 45.0, 20.0, 25.0, 30.0, 40.0, 16.0, 18.0, 50.0, 15.0, 10.0, 35.0, 10.0, 60.0, 60.0, 10.0, 60.0, 60.0 ! m, distance between two drain tubes or tiles (L) -TD_DDRAIN = 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20 ! m, Depth of drain -KLAT_FAC = 1.30, 1.80, 2.10, 2.60, 2.90, 2.50, 2.30, 3.00, 2.70, 2.00, 3.10, 3.30, 2.50, 1.00, 1.00, 1.80, 4.00, 1.00, 1.30 ! multiplication factor to lateral hyd.cond -!-------------------------------------------------------------------------------------------------------------------------------------------------------------------- - -/ - -&noahmp_optional_parameters - - !------------------------------------------------------------------------------ - ! Saxton and Rawls 2006 Pedo-transfer function coefficients - !------------------------------------------------------------------------------ - - sr2006_theta_1500t_a = -0.024 ! sand coefficient - sr2006_theta_1500t_b = 0.487 ! clay coefficient - sr2006_theta_1500t_c = 0.006 ! orgm coefficient - sr2006_theta_1500t_d = 0.005 ! sand*orgm coefficient - sr2006_theta_1500t_e = -0.013 ! clay*orgm coefficient - sr2006_theta_1500t_f = 0.068 ! sand*clay coefficient - sr2006_theta_1500t_g = 0.031 ! constant adjustment - - sr2006_theta_1500_a = 0.14 ! theta_1500t coefficient - sr2006_theta_1500_b = -0.02 ! constant adjustment - - sr2006_theta_33t_a = -0.251 ! sand coefficient - sr2006_theta_33t_b = 0.195 ! clay coefficient - sr2006_theta_33t_c = 0.011 ! orgm coefficient - sr2006_theta_33t_d = 0.006 ! sand*orgm coefficient - sr2006_theta_33t_e = -0.027 ! clay*orgm coefficient - sr2006_theta_33t_f = 0.452 ! sand*clay coefficient - sr2006_theta_33t_g = 0.299 ! constant adjustment - - sr2006_theta_33_a = 1.283 ! theta_33t*theta_33t coefficient - sr2006_theta_33_b = -0.374 ! theta_33t coefficient - sr2006_theta_33_c = -0.015 ! constant adjustment - - sr2006_theta_s33t_a = 0.278 ! sand coefficient - sr2006_theta_s33t_b = 0.034 ! clay coefficient - sr2006_theta_s33t_c = 0.022 ! orgm coefficient - sr2006_theta_s33t_d = -0.018 ! sand*orgm coefficient - sr2006_theta_s33t_e = -0.027 ! clay*orgm coefficient - sr2006_theta_s33t_f = -0.584 ! sand*clay coefficient - sr2006_theta_s33t_g = 0.078 ! constant adjustment - - sr2006_theta_s33_a = 0.636 ! theta_s33t coefficient - sr2006_theta_s33_b = -0.107 ! constant adjustment - - sr2006_psi_et_a = -21.67 ! sand coefficient - sr2006_psi_et_b = -27.93 ! clay coefficient - sr2006_psi_et_c = -81.97 ! theta_s33 coefficient - sr2006_psi_et_d = 71.12 ! sand*theta_s33 coefficient - sr2006_psi_et_e = 8.29 ! clay*theta_s33 coefficient - sr2006_psi_et_f = 14.05 ! sand*clay coefficient - sr2006_psi_et_g = 27.16 ! constant adjustment - - sr2006_psi_e_a = 0.02 ! psi_et*psi_et coefficient - sr2006_psi_e_b = -0.113 ! psi_et coefficient - sr2006_psi_e_c = -0.7 ! constant adjustment - - sr2006_smcmax_a = -0.097 ! sand adjustment - sr2006_smcmax_b = 0.043 ! constant adjustment - -/ -