C***********************************************************************
C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
C***********************************************************************
C
C
C
      PROGRAM DIFF_HX
! 
      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
! 
      REAL*8 Ki,Kd,KL,kk
      INTEGER xtyp
! 
      PARAMETER (PI=3.14159265358979324D0)
      PARAMETER (NM=25,NMT=2*NM,NME=(NM+1)*(NM+1),NMQ=NM*(NM+1))
!     
      COMPLEX*16 SST,ZZ,ZZP,HHH,FHH,RHH,RATIO
      COMPLEX*16 beta,gama,rm,pp1,pp2,pp3
      COMPLEX*16 v,u,DD,R,gg1,gg2,gg3,eta1,eta2
      COMPLEX*16 Psi(0:NMT),Theta(0:NMT)
! 
      COMPLEX*16 EH1(NME),QH1(NMQ)
      COMPLEX*16 DH1(0:NMT),AAH1(-1:NMT),BBH1(-1:NMT)
! 
      COMPLEX*16 EH2(NME),QH2(NMQ)
      COMPLEX*16 DH2(0:NMT),AAH2(-1:NMT),BBH2(-1:NMT)
! 
      DIMENSION LEN(0:NMT),LENE(-1:NM),LENQ(-1:NM)
      DIMENSION XX(0:500)
! 
      CHARACTER*20 DATANM
      CHARACTER*25 OOUUT1
! 
! 
! =>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>  Main body of DIFF_HX
! 
! 
! ********************************************************************
! *                           DATA INPUT                             *
! ********************************************************************
! 
! 
      WRITE (6,6000) 
      READ (5,5000) DATANM
      DO 1 I=1,20
         IF(DATANM(I:I).EQ.' ') GO TO 2
    1 CONTINUE
    2 IF(I.NE.20) THEN
         IM = I-1
      ELSE
         IM = I
      END IF
! 
      OOUUT1 = DATANM(1:IM) //'.C(x)'
! 
      OPEN(UNIT=1,FILE=DATANM,STATUS='OLD')
      OPEN(UNIT=2,FILE=OOUUT1)
! 
      READ(1,*) itype,nequ
      IF(itype.NE.1.AND.itype.NE.2.AND.itype.NE.3) THEN
         WRITE(2,6001) 
         STOP
      END IF
      IF(nequ.NE.1.AND.nequ.NE.2) THEN
         WRITE(2,6002) 
         STOP
      END IF
! 
      READ(1,*) phi,rho,Sr
      READ(1,*) D0,Ds,decay
      READ(1,*) tortp,torti,torts
      READ(1,*) Kd,Ki,KL,kk
! 
      IF(Sr.EQ.0.0d0) Ki = 1.0d0
      IF(Ki.EQ.1.0d0) Sr = 0.0d0
! 
      READ(1,*) Vup,Vdn,A,X
      READ(1,*) M,FACTOR,ERRMAX
      READ(1,*) TIME
      READ(1,*) NSUBD,xtyp
      IF(xtyp.NE.1.AND.xtyp.NE.2) THEN
         WRITE(2,6003) 
         STOP
      END IF
! 
      nxx = 0
      XX(0) = 0.0d0

      IF(xtyp.EQ.1) THEN
         xincr = X/REAL(NSUBD)
         DO 3 n=1,NSUBD
            nxx   = n
            XX(n) = n*xincr
    3    CONTINUE 
      ELSE
         DO 4 n=1,NSUBD
            READ(1,*) NPOINT,xxincr
C 
            DO 4 I=1,NPOINT
               nxx     = nxx+1
               xx(nxx) = xx(nxx-1)+xxincr
               IF(xx(nxx).GT.X) THEN
                  WRITE(2,6004) nxx,xx(nxx)
                  STOP
               END IF
    4    CONTINUE 
      END IF
