SUBROUTINE CHKWAT(ISFC,PCPR,EVAP,RUNOFF,WLOST,RAICAN,SNOCAN, 4,7
1 RAICNI,SNOCNI,ZPOND,ZPONDI,THLIQ,THICE,
2 THLIQI,THICEI,ZSNOW,RHOSNO,XSNOW,SNOWI,
3 FCS,FGS,FI,BAL,THPOR,THLMIN,DELZW,
4 ISAND,IG,ILG,IL1,IL2,JL )
C
C * AUG 19/04 - Y.DELAGE REGROUP COMMON BLOCKS
C MAKE EXPLICIT DECLARATIONS
C CORRECT A BUG AND FORCE BALANCE
C * JUN 25/02 - D.VERSEGHY. RENAME VARIABLES FOR CLARITY; UPDATES
C * CAUSED BY CONVERSION OF PONDING DEPTH
C * TO A PROGNOSTIC VARIABLE; SHORTENED
C * CLASS4 COMMON BLOCK.
C * MAY 23/02 - D.VERSEGHY. MOVE CALCULATION OF "XSNOW" INTO
C * THIS ROUTINE.
C * JUN 20/97 - D.VERSEGHY. CLASS - VERSION 2.7.
C * MODIFICATIONS TO ALLOW FOR VARIABLE
C * SOIL PERMEABLE DEPTH.
C * AUG 24/95 - D.VERSEGHY. CLASS - VERSION 2.4.
C * RATIONALIZE USE OF WLOST.
C * ALSO INTRODUCE NEW VALUE OF ACCLMT
C * CORRESPONDING TO 3 MM/YR AS USED
C * BY THE PILPS COMMUNITY.
C * AUG 18/95 - D.VERSEGHY. REVISIONS TO ALLOW FOR INHOMOGENEITY
C * BETWEEN SOIL LAYERS.
C * JAN 31/94 - D.VERSEGHY. LOCAL VERSION FOR CLIMATE RESEARCH
C * NETWORK: CHECK RAICAN AND SNOCAN
C * AGAINST -ACCLMT INSTEAD OF AGAINST 0.
C * AUG 16/93 - D.VERSEGHY. CLASS - VERSION 2.2.
C * RETURN WATER BALANCE CHECK TO ROUTINE
C * USE (COMMENTED OUT IN PREVIOUS VERSION)
C * AND RENAME SUBROUTINE FROM "CHKVAL"
C * TO "CHKWAT".
C * MAY 15/92 - M.LAZARE. CLASS - VERSION 2.1.
C * MOISTURE BALANCE CHECKS EXTRACTED FROM
C * "CLASSW" AND VECTORIZED.
C * APR 11/89 - D.VERSEGHY. THE FOLLOWING MOISTURE BALANCE CHECKS
C * ARE CARRIED OUT: INTERCEPTED MOISTURE
C * STORES AND LOCAL RUNOFF MUST BE .GE.0;
C * LIQUID SOIL LAYER MOISTURE STORES MUST
C * BE LESS THAN THE PORE VOLUME AND GREATER
C * THAN THE LIMITING VALUE "THLMIN"; FROZEN
C * SOIL LAYER MOISTURE STORES MUST BE LESS
C * THAN THE MAXIMUM AVAILABLE VOLUME (THE
C * PORE VOLUME - THLMIN) AND GE.0; AND THE
C * MOISTURE BALANCE OF THE TOTAL CANOPY/
C * SNOW/SOIL COLUMN MUST BE WITHIN A
C * SPECIFIED TOLERANCE. THE TOLERANCE
C * LEVEL ADOPTED IS DESIGNATED BY "ACCLMT".
C
C IMPLICIT NONE
INTEGER ISFC,IG,ILG,IL1,IL2,JL,I,KPTBAD,IPTBAD,JPTBAD,
1 IPTBDI,JPTBDI,KPTBDI,LPTBDI,IPTBDJ,JPTBDJ,KPTBDJ,LPTBDJ
REAL ACCLMT
C * INPUT FIELDS.
REAL PCPR (ILG), EVAP (ILG), RUNOFF(ILG), WLOST (ILG),
1 RAICAN(ILG), SNOCAN(ILG), RAICNI(ILG), SNOCNI(ILG),
2 ZPOND (ILG), ZPONDI(ILG), ZSNOW (ILG), RHOSNO(ILG),
3 XSNOW (ILG), SNOWI (ILG), FCS (ILG), FGS (ILG),
4 FI (ILG)
C
REAL THLIQ (ILG,IG), THICE (ILG,IG),
1 THLIQI(ILG,IG), THICEI(ILG,IG)
C
C * WORK ARRAYS.
C
REAL BAL (ILG)
C
C * SOIL INFORMATION ARRAYS.
C
REAL THPOR (ILG,IG), THLMIN(ILG,IG), DELZW (ILG,IG)
C
INTEGER ISAND (ILG,IG)
C
LOGICAL DIAGN
C
#include "class_com.cdk"
C
c ACCLMT=3.0*DELT/3.1536E7
data diagn / .false. /
ACCLMT=2.0E-2
C-----------------------------------------------------------------------
IF(ISFC.EQ.1 .OR. ISFC.EQ.3) THEN
IPTBAD=0
JPTBAD=0
ENDIF
KPTBAD=0
DO 100 I=IL1,IL2
IF(FI(I).GT.0. .AND. ISAND(I,1).GT.-4) THEN
IF(ISFC.EQ.1 .OR. ISFC.EQ.3) THEN
IF(RAICAN(I).LT.(-1.0*ACCLMT)) IPTBAD=I
IF(SNOCAN(I).LT.(-1.0*ACCLMT)) JPTBAD=I
ENDIF
IF(RUNOFF(I).LT.0.0) KPTBAD=I
ENDIF
100 CONTINUE
C
IF(ISFC.EQ.1 .OR. ISFC.EQ.3) THEN
IF(IPTBAD.NE.0) THEN
WRITE(6,6100) IPTBAD,JL,ISFC,RAICAN(IPTBAD)
6100 FORMAT('0AT (I,JL)=(',I3,',',I3,'), ISFC=',I2,' RAICAN = ',
1 E13.5)
CALL XIT
('CHKWAT',-1)
ENDIF
IF(JPTBAD.NE.0) THEN
WRITE(6,6150) JPTBAD,JL,ISFC,SNOCAN(JPTBAD)
6150 FORMAT('0AT (I,JL)=(',I3,',',I3,'), ISFC=',I2,' SNOCAN = ',
1 E13.5)
CALL XIT
('CHKWAT',-2)
ENDIF
ENDIF
IF(KPTBAD.NE.0) THEN
WRITE(6,6200) KPTBAD,JL,ISFC,RUNOFF(KPTBAD)
6200 FORMAT('0AT (I,JL)=(',I3,',',I3,'), ISFC=',I2,' RUNOFF = ',
1 E13.5)
CALL XIT
('CHKWAT',-3)
ENDIF
C
IPTBDI=0
JPTBDI=0
KPTBDI=0
LPTBDI=0
DO 150 J=1,IG
DO 150 I=IL1,IL2
IF(FI(I).GT.0. .AND. ISAND(I,1).GT.-4) THEN
IF((THLIQ(I,J)-THPOR(I,J)).GT.ACCLMT) THEN
IPTBDI=I
IPTBDJ=J
ENDIF
IF(THLIQ(I,J).LT.(THLMIN(I,J)-ACCLMT) .AND.
1 ISAND(I,J).NE.-3) THEN
JPTBDI=I
JPTBDJ=J
ENDIF
IF((THICE(I,J)*RHOICE/RHOW-THPOR(I,J)+THLMIN(I,J))
1 .GT.ACCLMT.AND.ISAND(I,J).NE.-3) THEN
KPTBDI=I
KPTBDJ=J
ENDIF
IF(THICE(I,J).LT.-1.*ACCLMT) THEN
LPTBDI=I
LPTBDJ=J
ENDIF
ENDIF
150 CONTINUE
C
IF(IPTBDI.NE.0) THEN
WRITE(6,6250) IPTBDI,JL,ISFC,THLIQ(IPTBDI,IPTBDJ),
1 THPOR(IPTBDI,IPTBDJ),IPTBDJ
6250 FORMAT('0AT (I,JL)=(',I3,',',I3,'), ISFC=',I2,' THLIQ = ',
1 E13.5,' THPOR = ',E13.5,' FOR J=',I2)
CALL XIT
('CHKWAT',-4)
ENDIF
IF(JPTBDI.NE.0) THEN
WRITE(6,6300) JPTBDI,JL,ISFC,THLIQ(JPTBDI,JPTBDJ),JPTBDJ
6300 FORMAT('0AT (I,JL)=(',I3,',',I3,'), ISFC=',I2,' THLIQ = ',
1 E13.5,' FOR J=',I2)
CALL XIT
('CHKWAT',-5)
ENDIF
IF(KPTBDI.NE.0) THEN
WRITE(6,6350) KPTBDI,JL,ISFC,THICE(KPTBDI,KPTBDJ),
1 THPOR(KPTBDI,KPTBDJ),KPTBDJ
6350 FORMAT('0AT (I,JL)=(',I3,',',I3,'), ISFC=',I2,' THICE = ',
1 E13.5,' THPOR = ',E13.5,' FOR J=',I2)
CALL XIT
('CHKWAT',-6)
ENDIF
IF(LPTBDI.NE.0) THEN
WRITE(6,6400) LPTBDI,JL,ISFC,THICE(LPTBDI,LPTBDJ),LPTBDJ
6400 FORMAT('0AT (I,JL)=(',I3,',',I3,'), ISFC=',I2,' THICE = ',
1 E13.5,' FOR J=',I2)
CALL XIT
('CHKWAT',-7)
ENDIF
C
IPTBAD=0
IF(ISFC.EQ.1 .OR. ISFC.EQ.3) THEN
CANFAC=1.0
ELSE
CANFAC=0.0
ENDIF
DO 275 I=IL1,IL2
IF(FI(I).GT.0. .AND. ZSNOW(I).GT.0.) XSNOW(I)=1.0
IF(FI(I).GT.0. .AND. ISAND(I,1).GT.-4) THEN
IF(ISFC.EQ.1 .OR. ISFC.EQ.2) THEN
SNOFAC=1.0/(FCS(I)+FGS(I))
ELSE
SNOFAC=0.0
ENDIF
BAL(I)=PCPR(I)*DELT-
1 EVAP(I)*RHOW*DELT-RUNOFF(I)*RHOW+WLOST(I)-
2 CANFAC*(RAICAN(I)-RAICNI(I)+SNOCAN(I)-
3 SNOCNI(I))-(ZPOND(I)-ZPONDI(I))*RHOW-
4 (THLIQ(I,1)-THLIQI(I,1))*RHOW*DELZW(I,1)-
5 (THLIQ(I,2)-THLIQI(I,2))*RHOW*DELZW(I,2)-
6 (THLIQ(I,3)-THLIQI(I,3))*RHOW*DELZW(I,3)-
7 (THICE(I,1)-THICEI(I,1))*RHOICE*DELZW(I,1)-
8 (THICE(I,2)-THICEI(I,2))*RHOICE*DELZW(I,2)-
9 (THICE(I,3)-THICEI(I,3))*RHOICE*DELZW(I,3)
A -ZSNOW(I)*RHOSNO(I)+SNOFAC*SNOWI(I)
IF(ABS(BAL(I)).GT.ACCLMT.AND.DIAGN) THEN
IPTBAD=I
SNOFACB=SNOFAC
thliq1b=THLIQ(I,1)
zpondb=ZPOND(I)
ENDIF
IF(BAL(I).GT.0.) THEN
zpond(i)=ZPOND(I)+BAL(I)/RHOW
ELSE
THLIQ(I,1)=MAX(THLIQ(I,1)+BAL(I)/(RHOW*DELZW(I,1)),
1 THLMIN(I,1))
ENDIF
ENDIF
275 CONTINUE
IF(IPTBAD.NE.0) THEN
WRITE(6,6450) IPTBAD,JL,ISFC,BAL(IPTBAD)
WRITE(6,6460) PCPR(IPTBAD)*DELT,EVAP(IPTBAD)*RHOW*DELT,
1 RUNOFF(IPTBAD)*RHOW,WLOST(IPTBAD),
2 RAICNI(IPTBAD)-RAICAN(IPTBAD),SNOCNI(IPTBAD)-
3 SNOCAN(IPTBAD),(ZPOND(IPTBAD)-ZPONDI(IPTBAD))*RHOW
WRITE(6,6460)
1 (THLIQ1B -THLIQI(IPTBAD,1))*RHOW*DELZW(IPTBAD,1),
2 (THLIQ(IPTBAD,2)-THLIQI(IPTBAD,2))*RHOW*DELZW(IPTBAD,2),
3 (THLIQ(IPTBAD,3)-THLIQI(IPTBAD,3))*RHOW*DELZW(IPTBAD,3),
4 (THICE(IPTBAD,1)-THICEI(IPTBAD,1))*RHOICE*DELZW(IPTBAD,1),
5 (THICE(IPTBAD,2)-THICEI(IPTBAD,2))*RHOICE*DELZW(IPTBAD,2),
6 (THICE(IPTBAD,3)-THICEI(IPTBAD,3))*RHOICE*DELZW(IPTBAD,3)
WRITE(6,6460) ZSNOW(IPTBAD)*RHOSNO(IPTBAD),
1 SNOFACB*SNOWI(IPTBAD)
WRITE(6,6470) FCS(IPTBAD),FGS(IPTBAD)
6450 FORMAT('0AT (I,JL)=(',I3,',',I3,'), ISFC=',I2,' BAL = ',
1 E13.5)
6460 FORMAT(2X,7F15.8)
6470 FORMAT(2X,4E20.6)
WRITE(6,6460) THLIQ1B,THLIQ(IPTBAD,2),THLIQ(IPTBAD,3),
1 THLIQI(IPTBAD,1),THLIQI(IPTBAD,2),THLIQI(IPTBAD,3)
WRITE(6,6460) THICE(IPTBAD,1),THICE(IPTBAD,2),THICE(IPTBAD,3),
1 THICEI(IPTBAD,1),THICEI(IPTBAD,2),THICEI(IPTBAD,3)
WRITE(6,6460) DELZW(IPTBAD,1),DELZW(IPTBAD,2),DELZW(IPTBAD,3),
1 RAICNI(IPTBAD),RAICAN(IPTBAD),ZPONDB,
2 ZPONDI(IPTBAD)
c CALL XIT('CHKWAT',-8)
ENDIF
RETURN
END