!@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