C     path:      /home/rc1/aer_lblrtm/src/SCCS/s.xmerge.f
C     revision:  5.2
C     created:   05/27/98  11:33:24
C     presently: 05/27/98  12:01:38
C
C     ----------------------------------------------------------------
C

      SUBROUTINE XMERGE (NPTS,LFILE,MFILE,JPATHL) 8,11
C
      IMPLICIT REAL*8           (V)
C
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL,
     *              NLTEFL,LNFIL4,LNGTH4
C
C     XMERGE CALL ABSMRG,EMINIT,RADMRG
C
      COMMON /MANE/ P0,TEMP0,NLAYER,DVXM,H2OSLF,WTOT,ALBAR,ADBAR,AVBAR,
     *              AVFIX,LAYER,SECNT0,SAMPLE,DVSET,ALFAL0,AVMASS,
     *              DPTMIN,DPTFAC,ALTAV,AVTRAT,TDIFF1,TDIFF2,ALTD1,
     *              ALTD2,ANGLE,IANT,LTGNT,LH1,LH2,IPFLAG,PLAY,TLAY,
     *              EXTID(10)
C
      character*8      XID,       HMOLID,      YID
      real*8               SECANT,       XALTZ
C
      COMMON /HVERSN/  HVRLBL,HVRCNT,HVRFFT,HVRATM,HVRLOW,HVRNCG,
     *                HVROPR,HVRPST,HVRPLT,HVRTST,HVRUTL,HVRXMR
      COMMON /FILHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4),
     *                WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1 ,V2 ,TBOUND,
     *                EMISIV,FSCDID(17),NMOL,LAYHDR,YI1,YID(10),LSTWDF
C
      COMMON /BNDPRP/ TMPBND,BNDEMI(3),BNDRFL(3),IBPROP
      COMMON /XME/ V1R4,V2R4,DVR4,NPTR4,BOUND4,R4(4996)
      COMMON /CONSTS/ PI,PLANCK,BOLTZ,CLIGHT,AVOG,RADCN1,RADCN2
C
      EQUIVALENCE (FSCDID(1),IHIRAC) , (FSCDID(2),ILBLF4),
     *            (FSCDID(3),IXSCNT) , (FSCDID(4),IAERSL),
     *            (FSCDID(5),IEMIT) , (FSCDID(7),IPLOT),
     *            (FSCDID(8),IPATHL) , (FSCDID(9),JRAD),
     *            (FSCDID(11),IMRG) , (FSCDID(16),LAYR1),
     *            (FSCDID(17),NLAYHD)
C
      CHARACTER*8 HVRLBL,HVRCNT,HVRFFT,HVRATM,HVRLOW,HVRNCG,HVROPR,
     *            HVRPLT,HVRPST,HVRTST,HVRUTL,HVRXMR
C
C     ASSIGN SCCS VERSION NUMBER TO MODULE
C
      HVRXMR = '5.2'
C
      IOD = 0
C
      IEXFIL = 20
      IAFIL = 14
C
C     --------------------------------------------------------------
C
C     Special case of merging optical depths from multiple files to
C     multiple files, for use when calculating radiance derivatives.
C     The subroutine call tree is as follows:
C
C        LBLSUB called XLAYER when IHIRAC+IATM+IMRG > 0
C        XLAYER called XMERGE when IMRG   = 10
C        XMERGE calls  ABSMRG when IMRG   = 10
C
      IF (IMRG.EQ.10) THEN
         CALL ABSMRG (NPTS,LFILE,MFILE,JPATHL)
         CALL ENDFIL (MFILE)
         RETURN
      ENDIF
C
C     --------------------------------------------------------------
C
C     WHEN IAERSL EQUALS 2 CALL ADARSL TO ADD ABSORPTION AND SCATTERING
C     TO COMMON BLOCKS FOR USE IN A TRANSMITTANCE RUN
C
C     --------------------------------------------------------------
C
C     IEMIT = 0  =>  Optical depth calculation only
C
      IF (IEMIT.EQ.0) THEN
         IF (LAYER.EQ.1) THEN
            CALL ABINIT (NPTS,MFILE,JPATHL)
         ELSE
            WRITE (IPR,900) XID,(YID(M),M=1,2)
            CALL ABSMRG (NPTS,LFILE,MFILE,JPATHL)
         ENDIF
      ELSE
C
C     --------------------------------------------------------------
C
C     IEMIT > 0 TO REACH THIS STATEMENT
C
         WRITE (IPR,900) XID,(YID(M),M=1,2)
         IF (LAYER.EQ.1.AND.IAERSL.GE.1) REWIND IEXFIL
         IF (IAERSL.GE.1) CALL GETEXT (IEXFIL,LAYER,IEMIT)
C
         TBND = 0.
C
C        -----------------------------------------------------------
C
C        IEMIT = 1  =>  Radiance and Transmittance calculated
C
         IF (IEMIT.EQ.1) THEN
            IF (IMRG.NE.36.AND.IMRG.NE.46) THEN
               IF (LAYER.EQ.1) THEN
                  IF (IPATHL.EQ.1) TBND = TMPBND
                  CALL EMINIT (NPTS,MFILE,JPATHL,TBND)
               ELSE
                  IF (IPATHL.EQ.3.AND.LAYER.EQ.LH2) TBND = TMPBND
                  CALL RADMRG (NPTS,LFILE,MFILE,JPATHL,TBND)
               ENDIF
            ELSE
               IF (LAYER.EQ.1) THEN
                  TBND = TMPBND
                  CALL FLINIT (NPTS,MFILE,JPATHL,TBND)
               ELSE
                  CALL FLUXUP (NPTS,LFILE,MFILE,JPATHL,TBND)
               ENDIF
            ENDIF
         ENDIF
C
C        -----------------------------------------------------------
C
C        IEMIT = 3  =>  Radiance, Transmittance and Radiance
C                       derivative calculated
C
         IF (IEMIT.EQ.3) THEN
            IF (LAYER.EQ.1) THEN
               IF (IPATHL.EQ.1) TBND = TMPBND
               CALL EMADL1 (NPTS,MFILE,JPATHL,TBND)
            ELSE
               IF (IPATHL.EQ.3.AND.LAYER.EQ.LH2) TBND = TMPBND
               CALL EMADMG (NPTS,LFILE,MFILE,JPATHL,TBND)
            ENDIF
         ENDIF
      ENDIF
C
C     --------------------------------------------------------------
C
      RETURN
C
  900 FORMAT (///,1X,10A8,2X,2(1X,A8,1X))
C
      END
C
C     ----------------------------------------------------------------
C

      SUBROUTINE XMERGI (NPTS,LFILE,MFILE,JPATHL) 3,7
C
      IMPLICIT REAL*8           (V)
C
      PARAMETER (MXFSC=200, MXLAY=MXFSC+3,MXZMD=3400,
     *           MXPDIM=MXLAY+MXZMD,IM2=MXPDIM-2,MXMOL=35,MXTRAC=22)
C
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL,
     *              NLTEFL,LNFIL4,LNGTH4
C
C     XMERGI CALL ABINIT,ABSINT,ABSOUT
C
      COMMON /MANE/ P0,TEMP0,NLAYER,DVXM,H2OSLF,WTOT,ALBAR,ADBAR,AVBAR,
     *              AVFIX,LAYER,SECNT0,SAMPLE,DVSET,ALFAL0,AVMASS,
     *              DPTMIN,DPTFAC,ALTAV,AVTRAT,TDIFF1,TDIFF2,ALTD1,
     *              ALTD2,ANGLE,IANT,LTGNT,LH1,LH2,IPFLAG,PLAY,TLAY,
     *              EXTID(10)
      COMMON /MSACCT/ IOD,IDIR,ITOP,ISURF,MSPTS,MSPANL(MXLAY),
     *                MSPNL1(MXLAY),
     *                MSLAY1,ISFILE,JSFILE,KSFILE,LSFILE,MSFILE,IEFILE,
     *                JEFILE,KEFILE
C
      character*8      XID,       HMOLID,      YID
      real*8               SECANT,       XALTZ
C
      COMMON /FILHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4),
     *                WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1 ,V2 ,TBOUND,
     *                EMISIV,FSCDID(17),NMOL,LAYHDR,YI1,YID(10),LSTWDF
C
      COMMON /XMI/ V1R4,V2R4,DVR4,NPTR4,BOUND4,R4(4815)
      COMMON /CONSTS/ PI,PLANCK,BOLTZ,CLIGHT,AVOG,RADCN1,RADCN2
      COMMON /BNDPRP/ TMPBND,BNDEMI(3),BNDRFL(3),IBPROP
C
      EQUIVALENCE (FSCDID(1),IHIRAC) , (FSCDID(2),ILBLF4),
     *            (FSCDID(3),IXSCNT) , (FSCDID(4),IAERSL),
     *            (FSCDID(5),IEMIT) , (FSCDID(7),IPLOT),
     *            (FSCDID(8),IPATHL) , (FSCDID(9),JRAD),
     *            (FSCDID(11),IMRG) , (FSCDID(16),LAYR1),
     *            (FSCDID(17),NLAYHD)
C
      IF (IEMIT.EQ.1) GO TO 10
      IF (LAYER.EQ.LH1.AND.IANT.NE.-1) THEN
         CALL ABINIT (NPTS,MFILE,JPATHL)
      ELSE
C
         WRITE (IPR,900) XID,(YID(M),M=1,2)
         CALL ABSINT (NPTS,LFILE,MFILE,JPATHL)
      ENDIF
C
      GO TO 20
C
C     IEMIT = 1 TO REACH THIS STATEMENT
C
   10 CONTINUE
      WRITE (IPR,900) XID,(YID(M),M=1,2)
      IF (LAYER.EQ.1.AND.IAERSL.GE.1) REWIND IEXFIL
      IF (IAERSL.GE.1) CALL GETEXT (IEXFIL,LAYER,IEMIT)
C
      TBND = 0.
C
      IF (IMRG.NE.35.AND.IMRG.NE.45) THEN
         IF (LAYER.EQ.LH1.AND.IANT.NE.-1) THEN
            IF (JPATHL.EQ.1.AND.LAYER.EQ.1)   TBND = TMPBND
            CALL EMINIT (NPTS,MFILE,JPATHL,TBND)
         ELSE
            IF (JPATHL.EQ.3.AND.LAYER.EQ.LH2) TBND = TMPBND
            CALL RADINT (NPTS,LFILE,MFILE,JPATHL,TBND)
         ENDIF
      ELSE
         IF (LAYER.EQ.LH1.AND.IANT.NE.-1) THEN
            TBND = TMPBND
            CALL FLINIT (NPTS,MFILE,JPATHL,TBND)
         ELSE
            CALL FLUXDN (NPTS,LFILE,MFILE,JPATHL,TBND)
         ENDIF
      ENDIF
C
   20 CONTINUE
C
      RETURN
C
  900 FORMAT (///,1X,10A8,2X,2(1X,A8,1X))
C
      END
C
C     ----------------------------------------------------------------
C

      SUBROUTINE ABINIT (NPTS,MFILE,JPATHL) 2,7
C
      IMPLICIT REAL*8           (V)
C
      COMMON ODLAY(-2:2407)
      COMMON /MANE/ P0,TEMP0,NLAYER,DVXM,H2OSLF,WTOT,ALBAR,ADBAR,AVBAR,
     *              AVFIX,LAYDUM,SECNT0,SAMPLE,DVSET,ALFAL0,AVMASS,
     *              DPTMIN,DPTFAC,ALTAV,AVTRAT,TDIFF1,TDIFF2,ALTD1,
     *              ALTD2,ANGLE,IANT,LTGNT,LH1,LH2,IPFLAG,PLAY,TLAY,
     *              EXTID(10)
      COMMON /CONSTS/ PI,PLANCK,BOLTZ,CLIGHT,AVOG,RADCN1,RADCN2
C
      character*8      XID,       HMOLID,      YID
      real*8               SECANT,       XALTZ
C
      COMMON /ABSHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4),
     *                WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1 ,V2 ,TBOUND,
     *                EMISIV,FSCDID(17),NMOL,LAYER ,YI1,YID(10),LSTWDF
      COMMON /ABSPNL/ V1P,V2P,DVP,NLIM,NSHFT,NPNTS
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL,
     *              NLTEFL,LNFIL4,LNGTH4
C
      DIMENSION XFILHD(2),PNLHDR(2)
      DIMENSION ODLAYR(2)
C
      CHARACTER*40 CEXT,CYID
C
      EQUIVALENCE (XFILHD(1),XID(1)) , (PNLHDR(1),V1P)
      EQUIVALENCE (ODLAY(1),ODLAYR(1)) , (FSCDID(4),IAERSL),
     *            (FSCDID(5),IEMIT) , (FSCDID(7),IPLOT),
     *            (FSCDID(8),IPATHL) , (FSCDID(16),LAYR1)
C
C
C     ***********************************************************
C     ****** THIS SUBROUTINE INITALIZES MERGE FOR OPTICAL  ******
C     ****** DEPTHS                                        ******
C     ***********************************************************
C
      CALL CPUTIM (TIME)
      WRITE (IPR,900) TIME
      NPANLS = 0
C
      CALL BUFIN (KFILE,KEOF,XFILHD(1),NFHDRF)
      IF (JPATHL.GE.1) IPATHL = JPATHL
      PLAY = PAVE
      TLAY = TAVE
C
C     FOR AEROSOL RUNS, MOVE EXTID INTO YID
C
      IF (IAERSL.GT.0) THEN
         WRITE (CEXT,'(10A4)') EXTID
         WRITE (CYID,'(5A8)') (YID(I),I=3,7)
         CYID(19:40) = CEXT(19:40)
         READ (CYID,'(5A8)') (YID(I),I=3,7)
      ENDIF
C
      IEMIT = 0
      FACT = 1.
      IF (IPATHL.EQ.2.AND.IANT.EQ.0) FACT = 2.
      DO 10 MOL = 1, NMOL
         WK(MOL) = WK(MOL)*FACT
   10 CONTINUE
      WBROAD = WBROAD*FACT
      LAYR1 = LAYER
      WRITE (IPR,905) LAYR1,KFILE,MFILE
C
      CALL BUFOUT (MFILE,XFILHD(1),NFHDRF)
      DVXM = DV
C
   20 CONTINUE
C
      CALL BUFIN (KFILE,KEOF,PNLHDR(1),NPHDRF)
      IF (KEOF.LE.0) GO TO 40
      CALL BUFIN (KFILE,KEOF,ODLAYR(1),NLIM)
C
      IF (FACT.EQ.2.) THEN
         DO 30 I = 1, NLIM
            ODLAYR(I) = ODLAYR(I)+ODLAYR(I)
   30    CONTINUE
      ENDIF
C
      CALL ABSOUT (V1P,V2P,DVP,NLIM,1,MFILE,NPTS,ODLAYR,NPANLS)
      GO TO 20
C
   40 CONTINUE
C
      CALL CPUTIM (TIME1)
      TIM = TIME1-TIME
      WRITE (IPR,910) TIME1,TIM
C
      RETURN
C
  900 FORMAT ('0 THE TIME AT THE START OF ABINIT IS ',F12.3)
  905 FORMAT ('0 INITIAL LAYER',I5,/,'0 FILE ',I5,
     *        ' INITIALIZED ONTO FILE',I5)
  910 FORMAT ('0 THE TIME AT THE END OF ABINIT IS ',F12.3/F12.3,
     *        ' SECS WERE REQUIRED FOR THIS MERGE ')
C
      END
C
C     ---------------------------------------------------------------
C

      SUBROUTINE OPNMRG(LFILE,PATH1,L1,FM1,PATH2,L2,FM2,MFILE, 4
     *                  PATH3,FM3)
C
C     This subroutine opens file for merging in ABSMRG, when IMRG = 10
C
      LOGICAL OP
      CHARACTER*57 FILE1,FILE2,FILE3
      CHARACTER*55 PATH1,PATH2,PATH3
      CHARACTER*11 CFORM
      CHARACTER*10 FM1,FM2,FM3
C
      COMMON /MANE/ P0,TEMP0,NLAYRS,DVXM,H2OSLF,WTOT,ALBAR,ADBAR,AVBAR,
     *              AVFIX,LAYRFX,SECNT0,SAMPLE,DVSET,ALFAL0,AVMASS,
     *              DPTMIN,DPTFAC,ALTAV,AVTRAT,TDIFF1,TDIFF2,ALTD1,
     *              ALTD2,ANGLE,IANT,LTGNT,LH1,LH2,IPFLAG,PLAY,TLAY,
     *              EXTID(10)
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL,
     *              NLTEFL,LNFIL4,LNGTH4
C
C           123456789-123456789-123456789-123456789-123456789-1234567
      DATA FILE1 /
     *     '                                                         '/,
     *     FILE2 /
     *     '                                                         '/,
     *     FILE3 /
     *     '                                                         '/
      DATA CFORM / 'UNFORMATTED' /
C
      INQUIRE (UNIT=LFILE,OPENED=OP)
      IF (OP) CLOSE (LFILE)
      WRITE(FILE1,FM1) PATH1,L1
      OPEN(UNIT=LFILE,FILE=FILE1,FORM=CFORM,STATUS='OLD')
C
      IF (L2.NE.L1) THEN
         INQUIRE (UNIT=KFILE,OPENED=OP)
         IF (OP) CLOSE (KFILE)
         WRITE(FILE2,FM2) PATH2,L2
         OPEN(UNIT=KFILE,FILE=FILE2,FORM=CFORM,STATUS='OLD')
      ELSE
         FILE2 = 'NO FILE USED'
      ENDIF
C
      INQUIRE (UNIT=MFILE,OPENED=OP)
      IF (OP) CLOSE (MFILE)
      WRITE(FILE3,FM3) PATH3,L2
      OPEN(UNIT=MFILE,FILE=FILE3,FORM=CFORM,STATUS='UNKNOWN')
C
C     Write procedure
C
      WRITE(IPR,900) FILE1,FILE2,FILE3
C
      RETURN
C
 900  FORMAT ('     Merged file:  ',A57,/,
     *        '       With file:  ',A57,/,
     *        '  To obtain file:  ',A57,/)
C
      END
C
C     ----------------------------------------------------------------
C

      SUBROUTINE ABSMRG (NPTS,LFILE,MFILE,JPATHL) 2,19
C
      IMPLICIT REAL*8           (V)
C
C     SUBROUTINE ABSMRG MERGES ABSORPTION VALUES FROM KFILE INTO LFILE
C
      COMMON R1(2410),OLDR1(2410)
      COMMON /MANE/ P0,TEMP0,NLAYRS,DVXM,H2OSLF,WTOT,ALBAR,ADBAR,AVBAR,
     *              AVFIX,LAYRFX,SECNT0,SAMPLE,DVSET,ALFAL0,AVMASS,
     *              DPTMIN,DPTFAC,ALTAV,AVTRAT,TDIFF1,TDIFF2,ALTD1,
     *              ALTD2,ANGLE,IANT,LTGNT,LH1,LH2,IPFLAG,PLAY,TLAY,
     *              EXTID(10)
      COMMON /CONSTS/ PI,PLANCK,BOLTZ,CLIGHT,AVOG,RADCN1,RADCN2
C
      character*8      XID,       HMOLID,      YID
      real*8               SECANT,       XALTZ
C
      COMMON /ABSHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4),
     *                WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1 ,V2 ,TBOUND,
     *                EMISIV,FSCDID(17),NMOL,LAYER ,YI1,YID(10),LSTWDF
      COMMON /OPANL/ V1PO,V2PO,DVPO,NLIMO
      COMMON /ABSPNL/ V1P,V2P,DVP,NLIM,NSHFT,NPNTS
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL,
     *              NLTEFL,LNFIL4,LNGTH4
      DIMENSION SAVOR1(5),A1(10),A2(10),A3(10),A4(10)
      DIMENSION WKSAV(35)
      DIMENSION XFILHD(2),PNLHDR(2),OPNLHD(2)
C
      CHARACTER*40 CYID
C
      EQUIVALENCE (XFILHD(1),XID(1)) , (PNLHDR(1),V1P),
     *            (OPNLHD(1),V1PO) , (FSCDID(4),IAERSL),
     *            (FSCDID(5),IEMIT) , (FSCDID(8),IPATHL),
     *            (FSCDID(16),LAYR1)
C
      CALL CPUTIM (TIME)
      NPANLS = 0
      IF (NOPR.EQ.0) WRITE (IPR,900) TIME
      CALL BUFIN (LFILE,LEOF,XFILHD(1),NFHDRF)
      DVL = DV
      LAY1SV = LAYR1
      PL = PAVE
      TL = TAVE
      WTOTL = 0.
      DO 10 MOL = 1, NMOL
         WTOTL = WTOTL+WK(MOL)
         WKSAV(MOL) = WK(MOL)
   10 CONTINUE
      WTOTL = WTOTL+WBROAD
      WN2SAV = WBROAD
C
C     FOR AEROSOL RUNS, MOVE YID (LFILE) INTO YID (MFILE)
C
      IF (IAERSL.GT.0) WRITE (CYID,'(5A8)') (YID(I),I=3,7)
      CALL BUFIN (KFILE,KEOF,XFILHD(1),NFHDRF)
      IF (IAERSL.GT.0) READ (CYID,'(5A8)') (YID(I),I=3,7)
      IF (JPATHL.GE.1) IPATHL = JPATHL
      PLAY = PAVE
      TLAY = TAVE
      DVK = DV
      LAYR1 = LAY1SV
      FACT = 1.
      IF (IPATHL.EQ.2.AND.IANT.EQ.0) FACT = 2.
      IF (DVL.EQ.DVK) ITYPE = 0
      IF (DVL.GT.DVK) ITYPE = DVK/(DVL-DVK)+0.5
      IF (DVL.LT.DVK) ITYPE = -INT(DVL/(DVK-DVL)+0.5)
      SAVOR1(4) = 0.
C
C     ITYPE .LT. 0  IF DV(K-1) IS LESS THAN DV(K)
C
      IF (ITYPE.LT.0) STOP ' ABSMRG: ITYPE LT 0 '
      ITYPE = IABS(ITYPE)
      WTOTK = 0.
      DO 20 MOL = 1, NMOL
         WTOTK = WTOTK+FACT*WK(MOL)
         WK(MOL) = FACT*WK(MOL)+WKSAV(MOL)
   20 CONTINUE
      WTOTK = WTOTK+FACT*WBROAD
      PAVE = (PL*WTOTL+PAVE*WTOTK)/(WTOTL+WTOTK)
      TAVE = (TL*WTOTL+TAVE*WTOTK)/(WTOTL+WTOTK)
      WBROAD = FACT*WBROAD+WN2SAV
      SECANT = 0.
      IF (NOPR.EQ.0) WRITE (IPR,905) LAYR1,LAYER,KFILE,LFILE,MFILE
      IEMIT = 0
C
C     WK IS NOW THE ACCUMULATED SUM OF THE COLUMN DENSITIES
C
      CALL BUFOUT (MFILE,XFILHD(1),NFHDRF)
      DVXM = DV
      DO 30 K = 1, 5
         SAVOR1(K) = 0.
   30 CONTINUE
      ATYPE = ITYPE
      AP = 1.0/(ATYPE+1.0)
      IF (ITYPE.NE.0) GO TO 80
C
C     1/1 RATIO ONLY
C
   40 CONTINUE
      CALL BUFIN (LFILE,LEOF,OPNLHD(1),NPHDRF)
      IF (LEOF.LE.0) GO TO 50
      CALL BUFIN (LFILE,LEOF,OLDR1(1),NLIMO)
   50 CALL BUFIN (KFILE,KEOF,PNLHDR(1),NPHDRF)
      IF (KEOF.LE.0) GO TO 250
      CALL BUFIN (KFILE,KEOF,R1(1),NLIM)
C
      IF (FACT.EQ.1) THEN
         DO 60 KOD = 1, NLIM
            R1(KOD) = R1(KOD)+OLDR1(KOD)
   60    CONTINUE
C
      ELSE
         DO 70 KOD = 1, NLIM
            R1(KOD) = R1(KOD)+R1(KOD)+OLDR1(KOD)
   70    CONTINUE
      ENDIF
C
      CALL ABSOUT (V1P,V2P,DVP,NLIM,1,MFILE,NPTS,R1,NPANLS)
C
      GO TO 40
C
C     ALL RATIOS EXCEPT 1/1
C
   80 LL = ITYPE+1
      DO 90 JPG = 1, ITYPE
         APG = JPG
         P = 1.0-(AP*APG)
C
C    THE FOLLOWING ARE THE CONSTANTS FOR THE LAGRANGE 4 POINT
C    INTERPOLATION.
C
         A1(JPG) = -P*(P-1.0)*(P-2.0)/6.0
         A2(JPG) = (P**2-1.0)*(P-2.0)*0.5
         A3(JPG) = -P*(P+1.0)*(P-2.0)*0.5
         A4(JPG) = P*(P**2-1.0)/6.0
   90 CONTINUE
C
C     ********  BEGINNING OF LOOP THAT DOES INTERPOLATION  *********
C
      CALL BUFIN (LFILE,LEOF,OPNLHD(1),NPHDRF)
      CALL BUFIN (LFILE,LEOF,OLDR1(1),NLIMO)
      MAXLF = NLIMO
      NVS = 1
      CALL BUFIN (KFILE,KEOF,PNLHDR(1),NPHDRF)
      CALL BUFIN (KFILE,KEOF,R1(1),NLIM)
      IF (KEOF.LE.0) GO TO 250
      II = 1
      DIF = DVP*0.01
      IF (ABS(V1PO-V1P).LT.DIF) GO TO 120
C
C     V1P  <  V1PO  LASER OPTION
C
  100 NVS = NVS+1
      V1PN = V1PO+DVPO*(NVS-1)
      IF (ABS(V1PN-V1P).LT.DIF) GO TO 120
      IF (V1PN.LT.V1P) GO TO 100
C
  110 II = II+1
      V1PP = V1P+DVP*(II-1)
      IF (ABS(V1PN-V1PP).LT.DIF) GO TO 120
      IF (V1PP.LT.V1PN) GO TO 110
C
      GO TO 100
  120 R1(II) = FACT*R1(II)+OLDR1(NVS)
      V1PN = V1PO+DVPO*(NVS-1)
      V1PP = V1P+DVP*(II-1)
      II = II+1
  130 JJ = 1
C
      DO 240 JPG = 1, LL
         IF (JPG.EQ.LL) GO TO 140
         IF (NVS.EQ.1) GO TO 150
         GO TO 170
  140    IF (FACT.EQ.1.) THEN
            R1(II) = R1(II)+OLDR1(NVS)
         ELSE
            R1(II) = R1(II)+R1(II)+OLDR1(NVS)
         ENDIF
         V1PN = V1PO+DVPO*(NVS-1)
         V1PP = V1P+DVP*(II-1)
         GO TO 190
  150    IF (SAVOR1(4).EQ.0.0) GO TO 160
         OLDR1Y = SAVOR1(4)
         GO TO 180
  160    OLDR1Y = OLDR1(1)
         GO TO 180
  170    OLDR1Y = OLDR1(NVS-1)
  180    OLDR1I = A1(JJ)*OLDR1Y+A2(JJ)*OLDR1(NVS)+A3(JJ)*OLDR1(NVS+1)+
     *            A4(JJ)*OLDR1(NVS+2)
         IF (FACT.EQ.1.) THEN
            R1(II) = R1(II)+OLDR1I
         ELSE
            R1(II) = R1(II)+R1(II)+OLDR1I
         ENDIF
  190    NVS = NVS+1
         IF (NVS.LE.MAXLF-2) GO TO 200
         SAVOR1(1) = OLDR1(NVS-1)
         SAVOR1(2) = OLDR1(NVS)
         SAVOR1(3) = OLDR1(NVS+1)
         SAVOR1(4) = OLDR1(NVS-2)
         CALL BUFIN (LFILE,LEOF,OPNLHD(1),NPHDRF)
         IF (LEOF.LE.0) GO TO 210
         MAXLF = NLIMO+3
         CALL BUFIN (LFILE,LEOF,OLDR1(4),NLIMO)
         OLDR1(1) = SAVOR1(1)
         OLDR1(2) = SAVOR1(2)
         OLDR1(3) = SAVOR1(3)
         NVS = 2
  200    II = II+1
         JJ = JJ+1
         IF (II.GT.NLIM) GO TO 230
         GO TO 240
  210    II = II+1
         AVRG = (SAVOR1(3)+SAVOR1(2))*0.5
  220    R1(II) = FACT*R1(II)+AVRG
         II = II+1
         IF (II.LE.NLIM) GO TO 220
C
C     WRITE OUTPUT FILE
C
  230    CALL ABSOUT (V1P,V2P,DVP,NLIM,1,MFILE,NPTS,R1,NPANLS)
C
         CALL BUFIN (KFILE,KEOF,PNLHDR(1),NPHDRF)
         IF (KEOF.LE.0) GO TO 250
         CALL BUFIN (KFILE,KEOF,R1(1),NLIM)
         II = 1
  240 CONTINUE
      NVS = NVS-1
      GO TO 130
  250 CONTINUE
C
      CALL CPUTIM (TIME1)
      TIM = TIME1-TIME
      IF (NOPR.EQ.0) WRITE (IPR,910) TIME1,TIM
      RETURN
C
  900 FORMAT ('0 THE TIME AT THE START OF ABSMRG IS ',F12.3)
  905 FORMAT ('0 INITIAL LAYER',I5,'  FINAL LAYER',I5,/,'0 FILE ',I5,
     *        ' MERGED WITH FILE ',I5,' ONTO FILE',I5)
  910 FORMAT (' THE TIME AT THE END OF ABSMRG IS',F12.3/F12.3,
     *        ' SECS. WERE REQUIRED FOR THIS ADDITION')
C
      END
C
C     ----------------------------------------------------------------
C

      SUBROUTINE ABSINT (NPTS,LFILE,MFILE,JPATHL) 1,17
C
      IMPLICIT REAL*8           (V)
C
      COMMON NEWOD(2410),ODLAY(-2:2407)
      COMMON /MANE/ P0,TEMP0,NLAYER,DVXM,H2OSLF,WTOT,ALBAR,ADBAR,AVBAR,
     *              AVFIX,LAYDUM,SECNT0,SAMPLE,DVSET,ALFAL0,AVMASS,
     *              DPTMIN,DPTFAC,ALTAV,AVTRAT,TDIFF1,TDIFF2,ALTD1,
     *              ALTD2,ANGLE,IANT,LTGNT,LH1,LH2,IPFLAG,PLAY,TLAY,
     *              EXTID(10)
      COMMON /CONSTS/ PI,PLANCK,BOLTZ,CLIGHT,AVOG,RADCN1,RADCN2
C
      character*8      XID,       HMOLID,      YID
      real*8               SECANT,       XALTZ
C
      COMMON /ABSHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4),
     *                WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1 ,V2 ,TBOUND,
     *                EMISIV,FSCDID(17),NMOL,LAYER ,YI1,YID(10),LSTWDF
      COMMON /OPANL/ V1PO,V2PO,DVPO,NLIMO
      COMMON /ABSPNL/ V1P,V2P,DVP,NLIM,NSHFT,NPNTS
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL,
     *              NLTEFL,LNFIL4,LNGTH4
C
      DIMENSION XFILHD(2),PNLHDR(2),OPNLHD(2)
      DIMENSION A1(0:100),A2(0:100),A3(0:100),A4(0:100)
      DIMENSION OLDOD(2),ODLAYR(2)
      DIMENSION WKSAV(35)
C
      CHARACTER*40 CYID
      REAL NEWOD
C
      EQUIVALENCE (XFILHD(1),XID(1)) , (PNLHDR(1),V1P),
     *            (OPNLHD(1),V1PO)
      EQUIVALENCE (NEWOD(1),OLDOD(1)) , (ODLAY(1),ODLAYR(1)),
     *            (FSCDID(4),IAERSL) , (FSCDID(5),IEMIT),
     *            (FSCDID(7),IPLOT) , (FSCDID(8),IPATHL),
     *            (FSCDID(16),LAYR1)
C
C     ***********************************************************
C     ****** THIS SUBROUTINE DOES LAYER MERGE FOR OPTICAL  ******
C     ****** DEPTHS USING FOUR POINT GENERAL INTERPOLATION ******
C     ***********************************************************
C
      CALL CPUTIM (TIME)
      WRITE (IPR,900) TIME
      NPANLS = 0
C
      CALL BUFIN (LFILE,LEOF,XFILHD(1),NFHDRF)
      DVL = DV
      LAY1SV = LAYR1
      PL = PAVE
      TL = TAVE
      WTOTL = 0.
      DO 10 MOL = 1, NMOL
         WTOTL = WTOTL+WK(MOL)
         WKSAV(MOL) = WK(MOL)
   10 CONTINUE
      WTOTL = WTOTL+WBROAD
      WN2SAV = WBROAD
C
C     FOR AEROSOL RUNS, MOVE YID (LFILE) INTO YID (MFILE)
C
      IF (IAERSL.GT.0) WRITE (CYID,'(5A8)') (YID(I),I=3,7)
      CALL BUFIN (KFILE,KEOF,XFILHD(1),NFHDRF)
      IF (IAERSL.GT.0) READ (CYID,'(5A8)') (YID(I),I=3,7)
      IF (JPATHL.GE.1) IPATHL = JPATHL
      PLAY = PAVE
      TLAY = TAVE
      DVK = DV
      LAYR1 = LAY1SV
      FACT = 1.
