!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE SOILEBM ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE soilebm(nx,ny,nz,soiltyp,vegtyp,lai,veg, & 1,5
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
qvsfc,windsp,psfc,rhoa,precip, &
tair,qvair,cdha,cdqa,radsw,rnflx,shflx,lhflx,gflx,ct, &
evaprg,evaprtr,evaprr,qvsat,qvsata,f34)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Predict the soil surface temperature and moisture contents by solving
! the surface energy and moisture budget equtions:
!
! 1. the ground surface temperature, Ts -- tsfc
! 2. the deep ground temperature, T2 -- tsoil
! 3. the surface soil moisture, wg -- wetsfc
! 4. the deep soil moisture, w2 -- wetdp
! 5. the canopy moisture, wr -- wetcanp
!
!-----------------------------------------------------------------------
!
! The equations are listed as follows.
!
!
! d Ts 2PI
! ------ = Ct (Rn - H - LE) - ----- (Ts - T2)
! d t Tau
!
!
! d T2 1
! ------ = ----- (Ts - T2)
! d t Tau
!
!
! d Wg C1 C2
! ------ = ------ (Pg - Eg) - ----- (Wg - Wgeq)
! d t ROw d1 Tau
!
!
! d W2 1
! ------ = ------ (Pg - Eg - Etr)
! d t ROw d2
!
!
! d Wr
! ------ = Veg P - Er
! d t
!
!
! where
!
! Tau -- 1 day in seconds = 86400 seconds
! PI -- number of PI = 3.141592654
! ROw -- Density of liquid water
! d1 -- Top layer depth of soil column, 0.01 m
! d2 -- Deep layer depth of soil column, 1 m
! Veg -- Vegetation fraction
! Ct -- Thermal capacity
! Rn -- Radiation flux, rnflx
! H -- Sensible heat flux, shflx
! LE -- Latent heat flux, lhflx = latent*(Eg + Ev)
! Eg -- Evaporation from ground
! Ev -- Evapotranspiration from vegetation, Ev = Etr + Er
! Etr -- Transpiration of the remaining part of the leaves
! Er -- Evaporation directly from the foliage covered by
! intercepted water
! P -- Precipitation rates
! Pg -- Precipitation reaching the ground,
! Pg = (1 - Veg) P
! Wgeq -- Surface volumetric moisture
! C1, C2 -- Coefficients
!
! For detailed information about the surface energy budget model,
! see the articles in the reference list.
!
! The second-order Rouge-Kutta time integration scheme is used,
! which is described below.
!
! Assume a equation in the form of
!
! d X
! ----- = F(X, t)
! d t
!
! In the forward scheme, we have
!
! X(1) = X(0) + dt * F[X(0), t0]
!
! We split one time step into two halves, dt2 = dt/2, and use the
! forward scheme to calculate the first half step X(1/2).
!
! X(1/2) = X(0) + dt2 * F[X(0), t0]
!
! Then we can calculate the Right Hand Side (RHS) of the equation at
! the half step, F[X(1/2), t(1/2)]. Finally, we calculate the one
! step prediction, X(t1), by use of the average of F[X(0), t0] and
! F[X(1/2), t(1/2)].
!
! X(1) = X(0) + dt * 0.5 * { F[X(0),t0] + F[X(1/2), t(1/2)] }
! REFERENCES:
!
! Jacquemin, B. and J. Noilhan, 1990: Sensitivity Study and
! Validation of a Land Surface Parameterization Using the
! HAPEX-MOBILHP Data Set, Boundary-Layer Meteorology, 52,
! 93-134, (JN).
!
! Noilhan, J. and S. Planton, 1989: A Simple Parameterization of
! Land Surface Processes for Meteorological Model, Mon. Wea.
! Rev., 117, 536-549, (NP).
!
! Pleim, J. E. and A. Xiu, 1993: Development and Testing of a
! Land-Surface and PBL Model with Explicit Soil Moisture
! Parameterization, Preprints, Conf. Hydroclimat., AMS, 45-51,
! (PX).
!
! Bougeault, P., et al., 1991: An Experiment with an Advanced
! Surface Parameterization in a Mesobeta-Scale Model. Part I:
! Implementation, Monthly Weather Review, 119, 2358-2373.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu and Vince Wong
! 11/16/93
!
! MODIFICATION HISTORY:
!
! 10/30/94 (Y. Liu)
! Fixed a bug reported by Richard Carpenter.
!
! 11/01/1994 (Y. Liu)
! Subroutine name of soil model were changed from SFCEBM to SOILEBM
! and the arguments passed were changed to 2-D arrays instead of 3-D
! temporary arrays.
!
! 12/12/1994 (Y. Liu)
! Fixed a bug for the final calcultaion of qvsfc.
!
! 12/14/1994 (Y. Liu)
! Fixed a bug in phycst.inc for the water density value which was
! previously mistakingly set to 1 kg/m**3. The correct value should
! be 1000 kg/m**3. This bug largely influenced the integration of Wg
! and W2.
!
! 12/23/1994 (Y. Liu)
! Added the runoff calculation for Wr.
!
! 02/07/1995 (Yuhe Liu)
! Added a new 2-D permanent array, veg(nx,ny), to the soil model and
! at the same time delete the table data array veg(14).
!
! 03/27/1995 (Yuhe Liu)
! Changed the solor radiation used in the calculation of surface
! resistence factor F1 from the one at the top of atmosphere to the
! one at the surface.
!
! Changed the formula of calculating the surface resistence factor
! F3 to F3=1, instead of varying with qvsat(Tair) and qvair.
!
! 12/8/1998 (Donghai Wang and Vince Wong)
! Added a new 2-D permanent array, snowcvr(nx,ny), for snow cover.
! We just used a simple scheme to consider the snow cover process.
!
! 2000/01/10 (Gene Bassett)
! Snow cover (0 or 1) changed to snow depth (snowdpth). For simplicity
! a fractional value for snow cover is not used (simply say the grid
! point is completely covered with snow if snowdpth > snowdepth_crit,
! otherwise no snow).
!
! 2000/02/04 (Gene Bassett, Yang Kun)
! Fixed an error in tsoil integration (rhst2) causing tsoil to change
! by only 50% of what it should.
!
! 2001/12/07 (Diandong Ren, Ming Xue)
! Re-structured the code, moved the calculations of the right hand
! side terms of the soil-vegetation model into subroutine soilebm_frc.
!
! Soil seasonal temperature trend to be added.
!
! 2002/02/15 (Yunheng Wang)
! Changed wrmax to a 2-D array which was a bug found during mpi testing.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the z-direction (sfc/top)
!
! soiltyp Soil type at the horizontal grid points
! vegtyp Vegetation type at the horizontal grid points
! lai Leaf Area Index
! veg Vegetation fraction
!
! windsp Wind speed just above the surface (m/s)
! psfc Surface pressure (Pascal)
! rhoa Near sfc air density
! precip Precipitation flux reaching the surface (m/s)
!
! cdha Array for cdh, surface drag coefficient for heat
! cdqa Array for cdq, surface drag coefficient for moisture
!
! pres 3-dimensional pressure
! temp 3-dimensional temperature
! qv 3-dimensional specific humidity
!
! INPUT/OUTPUT:
!
! tsfc Temperature at ground surface (K)
! tsoil Deep soil temperature (K)
! wetsfc Surface soil moisture
! wetdp Deep soil moisture
! wetcanp Canopy water amount
!
! OUTPUT:
!
! qvsfc Effective S. H. at sfc.
!
! Local automatic work arrays for storing the right hand forcing terms
! of the soil model equations and for storing intermediate values of the
! soil state variables.
!
! frc_tsfc Temporary array
! frc_tsoil Temporary array
! frc_wsfc Temporary array
! frc_wdp Temporary array
! frc_wcnp Temporary array
!
! tsfcn Temporary array
! tsoiln Temporary array
! wgn Temporary array
! w2n Temporary array
! wrn Temporary array
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz
REAL :: windsp(nx,ny) ! Wind speed
REAL :: psfc (nx,ny) ! Surface pressure
REAL :: rhoa (nx,ny) ! Air density near the surface
REAL :: precip(nx,ny) ! Precipitation rate at the surface
INTEGER :: soiltyp(nx,ny) ! Soil type at each point
INTEGER :: vegtyp (nx,ny) ! Vegetation type at each point
REAL :: lai (nx,ny) ! Leaf Area Index
REAL :: veg (nx,ny) ! Vegetation fraction
REAL :: tsfc (nx,ny) ! Temperature at ground surface (K)
REAL :: tsoil (nx,ny) ! Deep soil temperature (K)
REAL :: wetsfc (nx,ny) ! Surface soil moisture
REAL :: wetdp (nx,ny) ! Deep soil moisture
REAL :: wetcanp(nx,ny) ! Canopy water amount
REAL :: qvsfc (nx,ny) ! Effective humidity at surface
REAL :: snowdpth(nx,ny) ! Snow depth (m)
REAL :: tair (nx,ny) ! Surface air temperature (K)
REAL :: qvair (nx,ny) ! Surface air specific humidity (kg/kg)
REAL :: cdha (nx,ny) ! Surface drag coeff. for heat
REAL :: cdqa (nx,ny) ! Surface drag coeff. for moisture
REAL :: radsw (nx,ny) ! Solar radiation reaching the surface
REAL :: rnflx (nx,ny) ! Radiation flux at surface
REAL :: shflx (nx,ny) ! Sensible heat flux at surface
REAL :: lhflx (nx,ny) ! Latent heat flux at surface
REAL :: gflx (nx,ny) ! Ground diffusive heat flux
REAL :: ct (nx,ny) ! Soil thermal coefficient
REAL :: evaprg (nx,ny) ! Evaporation
REAL :: evaprtr(nx,ny) ! Transpiration from leaves
REAL :: evaprr (nx,ny) ! Direct evaporation from leaves
REAL :: f34 (nx,ny) ! Resistance factor of F3*F4
REAL :: qvsata (nx,ny) ! qvsat(tair) (kg/kg)
REAL :: qvsat (nx,ny) !
REAL :: frc_tsoil(nx,ny) ! Right hand side forcing for tsfc eq.
REAL :: frc_tsfc(nx,ny) ! Right hand side forcing for tsoil eq.
REAL :: frc_wsfc(nx,ny) ! Right hand side forcing for wetsfc eq.
REAL :: frc_wdp(nx,ny) ! Right hand side forcing for wetsp eq.
REAL :: frc_wcnp(nx,ny) ! Right hand side forcing for wetcanp eq.
REAL :: tsfcn(nx,ny) ! Temporary array, tsn
REAL :: tsoiln(nx,ny) ! Temporary array, t2n
REAL :: wgn(nx,ny) ! Temporary array, wetsfcNEW
REAL :: w2n(nx,ny) ! Temporary array, w2n
REAL :: wrn(nx,ny) ! Temporary array, wrn
REAL :: relief ! Difference between seasonal average skin and deep soil
!
!-----------------------------------------------------------------------
!
! Include files: globcst.inc and phycst.inc
!
!-----------------------------------------------------------------------
!
! Parameters and variables are defined in globcst.inc:
!
! dtsfc Surface model time step
! nsfcst # of surface model time steps
!
! moist Moist flag
!
! year Reference year
! month Reference month
! day Reference day
! jday Reference Julian day
! hour Hour of reference time
! minute Minute of reference time
! second Second of reference time
!
! latitud Latitude at the domain center
! longitud Longitude at the domain center
!
! curtim Current model time
! dtbig Length of big time step
!
! bslope Slope of the retention curve
! cgsat Soil thermal coefficient for bare ground at saturation
! cgv Soil thermal coef. for totally shielded ground by veg.
! pwgeq Coefficient of Wgeq formula. NP, Tab. 2
! awgeq Coefficient of Wgeq formula. NP, Tab. 2
! c1sat Value of C1 at saturation. NP, Tab. 2
! c2ref Value of C2 for W2 = .5 * Wsat. NP, Tab. 2
! wsat Saturated volumetric moisture content. JN, Tab. 1
! wfc Field capacity moisture. JN, Tab. 1
! wwlt Wilting volumetric moisture content. JN, Tab. 1
!
! Parameters and variables are defined in phycst.inc:
!
! solarc Solar constant (W/m**2)
! emissg Emissivity of the ground
! emissa Emissivity of the atmosphere
! sbcst Stefen-Boltzmann constant
!
! rhow Liquid water reference density (kg/m**3)
! rd Gas constant for dry air (kg/(m s**2))
! cp Gas heat capacity at constant pressure
! cv Gas heat capacity at constant volume
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'phycst.inc'
INCLUDE 'soilcst.inc'
!
!-----------------------------------------------------------------------
!
! Local variables:
!
!-----------------------------------------------------------------------
!
REAL :: pi ! Pi
PARAMETER (pi = 3.141592654)
REAL :: tau ! Seconds of a day = 24. * 3600.
PARAMETER (tau = 86400.)
REAL :: dtsfc2 ! Length of half time step in SFCEBM,
! dtsfc2 = dtsfc/2.
REAL :: log100 ! Constant: alog(100)
! dependent distance from the earth to the sun
REAL :: cg ! Soil thermal coefficient for bare ground
REAL :: rhsts(nx,ny) ! Right hand side of Eq. for Ts at current time
REAL :: rhst2(nx,ny) ! Right hand side of Eq. for T2 at current time
REAL :: rhswg(nx,ny) ! Right hand side of Eq. for Wg at current time
REAL :: rhsw2(nx,ny) ! Right hand side of Eq. for W2 at current time
REAL :: rhswr(nx,ny) ! Right hand side of Eq. for Wr at current time
REAL :: wrmax(nx,ny) ! Maximum value for canopy moisture, wetcanp
REAL :: c1wg ! Coefficient in the surface moisture Eq. of Wg
REAL :: c2wg ! Coefficient in the surface moisture Eq. of Wg
REAL :: wgeq ! Surface moisture when gravity balances the capillarity
REAL :: wr2max ! Tendency to reach the maximum wrmax
REAL :: runoff ! Runoff of the interception reservoir.
REAL :: pnet ! Residual of precip. and evap.
REAL :: vegp ! Precip. intercepted by vegetation
INTEGER :: i, j, it
REAL :: tema
REAL :: tauinv ! 1/tau
LOGICAL :: firstcall ! First call flag of this subroutine
SAVE firstcall, log100, dtsfc2, tauinv
DATA firstcall/.true./
INTEGER :: jday_min ! offset value from Jan 01.
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
IF (firstcall) THEN
log100 = ALOG(100.0)
dtsfc2 = dtsfc/2.0
tauinv = 1.0/tau
firstcall = .false.
END IF
IF ( moist /= 0 ) THEN
! Calculate saturated specific humidity near the surface, qvsata.
CALL getqvs
(nx,ny,1, 1,nx-1,1,ny-1,1,1, psfc,tair,qvsata)
DO j = 1, ny-1
DO i = 1, nx-1
f34(i,j) = MAX( 0., 1.0 - 0.0016 * (298.0-tair(i,j))**2 )
END DO
END DO
END IF
jday_min = 61 ! may change with latitude
relief=tsoil_offset_amplitude*sin((jday-jday_min)/365.0*2.0*PI)
!
!-----------------------------------------------------------------------
!
! Start time integration loop
!
!-----------------------------------------------------------------------
!
DO it = 1, nsfcst
CALL soilebm_frc
(nx,ny,nz,soiltyp,vegtyp,lai,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
qvsfc,windsp,psfc,rhoa,precip,tair,qvair,cdha,cdqa, &
radsw,rnflx,shflx,lhflx,gflx,ct,evaprg,evaprtr, &
evaprr,qvsat,qvsata,f34, &
frc_tsfc,frc_tsoil,frc_wsfc,frc_wdp,frc_wcnp,wrmax,relief)
DO j = 1, ny-1
DO i = 1, nx-1
tsfcn (i,j) = tsfc(i,j) + dtsfc2 * frc_tsfc(i,j)
tsoiln(i,j) = tsoil(i,j)+ dtsfc2 * frc_tsoil(i,j)
END DO
END DO
IF ( moist /= 0 ) THEN
DO j = 1, ny-1
DO i = 1, nx-1
wgn(i,j) = wetsfc(i,j) + dtsfc2 * frc_wsfc(i,j)
wgn(i,j) = MAX(wgn(i,j), 0.0 )
wgn(i,j) = MIN(wgn(i,j), wsat(soiltyp(i,j)) )
w2n(i,j) = wetdp(i,j) + dtsfc2 * frc_wdp(i,j)
w2n(i,j) = MAX( w2n(i,j), 0.0 )
w2n(i,j) = MIN(w2n(i,j), wsat(soiltyp(i,j)) )
wrn(i,j) = wetcanp(i,j) + dtsfc2 * frc_wcnp(i,j)
wrn(i,j) = MAX(wrn(i,j), 0.0 )
wrn(i,j) = MIN(wrn(i,j), wrmax(i,j) )
END DO
END DO
END IF
DO j = 1, ny-1
DO i = 1, nx-1
IF ( soiltyp(i,j) == 12 .OR. soiltyp(i,j) == 13 ) THEN
rhsts(i,j) = 0.0
rhst2(i,j) = 0.0
ELSE
rhsts(i,j)=frc_tsfc(i,j)
rhst2(i,j)=frc_tsoil(i,j)
END IF
END DO
END DO
IF ( moist /= 0 ) THEN
DO j = 1, ny-1
DO i = 1, nx-1
rhswg(i,j)=frc_wsfc(i,j)
rhsw2(i,j)=frc_wdp(i,j)
rhswr(i,j)=frc_wcnp(i,j)
END DO
END DO
END IF
CALL soilebm_frc
(nx,ny,nz,soiltyp,vegtyp,lai,veg, &
tsfcn,tsoiln,wgn,w2n,wrn,snowdpth, &
qvsfc,windsp,psfc,rhoa,precip,tair,qvair,cdha,cdqa, &
radsw,rnflx,shflx,lhflx,gflx,ct, &
evaprg,evaprtr,evaprr,qvsat,qvsata,f34, &
frc_tsfc,frc_tsoil,frc_wsfc,frc_wdp,frc_wcnp,wrmax,relief)
! Integration for Ts and T2 at one time step.
DO j = 1, ny-1
DO i = 1, nx-1
IF ( soiltyp(i,j) == 12 .OR. soiltyp(i,j) == 13 ) THEN
rhsts(i,j) = 0.0
rhst2(i,j) = 0.0
ELSE
rhsts(i,j) = 0.5 * (frc_tsfc(i,j) +rhsts(i,j))
rhst2(i,j) = 0.5 * (frc_tsoil(i,j)+rhst2(i,j))
END IF
tsfc(i,j) = tsfc(i,j) + dtsfc * rhsts(i,j)
tsoil(i,j) = tsoil(i,j)+ dtsfc * rhst2(i,j)
END DO
END DO
IF ( moist /= 0 ) THEN
DO j = 1, ny-1
DO i = 1, nx-1
IF ( soiltyp(i,j) == 12 .OR. soiltyp(i,j) == 13 .OR. &
snowdpth(i,j) >= snowdepth_crit ) THEN
rhswg(i,j) = 0.0
rhsw2(i,j) = 0.0
rhswr(i,j) = 0.0
ELSE
rhswg(i,j) = 0.5 * (frc_wsfc(i,j)+rhswg(i,j))
rhsw2(i,j) = 0.5 * (frc_wdp (i,j)+rhsw2(i,j))
rhswr(i,j) = 0.5 * (frc_wcnp(i,j)+rhswr(i,j))
END IF
wetsfc(i,j) = wetsfc(i,j) + dtsfc * rhswg(i,j)
wetsfc(i,j) = MAX( wetsfc(i,j), 0.0 )
wetsfc(i,j) = MIN( wetsfc(i,j), wsat(soiltyp(i,j)) )
wetdp(i,j) = wetdp(i,j) + dtsfc * rhsw2(i,j)
wetdp(i,j) = MAX( wetdp(i,j), 0.0 )
wetdp(i,j) = MIN( wetdp(i,j), wsat(soiltyp(i,j)) )
wetcanp(i,j) = wetcanp(i,j) + dtsfc * rhswr(i,j)
wetcanp(i,j) = MAX( wetcanp(i,j), 0.0 )
wetcanp(i,j) = MIN( wetcanp(i,j), wrmax(i,j) )
END DO
END DO
END IF
END DO ! TIME INTEGRATION
DO j = 1, ny-1 !SOIL
DO i = 1, nx-1
tema = MAX( wetsfc(i,j), wwlt(soiltyp(i,j)) )
IF (snowdpth(i,j) >= snowdepth_crit) THEN
ct(i,j) = cg_snow
gflx(i,j) = 2.0*pi*(tsfc(i,j)-tsoil(i,j)-relief) &
*snowflxfac/(tau*ct(i,j))
! Snow cover
ELSE
cg = cgsat(soiltyp(i,j)) &
* ( wsat(soiltyp(i,j))/tema ) &
**( bslope(soiltyp(i,j))/log100 )
ct(i,j) = cg * cgv / ( (1.0-veg(i,j)) * cgv &
+ veg(i,j) * cg ) ! NP, Eq. 8
gflx(i,j) = 2.0*pi*(tsfc(i,j)-tsoil(i,j)-relief)/(tau*ct(i,j))
! Ground diffusive heat flux
END IF
shflx(i,j) =rhoa(i,j) * cp * cdha(i,j) * windsp(i,j) &
* ( tsfc(i,j) - tair(i,j) *(psfc(i,j)/1.0E5)**rddcp ) !RDDRDD
END DO
END DO
CALL getqvs
(nx,ny,1, 1,nx-1,1,ny-1,1,1, psfc,tsfc,qvsat) !HYDROLOGY
CALL evapflx
(nx,ny,radsw,f34,cdqa,windsp,psfc,rhoa,qvair, &
soiltyp,vegtyp,lai,veg,tsfc,wetsfc,wetdp,wetcanp, &
snowdpth,evaprg,evaprtr,evaprr,lhflx,qvsat)
DO j=1, ny-1
DO i=1, nx-1
qvsfc(i,j) = lhflx(i,j) + qvair(i,j)
evaprg (i,j) = rhoa(i,j)*cdqa(i,j)*windsp(i,j)*evaprg(i,j)
evaprtr(i,j) = rhoa(i,j)*cdqa(i,j)*windsp(i,j)*evaprtr(i,j)
evaprr (i,j) = rhoa(i,j)*cdqa(i,j)*windsp(i,j)*evaprr(i,j)
lhflx (i,j) = rhoa(i,j)*cdqa(i,j)*windsp(i,j)*lhflx(i,j) !MOISTURE
lhflx (i,j) = lhflx(i,j) * lathv !QE
END DO
END DO
RETURN
END SUBROUTINE soilebm
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE SOILEBM_FRC ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!------------------------------------------------------------------
!
! AUTHOR: Diandong Ren (dd_ren@rossby.metr.ou.edu)
! Ming Xue (mxue@ou.edu)
! 12/08/2001
!
! 2002/02/15 (Yunheng Wang)
! Changed wrmax to a 2-D array which was a bug found during mpi testing.
!
!------------------------------------------------------------------
!
! PURPOSE:
! To calculate the right hand side forcing terms in the
! soil-vegetation model.
!------------------------------------------------------------------
SUBROUTINE soilebm_frc(nx,ny,nz,soiltyp,vegtyp,lai,veg, & 2,2
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth,qvsfc,windsp,psfc, &
rhoa,precip,tair,qvair, cdha,cdqa,radsw, rnflx,shflx,lhflx, &
gflx,ct,evaprg,evaprtr,evaprr,qvsat,qvsata,f34, &
frc_tsfc,frc_tsoil,frc_wsfc,frc_wdp,frc_wcnp,wrmax,relief)
IMPLICIT NONE
INTEGER :: nx,ny,nz
REAL :: eta_fac,wmax,c1max,sigma_sqr
REAL :: windsp(nx,ny) ! Wind speed
REAL :: psfc (nx,ny) ! Surface pressure
REAL :: rhoa (nx,ny) ! Air density near the surface
REAL :: precip(nx,ny) ! Precipitation rate at the surface
INTEGER :: soiltyp(nx,ny) ! Soil type at each point
INTEGER :: vegtyp (nx,ny) ! Vegetation type at each point
REAL :: lai (nx,ny) ! Leaf Area Index
REAL :: veg (nx,ny) ! Vegetation fraction
REAL :: tsfc (nx,ny) ! Temperature at ground surface (K)
REAL :: tsoil (nx,ny) ! Deep soil temperature (K)
REAL :: wetsfc (nx,ny) ! Surface soil moisture
REAL :: wetdp (nx,ny) ! Deep soil moisture
REAL :: wetcanp(nx,ny) ! Canopy water amount
REAL :: qvsfc (nx,ny) ! Effective humidity at surface
REAL :: snowdpth(nx,ny) ! Snow depth (m)
REAL :: tair (nx,ny) ! Surface air temperature (K)
REAL :: qvair (nx,ny) ! Surface air specific humidity (kg/kg)
REAL :: cdha (nx,ny) ! Surface drag coeff. for heat
REAL :: cdqa (nx,ny) ! Surface drag coeff. for moisture
REAL :: radsw (nx,ny) ! Solar radiation reaching the surface
REAL :: rnflx (nx,ny) ! Radiation flux at surface
REAL :: shflx (nx,ny) ! Sensible heat flux at surface
REAL :: lhflx (nx,ny) ! Latent heat flux at surface
REAL :: gflx (nx,ny) ! Ground diffusive heat flux
REAL :: ct (nx,ny) ! Soil thermal coefficient
REAL :: evaprg (nx,ny) ! Evaporation
REAL :: evaprtr(nx,ny) ! Transpiration from leaves
REAL :: evaprr (nx,ny) ! Direct evaporation from leaves
REAL :: f34 (nx,ny) ! Resistance factor of F3*F4
REAL :: qvsata (nx,ny) ! qvsat(tair) (kg/kg)
REAL :: qvsat (nx,ny) !
REAL :: frc_tsoil(nx,ny) ! Right hand side forcing for tsfc eq.
REAL :: frc_tsfc(nx,ny) ! Right hand side forcing for tsoil eq.
REAL :: frc_wsfc(nx,ny) ! Right hand side forcing for wetsfc eq.
REAL :: frc_wdp(nx,ny) ! Right hand side forcing for wetsp eq.
REAL :: frc_wcnp(nx,ny) ! Right hand side forcing for wetcanp eq.
REAL :: wrmax(nx, ny) ! Maximum value for canopy moisture, wetcanp
REAL :: c1wg ! Coefficient in the surface moisture Eq. of Wg
REAL :: c2wg ! Coefficient in the surface moisture Eq. of Wg
REAL :: pi ! Pi
PARAMETER (pi = 3.141592654)
REAL :: tau ! Seconds of a day = 24. * 3600.
PARAMETER (tau = 86400.)
REAL :: dtsfc2 ! Length of half time step in SFCEBM,
! dtsfc2 = dtsfc/2.
REAL :: log100 ! Constant: alog(100)
! dependent distance from the earth to the sun
REAL :: cg ! Soil thermal coefficient for bare ground
REAL :: wgeq ! Surface moisture when gravity balances the capillarity
REAL :: wr2max ! Tendency to reach the maximum wrmax
REAL :: runoff ! Runoff of the interception reservoir.
REAL :: pnet ! Residual of precip. and evap.
REAL :: vegp ! Precip. intercepted by vegetation
INTEGER :: i, j, it
REAL :: tema
REAL :: tauinv ! 1/tau
REAL :: relief ! Difference between seasonal average skin and deep soil
! temperature (t_skin - t_deeplayer).
!
!-----------------------------------------------------------------------
!
! Include files
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'phycst.inc'
INCLUDE 'soilcst.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
log100 = ALOG(100.0)
dtsfc2 = dtsfc/2.0
tauinv = 1.0/tau
DO j = 1, ny-1
DO i = 1, nx-1
tema = MAX( wetdp(i,j), wwlt(soiltyp(i,j)) )
IF (snowdpth(i,j) >= snowdepth_crit) THEN !snow cover
ct(i,j) = cg_snow
gflx(i,j) = 2.0*pi*(tsfc(i,j)-tsoil(i,j)-relief) &
*snowflxfac/(tau*ct(i,j))
ELSE
cg = cgsat(soiltyp(i,j)) &
* ( wsat(soiltyp(i,j))/tema ) &
**( bslope(soiltyp(i,j))/log100 )
ct(i,j) = cg * cgv / ( (1.0-veg(i,j)) * cgv + veg(i,j) * cg )
gflx(i,j) = 2.0*pi*(tsfc(i,j)-tsoil(i,j)-relief)/(tau*ct(i,j))
END IF
shflx(i,j) = rhoa(i,j) * cp * cdha(i,j) * windsp(i,j) &
* ( tsfc(i,j) - tair(i,j) )
END DO
END DO
IF ( moist == 0 ) THEN
DO j = 1, ny-1
DO i = 1, nx-1
evaprg(i,j) = 0.0
evaprtr(i,j) = 0.0
evaprr(i,j) = 0.0
lhflx(i,j) = 0.0
END DO
END DO
ELSE
CALL getqvs
(nx,ny,1, 1,nx-1,1,ny-1,1,1, psfc,tsfc,qvsat)
CALL evapflx
(nx,ny,radsw,f34,cdqa,windsp,psfc,rhoa,qvair, &
soiltyp,vegtyp,lai,veg,tsfc,wetsfc,wetdp,wetcanp, &
snowdpth,evaprg,evaprtr,evaprr,lhflx,qvsat)
END IF
DO j = 1, ny-1
DO i = 1, nx-1
evaprg (i,j) = rhoa(i,j)*cdqa(i,j)*windsp(i,j)*evaprg(i,j)
evaprtr(i,j) = rhoa(i,j)*cdqa(i,j)*windsp(i,j)*evaprtr(i,j)
evaprr (i,j) = rhoa(i,j)*cdqa(i,j)*windsp(i,j)*evaprr(i,j)
lhflx (i,j) = rhoa(i,j)*cdqa(i,j)*windsp(i,j)*lhflx(i,j)
lhflx(i,j) = lhflx(i,j) * lathv ! Latent heat flux
END DO
END DO
DO j = 1, ny-1
DO i = 1, nx-1
IF ( soiltyp(i,j) == 12 .OR. soiltyp(i,j) == 13 ) THEN
frc_tsfc (i,j) = 0.
frc_tsoil(i,j) = 0.
ELSE
frc_tsfc(i,j) = ct(i,j)*(rnflx(i,j)-shflx(i,j)-lhflx(i,j)-gflx(i,j))
IF ( snowdpth(i,j) >= snowdepth_crit ) THEN
frc_tsoil(i,j)= 1.03* (tsfc(i,j)-tsoil(i,j)-relief)*tauinv*snowflxfac ! Snow cover
ELSE
frc_tsoil(i,j)= 1.03*(tsfc(i,j) - tsoil(i,j)-relief) * tauinv
END IF
END IF
END DO
END DO
IF ( moist /= 0 ) THEN
DO j = 1, ny-1 !HYDROLOGY
DO i = 1, nx-1
wrmax(i,j) = 0.2 * 1.e-3 * veg(i,j) * lai(i,j) ! meter
IF ( soiltyp(i,j) == 12 .OR. soiltyp(i,j) == 13 .OR. &
snowdpth(i,j) >= snowdepth_crit ) THEN
frc_wsfc(i,j) = 0.
frc_wdp(i,j) = 0.
frc_wcnp(i,j) = 0.
ELSE
tema = MAX( wetsfc(i,j), wwlt(soiltyp(i,j)) )
c1wg = c1sat(soiltyp(i,j)) &
* ( wsat(soiltyp(i,j)) / tema ) &
**( bslope(soiltyp(i,j)) / 2.0 + 1.0)
c1wg=c1wg*0.20
! RDDRDD new implementation of a formula, for the condition of
! very dry conditions.
IF (wetsfc(i,j) < 0.9*wwlt(soiltyp(i,j))) THEN
!
!the criteria is done based on NORM site only.
!
eta_fac = (-0.01815*tsfc(i,j)+6.41)*wwlt(soiltyp(i,j)) &
+ (0.0065*tsfc(i,j)-1.4)
wmax = eta_fac*wwlt(soiltyp(i,j))
c1max = (1.19*wwlt(soiltyp(i,j))-5.09)*0.01*tsfc(i,j) &
+ (1.464*wwlt(soiltyp(i,j))+17.86)
sigma_sqr = -wmax**2.0/(2.0*log(0.01/c1max))
c1wg = c1max*exp((wmax-wetsfc(i,j))/(2.0*sigma_sqr))
END IF
!RDDRDD new implementation of a formula, for the condition
c2wg = c2ref(soiltyp(i,j)) * wetdp(i,j) &
/ ( wsat(soiltyp(i,j)) - wetdp(i,j) + wetsml )
wgeq = wetdp(i,j) - wsat(soiltyp(i,j)) &
* awgeq(soiltyp(i,j)) &
* ( wetdp(i,j) / wsat(soiltyp(i,j)) ) &
** pwgeq(soiltyp(i,j)) &
* ( 1.0 - ( wetdp(i,j) / wsat(soiltyp(i,j)) ) &
** ( 8 * pwgeq(soiltyp(i,j)) ) )
frc_wsfc(i,j) = c1wg * ( ( 1.0 - veg(i,j) ) &
* precip(i,j) - evaprg(i,j) ) &
/(rhow * d1) &
- c2wg * ( wetsfc(i,j) - wgeq ) * tauinv
frc_wdp(i,j) = ( ( 1.0 - veg(i,j) ) * precip(i,j) &
- evaprg(i,j) - evaprtr(i,j) ) &
/ ( rhow * d2 )
wr2max = ( wrmax(i,j) - wetcanp(i,j) ) / dtsfc2
vegp = veg(i,j) * precip(i,j)
pnet = vegp - evaprr(i,j)
tema = pnet - wr2max * rhow
runoff = MAX( tema, 0.0 )
vegp = vegp - runoff
frc_wcnp(i,j) = ( vegp - evaprr(i,j) ) / rhow
END IF
END DO
END DO
END IF
RETURN
END SUBROUTINE soilebm_frc
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE EVAPFLX ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE evapflx(nx,ny, radsw, f34, cdqa, & 2
windsp,psfc,rhoa,qvair, &
soiltyp,vegtyp,lai,veg, &
tsfc,wetsfc,wetdp,wetcanp,snowdpth, &
evaprg,evaprtr,evaprr,qvflx,qvsat)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate:
!
! 1. Evaporation from ground surface,
!
! evaprg = rhoa * cdq * windsp * evaprg'
!
! where
!
! evaprg' = (1.-veg) * (rhgs * qvsats - qvair)
! Evaporation from the ground
! NP, Eq. 27
!
! 2. Direct evaporation from the fraction delta of the foliage covered
! by intercepted water.
!
! Er = rhoa * cdq * windsp * Er'
!
! Er' = delta * veg * (qvsats-qvair)
!
! 3. Transpiration of the remaining part (1-delta) of leaves,
!
! Etr = rhoa * cdq * windsp * Etr'
!
! where
!
! Etr' = veg * (1-delta) * Ra/(Ra+Rs) * (qvsats-qvair )
!
! and Ra is aerodynamic resistance and Rs is the surface resistance
!
! 1
! Ra = ----------------
! cdq * windsp
!
! Rsmin
! Rs = ------------------
! LAI*F1*F2*F3*F4
!
!
! f + Rsmin/Rsmax
! F1 = -------------------
! f + 1
!
! Rg 2
! f = 0.55 ----- -----
! Rgl LAI
!
! - 1, Wfc < W2
! |
! | W2 - Wwlt
! F2 = - ------------, Wwlt <= W2 <= Wfc
! | Wfc - Wwlt
! |
! - 0, W2 < Wwlt
!
!
! 1-0.06*(qvsats-qvair), qvsats-qvair <= 12.5 g/kg
! F3 = {
! 0.25, otherwise
!
!
! F4 = 1 - 0.0016 * (298-tair)**2
!
! 4. Water vapor flux, qvflx,
!
! qvflx = rhoa * cdq * windsp * qvflx'
!
! qvflx' = (Eg' + Etr' + Er') = (qvsfc - qvair)
!
! where qvsfc is the effective surface specific humidity
!
! (qvsfc - qvair) = (Eg' + Etr' + Er')
!
! This subroutine will solve Eg', Etr', Er', and qvflx'
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu and Vince Wong
! 4/20/94
!
! MODIFICATION HISTORY:
!
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
!
! radsw Incoming solar radiation
!
! f34 f3*f4;
! f3 = Fractional conductance of atmospheric vapor pressure
! f4 = Fractional conductance of air temperature
!
! cdqa Array for surface drag coefficient for water vapor
!
! soiltyp Soil type
! vegtyp Vegetation type
! lai Leaf Area Index
! veg Vegetation fraction
!
! tsfc Surface soil temperature (K)
! wetsfc Surface soil moisture
! wetdp Deep soil moisture
! wetcanp Vegetation moisture
!
! psfc Surface pressure
! qvair Specific humidity near the surface
! windsp Wind speed near the surface
! rhoa Air density near the surface
!
! OUTPUT:
!
! evaprp Evaporation from groud surface
! evaprtr Transpiration of the remaining part (1-delta) of leaves
! evaprr Direct evaporation from the fraction delta
! qvflx Water vapor flux
!
! WORK ARRAY:
!
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!
INTEGER :: nx,ny
!
REAL :: radsw (nx,ny)
REAL :: f34 (nx,ny)
REAL :: cdqa (nx,ny)
INTEGER :: soiltyp(nx,ny)
INTEGER :: vegtyp (nx,ny)
REAL :: lai (nx,ny)
REAL :: veg (nx,ny)
REAL :: tsfc (nx,ny)
REAL :: wetsfc (nx,ny)
REAL :: wetdp (nx,ny)
REAL :: wetcanp(nx,ny)
REAL :: snowdpth(nx,ny)
!
REAL :: psfc (nx,ny)
REAL :: qvair (nx,ny)
REAL :: windsp (nx,ny)
REAL :: rhoa (nx,ny)
REAL :: evaprg (nx,ny)
REAL :: evaprtr(nx,ny)
REAL :: evaprr (nx,ny)
REAL :: qvflx (nx,ny)
REAL :: qvsat (nx,ny)
!
!-----------------------------------------------------------------------
!
! Include files: globcst.inc and phycst.inc
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'phycst.inc'
INCLUDE 'soilcst.inc'
!
!-----------------------------------------------------------------------
!
! Local variables:
!
!-----------------------------------------------------------------------
!
REAL :: pi
PARAMETER ( pi = 3.141592654 )
!
INTEGER :: i, j
REAL :: wrmax ! Maximum value for canopy moisture, wetcanp
REAL :: rstcoef ! Coefficient of resistance
REAL :: delta
REAL :: rhgs ! R.H. at ground surface
!
REAL :: tema
REAL :: temb
REAL :: pterm
REAL :: mterm
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
DO j = 1, ny-1
DO i = 1, nx-1
IF ( soiltyp(i,j) == 12 .OR. soiltyp(i,j) == 13 ) THEN
!
!-----------------------------------------------------------------------
!
! Over water and ice, qvsfc should be saturated
!
!-----------------------------------------------------------------------
!
qvflx(i,j) = qvsat(i,j) - qvair(i,j)
evaprg (i,j) = qvflx(i,j)
evaprtr(i,j) = 0.0
evaprr (i,j) = 0.0
ELSE ! over land
wrmax = 0.2 * 1.e-3 * veg(i,j) * lai(i,j) ! in meter
!
!-----------------------------------------------------------------------
!
! In order to calculate the qv flux at the surface, we need to
! calculate some parameters like the resistance coefficient,
!
! rstcoef = rsta / (rsts + rsta)
!
! where rsta is the aerodynamic resistance and rsts is the surface
! resistances.
!
! rsta = 1 / ( cdq * Va )
!
! rsts = rsmin(vtyp) / ( lai(vtyp) * f1 * f2 * f3 * f4 )
!
! f3 * f4 is time-independent and has been calculated previously
! and stored in f34(i,j)
!
!-----------------------------------------------------------------------
!
! Calculate f1.
!
! f = 0.55*(radsw/rgl(vtyp))*(2./lai(vtyp)) ! NP, Eq. 34
! f1 = ( rsmin(vtyp)/rsmax + f ) / ( 1. + f ) ! NP, Eq. 34
!
! Note: the incoming solar radiation radsw is stored in radsw(i,j).
!
!-----------------------------------------------------------------------
!
IF ( lai(i,j) == 0. ) THEN ! No vegetation, I/W
rstcoef = 1.
ELSE
temb = 0.55 * ( radsw(i,j) / rgl(vegtyp(i,j)) ) &
* ( 2.0 / lai(i,j) )
rstcoef = ( rsmin(vegtyp(i,j)) / rsmax + temb ) &
/ ( 1.0 + temb )
END IF
!
!-----------------------------------------------------------------------
!
! Calculate f2 and f1*f2.
!
!-----------------------------------------------------------------------
!
pterm = .5 + SIGN( .5, wetdp(i,j) - wfc(soiltyp(i,j)) )
mterm = SIGN( .5, wetdp(i,j) - wwlt(soiltyp(i,j)) ) &
- SIGN( .5, wetdp(i,j) - wfc(soiltyp(i,j)) )
rstcoef = rstcoef * ( pterm + mterm &
* ( wetdp(i,j)-wwlt(soiltyp(i,j)) ) &
/ ( wfc(soiltyp(i,j)) - wwlt(soiltyp(i,j)) ) )
!
!-----------------------------------------------------------------------
!
! Calculate lai*f1*f2*f3*f4 where f3*f4 is stored in f34(i,j).
!
!-----------------------------------------------------------------------
!
rstcoef = lai(i,j)*rstcoef*f34(i,j) ! lai*f1*f2*f3*f4
!
!-----------------------------------------------------------------------
!
! Calculate the resistance coefficient, rsta/(rsts+rsta)
!
! rsts = rsmin(vtyp)/(lai(i,j)*f1*f2*f3*f4) ! Sfc. resistance
! rsta = 1./(cdh*va) ! NP, between Eq. 32 & 33
! rstcoef = rsta/(rsta+rsts)
! = 1/(1+rsts/rsta)
!
!-----------------------------------------------------------------------
!
tema = rsmin(vegtyp(i,j)) * cdqa(i,j) * windsp(i,j)
IF ( ABS(rstcoef) > 1.0E-30 ) THEN
rstcoef = 1.0 / (1.0 + tema/rstcoef)
END IF
!RDDRDDnewtech
pterm = 0.5 + SIGN( 0.5, wetsfc(i,j)-wfc(soiltyp(i,j)) )
rhgs = pterm + (1.-pterm) * 0.707 * &
sqrt( 1.0 - COS( wetsfc(i,j)* pi / wfc(soiltyp(i,j))))
IF (mod(curtim,86400.0) <= 54000.0 .AND. &
(wetsfc(i,j) <= 1.01*wwlt(soiltyp(i,j))) ) THEN
rhgs=0.45 * rhgs
ENDIF
!RDDRDDnewtech
!
!-----------------------------------------------------------------------
!
! 1. evaprg'
!
! evaprg' = (1.-veg) * (rhgs*qvsats - qvair)
! Evaporation from the ground
! NP, Eq. 27
!
! evaprg will be stored for current and future use to
! calculate the latent heat flux and soil moisture transports.
!
!-----------------------------------------------------------------------
!
! IF (snowdpth(i,j) .ge. snowdepth_crit) rhgs=1.0 !Snow cover
evaprg(i,j) = 0.5*( 1.0 - veg(i,j) ) &
* ( rhgs * qvsat(i,j) - qvair(i,j) ) !RDDRDD
!
!-----------------------------------------------------------------------
!
! 2. Transpiration of the remaining part (1-delta) of leaves, Etr',
!
! Etr' = (1-delta) * veg
! * Ra/(Ra+Rs) * ( qvsats - qvair )
!
! 3. Direct evaporation from the fraction delta, Er'
!
! Er' = delta * veg * ( qvsats - qvair )
!
! Er' and Etr' are stored for future use to calculate the latent heat
! flux and soil moisture transports.
!
!-----------------------------------------------------------------------
!
IF ( wrmax == 0.0 ) THEN
delta = 0.0
ELSE
delta = ( wetcanp(i,j) / wrmax ) ** 0.66666667
END IF
pterm = .5 + SIGN( .5, qvsat(i,j) - qvair(i,j) )
delta = pterm * delta + ( 1. - pterm )
tema = veg(i,j) * ( qvsat(i,j) - qvair(i,j) )
evaprtr(i,j) = ( 1.0 - delta ) * rstcoef * tema
evaprr (i,j) = delta * tema
!
!-----------------------------------------------------------------------
!
! 4. Water vapor flux, qvflx',
!
! qvflx' = evaprg' + evaprtr' + evaprr'
!
! qvflx will be saved for the future use to calculate the latent
! heat flux.
!
!-----------------------------------------------------------------------
!
qvflx(i,j) = evaprg(i,j) + evaprtr(i,j) + evaprr(i,j)
END IF
! NP, expl. Eq. 26-27
END DO
END DO
RETURN
END SUBROUTINE evapflx