! 
! ********************************************************************
! *              BASIC PARAMETERS & ARRAY DIMENSIONING               *
! ********************************************************************
! 
      LENE(-1) = 0
      LENQ(-1) = 0
      DO 5 I=0,NMT
         LEN(I)  = 0
    5 CONTINUE
      DO 6 I=0,NM
         LENE(I) = 0
         LENQ(I) = 0
    6 CONTINUE
! 
      M2      = 2*M
      LEN(0)  = M2
      LEN(1)  = M2
      DO 8 I=2,M2
         LEN(I) = LEN(I-1)-1
    8 CONTINUE
!     
      NSUME = 0
      NSUMQ = 0
      DO 9 I=0,M2
         IF(MOD(I,2).EQ.0) THEN
            IE       = I/2
            NSUME    = NSUME+LEN(I)
            LENE(IE) = NSUME
         ELSE
            IQ       = I/2+1
            NSUMQ    = NSUMQ+LEN(I)
            LENQ(IQ) = NSUMQ
         END IF
    9 CONTINUE
C 
      h   = 1.0d0-Sr+Sr*Ki
      w0  = ((1.0d0-phi)/phi)*rho
      w   = w0*Kd*Ki
      DT  = D0*(tortp*(1.0d0-Sr)+torti*Sr*Ki)
C 
C 
C 
C **********************************************************************
C *            DIFFUSION WITH LINEAR EQUILIBRIUM SORPTION              *
C **********************************************************************
C 
      IF(itype.EQ.1) THEN
         KL = 0.0d0
         kk = 0.0d0
C 
C **********************************************************************
C *               DIFFUSION WITH KINETIC LINEAR SORPTION               *
C **********************************************************************
C 
      ELSE IF(itype.EQ.2) THEN
         KL = 0.0d0
         u0 = w*kk
C 
C **********************************************************************
C *          DIFFUSION WITH IRREVERSIBLE LINEAR SORPTION               *
C **********************************************************************
C 
      ELSE 
         kk = 0.0d0
         v0 = w0*KL*Ki
      END IF 
C 
C 
C 
C 
C **********************************************************************
C **********************************************************************
C **********************************************************************
C *                           THE TIME LOOP                            *
C **********************************************************************
C **********************************************************************
C **********************************************************************
C 
C 
C 
C 
      DO 1000 NUU=0,nxx
! 
         TPRIOD = FACTOR*TIME
         GAMMA = -DLOG(ERRMAX)/(2.0D0*TPRIOD)
!              
         Sfact = (1.0D0/TPRIOD)*DEXP(GAMMA*TIME)
! 
         DO 10 I=0,M2
            ARGG  = I*PI/TPRIOD
            SST   = DCMPLX(GAMMA,ARGG)
C 
C **********************************************************************
C *            DIFFUSION WITH LINEAR EQUILIBRIUM SORPTION              *
C **********************************************************************
C 
            IF(itype.EQ.1) THEN
               R  = DCMPLX(h+w,0.0d0)
               DD = DCMPLX((DT+Ds*torts*w),0.0d0)
C 
C **********************************************************************
C *               DIFFUSION WITH KINETIC LINEAR SORPTION               *
C **********************************************************************
C 
            ELSE IF(itype.EQ.2) THEN
               u  = u0/(sst+kk+decay)
               R  = h+u
               DD = DT+Ds*torts*u
C 
C **********************************************************************
C *          DIFFUSION WITH IRREVERSIBLE LINEAR SORPTION               *
C **********************************************************************
C 
            ELSE
               v  = v0/(sst+decay)
               R  = h+v
               DD = DT+Ds*torts*v
            END IF
C 
            rm = cdsqrt(R*(sst+decay)/DD)
C 
            gg1 = phi*DD*A*rm
            gg2 = Vdn*(sst+decay)
            IF(Vdn.NE.0.0d0) THEN
               gama = (gg1-gg2)/(gg1+gg2)
            ELSE
               gama = DCMPLX(1.0d0,0.0D0)
            END IF
