c

C.... File name ................. GXDENS.HTM .................... 021110
C
      FUNCTION DENSITY(I)
      INCLUDE 'farray'
      INCLUDE 'grdloc'
      INCLUDE 'satgrd'
      INCLUDE 'satear'
      INCLUDE 'grdear'
      INCLUDE 'prpcmn'
      COMMON/GENI/IGF1(2),NXNYST,NDIR,KDUMM,IGF2(4),NFM,IGF3(39),
     1            ITEM1,ITEM2,ISPH1,ISPH2,ICON1,ICON2,IPRPS,IGF4(4)
     1      /CELPAR/IPHASE,IPROP,IGRND,IFILEP,KPROP
      COMMON/HBASE/IH01,IH02,KH01,KH01H,KH01L,KH02,KH02H,KH02L,L0H012
      common/dbe/dbear
      logical dbear
C
c
      IF(IGRND.EQ.-1) THEN ! default when RHO1 or 2 is greater than zero
        DENSITY=PRPRTY
      ELSEIF(IGRND.LE.2) THEN ! when RHO1 or 2=GRND1 or GRND2
c
C.... Density is a linear function or the reciprocal of a linear function
C     of either a scalar (enthalpy or other scalar); or two scalars; or
C     three:
c
        IF(L0SCAL.GT.0) DENSITY=RHOAG   + RHOBG*F(L0SCAL+I)
        IF(L0CA.GT.0)   DENSITY=DENSITY + RHOCG*F(L0CA+I)
        IF(L0CB.GT.0)   DENSITY=DENSITY + RHODG*F(L0CB+I)
c
        IF(IGRND.EQ.2) DENSITY=1./DENSITY
c
      ELSEIF(IGRND.EQ.3) THEN ! when RHO1 or 2=GRND1
c
C.... Density for the compressible flow and also shallow-water theory:
cccc        call writ3r('rhoag  ',rhoag,'rhobg   ',rhobg,'rhocg   ',rhocg)
        DENSITY=RHOAG * (AMAX1(0.,ABSPRES(I)))**RHOBG + RHOCG
c
C.... Multiplication by C3 is useful when two compressible gases are
C     present in the same domain. C3 has of course to be computed so as
C     to "travel" with the gas which it marks:
c
        IF(L0SCAL.NE.0) DENSITY=DENSITY*F(L0SCAL+I)
c
C.... For shallow-water theory with NZ > 1, and compressibility in the
C     upper (lower-IZ) cell only, the density is set to -RHO2 except in
C     topmost cells (IZ=1):
c
        IF(SHALWT) DENSITY=- RHO2
c
      ELSEIF(IGRND.EQ.4) THEN
c
C.... Density is a linear function of temperature:
c
        DENSITY=RHOAG + RHOBG*(F(L0TEM+I)+TEMP0)
c
      ELSEIF(IGRND.EQ.5) THEN
c
C.... Density according to the ideal-gas law:
        ABST=ABSTEMP(I)                         ! get absolute temperature
        IF(L0SCAL.GT.0.AND.RHOAG.GT.0.0) THEN   ! for a mixture of 2 gases
          SPEVOL=RHOAG + (RHOBG-RHOAG) * F(L0SCAL+I)  ! the scalar is C1 or
          DENSITY=ABSPRES(I) / (SPEVOL * ABST)         ! C2, according to phase
        ELSE                                            ! RHOAG and RHOBG are
          DENSITY=RHOBG * ABSPRES(I) / ABST            ! the ideal-gas constant
        ENDIF                                           ! of the gases
c
       ELSEIF(IGRND.EQ.6) THEN
c
C.... Ideal-gas law for mixture of the three chemical 'species' fuel,
C     oxidant and product involved in the simple chemical reaction
C     model (Parameters RHOA,RHOB and RHOC are the molecular weights
C     of fuel, oxidant and products respectively):
c
        ABST=ABSTEMP(I)
        IF(ABST.GT.0.0) THEN
          RMIX=(F(L0FUEL+I)/RHOAG + F(L0OXID+I)/RHOBG +
     1                                    F(L0PROD+I)/RHOCG) * GASCON
          DENSITY=ABSPRES(I)/(RMIX * ABST)
        ELSE
          call writ40('absolute temperature less than zero')
          call writ40('density set to 1.0                 ')
          density=1.0
        ENDIF
c
      ELSEIF(IGRND.EQ.7) THEN