C
C     IF(IPATHL.EQ.2 .AND. IANT.EQ.0) FACT=2.
C
      IF (IPATHL.EQ.2.AND.IANT.EQ.0) STOP ' ABSINT: FACT=2.  '
      ATYPE = 9.999E09
      IF (DVK.EQ.DVL) ATYPE = 0.
      IF (DVL.GT.DVK) ATYPE = DVK/(DVL-DVK)+0.5
      IF (DVL.LT.DVK) ATYPE = -DVL/(DVK-DVL)-0.5
      IF (ATYPE.GT.0) STOP ' ABSINT; ATYPE GT 0 '
      WTOTK = 0.
      WRITE (IPR,905) LAYR1,LAYER,KFILE,LFILE,MFILE,ATYPE
      IEMIT = 0
      DO 20 MOL = 1, NMOL
         WTOTK = WTOTK+WK(MOL)*FACT
         WK(MOL) = WK(MOL)*FACT+WKSAV(MOL)
   20 CONTINUE
      WTOTK = WTOTK+WBROAD*FACT
      WBROAD = WBROAD*FACT+WN2SAV
      PAVE = (PL*WTOTL+PAVE*WTOTK)/(WTOTL+WTOTK)
      TAVE = (TL*WTOTL+TAVE*WTOTK)/(WTOTL+WTOTK)
      SECANT = 0.
      DV = DVL
C
C     WK IS NOW THE ACCUMULATED SUM OF THE COLUMN DENSITIES
C
      CALL BUFOUT (MFILE,XFILHD(1),NFHDRF)
      DVXM = DV
C
      IF (ATYPE.EQ.0.) THEN
C
C     1/1 RATIO ONLY
C
   30    CONTINUE
C
         CALL BUFIN (KFILE,KEOF,PNLHDR(1),NPHDRF)
         IF (KEOF.LE.0) GO TO 90
         CALL BUFIN (KFILE,KEOF,ODLAYR(1),NLIM)
C
         CALL BUFIN (LFILE,LEOF,OPNLHD(1),NPHDRF)
         CALL BUFIN (LFILE,LEOF,OLDOD(1),NLIMO)
C
         DO 40 I = 1, NLIM
            NEWOD(I) = ODLAYR(I)+OLDOD(I)
   40    CONTINUE
         CALL ABSOUT (V1PO,V2PO,DVPO,NLIMO,1,MFILE,NPTS,NEWOD,NPANLS)
         GO TO 30
C
      ENDIF
C
C     ALL RATIOS EXCEPT 1/1
C
      DO 50 JP = 0, 100
         APG = JP
         P = 0.01*APG
C
C     THE FOLLOW ARE THE CONSTANTS FOR THE LAGRANGE 4 POINT
C     INTERPOLATION
C
         A1(JP) = -P*(P-1.0)*(P-2.0)/6.0
         A2(JP) = (P**2-1.0)*(P-2.0)*0.5
         A3(JP) = -P*(P+1.0)*(P-2.0)*0.5
         A4(JP) = P*(P**2-1.0)/6.0
   50 CONTINUE
C
      CALL BUFIN (KFILE,KEOF,PNLHDR(1),NPHDRF)
      IF (KEOF.LE.0) GO TO 90
      CALL BUFIN (KFILE,KEOF,ODLAYR(1),NLIM)
C
      ODLAY(-2) = ODLAY(1)
      ODLAY(-1) = ODLAY(1)
      ODLAY(0) = ODLAY(1)
C
      RATDV = DVL/DVK
C
   60 CONTINUE
C
      CALL BUFIN (LFILE,LEOF,OPNLHD(1),NPHDRF)
      IF (LEOF.LE.0) GO TO 90
      CALL BUFIN (LFILE,LEOF,OLDOD(1),NLIMO)
C
C     FJJ IS OFFSET BY 2. FOR ROUNDING PURPOSES
C
      FJ1DIF = (V1PO-V1P)/DVP+1.+2.
C
C     ***** BEGINNING OF LOOP THAT DOES MERGE  *****
C
      DO 80 II = 1, NLIMO

C
   70    CONTINUE
C
         FJJ = FJ1DIF+RATDV*FLOAT(II-1)
         JJ = IFIX(FJJ)-2
C
         IF (JJ+2.GT.NLIM) THEN
            ODLAY(-2) = ODLAY(NLIM-2)
            ODLAY(-1) = ODLAY(NLIM-1)
            ODLAY(0) = ODLAY(NLIM)
            V1PST = V1P
            V2PST = V2P
            NLIMST = NLIM
C
            CALL BUFIN (KFILE,KEOF,PNLHDR(1),NPHDRF)
C
            IF (KEOF.LE.0) THEN
               V1P = V1PST
               DVP = DVK
               V2P = V2PST+2.*DVP
               NLIM = NLIMST+2
               ODLAY(NLIM-1) = ODLAY(NLIM-2)
               ODLAY(NLIM) = ODLAY(NLIM-2)
            ELSE
               CALL BUFIN (KFILE,KEOF,ODLAYR(1),NLIM)
            ENDIF
C
            FJ1DIF = (V1PO-V1P)/DVP+1.+2.
            GO TO 70
         ENDIF
C
C     JP = (FJJ-FLOAT(JJ))*100. + 0.5 - 200.
C
         JP = (FJJ-FLOAT(JJ))*100.-199.5
         IF (JP.GT.100) THEN
            WRITE (IPR,910) JP,JJ,NLIM
            STOP
         ENDIF
C
C     INTERPOLATE THE OLD TRANSMISSION
C
         ODLAYI = A1(JP)*ODLAY(JJ-1)+A2(JP)*ODLAY(JJ)+
     *            A3(JP)*ODLAY(JJ+1)+A4(JP)*ODLAY(JJ+2)
         IF (ODLAYI.LT.0.) ODLAYI = 0.
C
         NEWOD(II) = ODLAYI+OLDOD(II)
C
   80 CONTINUE
C
      CALL ABSOUT (V1PO,V2PO,DVPO,NLIMO,1,MFILE,NPTS,NEWOD,NPANLS)
C
      GO TO 60
C
   90 CONTINUE
C
      CALL CPUTIM (TIME1)
      TIM = TIME1-TIME
      WRITE (IPR,915) TIME1,TIM
C
      RETURN
C
  900 FORMAT ('0 THE TIME AT THE START OF ABSINT IS ',F12.3)
  905 FORMAT ('0 INITIAL LAYER',I5,'  FINAL LAYER',I5,/,'0 FILE ',I5,
     *        ' MERGED WITH FILE ',I5,' ONTO FILE',I5,'  WITH XTYPE=',
     *        G15.5)
  910 FORMAT ('0 JP, JJ, NLIM ',3I6)
  915 FORMAT ('0 THE TIME AT THE END OF ABSINT IS ',F12.3/F12.3,
     *        ' SECS WERE REQUIRED FOR THIS MERGE ')
C
      END
C
C     ----------------------------------------------------------------
C

      SUBROUTINE ABSOUT (V1PO,V2PO,DVPO,NLIMO,JLO,MFILE,NPTS,R1,NPANLS) 6,2
C
      IMPLICIT REAL*8           (V)
C
C     SUBROUTINE ABSOUT OUPUTS THE MERGED RESULT (R1) ONTO MFILE
C
      COMMON /ABSPNI/ V1P,V2P,DVP,NLIM
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL,
     *              NLTEFL,LNFIL4,LNGTH4
      DIMENSION PNLHDR(2),R1(*)
C
      EQUIVALENCE (PNLHDR(1),V1P)
C
      V1P = V1PO
      V2P = V2PO
      DVP = DVPO
      NLIM = NLIMO
C
      NPANLS = NPANLS+1
      CALL BUFOUT (MFILE,PNLHDR(1),NPHDRF)
      CALL BUFOUT (MFILE,R1(JLO),NLIM)
      IF (NPTS.LE.0) GO TO 20
      IF (NPANLS.EQ.1) WRITE (IPR,900)
      WRITE (IPR,905)
      NNPTS = NPTS
      IF (NPTS.GT.(NLIM/2)+1) NNPTS = (NLIM/2)+1
      JHILIM = JLO+NLIM-NNPTS
      DO 10 I = 1, NNPTS
         J = JLO+I-1
         K = JHILIM+I-1
         VJ = V1P+FLOAT(J-JLO)*DVP
         VK = V1P+FLOAT(K-JLO)*DVP
         WRITE (IPR,910) J,VJ,R1(J),K,VK,R1(K)
   10 CONTINUE
   20 CONTINUE
C
      RETURN
C
  900 FORMAT ('0 ','LOCATION  WAVENUMBER',2X,'OPT DPTH',27X,
     *        'LOCATION   WAVENUMBER',2X,'OPT DPTH')
  905 FORMAT (' ')
  910 FORMAT (I8,2X,F12.6,1P,E15.7,0P,20X,I8,2X,F12.6,1P,E15.7)
C
      END
C
C     ----------------------------------------------------------------
C

      FUNCTION BBFN (VI,DVI,V2I,XKT,VINEW,BBDEL,BBLAST) 156
C
      IMPLICIT REAL*8           (V)
C
C     FUNCTION BBFN CALCULATES BLACK BODY FN FOR WAVENUMBER VALUE VI
C     AND CALCULATES THE WAVENUMBER VALUE (VINEW) FOR NEXT BBFN CALC.
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C               LAST MODIFICATION:    23 AUGUST 1991
C
C                  IMPLEMENTATION:    R.D. WORSHAM
C
C             ALGORITHM REVISIONS:    S.A. CLOUGH
C                                     R.D. WORSHAM
C                                     J.L. MONCET
C
C
C                     ATMOSPHERIC AND ENVIRONMENTAL RESEARCH INC.
C                     840 MEMORIAL DRIVE,  CAMBRIDGE, MA   02139
C
C----------------------------------------------------------------------
C
C               WORK SUPPORTED BY:    THE ARM PROGRAM
C                                     OFFICE OF ENERGY RESEARCH
C                                     DEPARTMENT OF ENERGY
C
C
C      SOURCE OF ORIGINAL ROUTINE:    AFGL LINE-BY-LINE MODEL
C
C                                             FASCOD3
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
      COMMON /CONSTS/ PI,PLANCK,BOLTZ,CLIGHT,AVOG,RADCN1,RADCN2
C
      DATA FACTOR / 0.003 /
C
         XVI = VI
         XVIOKT = XVI/XKT
         EXPNEG = EXP(-XVIOKT)
         GNU2 = XVI*XVI
         BG2  = XVIOKT*XVIOKT
C
C     Initialize BBLAST for BBLAST negative
C
      IF (BBLAST.LT.0.) THEN
         IF (XKT.GT.0.0) THEN
            IF (XVIOKT.LE.0.01) THEN
               BBLAST = RADCN1*(XVI**2)*XKT/(1.+0.5*XVIOKT)
            ELSEIF (XVIOKT.LE.80.0) THEN
               BBLAST = RADCN1*(XVI**3)/(EXP(XVIOKT)-1.)
            ELSE
               BBLAST = 0.
            ENDIF
         ELSE
            BBLAST = 0.
         ENDIF
      ENDIF
C
C     SET BBFN EQUAL TO BLACK BODY FUNCTION AT VI
C
C     BBLAST IS BBFN(VI) FOR EACH SUBSEQUENT CALL
C
      BBFN = BBLAST
C
      INTVLS = 1
      DELTAV2 = V2I - VI
      IF (XKT.GT.0.0) THEN
C
         IF (XVIOKT.LE.0.01) THEN
            IF (VINEW.GE.0.0) THEN
               XDELT = (GNU2 * (4.+4.*XVIOKT + BG2))/
     *              (10.*BG2 - 24.*XVIOKT + 8.)
               DELTAV = SQRT(ABS(FACTOR*XDELT))
               IF (DELTAV .GT. DELTAV2) DELTAV = DELTAV2
               INTVLS = (DELTAV)/DVI
               INTVLS = MAX(INTVLS,1)
               VINEW = VI+DVI*FLOAT(INTVLS)
            ELSE
               VINEW = ABS(VINEW)
               INTVLS = (VINEW-VI)/DVI
               INTVLS = MAX(INTVLS,1)
            ENDIF
            XVINEW = VINEW
C
            BBNEXT = RADCN1*(XVINEW**2)*XKT/(1.+0.5*XVINEW/XKT)
         ELSEIF (XVIOKT.LE.80.0) THEN
            IF (VINEW.GE.0.0) THEN
               FRONT  = XVIOKT/(1.-EXPNEG)
               BOX    = 3.0 - FRONT
               DELT2C = (1./GNU2)*(2.*BOX-FRONT*(1.+BOX-FRONT*EXPNEG))
               DELTAV = SQRT(ABS(FACTOR/DELT2C))
               IF (DELTAV .GT. DELTAV2) DELTAV = DELTAV2
               INTVLS = (DELTAV)/DVI
               INTVLS = MAX(INTVLS,1)
               VINEW = VI+DVI*FLOAT(INTVLS)
            ELSE
               VINEW = ABS(VINEW)
C
C              The following IF test added for cases where
C              XVIOKT > 80 on one call, and XVIOKT < 80 on
C              the next call (numerical artifact causing
C              the change over the XVIOKT = 80 boundary)
C
               IF (VINEW.EQ.6.0E+05) THEN
                   BBNEXT=0.
                   BBDEL = (BBNEXT-BBFN)/FLOAT(INTVLS)
                   BBLAST = BBNEXT
                   RETURN
               ENDIF
               INTVLS = (VINEW-VI)/DVI
               INTVLS = MAX(INTVLS,1)
            ENDIF
            XVINEW = VINEW
C
            BBNEXT = RADCN1*(XVINEW**3)/(EXP(XVINEW/XKT)-1.)
         ELSE
            BBNEXT = 0.
            VINEW = 6.0E+5
         ENDIF
      ELSE
         BBNEXT = 0.
         VINEW = 6.0E+5
      ENDIF
C
      BBDEL = (BBNEXT-BBFN)/FLOAT(INTVLS)
      BBLAST = BBNEXT
C
      RETURN
C
      END
C
C     ---------------------------------------------------------------
C

      FUNCTION BBAD(BBVAL,VI,DVI,V2I,XKT,VDNEW,BBADDL,BBADOL) 4
C
      IMPLICIT REAL*8           (V)
C
C     FUNCTION BBAD calculates the derivative of the black body fn
C     analytically for wavenumber value VI
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C                  IMPLEMENTATION:    P.D. Brown
C
C                     ATMOSPHERIC AND ENVIRONMENTAL RESEARCH INC.
C                     840 MEMORIAL DRIVE,  CAMBRIDGE, MA   02139
C
C----------------------------------------------------------------------
C
C               WORK SUPPORTED BY:    THE ARM PROGRAM
C                                     OFFICE OF ENERGY RESEARCH
C                                     DEPARTMENT OF ENERGY
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
      COMMON /CONSTS/ PI,PLANCK,BOLTZ,CLIGHT,AVOG,RADCN1,RADCN2
C
      DATA FACTOR / 0.003 /
C
      XVI = VI
      XVIOKT = XVI/XKT
      EXPNEG = EXP(-XVIOKT)
      GNU2 = XVI*XVI
      BG2  = XVIOKT*XVIOKT
      TKELV  = XKT*RADCN2
C
C     If first call, initialize BBADOL
C
C     For linear approximation,
C
C       BBFN{prime} = -BBFN/(t*(1 + 0.5*(planck*clight*gnu/boltz*t)))
C
C     Using the exact function,
C
C       BBFN{prime} = BBFN*(planck*clight*gnu/(boltz*t*t))*
C                     1/[1-exp(-planck*clight*gnu/(boltz*t))]
C     where
C                   planck*clight/boltz = RADCN2
C               boltz*t/(planck*clight) = XKT
C             planck*clight*gnu/boltz*t = XVIOKT
C
C     and we can solve easily for t:
C                                     t = XKT*RADCN2.
C
      IF (BBADOL.LT.0.) THEN
         IF (XKT.GT.0.0) THEN
            IF (XVIOKT.LE.0.01) THEN
               BBADOL = BBVAL/(-TKELV*(1.+0.5*XVIOKT))
            ELSEIF (XVIOKT.LE.80.0) THEN
               BBADOL = BBVAL*XVIOKT/(TKELV*(1-EXPNEG))
            ELSE
               BBADOL = 0.
            ENDIF
         ELSE
            BBADOL = 0.
         ENDIF
      ENDIF
C
C     Set BBAD equal to black body function derivative
C
C     BBADOL is BBAD(VI) for each subsequent call
C
      BBAD = BBADOL
C
      INTVLS = 1
      DELTAV2 = V2I - VI
      IF (XKT.GT.0.0) THEN
C
         IF (XVIOKT.LE.0.01) THEN
            IF (VDNEW.GE.0.0) THEN
               XDELT = (GNU2 * (4.+4.*XVIOKT + BG2))/
     *              (10.*BG2 - 24.*XVIOKT + 8.)
               DELTAV = SQRT(ABS(FACTOR*XDELT))
               IF (DELTAV .GT. DELTAV2) DELTAV = DELTAV2
               INTVLS = (DELTAV)/DVI
               INTVLS = MAX(INTVLS,1)
               VDNEW = VI+DVI*FLOAT(INTVLS)
            ELSE
               VDNEW = ABS(VDNEW)
               INTVLS = (VDNEW-VI)/DVI
               INTVLS = MAX(INTVLS,1)
            ENDIF
            XVDNEW = VDNEW
            BBAD = BBVAL/(-TKELV*(1.+0.5*XVDNEW/XKT))
         ELSEIF (XVIOKT.LE.80.0) THEN
            IF (VDNEW.GE.0.0) THEN
               FRONT  = XVIOKT/(1.-EXPNEG)
               BOX    = 3.- FRONT
               DELT2C = (1./GNU2)*(2.*BOX-FRONT*(1.+BOX-FRONT*EXPNEG))
               DELTAV = SQRT(ABS(FACTOR/DELT2C))
               IF (DELTAV .GT. DELTAV2) DELTAV = DELTAV2
               INTVLS = (DELTAV)/DVI
               INTVLS = MAX(INTVLS,1)
               VDNEW = VI+DVI*FLOAT(INTVLS)
            ELSE
               VDNEW = ABS(VDNEW)
C
C              The following IF test added for cases where
C              XVIOKT > 80 on one call, and XVIOKT < 80 on
C              the next call (numerical artifact causing
C              the change over the XVIOKT = 80 boundary)
C
               IF (VDNEW.EQ.6.0E+05) THEN
                   BBAD=0.
                   VDNEW = VDNEW-DVI+0.00001
                   BBADDL = (BBAD-BBADOL)/FLOAT(INTVLS)
                   BBADOL = BBAD
                   RETURN
               ENDIF
               INTVLS = (VDNEW-VI)/DVI
               INTVLS = MAX(INTVLS,1)
            ENDIF
            XVDNEW = VDNEW
            BBAD = BBVAL*(XVDNEW/XKT)/(TKELV*(1-EXP(-XVDNEW/XKT)))
         ELSE
            BBAD = 0.
            VDNEW = 6.0E+5
         ENDIF
      ELSE
         BBAD = 0.
         VDNEW = 6.0E+5
      ENDIF
C
      BBADDL = (BBAD-BBADOL)/FLOAT(INTVLS)
C
      VDNEW = VDNEW-DVI+0.00001
      BBADOL = BBAD
C
      RETURN
C
      END
C
C     ----------------------------------------------------------------
C

      FUNCTION EMISFN (VI,DVI,VINEM,EMDEL,EMLAST) 22,1
C
      IMPLICIT REAL*8           (V)
C
C     FUNCTION EMISFN CALCULATES BOUNDARY EMISSIVITY FOR WAVE NUMBER
C     VALUE CORRESPONDING TO VI AND VINEM, AND THEN CALCULATES THE
C     LINEAR CHANGE BETWEEN THE EMISSIVITY VALUES AT VI AND VINEM
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C               LAST MODIFICATION:    23 AUGUST 1991
C
C                  IMPLEMENTATION:    R.D. WORSHAM
C
C             ALGORITHM REVISIONS:    S.A. CLOUGH
C                                     R.D. WORSHAM
C                                     J.L. MONCET
C
C
C                     ATMOSPHERIC AND ENVIRONMENTAL RESEARCH INC.
C                     840 MEMORIAL DRIVE,  CAMBRIDGE, MA   02139
C
C----------------------------------------------------------------------
C
C               WORK SUPPORTED BY:    THE ARM PROGRAM
C                                     OFFICE OF ENERGY RESEARCH
C                                     DEPARTMENT OF ENERGY
C
C
C      SOURCE OF ORIGINAL ROUTINE:    AFGL LINE-BY-LINE MODEL
C
C                                             FASCOD3
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C     ----------------------------------------------------------------
C     Parameter and common block for direct input of emission function
C     values
C
      PARAMETER (NMAXCO=4040)
      COMMON /EMSFIN/ V1EMIS,V2EMIS,DVEMIS,NLIMEM,ZEMIS(NMAXCO)
C     ----------------------------------------------------------------
C
      COMMON /BNDPRP/ TMPBND,BNDEMI(3),BNDRFL(3),IBPROP
      EQUIVALENCE (BNDEMI(1),A) , (BNDEMI(2),B) , (BNDEMI(3),C)
C
      DATA FACTOR / 0.001 /
C
C     ***************************************************
C     Check for A < 0.  If so, use input values read in from file
C     "EMISSION"
C     ***************************************************
C
      IF (A.LT.0.) THEN
C
C        Determine elements of EMISSION function to use with
C        input frequency
C
         NELMNT = INT((VI-V1EMIS)/DVEMIS)
C
C        Test for bounds on EMISSION function
C
         IF ((NELMNT.LE.0).OR.(NELMNT.GE.NLIMEM)) THEN
            WRITE(*,*) 'Frequency range of calculation exceeded',
     *                 ' emissivity input.'
            WRITE(*,*) ' VI = ',VI,' V1EMIS = ',V1EMIS,' V2EMIS = ',
     *                 V2EMIS
            STOP 'ERROR IN EMISFN'
         ENDIF
C
C        Interpolate to obtain appropriate EMISSION value
C
         V1A = V1EMIS+DVEMIS*NELMNT
         V1B = V1EMIS+DVEMIS*(NELMNT+1)
         CALL LINTCO(V1A,ZEMIS(NELMNT),V1B,ZEMIS(NELMNT+1),VI,ZINT,
     *               ZDEL)
         EMISFN = ZINT
         VINEM = V1B
         EMDEL = ZDEL*DVI
         EMLAST = ZEMIS(NELMNT+1)
         RETURN
C
      ENDIF
C
C     ***************************************************
C     The following uses a quadratic formula for emission
C     ***************************************************
C
C     CHECK FOR CONSTANT E (INDEPENDENT OF VI)
C     IF CONSTANT RETURN LARGE VALUE FOR VINEM
C
      IF (B.EQ.0..AND.C.EQ.0.) THEN
         EMISFN = A
         VINEM = 9.99E+9
         EMDEL = 0.0
         EMLAST = EMISFN
         RETURN
      ENDIF
C
      XVI = VI
      IF (EMLAST.LT.0.) THEN
         EMLAST = A+B*XVI+C*XVI*XVI
      ENDIF
C
C     SET EMISFN EQUAL TO EMISSIVITY AT VI
C
C     EMLAST IS EMISFN(VI) FOR EACH SUBSEQUENT CALL
C
      EMISFN = EMLAST
C
      IF (VINEM.GE.0.0) THEN
         XVNEXT = XVI+FACTOR/ABS((B+2.*C*XVI))
         XVNEXT = MIN(XVNEXT,(XVI+DVI*2400))
         INTVLS = (XVNEXT-XVI)/DVI
         INTVLS = MAX(INTVLS,1)
         XVNEXT = XVI+DVI*FLOAT(INTVLS)
      ELSE
         XVNEXT = ABS(VINEM)
         INTVLS = (XVNEXT-XVI)/DVI
         INTVLS = MAX(INTVLS,1)
      ENDIF
C
      EMNEXT = A+B*XVNEXT+C*XVNEXT*XVNEXT
C
      EMDEL = (EMNEXT-EMISFN)/FLOAT(INTVLS)
C
      VINEM = XVNEXT
      EMLAST = EMNEXT
C
      RETURN
C
      END
C
C     ----------------------------------------------------------------
C

      FUNCTION REFLFN (VI,DVI,VINRF,RFDEL,RFLAST) 10,1
C
      IMPLICIT REAL*8           (V)
C
C     FUNCTION REFLFN CALCULATES BOUNDARY REFLECTIVITY FOR WAVE NUMBER
C     VALUE CORRESPONDING TO VI AND VINRF, AND THEN CALCULATES THE
C     LINEAR CHANGE BETWEEN THE REFLECTIVITY VALUES AT VI AND VINRF
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C               LAST MODIFICATION:    23 AUGUST 1991
C
C                  IMPLEMENTATION:    R.D. WORSHAM
C
C             ALGORITHM REVISIONS:    S.A. CLOUGH
C                                     R.D. WORSHAM
C                                     J.L. MONCET
C
C
C                     ATMOSPHERIC AND ENVIRONMENTAL RESEARCH INC.
C                     840 MEMORIAL DRIVE,  CAMBRIDGE, MA   02139
C
C----------------------------------------------------------------------
C
C               WORK SUPPORTED BY:    THE ARM PROGRAM
C                                     OFFICE OF ENERGY RESEARCH
C                                     DEPARTMENT OF ENERGY
C
C
C      SOURCE OF ORIGINAL ROUTINE:    AFGL LINE-BY-LINE MODEL
C
C                                             FASCOD3
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C     ----------------------------------------------------------------
C     Parameter and common block for direct input of reflection
C     function values
C
      PARAMETER (NMAXCO=4040)
      COMMON /RFLTIN/ V1RFLT,V2RFLT,DVRFLT,NLIMRF,ZRFLT(NMAXCO)
C     ----------------------------------------------------------------
C
      COMMON /BNDPRP/ TMPBND,BNDEMI(3),BNDRFL(3),IBPROP
      EQUIVALENCE (BNDRFL(1),A) , (BNDRFL(2),B) , (BNDRFL(3),C)
C
      DATA FACTOR / 0.001 /
C
C     ***************************************************
C     Check for A < 0.  If so, use input values read in from file
C     "REFLECTION"
C     ***************************************************
C
      IF (A.LT.0.) THEN
C
C        Determine elements of REFLECTION function to use with
C        input frequency
C
         NELMNT = INT((VI-V1RFLT)/DVRFLT)
C
C        Test for bounds on REFLECTION function
C
         IF ((NELMNT.LE.0).OR.(NELMNT.GE.NLIMRF)) THEN
            WRITE(*,*) 'Frequency range of calculation exceeded',
     *                 ' reflectivity input.'
            WRITE(*,*) ' VI = ',VI,' V1RFLT = ',V1RFLT,' V2RFLT = ',
     *                 V2RFLT
            STOP 'ERROR IN REFLFN'
         ENDIF
C
C        Interpolate to obtain appropriate reflection value
C
         V1A = V1RFLT+DVRFLT*NELMNT
         V1B = V1RFLT+DVRFLT*(NELMNT+1)
         CALL LINTCO(V1A,ZRFLT(NELMNT),V1B,ZRFLT(NELMNT+1),VI,ZINT,
     *               ZDEL)
         REFLFN = ZINT
         VINRF = V1B
         RFDEL = ZDEL*DVI
         RFLAST = ZRFLT(NELMNT+1)
         RETURN
C
      ENDIF
C
C     ***************************************************
C     The following uses a quadratic formula for emission
C     ***************************************************
C
C     CHECK FOR CONSTANT R (INDEPENDENT OF VI)
C     IF CONSTANT RETURN LARGE VALUE FOR VINRF
C
      IF (B.EQ.0..AND.C.EQ.0.) THEN
         REFLFN = A
         VINRF = 9.99E+9
         RFDEL = 0.0
         RFLAST = REFLFN
         RETURN
      ENDIF
C
      XVI = VI
      IF (RFLAST.LT.0.) THEN
         RFLAST = A+B*XVI+C*XVI*XVI
      ENDIF
C
C     SET REFLFN EQUAL TO REFLECTIVITY AT VI
C
C     RFLAST IS REFLFN(VI) FOR EACH SUBSEQUENT CALL
C
      REFLFN = RFLAST
C
      IF (VINRF.GE.0.0) THEN
         XVNEXT = XVI+FACTOR/ABS((B+2.*C*XVI))
         XVNEXT = MIN(XVNEXT,(XVI+DVI*2400))
         INTVLS = (XVNEXT-XVI)/DVI
         INTVLS = MAX(INTVLS,1)
         XVNEXT = XVI+DVI*FLOAT(INTVLS)
      ELSE
         XVNEXT = ABS(VINRF)
         INTVLS = (XVNEXT-XVI)/DVI
         INTVLS = MAX(INTVLS,1)
      ENDIF
C
      RFNEXT = A+B*XVNEXT+C*XVNEXT*XVNEXT
C
      RFDEL = (RFNEXT-REFLFN)/FLOAT(INTVLS)
C
      VINRF = XVNEXT
      RFLAST = RFNEXT
C
      RETURN
C
      END
C
C     ----------------------------------------------------------------
C

      SUBROUTINE EMIN (V1P,V2P,DVP,NLIM,KFILE,EM,EMB,TR,KEOF,NPANLS) 4,70
C
      IMPLICIT REAL*8           (V)
C
C     SUBROUTINE EMIN INPUTS OPTICAL DEPTH VALUES FROM KFILE AND
C       CALCULATES SOURCE FUNCTION FOR THE LAYER.
C       THIS VERSION WORKS FOR AEROSOLS AND NLTE.
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C               LAST MODIFICATION:    14 AUGUST 1991
C
C                  IMPLEMENTATION:    R.D. WORSHAM
C
C             ALGORITHM REVISIONS:    S.A. CLOUGH
C                                     R.D. WORSHAM
C                                     J.L. MONCET
C
C
C                     ATMOSPHERIC AND ENVIRONMENTAL RESEARCH INC.
C                     840 MEMORIAL DRIVE,  CAMBRIDGE, MA   02139
C
C----------------------------------------------------------------------
C
C               WORK SUPPORTED BY:    THE ARM PROGRAM
C                                     OFFICE OF ENERGY RESEARCH
C                                     DEPARTMENT OF ENERGY
C
C
C      SOURCE OF ORIGINAL ROUTINE:    AFGL LINE-BY-LINE MODEL
C
C                                             FASCOD3
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
      character*8      XID,       HMOLID,      YID
      real*8               SECANT,       XALTZ
C
      COMMON /FILHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4),
     *                WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1 ,V2 ,TBOUND,
     *                EMISIV,FSCDID(17),NMOL,LAYRS ,YI1,YID(10),LSTWDF
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KDUMY,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL,
     *              NLTEFL,LNFIL4,LNGTH4
      COMMON /LAMCHN/ ONEPL,ONEMI,EXPMIN,ARGMIN
      COMMON /BUFPNL/ V1PBF,V2PBF,DVPBF,NLIMBF
      COMMON /RMRG/ XKT,XKTA,XKTB,SECNT
C
      DIMENSION PNLHDR(2),EM(*),EMB(*),TR(*)
C
      EQUIVALENCE (FSCDID(1),IHIRAC) , (FSCDID(2),ILBLF4)
      EQUIVALENCE (PNLHDR(1),V1PBF)
      EQUIVALENCE (FSCDID(4),IAERSL)
C
      CALL BUFIN (KFILE,KEOF,PNLHDR(1),NPHDRF)
      IF (KEOF.LE.0) RETURN
      CALL BUFIN (KFILE,KEOF,TR(1),NLIMBF)
C
C     TR CONTAINS THE OPTICAL DEPTHS AT THIS STAGE
C
      IF (IHIRAC.EQ.4) CALL BUFIN (KFILE,KEOF,EM(1),NLIMBF)
C
C     EM CONTAINS THE OPTICAL DEPTH CORRECTIONS FOR NLTE AT THIS STAGE
C
      IF (NPANLS.LT.1.AND.IAERSL.EQ.0) WRITE (IPR,900)
      IF (NPANLS.LT.1.AND.IAERSL.NE.0) WRITE (IPR,905)
C
      EXT = 0.
      ADEL = 0.
      RADFN0 = 0.
      RDEL = 0.
      BB = 0.
      BBDEL = 0.
      BBA = 0.
      BBDLA = 0.
      BBB = 0.
      BBDLB = 0.
C
      V1P = V1PBF
      V2P = V2PBF
      DVP = DVPBF
      NLIM = NLIMBF
      VI = V1P-DVP
      VIDV = VI
      VIBB = VI
      VAER = VI
      VDUM = VI
      BBLAST = -1.
      BBLXTA = -2.
      BBLXTB = -3.
      RDLAST = -1.
      BBDUM = -4.
      RDDUM = -1.
      NLIM1 = 0
      NLIM2 = 0
C
      AA = 0.278
C
      IF (IAERSL.EQ.0) THEN
         IAFBB = -1
      ELSE
         BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBDUM)
         RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDDUM)
         EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
         IAFBB = 0
         IF (VITST.LT.VAER.AND.VITST.LT.VIBB) IAFBB = 1
         IF (VAER.LT.VITST.AND.VAER.LT.VIBB) IAFBB = 2
      ENDIF
C
C     - THIS SECTION TREATS THE CASE WHERE THE LAYER CONTRIBUTES
C       TO THE RADIATIVE TRANSFER ONLY ONCE
C
C     - WITH XKTA=0 THIS ALGORITHM REVERTS TO THE ORIGINAL
C
      IF (XKTB.LE.0.) THEN
C
C     - THIS SECTION TREATS THE LTE CASE
C
         IF (IHIRAC.NE.4) THEN
C
   10       NLIM1 = NLIM2+1