C 
            IF(nequ.EQ.1) THEN
               pp1  = Vup*(1.0d0+gama*exp(-2.0d0*rm*X))
               pp2  = (phi*A*R/rm)*(1.0d0-gama*exp(-2.0d0*rm*X))
               pp3  = (Vdn*(1.0d0+gama)-(phi*A*R/rm)*(1.0d0-gama))
     &                *exp(-rm*X)
               beta = Vup/((sst+decay)*(pp1+pp2+pp3))
            ELSE
               gg3  = Vup*(sst+decay)
               eta1 = gg3-gg1
               eta2 = gg3+gg1
               beta = Vup/(eta2+gama*eta1*exp(-2.0d0*rm*X))
            END IF
C 
            Psi(I) = beta*(gama*exp(rm*(XX(nuu)-2.0d0*X))
     &                    +exp(-rm*XX(nuu)))
C 
            IF(itype.EQ.2) Theta(I) = Psi(I)*u/w0
            IF(itype.EQ.3) Theta(I) = Psi(I)*v/w0
C
            IF(I.EQ.0) THEN
               Psi(0)   = 5.0d-1*Psi(0)
               Theta(0) = 5.0d-1*Theta(0)
            END IF
!     
   10    CONTINUE
! 
! ********************************************************************
! *                EVALUATION OF EH, QH, DH, AAH, BBH                *
! ********************************************************************
! 
         DO 15 I=1,M2
            EH1(I) = (0.0D0,0.0D0)
            IF(itype.GT.1) EH2(I) = (0.0D0,0.0D0)
   15    CONTINUE
!     
         DO 20 I=1,M2
            I1    = I-1
            QH1(I) = Psi(I)/(Psi(I1)+1.0d-35)
            IF(itype.GT.1) QH2(I) = Theta(I)/(Theta(I1)+1.0d-35)
   20    CONTINUE
!     
         DO 40 J=1,M
            DO 25 I1=0,M2-2*J
               I   = I1+1
               NN  = LENE(J-1)+I
               NN1 = LENQ(J-1)+I
               NN2 = LENE(J-2)+I
!              
               EH1(NN) = QH1(NN1+1)-QH1(NN1)+EH1(NN2+1)
               IF(itype.GT.1) EH2(NN) = QH2(NN1+1)
     &                                 -QH2(NN1)+EH2(NN2+1)
   25       CONTINUE
!              
            DO 30 I1=0,M2-2*J-1
               I   = I1+1
               NN  = LENQ(J)+I
               NN1 = LENE(J-1)+I
               NN2 = LENQ(J-1)+I
!              
               QH1(NN) = QH1(NN2+1)*EH1(NN1+1)/(EH1(NN1)+1.0d-35)
               IF(itype.GT.1) 
     &            QH2(NN) = QH2(NN2+1)
     &                     *EH2(NN1+1)/(EH2(NN1)+1.0d-35)
   30       CONTINUE
   40    CONTINUE
!              
         DH1(0) = Psi(0)
         IF(itype.GT.1) DH2(0) = Theta(0)
!              
         DO 50 I=1,M
            I1  = 2*I-1
            I2  = 2*I
            NN1 = LENQ(I-1)+1
            NN2 = LENE(I-1)+1
!                
            DH1(I1) = -QH1(NN1)
            DH1(I2) = -EH1(NN2)
!                
            IF(itype.GT.1) THEN
               DH2(I1) = -QH2(NN1)
               DH2(I2) = -EH2(NN2)
            END IF
   50    CONTINUE
!              
!              
!              
         AAH1(-1) = (0.0D0,0.0D0)
         BBH1(-1) = (1.0D0,0.0D0)
         AAH1(0)  = DH1(0)
         BBH1(0)  = (1.0D0,0.0D0)
!              
         IF(itype.GT.1) THEN 
            AAH2(-1) = (0.0D0,0.0D0)
            BBH2(-1) = (1.0D0,0.0D0)
            AAH2(0)  = DH2(0)
            BBH2(0)  = (1.0D0,0.0D0)
         END IF
