!*****    PROGRAM  FOR COMPUTATION OF THE INTEGRATED OPTICAL CHARACTERISTICS ***
!*****    OF ATMOSPHERIC AEROSOLS                                           *****
!***         ( NC_MAX   - MAX. NUMBER OF COMPONENTS  )        **
!***         ( NP       - MAX. NUMBER OF ANGULAR POINTS  )    **
!***         ( NDV_MAX  - MAX. NUMBER OF WAVELENGTHS  )       **
!*****************************************************************
      PARAMETER (NC_MAX=5,NP=204,NDV_MAX=70,
     +           pi=3.14159265358D0)
      REAL*4    dlm,lm1,lm3,ex1,ex3,w1,w3,
     +          ex(NC_MAX),w(NC_MAX),smu(NC_MAX),s(NC_MAX),
     +          ex0,w0,smu0,s0
      REAL*8    mu,ug,ug_n,mu_n,dmu
      INTEGER   n_ug
      CHARACTER s_dat*12,ind_dat*12,
     +          name_m0*12,name_ug0*12,
     +          name_m*12, name_ug*12,
     +          nc_ind*12,buf*80
      DIMENSION n_ug(NC_MAX),
     +          d1(NP),d2(NC_MAX,NP),d3(NP),ug(NP),mu(NP),dv(NDV_MAX),
     +          d0(NP),si(NC_MAX),n_m(NC_MAX),
     +          ug_n(NC_MAX,NP),mu_n(NC_MAX,NP),dv_n(NC_MAX,NDV_MAX),
     +          name_m(NC_MAX), name_ug(NC_MAX),
     +          nc_ind(NC_MAX)
c *****
      OPEN(11,file = 'inp_comp.dat')
      READ (11,43) n_comp,n_m0,name_m0,n_ug0,name_ug0,
     +              s_dat,ind_dat,buf
43    FORMAT(I6/I6/A12/I6/A12/A12/A12/A50)
      PRINT 50, n_comp,n_m0,name_m0,n_ug0,name_ug0,s_dat,ind_dat
50    FORMAT (/
     + ' **              NUMBER OF AEROSOL COMPONENTS: ',I3/
     + ' **                     NUMBER OF WAVELENGTHS: ',I3/
     + ' **        NAME  OF THE FILE WITH WAVELENGTHS: ',A/
     + ' **      TOTAL NUMBER OF ANGULAR NODAL POINTS: ',I3/
     + ' ** NAME  OF THE FILE OF ANGULAR NODAL POINTS: ',A/
     + ' **   NAME  OF THE OUTPUT FILE FOR EXTINCTION: ',A/
     + ' **   NAME  OF THE OUTPUT FILE FOR PHASE FUNCTION: ',A/)
      pause
c *************************************************
      OPEN  (41,file=s_dat)
      OPEN  (21,file=name_m0)
      READ(21,*)(dv(i),i=1,n_m0)
      CLOSE (21)
c *************************************************
      OPEN  (21,file=name_ug0)
      READ  (21,*) (ug(i),i=1,n_ug0)
      CLOSE (21)
      DO i1=1,n_ug0
         mu(i1)=dcos(pi/180.d0*ug(i1))
      END DO
c *************************************************
c ******    BEGINNING OF COMPONENT LOOP    *************
      DO i0 = 1,n_comp
        READ (11,111) n_m(i0),nc_ind(i0),si(i0),
     +                name_m(i0),n_ug(i0),name_ug(i0),buf
111   FORMAT(I6/A12/E14.6/A12/I6/A12/A50)
  Write(*,102)
     +  '  *****  COMPONENT NUMBER:   ', I0, '  *****',
     +  '  **   NAME  OF THE INPUT FILE FOR PHASE FUNCTION: ',
     +       nc_ind(i0),
     +  '  **         NUMBER OF PARTICLES OF THIS KIND: ',si(i0),
     +  '  **                    NUMBER OF WAVELENGTHS: ',n_m(i0),
     +  '  **         NAME OF THE FILE FOR WAVELENGTHS: ',name_m(i0),
     +  '  **     TOTAL NUMBER OF ANGULAR NODAL POINTS: ',n_ug(i0),
     +  '  **     NAME  OF THE FILE FOR ANGULAR POINTS: ',name_ug(i0)