c
C.... Ideal-gas law for a mixture of the 7 gases involved in a simple
C     model of the combustion of hydrocarbons in air.
Click here for explanation
C.... Mass fraction of anything but air is FNOTAIR.
C!!!! Note that prior to the generalization of March 2002, it has been
c     that any material injected which did not have a finite MIXF value
c     was air, with .232 O2 content and .768 N2 content.
c     This presumption is preserved here.
c
C.... FO, FC and FH are the mass fractions of the elements O, C and H,
C     regardless of which compound they are contained in.
        FC=0.0 ; FH=0.0 ; FO=0.0 ; FN=0.0  ! initialise to zero
        FNOTAIR=0.0
        IF(L0MIXF.NE.0) THEN
          FMXF0=F(L0MIXF+I)        ! mass fraction of material from inlet 0
          FH=FH + RHOBG * FMXF0       ! stream * hydrogen content (rhobg)
          FC=FC + RHOAG * FMXF0       !          carbon content   (rhoag)
          FN=FN + RHOCG * FMXF0       !          nitrogen content (rhocg)
                                       ! inlet 0 contains no oxygen
          FNOTAIR=FNOTAIR + FMXF0
        ENDIF
        IF(L0MXF1.NE.0) THEN
          FMXF1=F(L0MXF1+I)        ! mass fraction of material from inlet 1
          FH=FH + FHMXF1 * FMXF1      ! stream * hydrogen content (FH1)
          FC=FC + FCMXF1 * FMXF1      !          carbon content   (FC1)
          FO=FO + FOMXF1 * FMXF1      !          oxygen content   (FO1)
          FN=FN + FNMXF1 * FMXF1      !          nitrogen content (FN1)
          FNOTAIR=FNOTAIR + FMXF1
        ENDIF
        IF(L0MXF2.NE.0) THEN
          FMXF2=F(L0MXF2+I)        ! mass fraction of material from inlet 2
          FH=FH + FHMXF2 * FMXF2      ! stream * hydrogen content (FH2)
          FC=FC + FCMXF2 * FMXF2      !          carbon content   (FC2)
          FO=FO + FOMXF2 * FMXF2      !          oxygen content   (FO2)
          FN=FN + FNMXF2 * FMXF2      !          nitrogen content (FN2)
          FNOTAIR=FNOTAIR + FMXF2
        ENDIF
        IF(L0MXF3.NE.0) THEN
          FMXF3=F(L0MXF3+I)        ! mass fraction of material from inlet 3
          FH=FH + FHMXF3 * FMXF3      ! stream * hydrogen content (FH3)
          FC=FC + FCMXF3 * FMXF3      !          carbon content   (FC3)
          FO=FO + FOMXF3 * FMXF3      !          oxygen content   (FO3)
          FN=FN + FNMXF3 * FMXF3      !          nitrogen content (FN3)
          FNOTAIR=FNOTAIR + FMXF3
        ENDIF
        IF(L0MXF4.NE.0) THEN
          FMXF4=F(L0MXF4+I)        ! mass fraction of material from inlet 4
          FH=FH + FHMXF4 * FMXF4      ! stream * hydrogen content (FH4)
          FC=FC + FCMXF4 * FMXF4      !          carbon content   (FC4)
          FO=FO + FOMXF4 * FMXF4      !          oxygen content   (FO4)
          FN=FN + FNMXF4 * FMXF4      !          nitrogen content (FN4)
          FNOTAIR=FNOTAIR + FMXF4
        ENDIF
        IF(L0MXF5.NE.0) THEN
          FMXF5=F(L0MXF5+I)        ! mass fraction of material from inlet 5
          FH=FH + FHMXF5 * FMXF5      ! stream * hydrogen content (FH5)
          FC=FC + FCMXF5 * FMXF5      !          carbon content   (FC5)
          FO=FO + FOMXF5 * FMXF5      !          oxygen content   (FO5)
          FN=FN + FNMXF5 * FMXF5      !          nitrogen content (FN5)
          FNOTAIR=FNOTAIR + FMXF5
        ENDIF
        IF(L0MXF6.NE.0) THEN
          FMXF6=F(L0MXF6+I)        ! mass fraction of material from inlet 6
          FH=FH + FHMXF6 * FMXF6      ! stream * hydrogen content (FH6)
          FC=FC + FCMXF6 * FMXF6      !          carbon content   (FC6)
          FO=FO + FOMXF6 * FMXF6      !          oxygen content   (FO6)
          FN=FN + FNMXF6 * FMXF6      !          nitrogen content (FN6)
          FNOTAIR=FNOTAIR + FMXF6
        ENDIF
        IF(L0MXF7.NE.0) THEN
          FMXF7=F(L0MXF7+I)        ! mass fraction of material from inlet 7
          FH=FH + FHMXF7 * FMXF7      ! stream * hydrogen content (FH7)
          FC=FC + FCMXF7 * FMXF7      !          carbon content   (FC7)
          FO=FO + FOMXF7 * FMXF7      !          oxygen content   (FO7)
          FN=FN + FNMXF7 * FMXF7      !          nitrogen content (FN7)
          FNOTAIR=FNOTAIR + FMXF7
        ENDIF
        IF(L0FO.NE.0) F(L0FO+I)=FO
        IF(L0FC.NE.0) F(L0FC+I)=FC
        IF(L0FH.NE.0) F(L0FH+I)=FH
        IF(L0FN.NE.0) F(L0FN+I)=FN
        IF(WOOD) THEN                ! -------------------'wood' section
C.... Mass fraction of wood derivatives, FWD:
          FWD=F(L0FWD+I)            ! FWD is treated as a source-free variable
          FH=FH + HINWD*FWD        ! its contribution to h-content of 'gas'
          FC=FC + CINWD*FWD        !              and to c
          FO=FO + OINWD*FWD        !              and to o
          FNOTAIR=FNOTAIR + FWD
          F(L0CHAR+I)=AMIN1(F(L0CHAR+I), FWD*CHINWD) ! char concentration is
          YCHAR=F(L0CHAR+I)                          ! computed elsewhere
          YWOOD=F(L0WOOD+I)                          ! wood also
        ELSE                         ! when 'wood is not present
C.... Coal- (or oil-) burning in gaseous phase (i.e. FGAS=1):
          FGAS=1.0
          YWOOD=0.0
          YCHAR=0.0
          FWD=0.0
        ENDIF                    ! end of 'wood'section
C.... Compute the species concentrations (N2 can be in coal & air):
        FAI=1.0 - FNOTAIR
        FO=FO + 0.232 * FAI
        FN=FN + 0.768 * FAI
        YN2=FN                    ! initial guess
        IF(WOOD) THEN
C.... Mass fraction of phase 1 in the gaseous state:
C     Note that it is necessary to recognise that wood and char may be
C     found anywhere because their burning is kinetically controlled;
          FGAS=1.- YWOOD - YCHAR   ! proportion of phase 1 which is true gas
          RFGAS=1./FGAS             ! its reciprocal
