      SUBROUTINE JVALUE(K)


      INCLUDE 'PARAMETERS.INC'


      COMMON

     &      /BLOCK1/  NDISSC

     &      /BLOCK7/  RATE(IB,NALT)

     &      /BLOCK8/  IPHOTO(IB) , LAST(IB) ,
     &                LOW(IB) , SIGMA(NWAVE,IB)

     &      /BLOCK19/ TRANS(NWAVE,NALT)

     &      /ONED35/  FLUX(NWAVE)


C THIS SUBROUTINE COMPUTES THE JVALUES


      DO I = 1 , NDISSC
        IP = IPHOTO(I)

        IF (IPHOTO(I).eq.0) GO TO 555

        IF ( (IP .NE. 0) .AND.
     &        (LAST(IP) .NE. 0 )  ) THEN   ! SKIP PHOTOLYSIS BELOW
                                                  ! LYMAN ALPHA
          L1 = LOW( IP )
          L2 = LAST( IP )
 
C USE MIDPOINT RULE TO NUMERICALLY INTEGRATE THE PHOTODISSOCIATION
C INTEGRAL

C CALCULATE PORTION BELOW SRB

          RJ = 0.0D0
          DO LAMBDA = L1 , LYMAN + 10
            RJ = RJ + FLUX(LAMBDA)*
     &                SIGMA(LAMBDA,IP)*
     &                TRANS(LAMBDA,K)
          ENDDO

C ADD ON SRB CONTRIBUTION (IF ANY)

          IF( (L1 .LE. LYMAN+16) .AND.
     &        (L2 .GE. LYMAN+11) )THEN
            RJ = RJ + RJSRB(I,K)
          ENDIF

C ADD ON PORTION BEYOND SRB

          DO LAMBDA = LYMAN + 17 , L2
            RJ = RJ + FLUX(LAMBDA)*
     &                SIGMA(LAMBDA,IP)*
     &                TRANS(LAMBDA,K)
          ENDDO
 
          RATE(I,K) = RJ

        ENDIF


555     ENDDO



      RETURN
      END


C-------------------------------------------------------------------------------
C-------------------------------------------------------------------------------
C-------------------------------------------------------------------------------



      SUBROUTINE RJAVG

      INCLUDE 'PARAMETERS.INC'

      INCLUDE 'PLANET.INC'

      COMMON

     &      /SWITCHES/ ZLAT , DELTAT , DELT1 , DAYSTART ,
     &                 TIMESTART , TIMESTOP , OUTTIME ,
     &                 MODE , NTIME , NITER , IDIFF , istepdump

     &      /BLOCK6/  MCROSS(MB)

     &      /BLOCK12/ CROSS(NWAVE,MB)

     &      /BLOCK14/ MTAU(MB)

     &      /BLOCK16/ COSSZA(NTRAP)

     &      /BLOCK17/ NANGLE(NALT)

     &      /BLOCK19/ TRANS(NWAVE,NALT)

     &      /BLOCK30/ NPI2

     &      /ONED46/  COLUMN(NTRAP,NALT,MB)

     &      /BLOCK41/ S(NTRAP,NWAVE,NALT)



C THIS SUBROUTINE COMPUTES THE DIURNAL AVERAGE OF EXP(-TAU). IT CAN BE RUN
C IN TWO MODES. SETTING ISPHERE = 0 PRODUCES A PLANE-PARALLEL ATMOSPHERE. THIS
C MODE DIFFERS FROM THE SECANT APPROXIMATION IN THAT THE DIFFERENTIAL
C SLANT PATH IS APPROXIMATED BY A MORE ACCURATE FORMULA FOR HIGH SOLAR
C ZENITH ANGLES ( THE SECANT BLOWS UP WHEN CHI = PI/2 ). SETTING ISPHERE = 1
C PRODUCES THE FULL RAY-TRACE CALCULATION FOR A SPHERICAL ATMOSPHERE.
 
 
C COMPUTE OPTICAL DEPTHS FOR SZA < 90 DEGREES

C CALCULATE DIFFERENTIAL OPTICAL DEPTH AT KTH LAYER

      DO K = 1 , NALT
        DO NANG = 1 , NPI2
          COL1 = COLUMN(NANG,K,MTAU(1))
          COL2 = COLUMN(NANG,K,MTAU(2))
          COL3 = COLUMN(NANG,K,MTAU(3))
          DO LAMBDA = 1 , NWAVE
            TAU = COL1*CROSS(LAMBDA,MCROSS(1)) +
     &            COL2*CROSS(LAMBDA,MCROSS(2)) +
     &            COL3*CROSS(LAMBDA,MCROSS(3))
            S(NANG,LAMBDA,K) = DEXP(-TAU)
          ENDDO
        ENDDO
      ENDDO

      IF( ISPHERE .EQ. 1 ) THEN
        DO K = 1 , NALT
          N1 = NPI2 + 1
          N2 = NANGLE(K)
          DO NANG = N1 , N2
            COL1 = COLUMN(NANG,K,MTAU(1))
            COL2 = COLUMN(NANG,K,MTAU(2))
            COL3 = COLUMN(NANG,K,MTAU(3))
            DO LAMBDA = 1 , NWAVE
              TAU = COL1*CROSS(LAMBDA,MCROSS(1)) +
     &              COL2*CROSS(LAMBDA,MCROSS(2)) +
     &              COL3*CROSS(LAMBDA,MCROSS(3))
              S(NANG,LAMBDA,K) = DEXP(-TAU)
            ENDDO
          ENDDO
        ENDDO
      ENDIF  ! END RAY-TRACE COMPUTATIONS

      IF( IDIFF .EQ. 1 ) THEN
        CALL ALBAVG           ! ADD GROUND ALBEDO ONTO S
        CALL MSAVG            ! MULTIPLE SCATTERING CONTRIBUTION
      ENDIF

