/wrfv2_fire/phys/module_sf_gfs.F
FORTRAN Legacy | 1767 lines | 1103 code | 59 blank | 605 comment | 7 complexity | 14ab5460849b4731c1df6fb8bf02c89f MD5 | raw file
Possible License(s): AGPL-1.0
Large files files are truncated, but you can click here to view the full file
- !!WRF:MODEL_LAYER:PHYSICS
- !
- MODULE module_sf_gfs
- CONTAINS
- !-------------------------------------------------------------------
- SUBROUTINE SF_GFS(U3D,V3D,T3D,QV3D,P3D, &
- CP,ROVCP,R,XLV,PSFC,CHS,CHS2,CQS2,CPM, &
- ZNT,UST,PSIM,PSIH, &
- XLAND,HFX,QFX,LH,TSK,FLHC,FLQC, &
- QGH,QSFC,U10,V10, &
- GZ1OZ0,WSPD,BR,ISFFLX, &
- EP1,EP2,KARMAN,itimestep, &
- ids,ide, jds,jde, kds,kde, &
- ims,ime, jms,jme, kms,kme, &
- its,ite, jts,jte, kts,kte )
- !-------------------------------------------------------------------
- USE MODULE_GFS_MACHINE, ONLY : kind_phys
- USE MODULE_GFS_FUNCPHYS , ONLY : gfuncphys,fpvs
- !-------------------------------------------------------------------
- IMPLICIT NONE
- !-------------------------------------------------------------------
- !-- U3D 3D u-velocity interpolated to theta points (m/s)
- !-- V3D 3D v-velocity interpolated to theta points (m/s)
- !-- T3D temperature (K)
- !-- QV3D 3D water vapor mixing ratio (Kg/Kg)
- !-- P3D 3D pressure (Pa)
- !-- CP heat capacity at constant pressure for dry air (J/kg/K)
- !-- ROVCP R/CP
- !-- R gas constant for dry air (J/kg/K)
- !-- XLV latent heat of vaporization for water (J/kg)
- !-- PSFC surface pressure (Pa)
- !-- ZNT roughness length (m)
- !-- UST u* in similarity theory (m/s)
- !-- PSIM similarity stability function for momentum
- !-- PSIH similarity stability function for heat
- !-- XLAND land mask (1 for land, 2 for water)
- !-- HFX upward heat flux at the surface (W/m^2)
- !-- QFX upward moisture flux at the surface (kg/m^2/s)
- !-- LH net upward latent heat flux at surface (W/m^2)
- !-- TSK surface temperature (K)
- !-- FLHC exchange coefficient for heat (m/s)
- !-- FLQC exchange coefficient for moisture (m/s)
- !-- QGH lowest-level saturated mixing ratio
- !-- U10 diagnostic 10m u wind
- !-- V10 diagnostic 10m v wind
- !-- GZ1OZ0 log(z/z0) where z0 is roughness length
- !-- WSPD wind speed at lowest model level (m/s)
- !-- BR bulk Richardson number in surface layer
- !-- ISFFLX isfflx=1 for surface heat and moisture fluxes
- !-- EP1 constant for virtual temperature (R_v/R_d - 1) (dimensionless)
- !-- KARMAN Von Karman constant
- !-- 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
- !-- its start index for i in tile
- !-- ite end index for i in tile
- !-- 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
- !-------------------------------------------------------------------
- INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde, &
- ims,ime, jms,jme, kms,kme, &
- its,ite, jts,jte, kts,kte, &
- ISFFLX,itimestep
- REAL, INTENT(IN) :: &
- CP, &
- EP1, &
- EP2, &
- KARMAN, &
- R, &
- ROVCP, &
- XLV
- REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: &
- P3D, &
- QV3D, &
- T3D, &
- U3D, &
- V3D
- REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: &
- TSK, &
- PSFC, &
- XLAND
- REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: &
- UST, &
- ZNT
- REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: &
- BR, &
- CHS, &
- CHS2, &
- CPM, &
- CQS2, &
- FLHC, &
- FLQC, &
- GZ1OZ0, &
- HFX, &
- LH, &
- PSIM, &
- PSIH, &
- QFX, &
- QGH, &
- QSFC, &
- U10, &
- V10, &
- WSPD
- !--------------------------- LOCAL VARS ------------------------------
- REAL :: ESAT
- REAL (kind=kind_phys) :: &
- RHOX
- REAL (kind=kind_phys), DIMENSION(its:ite) :: &
- CH, &
- CM, &
- DDVEL, &
- DRAIN, &
- EP, &
- EVAP, &
- FH, &
- FH2, &
- FM, &
- HFLX, &
- PH, &
- PM, &
- PRSL1, &
- PRSLKI, &
- PS, &
- Q1, &
- Q2M, &
- QSS, &
- QSURF, &
- RB, &
- RCL, &
- RHO1, &
- SLIMSK, &
- STRESS, &
- T1, &
- T2M, &
- THGB, &
- THX, &
- TSKIN, &
- SHELEG, &
- U1, &
- U10M, &
- USTAR, &
- V1, &
- V10M, &
- WIND, &
- Z0RL, &
- Z1
- INTEGER :: &
- I, &
- IM, &
- J, &
- K, &
- KM
- if(itimestep.eq.0) then
- CALL GFUNCPHYS
- endif
- IM=ITE-ITS+1
- KM=KTE-KTS+1
- DO J=jts,jte
- DO i=its,ite
- DDVEL(I)=0.
- RCL(i)=1.
- PRSL1(i)=P3D(i,kts,j)*.001
- PS(i)=PSFC(i,j)*.001
- Q1(I) = QV3D(i,kts,j)
- ! QSURF(I)=QSFC(I,J)
- QSURF(I)=0.
- SHELEG(I)=0.
- SLIMSK(i)=ABS(XLAND(i,j)-2.)
- TSKIN(i)=TSK(i,j)
- T1(I) = T3D(i,kts,j)
- U1(I) = U3D(i,kts,j)
- USTAR(I) = UST(i,j)
- V1(I) = V3D(i,kts,j)
- Z0RL(I) = ZNT(i,j)*100.
- ENDDO
- DO i=its,ite
- PRSLKI(i)=(PS(I)/PRSL1(I))**ROVCP
- THGB(I)=TSKIN(i)*(100./PS(I))**ROVCP
- THX(I)=T1(i)*(100./PRSL1(I))**ROVCP
- RHO1(I)=PRSL1(I)*1000./(R*T1(I)*(1.+EP1*Q1(I)))
- Q1(I)=Q1(I)/(1.+Q1(I))
- ENDDO
- CALL PROGTM(IM,KM,PS,U1,V1,T1,Q1, &
- SHELEG,TSKIN,QSURF, &
- !WRF SMC,STC,DM,SOILTYP,SIGMAF,VEGTYPE,CANOPY,DLWFLX, &
- !WRF SLRAD,SNOWMT,DELT, &
- Z0RL, &
- !WRF TG3,GFLUX,F10M, &
- U10M,V10M,T2M,Q2M, &
- !WRF ZSOIL, &
- CM,CH,RB, &
- !WRF RHSCNPY,RHSMC,AIM,BIM,CIM, &
- RCL,PRSL1,PRSLKI,SLIMSK, &
- DRAIN,EVAP,HFLX,STRESS,EP, &
- FM,FH,USTAR,WIND,DDVEL, &
- PM,PH,FH2,QSS,Z1 )
- DO i=its,ite
- U10(i,j)=U10M(i)
- V10(i,j)=V10M(i)
- BR(i,j)=RB(i)
- CHS(I,J)=CH(I)*WIND(I)
- CHS2(I,J)=USTAR(I)*KARMAN/FH2(I)
- CPM(I,J)=CP*(1.+0.8*QV3D(i,kts,j))
- esat = fpvs(t1(i))
- QGH(I,J)=ep2*esat/(1000.*ps(i)-esat)
- QSFC(I,J)=qss(i)
- PSIH(i,j)=PH(i)
- PSIM(i,j)=PM(i)
- UST(i,j)=ustar(i)
- WSPD(i,j)=WIND(i)
- ZNT(i,j)=Z0RL(i)*.01
- ENDDO
- DO i=its,ite
- FLHC(i,j)=CPM(I,J)*RHO1(I)*CHS(I,J)
- FLQC(i,j)=RHO1(I)*CHS(I,J)
- GZ1OZ0(i,j)=LOG(Z1(I)/(Z0RL(I)*.01))
- CQS2(i,j)=CHS2(I,J)
- ENDDO
- IF (ISFFLX.EQ.0) THEN
- DO i=its,ite
- HFX(i,j)=0.
- LH(i,j)=0.
- QFX(i,j)=0.
- ENDDO
- ELSE
- DO i=its,ite
- IF(XLAND(I,J)-1.5.GT.0.)THEN
- HFX(I,J)=FLHC(I,J)*(THGB(I)-THX(I))
- ELSEIF(XLAND(I,J)-1.5.LT.0.)THEN
- HFX(I,J)=FLHC(I,J)*(THGB(I)-THX(I))
- HFX(I,J)=AMAX1(HFX(I,J),-250.)
- ENDIF
- QFX(I,J)=FLQC(I,J)*(QSFC(I,J)-Q1(I))
- QFX(I,J)=AMAX1(QFX(I,J),0.)
- LH(I,J)=XLV*QFX(I,J)
- ENDDO
- ENDIF
- ENDDO
- END SUBROUTINE SF_GFS
- !-------------------------------------------------------------------
- SUBROUTINE PROGTM(IM,KM,PS,U1,V1,T1,Q1, &
- & SHELEG,TSKIN,QSURF, &
- !WRF & SMC,STC,DM,SOILTYP,SIGMAF,VEGTYPE,CANOPY, &
- !WRF & DLWFLX,SLRAD,SNOWMT,DELT, &
- & Z0RL, &
- !WRF & TG3,GFLUX,F10M, &
- & U10M,V10M,T2M,Q2M, &
- !WRF & ZSOIL, &
- & CM, CH, RB, &
- !WRF & RHSCNPY,RHSMC,AIM,BIM,CIM, &
- & RCL,PRSL1,PRSLKI,SLIMSK, &
- & DRAIN,EVAP,HFLX,STRESS,EP, &
- & FM,FH,USTAR,WIND,DDVEL, &
- & PM,PH,FH2,QSS,Z1 )
- !
- USE MODULE_GFS_MACHINE, ONLY : kind_phys
- USE MODULE_GFS_FUNCPHYS, ONLY : fpvs
- USE MODULE_GFS_PHYSCONS, grav => con_g, SBC => con_sbc, HVAP => con_HVAP &
- &, CP => con_CP, HFUS => con_HFUS, JCAL => con_JCAL &
- &, EPS => con_eps, EPSM1 => con_epsm1, t0c => con_t0c &
- &, RVRDM1 => con_FVirt, RD => con_RD
- implicit none
- !
- ! include 'constant.h'
- !
- integer IM, km
- !
- real(kind=kind_phys), parameter :: cpinv=1.0/cp, HVAPI=1.0/HVAP
- real(kind=kind_phys) DELT
- INTEGER SOILTYP(IM), VEGTYPE(IM)
- real(kind=kind_phys) PS(IM), U1(IM), V1(IM), &
- & T1(IM), Q1(IM), SHELEG(IM), &
- & TSKIN(IM), QSURF(IM), SMC(IM,KM), &
- & STC(IM,KM), DM(IM), SIGMAF(IM), &
- & CANOPY(IM), DLWFLX(IM), SLRAD(IM), &
- & SNOWMT(IM), Z0RL(IM), TG3(IM), &
- & GFLUX(IM), F10M(IM), U10M(IM), &
- & V10M(IM), T2M(IM), Q2M(IM), &
- & ZSOIL(IM,KM), CM(IM), CH(IM), &
- & RB(IM), RHSCNPY(IM), RHSMC(IM,KM), &
- & AIM(IM,KM), BIM(IM,KM), CIM(IM,KM), &
- & RCL(IM), PRSL1(IM), PRSLKI(IM), &
- & SLIMSK(IM), DRAIN(IM), EVAP(IM), &
- & HFLX(IM), RNET(IM), EP(IM), &
- & FM(IM), FH(IM), USTAR(IM), &
- & WIND(IM), DDVEL(IM), STRESS(IM)
- !
- ! Locals
- !
- integer k,i
- !
- real(kind=kind_phys) CANFAC(IM), &
- & DDZ(IM), DDZ2(IM), DELTA(IM), &
- & DEW(IM), DF1(IM), DFT0(IM), &
- & DFT2(IM), DFT1(IM), &
- & DMDZ(IM), DMDZ2(IM), DTDZ1(IM), &
- & DTDZ2(IM), DTV(IM), EC(IM), &
- & EDIR(IM), ETPFAC(IM), &
- & FACTSNW(IM), FH2(IM), FM10(IM), &
- & FX(IM), GX(IM), &
- & HCPCT(IM), HL1(IM), HL12(IM), &
- & HLINF(IM), PARTLND(IM), PH(IM), &
- & PH2(IM), PM(IM), PM10(IM), &
- & PSURF(IM), Q0(IM), QS1(IM), &
- & QSS(IM), RAT(IM), RCAP(IM), &
- & RCH(IM), RHO(IM), RS(IM), &
- & RSMALL(IM), SLWD(IM), SMCZ(IM), &
- & SNET(IM), SNOEVP(IM), SNOWD(IM), &
- & T1O(IM), T2MO(IM), TERM1(IM), &
- & TERM2(IM), THETA1(IM), THV1(IM), &
- & TREF(IM), TSURF(IM), TV1(IM), &
- & TVS(IM), TSURFO(IM), TWILT(IM), &
- & XX(IM), XRCL(IM), YY(IM), &
- & Z0(IM), Z0MAX(IM), Z1(IM), &
- & ZTMAX(IM), ZZ(IM), PS1(IM)
- !
- real(kind=kind_phys) a0, a0p, a1, a1p, aa, aa0, &
- & aa1, adtv, alpha, arnu, b1, b1p, &
- & b2, b2p, bb, bb0, bb1, bb2, &
- & bfact, ca, cc, cc1, cc2, cfactr, &
- & ch2o, charnock, cice, convrad, cq, csoil, &
- & ctfil1,ctfil2, delt2, df2, dfsnow, &
- & elocp, eth, ff, FMS, &
- !WRF & fhs, funcdf, funckt,g, hl0, hl0inf, &
- & fhs, g, hl0, hl0inf, &
- & hl110, hlt, hltinf,OLINF, rcq, rcs, &
- & rct, restar, rhoh2o,rnu, RSI, &
- & rss, scanop, sig2k, sigma, smcdry, &
- & t12, t14, tflx, tgice, topt, &
- & val, vis, zbot, snomin, tem
- !
- !
- PARAMETER (CHARNOCK=.014,CA=.4)!C CA IS THE VON KARMAN CONSTANT
- PARAMETER (G=grav,sigma=sbc)
- PARAMETER (ALPHA=5.,A0=-3.975,A1=12.32,B1=-7.755,B2=6.041)
- PARAMETER (A0P=-7.941,A1P=24.75,B1P=-8.705,B2P=7.899,VIS=1.4E-5)
- PARAMETER (AA1=-1.076,BB1=.7045,CC1=-.05808)
- PARAMETER (BB2=-.1954,CC2=.009999)
- PARAMETER (ELOCP=HVAP/CP,DFSNOW=.31,CH2O=4.2E6,CSOIL=1.26E6)
- PARAMETER (SCANOP=.5,CFACTR=.5,ZBOT=-3.,TGICE=271.2)
- PARAMETER (CICE=1880.*917.,topt=298.)
- PARAMETER (RHOH2O=1000.,CONVRAD=JCAL*1.E4/60.)
- PARAMETER (CTFIL1=.5,CTFIL2=1.-CTFIL1)
- PARAMETER (RNU=1.51E-5,ARNU=.135*RNU)
- parameter (snomin=1.0e-9)
- !
- LOGICAL FLAG(IM), FLAGSNW(IM)
- !WRF real(kind=kind_phys) KT1(IM), KT2(IM), KTSOIL, &
- real(kind=kind_phys) KT1(IM), KT2(IM), &
- & ET(IM,KM), &
- & STSOIL(IM,KM), AI(IM,KM), BI(IM,KM), &
- & CI(IM,KM), RHSTC(IM,KM)
- real(kind=kind_phys) rsmax(13), rgl(13), rsmin(13), hs(13), &
- & smmax(9), smdry(9), smref(9), smwlt(9)
- !
- ! the 13 vegetation types are:
- !
- ! 1 ... broadleave-evergreen trees (tropical forest)
- ! 2 ... broadleave-deciduous trees
- ! 3 ... broadleave and needle leave trees (mixed forest)
- ! 4 ... needleleave-evergreen trees
- ! 5 ... needleleave-deciduous trees (larch)
- ! 6 ... broadleave trees with groundcover (savanna)
- ! 7 ... groundcover only (perenial)
- ! 8 ... broadleave shrubs with perenial groundcover
- ! 9 ... broadleave shrubs with bare soil
- ! 10 ... dwarf trees and shrubs with ground cover (trunda)
- ! 11 ... bare soil
- ! 12 ... cultivations (use parameters from type 7)
- ! 13 ... glacial
- !
- data rsmax/13*5000./
- data rsmin/150.,100.,125.,150.,100.,70.,40., &
- & 300.,400.,150.,999.,40.,999./
- data rgl/5*30.,65.,4*100.,999.,100.,999./
- data hs/41.69,54.53,51.93,47.35,47.35,54.53,36.35, &
- & 3*42.00,999.,36.35,999./
- data smmax/.421,.464,.468,.434,.406,.465,.404,.439,.421/
- data smdry/.07,.14,.22,.08,.18,.16,.12,.10,.07/
- data smref/.283,.387,.412,.312,.338,.382,.315,.329,.283/
- data smwlt/.029,.119,.139,.047,.010,.103,.069,.066,.029/
- !
- !!! save rsmax, rsmin, rgl, hs, smmax, smdry, smref, smwlt
- !
- !WRF DELT2 = DELT * 2.
- !
- ! ESTIMATE SIGMA ** K AT 2 M
- !
- SIG2K = 1. - 4. * G * 2. / (CP * 280.)
- !
- ! INITIALIZE VARIABLES. ALL UNITS ARE SUPPOSEDLY M.K.S. UNLESS SPECIFIE
- ! PSURF IS IN PASCALS
- ! WIND IS WIND SPEED, THETA1 IS ADIABATIC SURFACE TEMP FROM LEVEL 1
- ! RHO IS DENSITY, QS1 IS SAT. HUM. AT LEVEL1 AND QSS IS SAT. HUM. AT
- ! SURFACE
- ! CONVERT SLRAD TO THE CIVILIZED UNIT FROM LANGLEY MINUTE-1 K-4
- ! SURFACE ROUGHNESS LENGTH IS CONVERTED TO M FROM CM
- !
- !!
- ! qs1 = fpvs(t1)
- ! qss = fpvs(tskin)
- DO I=1,IM
- XRCL(I) = SQRT(RCL(I))
- PSURF(I) = 1000. * PS(I)
- PS1(I) = 1000. * PRSL1(I)
- ! SLWD(I) = SLRAD(I) * CONVRAD
- !WRF SLWD(I) = SLRAD(I)
- !
- ! DLWFLX has been given a negative sign for downward longwave
- ! snet is the net shortwave flux
- !
- !WRF SNET(I) = -SLWD(I) - DLWFLX(I)
- WIND(I) = XRCL(I) * SQRT(U1(I) * U1(I) + V1(I) * V1(I)) &
- & + MAX(0.0_kind_phys, MIN(DDVEL(I), 30.0_kind_phys))
- WIND(I) = MAX(WIND(I),1._kind_phys)
- Q0(I) = MAX(Q1(I),1.E-8_kind_phys)
- TSURF(I) = TSKIN(I)
- THETA1(I) = T1(I) * PRSLKI(I)
- TV1(I) = T1(I) * (1. + RVRDM1 * Q0(I))
- THV1(I) = THETA1(I) * (1. + RVRDM1 * Q0(I))
- TVS(I) = TSURF(I) * (1. + RVRDM1 * Q0(I))
- RHO(I) = PS1(I) / (RD * TV1(I))
- !jfe QS1(I) = 1000. * FPVS(T1(I))
- qs1(i) = fpvs(t1(i))
- QS1(I) = EPS * QS1(I) / (PS1(I) + EPSM1 * QS1(I))
- QS1(I) = MAX(QS1(I), 1.E-8_kind_phys)
- Q0(I) = min(QS1(I),Q0(I))
- !jfe QSS(I) = 1000. * FPVS(TSURF(I))
- qss(i) = fpvs(tskin(i))
- QSS(I) = EPS * QSS(I) / (PSURF(I) + EPSM1 * QSS(I))
- ! RS = PLANTR
- RS(I) = 0.
- !WRF if(VEGTYPE(I).gt.0.) RS(I) = rsmin(VEGTYPE(I))
- Z0(I) = .01 * Z0RL(i)
- !WRF CANOPY(I)= MAX(CANOPY(I),0._kind_phys)
- DM(I) = 1.
- !WRF
- GOTO 1111
- !WRF
- FACTSNW(I) = 10.
- IF(SLIMSK(I).EQ.2.) FACTSNW(I) = 3.
- !
- ! SNOW DEPTH IN WATER EQUIVALENT IS CONVERTED FROM MM TO M UNIT
- !
- SNOWD(I) = SHELEG(I) / 1000.
- FLAGSNW(I) = .FALSE.
- !
- ! WHEN SNOW DEPTH IS LESS THAN 1 MM, A PATCHY SNOW IS ASSUMED AND
- ! SOIL IS ALLOWED TO INTERACT WITH THE ATMOSPHERE.
- ! WE SHOULD EVENTUALLY MOVE TO A LINEAR COMBINATION OF SOIL AND
- ! SNOW UNDER THE CONDITION OF PATCHY SNOW.
- !
- IF(SNOWD(I).GT..001.OR.SLIMSK(I).EQ.2.) RS(I) = 0.
- IF(SNOWD(I).GT..001) FLAGSNW(I) = .TRUE.
- !##DG IF(LAT.EQ.LATD) THEN
- !##DG PRINT *, ' WIND,TV1,TVS,Q1,QS1,SNOW,SLIMSK=',
- !##DG& WIND,TV1,TVS,Q1,QS1,SNOWD,SLIMSK
- !##DG PRINT *, ' SNET, SLWD =', SNET, SLWD(I)
- !##DG ENDIF
- IF(SLIMSK(I).EQ.0.) THEN
- ZSOIL(I,1) = 0.
- ELSEIF(SLIMSK(I).EQ.1.) THEN
- ZSOIL(I,1) = -.10
- ELSE
- ZSOIL(I,1) = -3. / KM
- ENDIF
- !WRF
- 1111 CONTINUE
- !WRF
- ENDDO
- !!
- !WRF
- GOTO 2222
- !WRF
- DO K = 2, KM
- DO I=1,IM
- IF(SLIMSK(I).EQ.0.) THEN
- ZSOIL(I,K) = 0.
- ELSEIF(SLIMSK(I).EQ.1.) THEN
- ZSOIL(I,K) = ZSOIL(I,K-1) &
- & + (-2. - ZSOIL(I,1)) / (KM - 1)
- ELSE
- ZSOIL(I,K) = - 3. * FLOAT(K) / FLOAT(KM)
- ENDIF
- ENDDO
- ENDDO
- !WRF
- 2222 CONTINUE
- !WRF
- !!
- DO I=1,IM
- Z1(I) = -RD * TV1(I) * LOG(PS1(I)/PSURF(I)) / G
- DRAIN(I) = 0.
- ENDDO
- !!
- DO K = 1, KM
- DO I=1,IM
- ET(I,K) = 0.
- RHSMC(I,K) = 0.
- AIM(I,K) = 0.
- BIM(I,K) = 1.
- CIM(I,K) = 0.
- STSOIL(I,K) = STC(I,K)
- ENDDO
- ENDDO
- DO I=1,IM
- EDIR(I) = 0.
- EC(I) = 0.
- EVAP(I) = 0.
- EP(I) = 0.
- SNOWMT(I) = 0.
- GFLUX(I) = 0.
- RHSCNPY(I) = 0.
- FX(I) = 0.
- ETPFAC(I) = 0.
- CANFAC(I) = 0.
- ENDDO
- !
- ! COMPUTE STABILITY DEPENDENT EXCHANGE COEFFICIENTS
- !
- ! THIS PORTION OF THE CODE IS PRESENTLY SUPPRESSED
- !
- DO I=1,IM
- IF(SLIMSK(I).EQ.0.) THEN
- USTAR(I) = SQRT(G * Z0(I) / CHARNOCK)
- ENDIF
- !
- ! COMPUTE STABILITY INDICES (RB AND HLINF)
- !
- Z0MAX(I) = MIN(Z0(I),0.1 * Z1(I))
- ZTMAX(I) = Z0MAX(I)
- IF(SLIMSK(I).EQ.0.) THEN
- RESTAR = USTAR(I) * Z0MAX(I) / VIS
- RESTAR = MAX(RESTAR,.000001_kind_phys)
- ! RESTAR = ALOG(RESTAR)
- ! RESTAR = MIN(RESTAR,5.)
- ! RESTAR = MAX(RESTAR,-5.)
- ! RAT(I) = AA1 + BB1 * RESTAR + CC1 * RESTAR ** 2
- ! RAT(I) = RAT(I) / (1. + BB2 * RESTAR
- ! & + CC2 * RESTAR ** 2)
- ! Rat taken from Zeng, Zhao and Dickinson 1997
- RAT(I) = 2.67 * restar ** .25 - 2.57
- RAT(I) = min(RAT(I),7._kind_phys)
- ZTMAX(I) = Z0MAX(I) * EXP(-RAT(I))
- ENDIF
- ENDDO
- !##DG IF(LAT.EQ.LATD) THEN
- !##DG PRINT *, ' z0max, ztmax, restar, RAT(I) =',
- !##DG & z0max, ztmax, restar, RAT(I)
- !##DG ENDIF
- DO I = 1, IM
- DTV(I) = THV1(I) - TVS(I)
- ADTV = ABS(DTV(I))
- ADTV = MAX(ADTV,.001_kind_phys)
- DTV(I) = SIGN(1._kind_phys,DTV(I)) * ADTV
- RB(I) = G * DTV(I) * Z1(I) / (.5 * (THV1(I) + TVS(I)) &
- & * WIND(I) * WIND(I))
- RB(I) = MAX(RB(I),-5000._kind_phys)
- ! FM(I) = LOG((Z0MAX(I)+Z1(I)) / Z0MAX(I))
- ! FH(I) = LOG((ZTMAX(I)+Z1(I)) / ZTMAX(I))
- FM(I) = LOG((Z1(I)) / Z0MAX(I))
- FH(I) = LOG((Z1(I)) / ZTMAX(I))
- HLINF(I) = RB(I) * FM(I) * FM(I) / FH(I)
- FM10(I) = LOG((Z0MAX(I)+10.) / Z0MAX(I))
- FH2(I) = LOG((ZTMAX(I)+2.) / ZTMAX(I))
- ENDDO
- !##DG IF(LAT.EQ.LATD) THEN
- !##DG PRINT *, ' DTV, RB(I), FM(I), FH(I), HLINF =',
- !##DG & dtv, rb, FM(I), FH(I), hlinf
- !##DG ENDIF
- !
- ! STABLE CASE
- !
- DO I = 1, IM
- IF(DTV(I).GE.0.) THEN
- HL1(I) = HLINF(I)
- ENDIF
- IF(DTV(I).GE.0..AND.HLINF(I).GT..25) THEN
- HL0INF = Z0MAX(I) * HLINF(I) / Z1(I)
- HLTINF = ZTMAX(I) * HLINF(I) / Z1(I)
- AA = SQRT(1. + 4. * ALPHA * HLINF(I))
- AA0 = SQRT(1. + 4. * ALPHA * HL0INF)
- BB = AA
- BB0 = SQRT(1. + 4. * ALPHA * HLTINF)
- PM(I) = AA0 - AA + LOG((AA + 1.) / (AA0 + 1.))
- PH(I) = BB0 - BB + LOG((BB + 1.) / (BB0 + 1.))
- FMS = FM(I) - PM(I)
- FHS = FH(I) - PH(I)
- HL1(I) = FMS * FMS * RB(I) / FHS
- ENDIF
- ENDDO
- !
- ! SECOND ITERATION
- !
- DO I = 1, IM
- IF(DTV(I).GE.0.) THEN
- HL0 = Z0MAX(I) * HL1(I) / Z1(I)
- HLT = ZTMAX(I) * HL1(I) / Z1(I)
- AA = SQRT(1. + 4. * ALPHA * HL1(I))
- AA0 = SQRT(1. + 4. * ALPHA * HL0)
- BB = AA
- BB0 = SQRT(1. + 4. * ALPHA * HLT)
- PM(I) = AA0 - AA + LOG((AA + 1.) / (AA0 + 1.))
- PH(I) = BB0 - BB + LOG((BB + 1.) / (BB0 + 1.))
- HL110 = HL1(I) * 10. / Z1(I)
- AA = SQRT(1. + 4. * ALPHA * HL110)
- PM10(I) = AA0 - AA + LOG((AA + 1.) / (AA0 + 1.))
- HL12(I) = HL1(I) * 2. / Z1(I)
- ! AA = SQRT(1. + 4. * ALPHA * HL12(I))
- BB = SQRT(1. + 4. * ALPHA * HL12(I))
- PH2(I) = BB0 - BB + LOG((BB + 1.) / (BB0 + 1.))
- ENDIF
- ENDDO
- !!
- !##DG IF(LAT.EQ.LATD) THEN
- !##DG PRINT *, ' HL1(I), PM, PH =',
- !##DG & HL1(I), pm, ph
- !##DG ENDIF
- !
- ! UNSTABLE CASE
- !
- !
- ! CHECK FOR UNPHYSICAL OBUKHOV LENGTH
- !
- DO I=1,IM
- IF(DTV(I).LT.0.) THEN
- OLINF = Z1(I) / HLINF(I)
- IF(ABS(OLINF).LE.50. * Z0MAX(I)) THEN
- HLINF(I) = -Z1(I) / (50. * Z0MAX(I))
- ENDIF
- ENDIF
- ENDDO
- !
- ! GET PM AND PH
- !
- DO I = 1, IM
- IF(DTV(I).LT.0..AND.HLINF(I).GE.-.5) THEN
- HL1(I) = HLINF(I)
- PM(I) = (A0 + A1 * HL1(I)) * HL1(I) &
- & / (1. + B1 * HL1(I) + B2 * HL1(I) * HL1(I))
- PH(I) = (A0P + A1P * HL1(I)) * HL1(I) &
- & / (1. + B1P * HL1(I) + B2P * HL1(I) * HL1(I))
- HL110 = HL1(I) * 10. / Z1(I)
- PM10(I) = (A0 + A1 * HL110) * HL110 &
- & / (1. + B1 * HL110 + B2 * HL110 * HL110)
- HL12(I) = HL1(I) * 2. / Z1(I)
- PH2(I) = (A0P + A1P * HL12(I)) * HL12(I) &
- & / (1. + B1P * HL12(I) + B2P * HL12(I) * HL12(I))
- ENDIF
- IF(DTV(I).LT.0.AND.HLINF(I).LT.-.5) THEN
- HL1(I) = -HLINF(I)
- PM(I) = LOG(HL1(I)) + 2. * HL1(I) ** (-.25) - .8776
- PH(I) = LOG(HL1(I)) + .5 * HL1(I) ** (-.5) + 1.386
- HL110 = HL1(I) * 10. / Z1(I)
- PM10(I) = LOG(HL110) + 2. * HL110 ** (-.25) - .8776
- HL12(I) = HL1(I) * 2. / Z1(I)
- PH2(I) = LOG(HL12(I)) + .5 * HL12(I) ** (-.5) + 1.386
- ENDIF
- ENDDO
- !
- ! FINISH THE EXCHANGE COEFFICIENT COMPUTATION TO PROVIDE FM AND FH
- !
- DO I = 1, IM
- FM(I) = FM(I) - PM(I)
- FH(I) = FH(I) - PH(I)
- FM10(I) = FM10(I) - PM10(I)
- FH2(I) = FH2(I) - PH2(I)
- CM(I) = CA * CA / (FM(I) * FM(I))
- CH(I) = CA * CA / (FM(I) * FH(I))
- CQ = CH(I)
- STRESS(I) = CM(I) * WIND(I) * WIND(I)
- USTAR(I) = SQRT(STRESS(I))
- ! USTAR(I) = SQRT(CM(I) * WIND(I) * WIND(I))
- ENDDO
- !##DG IF(LAT.EQ.LATD) THEN
- !##DG PRINT *, ' FM, FH, CM, CH(I), USTAR =',
- !##DG & FM, FH, CM, ch, USTAR
- !##DG ENDIF
- !
- ! UPDATE Z0 OVER OCEAN
- !
- DO I = 1, IM
- IF(SLIMSK(I).EQ.0.) THEN
- Z0(I) = (CHARNOCK / G) * USTAR(I) ** 2
- ! NEW IMPLEMENTATION OF Z0
- ! CC = USTAR(I) * Z0 / RNU
- ! PP = CC / (1. + CC)
- ! FF = G * ARNU / (CHARNOCK * USTAR(I) ** 3)
- ! Z0 = ARNU / (USTAR(I) * FF ** PP)
- Z0(I) = MIN(Z0(I),.1_kind_phys)
- Z0(I) = MAX(Z0(I),1.E-7_kind_phys)
- Z0RL(I) = 100. * Z0(I)
- ENDIF
- ENDDO
- GOTO 5555
- !
- ! RCP = RHO CP CH V
- !
- DO I = 1, IM
- RCH(I) = RHO(I) * CP * CH(I) * WIND(I)
- ENDDO
- !
- ! SENSIBLE AND LATENT HEAT FLUX OVER OPEN WATER
- !
- DO I = 1, IM
- IF(SLIMSK(I).EQ.0.) THEN
- EVAP(I) = ELOCP * RCH(I) * (QSS(I) - Q1(I))
- DM(I) = 1.
- QSURF(I) = QSS(I)
- ENDIF
- ENDDO
- !
- ! COMPUTE SOIL/SNOW/ICE HEAT FLUX IN PREPARATION FOR SURFACE ENERGY
- ! BALANCE CALCULATION
- !
- DO I = 1, IM
- GFLUX(I) = 0.
- IF(SLIMSK(I).EQ.1.) THEN
- SMCZ(I) = .5 * (SMC(I,1) + .20)
- DFT0(I) = KTSOIL(SMCZ(I),SOILTYP(I))
- ELSEIF(SLIMSK(I).EQ.2.) THEN
- ! DF FOR ICE IS TAKEN FROM MAYKUT AND UNTERSTEINER
- ! DF IS IN SI UNIT OF W K-1 M-1
- DFT0(I) = 2.2
- ENDIF
- ENDDO
- !!
- DO I=1,IM
- IF(SLIMSK(I).NE.0.) THEN
- ! IF(SNOWD(I).GT..001) THEN
- IF(FLAGSNW(I)) THEN
- !
- ! WHEN SNOW COVERED, GROUND HEAT FLUX COMES FROM SNOW
- !
- TFLX = MIN(T1(I), TSURF(I))
- GFLUX(I) = -DFSNOW * (TFLX - STSOIL(I,1)) &
- & / (FACTSNW(I) * MAX(SNOWD(I),.001_kind_phys))
- ELSE
- GFLUX(I) = DFT0(I) * (STSOIL(I,1) - TSURF(I)) &
- & / (-.5 * ZSOIL(I,1))
- ENDIF
- GFLUX(I) = MAX(GFLUX(I),-200._kind_phys)
- GFLUX(I) = MIN(GFLUX(I),+200._kind_phys)
- ENDIF
- ENDDO
- DO I = 1, IM
- FLAG(I) = SLIMSK(I).NE.0.
- PARTLND(I) = 1.
- IF(SNOWD(I).GT.0..AND.SNOWD(I).LE..001) THEN
- PARTLND(I) = 1. - SNOWD(I) / .001
- ENDIF
- ENDDO
- DO I = 1, IM
- SNOEVP(I) = 0.
- if(SNOWD(I).gt..001) PARTLND(I) = 0.
- ENDDO
- !
- ! COMPUTE POTENTIAL EVAPORATION FOR LAND AND SEA ICE
- !
- DO I = 1, IM
- IF(FLAG(I)) THEN
- T12 = T1(I) * T1(I)
- T14 = T12 * T12
- !
- ! RCAP = FNET - SIGMA T**4 + GFLX - RHO CP CH V (T1-THETA1)
- !
- RCAP(I) = -SLWD(I) - SIGMA * T14 + GFLUX(I) &
- & - RCH(I) * (T1(I) - THETA1(I))
- !
- ! RSMALL = 4 SIGMA T**3 / RCH(I) + 1
- !
- RSMALL(I) = 4. * SIGMA * T1(I) * T12 / RCH(I) + 1.
- !
- ! DELTA = L / CP * DQS/DT
- !
- DELTA(I) = ELOCP * EPS * HVAP * QS1(I) / (RD * T12)
- !
- ! POTENTIAL EVAPOTRANSPIRATION ( WATTS / M**2 ) AND
- ! POTENTIAL EVAPORATION
- !
- TERM1(I) = ELOCP * RSMALL(I) * RCH(I)*(QS1(I)-Q0(I))
- TERM2(I) = RCAP(I) * DELTA(I)
- EP(I) = (ELOCP * RSMALL(I) * RCH(I) * (QS1(I) - Q0(I)) &
- & + RCAP(I) * DELTA(I))
- EP(I) = EP(I) / (RSMALL(I) + DELTA(I))
- ENDIF
- ENDDO
- !
- ! ACTUAL EVAPORATION OVER LAND IN THREE PARTS : EDIR, ET, AND EC
- !
- ! DIRECT EVAPORATION FROM SOIL, THE UNIT GOES FROM M S-1 TO KG M-2 S-1
- !
- DO I = 1, IM
- FLAG(I) = SLIMSK(I).EQ.1..AND.EP(I).GT.0.
- ENDDO
- DO I = 1, IM
- IF(FLAG(I)) THEN
- DF1(I) = FUNCDF(SMC(I,1),SOILTYP(I))
- KT1(I) = FUNCKT(SMC(I,1),SOILTYP(I))
- endif
- if(FLAG(I).and.STC(I,1).lt.t0c) then
- DF1(I) = 0.
- KT1(I) = 0.
- endif
- IF(FLAG(I)) THEN
- ! TREF = .75 * THSAT(SOILTYP(I))
- TREF(I) = smref(SOILTYP(I))
- ! TWILT = TWLT(SOILTYP(I))
- TWILT(I) = smwlt(SOILTYP(I))
- smcdry = smdry(SOILTYP(I))
- ! FX(I) = -2. * DF1(I) * (SMC(I,1) - .23) / ZSOIL(I,1)
- ! & - KT1(I)
- FX(I) = -2. * DF1(I) * (SMC(I,1) - smcdry) / ZSOIL(I,1) &
- & - KT1(I)
- FX(I) = MIN(FX(I), EP(I)/HVAP)
- FX(I) = MAX(FX(I),0._kind_phys)
- !
- ! SIGMAF IS THE FRACTION OF AREA COVERED BY VEGETATION
- !
- EDIR(I) = FX(I) * (1. - SIGMAF(I)) * PARTLND(I)
- ENDIF
- ENDDO
- !
- ! calculate stomatal resistance
- !
- DO I = 1, IM
- if(FLAG(I)) then
- !
- ! resistance due to PAR. We use net solar flux as proxy at the present time
- !
- ff = .55 * 2. * SNET(I) / rgl(VEGTYPE(I))
- rcs = (ff + RS(I)/rsmax(VEGTYPE(I))) / (1. + ff)
- rcs = max(rcs,.0001_kind_phys)
- rct = 1.
- rcq = 1.
- !
- ! resistance due to thermal effect
- !
- ! rct = 1. - .0016 * (topt - theta1) ** 2
- ! rct = max(rct,.0001)
- !
- ! resistance due to humidity
- !
- ! rcq = 1. / (1. + hs(VEGTYPE(I)) * (QS1(I) - Q0(I)))
- ! rcq = max(rcq,.0001)
- !
- ! compute resistance without the effect of soil moisture
- !
- RS(I) = RS(I) / (rcs * rct * rcq)
- endif
- ENDDO
- !
- ! TRANSPIRATION FROM ALL LEVELS OF THE SOIL
- !
- DO I = 1, IM
- IF(FLAG(I)) THEN
- CANFAC(I) = (CANOPY(I) / SCANOP) ** CFACTR
- endif
- IF(FLAG(I)) THEN
- ETPFAC(I) = SIGMAF(I) &
- & * (1. - CANFAC(I)) / HVAP
- GX(I) = (SMC(I,1) - TWILT(I)) / (TREF(I) - TWILT(I))
- GX(I) = MAX(GX(I),0._kind_phys)
- GX(I) = MIN(GX(I),1._kind_phys)
- !
- ! resistance due to soil moisture deficit
- !
- rss = GX(I) * (ZSOIL(I,1) / ZSOIL(I,km))
- rss = max(rss,.0001_kind_phys)
- RSI = RS(I) / rss
- !
- ! transpiration a la Monteith
- !
- eth = (TERM1(I) + TERM2(I)) / &
- & (DELTA(I) + RSMALL(I) * (1. + RSI * CH(I) * WIND(I)))
- ET(I,1) = ETPFAC(I) * eth &
- & * PARTLND(I)
- ENDIF
- ENDDO
- !!
- DO K = 2, KM
- DO I=1,IM
- IF(FLAG(I)) THEN
- GX(I) = (SMC(I,K) - TWILT(I)) / (TREF(I) - TWILT(I))
- GX(I) = MAX(GX(I),0._kind_phys)
- GX(I) = MIN(GX(I),1._kind_phys)
- !
- ! resistance due to soil moisture deficit
- !
- rss = GX(I) * ((ZSOIL(I,k) - ZSOIL(I,k-1))/ZSOIL(I,km))
- rss = max(rss,1.e-6_kind_phys)
- RSI = RS(I) / rss
- !
- ! transpiration a la Monteith
- !
- eth = (TERM1(I) + TERM2(I)) / &
- & (DELTA(I) + RSMALL(I) * (1. + RSI * CH(I) * WIND(I)))
- ET(I,K) = eth &
- & * ETPFAC(I) * PARTLND(I)
- ENDIF
- ENDDO
- ENDDO
- !!
- 400 CONTINUE
- !
- ! CANOPY RE-EVAPORATION
- !
- DO I=1,IM
- IF(FLAG(I)) THEN
- EC(I) = SIGMAF(I) * CANFAC(I) * EP(I) / HVAP
- EC(I) = EC(I) * PARTLND(I)
- EC(I) = min(EC(I),CANOPY(I)/delt)
- ENDIF
- ENDDO
- !
- ! SUM UP TOTAL EVAPORATION
- !
- DO I = 1, IM
- IF(FLAG(I)) THEN
- EVAP(I) = EDIR(I) + EC(I)
- ENDIF
- ENDDO
- !!
- DO K = 1, KM
- DO I=1,IM
- IF(FLAG(I)) THEN
- EVAP(I) = EVAP(I) + ET(I,K)
- ENDIF
- ENDDO
- ENDDO
- !!
- !
- ! RETURN EVAP UNIT FROM KG M-2 S-1 TO WATTS M-2
- !
- DO I=1,IM
- IF(FLAG(I)) THEN
- EVAP(I) = MIN(EVAP(I)*HVAP,EP(I))
- ENDIF
- ENDDO
- !##DG IF(LAT.EQ.LATD) THEN
- !##DG PRINT *, 'FX(I), SIGMAF, EDIR(I), ETPFAC=', FX(I)*HVAP,SIGMAF,
- !##DG& EDIR(I)*HVAP,ETPFAC*HVAP
- !##DG PRINT *, ' ET =', (ET(K)*HVAP,K=1,KM)
- !##DG PRINT *, ' CANFAC(I), EC(I), EVAP', CANFAC(I),EC(I)*HVAP,EVAP
- !##DG ENDIF
- !
- ! EVAPORATION OVER BARE SEA ICE
- !
- DO I = 1, IM
- ! IF(SLIMSK(I).EQ.2.AND.SNOWD(I).LE..001) THEN
- IF(SLIMSK(I).EQ.2.) THEN
- EVAP(I) = PARTLND(I) * EP(I)
- ENDIF
- ENDDO
- !
- ! TREAT DOWNWARD MOISTURE FLUX SITUATION
- ! (EVAP WAS PRESET TO ZERO SO NO UPDATE NEEDED)
- ! DEW IS CONVERTED FROM KG M-2 TO M TO CONFORM TO PRECIP UNIT
- !
- DO I = 1, IM
- FLAG(I) = SLIMSK(I).NE.0..AND.EP(I).LE.0.
- DEW(I) = 0.
- ENDDO
- DO I = 1, IM
- IF(FLAG(I)) THEN
- DEW(I) = -EP(I) * DELT / (HVAP * RHOH2O)
- EVAP(I) = EP(I)
- DEW(I) = DEW(I) * PARTLND(I)
- EVAP(I) = EVAP(I) * PARTLND(I)
- DM(I) = 1.
- ENDIF
- ENDDO
- !
- ! SNOW COVERED LAND AND SEA ICE
- !
- DO I = 1, IM
- FLAG(I) = SLIMSK(I).NE.0..AND.SNOWD(I).GT.0.
- ENDDO
- !
- ! CHANGE OF SNOW DEPTH DUE TO EVAPORATION OR SUBLIMATION
- !
- ! CONVERT EVAP FROM KG M-2 S-1 TO M S-1 TO DETERMINE THE REDUCTION OF S
- !
- DO I = 1, IM
- IF(FLAG(I)) THEN
- BFACT = SNOWD(I) / (DELT * EP(I) / (HVAP * RHOH2O))
- BFACT = MIN(BFACT,1._kind_phys)
- !
- ! THE EVAPORATION OF SNOW
- !
- IF(EP(I).LE.0.) BFACT = 1.
- IF(SNOWD(I).LE..001) THEN
- ! EVAP = (SNOWD(I)/.001)*BFACT*EP(I) + EVAP
- ! SNOEVP(I) = bfact * EP(I) * (1. - PARTLND(I))
- ! EVAP = EVAP + SNOEVP(I)
- SNOEVP(I) = bfact * EP(I)
- ! EVAP = EVAP + SNOEVP(I) * (1. - PARTLND(I))
- EVAP(I)=EVAP(I)+SNOEVP(I)*(1.-PARTLND(I))
- ELSE
- ! EVAP(I) = BFACT * EP(I)
- SNOEVP(I) = bfact * EP(I)
- EVAP(I) = SNOEVP(I)
- ENDIF
- TSURF(I) = T1(I) + &
- & (RCAP(I) - GFLUX(I) - DFSNOW * (T1(I) - STSOIL(I,1)) &
- & /(FACTSNW(I) * MAX(SNOWD(I),.001_kind_phys)) &
- ! & + THETA1 - T1 &
- ! & - BFACT * EP(I)) / (RSMALL(I) * RCH(I) &
- & - SNOEVP(I)) / (RSMALL(I) * RCH(I) &
- & + DFSNOW / (FACTSNW(I)* MAX(SNOWD(I),.001_kind_phys)))
- ! SNOWD(I) = SNOWD(I) - BFACT * EP(I) * DELT / (RHOH2O * HVAP)
- SNOWD(I) = SNOWD(I) - SNOEVP(I) * delt / (rhoh2o * hvap)
- SNOWD(I) = MAX(SNOWD(I),0._kind_phys)
- ENDIF
- ENDDO
- !
- ! SNOW MELT (M)
- !
- 500 CONTINUE
- DO I = 1, IM
- FLAG(I) = SLIMSK(I).NE.0. &
- & .AND.SNOWD(I).GT..0
- ENDDO
- DO I = 1, IM
- IF(FLAG(I).AND.TSURF(I).GT.T0C) THEN
- SNOWMT(I) = RCH(I) * RSMALL(I) * DELT &
- & * (TSURF(I) - T0C) / (RHOH2O * HFUS)
- SNOWMT(I) = min(SNOWMT(I),SNOWD(I))
- SNOWD(I) = SNOWD(I) - SNOWMT(I)
- SNOWD(I) = MAX(SNOWD(I),0._kind_phys)
- TSURF(I) = MAX(T0C,TSURF(I) &
- & -HFUS*SNOWMT(I)*RHOH2O/(RCH(I)*RSMALL(I)*DELT))
- ENDIF
- ENDDO
- !
- ! We need to re-evaluate evaporation because of snow melt
- ! the skin temperature is now bounded to 0 deg C
- !
- ! qss = fpvs(tsurf)
- DO I = 1, IM
- ! IF (SNOWD(I) .GT. 0.0) THEN
- IF (SNOWD(I) .GT. snomin) THEN
- !jfe QSS(I) = 1000. * FPVS(TSURF(I))
- qss(i) = fpvs(tsurf(i))
- QSS(I) = EPS * QSS(I) / (PSURF(I) + EPSM1 * QSS(I))
- EVAP(I) = elocp * RCH(I) * (QSS(I) - Q0(I))
- ENDIF
- ENDDO
- !
- ! PREPARE TENDENCY TERMS FOR THE SOIL MOISTURE FIELD WITHOUT PRECIPITAT
- ! THE UNIT OF MOISTURE FLUX NEEDS TO BECOME M S-1 FOR SOIL MOISTURE
- ! HENCE THE FACTOR OF RHOH2O
- !
- DO I = 1, IM
- FLAG(I) = SLIMSK(I).EQ.1.
- if(FLAG(I)) then
- DF1(I) = FUNCDF(SMCZ(I),SOILTYP(I))
- KT1(I) = FUNCKT(SMCZ(I),SOILTYP(I))
- endif
- if(FLAG(I).and.STC(I,1).lt.t0c) then
- DF1(I) = 0.
- KT1(I) = 0.
- endif
- IF(FLAG(I)) THEN
- RHSCNPY(I) = -EC(I) + SIGMAF(I) * RHOH2O * DEW(I) / DELT
- SMCZ(I) = MAX(SMC(I,1), SMC(I,2))
- DMDZ(I) = (SMC(I,1) - SMC(I,2)) / (-.5 * ZSOIL(I,2))
- RHSMC(I,1) = (DF1(I) * DMDZ(I) + KT1(I) &
- & + (EDIR(I) + ET(I,1))) / (ZSOIL(I,1) * RHOH2O)
- RHSMC(I,1) = RHSMC(I,1) - (1. - SIGMAF(I)) * DEW(I) / &
- & ( ZSOIL(I,1) * delt)
- DDZ(I) = 1. / (-.5 * ZSOIL(I,2))
- !
- ! AIM, BIM, AND CIM ARE THE ELEMENTS OF THE TRIDIAGONAL MATRIX FOR THE
- ! IMPLICIT UPDATE OF THE SOIL MOISTURE
- !
- AIM(I,1) = 0.
- BIM(I,1) = DF1(I) * DDZ(I) / (-ZSOIL(I,1) * RHOH2O)
- CIM(I,1) = -BIM(I,1)
- ENDIF
- ENDDO
- !!
- DO K = 2, KM
- IF(K.LT.KM) THEN
- DO I=1,IM
- IF(FLAG(I)) THEN
- DF2 = FUNCDF(SMCZ(I),SOILTYP(I))
- KT2(I) = FUNCKT(SMCZ(I),SOILTYP(I))
- ENDIF
- IF(FLAG(I).and.STC(I,k).lt.t0c) THEN
- df2 = 0.
- KT2(I) = 0.
- ENDIF
- IF(FLAG(I)) THEN
- DMDZ2(I) = (SMC(I,K) - SMC(I,K+1)) &
- & / (.5 * (ZSOIL(I,K-1) - ZSOIL(I,K+1)))
- SMCZ(I) = MAX(SMC(I,K), SMC(I,K+1))
- RHSMC(I,K) = (DF2 * DMDZ2(I) + KT2(I) &
- & - DF1(I) * DMDZ(I) - KT1(I) + ET(I,K)) &
- & / (RHOH2O*(ZSOIL(I,K) - ZSOIL(I,K-1)))
- DDZ2(I) = 2. / (ZSOIL(I,K-1) - ZSOIL(I,K+1))
- CIM(I,K) = -DF2 * DDZ2(I) &
- & / ((ZSOIL(I,K-1) - ZSOIL(I,K))*RHOH2O)
- ENDIF
- ENDDO
- ELSE
- DO I = 1, IM
- IF(FLAG(I)) THEN
- KT2(I) = FUNCKT(SMC(I,K),SOILTYP(I))
- ENDIF
- if(FLAG(I).and.STC(I,k).lt.t0c) KT2(I) = 0.
- IF(FLAG(I)) THEN
- RHSMC(I,K) = (KT2(I) &
- & - DF1(I) * DMDZ(I) - KT1(I) + ET(I,K)) &
- & / (RHOH2O*(ZSOIL(I,K) - ZSOIL(I,K-1)))
- DRAIN(I) = KT2(I)
- CIM(I,K) = 0.
- ENDIF
- ENDDO
- ENDIF
- DO I = 1, IM
- IF(FLAG(I)) THEN
- AIM(I,K) = -DF1(I) * DDZ(I) &
- & / ((ZSOIL(I,K-1) - ZSOIL(I,K))*RHOH2O)
- BIM(I,K) = -(AIM(I,K) + CIM(I,K))
- DF1(I) = DF2
- KT1(I) = KT2(I)
- DMDZ(I) = DMDZ2(I)
- DDZ(I) = DDZ2(I)
- ENDIF
- ENDDO
- ENDDO
- !!
- 600 CONTINUE
- !
- ! UPDATE SOIL TEMPERATURE AND SEA ICE TEMPERATURE
- !
- DO I=1,IM
- FLAG(I) = SLIMSK(I).NE.0.
- ENDDO
- !
- ! SURFACE TEMPERATURE IS PART OF THE UPDATE WHEN SNOW IS ABSENT
- !
- DO I=1,IM
- ! IF(FLAG(I).AND.SNOWD(I).LE..001) THEN
- IF(FLAG(I).AND..NOT.FLAGSNW(I)) THEN
- YY(I) = T1(I) + &
- ! & (RCAP(I)-GFLUX(I) + THETA1 - T1(I) &
- & (RCAP(I)-GFLUX(I) &
- & - EVAP(I)) / (RSMALL(I) * RCH(I))
- ZZ(I) = 1. + DFT0(I) / (-.5 * ZSOIL(I,1) * RCH(I) * RSMALL(I))
- XX(I) = DFT0(I) * (STSOIL(I,1) - YY(I)) / &
- & (.5 * ZSOIL(I,1) * ZZ(I))
- ENDIF
- ! IF(FLAG(I).AND.SNOWD(I).GT..001) THEN
- IF(FLAG(I).AND.FLAGSNW(I)) THEN
- YY(I) = STSOIL(I,1)
- !
- ! HEAT FLUX FROM SNOW IS EXPLICIT IN TIME
- !
- ZZ(I) = 1.
- XX(I) = DFSNOW * (STSOIL(I,1) - TSURF(I)) &
- & / (-FACTSNW(I) * MAX(SNOWD(I),.001_kind_phys))
- ENDIF
- ENDDO
- !
- ! COMPUTE THE FORCING AND THE IMPLICIT MATRIX ELEMENTS FOR UPDATE
- !
- ! CH2O IS THE HEAT CAPACITY OF WATER AND CSOIL IS THE HEAT CAPACITY OF
- !
- DO I = 1, IM
- IF(FLAG(I)) THEN
- SMCZ(I) = MAX(SMC(I,1), SMC(I,2))
- DTDZ1(I) = (STSOIL(I,1) - STSOIL(I,2)) / (-.5 * ZSOIL(I,2))
- IF(SLIMSK(I).EQ.1.) THEN
- DFT1(I) = KTSOIL(SMCZ(I),SOILTYP(I))
- HCPCT(I) = SMC(I,1) * CH2O + (1. - SMC(I,1)) * CSOIL
- ELSE
- DFT1(I) = DFT0(I)
- HCPCT(I) = CICE
- ENDIF
- DFT2(I) = DFT1(I)
- DDZ(I) = 1. / (-.5 * ZSOIL(I,2))
- !
- ! AI, BI, AND CI ARE THE ELEMENTS OF THE TRIDIAGONAL MATRIX FOR THE
- ! IMPLICIT UPDATE OF THE SOIL TEMPERATURE
- !
- AI(I,1) = 0.
- BI(I,1) = DFT1(I) * DDZ(I) / (-ZSOIL(I,1) * HCPCT(I))
- CI(I,1) = -BI(I,1)
- BI(I,1) = BI(I,1) &
- & + DFT0(I) / (.5 * ZSOIL(I,1) **2 * HCPCT(I) * ZZ(I))
- ! SS = DFT0(I) * (STSOIL(I,1) - YY(I)) &
- ! & / (.5 * ZSOIL(I,1) * ZZ(I))
- ! RHSTC(1) = (DFT1(I) * DTDZ1(I) - SS)
- RHSTC(I,1) = (DFT1(I) * DTDZ1(I) - XX(I)) &
- & / (ZSOIL(I,1) * HCPCT(I))
- ENDIF
- ENDDO
- !!
- DO K = 2, KM
- DO I=1,IM
- IF(SLIMSK(I).EQ.1.) THEN
- HCPCT(I) = SMC(I,K) * CH2O + (1. - SMC(I,K)) * CSOIL
- ELSEIF(SLIMSK(I).EQ.2.) THEN
- HCPCT(I) = CICE
- ENDIF
- ENDDO
- IF(K.LT.KM) THEN
- DO I = 1, IM
- IF(FLAG(I)) THEN
- DTDZ2(I) = (STSOIL(I,K) - STSOIL(I,K+1)) &
- & / (.5 * (ZSOIL(I,K-1) - ZSOIL(I,K+1)))
- SMCZ(I) = MAX(SMC(I,K), SMC(I,K+1))
- IF(SLIMSK(I).EQ.1.) THEN
- DFT2(I) = KTSOIL(SMCZ(I),SOILTYP(I))
- ENDIF
- DDZ2(I) = 2. / (ZSOIL(I,K-1) - ZSOIL(I,K+1))
- CI(I,K) = -DFT2(I) * DDZ2(I) &
- & / ((ZSOIL(I,K-1) - ZSOIL(I,K)) * HCPCT(I))
- ENDIF
- ENDDO
- ELSE
- !
- ! AT THE BOTTOM, CLIMATOLOGY IS ASSUMED AT 2M DEPTH FOR LAND AND
- ! FREEZING TEMPERATURE IS ASSUMED FOR SEA ICE AT Z(KM)
- DO I = 1, IM
- IF(SLIMSK(I).EQ.1.) THEN
- DTDZ2(I) = (STSOIL(I,K) - TG3(I)) &
- & / (.5 * (ZSOIL(I,K-1) + ZSOIL(I,K)) - ZBOT)
- DFT2(I) = KTSOIL(SMC(I,K),SOILTYP(I))
- CI(I,K) = 0.
- ENDIF
- IF(SLIMSK(I).EQ.2.) THEN
- DTDZ2(I) = (STSOIL(I,K) - TGICE) &
- & / (.5 * ZSOIL(I,K-1) - .5 * ZSOIL(I,K))
- DFT2(I) = DFT1(I)
- CI(I,K) = 0.
- ENDIF
- ENDDO
- ENDIF
- DO I = 1, IM
- IF(FLAG(I)) THEN
- RHSTC(I,K) = (DFT2(I) * DTDZ2(I) - DFT1(I) * DTDZ1(I)) &
- & / ((ZSOIL(I,K) - ZSOIL(I,K-1)) * HCPCT(I))
- AI(I,K) = -DFT1(I) * DDZ(I) &
- & / ((ZSOIL(I,K-1) - ZSOIL(I,K)) * HCPCT(I))
- BI(I,K) = -(AI(I,K) + CI(I,K))
- DFT1(I) = DFT2(I)
- DTDZ1(I) = DTDZ2(I)
- DDZ(I) = DDZ2(I)
- ENDIF
- ENDDO
- ENDDO
- !!
- 700 CONTINUE
- !
- ! SOLVE THE TRI-DIAGONAL MATRIX
- !
- DO K = 1, KM
- DO I=1,IM
- IF(FLAG(I)) THEN
- RHSTC(I,K) = RHSTC(I,K) * DELT2
- AI(I,K) = AI(I,K) * DELT2
- BI(I,K) = …
Large files files are truncated, but you can click here to view the full file