MODULE module_sf_pxlsm 2 USE module_model_constants USE module_sf_pxlsm_data INTEGER, PARAMETER :: NSOLD=20 REAL, PARAMETER :: RD = 287.04, CPD = 1004.67, & CPH2O = 4.218E+3, CPICE = 2.106E+3, & LSUBF = 3.335E+5, SIGMA = 5.67E-8, & ROVCP = RD / CPD REAL, PARAMETER :: CRANKP = 0.5 ! CRANK-NIC PARAMETER REAL, PARAMETER :: RIC = 0.25 ! critical Richardson number REAL, PARAMETER :: DENW = 1000.0 ! water density in KG/M3 REAL, PARAMETER :: TAUINV = 1.0 / 86400.0 ! 1/1DAY(SEC) REAL, PARAMETER :: T2TFAC = 1.0 / 10.0 ! Bottom soil temp response factor REAL, PARAMETER :: PI = 3.1415926 REAL, PARAMETER :: PR0 = 0.95 REAL, PARAMETER :: CZO = 0.032 REAL, PARAMETER :: OZO = 1.E-4 CONTAINS ! !------------------------------------------------------------------------- !------------------------------------------------------------------------- SUBROUTINE pxlsm(U3D, V3D, DZ8W, QV3D,T3D,TH3D, RHO, & 1,10 PSFC, GSW, GLW, RAINBL, EMISS, & ITIMESTEP,CURR_SECS, NSOIL, DT, ANAL_INTERVAL, & XLAND, XICE, ALBBCK, ALBEDO, SNOALB, & SMOIS, TSLB, MAVAIL, TA2, QA2, & ZS,DZS, PSIH, & LANDUSEF,SOILCTOP,SOILCBOT,VEGFRA,VEGF_PX, & ISLTYP,RA,RS,LAI,NLCAT,NSCAT, & HFX,QFX,LH,TSK,SST,ZNT,CANWAT, & GRDFLX,SHDMIN,SHDMAX, & SNOWC,PBLH,RMOL,UST,CAPG,DTBL, & T2_NDG_OLD, T2_NDG_NEW, & Q2_NDG_OLD, Q2_NDG_NEW, & SN_NDG_OLD, SN_NDG_NEW, SNOW, SNOWH,SNOWNCV,& T2OBS, Q2OBS, PXLSM_SMOIS_INIT, & PXLSM_SOIL_NUDGE, & ids,ide, jds,jde, kds,kde, & ims,ime, jms,jme, kms,kme, & its,ite, jts,jte, kts,kte ) !------------------------------------------------------------------------- ! THIS MODULE CONTAINS THE PLEIM-XIU LAND-SURFACE MODEL (PX-LSM). ! IT IS DESIGNED TO SIMULATE CHARACTERISTICS OF THE LAND SURFACE AND ! VEGETATION AND EXCHANGE WITH THE PLANETARY BOUNDARY LAYER (PBL). THE ! SOIL MOISTURE MODEL IS BASED ON THE ISBA SCHEME DEVELOPED BY NOILHAN ! AND PLANTON (1989) AND JACQUEMIN AND NOILHAN (1990) AND INCLUDES ! PROGNOSTIC EQUATIONS FOR SOIL MOISTURE AND SOIL TEMPERATURE IN TWO ! LAYERS (1 CM AND 1 M) AS WELL AS CANOPY WATER CONTENT. SURFACE ! MOISTURE FLUXES ARE MODELED BY 3 PATHWAYS: SOIL EVAPORATION, CANOPY ! EVAPORATION, AND VEGETATIVE EVAPOTRANSPIRRATION. ! EVAPOTRANSPIRATION DIRECTLY FROM THE ROOT ZONE SOIL LAYER IS MODELED ! VIA A CANOPY RESISTANCE ANALOG ALGORITHM WHERE STOMATAL CONDUCTANCE ! IS CONTROLLED BY SOLAR RADIATION, AIR TEMPERATURE, AIR HUMIDITY, AND ! ROOT ZONE SOIL MOISTURE. REQUIRED VEGETATION CHARACTERISTICS DERIVED ! FROM THE USGS LANDUSE DATA INCLUDE: LEAF AREA INDEX, FRACTIONAL VEGETATION ! COVERAGE, ROUGHNESS LENGTH, AND MINIMUM STOMATAL RESISTANCE. AN INDIRECT ! NUDGING SCHEME ADJUSTS SOIL MOISTURE ACCORDING TO DIFFERENCES BETWEEN ! MODELED TEMPERATURE AND HUMIDITY AND ANALYSED SURFACE FIELDS. ! ! References: ! Pleim and Xiu, 1995: Development and testing of a surface flux and planetary ! boundary layer model for application in mesoscale models. ! J. Appl. Meteoro., Vol. 34, 16-32. ! Xiu and Pleim, 2001: Development of a land surface model. Part I: Application ! in a mesoscale meteorological model. J. Appl. Meteoro., ! Vol. 40, 192-209. ! Pleim and Xiu, 2003: Development of a land surface model. Part II: Data ! assimilation. J. Appl. Meteoro., Vol. 42, 1811-1822. ! ! Pleim and Gilliam, 2009: An Indirect Data Assimilation Scheme for Deep Soil Temperature in the ! Pleim–Xiu Land Surface Model. J. Appl. Meteor. Climatol., 48, 1362–1376. ! ! Gilliam and Pleim, 2010: Performance assessment of new land-surface and planetary boundary layer ! physics in the WRF-ARW. Journal of Applied Meteorology and Climatology, 49, 760-774. ! REVISION HISTORY: ! AX 4/2005 - developed the initial WRF version based on the MM5 PX LSM ! RG 2/2008 - Completed testing of the intial working version of PX LSM, released in WRFV3.0 early 2008 ! DW 8/2011 - Landuse specific versions of PX (USGS/NLCD/MODIS) were unified into a single code with ! landuse characteristics defined in module_sf_pxsfclay.F. ! RG 12/2011 - Basic code clean, removed commented out debug statements, lined up columns, etc. ! RG 01/2012 - Removed FIRSTIME Logic that computes PX Landuse characteristics at first time step only. This resulted ! in different solutions when OpenMP was used and would not work with moving domains. ! RG 08/2012 - Added CURR_SECS variable in argument list as replacement for PX internal CURRTIME internally comp var. ! This is neccessary for PX to correctly interpolate analyses for soil nudging. In this same calculation ! logic was added for cases where user does not specify the analysis interval, or no analysis interval is ! relevant as in the no PX soil nudging via namelist (pxlsm_soil_nudge = 0). Prior to this fix the default ! analysis interval was zero, so if not speficied a divide by zero was the result. Also, changes were made to ! ensure PX LSM will work with not only MODIS and USGS, but also both the 40 and 50 class NLCD-MODIS data. ! Also, coupled module_sf_pxlsm_data.F was updated so landuse characteristics across datasets are more ! consistent. Albedo for NLCD two grassland categories were lowered from 23 and 25 to 18 and 19. ! For the NLCD40 and NLCD50 roughness and leaf area were made consistent between the US NLCD and ! outside US MODIS datasets. Prior, US boundaries created boundaries of roughness and LAI. ! ! !-------------------------------------------------------------------------------------------------------------- !-------------------------------------------------------------------------------------------------------------- ! ARGUMENT LIST: ! !... Inputs: !-- U3D 3D u-velocity interpolated to theta points (m/s) !-- V3D 3D v-velocity interpolated to theta points (m/s) !-- DZ8W dz between full levels (m) !-- QV3D 3D mixing ratio !-- T3D Temperature (K) !-- TH3D Theta (K) !-- RHO 3D dry air density (kg/m^3) !-- PSFC surface pressure (Pa) !-- GSW downward short wave flux at ground surface (W/m^2) !-- GLW downward long wave flux at ground surface (W/m^2) !-- RAINBL Timestep rainfall !-- EMISS surface emissivity (between 0 and 1) !-- ITIMESTEP time step number !-- NSOIL number of soil layers !-- DT time step (second) !-- CURR_SECS time on model domain in seconds, universal WRF variable !-- ANAL_INTERVAL Interval of analyses used for soil moisture and temperature nudging !-- XLAND land mask (1 for land, 2 for water) !-- XICE Sea ice !-- ALBBCK Background Albedo !-- ALBEDO surface albedo with snow cover effects !-- SNOALB Albedo of snow !-- SMOIS total soil moisture content (volumetric fraction) !-- TSLB soil temp (k) !-- MAVAIL Moisture availibility of soil !-- TA2 2-m temperature !-- QA2 2-m mixing ratio !-- SVPT0 constant for saturation vapor pressure (K) !-- SVP1 constant for saturation vapor pressure (kPa) !-- SVP2 constant for saturation vapor pressure (dimensionless) !-- SVP3 constant for saturation vapor pressure (K) !-- ZS depths of centers of soil layers !-- DZS thicknesses of soil layers !-- PSIH similarity stability function for heat !-- LANDUSEF Landuse fraction !-- SOILCTOP Top soil fraction !-- SOILCBOT Bottom soil fraction !-- VEGFRA Vegetation fraction !-- VEGF_PX Veg fraction recomputed and used by PX LSM !-- ISLTYP Soil type !-- RA Aerodynamic resistence !-- RS Stomatal resistence !-- LAI Leaf area index (weighted according to fractional landuse) !-- NLCAT Number of landuse categories !-- NSCAT Number of soil categories !-- HFX net upward heat flux at the surface (W/m^2) !-- QFX net upward moisture flux at the surface (kg/m^2/s) !-- LH net upward latent heat flux at surface (W/m^2) !-- TSK surface skin temperature (K) !-- SST sea surface temperature !-- ZNT rougness length !-- CANWAT Canopy water (mm) !-- GRDFLX Ground heat flux !-- SFCEVP Evaportation from surface !-- SHDMIN Minimum annual vegetation fraction for each grid cell !-- SHDMAX Maximum annual vegetation fraction for each grid cell !-- SNOWC flag indicating snow coverage (1 for snow cover) !-- PBLH PBL height (m) !-- RMOL 1/L Reciprocal of Monin-Obukhov length !-- UST u* in similarity theory (m/s) !-- CAPG heat capacity for soil (J/K/m^3) !-- DTBL time step of boundary layer calls !-- T2_NDG_OLD Analysis temperature prior to current time !-- T2_NDG_NEW Analysis temperature ahead of current time !-- Q2_NDG_OLD Analysis mixing ratio prior to current time !-- Q2_NDG_NEW Analysis mixing ratio ahead of current time !-- SN_NDG_OLD Analysis snow water prior to current time !-- SN_NDG_NEW Analysis snow water ahead of current time !-- SNOW Snow water equivalent !-- SNOWH Physical snow depth !-- SNOWNCV Time step accumulated snow !-- T2OBS Analysis temperature interpolated from prior and next in time analysese !-- Q2OBS Analysis moisture interpolated from prior and next in time analysese !-- PXLSM_SMOIS_INIT Flag to intialize deep soil moisture to a value derived from moisture availiability. !-- PXLSM_SOIL_NUDGE Flag to use soil moisture and temperature nudging in the PX LSM ! This is typically done for the first simulation. !-- ids start index for i in domain !-- ide end index for i in domain !-- jds start index for j in domain !-- jde end index for j in domain !-- kds start index for k in domain !-- kde end index for k in domain !-- ims start index for i in memory !-- ime end index for i in memory !-- jms start index for j in memory !-- jme end index for j in memory !-- kms start index for k in memory !-- kme end index for k in memory !-- jts start index for j in tile !-- jte end index for j in tile !-- kts start index for k in tile !-- kte end index for k in tile !... Outputs: IMPLICIT NONE !.......Arguments ! DECLARATIONS - INTEGER INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde, & ims,ime, jms,jme, kms,kme, & its,ite, jts,jte, kts,kte INTEGER, INTENT(IN) :: NSOIL, ITIMESTEP, NLCAT, NSCAT, & ANAL_INTERVAL, PXLSM_SMOIS_INIT, PXLSM_SOIL_NUDGE REAL, INTENT(IN ),OPTIONAL :: curr_secs REAL, INTENT(IN ) :: DT,DTBL INTEGER, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ISLTYP ! DECLARATIONS - REAL REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN) :: U3D, V3D, RHO, & T3D, TH3D, DZ8W, QV3D REAL, DIMENSION(1:NSOIL), INTENT(IN)::ZS,DZS REAL, DIMENSION( ims:ime , 1:NSOIL, jms:jme ), INTENT(INOUT) :: SMOIS, TSLB REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT):: RA, RS, LAI, ZNT REAL, DIMENSION( ims:ime , jms:jme ), INTENT(OUT):: GRDFLX, TSK, TA2, QA2 REAL, DIMENSION( ims:ime , 1:NLCAT, jms:jme ), INTENT(IN):: LANDUSEF REAL, DIMENSION( ims:ime , 1:NSCAT, jms:jme ), INTENT(IN):: SOILCTOP, SOILCBOT REAL, DIMENSION( ims:ime, jms:jme ), & INTENT(IN) :: PSFC, GSW, GLW, RAINBL, & EMISS, SNOALB, & ALBBCK, SHDMIN, SHDMAX, & PBLH, RMOL, SNOWNCV, & UST, MAVAIL, SST REAL, DIMENSION( ims:ime, jms:jme ), & INTENT(IN) :: T2_NDG_OLD, T2_NDG_NEW, & Q2_NDG_OLD, Q2_NDG_NEW, & SN_NDG_OLD, SN_NDG_NEW REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: T2OBS, Q2OBS REAL, DIMENSION( ims:ime, jms:jme ), & INTENT(INOUT) :: CAPG,CANWAT, QFX, HFX, LH, & PSIH,VEGFRA, VEGF_PX, SNOW, & SNOWH, SNOWC, ALBEDO, XLAND, XICE LOGICAL :: radiation !------------------------------------------------------------------------- ! ---------- Local Variables -------------------------------- !---- PARAMETERS INTEGER, PARAMETER :: NSTPS = 11 ! max. soil types REAL, PARAMETER :: DTPBLX = 40.0 ! Max PX timestep = 40 sec !---- INTEGERS INTEGER, DIMENSION( 1: NSTPS ) :: JP INTEGER:: J, I, NS, NUDGE, ISTI, WEIGHT INTEGER:: NTSPS, IT !---- REALS REAL, DIMENSION( ims:ime, jms:jme ) :: XLAI, XLAIMN, RSTMIN, & XVEG, XVEGMN, XSNUP, & XALB REAL, DIMENSION( ims:ime, jms:jme ) :: RADNET, EG, ER, ETR, QST REAL:: SFCPRS,TA1,DENS1,QV1,ZLVL,SOLDN,LWDN, & EMISSI,PRECIP,THETA1,VAPPRS,QSBT, & WG,W2,WR,TG,T2,USTAR,MOLX,Z0, & RAIR,CPAIR,IFLAND,ISNOW, & ES,QSS,BETAP, & RH2_OLD, RH2_NEW, T2_OLD, T2_NEW, & CORE, CORB, TIME_BETWEEN_ANALYSIS, & G1000, ALN10,RH2OBS, HU, SNOBS, & FWSAT,FWFC,FWWLT,FB,FCGSAT,FJP,FAS, & FSEAS, T2I, HC_SNOW, SNOW_FRA,SNOWALB, & QST12,ZFUNC,ZF1,ZA2,QV2, DT_FDDA, & FC2R,FC1SAT, DTPBL CHARACTER (LEN = 6) :: LAND_USE_TYPE !------------------------------------------------------------------------- !-------------------------------Executable starts here-------------------- ! ALN10 = ALOG(10.0) G1000 = g*1.0E-3 ! G/1000 WEIGHT = 0 ! Determine Landuse Dataset by the number of categories IF (NLCAT == 50) THEN LAND_USE_TYPE = 'NLCD50' ELSE IF (NLCAT == 40) THEN LAND_USE_TYPE = 'NLCD40' ELSE IF (NLCAT == 20) THEN LAND_USE_TYPE = 'MODIS' ELSE IF (NLCAT == 24) THEN LAND_USE_TYPE = 'USGS' ELSE call wrf_error_fatal("Error: Unknown Land Use Category") END IF IF (ITIMESTEP .EQ. 1) THEN CALL wrf_message( 'PX LSM will use the ' // TRIM(LAND_USE_TYPE) // ' landuse tables' ) PRINT *, 'The analysis interval for surface soil and temp nudging = ',ANAL_INTERVAL,'sec.' ENDIF !----------------------------------------------------------------------------------- ! Kill WRF if user specifies soil nudging but provides no analysis interval, then provide helpful message. IF (ANAL_INTERVAL .LE. 0.0 .AND. PXLSM_SOIL_NUDGE .EQ. 1) THEN CALL wrf_message('PX LSM Error: The User specified analysis interval is zero or negative.') CALL wrf_message('If the PX LSM is used with soil nudging (pxlsm_soil_nudge=1) a wrfsfdda_d0* file is required.') CALL wrf_message('Make sure these files are present and') CALL wrf_message('Check the namelist to ensure sgfdda_interval_m is set to proper sfc analysis interval') STOP ENDIF !----------------------------------------------------------------------------------- !--- Compute time relatve to old and new analysis time for timestep interpolation IF(PXLSM_SOIL_NUDGE .EQ. 1) THEN DT_FDDA = ANAL_INTERVAL * 1.0 ! Convert DT of Analysis to real TIME_BETWEEN_ANALYSIS = MOD(CURR_SECS,DT_FDDA) IF (TIME_BETWEEN_ANALYSIS .EQ. 0.0) THEN CORB = 1.0 CORE = 0.0 ELSE CORE = TIME_BETWEEN_ANALYSIS / DT_FDDA CORB = 1.0 - CORE ENDIF ENDIF !----------------------------------------------------------------------------------- ! Compute vegetation and land-use characteristics by land-use fraction weighting ! These parameters include LAI, VEGF, ZNT, ALBEDO, RS, etc. CALL VEGELAND(LANDUSEF, VEGFRA, SHDMIN, SHDMAX, & SOILCTOP, SOILCBOT, NLCAT, NSCAT, & ZNT,XLAI,XLAIMN,RSTMIN,XVEG,XVEGMN,XSNUP,& XLAND, XALB, & ids,ide, jds,jde, kds,kde, & ims,ime, jms,jme, kms,kme, & its,ite, jts,jte, kts,kte, LAND_USE_TYPE ) !----------------------------------------------------------------------------------- !----------------------------------------------------------------------------------- ! Main loop over individual grid cells DO J = jts,jte !-- J LOOP DO I = its,ite !-- I LOOP IFLAND = XLAND(I,J) ! Compute soil properties via weighting of fractional components IF (IFLAND .LT. 1.5 ) THEN !--------------------------------------------------------- CALL SOILPROP (SOILCBOT(I,:,J), WEIGHT, & ITIMESTEP, MAVAIL(I,J), & PXLSM_SMOIS_INIT, & FWSAT,FWFC,FWWLT,FB,FCGSAT, & FJP,FAS,FC2R,FC1SAT,ISTI,SMOIS(I,2,J) ) !---------------------------------------------------------- ISLTYP(I,J) = ISTI ELSE ISLTYP(I,J) = 14 ! STATSGO type for water ENDIF !-- Variables Sub. SURFPX needs SFCPRS = PSFC(i,j) / 1000.0 ! surface pressure in cb TA1 = T3D(i,1,j) ! air temperature at first layer DENS1 = RHO(I,1,J) ! air density at first layer QV1 = QV3D(i,1,j) ! water vapor mixing ratio at first layer QV2 = QV3D(i,2,j) ZLVL = 0.5 * DZ8W(i,1,j) ! thickness of lowest half level ZF1 = DZ8W(i,1,j) ZA2 = ZF1 + 0.5 * DZ8W(i,2,j) LWDN = GLW(I,J) ! longwave radiation EMISSI = EMISS(I,J) ! emissivity PRECIP = MAX ( 1.0E-3*RAINBL(i,j)/DTBL,0.0) ! accumulated precip. rate during DT (=dtpbl) ! convert RAINBL from mm to m for PXLSM WR = 1.0E-3*CANWAT(I,J) ! convert CANWAT from mm to m for PXLSM THETA1 = TH3D(i,1,j) ! potential temp at first layer SNOBS = SNOW(I,J) ! Set snow cover to existing model value ! this is overwritten below if snow analysis is availiable ! otherwise snow cover remains constant through simulation IF(PXLSM_SOIL_NUDGE .EQ. 1) THEN !-- 2 m Temp and RH for Nudging T2_OLD = T2_NDG_OLD(I,J) T2_NEW = T2_NDG_NEW(I,J) VAPPRS = SVP1 * EXP(SVP2 * (T2_OLD - SVPT0) / ( T2_OLD - SVP3)) QSBT = EP_2 * VAPPRS / (SFCPRS - VAPPRS) RH2_OLD = Q2_NDG_OLD(I,J) / QSBT VAPPRS = SVP1 * EXP(SVP2 * (T2_NEW - SVPT0) / (T2_NEW - SVP3)) QSBT = EP_2 * VAPPRS / (SFCPRS - VAPPRS) RH2_NEW = Q2_NDG_NEW(I,J) / QSBT RH2OBS = CORB * RH2_OLD + CORE * RH2_NEW T2OBS(I,J) = CORB * T2_OLD + CORE * T2_NEW Q2OBS(I,J) = CORB * Q2_NDG_OLD(I,J) + CORE * Q2_NDG_NEW(I,J) SNOBS = CORB * SN_NDG_OLD(I,J) + CORE * SN_NDG_NEW(I,J) ENDIF USTAR = MAX(UST(I,J),0.005) IF (IFLAND .GT. 1.5) THEN ! if over water ZNT(I,J) = CZO * UST(I,J) * UST(I,J) / G + OZO ENDIF Z0 = ZNT(I,J) CPAIR = CPD * (1.0 + 0.84 * QV1) ! J/(K KG) !------------------------------------------------------------- ! Compute fractional snow area and snow albedo CALL PXSNOW (ITIMESTEP, SNOBS, SNOWNCV(I,J), SNOW(I,J), & SNOWH(I,J), XSNUP(I,J), XALB(i,j), & SNOALB(I,J),VEGF_PX(I,J), SHDMIN(I,J), & HC_SNOW, SNOW_FRA, SNOWC(I,J), ALBEDO(I,J) ) !------------------------------------------------------------- !------------------------------------------------------------- ! Sea Ice from analysis and water cells that are very cold, but more than 50% water ! are converted to ice/snow for more reasonable treatment. IF( (XICE(I,J).GE.0.5) .OR. & (SST(I,J).LE.270.0.AND.XLAND(I,J).GT.1.50) ) THEN XLAND(I,J) = 1.0 IFLAND = 1.0 ZNT(I,J) = 0.001 ! Ice SMOIS(I,1,J) = 1.0 ! FWSAT SMOIS(I,2,J) = 1.0 ! FWSAT XICE(I,J) = 1.0 ALBEDO(I,J) = 0.7 SNOWC(I,J) = 1.0 SNOW_FRA = 1.0 VEGF_PX(I,J) = 0.0 LAI(I,J) = 0.0 ENDIF !------------------------------------------------------------- !------------------------------------------------------------- !-- Note that when IFGROW = 0 is selected in Vegeland then max and min !-- LAI and Veg are the same T2I = TSLB(I,2,J) ! FSEAS = AMAX1(1.0 - 0.0016 * (298.0 - T2I) ** 2,0.0) ! BATS FSEAS = AMAX1(1.0 - 0.015625 * (290.0 - T2I) ** 2,0.0) ! JP97 IF (T2I .GE. 290.0) FSEAS = 1.0 LAI(I,J) = XLAIMN(I,J) + FSEAS*(XLAI(I,J) - XLAIMN(I,J)) VEGF_PX(I,J) = XVEGMN(I,J) + FSEAS*(XVEG(I,J) - XVEGMN(I,J)) ! Ensure veg algorithms not used for water IF (IFLAND .GT. 1.5) THEN VEGF_PX(I,J) = 0.0 ENDIF !------------------------------------------------------------- SOLDN = GSW(I,J) / (1.0 - ALBEDO(I,J)) ! downward shortwave radiaton ISNOW = SNOWC(I,J) NUDGE=PXLSM_SOIL_NUDGE IF ( J .LE. 2 .OR. J .GE. (jde-1) ) NUDGE=0 IF ( I .LE. 2 .OR. I .GE. (ide-1) ) NUDGE=0 IF ( RMOL(I,J) .GT. 0.0 ) THEN MOLX = AMIN1(1/RMOL(I,J),1000.0) ELSE IF ( RMOL(I,J) .LT. 0.0 ) THEN MOLX = AMAX1(1/RMOL(I,J),-1000.0) ELSE MOLX = 1000 ENDIF ZFUNC = ZF1 * (1.0 - ZF1 / MAX(100.,PBLH(I,J))) ** 2 QST12 = KARMAN * ZFUNC*(QV2-QV1) / (ZA2-ZLVL) !--- LSM sub-time loop too prevent dt > 40 sec NTSPS = INT(DT / (DTPBLX + 0.000001) + 1.0) DTPBL = DT / NTSPS DO IT=1,NTSPS !... SATURATION VAPOR PRESSURE (MB) IF ( TSLB(I,1,J) .LE. SVPT0 ) THEN ! For ground that is below freezing ES = SVP1 * EXP(22.514 - 6.15E3 / TSLB(I,1,J)) ! cb ELSE ES = SVP1 * EXP(SVP2 * (TSLB(I,1,J) - SVPT0) / (TSLB(I,1,J) - SVP3)) ENDIF QSS = ES * 0.622 / (SFCPRS - ES) !... beta method, Lee & Pielke (JAM,May1992) BETAP = 1.0 IF (IFLAND .LT. 1.5 .AND. ISNOW .LT. 0.5 .AND. SMOIS(I,1,J) .LE. FWFC) THEN BETAP = 0.25 * (1.0 - COS(SMOIS(I,1,J) / FWFC * PI)) ** 2 ENDIF !------------------------------------------------------------------------- CALL SURFPX (DTPBL, IFLAND, SNOWC(I,J), NUDGE, XICE(I,J), & !in SOLDN, GSW(I,J), LWDN, EMISSI, ZLVL, & !in MOLX, Z0, USTAR, & !in SFCPRS, DENS1, QV1, QSS, TA1, & !in THETA1, PRECIP, & !in CPAIR, PSIH(I,J), & !in RH2OBS,T2OBS(I,J), & !in VEGF_PX(I,J), ISTI, LAI(I,J), BETAP, & !in RSTMIN(I,J), HC_SNOW, SNOW_FRA, & !in FWWLT, FWFC, FCGSAT, FWSAT, FB, & !in FC1SAT,FC2R,FAS,FJP,DZS(1),DZS(2),QST12, & !in RADNET(I,J), GRDFLX(I,J), HFX(I,J), QFX(I,J), LH(I,J), & !out EG(I,J), ER(I,J), ETR(I,J), & !out QST(I,J), CAPG(I,J), RS(I,J), RA(I,J), & !out TSLB(I,1,J), TSLB(I,2,J), & !out SMOIS(I,1,J), SMOIS(I,2,J), WR, TA2(I,J), QA2(I,J), & LAND_USE_TYPE ) !------------------------------------------------------------------------- END DO ! Time internal PX time loop TSK(I,J) = TSLB(I,1,J) ! Skin temp set to 1 cm soil temperature in PX for now CANWAT(I,J) = WR * 1000. ! convert WR back to mm for CANWAT ENDDO ! END MIAN I LOOP ENDDO ! END MAIN J LOOP !------------------------------------------------------ END SUBROUTINE pxlsm !------------------------------------------------------------------------- !------------------------------------------------------------------------- !------------------------------------------------------------------------- !------------------------------------------------------------------------- SUBROUTINE VEGELAND( landusef, vegfra, & 1 shdmin, shdmax, & soilctop, soilcbot, nlcat, nscat, & znt, xlai, xlaimn, rstmin, xveg, xvegmn, & xsnup, xland, xalb, & ids,ide, jds,jde, kds,kde, & ims,ime, jms,jme, kms,kme, & its,ite, jts,jte, kts,kte, & LAND_USE_TYPE ) !------------------------------------------------------------------------- ! ! CALLED FROM Sub. bl_init in module_physics.init.F ! ! THIS PROGRAM PROCESSES THE USGS LANDUSE DATA ! WHICH HAS BEEN GRIDDED BY THE WPS SYSTEM ! AND PRODUCES 2-D FIELDS OF LU RELATED PARAMETERS ! FOR USE IN THE PX SURFACE MODEL ! ! ! REVISION HISTORY: ! AX Oct 2004 - developed WRF version based on VEGELAND in the MM5 PX LSM ! RG Dec 2006 - revised for WRFV2.1.2 ! JP Dec 2007 - revised for WRFV3 - removed IFGROW options !------------------------------------------------------------------------- !------------------------------------------------------------------------- IMPLICIT NONE !... INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde, & ims,ime, jms,jme, kms,kme, & its,ite, jts,jte, kts,kte INTEGER , INTENT(IN) :: NSCAT, NLCAT REAL, DIMENSION( ims:ime , 1:NLCAT, jms:jme ), INTENT(IN) :: LANDUSEF REAL, DIMENSION( ims:ime , 1:NSCAT, jms:jme ), INTENT(IN) :: SOILCTOP, SOILCBOT REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: VEGFRA, SHDMIN, SHDMAX REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ZNT REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT) :: XLAI, XLAIMN, RSTMIN, XALB, & XVEG, XVEGMN, XSNUP, XLAND CHARACTER (LEN = 6), INTENT(IN) :: LAND_USE_TYPE !... local variables INTEGER :: itf, jtf, k, j, i REAL :: SUMLAI, SUMLMN, SUMRSI, SUMLZ0, SUMVEG, SUMVMN, ALAI, VEGF, SUMSNUP REAL :: VFMX, VFMN, VSEAS, FAREA, FWAT, ZNOTC, SUMALB REAL, DIMENSION( NLCAT ) :: LAIMX, LAIMN, Z0, VEG, VEGMN, SNUP REAL, PARAMETER :: ZNOTCMN = 5.0 ! CM, MIN Zo FOR CROPS REAL, PARAMETER :: ZNOTCMX = 15.0 ! CM, MAX Zo FOR CROPS REAL, SAVE, DIMENSION(:), POINTER :: RSMIN, Z00, VEG0, VEGMN0, LAI0, LAIMN0, SNUP0, ALBF !---- INITIALIZE PARAMETERS INTEGER, SAVE :: KWAT INTEGER, SAVE :: LIMIT1, LIMIT2 ! Initialize LU characteristics by LU Dataset IF (LAND_USE_TYPE == 'USGS') THEN KWAT = 16 RSMIN => RSMIN_USGS Z00 => Z00_USGS VEG0 => VEG0_USGS VEGMN0 => VEGMN0_USGS LAI0 => LAI0_USGS LAIMN0 => LAIMN0_USGS SNUP0 => SNUP0_USGS ALBF => ALBF_USGS LIMIT1 = 2 LIMIT1 = 6 ELSE IF (LAND_USE_TYPE == 'NLCD50') THEN KWAT = 1 RSMIN => RSMIN_NLCD50 Z00 => Z00_NLCD50 VEG0 => VEG0_NLCD50 VEGMN0 => VEGMN0_NLCD50 LAI0 => LAI0_NLCD50 LAIMN0 => LAIMN0_NLCD50 SNUP0 => SNUP0_NLCD50 ALBF => ALBF_NLCD50 LIMIT1 = 20 LIMIT1 = 43 ELSE IF (LAND_USE_TYPE == 'NLCD40') THEN KWAT = 17 RSMIN => RSMIN_NLCD40 Z00 => Z00_NLCD40 VEG0 => VEG0_NLCD40 VEGMN0 => VEGMN0_NLCD40 LAI0 => LAI0_NLCD40 LAIMN0 => LAIMN0_NLCD40 SNUP0 => SNUP0_NLCD40 ALBF => ALBF_NLCD40 LIMIT1 = 20 LIMIT1 = 43 ELSE IF (LAND_USE_TYPE == 'MODIS') THEN KWAT = 17 RSMIN => RSMIN_MODIS Z00 => Z00_MODIS VEG0 => VEG0_MODIS VEGMN0 => VEGMN0_MODIS LAI0 => LAI0_MODIS LAIMN0 => LAIMN0_MODIS SNUP0 => SNUP0_MODIS ALBF => ALBF_MODIS LIMIT1 = 12 LIMIT1 = 14 END IF !-------------------------------------------------------------------- DO J = jts,jte DO I = its,ite XLAI(I,J) = 0.0 XLAIMN(I,J) = 0.0 RSTMIN(I,J) = 9999.0 XVEG(I,J) = 0.0 XVEGMN(I,J) = 0.0 XSNUP(I,J) = 0.0 XALB(I,J) = 0.0 ENDDO ! END LOOP THROUGH GRID CELLS ENDDO ! END LOOP THROUGH GRID CELLS !-------------------------------------------------------------------- DO J = jts,jte DO I = its,ite !-- Initialize 2 and 3-D veg parameters to be caculated DO K=1,NLCAT LAIMX(K) = LAI0(K) LAIMN(K) = LAIMN0(K) Z0(K) = Z00(K) VEG(K) = VEG0(K) VEGMN(K) = VEGMN0(K) SNUP(K) = SNUP0(K) ENDDO !-- INITIALIZE SUMS SUMLAI = 0.0 SUMLMN = 0.0 SUMRSI = 0.0 SUMLZ0 = 0.0 SUMVEG = 0.0 SUMVMN = 0.0 ALAI = 0.0 SUMSNUP= 0.0 SUMALB = 0.0 !-- ESTIMATE CROP EMERGANCE DATE FROM VEGFRAC VFMX = SHDMAX(I,J) VFMN = SHDMIN(I,J) VEGF = VEGFRA(I,J) !-- Computations for VEGETATION CELLS ONLY IF(VFMX.GT.0.0.AND.LANDUSEF(I,KWAT,J).LT.1.00) THEN VSEAS = VEGF/VFMX IF(VSEAS.GT.1.0.OR.VSEAS.LT.0.0) THEN VSEAS = MIN(VSEAS,1.0) VSEAS = MAX(VSEAS,0.0) ENDIF ZNOTC = ZNOTCMN * (1-VSEAS) + ZNOTCMX * VSEAS ! Zo FOR CROPS DO K = 1, NLCAT IF (LAND_USE_TYPE == 'MODIS') THEN !-- USE THE VEGFRAC DATA ONLY FOR CROPS IF (K.EQ.12 .OR. K.EQ.14) THEN LAIMX(K) = LAIMN0(K) * (1-VSEAS) + LAI0(K) * VSEAS LAIMN(K) = LAIMX(K) VEG(K) = VEGMN0(K) * (1-VSEAS) + VEG0(K) * VSEAS VEGMN(K) = VEG(K) !-- SEASONALLY VARY Zo FOR MODIS DryCrop (k=12) IF (K .EQ. 12) THEN Z0(K) = ZNOTC !-- CrGrM (k=14) USE AVG WITH GRASS AND FOREST ELSE IF (K .EQ.14) THEN Z0(K) = 0.5 * (ZNOTC + Z00(K)) ENDIF ENDIF ELSE IF (LAND_USE_TYPE == 'NLCD50') THEN !-- USE THE VEGFRAC DATA ONLY FOR CROPS IF (K.EQ.20 .OR. K.EQ.43 .OR. K.EQ.45) THEN LAIMX(K) = LAIMN0(K) * (1-VSEAS) + LAI0(K) * VSEAS LAIMN(K) = LAIMX(K) VEG(K) = VEGMN0(K) * (1-VSEAS) + VEG0(K) * VSEAS VEGMN(K) = VEG(K) !-- SEASONALLY VARY Zo FOR DryCrop (k=20) OR Irigated Crop (k=43) OR Mix Crop (k=4) IF (K.EQ.20 .OR. K.EQ.43) THEN Z0(K) = ZNOTC !-- CrNatM (k=45) USE AVG WITH GRASS AND FOREST ELSE IF (K.EQ.45) THEN Z0(K) = 0.5 * (ZNOTC + Z00(K)) ENDIF ENDIF ELSE IF (LAND_USE_TYPE == 'NLCD40') THEN !-- USE THE VEGFRAC DATA ONLY FOR CROPS IF (K.EQ.12 .OR. K.EQ.14 .OR. K.EQ.38) THEN LAIMX(K) = LAIMN0(K) * (1-VSEAS) + LAI0(K) * VSEAS LAIMN(K) = LAIMX(K) VEG(K) = VEGMN0(K) * (1-VSEAS) + VEG0(K) * VSEAS VEGMN(K) = VEG(K) !-- SEASONALLY VARY Zo FOR Crop (k=12 for MODIS or 38 for NLCD) IF (K.EQ.12 .OR. K.EQ.38) THEN Z0(K) = ZNOTC !-- CrNatM (k=14) USE AVG WITH GRASS AND FOREST ELSE IF (K.EQ.14) THEN Z0(K) = 0.5 * (ZNOTC + Z00(K)) ENDIF ENDIF ELSE IF (LAND_USE_TYPE == 'USGS') THEN !-- USE THE VEGFRAC DATA ONLY FOR CROPS IF (K .GE. 2 .AND. K .LE. 6) THEN LAIMX(K) = LAIMN0(K) * (1-VSEAS) + LAI0(K) * VSEAS LAIMN(K) = LAIMX(K) VEG(K) = VEGMN0(K) * (1-VSEAS) + VEG0(K) * VSEAS VEGMN(K) = VEG(K) !-- SEASONALLY VARY Zo FOR DryCrop (k=2) OR Irigated Crop (k=3) OR Mix Crop (k=4) IF (K .GE. 2 .AND. K .LE. 4) THEN Z0(K) = ZNOTC !-- CrGrM (k=5) or CrWdM (k=6) USE AVG WITH GRASS AND FOREST ELSE IF (K .GE.5 .AND. K .LE. 6) THEN Z0(K) = 0.5 * (ZNOTC + Z00(K)) ENDIF ENDIF END IF ENDDO ENDIF !-- IF cell is vegetation !------------------------------------- !-- LOOP THROUGH LANDUSE Fraction and compute totals DO K = 1, NLCAT FAREA = LANDUSEF(I,K,J) SUMLAI = SUMLAI + LAIMX(K) * FAREA SUMLMN = SUMLMN + LAIMN(K) * FAREA ALAI = ALAI + FAREA SUMRSI = SUMRSI + FAREA * LAIMX(K) / RSMIN(K) SUMLZ0 = SUMLZ0 + FAREA * ALOG(Z0(K)) SUMVEG = SUMVEG + FAREA * VEG(K) SUMVMN = SUMVMN + FAREA * VEGMN(K) SUMSNUP= SUMSNUP+ FAREA * SNUP(K) SUMALB = SUMALB + FAREA * ALBF(K) ENDDO !-- CHECK FOR WATER FWAT = LANDUSEF(I,KWAT,J) IF (FWAT .GT. 0.999) THEN XLAI(I,J) = LAIMX(KWAT) XLAIMN(I,J) = LAIMN(KWAT) RSTMIN(I,J) = RSMIN(KWAT) ZNT(I,J) = Z0(KWAT) XVEG(I,J) = VEG(KWAT) XVEGMN(I,J) = VEGMN(KWAT) XSNUP(I,J) = SNUP(KWAT) XALB(I,J) = ALBF(KWAT) ELSE IF (FWAT .GT. 0.10) THEN ALAI = ALAI - FWAT SUMLZ0 = SUMLZ0 - FWAT * ALOG(Z0(KWAT)) ENDIF XLAI(I,J) = SUMLAI / ALAI XLAIMN(I,J) = SUMLMN / ALAI RSTMIN(I,J) = SUMLAI / SUMRSI ZNT(I,J) = EXP(SUMLZ0/ALAI) XVEG(I,J) = SUMVEG / ALAI XVEGMN(I,J) = SUMVMN / ALAI XSNUP(I,J) = SUMSNUP/ALAI XALB(I,J) = SUMALB/ALAI ENDIF IF (FWAT .GT. 0.50) THEN ZNT(I,J) = Z0(KWAT) XALB(I,J)= ALBF(KWAT) ENDIF ZNT(I,J) = ZNT(I,J) * 0.01 !CONVERT TO M XVEG(I,J) = XVEG(I,J) * 0.01 !CONVERT TO FRAC XVEGMN(I,J) = XVEGMN(I,J) * 0.01 XLAND(I,J) = 1.0 + FWAT XALB(I,J) = XALB(I,J) * 0.01 ENDDO ! END LOOP THROUGH GRID CELLS ENDDO ! END LOOP THROUGH GRID CELLS !-------------------------------------------------------------------- END SUBROUTINE vegeland !------------------------------------------------------------------------------ !------------------------------------------------------------------------------ SUBROUTINE SURFPX(DTPBL, IFLAND, ISNOW, NUDGEX, XICE1, & !in 1,2 SOLDN, GSW, LWDN, EMISSI, Z1, & !in MOL, ZNT, UST, & !in PSURF, DENS1, QV1, QSS, TA1, & !in THETA1, PRECIP, & !in CPAIR, PSIH, & !in RH2OBS, T2OBS, & !in VEGFRC, ISTI, LAI, BETAP, & !in RSTMIN, HC_SNOW, SNOW_FRA, & !in WWLT, WFC, CGSAT, WSAT, B, & !in C1SAT, C2R, AS, JP, DS1, DS2,QST12, & !in RADNET, GRDFLX, HFX, QFX, LH, EG, ER, ETR, & !out QST, CAPG, RS, RA, TG, T2, & !out WG, W2, WR, TA2, QA2, LAND_USE_TYPE ) !out !------------------------------------------------------------------------------ ! ! FUNCTION: ! THIS SUBROUTINE COMPUTES SOIL MOISTURE AND TEMPERATURE TENDENCIES ! BY SOLVING THE PROGNOSTIC EQUATIONS IN PX95. ! ! SUBROUTINES CALLED: ! SUB. QFLUX compute the soil and canopy evaporation, and transpiration ! SUB. SMASS compute nudging coefficients for soil moisture and temp nudging ! ! ARGUMENTS: ! DTPBL: TIME STEP OF THE MINOR LOOP FOR THE LAND-SURFACE/PBL MODEL ! IFLAND: INDEX WHICH INDICATES THE TYPE OF SURFACE,=1,LAND;=2,SEA ! ISNOW: SNOW (=1) OR NOT (=0) ! NUDGE: SWITCH FOR SOIL MOISTURE NUDGING ! SOLDN: SHORT-WAVE RADIATION ! LWDN: LONG-WAVE RADIATION ! EMISSI: EMISSIVITY ! Z1: HEIGHT OF THE LOWEST HALF LAYER ! MOL: MONIN-OBUKOV LENGH (M) ! ZNT: ROUGHNESS LENGTH (M) ! UST: FRICTION VELOCITY (M/S) ! TST: Turbulent moisture scale ! RA: AERODYNAMIC RESISTENCE ! PSURF: P AT SURFACE (CB) ! DENS1: AIR DENSITY AT THE FIRST HALF LAYER ! QV1: Air humidity at first half layer ! QSS: Saturation mixing ratio at ground ! TA1: Air temperature at first half layer ! THETA1: Potential temperature at first half layer ! PRECIP: Precipitation rate in m/s ! STBOLT: STEFAN BOLTZMANN'S CONSTANT ! KARMAN: VON KARMAN CONSTANT ! CPAIR: Specific heat of moist air (M^2 S^-2 K^-1) ! TAUINV: 1/1DAY(SEC) ! VEGFRC: Vegetation coverage ! ISTI: soil type ! LAI: Leaf area index ! BETAP: Coefficient for bare soil evaporation ! THZ1OB: Observed TEMP FROM ANAL OF OBS TEMPS AT SCREEN HT ! RHOBS: Observed relative humidity at SCREEN HT ! RSTMIN Minimum Stomatol resistence !... Outputs from SURFPX ! RADNET: Net radiation ! HFX: SENSIBLE HEAT FLUX (W / M^2) ! QFX: TOTAL EVAP FLUX (KG / M^2 S) ! GRDFLX: Ground heat flux (W / M^2) ! QST: Turbulent moisture scale ! CAPG: THERMAL CAPACITY OF GROUND SLAB (J/M^2/K) ! RS: Surface resistence ! RA: Surface aerodynamic resistence ! EG: evaporation from ground (bare soil) ! ER: evaporation from canopy ! ETR: transpiration from vegetation ! TA2: diagnostic 2-m temperature from surface layer and lsm ! !... Updated variables in this subroutine ! TG: Soil temperature at first soil layer ! T2: Soil temperature in root zone ! WG: Soil moisture at first soil layer ! W2: Soil moisture at root zone ! WR: Canopy water content in m ! ! REVISION HISTORY: ! AX 2/2005 - developed WRF version based on the MM5 PX LSM ! !------------------------------------------------------------------------------ !------------------------------------------------------------------------------ IMPLICIT NONE !.......Arguments !.. Integer INTEGER , INTENT(IN) :: ISTI, NUDGEX !... Real REAL , INTENT(IN) :: DTPBL, DS1, DS2 REAL , INTENT(IN) :: IFLAND, ISNOW, XICE1 REAL , INTENT(IN) :: SOLDN, GSW, LWDN, EMISSI, Z1 REAL , INTENT(IN) :: ZNT REAL , INTENT(IN) :: PSURF, DENS1, QV1, QSS, TA1, THETA1, PRECIP REAL , INTENT(IN) :: CPAIR REAL , INTENT(IN) :: VEGFRC, LAI REAL , INTENT(IN) :: RSTMIN, HC_SNOW, SNOW_FRA REAL , INTENT(IN) :: WWLT, WFC, CGSAT, WSAT, B, C1SAT, C2R, AS, JP REAL , INTENT(IN) :: RH2OBS,T2OBS REAL , INTENT(IN) :: QST12 REAL , INTENT(OUT) :: RADNET, EG, ER, ETR REAL , INTENT(OUT) :: QST, CAPG, RS, TA2, QA2 REAL , INTENT(INOUT) :: TG, T2, WG, W2, WR, UST, RA, BETAP REAL , INTENT(INOUT) :: GRDFLX, QFX, HFX, LH, PSIH, MOL CHARACTER (LEN = 5), INTENT(IN) :: LAND_USE_TYPE !... Local Variables !... Real REAL :: HF, LV, CQ4 REAL :: RAH, RAW, ET, W2CG, CG, CT, SOILFLX, CPOT, THETAG REAL :: ZOL, ZOBOL, ZNTOL, Y, Y0, PSIH15, YNT REAL :: WGNUDG, W2NUDG, ALPH1, ALPH2, BET1, BET2, T1P5 REAL :: CQ1, CQ2, CQ3, COEFFNP1, COEFFN, TSNEW, TSHLF, T2NEW REAL :: ROFF, WRMAX, PC, DWR, PNET, TENDWR, WRNEW REAL :: COF1, CFNP1WR, CFNWR, PG, FASS REAL :: TENDW2, W2NEW, W2HLF, W2REL, C1, C2, WEQ, CFNP1, CFN, WGNEW REAL :: ALN10, TMP1, TMP2, TMP3, AA, AB, TST, RBH, CTVEG REAL :: QST1,PHIH,PSIOB REAL :: T2NUD, T2NUDF REAL :: VAPPRS, QSBT, RH2MOD !... Parameters REAL :: ZOBS, GAMAH, BETAH, SIGF, BH, CT_SNOW REAL, PARAMETER :: CV = 8.0E-6 ! K-M2/J PARAMETER (ZOBS = 1.5) ! height for observed screen temp., (m) PARAMETER (BH = 15.7) PARAMETER (GAMAH = 16. ) !11.6) PARAMETER (BETAH = 5.0 ) !8.21) PARAMETER (SIGF = 0.5) ! rain interception see LSM (can be 0-1) !PARAMETER (CT_SNOW = 5.54E-5) ! New value of CT_SNOW calibrated using multilayer soil model where csnow=6.9E5 J/(m3 K) ! from NCAR CSM PARAMETER (CT_SNOW = 2.0E-5) ALN10 = ALOG(10.0) RADNET = SOLDN - (EMISSI *(STBOLT *TG **4 - LWDN)) ! NET RADIATION !-------------------------------------------------------------------- CPOT= (100.0 / PSURF) ** ROVCP ! rcp is global constant(module_model_constants) THETAG = TG * CPOT ZOL = Z1/MOL ZOBOL = ZOBS/MOL ZNTOL = ZNT/MOL !----------------------------------------------------------------------------------------- IF (MOL .LT. 0.0) THEN Y = ( 1.0 - GAMAH * ZOL ) ** 0.5 Y0 = ( 1.0 - GAMAH * ZOBOL ) ** 0.5 YNT = ( 1.0 - GAMAH * ZNTOL ) ** 0.5 PSIH15 = 2.0 * ALOG((Y + 1.0) / (Y0 + 1.0)) PSIH = 2.0 * ALOG((Y + 1.0) / (YNT + 1.0)) PSIOB = 2.0 * ALOG((Y0 + 1.0) / (YNT + 1.0)) PHIH = 1.0 / Y ELSE IF((ZOL-ZNTOL).LE.1.0) THEN PSIH = -BETAH*(ZOL-ZNTOL) ELSE PSIH = 1.-BETAH-(ZOL-ZNTOL) ENDIF IF ((ZOBOL - ZNTOL) .LE. 1.0) THEN PSIOB = -BETAH * (ZOBOL - ZNTOL) ELSE PSIOB = 1.0 - BETAH - (ZOBOL - ZNTOL) ENDIF PSIH15 = PSIH - PSIOB IF(ZOL.LE.1.0) THEN PHIH = 1.0 + BETAH * ZOL ELSE PHIH = BETAH + ZOL ENDIF ENDIF !----------------------------------------------------------------------------------------- !-- ADD RA AND RB FOR HEAT AND MOISTURE !... RB FOR HEAT = 5 /UST !... RB FOR WATER VAPOR = 5*(0.599/0.709)^2/3 /UST = 4.503/UST RA=PR0* ( ALOG(Z1/ZNT) - PSIH )/(KARMAN*UST) RAH = RA + 5.0 / UST RAW = RA + 4.503 / UST !-------------------------------------------------------------------- !-- COMPUTE MOISTURE FLUX CALL QFLUX( DENS1, QV1, TA1, SOLDN, RAW, QSS, & VEGFRC, ISNOW, ISTI, IFLAND, LAI, BETAP, & WG, W2, WR, & RSTMIN, WWLT, WFC, & EG, ER, ETR, CQ4, RS, FASS) !-------------------------------------------------------------------- !-------------------------------------------------------------------- !..........Total evaporation (ET) ET = EG + ER + ETR QST = -ET / (DENS1 * UST) LV = 2.83E6 !-- LATENT HEAT OF SUBLIMATION AT 0C FROM STULL(1988) IF (ISNOW .LT. 0.5.AND.TG.GT.273.15) & LV = (2.501 - 0.00237 * (TG - 273.15)) * 1.E6 !-- FROM STULL(1988) in J/KG ! IF (IFLAND .LT. 1.5 ) QFX = ET !-- Recaculate QFX over land to account for P-X LSM EG, ER and ETR QFX = ET LH = LV * QFX !----------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------- ! Surface sensible heat flux TST = (THETA1 - THETAG ) / (UST*RAH) HF = UST * TST HFX = AMAX1(-DENS1 * CPAIR * HF, -250.0) ! using -250. from MM5 !----------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------- ! Compute the diagnosed 2m Q and T consistent with PX LSM QST1 = 0.5*(QST+QST12/PHIH) TA2 = (THETAG + TST * (PR0 / KARMAN * (ALOG(ZOBS / ZNT) - PSIOB)+5.))/CPOT QA2 = QV1 - QST1 * PR0/ KARMAN * (ALOG(Z1 / ZOBS) - PSIH15) IF (QA2.LE.0.0) QA2 = QV1 !-- Relative humidity VAPPRS = SVP1 * EXP(SVP2 * (TA2 - SVPT0) / (TA2 - SVP3)) QSBT = EP_2 * VAPPRS / (PSURF - VAPPRS) RH2MOD = QA2 / QSBT !----------------------------------------------------------------------------------------- IF (IFLAND .LT. 1.5 ) THEN W2CG = AMAX1(W2,WWLT) CG = CGSAT * 1.0E-6 * (WSAT/ W2CG) ** & (0.5 * B / ALN10) CT = 1./((1-VEGFRC)/CG + VEGFRC/CV) CT = 1./(SNOW_FRA/CT_SNOW + (1-SNOW_FRA)/CT) CAPG = 1.0/CT SOILFLX = 2.0 * PI * TAUINV * (TG - T2) GRDFLX = SOILFLX / CT ENDIF !----------------------------------------------------------------------------------------- !-------------------------------------------------------------------- !-- ASSIMILATION --- COMPUTE SOIL MOISTURE NUDGING FROM TA2 and RH2 !-------COMPUTE ASSIMILATION COEFFICIENTS FOR ALL I IF (IFLAND .LT. 1.5) THEN IF (NUDGEX .EQ. 0) THEN !-- NO NUDGING CASE WGNUDG = 0.0 W2NUDG = 0.0 T2NUD = 0.0 ELSE !-- NUDGING CASE CALL SMASS (ISTI, FASS, SOLDN, VEGFRC, RA, WWLT, WFC, & ALPH1, ALPH2, BET1, BET2, T2NUDF) !--COMPUTE MODEL RH WGNUDG = ALPH1 * (T2OBS - TA2) + ALPH2 * (RH2OBS - RH2MOD) * 100 W2NUDG = BET1 * (T2OBS - TA2) + BET2 * (RH2OBS - RH2MOD) * 100 IF (W2 .GE. WFC) W2NUDG = AMIN1(W2NUDG,0.0) IF (W2 .LE. WWLT) W2NUDG = AMAX1(W2NUDG,0.0) T2NUD = T2NUDF * (T2OBS - TA2) !print *, 'T2NUD =',T2NUD,T2NUDF ENDIF ENDIF !----------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------- !-- Compute new values for TS,T2,WG,W2 and WR. No change over ice or water (XLAND > 1) IF (IFLAND .LT. 1.5) THEN !-- SOLVE BY CRANK-NIC -- TENDTS=CT*(RADNET-HFX-QFX)-SOILFLX !-- Calculate the coefficients for implicit calculation of TG CQ1 = (1.0 - 0.622 * LV * CRANKP / (r_d * TG)) * QSS CQ2 = 0.622 * LV * QSS * CRANKP / (r_d * TG * TG) CQ3 = DENS1 * BETAP * (1.0 - VEGFRC) / RAW COEFFNP1 = 1.0 + DTPBL * CRANKP * (4.0 * EMISSI * STBOLT * TG ** 3 & * CT + DENS1 * CPAIR / RAH * CPOT * CT + 2.0 * PI & * TAUINV ) + DTPBL * (CT * LV * CQ2 * (CQ3 + CQ4)) COEFFN = CT * (GSW + EMISSI * (STBOLT * (4.0 * CRANKP - 1.0) & * TG*TG*TG*TG + LWDN) & !NET RAD + DENS1 * CPAIR / RAH * (THETA1 - (1.0 - CRANKP) * THETAG) & - LV * (CQ3 * (CQ1 - QV1) + CQ4 * (CQ1 - QV1))) & !SFC HEAT FLUX - 2.0 * PI * TAUINV * ((1.0 - CRANKP) * TG - T2) !SOIL FLUX TSNEW = (TG + DTPBL * COEFFN) / COEFFNP1 !-- FOR SNOW COVERED SURFACE TEMPERATURE IS NOT MORE THAN ZERO IF (XICE1 .GT. 0.5) TSNEW = AMIN1(TSNEW,273.15) ! Re-added Jan 2010 to keep ice surface at or below freezing (J. Pleim) TSHLF = 0.5 * ( TSNEW + TG) T2NEW = (T2 + DTPBL * TAUINV * T2TFAC * (TSHLF - (1 - CRANKP) * T2) & + DTPBL*T2NUD) & ! Added deep temperature nudging / (1.0 + DTPBL * TAUINV * T2TFAC * CRANKP) !-- REPLACE OLD with NEW Value TG = TSNEW T2 = T2NEW ENDIF !----------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------- ! Compute new subsurface soil and canopy moisture values DENS1. No change required over ocean. IF (IFLAND .LT. 1.5.AND. XICE1.LT.0.5) THEN !-- Compute WR ROFF = 0.0 WRMAX = 0.2E-3 * VEGFRC * LAI ! max. WRMAX IN m IF(WRMAX.GT.0.0) THEN !-- PC is precip. intercepted by veg.(M/S) PC = VEGFRC * SIGF * PRECIP DWR = (WRMAX - WR) / DTPBL !the tendency to reach max. PNET = PC - ER/ DENW ! residual of precip. and evap. IF (PNET .GT. DWR) THEN ROFF = PNET - DWR PC = PC - ROFF ENDIF IF (QSS .LT. QV1) THEN TENDWR = PC - ER / DENW WRNEW = WR + DTPBL * TENDWR ELSE COF1 = DENS1 / DENW * VEGFRC * (QSS - QV1) / RAW !-- using delta=wr/wrmax CFNP1WR = 1.0 + DTPBL * COF1 * CRANKP / WRMAX CFNWR = PC - COF1 * (1.0 - CRANKP) * WR / WRMAX WRNEW = (WR + DTPBL * CFNWR) / CFNP1WR ENDIF ELSE PC=0.0 WRNEW=0.0 ENDIF !--------------------------------------------- !-- Compute W2 PG = DENW * (PRECIP - PC) ! PG is precip. reaching soil (PC already including ROFF) TENDW2 = 1.0 / (DENW * DS2) * (PG - EG - ETR) & + (W2NUDG + WGNUDG) / DS2 ! NUDGING W2NEW = W2 + DTPBL * TENDW2 W2NEW = AMIN1(W2NEW,WSAT) W2NEW = AMAX1(W2NEW,0.05) W2HLF = 0.5 * (W2 + W2NEW) !.. new values W2 = W2NEW WR = AMIN1(WRMAX,WRNEW) ENDIF !----------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------- ! Compute new surface soil moisture values (WR). IF (IFLAND .LT. 1.5.AND. XICE1.LT.0.5) THEN ! over ocean no change to wg w2,wr !-- FOR SNOW COVERED SURFACE, ASSUME SURFACE IS SATURATED AND ! WG AND W2 ARE NOT CHANGED IF (ISNOW .GT.0.5) THEN WG = WSAT ELSE W2REL = W2HLF / WSAT IF (WG .GT. WWLT) THEN C1 = C1SAT * (WSAT / WG) ** (0.5 * B + 1.0) ELSE ! elimilate C1 for wg < wilting point C1 = C1SAT * (WSAT / WWLT) ** (0.5 * B + 1.0) ENDIF C2 = C2R * W2HLF / (WSAT - W2HLF + 1.E-11) IF (W2HLF .EQ. WSAT) THEN WEQ = WSAT ELSE WEQ = W2HLF - AS * WSAT * W2REL ** JP * & (1.0 - W2REL ** (8.0 * JP)) ENDIF !.... The beta method, Lee & Pielke (JAM, May 1992) CFNP1 = 1.0 + DTPBL * C2 * TAUINV * CRANKP CFN = C1 / (DENW * DS1) * (PG - EG) - C2 * TAUINV * & ((1.0 - CRANKP) * WG - WEQ) + WGNUDG/ DS1 WGNEW = AMAX1((WG + DTPBL * CFN) / CFNP1,0.001) !-- NEW VALUES WG = AMIN1(WGNEW,WSAT) ENDIF !endif for ISNOW ENDIF !endif for XLAND END SUBROUTINE surfpx !------------------------------------------------------------------------- !------------------------------------------------------------------------- !------------------------------------------------------------------------- !------------------------------------------------------------------------- SUBROUTINE QFLUX (DENS1, QV1, TA1, RG, RAW, QSS, & ! in 1 VEGFRC, ISNOW, ISTI, IFLAND, LAI, BETAP, & ! in WG, W2, WR, & ! in RSTMIN, WWLT, WFC, & EG, ER, ETR, CQ4, RS, FASS) ! out !------------------------------------------------------------------------- ! ! FUNCTION: ! THIS SUBROUTINE COMPUTES EVAPORATION FROM BARE SOIL (EG) AND FROM ! THE WET PART OF CANOPY (ER) AND TRANSPIRATION FROM THE DRY PART OF ! CANOPY (ETR). ! ! REVISION HISTORY: ! A. Xiu Oct 2004 - adapted from the PX LSM in MM5 for the WRF system ! R. Gilliam Dec 2006 - Completed WRF V2.1.2 implementation ! !------------------------------------------------------------------------- ! QFLUX ARGUMENT LIST: !------------------------------------------------------------------------- ! INPUTS: !-- DENS1 air density at first layer !-- QV1 air humidity at first layer !-- TA1 air temperature at first layer !-- RG shortwave radition reaching the ground !-- RAW RA+RB for moisture !-- QSS saturation mixing ratio at ground !-- VEGFRC vegetation coverage !-- ISNOW if snow on the ground !-- ISTI soil type !-- IFLAND if land (=1) or water (=2) !-- LAI leaf area index !-- BETAP !-- WG soil moisture at first soil layer !-- W2 soil moisture at root zone !-- WR Canopy water ! ! OUTPUTS FROM QFLUX: !-- EG evaporation from ground (bare soil) !-- ER evaporation from canopy !-- ETR transpiration from vegetation !-- CQ4 !-- RS surface resistence !-- FASS parameter for soil moisture nudging !------------------------------------------------------------------------- !------------------------------------------------------------------------- IMPLICIT NONE ! DECLARATIONS - INTEGER INTEGER , INTENT(IN) :: ISTI ! DECLARATIONS - REAL REAL , INTENT(IN) :: ISNOW, IFLAND REAL , INTENT(IN) :: DENS1, QV1, TA1, RG, RAW, QSS, & VEGFRC, LAI, & WG, W2, WR, RSTMIN REAL , INTENT(INOUT) :: BETAP REAL, INTENT(IN) :: WWLT, WFC REAL , INTENT(OUT) :: EG, ER, ETR, CQ4, RS, FASS !... Local Variables !... Real REAL :: WRMAX, DELTA, SIGG, RADL, RADF, W2AVAIL, W2MXAV REAL :: FTOT, F1, F2, F3, F4 REAL :: FSHELT, GS, GA, FX !... Parameters REAL, PARAMETER :: RSMAX = 5000.0 ! s/m REAL, PARAMETER :: FTMIN = 0.0000001 ! m/s REAL, PARAMETER :: F3MIN = 0.25 ! !... for water surface, no canopy evaporation and transpiration ER = 0.0 ETR = 0.0 CQ4 = 0.0 !... GROUND EVAPORATION (DEPOSITION) IF (QSS .LT. QV1) BETAP = 1.0 EG = DENS1 * (1.0 - VEGFRC) * BETAP * (QSS - QV1) / RAW !!--------------------------------------------------------------------- !... CANOPY IF (IFLAND .LT. 1.5 .AND. VEGFRC .GT. 0.0) THEN WRMAX = 0.2E-3 * VEGFRC * LAI ! in unit m IF (WR .LE. 0.0) THEN DELTA = 0.0 ELSE ! DELTA = (WR / WRMAX) ** 0.66667 DELTA = WR / WRMAX ! referred to SiB model ENDIF IF (QSS .GE. QV1) THEN SIGG = DELTA ELSE SIGG = 1.0 ENDIF ER = DENS1 * VEGFRC * SIGG * (QSS - QV1) / RAW ENDIF !!--------------------------------------------------------------------- !-- TRANSPIRATION !!--------------------------------------------------------------------- IF (IFLAND .LT. 1.5 .AND. VEGFRC .GT. 0.0) THEN !!!-RADIATION IF (RSTMIN .GT. 130.0) THEN RADL = 30.0 ! W/M2 ELSE RADL = 100.0 ! W/M2 ENDIF RADF = 1.1 * RG / (RADL * LAI) ! NP89 - EQN34 F1 = (RSTMIN / RSMAX + RADF) / (1.0 + RADF) !!!-SOIL MOISTURE W2AVAIL = W2 - WWLT W2MXAV = WFC - WWLT F2 = 1.0 / (1.0 + EXP(-5.0 * ( W2AVAIL / W2MXAV - & (W2MXAV / 3.0 + WWLT)))) ! according JP, 9/94 !-AIR TEMP !... according to Avissar (1985) and AX 7/95 IF (TA1 .LE. 302.15) THEN F4 = 1.0 / (1.0 + EXP(-0.41 * (TA1 - 282.05))) ELSE F4 = 1.0 / (1.0 + EXP(0.5 * (TA1 - 314.0))) ENDIF FTOT = LAI * F1 * F2 * F4 ENDIF !!--------------------------------------------------------------------- IF (IFLAND .LT. 1.5 .AND. VEGFRC .GT. 0.0) THEN FSHELT = 1.0 ! go back to NP89 GS = FTOT / (RSTMIN * FSHELT) GA = 1.0 / RAW !-- Compute humidity effect according to RH at leaf surf F3 = 0.5 * (GS - GA + SQRT(GA * GA + GA * GS * & (4.0 * QV1 / QSS - 2.0) + GS * GS)) / GS F3 = AMIN1(AMAX1(F3,F3MIN),1.0) RS = 1.0 / (GS * F3) !--- Compute Assimilation factor for soil moisture nudging - jp 12/94 !-- Note that the 30 coef is to result in order 1 factor for max IF (RG .LT. 0.00001) THEN ! do not nudge during night FX = 0.0 ELSE FX = 30.0 * F1 * F4 * LAI / (RSTMIN * FSHELT) ENDIF FASS = FX ETR = DENS1 * VEGFRC * (1.0 - SIGG) * (QSS - QV1) / (RAW + RS) !..... CQ4 is used for the implicit calculation of TG in SURFACE CQ4 = DENS1 * VEGFRC * ((1.0 - SIGG) / (RAW + RS) + SIGG / RAW) ENDIF END SUBROUTINE qflux !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ SUBROUTINE SMASS (ISTI, FASS, RG, VEGFRC, RA, & !in 1 WWLT, WFC, & !in ALPH1, ALPH2, BET1, BET2, T2NUDF ) !out !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ IMPLICIT NONE !------------------------------------------------------------------------------------------ ! SMASS COMPUTES SOIL MOISTURE NUDGING COEFFICIENTS !------------------------------------------------------------------------------------------ ! !.........Arguments INTEGER, PARAMETER :: NSCAT = 16 ! max. soil types INTEGER, INTENT(IN) :: ISTI REAL, INTENT(IN) :: FASS, RG, VEGFRC, RA REAL, INTENT(IN) :: WWLT, WFC REAL, INTENT(OUT) :: ALPH1, ALPH2, BET1, BET2, T2NUDF !........Local variables !... Real REAL :: FBET, FALPH, FRA, FTEXT REAL, DIMENSION( 1: NSCAT ) :: WFCX, WWLTX !... Parameters REAL, PARAMETER :: A1MAX = -10.E-5, A2MAX = 1.E-5 ! m/K, m for 6hr period REAL, PARAMETER :: B1MAX = -10.E-3, B2MAX = 1.E-3 ! m/K, m (Bouttier et al 1993) REAL, PARAMETER :: TASSI = 4.6296E-5 ! 1/6hr in 1/sec REAL, PARAMETER :: RAMIN = 10.0 ! 0.1 s/cm ! !-- WFC is field capacity (M^3/M^3) (JN90) DATA WFCX / 0.135, 0.150, 0.195, 0.255, 0.240, 0.255, 0.322, & 0.325, 0.310, 0.370, 0.367, 0.367, 0.367, 0.367, 0.367, 0.367 / ! !-- WWLT is wilting point (M^3/M^3) (JN90) DATA WWLTX / 0.068, 0.075, 0.114, 0.179, 0.155, 0.175, 0.218, & 0.250, 0.219, 0.283, 0.286, 0.286, 0.286, 0.286, 0.286, 0.286 / ! FBET = FASS FALPH = RG / 1370.0 !--TEXTURE FACTOR NORMALIZED BY LOAM (IST=5) FRA = RAMIN / RA ! scale by aerodynamic resistance FTEXT = TASSI * (WWLT + WFC) / (WWLTX(5) + WFCX(5)) * FRA ! write(6,*) ' ftot, fbet=',ftot, fbet,' ftext=',ftext/tassi ! ALPH1 = A1MAX * FALPH * (1.0 - VEGFRC) * FTEXT ALPH2 = A2MAX * FALPH * (1.0 - VEGFRC) * FTEXT BET1 = B1MAX * FBET * VEGFRC * FTEXT BET2 = B2MAX * FBET * VEGFRC * FTEXT T2NUDF = 1.0E-5 * MAX((1.0 - 5.0 * FALPH),0.0) ! T2 Nudging at night END SUBROUTINE smass !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ SUBROUTINE SOILPROP (SOILCBOT,WEIGHT, ITIMESTEP, MAVAIL, & ! IN 3 PXLSM_SMOIS_INIT, & ! IN FWSAT,FWFC,FWWLT,FB,FCGSAT, & ! OUT FJP,FAS,FC2R,FC1SAT,ISTI, W2 ) ! OUT !------------------------------------------------------------------------ ! SOILPROP COMPUTES SOIL PARAMETERS FOR BOTH BOTTOM AND TOP LAYERS ! USING FRACTIONAL SOIL TYPE. A HARD CODED OPTION IS AVAILIABLE ! TO COMPUTE THE SOIL PARAMETERS USING FRACTIONAL INFORMATION, OR ! TO JUST USE SOIL PARAMETERS OF THE DOMINANT SOIL TYPE !------------------------------------------------------------------------ !-- SOIL PARAMETERS ARE SPECIFIED BY SOIL TYPE: ! # SOIL TYPE WSAT WFC WWLT B CGSAT JP AS C2R C1SAT ! _ _________ ____ ___ ____ ____ _____ ___ ___ ___ _____ ! 1 SAND .395 .135 .068 4.05 3.222 4 .387 3.9 .082 ! 2 LOAMY SAND .410 .150 .075 4.38 3.057 4 .404 3.7 .098 ! 3 SANDY LOAM .435 .195 .114 4.90 3.560 4 .219 1.8 .132 ! 4 SILT LOAM .485 .255 .179 5.30 4.418 6 .105 0.8 .153 ! 4 SILT .485 .255 .179 5.30 4.418 6 .105 0.8 .153 NP89 does not have Silt so mapped to Silt Loam ! 5 LOAM .451 .240 .155 5.39 4.111 6 .148 0.8 .191 ! 6 SND CLY LM .420 .255 .175 7.12 3.670 6 .135 0.8 .213 ! 7 SLT CLY LM .477 .322 .218 7.75 3.593 8 .127 0.4 .385 ! 8 CLAY LOAM .476 .325 .250 8.52 3.995 10 .084 0.6 .227 ! 9 SANDY CLAY .426 .310 .219 10.40 3.058 8 .139 0.3 .421 ! 10 SILTY CLAY .482 .370 .283 10.40 3.729 10 .075 0.3 .375 ! 11 CLAY .482 .367 .286 11.40 3.600 12 .083 0.3 .342 !------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ IMPLICIT NONE !.........Arguments INTEGER, PARAMETER :: NSCAT = 16 ! max. soil types INTEGER, PARAMETER :: NSCATMIN = 16 ! min soil types INTEGER, INTENT(IN) :: WEIGHT, ITIMESTEP, PXLSM_SMOIS_INIT REAL, INTENT(IN) :: MAVAIL REAL, DIMENSION(1:NSCAT), INTENT(IN) :: SOILCBOT REAL, INTENT(OUT) :: FWSAT,FWFC,FWWLT,FB,FCGSAT, & FJP,FAS,FC2R,FC1SAT REAL, INTENT(INOUT) :: W2 INTEGER, INTENT(OUT) :: ISTI !........Local variables CHARACTER*4, AVCLASS CHARACTER*4, DIMENSION( 1: NSCAT ) :: TEXID !... Integer INTEGER:: S !... Real REAL:: TFRACBOT, CFRAC, SUMSND, SUMCLY, AVS, AVC, AVSLT REAL, DIMENSION( 1: NSCAT ) :: WSAT, WFC, WWLT, B, CGSAT, AS, & JP, C2R, C1SAT REAL, DIMENSION( 1: NSCATMIN ) :: SAND, CLAY !.......... DATA statement for SOIL PARAMETERS for the 11 soil types DATA SAND /92.5,80.5,61.1,19.6,4.0,40.0,57.1,11.3,26.8, & 52.0,6.5,10.2,1.0,1.0,1.0,1.0/ DATA CLAY/2.1,4.1,10.9,19.1,7.3,18.8,23.3,32.2,36.6, & 43.0,46.2,58.8,1.0,1.0,1.0,1.0/ DATA TEXID/'Sand','Lsan','Sloa','Sill','Silt','Loam','Sclo', & 'Sicl','Cllo','Sacl','Sicy','Clay','Ormt','Wate', & 'Bedr','Othe'/ ! !-- WSAT is saturated soil moisture (M^3/M^3) (JN90) DATA WSAT / 0.395, 0.410, 0.435, 0.485, 0.451, 0.420, 0.477, & 0.476, 0.426, 0.482, 0.482, 0.482, 0.482, 0.482, 0.482, 0.482 / ! !-- WFC is field capacity (M^3/M^3) (JN90) DATA WFC / 0.135, 0.150, 0.195, 0.255, 0.240, 0.255, 0.322, & 0.325, 0.310, 0.370, 0.367, 0.367, 0.367, 0.367, 0.367, 0.367 / ! !-- WWLT is wilting point (M^3/M^3) (JN90) DATA WWLT / 0.068, 0.075, 0.114, 0.179, 0.155, 0.175, 0.218, & 0.250, 0.219, 0.283, 0.286, 0.286, 0.286, 0.286, 0.286, 0.286 / ! !-- B is slop of the retention curve (NP89) DATA B / 4.05, 4.38, 4.90, 5.30, 5.39, 7.12, 7.75, & 8.52, 10.40, 10.40, 11.40, 11.40, 11.40, 11.40, 11.40, 11.40 / ! !-- CGSAT is soil thermal coef. at saturation (10^-6 K M^2 J^-1) (NP89) DATA CGSAT / 3.222, 3.057, 3.560, 4.418, 4.111, 3.670, 3.593, & 3.995, 3.058, 3.729, 3.600, 3.600, 3.600, 3.600, 3.600, 3.600 / ! !-- JP is coefficient of WGEQ formulation (NP89) DATA JP / 4, 4, 4, 6, 6, 6, 8, & 10, 8, 10, 12, 12, 12, 12, 12, 12 / ! !-- AS is coefficient of WGEQ formulation (NP89) DATA AS / 0.387, 0.404, 0.219, 0.105, 0.148, 0.135, 0.127, & 0.084, 0.139, 0.075, 0.083, 0.083, 0.083, 0.083, 0.083, 0.083 / ! !-- C2R is the value of C2 for W2=0.5WSAT (NP89) DATA C2R / 3.9, 3.7, 1.8, 0.8, 0.8, 0.8, 0.4, & 0.6, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3 / ! !-- C1SAT is the value of C1 at saturation (NP89) DATA C1SAT / 0.082, 0.098, 0.132, 0.153, 0.191, 0.213, 0.385, & 0.227, 0.421, 0.375, 0.342, 0.342, 0.342, 0.342, 0.342, 0.342 / ! !-------------------------------Exicutable starts here-------------------- IF(WEIGHT.GE.1.0) THEN !Compute soil characteristics using weighting determined by fractional soil content FWSAT =0 FWFC =0 FWWLT =0 FB =0 FCGSAT=0 FJP =0 FAS =0 FC2R =0 FC1SAT=0 TFRACBOT =0 CFRAC=0 DO S=1,NSCAT IF(SOILCBOT(S).GE.CFRAC) THEN ISTI=S CFRAC=SOILCBOT(S) ENDIF TFRACBOT=TFRACBOT+SOILCBOT(S) FWSAT =FWSAT + WSAT(S) *SOILCBOT(S) FWFC =FWFC + WFC(S) *SOILCBOT(S) FWWLT =FWWLT + WWLT(S) *SOILCBOT(S) FB =FB + B(S) *SOILCBOT(S) FCGSAT=FCGSAT + CGSAT(S) *SOILCBOT(S) FJP =FJP + JP(S) *SOILCBOT(S) FAS =FAS + AS(S) *SOILCBOT(S) FC2R =FC2R + C2R(S) *SOILCBOT(S) FC1SAT=FC1SAT + C1SAT(S) *SOILCBOT(S) ENDDO TFRACBOT = 1/TFRACBOT FWSAT =FWSAT * TFRACBOT FWFC =FWFC * TFRACBOT FWWLT =FWWLT * TFRACBOT FB =FB * TFRACBOT FCGSAT=FCGSAT * TFRACBOT FJP =FJP * TFRACBOT FAS =FAS * TFRACBOT FC2R =FC2R * TFRACBOT FC1SAT=FC1SAT * TFRACBOT ELSE !Compute soil characteristics by sand and clay fraction CFRAC = 0.0 SUMSND = 0.0 SUMCLY = 0.0 TFRACBOT = 0.0 DO S = 1,12 TFRACBOT = TFRACBOT + SOILCBOT(S) SUMSND = SUMSND + SAND(S) * SOILCBOT(S) SUMCLY = SUMCLY + CLAY(S) * SOILCBOT(S) IF(SOILCBOT(S).GE.CFRAC) THEN ! Find Dominant Category and fraction ISTI=S CFRAC=SOILCBOT(S) ENDIF ENDDO IF(TFRACBOT.GT.0.001) THEN AVS = SUMSND / TFRACBOT AVC = SUMCLY / TFRACBOT AVSLT = 100 - AVS - AVC IF(AVS.GT.(85.+ 0.5*AVC)) THEN AVCLASS= 'Sand' ISTI = 1 ELSE IF(AVS.GT.(70.+ AVC)) THEN AVCLASS= 'Lsan' ISTI = 2 ELSE IF((AVC.LT.20..AND.AVS.GT.52.) & .OR.(AVC.LE.7.5.AND.AVSLT.LT.50.)) THEN AVCLASS= 'Sloa' ISTI = 3 ELSE IF(AVC.LT.35..AND.AVS.GT.45..AND.AVSLT.LT.28.) THEN AVCLASS= 'Sclo' ISTI = 6 ELSE IF(AVC.GE.35..AND.AVS.GT.45.) THEN AVCLASS = 'Sacl' ISTI = 9 ELSE IF(AVC.LT.27.0.AND.AVSLT.LT.50.) THEN AVCLASS= 'Loam' ISTI = 5 ELSE IF(AVC.LT.12..AND.AVSLT.GT.80.) THEN AVCLASS = 'Silt' ISTI = 4 ELSE IF(AVC.LT.27.) THEN AVCLASS = 'Sill' ISTI = 4 ELSE IF(AVC.LT.40..AND.AVS.GT.20.) THEN AVCLASS = 'Cllo' ISTI = 8 ELSE IF(AVC.LT.40.) THEN AVCLASS = 'Sicl' ISTI = 7 ELSE IF(AVSLT.GE.40.) THEN AVCLASS = 'Sicy' ISTI = 10 ELSE AVCLASS = 'Clay' ISTI = 11 ENDIF ELSE ISTI=5 AVCLASS = TEXID(ISTI) ENDIF FWSAT =WSAT(ISTI) FWFC =WFC(ISTI) FWWLT =WWLT(ISTI) FB =B(ISTI) FCGSAT=CGSAT(ISTI) FJP =JP(ISTI) FAS =AS(ISTI) FC2R =C2R(ISTI) FC1SAT=C1SAT(ISTI) ENDIF ! Compute W2 using soil moisture availiability if pxlsm_smois_init (in namelist) is not zero IF (ITIMESTEP .EQ. 1 .AND. PXLSM_SMOIS_INIT .GT. 0) THEN W2 = FWWLT + (0.5*(FWSAT+FWFC) - FWWLT) * MAVAIL ENDIF END SUBROUTINE soilprop !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ SUBROUTINE PXSNOW (ITIMESTEP, ASNOW, CSNOW, SNOW, & 1 SNOWH, SNUP, & ALB, SNOALB, SHDFAC, SHDMIN, & HC_SNOW, SNOW_FRA, SNOWC, SNOWALB) !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ ! Pleim-Xiu LSM Simple Snow model !--------------------------------------------------------------------------------------------------- ! ITIMESTEP -- Model time step index ! ASNOW -- Analyzed snow water equivalent (mm) ! CSNOW -- Current snow water equivalent (mm) ! SNOW -- Snow water equivalent in model (mm) ! SNOWH -- Physical snow depth (m) ! SNUP -- Physical snow depth (landuse dependent) where when below, snow cover is fractional ! ! HC_SNOW -- Heat capacity of snow as a function of depth ! SNOW_FRA-- Factional snow area ! IFSNOW -- Snow flag ! SNOWALB -- Snow albedo !--------------------------------------------------------------------------------------------------- IMPLICIT NONE !--- Arguments REAL, PARAMETER :: W2SN_CONV = 10.0 REAL, PARAMETER :: CS_SNOWPACK = 2092.0 REAL, PARAMETER :: SALP = 2.6 !----------------------------------------------- INTEGER, INTENT(IN) :: ITIMESTEP REAL, INTENT(IN) :: ASNOW, CSNOW, SNUP, ALB, SNOALB, SHDFAC, SHDMIN REAL, INTENT(INOUT) :: SNOW, SNOWH, SNOWC REAL, INTENT(OUT) :: HC_SNOW, SNOW_FRA, SNOWALB !------------------------------------------------------------------------------------ !----------------------------------------------- ! Local variables !... Real REAL:: CONV_WAT2SNOW, CSNOWW, RHO_SNOWPACK, & LIQSN_RATIO, SNEQV, RSNOW !----------------------------------------------- SNEQV=ASNOW*0.001 ! Snow water in meters RHO_SNOWPACK = 450 ! Snowpack density (kg/m3), this should be computed in the future LIQSN_RATIO = DENW/RHO_SNOWPACK ! Ratio of water density and snowpack density CONV_WAT2SNOW = LIQSN_RATIO/1000 ! Conversion factor for snow liquid equiv. (mm) to snowpack (m) SNOW = ASNOW ! Set snow water to analysis value for now, implement a nudging scheme later SNOWH= SNOW * CONV_WAT2SNOW ! Conversion of snow water (mm) to snow depth (m) ! Is snow cover now present. The limit is 0.45 mm of water eqivalent or about 2 inches snow depth SNOWC = 0.0 IF (SNOWH .GT. 0.005) SNOWC = 1.0 HC_SNOW = RHO_SNOWPACK * CS_SNOWPACK * SNOWH IF (SNEQV < SNUP) THEN RSNOW = SNEQV / SNUP SNOW_FRA = 1. - ( EXP ( - SALP * RSNOW) - RSNOW * EXP ( - SALP)) ELSE SNOW_FRA = 1.0 END IF SNOWC = SNOW_FRA SNOWALB = ALB + SNOWC*(SNOALB-ALB) END SUBROUTINE pxsnow !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ END MODULE module_sf_pxlsm