!################################################################## !################################################################## !###### ###### !###### 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,tdeep,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 -- tdeep ! 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. ! ! 2002/06/9 (Ming Xue) ! Revoked some modifications to the soil moisture related caculations ! that Diandong Ren put in since IHOP_2 - the mods need more testing. ! ! 2002/12/13 (Jerry Brotzge) ! Updated code to match recommendations by Pleim and Xiu (1995) and ! Xiu and Pleim (2001 - JAM). ! !----------------------------------------------------------------------- ! ! 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) ! tdeep 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_tdeep Temporary array ! frc_wsfc Temporary array ! frc_wdp Temporary array ! frc_wcnp Temporary array ! ! tsfcn Temporary array ! tdeepn 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 :: tdeep (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_tsfc(nx,ny) ! Right hand side forcing for tsfc eq. REAL :: frc_tdeep(nx,ny) ! Right hand side forcing for tdeep 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 :: tdeepn(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 LOGICAL :: firstcall ! First call flag of this subroutine ! SAVE firstcall, log100, dtsfc2, tauinv SAVE firstcall, log100, dtsfc2 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 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 ) IF (tair(i,j) >= 302.15) THEN !(XP2001) f34(i,j) = 1.0 / (1.0 + EXP( 1.18 * (tair(i,j)-314.00))) ELSE f34(i,j) = 1.0 / (1.0 + EXP( -0.41* (tair(i,j)-282.05))) ENDIF 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,tdeep,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_tdeep,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) tdeepn(i,j) = tdeep(i,j)+ dtsfc2 * frc_tdeep(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 ELSE DO j = 1, ny-1 DO i = 1,nx-1 w2n(i,j) = wetdp(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_tdeep(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,tdeepn,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_tdeep,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_tdeep(i,j)+rhst2(i,j)) END IF tsfc(i,j) = tsfc(i,j) + dtsfc * rhsts(i,j) tdeep(i,j) = tdeep(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)-tdeep(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 ct(i,j) = cg !(PX1995) gflx(i,j) = 2.0*pi*(tsfc(i,j)-tdeep(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 ###### !###### ###### !################################################################## !################################################################## SUBROUTINE soilebm_frc(nx,ny,nz,soiltyp,vegtyp,lai,veg, & 2,2 tsfc,tdeep,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_tdeep,frc_wsfc,frc_wdp,frc_wcnp,wrmax,relief) !------------------------------------------------------------------ ! ! 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. !------------------------------------------------------------------ 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 :: tdeep (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_tsfc(nx,ny) ! Right hand side forcing for tsfc eq. REAL :: frc_tdeep(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 REAL :: tema REAL :: eta, c1max, wmax, sig2 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 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)-tdeep(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)-tdeep(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_tdeep(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_tdeep(i,j)= 1.03* (tsfc(i,j)-tdeep(i,j)-relief)*tauinv*snowflxfac ! Snow cover ELSE frc_tdeep(i,j)= 1.03*(tsfc(i,j) - tdeep(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 = 0.4* c1sat(soiltyp(i,j)) & * ( wsat(soiltyp(i,j)) / tema ) & **( bslope(soiltyp(i,j)) / 2.0 + 1.0) !-------------------------------------------------------------------------- ! Replacement Cl to improve dry soils (NM1996 - A.3) (JAB) !-------------------------------------------------------------------------- IF (wetsfc(i,j) < wwlt(soiltyp(i,j)) ) THEN eta = (-0.01815 * tsfc(i,j) + 6.41 ) * wwlt(soiltyp(i,j)) + & ( 0.0065 * tsfc(i,j) - 1.4 ) c1max = (1.19 * wwlt(soiltyp(i,j)) - 5.09)*0.01*tsfc(i,j) & +( 1.464 * wwlt(soiltyp(i,j)) + 17.86 ) wmax = eta * wwlt(soiltyp(i,j)) sig2 = - ( (2 * alog ( 0.01 / c1max )) / ( wmax*wmax) ) c1wg = c1max * EXP ( -0.5* ( (wetsfc(i,j)-wmax)*(wetsfc(i,j)-wmax)*sig2 ) ) ENDIF !---------------------------------------------------------------------------- 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 REAL :: waf ! Available soil moisture fraction REAL :: bw ! Half point of the available soil mstr frctn curve REAL :: ps ! Shelter factor ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! 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) ) temb = 0.55 * ( radsw(i,j) / rgl(vegtyp(i,j)) ) & * ( 2.0 ) !(XP2001 - Eq.8) (JAB) 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)) ) ) waf = ( wetdp(i,j)-wwlt(soiltyp(i,j)) ) & / ( wfc(soiltyp(i,j)) - wwlt(soiltyp(i,j)) ) bw = wwlt(soiltyp(i,j)) + (wfc(soiltyp(i,j)) - wwlt(soiltyp(i,j)) ) & / 3.0 rstcoef = rstcoef / ( 1.0 + EXP( -5.0 * (waf - bw) ) ) ! (XP2001 - Eq.9) (JAB) ! !----------------------------------------------------------------------- ! ! 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 ps = 0.3 * lai(i,j) + 0.7 ! XP2001 (JAB) rstcoef = lai(i,j)*rstcoef*f34(i,j)/ps ! lai*f1*f2*f3*f4/ps (JAB) ! !----------------------------------------------------------------------- ! ! 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 ! !----------------------------------------------------------------------- ! ! 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. ! !----------------------------------------------------------------------- ! pterm = .5 + SIGN( .5, wetsfc(i,j)-1.1*wfc(soiltyp(i,j)) ) rhgs = pterm & + (1.-pterm) * ( 0.25 * ( 1.0 - COS( wetsfc(i,j) & * pi / (1.1*wfc(soiltyp(i,j))))) ** 2 ) ! IF (snowdpth(i,j) .ge. snowdepth_crit) rhgs=1.0 !Snow cover ! evaprg(i,j) = ( 1.0 - veg(i,j) ) & ! * ( rhgs * qvsat(i,j) - qvair(i,j) ) evaprg(i,j) = ( 1.0 - veg(i,j) ) & * rhgs * ( qvsat(i,j) - qvair(i,j) ) !XP2001 (JAB) ! !----------------------------------------------------------------------- ! ! 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 ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE OUSOIL ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE ousoil(nx,ny,nz,nzsoil,zpsoil,j3soil,j3soilinv,soiltyp, & 1,18 vegtyp,lai,veg,tsoil,qsoil,wetcanp,snowdpth,qvsfc, & windsp,psfc,rhoa,precip,tair,qvair,cdma,cdha,cdqa, & radsw, rnflx, radswnet, radlwin, shflx, lhflx, gflx, & ct,evaprg,evaprtr,evapcan,qvsat,qvsata,f34,tem1soil, & tem2soil,tem3soil,tem4soil,tsdiffus,deltem,rrtem,temple) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Predict the soil surface temperature and moisture contents by solving ! the surface energy and moisture budget equtions: ! ! 1. the soil temperatures, tsoil(nx,ny,nz) ! 2. the soil moisture, qsoil(nx,ny,nz) ! !----------------------------------------------------------------------- ! ! AUTHOR: Jerry Brotzge and Dan Weber ! 1/22/02 ! ! Updated code to allow for implicit soil temp/moisture scheme ! and to allow for multiple options of soil/temp schemes. ! ! MODIFICATION HISTORY: ! ! 12/15/02 Jerry Brotzge ! Added snow physics, based entirely on ETA code. ! !----------------------------------------------------------------------- ! ! where ! ! Tau -- 1 day in seconds = 86400 seconds ! PI -- number of PI = 3.141592654 ! ROw -- Density of liquid water ! 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. ! !----------------------------------------------------------------------- ! ! REFERENCES: ! ! 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. ! ! Chen, F., and J. Dudhia, 2001: Coupling an Advanced Land Surface- ! Hydrology Model with the Penn State-NCAR MM5 Modeling System. ! Part 1: Model Implementation and Sensitivity, Mon Wea Rev., ! 129, 569-585. ! ! Ek, M., and L. Mahrt, 1991: OSU 1-D PBL model user's guide. ! Version 1.04, 120 pp. [Available from the Dept of ! Atmospheric Sciences, Oregon State Univ., Corvallis, OR ! 97331-2209]. ! ! 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). ! ! Peters-Lidard, C.D., E. Blackburn, X. Liang, and E.F. Wood, ! 1998: The effect of soil thermal conductivity parameterization ! on surface energy fluxes and temperatures, J. Atmos. Sci., ! 55, 1209-1224. ! ! 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). ! ! Smirnova, T. G., et al., 1997: Performance of Different Soil ! Model Configurations in Simulating Ground Surface Temperatures ! and Surface Fluxes, Mon. Wea. Rev., 125, 1870-1884. ! !----------------------------------------------------------------------- !----------------------------------------------------------------------- ! ! 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) ! nzsoil Number of grid points in the z-direction (sfc/soil substrate) ! zpsoil The physical depth defined at w-point in soil ! j3soil Coordinate transformation Jacobian, d(zpsoil)/d(zsoil) ! j3soilinv Inverse of j3soil ! ! soiltyp Soil type at the horizontal grid points ! vegtyp Vegetation type at the horizontal grid points ! lai Leaf Area Index ! veg Green 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 [kg m-2 s-1] ! ! ! cdma Array for cdm, surface drag coefficient for momentum ! 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 and OUTPUT: ! ! tsfc Temperature at skin surface (K) ! qsfc Moisture at skin surface ! tsoil Soil temperatures (K) ! qsoil Soil moisture ! wetcanp Canopy wetness ! ! OUTPUT: ! ! qvsfc Effective S. H. at sfc. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz INTEGER :: nzsoil ! Grid points in the soil INTEGER :: snowng(nx,ny) ! Snow flag INTEGER :: frzgra(nx,ny) ! Freezing rain flag REAL :: zpsoil (nx,ny,nzsoil) ! The depth of the soil. REAL :: j3soil (nx,ny,nzsoil) ! Coordinate transformation REAL :: j3soilinv (nx,ny,nzsoil) ! Inverse of j3soil 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) ! Green vegetation fraction REAL :: tsfc (nx,ny) ! Temperature at ground surface (K) REAL :: qvsfc (nx,ny) ! Effective humidity at surface REAL :: tsoil (nx,ny,nzsoil) ! Soil temperature at nzsoil levels REAL :: qsoil (nx,ny,nzsoil) ! Soil moisture at nzsoil levels REAL :: xqsoil (nx,ny,nzsoil) ! Volume of nonfrozen soil moisture REAL :: qice (nx,ny,nzsoil) ! Ice content of each soil layer REAL :: wetcanp(nx,ny) ! Canopy wetness 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 :: cdma (nx,ny) ! Surface drag coeff. for momentum 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 :: radswnet(nx,ny) ! Net solar radiation, SWin - SWout REAL :: radlwin(nx,ny) ! Incoming longwave radiation to sfc REAL :: shflx (nx,ny) ! Sensible heat flux at surface REAL :: lhflx (nx,ny) ! Latent heat flux at surface [W/m2] 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 :: evapcan(nx,ny) ! Direct evaporation from canopy leaves REAL :: f34 (nx,ny) ! Resistance factor of F3*F4 REAL :: qvsata (nx,ny) ! qvsat(tair) (kg/kg) REAL :: qvsat (nx,ny) ! REAL :: aatem ! Temporary array for est'g Pot Evapo. REAL :: fftem (nx,ny) ! Temporary array for est'g Pot Evapo. REAL :: rrtem (nx,ny) ! Temporary array for est'g Pot Evapo. REAL :: deltem (nx,ny) ! Temporary array for est'g Pot Evapo. REAL :: rnettot ! Temporary array for est'g Pot Evapo. REAL :: evappot (nx,ny) ! Potential Evaporation, [kg/m2/s] REAL :: temple (nx,ny) ! Temporary array for est'g Pot Evapo. REAL :: rsttemp (nx,ny) ! Canopy resistance used for LE,tr ! REAL :: etp1 (nx,ny) ! Potential evaporation * 0.001 ! !----------------------------------------------------------------------- ! ! 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. ! 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 ! lathv LH of vaporization at 0 deg C (Lv = 2.50, [m^2/s^2]) ! ! tsoil0 Initial skin temperature ! qsoil0 Initial skin wetness ! !----------------------------------------------------------------------- ! INCLUDE 'grid.inc' INCLUDE 'globcst.inc' INCLUDE 'phycst.inc' INCLUDE 'soilcst.inc' ! !----------------------------------------------------------------------- ! ! Local variables: ! !----------------------------------------------------------------------- ! REAL :: pi ! Pi PARAMETER (pi = 3.141592654) REAL :: log100 ! Constant: alog(100) ! dependent distance from the earth to the sun REAL :: wrmax ! Maximum value for canopy moisture, wetcanp 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, k, l INTEGER :: temcount REAL :: temsum REAL :: pf ! log(psi) REAL :: cisoil(nx,ny,nzsoil) ! Volumetric heat capacity REAL :: ktsoiltop(nx,ny) ! Thermal conductivity, top soil level REAL :: totaldepth ! Thickness of total soil column REAL :: tsdiffus(nx,ny,nzsoil) ! Thermal diffusivity REAL :: tem1soil (nx,ny,nzsoil) ! Tridiagonal parameters REAL :: tem2soil (nx,ny,nzsoil) ! Tridiagonal parameters REAL :: tem3soil (nx,ny,nzsoil) ! Tridiagonal parameters REAL :: tem4soil (nx,ny,nzsoil) ! Tridiagonal parameters REAL :: plantcoef(nx,ny) REAL :: sink (nx,ny,nzsoil) ! Sink/source term REAL :: tempcoefa ! Temporary arrays for tridiag. REAL :: tempcoefb ! Temporary arrays for tridiag. REAL :: tempcoefc ! Temporary arrays for tridiag. REAL :: tempcoefx1 ! Temporary arrays for tridiag. REAL :: tempcoefx2 ! Temporary arrays for tridiag. REAL :: tempbeta ! Used to estimate skin temperature REAL :: potair (nx,ny) ! Potential air temperature ! REAL :: tempcg ! Used to compute cg REAL :: tema, temb, temc REAL :: rhswr REAL :: desdt REAL :: dqsdt REAL :: dew ! Dew, forms when pot E < 0 REAL :: sn_new ! New snow depth REAL :: sndens (nx,ny) ! Snow density REAL :: sncond (nx,ny) ! Snow thermal conductivity REAL :: sneqv (nx,ny) ! Snow water equivalent (m) REAL :: precip1(nx,ny) ! Precip including snow melt REAL :: precipdrip(nx,ny) ! Precip that infiltrates ground REAL :: snofac (nx,ny) ! Snow factor REAL :: flx2 (nx,ny) ! Freezing rain flux from LH release REAL :: beta (nx,ny) ! Beta for snow physics REAL :: newsnow REAL :: newdens REAL :: denom, t12a, t12b, t12, snomeltrt, snomeltamt REAL :: temd, sice REAL :: rsnow, albedo, qtotal LOGICAL :: firstcall ! First call flag of this subroutine SAVE firstcall, log100 DATA firstcall/.true./ ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! IF (firstcall) THEN log100 = ALOG(100.0) firstcall = .false. END IF ! !----------------------------------------------------------------------- ! ! Calculate saturated specific humidity near the surface, qvsata. ! !----------------------------------------------------------------------- ! IF ( moist /= 0 ) THEN CALL getqvs(nx,ny,1, 1,nx-1,1,ny-1,1,1, psfc,tair,qvsata) END IF !----------------------------------------------------------------------- ! Converts standard soil temperatures to potential temperatures. ! Estimates nonfrozen soil moisture content (vol fraction), xqsoil. !----------------------------------------------------------------------- DO k=1,nzsoil DO j=1,ny-1 DO i=1,nx-1 IF (soiltyp(i,j) /= 12 .AND. soiltyp(i,j) /= 13 ) THEN tsoil(i,j,k) = tsoil(i,j,k) * (100000.0/psfc(i,j))**0.286 END IF IF (tsoil(i,j,k) < 273.15) THEN xqsoil(i,j,k) = 0.0 ELSE xqsoil(i,j,k) = qsoil(i,j,k) END IF ! NOTE: Should xqsoil be set to wwlt(soiltyp(i,j)) if frozen???***** END DO END DO END DO !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of Implicit Scheme (JAB/DBW) ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IF ( moist /= 0 ) THEN CALL getqvs(nx,ny,1, 1,nx-1,1,ny-1,1,1, psfc,tsoil(1,1,1),qvsat) END IF !--------------------------------------------------------------------- ! Calculate snow density and conductivity !--------------------------------------------------------------------- DO j=1,ny-1 DO i=1,nx-1 ! veg(i,j) = 0.41 !Test run IF (snowdpth(i,j) == 0.0) THEN sndens(i,j) = 0.0 ! Snow density (unitless) sneqv (i,j) = 0.0 ! Snow water equivalent sncond(i,j) = 1.0 ! Snow thermal conductivity ELSE ! sndens(i,j) = sneqv(i,j)/snowdpth(i,j) sndens(i,j) = 0.10 ! Set arbitrarily until sneqv is available sneqv(i,j) = sndens(i,j)*snowdpth(i,j) !Dyachkova Eqtn (1960) Units: Cal/(cm*hr*C) converted to W/(m*C) sncond(i,j) = 0.11631 * (0.328*10**(2.25*sndens(i,j))) END IF !---------------------------------------------------------------------- !---------------------------------------------------------------------- ! Determine if snowing or freezing rain !---------------------------------------------------------------------- snowng(i,j) = 0 ! Snowing flag frzgra(i,j) = 0 ! Freezing rain flag IF (precip(i,j) > 0.0) THEN IF (tair(i,j) <= 273.15) THEN snowng(i,j) = 1 ELSE IF (tsoil(i,j,1) <= 273.15) frzgra(i,j) = 1 END IF END IF !---------------------------------------------------------------------- ! IF precipation is frozen, then update new snowfall depth !----------------------------------------------------------------------- IF ( (snowng(i,j) == 1) .OR. (frzgra(i,j) == 1) ) THEN ! sn_new = precip(i,j) * 1000.0 * dtsfc * 0.001 sn_new = precip(i,j) * dtsfc * 0.001 sneqv(i,j) = sneqv(i,j) + sn_new precip1(i,j) = 0.0 !----------------------------------------------------------------------- ! Calculate new snowfall density !----------------------------------------------------------------------- IF (tair(i,j) <= 258.15) THEN newdens = 0.05 ELSE newdens = 0.05 + 0.0017*(tair(i,j)-273.15+15.0)**1.5 END IF ! Adjust snow density based on new snowfall newsnow = (sn_new*100.0/newdens) sndens(i,j) = (snowdpth(i,j)*100.0*sndens(i,j)+newsnow*newdens) & / (snowdpth(i,j)*100.0 + newsnow) snowdpth(i,j) = 0.01 * (snowdpth(i,j)*100.0 + newsnow) !---------------------------------------------------------------------------- !Dyachkova Eqtn (1960) Units: Cal/(cm*hr*C) converted to W/(m*C) ! Snow conductivity sncond(i,j) = 0.11631 * (0.328*10**(2.25*sndens(i,j))) ELSE !! precip1(i,j) = precip(i,j)*1000.0 ![kg m-2 s-1] ! precip1(i,j) = precip(i,j) ![m s-1] precip1(i,j) = precip(i,j)/1000.0 ![m s-1] END IF !----------------------------------------------------------------------- ! Amend albedo as a function of snow cover !----------------------------------------------------------------------- IF (radsw(i,j) > 0.0) THEN albedo = (radswnet(i,j)-radsw(i,j)) / radsw(i,j) IF (albedo > 1.0) albedo = 1.0 IF (albedo < 0.0) albedo = 0.0 END IF IF (sneqv(i,j) == 0.0) THEN ! albedo = alb !**NOTE: No access to ETA ALB, SNOALB tables*** ELSE IF (sneqv(i,j) < snup(vegtyp(i,j))) THEN rsnow = sneqv(i,j) / snup(vegtyp(i,j)) snofac(i,j) = 1.0 - (EXP(-2.6*rsnow) - rsnow*EXP(-2.6)) ELSE snofac(i,j) = 1.0 END IF ! albedo = alb + (1.0-veg(i,j))*snofac(i,j)*(snoalb-alb) ! IF (albedo > snoalb) albedo = snoalb END IF END DO ! i index END DO ! j index !----------------------------------------------------------------------- ! Initialize heat capacity (C) and thermal conductivity (K) for each ! level !----------------------------------------------------------------------- ! Compute soil thermal conductivity and heat capacity at each level k CALL getcon(nx, ny, nzsoil, soiltyp, vegtyp, tsoil(1,1,1), & qsoil(1,1,1), ktsoiltop, cisoil, tsdiffus, xqsoil(1,1,1)) !------------------------------------------------------------------------ ! Add subsurface heat flux reduction effect from the overlying green ! canopy. See Peters-Lidard et al., 1997, JGR, Vol 102(D4) !------------------------------------------------------------------------ DO j=1,ny-1 DO i=1,nx-1 ! ktsoiltop(i,j) = ktsoiltop(i,j) * EXP(-2.0*veg(i,j)) ! ktsoiltop(i,j) = ktsoiltop(i,j) * EXP(-0.5*lai(i,j)) END DO END DO !----------------------------------------------------------------------- ! Compute G and the potential evaporation via Penman eqtn. !----------------------------------------------------------------------- CALL penman(nx, ny, nzsoil, soiltyp, tsoil(1,1,1), qsoil(1,1,1), & ktsoiltop, fftem, j3soilinv, deltem, rrtem, veg, & temple, evappot, qvair, qvsata, tair, cdha, psfc, & potair, precip, rhoa, windsp, gflx, radswnet, radlwin, & sneqv, snowdpth, snofac, sncond, snowng, frzgra, flx2) !------------------------------------------------------------- ! Compute the canopy resistance !------------------------------------------------------------- CALL canres(nx,ny, radsw, f34, cdqa, & windsp,psfc,rhoa,qvair, & soiltyp,vegtyp,lai,veg,tair,tsoil(1,1,1), & qsoil,wetcanp,nzsoil,zpsoil,snowdpth, & qvsata,rsttemp,plantcoef,cdha) !********************************************************************* ! BEGIN NOPAC/SNOPAC CODE --------------------------------------- !********************************************************************* !--------------------------------------------------------------- ! Add Snow Physics !--------------------------------------------------------------- CALL snophy(nx,ny,nzsoil,tsoil,tair,potair,precip,evappot, & snowdpth,sneqv,sndens,snowng,snofac,fftem,rrtem, & ktsoiltop,gflx,psfc,precip1,qvair,cdha,rhoa,flx2, & beta) !------------------------------------------------------------- ! Compute the initial LE flux estimate !------------------------------------------------------------- CALL leflx(nx,ny,nzsoil,cdha,cdqa,windsp, rhoa, qvair, veg, wetcanp, & deltem,rrtem,temple, lhflx, evappot,soiltyp,vegtyp,evaprg, & evaprtr,evapcan,qvsfc,qvsat,rsttemp,plantcoef,zpsoil, & qsoil, xqsoil, qice, precip1, precipdrip) !-------------------------------------------------------------- !------------------------------------------------------------- ! Computes skin temperature. !------------------------------------------------------------- ! ! CALL tskin(nx,ny, nzsoil, cdha, rhoa, tair, potair, & ! rrtem, fftem, ktsoiltop, psfc, evappot, lhflx, tsoil, & ! soiltyp,snowdpth) ! ! !--------------------------------------------------------------------- ! Calculate the canopy wetness, wr !---------------------------------------------------------------------- IF ( moist /= 0) THEN CALL canwet(nx, ny, soiltyp, veg, lai, snowdpth, evapcan, & precip, wetcanp) END IF ! !---------------------------------------------------------------------- ! Estimate Soil Moisture !----------------------------------------------------------------------- ! CALL qdiff(nx,ny,nzsoil, j3soilinv, soiltyp, lai, veg, & tsoil, qsoil, wetcanp, windsp, rhoa, precip, & qvair, qvsata, evapcan, evaprg, tem1soil, tem2soil, tem3soil, & tem4soil, precipdrip) ! !----------------------------------------------------------------------- ! ! Call the tridiagonal solver to solve the diffusion of soil moisture ! from k= 2, nzsoil-1. ! !----------------------------------------------------------------------- ! CALL tridiag2(nx,ny,nzsoil,1,nx-1,1,ny-1,2,nzsoil-1,tem1soil,tem2soil, & tem3soil,tem4soil) DO k=2,nzsoil-1 ! load the final result from tridiag2 into qsoil DO j=1,ny-1 DO i=1,nx-1 IF (soiltyp(i,j) /= 12 .AND. soiltyp(i,j) /= 13) THEN qsoil(i,j,k) = tem4soil(i,j,k) END IF END DO END DO END DO ! qsoil is updated......... !-------------------------------------------------------------------- ! Compute bottom boundary condition !--------------------------------------------------------------------- DO j=1,ny-1 DO i=1,nx-1 IF (soiltyp(i,j) /= 12 .AND. soiltyp(i,j) /= 13) THEN qsoil(i,j,nzsoil) = qsoil(i,j,nzsoil-1) END IF ! Soiltyp /= 12 or 13 (Ice and water) END DO END DO !----------------------------------------------------------------------- ! Initialize heat capacity (C) and thermal conductivity (K) for each ! level !----------------------------------------------------------------------- CALL getcon(nx, ny, nzsoil, soiltyp, vegtyp, tsoil(1,1,1), & qsoil(1,1,1), ktsoiltop, cisoil, tsdiffus, xqsoil(1,1,1)) !------------------------------------------------------------------------ ! Add subsurface heat flux reduction effect from the overlying green ! canopy. See Peters-Lidard et al., 1997, JGR, Vol 102(D4) !------------------------------------------------------------------------ DO j=1,ny-1 DO i=1,nx-1 ! ktsoiltop(i,j) = ktsoiltop(i,j) * EXP(-2.0*veg(i,j)) ! ktsoiltop(i,j) = ktsoiltop(i,j) * EXP(-0.5*lai(i,j)) END DO END DO !-------------------------------------------------------------------- ! Compute skin temperature. !-------------------------------------------------------------------- CALL tskin(nx,ny, nzsoil, cdha, rhoa, tair, potair, & rrtem, fftem, ktsoiltop, psfc, evappot, lhflx, tsoil, & soiltyp,snowdpth,veg) !------------------------------------------------------------------------ ! Estimate Soil Temperature !----------------------------------------------------------------------- ! ! C * dT/dt = d/dz (K * dT/dz) ! !----------------------------------------------------------------------- ! ! Calculate coefficients of the tridigonal equation for soil temperature ! !----------------------------------------------------------------------- ! ! DO k=2,nzsoil-1 ! DO j=1,ny-1 ! DO i=1,nx-1 ! ! tempcoefa = cnbeta * dtsfc * 0.5 * dzsoilinv2 * j3soilinv(i,j,k) ! tempcoefb = (1.0 - cnbeta) * dtsfc * 0.5 * dzsoilinv2 * j3soilinv(i,j,k) ! ! tempcoefx1 = (tsdiffus(i,j,k-1) * j3soilinv(i,j,k-1)) + & ! (tsdiffus(i,j,k ) * j3soilinv(i,j,k )) ! ! tempcoefx2 = (tsdiffus(i,j,k ) * j3soilinv(i,j,k )) + & ! (tsdiffus(i,j,k+1) * j3soilinv(i,j,k+1)) ! ! tem1soil(i,j,k) = -tempcoefa * tempcoefx1 ! tem2soil(i,j,k) = 1.0 + tempcoefa * (tempcoefx1 + tempcoefx2) ! tem3soil(i,j,k) = -tempcoefa * tempcoefx2 ! ! tem4soil(i,j,k) = tempcoefb * tempcoefx1 * tsoil(i,j,k-1) + & ! (1.0-tempcoefb*(tempcoefx1 + tempcoefx2))*tsoil(i,j,k) & ! + tempcoefb * tempcoefx2 *tsoil(i,j,k+1) ! ! ! denom = (zpsoil(i,j,k-1)-zpsoil(i,j,k)) * cisoil(i,j,k) ! qtotal = -1.0 * denom * tem4soil(i,j,k) ! ! sice = qsoil(i,j,k) - xqsoil(i,j,k) ! ! IF ( (sice > 0.0).OR.(tsoil(i,j,1) < 273.15) .OR. & ! (tsoil(i,j,2)<273.15).OR.(tsoil(i,j,nzsoil)<273.15) ) THEN ! !--------------------------------------------------------------------- ! Compute sink/source term for freezing and thawing !--------------------------------------------------------------------- ! CALL snksrc(nx,ny,nzsoil, tsoil, qsoil, xqsoil, ktsoiltop, & gflx, zpsoil, sink, soiltyp, tem1soil, tem2soil, & tem3soil, tem4soil, tsdiffus, j3soilinv, cisoil) ! tem4soil(i,j,k) = (tempcoefb * tempcoefx1 * tsoil(i,j,k-1) + & ! (1.0-tempcoefb*(tempcoefx1 + tempcoefx2))*tsoil(i,j,k) & ! + tempcoefb * tempcoefx2 *tsoil(i,j,k+1) ) - & ! (sink(i,j,k)*dzsoilinv/cisoil(i,j,k)) ! !---------------------------------------------------------------------- ! END IF ! ! ! END DO ! END DO ! END DO ! Set the lower temperature boundary conditions ! note lower boundary is zero gradient ! (tsoil(i,j,nzsoil) = tsoil(i,j,nz-1) DO j=1,ny-1 ! must set the boundry condition for tem2soil(i,j,nzsoil-1) DO i=1,nx-1 tem4soil(i,j,2) = tem4soil(i,j,2) - tem1soil(i,j,2)*tsoil(i,j,1) !Top BC tem2soil(i,j,nzsoil-1) = tem2soil(i,j,nzsoil-1) + tem3soil(i,j,nzsoil-1) !Bottom, zero gradient END DO END DO ! coefficients are ready for the crank-nicholson ! solver. ! !----------------------------------------------------------------------- ! ! Call the tridiagonal solver. ! !----------------------------------------------------------------------- ! CALL tridiag2(nx,ny,nzsoil,1,nx-1,1,ny-1,2,nzsoil-1,tem1soil, & tem2soil,tem3soil,tem4soil) DO k=2,nzsoil-1 DO j=1,ny-1 DO i=1,nx-1 IF (soiltyp(i,j) /= 12 .AND. soiltyp(i,j) /= 13) THEN tsoil(i,j,k) = tem4soil(i,j,k) END IF END DO END DO END DO ! soil temperature is up to date.... !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! End of qsoil and tsoil implicit solving technique !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ !------------------------------------------------------------- ! Compute skin temperature. !------------------------------------------------------------- CALL tskin(nx,ny, nzsoil, cdha, rhoa, tair, potair, & rrtem, fftem, ktsoiltop, psfc, evappot, lhflx, tsoil, & soiltyp,snowdpth,veg) !--------------------------------------------------------------------- ! ! Calculate the canopy wetness, wr ! !---------------------------------------------------------------------- IF ( moist /= 0) THEN CALL canwet(nx, ny, soiltyp, veg, lai, snowdpth, evapcan, & precip, wetcanp ) END IF !---------------------------------------------------------------------- ! Snow compaction - new estimates of snow depth and density !---------------------------------------------------------------------- CALL snocom(nx, ny, nzsoil, snowdpth, sneqv, sndens, sncond, tsoil) !----------------------------------------------------------------------- ! ! Calculate the heat capacity cg and ct, sensible heat flux shflx, ! and ground heat flux gflx ! !----------------------------------------------------------------------- ! DO j = 1, ny-1 DO i = 1, nx-1 ! tempcg = MAX( qsoil(i,j,1), wwlt(soiltyp(i,j)) ) !(JAB) IF (snowdpth(i,j) >= snowdepth_crit) THEN !snow cover ! ct(i,j) = cg_snow ! ! gflx(i,j) = 2.0*pi*(tsoil(i,j,1)-tsoil(i,j,2)) & ! *snowflxfac/(tau*ct(i,j)) ! Snow cover ELSE !------------------------------------------- ! Estimate 2nd G flux for plotting !------------------------------------------- totaldepth = zrefsfc - zpsoil(i,j,nzsoil) IF (totaldepth > 0.10) THEN temsum = 0.0 temcount = 0 DO k=2,nzsoil zrefsoil = zrefsfc - zpsoil(i,j,k) IF (zrefsoil <= 0.10) THEN temsum = temsum + (tsoil(i,j,k-1) - tsoil(i,j,k)) temcount = temcount + 1 END IF END DO IF (temcount > 0) THEN ! gflx(i,j) = ktsoiltop(i,j)*j3soilinv(i,j,2)*dzsoilinv* & ! (1.0/temcount) * temsum gflx(i,j) = ktsoiltop(i,j)* EXP(-2.0*veg(i,j)) * & j3soilinv(i,j,2)*dzsoilinv* & (1.0/temcount) * temsum ELSE IF (temcount == 0) THEN gflx(i,j) = ktsoiltop(i,j)* EXP(-2.0*veg(i,j)) * & j3soilinv(i,j,2)*dzsoilinv* & 0.5*(tsoil(i,j,1)-tsoil(i,j,2)) ! gflx(i,j) = ktsoiltop(i,j)*j3soilinv(i,j,2)*dzsoilinv* & ! 0.5*(tsoil(i,j,1)-tsoil(i,j,2)) END IF ELSE IF (totaldepth <= 0.10) THEN ! gflx(i,j) = ktsoiltop(i,j)*j3soilinv(i,j,2)*dzsoilinv* & ! 0.5*(tsoil(i,j,1)-tsoil(i,j,2)) gflx(i,j) = ktsoiltop(i,j)* EXP(-2.0*veg(i,j)) * & j3soilinv(i,j,2)*dzsoilinv* & 0.5*(tsoil(i,j,1)-tsoil(i,j,2)) END IF END IF shflx(i,j) = rhoa(i,j)*cp*cdha(i,j)* & ( tsoil(i,j,1) - potair(i,j) ) ! Sensible heat flux ! NP, Eq. 26 IF (soiltyp(i,j) /= 12 .AND. soiltyp(i,j) /= 13) THEN tsfc(i,j) = tsoil(i,j,1) END IF END DO END DO !----------------------------------------------------------------------- ! ! Calculate the water vapor flux, qvflx, and hence the latent heat ! flux, lhflx. They share the same array lhflx(i,j). ! ! If moisture flag is off, all moisture fields are set to zero. ! !----------------------------------------------------------------------- ! ! Calculate saturated specific humidity at the ground surface. ! !----------------------------------------------------------------------- IF (moist /= 0) THEN CALL getqvs(nx,ny,1, 1,nx-1,1,ny-1,1,1, psfc,tsfc,qvsat) END IF DO j = 1, ny-1 DO i = 1, nx-1 cdha(i,j) = cdha(i,j) / MAX(windsp(i,j),0.1) IF (snowdpth(i,j) > 0.0) THEN lhflx(i,j) = evappot(i,j) * beta(i,j) * lathv ELSE ! lhflx(i,j) = evappot(i,j) * lathv END IF ! IF (lhflx(i,j) > (evappot(i,j)*lathv)) lhflx(i,j)=evappot(i,j)*lathv qvsfc(i,j) = lhflx(i,j)/(lathv*rhoa(i,j)*cdqa(i,j)*windsp(i,j)) & + qvair(i,j) IF (qvsfc(i,j) > qvsat(i,j)) qvsfc(i,j) = qvsat(i,j) !----------------------------------------------------------------------- ! ! Converts potential soil temperatures to standard soil temperatures. ! !----------------------------------------------------------------------- IF (soiltyp(i,j) /= 12 .AND. soiltyp(i,j) /= 13) THEN DO k=1,nzsoil tsoil(i,j,k) = tsoil(i,j,k) * ((100000.0 / psfc(i,j)) **(-0.286)) tsfc(i,j) = tsoil(i,j,1) END DO END IF END DO END DO RETURN END SUBROUTINE ousoil ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE CANWET ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE canwet(nx, ny, soiltyp, veg, lai, snowdpth, evapcan, & 2 precip, wetcanp) !----------------------------------------------------------------------- ! ! PURPOSE: To calculate the canopy wetness. ! Uses a forward scheme. ! !------------------------------------------------------------------------- !----------------------------------------------------------------------- ! ! AUTHOR: Jerry Brotzge ! 7/23/02 ! ! 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) ! soiltyp Soil type ! veg Vegetation fraction ! snowdpth Snow depth (m) ! evapcan Evaporation from canopy ! precip Precipitation rate ! ! OUTPUT: ! ! wetcanp Soil water content on canopy ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny INTEGER :: soiltyp(nx,ny) REAL :: precip (nx,ny) ! Precipitation rate at the surface REAL :: veg (nx,ny) ! Vegetation fraction REAL :: lai (nx,ny) ! Leaf area index REAL :: snowdpth(nx,ny) ! Snow depth REAL :: evapcan(nx,ny) ! Evaporation from canopy REAL :: wetcanp(nx,ny) ! Soil water content of canopy ! !----------------------------------------------------------------------- ! Include files: !----------------------------------------------------------------------- ! INCLUDE 'grid.inc' INCLUDE 'globcst.inc' INCLUDE 'phycst.inc' INCLUDE 'soilcst.inc' ! !----------------------------------------------------------------------- ! ! Local variables: ! !----------------------------------------------------------------------- ! ! INTEGER :: i, j REAL :: wrmax REAL :: wr2max REAL :: rhswr REAL :: vegp REAL :: pnet REAL :: tema REAL :: runoff REAL :: temwra(nx,ny) ! Temporary array REAL :: temwrb(nx,ny) ! Temporary array ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! DO j = 1, ny-1 DO i = 1, nx-1 wrmax = 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 temwra(i,j) = 0.0 ELSE wr2max = ( wrmax - wetcanp(i,j) ) / dtsfc vegp = veg(i,j) * precip(i,j) pnet = vegp - evapcan(i,j) tema = pnet - wr2max * rhow runoff = MAX( tema, 0.0 ) vegp = vegp - runoff temwra(i,j) = ( vegp - evapcan(i,j) ) / rhow END IF temwrb(i,j) = wetcanp(i,j) + dtsfc * temwra(i,j) temwrb(i,j) = MAX( temwrb(i,j), 0.0 ) temwrb(i,j) = MIN( temwrb(i,j), wrmax ) IF ( soiltyp(i,j) == 12 .OR. soiltyp(i,j) == 13 .OR. & snowdpth(i,j) >= snowdepth_crit ) THEN rhswr = 0.0 ELSE wr2max = ( wrmax - temwrb(i,j) ) / dtsfc vegp = veg(i,j) * precip(i,j) pnet = vegp - evapcan(i,j) tema = pnet - wr2max * rhow runoff = MAX( tema, 0.0 ) vegp = vegp - runoff rhswr = 0.5 * (temwra(i,j)+(vegp - evapcan(i,j) ) / rhow) END IF wetcanp(i,j) = wetcanp(i,j) + dtsfc * rhswr wetcanp(i,j) = MAX( wetcanp(i,j), 0.0 ) wetcanp(i,j) = MIN( wetcanp(i,j), wrmax ) END DO END DO ! DO j = 1, ny-1 ! DO i = 1, nx-1 ! ! wrmax = 0.2 * 1.e-3 * veg(i,j) * lai(i,j) ! meter ! wr2max = (wrmax - wetcanp(i,j) )/ dtsfc ! ! IF ( soiltyp(i,j) == 12 .OR. soiltyp(i,j) == 13 .OR. & ! snowdpth(i,j) >= snowdepth_crit ) THEN ! rhswr = 0.0 ! ELSE ! ! vegp = veg(i,j) * precip(i,j) ! pnet = vegp - evapcan(i,j) ! tema = pnet - wr2max * rhow ! runoff = MAX( tema, 0.0 ) ! vegp = vegp - runoff ! rhswr = (vegp - evapcan(i,j) ) / rhow ! END IF ! ! wetcanp(i,j) = wetcanp(i,j) + dtsfc * rhswr ! wetcanp(i,j) = MAX( wetcanp(i,j), 0.0 ) ! wetcanp(i,j) = MIN( wetcanp(i,j), wrmax ) ! ! END DO ! END DO RETURN END SUBROUTINE canwet ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE PENMAN ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! ! SUBROUTINE penman(nx, ny, nzsoil, soiltyp, tsoil, qsoil, & 1 ktsoiltop, fftem, j3soilinv, deltem, rrtem, veg, & temple, evappot, qvair, qvsata, tair, cdha, psfc, & potair, precip, rhoa, windsp, gflx, radswnet, radlwin, & sneqv, snowdpth, snofac, sncond, snowng, frzgra, flx2) ! !----------------------------------------------------------------------- ! ! PURPOSE: To calculate the potential evaporation. ! ! ! Ep = [ (Rn/rho/Cp/Ch) + (Ta-Ts)] * delta + (r + 1)*A ! ----------------------------------------------- * (rho*Cp*Ch/Lv) ! delta + r + 1.0 ! ! delta = (qsfcsat - qairsat) / (Ts - Tair) * Lv / Cp ! ! ! r = 4.0 * sigma * Tair**4.0 * Rd ! ----------------------------- ! Psfc * Cp * Ch ! !------------------------------------------------------------------------- !----------------------------------------------------------------------- ! ! AUTHOR: Jerry Brotzge ! 7/18/02 ! ! 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) ! nzsoil Number of grid points in the z-direction (soil) ! soiltyp Soil type ! tsoil Soil temperatures (K) ! qsoil Soil moisture ! ! OUTPUT: ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nzsoil INTEGER :: soiltyp(nx,ny) ! Soil type at each point INTEGER :: snowng (nx,ny) ! Snowing flag INTEGER :: frzgra (nx,ny) ! Freezing rain flag REAL :: ktsoiltop(nx,ny) ! Thermal conductivity, top soil level REAL :: j3soilinv (nx,ny,nzsoil) ! Inverse of j3soil REAL :: windsp(nx,ny) ! Wind speed REAL :: psfc (nx,ny) ! Surface pressure REAL :: potair(nx,ny) ! Potential temp (K) REAL :: rhoa (nx,ny) ! Air density near the surface REAL :: precip(nx,ny) ! Precipitation rate at the surface REAL :: veg (nx,ny) ! Vegetation fraction REAL :: qvsfc (nx,ny) ! Effective humidity at surface REAL :: tsoil (nx,ny,nzsoil) ! Soil temperature at nzsoil levels REAL :: qsoil (nx,ny,nzsoil) ! Soil moisture at nzsoil levels 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 :: gflx (nx,ny) ! Ground heat flux REAL :: qvsata (nx,ny) ! qvsat(tair) (kg/kg) REAL :: fftem (nx,ny) ! Temporary array for est'g Pot Evapo. REAL :: deltem (nx,ny) ! Temporary array for est'g Pot Evapo. REAL :: evappot (nx,ny) ! Temporary array for est'g Pot Evapo. REAL :: temple (nx,ny) ! Temporary array for est'g Pot Evapo. REAL :: rrtem (nx,ny) ! Temporary array for est'g Pot Evapo. REAL :: flx2 (nx,ny) ! Temp array for freezing rain REAL :: radswnet(nx,ny) ! Net shortwave radiation REAL :: radlwin (nx,ny) ! Incoming longwave radiation REAL :: sneqv (nx,ny) ! Snow water equivalent REAL :: snowdpth(nx,ny) ! Snow depth (m) REAL :: sncond (nx,ny) ! Snow conductivity REAL :: snofac (nx,ny) ! Snow factor ! !----------------------------------------------------------------------- ! Include files: !----------------------------------------------------------------------- ! INCLUDE 'grid.inc' INCLUDE 'globcst.inc' INCLUDE 'phycst.inc' INCLUDE 'soilcst.inc' ! !----------------------------------------------------------------------- ! ! Local variables: ! !----------------------------------------------------------------------- ! ! INTEGER :: i, j, k REAL :: rnettot ! Temporary array for est'g Pot Evapo. REAL :: aatem ! Temporary array for est'g Pot Evapo. REAL :: tempbeta ! Beta coefficient, soil mstr parameter REAL :: dew ! Dew REAL :: expsno, expsoi REAL :: depthtotal REAL :: df1p, rch REAL :: temb, temc, desdt, dqsdt ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! temb = 4.0 * sbcst * rd/cp temc = lathv * cpinv DO j=1,ny-1 DO i=1,nx-1 rch = rhoa(i,j) * cp * cdha(i,j) cdha(i,j) = cdha(i,j) * MAX(windsp(i,j),0.1) !------------------------------------------- ! Estimate GH flux term !------------------------------------------- IF (sneqv(i,j) == 0.0) THEN !No snow cover gflx(i,j)=ktsoiltop(i,j)* EXP(-2.0*veg(i,j)) * & dzsoilinv*j3soilinv(i,j,2)* & (tsoil(i,j,1)-tsoil(i,j,2)) ! gflx(i,j)=ktsoiltop(i,j)*dzsoilinv*j3soilinv(i,j,2)* & ! (tsoil(i,j,1)-tsoil(i,j,2)) ELSE !Snow cover (plane parallel) depthtotal = snowdpth(i,j) + dzsoil expsno = snowdpth(i,j) / depthtotal expsoi = dzsoil / depthtotal df1p = expsno * sncond(i,j) + expsoi * ktsoiltop(i,j) ktsoiltop(i,j) = df1p * snofac(i,j) + ktsoiltop(i,j)*(1.0-snofac(i,j)) gflx(i,j) = ktsoiltop(i,j) * j3soilinv(i,j,2) * & (tsoil(i,j,1) - tsoil(i,j,2)) / depthtotal END IF !---------------------------------------------------------- ! Compute radiation and potential air temperature !---------------------------------------------------------- fftem(i,j) = radswnet(i,j) + radlwin(i,j) rnettot = fftem(i,j) - (sbcst * tair(i,j)**4.0) - gflx(i,j) aatem = temc * (qvsata(i,j) - qvair(i,j)) potair(i,j) = tair(i,j) * ((100000.0 / psfc(i,j)) ** 0.286) !--------------------------------------------------------------------- ! Include the latent heat effects of freezing rain converting to ice !--------------------------------------------------------------------- flx2(i,j) = 0.0 IF (frzgra(i,j) /= 0) THEN ! flx2(i,j) = -3.335E5 * precip(i,j) * 1000.0 flx2(i,j) = -3.335E5 * precip(i,j) rnettot=rnettot - flx2(i,j) END IF !--------------------------------------------------------------------- ! Adjust for latent heat effects caused by falling precipitation !--------------------------------------------------------------------- rrtem(i,j) = temb * (tair(i,j)**4.0) / (psfc(i,j)* cdha(i,j)) IF (snowng(i,j) /= 1) THEN ! IF (precip(i,j) > 0.0) rrtem(i,j) = rrtem(i,j) + & ! 4.218E3 * (precip(i,j)*1000.0) / rch IF (precip(i,j) > 0.0) rrtem(i,j) = rrtem(i,j) + & 4.218E3 * precip(i,j) / rch ELSE ! rrtem(i,j) = rrtem(i,j)+2.106E3*(precip(i,j)*1000.0) / rch rrtem(i,j) = rrtem(i,j)+2.106E3*precip(i,j) / rch END IF !--------------------------------------------------------- ! Compute Clausius-Clapyron Eqtn. !--------------------------------------------------------- dqsdt = 0.0 desdt = 0.0 Do k = 7,2,-1 desdt = alpha(k)*(k-1) + (tair(i,j)-273.16)*desdt END DO dqsdt = 0.622 * desdt / psfc(i,j) deltem(i,j) = temc * dqsdt ! evappot(i,j)=( ((rnettot/(rhoa(i,j)*cp*cdha(i,j)))+(potair(i,j)-tair(i,j))) & ! * deltem(i,j) + ((rrtem(i,j) + 1.0) * aatem) + (aatem - deltem(i,j)* & ! tair(i,j)) * (((100000.0/psfc(i,j))**0.286)-1.0) ) & ! / ( (deltem(i,j) + rrtem(i,j) + 1.0) & ! + (((100000.0/psfc(i,j))**0.286)-1.0) ) & ! * (rhoa(i,j) * cp *cdha(i,j)/lathv) evappot(i,j)=( ((rnettot/rch)+(potair(i,j)-tair(i,j))) & * deltem(i,j) + ((rrtem(i,j) + 1.0) * aatem) ) & / ( deltem(i,j) + rrtem(i,j) + 1.0) & * (rch/lathv) ! (This 2nd version of evappot is smoother temporally...) IF (soiltyp(i,j) /= 13) THEN tempbeta = (qsoil(i,j,1) - wwlt(soiltyp(i,j))) / & (wfc(soiltyp(i,j)) - wwlt(soiltyp(i,j)) ) ELSE IF (soiltyp(i,j) == 13) THEN tempbeta = 1.0 END IF !---------------Set upper limit on soil wetness IF (tempbeta > 1.0) tempbeta = 1.0 !---------------Set lower limit on soil wetness IF (tempbeta < 0.0) tempbeta = 0.0 temple(i,j) = (1.0 - veg(i,j)) * tempbeta * evappot(i,j) END DO END DO RETURN END SUBROUTINE penman ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE GETCON ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! ! SUBROUTINE getcon(nx,ny,nzsoil, soiltyp, vegtyp, tsoil, qsoil, & 2 ktsoiltop, cisoil, tsdiffus, xqsoil) ! !----------------------------------------------------------------------- ! ! PURPOSE: To calculate the thermal conductivity and diffusivity !----------------------------------------------------------------------- ! ! AUTHOR: Jerry Brotzge ! 7/18/02 ! ! 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) ! nzsoil Number of grid points in the z-direction (soil) ! soiltyp Soil type ! vegtyp Vegetation type ! tsoil Soil temperatures (K) ! qsoil Soil moisture ! ! OUTPUT: ! ! cisoil ! Volumetric heat capacity ! ktsoiltop ! Thermal conductivity, top soil level ! tsdiffus ! Thermal diffusivity ! ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nzsoil INTEGER :: soiltyp(nx,ny) INTEGER :: vegtyp(nx,ny) REAL :: qsoil (nx,ny,nzsoil) REAL :: tsoil (nx,ny,nzsoil) REAL :: xqsoil(nx,ny,nzsoil) ! Volume of nonfrozen soil water REAL :: tsdiffus(nx,ny,nzsoil) ! Thermal diffusivity REAL :: cisoil(nx,ny,nzsoil) ! Volumetric heat capacity REAL :: ktsoiltop(nx,ny) ! Thermal conductivity, top soil level ! !----------------------------------------------------------------------- ! Include files: !----------------------------------------------------------------------- ! INCLUDE 'grid.inc' INCLUDE 'globcst.inc' INCLUDE 'phycst.inc' INCLUDE 'soilcst.inc' ! !----------------------------------------------------------------------- ! ! Local variables: ! !----------------------------------------------------------------------- ! ! INTEGER :: i, j, k INTEGER :: getopt REAL :: psi ! Matric water potential REAL :: psitemp ! Temporary array REAL :: pf ! log(psi) REAL :: ktsoil ! Thermal conductivity REAL :: totaldepth ! Thickness of total soil column REAL :: satker ! Saturation of soil, qsoil/porosity REAL :: kersten ! Kersten Number REAL :: dryden ! Dry soil density [kg/m3] REAL :: liqfrc ! Nonfrozen liquid fraction REAL :: tcs ! Solids thermal conductivity REAL :: tcko ! Minerals thermal conductivity REAL :: tcdry ! Dry thermal conductivity REAL :: tcsat ! Saturated thermal conductivity REAL :: xu ! Volume of nonfrozen soil water saturation ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! !---------------------------------------------------------------------- DO k=1,nzsoil ! set initial ground heat flux DO j=1,ny-1 DO i=1,nx-1 getopt = 2 !---------------------------------------------------------------------- ! Option #1 for computing soil thermal conductivity ! Compute soil thermal conductivity using McCumber and Pielke (1981) ! ! Kt = 420 * EXP[ -(2.7 + Pf)] Pf <= 5.1 ! = 0.1744 Pf > 5.1, Pf < 0 ! ! Pf = log[ psi,sat * (Qsat / Q)**b ] ! !---------------------------------------------------------------------- IF (getopt == 1) THEN psitemp = 0.0 IF (qsoil(i,j,k) > 0.0) THEN psitemp = wsat(soiltyp(i,j)) / qsoil(i,j,k) psi = psisat(soiltyp(i,j))*(psitemp**bslope(soiltyp(i,j)) ) IF (psi > 0.0) THEN pf = ALOG10(psi) IF (pf <= 5.1) ktsoil = 418.46*EXP(-(pf + 2.7)) IF (pf > 5.1) ktsoil = 0.172 IF (pf < 0.0) ktsoil = 0.172 ELSE ktsoil = 0.172 END IF ELSE ktsoil = 0.172 END IF !!!! IF (ktsoil >= 1.9) ktsoil = 1.90 IF (k == 1) ktsoiltop(i,j) = ktsoil END IF !------------------------------------------------------------------------- ! psitemp = 0.0 ! ! IF (qsoil(i,j,k) /= 0.0) THEN ! psitemp = wsat(soiltyp(i,j)) / qsoil(i,j,k) ! END IF ! ! psi = psisat(soiltyp(i,j))*(psitemp**bslope(soiltyp(i,j)) ) ! ! pf = ALOG10(psi) ! ! IF (pf <= 5.1) ktsoil = 418.46*EXP(-(pf + 2.7)) ! ! IF (pf > 5.1) ktsoil = 0.172 ! IF (pf < 0.0) ktsoil = 0.172 ! !!!!! IF (ktsoil < 0.2) ktsoil = 0.20 ! IF (ktsoil >= 1.9) ktsoil = 1.90 ! ! IF (k == 1) ktsoiltop(i,j) = ktsoil !------------------------------------------------------------------------- !------------------------------------------------------------------------- ! Option #2 for computing soil thermal conductivity ! Compute soil thermal cond. using Johansen (1975); Peters-Lidard (1998) ! ! Kt = KE*(Ksat - Kdry) + Kdry ! Kdry = (0.135*gammadry + 64.7)/(2700 - 0.947*gammadry) ! gammadry = (1 - porosity) * 2700 ! ! Ksat = Ks**(1-porosity) * Kice**(porosity-xu) * Kh2o**(xu) ! Ks = Kq**quartz * Ko**(1-quartz) ! ! KE = 0.7 * log(SR) + 1.0 SR > 0.05 (coarse) ! = log(SR) + 1.0 SR > 0.10 (fine) !------------------------------------------------------------------------- IF (getopt == 2) THEN ! Compute dry density, dryden dryden = (1.0 - porosity(soiltyp(i,j))) * 2700.0 ! [kg/m3] ! Compute dry thermal conductivity [W/m/K] tcdry = (0.135*dryden + 64.7) / (2700.0 - 0.947*dryden) tcko = 3.0 ! [ W/m/K] IF (quartz(soiltyp(i,j)) > 0.2) tcko = 2.0 ! [ W/m/K] ! Conductivity of solids (tcs) tcs = (7.7**quartz(soiltyp(i,j))) * (tcko**(1.0-quartz(soiltyp(i,j)) )) ! Estimate unfrozen (liquid) fraction (1.0 is 100% liquid; wwlt 100% frozen liqfrc = (xqsoil(i,j,k) + 1.0E-9) / (qsoil(i,j,k) + 1.0E-9) ! Estimate unfrozen volume for saturation (xu) xu = liqfrc * porosity(soiltyp(i,j)) ! Compute saturated thermal conductivity, (tcsat) tcsat = (tcs ** (1.0 - porosity(soiltyp(i,j)) )) * & (2.2 ** (porosity(soiltyp(i,j)) - xu) ) * & (0.57** (xu)) ! Compute saturation ratio, (satker) IF (soiltyp(i,j) /= 12 .AND. soiltyp(i,j) /= 13) THEN satker = qsoil(i,j,k) / porosity(soiltyp(i,j)) ELSE satker = 1.0 END IF !!! IF (satker > 1.0) satker = 1.0 !!! IF (satker <= 0.1) satker = 0.11 ! Compute Kersten number IF (satker > 0.1) THEN IF ( (xqsoil(i,j,k) + 0.0005) < qsoil(i,j,k)) THEN !Frozen kersten = satker ELSE !Unfrozen kersten = ALOG10(satker) + 1.0 !Kersten Number, fine soils END IF IF (soiltyp(i,j) == 12) kersten = satker ELSE kersten = 0.0 END IF ! Compute thermal conductivity ktsoil = kersten * (tcsat-tcdry) + tcdry !!! IF (ktsoil > 1.9) ktsoil = 1.90 !!! IF (ktsoil < 0.2) ktsoil = 0.20 IF (k == 1) ktsoiltop(i,j) = ktsoil END IF !--------------------------------------------------------------------------- ! Compute heat capacity as a function of soil moisture ! ! C = Q * C,h20 + (1 - Qsat)*C,soil + (Qsat - Q)*C,air ! !----------------------------------------------------------------------- IF (qsoil(i,j,k) > wfc(soiltyp(i,j))) qsoil(i,j,k) = wfc(soiltyp(i,j)) IF (qsoil(i,j,k) > 1.0) qsoil(i,j,k) = 1.0 ! cisoil(i,j,k) = (qsoil(i,j,k)*cwater) + & ! (1.0 - wsat(soiltyp(i,j))) * csoil + & ! (wsat(soiltyp(i,j)) - qsoil(i,j,k)) * cair cisoil(i,j,k) = (xqsoil(i,j,k)*cwater) + & (1.0 - wsat(soiltyp(i,j))) * csoil + & (wsat(soiltyp(i,j)) - qsoil(i,j,k)) * cair & + ( qsoil(i,j,k) - xqsoil(i,j,k)) * cice tsdiffus(i,j,k) = ktsoil / cisoil(i,j,k) END DO END DO END DO RETURN END SUBROUTINE getcon ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE TSKIN ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! ! SUBROUTINE tskin(nx,ny, nzsoil, cdha, rhoa, tair, potair, & 2 rrtem, fftem, ktsoiltop, psfc, evappot, lhflx, tsoil, & soiltyp,snowdpth,veg) ! !----------------------------------------------------------------------- ! ! PURPOSE: To estimate the top surface (skin) temperature, (Ek and Mahrt, 1991) ! ! Ts = (YY + ZZ * Tsoil(x,y,2)) / (ZZ + 1.0) ! ! FF = (1 - albedo) * SW,in + LW,in ! ! RCH = rho * Cp * Ch ! ! YY = Tair + [(FF-sigma*Tair**4)/RCH + (Tp-Tair)- Beta*(Lv*Ep/RCH) ! ---------------------------------------------------- ! r + 1 ! ! ZZ = Kt / (-0.5*zsoil(1) * RCH * (r + 1) ) ! !------------------------------------------------------------------------- !----------------------------------------------------------------------- ! ! AUTHOR: Jerry Brotzge ! 7/19/02 ! ! 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) ! tsoil Soil temperatures (K) ! cdha Drag coefficient for heat ! ktsoiltop Soil conductivity ! evappot Potential evaporation ! lhflx Initial estimates of LE flux ! fftem Radiative forcing (SW,net + LW,in) ! ! OUTPUT: ! ! tsoil(,,1) ! Potential skin temperature (K) ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nzsoil INTEGER :: soiltyp(nx,ny) REAL :: tsoil (nx,ny,nzsoil) REAL :: ktsoiltop(nx,ny) ! Thermal conductivity, top soil level REAL :: cdha(nx,ny) ! Drag coefficient REAL :: rhoa(nx,ny) ! Density of air REAL :: tair(nx,ny) ! Air temperature (K) REAL :: potair(nx,ny) ! Potential temp of air (K) REAL :: rrtem(nx,ny) ! REAL :: fftem(nx,ny) ! Radiative forcing, SW net + LW in REAL :: psfc(nx,ny) ! Atmospheric pressure (pa) REAL :: evappot(nx,ny) ! Potential evaporation REAL :: lhflx(nx,ny) ! Latent heat flux (W/m2) REAL :: snowdpth(nx,ny) ! Snow depth (m) REAL :: veg(nx,ny) ! Vegetation ! !----------------------------------------------------------------------- ! Include files: !----------------------------------------------------------------------- ! INCLUDE 'grid.inc' INCLUDE 'globcst.inc' INCLUDE 'phycst.inc' INCLUDE 'soilcst.inc' ! !----------------------------------------------------------------------- ! ! Local variables: ! !----------------------------------------------------------------------- ! ! INTEGER :: i, j REAL :: yy REAL :: yynum REAL :: zz1 REAL :: rch REAL :: tempbeta2 ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! DO j=1,ny-1 DO i=1,nx-1 rch = rhoa(i,j) * cp * cdha(i,j) IF (snowdpth(i,j) == 0.0) THEN IF (lhflx(i,j) > (evappot(i,j)*lathv)) lhflx(i,j)=evappot(i,j)*lathv tempbeta2 = 0.0 IF ((lhflx(i,j) /= 0.0).and.(evappot(i,j) /= 0.0)) THEN tempbeta2 = lhflx(i,j) / (evappot(i,j)*lathv) END IF yynum = fftem(i,j) - sbcst*(tair(i,j)**4.0) yy = tair(i,j) + (yynum/rch + (potair(i,j)-tair(i,j)) - & (tempbeta2*lathv*evappot(i,j)/rch)) / (rrtem(i,j)+1.0) zz1 = ktsoiltop(i,j)*EXP(-2.0*veg(i,j)) / (dzsoil * & rch * (rrtem(i,j)+1.0)) + 1.0 ! Note that rrtem(i,j) is r; rrtemp is RR in ETA code. IF (soiltyp(i,j) /= 12 .AND. soiltyp(i,j) /= 13 ) THEN tsoil(i,j,1) = (yy + (zz1-1.0) * tsoil(i,j,2)) / zz1 END IF END IF END DO END DO RETURN END SUBROUTINE tskin ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE QDIFF ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! ! SUBROUTINE qdiff(nx,ny,nzsoil, j3soilinv, soiltyp, lai, veg, & 1 tsoil, qsoil, wetcanp, windsp, rhoa, precip, & qvair, qvsata, evapcan, evaprg, tem1soil, tem2soil, & tem3soil, tem4soil, precipdrip) ! !----------------------------------------------------------------------- ! ! PURPOSE: To calculate the soil moisture profile and input matrix ! for tridiagonalization. !----------------------------------------------------------------------- ! ! AUTHOR: Jerry Brotzge ! 3/06/02 ! ! MODIFICATION HISTORY: ! ! (4/11/02) Dan Weber ! Cleaned up code and modified loop calculations to improve ! optimization. ! !----------------------------------------------------------------------- ! ! ! INPUT: ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nzsoil Number of grid points in the z-direction (soil) ! ! cdqa Array for surface drag coefficient for water vapor ! cdha Array for surface drag coefficient for heat ! veg Vegetation fraction ! ! qvair Specific humidity near the surface ! windsp Wind speed near the surface ! rhoa Air density near the surface ! ! OUTPUT: ! ! tem1soil Tridiagonal matrix ! tem2soil Tridiagonal matrix ! tem3soil Tridiagonal matrix ! tem4soil Tridiagonal matrix ! ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nzsoil INTEGER :: soiltyp(nx,ny) REAL :: precip (nx,ny) REAL :: precipdrip(nx,ny) REAL :: lai (nx,ny) REAL :: veg (nx,ny) REAL :: wetcanp(nx,ny) REAL :: windsp (nx,ny) REAL :: rhoa (nx,ny) REAL :: evapcan(nx,ny) REAL :: evaprg (nx,ny) REAL :: qsdiffustop (nx,ny) REAL :: qsdiffusm (nx,ny) REAL :: qsdiffus (nx,ny) REAL :: qsdiffusa (nx,ny) REAL :: qsconducttop (nx,ny) REAL :: qsconductm (nx,ny) REAL :: qsconduct (nx,ny) REAL :: qsconducta (nx,ny) REAL :: qvsata (nx,ny) REAL :: qvair (nx,ny) REAL :: j3soilinv(nx,ny,nzsoil) REAL :: qsoil (nx,ny,nzsoil) REAL :: tsoil (nx,ny,nzsoil) REAL :: tem1soil (nx,ny,nzsoil) REAL :: tem2soil (nx,ny,nzsoil) REAL :: tem3soil (nx,ny,nzsoil) REAL :: tem4soil (nx,ny,nzsoil) ! !----------------------------------------------------------------------- ! Include file: phycst.inc !----------------------------------------------------------------------- ! INCLUDE 'grid.inc' INCLUDE 'globcst.inc' INCLUDE 'phycst.inc' INCLUDE 'soilcst.inc' ! !----------------------------------------------------------------------- ! ! Local variables: ! !----------------------------------------------------------------------- ! ! INTEGER :: i, j, k REAL :: tempcoefa REAL :: tempcoefb REAL :: tempcoefc REAL :: tempcoefx1 REAL :: tempcoefx2 REAL :: tempcoefz1 REAL :: tempcoefz2 REAL :: tempel REAL :: tempws REAL :: tempinf REAL :: tema, temb, temc, temd REAL :: wrmax REAL :: wr2max REAL :: vegp REAL :: pnet REAL :: runoff ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! !---------------------------------------------------------------------- ! Estimate Soil Moisture !----------------------------------------------------------------------- ! ! Compute moisture diffusional coefficient (Dn) and hydraulic (Kn) ! conductivity ! ! Note that the constants (Ksat, Psisat, Qsat, b) are all a f(Veg type) ! ! dQ/dt = d/dz( D * dQ/dz) + dK/dz ! ! D = - (b * Ksat * Psisat / Q) * (Q / Qsat)**(b+3) ! ! ! K = Ksat * (Q / Qsat )**(2*b+3) ! !----------------------------------------------------------------------- !------------------------------------------------------------------ ! Compute top moisture boundary conditions !------------------------------------------------------------------ tema = 0.2 * 1.e-3 temb = 1.0/dtsfc temc = dtsfc * dzinv DO j=1,ny-1 DO i=1,nx-1 qsdiffustop(i,j) = - (bslope(soiltyp(i,j)) * kns(soiltyp(i,j)) * & wsat(soiltyp(i,j)) / qsoil(i,j,1)) * & ( (qsoil(i,j,1)/wsat(soiltyp(i,j))) ** (bslope(soiltyp(i,j)) & + 3.0) ) qsconducttop(i,j) = (kns(soiltyp(i,j)) / wsat(soiltyp(i,j))) * & ( (qsoil(i,j,1)/wsat(soiltyp(i,j)) ) ** (2.0 * & bslope(soiltyp(i,j)) + 2.0) ) tempel = evaprg(i,j) tempws = rhow * ( (qsdiffustop(i,j) * (qsoil(i,j,1) - & qsoil(i,j,2)) * dzsoilinv) + qsconducttop(i,j) ) wrmax = tema * veg(i,j) * lai(i,j) ! m wr2max = temb * ( wrmax - wetcanp(i,j)) ! m/s ! vegp = veg(i,j) * precip(i,j) ! m/s vegp = veg(i,j) * (precip(i,j)/1000.0) ! m/s pnet = vegp - evapcan(i,j) ! m/s temd = pnet - wr2max * rhow ! m/s runoff = MAX( temd, 0.0 ) ! m/s ! tempinf = (precip(i,j)-runoff) * rhow ! kg/m/m/s tempinf = (precip(i,j)/1000.0-runoff) * rhow ! kg/m/m/s IF (soiltyp(i,j) /= 12 .AND. soiltyp(i,j) /= 13) THEN ! qsoil(i,j,1) = qsoil(i,j,1) + temc * (tempws + & ! tempel + tempinf) qsoil(i,j,1) = qsoil(i,j,1) + (precipdrip(i,j)/rhow) * temc IF (qsoil(i,j,1) > wfc(soiltyp(i,j))) qsoil(i,j,1) = wfc(soiltyp(i,j)) IF (qsoil(i,j,1) > 1.0) qsoil(i,j,1) = 1.0 END IF END DO END DO !------------------------------------------------------------------------ ! ! Compute moisture diffusivity and conductivity terms ! See Smirnova et al.(1997) ! ! Qdiff = (-b*Knsat*psisat/theta)*(theta/thetasat)**(b+3) ! ! Qcond = Knsat * (theta/thetasat)**(2b+3) ! !------------------------------------------------------------------------ tema = dtsfc*0.5*dzsoilinv2 DO k=2,nzsoil-1 tempcoefc = dtsfc * dzsoilinv DO j=1,ny-1 DO i=1,nx-1 tempcoefa = cnbeta*tema*j3soilinv(i,j,k) tempcoefb = tema*j3soilinv(i,j,k)-tempcoefa qsdiffusm(i,j) = (bslope(soiltyp(i,j)) * kns(soiltyp(i,j)) * & psisat(soiltyp(i,j)) / qsoil(i,j,k-1)) * & ( (qsoil(i,j,k-1)/wsat(soiltyp(i,j))) ** (bslope(soiltyp(i,j)) & + 3.0) ) qsdiffus (i,j) = (bslope(soiltyp(i,j)) * kns(soiltyp(i,j)) * & psisat(soiltyp(i,j)) / qsoil(i,j,k)) * & ( (qsoil(i,j,k)/wsat(soiltyp(i,j))) ** (bslope(soiltyp(i,j)) & + 3.0) ) qsdiffusa(i,j) = (bslope(soiltyp(i,j)) * kns(soiltyp(i,j)) * & psisat(soiltyp(i,j)) / qsoil(i,j,k+1)) * & ( (qsoil(i,j,k+1)/wsat(soiltyp(i,j))) ** (bslope(soiltyp(i,j)) & + 3.0) ) qsconductm(i,j) = (kns(soiltyp(i,j)) / wsat(soiltyp(i,j))) * & ( (qsoil(i,j,k-1)/wsat(soiltyp(i,j)) ) ** (2.0 * & bslope(soiltyp(i,j)) + 2.0) ) qsconduct (i,j) = (kns(soiltyp(i,j)) / wsat(soiltyp(i,j))) * & ( (qsoil(i,j,k)/wsat(soiltyp(i,j)) ) ** (2.0 * & bslope(soiltyp(i,j)) + 2.0) ) qsconducta(i,j) = (kns(soiltyp(i,j)) / wsat(soiltyp(i,j))) * & ( (qsoil(i,j,k+1)/wsat(soiltyp(i,j)) ) ** (2.0 * & bslope(soiltyp(i,j)) + 2.0) ) END DO END DO !------------------------------------------------------------------------ ! ! Compute coefficients for tridiagonalization of moisture variables ! !------------------------------------------------------------------------ DO j=1,ny-1 DO i=1,nx-1 tempcoefx1 = (qsdiffusm(i,j) * j3soilinv(i,j,k-1)) + & (qsdiffus(i,j) * j3soilinv(i,j,k )) tempcoefx2 = (qsdiffus(i,j) * j3soilinv(i,j,k )) + & (qsdiffusa(i,j) * j3soilinv(i,j,k+1)) tempcoefz1 = tempcoefc * qsconductm(i,j) * j3soilinv(i,j,k-1) tempcoefz2 = tempcoefc * qsconducta(i,j) * j3soilinv(i,j,k+1) tem1soil(i,j,k) = - tempcoefa * tempcoefx1 + tempcoefz1 tem2soil(i,j,k) = 1.0 + tempcoefa * (tempcoefx1 + tempcoefx2) tem3soil(i,j,k) = - tempcoefa * tempcoefx2 - tempcoefz2 tem4soil(i,j,k) = tempcoefb * tempcoefx1 * qsoil(i,j,k-1) + & (1.0-tempcoefb*(tempcoefx1 + tempcoefx2)) * qsoil(i,j,k) & + (tempcoefb * tempcoefx2) * qsoil(i,j,k+1) END DO END DO END DO ! end of k loop, the moisture coefficients are set !----------------------------------------------------------------- ! Set upper and lower moisture boundary conditions ! note lower boundary is zero gradient ! (qsoil(i,j,nzsoil) = qsoil(i,j,nz-1) !----------------------------------------------------------------- DO j=1,ny-1 ! must set the boundry condition for tem2soil(i,j,nzsoil-1) DO i=1,nx-1 tem4soil(i,j,2) = tem4soil(i,j,2)-tem1soil(i,j,2)*qsoil(i,j,1) !Top BC tem2soil(i,j,nzsoil-1) = tem2soil(i,j,nzsoil-1) + & tem3soil(i,j,nzsoil-1) !Bottom, zero gradient END DO END DO RETURN END SUBROUTINE qdiff ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE CANRES ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE canres(nx,ny, radsw, f34, cdqa, & 1 windsp,psfc,rhoa,qvair, & soiltyp,vegtyp,lai,veg, & tair,tsoil,qsoil,wetcanp,nzsoil,zpsoil,snowdpth, & qvsata,rstcoef,plantcoef,cdha) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Calculate canopy 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 ! !----------------------------------------------------------------------- ! ! AUTHOR: Yuhe Liu and Vince Wong ! 4/20/94 ! ! MODIFICATION HISTORY: ! ! 07/16/02 Jerry Brotzge ! Modified according to Chen and Dudhia (2001, MWR) ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nzsoil Number of grid points in the soil ! ! 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 ! ! tsoil Soil temperatures ! qsoil Soil moistures ! ! psfc Surface pressure ! qvair Specific humidity near the surface ! windsp Wind speed near the surface ! rhoa Air density near the surface ! ! OUTPUT: ! ! rstcoef Canopy resistance (s/m) ! ! WORK ARRAY: ! ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny INTEGER :: nzsoil 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 :: tsoil (nx,ny,nzsoil) REAL :: qsoil (nx,ny,nzsoil) REAL :: wetcanp(nx,ny) REAL :: sumgdz(nx,ny) REAL :: zpsoil (nx,ny,nzsoil) REAL :: tair (nx,ny) REAL :: snowdpth(nx,ny) REAL :: psfc (nx,ny) REAL :: qvair (nx,ny) REAL :: windsp (nx,ny) REAL :: rhoa (nx,ny) REAL :: qvsata (nx,ny) REAL :: rstcoef(nx,ny) REAL :: plantcoef(nx,ny) REAL :: cdha(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, k REAL :: wrmax ! Maximum value for canopy moisture, wetcanp REAL :: temb, temc ! Used to compute f1*f2 REAL :: f2 ! Temporary variable for f2 REAL :: waf ! Available soil moisture fraction REAL :: es ! saturation vapor pressure REAL :: beta2 ! Used to estimate f1*f2 REAL :: delzneg REAL :: desdt, dqsdt, st1temp, rrtemp, deltatem ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! DO j=1,ny-1 DO i=1,nx-1 sumgdz(i,j) = 0.0 rstcoef(i,j) = 0.0 END DO END DO DO j = 1, ny-1 DO i = 1, nx-1 IF ( soiltyp(i,j) /= 12 .AND. soiltyp(i,j) /= 13) THEN 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(i,j) = 1. ELSE IF (radsw(i,j) < 0.0 ) radsw(i,j) = 0.0 temb = 0.55 * ( radsw(i,j) / rgl(vegtyp(i,j)) ) & * ( 2.0 / lai(i,j) ) rstcoef(i,j) = ( rsmin(vegtyp(i,j)) / rsmax + temb ) & / ( 1.0 + temb ) rstcoef(i,j) = MAX( 0.0001, rstcoef(i,j)) END IF !--------------------------------------------------------------------------- ! ! Calculate F4. ! Replaced force-restore wetdp estimate with integrated soil moisture (JAB) ! estimated as a function of root zone depth ! (See Chen and Dudhia MWR 2001) ! !--------------------------------------------------------------------------- DO k = 2,nzsoil-1 IF ((zpsoil(i,j,1)-zpsoil(i,j,nzsoil)) <= rootzone(vegtyp(i,j))) & rootzone(vegtyp(i,j)) = zpsoil(i,j,1) - zpsoil(i,j,nzsoil) IF (zpsoil(i,j,k) >= (zpsoil(i,j,1)-rootzone(vegtyp(i,j))) ) THEN delzneg = (zpsoil(i,j,k-1)-zpsoil(i,j,k))/ & rootzone(vegtyp(i,j)) ELSE delzneg = 0.0 END IF beta2 = (qsoil(i,j,k) - wwlt(soiltyp(i,j))) / & (wfc(soiltyp(i,j)) - wwlt(soiltyp(i,j)) ) IF (qsoil(i,j,k) > wfc(soiltyp(i,j)) ) beta2 = 1.0 IF (qsoil(i,j,k) <= wwlt(soiltyp(i,j))) beta2 = 0.0 sumgdz(i,j) = sumgdz(i,j) + (beta2 * delzneg) END DO sumgdz(i,j) = MAX( 0.0001, sumgdz(i,j)) rstcoef(i,j) = rstcoef(i,j) * sumgdz(i,j) ! !----------------------------------------------------------------------- ! ! Calculate F2. ! !----------------------------------------------------------------------- f2 = 1.0 + hsf2(vegtyp(i,j))*(qvsata(i,j) - qvair(i,j) ) IF (qvair(i,j) > qvsata(i,j) .OR. f2 < 0) f2 = 1.0 IF (f2 > 1.0E-30) THEN f2 = 1.0/f2 f2 = MAX( 0.01, f2) ELSE IF (f2 <= 1.0E-30 .AND. f2 /= 1.0) THEN f2 = 0.01 END IF ! !----------------------------------------------------------------------- ! ! Calculate f3 * f4, stored in f34(i,j), where ! ! f3 -- Fractional conductance of atmospheric vapor pressure ! f3 = 1 - 0.06 * ( qvsata(i,j) - qvair ) * 1.e3 ! use kg/kg for qv ! ! (We use f3 = 1 in the code instead of the above formula.) ! ! f4 -- Fractional conductance of air temperature ! f4 = 1 - 0.0016 * ( 298 - tanem ) ** 2 ! ! f3 * f4 will be used to calculate the resistance coefficient. ! !----------------------------------------------------------------------- ! ! f3 = 1.0 ! f3 set to 1 ! f34(i,j) = f3 * ( 1.0 - 0.0016 * ( 298. - tair(i,j) ) ** 2 ) ! !----------------------------------------------------------------------- ! f34(i,j) = MAX( 0.0001, 1.0 - 0.0016 * (298.0-tair(i,j))**2 ) ! f3 * f4, JN, Eq. 11 ! !----------------------------------------------------------------------- ! ! Calculate lai*f1*f2*f3*f4 where f3*f4 is stored in f34(i,j). ! !----------------------------------------------------------------------- ! rstcoef(i,j) = lai(i,j)*rstcoef(i,j)*f2*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) ! !----------------------------------------------------------------------- ! IF ( ABS(rstcoef(i,j)) > 1.0E-30) THEN rstcoef(i,j) = rsmin(vegtyp(i,j)) / rstcoef(i,j) END IF !------------------------------------------------------------------------- ! Calculate PC - Plant coefficient (PC) !------------------------------------------------------------------------- temc = lathv * cpinv desdt = 0.0 dqsdt = 0.0 DO k = 7,2,-1 desdt = alpha(k)*(k-1) + (tair(i,j)-273.16)*desdt END DO dqsdt = 0.622 * desdt / psfc(i,j) ! TEST ********************************************************** ! es = 6.112*exp( 17.67*(tair(i,j)-273.15)/(tair(i,j)-29.65) ) ! desdt = (es*2.5e6) / (461.0 * tair(i,j) * tair(i,j) ) ! dqsdt = desdt * (0.622 * psfc(i,j) / ( (psfc(i,j) - & ! 0.378*es)**2.0) ) deltatem = temc * dqsdt st1temp = 4.0 * sbcst * rd * cpinv rrtemp = (st1temp * (tair(i,j)**4.0)) / (psfc(i,j)*cdha(i,j)) & + 1.0 plantcoef(i,j) = (rrtemp*deltatem) / (rrtemp & * (1.0 + rstcoef(i,j) * cdha(i,j)) + deltatem) END IF !soiltyp /= 12 and 13 END DO END DO RETURN END SUBROUTINE canres ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE LEFLX ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! ! SUBROUTINE leflx(nx,ny,nzsoil,cdha, cdqa, windsp, rhoa, qvair, veg, & 1 wetcanp,deltem, rrtem, temple, lhflx, evappot, soiltyp, & vegtyp, evaprg, evaprtr, evapcan, qvsfc, qvsat, rsttemp, & plantcoef,zpsoil, qsoil, xqsoil, qice, precip1, precipdrip) ! !----------------------------------------------------------------------- ! ! PURPOSE: To calculate the latent heat flux. ! ! 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 ! ! 4. Water vapor flux, lhflx, ! ! lhflx = rhoa * cdq * windsp * qvflx' ! ! lhflx' = (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 leflx' ! !----------------------------------------------------------------------- ! ! AUTHOR: J. Brotzge ! 3/06/02 ! ! 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) ! ! cdqa Array for surface drag coefficient for water vapor ! cdha Array for surface drag coefficient for heat ! veg Vegetation fraction ! ! 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 ! evapcan Direct evaporation from the fraction delta ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny, nzsoil INTEGER :: soiltyp(nx,ny) INTEGER :: vegtyp (nx,ny) REAL :: cdqa (nx,ny) REAL :: cdha (nx,ny) REAL :: veg (nx,ny) REAL :: wetcanp(nx,ny) REAL :: qvair (nx,ny) REAL :: qvsfc (nx,ny) REAL :: qvsat (nx,ny) REAL :: windsp (nx,ny) REAL :: rhoa (nx,ny) REAL :: rsttemp(nx,ny) REAL :: evappot(nx,ny) REAL :: evaprg (nx,ny) REAL :: evaprtr(nx,ny) REAL :: evapcan(nx,ny) REAL :: lhflx (nx,ny) REAL :: deltem (nx,ny) REAL :: rrtem (nx,ny) REAL :: temple (nx,ny) REAL :: beta3 (nzsoil) REAL :: rtdis (nzsoil) REAL :: qice(nx,ny,nzsoil) REAL :: precip1(nx,ny) REAL :: qsoil (nx,ny,nzsoil) REAL :: xqsoil (nx,ny,nzsoil) REAL :: zpsoil (nx,ny,nzsoil) REAL :: plantcoef(nx,ny) REAL :: precipdrip(nx,ny) ! !----------------------------------------------------------------------- ! Include file: phycst.inc !----------------------------------------------------------------------- ! INCLUDE 'phycst.inc' INCLUDE 'globcst.inc' INCLUDE 'soilcst.inc' !----------------------------------------------------------------------- ! ! Local variables: ! !----------------------------------------------------------------------- ! ! INTEGER :: i, j, k INTEGER :: nzsoiltemp REAL :: tempbc, tempfx, etp1a, sgxtemp REAL :: drip, dew, trhsct, excess REAL :: eta, eta1, wetcan2, rtxtemp, denomtemp REAL :: beta2, tempbeta ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! DO j = 1, ny-1 DO i = 1, nx-1 IF (evappot(i,j) > 0.0) THEN !-------------------------------------------------------------------- ! Compute bare soil evaporation !-------------------------------------------------------------------- IF (veg(i,j) < 1.0) THEN IF (soiltyp(i,j) /= 13) THEN tempbeta = (xqsoil(i,j,1) - wwlt(soiltyp(i,j))) / & (wfc(soiltyp(i,j)) - wwlt(soiltyp(i,j)) ) ELSE IF (soiltyp(i,j) == 13) THEN tempbeta = 1.0 END IF tempbeta = min(tempbeta,1.) IF (tempbeta > 0.0) THEN tempfx = tempbeta**2.0 tempfx = max( min(tempfx,1.0), 0.0) ELSE tempfx = 0.0 END IF evaprg(i,j) = tempfx * (1.0 - veg(i,j) ) * evappot(i,j) ENDIF !-------------------------------------------------------------------- ! Compute evapotranspiration !-------------------------------------------------------------------- sgxtemp = 0.0 denomtemp = 0.0 nzsoiltemp = 0 evaprtr(i,j) = 0.0 DO k=1,nzsoil beta3(k) = 0.0 END DO IF (veg(i,j) > 0.0) THEN IF (wetcanp(i,j) /= 0.0) THEN etp1a = veg(i,j) * plantcoef(i,j) * evappot(i,j) * & (1.0 - (wetcanp(i,j) / 0.5E-3)**0.5) ELSE etp1a = veg(i,j) * plantcoef(i,j) * evappot(i,j) END IF sgxtemp = 0.0 nzsoiltemp = 0 DO k=1,nzsoil beta3(k) = (xqsoil(i,j,k) - wwlt(soiltyp(i,j))) / & (wfc(soiltyp(i,j)) - wwlt(soiltyp(i,j)) ) beta3(k) = max( min(beta3(k),1.0), 0.0) !New******* IF (zpsoil(i,j,nzsoil) >= rootzone(vegtyp(i,j))) THEN sgxtemp = sgxtemp + beta3(k) nzsoiltemp = nzsoiltemp + 1 END IF END DO sgxtemp = sgxtemp / real(nzsoiltemp) denomtemp = 0.0 IF (nzsoiltemp > 1) THEN rtdis(1) = 0.0 beta3(1) = 0.0 DO k=2,nzsoiltemp IF ((zpsoil(i,j,1)-zpsoil(i,j,nzsoil)) <= rootzone(vegtyp(i,j))) & rootzone(vegtyp(i,j)) = zpsoil(i,j,1) - zpsoil(i,j,nzsoil) IF (zpsoil(i,j,k) >= (zpsoil(i,j,1)-rootzone(vegtyp(i,j))) ) THEN rtdis(k) = (zpsoil(i,j,k-1)-zpsoil(i,j,k))/ & rootzone(vegtyp(i,j)) ELSE IF ( (zpsoil(i,j,k-1) > (zpsoil(i,j,1)-rootzone(vegtyp(i,j)) )) & .AND. (zpsoil(i,j,k) < (zpsoil(i,j,1)-rootzone(vegtyp(i,j)) )) ) THEN rtdis(k) = (zpsoil(i,j,k-1)-rootzone(vegtyp(i,j))) / & (zpsoil(i,j,k-1) - zpsoil(i,j,k)) ELSE rtdis(k) = 0.0 END IF rtxtemp = rtdis(k) + beta3(k) - sgxtemp beta3(k) = beta3(k) * max( rtxtemp, 0.0) denomtemp = denomtemp + beta3(k) END DO IF (denomtemp <= 0.0) denomtemp = 1.0 DO k=2,nzsoiltemp evaprtr(i,j) = evaprtr(i,j) + etp1a * beta3(k) / denomtemp END DO END IF IF (nzsoiltemp == 1) evaprtr(i,j) = 0.0 !-------------------------------------------------------------------------- ! Compute direct Canopy Evaporation !-------------------------------------------------------------------------- IF (wetcanp(i,j) > 0.0) THEN evapcan(i,j) = veg(i,j) * ( (wetcanp(i,j)/0.5E-3)**0.5) * evappot(i,j) ELSE evapcan(i,j) = 0.0 END IF wetcan2 = wetcanp(i,j) / dtsfc evapcan(i,j) = MIN(wetcan2, evapcan(i,j)) END IF ! (veg > 0) ELSE evaprg(i,j) = 0.0 evaprtr(i,j)= 0.0 evapcan(i,j) = 0.0 END IF ! (ETP > 0) !----------------------------------------------------------------------- ! Compute Total Evaporation !----------------------------------------------------------------------- eta1 = evaprg(i,j) + evaprtr(i,j) + evapcan(i,j) lhflx(i,j) = evaprg(i,j) + evaprtr(i,j) + evapcan(i,j) lhflx(i,j) = lhflx(i,j) * lathv ! Latent heat flux trhsct = (veg(i,j) * precip1(i,j)*1000.0 - evapcan(i,j)) * dtsfc drip = 0.0 excess = wetcanp(i,j) + trhsct IF (excess > 0.5E-3) drip = excess - 0.5E-3 !-------------------------------------------------------------------------- ! Compute total precip seeping into the ground. !-------------------------------------------------------------------------- precipdrip(i,j) = (1.0 - veg(i,j)) * precip1(i,j)*1000.0 + drip/dtsfc !-------------------------------------------------------------------------- ! Compute fraction of soil moisture that is ice !-------------------------------------------------------------------------- DO k = 1,nzsoil qice(i,j,k) = qsoil(i,j,k) - xqsoil(i,j,k) END DO END DO END DO RETURN END SUBROUTINE leflx ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE SNOPHY ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE snophy(nx,ny,nzsoil,tsoil,tair,potair,precip,evappot, & 1 snowdpth,sneqv,sndens,snowng,snofac,fftem,rrtem, & ktsoiltop,gflx,psfc,precip1,qvair,cdha,rhoa,flx2,beta) !----------------------------------------------------------------------- ! ! PURPOSE: To calculate snow processes at the land surface. ! !------------------------------------------------------------------------- !----------------------------------------------------------------------- ! ! AUTHOR: Jerry Brotzge ! 12/19/02 ! ! Code obtained from the ETA model, courtesy of NCEP. ! ! 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) ! sneqv Snow water equivalent (m) ! sndens Snow density ! snowdpth Snow depth (m) ! tsoil Soil temperature; tsoil(1) = tskin ! ! OUTPUT: ! ! snowdpth Snow depth (m) ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nzsoil INTEGER :: snowng(nx,ny) REAL :: sneqv (nx,ny) REAL :: sndens (nx,ny) REAL :: snowdpth (nx,ny) REAL :: snofac (nx,ny) REAL :: tsoil (nx,ny,nzsoil) REAL :: ktsoiltop(nx,ny) REAL :: fftem (nx,ny) REAL :: rrtem (nx,ny) REAL :: tair (nx,ny) REAL :: potair (nx,ny) REAL :: gflx (nx,ny) REAL :: psfc (nx,ny) REAL :: evappot (nx,ny) REAL :: precip (nx,ny) ! [m s-1] REAL :: precip1 (nx,ny) ! [m s-1] REAL :: qvair (nx,ny) REAL :: cdha (nx,ny) REAL :: rhoa (nx,ny) REAL :: etp1 (nx,ny) REAL :: etp2 (nx,ny) REAL :: flx2 (nx,ny) REAL :: beta (nx,ny) ! !----------------------------------------------------------------------- ! Include file: phycst.inc !----------------------------------------------------------------------- ! INCLUDE 'grid.inc' INCLUDE 'globcst.inc' INCLUDE 'phycst.inc' ! !----------------------------------------------------------------------- ! ! Local variables: ! !----------------------------------------------------------------------- ! ! INTEGER :: i, j REAL :: rch, flx1, flx3, depthtotal REAL :: denom, t12a, t12b, t12, snomeltrt, snomeltamt REAL :: seh, temd, dew REAL :: etp3, qsat, rsnow, albedo ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! DO j = 1, ny-1 DO i = 1, nx-1 rch = rhoa(i,j) * cp * cdha(i,j) !----------------------------------------------------------------- ! Convert ETP from (kg m-2 s-1) to (m/s) and then to (m) ! This is for snow-free surfaces. !----------------------------------------------------------------- IF (sneqv(i,j) == 0.0) THEN ! No snow cover etp1(i,j) = evappot(i,j) * 0.001 dew = 0.0 IF (etp1(i,j) < 0.0) THEN !Dew formation dew = -etp1(i,j) ! [m/s] etp1(i,j) = 0.0 precip1(i,j) = precip1(i,j) + dew ! [m/s] END IF !----------------------------------------------------------------- ! Convert ETP from (kg m-2 s-1) to (m/s) and then to (m) ! This is then the "Effective snowpack reduction amount", etp2 (m) !---------------------------------------------------------------- ELSE ! Snow cover etp2(i,j) = evappot(i,j) * dtsfc * 0.001 beta(i,j) = 1.0 IF (sneqv(i,j) < etp2(i,j)) THEN beta(i,j) = sneqv(i,j) / etp2(i,j) END IF !-------------------------------------------------------------- ! Frost !-------------------------------------------------------------- dew = 0.0 IF (evappot(i,j) < 0.0) THEN dew = - evappot(i,j) * 0.001 END IF END IF ! Snow cover/No snow cover IF (sneqv(i,j) /= 0.0) THEN ! Snow cover only etp1(i,j) = 0.0 !No ET if snow cover !----------------------------------------------------------------- ! Include heat flux from falling precip !------------------------------------------------------------------ flx1 = 0.0 ! [W/m2] IF (snowng(i,j) /= 1) THEN ! IF (precip(i,j) > 0.0) flx1 = 4.218E3 * precip(i,j) * & ! 1000.0 * (tsoil(i,j,1) - tair(i,j)) ! [W/m2] IF (precip(i,j) > 0.0) flx1 = 4.218E3 * precip(i,j) * & (tsoil(i,j,1) - tair(i,j)) ! [W/m2] ELSE ! flx1 = 2.106E3 * precip(i,j)*1000.0 *(tsoil(i,j,1)-tair(i,j)) flx1 = 2.106E3 * precip(i,j) * (tsoil(i,j,1)-tair(i,j)) END IF depthtotal = snowdpth(i,j) + dzsoil ! [m] !--------------------------------------------------------------------- ! Calculate an "effective snow-ground sfc temp" !--------------------------------------------------------------------- denom = 1.0 + ktsoiltop(i,j) / (depthtotal*(rrtem(i,j)+1.0)*rch) t12a = ((fftem(i,j) - flx1 - flx2(i,j) - sbcst * (tair(i,j)**4.0))/ & rch + potair(i,j) - tair(i,j) - beta(i,j) * evappot(i,j) * & lathv / rch ) / (rrtem(i,j)+1.0) t12b = ktsoiltop(i,j) * tsoil(i,j,2) / (depthtotal * (rrtem(i,j) & +1.0) * rch) t12 = (tair(i,j) + t12a + t12b) / denom !---------------------------------------------------------------------------- ! If soil temp below freezing, then no snow melt; set skin temp to ! "effective temp", and set the effective precip to zero. !---------------------------------------------------------------------------- IF (t12 <= 273.15) THEN sneqv(i,j) = MAX(0.0, sneqv(i,j) - etp2(i,j)) snowdpth(i,j) = sneqv(i,j) / sndens(i,j) tsoil(i,j,1) = t12 ! Update soil heat flux using new skin temperature (tsfc) gflx(i,j) = ktsoiltop(i,j) * (tsoil(i,j,1) - tsoil(i,j,2)) / & depthtotal flx3 = 0.0 snomeltrt = 0.0 snomeltamt = 0.0 !------------------------------------------------------------------------- ! If soil temps above freezing, then snow melts !------------------------------------------------------------------------- ELSE tsoil(i,j,1) = 273.15 * snofac(i,j)+t12*(1.0-snofac(i,j)) qsat = (0.622*6.11E2) / (psfc(i,j)-0.378*6.11E2) evappot(i,j) = rch * (qsat - qvair(i,j)) * cpinv etp2(i,j) = evappot(i,j) * 0.001 * dtsfc beta(i,j) = 1.0 !------------------------------------------------------------------------- ! Sublimation !------------------------------------------------------------------------- IF (sneqv(i,j) <= etp2(i,j)) THEN !More evaporation than snow equiv beta(i,j) = sneqv(i,j) / etp2(i,j) sneqv(i,j) = 0.0 snowdpth(i,j) = 0.0 snomeltamt = 0.0 snomeltrt = 0.0 gflx(i,j) = ktsoiltop(i,j) * (tsoil(i,j,1)-tsoil(i,j,2))/ & depthtotal ELSE !More snow equiv than evaporation sneqv(i,j) = sneqv(i,j) - etp2(i,j) snowdpth(i,j) = sneqv(i,j) / sndens(i,j) etp3 = evappot(i,j) * 2.501E6 gflx(i,j) = ktsoiltop(i,j) * (tsoil(i,j,1)-tsoil(i,j,2))/ & depthtotal seh = rch * (tsoil(i,j,1) - potair(i,j)) flx3 = fftem(i,j)-flx1-flx2(i,j)-sbcst*(tsoil(i,j,1)**4.0) - & gflx(i,j) - seh - etp3 IF (flx3 <= 0.0) flx3 = 0.0 snomeltrt = flx3 * 0.001 / 3.335E5 IF (snofac(i,j) > 0.05) snomeltrt = snomeltrt * snofac(i,j) snomeltamt = snomeltrt * dtsfc END IF !---------------------------------------------------------------------- ! If snow melt amount is less than the snow equivalent !----------------------------------------------------------------------- temd = sneqv(i,j) - 1.0E-6 IF (snomeltamt < temd) THEN sneqv(i,j) = sneqv(i,j) - snomeltamt snowdpth(i,j) = sneqv(i,j) / sndens(i,j) ELSE snomeltrt = sneqv(i,j) / dtsfc ! [m/s] snomeltamt = sneqv(i,j) ! [m] sneqv(i,j) = 0.0 snowdpth(i,j) = 0.0 flx3 = snomeltrt * 1000.0 * 3.335E5 END IF ! precip1(i,j) = precip1(i,j)/1000.0 + snomeltamt precip1(i,j) = precip1(i,j) + snomeltrt ! [m/s] END IF ! soil temps <> freezing END IF ! presence of snow cover END DO END DO RETURN END SUBROUTINE snophy ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE SNOCOM ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE snocom(nx, ny, nzsoil, snowdpth, sneqv, sndens, sncond, tsoil) 1 !----------------------------------------------------------------------- ! ! PURPOSE: To calculate snow compaction and its effects. ! !------------------------------------------------------------------------- !----------------------------------------------------------------------- ! ! AUTHOR: Jerry Brotzge ! 12/19/02 ! ! Code adapted from the ETA model, courtesy of NCEP, ! ! 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) ! sneqv Snow water equivalent (m) ! sndens Snow density ! snowdpth Snow depth (m) ! sncond Snow conductivity ! tsoil Soil temperature; tsoil(1) = tskin ! ! OUTPUT: ! ! snowdpth Snow depth (m) ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nzsoil REAL :: sneqv (nx,ny) REAL :: sndens (nx,ny) REAL :: snowdpth (nx,ny) REAL :: sncond (nx,ny) REAL :: tsoil (nx,ny,nzsoil) ! !----------------------------------------------------------------------- ! Include file: phycst.inc !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' ! !----------------------------------------------------------------------- ! ! Local variables: ! !----------------------------------------------------------------------- ! ! INTEGER :: i, j, l REAL :: tsoilx, tsnowx, snowdpthx, wx, wxx REAL :: tavgtemp, btemp, pexp, dw, dex, dsx ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! DO j = 1, ny-1 DO i = 1, nx-1 IF (sneqv(i,j) > 0.0) THEN !Snow cover tsnowx = tsoil(i,j,1) - 273.15 tsoilx = tsoil(i,j,2) - 273.15 snowdpthx = snowdpth(i,j) * 100.0 tavgtemp = 0.5 * (tsnowx + tsoilx) wx = 100.0 * sneqv(i,j) wxx = 1.0E-2 IF (wx > wxx) wxx = wx btemp = (dtsfc/3600.0) * 0.01 * EXP(0.08*tavgtemp - & 21.0 * sndens(i,j)) pexp = 0.0 DO l=4,1,-1 pexp = (1.0 + pexp)*btemp*wxx/real(l+1) END DO pexp = pexp + 1.0 dsx = sndens(i,j) * pexp IF (dsx > 0.40) dsx = 0.40 IF (dsx < 0.05) dsx = 0.05 sndens(i,j) = dsx IF (tsnowx >= 0.0) THEN dw = 0.13 * dtsfc/3600.0/24.0 sndens(i,j) = sndens(i,j) * (1.0 - dw) + dw IF (sndens(i,j) > 0.40) sndens(i,j) = 0.40 END IF snowdpthx = sneqv(i,j) * 100.0 / sndens(i,j) snowdpth(i,j) = snowdpthx * 0.01 ELSE !No snow cover sneqv(i,j) = 0.0 snowdpth(i,j) = 0.0 sndens(i,j) = 0.0 sncond(i,j) = 1.0 END IF END DO END DO RETURN END SUBROUTINE snocom ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE SNKSRC ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE snksrc(nx, ny, nzsoil, tsoil, qsoil, xqsoil, ktsoiltop, & 1 gflx, zpsoil, sink, soiltyp, tem1soil, tem2soil, & tem3soil, tem4soil, tsdiffus, j3soilinv, cisoil) !----------------------------------------------------------------------- ! ! PURPOSE: To calculate the source and sink terms for the thermal diffusion ! equation due to freezing and thawing of the soil. ! !------------------------------------------------------------------------- !----------------------------------------------------------------------- ! ! AUTHOR: Jerry Brotzge ! 01/08/03 ! ! Code adapted from the ETA model, courtesy of NCEP, ! ! 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) ! sneqv Snow water equivalent (m) ! sndens Snow density ! snowdpth Snow depth (m) ! sncond Snow conductivity ! tsoil Soil temperature; tsoil(1) = tskin ! ! OUTPUT: ! ! snowdpth Snow depth (m) ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nzsoil INTEGER :: soiltyp(nx,ny) REAL :: sneqv (nx,ny) REAL :: sndens (nx,ny) REAL :: snowdpth (nx,ny) REAL :: sncond (nx,ny) REAL :: ktsoiltop(nx,ny) REAL :: gflx (nx,ny) REAL :: tsoil (nx,ny,nzsoil) REAL :: qsoil (nx,ny,nzsoil) REAL :: xqsoil (nx,ny,nzsoil) REAL :: zpsoil (nx,ny,nzsoil) REAL :: sink (nx,ny,nzsoil) REAL :: dza (nzsoil) REAL :: dzh (nzsoil) REAL :: tem1soil (nx,ny,nzsoil) REAL :: tem2soil (nx,ny,nzsoil) REAL :: tem3soil (nx,ny,nzsoil) REAL :: tem4soil (nx,ny,nzsoil) REAL :: tsdiffus (nx,ny,nzsoil) REAL :: j3soilinv(nx,ny,nzsoil) REAL :: cisoil (nx,ny,nzsoil) ! !----------------------------------------------------------------------- ! Include files !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'soilcst.inc' INCLUDE 'grid.inc' INCLUDE 'phycst.inc' ! !----------------------------------------------------------------------- ! ! Local variables: ! !----------------------------------------------------------------------- ! ! INTEGER :: i, j, k INTEGER :: nlog, kcount REAL :: dtsdz, qtotal, xh2o REAL :: tup, tdn, tm REAL :: xup, xdn, xtemp, tavg REAL :: fk, df, denom, frh2o, swl, swlk REAL :: bx, dswl, error, ck, sice REAL :: tempcoefa, tempcoefb REAL :: tempcoefx1, tempcoefx2 ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! error = 0.005 ck = 8.0 DO j = 1, ny-1 DO i = 1, nx-1 DO k = 2,nzsoil dza(k) = zpsoil(i,j,k-1) - zpsoil(i,j,k) dzh(k) = 0.5 * dza(k) END DO END DO END DO !------------------------------------------------------------------------ ! Estimate Soil Temperature !----------------------------------------------------------------------- ! ! C * dT/dt = d/dz (K * dT/dz) ! !----------------------------------------------------------------------- ! ! Calculate coefficients of the tridigonal equation for soil temperature ! !----------------------------------------------------------------------- ! DO k=2,nzsoil-1 DO j=1,ny-1 DO i=1,nx-1 tempcoefa = cnbeta * dtsfc * 0.5 * dzsoilinv2 * j3soilinv(i,j,k) tempcoefb = (1.0 - cnbeta) * dtsfc * 0.5 * dzsoilinv2 * j3soilinv(i,j,k) tempcoefx1 = (tsdiffus(i,j,k-1) * j3soilinv(i,j,k-1)) + & (tsdiffus(i,j,k ) * j3soilinv(i,j,k )) tempcoefx2 = (tsdiffus(i,j,k ) * j3soilinv(i,j,k )) + & (tsdiffus(i,j,k+1) * j3soilinv(i,j,k+1)) tem1soil(i,j,k) = -tempcoefa * tempcoefx1 tem2soil(i,j,k) = 1.0 + tempcoefa * (tempcoefx1 + tempcoefx2) tem3soil(i,j,k) = -tempcoefa * tempcoefx2 tem4soil(i,j,k) = tempcoefb * tempcoefx1 * tsoil(i,j,k-1) + & (1.0-tempcoefb*(tempcoefx1 + tempcoefx2))*tsoil(i,j,k) & + tempcoefb * tempcoefx2 *tsoil(i,j,k+1) denom = (zpsoil(i,j,k-1)-zpsoil(i,j,k)) * cisoil(i,j,k) qtotal = -1.0 * denom * tem4soil(i,j,k) sice = qsoil(i,j,k) - xqsoil(i,j,k) IF ( (sice > 0.0).OR.(tsoil(i,j,1) < 273.15) .OR. & (tsoil(i,j,2)<273.15).OR.(tsoil(i,j,nzsoil)<273.15) ) THEN !--------------------------------------------------------------------- ! Compute sink/source term for freezing and thawing !--------------------------------------------------------------------- !---------------------------------------------------------------------- ! Calculate potential reduction of liquid water content !---------------------------------------------------------------------- xh2o = xqsoil(i,j,k) + (qtotal * dtsfc)/(3335.0E5*dza(k)) !----------------------------------------------------------------------- ! Estimate unfrozen water at an avg temperature !----------------------------------------------------------------------- tup = tsoil(i,j,k-1) tdn = tsoil(i,j,k-1) tm = 0.5 * (tup + tdn) IF (tup < 273.15) THEN IF (tm < 273.15) THEN IF (tdn < 273.15) THEN tavg = (tup + 2.0 * tm + tdn) * 0.25 ELSE !Tup,Tm < 0; Td > 0 xtemp = (273.15 - tm) * dzh(k) / (tdn - tm) tavg = 0.5 * (tup * dzh(k) + tm * (dzh(k) + xtemp) & + 273.15 * (2.0*dzh(k) - xtemp)) / dza(k) END IF ELSE IF (tdn < 273.15) THEN ! Tup<0, Td <0; Tm >0 xup = (273.15 - tup) * dzh(k) / (tm - tup) xdn = dzh(k) - (273.15-tm) * dzh(k) / (tdn - tm) tavg = 0.5 * (tup*xup + 273.15 * & (2.0*dza(k) - xup -xdn)) / dza(k) ELSE xup = (273.15 - tup) * dzh(k) / (tm - tup) tavg = 0.5 * (tup * xup + 273.15* (2.0* & dza(k) - xup)) / dza(k) END IF END IF ELSE IF (tm < 273.15) THEN IF (tdn < 273.15) THEN !Tup>0; Tm,Tdn < 0 xup = dzh(k) - (273.15 - tup) * dzh(k) / & (tm - tup) tavg = 0.5 * (273.15 * (dza(k)-xup) + & tm * (dzh(k) + xup) + tdn*dzh(k)) / dza(k) ELSE xup = dzh(k) - (273.15- tup) * dzh(k) / (tm - tup) xdn = (273.15 - tm) * dzh(k) / (tdn - tm) tavg = 0.5 * (273.15*(2.*dza(k) - xup -xdn)+ & tm * (xup + xdn)) / dza(k) ENDIF ELSE IF (tdn < 273.15) THEN xdn = dzh(k) - (273.15 - tm) * dzh(k) / (tdn - tm) tavg = (273.15 * (dza(k) - xdn) + 0.5*(273.15 & + tdn)*xdn) / dza(k) ELSE tavg = (tup + 2.0*tm + tdn) * 0.25 ENDIF ENDIF ENDIF !----------------------------------------------------------------------- ! Compute amount of supercooled liquid water content !----------------------------------------------------------------------- bx = bslope(soiltyp(i,j)) IF (bslope(soiltyp(i,j)) > 5.5) bx = 5.5 nlog = 0 kcount = 0 IF (tavg > (273.15-1.0E-3)) THEN frh2o = qsoil(i,j,k) ELSE !----------------------------------------------------------------------- ! Option #1: Iterated solution, ck /= 0 ! See Koren et al., JGR 1999; Eqtn #17 !----------------------------------------------------------------------- IF (ck /= 0.0) THEN swl = qsoil(i,j,k) - xqsoil(i,j,k) IF (swl > (qsoil(i,j,k)-0.02)) swl = qsoil(i,j,k)-0.02 IF (swl < 0.0) swl = 0.0 DO IF (.NOT. ((nlog < 10).AND.(kcount == 0))) EXIT nlog = nlog + 1 df = ALOG( (psisat(soiltyp(i,j))*9.81/3.335E5) * & ( (1.0+ck*swl)**2.0) * & (wsat(soiltyp(i,j))/(qsoil(i,j,k)-swl))**bx) & - ALOG( -(tavg - 273.15)/tavg) denom = 2.0 * ck / (1.0+ck*swl) + bx / (qsoil(i,j,k)-swl) swlk = swl - df/denom IF (swlk > (qsoil(i,j,k)-0.02)) swlk = qsoil(i,j,k)-0.02 IF (swlk < 0.0) swlk = 0.0 dswl = ABS(swlk - swl) swl = swlk ! If more than 10 iterations required, then the explicit soltn used. IF (dswl <= error) kcount = kcount+1 END DO frh2o = qsoil(i,j,k) - swl END IF !-------------------------------------------------------------------------- ! Option #2: Explicit solution for Flerchinger Eqtn., ck = 0 ! See Koren et al., JGR 1999; Eqtn #17 !-------------------------------------------------------------------------- IF (kcount == 0) THEN fk = (((3.335E5 / (9.81 * (-psisat(soiltyp(i,j))))) * & ((tavg - 273.15)/tavg)) & **(-1.0/bx)) * wsat(soiltyp(i,j)) IF (fk < 0.02) fk = 0.02 frh2o = MIN(fk, qsoil(i,j,k)) END IF !--------------------------------------------------------------------------- END IF !End of computing amount of supercooled liquid water !--------------------------------------------------------------------------- IF ( (xh2o < xqsoil(i,j,k)) .AND. (xh2o < frh2o)) THEN IF (frh2o > xqsoil(i,j,k)) THEN xh2o = xqsoil(i,j,k) ELSE xh2o = frh2o END IF END IF IF ( (xh2o > xqsoil(i,j,k)) .AND. (xh2o > frh2o)) THEN IF (frh2o < xqsoil(i,j,k)) THEN xh2o = xqsoil(i,j,k) ELSE xh2o = frh2o END IF END IF IF (xh2o < 0.0) xh2o = 0.0 IF (xh2o > qsoil(i,j,k)) xh2o = qsoil(i,j,k) sink(i,j,k) = -1000.0 * 3.335E5 * dza(k) * (xh2o - xqsoil(i,j,k)) / & dtsfc xqsoil(i,j,k) = xh2o !------------------------------------------------------------------------------ ! tem4soil(i,j,k) = (tempcoefb * tempcoefx1 * tsoil(i,j,k-1) + & ! (1.0-tempcoefb*(tempcoefx1 + tempcoefx2))*tsoil(i,j,k) & ! + tempcoefb * tempcoefx2 *tsoil(i,j,k+1) ) tem4soil(i,j,k) = (tempcoefb * tempcoefx1 * tsoil(i,j,k-1) + & (1.0-tempcoefb*(tempcoefx1 + tempcoefx2))*tsoil(i,j,k) & + tempcoefb * tempcoefx2 *tsoil(i,j,k+1) ) + & (sink(i,j,k)*dzsoilinv/cisoil(i,j,k)) !---------------------------------------------------------------------- END IF END DO END DO END DO RETURN END SUBROUTINE snksrc