C $Header: /u/gcmpack/MITgcm/pkg/fizhi/fizhi_lsm.F,v 1.9 2010/08/24 14:36:55 jmc Exp $ C $Name: $ #include "FIZHI_OPTIONS.h" SUBROUTINE TILE ( I NCH, DTSTEP, ITYP, TRAINL,TRAINC, TSNOW, UM, I ETURB, DEDQA, DEDTC, HSTURB, DHSDQA, DHSDTC, I TM, QM, CD, SUNANG, PARDIR, PARDIF, I SWNET, HLWDWN, PSUR, ZLAI, GREEN, Z2, I SQSCAT, RSOIL1, RSOIL2, RDC, U2FAC, I QSATTC, DQSDTC, ALWRAD, BLWRAD, U TC, TD, QA, SWET1, SWET2, SWET3, CAPAC, SNOW, O EVAP, SHFLUX, RUNOFF, BOMB, O EINT, ESOI, EVEG, ESNO, SMELT, HLATN, O HLWUP,GDRAIN,RUNSRF,FWSOIL, O STRDG1, STRDG2, STRDG3, STRDG4, O STRDG5, STRDG6, STRDG7, STRDG8, STRDG9 & ) C SCCS VERSION @(#)lsm.f 1.2 11/3/92 C**** C**** This subroutine computes the outgoing fluxes of sensible and C**** latent heat from the land surface and updates the surface prognostic C**** variables. C**** IMPLICIT NONE C C**** #include "sibber.h" C**** INTEGER NCH INTEGER ITYP(NCH) _RL DTSTEP, TRAINL(NCH), TRAINC(NCH), TSNOW(NCH), UM(NCH), & ETURB(NCH), DEDQA(NCH), HSTURB(NCH), DHSDTC(NCH), & TM (NCH), CD(NCH), SUNANG(NCH), DHSDQA(NCH), & QM (NCH), PARDIR(NCH), PARDIF(NCH), SWNET(NCH), & HLWDWN(NCH), PSUR(NCH), ZLAI(NCH), GREEN(NCH), & Z2(NCH), SQSCAT(NCH), DEDTC(NCH) _RL RSOIL1(NCH), RSOIL2(NCH), RDC(NCH), U2FAC(NCH), & QSATTC(NCH), DQSDTC(NCH), ALWRAD(NCH), BLWRAD(NCH), & TC(NCH), TD(NCH), QA(NCH), BOMB(NCH), & SWET1(NCH), SWET2(NCH), SWET3(NCH), CAPAC(NCH), & SNOW(NCH), EVAP(NCH), SHFLUX(NCH), RUNOFF(NCH) _RL EINT(NCH), ESOI(NCH), EVEG(NCH), ESNO(NCH), & STRDG1(NCH), STRDG2(NCH), STRDG3(NCH), STRDG4(NCH), & STRDG5(NCH), STRDG6(NCH), STRDG7(NCH), STRDG8(NCH), & STRDG9(NCH), & SMELT(NCH), HLATN(NCH), HLWUP(NCH), GDRAIN(NCH), & RUNSRF(NCH), FWSOIL(NCH) C**** INTEGER ChNo _RL SWET(nch,NLAY), VGPSAT(NTYPS), VGCSAT (NTYPS), & VGZDEP(NLAY,NTYPS), VGSLOP(NTYPS), DELTC, & DELEA, VGPH1(NTYPS), VGPH2(NTYPS), & VGRPLN(NTYPS), CSOIL0(NTYPS), WSOI12, & VGBEE(NTYPS), DELZ12(NTYPS), & DELZ23(NTYPS) C**** _RL PHLAY(nch,NLAY), AKLAY(nch,NLAY), SWET12(nch), & CSOIL(nch), & RCUN(nch), VPDSTR(nch), ESATTX(nch), & VPDSTX(nch), VGBEEX(nch) _RL EMAXRT(nch), VGWMAX(NLAY,NTYPS), FTEMP(nch), & PHR(nch), SOILCO(nch), RC(nch), & EAX(nch), TX(nch), RCX(nch), & DRCDTC(nch), SATCAP(nch), PAR(nch), & PDIR(nch), DUMMY(nch) _RL FTEMPX(nch), DRCDEA(nch), VGPSAX(nch), VGCSAX(nch), & VGZDEX(NLAY,nch), VGSLOX(nch), VGPH1X(nch), & VGPH2X(nch), VGRPLX(nch) _RL DEDEA(nch), DHSDEA(nch), EM(nch), ESATTC(nch), & DESDTC(nch), EA(nch), RA(nch), ALHX(nch), & WETEQ1(nch), WETEQ2(nch), & RX1(nch), RX2(nch), SNWFRC(nch), POTFRC(nch), & ESNFRC(nch), EIRFRC(nch), FCAN(nch), EPFRC, & DEFCIT, EADJST, RTBS _RL cmpbug C**** DATA VGWMAX /8.4, 621.6, 840.0, 2 8.4, 621.6, 840.0, 3 8.4, 621.6, 840.0, 4 8.4, 197.4, 420.0, 5 8.704, 204.5, 435.2, 6 8.4, 71.4, 420.0, 7 4.000, 4.000, 130.56, 8 4.000, 4.000, 130.56, 9 8.704, 73.984, 130.56, 1 4.000, 4.000, 130.56 & / DATA VGBEE / 4., 4., 4., 4., 1.69, 4., & 4., 1.69, 1.69, 1.69/ C DATA VGBEE / 7., 7., 7., 7., 1.69, 7., C & 7., 1.69, 1.69, 1.69/ c DATA VGBEE / 4., 4., 4., 4., 0.95, 4., c & 4., 0.95, 0.95, 0.95/ C DATA VGBEE /7, 7, 7, 7, 2, 7, 7, 4, 2, 4/ DATA VGPSAT/ -0.281, -0.281, -0.281, -0.281, 5 -0.073, -0.281, -0.281, -0.073, 9 -0.073 , -0.073/ C DATA VGPSAT/ -0.086, -0.086, -0.086, -0.086, C 5 -0.073, -0.086, -0.086, -0.073, C 9 -0.073 , -0.073/ c DATA VGPSAT/ -0.281, -0.281, -0.281, -0.281, c 5 -0.014, -0.281, -0.281, -0.014, c 9 -0.014 , -0.014/ c DATA VGCSAT / 0.00002, 0.00002, 0.00002, 0.00002, c 5 0.0000583, 0.00002, 0.00002, 0.0000583, c 9 0.0000583, 0.0000583 c & / DATA VGCSAT / 0.0000012, 0.0000012, 0.0000012, 0.0000012, 5 0.0000583, 0.0000012, 0.0000012, 0.0000583, 9 0.0000583, 0.0000583 & / C**** - - - - - - - - C**** THE FOLLOWING 3 VARIABLES MUST MAINTAIN CONSISTENT VALUES. ZDEP12(N) = C**** (VGZDEP(1,N)+VGZDEP(2,N))/2. ; SIMILARLY FOR ZDEP23(N). C**** DATA VGZDEP /.02, 1.48, 2.00, 2 .02, 1.48, 2.00, 3 .02, 1.48, 2.00, 4 .02, .47, 1.00, 5 .02, .47, 1.00, 6 .02, .17, 1.00, 7 .0092, .0092, .30, 8 .0092, .0092, .30, 9 .02, .17, .30, 1 .0092, .0092, .30 & / DATA DELZ12 / 0.75, 0.75, 0.75, 0.245, 0.245, 0.095, 0.0092, 8 0.0092, 0.095, 0.0092 / DATA DELZ23 / 1.74, 1.74, 1.74, 0.735, 0.735, 0.585, 0.155, 8 0.155, 0.235, 0.155 / C**** - - - - - - - - DATA VGSLOP / .1736, .1736, .1736, .1736, 5 1.000, .1736, .1736, 1.000, & 1.000 , 1.000 / c DATA VGSLOP / .1736, .1736, .1736, .1736, c 5 .0872, .1736, .1736, .0872, c & .0872 , .0872 / c DATA VGSLOP / 1., 1., 1., 1., 1., 1., 1., 1., 1.,1./ DATA VGPH1 / -100., -190., -200., -120., 5 -200., -200., -200., -10., 9 -10., -10. / DATA VGPH2 / -500., -250., -250., -230., 5 -400., -400., -250., -100., 9 -100., -100. / DATA VGRPLN /0.245E+09, 0.245E+09, 0.245E+09, 0.250E+09, 5 0.250E+09, 0.250E+09, 0.245E+09, 0.1E+09, 9 0.1E+09, 0.100E+09 / C**** DATA DELTC /0.01/, DELEA /0.001/ c Note: SNWMID & CSOIL0 parameters modified from (Koster/Suarez) c to obtain improved albedo, radswg, and annual/diurnal cycle (L.Takacs 2/17/00) c ------------------------------------------------------------------------------------ DATA CSOIL0 /175000.,175000.,175000.,175000.,175000., . 175000.,175000.,120000.,175000., 70000./ #include "snwmid.h" C**** C**** --------------------------------------------------------------------- C**** CFPP$ EXPAND (TMPFAC, RCANOP, SOIL, WUPDAT, SMFAC) C**** C**** Expand data as specified by ITYP into arrays of size NCH. C**** DO 50 ChNo = 1, NCH BOMB(CHNO) = 0. VGBEEX(ChNo) = VGBEE(ITYP(ChNo)) VGPSAX(ChNo) = VGPSAT(ITYP(ChNo)) VGCSAX(ChNo) = VGCSAT(ITYP(ChNo)) VGZDEX(SFCLY ,ChNo) = VGZDEP(SFCLY ,ITYP(ChNo)) VGZDEX(ROOTLY,ChNo) = VGZDEP(ROOTLY,ITYP(ChNo)) VGZDEX(RECHLY,ChNo) = VGZDEP(RECHLY,ITYP(ChNo)) VGSLOX(ChNo) = VGSLOP(ITYP(ChNo)) VGPH1X(ChNo) = VGPH1(ITYP(ChNo)) VGPH2X(ChNo) = VGPH2(ITYP(ChNo)) VGRPLX(ChNo) = VGRPLN(ITYP(ChNo)) 50 CONTINUE C**** C**** Pre-process input arrays as necessary: DO 100 ChNo = 1, NCH DEDQA(CHNO) = MAX( DEDQA(CHNO), 500. _d 0/ALHE ) DEDTC(CHNO) = MAX( DEDTC(CHNO), 0. _d 0) DHSDQA(CHNO) = MAX( DHSDQA(CHNO), 0. _d 0) DHSDTC(CHNO) = MAX( DHSDTC(CHNO), -10. _d 0) EM(CHNO) = QM(CHNO) * PSUR(CHNO) / EPSILON EA(CHNO) = QA(CHNO) * PSUR(CHNO) / EPSILON ESATTC(CHNO) = QSATTC(CHNO) * PSUR(CHNO) / EPSILON DESDTC(CHNO) = DQSDTC(CHNO) * PSUR(CHNO) / EPSILON C DEDEA(CHNO) = DEDQA(CHNO) * EPSILON / ( PSUR(CHNO) * ALHX(CHNO) ) DEDEA(CHNO) = DEDQA(CHNO) * EPSILON / PSUR(CHNO) DHSDEA(CHNO) = DHSDQA(CHNO) * EPSILON / PSUR(CHNO) C DEDTC(CHNO) = DEDTC(CHNO) / ALHX(CHNO) C ETURB(CHNO) = ETURB(CHNO) / ALHX(CHNO) PAR(CHNO) = (PARDIR(CHNO) + PARDIF(CHNO) + 1.E-20) PDIR(CHNO) = PARDIR(CHNO) / PAR(CHNO) RA(CHNO) = ONE / ( CD(CHNO) * UM(CHNO) ) SATCAP(ChNo) = 0.1 * ZLAI(ChNo) CSOIL(CHNO) = CSOIL0(ITYP(ChNo)) SWET(ChNo,SFCLY ) = max( min(SWET1(ChNo),1. _d 0), 0. _d 0) SWET(ChNo,ROOTLY) = max( min(SWET2(ChNo),1. _d 0), 0. _d 0) SWET(ChNo,RECHLY) = max( min(SWET3(ChNo),1. _d 0), 0. _d 0) CAPAC(CHNO) = max( min(CAPAC(ChNo),SATCAP(CHNO)), 0. _d 0) C**** SNWFRC(CHNO) = SNOW(CHNO) / ( SNOW(CHNO) + SNWMID(ITYP(CHNO)) ) FCAN(CHNO) = MIN( 1. _d 0, MAX(0. _d 0,CAPAC(ChNo)/SATCAP(ChNo)) ) POTFRC(CHNO)=1.-(1.-SNWFRC(CHNO))*(1.-FCAN(CHNO)) WSOI12=SWET(ChNo,SFCLY ) * VGWMAX(SFCLY ,ITYP(ChNo)) + & SWET(ChNo,ROOTLY) * VGWMAX(ROOTLY,ITYP(ChNo)) SWET12(ChNo) = WSOI12 / & (VGWMAX(SFCLY,ITYP(ChNo)) + VGWMAX(ROOTLY,ITYP(ChNo))) EMAXRT(CHNO) = ( SNOW(CHNO) + CAPAC(CHNO) + WSOI12 ) / DTSTEP C**** RUNOFF(CHNO) = 0. RUNSRF(CHNO) = 0. C**** (SMELT is zeroed in FLUXES) C SMELT(CHNO) = 0. FWSOIL(CHNO) = 0. 100 CONTINUE C**** C**** - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - C**** STEP 1: COMPUTE EFFECTIVE RESISTANCE RC FOR ENERGY BALANCE. C**** (RCUNST computes the unstressed resistance, C**** VPDFAC computes the vapor pressure deficit stress term, C**** TMPFAC computes the temperature stress term, C**** SOIL computes soil moisture potentials and conds., C**** SMFAC computes rc given a leaf water potential stress, C**** RSURFP computes rc given a parallel resist. from the C**** surface, C**** RCANOP computes rc corrected for snow and interception.) C**** CALL RCUNST ( I NCH, ITYP, SUNANG, SQSCAT, PDIR, I PAR, ZLAI, GREEN, O RCUN & ) CALL VPDFAC ( I NCH, ITYP, ESATTC, EA, O VPDSTR & ) CALL TMPFAC ( I NCH, ITYP, TC, O FTEMP & ) CALL SOIL ( I NCH, ITYP, SWET12, VGBEEX, VGPSAX, VGCSAX, DELZ12, O PHR, SOILCO, DUMMY & ) cmpbug=0. CALL SMFAC ( I NCH, ITYP, ESATTC, EA, PHR, SOILCO, RCUN, I VPDSTR, FTEMP, TC, PSUR, Z2, RSOIL1, RSOIL2, I VGPH1X, VGPH2X, VGRPLX, O RC & ) CALL RSURFP ( I NCH, UM, U2FAC, Z2, RDC, SWET(1,SFCLY), I ESATTC, EA, U RC, O RX1, RX2 & ) CALL RCANOP ( I NCH, CAPAC, SNOW, SATCAP, RA, ETURB, SNWFRC, I POTFRC, U RC & ) C**** C**** - - - - - - - - - - - - - - C**** C**** Compute DRC/DT and DRC/DEA using temperature, v.p. perturbations: C**** DO 120 ChNo = 1, NCH TX(ChNo) = TC(ChNo) + DELTC ESATTX(ChNo) = ESATTC(ChNo) + DESDTC(CHNO) * DELTC EAX(ChNo) = EA(ChNo) + DELEA 120 CONTINUE C**** C**** temperature: CALL VPDFAC (NCH, ITYP, ESATTX, EA, VPDSTX) CALL TMPFAC (NCH, ITYP, TX, FTEMPX) CALL SMFAC ( I NCH, ITYP, ESATTX, EA, PHR, SOILCO, RCUN, I VPDSTX, FTEMPX, TX, PSUR, Z2, RSOIL1, RSOIL2, I VGPH1X, VGPH2X, VGRPLX, O RCX & ) CALL RSURFP (NCH, UM, U2FAC, Z2, RDC, SWET(1,SFCLY), I ESATTX, EA, & RCX, O DUMMY,DUMMY & ) CALL RCANOP (NCH, CAPAC, SNOW, SATCAP, RA, ETURB, SNWFRC, & POTFRC, RCX) C**** DO 125 ChNo = 1, NCH DRCDTC(ChNo) = (RCX(ChNo) - RC(ChNo)) / DELTC 125 CONTINUE C**** C**** vapor pressure: CALL VPDFAC (NCH, ITYP, ESATTC, EAX, VPDSTX) CALL SMFAC ( I NCH, ITYP, ESATTC, EAX, PHR, SOILCO, RCUN, I VPDSTX, FTEMP, TC, PSUR, Z2, RSOIL1, RSOIL2, I VGPH1X, VGPH2X, VGRPLX, O RCX & ) CALL RSURFP (NCH, UM, U2FAC, Z2, RDC, SWET(1,SFCLY), I ESATTC, EAX, & RCX, O DUMMY,DUMMY & ) CALL RCANOP (NCH, CAPAC, SNOW, SATCAP, RA, ETURB, SNWFRC, & POTFRC, RCX) C**** DO 150 ChNo = 1, NCH DRCDEA(ChNo) = (RCX(ChNo) - RC(ChNo)) / DELEA 150 CONTINUE C**** C**** C**** - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - C**** STEP 2: Solve the energy balance at the surface. C**** C**** C**** Determine effective latent heat of vaporization based on C**** assumed fractional coverage of snow. This requires the C**** determination of the fractions of moisture taken from the various C**** reservoirs: C**** ESNFRC=fraction of total evap. coming from snow C**** EIRFRC=fraction of total evap. coming from interception res. DO 200 CHNO=1,NCH RTBS=RX1(CHNO)*RX2(CHNO)/(RX1(CHNO)+RX2(CHNO)) EPFRC=POTFRC(CHNO) * ( RA(CHNO) + RTBS ) / & ( RA(CHNO) + POTFRC(CHNO)*RTBS ) ESNFRC(CHNO)=EPFRC*SNWFRC(CHNO)/ & (SNWFRC(CHNO)+FCAN(CHNO)+1.E-20) EIRFRC(CHNO)=EPFRC*FCAN(CHNO)/(SNWFRC(CHNO)+FCAN(CHNO)+1.E-20) ALHX(CHNO) = (1.-ESNFRC(CHNO))*ALHE + ESNFRC(CHNO)*ALHS 200 CONTINUE CALL FLUXES ( I NCH, ITYP, DTSTEP, ESATTC, DESDTC, ALHX, I ETURB, DEDEA, DEDTC, HSTURB, DHSDEA, DHSDTC, I RC, DRCDEA, DRCDTC, I SWNET, HLWDWN, ALWRAD, BLWRAD, ESNFRC, I TM, EM, CSOIL, PSUR, EMAXRT, VGWMAX, U TC, TD, EA, SWET, SNOW, O RUNOFF, EVAP, SHFLUX, SMELT, HLWUP, BOMB,STRDG1, O STRDG2, STRDG3, STRDG4, STRDG5, STRDG6, STRDG7, O STRDG8, STRDG9 & ) c**** C**** C**** - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - C**** STEP 3: Update the water quantities in the soil and in the C**** interception reservoir. C**** (WUPDAT reduces moisture contents using calculated C**** evap., C**** GWATER computes darcian flux of water between soil C**** layers.) C**** CALL WUPDAT ( I NCH, ITYP, DTSTEP, I EVAP, SATCAP, VGWMAX, TC, RA, RC, I RX1, RX2,ESNFRC,EIRFRC, U CAPAC, SNOW, SWET, RUNOFF, O EINT, ESOI, EVEG, ESNO, RUNSRF,FWSOIL & ) C**** C**** Correct any energy balance inconsistency. C**** DO 300 CHNO=1,NCH IF(EVAP(CHNO) .GT. 0.) THEN EADJST=(ESNO(CHNO)/DTSTEP) - ESNFRC(CHNO)*EVAP(CHNO) SHFLUX(CHNO)=SHFLUX(CHNO)-EADJST*(ALHS-ALHE) ENDIF 300 CONTINUE CALL SOIL ( I NCH, ITYP, SWET (1, SFCLY), VGBEEX, I VGPSAX, VGCSAX, DELZ12, O PHLAY(1,SFCLY), AKLAY(1,SFCLY), DUMMY & ) CALL SOIL ( I NCH, ITYP, SWET(1,ROOTLY), VGBEEX, I VGPSAX, VGCSAX, DELZ12, O PHLAY(1,ROOTLY), AKLAY(1,ROOTLY), WETEQ1 & ) CALL SOIL ( I NCH, ITYP, SWET(1,RECHLY), VGBEEX, I VGPSAX, VGCSAX, DELZ23, O PHLAY(1,RECHLY), AKLAY(1,RECHLY), WETEQ2 & ) CALL GWATER ( I NCH, ITYP, VGWMAX, PHLAY, AKLAY, TC, DTSTEP, I VGZDEX, VGSLOX, WETEQ1, WETEQ2, I VGPSAX, VGCSAX, U SWET, RUNOFF, GDRAIN & ) C**** - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - C**** C**** STEP 4: Allow precipitation to fill interception reservoir C**** and top soil layer C**** CALL SOIL ( I NCH, ITYP, SWET(1,ROOTLY), VGBEEX, I VGPSAX, VGCSAX, DELZ12, O PHLAY(1,ROOTLY), AKLAY(1,ROOTLY), WETEQ1 & ) CALL INTERC ( I NCH, ITYP, DTSTEP, TRAINL, TRAINC, TSNOW, SATCAP, I VGWMAX, CSOIL, WETEQ1, U TC, CAPAC, SNOW, SWET, RUNOFF, RUNSRF, & SMELT, FWSOIL & ) C**** C**** C**** Process data for return to GCM: DO 2000 ChNo = 1, NCH QA(CHNO) = EA(CHNO) * EPSILON / PSUR(CHNO) C DEDTC(CHNO) = DEDTC(CHNO) * ALHX(CHNO) C ETURB(CHNO) = ETURB(CHNO) * ALHX(CHNO) HLATN (CHNO) = EVAP (CHNO) * ALHX(CHNO) SWET1(ChNo) = SWET(ChNo,SFCLY) SWET2(ChNo) = SWET(ChNo,ROOTLY) SWET3(ChNo) = SWET(ChNo,RECHLY) IF(SWET1(ChNo).LT.1.E-10) SWET1(CHNO) = 0.0 IF(SWET2(ChNo).LT.1.E-10) SWET2(CHNO) = 0.0 IF(SWET3(ChNo).LT.1.E-10) SWET3(CHNO) = 0.0 IF(CAPAC(ChNo).LT.1.E-10) CAPAC(CHNO) = 0.0 IF(SNOW (ChNo).LT.1.E-10) SNOW (CHNO) = 0.0 IF(RUNOFF(ChNo).LT.1.E-10) RUNOFF(CHNO) = 0.0 EINT(CHNO) = EINT(CHNO) * ALHE / DTSTEP ESOI(CHNO) = ESOI(CHNO) * ALHE / DTSTEP EVEG(CHNO) = EVEG(CHNO) * ALHE / DTSTEP ESNO(CHNO) = ESNO(CHNO) * ALHS / DTSTEP DEFCIT = EVAP(CHNO) * ( RC(CHNO) + RA(CHNO) ) CCOOMMSTRDG1(CHNO) = DEFCIT / RA(CHNO) CCOOMMSTRDG2(CHNO) = DEFCIT / ( RA(CHNO) + RCUN(CHNO) ) CCOOMMSTRDG3(CHNO) = DEFCIT / ( RA(CHNO) + RCUN(CHNO)/VPDSTR(CHNO) ) CCOOMMSTRDG4(CHNO) = DEFCIT / ( RA(CHNO) + CCOOMM RCUN(CHNO)/(VPDSTR(CHNO)*FTEMP(CHNO)) ) 2000 CONTINUE C**** RETURN END
C**** C**** [ END CHIP ] C**** C**** ----------------------------------------------------------------- C**** ///////////////////////////////////////////////////////////////// C**** ----------------------------------------------------------------- C**** C**** [ BEGIN INTERC ] C**** SUBROUTINE INTERC ( I NCH, ITYP, DTSTEP, TRAINL, TRAINC, I TSNOW, SATCAP, WMAX, CSOIL, WETEQ1, U TC, CAPAC, SNOW, SWET1, RUNOFF, RUNSRF, U SMELT, FWSOIL & ) C**** C**** This routine uses the precipitation forcing to determine C**** changes in interception, snowcover, and soil moisture storage. C**** C**** Note: In this formulation, rain that falls on frozen ground C**** runs-off, rather than freezes. C**** IMPLICIT NONE C**** #include "sibber.h" C**** INTEGER NCH INTEGER ITYP(NCH), ChNo _RL TRAINL(NCH), TRAINC(NCH), TSNOW(NCH), SATCAP(NCH), & WMAX(NLAY,NTYPS), TC(NCH), CSOIL(NCH), CAPAC(NCH), & SNOW(NCH), SWET1(NCH), RUNOFF(NCH), SMELT(NCH), & RUNSRF(NCH), FWSOIL(NCH), WETEQ1(NCH), WETINT _RL DTSTEP, SNOWM, WATADD, CAVAIL, THRUC, WRUNC, WRUNL, & TIMFRL, TIMFRC, FWETL, FWETC, THRU1, THRU2, THRUL, XTCORR, & WETFRC C**** C DATA FWET0 /0.30/ DATA FWETL /1.00/, FWETC /0.20/, TIMFRL/1.00/, TIMFRC/0.125/ C**** C**** ------------------------------------------------------------------ C**** Loop over chips: DO 100 ChNo = 1, NCH C**** C**** Add to snow cover. Melt snow if necessary. SNOW(ChNo) = SNOW(ChNo) + TSNOW(ChNo)*DTSTEP SNOWM = 0. IF( SNOW(CHNO).GT.0. .AND. TC(CHNO).GT.TF ) THEN SNOWM = MIN( SNOW(ChNo), & MAX( 0. _d 0, (TC(ChNo)-TF)*CSOIL(ChNo)/ALHM ) ) IF( SNOWM .EQ. SNOW(CHNO) ) THEN TC(ChNo) = TC(ChNo) - SNOWM * ALHM / CSOIL(ChNo) SNOW(CHNO)=0. ELSE TC(CHNO)=TF SNOW(ChNo) = SNOW(ChNo) - SNOWM ENDIF SMELT(CHNO)=SMELT(CHNO)+SNOWM/DTSTEP ENDIF C**** C**** ======================================================= C**** C**** Load interception reservoir. STEP 1: Large scale condensation. C**** C**** Determine XTCORR, the fraction of a storm that falls on a previously C**** wet surface due to the time correlation of precipitation position. C**** (Time scale TIMFRL for large scale storms set to one for FWETL=1 C**** to reflect the effective loss of "position memory" when storm C**** covers entire grid square.) XTCORR= (1.-TIMFRL) * MIN( 1. _d 0,(CAPAC(CHNO)/SATCAP(CHNO))/ $ FWETL ) C**** C**** Fill interception reservoir with precipitation. C**** THRU1 is first calculated as the amount falling through the C**** canopy under the assumption that all rain falls randomly. C**** only a fraction 1-XTCORR falls randomly, though, so the result C**** is multiplied by 1-XTCORR. C**** WATADD = TRAINL(ChNo)*DTSTEP + SMELT(CHNO)*DTSTEP CAVAIL = ( SATCAP(CHNO) - CAPAC(CHNO) ) * FWETL WETINT = CAPAC(CHNO)/SATCAP(CHNO) IF( WATADD*(1.-WETINT) .LT. CAVAIL ) THEN THRU1 = WATADD*WETINT ELSE THRU1 = (WATADD - CAVAIL) ENDIF THRU1=THRU1*(1.-XTCORR) C**** THRU2 is the amount that falls immediately through the canopy due C**** to 'position memory'. THRU2=XTCORR*WATADD THRUL=THRU1+THRU2 CAPAC(CHNO)=CAPAC(CHNO)+WATADD-THRU1-THRU2 C**** C**** --------------------------------------------------- C**** C**** STEP 2: Moist convective precipitation. C**** C**** Determine XTCORR, the fraction of a storm that falls on a previously C**** wet surface due to the time correlation of precipitation position. XTCORR= (1.-TIMFRC) * MIN( 1. _d 0,(CAPAC(CHNO)/SATCAP(CHNO))/ $ FWETC ) C**** C**** Fill interception reservoir with precipitation. C**** THRU1 is first calculated as the amount falling through the C**** canopy under the assumption that all rain falls randomly. C**** only a fraction 1-XTCORR falls randomly, though, so the result C**** is multiplied by 1-XTCORR. C**** WATADD = TRAINC(ChNo)*DTSTEP CAVAIL = ( SATCAP(CHNO) - CAPAC(CHNO) ) * FWETC WETINT = CAPAC(CHNO)/SATCAP(CHNO) IF( WATADD*(1.-WETINT) .LT. CAVAIL ) THEN THRU1 = WATADD*WETINT ELSE THRU1 = (WATADD - CAVAIL) ENDIF THRU1=THRU1*(1.-XTCORR) C**** THRU2 is the amount that falls immediately through the canopy due C**** to 'position memory'. THRU2=XTCORR*WATADD THRUC=THRU1+THRU2 CAPAC(CHNO)=CAPAC(CHNO)+WATADD-THRU1-THRU2 C**** C***** ================================================================= C**** C**** Add precipitation moisture to soil, generate runoff. if C**** temperature is below freezing, all precipitation runs off. C**** C**** STEP 1: Large scale condensation: C**** IF(SWET1(CHNO).GT.WETEQ1(CHNO) .AND. WETEQ1(CHNO).NE.1.) THEN WETFRC=(SWET1(CHNO)-WETEQ1(CHNO))/(1.-WETEQ1(CHNO)) ELSE WETFRC=0. ENDIF CAVAIL = ( 1.-WETFRC)*FWETL*WMAX(1,ITYP(ChNo))*(1-WETEQ1(CHNO)) IF ( THRUL * (1-WETFRC) .LT. CAVAIL ) THEN WRUNL = THRUL * WETFRC SWET1(ChNo) = SWET1(ChNo) * + THRUL * ( 1. - WETFRC) / WMAX(1,ITYP(ChNo)) ELSE WRUNL = THRUL - CAVAIL SWET1(CHNO) = SWET1(CHNO) + CAVAIL / WMAX(1,ITYP(ChNo)) ENDIF C**** C**** STEP 2: Moist convective precipitation: C**** IF(SWET1(CHNO).GT.WETEQ1(CHNO) .AND. WETEQ1(CHNO).NE.1.) THEN WETFRC=(SWET1(CHNO)-WETEQ1(CHNO))/(1.-WETEQ1(CHNO)) ELSE WETFRC=0. ENDIF CAVAIL = (1.-WETFRC)*FWETC*WMAX(1,ITYP(ChNo))*(1-WETEQ1(CHNO)) IF ( THRUC * (1-WETFRC) .LT. CAVAIL ) THEN WRUNC = THRUC * WETFRC SWET1(ChNo) = SWET1(ChNo) * + THRUC * ( 1. - WETFRC) / WMAX(1,ITYP(ChNo)) ELSE WRUNC = THRUC - CAVAIL SWET1(CHNO) = SWET1(CHNO) + CAVAIL / WMAX(1,ITYP(ChNo)) ENDIF C**** RUNOFF(ChNo) = RUNOFF(ChNo) + (WRUNC+WRUNL)/DTSTEP RUNSRF(ChNo) = RUNSRF(ChNo) + (WRUNC+WRUNL)/DTSTEP FWSOIL(CHNO) = FWSOIL(CHNO) + (THRUC+THRUL-WRUNC-WRUNL)/DTSTEP C**** 100 CONTINUE C**** RETURN END
C**** C**** [ END INTERC ] C**** C**** ----------------------------------------------------------------- C**** ///////////////////////////////////////////////////////////////// C**** ----------------------------------------------------------------- C**** C**** [ BEGIN RCUNST ] C**** SUBROUTINE RCUNST ( I NCH, ITYP, SUNANG, SQSCAT, PDIR, I PAR, ZLAI, GREEN, O RCUN & ) C**** C**** This subroutine calculates the unstressed canopy resistance. C**** (p. 1353, Sellers 1985.) Extinction coefficients are computed first. C**** IMPLICIT NONE C**** #include "sibber.h" C**** INTEGER NCH INTEGER ITYP(NCH), ChNo _RL SUNANG(NCH), PDIR(NCH), PAR(NCH), ZLAI(NCH), & SQSCAT(NCH), GREEN(NCH), RCUN(NCH) _RL VGCHIL(NTYPS), VGZMEW(NTYPS), & VGRST1(NTYPS), VGRST2(NTYPS), VGRST3(NTYPS) _RL RHO4, EXTK1, EXTK2, & RCINV, GAMMA, EKAT, DUM1, & DUM2, DUM3, AA, BB, & ZK, CC DATA VGCHIL / 0.1, 0.25, 0.01, -0.3, 5 0.01, 0.20, 0.0, 0.0, 9 0.0, 0.0 / DATA VGZMEW/ 0.9809, 0.9638, 0.9980, 1.0773, 5 0.9980, 0.9676, 1.000, 1.000, 9 1.000, 1.0000 / DATA VGRST1 / 2335.9, 9802.2, 2869.7, 2582.0, 5 93989.4, 9802.2, 0.0, 0.0, 9 0.0 , 0.0/ DATA VGRST2 / 0.0, 10.6, 3.7, 1.1, 5 0.01, 10.6, 0.0, 0.0, 9 0.0 , 0.0/ DATA VGRST3 / 153.5, 180.0, 233.0, 110.0, 5 855.0, 180.0, 1.0, 1.0, 9 1.0, 1.0 / DO 100 ChNo = 1, NCH C**** First compute optical parameters. C**** (Note: CHIL is constrained to be >= 0.01, as in SiB calcs.) AA = 0.5 - (0.633 + 0.330*VGCHIL(ITYP(ChNo)))*VGCHIL(ITYP(ChNo)) BB = 0.877 * ( ONE - 2.*AA ) CC = ( AA + BB*SUNANG(ChNo) ) / SUNANG(ChNo) EXTK1 = CC * SQSCAT(ChNo) EXTK2 = (ONE / VGZMEW(ITYP(ChNo))) * SQSCAT(ChNo) DUM1 = PDIR(ChNo) * CC DUM2 = (ONE-PDIR(ChNo)) * ( BB*(ONE/3.+PIE/4.) + AA*1.5 ) C**** Bound extinction coefficient by 50./ZLAI: ZK = PDIR(ChNo) *MIN( EXTK1, 50. _d 0/ZLAI(ChNo) ) + & (ONE-PDIR(ChNo))*MIN( EXTK2, 50. _d 0/ZLAI(ChNo) ) C**** Now compute unstressed canopy resistance: GAMMA = VGRST1(ITYP(ChNo)) / VGRST3(ITYP(ChNo)) + & VGRST2(ITYP(ChNo)) EKAT = EXP( ZK*ZLAI(ChNo) ) RHO4 = GAMMA / (PAR(ChNo) * (DUM1 + DUM2)) DUM1 = (VGRST2(ITYP(ChNo)) - GAMMA) / (GAMMA + 1.E-20) DUM2 = (RHO4 * EKAT + ONE) / (RHO4 + ONE) DUM3 = ZK * VGRST3(ITYP(ChNo)) RCINV = ( DUM1*LOG(DUM2) + ZK*ZLAI(ChNo) ) / DUM3 RCUN(ChNo) = ONE / (RCINV * GREEN(ChNo) + 1.E-10) 100 CONTINUE RETURN END
C**** C**** [ END RCUNST ] C**** C**** ----------------------------------------------------------------- C**** ///////////////////////////////////////////////////////////////// C**** ----------------------------------------------------------------- C**** C**** [ BEGIN SOIL ] C**** SUBROUTINE SOIL ( I NCH, ITYP, WET, VGBEEX, VGPSAX, VGCSAX, DELZ, O PHR, SOILCO, WETEQ & ) C**** C**** This subroutine returns soil moisture potential and conductivity. IMPLICIT NONE C**** #include "sibber.h" C**** INTEGER NCH INTEGER ITYP(NCH), ChNo _RL WET(NCH), PHR(NCH), SOILCO(NCH), VGPSAX(NCH), & VGCSAX(NCH), VGBEEX(NCH), DELZ(NTYPS), WETEQ(NCH), & WEXPB, WET0, PHEQ DO 100 ChNo = 1, NCH WET0 = MAX(WET(CHNO),0.01 _d 0) WEXPB = WET0**VGBEEX(ChNo) PHR(ChNo) = VGPSAX(ChNo) / WEXPB SOILCO(ChNo) = VGCSAX(ChNo) * WEXPB * WEXPB * WET0 * WET0 * WET0 PHEQ = PHR(CHNO) - DELZ(ITYP(CHNO)) WETEQ(CHNO) = ( PHEQ/VGPSAX(CHNO) ) ** ( -1/VGBEEX(CHNO) ) 100 CONTINUE RETURN END
C**** C**** [ END SOIL ] C**** C**** ----------------------------------------------------------------- C**** ///////////////////////////////////////////////////////////////// C**** ----------------------------------------------------------------- C**** C**** [ BEGIN FLUXES ] C**** SUBROUTINE FLUXES ( I NCH, ITYP, DTSTEP, ESATTC, DESDTC, ALHX, I ETURB, DEDEA, DEDTC, HSTURB, DHSDEA, DHSDTC, I RC, DRCDEA, DRCDTC, I SWNET, HLWDWN, ALWRAD, BLWRAD, ESNFRC, I TM, EM, CSOIL, PSUR, EMAXRT, WMAX, U TC, TD, EA, SWET1, SNOW, O RUNOFF, EVAP, SHFLUX, SMELT, HLWUP, BOMB, STRDG1, O STRDG2, STRDG3, STRDG4, STRDG5, STRDG6, STRDG7, O STRDG8, STRDG9 & ) C**** C**** This subroutine computes the fluxes of latent and sensible heat C**** from the surface through an energy balance calculation. C**** IMPLICIT NONE C**** #include "sibber.h" C**** INTEGER NCH INTEGER ITYP(NCH), ChNo _RL DTSTEP, ESATTC(NCH), DESDTC(NCH), ALHX(NCH), & ETURB(NCH), DEDEA(NCH), DEDTC(NCH), & HSTURB(NCH), DHSDEA(NCH), DHSDTC(NCH), & RC(NCH), DRCDEA(NCH), DRCDTC(NCH), & SWNET(NCH), HLWDWN(NCH), ALWRAD(NCH), BLWRAD(NCH), & TM(NCH), EM(NCH), CSOIL(NCH), PSUR(NCH), & EMAXRT(NCH), WMAX(NLAY,NTYPS), & TC(NCH), TD(NCH), EA(NCH), ESNFRC(NCH), & SWET1(NCH,NLAY), SNOW(NCH), & RUNOFF(NCH), EVAP(NCH), SHFLUX(NCH), SMELT(NCH), & HLWUP(NCH), BOMB(NCH) _RL STRDG1(NCH),STRDG2(NCH),STRDG3(NCH),STRDG4(NCH) _RL STRDG5(NCH),STRDG6(NCH),STRDG7(NCH),STRDG8(NCH) _RL STRDG9(NCH) _RL HLWTC, CDEEPS, Q0, RHOAIR, CONST, DHLWTC, & EPLANT, A11, A12, A21, A22, F0, & DEA, DTC, SNLEFT, Q0X, Q0SNOW, & EANEW, ESATNW, EHARMN, DETERM, DENOM LOGICAL CHOKE _RL deepfac(ntyps) DATA deepfac /1.,1.,1.,1.,1.,1.,1.,1.,1.,1./ C**** C**** ------------------------------------------------------------------- DO 200 ChNo = 1, NCH C**** HLWTC = ALWRAD(CHNO) + BLWRAD(CHNO) * TC(CHNO) CDEEPS = PIE * CSOIL(ChNo) * 2. / 86400. RHOAIR = PSUR(ChNo) * 100. / (RGAS * TC(ChNo)) CONST = RHOAIR * EPSILON / PSUR(ChNo) DHLWTC = BLWRAD(CHNO) C**** C**** Compute matrix elements A11, A22, AND Q0 (energy balance equation). C**** A11 = CSOIL(ChNo)/DTSTEP + & DHLWTC + & DHSDTC(ChNo) + & ALHX(CHNO)*DEDTC(ChNo) + & CDEEPS A12 = DHSDEA(ChNo) + ALHX(CHNO) * DEDEA(ChNo) Q0 = SWNET(ChNo) + & HLWDWN(ChNo) - & HLWTC - & HSTURB(ChNo) - & ALHX(CHNO) * ETURB(ChNo) - & CDEEPS * (TC(ChNo) - TD(ChNo)) STRDG3(ChNo)=Q0/A11 STRDG4(ChNo)=(SWNET(ChNo)+HLWDWN(ChNo)-HLWTC)/A11 STRDG5(ChNo)=HSTURB(ChNo)/A11 STRDG6(ChNo)=ALHX(CHNO)*ETURB(ChNo)/A11 STRDG7(ChNo)=CDEEPS*(TC(ChNo) - TD(ChNo))/A11 STRDG9(ChNo)=A11 C**** C**** Compute matrix elements A21, A22, and F0 (canopy water budget C**** equation) and solve for fluxes. Three cases are considered: C**** C**** 1. Standard case: RC>0. C**** 2. RC = 0. Can only occur if CIR is full or ETURB is negative. C**** CHOKE = .TRUE. IF( RC(CHNO) .GT. 0.) THEN EPLANT = CONST * (ESATTC(ChNo) - EA(ChNo)) / RC(ChNo) IF(EPLANT*ETURB(ChNo).GE.0.) THEN EHARMN = 2.*EPLANT*ETURB(CHNO) / (EPLANT + ETURB(ChNo)) ELSE EHARMN=0. ENDIF C**** C**** Some limitations to A21 and A22 are applied: C**** we assume that the increase in plant evaporation C**** due to an increase in either TC or EA balances C**** or outweighs any decrease due to RC changes. C**** A21 = -DEDTC(ChNo)*RC(ChNo) + & max(0. _d 0, CONST*DESDTC(ChNo) - EHARMN*DRCDTC(ChNo) ) A22 = -( RC(ChNo)*DEDEA(ChNo) + & max( 0. _d 0, CONST + EHARMN*DRCDEA(ChNo) ) ) F0 = RC(ChNo) * (ETURB(ChNo) - EPLANT) DETERM = MIN( A12*A21/(A11*A22) - 1., -0.1 _d 0) DEA = ( Q0*A21 - A11*F0 ) / ( DETERM * A11*A22 ) DTC = ( Q0 - A12*DEA ) / A11 STRDG1(ChNo)=DTC STRDG2(ChNo)=DEA STRDG8(ChNo)=-A12*DEA/A11 EVAP(ChNo) = ETURB(ChNo) + DEDEA(ChNo)*DEA + DEDTC(ChNo)*DTC SHFLUX(ChNo) = HSTURB(ChNo) + DHSDEA(ChNo)*DEA + & DHSDTC(ChNo)*DTC DENOM = DETERM * A11*A22 ELSE CHOKE = .FALSE. A21 = -DESDTC(ChNo) A22 = 1. F0 = ESATTC(ChNo) - EA(ChNo) DEA = ( Q0*A21 - A11*F0 ) / ( A12*A21 - A11*A22 ) DTC = ( Q0 - A12*DEA ) / A11 STRDG1(ChNo)=DTC STRDG2(ChNo)=DEA STRDG8(ChNo)=-A12*DEA/A11 EVAP(ChNo) = ETURB(ChNo) + DEDEA(ChNo)*DEA + DEDTC(ChNo)*DTC SHFLUX(ChNo) = HSTURB(ChNo) + DHSDEA(ChNo)*DEA + & DHSDTC(ChNo)*DTC DENOM = A12 * A21 - A11*A22 ENDIF C**** - - - - - - - - - - - - - - - - - - - - C**** Account for snowmelt, if necessary. C**** - - - - - - - - - - - - - - - - - - - - SMELT(CHNO)=0. SNLEFT=SNOW(CHNO)-EVAP(CHNO)*DTSTEP*ESNFRC(CHNO) IF(TC(CHNO)+DTC .GT. TF .AND. SNLEFT.GT.0.) THEN C**** First re-calculate energy balance under assumption that all C**** snow is melted. Q0X=Q0-ALHM*SNLEFT/DTSTEP SMELT(CHNO)=SNLEFT/DTSTEP DEA = ( Q0X*A21 - A11*F0 ) / DENOM DTC = ( Q0X - A12*DEA ) / A11 C**** If TC+DTC is now less than TF, too much snow has melted. Now C**** solve for balance assuming only some of the snow has melted. C**** Set TC to TF. IF(TC(CHNO)+DTC .LT. TF) THEN DTC=TF-TC(CHNO) DEA=(F0-A21*DTC)/A22 Q0SNOW=A11*DTC+A12*DEA SMELT(CHNO)=(Q0-Q0SNOW)/ALHM ENDIF STRDG1(ChNo)=DTC STRDG2(ChNo)=DEA STRDG8(ChNo)=-A12*DEA/A11 EVAP(ChNo) = ETURB(ChNo) + DEDEA(ChNo)*DEA + & DEDTC(ChNo)*DTC SHFLUX(ChNo) = HSTURB(ChNo) + DHSDEA(ChNo)*DEA + & DHSDTC(ChNo)*DTC ENDIF C**** - - - - - - - - - - - - - - - - - - - - - - - C**** Adjustments C**** 1. Adjust deltas and fluxes if all available water evaporates C**** during time step: C**** IF( EVAP(CHNO) .GT. EMAXRT(CHNO) ) THEN CHOKE = .FALSE. DEA = EM(CHNO) - EA(CHNO) DTC = & (Q0 + ALHX(CHNO)*(ETURB(ChNo)-EMAXRT(CHNO)) - DHSDEA(CHNO)*DEA) & / ( A11 - ALHX(CHNO)*DEDTC(ChNo) ) STRDG1(ChNo)=DTC STRDG2(ChNo)=DEA STRDG8(ChNo)=0. EVAP(CHNO) = EMAXRT(CHNO) SHFLUX(ChNo) = HSTURB(ChNo) + DHSDEA(ChNo)*DEA + & DHSDTC(ChNo)*DTC SMELT(CHNO)=0. ENDIF C**** C**** Adjust DEA and DTC if solutions were pathological: C**** ESATNW = ESATTC(CHNO)+DESDTC(CHNO)*DTC EANEW = EA(CHNO) + DEA C**** 2. Pathological cases. C**** Case 1: EVAP is positive in presence of negative gradient. C**** Case 2: EVAP and ETURB have opposite sign, implying that C**** "virtual effects" derivatives are meaningless and thus that we C**** do not know the proper tendency terms. C**** In both cases, assume zero evaporation for the time step. C IF( ( EVAP(CHNO) .LT. 0. .AND. EM(CHNO).LT.ESATNW ) C & .OR. ( EVAP(CHNO)*ETURB(CHNO) .LT. 0. ) ) THEN IF( EVAP(CHNO) .LT. 0. .AND. EM(CHNO).LT.ESATNW ) THEN CHOKE = .FALSE. DEA = EM(CHNO) - EA(CHNO) DTC = ( Q0 + ALHX(CHNO)*ETURB(ChNo) - DHSDEA(CHNO)*DEA ) / & ( A11 - ALHX(CHNO)*DEDTC(ChNo) ) STRDG1(ChNo)=DTC STRDG2(ChNo)=DEA STRDG8(ChNo)=0. EVAP(CHNO) = 0. SHFLUX(ChNo) = HSTURB(ChNo) + DHSDEA(ChNo)*DEA + & DHSDTC(ChNo)*DTC IF(TC(CHNO)+DTC .GT. TF .AND. SNOW(CHNO).GT.0.) THEN Q0X=Q0-ALHM*SNOW(CHNO)/DTSTEP SMELT(CHNO)=SNOW(CHNO)/DTSTEP DTC = ( Q0X + ALHX(CHNO)*ETURB(ChNo) - DHSDEA(CHNO)*DEA ) / & ( A11 - ALHX(CHNO)*DEDTC(ChNo) ) IF(TC(CHNO)+DTC .LT. TF) THEN DTC=TF-TC(CHNO) Q0SNOW=A11*DTC+A12*DEA SMELT(CHNO)=(Q0-Q0SNOW)/ALHM ENDIF SHFLUX(ChNo) = HSTURB(ChNo) + DHSDEA(ChNo)*DEA + & DHSDTC(ChNo)*DTC ENDIF ENDIF C**** 3. Exceesive dea change: apply "choke". IF( CHOKE .AND. ABS(DEA) .GT. 0.5*EA(CHNO) ) THEN DEA = SIGN(.5*EA(CHNO),DEA) DTC = ( Q0 - A12*DEA ) / A11 STRDG1(ChNo)=DTC STRDG2(ChNo)=DEA STRDG8(ChNo)=-A12*DEA/A11 EVAP(ChNo) = ETURB(ChNo) + DEDEA(ChNo)*DEA + DEDTC(ChNo)*DTC SHFLUX(ChNo) = HSTURB(ChNo) + DHSDEA(ChNo)*DEA + & DHSDTC(ChNo)*DTC IF(TC(CHNO)+DTC .GT. TF .AND. SNOW(CHNO).GT.0.) THEN SNLEFT=SNOW(CHNO)-EVAP(CHNO)*DTSTEP*ESNFRC(CHNO) Q0X=Q0-ALHM*SNLEFT/DTSTEP SMELT(CHNO)=SNLEFT/DTSTEP DTC = ( Q0X - A12*DEA ) / A11 IF(TC(CHNO)+DTC .LT. TF) THEN DTC=TF-TC(CHNO) Q0SNOW=A11*DTC+A12*DEA SMELT(CHNO)=(Q0-Q0SNOW)/ALHM ENDIF EVAP(ChNo) = ETURB(ChNo) + DEDEA(ChNo)*DEA + DEDTC(ChNo)*DTC SHFLUX(ChNo) = HSTURB(ChNo) + DHSDEA(ChNo)*DEA + & DHSDTC(ChNo)*DTC ENDIF ENDIF C**** - - - - - - - - - - - - - - - - - - - - - - - - - - - - TC(ChNo) = TC(ChNo) + DTC EA(ChNo) = EA(ChNo) + DEA TD(ChNo) = TD(ChNo) + c CHANGED THIS: deep layer 2 times deeper & DTSTEP * CDEEPS * (TC(ChNo) - TD(ChNo)) / . (CSOIL(ChNo)*67.73*deepfac(ityp(ChNo))) HLWUP(CHNO) = HLWTC + DHLWTC*DTC SNOW(CHNO)=SNOW(CHNO)-SMELT(CHNO)*DTSTEP C**** Make sure EA remains positive EA(CHNO) = MAX(EA(CHNO), 0.0 _d 0) 200 CONTINUE RETURN END
C**** C**** [ END FLUXES ] C**** C**** ----------------------------------------------------------------- C**** ///////////////////////////////////////////////////////////////// C**** ----------------------------------------------------------------- C**** C**** [ BEGIN VPDFAC ] C**** SUBROUTINE VPDFAC ( I NCH, ITYP, ESATTC, EA, O VPDSTR & ) C**** C**** This subroutine computes the vapor pressure deficit stress. C**** IMPLICIT NONE C**** #include "sibber.h" C**** INTEGER NCH INTEGER ITYP(NCH), ChNo _RL ESATTC(NCH), EA(NCH), VPDSTR(NCH) c _RL VGDFAC(NTYPS) C**** c DATA VGDFAC / .0273, .0357, .0310, .0238, c 5 .0275, .0275, 0., 0., c 9 0., 0. / C**** C**** ----------------------------------------------------------------- DO 100 ChNo = 1, NCH C**** c VPDSTR(ChNo) = 1. - (ESATTC(ChNo)-EA(ChNo)) * VGDFAC(ITYP(ChNo)) c VPDSTR (ChNo) = MIN( 1. _d 0, MAX( VPDSTR(ChNo), 1. _d -10 ) ) VPDSTR(CHNO) = 1. C**** 100 CONTINUE C**** RETURN END
C**** C**** [ END VPDFAC ] C**** C**** ----------------------------------------------------------------- C**** ///////////////////////////////////////////////////////////////// C**** ----------------------------------------------------------------- C**** C**** [ BEGIN TMPFAC ] C**** SUBROUTINE TMPFAC ( I NCH, ITYP, TC, O FTEMP & ) C**** C**** Compute temperature stress factor. C**** IMPLICIT NONE C**** #include "sibber.h" C**** INTEGER NCH INTEGER ITYP(NCH), ChNo, TypPtr _RL TC(NCH), FTEMP(NCH) _RL VGTLL(MemFac*NTYPS), VGTU(MemFac*NTYPS), & VGTCF1(MemFac*NTYPS), VGTCF2(MemFac*NTYPS), & VGTCF3(MemFac*NTYPS) C**** DATA VGTLL /MemFac*273., MemFac*273., MemFac*268., MemFac*283., 5 MemFac*283., MemFac*273., MemFac* 0., MemFac* 0., 9 MemFac* 0., MemFac* 0. / DATA VGTU /MemFac*318., MemFac*318., MemFac*313., MemFac*328., 5 MemFac*323., MemFac*323., MemFac* 0., MemFac* 0., 9 MemFac* 0. , MemFac* 0./ DATA VGTCF1 / MemFac*-1.43549E-06, MemFac*-6.83584E-07, 3 MemFac* 1.67699E-07, MemFac*-1.43465E-06, 5 MemFac*-2.76097E-06, MemFac*-1.58094E-07, 7 MemFac* 0., MemFac* 0., 9 MemFac* 0. , MemFac* 0./ DATA VGTCF2 / MemFac* 7.95859E-04, MemFac* 3.72064E-04, 3 MemFac*-7.65944E-05, MemFac* 8.24060E-04, 5 MemFac* 1.57617E-03, MemFac* 8.44847E-05, 7 MemFac* 0., MemFac* 0., 9 MemFac* 0. , MemFac* 0./ DATA VGTCF3 / MemFac*-1.11575E-01, MemFac*-5.21533E-02, 3 MemFac* 6.14960E-03, MemFac*-1.19602E-01, 5 MemFac*-2.26109E-01, MemFac*-1.27272E-02, 7 MemFac* 0., MemFac* 0., 9 MemFac* 0. , MemFac* 0./ C**** C**** ---------------------------------------------------------------- DO 100 ChNo = 1, NCH C**** TypPtr = MOD(ChNo,MemFac) + (ITYP(ChNo)-1)*MemFac + 1 FTEMP(ChNo) = (TC(ChNo) - VGTLL(TypPtr)) * & (TC(ChNo) - VGTU(TypPtr)) * & ( VGTCF1(TypPtr)*TC(ChNo)*TC(ChNo) + & VGTCF2(TypPtr)*TC(ChNo) + & VGTCF3(TypPtr) ) IF ( TC(ChNo) .LE. VGTLL(TypPtr) .OR. TC(ChNo) .GE. VGTU(TypPtr) ) & FTEMP (ChNo) = 1.E-10 FTEMP(CHNO) = MIN( 1. _d 0, MAX( FTEMP(ChNo), 1. _d -10 ) ) C**** 100 CONTINUE C**** RETURN END
C**** C**** [ END TMPFAC ] C**** C**** ----------------------------------------------------------------- C**** ///////////////////////////////////////////////////////////////// C**** ----------------------------------------------------------------- C**** C**** [ BEGIN SMFAC ] C**** SUBROUTINE SMFAC ( I NCH, ITYP, ESATTC, EA, PHR, SOILCO, I RCUN, VPDSTR, FTEMP, TC, PSUR, Z2, I RSOIL1, RSOIL2, VGPH1X, VGPH2X, VGRPLX, O RC & ) C**** C**** This subroutine estimates RC after computing the C**** leaf water potential stress. C**** IMPLICIT NONE C**** #include "sibber.h" C**** INTEGER NCH INTEGER ITYP(NCH), ChNo _RL ESATTC(NCH), EA(NCH), PHR(NCH), SOILCO(NCH), & RCUN(NCH), VPDSTR(NCH), FTEMP(NCH), TC(NCH), & PSUR(NCH), Z2(NCH), RSOIL1(NCH), RSOIL2(NCH), & VGPH1X(NCH), VGPH2X(NCH), VGRPLX(NCH), RC(NCH) _RL RCUNTD, RHOAIR, CONST, DEF, D12, DR2, & RSOIL, R0, EEST, RSTFAC C**** C**** ----------------------------------------------------------------- DO 100 ChNo = 1, NCH C**** RCUNTD = RCUN(ChNo) / ( VPDSTR(ChNo)*FTEMP(ChNo) ) RHOAIR = PSUR(ChNo) * 100. / ( RGAS*TC(ChNo) ) C**** CONST = RHOAIR * EPSILON / PSUR(ChNo) DEF = ( ESATTC(ChNo) - EA(ChNo) ) * CONST D12 = VGPH1X(ChNo) - VGPH2X(ChNo) DR2 = PHR(ChNo) - Z2(ChNo) - VGPH2X(ChNo) RSOIL = RSOIL1(ChNo) + RSOIL2(ChNo)/SOILCO(ChNo) R0 = ( VGRPLX(ChNo) + RSOIL ) / RHOW EEST = DEF*DR2 / ( RCUNTD*D12 + DEF*R0 ) RSTFAC = ( DR2 - R0*EEST ) / D12 RSTFAC = MIN( 1. _d 0, MAX( 0.001 _d 0, RSTFAC ) ) RC(ChNo) = RCUNTD / RSTFAC C**** 100 CONTINUE C**** RETURN END
C**** C**** [ END SMFAC ] C**** C**** ----------------------------------------------------------------- C**** ///////////////////////////////////////////////////////////////// C**** ----------------------------------------------------------------- C**** C**** [ BEGIN RSURFP ] C**** SUBROUTINE RSURFP ( I NCH, UM, U2FAC, Z2, RDC, WET, ESATTC, EA, U RC, O RX1, RX2 & ) C**** IMPLICIT NONE INTEGER NCH INTEGER ChNo _RL UM(NCH), U2FAC(NCH), Z2(NCH), RDC(NCH), & WET(NCH), ESATTC(NCH), EA(NCH), & RC(NCH), RX1(NCH), RX2(NCH) _RL U2, RSURF, HESAT C**** C**** ----------------------------------------------------------------- DO 100 ChNo = 1, NCH C**** U2 = UM(ChNo) * U2FAC(ChNo) c RSURF = RDC(ChNo) / U2 + 30. / (1.E-20 + WET(ChNo)) RSURF = RDC(ChNo) / U2 + 26. + 6. / (1.E-20 + WET(ChNo))**2 C**** Account for subsaturated humidity at soil surface: C**** HESAT = ESATTC(CHNO) * MIN( 1. _d 0, WET(CHNO)*2. _d 0) IF( EA(CHNO) .LT. HESAT ) THEN RSURF=RSURF*( 1. + (ESATTC(CHNO)-HESAT)/(HESAT-EA(CHNO)) ) ELSE RSURF=1.E10 ENDIF RX1(CHNO)=RC(CHNO) RX2(CHNO)=RSURF RC(ChNo) = RC(CHNO) * RSURF / ( RC(ChNo) + RSURF ) C**** 100 CONTINUE C**** RETURN END
C**** C**** [ END RSURFP ] C**** C**** ----------------------------------------------------------------- C**** ///////////////////////////////////////////////////////////////// C**** ----------------------------------------------------------------- C**** C**** [ BEGIN RCANOP ] C**** SUBROUTINE RCANOP ( I NCH, CAPAC, SNOW, SATCAP, RA, ETURB, SNWFRC, I POTFRC, U RC & ) C**** C**** The effective latent heat resistance RC depends on the quantity C**** of interception reservoir water and the snow cover. POTFRC C**** is the fraction of the tile from which potential evaporation C**** occurs. C**** IMPLICIT NONE INTEGER NCH INTEGER ChNo _RL CAPAC(NCH), SNOW(NCH), SATCAP(NCH), RA(NCH), ETURB(NCH), & RC(NCH), SNWFRC(NCH), POTFRC(NCH) _RL ETCRIT,RAMPFC C**** (Note: ETCRIT arbitrarily set to ~-5 W/m2, or -2.e-6 mm/sec.) DATA ETCRIT/ -2.E-6 / C**** C**** ----------------------------------------------------------------- DO 100 ChNo = 1, NCH C**** - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - C**** Case 1: Vegetation present (SATCAP GT .001). Potential evap. from c**** both interception reservoir and snow. IF(SATCAP(CHNO).GT..001) THEN RC(ChNo)=RC(ChNo)*(1.-POTFRC(CHNO))/ & ( 1.+POTFRC(CHNO)*RC(ChNo)/RA(ChNo) ) ENDIF C**** - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - C**** Case 2: Vegetation absent (SATCAP LE .001). Potential evap. from c**** snow only. IF(SATCAP(CHNO) .LE. .001) THEN RC(ChNo)=RC(ChNo)*(1.-SNWFRC(CHNO))/ & ( 1.+SNWFRC(CHNO)*RC(ChNo)/RA(ChNo) ) ENDIF C**** - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - C**** Assume RC=0 for condensation (dew). C**** RAMPFC is used to ensure continuity in RC. RAMPFC=ETURB(CHNO)/ETCRIT IF ( RAMPFC .GE. 0. ) RC(CHNO) = RC(CHNO)*(1.-RAMPFC) IF ( RAMPFC .GT. 1. ) RC(ChNo) = 0. C**** 100 CONTINUE C**** RETURN END
C**** C**** [ END RCANOP ] C**** C**** ----------------------------------------------------------------- C**** ///////////////////////////////////////////////////////////////// C**** ----------------------------------------------------------------- C**** C***** [ BEGIN WUPDAT ] C**** SUBROUTINE WUPDAT ( I NCH, ITYP, DTSTEP, I EVAP, SATCAP, VGWMAX, TC, RA, RC, I RX1, RX2,ESNFRC,EIRFRC, U CAPAC, SNOW, SWET, RUNOFF, O EINT, ESOI, EVEG, ESNO, RUNSRF, FWSOIL & ) C**** C**** This subroutine allows evapotranspiration to adjust the water C**** contents of the interception reservoir and the soil layers. C**** IMPLICIT NONE C**** #include "sibber.h" C**** INTEGER NCH INTEGER ITYP(NCH), ChNo _RL EVAP(NCH), SATCAP(NCH), VGWMAX(NLAY,NTYPS), & TC(NCH), RA(NCH), RC(NCH), & CAPAC(NCH), SNOW(NCH), SWET(nch,NLAY), & RUNOFF(NCH), RX1(NCH), & RX2(NCH), RUNSRF(NCH), FWSOIL(NCH), & ESNFRC(NCH), EIRFRC(NCH) _RL EINT(NCH), ESOI(NCH), EVEG(NCH), ESNO(NCH) _RL DTSTEP, EGRO, FWS, THRU, DEWRUN, & WTOTAL,WLAY1,WLAY2,ELAY1,ELAY2,EGROI C**** C**** ----------------------------------------------------------------- DO 100 ChNo = 1, NCH C**** C**** Partition evap between interception, snow, and ground reservoirs. C**** WLAY1 = SWET(ChNo,SFCLY) * VGWMAX(SFCLY,ITYP(ChNo)) WLAY2 = SWET(ChNo,ROOTLY) * VGWMAX(ROOTLY,ITYP(ChNo)) WTOTAL = WLAY1 + WLAY2 C**** ESNO(CHNO)=ESNFRC(CHNO)*EVAP(CHNO)*DTSTEP EINT(CHNO)=EIRFRC(CHNO)*EVAP(CHNO)*DTSTEP EGRO = EVAP(CHNO)*DTSTEP - ESNO(CHNO) - EINT(CHNO) C**** Ensure that individual capacities are not exceeded. IF(ESNO(CHNO) .GT. SNOW(CHNO)) THEN EINT(CHNO)=EINT(CHNO)+(ESNO(CHNO)-SNOW(CHNO)) ESNO(CHNO)=SNOW(CHNO) ENDIF EGROI=EGRO+EINT(CHNO) IF(EGROI .GT. CAPAC(CHNO)+WTOTAL) THEN ESNO(CHNO)=ESNO(CHNO)+EGROI-(CAPAC(CHNO)+WTOTAL) EGROI=CAPAC(CHNO)+WTOTAL ENDIF EINT(CHNO)=EGROI-EGRO IF(EINT(CHNO) .GT. CAPAC(CHNO)) THEN EGRO=EGRO+EINT(CHNO)-CAPAC(CHNO) EINT(CHNO)=CAPAC(CHNO) ENDIF IF(EGRO .GT. WTOTAL) THEN EINT(CHNO)=EINT(CHNO)+EGRO-WTOTAL EGRO=WTOTAL ENDIF C**** C**** Separate egro into surface-evaporation/transpiration components: C**** IF( RX1(CHNO)+RX2(CHNO) .NE. 0. ) THEN ESOI(CHNO)=EGRO*RX1(CHNO)/(RX1(CHNO)+RX2(CHNO)) EVEG(CHNO)=EGRO - ESOI(CHNO) ELSE ESOI(CHNO)=EGRO/2. EVEG(CHNO)=EGRO/2. ENDIF C**** C**** Translate ESOI and EVEG into evaporation fluxes from layers 1 and 2: C**** IF( WTOTAL .GT. 0. ) THEN FWS = EVEG(CHNO) / WTOTAL ELSE FWS = 1. ENDIF ELAY1 = WLAY1*FWS + ESOI(CHNO) ELAY2 = WLAY2*FWS C**** C**** Ensure that enough soil water is available in each layer: C**** IF( ELAY1 .GT. WLAY1 ) THEN ELAY2 = ELAY2 + (ELAY1 - WLAY1) ELAY1 = WLAY1 ENDIF IF( ELAY2 .GT. WLAY2 ) THEN ELAY1 = ELAY1 + (ELAY2 - WLAY2) ELAY2 = WLAY2 ENDIF C**** Special case for condensation: IF(EVAP(CHNO) .LT. 0.) THEN EINT(CHNO)=(1.-ESNFRC(CHNO))*EVAP(CHNO)*DTSTEP ELAY1=0. ELAY2=0. ESOI(CHNO)=0. EVEG(CHNO)=0. ESNO(CHNO)=ESNFRC(CHNO)*EVAP(CHNO)*DTSTEP ENDIF C**** C**** Remove moisture from reservoirs: C**** SNOW(ChNo) = SNOW(ChNo) - ESNO(CHNO) CAPAC(ChNo) = CAPAC(ChNo) - EINT(CHNO) SWET(ChNo,SFCLY) = (WLAY1 - ELAY1) / VGWMAX(SFCLY,ITYP(ChNo)) SWET(ChNo,ROOTLY) = (WLAY2 - ELAY2) / VGWMAX(ROOTLY,ITYP(CHNO)) C**** C**** Ensure against numerical precision problems: SWET(ChNo,SFCLY) = MIN( 1. _d 0, MAX( 0. _d 0, SWET(ChNo,SFCLY) ) $ ) SWET(ChNo,ROOTLY) = MIN( 1. _d 0, MAX( 0. _d 0, SWET(ChNo,ROOTLY) $ ) ) C**** C**** C**** ------------------------------------------------- C**** DEWFALL: C**** C**** If dewfall adds to cir, insure that it does not fill C**** beyond capacity. If resulting throughfall adds to top soil layer, C**** insure that it also does not fill beyond capacity. C**** IF( CAPAC(ChNo) .GT. SATCAP(ChNo) ) THEN THRU = CAPAC(ChNo) - SATCAP(ChNo) CAPAC(ChNo) = SATCAP(ChNo) SWET(ChNo,SFCLY) = SWET(ChNo,SFCLY) + & THRU / VGWMAX(SFCLY,ITYP(ChNo)) DEWRUN=0. IF ( SWET(ChNo,SFCLY) .GT. 1. ) THEN DEWRUN = ( SWET(ChNo,SFCLY) - 1. ) * VGWMAX(SFCLY,ITYP(ChNo)) SWET(ChNo,SFCLY) = 1. RUNOFF(ChNo) = RUNOFF(ChNo) + DEWRUN/DTSTEP RUNSRF(ChNo) = RUNSRF(ChNo) + DEWRUN/DTSTEP ENDIF FWSOIL(CHNO) = FWSOIL(CHNO) + (THRU-DEWRUN)/DTSTEP ENDIF C**** 100 CONTINUE C**** RETURN END
C**** C**** [ END WUPDAT ] C**** C**** ----------------------------------------------------------------- C**** ///////////////////////////////////////////////////////////////// C**** ----------------------------------------------------------------- C**** C**** [ BEGIN GWATER ] C**** SUBROUTINE GWATER ( I NCH, ITYP, WSMAX, PHLAY, AKLAY, TC, I DTSTEP, VGZDEX, VGSLOX, WETEQ1, WETEQ2, I PHSAT, AKSAT, U SWET, RUNOFF, GDRAIN & ) C**** C**** This subroutine computes diffusion between soil layers. C**** IMPLICIT NONE C**** #include "sibber.h" C**** INTEGER NCH INTEGER ITYP(NCH), ChNo _RL VGSLOX(NCH), RUNOFF(NCH), GDRAIN(NCH) _RL ZDEP12, AKAVE, GWFLUX, ZDEP23, HALFMX, DHDZ, & FAREA, TFM2, FRAMP _RL WSMAX(NLAY,NTYPS), PHLAY(nch,NLAY), & AKLAY(nch,NLAY), TC(NCH), & DTSTEP, SWET(nch,NLAY), & VGZDEX(NLAY,nch), WETEQ1(NCH), WETEQ2(NCH), & PHSAT(NCH), AKSAT(NCH) C**** C**** ---------------------------------------------------------------- DO 100 ChNo = 1, NCH C**** C**** Diffusion between layer 1 and 2: ZDEP12 = VGZDEX(SFCLY,ChNo) + VGZDEX(ROOTLY,ChNo) IF( SWET(CHNO,SFCLY) .GT. WETEQ1(CHNO) ) THEN FAREA=(SWET(CHNO,SFCLY) - WETEQ1(CHNO)) / (1. - WETEQ1(CHNO)) DHDZ = 1. + 2.*(PHSAT(CHNO)-PHLAY(CHNO,ROOTLY))/ZDEP12 AKAVE = AKSAT(CHNO) ELSE FAREA = 1. DHDZ = 1. + 2.*(PHLAY(ChNo,SFCLY)-PHLAY(ChNo,ROOTLY))/ZDEP12 AKAVE = AKLAY(ChNo,ROOTLY) ENDIF C**** GWFLUX = 1000. * DTSTEP * AKAVE * DHDZ * FAREA C**** C**** Test for limits on water holding capacity. C**** HALFMX=0.5*ABS( SWET(CHNO,SFCLY)-WETEQ1(CHNO) ) & * WSMAX(SFCLY,ITYP(CHNO)) IF (GWFLUX .GE. 0.) THEN GWFLUX = MIN( GWFLUX, & SWET(ChNo,SFCLY) * WSMAX(SFCLY,ITYP(ChNo)) ) GWFLUX = MIN( GWFLUX, WSMAX(ROOTLY,ITYP(ChNo)) - & SWET(ChNo,ROOTLY) * WSMAX(ROOTLY,ITYP(ChNo)) ) GWFLUX = MIN( GWFLUX, HALFMX ) ELSE GWFLUX = -MIN( ABS(GWFLUX), & SWET(ChNo,ROOTLY) * WSMAX(ROOTLY,ITYP(ChNo)) ) GWFLUX = -MIN( ABS(GWFLUX), WSMAX(SFCLY,ITYP(ChNo)) - & SWET(ChNo,SFCLY) * WSMAX(SFCLY,ITYP(ChNo)) ) GWFLUX = -MIN( ABS(GWFLUX), HALFMX ) ENDIF C**** C**** Prevent diffusion when ground is frozen (INCLUDE RAMPING): TFM2=TF-2. FRAMP=(TC(CHNO)-TFM2)/2. FRAMP=MIN(1. _d 0, MAX(0. _d 0,FRAMP) ) GWFLUX=GWFLUX*FRAMP C**** C**** Update water contents SWET(ChNo,SFCLY) = SWET(ChNo,SFCLY) - & GWFLUX / WSMAX(SFCLY,ITYP(ChNo)) SWET(ChNo,ROOTLY) = SWET(ChNo,ROOTLY) + & GWFLUX / WSMAX(ROOTLY,ITYP(ChNo)) C**** C**** - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - C**** Diffusion between root and recharge layers: ZDEP23 = VGZDEX(ROOTLY,ChNo) + VGZDEX(RECHLY,ChNo) DHDZ=1. + 2. * (PHLAY(ChNo,ROOTLY) - PHLAY(ChNo,RECHLY)) / ZDEP23 IF(DHDZ.GE.0.) THEN AKAVE = AKLAY(ChNo,ROOTLY) ELSE AKAVE = AKLAY(ChNo,RECHLY) ENDIF GWFLUX = 1000. * DTSTEP * AKAVE * DHDZ C**** C**** Test for limits on water holding capacity: HALFMX=0.5*ABS( SWET(CHNO,ROOTLY)-WETEQ2(CHNO) ) & * WSMAX(ROOTLY,ITYP(CHNO)) IF (GWFLUX .GE. 0.) THEN GWFLUX = MIN( GWFLUX, & SWET(ChNo,ROOTLY) * WSMAX(ROOTLY,ITYP(ChNo)) ) GWFLUX = MIN( GWFLUX, WSMAX(RECHLY,ITYP(ChNo)) - & SWET(ChNo,RECHLY) * WSMAX(RECHLY,ITYP(ChNo)) ) GWFLUX = MIN( GWFLUX, HALFMX ) ELSE GWFLUX = -MIN( ABS(GWFLUX), & SWET(ChNo,RECHLY) * WSMAX(RECHLY,ITYP(ChNo)) ) GWFLUX = -MIN( ABS(GWFLUX), WSMAX(ROOTLY,ITYP(ChNo)) - & SWET(ChNo,ROOTLY) * WSMAX(ROOTLY,ITYP(ChNo)) ) GWFLUX = -MIN( ABS(GWFLUX), HALFMX ) ENDIF C**** C**** Prevent diffusion when ground is frozen (INCLUDE RAMPING): FRAMP=(TC(CHNO)-TFM2)/2. FRAMP=MIN(1. _d 0, MAX(0. _d 0,FRAMP) ) GWFLUX=GWFLUX*FRAMP C**** C**** Update water contents SWET(ChNo,ROOTLY) = SWET(ChNo,ROOTLY) - & GWFLUX / WSMAX(ROOTLY,ITYP(ChNo)) SWET(ChNo,RECHLY) = SWET(ChNo,RECHLY) + & GWFLUX / WSMAX(RECHLY,ITYP(ChNo)) GDRAIN(CHNO)=GWFLUX/DTSTEP C**** C**** - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - C**** Flux of moisture out of lower soil layer to water table C**** (approximation to SiB) C**** GWFLUX = VGSLOX(ChNo) * AKLAY(ChNo,RECHLY) * 1000. * DTSTEP C**** Prevent diffusion when ground is frozen (INCLUDE RAMPING): FRAMP=(TC(CHNO)-TFM2)/2. FRAMP=MIN(1. _d 0, MAX(0. _d 0,FRAMP) ) GWFLUX=GWFLUX*FRAMP GWFLUX = MIN( GWFLUX, & SWET(ChNo,RECHLY) * WSMAX(RECHLY,ITYP(ChNo)) ) SWET(ChNo,RECHLY) = SWET(ChNo,RECHLY) - & GWFLUX / WSMAX(RECHLY,ITYP(ChNo)) C**** RUNOFF (ChNo) = RUNOFF (ChNo) + GWFLUX/DTSTEP C**** 100 CONTINUE C**** RETURN END
C**** C**** [ END GWATER ]