C.... Mass fractions of elements in the gas
          GO=(FO - OINWD*YWOOD)*RFGAS
          GC=(FC - CINWD*YWOOD - YCHAR)*RFGAS
          GH=(FH - HINWD*YWOOD)*RFGAS
        ELSE
          GO =FO
          GC =FC
          GH =FH
        ENDIF
C.... Determine composition of gas on the presumption that mixed is
C     burned:
        ZCO2=3.666667*GC           ! 3.66667=44 / 12=mlwt CO2 / mlwt C
        ZH2O=9.0*GH                ! 9.0   =18 / 2=mlwt H2O / mlwt H
        ZO2=GO - 2.666667*GC - 8.0*GH  ! 2.6667=32 / 12; 8.0=16 / 2
        YVOL=0.0                   !  OK ?????
        IF(ZO2.GE.0.0) THEN         ! region 1: O2, H2O, CO2, N2are present
          ZH2=0.0
          YH2=0.0
          ZCO=0.0
          YCO=0.0
          ZVOL=0.0
          YO2=ZO2*FGAS
          YCO2=ZCO2*FGAS
          YH2O=ZH2O*FGAS
          IF(WOOD) THEN
            YVOL=YVOL + VLINWD*YWOOD   ! ??? how can volatiles be finite on R 1
            YH2O=YH2O + MOINWD*YWOOD
          ENDIF
          YN2=1.0 - YO2 - YCO2 - YH2O   ! ?????
          yn2=amax1(yn2,0.0)
          RMIX=GASCON*(YO2*0.03125 + YH2O*0.055556 + YCO2*0.022727
     1                              + YN2*0.035714 + TINY)
          HSUB=0.0
        ELSE
C.... O2 is not present, i.e. it is region 2 or 3
          ZO2=0.0
          YO2=0.0
C.... Suppose free CO, CO2, H2, H2O exist at the full-oxidation limit,
C     i.e. GOfull=((16/2)*GH + (32/12)*GC)*(1. - GOfull)/(1. - GO)
          GOFULL=(8.*GH + 2.666667*GC)/(1.- GO + 8.*GH + 2.666667*GC)
          FACTFU=(1.- GOFULL)/(1.- GO)
          ZCO2FU=FACTFU*3.666667*GC
          ZH2OFU=FACTFU*9.0*GH
C.... At the part-oxidation limit only CO and H2 exist:
          GOPART=1.333333*GC/(1.- GO + 1.333333*GC)
          FACTPA=(1.- GOPART)/(1.- GO)
          ZCOPA=FACTPA*2.333333*GC
          ZH2PA=FACTPA*GH
C.... For the actual mixture:
          FRAC=(GO - GOPART)/(GOFULL - GOPART)
          IF(FRAC.GE.0.0) THEN
C.... The composition of region 2 (i.e. CO2,H2O,CO,H2 and N2):
            ZVOL=0.0
            YVOL=0.0
            ZCO2=ZCO2FU*FRAC
            ZH2O=ZH2OFU*FRAC
            ZCO=ZCOPA *(1.- FRAC)
            ZH2=ZH2PA *(1.- FRAC)
            YCO2=ZCO2*FGAS
            YH2O=ZH2O*FGAS
            YCO=ZCO*FGAS
            YH2=ZH2*FGAS
            IF(WOOD) THEN
              YVOL=YVOL + VLINWD*YWOOD
              YH2O=YH2O + MOINWD*YWOOD
            ENDIF
            YN2=1.0 - YCO2 - YCO - YH2O - YH2   ! ?????
            yn2=amax1(yn2,0.0)
            RMIX=GASCON*(YCO2*0.022727 + YH2O*0.055556 + YCO*0.035714
     1                                + YH2*0.5 + YN2*0.035714 + TINY)
            HSUB=YCO*HCOCO2 + YH2*HHH2O
          ELSE
C.... The composition of region 3 (i.e. CO,H2,N2 and volatiles):
            ZCO2=0.0
            YCO2=0.0
            ZH2O=0.0
            YH2O=0.0
            ZCO=1.75*GO
            IF(WOOD) THEN
              CONSTA=CINVL
              CONSTB=HINVL
            ELSE
              CONSTA=RHOAG
              CONSTB=RHOBG
            ENDIF
            ZVOL=(GC - ZCO*0.428571)/(CONSTA+tiny)
            ZH2=GH - ZVOL*CONSTB
            YCO=ZCO*FGAS
            YH2=ZH2*FGAS
            YVOL=ZVOL*FGAS
            IF(WOOD) THEN
              YVOL=YVOL + VLINWD*YWOOD
              YH2O=YH2O + MOINWD*YWOOD
            ENDIF
            YN2=1.0 - YCO - YH2O - YH2 - YVOL  ! ?????
            yn2=amax1(yn2,0.0)
            RMIX=GASCON*(YCO*0.035714 + YH2*0.5 + YN2*0.035714
     1                                 + YVOL*RMWTVL + TINY)
            HSUB=YCO*HCOCO2 + YH2*HHH2O + YVOL*HVOL
          ENDIF
        ENDIF
C.... Calculate the absolute temperatures and the first-phase density:
        IF(WOOD) HSUB=HSUB + YCHAR*HCHAR + YWOOD*HWOOD
C... Save HSUB into H0 store
        F(L0H012+I)=HSUB
        TEM=(F(L0H1+I) - HSUB)/F(L0CP1+I)
        TEM=AMIN1(VARMAX(TEMP1), AMAX1(100., TEM, VARMIN(TEMP1)))
        DENS=ABSPREs(I)/(RMIX*TEM)