C############################################################################


C CALCULATE DIURNAL AVERAGE OF EXP(-TAU)
C USE TRAPEZOIDAL RULE TO DO TIME INTEGRATION


      DO K = 1 , NALT

        IF( ISPHERE .EQ. 1 ) THEN
          NEND = NANGLE(K) - 1
        ELSE
          NEND = NPI2 - 1
        ENDIF

        DO LAMBDA = 1 , NWAVE
          SUM = 0.0D0
          DO NANG = 1 , NEND
            SUM = SUM + 0.5D0*(S(NANG,LAMBDA,K) + S(NANG+1,LAMBDA,K))
          ENDDO

          IF( NEND .EQ. 0 ) THEN  ! SPECIAL CASE
            SUM = 0.5D0*S(1,LAMBDA,K)
          ENDIF

          TRANS(LAMBDA,K) = SUM/(NTRAP-1.0)
        ENDDO
      ENDDO


      RETURN
      END


C-------------------------------------------------------------------------------
C-------------------------------------------------------------------------------
C-------------------------------------------------------------------------------



      SUBROUTINE RJDIURN

      INCLUDE 'PARAMETERS.INC'

      INCLUDE 'PLANET.INC'

      COMMON

     &      /SWITCHES/ ZLAT , DELTAT , DELT1 , DAYSTART ,
     &                 TIMESTART , TIMESTOP , OUTTIME ,
     &                 MODE , NTIME , NITER , IDIFF , istepdump

     &      /BLOCK6/  MCROSS(MB)

     &      /BLOCK12/ CROSS(NWAVE,MB)

     &      /BLOCK14/ MTAU(MB)

     &      /BLOCK19/ TRANS(NWAVE,NALT)

     &      /BLOCK27/ PI

     &      /ONED15/  THOUR

     &      /ONED32/  SUNRISE(NALT) , SUNSET(NALT)

     &      /ONED41/  SZA

     &      /ONED47/  COLUMN(NALT,MB)


C THIS SUBROUTINE COMPUTES EXP(-TAU). IT CAN BE RUN IN TWO MODES.
C SETTING ISPHERE = 0 PRODUCES A PLANE-PARALLEL ATMOSPHERE. THIS
C MODE DIFFERS FROM THE SECANT APPROXIMATION IN THAT THE DIFFERENTIAL
C SLANT PATH IS APPROXIMATED BY A MORE ACCURATE FORMULA FOR HIGH SOLAR
C ZENITH ANGLES ( THE SECANT BLOWS UP WHEN CHI = PI/2 ). SETTING ISPHERE = 1
C PRODUCES THE FULL RAY-TRACE CALCULATION FOR A SPHERICAL ATMOSPHERE.

 
C COMPUTE OPTICAL DEPTH USING SIMPLIFIED CALCULATIONS FOR SZA < 90 DEGREES

      IF( SZA .LE. PI/2.0 ) THEN
        DO K = 1 , NALT
          COL1 = COLUMN(K,MTAU(1))
          COL2 = COLUMN(K,MTAU(2))
          COL3 = COLUMN(K,MTAU(3))
          DO LAMBDA = 1 , NWAVE
            TAU = COL1*CROSS(LAMBDA,MCROSS(1)) +
     &            COL2*CROSS(LAMBDA,MCROSS(2)) +
     &            COL3*CROSS(LAMBDA,MCROSS(3))
            TRANS(LAMBDA,K) = DEXP(-TAU)
          ENDDO
        ENDDO
        IF( IDIFF .EQ. 1 ) THEN
          CALL ALBDIU     ! ADD GROUND ALBEDO ONTO TRANS
          CALL MSDIU      ! INCLUDE MULTIPLE SCATTERING CONTRIBUTION
        ENDIF
      ENDIF   ! END SZA < 90

C CALCULATE OPTICAL DEPTHS FOR SOLAR ZENITH ANGLES > PI/2. THE COLUMN DEPTH IS
C COMPUTED BY SUBTRACTING THE COLUMN DEPTH AT ANGLE PI - CHI FROM TWICE THE
C COLUMND DEPTH TO THE TANGENT POINT.

      IF( (SZA .GT. PI/2.0) .AND. (ISPHERE .EQ. 1) ) THEN

        DO K = 1 , NALT
          IF( (THOUR .GE. SUNRISE(K)) .AND.
     &        (THOUR .LT. SUNSET(K)) )THEN

            COL1 = COLUMN(K,MTAU(1))
            COL2 = COLUMN(K,MTAU(2))
            COL3 = COLUMN(K,MTAU(3))
            DO LAMBDA = 1 , NWAVE
              TAU = COL1*CROSS(LAMBDA,MCROSS(1)) +
     &              COL2*CROSS(LAMBDA,MCROSS(2)) +
     &              COL3*CROSS(LAMBDA,MCROSS(3))
              TRANS(LAMBDA,K) = DEXP(-TAU)
            ENDDO

          ELSE

            DO LAMBDA = 1 , NWAVE
              TRANS(LAMBDA,K) = 0.0D0  ! IN DARKNESS
            ENDDO

          ENDIF
    
        ENDDO      ! END LOOP OVER K

      ENDIF        ! END SZA > 90 (SPHERICAL CASE)

      IF( (SZA .GT. PI/2.0) .AND. (ISPHERE .EQ. 0) ) THEN

         DO K = 1 , NALT
           DO LAMBDA = 1 , NWAVE
             TRANS(LAMBDA,K) = 0.0D0
           ENDDO
         ENDDO

      ENDIF        ! (NON-SPHERICAL CASE)



      RETURN
      END

