!@sum This file contains the radiation subroutines which don''t use !@+ the module RADPAR. They are used by RADIATION and/or ALBEDO. SUBROUTINE RXSNOW(RBSNO,XCOSZ,GGSNO,RXSNO) 4,1 !@sum RXSNOW calculate zenith angle dependence for snow/ice albedo !@auth A. Lacis (modified by G. Schmidt) ! USE RADPAR, only : gtsalb,sgpgxg IMPLICIT NONE !@var RBSNO diffuse albedo REAL*8, INTENT(IN) :: RBSNO !@var XCOSZ zenith angle REAL*8, INTENT(IN) :: XCOSZ !@var GGSNO Asymmetry parameter for snow REAL*8, INTENT(IN) :: GGSNO !@var RXSNO direct albedo REAL*8, INTENT(OUT) :: RXSNO INTEGER NDBLS,NN REAL*8 XXG,XXT,GGSN,RBSN,FRTOP,TAU,TAUSN,GPFF,PR,PT,DBLS,SECZ,XANB * ,XANX,TANB,TANX,RASB,RASX,BNORM,XNORM,RARB,RARX,XATB,DENOM,DB * ,DX,UB,UX,DRBRAT,RBBOUT IF(RBSNO < 0.05D0) THEN RXSNO=RBSNO RETURN ENDIF XXG=0.D0 XXT=0.D0 GGSN=GGSNO IF(GGSNO > 0.9D0) GGSN=0.9D0 RBSN=RBSNO FRTOP=1.D0 IF(RBSNO > 0.5D0) THEN RBSN=0.5D0 FRTOP=((1.D0-RBSNO)/0.5D0)**2 ENDIF CALL GTSALB(XXG,XXT,RBBOUT,RBSN,GGSN,TAUSN,2) CALL SGPGXG(XCOSZ,TAUSN,GGSN,GPFF) PR=1.D0-GPFF PT=1.D0+GPFF DBLS=10.D0+1.44269D0*LOG(TAUSN) NDBLS=DBLS TAU=TAUSN/2**NDBLS C Set optically thin limit values of R,T,X using PI0 renormalization C ------------------------------------------------------------------ C SECZ=1.D0/XCOSZ XANB=EXP(-TAU-TAU) XANX=EXP(-TAU*SECZ) TANB=PT*XANB XXT=(SECZ-2.D0)*TAU TANX=PT*SECZ + *(.5D0+XXT*(.25D0+XXT*(.0833333D0+XXT*(.0208333D0+XXT))))*XANX RASB=PR*(1.D0-TAU*(2.D0-2.66667D0*TAU*(1.D0-TAU))) XXT=(SECZ+2.D0)*TAU RASX=PR*SECZ + *(.5D0-XXT*(.25D0-XXT*(.0833333D0-XXT*(.0208333D0-XXT)))) BNORM=(1.D0-XANB)/(RASB+TANB) XNORM=(1.D0-XANX)/(RASX+TANX) RASB=RASB*BNORM RASX=RASX*XNORM TANB=TANB*BNORM TANX=TANX*XNORM DO NN=1,NDBLS RARB=RASB*RASB RARX=XANX*RASX XATB=XANB+TANB DENOM=1.D0-RARB DB=(TANB+XANB*RARB)/DENOM DX=(TANX+RARX*RASB)/DENOM UB=RASB*(XANB+DB) UX=RARX+RASB*DX RASB=RASB+XATB*UB RASX=RASX+XATB*UX TANB=XANB*TANB+XATB*DB TANX=XANX*TANX+XATB*DX XANB=XANB*XANB XANX=XANX*XANX END DO DRBRAT=RASX/RBSN-1.D0 RXSNO=RBSNO*(1.D0+DRBRAT*FRTOP) RETURN END SUBROUTINE RXSNOW SUBROUTINE SETGTS(tgdata_in) 1,2 CCC SUBROUTINE GTSALB(GIN,TAUIN,RBBOUT,RBBIN,EGIN,TAUOUT,KGTAUR) IMPLICIT NONE REAL*8, INTENT(IN) :: GIN,TAUIN,RBBIN,EGIN INTEGER, INTENT(IN) :: KGTAUR REAL*8, INTENT(OUT) :: RBBOUT,TAUOUT REAL*8, INTENT(IN) :: tgdata_in(122,13) REAL*8, save :: TAUGSA(1001,14),SALBTG(768,14),TAUTGS(768) & ,TAUTGD(122),TGDATA(122,13) REAL*8 FFKG(4,3),RBBK(3) REAL*8, PARAMETER, DIMENSION(14) :: GVALUE = (/.0,.25,.45,.50,.55, * .60,.65,.70,.75,.80,.85,.90,.95,1./) REAL*8 CWM,CWE,TIJ,RBBI,RBB,BTAU,CUSPWM,CUSPWE,G,TAU,EG,DELTAU,TI * ,WTJ,WTI,GI,WGI,WGJ,F1,F2,F3,F4,F21,F32,F43,F3221,F4332,A,B,C * ,D,XF,FFCUSP,XEXM,CUSPWT,FFLINR,RB2,RB3,TBB,TB2,TB3,XG,XM * ,XP,RBBB,RI,WRJ,WRI,EI,WEI,WEJ,DELALB,X1,X2,X3,X4,XX,BB,DTAU INTEGER I,J,K,KTERPL,IT,JT,IG,JG,ITERPL,IGM,JGP,KG,IR,JR,IE,JE,IEM * ,JEP TGDATA = tgdata_in DO 100 I=1,122 TAUTGD(I)=(I-1)*0.1D0 IF(I > 24) TAUTGD(I)=(I-24)*0.2D0+2.2D0 IF(I > 48) TAUTGD(I)=(I-48)*0.5D0+7.0D0 IF(I > 72) TAUTGD(I)=(I-72)+19.0D0 IF(I > 96) TAUTGD(I)=(I-96)*5.0D0+40.0D0 IF(I > 112) TAUTGD(I)=(I-112)*100.0D0+100.0D0 IF(I == 121) TAUTGD(I)=9999.99D0 IF(I == 122) TAUTGD(I)=12000.0D0 100 CONTINUE DO 110 I=1,768 IF(I < 602) TAUTGS(I)=(I-1)*0.05D0 IF(I > 601) TAUTGS(I)=(I-601)*0.50D0+30.0D0 IF(I > 741) TAUTGS(I)=(I-741)*50.0D0+100.D0 IF(I > 758) TAUTGS(I)=(I-758)*1000.D0 110 CONTINUE DO 130 J=1,13 DO 120 I=1,768 CWM=0.5 CWE=0.5 IF(I > 759) CWM=0.0 IF(I > 759) CWE=0.0 TIJ=TAUTGS(I) CALL SPLINE(TAUTGD,TGDATA(1,J),122,TIJ,RBBI,CWM,CWE,0) SALBTG(I,J)=RBBI 120 CONTINUE 130 CONTINUE DO 150 J=1,13 DO 140 I=2,1000 RBB=(I-1)*0.001D0 CWM=0.5 CWE=0.5 CALL SPLINE(SALBTG(1,J),TAUTGS,768,RBB,BTAU,CWM,CWE,0) TAUGSA(I,J)=BTAU 140 CONTINUE 150 CONTINUE SALBTG(1,:) = 0 ! 1:14 TAUGSA(1,:) = 0 TAUGSA(1001,:) = 10000 SALBTG(:,14) = SALBTG(:,13)*2 - SALBTG(:,12) ! 1:768 TAUGSA(:,14) = TAUGSA(:,13)*2 - TAUGSA(:,12) ! 1:1001 RETURN ENTRY GTSALB(GIN,TAUIN,RBBOUT,RBBIN,EGIN,TAUOUT,KGTAUR) KTERPL=0 CUSPWM=0.5 CUSPWE=0.5 G=GIN TAU=TAUIN RBB=RBBIN EG=EGIN RBBOUT=0.0 TAUOUT=0.0 C --------------------------- C OPTICAL DEPTH INTERPOLATION C 0.05 ON (0.00 < TAU < 30.0) C 0.50 ON (30.0 < TAU < 100.) C 50.0 ON (100. < TAU < 1000) C --------------------------- IF(KGTAUR == 2) GO TO 300 200 CONTINUE DELTAU=0.05D0 TI=TAU/DELTAU IT=TI IF(IT > 599) GO TO 210 WTJ=TI-IT WTI=1.D0-WTJ IT=IT+1 GO TO 240 210 CONTINUE DELTAU=0.50D0 TI=TAU/DELTAU IT=TI IF(IT > 199) GO TO 220 WTJ=TI-IT WTI=1.0-WTJ IT=IT+541 GO TO 240 220 CONTINUE DELTAU=50.0D0 TI=TAU/DELTAU IT=TI IF(IT > 19) GO TO 230 WTJ=TI-IT WTI=1.0-WTJ IT=IT+649 GO TO 240 230 CONTINUE DELTAU=1000.0D0 TI=TAU/DELTAU IT=TI WTJ=TI-IT WTI=1.0-WTJ IT=IT+758 240 CONTINUE JT=IT+1 C --------------------------------- C ASYMMETRY PARAMETER INTERPOLATION C 0.05 CUBIC SPLINE (0.5 < G < 0.9) C 0.25 QUADRATIC ON (0.0 < G < 0.5) C LINEAR EXTRAP FOR (.95 < G < 1.0) C --------------------------------- GI=G*20.D0 IF(GI > 10.0) GO TO 250 IG=2 JG=3 ITERPL=1 GO TO 260 250 CONTINUE ITERPL=4 IG=GI WGJ=GI-IG WGI=1.D0-WGJ IG=IG-6 IF(IG > 12) THEN ITERPL=2 IG=12 ENDIF JG=IG+1 260 CONTINUE IGM=IG-1 JGP=JG+1 K=0 DO 270 KG=IGM,JGP K=K+1 F1=SALBTG(IT-1,KG) F2=SALBTG(IT ,KG) F3=SALBTG(JT ,KG) F4=SALBTG(JT+1,KG) IF(IT == 1) F1=-F3 F21=(F2-F1) F32=(F3-F2) F43=(F4-F3) F3221=(F32+F21)*0.5D0 F4332=(F43+F32)*0.5D0 A=F2 B=F3221 C=3.D0*F32-F3221-F3221-F4332 D=(F3221+F4332-F32-F32) XF=WTJ FFCUSP=A+XF*(B+XF*(C+XF*D)) XEXM = (1-2*XF)**2 ! = XE**2 CUSPWT=(1.0-XEXM)*CUSPWM+XEXM*CUSPWE FFLINR=A+XF*F32 FFKG(K,1)=FFCUSP*CUSPWT+FFLINR*(1.D0-CUSPWT) FFKG(K,2)=F2 FFKG(K,3)=F3 270 CONTINUE IF(ITERPL < 4) GO TO 290 DO 280 K=1,3 F1=FFKG(1,K) F2=FFKG(2,K) F3=FFKG(3,K) F4=FFKG(4,K) F21=(F2-F1) F32=(F3-F2) F43=(F4-F3) F3221=(F32+F21)*0.5D0 F4332=(F43+F32)*0.5D0 A=F2 B=F3221 C=3.D0*F32-F3221-F3221-F4332 D=(F3221+F4332-F32-F32) XF=WGJ FFCUSP=A+XF*(B+XF*(C+XF*D)) XEXM = (1-2*XF)**2 ! = XE**2 CUSPWT=(1.0-XEXM)*CUSPWM+XEXM*CUSPWE FFLINR=A+XF*F32 RBBK(K)=FFCUSP*CUSPWT+FFLINR*(1.D0-CUSPWT) 280 CONTINUE RBB=RBBK(1) RB2=RBBK(2) RB3=RBBK(3) TBB=TAU TB2=TAUTGS(IT) TB3=TAUTGS(JT) IF(KGTAUR == 1) RETURN IF(KTERPL == 1) GO TO 400 GO TO 300 290 CONTINUE XG=G*2.D0-0.5D0 IF(ITERPL == 2) XG=G*10.D0-9.D0 XM=1.D0-XG-XG XP=1.D0+XG+XG RBB=XM*XP*FFKG(ITERPL+1,1)-XG*XM*FFKG(ITERPL,1)+XG*XP*FFKG(4,1) RB2=XM*XP*FFKG(ITERPL+1,2)-XG*XM*FFKG(ITERPL,2)+XG*XP*FFKG(4,2) RB3=XM*XP*FFKG(ITERPL+1,3)-XG*XM*FFKG(ITERPL,3)+XG*XP*FFKG(4,3) IF(KGTAUR == 1) RETURN IF(KTERPL == 1) GO TO 400 300 CONTINUE RBBB=RBB RI=RBB*1000.D0 IR=RI WRJ=RI-IR WRI=1.D0-WRJ IR=IR+1 JR=IR+1 EI=EG*20.D0 IF(EI > 10.0) GO TO 310 IE=2 JE=3 ITERPL=1 GO TO 320 310 CONTINUE ITERPL=4 IE=EI WEJ=EI-IE WEI=1.D0-WEJ IE=IE-6 IF(IE > 12) THEN ITERPL=2 IE=12 ENDIF JE=IE+1 320 CONTINUE DELALB=0.001D0 IEM=IE-1 JEP=JE+1 K=0 DO 330 KG=IEM,JEP K=K+1 F1=TAUGSA(IR-1,KG) F2=TAUGSA(IR ,KG) F3=TAUGSA(JR ,KG) F4=TAUGSA(JR+1,KG) IF(IR == 1) F1=-F3 F21=(F2-F1) F32=(F3-F2) F43=(F4-F3) F3221=(F32+F21)*0.5D0 F4332=(F43+F32)*0.5D0 A=F2 B=F3221 C=3.D0*F32-F3221-F3221-F4332 D=(F3221+F4332-F32-F32) XF=WRJ FFCUSP=A+XF*(B+XF*(C+XF*D)) XEXM = (1-2*XF)**2 ! = XE**2 CUSPWT=(1.0-XEXM)*CUSPWM+XEXM*CUSPWE FFLINR=A+XF*F32 FFKG(K,1)=FFCUSP*CUSPWT+FFLINR*(1.D0-CUSPWT) FFKG(K,2)=F2 FFKG(K,3)=F3 330 CONTINUE X1=GVALUE(IE-1) X2=GVALUE(IE ) X3=GVALUE(JE ) X4=GVALUE(JE+1) XX=WEJ IF(ITERPL < 4) GO TO 350 DO 340 K=1,3 F1=FFKG(1,K) F2=FFKG(2,K) F3=FFKG(3,K) F4=FFKG(4,K) F21=(F2-F1) F32=(F3-F2) F43=(F4-F3) F3221=(F32+F21)*0.5D0 F4332=(F43+F32)*0.5D0 A=F2 B=F3221 C=3.D0*F32-F3221-F3221-F4332 D=(F3221+F4332-F32-F32) XF=WEJ FFCUSP=A+XF*(B+XF*(C+XF*D)) XEXM = (1-2*XF)**2 ! = XE**2 CUSPWT=(1.0-XEXM)*CUSPWM+XEXM*CUSPWE FFLINR=A+XF*F32 RBBK(K)=FFCUSP*CUSPWT+FFLINR*(1.D0-CUSPWT) 340 CONTINUE TBB=RBBK(1) TB2=RBBK(2) TB3=RBBK(3) IF(KTERPL == 1) GO TO 400 GO TO 390 350 CONTINUE XG=EG*2.D0-0.5D0 IF(ITERPL == 2) XG=G*10.D0-9.D0 XM=1.D0-XG-XG XP=1.D0+XG+XG TBB=XM*XP*FFKG(ITERPL+1,1)-XG*XM*FFKG(ITERPL,1)+XG*XP*FFKG(4,1) TB2=XM*XP*FFKG(ITERPL+1,2)-XG*XM*FFKG(ITERPL,2)+XG*XP*FFKG(4,2) TB3=XM*XP*FFKG(ITERPL+1,3)-XG*XM*FFKG(ITERPL,3)+XG*XP*FFKG(4,3) IF(KTERPL == 1) GO TO 400 390 CONTINUE KTERPL=1 TAU=TBB G=EGIN GO TO 200 400 CONTINUE IF(ABS(WTI*WTJ) < 0.1D0) DTAU=(RBBB-RB2)/(RB3-RB2) IF(ABS(WTI*WTJ) >= 0.1D0) THEN C=(RB3-RBB)/WTI-(RBB-RB2)/WTJ B=(RBB-RB2)/WTJ-WTJ*C A=RB2 BB=B*B+4.D0*C*(RBBB-A) IF(BB > 0.D0) DTAU=(SQRT(BB)-B)/(C+C) ENDIF TAUOUT=(IT-1+DTAU)*DELTAU RBBOUT=RBBB RETURN CCC END SUBROUTINE GTSALB END SUBROUTINE SETGTS SUBROUTINE SGPGXG(XMU,TAU,G,GG) 5 IMPLICIT NONE C ---------------------------------------------------------------- C COSBAR ADJUSTMENT TO REPRODUCE THE SOLAR ZENITH ANGLE DEPENDENCE C FOR AEROSOL ALBEDO FOR OPTICAL THICKNESSES [0.0 < TAU < 10000.0] C ---------------------------------------------------------------- REAL*8, INTENT(IN) :: XMU,TAU,G REAL*8, INTENT(OUT) :: GG REAL*8, INTENT(IN) :: GTAU_IN(51,11,143) REAL*8, SAVE :: GTAU(51,11,143) REAL*8 XI,WXI,WXJ,GI,WGI,WGJ,TI,WTJ,WTI INTEGER IX,JX,IG,JG,IT,IT0,JT C ------------------------------------------- C XMU (COSZ) SOLAR ZENITH ANGLE INTERPOLATION C DATA INTERVAL: 0.02 ON [0.0 < XMU < 1.0] C ------------------------------------------- XI=XMU*50.D0+0.999999D0 ! >1 since XMU=COSZ>.001 IX=XI JX=IX+1 WXJ=XI-IX WXI=1.D0-WXJ C ------------------------------- C COSBAR DEPENDENCE INTERPOLATION C 0.10 ON [0.0 < COSBAR < 1.0] C ------------------------------- GI=G*10.D0 IG=GI WGJ=GI-IG WGI=1.D0-WGJ IG=IG+1 JG=IG+1 C ----------------------------------------- C AEROSOL TAU INTERPOLATION INTERVALS C ----------------------------------------- C dTau 1 1 (Lin Int) 61 62 C 0.10 ON [0.00 , 0.00 < TAU < 6.00 , 6.10] C 63 64 92 93 C 0.50 ON [5.50 , 6.00 < TAU < 20.0 , 20.5] C 94 95 111 112 C 5.00 ON [15.0 , 20.0 < TAU < 100. , 105.] C 113 114 132 133 C 50.0 ON [50.0 , 100. < TAU < 1000 , 1050] C 134 143 C 1000 ON [ , 1000 < TAU < 10000, ] C ----------------------------------------- IF(TAU < 6.D0) THEN TI=TAU*10.D0+1. IT=TI WTJ=TI-IT IT0=0 ELSEIF(TAU < 20.D0) THEN TI=(TAU-6.D0)*2.00D0+2.D0 IT=TI WTJ=TI-IT IT0=62 ELSEIF(TAU < 100.D0) THEN TI=(TAU-20.D0)*0.20D0+2.D0 IT=TI WTJ=TI-IT IT0=93 ELSEIF(TAU < 1000.D0) THEN TI=(TAU-100.D0)*0.02D0+2.D0 IT=TI WTJ=TI-IT IT0=112 ELSE TI=TAU*0.001D0+1.D-6 IT=TI WTJ=TI-IT IF(IT > 9) IT=9 IT0=133 ENDIF WTI=1.D0-WTJ IT=IT+IT0 JT=IT+1 GG=WGI*(WTI*(WXI*GTAU(IX,IG,IT)+WXJ*GTAU(JX,IG,IT)) + + WTJ*(WXI*GTAU(IX,IG,JT)+WXJ*GTAU(JX,IG,JT))) + +WGJ*(WTI*(WXI*GTAU(IX,JG,IT)+WXJ*GTAU(JX,JG,IT)) + + WTJ*(WXI*GTAU(IX,JG,JT)+WXJ*GTAU(JX,JG,JT))) RETURN ENTRY SET_SGPGXG(GTAU_IN) GTAU = GTAU_IN RETURN END SUBROUTINE SGPGXG SUBROUTINE SPLINE(X,F,NXF,XX,FF,CUSPWM,CUSPWE,KXTRAP) 78 IMPLICIT NONE INTEGER, intent(in) :: NXF, KXTRAP REAL*8 , intent(in) :: X(NXF),F(NXF),XX, CUSPWM,CUSPWE REAL*8 , intent(out) :: FF C--------------------------------------------------------------------- C C SPLINE locates XX between points (F2,X2)(F3,X3) on 4-point spread C and returns 4-point Cubic Spline interpolated value FF = F(XX) C C Quadratic Derivatives of Spline are continuous at (F2,X2),(F3,X3) C (X-Coordinate may be specified in increasing or decreasing order) C C--------------------------------------------------------------------- C C Custom Control Parameters: CUSPWM,CUSPWE,KXTRAP C------------------------------ C C In cases where data points are unevenly spaced and/or data points C exhibit abrupt changes in value, Spline Interpolation may produce C undesirable bulging of interpolated values. In more extreme cases C Linear Interpolation may be less problematic to use. C C Interpolation can be weighted between: Cubic Spline and Linear by C adjusting weights CUSPWM and CUSPWE to values between 1.0 and 0.0 C C CUSPWM = Cubic Spline Weight at the (X2-X3) Interval Mid-point C CUSPWE = Cubic Spline Weight at the (X2-X3) Interval End-points C C For example, with: C C CUSPWM=1.0,CUSPWE=1.0 FF returns Cubic Spline interpolated value C CUSPWM=0.0,CUSPWE=0.0 FF returns Linearly interpolated value C C--------------------------------------------------------------------- C C Extrapolation for XX outside of defined interval: X(1)<->X(NXF) C C KXTRAP = 0 No Extrapolation (i.e., sets F(XX)=0.0) C 1 Fixed Extrapolation (F(XX) = edge value) C 2 Linear Extrapolation using 2 edge points C C--------------------------------------------------------------------- REAL*8 x1,x2,x3,x4, x21,x32,x43,x31,x42, betw,FFCUSP,FFLINR,CUSPWT REAL*8 f1,f2,f3,f4, f21,f32,f43,f3221,f4332, a,b,c,d, xf,xe,xexm INTEGER K K=2 X2=X(K) X3=X(NXF-1) BETW=(XX-X2)*(X3-XX) IF(BETW <= 0.D0) GO TO 120 100 CONTINUE K=K+1 X3=X(K) BETW=(XX-X2)*(X3-XX) IF(BETW >= 0.D0) GO TO 110 X2=X3 GO TO 100 110 CONTINUE F3=F(K) F4=F(K+1) X4=X(K+1) F2=F(K-1) X2=X(K-1) F1=F(K-2) X1=X(K-2) X21=X2-X1 X31=X3-X1 X32=X3-X2 X43=X4-X3 X42=X4-X2 F21=(F2-F1)/(X21*X21) F32=(F3-F2)/(X32*X32) F43=(F4-F3)/(X43*X43) F3221=(F32+F21)/X31*X21 F4332=(F43+F32)/X42*X43 A=F2 B=X32*F3221 C=3.D0*F32-F3221-F3221-F4332 D=(F3221+F4332-F32-F32)/X32 XF=XX-X2 C FFCUSP= Cubic Spline Interpolation Result C ----------------------------------------- FFCUSP=A+XF*(B+XF*(C+XF*D)) XE=(X3+X2-XX-XX)/X32 IF(XE < 0.D0) XE=-XE XEXM=XE**2 CUSPWT=(1.D0-XEXM)*CUSPWM+XEXM*CUSPWE C FFLINR= Linear Interpolation Result C ----------------------------------- FFLINR=A+XF*F32*X32 FF=FFCUSP*CUSPWT+FFLINR*(1.D0-CUSPWT) GO TO 160 C Edge Point Interval Interpolation and/or Extrapolation C ------------------------------------------------------ 120 CONTINUE BETW=(X2-XX)*(X3-X2) IF(BETW < 0.D0) GO TO 140 C X(1),X(2) Edge Point Interval Interpolation C -------------------------------------------- X1=X(1) F1=F(1) F2=F(2) X21=X2-X1 F21=(F2-F1)/X21 XF=XX-X1 BETW=(X2-XX)*XF IF(BETW < 0.D0) GO TO 130 F3=F(3) X3=X(3) X32=X3-X2 X31=X3-X1 C=((F3-F2)/X32-F21)/X31 B=F21-X21*C A=F1 FFCUSP=A+XF*(B+XF*C) FFLINR=A+XF*F21 XE=1.D0-2.D0*XF/X21 IF(XE < 0.D0) XE=-XE XEXM=XE**2 CUSPWT=(1.D0-XEXM)*CUSPWM+XEXM*CUSPWE FF=FFCUSP*CUSPWT+FFLINR*(1.D0-CUSPWT) GO TO 160 130 CONTINUE C Extrapolation for XX Outside of Interval X(1) - X(2) C ---------------------------------------------------- C IF(KXTRAP == 0) (No Extrapolation: sets F(XX)=0.0) C IF(KXTRAP == 1) (Extrapolation at Fixed Edge Value) C IF(KXTRAP == 2) (2 Edge Point Linear Extrapolation) IF(KXTRAP == 0) FF=0.D0 IF(KXTRAP == 1) FF=F1 IF(KXTRAP == 2) FF=F1+XF*F21 GO TO 160 140 CONTINUE C X(NXF-1),X(NXF) Edge Point Interval Interpolation C -------------------------------------------------- F3=F(NXF) X3=X(NXF) F2=F(NXF-1) X2=X(NXF-1) X32=X3-X2 F32=(F3-F2)/X32 XF=XX-X3 BETW=(X2-XX)*(XX-X3) IF(BETW < 0.D0) GO TO 150 F1=F(NXF-2) X1=X(NXF-2) X21=X2-X1 X31=X3-X1 F21=(F2-F1)/X21 XF=XX-X2 C 3-Point Quadratic Interpolation for Edge Intervals C -------------------------------------------------- C C (Edge Option) ---------------------------------------------- C For Linear Interpolation within Edge Intervals C between X(1),X(2), and between X(NXF-1),X(NXF) C set the value of coefficient C below, to C=0.0 C ---------------------------------------------- C=(F32-F21)/X31 B=F21+X21*C A=F2 FFCUSP=A+XF*(B+XF*C) FFLINR=A+XF*F32 XE=1.D0-2.D0*XF/X32 IF(XE < 0.D0) XE=-XE XEXM=XE**2 CUSPWT=(1.D0-XEXM)*CUSPWM+XEXM*CUSPWE FF=FFCUSP*CUSPWT+FFLINR*(1.D0-CUSPWT) GO TO 160 150 CONTINUE C Extrapolation for X Outside of Interval X(NXF-1)-X(NXF) C -------------------------------------------------------- C IF(KXTRAP == 0) (No Extrapolation: sets F(XX)=0.0) C IF(KXTRAP == 1) (Extrapolation at Fixed Edge Value) C IF(KXTRAP == 2) (2 Edge Point Linear Extrapolation) IF(KXTRAP == 0) FF=0.D0 IF(KXTRAP == 1) FF=F3 IF(KXTRAP == 2) FF=F3+XF*(F3-F2)/(X3-X2) 160 CONTINUE RETURN END SUBROUTINE SPLINE ccc the following subroutines were just moved from RADIATION.f to ccc reduce its size. Only MODULE RADPAR subroutines or those that ccc USE RADPAR module were left. SUBROUTINE BOXAV1(DEGLAT,TAULAT,NLAT,JALIM,JBLIM,TAU) 18 IMPLICIT NONE C C-------------------------------------------------------------------- C BOXAV1 Performs: C Latitudinal average (area-weighted) of TAULAT C C DEGLAT Center latitude of grid-box variable (TAULAT) C of the form: DEGLAT = -90+(J-1)*180/(NLAT-1) C C TAULAT Zonal average value is constant over grid-bos C C JALIM, JBLIM Latitude boxes for which (TAULAT) is averaged C C TAU Area-weighted (TAULAT) latitude average value C-------------------------------------------------------------------- C INTEGER, INTENT(IN) :: NLAT, JALIM, JBLIM REAL*8, DIMENSION(NLAT), INTENT(IN) :: DEGLAT, TAULAT REAL*8, INTENT(OUT) :: TAU REAL*8 ASUM,TSUM,PI,RADIAN,RLAT1,ALAT1,RLAT2,ALAT2,ALATJ INTEGER J1,J,J2 ASUM=0.D0 TSUM=0.D0 PI=ACOS(-1.D0) RADIAN=180.D0/PI J1=JALIM-1 IF(J1 < 1) J1=1 RLAT1=(0.5D0*(DEGLAT(J1)+DEGLAT(JALIM))+90.D0)/RADIAN ALAT1=SIN(RLAT1) DO 110 J=JALIM,JBLIM J2=J+1 IF(J2 > NLAT) J2=NLAT RLAT2=(0.5D0*(DEGLAT(J)+DEGLAT(J2))+90.D0)/RADIAN ALAT2=SIN(RLAT2) ALATJ=0.5D0*(ALAT1+ALAT2)/(RLAT2-RLAT1) ASUM=ASUM+ALATJ TSUM=TSUM+ALATJ*TAULAT(J) RLAT1=RLAT2 ALAT1=ALAT2 110 CONTINUE TAU=TSUM/ASUM RETURN END SUBROUTINE BOXAV1 SUBROUTINE BOXAV2(DEGLAT,TAULAT,SIZLAT,NLAT,JALIM,JBLIM,SIZ) 12 IMPLICIT NONE C C-------------------------------------------------------------------- C BOXAV2 Performs: C TAULAT-weighted latitudinal average of SIZLAT C C DEGLAT Center latitude of grid-box variable (TAULAT) C of the form: DEGLAT = -90+(J-1)*180/(NLAT-1) C C TAULAT Zonal average value is constant over grid-box C SIZLAT Zonal average value is constant over grid-box C C JALIM, JBLIM Latitude boxes for which variable is averaged C C SIZ TAULAT-weighted latitudinal average of SIZLAT C-------------------------------------------------------------------- C INTEGER, INTENT(IN) :: NLAT,JALIM,JBLIM REAL*8, DIMENSION(NLAT), INTENT(IN) :: DEGLAT,TAULAT,SIZLAT REAL*8, INTENT(OUT) :: SIZ REAL*8 ASUM,TSUM,PI,RADIAN,RLAT1,RLAT2,ALAT1,ALAT2,ALATJ INTEGER J,J1,J2 ASUM=0.D0 TSUM=0.D0 PI=ACOS(-1.D0) RADIAN=180.D0/PI J1=JALIM-1 IF(J1 < 1) J1=1 RLAT1=(0.5D0*(DEGLAT(J1)+DEGLAT(JALIM))+90.D0)/RADIAN ALAT1=SIN(RLAT1) DO 110 J=JALIM,JBLIM J2=J+1 IF(J2 > NLAT) J2=NLAT RLAT2=(0.5D0*(DEGLAT(J)+DEGLAT(J2))+90.D0)/RADIAN ALAT2=SIN(RLAT2) ALATJ=0.5D0*(ALAT1+ALAT2)/(RLAT2-RLAT1) ASUM=ASUM+ALATJ*TAULAT(J) TSUM=TSUM+ALATJ*TAULAT(J)*SIZLAT(J) RLAT1=RLAT2 ALAT1=ALAT2 110 CONTINUE SIZ=(1.D-20+TSUM)/(1.D-10+ASUM) RETURN END SUBROUTINE BOXAV2 SUBROUTINE PHATMO(P,H,D,T,O,Q,S,OCM,WCM,NPHD,NATM) 1 IMPLICIT NONE C ------------------------------------------------------------------ C ------------- MCCLATCHY (1972) ATMOSPHERE DATA ----------- C ------------------------------------------------------------------ C C INPUT DATA C------------------ C NATM=0 GIVES ABREVIATED DATA FOR STANDARD ATMOSPHER C (INPUT: P OR H) (RETURNS: H OR P & D,T) C C NATM=1 GIVES ATMOSPHERE DATA FOR TROPICAL LATITUDES C NATM=2 GIVES ATMOSPHERE DATA FOR MIDLATITUDE SUMMER C NATM=3 GIVES ATMOSPHERE DATA FOR MIDLATITUDE WINTER C NATM=4 GIVES ATMOSPHERE DATA FOR SUBARCTIC SUMMER C NATM=5 GIVES ATMOSPHERE DATA FOR SUBARCTIC WINTER C NATM=6 GIVES ATMOSPHERE DATA FOR STANDARD ATMOSPHER C C NPHD=1 RETURNS H,D,T,O,Q,S DATA FOR GIVEN PRESSURE P C NPHD=2 RETURNS P,D,T,O,Q,S DATA FOR GIVEN HEIGHT H C NPHD=3 RETURNS P,H,T,O,Q,S DATA FOR GIVEN DENSITY D C C OUTPUT DATA C------------------ C P = PRESSURE IN MILLIBARS C H = HEIGHT IN KILOMETERS C D = DENSITY IN GRAMS/METER**3 C T = TEMPERATURE (ABSOLUTE) C O = OZONE MIXING RATIO (GRAMS OZONE)/(GRAMS AIR) C Q = SPECIFIC HUMIDITY (GRAMS WATER VAPOR)/(GRAMS AIR) C S = SATURATION RATIO (GRAMS WATER VAPOR)/(GRAMS AIR) C OCM = OZONE (CM-STP) ABOVE GIVEN HEIGHT C WCM = WATER VAPOR (CM-STP) ABOVE GIVEN HEIGHT C C REMARKS C------------------ C INPUT P,H,D PARAMETERS ARE NOT ALTERED C P,D INTERPOLATION IS EXPONENTIAL WITH HEIGHT C NO EXTRAPOLATION IS MADE OUTSIDE 0-100 KM INTERVAL C S IS NOT COMPUTED ABOVE 40 KM (FORMULA NOT ACCURATE) C C R = Q/S GIVES RELATIVE HUMIDITY C W = Q/(1-Q) GIVES WATER VAPOR MIXING RATIO C N = D*2.079E 16 GIVES NUMBER DENSITY PER CM**3 C REAL*8, DIMENSION(33) :: * PRS1,PRS2,PRS3,PRS4,PRS5,PRS6 1 ,DNS1,DNS2,DNS3,DNS4,DNS5,DNS6 2 ,TMP1,TMP2,TMP3,TMP4,TMP5,TMP6 3 ,WVP1,WVP2,WVP3,WVP4,WVP5,WVP6 4 ,OZO1,OZO2,OZO3,OZO4,OZO5,OZO6 REAL*8, DIMENSION(33,6) :: PRES,DENS,TEMP,WVAP,OZON EQUIVALENCE + (PRES(1,1),PRS1(1)),(DENS(1,1),DNS1(1)),(TEMP(1,1),TMP1(1)) + ,(PRES(1,2),PRS2(1)),(DENS(1,2),DNS2(1)),(TEMP(1,2),TMP2(1)) + ,(PRES(1,3),PRS3(1)),(DENS(1,3),DNS3(1)),(TEMP(1,3),TMP3(1)) + ,(PRES(1,4),PRS4(1)),(DENS(1,4),DNS4(1)),(TEMP(1,4),TMP4(1)) + ,(PRES(1,5),PRS5(1)),(DENS(1,5),DNS5(1)),(TEMP(1,5),TMP5(1)) + ,(PRES(1,6),PRS6(1)),(DENS(1,6),DNS6(1)),(TEMP(1,6),TMP6(1)) EQUIVALENCE (WVAP(1,1),WVP1(1)),(OZON(1,1),OZO1(1)) EQUIVALENCE (WVAP(1,2),WVP2(1)),(OZON(1,2),OZO2(1)) EQUIVALENCE (WVAP(1,3),WVP3(1)),(OZON(1,3),OZO3(1)) EQUIVALENCE (WVAP(1,4),WVP4(1)),(OZON(1,4),OZO4(1)) EQUIVALENCE (WVAP(1,5),WVP5(1)),(OZON(1,5),OZO5(1)) EQUIVALENCE (WVAP(1,6),WVP6(1)),(OZON(1,6),OZO6(1)) REAL*8, PARAMETER, DIMENSION(33) :: HTKM = * (/1d-9, 1d0, 2d0, 3d0, 4d0, 5d0, 6d0, 7d0, 8d0, 9d0,10d0,11d0 1 ,12d0,13d0,14d0,15d0,16d0,17d0,18d0,19d0,20d0,21d0,22d0,23d0 * ,24d0,25d0,30d0,35d0,40d0,45d0,50d0,70d0,99.9d0/) C---------------------------------------------------------------------- C0000 GLOBAL U.S. (1976) STANDARD ATMOSPHERE P, T, GEO H PARAMETERS C---------------------------------------------------------------------- REAL*8, PARAMETER, DIMENSION(8) :: SPLB=(/ * 1013.25d0, 226.32d0, 54.748d0 , 8.6801d0, * 1.109d0 , .66938d0, .039564d0, 3.7338d-03/), * STLB=(/288.15d0, 216.65d0, 216.65d0, 228.65d0, * 270.65d0, 270.65d0, 214.65d0, 186.87d0/), * SHLB=(/0d0,11d0,20d0,32d0,47d0,51d0,71d0,84.852d0/), * SDLB=(/-6.5d0,0d0,1d0,2.8d0,0d0,-2.8d0,-2d0,0d0/) REAL*8, PARAMETER :: HPCON = 34.16319d0 C----------------------------------------------------------------------- C1111 TROPICAL LATITUDES MCCLATCHY (1972) ATMOSPHERE DATA VS HEIGHT C----------------------------------------------------------------------- DATA PRS1/ 1.013D 03,9.040D 02,8.050D 02,7.150D 02,6.330D 02, 1 5.590D 02,4.920D 02,4.320D 02,3.780D 02,3.290D 02,2.860D 02, 2 2.470D 02,2.130D 02,1.820D 02,1.560D 02,1.320D 02,1.110D 02, 3 9.370D 01,7.890D 01,6.660D 01,5.650D 01,4.800D 01,4.090D 01, 4 3.500D 01,3.000D 01,2.570D 01,1.220D 01,6.000D 00,3.050D 00, 5 1.590D 00,8.540D-01,5.790D-02,3.000D-04/ DATA DNS1/ 1.167D 03,1.064D 03,9.689D 02,8.756D 02,7.951D 02, 1 7.199D 02,6.501D 02,5.855D 02,5.258D 02,4.708D 02,4.202D 02, 2 3.740D 02,3.316D 02,2.929D 02,2.578D 02,2.260D 02,1.972D 02, 3 1.676D 02,1.382D 02,1.145D 02,9.515D 01,7.938D 01,6.645D 01, 4 5.618D 01,4.763D 01,4.045D 01,1.831D 01,8.600D 00,4.181D 00, 5 2.097D 00,1.101D 00,9.210D-02,5.000D-04/ DATA TMP1/ 300.0,294.0,288.0,284.0,277.0,270.0,264.0,257.0,250.0, 1244.0,237.0,230.0,224.0,217.0,210.0,204.0,197.0,195.0,199.0,203.0, 2207.0,211.0,215.0,217.0,219.0,221.0,232.0,243.0,254.0,265.0,270.0, 3 219.0,210.0/ DATA WVP1/1.9D 01,1.3D 01,9.3D 00,4.7D 00,2.2D 00,1.5D 00,8.5D-01, 1 4.7D-01,2.5D-01,1.2D-01,5.0D-02,1.7D-02,6.0D-03,1.8D-03,1.0D-03, 2 7.6D-04,6.4D-04,5.6D-04,5.0D-04,4.9D-04,4.5D-04,5.1D-04,5.1D-04, 3 5.4D-04,6.0D-04,6.7D-04,3.6D-04,1.1D-04,4.3D-05,1.9D-05,6.3D-06, 4 1.4D-07,1.0D-09/ DATA OZO1/5.6D-05,5.6D-05,5.4D-05,5.1D-05,4.7D-05,4.5D-05,4.3D-05, 1 4.1D-05,3.9D-05,3.9D-05,3.9D-05,4.1D-05,4.3D-05,4.5D-05,4.5D-05, 2 4.7D-05,4.7D-05,6.9D-05,9.0D-05,1.4D-04,1.9D-04,2.4D-04,2.8D-04, 3 3.2D-04,3.4D-04,3.4D-04,2.4D-04,9.2D-05,4.1D-05,1.3D-05,4.3D-06, 4 8.6D-08,4.3D-11/ C----------------------------------------------------------------------- C2222 MIDLATITUDE SUMMER MCCLATCHY (1972) ATMOSPHERE DATA VS HEIGHT C----------------------------------------------------------------------- DATA PRS2/ 1.013D 03,9.020D 02,8.020D 02,7.100D 02,6.280D 02, 1 5.540D 02,4.870D 02,4.260D 02,3.720D 02,3.240D 02,2.810D 02, 2 2.430D 02,2.090D 02,1.790D 02,1.530D 02,1.300D 02,1.110D 02, 3 9.500D 01,8.120D 01,6.950D 01,5.950D 01,5.100D 01,4.370D 01, 4 3.760D 01,3.220D 01,2.770D 01,1.320D 01,6.520D 00,3.330D 00, 5 1.760D 00,9.510D-01,6.710D-02,3.000D-04/ DATA DNS2/ 1.191D 03,1.080D 03,9.757D 02,8.846D 02,7.998D 02, 1 7.211D 02,6.487D 02,5.830D 02,5.225D 02,4.669D 02,4.159D 02, 2 3.693D 02,3.269D 02,2.882D 02,2.464D 02,2.104D 02,1.797D 02, 3 1.535D 02,1.305D 02,1.110D 02,9.453D 01,8.056D 01,6.872D 01, 4 5.867D 01,5.014D 01,4.288D 01,1.322D 01,6.519D 00,3.330D 00, 5 1.757D 00,9.512D-01,6.706D-02,5.000D-04/ DATA TMP2/ 294.0,290.0,285.0,279.0,273.0,267.0,261.0,255.0,248.0, 1242.0,235.0,229.0,222.0,216.0,216.0,216.0,216.0,216.0,216.0,217.0, 2218.0,219.0,220.0,222.0,223.0,224.0,234.0,245.0,258.0,270.0,276.0, 3 218.0,210.0/ DATA WVP2/1.4D 01,9.3D 00,5.9D 00,3.3D 00,1.9D 00,1.0D 00,6.1D-01, 1 3.7D-01,2.1D-01,1.2D-01,6.4D-02,2.2D-02,6.0D-03,1.8D-03,1.0D-03, 2 7.6D-04,6.4D-04,5.6D-04,5.0D-04,4.9D-04,4.5D-04,5.1D-04,5.1D-04, 3 5.4D-04,6.0D-04,6.7D-04,3.6D-04,1.1D-04,4.3D-05,1.9D-05,6.3D-06, 4 1.4D-07,1.0D-09/ DATA OZO2/6.0D-05,6.0D-05,6.0D-05,6.2D-05,6.4D-05,6.6D-05,6.9D-05, 1 7.5D-05,7.9D-05,8.6D-05,9.0D-05,1.1D-04,1.2D-04,1.5D-04,1.8D-04, 2 1.9D-04,2.1D-04,2.4D-04,2.8D-04,3.2D-04,3.4D-04,3.6D-04,3.6D-04, 3 3.4D-04,3.2D-04,3.0D-04,2.0D-04,9.2D-05,4.1D-05,1.3D-05,4.3D-06, 4 8.6D-08,4.3D-11/ C----------------------------------------------------------------------- C3333 MIDLATITUDE WINTER MCCLATCHY (1972) ATMOSPHERE DATA VS HEIGHT C----------------------------------------------------------------------- DATA PRS3/ 1.018D 03,8.973D 02,7.897D 02,6.938D 02,6.081D 02, 1 5.313D 02,4.627D 02,4.016D 02,3.473D 02,2.992D 02,2.568D 02, 2 2.199D 02,1.882D 02,1.610D 02,1.378D 02,1.178D 02,1.007D 02, 3 8.610D 01,7.350D 01,6.280D 01,5.370D 01,4.580D 01,3.910D 01, 4 3.340D 01,2.860D 01,2.430D 01,1.110D 01,5.180D 00,2.530D 00, 5 1.290D 00,6.820D-01,4.670D-02,3.000D-04/ DATA DNS3/ 1.301D 03,1.162D 03,1.037D 03,9.230D 02,8.282D 02, 1 7.411D 02,6.614D 02,5.886D 02,5.222D 02,4.619D 02,4.072D 02, 2 3.496D 02,2.999D 02,2.572D 02,2.206D 02,1.890D 02,1.620D 02, 3 1.388D 02,1.188D 02,1.017D 02,8.690D 01,7.421D 01,6.338D 01, 4 5.415D 01,4.624D 01,3.950D 01,1.783D 01,7.924D 00,3.625D 00, 5 1.741D 00,8.954D-01,7.051D-02,5.000D-04/ DATA TMP3/ 272.2,268.7,265.2,261.7,255.7,249.7,243.7,237.7,231.7, 1225.7,219.7,219.2,218.7,218.2,217.7,217.2,216.7,216.2,215.7,215.2, 2215.2,215.2,215.2,215.2,215.2,215.2,217.4,227.8,243.2,258.5,265.7, 3 230.7,210.2/ DATA WVP3/3.5D 00,2.5D 00,1.8D 00,1.2D 00,6.6D-01,3.8D-01,2.1D-01, 1 8.5D-02,3.5D-02,1.6D-02,7.5D-03,6.9D-03,6.0D-03,1.8D-03,1.0D-03, 2 7.6D-04,6.4D-04,5.6D-04,5.0D-04,4.9D-04,4.5D-04,5.1D-04,5.1D-04, 3 5.4D-04,6.0D-04,6.7D-04,3.6D-04,1.1D-04,4.3D-05,1.9D-05,6.3D-06, 4 1.4D-07,1.0D-09/ DATA OZO3/6.0D-05,5.4D-05,4.9D-05,4.9D-05,4.9D-05,5.8D-05,6.4D-05, 1 7.7D-05,9.0D-05,1.2D-04,1.6D-04,2.1D-04,2.6D-04,3.0D-04,3.2D-04, 2 3.4D-04,3.6D-04,3.9D-04,4.1D-04,4.3D-04,4.5D-04,4.3D-04,4.3D-04, 3 3.9D-04,3.6D-04,3.4D-04,1.9D-04,9.2D-05,4.1D-05,1.3D-05,4.3D-06, 4 8.6D-08,4.3D-11/ C----------------------------------------------------------------------- C4444 SUBARCTIC SUMMER MCCLATCHY (1972) ATMOSPHERE DATA VS HEIGHT C----------------------------------------------------------------------- DATA PRS4/ 1.010D 03,8.960D 02,7.929D 02,7.000D 02,6.160D 02, 1 5.410D 02,4.730D 02,4.130D 02,3.590D 02,3.107D 02,2.677D 02, 2 2.300D 02,1.977D 02,1.700D 02,1.460D 02,1.250D 02,1.080D 02, 3 9.280D 01,7.980D 01,6.860D 01,5.890D 01,5.070D 01,4.360D 01, 4 3.750D 01,3.227D 01,2.780D 01,1.340D 01,6.610D 00,3.400D 00, 5 1.810D 00,9.870D-01,7.070D-02,3.000D-04/ DATA DNS4/ 1.220D 03,1.110D 03,9.971D 02,8.985D 02,8.077D 02, 1 7.244D 02,6.519D 02,5.849D 02,5.231D 02,4.663D 02,4.142D 02, 2 3.559D 02,3.059D 02,2.630D 02,2.260D 02,1.943D 02,1.671D 02, 3 1.436D 02,1.235D 02,1.062D 02,9.128D 01,7.849D 01,6.750D 01, 4 5.805D 01,4.963D 01,4.247D 01,1.338D 01,6.614D 00,3.404D 00, 5 1.817D 00,9.868D-01,7.071D-02,5.000D-04/ DATA TMP4/ 287.0,282.0,276.0,271.0,266.0,260.0,253.0,246.0,239.0, 1232.0,225.0,225.0,225.0,225.0,225.0,225.0,225.0,225.0,225.0,225.0, 2225.0,225.0,225.0,225.0,226.0,228.0,235.0,247.0,262.0,274.0,277.0, 3 216.0,210.0/ DATA WVP4/9.1D 00,6.0D 00,4.2D 00,2.7D 00,1.7D 00,1.0D 00,5.4D-01, 1 2.9D-01,1.3D-02,4.2D-02,1.5D-02,9.4D-03,6.0D-03,1.8D-03,1.0D-03, 2 7.6D-04,6.4D-04,5.6D-04,5.0D-04,4.9D-04,4.5D-04,5.1D-04,5.1D-04, 3 5.4D-04,6.0D-04,6.7D-04,3.6D-04,1.1D-04,4.3D-05,1.9D-05,6.3D-06, 4 1.4D-07,1.0D-09/ DATA OZO4/4.9D-05,5.4D-05,5.6D-05,5.8D-05,6.0D-05,6.4D-05,7.1D-05, 1 7.5D-05,7.9D-05,1.1D-04,1.3D-04,1.8D-04,2.1D-04,2.6D-04,2.8D-04, 2 3.2D-04,3.4D-04,3.9D-04,4.1D-04,4.1D-04,3.9D-04,3.6D-04,3.2D-04, 3 3.0D-04,2.8D-04,2.6D-04,1.4D-04,9.2D-05,4.1D-05,1.3D-05,4.3D-06, 4 8.6D-08,4.3D-11/ C----------------------------------------------------------------------- C5555 SUBARCTIC WINTER MCCLATCHY (1972) ATMOSPHERE DATA VS HEIGHT C----------------------------------------------------------------------- DATA PRS5/ 1.013D 03,8.878D 02,7.775D 02,6.798D 02,5.932D 02, 1 5.158D 02,4.467D 02,3.853D 02,3.308D 02,2.829D 02,2.418D 02, 2 2.067D 02,1.766D 02,1.510D 02,1.291D 02,1.103D 02,9.431D 01, 3 8.058D 01,6.882D 01,5.875D 01,5.014D 01,4.277D 01,3.647D 01, 4 3.109D 01,2.649D 01,2.256D 01,1.020D 01,4.701D 00,2.243D 00, 5 1.113D 00,5.719D-01,4.016D-02,3.000D-04/ DATA DNS5/ 1.372D 03,1.193D 03,1.058D 03,9.366D 02,8.339D 02, 1 7.457D 02,6.646D 02,5.904D 02,5.226D 02,4.538D 02,3.879D 02, 2 3.315D 02,2.834D 02,2.422D 02,2.071D 02,1.770D 02,1.517D 02, 3 1.300D 02,1.113D 02,9.529D 01,8.155D 01,6.976D 01,5.966D 01, 4 5.100D 01,4.358D 01,3.722D 01,1.645D 01,7.368D 00,3.330D 00, 5 1.569D 00,7.682D-01,5.695D-02,5.000D-04/ DATA TMP5/ 257.1,259.1,255.9,252.7,247.7,240.9,234.1,227.3,220.6, 1217.2,217.2,217.2,217.2,217.2,217.2,217.2,216.6,216.0,215.4,214.8, 2214.1,213.6,213.0,212.4,211.8,211.2,216.0,222.2,234.7,247.0,259.3, 3 245.7,210.0/ DATA WVP5/1.2D 00,1.2D 00,9.4D-01,6.8D-01,4.1D-01,2.0D-01,9.8D-02, 1 5.4D-02,1.1D-02,8.4D-03,5.5D-03,3.8D-03,2.6D-03,1.8D-03,1.0D-03, 2 7.6D-04,6.4D-04,5.6D-04,5.0D-04,4.9D-04,4.5D-04,5.1D-04,5.1D-04, 3 5.4D-04,6.0D-04,6.7D-04,3.6D-04,1.1D-04,4.3D-05,1.9D-05,6.3D-06, 4 1.4D-07,1.0D-09/ DATA OZO5/4.1D-05,4.1D-05,4.1D-05,4.3D-05,4.5D-05,4.7D-05,4.9D-05, 1 7.1D-05,9.0D-05,1.6D-04,2.4D-04,3.2D-04,4.3D-04,4.7D-04,4.9D-04, 2 5.6D-04,6.2D-04,6.2D-04,6.2D-04,6.0D-04,5.6D-04,5.1D-04,4.7D-04, 3 4.3D-04,3.6D-04,3.2D-04,1.5D-04,9.2D-05,4.1D-05,1.3D-05,4.3D-06, 4 8.6D-08,4.3D-11/ C---------------------------------------------------------------------- C6666 GLOBAL U.S. (1976) STANDARD ATMOSPHERE P, T, GEO H PARAMETERS C---------------------------------------------------------------------- DATA PRS6/ 1.01325D+03,8.987D+02,7.950D+02,7.011D+02,6.164D+02, 1 5.402D+02,4.718D+02,4.106D+02,3.560D+02,3.074D+02,2.644D+02, 2 2.263D+02,1.933D+02,1.651D+02,1.410D+02,1.204D+02,1.029D+02, 3 8.787D+01,7.505D+01,6.410D+01,5.475D+01,4.678D+01,4.000D+01, 4 3.422D+01,2.931D+01,2.511D+01,1.172D+01,5.589D+00,2.775D+00, 5 1.431D+00,7.594D-01,4.634D-02,2.384D-04/ DATA DNS6/ 1.225D+03,1.112D+03,1.006D+03,9.091D+02,8.191D+02, 1 7.361D+02,6.597D+02,5.895D+02,5.252D+02,4.663D+02,4.127D+02, 2 3.639D+02,3.108D+02,2.655D+02,2.268D+02,1.937D+02,1.654D+02, 3 1.413D+02,1.207D+02,1.031D+02,8.803D+01,7.487D+01,6.373D+01, 4 5.428D+01,4.627D+01,3.947D+01,1.801D+01,8.214D+00,3.851D+00, 5 1.881D+00,9.775D-01,7.424D-02,4.445D-04/ DATA TMP6/ 1 288.150,281.650,275.150,268.650,262.150,255.650,249.150, 2 242.650,236.150,229.650,223.150,216.650,216.650,216.650, 3 216.650,216.650,216.650,216.650,216.650,216.650,216.650, 4 217.650,218.650,219.650,220.650,221.650,226.650,237.050, 5 251.050,265.050,270.650,217.450,186.870/ DATA WVP6/ 1.083D+01,6.323D+00,3.612D+00,2.015D+00,1.095D+00, 1 5.786D-01,2.965D-01,1.469D-01,7.021D-02,3.226D-02,1.419D-02, 2 5.956D-03,5.002D-03,4.186D-03,3.490D-03,2.896D-03,2.388D-03, 3 1.954D-03,1.583D-03,1.267D-03,9.967D-04,8.557D-04,7.104D-04, 4 5.600D-04,4.037D-04,2.406D-04,5.404D-05,2.464D-05,1.155D-05, 5 5.644D-06,2.932D-06,2.227D-07,1.334D-09/ DATA OZO6/ 7.526D-05,3.781D-05,6.203D-05,3.417D-05,5.694D-05, 1 3.759D-05,5.970D-05,4.841D-05,7.102D-05,6.784D-05,9.237D-05, 2 9.768D-05,1.251D-04,1.399D-04,1.715D-04,1.946D-04,2.300D-04, 3 2.585D-04,2.943D-04,3.224D-04,3.519D-04,3.714D-04,3.868D-04, 4 3.904D-04,3.872D-04,3.728D-04,2.344D-04,9.932D-05,3.677D-05, 5 1.227D-05,4.324D-06,5.294D-08,1.262D-10/ REAL*8, INTENT(INOUT) :: H,P,D INTEGER, INTENT(IN) :: NATM,NPHD REAL*8, INTENT(OUT) :: O,Q,S,OCM,WCM,T REAL*8 :: XX,XI,XJ,DELTA,RAT,PI,PJ,DI,DJ,DP,ES,RS,OI,OJ,QI,QJ INTEGER :: I,J,K,N IF(NATM > 0) GO TO 200 O=1.E-10 Q=1.E-10 S=1.E-10 OCM=1.E-10 WCM=1.E-10 IF(NPHD < 2) GO TO 150 DO 110 N=2,8 IF(H < SHLB(N)) GO TO 120 110 CONTINUE N=9 120 CONTINUE N=N-1 IF(ABS(SDLB(N)) < 1.E-04) GO TO 130 P=SPLB(N)*(1.+SDLB(N)/STLB(N)*(H-SHLB(N)))**(-HPCON/SDLB(N)) GO TO 140 130 CONTINUE P=SPLB(N)*EXP(-HPCON/STLB(N)*(H-SHLB(N))) 140 CONTINUE T=STLB(N)+SDLB(N)*(H-SHLB(N)) D=P/T*28.9644E 05/8.31432E 03 ! P/T*mair/gasc RETURN 150 CONTINUE DO 160 N=2,8 IF(P > SPLB(N)) GO TO 170 160 CONTINUE N=9 170 CONTINUE N=N-1 IF(ABS(SDLB(N)) < 1.E-04) GO TO 180 H=SHLB(N)+STLB(N)/SDLB(N)*((SPLB(N)/P)**(SDLB(N)/HPCON)-1.) GO TO 190 180 CONTINUE H=SHLB(N)+STLB(N)/HPCON*LOG(SPLB(N)/P) 190 CONTINUE T=STLB(N)+SDLB(N)*(H-SHLB(N)) D=P/T*28.9644E 05/8.31432E 03 RETURN 200 CONTINUE IF(NPHD == 1) GO TO 240 IF(NPHD == 2) GO TO 220 XX=D XI=DENS(1,NATM) IF(D > XI) XX=XI IF(D < 5.0E-04) GO TO 280 DO 210 J=2,33 XJ=DENS(J,NATM) IF(XX > XJ) GO TO 260 XI=XJ 210 CONTINUE 220 CONTINUE XX=H XI=HTKM(1) IF(H < XI) XX=XI IF(H > 99.9) GO TO 280 DO 230 J=2,33 XJ=HTKM(J) IF(XX < XJ) GO TO 260 XI=XJ 230 CONTINUE 240 CONTINUE XX=P XI=PRES(1,NATM) IF(P > XI) XX=XI IF(P < 3.0E-04) GO TO 280 DO 250 J=2,33 XJ=PRES(J,NATM) IF(XX > XJ) GO TO 260 XI=XJ 250 CONTINUE 260 CONTINUE DELTA=(XX-XI)/(XJ-XI) I=J-1 IF(NPHD.NE.2) THEN RAT=LOG(XX/XI)/LOG(XJ/XI) H=HTKM(I)+(HTKM(J)-HTKM(I))*RAT T=TEMP(I,NATM)+(TEMP(J,NATM)-TEMP(I,NATM))*RAT ENDIF PI=PRES(I,NATM) PJ=PRES(J,NATM) DI=DENS(I,NATM) DJ=DENS(J,NATM) IF(NPHD == 1) D=DI+DELTA*(DJ-DI) IF(NPHD == 3) P=PI+DELTA*(PJ-PI) IF(NPHD == 2) THEN P=PI*(PJ/PI)**DELTA D=DI*(DJ/DI)**DELTA T=TEMP(I,NATM)+DELTA*(TEMP(J,NATM)-TEMP(I,NATM)) ENDIF O=OZON(I,NATM)/DI+DELTA*(OZON(J,NATM)/DJ-OZON(I,NATM)/DI) Q=WVAP(I,NATM)/DI+DELTA*(WVAP(J,NATM)/DJ-WVAP(I,NATM)/DI) ES=10.D0**(9.4051D0-2353.D0/T) IF(P < PI) PI=P S=1.D+06 RS=(PI-ES+0.622*ES)/(0.622*ES) IF(RS > 1.E-06) S=1./RS OI=O QI=Q OCM=0.D0 WCM=0.D0 DO 270 K=J,33 PJ=PRES(K,NATM) DJ=DENS(K,NATM) OJ=OZON(K,NATM)/DJ QJ=WVAP(K,NATM)/DJ DP=PI-PJ OCM=OCM+0.5D0*(OI+OJ)*DP WCM=WCM+0.5D0*(QI+QJ)*DP OI=OJ QI=QJ PI=PJ 270 CONTINUE WCM=WCM/0.980D0*22420.7D0/18.D0 OCM=OCM/0.980D0*22420.7D0/48.D0 RETURN 280 CONTINUE T=210.D0 IF(NATM == 6) T=186.87 O=1.D-10 Q=1.D-10 S=1.D-10 OCM=1.D-10 WCM=1.D-10 IF(NPHD.NE.1) P=1.D-05 IF(NPHD.NE.2) H=99.99 IF(NPHD.NE.3) D=2.D-05 RETURN END SUBROUTINE PHATMO REAL*8 FUNCTION PFofTK(WAVNA,WAVNB,TK) 6 C ------------------------------------------------------------------ C C INPUT DATA C WAVNA,WAVNB SPECTRAL INTERVAL IN WAVENUMBERS C (ORDER OF WAVNA,WAVNB NOT IMPORTANT) C C TK ABSOLUTE TEMPERATURE IN DEGREES KELVIN C C OUTPUT DATA C PFofTK PLANCK FLUX (W/m^2) C C C REMARKS C PLANCK INTENSITY (W/m^2*STER) IS GIVEN BY PFofTK/PI C C ------------------------------------------------------------------ IMPLICIT NONE REAL*8, PARAMETER, DIMENSION(21) :: * BN = (/1D0, -1D0, 1D0, -1D0, 1D0, -1D0, 5D0, -691D0, 7D0, 1 -3617D0, 43867D0, -174611D0, 854513D0, -236364091D0, 2 8553103D0, -23749461029D0, 8615841276005D0, -7709321041217D0, * 2577687858367D0, -2631527155305348D4, 2929993913841559D0 /), * BD = (/1D0, 2D0, 6D0, 30D0, 42D0, 30D0, 66D0, 2730D0, 6D0 1 ,510D0, 798D0, 330D0, 138D0, 2730D0, 6D0, 870D0, 14322D0 2 ,510D0, 6D0, 1919190D0, 6D0/) REAL*8, PARAMETER :: PI4 =97.40909103400244D0 C REAL*8, PARAMETER :: PI =3.141592653589793D0 REAL*8, PARAMETER :: HCK=1.43879D0 REAL*8, PARAMETER :: DGXLIM=1D-06 REAL*8, INTENT(IN) :: WAVNA, WAVNB, TK REAL*8 GSUM,B,DG,DGB,GX,PNORM,GTERM,GXA,GXB,X,XX,XN,XN3,XNN,XNM * ,XNF,XNX INTEGER II,NB,NNB,N PFofTK=0D0 IF(TK < 1D-06) RETURN DO 160 II=1,2 IF(II == 1) X=HCK*WAVNA/TK IF(II == 2) X=HCK*WAVNB/TK IF(X > 2.3D0) GO TO 120 XX=X*X GSUM=1D0/3D0-X/8D0+XX/60D0 NB=3 XNF=XX/2D0 DO 100 N=4,38,2 NB=NB+1 NNB=NB B=BN(NB)/BD(NB) XN3=N+3 XNM=N*(N-1) XNF=XNF*(XX/XNM) DG=B/XN3*XNF GSUM=GSUM+DG DGB=DG IF(ABS(DG) < DGXLIM) GO TO 110 100 CONTINUE 110 CONTINUE GX=GSUM*XX*X GO TO 150 120 CONTINUE GSUM=PI4/15.D0 DO 130 N=1,20 NNB=N XN=N XNN=XN*XN XNX=XN*X IF(XNX > 100.D0) GO TO 140 GTERM=(X*X*(3.D0+XNX)+6.D0*(1.D0+XNX)/XNN)/XNN DG=GTERM*EXP(-XNX) GSUM=GSUM-DG DGB=DG IF(DG < DGXLIM) GO TO 140 130 CONTINUE 140 CONTINUE GX=GSUM 150 CONTINUE IF(II == 1) GXA=GX IF(II == 2) GXB=GX 160 CONTINUE PNORM=15.D0/PI4 PFofTK=ABS(GXB-GXA)*PNORM PFofTK=PFofTK*5.6692D-08*TK**4 RETURN END FUNCTION PFofTK REAL*8 FUNCTION TKofPF(WAVNA,WAVNB,FLUXAB) 4,6 C ------------------------------------------------------------------ C C INPUT DATA C------------------ C WAVNA,WAVNB SPECTRAL INTERVAL IN WAVENUMBERS C (ORDER OF WAVNA,WAVNB NOT IMPORTANT) C FLUXAB PLANCK FLUX (W/m^2) IN INTERVAL C (WAVNA,WAVNB) C C OUTPUT DATA C------------------ C TK BRIGHTNESS TEMPERATURE IN DEGREES KELVIN C C C REMARKS C------------------ C TKofPF IS INVERSE FUNCTION OF PFofTK(WAVNA,WAVNB,TK) C THE OUTPUT OF TKofPF SATISFIES THE IDENTITY C FLUXAB=PFofTK(WAVNA,WAVNB,TK) C (UNITS FOR FLUXAB AND PFofTK MUST BE IDENTICAL) C C ------------------------------------------------------------------ IMPLICIT NONE LOGICAL LOGFIT REAL*8, PARAMETER :: DELFIT=1.D-06 INTEGER, PARAMETER :: NMAX=20 REAL*8, INTENT(IN) :: WAVNA,WAVNB,FLUXAB REAL*8 XA,YA,XB,YB,XX,YY,XC,YC,XBA,XCA,XBC,YBA,YCA,YBC,YXBA,YXCA,A * ,B,C,ROOT,PF,PFofTK INTEGER NFIT IF(FLUXAB <= 0.D0) RETURN LOGFIT=.FALSE. NFIT=0 PF=FLUXAB XA=0.D0 YA=0.D0 XB=250.D0 YB=PFofTK(WAVNA,WAVNB,XB) XX=PF*XB/YB YY=PFofTK(WAVNA,WAVNB,XX) IF(ABS(YY-PF) < DELFIT) GO TO 200 IF((YY/PF) < 0.5D0) GO TO 150 IF((YY/PF) > 2.0D0) GO TO 170 IF(XX > XB) GO TO 110 XC=XB YC=YB XB=XX YB=YY GO TO 120 110 CONTINUE XC=XX YC=YY 120 CONTINUE XBA=XB-XA XCA=XC-XA XBC=XB-XC YBA=YB-YA YCA=YC-YA YBC=YB-YC NFIT=NFIT+1 IF(NFIT > NMAX) GO TO 200 YXBA=YBA/XBA YXCA=YCA/XCA C=(YXBA-YXCA)/XBC B=YXBA-(XB+XA)*C A=YA-XA*(B+XA*C) ROOT=SQRT(B*B+4.D0*C*(PF-A)) XX=0.5D0*(ROOT-B)/C IF(XX < XA.or.XX > XC) XX=-0.5D0*(ROOT+B)/C YY=PFofTK(WAVNA,WAVNB,XX) IF(LOGFIT) YY=LOG(YY) IF(ABS(YY-PF) < DELFIT) GO TO 200 IF(XX > XB) GO TO 130 XC=XB YC=YB GO TO 140 130 CONTINUE XA=XB YA=YB 140 CONTINUE XB=XX YB=YY GO TO 120 150 CONTINUE XA=XX YA=YY 160 CONTINUE XC=XB YC=YB XB=XB/2.D0 YB=PFofTK(WAVNA,WAVNB,XB) IF(YB < YA) GO TO 190 IF(YB > PF) GO TO 160 XA=XB YA=YB GO TO 190 170 CONTINUE XC=XX YC=YY 180 CONTINUE XA=XB YA=YB XB=XB*2.D0 YB=PFofTK(WAVNA,WAVNB,XB) IF(YB > YC) GO TO 190 IF(YB < PF) GO TO 180 XC=XB YC=YB 190 CONTINUE XB=XA+(PF-YA)*(XC-XA)/(YC-YA) YB=PFofTK(WAVNA,WAVNB,XB) XX=XB IF(ABS(YB-PF) < DELFIT) GO TO 200 PF=LOG(PF) YA=LOG(YA) YB=LOG(YB) YC=LOG(YC) LOGFIT=.TRUE. GO TO 120 200 CONTINUE TKofPF=XX RETURN END FUNCTION TKofPF SUBROUTINE REPART(FXL,XLB,NXB,GYL,YLB,NYB) 7 IMPLICIT NONE C ------------------------------------------------------------------ C C REPART Repartitions FXL (a histogram-type distribution function) C where XLB depicts the NXB partitions that define FXL data C FXL is assumed to be constant between XLB(N) AND XLB(N+1) C C GYL(N) is the new histogram distribution function defined C by the (input) NYB partitions YLB(N). The YLB partitions C can differ from XLB in number and/or spacing, or in upper C and lower limits. XLB and YLB coordinates are assumed to C be linear both increasing or decreasing in the same sense C C RETURNS GYL as a histogram-type distribution function, with NYB-1 C values assumed to be constant between YLB(N) and YLB(N+1) C C NOTE: The column amount of a vertically distributed quantity is C conserved, within the Repartition Interval that is common C to to XLB and YLB (layer bottom edge and top edge) limits C C ------------------------------------------------------------------ INTEGER, INTENT(IN) :: NXB,NYB REAL*8, INTENT(IN) :: FXL(NXB-1),XLB(NXB),YLB(NYB) REAL*8, INTENT(OUT) :: GYL(NYB-1) INTEGER NXF,NYG REAL*8 SUMG,SUMY,XA,YA,XB,YB,XAYA,PART INTEGER I,J NXF=NXB-1 NYG=NYB-1 SUMG=0.D0 DO 50 I=1,NYG GYL(I)=0.D0 50 CONTINUE SUMY=0.D0 I=1 XA=XLB(I) J=1 YA=YLB(J) XB=XLB(I+1) IF(XB < XA) GO TO 200 100 CONTINUE YB=YLB(J+1) IF(YB > XA) GO TO 110 GYL(J)=0.D0 J=J+1 IF(J > NYG) GO TO 160 YA=YB GO TO 100 110 CONTINUE XB=XLB(I+1) IF(XB > YA) GO TO 120 I=I+1 IF(I > NXF) GO TO 160 XA=XB GO TO 110 120 CONTINUE XAYA=XA IF(YA > XA) XAYA=YA IF(YB > XB) GO TO 130 PART=(YB-XAYA)/(XB-XA) SUMG=SUMG+PART*FXL(I) SUMY=SUMY+PART GYL(J)=SUMG J=J+1 IF(J > NYG) GO TO 160 SUMG=0.D0 SUMY=0.D0 YA=YB YB=YLB(J+1) GO TO 120 130 CONTINUE PART=(XB-XAYA)/(XB-XA) SUMG=SUMG+PART*FXL(I) SUMY=SUMY+PART I=I+1 IF(I > NXF) GO TO 140 XA=XB XB=XLB(I+1) GO TO 120 140 CONTINUE GYL(J)=SUMG 150 CONTINUE J=J+1 IF(J > NYG) GO TO 160 GYL(J)=0.D0 GO TO 150 160 CONTINUE GO TO 300 200 CONTINUE YB=YLB(J+1) IF(YB < XA) GO TO 210 GYL(J)=0.D0 J=J+1 IF(J > NYG) GO TO 260 YA=YB GO TO 200 210 CONTINUE XB=XLB(I+1) IF(XB < YA) GO TO 220 I=I+1 IF(I > NXF) GO TO 260 XA=XB GO TO 210 220 CONTINUE XAYA=XA IF(YA < XA) XAYA=YA IF(YB < XB) GO TO 230 PART=(YB-XAYA)/(XB-XA) SUMG=SUMG+PART*FXL(I) SUMY=SUMY+PART GYL(J)=SUMG J=J+1 IF(J > NYG) GO TO 260 SUMG=0.D0 SUMY=0.D0 YA=YB YB=YLB(J+1) GO TO 220 230 CONTINUE PART=(XB-XAYA)/(XB-XA) SUMG=SUMG+PART*FXL(I) SUMY=SUMY+PART I=I+1 IF(I > NXF) GO TO 240 XA=XB XB=XLB(I+1) GO TO 220 240 CONTINUE GYL(J)=SUMG 250 CONTINUE J=J+1 IF(J > NYG) GO TO 260 GYL(J)=0.D0 GO TO 250 260 CONTINUE 300 CONTINUE RETURN END SUBROUTINE REPART SUBROUTINE RETERP(FXL,XLB,NXB,GYL,YLB,NYB) 4 IMPLICIT NONE C ------------------------------------------------------------------ C RETERP C Interpolates FXL (a histogram-type distribution function) C where XLB depicts the NXB partitions that define FXL data C FXL is assumed to be constant between XLB(N) AND XLB(N+1) C C GYL(N) is the new histogram distribution function defined C by the (input) NYB partitions YLB(N). The YLB partitions C can differ from XLB in number and/or spacing, or in upper C and lower limits. XLB and YLB coordinates are assumed to C be linear both increasing or decreasing in the same sense C C RETURNS GYL as a histogram-type distribution function, with NYB-1 C values assumed to be constant between YLB(N) and YLB(N+1) C C ------------------------------------------------------------------ INTEGER, INTENT(IN) :: NXB,NYB REAL*8, INTENT(IN) :: FXL(NXB-1),XLB(NXB),YLB(NYB) REAL*8, INTENT(OUT) :: GYL(NYB-1) INTEGER NXF,NYG REAL*8 SUMG,SUMY,XA,YA,XB,YB,XAYA,PART INTEGER I,J NXF=NXB-1 NYG=NYB-1 SUMG=0.D0 DO 50 I=1,NYG GYL(I)=0.D0 50 CONTINUE SUMY=0.D0 I=1 XA=XLB(I) J=1 YA=YLB(J) XB=XLB(I+1) IF(XB < XA) GO TO 200 100 CONTINUE YB=YLB(J+1) IF(YB > XA) GO TO 110 GYL(J)=0.D0 J=J+1 IF(J > NYG) GO TO 160 YA=YB GO TO 100 110 CONTINUE XB=XLB(I+1) IF(XB > YA) GO TO 120 I=I+1 IF(I > NXF) GO TO 160 XA=XB GO TO 110 120 CONTINUE XAYA=XA IF(YA > XA) XAYA=YA IF(YB > XB) GO TO 130 PART=(YB-XAYA)/(XB-XA) SUMG=SUMG+PART*FXL(I) SUMY=SUMY+PART GYL(J)=SUMG/SUMY J=J+1 IF(J > NYG) GO TO 160 SUMG=0.D0 SUMY=0.D0 YA=YB YB=YLB(J+1) GO TO 120 130 CONTINUE PART=(XB-XAYA)/(XB-XA) SUMG=SUMG+PART*FXL(I) SUMY=SUMY+PART I=I+1 IF(I > NXF) GO TO 140 XA=XB XB=XLB(I+1) GO TO 120 140 CONTINUE GYL(J)=SUMG/SUMY 150 CONTINUE J=J+1 IF(J > NYG) GO TO 160 GYL(J)=0.D0 GO TO 150 160 CONTINUE GO TO 300 200 CONTINUE YB=YLB(J+1) IF(YB < XA) GO TO 210 GYL(J)=0.D0 J=J+1 IF(J > NYG) GO TO 260 YA=YB GO TO 200 210 CONTINUE XB=XLB(I+1) IF(XB < YA) GO TO 220 I=I+1 IF(I > NXF) GO TO 260 XA=XB GO TO 210 220 CONTINUE XAYA=XA IF(YA < XA) XAYA=YA IF(YB < XB) GO TO 230 PART=(YB-XAYA)/(XB-XA) SUMG=SUMG+PART*FXL(I) SUMY=SUMY+PART GYL(J)=SUMG/SUMY J=J+1 IF(J > NYG) GO TO 260 SUMG=0.D0 SUMY=0.D0 YA=YB YB=YLB(J+1) GO TO 220 230 CONTINUE PART=(XB-XAYA)/(XB-XA) SUMG=SUMG+PART*FXL(I) SUMY=SUMY+PART I=I+1 IF(I > NXF) GO TO 240 XA=XB XB=XLB(I+1) GO TO 220 240 CONTINUE GYL(J)=SUMG/SUMY 250 CONTINUE J=J+1 IF(J > NYG) GO TO 260 GYL(J)=0.D0 GO TO 250 260 CONTINUE 300 CONTINUE RETURN END SUBROUTINE RETERP SUBROUTINE FABINT(F,X,NX,ALIM,BLIM,ABINT) IMPLICIT NONE C ------------------------------------------------------------------ C FABINT PERFORMS NUMERICAL INTEGRATION (AREA UNDER CURVE) OF F(X) C BETWEEN THE LIMITS X=ALIM AND X=BLIM (WITH BLIM GT ALIM) C C F(X) IS DEFINED BY CONNECTING SUCCESSIVE F(X) DATA POINTS USING C STRAIGHT-LINE SEGMENTS, I.E. F(X) IS PIECE-WISE CONTINUOUS C THE X COORDINATE CAN BE IN ASCENDING OR DESCENDING ORDER C C (F(X) IS ZERO OUTSIDE THE INTERVAL BETWEEN X(1) AND X(NX)) C ------------------------------------------------------------------ INTEGER, INTENT(IN) :: NX REAL*8, INTENT(IN) :: F(NX),X(NX),ALIM,BLIM REAL*8, INTENT(OUT) :: ABINT REAL*8, PARAMETER :: DELTA=1.D-07 REAL*8 XA,XB,XX,XMIN,XMAX,XJ,XI,FI,FJ,BF,AF,DINT,X2,X1 INTEGER JX,KX,IX ABINT=0.D0 JX=1 KX=1 XA=X(JX) XB=X(NX) XX=XA IF(XB > XA) GO TO 120 XA=XB XB=XX JX=NX KX=-1 120 XMIN=XA XMAX=XB IF(XMIN >= BLIM) RETURN IF(XMAX <= ALIM) RETURN IF(XMIN < ALIM) XMIN=ALIM IF(XMAX > BLIM) XMAX=BLIM 130 JX=JX+KX XJ=X(JX) IF(XJ <= XMIN) GO TO 130 IX=JX-KX XI=X(IX) IF((XJ-XI) < DELTA) GO TO 130 FI=F(IX) FJ=F(JX) BF=(FJ-FI)/(XJ-XI) AF=FJ-BF*XJ X2=XMIN 160 X1=X2 X2=XJ IF(X2 > XMAX) X2=XMAX DINT=AF*(X2-X1)+BF*(X2**2-X1**2)/2.D0 ABINT=ABINT+DINT IF(DABS(X2-XMAX) < DELTA) RETURN IF((XJ-X2) > DELTA) GO TO 160 170 XI=XJ FI=FJ IX=JX JX=JX+KX XJ=X(JX) FJ=F(JX) IF(DABS(XJ-XI) < DELTA) GO TO 170 BF=(FJ-FI)/(XJ-XI) AF=FJ-BF*XJ GO TO 160 END SUBROUTINE FABINT SUBROUTINE FXGINT(F,X,NX,G,Y,NY,ALIM,BLIM,ABINT) 2 IMPLICIT NONE C ------------------------------------------------------------------ C FXGINT PERFORMS NUMERICAL INTEGRATION (AREA UNDER CURVE) OF F*G C BETWEEN THE LIMITS X=ALIM AND X=BLIM (WITH BLIM GT ALIM) C C F(X) IS DEFINED BY CONNECTING SUCCESSIVE F(X) DATA POINTS USING C STRAIGHT-LINE SEGMENTS, I.E. F(X) IS PIECE-WISE CONTINUOUS C THE X COORDINATE CAN BE IN ASCENDING OR DESCENDING ORDER C C G(Y) IS DEFINED BY CONNECTING SUCCESSIVE G(Y) DATA POINTS USING C STRAIGHT-LINE SEGMENTS, I.E. G(Y) IS PIECE-WISE CONTINUOUS C THE Y COORDINATE CAN BE IN ASCENDING OR DESCENDING ORDER C C (X,Y ARE THE SAME LINEAR COORDINATE INDEPENDENTLY DEFINED) C C (F(X) IS ZERO OUTSIDE THE INTERVAL BETWEEN X(1) AND X(NX)) C (G(Y) IS ZERO OUTSIDE THE INTERVAL BETWEEN Y(1) AND Y(NY)) C ------------------------------------------------------------------ INTEGER, INTENT(IN) :: NX,NY REAL*8, INTENT(IN) :: F(NX),X(NX),G(NY),Y(NY),ALIM,BLIM REAL*8, INTENT(OUT) :: ABINT REAL*8, PARAMETER :: DELTA=1.D-07 REAL*8 XA,YA,XB,YB,XX,XMIN,XMAX,XJ,XI,FI,FJ,BF,AF,YI,YJ,GI,GJ,AG * ,BG,DINT,X2,X1 INTEGER JX,JY,KX,KY,IX,IY ABINT=0.D0 JX=1 JY=1 KX=1 KY=1 XA=X(JX) YA=Y(JY) XB=X(NX) YB=Y(NY) XX=XA IF(XB > XA) GO TO 100 XA=XB XB=XX JX=NX KX=-1 100 XX=YA IF(YB > YA) GO TO 120 YA=YB YB=XX JY=NY KY=-1 120 XMIN=MAX(XA,YA) XMAX=MIN(XB,YB) IF(XMIN >= BLIM) RETURN IF(XMAX <= ALIM) RETURN IF(XMIN < ALIM) XMIN=ALIM IF(XMAX > BLIM) XMAX=BLIM 130 JX=JX+KX XJ=X(JX) IF(XJ <= XMIN) GO TO 130 IX=JX-KX XI=X(IX) IF((XJ-XI) < DELTA) GO TO 130 FI=F(IX) FJ=F(JX) BF=(FJ-FI)/(XJ-XI) AF=FJ-BF*XJ 140 JY=JY+KY YJ=Y(JY) IF(YJ <= XMIN) GO TO 140 IY=JY-KY YI=Y(IY) IF((YJ-YI) < DELTA) GO TO 140 GI=G(IY) GJ=G(JY) BG=(GJ-GI)/(YJ-YI) AG=GJ-BG*YJ X2=XMIN 160 X1=X2 X2=MIN(XJ,YJ) IF(X2 > XMAX) X2=XMAX DINT=(AF*AG)*(X2-X1) * +(AF*BG+BF*AG)*(X2**2-X1**2)/2.D0 * +(BF*BG)*(X2**3-X1**3)/3.D0 ABINT=ABINT+DINT IF(DABS(X2-XMAX) < DELTA) RETURN IF((XJ-X2) > DELTA) GO TO 180 170 XI=XJ FI=FJ IX=JX JX=JX+KX XJ=X(JX) FJ=F(JX) IF(DABS(XJ-XI) < DELTA) GO TO 170 BF=(FJ-FI)/(XJ-XI) AF=FJ-BF*XJ 180 CONTINUE IF(YJ > X2) GO TO 160 YI=YJ GI=GJ IY=JY JY=JY+KY YJ=Y(JY) GJ=G(JY) IF(DABS(YJ-YI) < DELTA) GO TO 180 BG=(GJ-GI)/(YJ-YI) AG=GJ-BG*YJ GO TO 160 END SUBROUTINE FXGINT SUBROUTINE CTREND(JYEAR,IDEC,JDEC,CWTI,CWTJ) 2 IMPLICIT NONE C------------------------------------------------------------------- C Black Carbon interdecadal TAU interpolation is based on linear C TAU trend (between decadal global TAUmaps) with a superimposed C intra-decadal time dependence scaled to the Black Carbon Total C emission rate. C C INPUT: JYEAR (Julian year) C C CTREND coefficients refer to sep2003_OCI_Koch maps C CTREND coefficients refer to sep2003_BCI_Koch maps C -------------------------------------------------- C C Map= 1850 1875 1900 1925 1950 1960 1970 1980 1990 C OUTPUT: IDEC= (0) 1 2 3 4 5 6 7 8 C JDEC= IDEC + 1 (returned IDEC,JDEC are (1 to 8) C C CWTI= (Multiplicative Weight for BC DataMap IDEC) C CWTJ= (Multiplicative Weight for BC DataMap JDEC) C C NOTE: Time dependence is linear before 1950. Industrial BC C is assumed 0 in 1850 so CWTI=0, and IDEC is set to 1 C------------------------------------------------------------------- INTEGER, INTENT(IN) :: JYEAR INTEGER, INTENT(OUT) :: IDEC,JDEC REAL*8, INTENT(OUT) :: CWTI,CWTJ C Global Annual Emissions of BC U Emission (Mt/yr) REAL*8, parameter, dimension(5,45) :: BCE = RESHAPE( (/ C Year Hard_Coal Brown_Coal Diesel Total A 50.0, 2.280581713, 0.4449132979, 0.1599090248, 2.885536671, B 51.0, 2.443193913, 0.4855868816, 0.1884280443, 3.117194653, C 52.0, 2.473641872, 0.5115299225, 0.2027695477, 3.187930107, D 53.0, 2.481340885, 0.5448409319, 0.2149295360, 3.241089582, E 54.0, 2.505670071, 0.5780177116, 0.2343477309, 3.317960978, F 55.0, 2.698692560, 0.6238067150, 0.2733324766, 3.595800638, G 56.0, 2.855226278, 0.6531309485, 0.3043369055, 3.812692404, H 57.0, 2.975781679, 0.6821750998, 0.3207367063, 3.978575468, I 58.0, 3.341105223, 0.7035279870, 0.3370627165, 4.381746292, J 59.0, 3.638528824, 0.7075053453, 0.3695519567, 4.715488434, K 60.0, 3.770926714, 0.7416650057, 0.3832504749, 4.896034241, L 61.0, 3.392980337, 0.7805693150, 0.4217525721, 4.595387459, M 62.0, 3.288835049, 0.8179932237, 0.4603823125, 4.567360401, N 63.0, 3.359177589, 0.8604368567, 0.5090782642, 4.728550911, O 64.0, 3.432664871, 0.8952696323, 0.5388473868, 4.866865158, P 65.0, 3.529418945, 0.8819132447, 0.5785927773, 4.989773750, Q 66.0, 3.577459812, 0.8817394972, 0.6323299408, 5.091631413, R 67.0, 3.418204546, 0.8635972142, 0.6592246890, 4.941041946, S 68.0, 3.452457905, 0.8943673372, 0.7338049412, 5.080585003, A 69.0, 3.626069546, 0.9298774004, 0.7889106274, 5.344810009, B 70.0, 3.264039755, 0.9229136109, 0.8880128860, 5.074741840, C 71.0, 3.437611580, 0.9374827743, 0.9531223178, 5.328329086, D 72.0, 3.473345757, 0.7836616039, 1.0180075170, 5.274850368, E 73.0, 3.495583296, 0.8056778908, 1.1174367670, 5.418928623, F 74.0, 3.506143808, 0.8251076341, 1.0828053950, 5.413989067, G 75.0, 3.906814098, 0.8527192473, 1.0454736950, 5.804963112, H 76.0, 4.005736828, 0.8900613785, 1.1400985720, 6.035901546, I 77.0, 4.236912251, 0.9103702307, 1.2190728190, 6.366260529, J 78.0, 4.459666252, 0.9303293228, 1.2408012150, 6.630728722, K 79.0, 4.697422504, 0.9856286645, 1.3019220830, 6.984815121, L 80.0, 4.796229839, 0.9959300756, 1.2336660620, 7.026207924, M 81.0, 4.789204121, 1.0459070210, 1.1664049630, 7.001126766, N 82.0, 4.872739315, 1.0975246430, 1.1601715090, 7.130136490, O 83.0, 4.983223438, 1.1424025300, 1.1732926370, 7.298912525, P 84.0, 5.265352249, 1.2178678510, 1.2251536850, 7.708741188, Q 85.0, 5.763637543, 1.2965050940, 1.2428865430, 8.303324699, R 86.0, 5.924767494, 1.3386499880, 1.2930148840, 8.556744576, S 87.0, 6.155550480, 1.3738890890, 1.3162037130, 8.845513344, A 88.0, 6.379704475, 1.3670797350, 1.3813229800, 9.127896309, B 89.0, 6.594299316, 1.4169263840, 1.4029121400, 9.414231300, C 90.0, 6.566919804, 1.4685817960, 1.4224120380, 9.458042145, D 91.0, 6.661097050, 1.2067918780, 1.4163945910, 9.284657478, E 92.0, 7.737902641, 1.3509917260, 1.4471185210, 10.53625107, F 93.0, 7.393332005, 1.2448183300, 1.4543261530, 10.09271908, G 94.0, 7.515841007, 1.2333894970, 1.4780857560, 10.22745800 * /), (/5,45/) ) REAL*8 XDEC INTEGER IBCDEC,JBCDEC,IJYEAR IF(JYEAR < 1876) THEN CWTJ=(JYEAR-1850)/25.D0 IF(CWTJ < 0.D0) CWTJ=0.D0 CWTI=0.D0 IDEC=1 JDEC=1 GO TO 100 ENDIF IF(JYEAR < 1950) THEN XDEC=(JYEAR-1850)/25.D0 IDEC=XDEC JDEC=IDEC+1 CWTJ=XDEC-IDEC CWTI=1.D0-CWTJ GO TO 100 ENDIF IF(JYEAR < 1990) THEN IDEC=(JYEAR-1910)/10 JDEC=IDEC+1 IBCDEC=1+(IDEC-4)*10 JBCDEC=IBCDEC+10 IJYEAR=JYEAR-1949 CWTJ=(BCE(5,IJYEAR)-BCE(5,IBCDEC)) + /(BCE(5,JBCDEC)-BCE(5,IBCDEC)) CWTI=1.D0-CWTJ GO TO 100 ENDIF IF(JYEAR > 1989) THEN IDEC=7 JDEC=8 IJYEAR=JYEAR-1949 IF(IJYEAR > 45) IJYEAR=45 CWTJ=BCE(5,IJYEAR)/BCE(5,41) CWTI=0.D0 ENDIF 100 CONTINUE RETURN END SUBROUTINE CTREND SUBROUTINE STREND(JYEAR,IDEC,JDEC,SWTI,SWTJ) 2 IMPLICIT NONE C------------------------------------------------------------------- C Anthropogenic Sulfate inter-decadal TAU interpolation is based C on a linear TAU trend (between decadal global TAU-maps) with a C superimposed intradecadal time dependence scaled in proportion C to the Anthropogenic Sulfate global emission rate. C C INPUT: JYEAR (Julian year) C C CTREND coefficients refer to sep2003_SUI_Koch maps C -------------------------------------------------- C C Map= 1850 1875 1900 1925 1950 1960 1970 1980 1990 C OUTPUT: IDEC= (0) 1 2 3 4 5 6 7 8 C JDEC= IDEC + 1 (returned IDEC,JDEC are (1 to 8) C C SWTI= (Multiplicative Weight for SUI DataMap IDEC) C SWTJ= (Multiplicative Weight for SUI DataMap JDEC) C C NOTE: Time dependence linear before 1950. Industrial SUI C is assumed 0 in 1850 so SWTI=0, and IDEC is set to 1 C------------------------------------------------------------------- INTEGER, INTENT(IN) :: JYEAR INTEGER, INTENT(OUT) :: IDEC,JDEC REAL*8, INTENT(OUT) :: SWTI,SWTJ C Global Emission of Sulfate C Emission (Mt/yr) C year Anthropogenic_Sulfate Natural_Sulfate REAL*8, parameter, dimension(3,41) :: SUE = reshape( (/ A 1950.0, 30.46669769, 14.4, B 1951.0, 32.38347244, 14.4, C 1952.0, 32.18632889, 14.4, D 1953.0, 32.83379745, 14.4, E 1954.0, 32.79270935, 14.4, F 1955.0, 35.79611969, 14.4, G 1956.0, 39.93603897, 14.4, H 1957.0, 38.68806839, 14.4, I 1958.0, 39.35904312, 14.4, J 1959.0, 41.06065369, 14.4, K 1960.0, 42.67050934, 14.4, L 1961.0, 41.32410431, 14.4, M 1962.0, 41.80470276, 14.4, N 1963.0, 43.26312637, 14.4, O 1964.0, 44.68368530, 14.4, P 1965.0, 45.81701660, 14.4, Q 1966.0, 46.61584091, 14.4, R 1967.0, 46.42276001, 14.4, S 1968.0, 47.77438354, 14.4, A 1969.0, 49.30817032, 14.4, B 1970.0, 52.81050873, 14.4, C 1971.0, 52.95043945, 14.4, D 1972.0, 54.10167694, 14.4, E 1973.0, 55.93037415, 14.4, F 1974.0, 57.31056213, 14.4, G 1975.0, 58.52788162, 14.4, H 1976.0, 59.71361542, 14.4, I 1977.0, 62.59599304, 14.4, J 1978.0, 61.98198318, 14.4, K 1979.0, 64.71042633, 14.4, L 1980.0, 65.28986359, 14.4, M 1981.0, 63.23768234, 14.4, N 1982.0, 62.88000488, 14.4, O 1983.0, 61.45023346, 14.4, P 1984.0, 63.85008621, 14.4, Q 1985.0, 66.47412872, 14.4, R 1986.0, 68.00902557, 14.4, S 1987.0, 69.87956238, 14.4, A 1988.0, 70.52937317, 14.4, B 1989.0, 72.06355286, 14.4, C 1990.0, 71.29174805, 14.4 * /), (/3,41/) ) REAL*8 xdec INTEGER ISUDEC,JSUDEC,IJYEAR IF(JYEAR < 1876) THEN SWTJ=(JYEAR-1850)/25.D0 IF(SWTJ < 0.D0) SWTJ=0.D0 SWTI=0.D0 IDEC=1 JDEC=1 GO TO 100 ENDIF IF(JYEAR < 1950) THEN XDEC=(JYEAR-1850)/25.D0 IDEC=XDEC JDEC=IDEC+1 SWTJ=XDEC-IDEC SWTI=1.D0-SWTJ GO TO 100 ENDIF IF(JYEAR < 1990) THEN IDEC=(JYEAR-1910)/10 JDEC=IDEC+1 ISUDEC=1+(IDEC-4)*10 JSUDEC=ISUDEC+10 IJYEAR=JYEAR-1949 SWTJ=(SUE(2,IJYEAR)-SUE(2,ISUDEC)) + /(SUE(2,JSUDEC)-SUE(2,ISUDEC)) SWTI=1.D0-SWTJ GO TO 100 ENDIF IF(JYEAR > 1989) THEN IDEC=7 JDEC=8 IJYEAR=JYEAR-1949 IF(IJYEAR > 41) IJYEAR=41 SWTJ=SUE(2,IJYEAR)/SUE(2,41) SWTI=0.D0 ENDIF 100 CONTINUE RETURN END SUBROUTINE STREND SUBROUTINE SPLINV(X,F,NXF,XX,FF,CUSPWM,CUSPWE,KXTRAP) 4 IMPLICIT NONE INTEGER, intent(in) :: NXF, KXTRAP REAL*8 , intent(in) :: X(NXF),F(NXF),FF, CUSPWM,CUSPWE REAL*8 , intent(out) :: XX C--------------------------------------------------------------------- C Inverse spline: C SPLINV locates FF between points (F2,X2)(F3,X3) on 4-point spread C and returns 4-point Cubic Spline value of XX such that FF = F(XX) C C Quadratic Derivatives of Spline are continuous at (F2,X2),(F3,X3) C (X-Coordinate may be specified in increasing or decreasing order) C C--------------------------------------------------------------------- C C Custom Control Parameters: CUSPWM,CUSPWE C------------------------------ C C In cases where data points are unevenly spaced and/or data points C exhibit abrupt changes in value, Spline Interpolation may produce C undesirable bulging of interpolated values. In more extreme cases C Linear Interpolation may be less problematic to use. C C Interpolation can be weighted between: Cubic Spline and Linear by C adjusting weights CUSPWM and CUSPWE to values between 1.0 and 0.0 C C CUSPWM = Cubic Spline Weight at the (X2-X3) Interval Mid-point C CUSPWE = Cubic Spline Weight at the (X2-X3) Interval End-points C C For example, with: C C CUSPWM=1.0,CUSPWE=1.0 FF returns Cubic Spline interpolated value C CUSPWM=0.0,CUSPWE=0.0 FF returns Linearly interpolated value C C--------------------------------------------------------------------- C C Extrapolation for XX outside of defined interval: X(1)<->X(NXF) C C KXTRAP = 0 No Extrapolation (i.e., sets XX = 0.0) C 1 Fixed Extrapolation (sets XX=edge value) C 2 Linear Extrapolation using 2 edge points C C--------------------------------------------------------------------- C C C NOTE: F(X) is assumed to be monotonic between F(1) and F(NXF) C C------------------------------------------------------------------ REAL*8 x1,x2,x3,x4, x21,x32,x43,x31,x42, BETW,FFCUSP,FFLINR,CUSPWT REAL*8 f1,f2,f3,f4, f21,f32,f43,f3221,f4332, a,b,c,d, xf,xe,xexm REAL*8 DX,gg,xg,xy,deltx,slopec,slopel,slopes INTEGER k,kk BETW=(F(2)-FF)*(F(NXF)-F(1)) IF(BETW > 0.D0) GO TO 120 BETW=(FF-F(NXF-1))*(F(NXF)-F(1)) IF(BETW > 0.D0) GO TO 140 DO 100 K=3,NXF-1 BETW=(FF-F(K-1))*(F(K)-FF) DX=(FF-F(K-1))/(F(K)-F(K-1)) XX=X(K-1)+DX*(X(K)-X(K-1)) IF(BETW >= 0.D0) GO TO 110 100 CONTINUE 110 CONTINUE DO 115 KK=1,5 X1=X(K-2) X2=X(K-1) X3=X(K) X4=X(K+1) F1=F(K-2) F2=F(K-1) F3=F(K) F4=F(K+1) X21=X2-X1 X31=X3-X1 X32=X3-X2 X43=X4-X3 X42=X4-X2 F21=(F2-F1)/(X21*X21) F32=(F3-F2)/(X32*X32) F43=(F4-F3)/(X43*X43) F3221=(F32+F21)/X31*X21 F4332=(F43+F32)/X42*X43 A=F2 B=X32*F3221 C=3.D0*F32-F3221-F3221-F4332 D=(F3221+F4332-F32-F32)/X32 XF=XX-X2 C FFCUSP= Cubic Spline Interpolation Result C ----------------------------------------- FFCUSP=A+XF*(B+XF*(C+XF*D)) XE=(X3+X2-XX-XX)/X32 IF(XE < 0.D0) XE=-XE XEXM=XE**2 CUSPWT=(1.D0-XEXM)*CUSPWM+XEXM*CUSPWE C FFLINR= Linear Interpolation Result C ----------------------------------- FFLINR=A+XF*F32*X32 GG=FFCUSP*CUSPWT+FFLINR*(1.D0-CUSPWT) SLOPEC=B+2.D0*C*XF+3.D0*D*XF**2 SLOPEL=F32*X32 SLOPES=SLOPEC*CUSPWT+SLOPEL*(1.D0-CUSPWT) XG=XF XY=XX DELTX=(GG-FF)/SLOPES XX=XF-(GG-FF)/SLOPES+X2 115 CONTINUE GO TO 160 C Edge Point Interval Interpolation and/or Extrapolation C ------------------------------------------------------ 120 CONTINUE BETW=(F(1)-FF)*(F(NXF)-F(1)) IF(BETW > 0.D0) GO TO 130 C F(1),F(2) Edge Point Interval Interpolation C -------------------------------------------- DO 125 KK=2,6 X1=X(1) X2=X(2) X3=X(3) F1=F(1) F2=F(2) F3=F(3) XX=X1+(FF-F(1))/(F(2)-F(1))*(X2-X1) XF=XX-X1 X21=X2-X1 F21=(F2-F1)/X21 X32=X3-X2 X31=X3-X1 C=((F3-F2)/X32-F21)/X31 B=F21-X21*C A=F1 FFCUSP=A+XF*(B+XF*C) FFLINR=A+XF*F21 XE=1.D0-2.D0*XF/X21 XEXM=XE**2 CUSPWT=(1.D0-XEXM)*CUSPWM+XEXM*CUSPWE GG=FFCUSP*CUSPWT+FFLINR*(1.D0-CUSPWT) SLOPEC=B+2.D0*C*XF SLOPEL=F21 SLOPES=SLOPEC*CUSPWT+SLOPEL*(1.D0-CUSPWT) XG=XF DELTX=(GG-FF)/SLOPES XX=XF-(GG-FF)/SLOPES+X1 125 CONTINUE GO TO 160 130 CONTINUE C Extrapolation for FF Outside of Interval F(1) - F(2) C ---------------------------------------------------- C IF(KXTRAP == 0) (No Extrapolation: sets XX = 0.0) C IF(KXTRAP == 1) (Extrapolation at Fixed Edge Value) C IF(KXTRAP == 2) (2 Edge Point Linear Extrapolation) IF(KXTRAP == 0) XX=0.D0 IF(KXTRAP == 1) XX=X(1) IF(KXTRAP == 2) XX=X(1)-(F(1)-FF)/(F(2)-F(1))*(X(2)-X(1)) GO TO 160 140 CONTINUE BETW=(FF-F(NXF))*(F(NXF)-F(1)) IF(BETW > 0.D0) GO TO 150 C F(NXF-1),F(NXF) Edge Point Interval Interpolation C -------------------------------------------------- DO 145 KK=3,7 X1=X(NXF-2) X2=X(NXF-1) X3=X(NXF) F1=F(NXF-2) F2=F(NXF-1) F3=F(NXF) XX=X2+(FF-F2)/(F3-F2)*(X3-X2) XF=XX-X2 X32=X3-X2 F32=(F3-F2)/X32 X21=X2-X1 X31=X3-X1 F21=(F2-F1)/X21 C 3-Point Quadratic Interpolation for Edge Intervals C -------------------------------------------------- C C (Edge Option) ---------------------------------------------- C For Linear Interpolation within Edge Intervals C between F(1),F(2), and between F(NXF-1),F(NXF) C set the value of coefficient C below, to C=0.0 C ---------------------------------------------- C=(F32-F21)/X31 B=F21+X21*C A=F2 FFCUSP=A+XF*(B+XF*C) FFLINR=A+XF*F32 XE=1.D0-2.D0*XF/X32 IF(XE < 0.D0) XE=-XE XEXM=XE**2 CUSPWT=(1.D0-XEXM)*CUSPWM+XEXM*CUSPWE GG=FFCUSP*CUSPWT+FFLINR*(1.D0-CUSPWT) SLOPEC=B+2.D0*C*XF SLOPEL=F21 SLOPES=SLOPEC*CUSPWT+SLOPEL*(1.D0-CUSPWT) XG=XF DELTX=(GG-FF)/SLOPES XX=XF-(GG-FF)/SLOPES+X2 145 CONTINUE GO TO 160 150 CONTINUE C Extrapolation for F Outside of Interval F(NXF-1)-F(NXF) C -------------------------------------------------------- C IF(KXTRAP == 0) (No Extrapolation: sets XX = 0.0) C IF(KXTRAP == 1) (Extrapolation at Fixed Edge Value) C IF(KXTRAP == 2) (2 Edge Point Linear Extrapolation) IF(KXTRAP == 0) XX=0.D0 IF(KXTRAP == 1) XX=X(NXF) IF(KXTRAP == 2) XX=X(NXF) + -(F(NXF)-FF)/(F(NXF-1)-F(NXF))*(X(NXF-1)-X(NXF)) 160 CONTINUE RETURN END SUBROUTINE SPLINV SUBROUTINE SPLN44(Q,NI,NJ,IR,DR,JN,DN,QQ) 3 IMPLICIT NONE INTEGER, intent(in) :: NI,NJ, IR, JN REAL*8, intent(in) :: Q(NI,NJ), DR, DN REAL*8, intent(out) :: QQ !nu REAL*8,save :: CUSPWM=1., CUSPWE=1. ,CUSPWT,fflinr REAL*8 QK(4), ffcusp,a,b,c,d,xf,xe,xexm REAL*8 f1,f2,f3,f4, f21,f32,f43,f3221,f4332 INTEGER k,kr,irm,irp K=0 IRM=IR-1 IRP=IR+2 DO 110 KR=IRM,IRP K=K+1 F1=Q(KR,JN-1) F2=Q(KR,JN) F3=Q(KR,JN+1) F4=Q(KR,JN+2) F21=F2-F1 F32=F3-F2 F43=F4-F3 F3221=0.5D0*(F32+F21) F4332=0.5D0*(F43+F32) A=F2 B=F3221 C=3.D0*F32-F3221-F3221-F4332 D=F3221+F4332-F32-F32 XF=DN FFCUSP=A+XF*(B+XF*(C+XF*D)) XE=1.D0-XF-XF IF(XE < 0.0) XE=-XE XEXM=XE**2 !=1 CUSPWT=(1.D0-XEXM)*CUSPWM+XEXM*CUSPWE !nu FFLINR=A+XF*F32 QK(K)=FFCUSP ! *CUSPWT+FFLINR*(1.D0-CUSPWT) 110 CONTINUE F1=QK(1) F2=QK(2) F3=QK(3) F4=QK(4) F21=F2-F1 F32=F3-F2 F43=F4-F3 F3221=0.5D0*(F32+F21) F4332=0.5D0*(F43+F32) A=F2 B=F3221 C=3.D0*F32-F3221-F3221-F4332 D=F3221+F4332-F32-F32 XF=DR FFCUSP=A+XF*(B+XF*(C+XF*D)) XE=1.D0-XF-XF IF(XE < 0.0) XE=-XE XEXM=XE**2 !=1 CUSPWT=(1.D0-XEXM)*CUSPWM+XEXM*CUSPWE !nu FFLINR=A+XF*F32 QQ=FFCUSP ! *CUSPWT+FFLINR*(1.D0-CUSPWT) RETURN END SUBROUTINE SPLN44 SUBROUTINE SPLNI4(Q,NI,NJ,IR,JN,DN,QQ) 6 IMPLICIT NONE INTEGER, intent(in) :: NI,NJ, IR, JN REAL*8, intent(in) :: Q(NI,NJ), DN REAL*8, intent(out) :: QQ !nu REAL*8,save :: CUSPWM=1., CUSPWE=1. ,CUSPWT,fflinr REAL*8 ffcusp,a,b,c,d,xf,xe,xexm REAL*8 f1,f2,f3,f4, f21,f32,f43,f3221,f4332 F1=Q(IR,JN-1) F2=Q(IR,JN) F3=Q(IR,JN+1) F4=Q(IR,JN+2) F21=F2-F1 F32=F3-F2 F43=F4-F3 F3221=0.5D0*(F32+F21) F4332=0.5D0*(F43+F32) A=F2 B=F3221 C=3.D0*F32-F3221-F3221-F4332 D=F3221+F4332-F32-F32 XF=DN FFCUSP=A+XF*(B+XF*(C+XF*D)) XE=1.D0-XF-XF IF(XE < 0.0) XE=-XE XEXM=XE**2 !=1 CUSPWT=(1.D0-XEXM)*CUSPWM+XEXM*CUSPWE !nu FFLINR=A+XF*F32 QQ=FFCUSP ! *CUSPWT+FFLINR*(1.D0-CUSPWT) RETURN END SUBROUTINE SPLNI4 SUBROUTINE SETREL(REFF0,NAER,KDREAD ! input parameters 2,60 A ,SRUQEX,SRUQSC,SRUQCB ! SW input ( 6,110) B ,TRUQEX,TRUQSC,TRUQCB ! LW input (33,110) C ,REFU22,Q55U22,FRSULF ! RQ input (110) ! SETREL output D ,SRHQEX,SRHQSC,SRHQCB,TRHQAB ! 3(6,190),(33,190) E ,RHDATA) ! RH info (190,9) USE FILEMANAGER, only : openunit,closeunit USE DOMAIN_DECOMP, only: AM_I_ROOT implicit none INTEGER NAER,KDREAD REAL*8 REFF0,SRUQEX( 6,110),SRUQSC( 6,110),SRUQCB( 6,110) A ,TRUQEX(33,110),TRUQSC(33,110),TRUQCB(33,110) B ,REFU22(110),Q55U22(110),FRSULF(8) REAL*8 SRHQEX(6,190),SRHQSC(6,190),SRHQCB( 6,190) A ,TRHQAB(33,190),RHDATA(190,15) C ------------------------------------------------------------------ C REFF0 = Effective radius for dry aerosol seed size (in microns) C NAER = Aerosol composition index C KDREAD = IO READ unit number for Q(m,r),g(m,r) data used by SETREL C ------------------------------------------------------------------ C Aerosol index = NAER Composition Input data order = NNA C 1 SO4 Sulfate 1 C 2 SEA Sea Salt 2 C 3 NO3 Nitrate 3 C Pure Water 4 C 4 ORG Organic 5 C ------------------------------------------------------------------ character*40, save :: dtfile='oct2003.relhum.nr.Q633G633.table' logical qexist INTEGER i,j,j1,k,k1,in1,ir1,jdry,jwet,jhimax,khimax,maxdry,maxwet INTEGER n,n0,n1,nn,np,nrhn1 REAL*8 x,xx,xi,xn0,xn1,xr1,ff,fi,gi,gd1,gd2,gw1,gw2,grh,qrh,rrh REAL*8 rh,rhi,rr0,rd1,rd2,rw1,rw2,dwr,qd1,qd2,qw1,qw2,xdry,sdry REAL*8 xwet,swet,qqdmax,qqwmax,rqdmax,rqwmax,q55dry,q63dry,dwn REAL*8 aermas,ddry,dwet,reffi,rhrhi,sum,sumw,vd1,vd2,vw1,vw2 REAL*8 w1,w2,w3,w4,wd1,wd2,ww1,ww2,wtx,wty,wtz,wts,wta,xfdry REAL*8 q55rh1,q55rh2,q55rh3,q55rh4,q550,q633,qgaerx,qscqcb C Output variables (RHDATA/RHINFO) REAL*8 RHRHRH(190),RHTAUF(190),RHREFF(190) A ,RHWGM2(190),RHDGM2(190),RHTGM2(190) B ,RHXMFX(190),RHDENS(190),RHQ550(190) C ,TAUM2G(190),XNRRHX(190),ANBCM2(190) D ,COSBAR(190),PIZERO(190),ANGSTR(190),RHINFO(190,15) EQUIVALENCE (RHINFO(1, 1),RHRHRH(1)),(RHINFO(1, 2),RHTAUF(1)) EQUIVALENCE (RHINFO(1, 3),RHREFF(1)),(RHINFO(1, 4),RHWGM2(1)) EQUIVALENCE (RHINFO(1, 5),RHDGM2(1)),(RHINFO(1, 6),RHTGM2(1)) EQUIVALENCE (RHINFO(1, 7),RHXMFX(1)),(RHINFO(1, 8),RHDENS(1)) EQUIVALENCE (RHINFO(1, 9),RHQ550(1)),(RHINFO(1,10),TAUM2G(1)) EQUIVALENCE (RHINFO(1,11),XNRRHX(1)),(RHINFO(1,12),ANBCM2(1)) EQUIVALENCE (RHINFO(1,13),COSBAR(1)),(RHINFO(1,14),PIZERO(1)) EQUIVALENCE (RHINFO(1,15),ANGSTR(1)) C ------------------------------------------------------------------ C RHDATA/ Local C RHINFO Variable Description C ------ -------- ---------------------------------------------- C 1 RHRHRH Relative humidity index RH (DO 110 0.0-0.999) C 2 RHTAUF Dry TAU multiplication factor due to RH effect C 3 RHREFF RH dependent effective radius C 4 RHWGM2 Liquid water content (g/m2) per unit (dry) TAU C 5 RHDGM2 Dry mass density (g/m2) per unit (dry) TAU C 6 RHTGM2 Total mass density (g/m2) per unit (dry) TAU C 7 RHXMFX Dry mass fraction X of total aerosol mass C 8 RHDENS RH dependent density (g/cm3) C 9 RHQ550 RH dependent Mie extinction efficiency (550nm) C 10 TAUM2G RH dependent TAU factor (m2/g) of dry aerosol C 11 XNRRHX RH dependent real refractive index C 12 ANBCM2 Aerosol Number density (Billion)/cm2 C 13 COSBAR RH dependent Mie asymmetry parameter (visible) C 14 PIZERO RH dependent single scattering albedo(visible) C 15 ANGSTR Angstrom exponent = -(1-SRHQEX(5)/(0.55-0.815) C ------------------------------------------------------------------ C Local variables REAL*8 R633NR(890),XNR(31),Q633NR(890,31),G633NR(890,31) REAL*8 Q880M1(890),G880M1(890),Q880M0(890),G880M0(890) REAL*8 Q880N1(890),Q880N0(890),R550NR(890),SMOOTH(890) REAL*8 RR0RHX(190),QRH633(190),GRH633(190),DNRX(190) REAL*8 QXAERN(33),QSAERN(33),QGAERN(33) A ,SR1QEX( 6),SR1QSC( 6),SR1QCB( 6) B ,SR2QEX( 6),SR2QSC( 6),SR2QCB( 6) C ,SR3QEX( 6),SR3QSC( 6),SR3QCB( 6) D ,SR4QEX( 6),SR4QSC( 6),SR4QCB( 6) E ,TR1QEX(33),TR1QSC(33),TR1QCB(33) F ,TR2QEX(33),TR2QSC(33),TR2QCB(33) G ,TR3QEX(33),TR3QSC(33),TR3QCB(33) H ,TR4QEX(33),TR4QSC(33),TR4QCB(33) I ,TRHQEX(33),TRHQSC(33),TRHQCB(33) INTEGER, parameter, dimension(4) :: NRHCRY=(/38,47,28,38/) CHARACTER*8 AERTYP(4) DATA AERTYP/'Sulfate ','SeaSalt ','Nitrate ','Organic '/ C ------------------------------------------------------------------ C Hygroscopic aerosols (Sulfate,SeaSalt,Nitrate) physical properties C formulas from Tang and Munkelwitz (1994, 1996) in JGR 99, JGR 101. C C AW=water activity RO=density BX=growth factor RX=refractive index C SO4 = ammonium sulfate; SEA = sea salt; NO3 = ammonium nitrate C ------------------------------------------------------------------ C functions REAL*8 AWSO4,DWSO4,ROSO4,BXSO4,RXSO4,DRWSO4,DRDSO4 REAL*8 AWSEA,DWSEA,ROSEA,BXSEA,RXSEA,DRWSEA,DRDSEA REAL*8 RRSEA,VVSEA,GXSEA REAL*8 AWNO3,DWNO3,RONO3,BXNO3,R1NO3,R2NO3, DRXNO3 REAL*8 AWOCX,DWOCX,ROOCX,BXOCX,RXOCX,DRWOCX,DRDOCX ! Sulfate parametric formulas from Tang & Munkelwitz(94,96) AWSO4(X)=1.D0-0.2715*X+0.3113*X**2-2.336*X**3+1.412*X**4 ! TM94 DWSO4(X)= -0.2715D0+0.6226*X -7.008*X**2+5.648*X**3 ROSO4(X)=0.9971D0+5.92D-01*X-5.036D-02*X**2+1.024D-02*X**3 ! TM94 BXSO4(X)=(1.D0/X*1.760D0/ROSO4(X))**(1.D0/3.D0) ! TM96 RXSO4(X)=1.3330+0.16730*X-0.0395*X**2 ! TM91 DRWSO4(RH)=1.002146-0.00149*RH+0.001*RH/(1.0+0.911*RH**10) DRDSO4(RH)=1.002503 ! ratio of wet & dry nr(0.550) / nr(0.633) ! SeaSalt parametric formulas from Tang & Munkelwitz(94,96) AWSEA(X)=1.0D0-0.6366*X+0.8624*X**2-11.58*X**3+15.18*X**4 ! TM96 DWSEA(X)= -0.6366D0+1.7248*X -34.74*X**2+60.72*X**3 ROSEA(X)=0.9971+0.741*X-0.3741*X**2+2.252*X**3-2.060*X**4 ! TM96 BXSEA(X)=(1.D0/X*2.165D0/ROSEA(X))**(1.D0/3.D0) RRSEA(X)=3.70958+(8.95-3.70958)/(1.D0+(1.0-X)/X*58.448/18.0) VVSEA(X)=(18.0+(58.448-18.0)/(1.0+(1.0-X)/X*58.448/18.0))/ROSEA(X) GXSEA(X)=SQRT((2.D0*RRSEA(X)+VVSEA(X))/(VVSEA(X)-RRSEA(X))) ! TM96 RXSEA(X)=1.333+(GXSEA(X)-1.333)*(1.490-1.333)/(1.544-1.333) DRWSEA(RH)=1.00212-0.001625*RH+0.00131*RH/(1.0+0.928*RH**3) DRDSEA(RH)=1.003007 ! ratio of wet & dry nr(0.550) / nr(0.633) ! Nitrate parametric formulas from Tang & Munkelwitz(94,96) AWNO3(X)=1.D0-3.65D-01*X-9.155D-02*X**2-2.826D-01*X**3 ! TM96 DWNO3(X)= -3.65D-01 -18.31D-02*X -8.478D-01*X**3 RONO3(X)=0.9971D0+4.05D-01*X+9.0D-02*X**2 ! TM96 BXNO3(X)=(1.D0/X*1.725D0/RONO3(X))**(1.D0/3.D0) ! TM96 R1NO3(X)=1.3330+0.119D0*X ! (X<0.205) TWM81 R2NO3(X)=1.3285+0.145D0*X ! (X>0.205) TWM81 DRXNO3(RH)=1.001179 ! ratio of wet & dry nr(0.550) / nr(0.633) ! Organic Carbon - adapted from Sulfate parametric formulas ! yields growth factor G=1.1 at RH=0.84 Virkkula et al 1999 AWOCX(X)=1d0-X**8D0 DWOCX(X)=-8d0*X**7D0 ROOCX(X)=1d0+.5d0*X BXOCX(X)=(1.5d0/(X*ROOCX(X)))**(1d0/3d0) RXOCX(X)=1.3330d0+.193d0*X DRWOCX(RH)=1.00253-0.00198*RH+0.00184*RH/(1.0+0.656*RH**1.1) DRDOCX(RH)=1.00253 C ------------------------------------------------------------------ C Q,G Mie data (879x31) at 0.633 microns, use 31 points to cover the C refractive index from 1.30 to 1.60 with equal spacing of 0.01 C C Q,G data effective radius spans the range from 0.0 to 20.4 microns C in (3) segments of equally spaced data for optimized 4-point Cubic C Spline interpolation. The equally spaced segments are as follows: C C Index: 1 - 303 304 - 603 604 - 879 881 - 885 886 - 890 C Reff: 0.00-3.02 3.04-9.02 9.04-20.04 2.98-3.04 8.96-9.08 C Delta: 0.01 0.02 0.04 0.02 0.04 C C The last two intervals are constructed to accommodate transitions C between the (3) segments using 4-point Cubic Spline interpolation C ------------------------------------------------------------------ inquire (file=dtfile,exist=qexist) if(.not.qexist) dtfile='RH_QG_Mie ' ! generic name used by GCM inquire (file=dtfile,exist=qexist) if(.not.qexist) call stop_model('setrel: no RH_QG files',255) call openunit(dtfile,kdread,.false.,.true.) ! formatted, old READ (KDREAD,7000) (XNR(J),J=1,31) 7000 FORMAT(12X,F5.3,30F8.3) DO 101 I=1,880 READ (KDREAD,7001) R633NR(I),(Q633NR(I,J),J=1,31) 7001 FORMAT(3X,F6.2,31F8.5) 101 CONTINUE READ (KDREAD,7000) (XNR(J),J=1,31) DO 102 I=1,880 READ (KDREAD,7001) R633NR(I),(G633NR(I,J),J=1,31) 102 CONTINUE call CLOSEunit (KDREAD) J=880 DO 104 K=299,305 IF(K == 300) GO TO 104 IF(K == 302) GO TO 104 J=J+1 R633NR(J)=R633NR(K) DO 103 I=1,31 Q633NR(J,I)=Q633NR(K,I) G633NR(J,I)=G633NR(K,I) 103 CONTINUE 104 CONTINUE DO 106 K=600,606 IF(K == 601) GO TO 106 IF(K == 603) GO TO 106 J=J+1 R633NR(J)=R633NR(K) DO 105 I=1,31 Q633NR(J,I)=Q633NR(K,I) G633NR(J,I)=G633NR(K,I) 105 CONTINUE 106 CONTINUE C Apply 13-point quadratic least-squares smoothing to large particle C portion of Mie Qx data to eliminate low-amplitude ripple in Q633NR C (Monotonic size dependence is needed for inverse Qx interpolation) C (Smoothing affects 4th decimal of Q633NR for large particle sizes) C ------------------------------------------------------------------ DO 109 I=1,31 DO J=1,880 SMOOTH(J)=Q633NR(J,I) END DO DO J=881,886 SMOOTH(J)=SMOOTH(880) END DO DO J=250,880 J1=J-2 IF(SMOOTH(J) >= SMOOTH(J-1)) GO TO 107 END DO 107 CONTINUE DO 108 J=J1,880 SUM=4550.D0/13.D0*SMOOTH(J) DO K=1,6 SUM=SUM+(4550.D0/13.D0-14*K*K)*(SMOOTH(J-K)+SMOOTH(J+K)) END DO Q633NR(J,I)=SUM/2002.D0 108 CONTINUE 109 CONTINUE C Set relative humidity RHRHRH scale C ---------------------------------- DO 110 I=1,190 RHRHRH(I)=(I-1)/100.D0 IF(I > 91) RHRHRH(I)=0.90D0+(I-91)/1000.D0 110 CONTINUE C Define RH (=AW), RO, BX, RX as functions of X for NAER aerosol C -------------------------------------------------------------- NRHN1=NRHCRY(NAER)+1 DO 111 I=1,190 RHI=RHRHRH(I) RR0RHX(I)=1.D0 RHXMFX(I)=1.D0 IF(NAER == 1) THEN ! Dry Sulfate refrac index and density XNRRHX(I)=1.526 RHDENS(I)=1.760 IF(I < NRHN1) DNRX(I)=DRDSO4(RHI) IF(I >= NRHN1) DNRX(I)=DRWSO4(RHI) ENDIF IF(NAER == 2) THEN ! Dry SeaSalt refrac index and density XNRRHX(I)=1.490 RHDENS(I)=2.165 IF(I < NRHN1) DNRX(I)=DRDSEA(RHI) IF(I >= NRHN1) DNRX(I)=DRWSEA(RHI) ENDIF IF(NAER == 3) THEN ! Dry Nitrate refrac index and density XNRRHX(I)=1.554 RHDENS(I)=1.725 DNRX(I)=DRXNO3(RHRHRH(I)) ENDIF IF(NAER == 4) THEN ! Dry Organic refrac index and density XNRRHX(I)=1.526 ! (representative value) RHDENS(I)=1.5 ! (representative value) IF(I < NRHN1) DNRX(I)=DRDOCX(RHI) IF(I >= NRHN1) DNRX(I)=DRWOCX(RHI) ENDIF 111 CONTINUE C Invert X, RO, BX, RX functions of (X) to be functions of RH C ----------------------------------------------------------- I=191 FF=1.D0 XX=0.D0 IF(NAER == 1) GI=DWSO4(XX) IF(NAER == 2) GI=DWSEA(XX) IF(NAER == 3) GI=DWNO3(XX) IF(NAER == 4) THEN FF=.9995d0 XX=(1d0-FF)**.125d0 GI=DWOCX(XX) END IF 112 I=I-1 FI=RHRHRH(I) DO 113 K=1,5 XI=XX-(FF-FI)/GI IF(NAER == 1) FF=AWSO4(XI) IF(NAER == 2) FF=AWSEA(XI) IF(NAER == 3) FF=AWNO3(XI) IF(NAER == 4) FF=AWOCX(XI) IF(I > 0) THEN ENDIF XX=XI IF(NAER == 1) GI=DWSO4(XX) IF(NAER == 2) GI=DWSEA(XX) IF(NAER == 3) GI=DWNO3(XX) IF(NAER == 4) GI=DWOCX(XX) 113 CONTINUE RHXMFX(I)=XX IF(NAER == 1) THEN ! RH dependent Sulfate X,R,NR,RO RHDENS(I)=ROSO4(XX) RR0RHX(I)=BXSO4(XX) XNRRHX(I)=RXSO4(XX) ENDIF IF(NAER == 2) THEN ! RH dependent SeaSalt X,R,NR,RO RHDENS(I)=ROSEA(XX) RR0RHX(I)=BXSEA(XX) XNRRHX(I)=RXSEA(XX) ENDIF IF(NAER == 3) THEN ! RH dependent Nitrate X,R,NR,RO RHDENS(I)=RONO3(XX) RR0RHX(I)=BXNO3(XX) XNRRHX(I)=R1NO3(XX) IF(XX > 0.205D0) XNRRHX(I)=R2NO3(XX) ENDIF IF(NAER == 4) THEN ! RH dependent Organic X,R,NR,RO RHDENS(I)=ROOCX(XX) RR0RHX(I)=BXOCX(XX) XNRRHX(I)=RXOCX(XX) ENDIF IF(I > NRHN1) GO TO 112 C ------------------------------------------------------------------ C Find Qdry(r),gdry(r) from Q(m,r),g(m,r) maps for each aerosol type C Find Qwet(r),gwet(r) from Q(m,r),g(m,r) maps for each aerosol type C also locate MAXDRY,MAXWET pts where Qdry(r),Qwet(r) are at maximum C (M1 refers to mass fraction X of 1.0, i.e., "dry" aerosol) C (M0 refers to mass fraction X of 0.0, i.e., "wet" aerosol) C ------------------------------------------------------------------ MAXDRY=1 MAXWET=1 QQDMAX=0.D0 QQWMAX=0.D0 XDRY=XNRRHX(1) C IF(MCRYON == 1) XDRY=XNRRHX(NRHN1) ! If "dry" = RHC reference line SDRY=XDRY*100.D0-129 JDRY=SDRY DDRY=SDRY-JDRY XWET=1.3330D0 ! Pure water Nr = "wet" aerosol SWET=XWET*100.D0-129 JWET=SWET DWET=SWET-JWET DO 114 I=1,880 CALL SPLNI4(Q633NR,890,31,I,JDRY,DDRY,Q880M1(I)) CALL SPLNI4(G633NR,890,31,I,JDRY,DDRY,G880M1(I)) CALL SPLNI4(Q633NR,890,31,I,JWET,DWET,Q880M0(I)) CALL SPLNI4(G633NR,890,31,I,JWET,DWET,G880M0(I)) IF(Q880M1(I) > QQDMAX) THEN QQDMAX=Q880M1(I) MAXDRY=I ENDIF IF(Q880M0(I) > QQWMAX) THEN QQWMAX=Q880M0(I) MAXWET=I ENDIF 114 CONTINUE RQDMAX=R633NR(MAXDRY) RQWMAX=R633NR(MAXWET) C Define: Qdry(r) and Qwet(r) at the reference wavelength of 550 nm C using refractive index off-set and size parameter scaling C ------------------------------------------------------------------ XDRY=XNRRHX(1)*DNRX(1) ! Dry aerosol Nr at 550 nm C IF(MCRYON == 1) XDRY=XNRRHX(NRHN1) ! If "dry" = RHC reference line SDRY=XDRY*100.D0-129 JDRY=SDRY DDRY=SDRY-JDRY XWET=1.3330D0*1.001179 ! Pure water aerosol Nr at 550 nm SWET=XWET*100.D0-129 JWET=SWET DWET=SWET-JWET DO 115 I=1,880 CALL SPLNI4(Q633NR,890,31,I,JDRY,DDRY,Q880N1(I)) CALL SPLNI4(Q633NR,890,31,I,JWET,DWET,Q880N0(I)) R550NR(I)=R633NR(I)*(0.550/0.633) ! Size shift refers Q to 550 nm 115 CONTINUE CALL SPLINE(R550NR,Q880N1,880,REFF0,Q55DRY,1.D0,1.D0,1) CALL SPLINE(R633NR,Q880M1,880,REFF0,Q63DRY,1.D0,1.D0,1) C Find Q(RH),g(RH) paths in Q(m,r),g(m,r) maps for seed size = REFF0 C 2-coordinate paths defined via XN0=XNRRHX(I) & RR0=REFF0*RR0RHX(I) C ------------------------------------------------------------------ DO 116 I=1,190 XN0=XNRRHX(I) XN1=XN0*100.D0-129 IN1=XN1 DWN=XN1-IN1 RR0=REFF0*RR0RHX(I) IF(RR0 < 0.01) RR0=0.01 IF(RR0 <= 3.00D0) XR1=RR0*100.D0+1 IF(RR0 > 3.00D0.and.RR0 < 3.04D0) XR1=RR0*50.0D0+732 IF(RR0 >= 3.04D0.and.RR0 <= 9.00D0) XR1=RR0*50.0D0+152 IF(RR0 > 9.00D0.and.RR0 < 9.08D0) XR1=RR0*25.0D0+662 IF(RR0 >= 9.08D0) THEN XR1=RR0*25.0D0+378 IF(XR1 > 877.9999D0) XR1=877.9999D0 ENDIF IR1=XR1 DWR=XR1-IR1 CALL SPLN44(Q633NR,890,31,IR1,DWR,IN1,DWN,QRH633(I)) CALL SPLN44(G633NR,890,31,IR1,DWR,IN1,DWN,GRH633(I)) 116 CONTINUE C Define Q55(RH) by tracing path in Q(m,r) map for RH dependent size C via 2-coordinate path XN0=XNRRHX(I)*DNRX(I), RR0=RRH(I)*(.633/.55) C ------------------------------------------------------------------ DO 117 I=1,190 XN0=XNRRHX(I)*DNRX(I) XN1=XN0*100.D0-129 IN1=XN1 DWN=XN1-IN1 RR0=REFF0*RR0RHX(I)*(0.633D0/0.550D0) IF(RR0 < 0.01) RR0=0.01 IF(RR0 <= 3.00D0) XR1=RR0*100.D0+1 IF(RR0 > 3.00D0.and.RR0 < 3.04D0) XR1=RR0*50.0D0+732 IF(RR0 >= 3.04D0.and.RR0 <= 9.00D0) XR1=RR0*50.0D0+152 IF(RR0 > 9.00D0.and.RR0 < 9.08D0) XR1=RR0*25.0D0+662 IF(RR0 >= 9.08D0) THEN XR1=RR0*25.0D0+378 IF(XR1 > 877.9999D0) XR1=877.9999D0 ENDIF IR1=XR1 DWR=XR1-IR1 CALL SPLN44(Q633NR,890,31,IR1,DWR,IN1,DWN,RHQ550(I)) RHREFF(I)=RR0RHX(I)*REFF0 117 CONTINUE C Aerosol liquid water content is in kg/m2 per unit optical depth C of dry aerosol with aerosol effective radius expressed in microns. C ------------------------------------------------------------------ DO 118 I=1,190 RHTAUF(I)=(RHQ550(I)/Q55DRY)*RR0RHX(I)**2 AERMAS=1.33333333D0*RHREFF(I)*RHDENS(I)/RHQ550(I)*RHTAUF(I) RHTGM2(I)=AERMAS RHDGM2(I)=AERMAS*RHXMFX(I) RHWGM2(I)=RHTGM2(I)-RHDGM2(I) TAUM2G(I)=0.75D0/RHDENS(1)/RHREFF(1)*RHQ550(1)*RHTAUF(I) ANBCM2(I)=TAUM2G(I)/(1.5080*RHQ550(I)*RHREFF(I)**2) 118 CONTINUE C Determination of RH dependent Mie scattering tables for GCM input. C Find equivalent aersol dry sizes (RD1,RD2) and wet sizes (RW1,RW2) C and corresponding weights to match the RH dependent Q(r) and g(r). C Fits made to form: QRH=X*[Y*QD1+(1-Y)*QD2]+(1-X)*[Z*WD1+(1-Z)*WD2] C ------------------------------------------------------------------ J1=MAXWET JHIMAX=881-MAXWET K1=MAXDRY KHIMAX=881-MAXDRY NP=190-NRHN1+1 DO 140 I=1,190 RHRHI=RHRHRH(I) XFDRY=RHXMFX(I) REFFI=RHREFF(I) RRH=RR0RHX(I)*REFF0 GRH=GRH633(I) QRH=QRH633(I) QD1=QRH QD2=QRH QW1=QRH QW2=QRH IF(QW1 > QQWMAX) QW1=QQWMAX IF(QW2 > QQWMAX) QW2=QQWMAX CALL SPLINV(R633NR ,Q880M0 ,MAXWET,RW1,QW1,1.D0,1.D0,1) CALL SPLINV(R633NR(J1),Q880M0(J1),JHIMAX,RW2,QW2,1.D0,1.D0,1) CALL SPLINE(R633NR,G880M0,880,RW1,GW1,1.D0,1.D0,1) CALL SPLINE(R633NR,G880M0,880,RW2,GW2,1.D0,1.D0,1) IF(I >= NRHN1.and.QRH > QQWMAX) THEN QD1=QQWMAX+(QRH-QQWMAX)/XFDRY ! QD1 such that QRH=X*QD1+(1-X)*QW1 QD2=2.3D0 ! 2 dry sizes are used if QD1>QQWMAX ENDIF CALL SPLINV(R633NR ,Q880M1 ,MAXDRY,RD1,QD1,1.D0,1.D0,1) CALL SPLINV(R633NR(K1),Q880M1(K1),KHIMAX,RD2,QD2,1.D0,1.D0,1) CALL SPLINE(R633NR,G880M1,880,RD1,GD1,1.D0,1.D0,1) CALL SPLINE(R633NR,G880M1,880,RD2,GD2,1.D0,1.D0,1) IF(I < NRHN1) THEN ! Pure dry aerosol region (1) WTX=1.D0 WTY=1.D0 IF(REFF0 > RQDMAX) WTY=0.D0 WTZ=1.D0 ELSE ! Dry/wet weighted average regions (2)-(4) IF(QRH <= QQWMAX.and.REFFI < RW1) THEN ! Small-size region (2) WTZ=1.D0 WTY=1.D0 WTX=(GRH-GW1)/(GD1-GW1) ENDIF IF(QRH > QQWMAX) THEN ! Medium-size region (3) C Fit form: QRH=X*(Y*QD1+(1-Y)*QD2)+(1-X)*QWmax & QRH=/QD1=/QD2=/QW1 WTZ=1.D0 WTY=((GRH-GD2)*QRH*QD2+(GD2-GW1)*QD2*QW1+(GW1-GRH)*QRH*QW1) + /((GD1-GRH)*QRH*QD1+(GRH-GD2)*QRH*QD2+(GW1-GD1)*QD1*QW1 + +(GD2-GW1)*QD2*QW1) WTX=(QRH-QW1)/(WTY*(QD1-QD2)+(QD2-QW1)) ENDIF IF(QRH <= QQWMAX.and.REFFI > RW1) THEN ! Large size region (4) WTY=0.D0 WTZ=0.D0 WTX=(GRH-GW2)/(GD2-GW2) ENDIF ENDIF IF(REFFI > RQWMAX.and.RHRHI > 0.995) THEN ! High RH region (5) WTY=0.D0 WTX=XFDRY WTZ=((GRH-GW2)-(GD2-GW2)*WTX)/((1.D0-WTX)*(GW1-GW2)) ENDIF VD1=WTX*WTY VD2=WTX*(1.D0-WTY) VW1=WTZ*(1.D0-WTX) VW2=(1.D0-WTZ)*(1.D0-WTX) RD1=MIN(RD1,10.D0) RD2=MIN(RD2,10.D0) RW1=MIN(RW1,10.D0) RW2=MIN(RW2,10.D0) C Computed weight factors are for Lab reference wavelength of 633nm. C Rescale spectral extinction to 550 nm & renormalize weight factors C ------------------------------------------------------------------ CALL SPLINE(R550NR,Q880N1,880,RD1,Q550,1.D0,1.D0,1) CALL SPLINE(R633NR,Q880M1,880,RD1,Q633,1.D0,1.D0,1) WD1=VD1*(Q550/Q633) CALL SPLINE(R550NR,Q880N1,880,RD2,Q550,1.D0,1.D0,1) CALL SPLINE(R633NR,Q880M1,880,RD2,Q633,1.D0,1.D0,1) WD2=VD2*(Q550/Q633) CALL SPLINE(R550NR,Q880N0,880,RW1,Q550,1.D0,1.D0,1) CALL SPLINE(R633NR,Q880M0,880,RW1,Q633,1.D0,1.D0,1) WW1=VW1*(Q550/Q633) CALL SPLINE(R550NR,Q880N0,880,RW2,Q550,1.D0,1.D0,1) CALL SPLINE(R633NR,Q880M0,880,RW2,Q633,1.D0,1.D0,1) WW2=VW2*(Q550/Q633) SUMW=WD1+WD2+WW1+WW2 W1=WD1/SUMW W2=WD2/SUMW W3=WW1/SUMW W4=WW2/SUMW C ------------------------------------------------------------------ C Tabulate relative humidity dependent solar, thermal Mie scattering C parameters SRHQEX,SRHQSC,SRHQCS, TRHQAB for each aerosol type NAER C These are mass weighted averages of equivalent dry and wet aerosol C parameters for sizes matching the relative humidity dependent Q(r) C ------------------------------------------------------------------ N0=0 ! Select Mie parameters for Sulfate IF(NAER == 2) N0=22 ! Select Mie parameters for SeaSalt IF(NAER == 3) N0=44 ! Select Mie parameters for Nitrate IF(NAER == 4) N0=88 ! Select Mie parameters for Organic N1=N0+1 DO 122 K=1,6 ! SW dry sizes RD1 & RD2 DO 121 N=1,22 NN=N0+N WTS=FRSULF(NAER) WTA=1.D0-WTS QXAERN(N)=SRUQEX(K,NN)*WTA+SRUQEX(K,N)*WTS QSAERN(N)=SRUQSC(K,NN)*WTA+SRUQSC(K,N)*WTS QGAERX=SRUQCB(K,NN)*SRUQSC(K,NN)*WTA+SRUQCB(K,N)*SRUQSC(K,N)*WTS QGAERN(N)=QGAERX/QSAERN(N) 121 CONTINUE CALL SPLINE(REFU22,QXAERN,22,RD1,SR1QEX(K),1.D0,1.D0,1) CALL SPLINE(REFU22,QSAERN,22,RD1,SR1QSC(K),1.D0,1.D0,1) CALL SPLINE(REFU22,QGAERN,22,RD1,SR1QCB(K),1.D0,1.D0,1) CALL SPLINE(REFU22,QXAERN,22,RD2,SR2QEX(K),1.D0,1.D0,1) CALL SPLINE(REFU22,QSAERN,22,RD2,SR2QSC(K),1.D0,1.D0,1) CALL SPLINE(REFU22,QGAERN,22,RD2,SR2QCB(K),1.D0,1.D0,1) 122 CONTINUE DO 124 K=1,33 ! LW dry sizes RD1 & RD2 DO 123 N=1,22 NN=N0+N WTS=FRSULF(NAER) WTA=1.D0-WTS QXAERN(N)=TRUQEX(K,NN)*WTA+TRUQEX(K,N)*WTS QSAERN(N)=TRUQSC(K,NN)*WTA+TRUQSC(K,N)*WTS QGAERX=TRUQCB(K,NN)*TRUQSC(K,NN)*WTA+TRUQCB(K,N)*TRUQSC(K,N)*WTS QGAERN(N)=QGAERX/(QSAERN(N)+1d-10) 123 CONTINUE CALL SPLINE(REFU22,QXAERN,22,RD1,TR1QEX(K),1.D0,1.D0,1) CALL SPLINE(REFU22,QSAERN,22,RD1,TR1QSC(K),1.D0,1.D0,1) CALL SPLINE(REFU22,QGAERN,22,RD1,TR1QCB(K),1.D0,1.D0,1) CALL SPLINE(REFU22,QXAERN,22,RD2,TR2QEX(K),1.D0,1.D0,1) CALL SPLINE(REFU22,QSAERN,22,RD2,TR2QSC(K),1.D0,1.D0,1) CALL SPLINE(REFU22,QGAERN,22,RD2,TR2QCB(K),1.D0,1.D0,1) 124 CONTINUE CALL SPLINE(REFU22,Q55U22(N1),22,RD1,Q55RH1,1.D0,1.D0,1) CALL SPLINE(REFU22,Q55U22(N1),22,RD2,Q55RH2,1.D0,1.D0,1) N0=66 ! Select Mie parameters for pure water N1=N0+1 DO 126 K=1,6 ! SW wet sizes RW1 & RW2 DO 125 N=1,22 NN=N0+N QXAERN(N)=SRUQEX(K,NN) QSAERN(N)=SRUQSC(K,NN) QGAERN(N)=SRUQCB(K,NN) 125 CONTINUE CALL SPLINE(REFU22,QXAERN,22,RW1,SR3QEX(K),1.D0,1.D0,1) CALL SPLINE(REFU22,QSAERN,22,RW1,SR3QSC(K),1.D0,1.D0,1) CALL SPLINE(REFU22,QGAERN,22,RW1,SR3QCB(K),1.D0,1.D0,1) CALL SPLINE(REFU22,QXAERN,22,RW2,SR4QEX(K),1.D0,1.D0,1) CALL SPLINE(REFU22,QSAERN,22,RW2,SR4QSC(K),1.D0,1.D0,1) CALL SPLINE(REFU22,QGAERN,22,RW2,SR4QCB(K),1.D0,1.D0,1) 126 CONTINUE DO 128 K=1,33 ! LW wet sizes RW1 & RW2 DO 127 N=1,22 NN=N0+N QXAERN(N)=TRUQEX(K,NN) QSAERN(N)=TRUQSC(K,NN) QGAERN(N)=TRUQCB(K,NN) 127 CONTINUE CALL SPLINE(REFU22,QXAERN,22,RW1,TR3QEX(K),1.D0,1.D0,1) CALL SPLINE(REFU22,QSAERN,22,RW1,TR3QSC(K),1.D0,1.D0,1) CALL SPLINE(REFU22,QGAERN,22,RW1,TR3QCB(K),1.D0,1.D0,1) CALL SPLINE(REFU22,QXAERN,22,RW2,TR4QEX(K),1.D0,1.D0,1) CALL SPLINE(REFU22,QSAERN,22,RW2,TR4QSC(K),1.D0,1.D0,1) CALL SPLINE(REFU22,QGAERN,22,RW2,TR4QCB(K),1.D0,1.D0,1) 128 CONTINUE CALL SPLINE(REFU22,Q55U22(N1),22,RW1,Q55RH3,1.D0,1.D0,1) CALL SPLINE(REFU22,Q55U22(N1),22,RW2,Q55RH4,1.D0,1.D0,1) ! Weighted GCM SW Mie scattering parameters DO 129 K=1,6 SRHQEX(K,I)=W1*SR1QEX(K)+W2*SR2QEX(K)+W3*SR3QEX(K)+W4*SR4QEX(K) SRHQSC(K,I)=W1*SR1QSC(K)+W2*SR2QSC(K)+W3*SR3QSC(K)+W4*SR4QSC(K) QSCQCB =W1*SR1QCB(K)*SR1QSC(K)+W2*SR2QCB(K)*SR2QSC(K) + +W3*SR3QCB(K)*SR3QSC(K)+W4*SR4QCB(K)*SR4QSC(K) SRHQCB(K,I)=QSCQCB/SRHQSC(K,I) 129 CONTINUE ! Weighted GCM LW Mie scattering parameters DO 130 K=1,33 TRHQEX(K)=W1*TR1QEX(K)+W2*TR2QEX(K)+W3*TR3QEX(K)+W4*TR4QEX(K) TRHQSC(K)=W1*TR1QSC(K)+W2*TR2QSC(K)+W3*TR3QSC(K)+W4*TR4QSC(K) QSCQCB =W1*TR1QCB(K)*TR1QSC(K)+W2*TR2QCB(K)*TR2QSC(K) + +W3*TR3QCB(K)*TR3QSC(K)+W4*TR4QCB(K)*TR4QSC(K) TRHQCB(K)=QSCQCB/TRHQSC(K) TRHQAB(K,I)=TRHQEX(K)-TRHQSC(K) 130 CONTINUE COSBAR(I)=SRHQCB(6,I) PIZERO(I)=SRHQSC(6,I)/SRHQEX(6,I) ANGSTR(I)=-(1.D0-SRHQEX(5,I))/(0.550D0-0.815D0) C Transfer EQUIVALENCEd SETREL output information to RHDATA DO 139 J=1,15 RHDATA(I,J)=RHINFO(I,J) 139 CONTINUE 140 CONTINUE C Diagnostic output If (AM_I_ROOT()) THEN DO 150 I=1,190 IF(I == 1) WRITE(99,6000) AERTYP(NAER),NAER,REFF0 IF(I == 82) WRITE(99,6000) AERTYP(NAER),NAER,REFF0 IF(I == 137) WRITE(99,6000) AERTYP(NAER),NAER,REFF0 IF(I < 27) GO TO 150 WRITE(99,6100) I,(RHINFO(I,N),N=1,15) + ,SRHQEX(6,I),SRHQEX(5,I),SRHQEX(1,I),TRHQAB(1,I) 6100 FORMAT(I3,F5.3,18F8.4) 150 CONTINUE END IF 6000 FORMAT(T90,A8,' NAER=',I2,' REFF0=',F5.2/ + /' RH RHTAUF RHREFF RHWGM2 RHDGM2 RHTGM2 RHXMFX' + ,' RHDENS RHQ550 TAUM2G XNRRHX ANBCM2 COSBAR PIZERO' + ,' ANGSTR SRHQEX6 SRHQEX5 SRHQEX1 TRHQAB1') RETURN END SUBROUTINE SETREL REAL*8 FUNCTION RHDTNA(TK,NA) 1 IMPLICIT NONE INTEGER, intent(in) :: NA REAL*8, intent(in) :: TK C functions REAL*8 RHDSO4,RHDSEA,RHDNO3,RHDOCX RHDSO4(TK)=MIN(1.D0,0.80D0*EXP( 25.D0*(298.0D0-TK)/(298.0D0*TK))) RHDSEA(TK)=MIN(1.D0,0.75D0*EXP( 80.D0*(298.0D0-TK)/(298.0D0*TK))) RHDNO3(TK)=MIN(1.D0,0.62D0*EXP(852.D0*(298.0D0-TK)/(298.0D0*TK))) RHDOCX(TK)=MIN(1.D0,0.80D0*EXP( 25.D0*(298.0D0-TK)/(298.0D0*TK))) IF(NA == 1) RHDTNA=RHDSO4(TK) IF(NA == 2) RHDTNA=RHDSEA(TK) IF(NA == 3) RHDTNA=RHDNO3(TK) IF(NA == 4) RHDTNA=RHDOCX(TK) RETURN END FUNCTION RHDTNA