SUBROUTINE CLASSI(VPD,TADP,PADRY,RHOAIR,FCLOUD,RHOSNI, 1 1 RPCP,TRPCP,SPCP,TSPCP, 2 TA,QA,COSZS,PCPR,RRATE,SRATE, 3 PRESSG,QSWV,QSWI,QSWD, 3 IPCP,ILG,IL1,IL2,jl) C C * JUN 06/06 - V.FORTIN. ADD OPTION FOR PASSING IN C * RAINFALL AND SNOWFALL RATES C * CALCULATED BY ATMOSPHERIC MODEL. C * AUG 19/04 - Y.DELAGE. REGROUP COMMON BLOCKS C MAKE DECLARATIONS EXPLICIT C * AUG 09/02 - D.VERSEGHY. MOVE CALCULATION OF SOME C * ATMOSPHERIC VARIABLES HERE C * PRIOR TO GATHERING. C * JUL 26/02 - R.BROWN/S.FASSNACHT/D.VERSEGHY. PROVIDE C * ALTERNATE METHODS OF ESTIMATING C * RAINFALL/SNOWFALL PARTITIONING. C * JUN 27/02 - D.VERSEGHY. ESTIMATE FRACTIONAL CLOUD COVER C * AND RAINFALL/SNOWFALL RATES C * IF NECESSARY. C IMPLICIT NONE INTEGER IPCP,ILG,IL1,IL2,I,JL REAL EA,CA,CB,EASAT,WA,CONST C * OUTPUT ARRAYS. C REAL VPD (ILG), TADP (ILG), PADRY (ILG), RHOAIR(ILG), 1 FCLOUD(ILG), RHOSNI(ILG), RPCP (ILG), TRPCP (ILG), 2 SPCP (ILG), TSPCP (ILG) C C * INPUT ARRAYS. C REAL TA (ILG), QA (ILG), PRESSG(ILG), COSZS (ILG), 1 QSWV (ILG), QSWI (ILG), QSWD (ILG), PCPR (ILG), 2 RRATE (ILG), SRATE (ILG) C C * WORK ARRAYS. C REAL PHASE (ILG) C #include "class_com.cdk"
C---------------------------------------------------------------- C DO 100 I=IL1,IL2 if(qa(i).lt.1.e-8) qa(i)=1.e-5 EA=QA(I)*PRESSG(I)/(0.622+0.378*QA(I)) IF(TA(I).GE.TFREZ) THEN CA=17.269 CB=35.86 ELSE CA=21.874 CB=7.66 ENDIF EASAT=611.0*EXP(CA*(TA(I)-TFREZ)/(TA(I)-CB)) VPD(I)=MAX(0.0,(EASAT-EA)/100.0) PADRY(I)=PRESSG(I)-EA RHOAIR(I)=PADRY(I)/(RGAS*TA(I))+EA/(GASV*TA(I)) WA=QA(I)/(1.0-QA(I)) CONST=LOG(WA*PADRY(I)/(0.622*611.0)) TADP(I)=(CB*CONST-CA*TFREZ)/(CONST-CA) C C * CLOUD COVER AND DENSITY OF FRESH SNOW. C IF(COSZS(I).GT.0.0.AND.(QSWV(I)+QSWI(I)).GT.0.0) THEN FCLOUD(I)=MAX(0.0,MIN(1.0,QSWD(I)/(QSWV(I)+QSWI(I)))) ELSE FCLOUD(I)=0. ENDIF IF(TA(I).LE.TFREZ) THEN RHOSNI(I)=67.92+51.25*EXP((TA(I)-TFREZ)/2.59) ELSE RHOSNI(I)=MIN((119.17+20.0*(TA(I)-TFREZ)),200.0) ENDIF C C * PRECIPITATION PARTITIONING BETWEEN RAIN AND SNOW. C IF(PCPR(I).GT.0.) THEN IF(IPCP.EQ.1) THEN IF(TA(I).GT.TFREZ) THEN RPCP (I)=PCPR(I)/RHOW TRPCP(I)=MAX((TA(I)-TFREZ),0.0) SPCP (I)=0.0 TSPCP(I)=0.0 ELSE SPCP (I)=PCPR(I)/RHOSNI(I) TSPCP(I)=MIN((TA(I)-TFREZ),0.0) RPCP (I)=0.0 TRPCP(I)=0.0 ENDIF ELSEIF(IPCP.EQ.2) THEN IF(TA(I).LE.TFREZ) THEN PHASE(I)=1.0 ELSEIF(TA(I).GE.(TFREZ+2.0)) THEN PHASE(I)=0.0 ELSE PHASE(I)=1.0-0.5*(TA(I)-TFREZ) ENDIF RPCP(I)=(1.0-PHASE(I))*PCPR(I)/RHOW IF(RPCP(I).GT.0.0) TRPCP(I)=MAX((TA(I)-TFREZ),0.0) SPCP(I)=PHASE(I)*PCPR(I)/RHOSNI(I) IF(SPCP(I).GT.0.0) TSPCP(I)=MIN((TA(I)-TFREZ),0.0) ELSEIF(IPCP.EQ.3) THEN IF(TA(I).LE.TFREZ) THEN PHASE(I)=1.0 ELSEIF(TA(I).GE.(TFREZ+6.0)) THEN PHASE(I)=0.0 ELSE PHASE(I)=(0.0202*(TA(I)-TFREZ)**6-0.3660* 1 (TA(I)-TFREZ)**5+2.0399*(TA(I)-TFREZ)**4- 2 1.5089*(TA(I)-TFREZ)**3-15.038* 3 (TA(I)-TFREZ)**2+4.6664*(TA(I)-TFREZ)+100.0)/ 4 100.0 ENDIF RPCP(I)=(1.0-PHASE(I))*PCPR(I)/RHOW IF(RPCP(I).GT.0.0) TRPCP(I)=MAX((TA(I)-TFREZ),0.0) SPCP(I)=PHASE(I)*PCPR(I)/RHOSNI(I) IF(SPCP(I).GT.0.0) TSPCP(I)=MIN((TA(I)-TFREZ),0.0) ELSEIF(IPCP.EQ.4) THEN RPCP(I)=RRATE(I)/RHOW SPCP(I)=SRATE(I)/RHOSNI(I) IF (RPCP(i).EQ.0) THEN TRPCP(I)=0 ELSE TRPCP(I)=MAX((TA(I)-TFREZ),0.0) ENDIF IF (SPCP(i).EQ.0) THEN TSPCP(I)=0 ELSE TSPCP(I)=MIN((TA(I)-TFREZ),0.0) ENDIF ENDIF ELSE RPCP (I)=0.0 TRPCP(I)=0.0 SPCP (I)=0.0 TSPCP(I)=0.0 ENDIF 100 CONTINUE C RETURN END