C.... Wood and char are supposed to contribute their mass to the mixture,
C     without significantly increasing its volume.
        IF(WOOD) DENS=DENS + YWOOD + YCHAR
        DENSITY=AMIN1(VARMAX(DEN1), AMAX1(0., DENS, VARMIN(DEN1)))
        IF(.NOT.ONEPHS) THEN
          TEM2=(F(L0H2+I) - HCHX)/F(L0CP2+I)
C... save HCHX into H02 store
          F(KH02+I)=HCHX
          TEM2=AMIN1(VARMAX(TEMP2), AMAX1(100., TEM2, VARMIN(TEMP2)))
          IF(L0TMP2.NE.0) F(L0TMP2+I)=TEM2
C.... Estimated interface temperature:
          CINT1=CINT(H1)
          CINT2=CINT(H2)
          FACTEM=(TEM*CINT1 + TEM2*CINT2)/(CINT1 + CINT2)
          PHINT1=F(L0CP1+I)*FACTEM + HSUB
          PHINT2=F(L0CP2+I)*FACTEM + HCHX
C.... Interface values used for conductive transport between phases
          F(L0H1IF+I)=PHINT1
          F(L0H2IF+I)=PHINT2
        ENDIF
        IF(LBYCO. NE.0) F(L0YCO+I)=YCO
        IF(LBYCO2.NE.0) F(L0YCO2+I)=YCO2
        IF(LBYH2. NE.0) F(L0YH2+I)=YH2
        IF(LBYH2O.NE.0) F(L0YH2O+I)=YH2O
        IF(LBYO2. NE.0) F(L0YO2+I)=YO2
        IF(LBRMIX.NE.0) F(L0RMIX+I)=RMIX
        IF(LBYN2. NE.0) F(L0YN2+I)=YN2
        IF(LBYVOL.NE.0) F(L0YVOL+I)=YVOL
        IF(l0tem. NE.0) F(L0TEM+I)=TEM
        IF(l0tmp2. NE.0) F(L0TMP2+I)=TEM2
c
      IF(L0HSUB.NE.0) F(L0HSUB+I)=HSUB
c-------------------------------------------- end of 7-gases option
      ELSEIF(IGRND.EQ.8) THEN     ! Density for cvd special-purpose program
        CALL CVDPRP(DENSITY,IFILEP,I,2)
c
      ELSEIF(IGRND.EQ.9) THEN     ! Density from CHEMKIN-database
        CALL GXCHKI(I,DENSITY)
c
      ELSEIF(IGRND.EQ.10) THEN    ! Density=1/linear function of temperature
        IF(L0TEM.GT.0) THEN
          DENSITY=1.0/(RHOAG + RHOBG*(F(L0TEM+I)+TEMP0))
        ELSE
          call writ40('temperature must be solved for or stored')
          call writ1i('igrnd   ',igrnd)
         CALL SET_ERR(215,'Error. Temperature must be solved or stored.'
     *               ,1)
C          call earout(1)
        endif
      ENDIF
      IF(IGRND.NE.-1) THEN
        LBDEN=ITWO(DEN1,DEN2,IPHASE.EQ.1)
        IF(LBDEN.GT.0) THEN
          DENSITY=AMAX1(VARMIN(LBDEN),AMIN1(VARMAX(LBDEN),DENSITY))
          IF(DENSITY.LE.0.0) THEN
            call writ1r('density ',density)
            call writ2i('den1    ',den1,'den2    ',den2)
            call writ1r('density ',density)
            call writ1r('varmin  ',varmin(lbden))
            call writ1r('varmax  ',varmax(lbden))
            call writ40('density.le.0.0, in gxdens; run aborted')
            call writ3i('igrnd   ',igrnd,'cell no.',i,'izstep  ',izstep)
            call writ3i('isweep  ',isweep,'istep   ',istep,
     1                'indvar  ',indvar)
            CALL SET_ERR(216,'Error. See result file.',1)
C            CALL EAROUT(1)
          ENDIF
        ENDIF
      ENDIF
      END
c-----------------------------------------------------------------------
C
      SUBROUTINE SLBDEN(IPILOPT,USEPIL,dbgloc)
      INCLUDE 'farray'
      INCLUDE 'grdloc'
      INCLUDE 'satgrd'
      INCLUDE 'satear'
      INCLUDE 'grdear'
      INCLUDE 'prpcmn'
      COMMON/CELPAR/IPHASE,IPROP,IGRND,IFILEP,KPROP
      COMMON/GENI/IGF1(2),NXNYST,NDIR,KDUMM,IGF2(4),NFM,IGF3(21),IPRL,
     1           IBTAU,IGF4(16),ITEM1,ITEM2,ISPH1,ISPH2,ICON1,ICON2,
     1           IPRPS,IRADX,IRADY,IRADZ,IVFOL
     1      /F0/ IF01(29),L0XYDX,L0XYDY,IF02(3),L0XYRV,L0XYXG,IF03,
     1           L0XYYG,IF04,L0XYDXG,L0XYDYG,IF05(106),L0AHZ,IF06(17),
     1           L0XYDZ,L0XYDZG,IF07(137)
      COMMON/NAMFN/NAMFUN,NAMSUB
cccc      common/denonly/igrnden
      LOGICAL USEPIL,DBGLOC,SLD
      common/dbe/dbear
      logical dbear
      CHARACTER*6 NAMFUN,NAMSUB
C
      NAMSUB='SLBDEN'
      if(dbgloc) call banner(1,namsub,220306)
      IGR=9
      ISC=IPROP
      if(dbgloc) call writ1i('ipilopt ',ipilopt)
C.... Call GROUND for the user-set property:
      IF(IPILOPT.EQ.0) THEN
        IF(USEGRD) THEN
          if(dbgloc) then
            call writ40('GROUND is called to set a property...   ')
            call writ2i('Group= ',igr,'Section=',isc)
          endif
          CALL GROUND
        ENDIF
        GO TO 800
