c
C element mass fraction and mole fraction
**********************************************************************
c
c
SUBROUTINE GXCHKI(ICELLA,VALOUT)
C-----------------------------------------------------------------
C PHOENICS-CHEMKIN INTERFACE
C-----------------------------------------------------------------
C Function:
C The interface uses CHEMKIN and TRANLIB routines to calculate
C thermodynamic and transport properties for gas mixtures, and
C calculates the diffusion fluxes according to 2 models of
C diffusion. The diffusion models are:
C 0) Standard PHOENICS model - ENULA = 0.0 : IMCOPT = 0 (default)
C 1) Mixture-averaged model - ENULA = GRND9: IMCOPT = 1
C Furthermore, the influence of chemical reactions is treated
C according to 2 different algorithms:
C 1) Provide source terms calculated using CHEMKIN routines
C and solve using the standard PHOENICS algorithms
C 2) Solve the equations using the PBP algorithm; but use
C a Newton-Raphson algorithm operating simultaneously on
C all species and on temperature (enthalpy) to generate
C the corrections
C The source-term options are indicated to the code by way of
C the PATCH name:
C Characters 1-5 must be CHEMK
C Character 6 must be 1 to indicate which of the
C options is to be used
C Characters 7-8 are free to be used by the user
C
C Assumptions:
C Entered only for 1st phase
C Only mixture-averaged model for transport (IMCOPT==0)
C Only solution for TEM1 is implemented (for energy equ'n.)
C Properties are calculated for every sweep
C Non-orthogonality terms have not been included in the enhanced
C diffusion model
C
C Notes: The implementation of the thermal diffusion terms in the
C species diffusion equations was modified on 21/10/03 so
C ensure species mass conservation. The previous treatment
C was discovered to be non-conservative when running library
C cases C206 to C208 inclusive.
C
C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
C-----------------------------------------------------------------
C
INCLUDE 'chmkin'
INCLUDE 'patcmn'
INCLUDE 'farray'
INCLUDE 'satear'
INCLUDE 'grdloc'
INCLUDE 'satgrd'
INCLUDE 'grdear'
INCLUDE 'pltcfile'
INCLUDE 'parear'
COMMON/INDAUX/L0ISL,L0IST,L0SL,L0ST,NSTO,NSOL,L0SLRS,L0TTRS,
1 IFL(12)
C
COMMON/GENI/NXNY,IGFL1,NXNYST,IGFL4,KDUMM,IGFL5(4),NFM,NWHOLE,
1 IGSH,IGFL13(30),NFTOT,IGFL44(6),ITEM,IGFL51(5),
1 IPRPS,IGFL57(4)
COMMON/INDUN/INDFL(12),INN,INS,INE,INW,INH,INL
COMMON/IDA7/LOFLUX(150) /IDA8/LODFCO(150)
COMMON/SLDPRP/SOLPRP,PORPRP,VACPRP
COMMON/F01/M0F(600)
C
CHARACTER*256 NKEEP, NTEMP
C
PARAMETER (NCKMI0=84)
PARAMETER (VISSCA=1.E-1,CONSCA=1.E-5,DIFSCA=1.E-4)
C
INTEGER LBCKF, ICKMC0(NCKMI0), PVCKID
LOGICAL LCKERR,GRN,EQZ,VARPRS,QEQ,NEZ,SOLTEM,HRM,
1 DBGLOC,QGE,VARTEM,CONTEM,ERROR,TSTVPO,BLK,BYPASS,
2 BLOCKD,SOLID,FIXCEL,MONPRT,DENSC,CFIRST,TPSEM
CHARACTER*9 CODE
CHARACTER*40 PRECIS
CHARACTER*4 NAMD,CMFILE
C
EQUIVALENCE (PREF,CHSOC),
3 (ICKMC0(1),LBCKF),(PVCKID,LBPVSP(6)),
4 (CMFILE,CSG4)
C
C--- The following section declares the REAL CHEMKIN interface
C buffer to be optionally double- or single-precision, and
C must be configured (using the CHANGE program) to match the
C precision chosen for CHEMKIN
C
C*****double precision
DOUBLE PRECISION
1 RU,RUC,PRES,CPMIX,RHOMIX,VISMIX,
2 CONMIX,VOLUME,ATIM,RTIM,ATOL,RTOL,ABSOL,RELAT,
3 UFAC,DFAC,U0,U,RTMP,QDOT,DTTP,DTMIN,DTMAX,
4 DTEMP0,GRHO
COMMON /CKMCI0/LBCKF,KMCR,KMCI,K0MWT,K0BUF,LINK,LOUTCM,MM,KK,
1 II,L0HK,L0HKH,L0CP,L0CPH,L0H,L0HH,L0DK,L0DKH,
2 L0DJK,L0DJKH,L0VDE,L0VDN,L0VDH,L0CDK,L0TDK,L0HCO,
3 L0HVAL,L0DTF,K0L0,K0SYM,K0ELT,K0SYME,NTDIF,
4 K0ABV,K0BLO,K0TPB,K0TWP,K0IPV,K0SCR,K0VAR,
5 K0VARN,K0RES,K0RESN,K0A,K0SU,K0AP,L0SUK,L0APK,
6 K0H0K,LEVEL(2),LENTWP,ITIND,K0TD,
7 L0VHI,L0DTK,L0HSU,L0HAP,K0WDT,K0ROR,IGRND,
8 IQDOT,IENT,ICON,IMMWT,ICKOP1,IMIXF,IFUEL,IOXYG,
9 IPRO1,IPRO2,IDILU,L0APHI,L0SUHI,ICKOPT,IMCOPT,
1 ICALL1,LEVEL1,LEVEL2,NJAC,ITJAC,IRETIR,NUMDT,
2 NINIT,NRTOT,NITOT,NCTOT,NLTOT,K0EQRW,K0EQIW,K0AWT
2 /CKMCR0/ATIM,RTIM,ATOL,RTOL,UFAC,DFAC,ABSOL,RELAT,
2 RU,RUC,DTMIN,DTMAX,DTEMP0
4 /CKMCL0/VARPRS,CONTEM,SIUNIT
SAVE /CKMCI0/,/CKMCL0/,
1 DODIFF,DOSORC,DOTDIF,SOLTEM,MODDIF,VARTEM,ENTFLX,RELQDT,
2 ALQDOT,STOCMP,BYPASS,DENSC,CFIRST,TPSEM
C
COMMON /CKMIND/ NDCMI,NDCMR,NDCMC,NDCML
LOGICAL DODIFF,DOSORC,DOTDIF,DFN,WHF,MODDIF,ENTFLX,RELQDT,
1 STOCMP,SIUNIT
logical exists
character*(1024) cval, delim*1
C*****double precision
DATA PRECIS /' DOUBLE PRECISION Version is activated '/
C*****END double precision
C
dbgloc=debug.and.izstep>=izdb1 .and.izstep<=izdb2.and.
1 isweep>=iswdb1.and.isweep<=iswdb2
IXL=IABS(IXL)
NXNY=NX*NY
C
IF(IGR==1) CFIRST=.TRUE.
IF(IGR>1) THEN
IF(VARPRS) L0P1=L0F(P1)
IF(ICKOP1>1.AND.STORE(KE).AND.STORE(EP))
1 CALL SUB2(L0KE,L0F(KE),L0EP,L0F(EP))
IF(STORE(ITIND)) THEN
L0TEM=L0F(ITIND)
ELSE
L0TEM=0
VARTEM=.FALSE.
ENDIF
L0DEN=L0F(DEN1)
IF(IQDOT>0) THEN
L0QDOT=L0F(IQDOT)
ALQDOT=DTFALS(IQDOT)
RELQDT=QGE(ALQDOT,-1.0).AND.ALQDOT<0.0
ALQDOT=-DTFALS(IQDOT)
ELSE
L0QDOT=0
ENDIF
IF(IENT>0) THEN
L0ENT=L0F(IENT)
ELSE
L0ENT=0
ENDIF
IF(ICON>0) THEN
L0CON=L0F(ICON)
ELSE
L0CON=0
ENDIF
IF(IMMWT>0) THEN
L0MMWT=L0F(IMMWT)
ELSE
L0MMWT=0
ENDIF
IF(STORE(VPOR)) THEN
L0VPOR=L0F(VPOR)
TSTVPO=BLK(IZSTEP,7)
ELSE
L0VPOR=0
TSTVPO=.FALSE.
ENDIF
IF(IPRPS==0) THEN
L0PRPS=0
ELSE
L0PRPS=L0F(IPRPS)
ENDIF
ENDIF
C
IF(IGR==8.OR.IGR==9.OR.IGR==13.OR.IGR==11
1 .OR.IGR==19) THEN
IF(WHF(LBCKF)) THEN
IZOFF=(IZSTEP-1)*NXNY
ELSE
IZOFF=0
ENDIF
IF(STOCMP) THEN
DO 10002 K=1,KK
ICKMC(K0L0+K)=L0F(LBCKF+K-1)
10002 CONTINUE
ENDIF
ENDIF
GO TO (1,25,25,25,25,25,25,8,9,25,11,25,13,25,25,25,25,25,19,
1 25,25,25,23,25),IGR
25 CONTINUE
go to 999
C-----------------------------------------------------------------
C--- GROUP 1. Run title and other preliminaries
C
1 CONTINUE
C
C User may here change message transmitted to the VDU screen
IF(ISC/=1) GO TO 999
IF(.NOT.NULLPR) THEN
CALL WRITBL
CALL WRITST
CALL WRYT40('GXCHKI file is GXCHKI.HTM of: 240613 ')
CALL WRYT40(' PHOENICS-CHEMKIN Interface v1.0 ')
CALL WRYT40(PRECIS)
CALL WRIT40(' PHOENICS-CHEMKIN Interface v1.0 ')
CALL WRIT40(PRECIS)
CALL WRITST
ENDIF
C
C--- Initialise /CKMCI0/
C
DO 10000 I=1,NCKMI0
ICKMC0(I)=0
10000 CONTINUE
C
LBCKF=16
LBCKF0=NINT(CHSOB)
IF(LBCKF0/=0) LBCKF=LBCKF0
STOCMP=LBCKF>0
DTEMP0=TEMP0
C
IF(STOCMP.AND.GRNDNO(9,CHSOA)) THEN
ICKOPT=1
IF(SELREF) WRITE(LUPR1,*)
1 'SELREF has been set false in GXCHKI because CHSOA=GRND9'
SELREF=.FALSE.
ELSE
ICKOPT=0
ENDIF
C
C--- Use GETSPD to retrieve the Q1 settings which overwrite
C the default parameters
C
CALL GETSPD('CHEM','LEVEL1',2,RDUM,LEVEL1,.FALSE.,' ',IERR)
CALL GETSPD('CHEM','LEVEL2',2,RDUM,LEVEL2,.FALSE.,' ',IERR)
CALL GETSPD('CHEM','NJAC' ,2,RDUM,NJAC ,.FALSE.,' ',IERR)
CALL GETSPD('CHEM','ITJAC' ,2,RDUM,ITJAC ,.FALSE.,' ',IERR)
CALL GETSPD('CHEM','IRETIR',2,RDUM,IRETIR,.FALSE.,' ',IERR)
CALL GETSPD('CHEM','NUMDT' ,2,RDUM,NUMDT ,.FALSE.,' ',IERR)
CALL GETSPD('CHEM','NINIT' ,2,RDUM,NINIT ,.FALSE.,' ',IERR)
CALL GETSPD('CHEM','CALL1' ,2,RDUM,ICALL1,.FALSE.,' ',IERR)
VARPRS=.FALSE.
CALL GETSPD('CHEM','VARPRS',3,RDUM,IDUM,VARPRS,' ',IERR)
CONTEM=.FALSE.
CALL GETSPD('CHEM','CONTEM',3,RDUM,IDUM,CONTEM,' ',IERR)
SIUNIT=.FALSE.
CALL GETSPD('CHEM','SIUNIT',3,RDUM,IDUM,SIUNIT,' ',IERR)
C option to bypass twopnt-solver termination
BYPASS=.FALSE.
CALL GETSPD('CHEM','BYPASS',3,RDUM,IDUM,BYPASS,' ',IERR)
C Provision for density conversion from SI to CGS
DENSC=.FALSE.
CALL GETSPD('CHEM','DENSC',3,RDUM,IDUM,DENSC,' ',IERR)
TPSEM=.TRUE.
CALL GETSPD('CHEM','TPSEM',3,RDUM,IDUM,TPSEM,' ',IERR)
CALL SUB4R(UFAC1,0.0,DFAC1,0.0,DTMIN1,0.0,DTMAX1,0.0)
CALL GETSPD('CHEM','UFAC' ,1,UFAC1 ,IDUM,.FALSE.,' ',IERR)
CALL GETSPD('CHEM','DFAC' ,1,DFAC1 ,IDUM,.FALSE.,' ',IERR)
CALL GETSPD('CHEM','DTMIN',1,DTMIN1,IDUM,.FALSE.,' ',IERR)
CALL GETSPD('CHEM','DTMAX',1,DTMAX1,IDUM,.FALSE.,' ',IERR)
RTOL=1.E-4
ATOL=1.E-8
ATIM=3.*ATOL
RTIM=3.*RTOL
CALL SUB4R(ATOL1,0.0,RTOL1,0.0,ATIM1,0.0,RTIM1,0.0)
CALL GETSPD('CHEM','ATOL',1,ATOL1 ,IDUM,.FALSE.,' ',IERR)
CALL GETSPD('CHEM','RTOL',1,RTOL1 ,IDUM,.FALSE.,' ',IERR)
CALL GETSPD('CHEM','ATIN',1,ATIM1,IDUM,.FALSE.,' ',IERR)
CALL GETSPD('CHEM','RTIM',1,RTIM1,IDUM,.FALSE.,' ',IERR)
IF(NEZ(ATOL1)) ATOL=ATOL1
IF(NEZ(RTOL1)) RTOL=RTOL1
IF(NEZ(ATIM1)) ATIM=ATIM1
IF(NEZ(RTIM1)) RTIM=RTIM1
C
C--- Make some debug settings
C
IF(ICKOPT>=1) THEN
CALL SUB2(LEVEL(1),LEVEL1,LEVEL(2),LEVEL2)
LEVEL(1)=MAX(LEVEL(1),LEVEL(2))
ENDIF
C
C--- Are there any source PATCHes, are there any dangerous CHSO
C PATCHes?
C
DOSORC=ICKOPT>0
LCKERR=.FALSE.
DO 10013 IP=1,NUMPAT
IF(.NOT.DOSORC.AND.NAMPAT(IP)(1:5)=='CHEMK') THEN
DOSORC=.TRUE.
READ(NAMPAT(IP)(6:6),'(I1)') ICKOP1
ELSE
LCKERR=LCKERR.OR.NAMPAT(IP)(1:4)=='CHSO'
ENDIF
10013 CONTINUE
C
C--- If CHSO has been set we have to exit
C
IF(LCKERR) THEN
CALL WRIT40(' GXCHKI - CHSO PATCHES CANNOT BE USED ')
CALL WRIT40(' WITH THE CHEMKIN INTERFACE ')
CALL SET_ERR(254, 'Error. See result file.',1)
C CALL EAROUT(1)
ENDIF
C
C--- Set a pointer to various variables
C
IF(STORE(ITEM)) THEN
ITIND=ITEM
ELSEIF(STORE(TEMP1)) THEN
ITIND=TEMP1
ELSE
ITIND=0
ENDIF
IMIXF=LBNAME('MIXF')
IF(.NOT.STORE(IMIXF)) IMIXF=0
SOLTEM=SOLVE(ITIND)
VARPRS=VARPRS.AND.SOLVE(P1)
IQDOT=LBNAME('QDOT')
IF(.NOT.STORE(IQDOT)) IQDOT=0
IENT =LBNAME('ENTH')
IF(.NOT.STORE(IENT)) IENT=0
ICON =LBNAME('COND')
IF(.NOT.STORE(ICON)) ICON=0
IMMWT =LBNAME('MMWT')
IF(.NOT.STORE(IMMWT)) IMMWT=0
C
C--- Initialise CHEMKIN database (name may be constructed from CMFILE)
C
NTEMP=' '
DO 10201 ITRY=0,100,100
JTRY=ITRY
IF(CMFILE/=' ') THEN
I=INDEX(CMFILE,' ')
IF(I==0) THEN
I=4
ELSE
I=I-1
ENDIF
IF(JTRY==0) THEN
NKEEP=NMFIL(55)
NMFIL(55)=CMFILE(1:I)//'ckln'
CALL BLDNAM(NMFIL(55),NTEMP,LNMTMP)
ELSE
I55=IPEXT(55,JTRY/100,0)
IC=INDEX(NMFLEX(I55),'cklink')
IF(IC<=0.OR.IC>40) THEN
IERR=1
GO TO 10202
ENDIF
NKEEP=NMFLEX(I55)
NMFLEX(I55)(IC:)=CMFILE(1:I)//'ckln'
CALL BLDNAM(NMFLEX(I55),NTEMP,LNMTMP)
ENDIF
ENDIF
IERR=-1
IF(MIMD.AND.NPROC>1.AND.JTRY==0)THEN
CVAL=NMFIL(55)
CALL PAROPENFL(90,CVAL,IERR,EXISTS)
IF(EXISTS)THEN
CALL GETSYSID(ISYSID)
DELIM='/'
IF(ISYSID<=2) DELIM=CHAR(92)
CALL COPYBINARYFILE(DELIM,CVAL,IERR,IOS,EXISTS)
IF(IERR/=0)GOTO 10201
ELSE
GOTO 10201
ENDIF
ENDIF
CALL OPENZZ(55+JTRY,IERR)
IF(IERR==0) GO TO 10202
10201 CONTINUE
10202 CONTINUE
IF(IERR/=0) THEN
CALL WRIT40(' GXCHKI - CHEMKIN LINK FILE IS ABSENT ')
CALL SET_ERR(255,
* 'Error. GXCHKI - CHEMKIN LINK FILE IS ABSENT.',1)
C CALL EAROUT(1)
ELSEIF(.NOT.NULLPR) THEN
CALL WRITBL
WRITE(LUPR1,'('' GXCHKI - CHEMKIN LINK FILE: ''/10X,A70)')
1 NTEMP
WRITE(LUPR3,'('' GXCHKI - CHEMKIN LINK FILE: ''/10X,A70)')
1 NTEMP
ENDIF
LINK=LUNIT(55)
LOUTCM=LUPR1
CALL CKLEN(LINK,LOUTCM,LCKI,LCKR,LCKC)
LCKERR=.FALSE.
C.... Allocate CHEMKIN arrays
CALL CHEM_MEM(1,LCKR,LCKI,LCKC,1,NDCMR,NDCMI,NDCMC,NDCML)
IF(LCKR>=NDCMR.OR.LCKI>=NDCMI.OR.LCKC>=NDCMC) THEN
LCKERR=.TRUE.
CALL WRIT40(' GXCHKI - Not enough room for CHEMKIN ')
CALL WRYT40(' GXCHKI - Not enough room for CHEMKIN ')
CALL WRIT40(' Currently: ')
CALL WRIT3I(' NDCMR',NDCMR,' NDCMI',NDCMI,
1 ' NDCMC',NDCMC)
CALL WRIT40(' Require: ')
CALL WRIT3I(' NDCKR', LCKR,' NDCKI', LCKI,
1 ' NDCKC', LCKC)
CALL SET_ERR(256,
* 'Error. GXCHKI - Not enough room for CHEMKIN.',1)
C CALL EAROUT(1)
ENDIF
CALL CKINIT(LCKI,LCKR,LCKC,LINK,LOUTCM,ICKMC,RCKMC,CCKMC1)
CALL PHINDX(1,LINK,LOUTCM,PRECIS,0,0)
CALL CKINDX(ICKMC,RCKMC,MM,KK,II,NFIT)
CALL CLOSFL(55)
IF(JTRY==0) THEN
NMFIL(55)=NKEEP
ELSE
I55=IPEXT(55,JTRY/100,0)
NMFLEX(I55)=NKEEP
ENDIF
IF(.NOT.NULLPR) THEN
CALL WRITBL
CALL WRIT40(' GXCHKI - CHEMKIN initialisation done ')
CALL WRITBL
CALL WRIT40(PRECIS)
ENDIF
C
C--- If MODified DIFfusion law has been selected, set UDIFF, UDIFNE
C and USOURC. BUT the modifications, including the thermal diffusion
C modifications are valid only for truly laminar flow, so we must
C deactivate the modifications if the turbulent diffusivity for the
C species are appreciable
C
IF(GRNDNO(9,ENULA)) THEN
IMCOPT=1
ELSE
IMCOPT=0
ENDIF
MODDIF=IMCOPT==1
ENTFLX=MODDIF.AND.SOLTEM
IF(NEZ(ENUT).AND.STOCMP) THEN
DO 10009 K=1,KK
LK=LBCKF+K-1
MODDIF=MODDIF.AND.QGE(PRT(LK),1.E10)
10009 CONTINUE
ENDIF
IF(MODDIF.OR.ENTFLX) CALL SUB3L(UDIFF,.TRUE.,UDIFNE,.TRUE.,
1 USOURC,.TRUE.)
IF(ICKOPT>0) USOLVE=.TRUE.
ICALL1=MAX(0,ICALL1)
IF(ICALL1==0) THEN
ICALL1=2
ELSE
ICALL1=MIN(2,ICALL1)
ENDIF
C
C--- Initialise TRANLIB if transport properties are required, ie.
C look for activation of diffusion, solution and the specific
C diffusivity option for CHEMKIN variables
C
DODIFF=.FALSE.
DO 10102 I=9,10
DODIFF=DODIFF.OR.DFN(ITIND).AND.GRNDNO(I,-PRNDTL(ITIND))
DO 10103 K=3,7,2
DODIFF=DODIFF.OR.SOLVE(K).AND.GRNDNO(I,ENUL)
10103 CONTINUE
IF(STOCMP) THEN
DO 10101 K=1,KK
LK=LBCKF+K-1
DODIFF=DODIFF.OR.SOLVE(LK).AND.DFN(LK).AND.
1 GRNDNO(I,-PRNDTL(LK))
10101 CONTINUE
ENDIF
10102 CONTINUE
MODDIF=MODDIF.AND.DODIFF
DOTDIF=DOTDIF.AND.DODIFF
IF(DODIFF) THEN
CALL SUB2(KMCR,LCKR+1,KMCI,LCKI+1)
NTEMP=' '
DO 10211 ITRY=0,100,100
IF(CMFILE/=' ') THEN
I=INDEX(CMFILE,' ')
IF(I==0) THEN
I=4
ELSE
I=I-1
ENDIF
JTRY=ITRY
IF(JTRY==0) THEN
NKEEP=NMFIL(56)
NMFIL(56)=CMFILE(1:I)//'mcln'
CALL BLDNAM(NMFIL(56),NTEMP,LNMTMP)
ELSE
I56=IPEXT(56,JTRY/100,0)
NKEEP=NMFLEX(I56)
IC=INDEX(NMFLEX(I56),'tplink')
IF(IC<=0.OR.IC>40) THEN
IERR=1
GO TO 10212
ENDIF
NKEEP=NMFLEX(I56)
NMFLEX(I56)(IC:)=CMFILE(1:I)//'mcln'
CALL BLDNAM(NMFLEX(I56),NTEMP,LNMTMP)
ENDIF
ENDIF
IERR=-1
IF(MIMD.AND.NPROC>1.AND.JTRY==0)THEN
CVAL=NMFIL(56)
CALL PAROPENFL(90,CVAL,IERR,EXISTS)
IF(EXISTS)THEN
CALL GETSYSID(ISYSID)
DELIM='/'
IF(ISYSID<=2) DELIM=CHAR(92)
CALL COPYBINARYFILE(DELIM,CVAL,IERR,IOS,EXISTS)
IF(IERR/=0)GOTO 10211
ELSE
GOTO 10211
ENDIF
ENDIF
CALL OPENZZ(56+ITRY,IERR)
IF(IERR==0) GO TO 10212
10211 CONTINUE
10212 CONTINUE
IF(IERR/=0) THEN
CALL WRIT40(' GXCHKI - TRANLIB LINK FILE IS ABSENT ')
CALL SET_ERR(257,
* 'Error. GXCHKI - TRANLIB LINK FILE IS ABSENT.',1)
C CALL EAROUT(1)
ELSEIF(.NOT.NULLPR) THEN
CALL WRITBL
WRITE(LUPR1,'('' GXCHKI - TRANLIB LINK FILE: ''/10X,A70)')
1 NTEMP
WRITE(LUPR3,'('' GXCHKI - TRANLIB LINK FILE: ''/10X,A70)')
1 NTEMP
ENDIF
LINK=LUNIT(56)
CALL MCLEN(LINK,LOUTCM,LMCI,LMCR)
IF(LMCR>=NDCMR-LCKR.OR.LMCI>=NDCMI-LCKI) THEN
NEEDR=3*(LCKR+LMCR)/2
NEEDI=3*(LCKI+LMCI)/2
CALL CHEM_MEM(2,NEEDR,NEEDI,NDCMC,NDCML,NDCMR,NDCMI,NDCMC,
1 NDCML)
ENDIF
IF(LMCR>=NDCMR-LCKR.OR.LMCI>=NDCMI-LCKI) THEN
LCKERR=.TRUE.
CALL WRIT40(' GXCHKI - Not enough room for TRANLIB ')
CALL WRYT40(' GXCHKI - Not enough room for TRANLIB ')
CALL WRIT40(' Currently: ')
CALL WRIT3I(' NDCMR',NDCMR,' NDCMI',NDCMI,
1 ' NDCMC',NDCMC)
CALL WRIT40(' Require: ')
CALL WRIT2I(' NDCKR', LCKR+LMCR,' NDCKI', LCKI+LMCI)
CALL SET_ERR(258,
* 'Error. GXCHKI - Not enough room for TRANLIB.',1)
C CALL EAROUT(1)
ENDIF
CALL MCINIT(LINK,LOUTCM,LMCI,LMCR,ICKMC(KMCI),RCKMC(KMCR))
CALL PHINDX(2,LINK,LOUTCM,PRECIS,NTDIF,K0TD)
K0TD=K0TD+LCKI
IF(.NOT.NULLPR) THEN
CALL WRITBL
CALL WRIT40(' GXCHKI - TRANLIB initialisation done ')
ENDIF
CALL CLOSFL(56)
IF(JTRY==0) THEN
NMFIL(56)=NKEEP
ELSE
I56=IPEXT(56,JTRY/100,0)
NMFLEX(I56)=NKEEP
ENDIF
ELSE
CALL SUB3(IMCOPT,0,LMCR,0,LMCI,0)
ENDIF
C
C--- Need an interface buffer and atomic weights
C
IF(IMCOPT<2) THEN
NBUF=MAX(KK*2,II)
ELSE
NBUF=KK*(1+KK)
ENDIF
KK1=KK+1
LENTWP=7*KK1+7*KK1+2
K0MWT =LCKR+LMCR
C Introduce atomic-weight storage
K0AWT= K0MWT+KK1
K0VAR =K0AWT+KK1
C
K0BUF =K0VAR+KK1
K0H0K =K0BUF+NBUF+KK1
NRTOT =K0H0K+KK1
IF(ICKOPT==1) THEN
K0ABV =NRTOT
K0BLO =K0ABV +KK1
K0TPB =K0BLO +KK1
K0TWP =K0TPB +KK1
K0SCR =K0TWP +LENTWP
K0VARN=K0SCR +8*MAX(II,KK1)
K0RES =K0VARN+KK1
K0RESN=K0RES +KK1
K0A =K0RESN+KK1
K0SU =K0A +KK1*KK1
K0AP =K0SU +KK1
NRTOT =K0AP +KK1
ENDIF
IF(NRTOT>NDCMR) THEN
NEEDR=NRTOT+1
CALL CHEM_MEM(2,NEEDR,NDCMI,NDCMC,NDCML,NDCMR,NDCMI,NDCMC,NDCML)
ENDIF
IF(NRTOT>NDCMR) THEN
CALL WRYT40(' GXCHKI - RCKMC too small for buffers ')
CALL WRIT40(' GXCHKI - RCKMC too small for buffers ')
CALL WRIT1I(' Add no.',NRTOT-NDCMR)
CALL SET_ERR(259,
* 'Error. GXCHKI - RCKMC too small for buffers.',1)
C CALL EAROUT(1)
ENDIF
C
C--- Storage for indices to species, and elemental composition
C
K0L0 =LCKI +LMCI
K0ELT =K0L0 +KK
K0IPV =K0ELT+MM*KK
K0WDT =K0IPV+KK
K0ROR =K0WDT+2*KK
K0EBUS=K0ROR+2*II
NITOT =K0EBUS+KK*II
IF(NITOT>NDCMI) THEN
NEEDI=NITOT+1
CALL CHEM_MEM(2,NDCMR,NEEDI,NDCMC,NDCML,NDCMR,NDCMI,NDCMC,NDCML)
ENDIF
IF(NITOT>NDCMI) THEN
CALL WRYT40(' GXCHKI - ICKMC too small for buffers ')
CALL WRIT40(' GXCHKI - ICKMC too small for buffers ')
CALL WRIT1I(' Add no.',NITOT-NDCMI)
CALL SET_ERR(260,
* 'Error. GXCHKI - ICKMC too small for buffers.',1)
C CALL EAROUT(1)
ENDIF
C
C--- Storage for the chemical species and element names
C
K0SYM =LCKC
K0SYME=K0SYM+KK
c K0AWT=K0SYME+MM
c NCTOT=K0AWT+MM
NCTOT=K0SYME+MM
IF(NCTOT>NDCMC) THEN
NEEDC=NCTOT+1
CALL CHEM_MEM(2,NDCMR,NDCMI,NEEDC,NDCML,NDCMR,NDCMI,NDCMC,NDCML)
ENDIF
IF(NCTOT>NDCMC) THEN
CALL WRYT40(' GXCHKI - CCKMC too small for buffers ')
CALL WRIT40(' GXCHKI - CCKMC too small for buffers ')
CALL WRIT1I(' Add no.',NCTOT-NDCMC)
CALL SET_ERR(261,
* 'Error. GXCHKI - CCKMC too small for buffers.',1)
C CALL EAROUT(1)
ENDIF
C
C--- Storage for the ACTIVE flags for TWOPNT
C
IF(ICKOPT==1) THEN
NLTOT=KK
IF(NLTOT>NDCML) THEN
NEEDL=NLTOT+1
CALL CHEM_MEM(2,NDCMR,NDCMI,NDCMC,NEEDL,NDCMR,NDCMI,NDCMC,
1 NDCML)
ENDIF
IF(NLTOT>NDCML) THEN
CALL WRYT40(' GXCHKI - LCKMC too small for buffers ')
CALL WRIT40(' GXCHKI - LCKMC too small for buffers ')
CALL WRIT1I(' Add no.',NLTOT-NDCML)
CALL SET_ERR(262,
* 'Error. GXCHKI - LCKMC too small for buffers.',1)
C CALL EAROUT(1)
ELSE
DO 10005 K=1,KK
LCKMC(K)=.FALSE.
10005 CONTINUE
ENDIF
ENDIF
C
C--- Set value of PRESS0 from CHEMKIN data; get no. of elements etc.;
C get molecular weights; species names. If SIUNIT, then convert
C pressure and RU to SI units.
C
IF(EQZ(PREF)) PREF=1.0
CALL CKRP(ICKMC,RCKMC,RU,RUC,PRES)
IF(SIUNIT) THEN
RU=RU*1.E-4
PRES=PRES*1.E-1
ENDIF
PRESS0=PRES*PREF
CALL CKWT(ICKMC,RCKMC,RCKMC(K0MWT+1))
C atomic-weight storage
CALL CKAWT(ICKMC,RCKMC,RCKMC(K0AWT+1))
CALL CKSYMS(CCKMC1,LCMOUT,CCKMC2(K0SYM+1),LCKERR)
CALL CKSYME(CCKMC1,LCMOUT,CCKMC2(K0SYME+1),LCKERR)
VARTEM=.NOT.CONTEM
RTMP=273.0
CALL CKHMS(RTMP,ICKMC,RCKMC,RCKMC(K0H0K+1))
CALL CKNCF(MM,ICKMC,RCKMC,ICKMC(K0ELT+1))
IF(LCKERR) THEN
CALL WRYT40(' GXCHKI - Failed to load species names ')
CALL WRIT40(' GXCHKI - Failed to load species names ')
CALL SET_ERR(263,
* 'Error. GXCHKI - Failed to load species names.',1)
C CALL EAROUT(1)
ENDIF
C
C--- Check that ITEM comes after species
C
IF(STORE(ITIND).AND.ITIND species ')
CALL WRIT40(' indices; please reorder the variables')
CALL SET_ERR(264,
* 'Error. GXCHKI - TEM1 index must be > species indices.',1)
C CALL EAROUT(1)
ELSE
LCKERR=.FALSE.
IF(STOCMP) THEN
K1=LBCKF
DO 10014 K=1,KK-1
LCKERR=LCKERR.OR..NOT.STORE(K1)
K1=K1+1
10014 CONTINUE
LCKERR=LCKERR.OR..NOT.STORE(LBCKF+KK-1)
IF(LCKERR) THEN
CALL WRIT40(' GXCHKI - too few variables for species ')
CALL WRIT40(' increase the no. of variables ')
CALL SET_ERR(265,
* 'Error. GXCHKI - too few variables for species.',1)
C CALL EAROUT(1)
ENDIF
IF(MOD(ISLN(LBCKF+KK-1),3)==0) THEN
ISLN(LBCKF+KK-1)=ISLN(LBCKF+KK-1)/3
F(L0ISL+LBCKF+KK-1)=-F(L0ISL+LBCKF+KK-1)
ENDIF
ENDIF
ENDIF
C
C--- Declare storage for properties
C
C--- Settings to ensure PBP flags are set so that Ap is set,
C and to ensure whole-field solver storage is deactivated
C
IF(ICKOPT==1) THEN
IF(STOCMP) THEN
K1=LBCKF
DO 10021 K=1,KK
IF(MOD(ISLN(K1),7)/=0) ISLN(K1)=ISLN(K1)*7
IF(MOD(ISLN(K1),5)==0) THEN
ISLN(K1)=ISLN(K1)/5
NWHOLE=NWHOLE-1
NWHOLE=MAX0(1,NWHOLE)
ENDIF
K1=K1+1
10021 CONTINUE
ENDIF
IF(SOLTEM) THEN
IF(MOD(ISLN(ITIND),7)/=0) ISLN(ITIND)=ISLN(ITIND)*7
IF(MOD(ISLN(ITIND),5)==0) THEN
ISLN(ITIND)=ISLN(ITIND)/5
NWHOLE=NWHOLE-1
NWHOLE=MAX0(1,NWHOLE)
ENDIF
ENDIF
ENDIF
NFTOT0=NFTOT
CALL GXMAKE(L0DTF,KK1,'DTF ')
NXYZ=NXNY
NXYZ2=NXNY
IF(WHF(LBCKF)) NXYZ=NXYZ*NZ
IF(NZ>1) NXYZ2=2*NXNY
CALL GXMAKE(L0HK ,NXYZ2*KK,'HK ')
CALL GXMAKE(L0H ,NXYZ,'H ')
CALL GXMAKE(L0CP ,NXYZ,'CP ')
IF(DODIFF) THEN
IF(IMCOPT<2) CALL GXMAKE(L0DK ,MAX(NXYZ,NXYZ2)*KK,'DK ')
IF(IMCOPT>=1) THEN
IF(IMCOPT>=2) THEN
CALL GXMAKE(L0DJK ,NXNY*KK*KK,'DJK ')
IF(NZ>1) CALL GXMAKE(L0DJKH,NXNY*KK*KK,'DJKH')
ENDIF
IF(NX>1) CALL GXMAKE(L0VDE,NXYZ*KK,'VDFE')
IF(NY>1) CALL GXMAKE(L0VDN,NXYZ*KK,'VDFN')
IF(NZ>1) CALL GXMAKE(L0VDH,NXYZ*KK,'VDFH')
ENDIF
C
C--- Determine whether or not we require the thermal diffusivities
C on the basis of are MODifying the DIFfusion law, and whether
C any of the species undergo thermal diffusion
C
DOTDIF=GRNDNO(9,ENULB).AND.NTDIF>0.AND.MODDIF
IF(DOTDIF) CALL GXMAKE(L0DTK,MAX(NXYZ,NXYZ2)*KK,'DTK ')
IF(MODDIF.OR.ENTFLX) THEN
CALL GXMAKE(L0HSU,MAX(NXYZ,NXYZ2),'HSU ')
CALL GXMAKE(L0HAP,MAX(NXYZ,NXYZ2),'HAP ')
IF(NZ>1) THEN
CALL GXMAKE(L0SUHI,NXNY,'SUHI')
CALL GXMAKE(L0APHI,NXNY,'APHI')
ENDIF
ENDIF
ENDIF
IF(DOSORC) THEN
CALL GXMAKE(L0CDK,NXYZ*KK,'CDOT')
CALL GXMAKE(L0TDK,NXYZ*KK,'TAUD')
IF(ICKOPT==0) THEN
CALL GXMAKE(L0HCO ,NXYZ,'HCO ')
CALL GXMAKE(L0HVAL,NXYZ,'HVAL')
ELSEIF(ICKOPT==1) THEN
L0SUK=L0CDK
L0APK=L0TDK
cccc USOLVE=.TRUE.
USOLVE=.TRUE.
ENDIF
ENDIF
C call writ2i('l0suk ',l0suk,'l0apk ',l0apk)
C
C--- Look for Inlet Diffusion PATCHes and create PATCH-wise
C variables
C
IF(SOLTEM) THEN
DO 10022 IP=1,NUMPAT
IF(NAMPAT(IP)(1:6)=='CHEMID') THEN
CALL MAKEPV(PVCKID,IP)
ENDIF
10022 CONTINUE
ENDIF
C
C--- Print memory requirements into the RESULT file
C
IF(.NOT.NULLPR) THEN
CALL WRITBL
CALL WRIT40(' GXCHKI - The following memory has been ')
CALL WRIT40(' taken for CHEMKIN & TRANLIB ')
CALL WRITBL
CALL WRIT2I('REAL:NO.',NRTOT,'INT.:NO.',NITOT)
CALL WRIT2I('CHR.:NO.',NCTOT,'In F:NO.',NFTOT-NFTOT0)
IF(ICKOPT==1) CALL WRIT1I('LOG.:NO.',NLTOT)
ENDIF
C
C--- Set up indices for storing WDoTs and Rates-Of-Reaction
C
IF(STOCMP) THEN
IGRND=NINT(GRND)
ICKMC(K0WDT+1)=IGRND
DO 10031 K=2,2*KK
ICKMC(K0WDT+K)=0
10031 CONTINUE
ICKMC(K0ROR+1)=IGRND
DO 10032 K=2,2*II
ICKMC(K0ROR+K)=0
10032 CONTINUE
DO 10025 K=16,NPHI
NAMD=' '
K0=0
IF(NAME(K)(4:4)=='+') THEN
NAMD=NAME(K)(1:3)//' '
I=LBNAME(NAMD)
K0=K0WDT
ELSEIF(NAME(K)(3:3)=='+') THEN
NAMD=NAME(K)(1:2)//' '
I=LBNAME(NAMD)
K0=K0WDT
ELSEIF(NAME(K)(2:2)=='+') THEN
NAMD=NAME(K)(1:1)//' '
I=LBNAME(NAMD)
K0=K0WDT
ELSEIF(NAME(K)(4:4)=='&') THEN
READ(NAME(K),'(I3)') I
K0=K0ROR
ELSEIF(NAME(K)(3:3)=='&') THEN
READ(NAME(K),'(I2)') I
K0=K0ROR
ELSEIF(NAME(K)(2:2)=='&') THEN
READ(NAME(K),'(I1)') I
K0=K0ROR
ENDIF
IF(K0>0) THEN
IF(K0==K0WDT) THEN
IF(ILBCKF+KK-1) THEN
CALL WRIT40(' GXCHKI - Failed to get WDT var. name ')
CALL SET_ERR(266,
* 'Error. GXCHKI - Failed to get WDT var. name.',1)
C CALL EAROUT(1)
ELSE
I=I-LBCKF+1
ENDIF
ELSEIF(K0==K0ROR) THEN
IF(I<1.OR.I>II) THEN
CALL WRIT40(' GXCHKI - Failed to get ROR var. name ')
CALL SET_ERR(266,
* 'Error. GXCHKI - Failed to get ROR var. name.',1)
C CALL EAROUT(1)
ENDIF
ENDIF
IF(ICKMC(K0+1)==IGRND) ICKMC(K0+1)=0
ICKMC(K0+I)=K
ENDIF
10025 CONTINUE
ENDIF
C
IF(.NOT.NULLPR) THEN
CALL WRITBL
CALL WRIT40(' The chemical species treated are: ')
WRITE(LUPR1, '('' No. Name '',
1 '' Mol.Wt. (Status)'')')
IF(STOCMP) THEN
CODE='(Solved) '
ELSE
CODE='(Virtual)'
ENDIF
ENDIF
DO 10012 K=1,KK
IF(STOCMP) THEN
IF(.NOT.SOLVE(LBCKF+K-1)) CODE='(Derived)'
ENDIF
IL=INDEX(CCKMC2(K0SYM+K),' ')
IF(IL>0.AND.IL<=5) THEN
IF(STOCMP) NAME(LBCKF+K-1)=CCKMC2(K0SYM+K)
IF(.NOT.NULLPR) WRITE(LUPR1,'(2X,I3,4X,A16,8X,F6.2,3X,A9)')
1 K,CCKMC2(K0SYM+K),RCKMC(K0MWT+K),CODE
ELSE
IF(.NOT.NULLPR.AND.STOCMP) WRITE(LUPR1,'(2X,I3,4X,A16,
1 '' ('',A4,'') '',F6.2,3X,A9)') K,CCKMC2(K0SYM+K),
2 NAME(LBCKF+K-1),RCKMC(K0MWT+K),CODE
ENDIF
10012 CONTINUE
IF(.NOT.NULLPR) THEN
CALL WRITBL
CALL WRIT1R(' PRESS0 ',PRESS0)
CALL WRITBL
IF(CONTEM) THEN
CALL WRIT40(' CONTEM=T constant temperature option ')
CALL WRITBL
CALL WRIT1R(' TEMP0 ',TEMP0)
CALL WRITBL
ENDIF
IF(.NOT.SIUNIT) THEN
CALL WRIT40(' CGS units: cm, g, erg, mol, dynes, s, K')
CALL WRITST
CALL WRITBL
ENDIF
ENDIF
C
C--- Copy the DTFALS values for the CHEMKIN species
C
IF(STOCMP) THEN
K1=LBCKF
DO 10016 K=1,KK
F(L0DTF+K)=DTFALS(K1)
K1=K1+1
10016 CONTINUE
ENDIF
IF(SOLTEM) F(L0DTF+KK+1)=DTFALS(ITIND)
C
C--- Special initialisations for the P-B-P Newton-Raphson solution
C
IF(ICKOPT==1) THEN
C
C--- Settings for the TWOPNT driver
C
IF(NJAC==0) NJAC =20
IF(ITJAC==0) ITJAC =0
IF(IRETIR==0) IRETIR=50
IF(NUMDT==0) NUMDT =50
NUMDT=MAX(0,NUMDT)
IF(NINIT<0) NINIT =50
NINIT=MAX(0,NINIT)
UFAC=UFAC1
DFAC=DFAC1
IF(EQZ(UFAC1)) UFAC=2.
IF(EQZ(DFAC1)) DFAC=4.1
UFAC=MAX(REAL(UFAC),1.01)
DFAC=MAX(REAL(DFAC),1.01)
DTMIN=DTMIN1
DTMAX=DTMAX1
IF(EQZ(DTMIN1)) DTMIN=1.E-10
IF(EQZ(DTMAX1)) DTMAX=0.1
C
C--- Determine U, the smallest increment to 1.0 which the computer
C can detect, ie. the computer's resolution
C
U = 1.0
10017 CONTINUE
U = U*0.5
U0 = 1.0 + U
c!!!! do NOT replace the next line by IF(QNE ....)) !!!!
IF(U0 /= 1.0) GO TO 10017
ABSOL = SQRT(2.0*U)
RELAT = ABSOL
IF(SOLTEM) THEN
NY0=1
RCKMC(K0ABV+1)=VARMAX(ITIND)
RCKMC(K0BLO+1)=VARMIN(ITIND)
ELSE
NY0=0
ENDIF
K1=LBCKF
ATOL=ENDIT(LBCKF)
IF(STOCMP) THEN
DO 10018 K=1,KK-1
ATOL=MIN(REAL(ATOL),ENDIT(K1))
RCKMC(K0ABV+NY0+K)=VARMAX(K1)
RCKMC(K0BLO+NY0+K)=VARMIN(K1)
K1=K1+1
10018 CONTINUE
ENDIF
C
IF(.NOT.STOCMP.AND.IMIXF>0)
1 CALL CKNU(KK,ICKMC,RCKMC,ICKMC(K0EBUS+1))
C
ENDIF
C
GO TO 999
C-----------------------------------------------------------------
C * Make changes for this group only in group 19.
C--- GROUP 7. Variables stored, solved & named
C-----------------------------------------------------------------
C
C--- GROUP 8. Terms (in differential equations) & devices
C
8 GO TO (81,82,83,84,85,86,87,88,89,810,811,812,813,814,815)
1,ISC
81 CONTINUE
C * ------------------- SECTION 1 ---------------------------
C For U1AD<=GRND--- phase 1 additional velocity. Index VELAD
GO TO 999
82 CONTINUE
C * ------------------- SECTION 2 ---------------------------
C For U2AD<=GRND--- phase 2 additional velocity. Index VELAD
GO TO 999
83 CONTINUE
C * ------------------- SECTION 3 ---------------------------
C For V1AD<=GRND--- phase 1 additional velocity. Index VELAD
GO TO 999
84 CONTINUE
C * ------------------- SECTION 4 ---------------------------
C For V2AD<=GRND--- phase 2 additional velocity. Index VELAD
GO TO 999
85 CONTINUE
C * ------------------- SECTION 5 ---------------------------
C For W1AD<=GRND--- phase 1 additional velocity. Index VELAD
GO TO 999
86 CONTINUE
C * ------------------- SECTION 6 ---------------------------
C For W2AD<=GRND--- phase 2 additional velocity. Index VELAD
GO TO 999
87 CONTINUE
C * ------------------- SECTION 7 ---- Volumetric source for gala
GO TO 999
88 CONTINUE
C * ------------------- SECTION 8 ---- Convection fluxes
GO TO 999
89 CONTINUE
C * ------------------- SECTION 9 ---- Diffusion coefficients
C--- Entered when UDIFF =.TRUE.; block-location indices are LAE
C for east, LAW for west, LAN for north, LAS for
C south, LD11 for high, and LD11 for low.
C User should provide INDVAR and NDIREC IF's as above.
C EARTH will apply the DIFCUT and GP12 modifications after the user
C has made his settings.
C
C--- Modify the diffusion coefficients to give derivatives of mole-
C fractions. See the section for diffusion neighbours.
C
IF(MODDIF.AND.INDVAR>=LBCKF.AND.
1 INDVAR<=LBCKF+KK-2) THEN
IF(NDIREC==1) THEN
CALL SUB3(KDP,L0F(LAN),KDM,L0F(LAS),L0VDI,L0VDN)
CALL SUB2(INI,INN,L0DX,L0F(LXYDY))
ELSEIF(NDIREC==3) THEN
CALL SUB3(KDP,L0F(LAE),KDM,L0F(LAW),L0VDI,L0VDE)
CALL SUB2(INI,INE,L0DX,L0F(LXYDX))
ELSEIF(NDIREC==5) THEN
CALL SUB3(KDP,L0F(LD11),KDM,0,L0VDI,L0VDH)
CALL SUB3(INI,INH,L0DX,L0F(LXYDZ),L0DXH,L0F(LXYDZG))
ENDIF
PRES=PRESS0
RTMP=TEMP0
TMPNEI=TEMP0
PRSNEI=PRESS0
K=INDVAR-LBCKF+1
K0IV=ICKMC(K0L0+K)
IVOFF =IZOFF*KK+(INDVAR-LBCKF)*NXNY
IVTOFF=IZOFF*kk+(INDVAR-LBCKF)*NXNY
K0IV=ICKMC(K0L0+K)
DO 80911 ICELL=1,NXNY
IF(VARTEM) RTMP=TEMP0+F(L0TEM+ICELL)
IF(VARPRS) PRES=PRESS0+F(L0P1+ICELL)
WTMEAN=0.0
DO 80905 KA=1,KK
WTMEAN=WTMEAN+F(ICKMC(K0L0+KA)+ICELL)/RCKMC(K0MWT+KA)
80905 CONTINUE
WTMEAN=1./WTMEAN
c write(lupr1,'('' species mass fractions:''/1p5e12.5)')
c 1 (f(ickmc(k0l0+ka)+icell),ka=1,kk)
c call writ1r(' wtmean ',wtmean)
FLUXTD=F(KDP+ICELL)
IF(KDP>0) F(KDP+ICELL)=FLUXTD*WTMEAN
IF(KDM>0) F(KDM+ICELL)=F(KDM+ICELL)*WTMEAN
IF(DOTDIF) THEN
C
C--- For thermal diffusion, we must first calculate an equivalent
C mean diffusion coefficient
C
INEI=NINT(F(INI+ICELL))
IF(NDIREC==5) THEN
INEI1=ICELL+KK*NXNY
INEI2=ICELL+L0DXH-L0DX
DXNEI=2.*F(L0DXH+ICELL)-F(L0DX+ICELL)
INEI3=ITWO(ICELL,INEI,.NOT.STORE(DEN1).AND.RHO1>=0.)
ELSE
INEI1=INEI
DXNEI =F(L0DX+INEI)
INEI3=INEI
ENDIF
RHO =F(L0DEN+ICELL)
RHONEI=F(L0DEN+INEI3)
IF(VARPRS) PRSNEI=PRESS0+F(L0P1+INEI)
IF(VARTEM) TMPNEI=TEMP0+F(L0TEM+INEI)
DTK =F(L0DTK+IVTOFF+ICELL)+TINY
DTKNEI=F(L0DTK+IVTOFF+INEI1)+TINY
DCK =F(L0DK+IVOFF+ICELL)+TINY
DCKNEI=F(L0DK+IVOFF+INEI1)+TINY
DX =F(L0DX+ICELL)
IF(HRM(INDVAR)) THEN
AVEDTK=(DX/(RHO*DCK)+DXNEI/(RHONEI*DCKNEI))/
1 (DX/(RHO*DTK*DCK)+DXNEI/(RHONEI*DTKNEI*DCKNEI))
ELSE
AVEDTK=(RHO*DTK*DCK+RHONEI*DTKNEI*DCKNEI)/
1 (RHO*DCK+RHONEI*DCKNEI)
ENDIF
GRAT=TMPNEI/RTMP
FLUXTD=-AVEDTK*FLUXTD*WTMEAN*LOG(TMPNEI/RTMP)
F(L0VDI+IVTOFF+ICELL)=FLUXTD
ENDIF
80911 CONTINUE
C
ENDIF
GO TO 999
810 CONTINUE
C * ------------------- SECTION 10 --- Convection neighbours
GO TO 999
811 CONTINUE
C * ------------------- SECTION 11 --- Diffusion neighbours
C
C--- Modify the diffusion neighbours to take account of mole-
C fraction derivatives and thermal diffusion
C
IF((ENTFLX.OR.MODDIF).AND.INDVAR>=LBCKF.AND.
1 INDVAR<=LBCKF+KK-2) THEN
IF(WHF(LBCKF)) THEN
CALL SUB2(KSU,-LBZ(L3SU,IZ),KAP,-LBZ(L3AP,IZ))
ELSE
CALL SUB2(KSU,L0F(LSU),KAP,L0F(LAP))
ENDIF
K=INDVAR-LBCKF+1
IF(INDVAR==LBCKF.AND.SOLTEM) THEN
CALL FN1(-L0HAP,0.0)
CALL FN1(-L0HSU,0.0)
IF(NZSTEP>1) THEN
CALL FN1(-L0HAP-NXNY,0.0)
CALL FN1(-L0HSU-NXNY,0.0)
ENDIF
ENDIF
IF(NDIREC==1) THEN
CALL SUB4(KDP,L0F(LAN),KDM,L0F(LAS),L0VDI,L0VDN,
1 KDNEI,L0F(LD8))
CALL SUB2(INI,INN,L0DX,L0F(LXYDY))
ELSEIF(NDIREC==3) THEN
CALL SUB4(KDP,L0F(LAE),KDM,L0F(LAW),L0VDI,L0VDE,
1 KDNEI,L0F(LD8))
CALL SUB2(INI,INE,L0DX,L0F(LXYDX))
ELSEIF(NDIREC==5) THEN
C Must use LAH here not LD11
CALL SUB4(KDP,L0F(LAH),KDM,0,L0VDI,L0VDH,KDNEI,L0F(LD7))
CALL SUB4(INI,INH,L0DX,L0F(LXYDZ),K0IHH,
1 L0HK+(K-1)*NXNY+KK*NXNY,K0HHKK,L0HK+(KK-1)*NXNY+KK*NXNY)
CALL FN1(-L0APHI,0.0)
CALL FN1(-L0SUHI,0.0)
ENDIF
PRES=PRESS0
PRESP=PRESS0
RTMP=TEMP0
RTMP=TEMP0
CALL SUB4(K0IV,ICKMC(K0L0+K),K0IH,L0HK+(K-1)*NXNY,
1 K0IHKK,L0HK+(KK-1)*NXNY,IVTOFF,IZOFF*KK+(K-1)*NXNY)
DO 81111 ICELL=1,NXNY
INEI=NINT(F(INI+ICELL))
IF(MODDIF.OR.ENTFLX) THEN
IF(VARPRS) THEN
PRES =PRESS0+F(L0P1+ICELL)
PRESP=PRESS0+F(L0P1+INEI)
ENDIF
IF(VARTEM) THEN
RTMP =TEMP0+F(L0TEM+ICELL)
TMPNEI=TEMP0+F(L0TEM+INEI)
ENDIF
ENDIF
IF(MODDIF) THEN
WTMEAN=0.0
WTMNEI=0.0
DO 81105 KA=1,KK
WTMEAN=WTMEAN+F(ICKMC(K0L0+KA)+ICELL)/RCKMC(K0MWT+KA)
WTMNEI=WTMNEI+F(ICKMC(K0L0+KA)+INEI )/RCKMC(K0MWT+KA)
81105 CONTINUE
WTMEAN=1./WTMEAN
WTMNEI=1./WTMNEI
WTMRAT=WTMEAN/WTMNEI
ELSE
WTMRAT=1.0
ENDIF
FLUX=0.0
IF(DOTDIF) THEN
FLUXTD=F(L0VDI+IVTOFF+ICELL)
IF(NDIREC==5) THEN
KAPNEI=L0APHI+ICELL
KSUNEI=L0SUHI+ICELL
ELSE
KAPNEI=KAP+INEI
KSUNEI=KSU+INEI
ENDIF
IF(FLUXTD<0.0) THEN
F(KAP+ICELL)=F(KAP+ICELL)-FLUXTD/F(K0IV+ICELL)
ELSEIF(FLUXTD>0.0) THEN
F(KAPNEI) =F(KAPNEI)+FLUXTD/F(KDNEI+ICELL)
ENDIF
F(KSU+ICELL)=F(KSU+ICELL) - FLUXTD
F(KSUNEI) =F(KSUNEI) + FLUXTD
FLUX=FLUX+FLUXTD
ENDIF
IF(MODDIF) F(KDNEI+ICELL)=F(KDNEI+ICELL)/WTMRAT
FLUX=FLUX+F(KDP+ICELL)*(F(K0IV+ICELL)-F(KDNEI+ICELL))
C--- Accumulate the enthalpy flux that results from mass-diffusion
C (note that the arrays for SU and AP terms must be zeroed on
C entry for the first CHEMKIN species)
C
IF(ENTFLX) THEN
C
C--- The enthalpy fluxes must be upwinded
C
ENTI =F(K0IH+ICELL) -F(K0IHKK+ICELL)
IF(NDIREC==5) THEN
ENTNEI=F(K0IHH+ICELL) -F(K0HHKK+ICELL)
INEIH=NXNY+ICELL
ELSE
ENTNEI=F(K0IH+INEI) -F(K0IHKK+INEI)
INEIH=INEI
ENDIF
IF(FLUX<0.0) THEN
F(L0HAP+ICELL)=F(L0HAP+ICELL)-FLUX*ENTI/RTMP
F(L0HSU+ICELL)=F(L0HSU+ICELL)-FLUX*(ENTNEI-ENTI)
ELSEIF(FLUX>0.0) THEN
F(L0HAP+INEIH)=F(L0HAP+INEIH)+FLUX*ENTNEI/TMPNEI
F(L0HSU+INEIH)=F(L0HSU+INEIH)+FLUX*(ENTNEI-ENTI)
ENDIF
ENDIF
81111 CONTINUE
ENDIF
C
GO TO 999
812 CONTINUE
C * ------------------- SECTION 12 --- Linearised sources
C
C--- Add the enthalpy flux resulting from mass-diffusion to the
C SU for the energy conservation equation, and make the
C corresponding additions to AP
C
IF((ENTFLX.OR.MODDIF).AND.SOLTEM.AND.INDVAR==ITIND) THEN
IF(WHF(LBCKF)) THEN
CALL SUB2(KAP,LBZ(L3AP,IZ),KSU,LBZ(L3SU,IZ))
ELSE
CALL SUB2(KAP,-L0F(LAP),KSU,-L0F(LSU))
ENDIF
CALL FN60(KAP,-L0HAP)
CALL FN60(KSU,-L0HSU)
ENDIF
C
GO TO 999
813 CONTINUE
C * ------------------- SECTION 13 --- Correction coefficients
GO TO 999
814 CONTINUE
C * ------------------- SECTION 14 --- User's own solver
C
C--- The CHEMKIN variables are solved on a point-by-point (PBP)
C basis using the Sandia TWOPNT solver (Newton-Raphson iteration)
C If this is not a CHEMKIN variable (assumed to be the default)
C then we want to go into the PHOENICS solver so we set USER=.F.
C For CHEMKIN variables we must initialise LD7, into which the
C PHOENICS solver would put the corrections, to zero.
C
USER=.FALSE.
C
C--- Set up indices for storage of Rates-Of-Reaction and WDoTs
C
IF(STOCMP) THEN
IF(ICKMC(K0WDT+1)/=IGRND) THEN
DO 81401 K=1,KK
I=ICKMC(K0WDT+K)
IF(I>0) ICKMC(K0WDT+KK+K)=L0F(I)
81401 CONTINUE
ENDIF
IF(ICKMC(K0ROR+1)/=IGRND) THEN
DO 81402 K=1,II
I=ICKMC(K0ROR+K)
IF(I>0) ICKMC(K0ROR+II+K)=L0F(I)
81402 CONTINUE
ENDIF
ENDIF
C
IF((SOLTEM.AND.INDVAR==ITIND.OR.
1 .NOT.SOLTEM.AND.INDVAR==LBCKF+KK-2)
2 .AND.ICKOPT==1) THEN
C
C--- Initialise ENUFSW for later setting on the basis of residual
C on entry to PHOTWO, set USER to cut out the PHOENICS solver,
C and ensure that the dummy array (LD7) that usually contains
C the corrections is set to zero
C
ENUFSW=.TRUE.
DO 81411 K=1,KK
LK=LBCKF+K-1
IF(ISL(LK)/=0) F(L0SLRS+IABS(ISL(LK)))=0.0
81411 CONTINUE
IF(SOLTEM) F(L0SLRS+ISL(ITIND))=0.0
IF(IZSTEP==1) THEN
DO 81412 K=1,KK
LK=LBCKF+K-1
IF(ISL(LK)/=0) F(L0TTRS+IABS(ISL(LK)))=0.0
81412 CONTINUE
IF(SOLTEM) F(L0TTRS+ISL(ITIND))=0.0
ENDIF
USER=.TRUE.
CALL FN1(LD7,0.0)
C
C--- Final CHEMKIN variable so now loop over cells solving on a point-
C by-point basis: first add in the extra diffusion sources for
C enthalpy and set up indices dependent on whether or not the
C temperature variable is being solved
C
CALL SUB3(L0SU,L0F(LSU),L0AP,L0F(LAP),L0VOL,L0F(VOL))
IF(INDVAR==ITIND) THEN
NATJ=KK
NY0=1
ELSE
NATJ=KK-1
NY0=0
ENDIF
I0=L0SUK
ISA=L0APK-L0SUK
PRES=PRESS0
RTMP=TEMP0
DTTP=DTFALS(LBCKF)/(UFAC-1.)
C
C--- Now loop over cells calling the solver-driver PHOTWO to generate
C the solutions
C
DO 81441 ICELL=1,NXNY
C
C--- Before doing anything else look to see whether the cell is
C blocked. If blocked we do nothing for the chemical species
C but still do a PBP solution for the TEM1 variable
C
CALL SUB2L(BLOCKD,.FALSE.,SOLID,.FALSE.)
IF(IPRPS>0) THEN
SOLID =F(L0PRPS+ICELL)>=SOLPRP
BLOCKD=F(L0PRPS+ICELL)>=PORPRP
ENDIF
C IF(TSTVPO) BLOCKD=BLOCKD.OR.F(L0VPOR+ICELL)<=1.E-10
IF(SOLID.AND.INDVAR==ITIND) THEN
C
C--- If the cell is a solid then we solve only for temperature, and
C if temperature is solved we skip over all solution
C
RESID=ABS(F(L0SU+ICELL))
DELVAR=F(L0SU+ICELL)/F(L0AP+ICELL)
F(L0TEM+ICELL)=F(L0TEM+ICELL)+DELVAR
GO TO 81427
ELSEIF(BLOCKD.OR.SOLID) THEN
C
C--- If the cell is completely blocked, do nothing
C
GO TO 81439
ENDIF
C--- If FIXVAL cell then (a) fix temperature and species; and
C (b) skip to end of loop bypassing call to photwo
FIXCEL=.FALSE.
IF(NY0>0) THEN
IF(F(L0AP+ICELL)>=FIXVAL) THEN
FIXCEL=.TRUE.
DELVAR=F(L0SU+ICELL)/F(L0AP+ICELL)
F(L0TEM+ICELL)=F(L0TEM+ICELL)+DELVAR
ENDIF
ENDIF
DO 81499 K=1,NATJ-1
IF(F(I0+ISA+K)>=FIXVAL) THEN
FIXCEL=.TRUE.
DELVAR=F(I0+K)/F(I0+ISA+K)
F(ICKMC(K0L0+K)+ICELL)=F(ICKMC(K0L0+K)+ICELL)+DELVAR
ENDIF
81499 CONTINUE
IF(FIXCEL) GO TO 81439
C---
C
C--- First copy the sources, Su, the coefficients, Ap, and the CHEMKIN
C variables solved into buffer stores, set the pressure, if local
C pressure is to be used in CHEMKIN, and get the cell volume for
C calculating the reaction source and internal false time-step
C terms
C
IF(VARPRS) PRES=PRESS0+F(L0P1+ICELL)
IF(VARTEM) RTMP=F(L0TEM+ICELL)
DO 81405 K=1,KK
RCKMC(K0SU+NY0+K) =F(I0+K)
RCKMC(K0AP+NY0+K) =F(I0+ISA+K)
RCKMC(K0VAR+NY0+K) =F(ICKMC(K0L0+K)+ICELL)
RCKMC(K0VARN+NY0+K)=F(ICKMC(K0L0+K)+ICELL)
81405 CONTINUE
IF(INDVAR==ITIND) THEN
RCKMC(K0VAR+1)=F(L0TEM+ICELL)
RCKMC(K0VARN+1)=F(L0TEM+ICELL)
RCKMC(K0SU+1)=F(L0SU+ICELL)
RCKMC(K0AP+1)=F(L0AP+ICELL)
ELSE
RCKMC(K0SU+NATJ)=F(L0SU+ICELL)
RCKMC(K0AP+NATJ)=F(L0AP+ICELL)
ENDIF
VOLUME=F(L0VOL+ICELL)
if(dbgloc) call writ1i(' icell',icell)
C
C--- Call the PHOenics TWOpnt driver routine PHOTWO to generate the
C solution for the current cell
C
CALL PHOTWO(LOUTCM,KK,NATJ,1,1,SOLTEM,LENTWP,LEVEL,
1 LCKMC,ICKMC,RCKMC,VOLUME,RCKMC(K0MWT+1),
2 ATIM,RTIM,ATOL,RTOL,ABSOL,RELAT,RCKMC(K0ABV+1),
3 RCKMC(K0BLO+1),RCKMC(K0TPB+1),RCKMC(K0TWP+1),
4 ICKMC(K0IPV+1),RCKMC(K0SCR+1),RCKMC(K0VAR+1),
5 RCKMC(K0VARN+1),RCKMC(K0RES+1),RCKMC(K0RESN+1),
6 RCKMC(K0A+1),RCKMC(K0SU+1),RCKMC(K0AP+1),
7 RCKMC(K0H0K+1),UFAC,DFAC,PRES,RTMP,NINIT,NJAC,
8 ITJAC,IRETIR,NUMDT,DTTP,DTMIN,DTMAX,
9 QDOT,ICALL1,DTEMP0,DBGLOC.OR.FLAG,ERROR,TPSEM)
C
C--- First check for errors reported by PHOTWO
C
IF(ERROR) THEN
IF(BYPASS) THEN
IF(TPSEM) THEN
CALL WRITBL
CALL WRITST
CALL WRIT40(' GXCHKI - PHOTWO failed to converge at ')
CALL WRIT4I(' ISWEEP',ISWEEP,' ITHYD',ITHYD,
1 ' IZSTEP',IZSTEP,' ICELL',ICELL)
ENDIF
ELSE
CALL WRITBL
CALL WRITST
CALL WRIT40(' GXCHKI - PHOTWO reports a fatal error ')
CALL WRIT1I('INDVAR ',INDVAR)
CALL WRIT4I(' ISWEEP',ISWEEP,' ITHYD',ITHYD,
1 ' IZSTEP',IZSTEP,' ICELL',ICELL)
CALL WRIT40(' Solution for this cell is: ')
WRITE(LUPR1,'('' Spec. Value VARMIN'',
1 '' VARMAX Ap Res'')')
IF(NY0>0) WRITE(LUPR1,'(1X,A4,3X,1P5E12.3)') 'TEM1',
1 RCKMC(K0VAR+1), VARMIN(ITIND), VARMAX(ITIND),
2 RCKMC(K0AP+1), RCKMC(K0SCR+2*KK+1)
DO 81491 K=NY0+1,NATJ+1
KIV=LBCKF+K-NY0-1
IF(SOLVE(KIV)) THEN
WRITE(LUPR1,'(1X,A4,3X,1P5E12.3)') NAME(KIV),
1 RCKMC(K0VAR+K), VARMIN(KIV), VARMAX(KIV),
2 RCKMC(K0AP+K), RCKMC(K0SCR+2*KK+K)
ELSE
WRITE(LUPR1,'(1X,A4,3X,1P5E12.3)') NAME(KIV),
1 RCKMC(K0VAR+K), VARMIN(KIV), VARMAX(KIV)
ENDIF
81491 CONTINUE
CALL WRITBL
CALL WRITST
CALL WRITBL
CALL SET_ERR(267, 'Error. See result file.',1)
C CALL EAROUT(1)
ENDIF
ENDIF
C
C--- Copy the new solution back into the PHOENICS variable stores,
C calculating the mass-fraction of the last species form the sum
C of the other species mass-fractions
C
SUMY=0.0
DO 81431 K=1,KK-1
SUMY=SUMY+RCKMC(K0VAR+NY0+K)
RCKMC(K0BUF+K)=RCKMC(K0VAR+NY0+K)
F(ICKMC(K0L0+K)+ICELL)=RCKMC(K0VAR+NY0+K)
81431 CONTINUE
RCKMC(K0BUF+KK)=1.-SUMY
F(ICKMC(K0L0+KK)+ICELL)=RCKMC(K0BUF+KK)
IF(SOLTEM) F(L0TEM+ICELL)=RCKMC(K0VAR+1)
C
C--- Load the print-out arrays for Rates-Of-Reaction, WDoTs &
C Note that the first KK elements of the scratch array (K0SCR+...)
C contain the rates-of-production (WDoTs)
C
IF(L0QDOT>0) F(L0QDOT+ICELL)=QDOT
IF(ICKMC(K0WDT+1)/=IGRND) THEN
DO 81421 K=1,KK
I=ICKMC(K0WDT+KK+K)
IF(I>0) F(I+ICELL)=RCKMC(K0SCR+K)*RCKMC(K0MWT+K)
81421 CONTINUE
ENDIF
IF(ICKMC(K0ROR+1)/=IGRND) THEN
CALL CKQYP(PRES,RTMP,RCKMC(K0BUF+1),ICKMC,RCKMC,
1 RCKMC(K0BUF+KK+1))
DO 81422 K=1,II
I=ICKMC(K0ROR+II+K)
IF(I>0) F(I+ICELL)=RCKMC(K0BUF+KK+K)
81422 CONTINUE
ENDIF
C
C--- Set ENUFSW on the basis of residual for the current cell on entry
C to the solution procedure, and on the basis of the change in the
C variables solved using PHOTWO for this iteration. If both are
C small enough when compared with the RESREF and ENDIT variables
C signal that ENUFSW need not be .FALSE.
C
DO 81425 K=NY0+1,NATJ
KIV=LBCKF+K-NY0-1
IF(RESREF(KIV)<0) ENUFSW=ENUFSW.AND.
1 ABS(RCKMC(K0SCR+2*KK+K))/(TINY+ABS(RESREF(KIV)))<1.0
DELVAR=RCKMC(K0VAR+K)-RCKMC(K0VARN+K)
ENUFSW=ENUFSW.AND.ABS(DELVAR)=LBCKF.AND.INDVAR<=LBCKF+KK-2.AND.
1 ICKOPT==1) THEN
C
C--- If this is a CHEMKIN variable, but not the last, then just
C save the SU and AP, zero the correction store, and set USER
C to indicate that the PHOENICS solver should do nothing
C
USER=.TRUE.
CALL FN1(LD7,0.0)
I=L0SUK+INDVAR-LBCKF+1
ISA=L0APK-L0SUK
L0SU=L0F(LSU)
L0AP=L0F(LAP)
DO 81451 ICELL=1,NXNY
C
CALL SUB2L(BLOCKD,.FALSE.,SOLID,.FALSE.)
IF(IPRPS>0) THEN
SOLID =F(L0PRPS+ICELL)>=SOLPRP
BLOCKD=F(L0PRPS+ICELL)>=PORPRP
ENDIF
C IF(TSTVPO) BLOCKD=BLOCKD.OR.F(L0VPOR+ICELL)<=1.E-10
IF(.NOT.(BLOCKD.OR.SOLID)) THEN
C
C--- If the cell is completely blocked, do nothing
C
F(I)=F(L0SU+ICELL)
F(I+ISA)=F(L0AP+ICELL)
ELSE
F(I)=0.0
F(I+ISA)=1.E10
ENDIF
I=I+KK
81451 CONTINUE
ENDIF
GO TO 999
815 CONTINUE
C * ------------------- SECTION 15 --- Change solution
GO TO 999
C
C * See the equivalent section in GREX for the indices to be
C used in sections 7 - 15
C
C * Make all other group-8 changes in GROUP 19.
C-----------------------------------------------------------------
C
C--- GROUP 9. Properties of the medium (or media)
C
C The sections in this group are arranged sequentially in their
C order of calling from EARTH. Thus, as can be seen from below,
C the temperature sections (10 and 11) precede the density
C sections (1 and 3); so, density formulae can refer to
C temperature stores already set.
9 CONTINUE
C-----------------------------------------------------------------
C
C--- The next section is done for all sections
C
ICELL=ICELLA
PRES=PRESS0
RTMP=TEMP0
IF(VARPRS) PRES=PRES+F(L0P1+ICELL)
IF(VARTEM) RTMP=RTMP+F(L0TEM+ICELL)
SUMY=0.0
SUMW=0.0
C IF(ICKOP1/=2.OR.IMIXF==0) THEN
IF(STOCMP) THEN
DO 9001 K=1,KK-1
RCKMC(K0BUF+K)=F(ICKMC(K0L0+K)+ICELL)
SUMW=SUMW+RCKMC(K0BUF+K)/RCKMC(K0MWT+K)
SUMY=SUMY+RCKMC(K0BUF+K)
9001 CONTINUE
ENDIF
C
RCKMC(K0BUF+KK)=1.-SUMY
SUMW=SUMW+RCKMC(K0BUF+KK)/RCKMC(K0MWT+KK)
IF(IMMWT>0) F(L0MMWT+ICELL)=1./SUMW
IF(IGSH>0) IZOFF=IZOFF+NXNY
C--- Check whether we are in a solid (special actions taken)
C probably done in GXPRPS
C
IF(ISC==14) THEN
C * ------------------- SECTION 14 ---------------------------
C For SOLVE(TEMP1)-------------------------- phase-1 specific heat
C
C....
CALL SUB2(L0HZ,L0H+IZOFF,L0CPZ,L0CP+IZOFF)
CALL CKHMS(RTMP,ICKMC,RCKMC,RCKMC(K0BUF+KK+1))
HMIX=0.0
IF(IGSH>0) THEN
CALL SUB2(K0L,L0HK,K0,L0HK+KK*NXNY)
KADD=0
DO 90001 K=1,KK
C CALL FN0(-K0L-KADD,-K0-KADD)
F(K0L+KADD+ICELL)=F(K0+KADD+ICELL)
KADD=KADD+NXNY
90001 CONTINUE
ELSE
CALL SUB2(K0,L0HK,K0H,L0HK+KK*NXNY)
ENDIF
C
C--- Calculate the sensible enthalpies, store them and calculate
C the mixture enthalpy
C
DO 9002 K=1,KK
HSENS=RCKMC(K0BUF+KK+K)-RCKMC(K0H0K+K)
F(K0+ICELL)=HSENS
HMIX=HMIX+RCKMC(K0BUF+K)*HSENS
K0=K0+NXNY
9002 CONTINUE
c VALOUT=HMIX/RTMP
VALOUT=HMIX/f(l0tem+icell)
F(L0HZ+ICELL)=HMIX
IF(L0ENT>0) THEN
HMIXT=0.0
DO 9021 K=1,KK
HMIXT=HMIXT+RCKMC(K0BUF+K)*RCKMC(K0BUF+KK+K)
9021 CONTINUE
F(L0ENT+ICELL)=F(L0DEN+ICELL)*HMIXT
ENDIF
CALL CKCPBS(RTMP,RCKMC(K0BUF+1),ICKMC,RCKMC,CPMIX)
F(L0CPZ+ICELL)=CPMIX
IF(IGSH==0.AND.NZ>1) THEN
CALL SUB3(K0,L0HK,K0H,L0HK+KK*NXNY,KADD,0)
DO 90011 K=1,KK
C CALL FN0(-K0H-KADD,-K0-KADD)
F(K0H+KADD+ICELL)=F(K0+KADD+ICELL)
KADD=KADD+NXNY
90011 CONTINUE
ENDIF
C
if(dbgloc.and.dbt) then
call writ3i(' icell',icell,' isweep',isweep,
1 ' izstep',izstep)
call writ2r(' hmix',real(hmix),' cpmix',real(cpmix))
write(lupr1,'('' individual enthalpies are:''/1p5e12.5)')
1 (rckmc(k0buf+kk+k),k=1,kk)
endif
C
ELSEIF(ISC==1) THEN
C * ------------------- SECTION 1 ---------------------------
C For RHO1<=GRND--- density for phase 1 Index DEN1
C
CALL CKRHOY(PRES,RTMP,RCKMC(K0BUF+1),ICKMC,RCKMC,RHOMIX)
VALOUT=RHOMIX
C
if(dbgloc.and.dbrho) then
call writ3i(' icell',icell,' isweep',isweep,
1 ' izstep',izstep)
call writ1r(' rho',valout)
endif
C
ELSEIF(ISC==6) THEN
C * ------------------- SECTION 6 ---------------------------
C For ENUL<=GRND--- reference laminar kinematic viscosity
C Index VISL
C
VALOUT=0.0
IF(DODIFF) THEN
VISMIX=0.0
CALL CKYTX(RCKMC(K0BUF+1),ICKMC,RCKMC,RCKMC(K0BUF+1))
CALL MCAVIS(RTMP,RCKMC(K0BUF+1),RCKMC(KMCR),VISMIX)
VALOUT=VISMIX/F(L0DEN+ICELL)
IF(SIUNIT) VALOUT=VALOUT*VISSCA
C
if(dbgloc.and.dbemu) then
call writ3i(' icell',icell,' isweep',isweep,
1 ' izstep',izstep)
call writ1r(' enu',valout)
endif
ENDIF
C
ELSEIF(ISC==7) THEN
C * ------------------- SECTION 7 ---------------------------
C For PRNDTL( )<=GRND--- laminar PRANDTL nos., or diffusivity
C Index LAMPR
IF(DODIFF) THEN
CALL CKYTX(RCKMC(K0BUF+1),ICKMC,RCKMC,RCKMC(K0BUF+1))
IF(INDVAR==ITIND) THEN
CALL MCACON(RTMP,RCKMC(K0BUF+1),RCKMC(KMCR),CONMIX)
VALOUT=CONMIX
IF(SIUNIT) VALOUT=VALOUT*CONSCA
IF(L0CON>0) F(L0CON+ICELL)=VALOUT
C
if(dbgloc.and.dbgam) then
call writ3i(' icell',icell,' isweep',isweep,
1 ' izstep',izstep)
call writ1r(' cond',valout)
endif
C
ELSEIF(IMCOPT<2) THEN
IF(INDVAR==LBCKF) THEN
if(dbgloc.and.dbgam) then
call writ3i(' icell',icell,' isweep',isweep,
1 ' izstep',izstep)
write(lupr1,'('' mole fractions are:''/1p5e12.5)')
1 (rckmc(k0buf+k),k=1,kk)
endif
CALL MCADIF(PRES,RTMP,RCKMC(K0BUF+1),RCKMC(KMCR),
1 RCKMC(K0BUF+KK+1))
K0=L0DK+IZOFF*KK+ICELL
DO 9003 K=1,KK
F(K0)=RCKMC(K0BUF+KK+K)
K0=K0+NXNY
9003 CONTINUE
IF(SIUNIT) THEN
K0=L0DK+IZOFF*KK+ICELL
DO 90035 K=1,KK
F(K0)=F(K0)*DIFSCA
K0=K0+NXNY
90035 CONTINUE
ENDIF
ENDIF
K0=L0DK+IZOFF*KK
KIV=INDVAR-LBCKF
VALOUT=F(K0+KIV*NXNY+ICELL)
IF(MODDIF) THEN
VALOUT=VALOUT*SUMW
ENDIF
C
if(dbgloc.and.dbgam) then
call writ3i(' icell',icell,' isweep',isweep,
1 ' izstep',izstep)
write(lupr1,'('' diffusion coefficients:''/1p5e12.5)')
1 (rckmc(k0buf+kk+k),k=1,kk)
call writ1l(' moddif ',moddif)
cccc call writ2r(' sumw ',sumw,' pres ',pres)
call writ1r(' valout ',valout)
endif
C
IF(DOTDIF) THEN
C
C--- Calculate the thermal diffusion ratios and store in L0DTK
C
IF(INDVAR==LBCKF) THEN
CALL MCATDR(RTMP,RCKMC(K0BUF+1),ICKMC(KMCI),
1 RCKMC(KMCR),RCKMC(K0BUF+KK+1))
K0 =L0DTK+IZOFF*KK+ICELL
DO 9004 K=1,KK
F(K0)=RCKMC(K0BUF+KK+K)
K0=K0+NXNY
9004 CONTINUE
C
if(dbgloc.and.dbgam) then
call writ3i(' icell',icell,' isweep',isweep,
1 ' izstep',izstep)
write(lupr1,'('' thermal diffusion ratios:''
1 /1p5e12.5)') (rckmc(k0buf+kk+k),k=1,kk)
endif
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
GO TO 999
C-----------------------------------------------------------------
C
C--- GROUP 11. Initialization of variable or porosity fields
C Index VAL
11 CONTINUE
C For RHO1<=GRND--- density for phase 1
C
IF(NPATCH(1:6)=='ICHEMK') THEN
L0VAL=L0F(VAL)
IF(INDVAR==DEN1) THEN
PRES=PRESS0
RTMP=TEMP0
DO 11011 ICELL=1,NXNY
IF(VARPRS) PRES=PRESS0+F(L0P1+ICELL)
IF(VARTEM) RTMP=TEMP0+F(L0TEM+ICELL)
DO 11001 K=1,KK
RCKMC(K0BUF+K)=F(ICKMC(K0L0+K)+ICELL)
11001 CONTINUE
CALL CKRHOY(PRES,RTMP,RCKMC(K0BUF+1),ICKMC,RCKMC,RHOMIX)
F(L0VAL+ICELL)=RHOMIX
11011 CONTINUE
ELSEIF(INDVAR==W1) THEN
CALL POISSL(KVEL,IMUL)
ENDIF
ENDIF
C
GO TO 999
C-----------------------------------------------------------------
C
C--- GROUP 12. Convection and diffusion adjustments
C
c 12 CONTINUE
c GO TO 999
C-----------------------------------------------------------------
C
C--- GROUP 13. Boundary conditions and special sources
C Index for Coefficient - CO
C Index for Value - VAL
13 CONTINUE
C
IF(NPATCH(1:5)/='CHEMK'.AND.NPATCH(1:4)/='NOCP'.AND.
2 NPATCH(1:6)/='CHEMID'.AND.NPATCH(1:5)/='CKWAL') THEN
CALL WRIT40(' GXCHKI - Should not be here for PATCH ')
WRITE(LUPR1,'('' NAME = '',A8)') NPATCH
CALL SET_ERR(268,
* 'Error. GXCHKI - Should not be here for PATCH.',1)
C CALL EAROUT(1)
ENDIF
C
C!!!! Note to users: The next statement indicates how the Eddy-Break-Up
C model MIGHT be implemented; but it has not been tested. Users
C wishing to work with it should "uncomment".
c IF(NPATCH(1:6)=='CHEMK1'.OR.
c 1 NPATCH(1:6)=='CHEMK2'.OR.
c 1 NPATCH(1:6)=='CHEMK3') THEN
C
IF(NPATCH(1:6)=='CHEMK1') THEN
C
C--- Non-stiff / slightly-stiff sources
C CKCTYP - calculates rates of creation and characteristic
C destruction time-scales
C CKWYP - calculates rates of formation of species
C CKCTYR - calculates rates of creation and characteristic
C timescales for destruction of species
C
CALL SUB2(L0HVZ,L0HVAL+IZOFF*KK,L0HCZ,L0HCO+IZOFF*KK)
IF(ISC<11) THEN
IF(INDVAR==LBCKF) THEN
DO 1301 K=1,KK
F(L0DTF+K)=DTFALS(LBCKF+K-1)
1301 CONTINUE
IF(SOLTEM) F(L0DTF+KK+1)=DTFALS(ITIND)
CALL L0F1(CO,ICELL,IADD,'GXCHKI')
ICELL=ICELL+CO
PRES=PRESS0
RTMP=TEMP0
DO 1305 IX=IXF,IXL
ICELL=ICELL+IADD
DO 1304 IY=IYF,IYL
ICELL=ICELL+1
BLOCKD=.FALSE.
IF(IPRPS>0) BLOCKD=F(L0PRPS+ICELL)>=SOLPRP
C IF(TSTVPO) BLOCKD=BLOCKD.OR.F(L0VPOR+ICELL)<=1.E-10
IF(BLOCKD) THEN
K0C=L0CDK+IZOFF*KK
K0T=L0TDK+IZOFF*KK
DO 1391 K=1,KK
F(K0C+ICELL)=0.0
F(K0T+ICELL)=0.0
K0C=K0C+NXNY
K0T=K0T+NXNY
1391 CONTINUE
F(L0HVZ+ICELL)=0.0
F(L0HCZ+ICELL)=0.0
GO TO 1304
ENDIF
IF(VARPRS) PRES=PRES+F(L0P1+ICELL)
IF(VARTEM) RTMP=TEMP0+F(L0TEM+ICELL)
SUMY=0.0
SUMW=0.0
DO 1302 K=1,KK-1
RCKMC(K0VAR+K)=F(ICKMC(K0L0+K)+ICELL)
RCKMC(K0BUF+K)=0.0
RCKMC(K0BUF+KK+K)=0.0
SUMY=SUMY+RCKMC(K0VAR+K)
SUMW=SUMW+RCKMC(K0VAR+K)/RCKMC(K0MWT+K)
1302 CONTINUE
RCKMC(K0VAR+KK)=1.-SUMY
SUMW=SUMW+RCKMC(K0VAR+KK)/RCKMC(K0MWT+KK)
IF(SOLTEM) THEN
IF(ICKOP1==1.OR.ICKOP1==3) THEN
c---- calculate wdotk, i.e. molar production rates of species k
CALL CKWYP(PRES,1.001*RTMP,RCKMC(K0VAR+1),
1 ICKMC,RCKMC,RCKMC(K0BUF+KK+1))
ENDIF
C
HSORP=0.0
C---- calculate qdot = sum(wdotk*wtk*h0k) over all k
DO 1306 K=1,KK
HSORP=HSORP+RCKMC(K0BUF+KK+K)*RCKMC(K0MWT+K)*
1 RCKMC(K0H0K+K)
1306 CONTINUE
IF(RELQDT) HSORP=ALQDOT*HSORP-
1 (1.-ALQDOT)*F(L0QDOT+ICELL)
ENDIF
IF(ICKOP1==1.OR.ICKOP1==3) THEN
GRHO=F(L0DEN+ICELL)
CALL CKCTYR(GRHO,RTMP,RCKMC(K0VAR+1),ICKMC,RCKMC,
1 RCKMC(K0BUF+1),RCKMC(K0BUF+KK+1))
C CALL CKCTYP(PRES,RTMP,RCKMC(K0VAR+1),ICKMC,RCKMC,
C 1 RCKMC(K0BUF+1),RCKMC(K0BUF+KK+1))
ENDIF
RHO=F(L0DEN+ICELL)
HSOR=0.0
K0C=L0CDK+IZOFF*KK
K0T=L0TDK+IZOFF*KK
DTFT=F(L0DTF+KK+1)
DO 1303 K=1,KK
CDOTK=RCKMC(K0BUF+K)
DTF=F(L0DTF+K)
IF(RCKMC(K0BUF+KK+K)>GREAT.OR.
1 RCKMC(K0BUF+KK+K)<=0.0) THEN
TAUK = GREAT
ELSE
TAUK =RCKMC(K0BUF+KK+K)
ENDIF
IF(TAUK>1.E-20.OR.CDOTK>1.E-20) THEN
RHODT=RHO/TAUK
YCONR=RHO/(SUMW*RCKMC(K0MWT+K))
TAUCK=YCONR*(RCKMC(K0VAR+K)+1.E-4)/(TINY+CDOTK)
DTF=MIN(DTF,TAUCK)
DTF=MIN(DTF,TAUK)
F(L0DTF+K)=DTF
F(K0C+ICELL)=RHODT
F(K0T+ICELL)=CDOTK*RCKMC(K0MWT+K)/RHODT
IF(SOLTEM) HSOR=HSOR+RHODT*RCKMC(K0H0K+K)*
1 (F(K0T+ICELL)-F(ICKMC(K0L0+K)+ICELL))
ELSE
F(K0C+ICELL)=0.0
F(K0T+ICELL)=0.0
ENDIF
K0C=K0C+NXNY
K0T=K0T+NXNY
1303 CONTINUE
IF(SOLTEM) THEN
IF(RELQDT) HSOR=ALQDOT*HSOR-
1 (1.-ALQDOT)*F(L0QDOT+ICELL)
DHSBDT=(HSORP-HSOR)/(0.001*RTMP)
if(hsor>0.0) then
IF(DHSBDT<0.0) THEN
F(L0HVZ+ICELL)=RTMP-HSOR/DHSBDT
F(L0HCZ+ICELL)=-DHSBDT
ELSE
F(L0HVZ+ICELL)=-HSOR/FIXFLU
F(L0HCZ+ICELL)=FIXFLU
ENDIF
else
IF(DHSBDT>0.0) THEN
F(L0HVZ+ICELL)=RTMP-HSOR/DHSBDT
F(L0HCZ+ICELL)=DHSBDT
ELSE
F(L0HVZ+ICELL)=-HSOR/FIXFLU
F(L0HCZ+ICELL)=FIXFLU
ENDIF
endif
ENDIF
IF(L0QDOT>0) F(L0QDOT+ICELL)=-HSOR
1304 CONTINUE
1305 CONTINUE
ENDIF
IF(INDVAR==ITEM) THEN
CALL FN0(CO,-L0HCZ)
ELSEIF(INDVAR>=LBCKF.AND.INDVAR0.0) CALL FN34(LAP,LM1,RECT)
ENDIF
ELSE
IF(INDVAR==ITEM) THEN
CALL FN0(VAL,-L0HVZ)
ELSEIF(INDVAR>=LBCKF.AND.INDVAR=U1.AND.(EQZ(VCO)
1 .OR.VCO>=0.8*FIXVAL).OR.
1 INDVAR==P1.AND.QEQ(PCO,FIXFLU)) THEN
C
C--- Setting of inlet velocity: get incoming mass-flux
C
IF(GRN(PCO)) THEN
CALL WRIT40(' GXCHKI - Cannot do INLET with GRND P-CO')
CALL SET_ERR(269,
* 'Error. GXCHKI - Cannot do INLET with GRND P-CO.',1)
C CALL EAROUT(1)
ELSEIF(GRN(RHO1)) THEN
C
C--- Get the incoming gas composition and temperature to calculate the
C density of the incoming gas: note that the incoming temperature
C for GRND set enthalpy fluxes comes form TINLET
C
CALL GETCOV(NPATCH,ITIND,TCO,TVAL)
IF(GRN(TVAL)) THEN
CALL GETSPD(NPATCH,'TINLET',1,TINLET,IDUM,.FALSE.,
1 ' ',IERR)
IF(IERR==1) TINLET=TMP1A
RTMP=TEMP0+TINLET
ELSE
RTMP=TEMP0+TVAL
ENDIF
LCKERR=.FALSE.
SUMY=0.0
DO 13211 K=1,KK-1
CALL GETCOV(NPATCH,LBCKF+K-1,YCO,YVAL)
LCKERR=LCKERR.OR.GRN(YVAL)
RCKMC(K0BUF+K)=YVAL
SUMY=SUMY+YVAL
13211 CONTINUE
RCKMC(K0BUF+KK)=1.-SUMY
IF(LCKERR) THEN
CALL WRIT40(' GXCHKI - Cannot do INLET with GRND Y-CO')
CALL SET_ERR(270,
* 'Error. GXCHKI - Cannot do INLET with GRND Y-CO.',1)
C CALL EAROUT(1)
ELSE
PRES=PRESS0
C inlet species defined in mol fractions
IF(NPATCH(8:8)=='X') THEN
CALL CKRHOX(PRES,RTMP,RCKMC(K0BUF+1),ICKMC,RCKMC,RHOMIX)
ELSE
CALL CKRHOY(PRES,RTMP,RCKMC(K0BUF+1),ICKMC,RCKMC,RHOMIX)
ENDIF
ENDIF
RHOIN=REAL(RHOMIX)
ELSE
RHOIN=RHO1
ENDIF
C
C--- Now look to see if we have a Poisseulle flow PATCH; this is
C indicated by the 6th letter in the PATCH name, by having
C a non-zero value of the relevant PROFx variable, and by
C having the right PATCH-type etc. It is assumed that if the
C velocity is set as Poisseulle flow, then so also is the
C mass-flux (through P1). The work is all done in the subroutine
C POISSL
C
IF(BFC.AND.ISC==13) THEN
IF(INDVAR==P1.OR.(INDVAR>=U1.AND.INDVAR<=W1)) THEN
CALL FN1(VAL,RHOIN)
CALL GXBFC
ENDIF
ELSE
CALL POISSL(KVEL,IMUL)
C
IF(INDVAR==P1) THEN
C
C--- If this is the pressure, we are determining the mass-flux from
C the magnitude of the velocity multiplied by the density of the
C inflowing gas (NB.: the calculation is incorrect for BFC grids)
C
IF(KVEL/=W1) THEN
CALL FN1(VAL,0.0)
DO 13221 IVEL=U1,W1,2
CALL GETCOV(NPATCH,IVEL,VCO,VVALA)
IF(GRN(VVALA)) THEN
ELSEIF(NEZ(VVALA)) THEN
CALL FN33(VAL,VVALA*VVALA)
ENDIF
13221 CONTINUE
CALL FN30(VAL)
ENDIF
CALL FN25(VAL,RHOIN)
ELSEIF(.NOT.GRN(PVAL)) THEN
C
C--- If this is a velocity, we are determining the inflow-velocity
C from the mass-flux and the inflow density (note that this assumes
C only 1 non-zero inflow velocity)
C
CALL FN1(VAL,PVAL/RHOIN)
ELSE
CALL FN25(VAL,FLOAT(IMUL))
ENDIF
ENDIF
ELSEIF(INDVAR==ITIND) THEN
C
C--- Set the value of the incoming enthalpy NOCP PATCHes; get the
C incoming temperature form TINLET (always have GRND set enthapy
C flux for this option)
C
LCKERR=.FALSE.
CALL GETSPD(NPATCH,'TINLET',1,TINLET,IDUM,.FALSE.,
1 ' ',IERR)
IF(IERR==1) TINLET=TMP1A
RTMP=TEMP0+TINLET
SUMY=0.0
DO 13212 K=1,KK-1
CALL GETCOV(NPATCH,LBCKF+K-1,YCO,YVAL)
LCKERR=LCKERR.OR.GRN(YVAL)
RCKMC(K0BUF+K)=YVAL
SUMY=SUMY+YVAL
13212 CONTINUE
RCKMC(K0BUF+KK)=1.-SUMY
IF(LCKERR) THEN
CALL WRIT40(' GXCHKI - Cannot do INLET with GRND Y-CO')
CALL SET_ERR(271,
* 'Error. GXCHKI - Cannot do INLET with GRND Y-CO.',1)
C CALL EAROUT(1)
ELSE
CALL CKHBMS(RTMP,RCKMC(K0BUF+1),ICKMC,RCKMC,CPMIX)
C
C--- Must subtract off the heat of formation part of the enthalpy
C (Note: CPMIX is used to store the enthalpy here)
C
DO 13213 K=1,KK
CPMIX=CPMIX-RCKMC(K0BUF+K)*RCKMC(K0H0K+K)
13213 CONTINUE
CALL FN1(VAL,REAL(CPMIX))
ENDIF
ENDIF
C
ELSEIF(NPATCH(1:6)=='CHEMID') THEN
C
C--- Inlet diffusion PATCHes - the enthalpy flux due to mass-diffusion
C is summed and the added into the enthalpy source
C
IF(INDVAR>=LBCKF.AND.INDVAR<=LBCKF+KK-2.AND.
1 ISC==10) THEN
IPV=L0PVAR(PVCKID,IREG,IZSTEP)
IF(INDVAR==LBCKF) CALL FNSCPA(-IPV,0.0)
CALL GETCOV(NPATCH,INDVAR,YCO,YVAL)
CALL GETSPD(NPATCH,'TINLET',1,TINLET,IDUM,.FALSE.,
1 ' ',IERR)
IF(IERR==1) TINLET=TMP1A
CALL L0F2(CO,INDVAR,ICO,IFIC,IADD,'GXCHKI')
DO 13301 IX=IXF,IXL
ICO=ICO+IADD
DO 13301 IY=IYF,IYL
ICO=ICO+1
IPV=IPV+1
RTMP=TEMP0+TINLET
CALL CKHMS(RTMP,ICKMC,RCKMC,RCKMC(K0BUF+1))
F(IPV)=F(IPV)+MAX(F(ICO)*(YVAL-F(ICO+IFIC)),0.0)
1 *(RCKMC(K0BUF+K)-RCKMC(K0BUF+KK))
13301 CONTINUE
ELSEIF(INDVAR==ITIND.AND.ISC==21) THEN
CALL L0F1(VAL,IVAL,IADD,'GXCHKI')
IPV=L0PVAR(PVCKID,IREG,IZSTEP)
DO 13302 IX=IXF,IXL
IVAL=IVAL+IADD
DO 13302 IY=IYF,IYL
IVAL=IVAL+1
IPV=IPV+1
F(IVAL)=F(IPV)
13302 CONTINUE
ENDIF
C
ELSEIF(MODDIF.AND.NPATCH(1:5)=='CKWAL'.AND.ISC==10.AND.
1 INDVAR>=LBCKF.AND.INDVAR=LBCKF.AND.INDVAR
SUBROUTINE PHINDX(NGO,LINK,LOUT,PRECIS,NTDA,K0TD)
C
C---------------------------------------------------------------
C PHINDX - Checks that the precision of GXCHKI matches that of
C the CHEMKIN and TRANLIB data-bases; also sets various
C indices for GXCHKI
C
C returns .TRUE. if there are thermal diffusion
C coeff.s
C---------------------------------------------------------------
C
C*****double precision
DOUBLE PRECISION
C*****END double precision
C*****single precision
C REAL
C*****END single precision
1 RU, PATMOS, SMALL
CHARACTER*40 PRECIS
CHARACTER*16 PREC, VERS, PRECMC, VERSMC
LOGICAL ERROR, KERR, KERRMC
COMMON /MCCONS/ VERSMC, PRECMC, KERR, LENI, LENR
COMMON /CKCONS/ VERS, PREC, KERRMC, LENIMC, LENRMC
C
COMMON /MCMCMC/ RU, PATMOS, SMALL, NKK, NO, NLITE, INLIN, IKTDIF,
1 IPVT, NWT, NEPS, NSIG, NDIP, NPOL, NZROT, NLAM,
2 NETA, NDIF, NTDIF, NXX, NVIS, NXI, NCP,
3 NCROT, NCINT, NPARK, NBIND, NEOK, NSGM,
4 NAST, NBST, NCST, NXL, NR, NWRK, K3
C
IF(NGO==1) THEN
C
C--- Check CHEMKIN data-base
C
ERROR = PREC(1:6)/=PRECIS(2:7)
C
ELSEIF(NGO==2) THEN
C
C--- Check the TRANLIB data-base; get the number of species for which
C there are thermal diffusion ratios/coefficients
C
ERROR = PREC(1:6)/=PRECIS(2:7)
C
NTDA=NLITE
K0TD=IKTDIF-1
C
ENDIF
C
END
C
C===============================================================
C
SUBROUTINE POISSL(KVEL,IMUL)
C
C-----------------------------------------------------------------
C SUBROUTINE POISSL - puts a POISSL flow into the VAL slot for
C group 13 or group 11 PATCHes
C-----------------------------------------------------------------
C Arguments:
C KVEL - returns a code that indicates whether or not a
C setting has been made
C-----------------------------------------------------------------
C
INCLUDE 'farray'
INCLUDE 'satear'
INCLUDE 'grdloc'
INCLUDE 'satgrd'
INCLUDE 'grdear'
C
LOGICAL GRN
C
IMUL=0
KVEL=0
IF((INDVAR==P1.AND.IGR==13).OR.INDVAR==W1) THEN
VPOISS=GRND
IF(NPATCH(7:7)=='A') THEN
VPOISS=PROFA
ELSEIF(NPATCH(7:7)=='B') THEN
VPOISS=PROFB
ELSEIF(NPATCH(7:7)=='C') THEN
VPOISS=PROFC
ENDIF
KVEL=0
IF(.NOT.GRN(VPOISS)) THEN
IF(IGR==13.AND.(INTTYP==6.OR.INTTYP==7).OR.
1 IGR==11.AND.IPATNF(2,IREG)==26) THEN
KVEL=7
ENDIF
IF(IGR==13) THEN
IGEO=PATGEO
ELSEIF(IGR==11) THEN
IGEO=ANORTH
ENDIF
IF(VPOISS>0.0) THEN
IDVP=YG2D
IF(IYF==1) THEN
XYF=0.0
ELSE
XYF=F(L0F(YV2D)+IYF-1)
ENDIF
XYL=F(L0F(YV2D)+IYL)
IF(.NOT.CARTES) THEN
XYF=XYF+RINNER
XYL=XYL+RINNER
ENDIF
ELSE
VPOISS=-VPOISS
IDVP=XG2D
IF(IXF==1) THEN
XYF=0.0
ELSE
XYF=F(L0F(XU2D)+(IXF-2)*NY)
ENDIF
XYL=F(L0F(XU2D)+(IXL-1)*NY)
ENDIF
IF(IGR==13) IMUL=2*MOD(INTTYP,2)-1
SUM=0.0
ASUM=0.0
CALL L0F3(VAL,IDVP,IGEO,I,IDMI,IGMI,IADD,'GXCHKI')
IF(XYF>0.0) RLRAT=(XYL**2-XYF**2)/LOG(XYL/XYF)
DO 13215 IX=IXF,IXL
I=I+IADD
DO 13215 IY=IYF,IYL
I=I+1
F(I)=XYL**2-F(I+IDMI)**2
IF(XYF>0.0) F(I)=F(I)+RLRAT*LOG(F(I+IDMI)/XYL)
SUM=SUM+F(I)*F(I+IGMI)
ASUM=ASUM+F(I+IGMI)
13215 CONTINUE
CALL FN25(VAL,VPOISS*ASUM/SUM)
ENDIF
ENDIF
END
c