C
            VI = V1P+FLOAT(NLIM1-1)*DVP
            IF (IAFBB.EQ.-1) THEN
               BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
            ELSEIF (IAFBB.EQ.0) THEN
               BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               VITST = -VIDV
               RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
               EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
            ELSEIF (IAFBB.EQ.1) THEN
               RADFN0 = RADFNI(VI,DVP,XKT,VIDV,RDEL,RDLAST)
               VIBB = -VIDV
               BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
            ELSEIF (IAFBB.EQ.2) THEN
               EXT = AERF(VI,DVP,VIDV,ADEL,TAUSCT,TDEL,GFACT,GDEL)
               VIBB = -VIDV
               BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               VITST = -VIDV
               RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
            ENDIF
C
            NLIM2 = (VIDV-V1P)/DVP+1.001
            NLIM2 = MIN(NLIM2,NLIM)
C
            DO 20 I = NLIM1, NLIM2
               ODVI = TR(I)+EXT*RADFN0
               XX = AA*ODVI
C
               TR(I) = EXP(-ODVI)
               EM(I) = (1.-TR(I))*(BB+XX*BBA)/(1.+XX)
C
C              Increment interpolation values
C
               EXT = EXT+ADEL
               RADFN0 = RADFN0+RDEL
               BB = BB+BBDEL
               BBA = BBA+BBDLA
   20       CONTINUE
C
            IF (NLIM2.LT.NLIM) GO TO 10
         ELSE
C
C     - THIS SECTION TREATS THE NLTE CASE
C
   30       NLIM1 = NLIM2+1
C
            VI = V1P+FLOAT(NLIM1-1)*DVP
            IF (IAFBB.EQ.-1) THEN
               BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
            ELSEIF (IAFBB.EQ.0) THEN
               BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               VITST = -VIDV
               RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
               EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
            ELSEIF (IAFBB.EQ.1) THEN
               RADFN0 = RADFNI(VI,DVP,XKT,VIDV,RDEL,RDLAST)
               VIBB = -VIDV
               BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
            ELSEIF (IAFBB.EQ.2) THEN
               EXT = AERF(VI,DVP,VIDV,ADEL,TAUSCT,TDEL,GFACT,GDEL)
               VIBB = -VIDV
               BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               VITST = -VIDV
               RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
            ENDIF
C
            NLIM2 = (VIDV-V1P)/DVP+1.001
            NLIM2 = MIN(NLIM2,NLIM)
C
            DO 40 I = NLIM1, NLIM2
               ODVI = TR(I)+EXT*RADFN0
               XX = AA*ODVI
C
               TR(I) = EXP(-ODVI)
               EM(I) = (1.-TR(I))*(1.0-EM(I)/ODVI)*(BB+XX*BBA)/(1.+XX)
C
C              Increment interpolation values
C
               EXT = EXT+ADEL
               RADFN0 = RADFN0+RDEL
               BB = BB+BBDEL
               BBA = BBA+BBDLA
   40       CONTINUE
C
            IF (NLIM2.LT.NLIM) GO TO 30
C
         ENDIF
      ELSE
C
C     - THIS SECTION TREATS THE CASE WHERE THE LAYER CONTRIBUTES
C       TO THE RADIATIVE TRANSFER TWICE:
C
C     - FOR TANGENT PATHS AND FOR THE CASE OF THE REFLECTED ATMOSPHERE
C
         IF (IHIRAC.NE.4) THEN
C
C     - THIS SECTION TREATS THE LTE CASE
C
   50       NLIM1 = NLIM2+1
C
            VI = V1P+FLOAT(NLIM1-1)*DVP
            IF (IAFBB.EQ.-1) THEN
               BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               IF (XKTB.GT.0.) THEN
                  VIBB = -VIDV
                  BBB = BBFN(VI,DVP,V2P,XKTB,VIBB,BBDLB,BBLXTB)
               ELSE
                  BBB = BB
                  BBDLB = BBDEL
               ENDIF
            ELSEIF (IAFBB.EQ.0) THEN
               BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               IF (XKTB.GT.0.) THEN
                  VIBB = -VIDV
                  BBB = BBFN(VI,DVP,V2P,XKTB,VIBB,BBDLB,BBLXTB)
               ELSE
                  BBB = BB
                  BBDLB = BBDEL
               ENDIF
               VITST = -VIDV
               RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
               EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
            ELSEIF (IAFBB.EQ.1) THEN
               RADFN0 = RADFNI(VI,DVP,XKT,VIDV,RDEL,RDLAST)
               VIBB = -VIDV
               BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               IF (XKTB.GT.0.) THEN
                  VIBB = -VIDV
                  BBB = BBFN(VI,DVP,V2P,XKTB,VIBB,BBDLB,BBLXTB)
               ELSE
                  BBB = BB
                  BBDLB = BBDEL
               ENDIF
               EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
            ELSEIF (IAFBB.EQ.2) THEN
               EXT = AERF(VI,DVP,VIDV,ADEL,TAUSCT,TDEL,GFACT,GDEL)
               VIBB = -VIDV
               BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               IF (XKTB.GT.0.) THEN
                  VIBB = -VIDV
                  BBB = BBFN(VI,DVP,V2P,XKTB,VIBB,BBDLB,BBLXTB)
               ELSE
                  BBB = BB
                  BBDLB = BBDEL
               ENDIF
               VITST = -VIDV
               RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
            ENDIF
C
            NLIM2 = (VIDV-V1P)/DVP+1.001
            NLIM2 = MIN(NLIM2,NLIM)
C
            DO 60 I = NLIM1, NLIM2
               ODVI = TR(I)+EXT*RADFN0
               XX = AA*ODVI
C
               TR(I) = EXP(-ODVI)
               EMX = (1.-TR(I))/(1.+XX)
               EM(I) = EMX*(BB+XX*BBA)
               EMB(I) = EMX*(BB+XX*BBB)
C
C              Increment interpolation values
C
               EXT = EXT+ADEL
               RADFN0 = RADFN0+RDEL
               BB = BB+BBDEL
               BBA = BBA+BBDLA
               BBB = BBB+BBDLB
   60       CONTINUE
C
            IF (NLIM2.LT.NLIM) GO TO 50
C
         ELSE
C
C     - THIS SECTION TREATS THE CASE OF NLTE
C
   70       NLIM1 = NLIM2+1
C
            VI = V1P+FLOAT(NLIM1-1)*DVP
            IF (IAFBB.EQ.-1) THEN
               BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               IF (XKTB.GT.0.) THEN
                  VIBB = -VIDV
                  BBB = BBFN(VI,DVP,V2P,XKTB,VIBB,BBDLB,BBLXTB)
               ELSE
                  BBB = BB
                  BBDLB = BBDEL
               ENDIF
            ELSEIF (IAFBB.EQ.0) THEN
               BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               IF (XKTB.GT.0.) THEN
                  VIBB = -VIDV
                  BBB = BBFN(VI,DVP,V2P,XKTB,VIBB,BBDLB,BBLXTB)
               ELSE
                  BBB = BB
                  BBDLB = BBDEL
               ENDIF
               VITST = -VIDV
               RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
               EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
            ELSEIF (IAFBB.EQ.1) THEN
               RADFN0 = RADFNI(VI,DVP,XKT,VIDV,RDEL,RDLAST)
               VIBB = -VIDV
               BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               IF (XKTB.GT.0.) THEN
                  VIBB = -VIDV
                  BBB = BBFN(VI,DVP,V2P,XKTB,VIBB,BBDLB,BBLXTB)
               ELSE
                  BBB = BB
                  BBDLB = BBDEL
               ENDIF
               EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
            ELSEIF (IAFBB.EQ.2) THEN
               EXT = AERF(VI,DVP,VIDV,ADEL,TAUSCT,TDEL,GFACT,GDEL)
               VIBB = -VIDV
               BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               IF (XKTB.GT.0.) THEN
                  VIBB = -VIDV
                  BBB = BBFN(VI,DVP,V2P,XKTB,VIBB,BBDLB,BBLXTB)
               ELSE
                  BBB = BB
                  BBDLB = BBDEL
               ENDIF
               VITST = -VIDV
               RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
            ENDIF
C
            NLIM2 = (VIDV-V1P)/DVP+1.001
            NLIM2 = MIN(NLIM2,NLIM)
C
            DO 80 I = NLIM1, NLIM2
               ODVI = TR(I)+EXT*RADFN0
               XX = AA*ODVI
C
               TR(I) = EXP(-ODVI)
               EMX = (1.-TR(I))*(1.0-EM(I)/ODVI)/(1.+XX)
               EM(I) = EMX*(BB+XX*BBA)
               EMB(I) = EMX*(BB+XX*BBB)
C
C              Increment interpolation values
C
               EXT = EXT+ADEL
               RADFN0 = RADFN0+RDEL
               BB = BB+BBDEL
               BBA = BBA+BBDLA
               BBB = BBB+BBDLB
   80       CONTINUE
C
            IF (NLIM2.LT.NLIM) GO TO 70
C
         ENDIF
      ENDIF
C
      RETURN
C
  900 FORMAT ('0EMISSION AND TRANSMISSION  (MOLECULAR) ')
  905 FORMAT ('0EMISSION AND TRANSMISSION (AEROSOLS EFFECTS INCLUDED)')
C
      END
C
C     ----------------------------------------------------------------
C

      SUBROUTINE EMINIT (NPTS,MFILE,JPATHL,TBND) 2,26
C
      IMPLICIT REAL*8           (V)
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C               LAST MODIFICATION:    14 AUGUST 1991
C
C                  IMPLEMENTATION:    R.D. WORSHAM
C
C             ALGORITHM REVISIONS:    S.A. CLOUGH
C                                     R.D. WORSHAM
C                                     J.L. MONCET
C
C
C                     ATMOSPHERIC AND ENVIRONMENTAL RESEARCH INC.
C                     840 MEMORIAL DRIVE,  CAMBRIDGE, MA   02139
C
C----------------------------------------------------------------------
C
C               WORK SUPPORTED BY:    THE ARM PROGRAM
C                                     OFFICE OF ENERGY RESEARCH
C                                     DEPARTMENT OF ENERGY
C
C
C      SOURCE OF ORIGINAL ROUTINE:    AFGL LINE-BY-LINE MODEL
C
C                                             FASCOD3
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
      COMMON NEWEM(2410),NEWTR(2410)
      COMMON /MANE/ P0,TEMP0,NLAYER,DVXM,H2OSLF,WTOT,ALBAR,ADBAR,AVBAR,
     *              AVFIX,LAYER,SECNT0,SAMPLE,DVSET,ALFAL0,AVMASS,
     *              DPTMIN,DPTFAC,ALTAV,AVTRAT,TDIFF1,TDIFF2,ALTD1,
     *              ALTD2,ANGLE,IANT,LTGNT,LH1,LH2,IPFLAG,PLAY,TLAY,
     *              EXTID(10)
      COMMON /CONSTS/ PI,PLANCK,BOLTZ,CLIGHT,AVOG,RADCN1,RADCN2
C
      character*8      XID,       HMOLID,      YID
      real*8               SECANT,       XALTZ
C
      COMMON /EMIHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4),
     *                WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1 ,V2 ,TBOUND,
     *                EMISIV,FSCDID(17),NMOL,LAYDUM,YI1,YID(10),LSTWDF
      COMMON /BNDPRP/ TMPBND,BNDEMI(3),BNDRFL(3),IBPROP
      COMMON /OPANL/ V1PO,V2PO,DVPO,NLIMO
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KFILE,KPANEL,LINFIL,NFILA,IAFIL,IEXFIL,
     *              NLTEFL,LNFIL4,LNGTH4
      COMMON /RMRG/ XKT,XKTA,XKTB,SECNT
C
      CHARACTER*40 CEXT,CYID
C
      DIMENSION EMLAYB(2410)
      DIMENSION XFILHD(2),OPNLHD(2)
      DIMENSION EMLAYR(2),TRLAYR(2)
C
      EQUIVALENCE (XFILHD(1),XID(1)) , (OPNLHD(1),V1PO)
      EQUIVALENCE (NEWEM(1),EMLAYR(1)) , (NEWTR(1),TRLAYR(1)),
     *            (FSCDID(4),IAERSL) , (FSCDID(5),IEMIT),
     *            (FSCDID(7),IPLOT) , (FSCDID(8),IPATHL),
     *            (FSCDID(16),LAYR1)
C
      REAL NEWEM,NEWTR
C
C
C *********************************************************************
C ****  THIS SUBROUTINE COMPUTES THE EMISSION FOR THE FIRST LAYER  ****
C *********************************************************************
C
C     TBND IS THE BOUNDARY BLACK BODY TEMPERATUE
C
C     IPATHL =-1 IS FOR THE LOOKING DOWN CASE WITH REFLECTED ATMOSPHERE
C     IPATHL = 0 IS FOR THE HORIZONTAL PATH CASE (HOMOGENEOUS LAYER)
C     IPATHL = 1 IS FOR THE LOOKING DOWN CASE (TO DENSER LAYERS)
C     IPATHL = 2 IS FOR THE SYMMETRIC TANGENT PATH CASE
C     IPATHL = 3 IS FOR THE LOOKING UP CASE (TO LESS DENSE LAYERS
C
      CALL CPUTIM (TIME)
C
C      ** NOTE ON IPATHL =2
C           THE TANGENT MERGE ROUTINES ARE DIVIDED INTO ANTERIOR (1ST)
C           AND POSTERIOR (2ND) LAYER CROSSINGS.  THIS RECOGNITION IS
C           TRIGGERED BY THE VALUE OF "IANT"
C
C          IF  IANT.EQ. 1  THEN POSTERIOR MERGE
C          IF  IANT.EQ. 0  THEN NORMAL MERGE
C          IF  IANT.EQ.-1  THEN ANTERIOR MERGE
C
      WRITE (IPR,900) TIME
      NPANLS = 0
      CALL BUFIN (KFILE,KEOF,XFILHD(1),NFHDRF)
      IF (JPATHL.GE.1) IPATHL = JPATHL
      PLAY = PAVE
      TLAY = TAVE
C
C     FOR AEROSOL RUNS, MOVE EXTID INTO YID
C
      IF (IAERSL.GT.0) THEN
         WRITE (CEXT,'(10A4)') EXTID
         WRITE (CYID,'(5A8)') (YID(I),I=3,7)
         CYID(19:40) = CEXT(19:40)
         READ (CYID,'(5A8)') (YID(I),I=3,7)
      ENDIF
C
C     IF BOUNDARY PROPERTIES ARE SUPPLIED, AND DOWNWARD LOOKING
C     CASE; SET IPATHL TO REFLECTED ATMOSPHERE CASE
C
      IF (IBPROP.EQ.1.AND.IPATHL.EQ.1) IPATHL = -1
      IEMIT = 1
      FACT = 1.
      TIMEM = 0.0
      IF (IPATHL.EQ.2.AND.IANT.EQ.0) FACT = 2.
      DO 10 MOL = 1, NMOL
         WK(MOL) = WK(MOL)*FACT
   10 CONTINUE
      WBROAD = WBROAD*FACT
      LAYR1 = LAYER
      WRITE (IPR,905) LAYR1,LAYER,KFILE,MFILE
      CALL BUFOUT (MFILE,XFILHD(1),NFHDRF)
      DVXM = DV
      XKT = TAVE/RADCN2
      XKTBND = TBND/RADCN2
      IF (IPATHL.EQ.-1) THEN
         XKTA = TZU/RADCN2
         XKTB = TZL/RADCN2
      ENDIF
      IF (IPATHL.EQ.0) THEN
         XKTA = 0.
         XKTB = 0.
      ENDIF
      IF (IPATHL.EQ.1) THEN
         XKTA = TZU/RADCN2
         XKTB = 0.
      ENDIF
      IF (IPATHL.EQ.2) THEN
         XKTA = TZU/RADCN2
         XKTB = TZL/RADCN2
      ENDIF
      IF (IPATHL.EQ.3) THEN
         XKTA = TZL/RADCN2
         XKTB = 0.
      ENDIF
      WRITE (IPR,910) IPATHL,IANT
C
   20 CONTINUE
C
      CALL CPUTIM (TIMEM1)
      CALL EMIN (V1PO,V2PO,DVPO,NLIMO,KFILE,EMLAYR,EMLAYB,TRLAYR,KEOF,
     *           NPANLS)
      CALL CPUTIM (TIMEM2)
      TIMEM = TIMEM+TIMEM2-TIMEM1
      IF (KEOF.LE.0) GO TO 80
      VI = V1PO-DVPO
      VIDVBD = VI
      VIDVEM = VI
      VIDVRF = VI
      BBLAST = -1.
      EMLAST = -1.
      RFLAST = -1.
      IF (IPATHL.EQ.2.AND.IANT.EQ.0) THEN
         DO 30 J = 1, NLIMO
            TRJ = TRLAYR(J)
            NEWEM(J) = EMLAYR(J)+EMLAYB(J)*TRJ
            TRLAYR(J) = TRLAYR(J)*TRJ
   30    CONTINUE
      ELSEIF ((IPATHL.EQ.1).AND.(TBND.GT.0.)) THEN
C
         NLIM1 = 0
         NLIM2 = 0
         EMDUM = 0.
         BBDUM = 0.
         EMISIV = EMISFN(VI,DVPO,VIDVEM,EMDEL,EMDUM)
         BB = BBFN(VI,DVPO,V2PO,XKTBND,VIDVBD,BBDEL,BBDUM)
         IEMBB = 0
         IF (VIDVBD.GT.VIDVEM) IEMBB = 1
C
   40    NLIM1 = NLIM2+1
C
         VI = V1PO+FLOAT(NLIM1-1)*DVPO
         IF (IEMBB.EQ.0) THEN
            BB = BBFN(VI,DVPO,V2PO,XKTBND,VIDV,BBDEL,BBLAST)
            VIDVEM = -VIDV
            EMISIV = EMISFN(VI,DVPO,VIDVEM,EMDEL,EMLAST)
         ELSE
            EMISIV = EMISFN(VI,DVPO,VIDV,EMDEL,EMLAST)
            VIDVBD = -VIDV
            BB = BBFN(VI,DVPO,V2PO,XKTBND,VIDVBD,BBDEL,BBLAST)
         ENDIF
C
         IF (VIDV.GE.9.E+4) THEN
            NLIM2 = NLIMO+1
         ELSE
            NLIM2 = (VIDV-V1PO)/DVPO+1.001
         ENDIF
         NLIM2 = MIN(NLIM2,NLIMO)
C
         DO 50 J = NLIM1, NLIM2
            V=VI+FLOAT(J-1)*DVPO
            NEWEM(J) = EMLAYR(J)+TRLAYR(J)*BB*EMISIV
C
C           Increment interpolation value
C
            EMISIV = EMISIV+EMDEL
            BB = BB+BBDEL
   50    CONTINUE
C
         IF (NLIM2.LT.NLIMO) GO TO 40
C
      ELSEIF ((IPATHL.EQ.-1).AND.(TBND.GT.0.)) THEN
C
         NLIM1 = 0
         NLIM2 = 0
         EMDUM = 0.
         RFDUM = 0.
         BBDUM = 0.
         EMISIV = EMISFN(VI,DVPO,VIDVEM,EMDEL,EMDUM)
         REFLCT = REFLFN(VI,DVPO,VIDVRF,RFDEL,RFDUM)
         BB = BBFN(VI,DVPO,V2PO,XKTBND,VIDVBD,BBDEL,BBDUM)
         IEMBB = 0
         IF (VIDVEM.LT.VIDVRF.AND.VIDVEM.LT.VIDVBD) IEMBB = 1
         IF (VIDVRF.LT.VIDVEM.AND.VIDVRF.LT.VIDVBD) IEMBB = 2
C
   60    NLIM1 = NLIM2+1
C
         VI = V1PO+FLOAT(NLIM1-1)*DVPO
         IF (IEMBB.EQ.0) THEN
            BB = BBFN(VI,DVPO,V2PO,XKTBND,VIDV,BBDEL,BBLAST)
            VIDVEM = -VIDV
            EMISIV = EMISFN(VI,DVPO,VIDVEM,EMDEL,EMLAST)
            VIDVRF = -VIDV
            REFLCT = REFLFN(VI,DVPO,VIDVRF,RFDEL,RFLAST)
         ELSEIF (IEMBB.EQ.1) THEN
            EMISIV = EMISFN(VI,DVPO,VIDV,EMDEL,EMLAST)
            VIDVBD = -VIDV
            BB = BBFN(VI,DVPO,V2PO,XKTBND,VIDVBD,BBDEL,BBLAST)
            VIDVRF = -VIDV
            REFLCT = REFLFN(VI,DVPO,VIDVRF,RFDEL,RFLAST)
         ELSE
            REFLCT = REFLFN(VI,DVPO,VIDV,RFDEL,RFLAST)
            VIDVBD = -VIDV
            BB = BBFN(VI,DVPO,V2PO,XKTBND,VIDVBD,BBDEL,BBLAST)
            VIDVEM = -VIDV
            EMISIV = EMISFN(VI,DVPO,VIDVEM,EMDEL,EMLAST)
         ENDIF
C
         IF (VIDV.GE.9.E+4) THEN
            NLIM2 = NLIMO+1
         ELSE
            NLIM2 = (VIDV-V1PO)/DVPO+1.001
         ENDIF
         NLIM2 = MIN(NLIM2,NLIMO)
C
         DO 70 J = NLIM1, NLIM2
            V=VI+FLOAT(J-1)*DVPO
            NEWEM(J) = EMLAYR(J)+EMLAYB(J)*REFLCT*TRLAYR(J)+
     *                 TRLAYR(J)*BB*EMISIV
C
C           Increment interpolation value
C
            EMISIV = EMISIV+EMDEL
            REFLCT = REFLCT+RFDEL
            BB = BB+BBDEL
   70    CONTINUE
C
         IF (NLIM2.LT.NLIMO) GO TO 60
C
      ENDIF
      CALL EMOUT (V1PO,V2PO,DVPO,NLIMO,NEWEM,NEWTR,MFILE,NPTS,NPANLS)
      GO TO 20
   80 CALL CPUTIM (TIME1)
      TIME = TIME1-TIME
      WRITE (IPR,915) TIME,TIMEM
C
      RETURN
C
  900 FORMAT (' TIME AT THE START OF --EMINIT-- ',F10.3)
  905 FORMAT ('0 INITIAL LAYER',I5,'  FINAL LAYER',I5,/,
     *        '0 INPUT FILE =',I5,' OUTPUT FILE =',I5)
  910 FORMAT ('0 IPATHL AND IANT',2I5)
  915 FORMAT (' TIME REQUIRED FOR --EMINIT-- ',F10.3,
     *        ' --EMIN-- ',F10.3)
C
      END
C
C     ----------------------------------------------------------------
C

      SUBROUTINE RADMRG (NPTS,LFILE,MFILE,JPATHL,TBND) 1,18
C
      IMPLICIT REAL*8           (V)
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C               LAST MODIFICATION:    8 APRIL 1991
C
C                  IMPLEMENTATION:    R.D. WORSHAM
C
C             ALGORITHM REVISIONS:    S.A. CLOUGH
C                                     R.D. WORSHAM
C                                     J.L. MONCET
C
C
C                     ATMOSPHERIC AND ENVIRONMENTAL RESEARCH INC.
C                     840 MEMORIAL DRIVE,  CAMBRIDGE, MA   02139
C
C----------------------------------------------------------------------
C
C               WORK SUPPORTED BY:    THE ARM PROGRAM
C                                     OFFICE OF ENERGY RESEARCH
C                                     DEPARTMENT OF ENERGY
C
C
C      SOURCE OF ORIGINAL ROUTINE:    AFGL LINE-BY-LINE MODEL
C
C                                             FASCOD3
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
      COMMON RADN(2410),TRAN(2410),RADO(0:5000)
      COMMON /MANE/ P0,TEMP0,NLAYER,DVXM,H2OSLF,WTOT,ALBAR,ADBAR,AVBAR,
     *              AVFIX,LAYDUM,SECNT0,SAMPLE,DVSET,ALFAL0,AVMASS,
     *              DPTMIN,DPTFAC,ALTAV,AVTRAT,TDIFF1,TDIFF2,ALTD1,
     *              ALTD2,ANGLE,IANT,LTGNT,LH1,LH2,IPFLAG,PLAY,TLAY,
     *              EXTID(10)
      COMMON /CONSTS/ PI,PLANCK,BOLTZ,CLIGHT,AVOG,RADCN1,RADCN2
C
      character*8      XID,       HMOLID,      YID
      real*8               SECANT,       XALTZ
C
      COMMON /EMHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4),
     *               WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1 ,V2 ,TBOUND,
     *               EMISIV,FSCDID(17),NMOL,LAYER ,YI1,YID(10),LSTWDF
      COMMON /BNDPRP/ TMPBND,BNDEMI(3),BNDRFL(3),IBPROP
      COMMON /OPANL/ V1PO,V2PO,DVPO,NLIMO
      COMMON /XPANEL/ V1P,V2P,DVP,NLIM,RMIN,RMAX,NPNLXP,NSHIFT,NPTSS
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL,
     *              NLTEFL,LNFIL4,LNGTH4
      COMMON /XME/ TRAO(0:5000)
      COMMON /RMRG/ XKT,XKTA,XKTB,SECNT
C
      DIMENSION RADLYB(2410)
      DIMENSION XFILHD(2),PNLHDR(2),OPNLHD(2)
      DIMENSION A1(10),A2(10),A3(10),A4(10)
      DIMENSION RADLYR(2),TRALYR(2),RADOI(2),TRAOI(2)
      DIMENSION WKSAV(35)
C
      CHARACTER*40 CYID
C
      EQUIVALENCE (XFILHD(1),XID(1)) , (PNLHDR(1),V1P),
     *            (OPNLHD(1),V1PO)
      EQUIVALENCE (RADO(1),RADOI(1)) , (TRAO(1),TRAOI(1)),
     *            (RADN(1),RADLYR(1)) , (TRAN(1),TRALYR(1)),
     *            (FSCDID(4),IAERSL) , (FSCDID(5),IEMIT),
     *            (FSCDID(7),IPLOT) , (FSCDID(8),IPATHL),
     *            (FSCDID(16),LAYR1)
C
      DATA NDIM / 2410 /,ND2 / 5000 /
C
C
C
C      ************************************************************
C      ****** THIS SUBROUTINE DOES LAYER MERGE FOR RADIANCE  ******
C      ************************************************************
C
C     IPATHL =-1 IS FOR THE LOOKING DOWN CASE FOR REFLECTED ATMOSPHERE
C     IPATHL = 1 IS FOR THE LOOKING DOWN CASE (TO DENSER LAYERS)
C     IPATHL = 2 IS FOR THE SYMMETRIC TANGENT PATH CASE
C     IPATHL = 3 IS FOR THE LOOKING UP CASE (TO LESS DENSE LAYERS)
C
C
C      ** NOTE ON IPATHL = 2
C            THE TANGENT MERGE ROUTINES ARE DIVIDED INTO ANTERIOR (1ST)
C            AND POSTERIOR (2ND) LAYER CROSSINGS   THIS RECOGNITION IS
C            TRIGGERED BY THE VALUE OF "IANT"
C
C          IF  IANT.EQ. 1  THEN POSTERIOR MERGE
C          IF  IANT.EQ. 0  THEN NORMAL MERGE
C          IF  IANT.EQ.-1  THEN ANTERIOR MERGE
C
      CALL CPUTIM (TIME)
      WRITE (IPR,900) TIME
      NPANLS = 0
      TIMEM = 0.0
      TIMRD = 0.0
      TIMOT = 0.0
C
      CALL BUFIN (LFILE,LEOF,XFILHD(1),NFHDRF)
      LAY1SV = LAYR1
      DVL = DV
      PL = PAVE
      TL = TAVE
      WTOTL = 0.
C
      DO 10 MOL = 1, NMOL
         WTOTL = WTOTL+WK(MOL)
         WKSAV(MOL) = WK(MOL)
   10 CONTINUE
C
      WTOTL = WTOTL+WBROAD
      WN2SAV = WBROAD
C
C     FOR AEROSOL RUNS, MOVE YID (LFILE) INTO YID (MFILE)
C
      IF (IAERSL.GT.0) WRITE (CYID,'(5A8)') (YID(I),I=3,7)
      CALL BUFIN (KFILE,KEOF,XFILHD(1),NFHDRF)
      IF (IAERSL.GT.0) READ (CYID,'(5A8)') (YID(I),I=3,7)
C
      IF (JPATHL.GE.1) IPATHL = JPATHL
      PLAY = PAVE
      TLAY = TAVE
C
C     IF BOUNDARY PROPERTIES ARE SUPPLIED, AND DOWNWARD LOOKING
C     CASE; SET IPATHL TO REFLECTED ATMOSPHERE CASE
C
      IF (IBPROP.EQ.1.AND.IPATHL.EQ.1) IPATHL = -1
      TAVK = TAVE
      DVK = DV
      FACT = 1.
      IF (IPATHL.EQ.2.AND.IANT.EQ.0) FACT = 2.
C
      IF (DVL.EQ.DVK) THEN
         ITYPE = 0
      ELSEIF (DVL.GT.DVK) THEN
         ITYPE = DVK/(DVL-DVK)+0.5
      ELSE
C
C     DVL.LT.DVK
C
         ITYPE = -INT(DVL/(DVK-DVL)+0.5)
      ENDIF
      IF (ITYPE.LT.0) STOP ' RADMRG; ITYPE LT 0 '
C
      WTOTK = 0.
      LAYR1 = LAY1SV
      WRITE (IPR,905) LAYR1,LAYER,KFILE,LFILE,MFILE
      IEMIT = 1
      DO 20 MOL = 1, NMOL
         WTOTK = WTOTK+WK(MOL)*FACT
         WK(MOL) = WK(MOL)*FACT+WKSAV(MOL)
   20 CONTINUE
      WTOTK = WTOTK+WBROAD*FACT
      WBROAD = WBROAD*FACT+WN2SAV
      PAVE = (PL*WTOTL+PAVE*WTOTK)/(WTOTL+WTOTK)
      TAVE = (TL*WTOTL+TAVE*WTOTK)/(WTOTL+WTOTK)
      SECANT = 0.
C
C     WK IS NOW THE ACCUMULATED SUM OF THE COLUMN DENSITIES
C
      CALL BUFOUT (MFILE,XFILHD(1),NFHDRF)
      DVXM = DV
      XKT = TAVK/RADCN2
C
      WRITE (IPR,910) IPATHL,IANT
C
      IF (IPATHL.EQ.-1) THEN
         XKTA = TZU/RADCN2
         XKTB = TZL/RADCN2
      ELSEIF (IPATHL.EQ.1) THEN
         XKTA = TZU/RADCN2
         XKTB = 0.
      ELSEIF (IPATHL.EQ.2) THEN
         XKTA = TZU/RADCN2
         XKTB = TZL/RADCN2
      ELSEIF (IPATHL.EQ.3) THEN
         XKTA = TZL/RADCN2
         XKTB = 0.
      ELSE
         STOP ' RADMRG; IPATHL '
      ENDIF
C
      ATYPE = ITYPE
      LL = ITYPE+1
      AP = 1.0/(ATYPE+1.0)
C
C     A1, A2, A3 AND A4 ARE THE CONSTANTS
C     FOR THE LAGRANGE 4 POINT INTERPOLATION
C
      DO 30 JPG = 1, ITYPE
         APG = JPG
         IPL = JPG+1
         P = 1.0-(AP*APG)
         A1(IPL) = -P*(P-1.0)*(P-2.0)/6.0
         A2(IPL) = (P**2-1.0)*(P-2.0)*0.5
         A3(IPL) = -P*(P+1.0)*(P-2.0)*0.5
         A4(IPL) = P*(P**2-1.0)/6.0
   30 CONTINUE
C
C     *** BEGINNING OF LOOP THAT DOES MERGE ***
C
      NPE = 0
      RADO(0) = 0.0
      TRAO(0) = 0.0
      V1PO = 0.0
      V2PO = 0.0
      DVPO = 0.0
C
   40 CONTINUE
C
      CALL CPUTIM (TIMEM1)
      CALL EMIN (V1P,V2P,DVP,NLIM,KFILE,RADLYR,RADLYB,TRALYR,KEOF,
     *           NPANLS)
      CALL CPUTIM (TIMEM2)
      TIMEM = TIMEM+TIMEM2-TIMEM1
      IF (KEOF.LE.0) GO TO 80
      II = 1
C
      IF (V2PO.LE.V2P+DVPO) THEN
   50    CALL CPUTIM (TIMEM1)
         CALL BUFIN (LFILE,LEOF,OPNLHD(1),NPHDRF)
         IF (LEOF.LE.0) GO TO 60
         CALL BUFIN (LFILE,LEOF,RADOI(NPE+1),NLIMO)
         CALL BUFIN (LFILE,LEOF,TRAOI(NPE+1),NLIMO)
         CALL CPUTIM (TIMEM2)
         TIMRD = TIMRD+TIMEM2-TIMEM1
         NPE = NLIMO+NPE
         IF (V2PO.LE.V2P+DVPO) GO TO 50
      ENDIF
C
C     ZERO POINT OF FIRST PANEL
C
   60 IF (RADO(0).EQ.0.0.AND.TRAO(0).EQ.0.0) THEN
         RADO(0) = RADO(1)
         TRAO(0) = TRAO(1)
      ENDIF
C
C     END POINT OF LAST PANEL
C
      IF (V2PO+DVPO.GE.V2) THEN
         RADO(NPE+1) = RADO(NPE)
         RADO(NPE+2) = RADO(NPE)
         TRAO(NPE+1) = TRAO(NPE)
         TRAO(NPE+2) = TRAO(NPE)
      ENDIF
C
      NPL = 1
C
C     NPL IS LOCATION OF FIRST ELEMENT ON ARRAYS RADO AND TRAO
C
      CALL RADNN (RADN,TRAN,RADO,TRAO,RADLYB,NLIM,NDIM,ND2,V1P,DVP,
     *           IPATHL,A1,A2,A3,A4,LL,NPL)