C.... For a constant property go to the slab loop
      ELSEIF(IPILOPT.EQ.-1.AND.USEPIL) THEN
        if(dbgloc) call writ40('property is uniform')
        GO TO 700
      ENDIF
c
C.... Set constants and other auxiliary variables:
C-----------------------------------------------------------------------
C.... Density of the first or second phase:
      IF(IPHASE.EQ.1) THEN
        RHOAG=RHO1A
        RHOBG=RHO1B
        RHOCG=RHO1C
      ELSE
        RHOAG=RHO2A
        RHOBG=RHO2B
        RHOCG=RHO2C
      ENDIF
C.... Density using Extended Simple Chemically-Reacting System:
      IF(IPILOPT.EQ.9 .AND. GRNDNO(9,RHOAG)) THEN
        CALL GXSCRI
        GO TO 800
      ENDIF
c.... make necessary initial settings
      CALL SETDEN
c
C.... Loop over slab to get and set cell properties:
  700 IF(IPRPS.EQ.0) THEN ! PRPS is not stored; one material only, no blockages
        IGRND=IPILOPT
        if(dbrho) then
          write(14,*) 'setting phase-',iphase,
     1                ' density via PIL with igrnd=',igrnd
        endif
        DO 60 I=1,NXNYST
  60    F(KPROP+I)=DENSITY(I)   ! set slab values via PIL values
      ELSEIF(USEPIL) THEN
c.... One material only, with blockages
        IGRND=IPILOPT
        DO 70 I=1,NXNYST
          IF(SLD(I)) THEN
            F(KPROP+I)=TINY
          ELSE
            F(KPROP+I)=DENSITY(I)
          ENDIF
  70    CONTINUE
      ELSEIF(SURF .OR. HOL) THEN
C.... Properties are set for either scalar equation method (SURF=T), or
C     height-of-liquid method (HOL=T):
        CALL SURHOL(KPROP,IPROP,IFILEP,IPHASE.EQ.1)
      ELSE
        if(dbgloc) call writ40('prfile called; use imat for each cell')
C.... Properties are set using material flag for an individual cell.
        CALL PRFILE(IPILOPT,dbgloc)
      ENDIF
C----------------------------------------------------------------------
C.... Corrections, debug print-out, and other property adjustments:
        if(dbgloc .and. IPILOPT.eq.7) then
          if(izstep.ge.izdb1 .and.izstep.le.izdb2.and.
     1       isweep.ge.iswdb1.and.isweep.le.iswdb2    ) then
            if(l0mdot.ne.0) call prn('mdt*',-l0mdot)
            if(l0fo.ne.0) call prn('fo  ',-l0fo)
            if(l0fc.ne.0) call prn('fc  ',-l0fc)
            if(l0fh.ne.0) call prn('fh  ',-l0fh)
            if(l0hsub.ne.0) call prn('hsub',-l0hsub)
            if(wood) then
              call prn('wood',-l0wood)
              call prn('char',-l0char)
              call prn('vola',-l0vola)
            endif
            if(lbyco. ne.0) call prn('yco ',lbyco)
            if(lbyco2.ne.0) call prn('yco2',lbyco2)
            if(lbyh2. ne.0) call prn('yh2 ',lbyh2)
            if(lbyh2o.ne.0) call prn('yh2o',lbyh2o)
            if(lbyo2. ne.0) call prn('yo2 ',lbyo2)
            if(lbrmix.ne.0) call prn('rmix',lbrmix)
            if(lbyn2. ne.0) call prn('yn2 ',lbyn2)
            if(lbyvol.ne.0) call prn('yvol',lbyvol)
            if(temp1. ne.0) call prn('tem ',temp1)
            call prn('h1  ',-l0h1)
            if(.not.onephs) then
              call prn('tem2',temp2)
              call prn('h1if',-l0h1if)
              call prn('h2  ',-l0h2)
              call prn('h2if',-l0h2if)
            endif
          endif
        ENDIF
C.... Call GREX to correct a property set above:
 800  IF(USEGRX) CALL GREX3
      IF(USEALT) CALL ALTPRP
      IF(USEGRD) THEN
        IF(IPILOPT.GT.0) CALL GROUND
      ENDIF
      if(dbgloc) call banner(2,'slbden',0)
      NAMSUB='slbden'
      END
c-----------------------------------------------------------------------
C
      SUBROUTINE SETDEN
      INCLUDE 'farray'
      INCLUDE 'grdloc'
      INCLUDE 'satgrd'
      INCLUDE 'satear'
      INCLUDE 'grdear'
      INCLUDE 'prpcmn'
      COMMON/GENI/IGF1(2),NXNYST,NDIR,KDUMM,IGF2(4),NFM,NWHOLE,IGSH,
     1   IGF3(37),ITEM1,ITEM2,ISPH1,ISPH2,ICON1,ICON2,IPRPS,IGF4(4)
      COMMON /CELPAR/IPHASE,IPROP,IGRND,IFILEP,KPROP
      LOGICAL QEQ,LTZ
c-----------------------------------------------------------------------
      IF(SOLVE(1))  L0P=L0F(1)
c???? can the next be simplified?
      IF(IPHASE.EQ.1) THEN
        IF(ITEM1.NE.0) THEN
          L0TEM=L0F(ITEM1)
        ELSEIF(TEMP1.GT.0) THEN
          L0TEM=L0F(TEMP1)
        ELSEIF(TMP1.LE.GRND.OR.QEQ(TMP1,1.11111111)) THEN
          L0TEM=L0F(TEMP1)
        ENDIF
        L0DEN=L0F(DEN1)
      ELSE
        IF(ITEM2.NE.0) THEN
          L0TEM=L0F(ITEM2)
        ELSEIF(TMP2.LE.GRND) THEN
          L0TEM=L0F(TEMP2)
        ENDIF
        L0DEN=L0F(DEN2)
        IF(GEN2.NE.0) L0GEN=L0F(GEN2)
      ENDIF
      L0SCAL=0 ; L0CA=0 ; L0CB=0
      IF(IGRND.EQ.1 .OR. IGRND.EQ.2) THEN