102     FORMAT(A,I3,A/A48,A,/A48,E12.4/A48,I6/A48,A12/A48,i6/A48,A12)
c ******************************************************************
        pause
        OPEN  (21,file=name_m(i0))
        READ(21,*)(dv_n(i0,i),i=1,n_m(i0))
        CLOSE (21)
c ***********
        OPEN  (21,file=name_ug(i0))
        READ  (21,*) (ug_n(i0,i),i=1,n_ug(i0))
        CLOSE (21)
        DO i1=1,n_ug(i0)
           mu_n(i0,i1)=dcos(pi/180.d0*ug_n(i0,i1))
        END DO
      END DO
      PRINT *, ' ***************************************************'
c ***************************************************************
      OPEN (66,FILE = ind_dat, ACCESS='DIRECT',
     +FORM = 'UNFORMATTED',RECL=4*n_ug0+24 ) !  NN+lm+1+...+n_ug
      DO il=1,n_m0
        dlm=dv(il)
        ex0=0.
        e_sct =0.
        DO i=1,n_ug0
          d0(i)=0.
        END DO
        DO i0=1,n_comp
          iv =1
20        iv=iv+1
          IF (iv .GT. n_m(i0) .OR. dlm .LT. dv_n(i0,1))THEN
            PRINT *, '** ERROR OF LENGTH-WAVE IN ',name_m(i0)
            STOP
          END IF
          IF (dlm .GT. dv_n(i0,iv)) GOTO 20
c ********
          OPEN (61,FILE = nc_ind(i0), ACCESS='DIRECT',
     +    FORM = 'UNFORMATTED',RECL=4*n_ug(i0)+24 ) !  NN+lm+1+...+n_ug
          READ(61,REC=iv-1)q1,lm1,ex1,w1,smu1,s1,(d1(I),i=1,n_ug(i0))
          READ(61,REC=iv)  q3,lm3,ex3,w3,smu3,s3,(d3(I),i=1,n_ug(i0))
          CLOSE(61)
          DO i1=1,n_ug(i0)
             d2(i0,i1)=d1(i1)+(d3(i1)-d1(i1))/(lm3-lm1)*(dlm-lm1)
          END DO
          ex(i0)=ex1+(ex3-ex1)/(lm3-lm1)*(dlm-lm1)
          w(i0) = w1+( w3- w1)/(lm3-lm1)*(dlm-lm1)
          smu(i0) = smu1+(smu3- smu1)/(lm3-lm1)*(dlm-lm1)
          s(i0) = s1+( s3- s1)/(lm3-lm1)*(dlm-lm1)
          ex0=ex0+ex(i0)*si(i0)
          e_sct=e_sct+ex(i0)*w(i0)*si(i0)
        END DO
        w0= e_sct/ex0
        DO i1=1,n_ug0
          d0(i1)=0.
          DO i0=1,n_comp
            iv =1
25          iv=iv+1
            IF(mu(i1).GE.mu_n(i0,iv).AND.mu(i1).LE.mu_n(i0,iv-1))THEN
            ELSE
               GOTO 25
            END IF
             dmu=mu(i1) - mu_n(i0,iv-1)
             dd2=d2(i0,iv)-d2(i0,iv-1)
             d10=d2(i0,iv-1)+dd2/
     +           (mu_n(i0,iv)-mu_n(i0,iv-1))* dmu
             dd2=d10*ex(i0)*w(i0)*si(i0)/e_sct
             d0(i1)=d0(i1)+ dd2
          END DO
        END DO
        s0=0
        smu0=0
        DO j=1,n_ug0-1
           s0  =s0  +(d0(j)+d0(j+1))/2.*(mu(j)-mu(j+1))
           smu0=smu0+d0(j)*mu(j)*(mu(j)-mu(j+1))+(d0(j+1)-d0(j))/2.*
     +                       (mu(j)-mu(j+1))
        END DO
        q1=il
        smu0=smu0/s0
        s0=2.*pi*s0
        WRITE(66,REC=il)q1,dlm,ex0,w0,smu0,s0,(d0(I),i=1,n_ug0)
        WRITE (41,'(I3,2x,F6.3,2x,3(E12.5,2x),F6.3)')
     +             il,dlm,ex0,w0,smu0,s0
        WRITE (* ,'(I3,2x,F6.3,2x,3(E12.5,2x),F6.3)')
     +             il,dlm,ex0,w0,smu0,s0
      END DO
      END