C
      CALL CPUTIM (TIMEM1)
C
      IF (TBND.GT.0.) CALL EMBND (V1P,V2P,DVP,NLIM,RADN,TRAN,TBND)
C
      CALL EMOUT (V1P,V2P,DVP,NLIM,RADN,TRAN,MFILE,NPTS,NPANLS)
      CALL CPUTIM (TIMEM2)
      TIMOT = TIMOT+TIMEM2-TIMEM1
C
C     NPL IS NOW LOCATION OF FIRST ELEMENT TO BE USED FOR NEXT PASS
C
      IPL = -1
      DO 70 NL = NPL, NPE
         IPL = IPL+1
         RADO(IPL) = RADO(NL)
         TRAO(IPL) = TRAO(NL)
   70 CONTINUE
C
      NPE = IPL
C
      GO TO 40
   80 CONTINUE
C
      CALL CPUTIM (TIME1)
      TIM = TIME1-TIME
      WRITE (IPR,915) TIME1,TIM,TIMEM,TIMRD,TIMOT
C
      RETURN
C
C
  900 FORMAT ('0 THE TIME AT THE START OF RADMRG IS ',F12.3)
  905 FORMAT ('0 INITIAL LAYER',I5,'  FINAL LAYER',I5,/,'0 FILE ',I5,
     *        ' MERGED WITH FILE ',I5,' ONTO FILE',I5)
  910 FORMAT ('0 IPATHL AND IANT',2I5)
  915 FORMAT ('0 THE TIME AT THE END OF RADMRG IS ',F12.3/F12.3,
     *        ' SECS WERE REQUIRED FOR THIS MERGE  - EMIN - ',
     *        F12.3,' - READ - ',F12.3,' - EMOUT - ',F12.3)
C
      END
C
C     ----------------------------------------------------------------
C

      SUBROUTINE RADNN (RADLYR,TRALYR,RADO,TRAO,RADLYB,NLIM,NDIM,ND2, 2,2
     *                  V1P,DVP,IPATHL,A1,A2,A3,A4,LL,NPL)
C
      IMPLICIT REAL*8           (V)
C
C     THIS SUBROUTINE CALCULATES THE NEW RADIANCE AND TRANSMISSION
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C               LAST MODIFICATION:    8 APRIL 1991
C
C                  IMPLEMENTATION:    R.D. WORSHAM
C
C                       ALGORITHM:    R.D. WORSHAM
C                                     S.A. CLOUGH
C                                     J.L. MONCET
C
C
C                     ATMOSPHERIC AND ENVIRONMENTAL RESEARCH INC.
C                     840 MEMORIAL DRIVE,  CAMBRIDGE, MA   02139
C
C----------------------------------------------------------------------
C
C               WORK SUPPORTED BY:    THE ARM PROGRAM
C                                     OFFICE OF ENERGY RESEARCH
C                                     DEPARTMENT OF ENERGY
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C

      DIMENSION RADLYR(NDIM),TRALYR(NDIM),RADO(0:ND2),TRAO(0:ND2),
     *          RADLYB(NDIM),A1(*),A2(*),A3(*),A4(*)
C
      LLM1 = LL-1
      LLM1 = MAX(LLM1,1)
C
C     LOOPING OVER POINTS WITH SAME WEIGHTS
C
      DO 110 NL = 1, LL
         IPL = (NPL+NL-1)-LLM1
         IF (NL.GT.1) IPL = IPL-1
C
         IF (NL.EQ.1) THEN
C
C     EXACT FREQUENCY - NO INTERPOLATION
C
            IF (IPATHL.EQ.1) THEN
C
               DO 10 I = NL, NLIM, LL
                  IPL = IPL+LLM1
                  RADLYR(I) = TRALYR(I)*RADO(IPL)+RADLYR(I)
                  TRALYR(I) = TRALYR(I)*TRAO(IPL)
   10          CONTINUE
C
            ELSEIF (IPATHL.EQ.2) THEN
C
               DO 20 I = NL, NLIM, LL
                  IPL = IPL+LLM1
                  TRTEMP = TRALYR(I)*TRAO(IPL)
                  RADLYR(I) = TRALYR(I)*RADO(IPL)+RADLYR(I)+
     *                        RADLYB(I)*TRTEMP
                  TRALYR(I) = TRALYR(I)*TRTEMP
   20          CONTINUE
C
            ELSEIF (IPATHL.EQ.3) THEN
C
               DO 30 I = NL, NLIM, LL
                  IPL = IPL+LLM1
                  RADLYR(I) = RADO(IPL)+RADLYR(I)*TRAO(IPL)
                  TRALYR(I) = TRALYR(I)*TRAO(IPL)
   30          CONTINUE
C
            ELSEIF (IPATHL.EQ.-1) THEN
C
               VI = V1P-DVP
               DVI = DVP*FLOAT(LL)
               VIDVRF = VI
               RFLAST = -1.
               NLIM1 = 0
               NLIM2 = NL-1
C
 40            NLIM1 = NLIM2+1
C
               VI = V1P+FLOAT(NLIM1-1)*DVP
               REFLCT = REFLFN(VI,DVI,VIDVRF,RFDEL,RFLAST)
C
               IF (VIDVRF.GE.9.E+4) THEN
                  NLIM2 = NLIM+1
               ELSE
                  NLIM2 = (VIDVRF+DVI-DVP-V1P)/DVP+1.001
               ENDIF
               NLIM2 = MIN(NLIM2,NLIM)
C
C              Test to make sure LL divides evenly into (NLIM2-NLIM1+1)
C
               NRMNDR = MOD(NLIM2-NLIM1,LL)
               IF ((NRMNDR.NE.0).AND.(NLIM2+(LL-NRMNDR).LT.2400)) THEN
                  NLIM2 = NLIM2+(LL-NRMNDR)
               ENDIF
C
               DO 50 I = NLIM1, NLIM2, LL
                  IPL = IPL+LLM1
                  TRTEMP = TRALYR(I)*TRAO(IPL)
                  RADLYR(I) = TRALYR(I)*RADO(IPL)+RADLYR(I)+
     *                        RADLYB(I)*TRAO(IPL)*TRTEMP*REFLCT
                  TRALYR(I) = TRTEMP
C
C           Increment interpolation values
C
                  REFLCT = REFLCT+RFDEL
                  ILAST = I
   50          CONTINUE
C
               IF (NLIM2.LT.NLIM) THEN
                  NLIM2 = ILAST + LL-1
                  GO TO 40
               ENDIF
C
            ENDIF
C
C     NOT EXACT FREQUENCY - INTERPOLATE RESULT
C
         ELSE
C
            A1N = A1(NL)
            A2N = A2(NL)
            A3N = A3(NL)
            A4N = A4(NL)
C
            IF (IPATHL.EQ.1) THEN
               DO 60 I = NL, NLIM, LL
                  IPL = IPL+LLM1
C
C     INTERPOLATE THE OLD RADIANCE
C
                  RADLYR(I) = TRALYR(I)*(A1N*RADO(IPL-1)+A2N*RADO(IPL)+
     *                        A3N*RADO(IPL+1)+A4N*RADO(IPL+2))+RADLYR(I)
C
C     INTERPOLATE THE OLD TRANSMISSION
C
                  TRALYR(I) = TRALYR(I)*(A1N*TRAO(IPL-1)+A2N*TRAO(IPL)+
     *                        A3N*TRAO(IPL+1)+A4N*TRAO(IPL+2))
   60          CONTINUE
C
            ELSEIF (IPATHL.EQ.2) THEN
C
               DO 70 I = NL, NLIM, LL
                  IPL = IPL+LLM1
C
C     INTERPOLATE THE OLD TRANSMISSION
C
                  TRTEMP = TRALYR(I)*(A1N*TRAO(IPL-1)+A2N*TRAO(IPL)+
     *                     A3N*TRAO(IPL+1)+A4N*TRAO(IPL+2))
C
C     INTERPOLATE THE OLD RADIANCE
C
                  RADLYR(I) = TRALYR(I)*(A1N*RADO(IPL-1)+A2N*RADO(IPL)+
     *                        A3N*RADO(IPL+1)+A4N*RADO(IPL+2))+
     *                        RADLYR(I)+RADLYB(I)*TRTEMP
                  TRALYR(I) = TRALYR(I)*TRTEMP
   70          CONTINUE
C
            ELSEIF (IPATHL.EQ.3) THEN
C
               DO 80 I = NL, NLIM, LL
                  IPL = IPL+LLM1
C
C     INTERPOLATE THE OLD TRANSMISSION
C
                  TRAOI = A1N*TRAO(IPL-1)+A2N*TRAO(IPL)+
     *                    A3N*TRAO(IPL+1)+A4N*TRAO(IPL+2)
C
C     INTERPOLATE THE OLD RADIANCE
C
                  RADLYR(I) = A1N*RADO(IPL-1)+A2N*RADO(IPL)+
     *                        A3N*RADO(IPL+1)+A4N*RADO(IPL+2)+
     *                        RADLYR(I)*TRAOI
                  TRALYR(I) = TRALYR(I)*TRAOI
   80          CONTINUE
C
            ELSEIF (IPATHL.EQ.-1) THEN
C
               VI = V1P-DVP
               DVI = DVP*FLOAT(LL)
               VIDVRF = VI
               RFLAST = -1
               NLIM1 = 0
               NLIM2 = NL-1
C
   90          NLIM1 = NLIM2+1
C
               VI = V1P+FLOAT(NLIM1-1)*DVP
               REFLCT = REFLFN(VI,DVI,VIDVRF,RFDEL,RFLAST)
C
               IF (VIDVRF.GE.9.E+4) THEN
                  NLIM2 = NLIM+1
               ELSE
                  NLIM2 = (VIDVRF+DVI-DVP-V1P)/DVP+1.001
               ENDIF
               NLIM2 = MIN(NLIM2,NLIM)
C
C              Test to make sure LL divides evenly into (NLIM2-NLIM1+1)
C
               NRMNDR = MOD(NLIM2-NLIM1,LL)
               IF ((NRMNDR.NE.0).AND.(NLIM2+(LL-NRMNDR).LT.2400)) THEN
                  NLIM2 = NLIM2+(LL-NRMNDR)
               ENDIF
               DO 100 I = NLIM1, NLIM2, LL
                  IPL = IPL+LLM1
C
C     INTERPOLATE THE OLD TRANSMISSION
C
                  TRAOI = A1N*TRAO(IPL-1)+A2N*TRAO(IPL)+
     *                    A3N*TRAO(IPL+1)+A4N*TRAO(IPL+2)
C
                  TRTEMP = TRALYR(I)*TRAOI
C
C     INTERPOLATE THE OLD RADIANCE
C
                  RADLYR(I) = TRALYR(I)*(A1N*RADO(IPL-1)+A2N*RADO(IPL)+
     *                        A3N*RADO(IPL+1)+A4N*RADO(IPL+2))+
     *                        RADLYR(I)+RADLYB(I)*TRAOI*TRTEMP*REFLCT
                  TRALYR(I) = TRTEMP
C
C           Increment interpolation values
C
                  REFLCT = REFLCT+RFDEL
                  ILAST = I
  100          CONTINUE
C
               IF (NLIM2.LT.NLIM) THEN
                  NLIM2 = ILAST + LL -1
                  GO TO 90
               ENDIF
C
            ENDIF
C
         ENDIF
C
  110 CONTINUE
C
      NPL = IPL
C
      RETURN
C
      END
C
C     ----------------------------------------------------------------
C

      SUBROUTINE RADINT (NPTS,LFILE,MFILE,JPATHL,TBND) 1,30
C
      IMPLICIT REAL*8           (V)
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C               LAST MODIFICATION:    5 APRIL 1991
C
C                  IMPLEMENTATION:    R.D. WORSHAM
C
C             ALGORITHM REVISIONS:    S.A. CLOUGH
C                                     R.D. WORSHAM
C                                     J.L. MONCET
C
C
C                     ATMOSPHERIC AND ENVIRONMENTAL RESEARCH INC.
C                     840 MEMORIAL DRIVE,  CAMBRIDGE, MA   02139
C
C----------------------------------------------------------------------
C
C               WORK SUPPORTED BY:    THE ARM PROGRAM
C                                     OFFICE OF ENERGY RESEARCH
C                                     DEPARTMENT OF ENERGY
C
C
C      SOURCE OF ORIGINAL ROUTINE:    AFGL LINE-BY-LINE MODEL
C
C                                             FASCOD3
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
      COMMON RADN(2410),TRAN(2410),RADLYR(-1:4818)
      COMMON /MANE/ P0,TEMP0,NLAYER,DVXM,H2OSLF,WTOT,ALBAR,ADBAR,AVBAR,
     *              AVFIX,LAYDUM,SECNT0,SAMPLE,DVSET,ALFAL0,AVMASS,
     *              DPTMIN,DPTFAC,ALTAV,AVTRAT,TDIFF1,TDIFF2,ALTD1,
     *              ALTD2,ANGLE,IANT,LTGNT,LH1,LH2,IPFLAG,PLAY,TLAY,
     *              EXTID(10)
      COMMON /CONSTS/ PI,PLANCK,BOLTZ,CLIGHT,AVOG,RADCN1,RADCN2
C
      character*8      XID,       HMOLID,      YID
      real*8               SECANT,       XALTZ
C
      COMMON /EMHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4),
     *               WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1 ,V2 ,TBOUND,
     *               EMISIV,FSCDID(17),NMOL,LAYER ,YI1,YID(10),LSTWDF
      COMMON /OPANL/ V1PO,V2PO,DVPO,NLIMO
      COMMON /XPANEL/ V1P,V2P,DVP,NLIM,RMIN,RMAX,NPNLXP,NSHIFT,NPTSS
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL,
     *              NLTEFL,LNFIL4,LNGTH4
      COMMON /XMI/ TRALYR(-1:4818)
      COMMON /RMRG/ XKT,XKTA,XKTB,SECNT
C
      DIMENSION XFILHD(2),PNLHDR(2),OPNLHD(2)
      DIMENSION A1(0:100),A2(0:100),A3(0:100),A4(0:100)
      DIMENSION RADO(2),TRAO(2)
      DIMENSION WKSAV(35)
C
      DIMENSION RADLYB(-1:4818)
C
      CHARACTER*40 CYID
C
      EQUIVALENCE (XFILHD(1),XID(1)) , (PNLHDR(1),V1P),
     *            (OPNLHD(1),V1PO)
      EQUIVALENCE (RADN(1),RADO(1)) , (TRAN(1),TRAO(1)),
     *            (FSCDID(4),IAERSL) , (FSCDID(5),IEMIT),
     *            (FSCDID(7),IPLOT) , (FSCDID(8),IPATHL),
     *            (FSCDID(16),LAYR1)
C
C     ************************************************************
C     ****** THIS SUBROUTINE DOES LAYER MERGE FOR EMISSION  ******
C     ****** USING FOUR POINT GENERAL INTERPOLATION         ******
C     ************************************************************
C
      CALL CPUTIM (TIME)
      WRITE (IPR,900) TIME
      NPANLS = 0
      TIMEM = 0.0
      TIMRD = 0.0
      TIMTB = 0.0
      TIMOT = 0.0
C
      CALL BUFIN (LFILE,LEOF,XFILHD(1),NFHDRF)
      DVL = DV
      LAY1SV = LAYR1
      PL = PAVE
      TL = TAVE
      WTOTL = 0.
      DO 10 MOL = 1, NMOL
         WTOTL = WTOTL+WK(MOL)
         WKSAV(MOL) = WK(MOL)
   10 CONTINUE
      WTOTL = WTOTL+WBROAD
      WN2SAV = WBROAD
C
C     FOR AEROSOL RUNS, MOVE YID (LFILE) INTO YID (MFILE)
C
      IF (IAERSL.GT.0) WRITE (CYID,'(5A8)') (YID(I),I=3,7)
      CALL BUFIN (KFILE,KEOF,XFILHD(1),NFHDRF)
      IF (IAERSL.GT.0) READ (CYID,'(5A8)') (YID(I),I=3,7)
      IF (JPATHL.GE.1) IPATHL = JPATHL
      PLAY = PAVE
      TLAY = TAVE
      XKT = TAVE/RADCN2
      XKTA = TZU/RADCN2
      XKTB = 0.
      DVK = DV
      LAYR1 = LAY1SV
      FACT = 1.
      IF (IPATHL.EQ.2.AND.IANT.EQ.0) FACT = 2.
      ATYPE = 9.999E09
      IF (DVK.EQ.DVL) ATYPE = 0.
      IF (DVL.GT.DVK) ATYPE = DVK/(DVL-DVK)+0.5
      IF (DVL.LT.DVK) ATYPE = -DVL/(DVK-DVL)-0.5
C
C     IF (ATYPE .GT. 0) STOP  ' RADINT; ATYPE GT 0 '
C
      WTOTK = 0.
      WRITE (IPR,905) LAYR1,LAYER,KFILE,LFILE,MFILE,ATYPE
      IEMIT = 1
      DO 20 MOL = 1, NMOL
         WTOTK = WTOTK+WK(MOL)*FACT
         WK(MOL) = WK(MOL)*FACT+WKSAV(MOL)
   20 CONTINUE
      WTOTK = WTOTK+WBROAD*FACT
      WBROAD = WBROAD*FACT+WN2SAV
      PAVE = (PL*WTOTL+PAVE*WTOTK)/(WTOTL+WTOTK)
      TAVE = (TL*WTOTL+TAVE*WTOTK)/(WTOTL+WTOTK)
      SECANT = 0.
      DV = DVL
C
C     WK IS NOW THE ACCUMULATED SUM OF THE COLUMN DENSITIES
C
      CALL BUFOUT (MFILE,XFILHD(1),NFHDRF)
      DVXM = DV
C
      IF (ATYPE.EQ.0.) THEN
C
C     1/1 RATIO ONLY
C
   30    CONTINUE
         CALL CPUTIM (TIMEM1)
         CALL EMIN (V1P,V2P,DVP,NLIM,KFILE,RADLYR(1),RADLYB(1),
     *              TRALYR(1),KEOF,NPANLS)
         CALL CPUTIM (TIMEM2)
         TIMEM = TIMEM+TIMEM2-TIMEM1
         IF (KEOF.LE.0) GO TO 110
         CALL BUFIN (LFILE,LEOF,OPNLHD(1),NPHDRF)
         CALL BUFIN (LFILE,LEOF,RADO(1),NLIMO)
         CALL BUFIN (LFILE,LEOF,TRAO(1),NLIMO)
         CALL CPUTIM (TIMEM3)
         TIMRD = TIMRD+TIMEM3-TIMEM2
         DO 40 I = 1, NLIM
            RADN(I) = RADO(I)+RADLYR(I)*TRAO(I)
            TRAN(I) = TRALYR(I)*TRAO(I)
   40    CONTINUE
         CALL CPUTIM (TIMEM1)
         IF (TBND.GT.0.)
     *       CALL EMBND (V1PO,V2PO,DVPO,NLIMO,RADN,TRAN,TBND)
         CALL CPUTIM (TIMEM2)
         TIMTB = TIMTB+TIMEM2-TIMEM1
         CALL EMOUT (V1PO,V2PO,DVPO,NLIMO,RADN,TRAN,MFILE,NPTS,NPANLS)
         CALL CPUTIM (TIMEM3)
         TIMOT = TIMOT+TIMEM3-TIMEM2
         GO TO 30
C
      ENDIF
C
C     ALL RATIOS EXCEPT 1/1
C
      DO 50 JP = 0, 100
         APG = JP
         P = 0.01*APG
C
C     THE FOLLOW ARE THE CONSTANTS FOR THE LAGRANGE 4 POINT
C     INTERPOLATION
C
         A1(JP) = -P*(P-1.0)*(P-2.0)/6.0
         A2(JP) = (P**2-1.0)*(P-2.0)*0.5
         A3(JP) = -P*(P+1.0)*(P-2.0)*0.5
         A4(JP) = P*(P**2-1.0)/6.0
   50 CONTINUE
C
C     *** BEGINNING OF LOOP THAT DOES MERGE  ***
C
      NPE = 0
      RADLYR(0) = 0.0
      TRALYR(0) = 0.0
      V1P = 0.0
      V2P = 0.0
      DVP = 0.0
      V1PO = 0.0
      V2PO = 0.0
      DVPO = 0.0
      KEOF = 1
C
   60 CONTINUE
C
      CALL CPUTIM (TIMEM1)
      CALL BUFIN (LFILE,LEOF,OPNLHD(1),NPHDRF)
      IF (LEOF.LE.0) GO TO 110
      CALL BUFIN (LFILE,LEOF,RADO(1),NLIMO)
      CALL BUFIN (LFILE,LEOF,TRAO(1),NLIMO)
      CALL CPUTIM (TIMEM2)
      TIMRD = TIMRD+TIMEM2-TIMEM1
      II = 1
C
      IF (V2P.LE.V2PO+DVP .AND. KEOF.GT.0) THEN
   70    CALL CPUTIM (TIMEM2)
         CALL EMIN (V1P,V2P,DVP,NLIM,KFILE,RADLYR(NPE+1),RADLYB(NPE+1),
     *              TRALYR(NPE+1),KEOF,NPANLS)
         CALL CPUTIM (TIMEM3)
         TIMEM = TIMEM+TIMEM3-TIMEM2
         IF (KEOF.LE.0) GO TO 80
         V1P = V1P-FLOAT(NPE)*DVP
         NPE = NLIM+NPE
         IF (V2P.LE.V2PO+DVP) GO TO 70
      ENDIF
C
C     ZERO POINT OF FIRST PANEL
C
   80 IF (RADLYR(0).EQ.0.0.AND.TRALYR(0).EQ.0.0) THEN
         TRALYR(-1) = TRALYR(1)
         RADLYR(-1) = RADLYR(1)
         RADLYB(-1) = RADLYB(1)
         TRALYR(0) = TRALYR(1)
         RADLYR(0) = RADLYR(1)
         RADLYB(0) = RADLYB(1)
      ENDIF
C
C     END POINT OF LAST PANEL
C
      IF (V2P+DVP.GE.V2) THEN
         TRALYR(NPE+1) = TRALYR(NPE)
         RADLYR(NPE+1) = RADLYR(NPE)
         RADLYB(NPE+1) = RADLYB(NPE)
         TRALYR(NPE+2) = TRALYR(NPE)
         RADLYR(NPE+2) = RADLYR(NPE)
         RADLYB(NPE+2) = RADLYB(NPE)
      ENDIF
C
C     NPL IS LOCATION OF FIRST ELEMENT ON ARRAYS RADO AND TRAO
C
      NPL = 1
C
      RATDV = DVL/DVK
C
C     FJJ IS OFFSET BY 2. FOR ROUNDING PURPOSES
C
      FJ1DIF = (V1PO-V1P)/DVP+1.+2.
C
C     ***** BEGINNING OF LOOP THAT DOES MERGE  *****
C
      DO 90 II = 1, NLIMO
C
         FJJ = FJ1DIF+RATDV*FLOAT(II-1)
         JJ = IFIX(FJJ)-2
C
         JP = (FJJ-FLOAT(JJ))*100.-199.5
C
C     INTERPOLATE THE OLD EMISSION
C
         RADN(II) = RADO(II)+(A1(JP)*RADLYR(JJ-1)+A2(JP)*RADLYR(JJ)+
     *              A3(JP)*RADLYR(JJ+1)+A4(JP)*RADLYR(JJ+2))*TRAO(II)
C
C     INTERPOLATE THE OLD TRANSMISSION
C
         TRAN(II) = (A1(JP)*TRALYR(JJ-1)+A2(JP)*TRALYR(JJ)+
     *              A3(JP)*TRALYR(JJ+1)+A4(JP)*TRALYR(JJ+2))*TRAO(II)
C
   90 CONTINUE
C
      NPL = JJ-1
C
      CALL CPUTIM (TIMEM1)
      IF (TBND.GT.0.) CALL EMBND (V1PO,V2PO,DVPO,NLIMO,RADN,TRAN,TBND)
      CALL CPUTIM (TIMEM2)
      TIMTB = TIMTB+TIMEM2-TIMEM1
      CALL EMOUT (V1PO,V2PO,DVPO,NLIMO,RADN,TRAN,MFILE,NPTS,NPANLS)
      CALL CPUTIM (TIMEM3)
      TIMOT = TIMOT+TIMEM3-TIMEM2
C
C     NPL IS NOW LOCATION OF FIRST ELEMENT TO BE USED FOR NEXT PASS
C
      IPL = -2
      DO 100 NL = NPL, NPE
         IPL = IPL+1
         TRALYR(IPL) = TRALYR(NL)
         RADLYR(IPL) = RADLYR(NL)
         RADLYB(IPL) = RADLYB(NL)
  100 CONTINUE
C
      V1P = V1P+FLOAT(NPL+1)*DVP
      NPE = IPL
C
      GO TO 60
  110 CONTINUE
C
      CALL CPUTIM (TIME1)
      TIM = TIME1-TIME
      WRITE (IPR,910) TIME1,TIM,TIMEM,TIMRD,TIMTB,TIMOT
C
      RETURN
C
  900 FORMAT ('0 THE TIME AT THE START OF RADINT IS ',F12.3)
  905 FORMAT ('0 INITIAL LAYER',I5,'  FINAL LAYER',I5,/,'0 FILE ',I5,
     *        ' MERGED WITH FILE ',I5,' ONTO FILE',I5,'  WITH XTYPE=',
     *        G15.5)
  910 FORMAT ('0 THE TIME AT THE END OF RADINT IS ',F12.3/F12.3,
     *        ' SECS WERE REQUIRED FOR THIS MERGE  - EMIN - ',F12.3,
     *        ' - READ - ',F12.3,' - EMBND - ',F12.3,' - EMOUT - ',
     *        F12.3)
C
      END
C
C     ----------------------------------------------------------------
C

      SUBROUTINE EMBND (V1PO,V2PO,DVPO,NLIMO,NEWEM,NEWTR,TBND) 7,6
C
      IMPLICIT REAL*8           (V)
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C               LAST MODIFICATION:    9 APRIL 1991
C
C                  IMPLEMENTATION:    R.D. WORSHAM
C
C             ALGORITHM REVISIONS:    S.A. CLOUGH
C                                     R.D. WORSHAM
C                                     J.L. MONCET
C
C
C                     ATMOSPHERIC AND ENVIRONMENTAL RESEARCH INC.
C                     840 MEMORIAL DRIVE,  CAMBRIDGE, MA   02139
C
C----------------------------------------------------------------------
C
C               WORK SUPPORTED BY:    THE ARM PROGRAM
C                                     OFFICE OF ENERGY RESEARCH
C                                     DEPARTMENT OF ENERGY
C
C
C      SOURCE OF ORIGINAL ROUTINE:    AFGL LINE-BY-LINE MODEL
C
C                                             FASCOD3
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
      DIMENSION NEWEM(*),NEWTR(*)
      COMMON /CONSTS/ PI,PLANCK,BOLTZ,CLIGHT,AVOG,RADCN1,RADCN2
C
      REAL NEWEM,NEWTR
C
      XKTBND = TBND/RADCN2
      VI = V1PO-DVPO
      VIDVBD = VI
      VIDVEM = VI
      BBLAST = -1.
      EMLAST = -1.
      NLIM1 = 0
      NLIM2 = 0
      EMDUM = 0.
      BBDUM = 0.
      EMISIV = EMISFN(VI,DVPO,VIDVEM,EMDEL,EMDUM)
      BB = BBFN(VI,DVPO,V2PO,XKTBND,VIDVBD,BBDEL,BBDUM)
      IEMBB = 0
      IF (VIDVBD.GT.VIDVEM) IEMBB = 1
C
   10 NLIM1 = NLIM2+1
C
      VI = V1PO+FLOAT(NLIM1-1)*DVPO
      IF (IEMBB.EQ.0) THEN
         BB = BBFN(VI,DVPO,V2PO,XKTBND,VIDV,BBDEL,BBLAST)
         VIDVEM = -VIDV
         EMISIV = EMISFN(VI,DVPO,VIDVEM,EMDEL,EMLAST)
      ELSE
         EMISIV = EMISFN(VI,DVPO,VIDV,EMDEL,EMLAST)
         VIDVBD = -VIDV
         BB = BBFN(VI,DVPO,V2PO,XKTBND,VIDVBD,BBDEL,BBLAST)
      ENDIF
C
      IF (VIDV.GE.9.E+4) THEN
         NLIM2 = NLIMO+1
      ELSE
         NLIM2 = (VIDV-V1PO)/DVPO+1.001
      ENDIF
      NLIM2 = MIN(NLIM2,NLIMO)
C
      DO 20 J = NLIM1, NLIM2
         NEWEM(J) = NEWEM(J)+NEWTR(J)*EMISIV*BB
C
C        Increment interpolation values
C
         BB = BB+BBDEL
         EMISIV = EMISIV+EMDEL
   20 CONTINUE
C
      IF (NLIM2.LT.NLIMO) GO TO 10
C
      RETURN
C
      END
C
C     ----------------------------------------------------------------
C

      SUBROUTINE EMOUT (V1P,V2P,DVP,NLIM,NEWEM,NEWTR,MFILE,NPTS,NPANLS) 12,3
C
      IMPLICIT REAL*8           (V)
C
C     SUBROUTINE EMOUT OUTPUTS MERGED EMISSION AND TRANSMITTANCE RESULT
C     TO MFILE
C
      COMMON /BUFPNL/ V1PBF,V2PBF,DVPBF,NLIMBF
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL,
     *              NLTEFL,LNFIL4,LNGTH4
      DIMENSION PNLHDR(2)
      DIMENSION NEWEM(*),NEWTR(*)
C
      EQUIVALENCE (PNLHDR(1),V1PBF)
C
      REAL NEWEM,NEWTR
C
      NPANLS = NPANLS+1
      V1PBF = V1P
      V2PBF = V2P
      DVPBF = DVP
      NLIMBF = NLIM
C
      CALL BUFOUT (MFILE,PNLHDR(1),NPHDRF)
      CALL BUFOUT (MFILE,NEWEM(1),NLIMBF)
      CALL BUFOUT (MFILE,NEWTR(1),NLIMBF)
C
      IF (NPTS.GT.0) THEN
         IF (NPANLS.EQ.1) WRITE (IPR,900)
         WRITE (IPR,905)
         NNPTS = NPTS
         IF (NPTS.GT.(NLIMBF/2)+1) NNPTS = (NLIMBF/2)+1
         JEND = NLIMBF-NNPTS+1
         DO 10 J = 1, NNPTS
            VJ = V1PBF+FLOAT(J-1)*DVPBF
            K = J+JEND-1
            VK = V1PBF+FLOAT(K-1)*DVPBF
            WRITE (IPR,910) J,VJ,NEWEM(J),NEWTR(J),
     *                      K,VK,NEWEM(K),NEWTR(K)
   10    CONTINUE
      ENDIF
C
      RETURN
C
  900 FORMAT ('0 ','LOCATION  WAVENUMBER',2X,'RADIANCE',7X,
     *        'TRANSMITTANCE',22X,'LOCATION   WAVENUMBER',2X,
     *        'RADIANCE',7X,'TRANSMITTANCE')
  905 FORMAT (' ')
  910 FORMAT (I8,2X,F12.6,1P2E15.7,20X,I8,2X,0PF12.6,1P2E15.7)
C
      END
C
C     ---------------------------------------------------------------
C

      SUBROUTINE OPNODF(NLAYER,LAYER,PTHODL,HFMODL,IEMIT) 4
C
C     This subroutine opens file for calculating the radiance using
C     precalculated optical depths
C     (IEMIT = 1,IMRG=A/12,B/22,C/32,40,41)
C
      LOGICAL OP
      CHARACTER*57 FILE1
      CHARACTER*55 PTHODL
      CHARACTER*11 CFORM
      CHARACTER*10 HFMODL
C
C     -------------------------
C     Common block for analytic derivative
C     -------------------------
      COMMON /ADRFIL/ KODFIL,KODTOT,KTEMP,KFILAD
C     -------------------------
C
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL,
     *              NLTEFL,LNFIL4,LNGTH4
C
C           123456789-123456789-123456789-123456789-123456789-1234567
      DATA FILE1 /
     *     '                                                         '/
      DATA CFORM / 'UNFORMATTED' /
C
C     For calculation of analytic derivative, open previously
C     calculated optical depth files as unit KODFIL.  Otherwise,
C     open as KFILE.
C
      IF (IEMIT.EQ.3) THEN
         KOPEN = KODFIL
      ELSE
         KOPEN = KFILE
      ENDIF
C
      WRITE(IPR,910) LAYER,NLAYER
      INQUIRE (UNIT=KOPEN,OPENED=OP)
      IF (OP) CLOSE (KOPEN)
      WRITE(FILE1,HFMODL) PTHODL,LAYER
      OPEN(UNIT=KOPEN,FILE=FILE1,FORM=CFORM,STATUS='OLD')
C
C     Write procedure
C
      WRITE(IPR,900) FILE1
C
      RETURN
C
 900  FORMAT ('          Opened layer optical depth file:  ',A57)
 910  FORMAT ('LAYER ',I5,' OF ',I5,':')
C
      END
C
C     ---------------------------------------------------------------
C

      SUBROUTINE OPNRAD(NLAYER,LAYER) 2
C
C     This subroutine opens file for calculating the layer radiances
C     (IEMIT = 1; IMRG=45,46)
C
      LOGICAL OP
      CHARACTER*57 FILE1
      CHARACTER*11 CFORM
      CHARACTER*55 PTHRAD
      CHARACTER*10 HFMRAD