C.... Density is a function of either one variable (enthalpy or other
C     scalar); or two, or three scalars:
        IF(IBUOYB.GT.0) THEN
          IPH=IPHASE - 1
          L0SCAL=L0F(IBUOYB+IPH)
          IF(IBUOYC.GT.0) L0CA=L0F(IBUOYC+IPH)
          IF(IBUOYA.GT.0) THEN
            L0CB=L0F(IBUOYA+IPH)
            RHODG=RHO2A
          ELSE
            L0CB=L0CA
            RHODG=0.0
          ENDIF
        ELSE
          LBH =ITWO(H1,H2,IPHASE.EQ.1)
          LBSCAL=ITWO(LBH , NINT(RHOCG) , QEQ(RHOCG,0.0))
          L0SCAL=L0F(LBSCAL)
        ENDIF
      ELSEIF(IGRND.EQ.3) THEN
C.... Density for the compressible flow and also shallow-water theory:
        SHALWT=LTZ(RHO2) .AND. ONEPHS .AND. IZSTEP.GT.1
        IF(STORE(C3)) L0SCAL=L0F(C3)
      ELSEIF(IGRND.EQ.5) THEN
        IF(STORE(C1)) L0SCAL=L0F(C1 + ITWO(0,1,IPHASE.EQ.1))
      ELSEIF(IGRND.EQ.6) THEN
C.... Ideal-gas law for mixture of three chemical 'species':
        L0FUEL=L0F(LBFUEL) ; L0OXID=L0F(LBOXID) ; L0PROD=L0F(LBPROD)
      ELSEIF(IGRND.EQ.7) THEN
C.... Ideal-gas law for a mixture of the 7 gases involved in a simple
C     model of the combustion in air of one or more hydrocarbons
C     containing C, H, N and an inert ash (coal, oil or wood). The gases
C     are: HCx, O2, N2, CO2, CO, H2O, and H2.
c
c    allowance is made for material entering from up to 8 supply points,
c    the local mass fractions of which being measures by the variables
c    MIXF, MXF1, etc up to MXF7
c
c   Each stream can have its own elemental mass fraction FC, FH, FO, FN
c   which must be read from the Q1 file (except that the values for the
c   MIXF stream are supplied by way of  ????)
        IF(LBMIXF.GT.0) L0MIXF=L0F(LBMIXF)
c
        IF(LBMXF1.GT.0) L0MXF1=L0F(LBMXF1)
        IF(LBMXF2.GT.0) L0MXF2=L0F(LBMXF2)
        IF(LBMXF3.GT.0) L0MXF3=L0F(LBMXF3)
        IF(LBMXF4.GT.0) L0MXF4=L0F(LBMXF4)
        IF(LBMXF5.GT.0) L0MXF5=L0F(LBMXF5)
        IF(LBMXF6.GT.0) L0MXF6=L0F(LBMXF6)
        IF(LBMXF7.GT.0) L0MXF7=L0F(LBMXF7)
c
        IF(LBFC.GT.0) L0FC=    L0F(LBFC)
        IF(LBFH.GT.0) L0FH=    L0F(LBFH)
        IF(LBFO.GT.0) L0FO=    L0F(LBFO)
        IF(LBFN.GT.0) L0FN=    L0F(LBFN)
c
        L0H1 =L0F(H1)
        L0CP1=L0F(ISPH1)
        IF(TEMP1.NE.0) L0TEM=L0F(TEMP1)
        IF(.NOT.ONEPHS) THEN
          L0MDOT=L0F(INTMDT)
          L0H2=L0F(H2)
          L0CP2=L0F(ISPH2)
          IF(TEMP2.NE.0) L0TMP2=L0F(TEMP2)
        ENDIF
        IF(LBYCO.NE.0)  L0YCO=L0F(LBYCO)
        IF(LBYCO2.NE.0) L0YCO2=L0F(LBYCO2)
        IF(LBYH2.NE.0)  L0YH2=L0F(LBYH2)
        IF(LBYH2O.NE.0) L0YH2O=L0F(LBYH2O)
        IF(LBYO2.NE.0)  L0YO2=L0F(LBYO2)
        IF(LBYN2.NE.0)  L0YN2=L0F(LBYN2)
        IF(LBRMIX.NE.0) L0RMIX=L0F(LBRMIX)
        IF(LBYVOL.NE.0) L0YVOL=L0F(LBYVOL)
        IF(WOOD) THEN
          L0WOOD=L0F(LBWOOD)
c moved to start          LBFWD=LBNAME('FWD ')
          L0FWD=L0F(LBFWD)
          L0CHAR=L0F(LBCHAR)
        ENDIF
      ENDIF
cccc      if(flag) call banner(2,'setden',220306)
      END
c-----------------------------------------------------------------------
C
c.... INIDEN is called from INIPRP at the beginning of a run to make
c     once for all settings related to density
c
      SUBROUTINE INIDEN
      INCLUDE 'satear'
      INCLUDE 'satgrd'
      INCLUDE 'prpcmn'
      COMMON/GENI/IGF1(2),NXNYST,NDIR,KDUMM,IGF2(4),NFM,IGF3(39),
     1            ITEM1,ITEM2,ISPH1,ISPH2,ICON1,ICON2,IPRPS,IGF4(4)
     1      /CELPAR/IPHASE,IPROP,IGRND,IFILEP,KPROP
      LOGICAL GRNDNO,EQZ,GRPROP(9),GRN,STORE
      DIMENSION NAMPRP(30)
      COMMON/HBASE/IH01,IH02,KH01,KH01H,KH01L,KH02,KH02H,KH02L,L0H012
      EQUIVALENCE (NAMPRP(1),DENST1)
