vtf-logo

clawpack/applications/euler_chem/2d/CellStrucModelDet/src/owntabular.f

c
c     Copyright (C) 2002 Ralf Deiterding
c     Brandenburgische Universitaet Cottbus
c
c     Copyright (C) 2003-2007 California Institute of Technology
c     Ralf Deiterding, ralf@amroc.net
c
c  **************************************************************
c
      double precision function avg(Y,f,N)
      implicit double precision(a-h,o-z)
      dimension f(N), Y(N)

      avg = 0.d0
      do i = 1, N
         avg = avg + Y(i)*f(i)
      enddo
      return
      end


c  **************************************************************
c
      double precision function avgtabip(T,Y,tab,N)
      implicit double precision(a-h,o-z)
      include  "ck.i"

      dimension f(lensp), Y(lensp), tab(lensp,TabS:TabE)

      itemp = int(T*TABFAC)
      if (itemp.lt.TabS .or. itemp+1.gt.TabE) then
         write(6,*) 'Error: ',itemp,' not in  avgtabip'
      end if
      
      call tabintp(T,f,tab,N)
      avgtabip = avg(Y,f,N)
      return
      end


c  **************************************************************
c
      subroutine tabintp(T,f,tab,N)
      implicit double precision(a-h,o-z)
      include  "ck.i"

      dimension f(N), tab(lensp,TabS:TabE)
      
      itemp = int(T*TABFAC)
      if (itemp.lt.TabS .or. itemp+1.gt.TabE) then
         write(6,*) 'Error: ',itemp,' not in tabular'
         goto 200
      end if

      alpha = (T - itemp/TABFAC) * TABFAC
      do i = 1, N
         f(i) = (1.d0-alpha)*tab(i,itemp) + alpha*tab(i,itemp+1)
      enddo

 200  continue
      return
      end


c  **************************************************************
c
      subroutine tabsinit(it)
      implicit double precision(a-h,o-z)
      include  "ck.i"

      do itemp = TabS, TabE
         delt = dble(itemp-it)/TABFAC
         do k = 1, Nsp
            cpk(k,itemp) = cpinit(k)
            hms(k,itemp) = hinit(k) + delt * cpinit(k)
         enddo
      enddo
      call tabrange()

 210  continue
      return
      end

c  **************************************************************
c
      subroutine tabrange() 
      implicit double precision(a-h,o-z)
      common /vtabrange/ Trmin, Trmax
      include  "ck.i"
      dimension Yk(leNsp)

      Trmin = TabS/TABFAC
      Trmax = (TabE-1)/TABFAC
      do m = 1, Nsp
         do k = 1, Nsp
            Yk(k) = 0.d0
         enddo 
         Yk(m) = 1.d0
         dso = dsign(1.d0, RU/Wk(m)-avgtabip(Trmin,Yk,cpk,Nsp))
         do itemp = TabS+1, TabE-1
            T = itemp/TABFAC            
            ds = dsign(1.d0, RU/Wk(m)-avgtabip(T,Yk,cpk,Nsp))
            if (ds.ne.dso) Trmax = dmin1(Trmax,(itemp-1)/TABFAC)
            dso = ds
         enddo
      enddo
      if (Trmax.le.(TabE-2)/TABFAC)
     &     write (6,600) Trmin,Trmax,Trmin,(TabE-1)/TABFAC
 600  format('Using temperature range ',f9.2,'-',f9.2,
     &     ' instead of ',f9.2,'-',f9.2)

      return
      end