!              
         ARGG  = PI*TIME/TPRIOD
         AR1   = DCOS(ARGG)
         AR2   = DSIN(ARGG)
         ZZ    = DCMPLX(AR1,AR2)
!              
         DO 60 I=1,M2-1
            IM1   = I-1
            IM2   = I-2
!              
            ZZP     = DH1(I)*ZZ
            AAH1(I) = AAH1(IM1)+ZZP*AAH1(IM2)
            BBH1(I) = BBH1(IM1)+ZZP*BBH1(IM2)
!              
            IF(itype.GT.1) THEN 
               ZZP     = DH2(I)*ZZ
               AAH2(I) = AAH2(IM1)+ZZP*AAH2(IM2)
               BBH2(I) = BBH2(IM1)+ZZP*BBH2(IM2)
            END IF
   60    CONTINUE
!              
         HHH = 5.0D-1*(1.0D0+ZZ*(DH1(M2-1)-DH1(M2)))
         FHH = 1.0D0+(ZZ*DH1(M2)/(HHH*HHH))
         RHH =-HHH*(1.0D0-CDSQRT(FHH))
!              
         AAH1(M2) = AAH1(M2-1)+RHH*AAH1(M2-2)
         BBH1(M2) = BBH1(M2-1)+RHH*BBH1(M2-2)
         RATIO    = AAH1(M2)/BBH1(M2)
!              
         Cx = Sfact*REAL(RATIO) 
!              
         IF(itype.EQ.1) THEN 
            Fx = Kd*Ki*Cx
         ELSE 
            HHH = 5.0D-1*(1.0D0+ZZ*(DH2(M2-1)-DH2(M2)))
            FHH = 1.0D0+(ZZ*DH2(M2)/(HHH*HHH))
            RHH =-HHH*(1.0D0-CDSQRT(FHH))
!              
            AAH2(M2) = AAH2(M2-1)+RHH*AAH2(M2-2)
            BBH2(M2) = BBH2(M2-1)+RHH*BBH2(M2-2)
            RATIO    = AAH2(M2)/BBH2(M2)
!              
            Fx = Sfact*REAL(RATIO) 
		 END IF
!              
         IF(DABS(Cx).LT.1.0d-20) Cx = 0.0d0
         IF(DABS(Fx).LT.1.0d-20) Fx = 0.0d0
!              
         WRITE(2,6005) TIME,xx(nuu),Cx,Fx
!              
 1000 CONTINUE
! 
! 
! **********************************************************************
! *                           F O R M A T S                            *
! **********************************************************************
! 
! 
 5000 FORMAT(3(A20))
! 
 6000 FORMAT(T5,'ENTER THE NAME OF THE DATA FILE')
 6001 FORMAT(T5,'!!!!!  UNAVAILABLE TYPE OF DIFFUSION  !!!!!',/,
     &       T5,'THE RUN WAS ABORTED - CORRECT AND TRY AGAIN',)
 6002 FORMAT(T5,'!!!!!   UNAVAILABLE SET OF EQUATIONS  !!!!!',/,
     &       T5,'THE RUN WAS ABORTED - CORRECT AND TRY AGAIN',)
 6003 FORMAT(T5,'!!!!!    UNAVAILABLE SPACE OPTION     !!!!!',/,
     &       T5,'THE RUN WAS ABORTED - CORRECT AND TRY AGAIN',)
 6004 FORMAT(T5,'!!!!!   XX(',i3,') = ',1pe11.4,
     &          ' > SAMPLE WIDTH X   !!!!!',/,
     &       T5,'THE RUN WAS ABORTED - CORRECT AND TRY AGAIN',)
 6005 FORMAT(T5,5(1PE15.8,5x))
! 
! 
! =>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>   End of DIFF_XH
! 
! 
      STOP
      END
C
C
C
C***********************************************************************
C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
C***********************************************************************