C
      if(dbrho) call banner(1,'INIDEN',220306)
C.... Check what options will be used for first-phase density, and store
c     the result in the grprop array:
c                  only, If that something is needed, I will find a less
c                  obscure way of doing it. I shall de-acriate the sybroutine.
c
cc      CALL PRPGRN(RHO1,1,GRPROP) ! fill grprop array. Only item 7 is used below
      IF(.NOT.STORE(1)) THEN
        IF(GRNDNO(3,RHO1).OR.GRNDNO(5,RHO1).OR.GRNDNO(6,RHO1).OR.
     1     GRNDNO(7,RHO1).OR.GRNDNO(3,RHO2).OR.GRNDNO(5,RHO2).OR.
     1     GRNDNO(6,RHO2).OR.GRNDNO(7,RHO2) ) THEN
          CALL WRIT40('RHOx=GRND3,5,6,7 requires pressure...  ')
         CALL SET_ERR(217,'Error. RHOx=GRND3,5,6,7 requires pressure...'
     *               ,2)
        endif
      endif
C.... Default settings for compressible flow.
      IF(GRNDNO(3,RHO1)) THEN
        DRH1DP=RHO1
      ELSEIF(GRNDNO(3,RHO2)) THEN
        DRH2DP=RHO2
      ELSEIF(GRNDNO(4,RHO1).OR.GRNDNO(5,RHO1).OR.GRNDNO(6,RHO1)) THEN
        IF(ITEM1.EQ.0 .AND. TEMP1.LT.0 .AND. .NOT.GRN(TMP1)) THEN
          CALL WRIT40('RHO1=GRND4,5,6 requires temperature...  ')
        CALL SET_ERR(218,'Error. RHO1=GRND4,5,6 requires temperature...'
     *              ,2)
C          CALL EAROUT(2)
        ENDIF
        IF(GRNDNO(5,RHO1)) DRH1DP=RHO1
      ELSEIF(GRNDNO(4,RHO2).OR.GRNDNO(5,RHO2).OR.GRNDNO(6,RHO2)) THEN
        IF(ITEM2.EQ.0 .AND. TEMP2.LT.0 .AND. .NOT.GRN(TMP2)) THEN
          CALL WRYT40('RHO2=GRND4,5,6 requires temperature...  ')
        CALL SET_ERR(219,'Error. RHO2=GRND4,5,6 requires temperature...'
     *              ,2)
        ENDIF
        IF(GRNDNO(5,RHO2)) DRH2DP=RHO2
c                  7gases
c       ELSEIF(GRPROP(7) .OR. GRNDNO(7,RHO2)) THEN   !----------- 7 gases model
      ELSEIF(GRNDNO(7,RHO1).OR. GRNDNO(7,RHO2)) THEN !----------- 7 GASES
        IF(LBMXF1.NE.0) THEN
          CALL RQ1R('7GAS','FH1',FHMXF1)
          CALL RQ1R('7GAS','FC1',FCMXF1)
          CALL RQ1R('7GAS','FO1',FOMXF1)
          CALL RQ1R('7GAS','FN1',FNMXF1)
          CALL RQ1R('7GAS','HF1',HMXF1)
        ENDIF
        IF(LBMXF2.NE.0) THEN
          CALL RQ1R('7GAS','FH2',FHMXF2)
          CALL RQ1R('7GAS','FC2',FCMXF2)
          CALL RQ1R('7GAS','FO2',FOMXF2)
          CALL RQ1R('7GAS','FN2',FNMXF2)
          CALL RQ1R('7GAS','HF1',HMXF2)
        ENDIF
        IF(LBMXF3.NE.0) THEN
          CALL RQ1R('7GAS','FH3',FHMXF3)
          CALL RQ1R('7GAS','FC3',FCMXF3)
          CALL RQ1R('7GAS','FO3',FOMXF3)
          CALL RQ1R('7GAS','FN3',FNMXF3)
          CALL RQ1R('7GAS','HF1',HMXF3)
        ENDIF
        IF(LBMXF4.NE.0) THEN
          CALL RQ1R('7GAS','FH4',FHMXF4)
          CALL RQ1R('7GAS','FC4',FCMXF4)
          CALL RQ1R('7GAS','FO4',FOMXF4)
          CALL RQ1R('7GAS','FN4',FNMXF4)
          CALL RQ1R('7GAS','HF1',HMXF4)
        ENDIF
        IF(LBMXF5.NE.0) THEN
          CALL RQ1R('7GAS','FH5',FHMXF5)
          CALL RQ1R('7GAS','FC5',FCMXF5)
          CALL RQ1R('7GAS','FO5',FOMXF5)
          CALL RQ1R('7GAS','FN5',FNMXF5)
          call writ2r('fh5     ',FHMXF5,'fcf     ',fcmxf5)
          call writ2r('fo5     ',FoMXF5,'fnf     ',fnmxf5)
          CALL RQ1R('7GAS','HF1',HMXF5)
        ENDIF
        IF(LBMXF6.NE.0) THEN
          CALL RQ1R('7GAS','FH6',FHMXF6)
          CALL RQ1R('7GAS','FC6',FCMXF6)
          CALL RQ1R('7GAS','FO6',FOMXF6)
          CALL RQ1R('7GAS','FN6',FNMXF6)
          CALL RQ1R('7GAS','HF1',HMXF6)
        ENDIF
        IF(LBMXF7.NE.0) THEN
          CALL RQ1R('7GAS','FH7',FHMXF7)
          CALL RQ1R('7GAS','FC7',FCMXF7)
          CALL RQ1R('7GAS','FO7',FOMXF7)
          CALL RQ1R('7GAS','FN7',FNMXF7)
          CALL RQ1R('7GAS','HF1',HMXF7)
        ENDIF
        IF(GRNDNO(7,RHO1)) THEN
          RHOAG=RHO1A ; RHOBG=RHO1B ; RHOCG=RHO1C
        ELSE
          RHOAG=RHO2A ; RHOBG=RHO2B ; RHOCG=RHO2C
        ENDIF
        IF(.NOT.NULLPR) THEN
          CALL WRITBL
          CALL WRITST
          CALL WRIT40('Initial print-out for RHO1=7GASES model:')
          CALL WRIT3R('CINCL   ',RHOAG,'HINCL   ',RHOBG,
     1                'NINCL   ',RHOCG)
        ENDIF