C
C     Common block for layer radiances
C     -------------------------
      COMMON /RADLAY/ PTHRAD,HFMRAD
C     -------------------------
C
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL,
     *              NLTEFL,LNFIL4,LNGTH4
C
C           123456789-123456789-123456789-123456789-123456789-1234567
      DATA FILE1 /
     *     '                                                         '/
      DATA CFORM / 'UNFORMATTED' /
C
      INQUIRE (UNIT=NFILE,OPENED=OP)
      IF (OP) CLOSE (NFILE)
      WRITE(FILE1,HFMRAD) PTHRAD,LAYER
      OPEN(UNIT=NFILE,FILE=FILE1,FORM=CFORM,STATUS='UNKNOWN')
C
C     Write procedure
C
      WRITE(IPR,900) FILE1
C
      RETURN
C
 900  FORMAT ('          Opened layer radiance file:  ',A57,/)
 910  FORMAT ('LAYER ',I5,' OF ',I5,':')
C
      END
C
C     ---------------------------------------------------------------
C

      SUBROUTINE OPNDRV(NLAYER,LAYER,LAYTOT) 2
C
C     This subroutine opens file for calculating the layer derivatives
C     (IEMIT = 3)
C
      LOGICAL OP
      CHARACTER*57 FILE1,FILE2,FILE3
      CHARACTER*11 CFORM
      CHARACTER*55 CDUM1,PTHODI,PTHODT,PTHRDR
      CHARACTER*10 HFMODI,HFMODT,HFMRDR
C
C     Common block for analytic derivatives
C     -------------------------
      COMMON /ADRPNM/ CDUM1,PTHODI,PTHODT,PTHRDR
      COMMON /ADRFRM/ HFMODI,HFMODT,HFMRDR
      COMMON /ADRFIL/ KODFIL,KODTOT,KTEMP,KFILAD
C     -------------------------
C
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL,
     *              NLTEFL,LNFIL4,LNGTH4
C
C           123456789-123456789-123456789-123456789-123456789-1234567
      DATA FILE1 /
     *     '                                                         '/,
     *     FILE2 /
     *     '                                                         '/,
     *     FILE3 /
     *     '                                                         '/
      DATA CFORM / 'UNFORMATTED' /
C
      WRITE(IPR,910) LAYER,NLAYER
      INQUIRE (UNIT=KODFIL,OPENED=OP)
      IF (OP) CLOSE (KODFIL)
      WRITE(FILE1,HFMODI) PTHODI,LAYER
      OPEN(UNIT=KODFIL,FILE=FILE1,FORM=CFORM,STATUS='OLD')
C
      IF (LAYER.NE.NLAYER) THEN
         INQUIRE (UNIT=KODTOT,OPENED=OP)
         IF (OP) CLOSE (KODTOT)
         WRITE(FILE2,HFMODT) PTHODT,LAYTOT
         OPEN(UNIT=KODTOT,FILE=FILE2,FORM=CFORM,STATUS='OLD')
      ELSE
         FILE2 = 'NOT USED'
      ENDIF
C
      INQUIRE (UNIT=KTEMP,OPENED=OP)
      IF (OP) CLOSE (KTEMP)
      OPEN(UNIT=KTEMP,FILE='mono_ad.TMP',FORM=CFORM,STATUS='unknown')
C
      INQUIRE (UNIT=KFILAD,OPENED=OP)
      IF (OP) CLOSE (KFILAD)
      WRITE(FILE3,HFMRDR) PTHRDR,LAYER
      OPEN(UNIT=KFILAD,FILE=FILE3,FORM=CFORM,STATUS='UNKNOWN')
C
C     Write procedure
C
      WRITE(IPR,900) FILE1,FILE2,FILE3
C
      RETURN
C
 900  FORMAT ('          Opened layer optical depth file:  ',A57,/,
     *        '    Opened accumulated optical depth file:  ',A57,/,
     *        '    Opened layer analytic derivative file:  ',A57)
 910  FORMAT ('LAYER ',I5,' OF ',I5,':')
C
      END
C
C     ----------------------------------------------------------------
C

      SUBROUTINE EMDM (V1P,V2P,DVP,NLIM,KFILE,EM,EMB,TR,KEOF,NPANLS) 2,70
C
      IMPLICIT REAL*8           (V)
C
C     SUBROUTINE EMDM INPUTS OPTICAL DEPTH VALUES FROM KFILE AND
C       CALCULATES SOURCE FUNCTION FOR THE LAYER.
C       THIS VERSION WORKS FOR AEROSOLS AND NLTE.
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C               LAST MODIFICATION:    14 AUGUST 1991
C
C                  IMPLEMENTATION:    R.D. WORSHAM
C
C             ALGORITHM REVISIONS:    S.A. CLOUGH
C                                     R.D. WORSHAM
C                                     J.L. MONCET
C
C
C                     ATMOSPHERIC AND ENVIRONMENTAL RESEARCH INC.
C                     840 MEMORIAL DRIVE,  CAMBRIDGE, MA   02139
C
C----------------------------------------------------------------------
C
C               WORK SUPPORTED BY:    THE ARM PROGRAM
C                                     OFFICE OF ENERGY RESEARCH
C                                     DEPARTMENT OF ENERGY
C
C
C      SOURCE OF ORIGINAL ROUTINE:    AFGL LINE-BY-LINE MODEL
C
C                                             FASCOD3
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
      character*8      XID,       HMOLID,      YID
      real*8               SECANT,       XALTZ
C
      COMMON /FILHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4),
     *                WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1 ,V2 ,TBOUND,
     *                EMISIV,FSCDID(17),NMOL,LAYRS ,YI1,YID(10),LSTWDF
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KDUMY,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL,
     *              NLTEFL,LNFIL4,LNGTH4
      COMMON /LAMCHN/ ONEPL,ONEMI,EXPMIN,ARGMIN
      COMMON /BUFPNL/ V1PBF,V2PBF,DVPBF,NLIMBF
      COMMON /RMRG/ XKT,XKTA,XKTB,SECNT
      COMMON /EMDMSV/ BBSAV(2410),BBASAV(2410),XXSAV(2410)
C
      DIMENSION PNLHDR(2),EM(*),EMB(*),TR(*)
C
      EQUIVALENCE (FSCDID(1),IHIRAC) , (FSCDID(2),ILBLF4)
      EQUIVALENCE (PNLHDR(1),V1PBF)
      EQUIVALENCE (FSCDID(4),IAERSL)
C
      CALL BUFIN (KFILE,KEOF,PNLHDR(1),NPHDRF)

      IF (KEOF.LE.0) RETURN
      CALL BUFIN (KFILE,KEOF,TR(1),NLIMBF)
C
C     TR CONTAINS THE OPTICAL DEPTHS AT THIS STAGE
C
      IF (IHIRAC.EQ.4) CALL BUFIN (KFILE,KEOF,EM(1),NLIMBF)
C
C     EM CONTAINS THE OPTICAL DEPTH CORRECTIONS FOR NLTE AT THIS STAGE
C
      IF (NPANLS.LT.1.AND.IAERSL.EQ.0) WRITE (IPR,900)
      IF (NPANLS.LT.1.AND.IAERSL.NE.0) WRITE (IPR,905)
C
      EXT = 0.
      ADEL = 0.
      RADFN0 = 0.
      RDEL = 0.
      BB = 0.
      BBDEL = 0.
      BBA = 0.
      BBDLA = 0.
      BBB = 0.
      BBDLB = 0.
C
      V1P = V1PBF
      V2P = V2PBF
      DVP = DVPBF
      NLIM = NLIMBF
      VI = V1P-DVP
      VIDV = VI
      VIBB = VI
      VAER = VI
      VDUM = VI
      BBLAST = -1.
      BBLXTA = -2.
      BBLXTB = -3.
      RDLAST = -1.
      BBDUM = -4.
      RDDUM = -1.
      NLIM1 = 0
      NLIM2 = 0
C
      AA = 0.278
C
      IF (IAERSL.NE.0) THEN
         BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBDUM)
         RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDDUM)
         EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
         IAFBB = 0
         IF (VITST.LT.VAER.AND.VITST.LT.VIBB) IAFBB = 1
         IF (VAER.LT.VITST.AND.VAER.LT.VIBB) IAFBB = 2
      ELSE
         IAFBB = -1
      ENDIF
C
C     - THIS SECTION TREATS THE CASE WHERE THE LAYER CONTRIBUTES
C       TO THE RADIATIVE TRANSFER ONLY ONCE
C
C     - WITH XKTA=0 THIS ALGORITHM REVERTS TO THE ORIGINAL
C
      IF (XKTB.LE.0.) THEN
C
C     - THIS SECTION TREATS THE LTE CASE
C
         IF (IHIRAC.NE.4) THEN
C
   10       NLIM1 = NLIM2+1
C
            VI = V1P+FLOAT(NLIM1-1)*DVP
            IF (IAFBB.EQ.-1) THEN
               BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
            ELSEIF (IAFBB.EQ.0) THEN
               BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               VITST = -VIDV
               RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
               VAER = -VIDV
               EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
            ELSEIF (IAFBB.EQ.1) THEN
               RADFN0 = RADFNI(VI,DVP,XKT,VIDV,RDEL,RDLAST)
               VIBB = -VIDV
               BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               VAER = -VIDV
               EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
            ELSEIF (IAFBB.EQ.2) THEN
               EXT = AERF(VI,DVP,VIDV,ADEL,TAUSCT,TDEL,GFACT,GDEL)
               VIBB = -VIDV
               BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               VITST = -VIDV
               RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
            ENDIF
C
            NLIM2 = (VIDV-V1P)/DVP+1.001
            NLIM2 = MIN(NLIM2,NLIM)
C
            DO 20 I = NLIM1, NLIM2
               ODVI = TR(I)+EXT*RADFN0
               XX = AA*ODVI
C
               TR(I) = EXP(-ODVI)
               EM(I) = (1.-TR(I))*(BB+XX*BBA)/(1.+XX)
C
C              Store BB, BBA, and XX for derivative source term
C
               XXSAV(I)  = XX
               BBSAV(I)  = BB
               BBASAV(I) = BBA
C
C              Increment interpolation values
C
               EXT = EXT+ADEL
               RADFN0 = RADFN0+RDEL
               BB = BB+BBDEL
               BBA = BBA+BBDLA
   20       CONTINUE
C
            IF (NLIM2.LT.NLIM) GO TO 10
         ELSE
C
C     - THIS SECTION TREATS THE NLTE CASE
C
   30       NLIM1 = NLIM2+1
C
            VI = V1P+FLOAT(NLIM1-1)*DVP
            IF (IAFBB.EQ.-1) THEN
               BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
            ELSEIF (IAFBB.EQ.0) THEN
               BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               VITST = -VIDV
               RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
               VAER = -VIDV
               EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
            ELSEIF (IAFBB.EQ.1) THEN
               RADFN0 = RADFNI(VI,DVP,XKT,VIDV,RDEL,RDLAST)
               VIBB = -VIDV
               BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               VAER = -VIDV
               EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
            ELSEIF (IAFBB.EQ.2) THEN
               EXT = AERF(VI,DVP,VIDV,ADEL,TAUSCT,TDEL,GFACT,GDEL)
               VIBB = -VIDV
               BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               VITST = -VIDV
               RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
            ENDIF
C
            NLIM2 = (VIDV-V1P)/DVP+1.001
            NLIM2 = MIN(NLIM2,NLIM)
C
            DO 40 I = NLIM1, NLIM2
               ODVI = TR(I)+EXT*RADFN0
               XX = AA*ODVI
C
               TR(I) = EXP(-ODVI)
               EM(I) = (1.-TR(I))*(1.0-EM(I)/ODVI)*(BB+XX*BBA)/(1.+XX)
C
C              Increment interpolation values
C
               EXT = EXT+ADEL
               RADFN0 = RADFN0+RDEL
               BB = BB+BBDEL
               BBA = BBA+BBDLA
   40       CONTINUE
C
            IF (NLIM2.LT.NLIM) GO TO 30
C
         ENDIF
      ELSE
C
C     - THIS SECTION TREATS THE CASE WHERE THE LAYER CONTRIBUTES
C       TO THE RADIATIVE TRANSFER TWICE:
C
C     - FOR TANGENT PATHS AND FOR THE CASE OF THE REFLECTED ATMOSPHERE
C
         IF (IHIRAC.NE.4) THEN
C
C     - THIS SECTION TREATS THE LTE CASE
C
   50       NLIM1 = NLIM2+1
C
            VI = V1P+FLOAT(NLIM1-1)*DVP
            IF (IAFBB.EQ.-1) THEN
               BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               IF (XKTB.GT.0.) THEN
                  VIBB = -VIDV
                  BBB = BBFN(VI,DVP,V2P,XKTB,VIBB,BBDLB,BBLXTB)
               ELSE
                  BBB = BB
                  BBDLB = BBDEL
               ENDIF
            ELSEIF (IAFBB.EQ.0) THEN
               BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               IF (XKTB.GT.0.) THEN
                  VIBB = -VIDV
                  BBB = BBFN(VI,DVP,V2P,XKTB,VIBB,BBDLB,BBLXTB)
               ELSE
                  BBB = BB
                  BBDLB = BBDEL
               ENDIF
               VITST = -VIDV
               RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
               VAER = -VIDV
               EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
            ELSEIF (IAFBB.EQ.1) THEN
               RADFN0 = RADFNI(VI,DVP,XKT,VIDV,RDEL,RDLAST)
               VIBB = -VIDV
               BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               IF (XKTB.GT.0.) THEN
                  VIBB = -VIDV
                  BBB = BBFN(VI,DVP,V2P,XKTB,VIBB,BBDLB,BBLXTB)
               ELSE
                  BBB = BB
                  BBDLB = BBDEL
               ENDIF
               VAER = -VIDV
               EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
            ELSEIF (IAFBB.EQ.2) THEN
               EXT = AERF(VI,DVP,VIDV,ADEL,TAUSCT,TDEL,GFACT,GDEL)
               VIBB = -VIDV
               BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               IF (XKTB.GT.0.) THEN
                  VIBB = -VIDV
                  BBB = BBFN(VI,DVP,V2P,XKTB,VIBB,BBDLB,BBLXTB)
               ELSE
                  BBB = BB
                  BBDLB = BBDEL
               ENDIF
               VITST = -VIDV
               RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
            ENDIF
C
            NLIM2 = (VIDV-V1P)/DVP+1.001
            NLIM2 = MIN(NLIM2,NLIM)
C
            DO 60 I = NLIM1, NLIM2
               ODVI = TR(I)+EXT*RADFN0
               XX = AA*ODVI
C
               TR(I) = EXP(-ODVI)
               EMX = (1.-TR(I))/(1.+XX)
               EM(I) = EMX*(BB+XX*BBA)
               EMB(I) = EMX*(BB+XX*BBB)
C
C              Increment interpolation values
C
               EXT = EXT+ADEL
               RADFN0 = RADFN0+RDEL
               BB = BB+BBDEL
               BBA = BBA+BBDLA
               BBB = BBB+BBDLB
   60       CONTINUE
C
            IF (NLIM2.LT.NLIM) GO TO 50
C
         ELSE
C
C     - THIS SECTION TREATS THE CASE OF NLTE
C
   70       NLIM1 = NLIM2+1
C
            VI = V1P+FLOAT(NLIM1-1)*DVP
            IF (IAFBB.EQ.-1) THEN
               BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               IF (XKTB.GT.0.) THEN
                  VIBB = -VIDV
                  BBB = BBFN(VI,DVP,V2P,XKTB,VIBB,BBDLB,BBLXTB)
               ELSE
                  BBB = BB
                  BBDLB = BBDEL
               ENDIF
            ELSEIF (IAFBB.EQ.0) THEN
               BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               IF (XKTB.GT.0.) THEN
                  VIBB = -VIDV
                  BBB = BBFN(VI,DVP,V2P,XKTB,VIBB,BBDLB,BBLXTB)
               ELSE
                  BBB = BB
                  BBDLB = BBDEL
               ENDIF
               VITST = -VIDV
               RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
               VAER = -VIDV
               EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
            ELSEIF (IAFBB.EQ.1) THEN
               RADFN0 = RADFNI(VI,DVP,XKT,VIDV,RDEL,RDLAST)
               VIBB = -VIDV
               BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               IF (XKTB.GT.0.) THEN
                  VIBB = -VIDV
                  BBB = BBFN(VI,DVP,V2P,XKTB,VIBB,BBDLB,BBLXTB)
               ELSE
                  BBB = BB
                  BBDLB = BBDEL
               ENDIF
               VAER = -VIDV
               EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
            ELSEIF (IAFBB.EQ.2) THEN
               EXT = AERF(VI,DVP,VIDV,ADEL,TAUSCT,TDEL,GFACT,GDEL)
               VIBB = -VIDV
               BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               IF (XKTB.GT.0.) THEN
                  VIBB = -VIDV
                  BBB = BBFN(VI,DVP,V2P,XKTB,VIBB,BBDLB,BBLXTB)
               ELSE
                  BBB = BB
                  BBDLB = BBDEL
               ENDIF
               VITST = -VIDV
               RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
            ENDIF
C
            NLIM2 = (VIDV-V1P)/DVP+1.001
            NLIM2 = MIN(NLIM2,NLIM)
C
            DO 80 I = NLIM1, NLIM2
               ODVI = TR(I)+EXT*RADFN0
               XX = AA*ODVI
C
               TR(I) = EXP(-ODVI)
               EMX = (1.-TR(I))*(1.0-EM(I)/ODVI)/(1.+XX)
               EM(I) = EMX*(BB+XX*BBA)
               EMB(I) = EMX*(BB+XX*BBB)
C
C              Increment interpolation values
C
               EXT = EXT+ADEL
               RADFN0 = RADFN0+RDEL
               BB = BB+BBDEL
               BBA = BBA+BBDLA
               BBB = BBB+BBDLB
   80       CONTINUE
C
            IF (NLIM2.LT.NLIM) GO TO 70
C
         ENDIF
      ENDIF
C
      RETURN
C
  900 FORMAT ('0EMISSION AND TRANSMISSION  (MOLECULAR) ')
  905 FORMAT ('0EMISSION AND TRANSMISSION (AEROSOLS EFFECTS INCLUDED)')
C
      END
C
C     ---------------------------------------------------------------

      SUBROUTINE EMDT (V1P,V2P,DVP,NLIM,KFILE,EM,EMB,TR,KEOF,NPANLS) 1,74
C
      IMPLICIT REAL*8           (V)
C
C     SUBROUTINE EMDT inputs optical depth values from kfile and
C       calculates source function for the layer.
C
C       This version is used for analytic temperature derivatives.
C       Non-LTE and limb not yet implemented.
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C                  IMPLEMENTATION:    P.D. Brown
C
C                     ATMOSPHERIC AND ENVIRONMENTAL RESEARCH INC.
C                     840 MEMORIAL DRIVE,  CAMBRIDGE, MA   02139
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
      character*8      XID,       HMOLID,      YID
      real*8               SECANT,       XALTZ
C
      COMMON /FILHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4),
     *                WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1 ,V2 ,TBOUND,
     *                EMISIV,FSCDID(17),NMOL,LAYRS ,YI1,YID(10),LSTWDF
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KDUMY,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL,
     *              NLTEFL,LNFIL4,LNGTH4
      COMMON /LAMCHN/ ONEPL,ONEMI,EXPMIN,ARGMIN
      COMMON /BUFPNL/ V1PBF,V2PBF,DVPBF,NLIMBF
      COMMON /RMRG/ XKT,XKTA,XKTB,SECNT
      COMMON /EMDMSV/ BBSAV(2410),BBASAV(2410),XXSAV(2410)
      COMMON /EMDTSV/ BBDSAV(2410)
C
      DIMENSION PNLHDR(2),EM(*),EMB(*),TR(*)
C
      EQUIVALENCE (FSCDID(1),IHIRAC) , (FSCDID(2),ILBLF4)
      EQUIVALENCE (PNLHDR(1),V1PBF)
      EQUIVALENCE (FSCDID(4),IAERSL)
C
      CALL BUFIN (KFILE,KEOF,PNLHDR(1),NPHDRF)
      IF (KEOF.LE.0) RETURN
      CALL BUFIN (KFILE,KEOF,TR(1),NLIMBF)
C
C     TR contains the optical depths at this stage
C
      IF (IHIRAC.EQ.4) CALL BUFIN (KFILE,KEOF,EM(1),NLIMBF)
C
C     EM contains the optical depth corrections for nlte at this stage
C
      IF (NPANLS.LT.1.AND.IAERSL.EQ.0) WRITE (IPR,900)
      IF (NPANLS.LT.1.AND.IAERSL.NE.0) WRITE (IPR,905)
C
      EXT = 0.
      ADEL = 0.
      RADFN0 = 0.
      RDEL = 0.
      BB = 0.
      BBDEL = 0.
      BBA = 0.
      BBDLA = 0.
      BBB = 0.
      BBDLB = 0.
      BBD = 0.
      BBADDL = 0.
C
      V1P = V1PBF
      V2P = V2PBF
      DVP = DVPBF
      NLIM = NLIMBF
      VI = V1P-DVP
      VIDV = VI
      VIBB = VI
      VAER = VI
      VDUM = VI
      BBLAST = -1.
      BBLXTA = -2.
      BBLXTB = -3.
      RDLAST = -1.
      BBDUM = -4.
      RDDUM = -1.
      NLIM1 = 0
      NLIM2 = 0
C
      AA = 0.278
C
      IF (IAERSL.NE.0) THEN
         BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBDUM)
         RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDDUM)
         EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
         IAFBB = 0
         IF (VITST.LT.VAER.AND.VITST.LT.VIBB) IAFBB = 1
         IF (VAER.LT.VITST.AND.VAER.LT.VIBB) IAFBB = 2
      ELSE
         IAFBB = -1
      ENDIF
C
C     - THIS SECTION TREATS THE CASE WHERE THE LAYER CONTRIBUTES
C       TO THE RADIATIVE TRANSFER ONLY ONCE
C
C     - WITH XKTA=0 THIS ALGORITHM REVERTS TO THE ORIGINAL
C
      IF (XKTB.LE.0.) THEN
C
C     - THIS SECTION TREATS THE LTE CASE
C
         IF (IHIRAC.NE.4) THEN
C
   10       NLIM1 = NLIM2+1
C
            VI = V1P+FLOAT(NLIM1-1)*DVP
            IF (IAFBB.EQ.-1) THEN
               BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
               BBD = BBAD(BB,VI,DVP,V2P,XKT,VIDD,BBADDL,BBADOL)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
            ELSEIF (IAFBB.EQ.0) THEN
               BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
               BBD = BBAD(BB,VI,DVP,V2P,XKT,VIDD,BBADDL,BBADOL)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               VITST = -VIDV
               RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
               VAER = -VIDV
               EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
            ELSEIF (IAFBB.EQ.1) THEN
               RADFN0 = RADFNI(VI,DVP,XKT,VIDV,RDEL,RDLAST)
               VIBB = -VIDV
               BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
               BBD = BBAD(BB,VI,DVP,V2P,XKT,VIDD,BBADDL,BBADOL)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               VAER = -VIDV
               EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
            ELSEIF (IAFBB.EQ.2) THEN
               EXT = AERF(VI,DVP,VIDV,ADEL,TAUSCT,TDEL,GFACT,GDEL)
               VIBB = -VIDV
               BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
               BBD = BBAD(BB,VI,DVP,V2P,XKT,VIDD,BBADDL,BBADOL)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               VITST = -VIDV
               RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
            ENDIF
C
            NLIM2 = (VIDV-V1P)/DVP+1.001
            NLIM2 = MIN(NLIM2,NLIM)
C
            DO 20 I = NLIM1, NLIM2
               ODVI = TR(I)+EXT*RADFN0
C
               XX = AA*ODVI
C
               TR(I) = EXP(-ODVI)
               EM(I) = (1.-TR(I))*(BB+XX*BBA)/(1.+XX)
C
C              Store BB, BBA, BBD, and XX for derivative source term
C
               XXSAV(I)  = XX
               BBSAV(I)  = BB
               BBASAV(I) = BBA
               BBDSAV(I) = BBD
C
C              Increment interpolation values
C
               EXT = EXT+ADEL
               RADFN0 = RADFN0+RDEL
               BB = BB+BBDEL
               BBA = BBA+BBDLA
               BBD = BBD+BBADDL
   20       CONTINUE
C
            IF (NLIM2.LT.NLIM) GO TO 10
         ELSE
C
C     - THIS SECTION TREATS THE NLTE CASE
C
   30       NLIM1 = NLIM2+1
C
            VI = V1P+FLOAT(NLIM1-1)*DVP
            IF (IAFBB.EQ.-1) THEN
               BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
            ELSEIF (IAFBB.EQ.0) THEN
               BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               VITST = -VIDV
               RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
               VAER = -VIDV
               EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
            ELSEIF (IAFBB.EQ.1) THEN
               RADFN0 = RADFNI(VI,DVP,XKT,VIDV,RDEL,RDLAST)
               VIBB = -VIDV
               BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               VAER = -VIDV
               EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
            ELSEIF (IAFBB.EQ.2) THEN
               EXT = AERF(VI,DVP,VIDV,ADEL,TAUSCT,TDEL,GFACT,GDEL)
               VIBB = -VIDV
               BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               VITST = -VIDV
               RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
            ENDIF
C
            NLIM2 = (VIDV-V1P)/DVP+1.001
            NLIM2 = MIN(NLIM2,NLIM)
C
            DO 40 I = NLIM1, NLIM2
               ODVI = TR(I)+EXT*RADFN0
C
               XX = AA*ODVI
C
               TR(I) = EXP(-ODVI)
               EM(I) = (1.-TR(I))*(1.0-EM(I)/ODVI)*(BB+XX*BBA)/(1.+XX)
C
C              Increment interpolation values
C
               EXT = EXT+ADEL
               RADFN0 = RADFN0+RDEL
               BB = BB+BBDEL
               BBA = BBA+BBDLA
   40       CONTINUE
C
            IF (NLIM2.LT.NLIM) GO TO 30
C
         ENDIF
      ELSE
C
C     - THIS SECTION TREATS THE CASE WHERE THE LAYER CONTRIBUTES
C       TO THE RADIATIVE TRANSFER TWICE:
C
C     - FOR TANGENT PATHS AND FOR THE CASE OF THE REFLECTED ATMOSPHERE
C
         IF (IHIRAC.NE.4) THEN
C
C     - THIS SECTION TREATS THE LTE CASE
C
   50       NLIM1 = NLIM2+1
C
            VI = V1P+FLOAT(NLIM1-1)*DVP
            IF (IAFBB.EQ.-1) THEN
               BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               IF (XKTB.GT.0.) THEN
                  VIBB = -VIDV
                  BBB = BBFN(VI,DVP,V2P,XKTB,VIBB,BBDLB,BBLXTB)
               ELSE
                  BBB = BB
                  BBDLB = BBDEL
               ENDIF
            ELSEIF (IAFBB.EQ.0) THEN
               BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               IF (XKTB.GT.0.) THEN
                  VIBB = -VIDV
                  BBB = BBFN(VI,DVP,V2P,XKTB,VIBB,BBDLB,BBLXTB)
               ELSE
                  BBB = BB
                  BBDLB = BBDEL
               ENDIF
               VITST = -VIDV
               RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
               VAER = -VIDV
               EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
            ELSEIF (IAFBB.EQ.1) THEN
               RADFN0 = RADFNI(VI,DVP,XKT,VIDV,RDEL,RDLAST)
               VIBB = -VIDV
               BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               IF (XKTB.GT.0.) THEN
                  VIBB = -VIDV
                  BBB = BBFN(VI,DVP,V2P,XKTB,VIBB,BBDLB,BBLXTB)
               ELSE
                  BBB = BB
                  BBDLB = BBDEL
               ENDIF
               VAER = -VIDV
               EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
            ELSEIF (IAFBB.EQ.2) THEN
               EXT = AERF(VI,DVP,VIDV,ADEL,TAUSCT,TDEL,GFACT,GDEL)
               VIBB = -VIDV
               BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               IF (XKTB.GT.0.) THEN
                  VIBB = -VIDV
                  BBB = BBFN(VI,DVP,V2P,XKTB,VIBB,BBDLB,BBLXTB)
               ELSE
                  BBB = BB
                  BBDLB = BBDEL
               ENDIF
               VITST = -VIDV
               RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
            ENDIF
C
            NLIM2 = (VIDV-V1P)/DVP+1.001
            NLIM2 = MIN(NLIM2,NLIM)
C
            DO 60 I = NLIM1, NLIM2
               ODVI = TR(I)+EXT*RADFN0
               XX = AA*ODVI
C
               TR(I) = EXP(-ODVI)
               EMX = (1.-TR(I))/(1.+XX)
               EM(I) = EMX*(BB+XX*BBA)
               EMB(I) = EMX*(BB+XX*BBB)
C
C              Increment interpolation values
C
               EXT = EXT+ADEL
               RADFN0 = RADFN0+RDEL
               BB = BB+BBDEL
               BBA = BBA+BBDLA
               BBB = BBB+BBDLB
   60       CONTINUE
C
            IF (NLIM2.LT.NLIM) GO TO 50
C
         ELSE
C
C     - THIS SECTION TREATS THE CASE OF NLTE
C
   70       NLIM1 = NLIM2+1
C
            VI = V1P+FLOAT(NLIM1-1)*DVP
            IF (IAFBB.EQ.-1) THEN
               BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               IF (XKTB.GT.0.) THEN
                  VIBB = -VIDV
                  BBB = BBFN(VI,DVP,V2P,XKTB,VIBB,BBDLB,BBLXTB)
               ELSE
                  BBB = BB
                  BBDLB = BBDEL
               ENDIF
            ELSEIF (IAFBB.EQ.0) THEN
               BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               IF (XKTB.GT.0.) THEN
                  VIBB = -VIDV
                  BBB = BBFN(VI,DVP,V2P,XKTB,VIBB,BBDLB,BBLXTB)
               ELSE
                  BBB = BB
                  BBDLB = BBDEL
               ENDIF
               VITST = -VIDV
               RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
               VAER = -VIDV
               EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
            ELSEIF (IAFBB.EQ.1) THEN
               RADFN0 = RADFNI(VI,DVP,XKT,VIDV,RDEL,RDLAST)
               VIBB = -VIDV
               BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               IF (XKTB.GT.0.) THEN
                  VIBB = -VIDV
                  BBB = BBFN(VI,DVP,V2P,XKTB,VIBB,BBDLB,BBLXTB)
               ELSE
                  BBB = BB
                  BBDLB = BBDEL
               ENDIF
               VAER = -VIDV
               EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
            ELSEIF (IAFBB.EQ.2) THEN
               EXT = AERF(VI,DVP,VIDV,ADEL,TAUSCT,TDEL,GFACT,GDEL)
               VIBB = -VIDV
               BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
               IF (XKTA.GT.0.) THEN
                  VIBB = -VIDV
                  BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
               ELSE
                  BBA = BB
                  BBDLA = BBDEL
               ENDIF
               IF (XKTB.GT.0.) THEN
                  VIBB = -VIDV
                  BBB = BBFN(VI,DVP,V2P,XKTB,VIBB,BBDLB,BBLXTB)
               ELSE
                  BBB = BB
                  BBDLB = BBDEL
               ENDIF
               VITST = -VIDV
               RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
            ENDIF
C
            NLIM2 = (VIDV-V1P)/DVP+1.001
            NLIM2 = MIN(NLIM2,NLIM)
C
            DO 80 I = NLIM1, NLIM2
               ODVI = TR(I)+EXT*RADFN0
C
               XX = AA*ODVI
C
               TR(I) = EXP(-ODVI)
               EMX = (1.-TR(I))*(1.0-EM(I)/ODVI)/(1.+XX)
               EM(I) = EMX*(BB+XX*BBA)
               EMB(I) = EMX*(BB+XX*BBB)
C
C              Increment interpolation values
C
               EXT = EXT+ADEL
               RADFN0 = RADFN0+RDEL
               BB = BB+BBDEL
               BBA = BBA+BBDLA
               BBB = BBB+BBDLB
   80       CONTINUE
C
            IF (NLIM2.LT.NLIM) GO TO 70
C
         ENDIF
      ENDIF
C
      RETURN
C
  900 FORMAT ('0EMISSION AND TRANSMISSION  (MOLECULAR) ')
  905 FORMAT ('0EMISSION AND TRANSMISSION (AEROSOLS EFFECTS INCLUDED)')
C
      END
C
C     ---------------------------------------------------------------
C

      SUBROUTINE EMADL1 (NPTS,MFILE,JPATHL,TBND) 1,33
C
      IMPLICIT REAL*8           (V)
C
C     Calculates radiance and radiance derivative for first layer
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C                  IMPLEMENTATION:    P.D. Brown
C
C                     ATMOSPHERIC AND ENVIRONMENTAL RESEARCH INC.
C                     840 MEMORIAL DRIVE,  CAMBRIDGE, MA   02139
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
      COMMON NEWEM(2410),NEWTR(2410)
      COMMON /MANE/ P0,TEMP0,NLAYER,DVXM,H2OSLF,WTOT,ALBAR,ADBAR,AVBAR,
     *              AVFIX,LAYER,SECNT0,SAMPLE,DVSET,ALFAL0,AVMASS,
     *              DPTMIN,DPTFAC,ALTAV,AVTRAT,TDIFF1,TDIFF2,ALTD1,
     *              ALTD2,ANGLE,IANT,LTGNT,LH1,LH2,IPFLAG,PLAY,TLAY,
     *              EXTID(10)
      COMMON /CONSTS/ PI,PLANCK,BOLTZ,CLIGHT,AVOG,RADCN1,RADCN2