C.... The heat of combustion per unit mass of CO:
        HCCO2=32.792E6 ; HCCO=9.208E6 ; HHH2O=120.9E6
        HCOCO2=(12.0/28.0) * (HCCO2 - HCCO)
        HCHX=RHOAG*HCCO2 + RHOBG*HHH2O
        HVOL=HCHX
C.... Assume that the volatile gas is propane:
        AMWTVL=44.
        IF(.NOT.NULLPR)
     1  CALL WRIT3R('HCOCO2  ',HCOCO2,'HHH2O   ',HHH2O,'NCHX    ',HCHX)
        IF(.NOT.ONEPHS) THEN
          CALL GXMAKE(L0H1IF,NXNYST,'H1IF')
          CALL GXMAKE(L0H2IF,NXNYST,'H2IF')
        ENDIF
C.... Memory allocation for the debug print-out:
        if(dbrho) then
          call gxmake(l0hsub,nxnyst,'hsub')
          call gxmake(l0vola,nxnyst,'vola')
        endif
C.... Model for the 'wood' burning, i.e. any solid material which shares
c     the gas-phase velocities:
cccc        LBFWD=LBNAME('FWD ')           ! storage of FWD is the signal
        WOOD=LBFWD.NE.0
        IF(.NOT.NULLPR) CALL WRIT1L('WOOD    ',WOOD)
        IF(WOOD) THEN
cccc          LBWOOD=LBNAME('WOOD')        ! but there may be 2 derivatives:
cccc          LBCHAR=LBNAME('CHAR')        ! 'wood' and 'char'
C.... Get data for the wood from SPEDAT:
C.... MOINWD, the moisture fraction of the wood, is defined as the
C     amount of water in unit mass of MOIST wood:
          CALL GETSDR('WOODBURN','MOINWD ',MOINWD) ! read in moisture in wood
C.... CINWD,  HINWD and    VLINWD denote the mass fractions of
c     carbon, hydrogen and volatiles in DRY wood:
          CALL GETSDR('WOODBURN','VLINWD',VLINWD)  ! read in volatile
          CALL GETSDR('WOODBURN','HINVL ',HINVL)   ! and its hydrogen
          CINVL=1.- HINVL                        ! but its carbon
          HINWD=HINVL*VLINWD*(1.- MOINWD) +
     1            2./18.*MOINWD                    ! deduce H in vol and h2o
          CINWD=(1.- HINWD)*(1.- MOINWD)         ! C in wood
          CHINWD=(1.- VLINWD)*(1.- MOINWD)        ! H in wood
          OINWD=16./18.*MOINWD                   ! assume all O in H2O
C.... Heat of combustion:
          HVOL=HHH2O*HINVL + HCCO2*RHOAG
          HCHAR=HCCO2
          HWOOD=HVOL*VLINWD + HCHAR*(1.- VLINWD)
C.... Molecular weight of volatiles:
          CALL GETSDR('WOODBURN','MLWTVL',AMWTVL)
          IF(.NOT.NULLPR) THEN
            CALL WRIT3R('VLINWD  ',VLINWD,'HINVL   ',HINVL,
     1                  'MLWTVL  ',AMWTVL)
            CALL WRIT3R('CINVL   ',RHOAG,'HINWD   ',HINWD,
     1                  'CINWD   ',CINWD )
            CALL WRIT3R('HWOOD   ',HWOOD, 'HVOL    ',HVOL,
     1                  'HCHAR   ',HCHAR)
            CALL WRIT2R('CHENWD  ',CHINWD,'MOINWD  ',MOINWD)
          ENDIF
C.... Store reciprocal of the volatile gas molecular weight:
          RMWTVL=1./(AMWTVL+1.E-10)
        ENDIF    ! ------------------------------end of data input for 'wood'
        IF(.NOT.NULLPR) THEN
          CALL WRITST
          CALL WRITBL
        ENDIF
C.... Note that there is no need to employ a constant specific heat; for
C     coding which allows it to depend upon temperature and composition
C     could also be introduced into this subroutine; but then the heats
C     of combustion would also need to be modified accordingly.
c
C... get index for H0
        L0H012=L0F(ITWO(IH01,IH02,IPHASE.EQ.1))
      ENDIF
C.... Consistency check for for compressibility options:
      IF(GRNDNO(5,DRH1DP)) THEN
        IF(EQZ(RHO1C)) RHO1C=1./1.4
      ENDIF
      IF(GRNDNO(5,DRH2DP)) THEN
        IF(EQZ(RHO2C)) RHO2C=1./1.4
      ENDIF
      if(dbrho) call banner(2,'INIDEN',220306)
      END
c-----------------------------------------------------------------------
c