C
      character*8      XID,       HMOLID,      YID
      real*8               SECANT,       XALTZ
C
      COMMON /EMIHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4),
     *                WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1 ,V2 ,TBOUND,
     *                EMISIV,FSCDID(17),NMOL,LAYDUM,YI1,YID(10),LSTWDF
      COMMON /BNDPRP/ TMPBND,BNDEMI(3),BNDRFL(3),IBPROP
      COMMON /OPANL/ V1PO,V2PO,DVPO,NLIMO
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KFILE,KPANEL,LINFIL,NFILA,IAFIL,IEXFIL,
     *              NLTEFL,LNFIL4,LNGTH4
      COMMON /RMRG/ XKT,XKTA,XKTB,SECNT
      COMMON /ADRLYR/ KSUBL(0:5000),OPDT(0:5000)
      COMMON /ADRFIL/ KODFIL,KODTOT,KTEMP,KFILAD
      COMMON /IADFLG/ IANDER,NSPCRT
C
      CHARACTER*40 CEXT,CYID
C
      DIMENSION EMLAYB(2410)
      DIMENSION XFILHD(2),OPNLHD(2),XFHDUM(2)
      DIMENSION EMLAYR(2),TRLAYR(2)
      DIMENSION XKMOLC(2),ODACUM(2)
      DIMENSION RPRIME(2410),OLDEM(0:5000)
C
      EQUIVALENCE (XFILHD(1),XID(1)) , (OPNLHD(1),V1PO)
      EQUIVALENCE (NEWEM(1),EMLAYR(1)) , (NEWTR(1),TRLAYR(1)),
     *            (KSUBL(1),XKMOLC(1)) , (OPDT(1),ODACUM(1)),
     *            (FSCDID(4),IAERSL) , (FSCDID(5),IEMIT),
     *            (FSCDID(7),IPLOT) , (FSCDID(8),IPATHL),
     *            (FSCDID(16),LAYR1)
C
      REAL NEWEM,NEWTR
C
      DATA NDIM / 2410 /,ND2 / 5000 /
C
C     TBND IS THE BOUNDARY BLACK BODY TEMPERATUE
C
C     IPATHL =-1 IS FOR THE LOOKING DOWN CASE WITH REFLECTED ATMOSPHERE
C     IPATHL = 0 IS FOR THE HORIZONTAL PATH CASE (HOMOGENEOUS LAYER)
C     IPATHL = 1 IS FOR THE LOOKING DOWN CASE (TO DENSER LAYERS)
C     IPATHL = 2 IS FOR THE SYMMETRIC TANGENT PATH CASE
C     IPATHL = 3 IS FOR THE LOOKING UP CASE (TO LESS DENSE LAYERS
C
      CALL CPUTIM (TIME)
C
C      ** NOTE ON IPATHL =2
C           THE TANGENT MERGE ROUTINES ARE DIVIDED INTO ANTERIOR (1ST)
C           AND POSTERIOR (2ND) LAYER CROSSINGS.  THIS RECOGNITION IS
C           TRIGGERED BY THE VALUE OF "IANT"
C
C          IF  IANT.EQ. 1  THEN POSTERIOR MERGE
C          IF  IANT.EQ. 0  THEN NORMAL MERGE
C          IF  IANT.EQ.-1  THEN ANTERIOR MERGE
C
      WRITE (IPR,900) TIME
      NPANLS = 0
C
C     Read in file headers for layer absorptance coefficients and
C     layer optical depths and total optical depths (if there is more th
C     one layer between the present layer and the observer)
C
      CALL BUFIN (KFILE,KEOF,XFHDUM(1),NFHDRF)
      IF (LAYER.LT.NLAYER) CALL BUFIN (KODTOT,KEOF,XFILHD(1),NFHDRF)
      CALL BUFIN (KODFIL,KEOF,XFILHD(1),NFHDRF)
C
      IF (JPATHL.GE.1) IPATHL = JPATHL
      PLAY = PAVE
      TLAY = TAVE
C
C     FOR AEROSOL RUNS, MOVE EXTID INTO YID
C
      IF (IAERSL.GT.0) THEN
         WRITE (CEXT,'(10A4)') EXTID
         WRITE (CYID,'(5A8)') (YID(I),I=3,7)
         CYID(19:40) = CEXT(19:40)
         READ (CYID,'(5A8)') (YID(I),I=3,7)
      ENDIF
C
C     IF BOUNDARY PROPERTIES ARE SUPPLIED, AND DOWNWARD LOOKING
C     CASE; SET IPATHL TO REFLECTED ATMOSPHERE CASE
C
      IF (IBPROP.EQ.1.AND.IPATHL.EQ.1) IPATHL = -1
      IEMIT = 1
      FACT = 1.
      TIMEM = 0.0
      IF (IPATHL.EQ.2.AND.IANT.EQ.0) FACT = 2.
      DO 10 MOL = 1, NMOL
         WK(MOL) = WK(MOL)*FACT
   10 CONTINUE
      WBROAD = WBROAD*FACT
      LAYR1 = LAYER
      WRITE (IPR,905) LAYR1,LAYER,KFILE,MFILE
      CALL BUFOUT (MFILE,XFILHD(1),NFHDRF)
      CALL BUFOUT (KTEMP,XFILHD(1),NFHDRF)
      DVXM = DV
      XKT = TAVE/RADCN2
      XKTBND = TBND/RADCN2
      IF (IPATHL.EQ.-1) THEN
         XKTA = TZU/RADCN2
         XKTB = TZL/RADCN2
      ENDIF
      IF (IPATHL.EQ.0) THEN
         XKTA = 0.
         XKTB = 0.
      ENDIF
      IF (IPATHL.EQ.1) THEN
         XKTA = TZU/RADCN2
         XKTB = 0.
      ENDIF
      IF (IPATHL.EQ.2) THEN
         XKTA = TZU/RADCN2
         XKTB = TZL/RADCN2
      ENDIF
      IF (IPATHL.EQ.3) THEN
         XKTA = TZL/RADCN2
         XKTB = 0.
      ENDIF
      WRITE (IPR,910) IPATHL,IANT
C
   20 CONTINUE
C
C
C     Input emission and transmission, and calculate layer
C     source function
C
C     Call EMDT for temperature retrieval
C     Call EMDM for molecular retrieval
C
C
      CALL CPUTIM (TIMEM1)
      IF (NSPCRT.EQ.29) THEN
         CALL EMDT (V1PO,V2PO,DVPO,NLIMO,KODFIL,EMLAYR,EMLAYB,
     *        TRLAYR,KEOF,NPANLS)
      ELSEIF (NSPCRT.GT.0) THEN
         CALL EMDM (V1PO,V2PO,DVPO,NLIMO,KODFIL,EMLAYR,EMLAYB,
     *        TRLAYR,KEOF,NPANLS)
      ENDIF
      CALL CPUTIM (TIMEM2)
      TIMEM = TIMEM+TIMEM2-TIMEM1
      IF (KEOF.LE.0) GO TO 80
      VI = V1PO-DVPO
      VIDVBD = VI
      VIDVEM = VI
      VIDVRF = VI
      BBLAST = -1.
      EMLAST = -1.
      RFLAST = -1.
      IF (IPATHL.EQ.2.AND.IANT.EQ.0) THEN
         DO 30 J = 1, NLIMO
            TRJ = TRLAYR(J)
            NEWEM(J) = EMLAYR(J)+EMLAYB(J)*TRJ
            TRLAYR(J) = TRLAYR(J)*TRJ
   30    CONTINUE
      ELSEIF (((IPATHL.EQ.1).AND.(TBND.GT.0.)).OR.(IPATHL.EQ.3)) THEN
C
         NLIM1 = 0
         NLIM2 = 0
         EMDUM = 0.
         BBDUM = 0.
         EMISIV = EMISFN(VI,DVPO,VIDVEM,EMDEL,EMDUM)
         BB = BBFN(VI,DVPO,V2PO,XKTBND,VIDVBD,BBDEL,BBDUM)
         IEMBB = 0
         IF (VIDVBD.GT.VIDVEM) IEMBB = 1
C
   40    NLIM1 = NLIM2+1
C
         VI = V1PO+FLOAT(NLIM1-1)*DVPO
         IF (IEMBB.EQ.0) THEN
            BB = BBFN(VI,DVPO,V2PO,XKTBND,VIDV,BBDEL,BBLAST)
            VIDVEM = -VIDV
            EMISIV = EMISFN(VI,DVPO,VIDVEM,EMDEL,EMLAST)
         ELSE
            EMISIV = EMISFN(VI,DVPO,VIDV,EMDEL,EMLAST)
            VIDVBD = -VIDV
            BB = BBFN(VI,DVPO,V2PO,XKTBND,VIDVBD,BBDEL,BBLAST)
         ENDIF
C
         IF (VIDV.GE.9.E+4) THEN
            NLIM2 = NLIMO+1
         ELSE
            NLIM2 = (VIDV-V1PO)/DVPO+1.001
         ENDIF
         NLIM2 = MIN(NLIM2,NLIMO)
C
         DO 50 J = NLIM1, NLIM2
            OLDEM(J) = BB*EMISIV
            NEWEM(J) = EMLAYR(J)+TRLAYR(J)*OLDEM(J)
C
C           Increment interpolation values
C
            EMISIV = EMISIV+EMDEL
            BB = BB+BBDEL
   50    CONTINUE
C
         IF (NLIM2.LT.NLIMO) GO TO 40
C
      ELSEIF ((IPATHL.EQ.-1).AND.(TBND.GT.0.)) THEN
C
         NLIM1 = 0
         NLIM2 = 0
         EMDUM = 0.
         RFDUM = 0.
         BBDUM = 0.
         EMISIV = EMISFN(VI,DVPO,VIDVEM,EMDEL,EMDUM)
         REFLCT = REFLFN(VI,DVPO,VIDVRF,RFDEL,RFDUM)
         BB = BBFN(VI,DVPO,V2PO,XKTBND,VIDVBD,BBDEL,BBDUM)
         IEMBB = 0
         IF (VIDVEM.LT.VIDVRF.AND.VIDVEM.LT.VIDVBD) IEMBB = 1
         IF (VIDVRF.LT.VIDVEM.AND.VIDVRF.LT.VIDVBD) IEMBB = 2
C
   60    NLIM1 = NLIM2+1
C
         VI = V1PO+FLOAT(NLIM1-1)*DVPO
         IF (IEMBB.EQ.0) THEN
            BB = BBFN(VI,DVPO,V2PO,XKTBND,VIDV,BBDEL,BBLAST)
            VIDVEM = -VIDV
            EMISIV = EMISFN(VI,DVPO,VIDVEM,EMDEL,EMLAST)
            VIDVRF = -VIDV
            REFLCT = REFLFN(VI,DVPO,VIDVRF,RFDEL,RFLAST)
         ELSEIF (IEMBB.EQ.1) THEN
            EMISIV = EMISFN(VI,DVPO,VIDV,EMDEL,EMLAST)
            VIDVBD = -VIDV
            BB = BBFN(VI,DVPO,V2PO,XKTBND,VIDVBD,BBDEL,BBLAST)
            VIDVRF = -VIDV
            REFLCT = REFLFN(VI,DVPO,VIDVRF,RFDEL,RFLAST)
         ELSE
            REFLCT = REFLFN(VI,DVPO,VIDV,RFDEL,RFLAST)
            VIDVBD = -VIDV
            BB = BBFN(VI,DVPO,V2PO,XKTBND,VIDVBD,BBDEL,BBLAST)
            VIDVEM = -VIDV
            EMISIV = EMISFN(VI,DVPO,VIDVEM,EMDEL,EMLAST)
         ENDIF
C
         IF (VIDV.GE.9.E+4) THEN
            NLIM2 = NLIMO+1
         ELSE
            NLIM2 = (VIDV-V1PO)/DVPO+1.001
         ENDIF
         NLIM2 = MIN(NLIM2,NLIMO)
C
         DO 70 J = NLIM1, NLIM2
            NEWEM(J) = EMLAYR(J)+EMLAYB(J)*REFLCT*TRLAYR(J)+
     *                 TRLAYR(J)*BB*EMISIV
C
C           Increment interpolation values
C
            BB = BB+BBDEL
            EMISIV = EMISIV+EMDEL
            REFLCT = REFLCT+RFDEL
   70    CONTINUE
C
         IF (NLIM2.LT.NLIMO) GO TO 60
C
      ENDIF
C
C     Output radiance to MFILE
C
      CALL EMOUT (V1PO,V2PO,DVPO,NLIMO,NEWEM,NEWTR,MFILE,NPTS,NPANLS)
C
C     Combine terms of analytic layer radiance derivative
C
C     -------------------------------
C     Analytic Derivative calculation
C     -------------------------------
C
C
C     Call TDERIV for temperature retrieval
C     Call ADERIV for molecular retrieval
C
C     If molecular retrieval:
C     Input layer absorptance coefficients and accumulated
C     transmittances and calculate layer derivatives
C
C     If temperature retrieval:
C     Input Planck function derivative and layer
C     transmittances and calculate layer derivatives
C
      IF (NSPCRT.EQ.29) THEN
         CALL TDERIV (KFILE,KODTOT,RPRIME,OLDEM,TRLAYR,KSUBL,XKMOLC,
     *        OPDT,ODACUM,NLIMO,NDIM,ND2,IPATHL,LAYER,NLAYER,
     *        v1po,dvpo)
      ELSEIF (NSPCRT.GT.0) THEN
         CALL ADERIV (KFILE,KODTOT,RPRIME,OLDEM,TRLAYR,KSUBL,XKMOLC,
     *        OPDT,ODACUM,NLIMO,NDIM,ND2,IPATHL,LAYER,NLAYER,
     *        v1po,dvpo)
      ENDIF
C
C     Output monochromatic radiance derivative to KTEMP
C
      CALL EMOUT (V1PO,V2PO,DVPO,NLIMO,RPRIME,NEWTR,KTEMP,NPTS,NPANLS)
C
      GO TO 20
   80 CALL CPUTIM (TIME1)
      TIME = TIME1-TIME
      WRITE (IPR,915) TIME,TIMEM
C
      RETURN
C
  900 FORMAT (' TIME AT THE START OF --EMADL1-- ',F10.3)
  905 FORMAT ('0 INITIAL LAYER',I5,'  FINAL LAYER',I5,/,
     *        '0 INPUT FILE =',I5,' OUTPUT FILE =',I5)
  910 FORMAT ('0 IPATHL AND IANT',2I5)
  915 FORMAT (' TIME REQUIRED FOR --EMADL1-- ',F10.3,
     *        ' --EMDM-- ',F10.3)
C
      END
C
C     ---------------------------------------------------------------
C

      SUBROUTINE EMADMG (NPTS,LFILE,MFILE,JPATHL,TBND) 1,24
C
      IMPLICIT REAL*8           (V)
C
C     Merges layer radiances when calculating layer
C     radiance derivatives.
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C                  IMPLEMENTATION:    R.D. WORSHAM
C
C                     ATMOSPHERIC AND ENVIRONMENTAL RESEARCH INC.
C                     840 MEMORIAL DRIVE,  CAMBRIDGE, MA   02139
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
      COMMON RADN(2410),TRAN(2410),RADO(0:5000)
      COMMON /MANE/ P0,TEMP0,NLAYER,DVXM,H2OSLF,WTOT,ALBAR,ADBAR,AVBAR,
     *              AVFIX,LAYER,SECNT0,SAMPLE,DVSET,ALFAL0,AVMASS,
     *              DPTMIN,DPTFAC,ALTAV,AVTRAT,TDIFF1,TDIFF2,ALTD1,
     *              ALTD2,ANGLE,IANT,LTGNT,LH1,LH2,IPFLAG,PLAY,TLAY,
     *              EXTID(10)
      COMMON /CONSTS/ PI,PLANCK,BOLTZ,CLIGHT,AVOG,RADCN1,RADCN2
C
      character*8      XID,       HMOLID,      YID
      real*8               SECANT,       XALTZ
C
      COMMON /EMHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4),
     *               WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1 ,V2 ,TBOUND,
     *               EMISIV,FSCDID(17),NMOL,LAYDUM,YI1,YID(10),LSTWDF
      COMMON /BNDPRP/ TMPBND,BNDEMI(3),BNDRFL(3),IBPROP
      COMMON /OPANL/ V1PO,V2PO,DVPO,NLIMO
      COMMON /XPANEL/ V1P,V2P,DVP,NLIM,RMIN,RMAX,NPNLXP,NSHIFT,NPTSS
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL,
     *              NLTEFL,LNFIL4,LNGTH4
      COMMON /XME/ TRAO(0:5000)
      COMMON /RMRG/ XKT,XKTA,XKTB,SECNT
      COMMON /ADRLYR/ KSUBL(0:5000),OPDT(0:5000)
      COMMON /ADRFIL/ KODFIL,KODTOT,KTEMP,KFILAD
      COMMON /IADFLG/ IANDER,NSPCRT
C
      DIMENSION RADLYB(2410)
      DIMENSION XFILHD(2),PNLHDR(2),OPNLHD(2)
      DIMENSION A1(10),A2(10),A3(10),A4(10)
      DIMENSION RADLYR(2),TRALYR(2),RADOI(2),TRAOI(2)
      DIMENSION WKSAV(35)
      DIMENSION XKMOLC(2),ODACUM(2)
      DIMENSION RPRIME(2410)
C
      CHARACTER*40 CYID
C
      EQUIVALENCE (XFILHD(1),XID(1)) , (PNLHDR(1),V1P),
     *            (OPNLHD(1),V1PO)
      EQUIVALENCE (RADO(1),RADOI(1)) , (TRAO(1),TRAOI(1)),
     *            (KSUBL(1),XKMOLC(1)) , (OPDT(1),ODACUM(1)),
     *            (RADN(1),RADLYR(1)) , (TRAN(1),TRALYR(1)),
     *            (FSCDID(4),IAERSL) , (FSCDID(5),IEMIT),
     *            (FSCDID(7),IPLOT) , (FSCDID(8),IPATHL),
     *            (FSCDID(16),LAYR1)
C
      DATA A1 /10*0.0/, A2 /10*0.0/, A3 /10*0.0/, A4 /10*0.0/
      DATA NDIM / 2410 /,ND2 / 5000 /
C
C
C     IPATHL =-1 IS FOR THE LOOKING DOWN CASE FOR REFLECTED ATMOSPHERE
C     IPATHL = 1 IS FOR THE LOOKING DOWN CASE (TO DENSER LAYERS)
C     IPATHL = 2 IS FOR THE SYMMETRIC TANGENT PATH CASE
C     IPATHL = 3 IS FOR THE LOOKING UP CASE (TO LESS DENSE LAYERS)
C
C
C      ** NOTE ON IPATHL = 2
C            THE TANGENT MERGE ROUTINES ARE DIVIDED INTO ANTERIOR (1ST)
C            AND POSTERIOR (2ND) LAYER CROSSINGS   THIS RECOGNITION IS
C            TRIGGERED BY THE VALUE OF "IANT"
C
C          IF  IANT.EQ. 1  THEN POSTERIOR MERGE
C          IF  IANT.EQ. 0  THEN NORMAL MERGE
C          IF  IANT.EQ.-1  THEN ANTERIOR MERGE
C
      CALL CPUTIM (TIME)
      WRITE (IPR,900) TIME
      NPANLS = 0
      TIMEM = 0.0
      TIMRD = 0.0
      TIMOT = 0.0
C
      CALL BUFIN (LFILE,LEOF,XFILHD(1),NFHDRF)
      LAY1SV = LAYR1
      DVL = DV
      PL = PAVE
      TL = TAVE
      WTOTL = 0.
C
      DO 10 MOL = 1, NMOL
         WTOTL = WTOTL+WK(MOL)
         WKSAV(MOL) = WK(MOL)
   10 CONTINUE
C
      WTOTL = WTOTL+WBROAD
      WN2SAV = WBROAD
C
C     FOR AEROSOL RUNS, MOVE YID (LFILE) INTO YID (MFILE)
C
      IF (IAERSL.GT.0) WRITE (CYID,'(5A8)') (YID(I),I=3,7)
C
C     Read in file headers for layer absorptance coefficients, layer
C     optical depths, and total optical depths (if there is more than
C     one layer between the present layer and the observer)
C
      CALL BUFIN (KFILE,KEOF,XFILHD(1),NFHDRF)
      IF (LAYER.LT.NLAYER) CALL BUFIN (KODTOT,KEOF,XFILHD(1),NFHDRF)
      CALL BUFIN (KODFIL,KEOF,XFILHD(1),NFHDRF)
C
      IF (IAERSL.GT.0) READ (CYID,'(5A8)') (YID(I),I=3,7)
C
      IF (JPATHL.GE.1) IPATHL = JPATHL
      PLAY = PAVE
      TLAY = TAVE
C
C     IF BOUNDARY PROPERTIES ARE SUPPLIED, AND DOWNWARD LOOKING
C     CASE; SET IPATHL TO REFLECTED ATMOSPHERE CASE
C
      IF (IBPROP.EQ.1.AND.IPATHL.EQ.1) IPATHL = -1
      TAVK = TAVE
      DVK = DV
      FACT = 1.
      IF (IPATHL.EQ.2.AND.IANT.EQ.0) FACT = 2.
C
      IF (DVL.EQ.DVK) THEN
         ITYPE = 0
      ELSEIF (DVL.GT.DVK) THEN
         ITYPE = DVK/(DVL-DVK)+0.5
      ELSE
C
C     DVL.LT.DVK
C
         ITYPE = -INT(DVL/(DVK-DVL)+0.5)
      ENDIF
      IF (ITYPE.LT.0) STOP ' EMADMG; ITYPE LT 0 '
C
      WTOTK = 0.
      LAYR1 = LAY1SV
      WRITE (IPR,905) LAYR1,LAYER,KODFIL,LFILE,MFILE
      IEMIT = 1
      DO 20 MOL = 1, NMOL
         WTOTK = WTOTK+WK(MOL)*FACT
         WK(MOL) = WK(MOL)*FACT+WKSAV(MOL)
   20 CONTINUE
      WTOTK = WTOTK+WBROAD*FACT
      WBROAD = WBROAD*FACT+WN2SAV
      PAVE = (PL*WTOTL+PAVE*WTOTK)/(WTOTL+WTOTK)
      TAVE = (TL*WTOTL+TAVE*WTOTK)/(WTOTL+WTOTK)
      SECANT = 0.
C
C     WK IS NOW THE ACCUMULATED SUM OF THE COLUMN DENSITIES
C
      CALL BUFOUT (MFILE,XFILHD(1),NFHDRF)
      CALL BUFOUT (KTEMP,XFILHD(1),NFHDRF)
      DVXM = DV
      XKT = TAVK/RADCN2
C
      WRITE (IPR,910) IPATHL,IANT
C
      IF (IPATHL.EQ.-1) THEN
         XKTA = TZU/RADCN2
         XKTB = TZL/RADCN2
      ELSEIF (IPATHL.EQ.1) THEN
         XKTA = TZU/RADCN2
         XKTB = 0.
      ELSEIF (IPATHL.EQ.2) THEN
         XKTA = TZU/RADCN2
         XKTB = TZL/RADCN2
      ELSEIF (IPATHL.EQ.3) THEN
         XKTA = TZL/RADCN2
         XKTB = 0.
      ELSE
         STOP ' EMADMG; IPATHL '
      ENDIF
C
      ATYPE = ITYPE
      LL = ITYPE+1
      AP = 1.0/(ATYPE+1.0)
C
C     *** BEGINNING OF LOOP THAT DOES MERGE ***
C
      NPE = 0
      RADO(0) = 0.0
      TRAO(0) = 0.0
      V1PO = 0.0
      V2PO = 0.0
      DVPO = 0.0
C
   40 CONTINUE
C
C
C     Input emission and transmission, and calculate layer
C     source function
C
      CALL CPUTIM (TIMEM1)
      CALL EMDM (V1P,V2P,DVP,NLIM,KODFIL,RADLYR,RADLYB,TRALYR,KEOF,
     *           NPANLS)
      CALL CPUTIM (TIMEM2)
      TIMEM = TIMEM+TIMEM2-TIMEM1
      IF (KEOF.LE.0) GO TO 80
C
      II = 1
C
      IF (V2PO.LE.V2P+DVPO) THEN
   50    CALL CPUTIM (TIMEM1)
         CALL BUFIN (LFILE,LEOF,OPNLHD(1),NPHDRF)
         IF (LEOF.LE.0) GO TO 60
         CALL BUFIN (LFILE,LEOF,RADOI(NPE+1),NLIMO)
         CALL BUFIN (LFILE,LEOF,TRAOI(NPE+1),NLIMO)
         CALL CPUTIM (TIMEM2)
         TIMRD = TIMRD+TIMEM2-TIMEM1
         NPE = NLIMO+NPE
         IF (V2PO.LE.V2P+DVPO) GO TO 50
      ENDIF
C
C     ZERO POINT OF FIRST PANEL
C
   60 IF (RADO(0).EQ.0.0.AND.TRAO(0).EQ.0.0) THEN
         RADO(0) = RADO(1)
         TRAO(0) = TRAO(1)
      ENDIF
C
C     END POINT OF LAST PANEL
C
      IF (V2PO+DVPO.GE.V2) THEN
         RADO(NPE+1) = RADO(NPE)
         RADO(NPE+2) = RADO(NPE)
         TRAO(NPE+1) = TRAO(NPE)
         TRAO(NPE+2) = TRAO(NPE)
      ENDIF
C
C     -------------------------------
C     Analytic Derivative calculation
C     -------------------------------
C
C     Call TDERIV for temperature retrieval
C     Call ADERIV for molecular retrieval
C
C     If molecular retrieval:
C     Input layer absorptance coefficients and accumulated
C     transmittances and calculate layer derivatives
C
C     If temperature retrieval:
C     Input Planck function derivative and layer
C     transmittances and calculate layer derivatives
C
      IF (NSPCRT.EQ.29) THEN
         CALL TDERIV (KFILE,KODTOT,RPRIME,RADO,TRALYR,KSUBL,XKMOLC,
     *        OPDT,ODACUM,NLIM,NDIM,ND2,IPATHL,LAYER,NLAYER,
     *        v1p,dvp)
      ELSEIF (NSPCRT.GT.0) THEN
         CALL ADERIV (KFILE,KODTOT,RPRIME,RADO,TRALYR,KSUBL,XKMOLC,
     *        OPDT,ODACUM,NLIM,NDIM,ND2,IPATHL,LAYER,NLAYER,
     *        v1p,dvp)
      ENDIF
C
C     Output monochromatic radiance derivatives to KTEMP
C
      CALL EMOUT (V1P,V2P,DVP,NLIM,RPRIME,TRAN,KTEMP,NPTS,NPANLS)
C
C     --------------------------
C     Layer Radiance Calculation
C     --------------------------
C
      NPL = 1
C
C     NPL IS LOCATION OF FIRST ELEMENT ON ARRAYS RADO AND TRAO
C     Combine terms of layer radiative transfer
C
      CALL RADNN (RADN,TRAN,RADO,TRAO,RADLYB,NLIM,NDIM,ND2,V1P,DVP,
     *           IPATHL,A1,A2,A3,A4,LL,NPL)
C
      CALL CPUTIM (TIMEM1)
C
      IF (TBND.GT.0.) CALL EMBND (V1P,V2P,DVP,NLIM,RADN,TRAN,TBND)
C
C     Output radiance to MFILE
C
      CALL EMOUT (V1P,V2P,DVP,NLIM,RADN,TRAN,MFILE,NPTS,NPANLS)
C
      CALL CPUTIM (TIMEM2)
      TIMOT = TIMOT+TIMEM2-TIMEM1
C
C     NPL IS NOW LOCATION OF FIRST ELEMENT TO BE USED FOR NEXT PASS
C
      IPL = -1
      DO 70 NL = NPL, NPE
         IPL = IPL+1
         RADO(IPL) = RADO(NL)
         TRAO(IPL) = TRAO(NL)
   70 CONTINUE
C
      NPE = IPL
C
      GO TO 40
C
C     End of loop over panels
C
   80 CONTINUE
C
      CALL CPUTIM (TIME1)
      TIM = TIME1-TIME
      WRITE (IPR,915) TIME1,TIM,TIMEM,TIMRD,TIMOT
C
      RETURN
C
C
  900 FORMAT ('0 THE TIME AT THE START OF EMADMG IS ',F12.3)
  905 FORMAT ('0 INITIAL LAYER',I5,'  FINAL LAYER',I5,/,'0 FILE ',I5,
     *        ' MERGED WITH FILE ',I5,' ONTO FILE',I5)
  910 FORMAT ('0 IPATHL AND IANT',2I5)
  915 FORMAT ('0 THE TIME AT THE END OF EMADMG IS ',F12.3/F12.3,
     *        ' SECS WERE REQUIRED FOR THIS MERGE  - EMDM - ',
     *        F12.3,' - READ - ',F12.3,' - EMOUT - ',F12.3)
C
      END
C
C     ---------------------------------------------------------------
C

      SUBROUTINE ADERIV (KFILE,KODTOT,RPRIME,RADO,TRALYR,KSUBL,XKMOLC, 2,4
     *                  OPDT,ODACUM,NLIM,NDIM,ND2,IPATHL,LAYER,NLAYER,
     *     v1po,dvpo)
C
C     This subroutine inputs abosrption coefficient values from
C     KFILE and total transmittance from KODTOT (if there is more
C     than one layer between the present layer and the observer),
C     and then calculates the radiance derivatives
C
      IMPLICIT REAL*8           (V)
      character*8      XID,       HMOLID,      YID
      real*8               SECANT,       XALTZ
C
      REAL KSUBL(0:ND2)
C
      DIMENSION RADO(0:ND2),OPDT(0:ND2)
      DIMENSION RPRIME(NDIM)
      DIMENSION TRALYR(*)
      DIMENSION PNLHDR(2),XKMOLC(2),ODACUM(2)
C
      COMMON /FILHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4),
     *                WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1 ,V2 ,TBOUND,
     *                EMISIV,FSCDID(17),NMOL,LAYRS ,YI1,YID(10),LSTWDF
      COMMON /BUFPNL/ V1P,V2P,DVP,NLIMP
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KDUMY,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL,
     *              NLTEFL,LNFIL4,LNGTH4
      COMMON /EMDMSV/ BBSAV(2410),BBASAV(2410),XXSAV(2410)
C
      EQUIVALENCE (PNLHDR(1),V1P)
C
      CALL BUFIN (KFILE,KEOF,PNLHDR(1),NPHDRF)
      IF (KEOF.LE.0) THEN
         WRITE(*,*) 'End of KFILE ',KFILE
         GOTO 10
      ENDIF
C
C     Set number of words to be input as 2400 or the number of
C     points between the absolute end point V2 and the panel
C     starting point V1P, whichever is smaller.  If you already
C     have the point (from a previous panel), then skip over
C     remaining panels.
C
      XLIMP = (V2-V1P)/DVP + 1.00001
      IF (XLIMP.GT.2400) THEN
         NLIMP = 2400
      ELSEIF (XLIMP.LT.1.) THEN
         GOTO 10
      ELSE
         NLIMP = XLIMP
      ENDIF
C
C     Read in absorptance coefficients
C
      CALL BUFIN (KFILE,KEOF,XKMOLC(1),NLIMP)
C
C     Read in total optical depths if LAYER < NLAYER
C
      IF (LAYER.LT.NLAYER) THEN
         CALL BUFIN (KODTOT,KEOF,PNLHDR(1),NPHDRF)
         IF (KEOF.LE.0) THEN
            WRITE(IPR,900) KODTOT,KFILE
            STOP 'IN SUBROUTINE ADERIV: SEE OUTPUT FILE'
         ENDIF
C
C        Set number of words to be input as 2400 or the number of
C        points between the absolute end point V2 and the panel
C        starting point V1P, whichever is smaller.  If you already
C        have the point (from a previous panel), then skip over
C        remaining panels.
C
         XLIMP = (V2-V1P)/DVP + 1.00001
         IF (XLIMP.GT.2400) THEN
            NLIMP = 2400
         ELSEIF (XLIMP.LT.1.) THEN
            GOTO 10
         ELSE
            NLIMP = XLIMP
         ENDIF
C
C        Read in total optical depths
C
         CALL BUFIN (KODTOT,KEOF,ODACUM(1),NLIMP)
      ENDIF
C
C     Calculate layer derivatives,
C
C     dR/du = T{n-1}*[d{nonsource]/du + d{source}/du], where
C
C             d{nonsource}/du = -Km*exp{-tau}*Rn,
C
C             and
C
C             d{source}/du = (Km/(1+a*tau)) *
C                            [exp{-tau} *
C                            (Bbar + B*a*tau + a*(B-Bbar)/(1+a*tau)) +
C                            a*(B-Bbar)/(1+a*tau)],
C
C             such that
C                  Km is layer absorbtance coefficients
C                  tau is layer optical depths
C                  Rn is the radiance of the layer
C                     previously done
C
C     Numerical substitutions:
C
C               Y = 1/(1+a*tau)
C              YZ = a*(B-Bbar)/(1+a*tau)
C              AA = a
C           XXSAV = a*tau
C           BBSAV = Bbar
C          BBASAV = B
C
C
C     When calculating the derivative of the layer nearest the observer,
C     omit the total accumulated transmittance, TRACCM
C
 10   AA = 0.278
c      write(*,*) 'ipathl = ',ipathl
      IF (IPATHL.EQ.1.OR.IPATHL.EQ.3) THEN
c         write(*,*) 'layer = ',layer,'  nlayer = ',nlayer
         IF (LAYER.NE.NLAYER) THEN
            DO 20 I = 1, NLIM
               vtest = v1po + dvpo*(i-1)
               Y  = 1./(1.+XXSAV(I))
               YZ = Y*AA*(BBASAV(I)-BBSAV(I))
               TRACCM = EXP(-OPDT(I))
               SOURCE = Y*KSUBL(I)*
     *                  (TRALYR(I)*(BBSAV(I)+BBASAV(I)*XXSAV(I)-YZ)+YZ)
               SRCNON = KSUBL(I)*TRALYR(I)*RADO(I)
               RPRIME(I) = TRACCM*(SOURCE - SRCNON)
c               if ((i.le.10).and.(layer.eq.1)) then
c                  write(*,*) '#1  i, gnu = ',i,vtest
c                  write(*,*) '  y = ',y
c                  write(*,*) '  yz = ',yz
c                  write(*,*) '  traccm = ',traccm
c                  write(*,*) '  source = ',source
c                  write(*,*) '       ksubl = ',ksubl(i)
c                  write(*,*) '       tralyr = ',tralyr(i)
c                  write(*,*) '       xxsav = ',xxsav(i)
c                  write(*,*) '  srcnon = ',srcnon
c                  write(*,*) '       ksubl = ',ksubl(i)
c                  write(*,*) '       tralyr = ',tralyr(i)
c                  write(*,*) '       rado = ',rado(i)
c                  write(*,*) '  rprime = ',rprime(i)
c               endif
 20         CONTINUE
         ELSE
            DO 30 I = 1, NLIM
               vtest = v1po + dvpo*(i-1)
               Y  = 1./(1.+XXSAV(I))
               YZ = Y*AA*(BBASAV(I)-BBSAV(I))
               SOURCE = Y*KSUBL(I)*
     *                  (TRALYR(I)*(BBSAV(I)+BBASAV(I)*XXSAV(I)-YZ)+YZ)
               SRCNON = KSUBL(I)*TRALYR(I)*RADO(I)
               RPRIME(I) = SOURCE - SRCNON
c               if ((i.le.10).and.(layer.eq.1)) then
c                  write(*,*) '#2  i, gnu = ',i,vtest
c                  write(*,*) '  y = ',y
c                  write(*,*) '  yz = ',yz
c                  write(*,*) '  source = ',source
c                  write(*,*) '       ksubl = ',ksubl(i)
c                  write(*,*) '       tralyr = ',tralyr(i)
c                  write(*,*) '       xxsav = ',xxsav(i)
c                  write(*,*) '  srcnon = ',srcnon
c                  write(*,*) '       ksubl = ',ksubl(i)
c                  write(*,*) '       tralyr = ',tralyr(i)
c                  write(*,*) '       rado = ',rado(i)
c                  write(*,*) '  rprime = ',rprime(i)
c               endif
 30         CONTINUE
         ENDIF
c        write(*,*) '**************************'
      ELSEIF (IPATHL.EQ.2) THEN
         STOP 'ADERIV NOT SET FOR IPATHL = 2'
c      ELSEIF (IPATHL.EQ.3) THEN
c         STOP 'ADERIV NOT SET FOR IPATHL = 3'
      ELSEIF (IPATHL.EQ.-1) THEN
         STOP 'ADERIV NOT SET FOR IPATHL = -1'
      ENDIF
C
      RETURN
C
 900  FORMAT ('KODTOT, ',I2.2,', reached end prior to end of KFILE, ',
     *        I2.2)
C
      END
C
C     ---------------------------------------------------------------
C

      SUBROUTINE TDERIV (KFILE,KODTOT,RPRIME,RADO,TRALYR,KSUBL,XKMOLC, 2,2
     *                  OPDT,ODACUM,NLIM,NDIM,ND2,IPATHL,LAYER,NLAYER,
     *     v1po,dvpo)
C
C     This subroutine combines the Planck function derivative
C     (calculated in SUBROUTINE EMDT) and the layer transmittance
C     and then calculates the radiance derivatives with respect to
C     temperature
C
      IMPLICIT REAL*8           (V)
      character*8      XID,       HMOLID,      YID
      real*8               SECANT,       XALTZ
C
      REAL KSUBL(0:ND2)
C
      DIMENSION RADO(0:ND2),OPDT(0:ND2)
      DIMENSION RPRIME(NDIM)
      DIMENSION TRALYR(*)
      DIMENSION PNLHDR(2),XKMOLC(2),ODACUM(2)
C
      COMMON /FILHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4),
     *                WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1 ,V2 ,TBOUND,
     *                EMISIV,FSCDID(17),NMOL,LAYRS ,YI1,YID(10),LSTWDF
      COMMON /BUFPNL/ V1P,V2P,DVP,NLIMP
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KDUMY,KPANEL,LINFIL,NFILE,IAFIL,IEXFIL,
     *              NLTEFL,LNFIL4,LNGTH4
      COMMON /EMDMSV/ BBSAV(2410),BBASAV(2410),XXSAV(2410)
      COMMON /EMDTSV/ BBDSAV(2410)
C
      EQUIVALENCE (PNLHDR(1),V1P)
C
c      CALL BUFIN (KFILE,KEOF,PNLHDR(1),NPHDRF)
c      IF (KEOF.LE.0) THEN
c         WRITE(*,*) 'End of KFILE ',KFILE
c         GOTO 10
c      ENDIF
C
C     Set number of words to be input as 2400 or the number of
C     points between the absolute end point V2 and the panel
C     starting point V1P, whichever is smaller.  If you already
C     have the point (from a previous panel), then skip over
C     remaining panels.
C
      XLIMP = (V2-V1P)/DVP + 1.00001
      IF (XLIMP.GT.2400) THEN
         NLIMP = 2400
      ELSEIF (XLIMP.LT.1.) THEN
         GOTO 10
      ELSE
         NLIMP = XLIMP
      ENDIF
C
C     Read in absorptance coefficients
C
c      CALL BUFIN (KFILE,KEOF,XKMOLC(1),NLIMP)
C
C     Read in total optical depths if LAYER < NLAYER
C
      IF (LAYER.LT.NLAYER) THEN
         CALL BUFIN (KODTOT,KEOF,PNLHDR(1),NPHDRF)
         IF (KEOF.LE.0) THEN
            WRITE(IPR,900) KODTOT,KFILE
            STOP 'IN SUBROUTINE ADERIV: SEE OUTPUT FILE'
         ENDIF
C
C        Set number of words to be input as 2400 or the number of
C        points between the absolute end point V2 and the panel
C        starting point V1P, whichever is smaller.  If you already
C        have the point (from a previous panel), then skip over
C        remaining panels.
C
         XLIMP = (V2-V1P)/DVP + 1.00001
         IF (XLIMP.GT.2400) THEN
            NLIMP = 2400
         ELSEIF (XLIMP.LT.1.) THEN
            GOTO 10
         ELSE
            NLIMP = XLIMP
         ENDIF
C
C        Read in total optical depths
C
         CALL BUFIN (KODTOT,KEOF,ODACUM(1),NLIMP)
      ENDIF
C
C     Calculate layer derivatives,
C
C     dR/dt = Tt*[(1-T)*dB/dt], where
C
C             dB/dt = (h*c*gnu)/(k*t*t) * 1/(1-exp{-beta*gnu})*B(gnu,t)
C
C
C     When calculating the derivative of the layer nearest the observer,
C     omit the total accumulated transmittance, TRACCM
C
 10   AA = 0.278
      IF (IPATHL.EQ.1.OR.IPATHL.EQ.3) THEN
         IF (LAYER.NE.NLAYER) THEN
            DO 20 I = 1, NLIM
               vtest = v1po + dvpo*(i-1)
c               Y  = 1./(1.+XXSAV(I))
c               YZ = Y*AA*(BBASAV(I)-BBSAV(I))
               TRACCM = EXP(-OPDT(I))
               SOURCE = BBDSAV(I)*(1.-TRALYR(I))
c               SRCNON =
               RPRIME(I) = TRACCM*SOURCE
 20         CONTINUE
         ELSE
            DO 30 I = 1, NLIM
               vtest = v1po + dvpo*(i-1)
c               Y  = 1./(1.+XXSAV(I))
c               YZ = Y*AA*(BBASAV(I)-BBSAV(I))
               SOURCE = BBDSAV(I)*(1.-TRALYR(I))
c               SRCNON =
               RPRIME(I) = SOURCE
 30         CONTINUE
         ENDIF
      ELSEIF (IPATHL.EQ.2) THEN
         STOP 'TDERIV NOT SET FOR IPATHL = 2'
c      ELSEIF (IPATHL.EQ.3) THEN
c         STOP 'TDERIV NOT SET FOR IPATHL = 3'
      ELSEIF (IPATHL.EQ.-1) THEN
         STOP 'TDERIV NOT SET FOR IPATHL = -1'
      ENDIF
C
      RETURN
C
 900  FORMAT ('KODTOT, ',I2.2,', reached end prior to end of KFILE, ',
     *        I2.2)
C
      END
C
C     ----------------------------------------------------------------
C

      SUBROUTINE FLXIN (V1P,V2P,DVP,NLIM,KFILE,EM,TR,KEOF,NPANLS) 4,19
C
      IMPLICIT REAL*8           (V)
C
C     SUBROUTINE FLXIN INPUTS OPTICAL DEPTH VALUES FROM KFILE AND
C     CALCULATES FLUX FOR THE LAYER. THIS VERSION WORKS FOR AEROSOLS.
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C               LAST MODIFICATION:    14 AUGUST 1991
C
C                  IMPLEMENTATION:    R.D. WORSHAM
C
C             ALGORITHM REVISIONS:    S.A. CLOUGH
C                                     M.J. IACONO
C                                     R.D. WORSHAM
C                                     J.L. MONCET
C
C
C                     ATMOSPHERIC AND ENVIRONMENTAL RESEARCH INC.
C                     840 MEMORIAL DRIVE,  CAMBRIDGE, MA   02139
C
C----------------------------------------------------------------------
C
C               WORK SUPPORTED BY:    THE ARM PROGRAM
C                                     OFFICE OF ENERGY RESEARCH
C                                     DEPARTMENT OF ENERGY
C
C
C      SOURCE OF ORIGINAL ROUTINE:    AFGL LINE-BY-LINE MODEL
C
C                                             FASCOD3
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
      character*8      XID,       HMOLID,      YID
      real*8               SECANT,       XALTZ
C
      COMMON /FILHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4),
     *                WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1 ,V2 ,TBOUND,
     *                EMISIV,FSCDID(17),NMOL,LAYRS ,YI1,YID(10),LSTWDF
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KDUMY,KPANEL,LINFIL,NFILA,IAFIL,IEXFIL,
     *              NLTEFL,LNFIL4,LNGTH4
      COMMON /LAMCHN/ ONEPL,ONEMI,EXPMIN,ARGMIN
      COMMON /BUFPNL/ V1PBF,V2PBF,DVPBF,NLIMBF
      COMMON /RMRG/ XKT,XKTA,XKTB,SECNT
C
      DIMENSION PNLHDR(2),EM(*),TR(*)
C
      EQUIVALENCE (FSCDID(1),IHIRAC) , (FSCDID(2),ILBLF4)
      EQUIVALENCE (PNLHDR(1),V1PBF)
      EQUIVALENCE (FSCDID(4),IAERSL)
C
      CALL BUFIN (KFILE,KEOF,PNLHDR(1),NPHDRF)
      IF (KEOF.LE.0) RETURN
      CALL BUFIN (KFILE,KEOF,TR(1),NLIMBF)
C
C     TR CONTAINS THE OPTICAL DEPTHS AT THIS STAGE
C
      IF (IHIRAC.EQ.4) STOP ' IHIRAC=4  FLXIN '
C
C     EM CONTAINS THE OPTICAL DEPTH CORRECTIONS FOR NLTE AT THIS STAGE
C
      IF (NPANLS.LT.1.AND.IAERSL.EQ.0) WRITE (IPR,900)
      IF (NPANLS.LT.1.AND.IAERSL.NE.0) WRITE (IPR,905)
C
      EXT = 0.
      ADEL = 0.
      RADFN0 = 0.
      RDEL = 0.
      BB = 0.
      BBDEL = 0.
      BBA = 0.
      BBDLA = 0.
C
      V1P = V1PBF
      V2P = V2PBF
      DVP = DVPBF
      NLIM = NLIMBF
      VI = V1P-DVP
      VIDV = VI
      VIBB = VI
      VAER = VI
      VDUM = VI
      BBLAST = -1.
      BBLXTA = -2.
      RDLAST = -1.
      BBDUM = -4.
      RDDUM = -1.
      NLIM1 = 0
      NLIM2 = 0
C
      AA = 0.278
C
      BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBDUM)
      IF (IAERSL.NE.0) THEN
         RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDDUM)
         EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
         IAFBB = 0
         IF (VITST.LT.VAER.AND.VITST.LT.VIBB) IAFBB = 1
         IF (VAER.LT.VITST.AND.VAER.LT.VIBB) IAFBB = 2
      ELSE
         IAFBB = -1
      ENDIF
C
C     - THIS SECTION TREATS THE CASE WHERE THE LAYER CONTRIBUTES
C       TO THE RADIATIVE TRANSFER ONLY ONCE
C
C     - WITH XKTA=0 THIS ALGORITHM REVERTS TO THE ORIGINAL
C
      IF (XKTB.GT.0.) STOP ' XKTB GT 0.   FLXIN '
C
   10 NLIM1 = NLIM2+1
C
      VI = V1P+FLOAT(NLIM1-1)*DVP
      IF (IAFBB.EQ.-1) THEN
         BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
         IF (XKTA.GT.0.) THEN
            VIBB = -VIDV
            BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
         ELSE
            BBA = BB
            BBDLA = BBDEL
         ENDIF
      ELSEIF (IAFBB.EQ.0) THEN
         BB = BBFN(VI,DVP,V2P,XKT,VIDV,BBDEL,BBLAST)
         IF (XKTA.GT.0.) THEN
            VIBB = -VIDV
            BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
         ELSE
            BBA = BB
            BBDLA = BBDEL
         ENDIF
         VITST = -VIDV
         RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
         VAER = -VIDV
         EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
      ELSEIF (IAFBB.EQ.1) THEN
         RADFN0 = RADFNI(VI,DVP,XKT,VIDV,RDEL,RDLAST)
         VIBB = -VIDV
         BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
         IF (XKTA.GT.0.) THEN
            VIBB = -VIDV
            BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
         ELSE
            BBA = BB
            BBDLA = BBDEL
         ENDIF
         VAER = -VIDV
         EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
      ELSEIF (IAFBB.EQ.2) THEN
         EXT = AERF(VI,DVP,VIDV,ADEL,TAUSCT,TDEL,GFACT,GDEL)
         VIBB = -VIDV
         BB = BBFN(VI,DVP,V2P,XKT,VIBB,BBDEL,BBLAST)
         IF (XKTA.GT.0.) THEN
            VIBB = -VIDV
            BBA = BBFN(VI,DVP,V2P,XKTA,VIBB,BBDLA,BBLXTA)
         ELSE
            BBA = BB
            BBDLA = BBDEL
         ENDIF
         VITST = -VIDV
         RADFN0 = RADFNI(VI,DVP,XKT,VITST,RDEL,RDLAST)
      ENDIF
C
      NLIM2 = (VIDV-V1P)/DVP+1.001
      NLIM2 = MIN(NLIM2,NLIM)
C
      DO 20 I = NLIM1, NLIM2
         ODVI = SECNT*TR(I)+EXT*RADFN0
C
         XX = AA*ODVI
C
         TR(I) = EXP(-ODVI)
         EM(I) = (1.-TR(I))*(BB+XX*BBA)/(1.+XX)
C
C        Increment interpolation values
C
         EXT = EXT+ADEL
         RADFN0 = RADFN0+RDEL
         BB = BB+BBDEL
         BBA = BBA+BBDLA
   20 CONTINUE
C
      IF (NLIM2.LT.NLIM) GO TO 10
C
      RETURN
C
  900 FORMAT ('0EMISSION AND TRANSMISSION  (MOLECULAR) ')
  905 FORMAT ('0EMISSION AND TRANSMISSION (AEROSOLS EFFECTS INCLUDED)')
C
      END
C
C     ----------------------------------------------------------------
C

      SUBROUTINE FLINIT (NPTS,MFILE,JPATHL,TBND) 2,14
C
      IMPLICIT REAL*8           (V)
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C               LAST MODIFICATION:    14 AUGUST 1991
C
C                  IMPLEMENTATION:    R.D. WORSHAM
C
C             ALGORITHM REVISIONS:    S.A. CLOUGH
C                                     M.J. IACONO
C                                     R.D. WORSHAM
C                                     J.L. MONCET
C
C
C                     ATMOSPHERIC AND ENVIRONMENTAL RESEARCH INC.
C                     840 MEMORIAL DRIVE,  CAMBRIDGE, MA   02139
C
C----------------------------------------------------------------------
C
C               WORK SUPPORTED BY:    THE ARM PROGRAM
C                                     OFFICE OF ENERGY RESEARCH
C                                     DEPARTMENT OF ENERGY
C
C
C      SOURCE OF ORIGINAL ROUTINE:    AFGL LINE-BY-LINE MODEL
C
C                                             FASCOD3
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
      COMMON NEWEM(2410),NEWTR(2410)
      COMMON /MANE/ P0,TEMP0,NLAYER,DVXM,H2OSLF,WTOT,ALBAR,ADBAR,AVBAR,
     *              AVFIX,LAYER,SECNT0,SAMPLE,DVSET,ALFAL0,AVMASS,
     *              DPTMIN,DPTFAC,ALTAV,AVTRAT,TDIFF1,TDIFF2,ALTD1,
     *              ALTD2,ANGLE,IANT,LTGNT,LH1,LH2,IPFLAG,PLAY,TLAY,
     *              EXTID(10)
      COMMON /CONSTS/ PI,PLANCK,BOLTZ,CLIGHT,AVOG,RADCN1,RADCN2
C
      character*8      XID,       HMOLID,      YID
      real*8               SECANT,       XALTZ
C
      COMMON /EMIHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4),
     *                WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1 ,V2 ,TBOUND,
     *                EMISIV,FSCDID(17),NMOL,LAYDUM,YI1,YID(10),LSTWDF
      COMMON /BNDPRP/ TMPBND,BNDEMI(3),BNDRFL(3),IBPROP
      COMMON /OPANL/ V1PO,V2PO,DVPO,NLIMO
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KFILE,KPANEL,LINFIL,NFILA,IAFIL,IEXFIL,
     *              NLTEFL,LNFIL4,LNGTH4
      COMMON /RMRG/ XKT,XKTA,XKTB,SECNT
C
      CHARACTER*40 CEXT,CYID
C
      REAL NEWEM,NEWTR
C
      DIMENSION XFILHD(2),OPNLHD(2)
      DIMENSION EMLAYR(2),TRLAYR(2)
C
      EQUIVALENCE (XFILHD(1),XID(1)) , (OPNLHD(1),V1PO)
      EQUIVALENCE (NEWEM(1),EMLAYR(1)) , (NEWTR(1),TRLAYR(1)),
     *            (FSCDID(4),IAERSL) , (FSCDID(5),IEMIT),
     *            (FSCDID(7),IPLOT) , (FSCDID(8),IPATHL),
     *            (FSCDID(16),LAYR1)
C
C
C   *******************************************************************
C   ***  THIS SUBROUTINE COMPUTES THE EMISSION FOR THE FIRST LAYER  ***
C   *******************************************************************
C
C     TBND IS THE BOUNDARY BLACK BODY TEMPERATUE
C
C     IPATHL = 1 IS FOR THE DOWNWELLING FLUX CASE
C     IPATHL = 3 IS FOR THE UPWELLING FLUX CASE
C
      CALL CPUTIM (TIME)
C
      WRITE (IPR,900) TIME
      NPANLS = 0
      CALL BUFIN (KFILE,KEOF,XFILHD(1),NFHDRF)
      IF (JPATHL.GE.1) IPATHL = JPATHL
      PLAY = PAVE
      TLAY = TAVE
C
C     FOR AEROSOL RUNS, MOVE EXTID INTO YID
C
      IF (IAERSL.GT.0) THEN
         WRITE (CEXT,'(10A4)') EXTID
         WRITE (CYID,'(5A8)') (YID(I),I=3,7)
         CYID(19:40) = CEXT(19:40)
         READ (CYID,'(5A8)') (YID(I),I=3,7)
      ENDIF
C
C     READ IN DIRECTION COSINE
C
      READ (IRD,905) DIRCOS
      SECNT = 1.0/DIRCOS
      SECANT = SECNT
      SECNT0 = SECNT
      WRITE (IPR,910) DIRCOS
C
C     IF BOUNDARY PROPERTIES ARE SUPPLIED, AND DOWNWARD LOOKING
C     CASE; SET IPATHL TO REFLECTED ATMOSPHERE CASE
C
      IF (IBPROP.EQ.1.AND.IPATHL.EQ.1) IPATHL = -1
      IEMIT = 1
      FACT = 1.
      TIMEM = 0.0
      IF (IPATHL.EQ.2.AND.IANT.EQ.0) FACT = 2.
      DO 10 MOL = 1, NMOL
         WK(MOL) = WK(MOL)*FACT
   10 CONTINUE
      WBROAD = WBROAD*FACT
      LAYR1 = LAYER
      WRITE (IPR,915) LAYR1,LAYER,KFILE,MFILE
      CALL BUFOUT (MFILE,XFILHD(1),NFHDRF)
      DVXM = DV
      XKT = TAVE/RADCN2
      XKTBND = TBND/RADCN2
      IF (IPATHL.EQ.-1) STOP ' IPATH=-1 '
      IF (IPATHL.EQ.0) STOP ' IPATH=0 '
      IF (IPATHL.EQ.1) THEN
         XKTA = TZL/RADCN2
         XKTB = 0.
      ENDIF
      IF (IPATHL.EQ.2) STOP ' IPATH=2 '
      IF (IPATHL.EQ.3) THEN
         XKTA = TZU/RADCN2
         XKTB = 0.
      ENDIF
      WRITE (IPR,920) IPATHL,IANT
C
   20 CONTINUE
C
      CALL CPUTIM (TIMEM1)
      CALL FLXIN (V1PO,V2PO,DVPO,NLIMO,KFILE,EMLAYR,TRLAYR,KEOF,NPANLS)
      CALL CPUTIM (TIMEM2)
      TIMEM = TIMEM+TIMEM2-TIMEM1
      IF (KEOF.LE.0) GO TO 50
      VI = V1PO-DVPO
      VIDVBD = VI
      VIDVEM = VI
      VIDVRF = VI
      BBLAST = -1.
      EMLAST = -1.
      IF ((IPATHL.EQ.3).AND.(TBND.GT.0.)) THEN
C
         NLIM1 = 0
         NLIM2 = 0
         EMDUM = 0.
         BBDUM = 0.
         EMISIV = EMISFN(VI,DVPO,VIDVEM,EMDEL,EMDUM)
         BB = BBFN(VI,DVPO,V2PO,XKTBND,VIDVBD,BBDEL,BBDUM)
         IEMBB = 0
         IF (VIDVBD.GT.VIDVEM) IEMBB = 1
C
   30    NLIM1 = NLIM2+1
C
         VI = V1PO+FLOAT(NLIM1-1)*DVPO
         IF (IEMBB.EQ.0) THEN
            BB = BBFN(VI,DVPO,V2PO,XKTBND,VIDV,BBDEL,BBLAST)
            VIDVEM = -VIDV
            EMISIV = EMISFN(VI,DVPO,VIDVEM,EMDEL,EMLAST)
         ELSE
            EMISIV = EMISFN(VI,DVPO,VIDV,EMDEL,EMLAST)
            VIDVBD = -VIDV
            BB = BBFN(VI,DVPO,V2PO,XKTBND,VIDVBD,BBDEL,BBLAST)
         ENDIF
C
         IF (VIDV.GE.9.E+4) THEN
            NLIM2 = NLIMO+1
         ELSE
            NLIM2 = (VIDV-V1PO)/DVPO+1.001
         ENDIF
         NLIM2 = MIN(NLIM2,NLIMO)
C
         DO 40 J = NLIM1, NLIM2
            NEWEM(J) = EMLAYR(J)+TRLAYR(J)*BB*EMISIV
C
C           Increment interpolation values
C
            BB = BB+BBDEL
            EMISIV = EMISIV+EMDEL
   40    CONTINUE
C
         IF (NLIM2.LT.NLIMO) GO TO 30
C
      ENDIF
      CALL EMOUT (V1PO,V2PO,DVPO,NLIMO,NEWEM,NEWTR,MFILE,NPTS,NPANLS)
      GO TO 20
   50 CALL CPUTIM (TIME1)
      TIME = TIME1-TIME
      WRITE (IPR,925) TIME,TIMEM
C
      RETURN
C
  900 FORMAT (' TIME AT THE START OF --FLINIT-- ',F10.3)
  905 FORMAT (F10.8)
  910 FORMAT ('0 ***** DIR. COSINE ***** ',/,7X,F10.8)
  915 FORMAT ('0 INITIAL LAYER',I5,'  FINAL LAYER',I5,/,
     *        '0 INPUT FILE =',I5,' OUTPUT FILE =',I5)
  920 FORMAT ('0 IPATHL AND IANT',2I5)
  925 FORMAT (' TIME REQUIRED FOR --FLINIT-- ',F10.3,' --FLXIN-- ',
     *        F10.3)
C
      END
C
C     ----------------------------------------------------------------
C

      SUBROUTINE FLUXUP (NPTS,LFILE,MFILE,JPATHL,TBND) 1,18
C
      IMPLICIT REAL*8           (V)
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C               LAST MODIFICATION:    14 AUGUST 1991
C
C                  IMPLEMENTATION:    R.D. WORSHAM
C
C             ALGORITHM REVISIONS:    S.A. CLOUGH
C                                     M.J. IACONO
C                                     R.D. WORSHAM
C                                     J.L. MONCET
C
C
C                     ATMOSPHERIC AND ENVIRONMENTAL RESEARCH INC.
C                     840 MEMORIAL DRIVE,  CAMBRIDGE, MA   02139
C
C----------------------------------------------------------------------
C
C               WORK SUPPORTED BY:    THE ARM PROGRAM
C                                     OFFICE OF ENERGY RESEARCH
C                                     DEPARTMENT OF ENERGY
C
C
C      SOURCE OF ORIGINAL ROUTINE:    AFGL LINE-BY-LINE MODEL
C
C                                             FASCOD3
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
      COMMON RADN(2410),TRAN(2410),RADO(0:5000)
      COMMON /MANE/ P0,TEMP0,NLAYER,DVXM,H2OSLF,WTOT,ALBAR,ADBAR,AVBAR,
     *              AVFIX,LAYDUM,SECNT0,SAMPLE,DVSET,ALFAL0,AVMASS,
     *              DPTMIN,DPTFAC,ALTAV,AVTRAT,TDIFF1,TDIFF2,ALTD1,
     *              ALTD2,ANGLE,IANT,LTGNT,LH1,LH2,IPFLAG,PLAY,TLAY,
     *              EXTID(10)
      COMMON /CONSTS/ PI,PLANCK,BOLTZ,CLIGHT,AVOG,RADCN1,RADCN2
C
      character*8      XID,       HMOLID,      YID
      real*8               SECANT,       XALTZ
C
      COMMON /EMHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4),
     *               WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1 ,V2 ,TBOUND,
     *               EMISIV,FSCDID(17),NMOL,LAYER ,YI1,YID(10),LSTWDF
      COMMON /BNDPRP/ TMPBND,BNDEMI(3),BNDRFL(3),IBPROP
      COMMON /OPANL/ V1PO,V2PO,DVPO,NLIMO
      COMMON /XPANEL/ V1P,V2P,DVP,NLIM,RMIN,RMAX,NPNLXP,NSHIFT,NPTSS
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KFILE,KPANEL,LINFIL,NFILA,IAFIL,IEXFIL,
     *              NLTEFL,LNFIL4,LNGTH4
      COMMON /XME/ TRAO(0:5000)
      COMMON /RMRG/ XKT,XKTA,XKTB,SECNT
C
      DIMENSION XFILHD(2),PNLHDR(2),OPNLHD(2)
      DIMENSION A1(10),A2(10),A3(10),A4(10)
      DIMENSION RADLYR(2),TRALYR(2),RADOI(2),TRAOI(2)
      DIMENSION WKSAV(35)
C
      CHARACTER*40 CYID
C
      EQUIVALENCE (XFILHD(1),XID(1)) , (PNLHDR(1),V1P),
     *            (OPNLHD(1),V1PO)
      EQUIVALENCE (RADO(1),RADOI(1)) , (TRAO(1),TRAOI(1))
      EQUIVALENCE (RADN(1),RADLYR(1)) , (TRAN(1),TRALYR(1)),
     *            (FSCDID(4),IAERSL) , (FSCDID(5),IEMIT),
     *            (FSCDID(7),IPLOT) , (FSCDID(8),IPATHL),
     *            (FSCDID(16),LAYR1)
C
      DATA NDIM / 2410 /,ND2 / 5000 /
C
C
C
C     ************************************************************
C     ****** THIS SUBROUTINE DOES LAYER MERGE FOR RADIANCE  ******
C     ************************************************************
C
C     IPATHL = 3 IS FOR THE UPWELLING FLUX CASE
C
      CALL CPUTIM (TIME)
      WRITE (IPR,900) TIME
      NPANLS = 0
      TIMEM = 0.0
      TIMRD = 0.0
      TIMOT = 0.0
C
      CALL BUFIN (LFILE,LEOF,XFILHD(1),NFHDRF)
      SECNT = SECANT
      LAY1SV = LAYR1
      DVL = DV
      PL = PAVE
      TL = TAVE
      WTOTL = 0.
C
      DO 10 MOL = 1, NMOL
         WTOTL = WTOTL+WK(MOL)
         WKSAV(MOL) = WK(MOL)
   10 CONTINUE
C
      WTOTL = WTOTL+WBROAD
      WN2SAV = WBROAD
C
C     FOR AEROSOL RUNS, MOVE YID (LFILE) INTO YID (MFILE)
C
      IF (IAERSL.GT.0) WRITE (CYID,'(5A8)') (YID(I),I=3,7)
      CALL BUFIN (KFILE,KEOF,XFILHD(1),NFHDRF)
      IF (IAERSL.GT.0) READ (CYID,'(5A8)') (YID(I),I=3,7)
C
      IF (JPATHL.GE.1) IPATHL = JPATHL
      PLAY = PAVE
      TLAY = TAVE
      TAVK = TAVE
      DVK = DV
      FACT = 1.
C
      IF (DVL.EQ.DVK) THEN
         ITYPE = 0
      ELSEIF (DVL.GT.DVK) THEN
         ITYPE = DVK/(DVL-DVK)+0.5
      ELSE
C
C     DVL.LT.DVK
C
         ITYPE = -INT(DVL/(DVK-DVL)+0.5)
      ENDIF
      IF (ITYPE.LT.0) STOP ' FLUXUP; ITYPE LT 0 '
C
      WTOTK = 0.
      LAYR1 = LAY1SV
      WRITE (IPR,905) LAYR1,LAYER,KFILE,LFILE,MFILE
      IEMIT = 1
      DO 20 MOL = 1, NMOL
         WTOTK = WTOTK+WK(MOL)*FACT
         WK(MOL) = WK(MOL)*FACT+WKSAV(MOL)
   20 CONTINUE
      WTOTK = WTOTK+WBROAD*FACT
      WBROAD = WBROAD*FACT+WN2SAV
      PAVE = (PL*WTOTL+PAVE*WTOTK)/(WTOTL+WTOTK)
      TAVE = (TL*WTOTL+TAVE*WTOTK)/(WTOTL+WTOTK)
      SECANT = SECNT
C
C     WK IS NOW THE ACCUMULATED SUM OF THE COLUMN DENSITIES
C
      CALL BUFOUT (MFILE,XFILHD(1),NFHDRF)
      DVXM = DV
      XKT = TAVK/RADCN2
C
      WRITE (IPR,910) IPATHL,IANT
C
      IF (IPATHL.EQ.3) THEN
         XKTA = TZU/RADCN2
         XKTB = 0.
      ELSE
         STOP ' FLUXUP; IPATHL '
      ENDIF
C
      ATYPE = ITYPE
      LL = ITYPE+1
      AP = 1.0/(ATYPE+1.0)
C
C     A1, A2, A3 AND A4 ARE THE CONSTANTS
C     FOR THE LAGRANGE 4 POINT INTERPOLATION
C
      DO 30 JPG = 1, ITYPE
         APG = JPG
         IPL = JPG+1
         P = 1.0-(AP*APG)
         A1(IPL) = -P*(P-1.0)*(P-2.0)/6.0
         A2(IPL) = (P**2-1.0)*(P-2.0)*0.5
         A3(IPL) = -P*(P+1.0)*(P-2.0)*0.5
         A4(IPL) = P*(P**2-1.0)/6.0
   30 CONTINUE
C
C     *** BEGINNING OF LOOP THAT DOES MERGE  ***
C
      NPE = 0
      RADO(0) = 0.0
      TRAO(0) = 0.0
      V1PO = 0.0
      V2PO = 0.0
      DVPO = 0.0
C
   40 CONTINUE
C
      CALL CPUTIM (TIMEM1)
      CALL FLXIN (V1P,V2P,DVP,NLIM,KFILE,RADLYR,TRALYR,KEOF,NPANLS)
      CALL CPUTIM (TIMEM2)
      TIMEM = TIMEM+TIMEM2-TIMEM1
      IF (KEOF.LE.0) GO TO 80
      II = 1
C
      IF (V2PO.LE.V2P+DVPO) THEN
   50    CALL CPUTIM (TIMEM1)
         CALL BUFIN (LFILE,LEOF,OPNLHD(1),NPHDRF)
         IF (LEOF.LE.0) GO TO 60
         CALL BUFIN (LFILE,LEOF,RADOI(NPE+1),NLIMO)
         CALL BUFIN (LFILE,LEOF,TRAOI(NPE+1),NLIMO)
         CALL CPUTIM (TIMEM2)
         TIMRD = TIMRD+TIMEM2-TIMEM1
         NPE = NLIMO+NPE
         IF (V2PO.LE.V2P+DVPO) GO TO 50
      ENDIF
C
C     ZERO POINT OF FIRST PANEL
C
   60 IF (RADO(0).EQ.0.0.AND.TRAO(0).EQ.0.0) THEN
         RADO(0) = RADO(1)
         TRAO(0) = TRAO(1)
      ENDIF
C
C     END POINT OF LAST PANEL
C
      IF (V2PO+DVPO.GE.V2) THEN
         RADO(NPE+1) = RADO(NPE)
         RADO(NPE+2) = RADO(NPE)
         TRAO(NPE+1) = TRAO(NPE)
         TRAO(NPE+2) = TRAO(NPE)
      ENDIF
C
      NPL = 1
C
C     NPL IS LOCATION OF FIRST ELEMENT ON ARRAYS RADO AND TRAO
C
      CALL FLUXNN (RADN,TRAN,RADO,TRAO,NLIM,NDIM,ND2,V1P,DVP,IPATHL,
     *             A1,A2,A3,A4,LL,NPL)
C
      CALL CPUTIM (TIMEM1)
C
      IF (TBND.GT.0.) CALL EMBND (V1P,V2P,DVP,NLIM,RADN,TRAN,TBND)
C
      CALL EMOUT (V1P,V2P,DVP,NLIM,RADN,TRAN,MFILE,NPTS,NPANLS)
      CALL CPUTIM (TIMEM2)
      TIMOT = TIMOT+TIMEM2-TIMEM1
C
C     NPL IS NOW LOCATION OF FIRST ELEMENT TO BE USED FOR NEXT PASS
C
      IPL = -1
      DO 70 NL = NPL, NPE
         IPL = IPL+1
         RADO(IPL) = RADO(NL)
         TRAO(IPL) = TRAO(NL)
   70 CONTINUE
C
      NPE = IPL
C
      GO TO 40
   80 CONTINUE
C
      CALL CPUTIM (TIME1)
      TIM = TIME1-TIME
      WRITE (IPR,915) TIME1,TIM,TIMEM,TIMRD,TIMOT
C
      RETURN
C
  900 FORMAT ('0 THE TIME AT THE START OF FLUXUP IS ',F12.3)
  905 FORMAT ('0 INITIAL LAYER',I5,'  FINAL LAYER',I5,/,'0 FILE ',I5,
     *        ' MERGED WITH FILE ',I5,' ONTO FILE',I5)
  910 FORMAT ('0 IPATHL AND IANT',2I5)
  915 FORMAT ('0 THE TIME AT THE END OF FLUXUP IS ',F12.3,/,F12.3,
     *        ' SECS WERE REQUIRED FOR THIS MERGE  - FLXIN - ',F12.3,
     *        ' - READ - ',F12.3,' - EMOUT - ',F12.3)
C
      END
C
C     ----------------------------------------------------------------
C

      SUBROUTINE FLUXNN (RADLYR,TRALYR,RADO,TRAO,NLIM,NDIM,ND2,V1P,DVP, 1
     *                  IPATHL,A1,A2,A3,A4,LL,NPL)
C
      IMPLICIT REAL*8           (V)
C
C     THIS SUBROUTINE CALCULATES THE NEW RADIANCE AND TRANSMISSION
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C               LAST MODIFICATION:    14 AUGUST 1991
C
C                  IMPLEMENTATION:    R.D. WORSHAM
C
C                       ALGORITHM:    R.D. WORSHAM
C                                     S.A. CLOUGH
C                                     M.J. IACONO
C                                     J.L. MONCET
C
C
C                     ATMOSPHERIC AND ENVIRONMENTAL RESEARCH INC.
C                     840 MEMORIAL DRIVE,  CAMBRIDGE, MA   02139
C
C----------------------------------------------------------------------
C
C               WORK SUPPORTED BY:    THE ARM PROGRAM
C                                     OFFICE OF ENERGY RESEARCH
C                                     DEPARTMENT OF ENERGY
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C

      DIMENSION RADLYR(NDIM),TRALYR(NDIM),RADO(0:ND2),TRAO(0:ND2),
     *          A1(*),A2(*),A3(*),A4(*)
C
      LLM1 = LL-1
      LLM1 = MAX(LLM1,1)
C
C     LOOPING OVER POINTS WITH SAME WEIGHTS
C
      DO 30 NL = 1, LL
         IPL = (NPL+NL-1)-LLM1
         IF (NL.GT.1) IPL = IPL-1
C
         IF (NL.EQ.1) THEN
C
C     EXACT FREQUENCY - NO INTERPOLATION
C
            DO 10 I = NL, NLIM, LL
               IPL = IPL+LLM1
               RADLYR(I) = TRALYR(I)*RADO(IPL)+RADLYR(I)
               TRALYR(I) = TRALYR(I)*TRAO(IPL)
   10       CONTINUE
C
C     NOT EXACT FREQUENCY - INTERPOLATE RESULT
C
         ELSE
C
            A1N = A1(NL)
            A2N = A2(NL)
            A3N = A3(NL)
            A4N = A4(NL)
C
            DO 20 I = NL, NLIM, LL
               IPL = IPL+LLM1
C
C     INTERPOLATE THE OLD RADIANCE
C
               RADLYR(I) = TRALYR(I)*(A1N*RADO(IPL-1)+A2N*RADO(IPL)+
     *                     A3N*RADO(IPL+1)+A4N*RADO(IPL+2))+RADLYR(I)
C
C     INTERPOLATE THE OLD TRANSMISSION
C
               TRALYR(I) = TRALYR(I)*(A1N*TRAO(IPL-1)+A2N*TRAO(IPL)+
     *                     A3N*TRAO(IPL+1)+A4N*TRAO(IPL+2))
   20       CONTINUE
C
C
         ENDIF
C
   30 CONTINUE
C
      NPL = IPL
C
      RETURN
C
      END
C
C     ----------------------------------------------------------------
C

      SUBROUTINE FLUXDN (NPTS,LFILE,MFILE,JPATHL,TBND) 1,30
C
      IMPLICIT REAL*8           (V)
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C               LAST MODIFICATION:    14 AUGUST 1991
C
C                  IMPLEMENTATION:    R.D. WORSHAM
C
C             ALGORITHM REVISIONS:    S.A. CLOUGH
C                                     M.J. IACONO
C                                     R.D. WORSHAM
C                                     J.L. MONCET
C
C
C                     ATMOSPHERIC AND ENVIRONMENTAL RESEARCH INC.
C                     840 MEMORIAL DRIVE,  CAMBRIDGE, MA   02139
C
C----------------------------------------------------------------------
C
C               WORK SUPPORTED BY:    THE ARM PROGRAM
C                                     OFFICE OF ENERGY RESEARCH
C                                     DEPARTMENT OF ENERGY
C
C
C      SOURCE OF ORIGINAL ROUTINE:    AFGL LINE-BY-LINE MODEL
C
C                                             FASCOD3
C
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
      COMMON RADN(2410),TRAN(2410),RADLYR(-1:4818)
      COMMON /MANE/ P0,TEMP0,NLAYER,DVXM,H2OSLF,WTOT,ALBAR,ADBAR,AVBAR,
     *              AVFIX,LAYDUM,SECNT0,SAMPLE,DVSET,ALFAL0,AVMASS,
     *              DPTMIN,DPTFAC,ALTAV,AVTRAT,TDIFF1,TDIFF2,ALTD1,
     *              ALTD2,ANGLE,IANT,LTGNT,LH1,LH2,IPFLAG,PLAY,TLAY,
     *              EXTID(10)
      COMMON /CONSTS/ PI,PLANCK,BOLTZ,CLIGHT,AVOG,RADCN1,RADCN2
C
      character*8      XID,       HMOLID,      YID
      real*8               SECANT,       XALTZ
C
      COMMON /EMHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4),
     *               WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1 ,V2 ,TBOUND,
     *               EMISIV,FSCDID(17),NMOL,LAYER ,YI1,YID(10),LSTWDF
      COMMON /OPANL/ V1PO,V2PO,DVPO,NLIMO
      COMMON /XPANEL/ V1P,V2P,DVP,NLIM,RMIN,RMAX,NPNLXP,NSHIFT,NPTSS
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KFILE,KPANEL,LINFIL,NFILA,IAFIL,IEXFIL,
     *              NLTEFL,LNFIL4,LNGTH4
      COMMON /XMI/ TRALYR(-1:4818)
      COMMON /RMRG/ XKT,XKTA,XKTB,SECNT
C
      DIMENSION XFILHD(2),PNLHDR(2),OPNLHD(2)
      DIMENSION A1(0:100),A2(0:100),A3(0:100),A4(0:100)
      DIMENSION RADO(2),TRAO(2)
      DIMENSION WKSAV(35)
C
      CHARACTER*40 CYID
C
      EQUIVALENCE (XFILHD(1),XID(1)) , (PNLHDR(1),V1P),
     *            (OPNLHD(1),V1PO)
      EQUIVALENCE (RADN(1),RADO(1)) , (TRAN(1),TRAO(1)),
     *            (FSCDID(4),IAERSL) , (FSCDID(5),IEMIT),
     *            (FSCDID(7),IPLOT) , (FSCDID(8),IPATHL),
     *            (FSCDID(16),LAYR1)
C
C     ************************************************************
C     ****** THIS SUBROUTINE DOES LAYER MERGE FOR EMISSION  ******
C     ****** USING FOUR POINT GENERAL INTERPOLATION         ******
C     ************************************************************
C
      CALL CPUTIM (TIME)
      WRITE (IPR,900) TIME
      NPANLS = 0
      TIMEM = 0.0
      TIMRD = 0.0
      TIMTB = 0.0
      TIMOT = 0.0
C
      CALL BUFIN (LFILE,LEOF,XFILHD(1),NFHDRF)
      SECNT = SECANT
      DVL = DV
      LAY1SV = LAYR1
      PL = PAVE
      TL = TAVE
      WTOTL = 0.
      DO 10 MOL = 1, NMOL
         WTOTL = WTOTL+WK(MOL)
         WKSAV(MOL) = WK(MOL)
   10 CONTINUE
      WTOTL = WTOTL+WBROAD
      WN2SAV = WBROAD
C
C     FOR AEROSOL RUNS, MOVE YID (LFILE) INTO YID (MFILE)
C
      IF (IAERSL.GT.0) WRITE (CYID,'(5A8)') (YID(I),I=3,7)
      CALL BUFIN (KFILE,KEOF,XFILHD(1),NFHDRF)
      IF (IAERSL.GT.0) READ (CYID,'(5A8)') (YID(I),I=3,7)
      IF (JPATHL.GE.1) IPATHL = JPATHL
      PLAY = PAVE
      TLAY = TAVE
C
      IF (IPATHL.NE.1) STOP ' FLUXDN: IPATHL .NE. 1 '
C
      XKT = TAVE/RADCN2
      XKTA = TZL/RADCN2
      XKTB = 0.
      DVK = DV
      LAYR1 = LAY1SV
      FACT = 1.
      IF (IPATHL.EQ.2.AND.IANT.EQ.0) FACT = 2.
      ATYPE = 9.999E09
      IF (DVK.EQ.DVL) ATYPE = 0.
      IF (DVL.GT.DVK) ATYPE = DVK/(DVL-DVK)+0.5
      IF (DVL.LT.DVK) ATYPE = -DVL/(DVK-DVL)-0.5
C
C     IF (ATYPE .GT. 0) STOP  ' FLUXDN; ATYPE GT 0 '
C
      WTOTK = 0.
      WRITE (IPR,905) LAYR1,LAYER,KFILE,LFILE,MFILE,ATYPE
      IEMIT = 1
      DO 20 MOL = 1, NMOL
         WTOTK = WTOTK+WK(MOL)*FACT
         WK(MOL) = WK(MOL)*FACT+WKSAV(MOL)
   20 CONTINUE
      WTOTK = WTOTK+WBROAD*FACT
      WBROAD = WBROAD*FACT+WN2SAV
      PAVE = (PL*WTOTL+PAVE*WTOTK)/(WTOTL+WTOTK)
      TAVE = (TL*WTOTL+TAVE*WTOTK)/(WTOTL+WTOTK)
      SECANT = SECNT
      DV = DVL
C
C     WK IS NOW THE ACCUMULATED SUM OF THE COLUMN DENSITIES
C
      CALL BUFOUT (MFILE,XFILHD(1),NFHDRF)
      DVXM = DV
C
      IF (ATYPE.EQ.0.) THEN
C
C     1/1 RATIO ONLY
C
C
   30    CONTINUE
         CALL CPUTIM (TIMEM1)
         CALL FLXIN (V1P,V2P,DVP,NLIM,KFILE,RADLYR(1),TRALYR(1),KEOF,
     *               NPANLS)
         CALL CPUTIM (TIMEM2)
         TIMEM = TIMEM+TIMEM2-TIMEM1
         IF (KEOF.LE.0) GO TO 110
         CALL BUFIN (LFILE,LEOF,OPNLHD(1),NPHDRF)
         CALL BUFIN (LFILE,LEOF,RADO(1),NLIMO)
         CALL BUFIN (LFILE,LEOF,TRAO(1),NLIMO)
         CALL CPUTIM (TIMEM3)
         TIMRD = TIMRD+TIMEM3-TIMEM2
         DO 40 I = 1, NLIM
            RADN(I) = RADO(I)*TRALYR(I)+RADLYR(I)
            TRAN(I) = TRALYR(I)*TRAO(I)
   40    CONTINUE
         CALL CPUTIM (TIMEM1)
         IF (TBND.GT.0.)
     *        CALL EMBND (V1PO,V2PO,DVPO,NLIMO,RADN,TRAN,TBND)
C
         CALL CPUTIM (TIMEM2)
         TIMTB = TIMTB+TIMEM2-TIMEM1
         CALL EMOUT (V1PO,V2PO,DVPO,NLIMO,RADN,TRAN,MFILE,NPTS,NPANLS)
         CALL CPUTIM (TIMEM3)
         TIMOT = TIMOT+TIMEM3-TIMEM2
         GO TO 30
C
      ENDIF
C
C     ALL RATIOS EXCEPT 1/1
C
      DO 50 JP = 0, 100
         APG = JP
         P = 0.01*APG
C
C     THE FOLLOW ARE THE CONSTANTS FOR THE LAGRANGE 4 POINT
C     INTERPOLATION
C
         A1(JP) = -P*(P-1.0)*(P-2.0)/6.0
         A2(JP) = (P**2-1.0)*(P-2.0)*0.5
         A3(JP) = -P*(P+1.0)*(P-2.0)*0.5
         A4(JP) = P*(P**2-1.0)/6.0
   50 CONTINUE
C
C     *** BEGINNING OF LOOP THAT DOES MERGE  ***
C
      NPE = 0
      RADLYR(0) = 0.0
      TRALYR(0) = 0.0
      V1P = 0.0
      V2P = 0.0
      DVP = 0.0
      V1PO = 0.0
      V2PO = 0.0
      DVPO = 0.0
      KEOF = 1
C
   60 CONTINUE
C
      CALL CPUTIM (TIMEM1)
      CALL BUFIN (LFILE,LEOF,OPNLHD(1),NPHDRF)
      IF (LEOF.LE.0) GO TO 110
      CALL BUFIN (LFILE,LEOF,RADO(1),NLIMO)
      CALL BUFIN (LFILE,LEOF,TRAO(1),NLIMO)
      CALL CPUTIM (TIMEM2)
      TIMRD = TIMRD+TIMEM2-TIMEM1
      II = 1
C
      IF (V2P.LE.V2PO+DVP .AND. KEOF.GT.0) THEN
   70    CALL CPUTIM (TIMEM2)
         CALL FLXIN (V1P,V2P,DVP,NLIM,KFILE,RADLYR(NPE+1),
     *               TRALYR(NPE+1),KEOF,NPANLS)
         CALL CPUTIM (TIMEM3)
         TIMEM = TIMEM+TIMEM3-TIMEM2
         IF (KEOF.LE.0) GO TO 80
         V1P = V1P-FLOAT(NPE)*DVP
         NPE = NLIM+NPE
         IF (V2P.LE.V2PO+DVP) GO TO 70
      ENDIF
C
C     ZERO POINT OF FIRST PANEL
C
   80 IF (RADLYR(0).EQ.0.0.AND.TRALYR(0).EQ.0.0) THEN
         TRALYR(-1) = TRALYR(1)
         RADLYR(-1) = RADLYR(1)
         TRALYR(0) = TRALYR(1)
         RADLYR(0) = RADLYR(1)
      ENDIF
C
C     END POINT OF LAST PANEL
C
      IF (V2P+DVP.GE.V2) THEN
         TRALYR(NPE+1) = TRALYR(NPE)
         RADLYR(NPE+1) = RADLYR(NPE)
         TRALYR(NPE+2) = TRALYR(NPE)
         RADLYR(NPE+2) = RADLYR(NPE)
      ENDIF
C
C     NPL IS LOCATION OF FIRST ELEMENT ON ARRAYS RADO AND TRAO
C
      NPL = 1
C
      RATDV = DVL/DVK
C
C     FJJ IS OFFSET BY 2. FOR ROUNDING PURPOSES
C
      FJ1DIF = (V1PO-V1P)/DVP+1.+2.
C
C     ***** BEGINNING OF LOOP THAT DOES MERGE  *****
C
      DO 90 II = 1, NLIMO
C
         FJJ = FJ1DIF+RATDV*FLOAT(II-1)
         JJ = IFIX(FJJ)-2
C
         JP = (FJJ-FLOAT(JJ))*100.-199.5
C
C     INTERPOLATE THE OLD TRANSMISSION
C
         TRNLYR = A1(JP)*TRALYR(JJ-1)+A2(JP)*TRALYR(JJ)+
     *            A3(JP)*TRALYR(JJ+1)+A4(JP)*TRALYR(JJ+2)
C
C     INTERPOLATE THE OLD EMISSION
C
         RADN(II) = RADO(II)*TRNLYR+(A1(JP)*RADLYR(JJ-1)+
     *              A2(JP)*RADLYR(JJ)+A3(JP)*RADLYR(JJ+1)+
     *              A4(JP)*RADLYR(JJ+2))
C
         TRAN(II) = TRNLYR*TRAO(II)
C
   90 CONTINUE
C
      NPL = JJ-1
C
      CALL CPUTIM (TIMEM1)
      IF (TBND.GT.0.) CALL EMBND (V1PO,V2PO,DVPO,NLIMO,RADN,TRAN,TBND)
C
      CALL CPUTIM (TIMEM2)
      TIMTB = TIMTB+TIMEM2-TIMEM1
      CALL EMOUT (V1PO,V2PO,DVPO,NLIMO,RADN,TRAN,MFILE,NPTS,NPANLS)
      CALL CPUTIM (TIMEM3)
      TIMOT = TIMOT+TIMEM3-TIMEM2
C
C     NPL IS NOW LOCATION OF FIRST ELEMENT TO BE USED FOR NEXT PASS
C
      IPL = -2
      DO 100 NL = NPL, NPE
         IPL = IPL+1
         TRALYR(IPL) = TRALYR(NL)
         RADLYR(IPL) = RADLYR(NL)
  100 CONTINUE
C
      V1P = V1P+FLOAT(NPL+1)*DVP
      NPE = IPL
C
      GO TO 60
  110 CONTINUE
C
      CALL CPUTIM (TIME1)
      TIM = TIME1-TIME
      WRITE (IPR,910) TIME1,TIM,TIMEM,TIMRD,TIMTB,TIMOT
C
      RETURN
C
  900 FORMAT ('0 THE TIME AT THE START OF FLUXDN IS ',F12.3)
  905 FORMAT ('0 INITIAL LAYER',I5,'  FINAL LAYER',I5,/,'0 FILE ',I5,
     *        ' MERGED WITH FILE ',I5,' ONTO FILE',I5,'  WITH XTYPE=',
     *        G15.5)
  910 FORMAT ('0 THE TIME AT THE END OF FLUXDN IS ',F12.3/F12.3,
     *        ' SECS WERE REQUIRED FOR THIS MERGE  - FLXIN - ',F12.3,
     *        ' - READ - ',F12.3,' - EMBND - ',F12.3,' - EMOUT - ',
     *        F12.3)
C
      END
C
C     ----------------------------------------------------------------
C

      SUBROUTINE GETEXT (IEXFIL,LYRNOW,IEMITT) 3,6
C
      IMPLICIT REAL*8           (V)
C
C     THIS SUBROUTINE HAS BEEN MODIFIED TO ALSO READ IN THE ASYMMETRY
C     FACTORS AND TO SEARCH FOR THE PROPER LAYER IF DESIRED.
C
C                                          JAN 1986 (A.E.R. INC.)
C
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFIL,IEXFLD,
     *              NLTEFL,LNFIL4,LNGTH4
C
C     ROUTINE TO BUFFER IN AEROSOL ABSORPTION AND SCATTERRING
C     FROM TAPE 20 INTO COMMON ABSORB SCATTR, AND ASYMT
C
      COMMON /PNLHDR/ V1P,V2P,DVP,NLIM,LDUM
      COMMON /MANE/ P0,TEMP0,NLAYRS,DVXM,H2OSLF,WTOT,ALBAR,ADBAR,AVBAR,
     *              AVFIX,LAYRFX,SECNT0,SAMPLE,DVSET,ALFAL0,AVMASS,
     *              DPTMIN,DPTFAC,ALTAV,AVTRAT,TDIFF1,TDIFF2,ALTD1,
     *              ALTD2,ANGLE,IANT,LTGNT,LH1,LH2,IPFLAG,PLAY,TLAY,
     *              EXTID(10)
C
      character*8      XID,       HMOLID,      YID
      real*8               SECANT,       XALTZ
C
      COMMON /FILHDA/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4),
     *                WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1 ,V2 ,TBOUND,
     *                EMISIV,FSCDID(17),NMOL,LAYRS ,YI1,YID(10),LSTWDF
      COMMON /ABSORA/ V1ABS,V2ABS,DVABS,NPTABS,ABSRB(2025)
      COMMON /SCATTA/ V1SC,V2SC,DVSC,NPTSC,SCTTR(2025)
      COMMON /ASYMMA/ V1AS,V2AS,DVAS,NPTAS,ASYMT(2025)
      DIMENSION APNLHD(2),AFILHD(2)
C
      CHARACTER*40 CEXT
C
      EQUIVALENCE (APNLHD(1),V1P) , (AFILHD(1),XID(1))
C
      IF (IEMITT.EQ.0) THEN
         CALL BUFIN (IEXFIL,IEOF,AFILHD(1),NFHDRF)
C
C     MOVE YID INTO EXTID
C
         WRITE (CEXT,'(5A8)') (YID(I),I=3,7)
         READ (CEXT,'(10A4)') EXTID
      ENDIF
C
      IF (LYRNOW.EQ.1.AND.IEMITT.EQ.1) THEN
         REWIND IEXFIL
         CALL BUFIN (IEXFIL,IEOF,AFILHD(1),NFHDRF)
C
C     MOVE YID INTO EXTID
C
         WRITE (CEXT,'(5A8)') (YID(I),I=3,7)
         READ (CEXT,'(10A4)') EXTID
      ENDIF
C
      LAYER = 0
C
   10 DO 20 I = 1, 2025
         ABSRB(I) = 0.
         SCTTR(I) = 0.
         ASYMT(I) = 0.
   20 CONTINUE
C
      CALL BUFIN (IEXFIL,IEOF,APNLHD(1),NPHDRF)
C
      LAYER = LAYER+1
      IF (IEOF.LE.0) STOP 'GETEXT; IEXFIL EMPTY'
C
      CALL BUFIN (IEXFIL,IEOF,ABSRB(1),NLIM)
      CALL BUFIN (IEXFIL,IEOF,SCTTR(1),NLIM)
      CALL BUFIN (IEXFIL,IEOF,ASYMT(1),NLIM)
C
      V1ABS = V1P
      V1SC = V1P
      V1AS = V1P
      V2ABS = V2P
      V2SC = V2P
      V2AS = V2P
      DVABS = DVP
      DVSC = DVP
      DVAS = DVP
      NPTABS = NLIM
      NPTSC = NLIM
      NPTAS = NLIM
C
      RETURN
C
      END
C
C     ----------------------------------------------------------------
C

      SUBROUTINE ADARSL (NNPTS,IEXFIL,MFILE,IAFIL,IEMIT) 1,12
C
      IMPLICIT REAL*8           (V)
C
C     ROUTINE TO ADD ABSORPTION AND SCATTERING TO THE TRANSMITTANCE
C     VALUES AT EACH POINT. THE AEROSOL VALUES ARE STORED IN
C     COMMON ABSORB AND COMMON SCATTR.
C
      PARAMETER (MXFSC=200, MXLAY=MXFSC+3,MXZMD=3400,
     *           MXPDIM=MXLAY+MXZMD,IM2=MXPDIM-2,MXMOL=35,MXTRAC=22)
C
      COMMON R1(2410)
      COMMON /ABSPNL/ V1P,V2P,DVP,NLIM,NSHFT,NPTS
      COMMON /MANE/ P0,TEMP0,NLAYRS,DVXM,H2OSLF,WTOT,ALBAR,ADBAR,AVBAR,
     *              AVFIX,LAYRFX,SECNT0,SAMPLE,DVSET,ALFAL0,AVMASS,
     *              DPTMIN,DPTFAC,ALTAV,AVTRAT,TDIFF1,TDIFF2,ALTD1,
     *              ALTD2,ANGLE,IANT,LTGNT,LH1,LH2,IPFLAG,PLAY,TLAY,
     *              EXTID(10)
      COMMON /MSACCT/ IOD,IDIR,ITOP,ISURF,MSPTS,MSPANL(MXLAY),
     *                MSPNL1(MXLAY),
     *                MSLAY1,ISFILE,JSFILE,KSFILE,LSFILE,MSFILE,IEFILE,
     *                JEFILE,KEFILE
      COMMON /IFIL/ IRD,IPR,IPU,NOPR,NFHDRF,NPHDRF,NFHDRL,NPHDRL,
     *              NLNGTH,KFILE,KPANEL,LINFIL,NFILE,IAFLD,IEXFLD,
     *              NLTEFL,LNFIL4,LNGTH4
C
      character*8      XID,       HMOLID,      YID
      real*8               SECANT,       XALTZ
C
      COMMON /FILHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4),
     *                WK(60),PZL,PZU,TZL,TZU,WBROAD,DV ,V1 ,V2 ,TBOUND,
     *                EMISIV,FSCDID(17),NMOL,LAYRS ,YI1,YID(10),LSTWDF
C
      EQUIVALENCE (XFILHD(1),XID(1)) , (PNLHD(1),V1P)
      EQUIVALENCE (FSCDID(4),IAERSL)
C
      CHARACTER*40 CEXT,CYID
C
      DIMENSION PNLHD(4),XFILHD(2)
C
      XKT0 = 0.6951*296.
      CALL GETEXT (IEXFIL,LAYRS,IEMIT)
      CALL BUFIN (MFILE,IEOF,XFILHD(1),NFHDRF)
C
C     FOR AEROSOL RUNS, MOVE EXTID INTO YID
C
      WRITE (CEXT,'(10A4)') EXTID
      WRITE (CYID,'(5A8)') (YID(I),I=3,7)
      CYID(19:40) = CEXT(19:40)
      READ (CYID,'(5A8)') (YID(I),I=3,7)
C
      CALL BUFOUT (IAFIL,XFILHD(1),NFHDRF)
      NPANLS = 0
      IF (NOPR.EQ.0) WRITE (IPR,900) XID,(YID(N),N=1,2)
   10 CALL BUFIN (MFILE,IEOF,PNLHD(1),NPHDRF)
      IF (IEOF.LE.0) GO TO 40
      CALL BUFIN (MFILE,IEOF,R1(1),NLIM)
      IF (NPANLS.EQ.0) VIDV = V1P-DVP
      VAER = VIDV
      VITST = VIDV
      NPTS = NNPTS
      RDLAST = -1.
      NLIM1 = 0
      NLIM2 = 0
      RDDUM = 0.
      AF = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
      RDF = RADFNI(VI,DVP,XKT0,VITST,RDEL,RDDUM)
      IAFRD = 0
      IF (VITST.GT.VAER) IAFRD = 1
C
   20 NLIM1 = NLIM2+1
C
      VI = V1P+FLOAT(NLIM1-1)*DVP
      IF (IAFRD.EQ.0) THEN
         RADFN0 = RADFNI(VI,DVP,XKT0,VIDV,RDEL,RDLAST)
         VAER = -VIDV
         EXT = AERF(VI,DVP,VAER,ADEL,TAUSCT,TDEL,GFACT,GDEL)
      ELSE
         EXT = AERF(VI,DVP,VIDV,ADEL,TAUSCT,TDEL,GFACT,GDEL)
         VITST = -VIDV
         RADFN0 = RADFNI(VI,DVP,XKT0,VITST,RDEL,RDLAST)
      ENDIF
C
      NLIM2 = (VIDV-V1P)/DVP+1.001
      NLIM2 = MIN(NLIM2,NLIM)
C
      DO 30 K = NLIM1, NLIM2
         R1(K) = R1(K)+EXT*RADFN0
C
C        Increment interpolation values
C
         EXT = EXT+ADEL
         RADFN0 = RADFN0+RDEL
   30 CONTINUE
C
      IF (NLIM2.LT.NLIM) GO TO 20
C
      CALL ABSOUT (V1P,V2P,DVP,NLIM,1,IAFIL,NPTS,R1,NPANLS)
      GO TO 10
   40 CONTINUE
      IAERSL = 2
      RETURN
C
  900 FORMAT ('1',5X,' AEROSOLS'//1X,10A8,2X,2(1X,A8,1X)//,5X,
     *        'FILE 20 AEROSOL EXTINCTIONS ADDED TO FILE 12 SENT TO ',
     *        'FILE 14')
C
      END
C
C     ----------------------------------------------------------------
C

      FUNCTION AERF (VI,DVI,VINXT,ADEL,TAUSCT,TDEL,GFACT,GDEL) 46
C
      IMPLICIT REAL*8           (V)
C
C     THIS FUNCTION CORRELATES THE AEROSOL FREQ. WITH THE LBLRTM
C     FREQ.  AND ADDS THE ABSORPTION TO THE
C     SCATTERING TO PRODUCE THE EXTINCTION
C
C     THIS FUNCTION HAS BEEN MODIFIED TO RETURN THE SCATTERING
C     SEPARATELY, AND TO ALSO RETURN THE ASYMMETRY FACTOR.
C
C                                         JAN 1986 (A.E.R. INC.)
C
      COMMON /ABSORA/ V1ABS,V2ABS,DVABS,NPTABS,ABSRB(2025)
      COMMON /SCATTA/ V1SC,V2SC,DVSC,NPTSC,SCTTR(2025)
      COMMON /ASYMMA/ V1AS,V2AS,DVAS,NPTAS,ASYMT(2025)
C
      character*8      XID,       HMOLID,      YID
      real*8               SECANT,       XALTZ
C
      COMMON /FILHDR/ XID(10),SECANT,PAVE,TAVE,HMOLID(60),XALTZ(4),
     *                WK(60),PZL,PZU,TZL,TZU,WN2   ,DV ,V1 ,V2 ,TBOUND,
     *                EMISIV,FSCDID(17),NMOL,LAYRS ,YI1,YID(10),LSTWDF
C
      EQUIVALENCE (XFILHD(1),XID(1))
      DIMENSION XFILHD(2)
C
      VDIF = VI-V1ABS
      IAER = VDIF/DVABS+1.00001
      VAER = V1ABS+DVABS*FLOAT(IAER-1)
      DERIVS = (SCTTR(IAER+1)-SCTTR(IAER))/DVABS
      DERIVA = (ASYMT(IAER+1)-ASYMT(IAER))/DVABS
      DERIV = DERIVS+(ABSRB(IAER+1)-ABSRB(IAER))/DVABS
C
C     TAUSCT IS THE SCATTERING TERM
C
      TAUSCT = SCTTR(IAER)+DERIVS*(VI-VAER)
C
C     GFACT IS THE ASYMMETRY FACTOR
C
      GFACT = ASYMT(IAER)+DERIVA*(VI-VAER)
      AERF = SCTTR(IAER)+ABSRB(IAER)+DERIV*(VI-VAER)
C
C     ADEL, TDEL & GDEL ARE THE CHANGE PER DVI
C
      ADEL = DERIV*DVI
      TDEL = DERIVS*DVI
      GDEL = DERIVA*DVI
C
C     Set next point for interpolation to be the point
C     corresponding to the next element of the SCTTR,
C     ASYMT, & ABSRB arrays
C
      VINXT = VAER+DVABS
C
      RETURN
C
      END
C
C     ----------------------------------------------------------------
C

      SUBROUTINE LINTCO(V1,Z1,V2,Z2,VINT,ZINT,ZDEL) 2
C
C     Linearly interpolates emission and reflection values which
C     are directly read in from ASCII files
C
      IMPLICIT REAL*8           (V)
C
C     ZDEL is the slope of the line
C
      ZDEL = (Z2-Z1)/(V2-V1)
C
C     ZCEPT is the intercept for V = 0.0
C
      ZCEPT = Z1 - ZDEL*V1
C
C     Calculate ZINT value at VINT
C
      ZINT = ZDEL*VINT + ZCEPT
C
      RETURN
C
      END
C     ----------------------------------------------------------------