PROGRAM CONP
C
C Integration of adiabatic, constant pressure kinetics problems
C Modified by Javier Molero. July 1995
C Modified February 1997 for input of temperatures and residence times
C
C*****precision > double
IMPLICIT DOUBLE PRECISION (A-H,O-Z), INTEGER(I-N)
C*****END precision > double
C
PARAMETER (LENIWK=5000, LENRWK=13000, LENCWK=500, NK=5, NLMAX=55,
1 LIN=5, LOUT=6, LINKCK=25, KMAX=61, ITOL=1, IOPT=0,
2 RTOL=1.0E-6, ITASK=1, ATOL=1.0E-15)
C
DIMENSION IWORK(LENIWK), RWORK(LENRWK), X(KMAX), Z(KMAX)
CHARACTER CWORK(LENCWK)*16, KSYM(KMAX)*16, LINE*80
LOGICAL KERR, IERR
EXTERNAL FUN
C
COMMON /RCONS/ P, RU, TT2, T
COMMON /ICONS/ KK, NWT, NH, NWDOT
C
DATA KERR/.FALSE./, X/KMAX*0.0/, KSYM/KMAX*' '/
C
C*****open statements included (cif)
OPEN (LIN, FILE='INP', STATUS='OLD')
OPEN (LOUT, FILE='CONP.OUT', STATUS='UNKNOWN')
C*****end of open statements !! (cif)
WRITE (LOUT, 15)
15 FORMAT (
1' CONP: CHEMKINII Vers 1.2 Aug. 1992',
C*****precision > double
2' DOUBLE PRECISION')
C*****END precision > double
C
C Open the CHEMKIN LINK file
C
C*****OPEN statement > unix
OPEN (LINKCK, FORM='UNFORMATTED', file='cklink')
C*****END OPEN statement > unix
C
C*****Initialize CHEMKIN
C
CALL CKLEN (LINKCK, LOUT, LENI, LENR, LENC)
CALL CKINIT (LENIWK, LENRWK, LENCWK, LINKCK, LOUT, IWORK,
1 RWORK, CWORK)
CALL CKINDX (IWORK, RWORK, MM, KK, II, NFIT)
C
NEQ = KK + 1
LRW = 22 + 9*NEQ + 2*NEQ**2
NVODE = LENR + 1
NWT = NVODE + LRW
NH = NWT + KK
NWDOT = NH + KK
NTOT = NWDOT+ KK - 1
C
LIW = 30 + NEQ
IVODE = LENI + 1
ITOT = IVODE + LIW - 1
C
IF (KK .GT. KMAX) THEN
WRITE (LOUT, *)
1 ' Error...KMAX too small...must be at least ',KK
KERR = .TRUE.
ENDIF
C
IF (LENRWK .LT. NTOT) THEN
KERR = .TRUE.
WRITE (LOUT, *)
1 ' Error...LENRWK too small...must be at least', NTOT
ENDIF
C
IF (LENIWK .LT. ITOT) THEN
KERR = .TRUE.
WRITE (LOUT, *)
1 ' Error...LENIWK too small...must be at least', ITOT
ENDIF
C
IF (KERR) STOP
C
CALL CKSYMS (CWORK, LOUT, KSYM, IERR)
IF (IERR) KERR = .TRUE.
CALL CKWT (IWORK, RWORK, RWORK(NWT))
CALL CKRP (IWORK, RWORK, RU, RUC, PATM)
C
C*****Read initial non-zero moles from input file
C
40 CONTINUE
LINE = ' '
READ (LIN, '(A)', END=45) LINE
ILEN = INDEX (LINE, '!')
IF (ILEN .EQ. 1) GO TO 40
C
ILEN = ILEN - 1
IF (ILEN .LE. 0) ILEN = LEN(LINE)
IF (INDEX(LINE(:ILEN), 'END') .EQ. 0) THEN
IF (LINE(:ILEN) .NE. ' ') THEN
CALL CKSNUM (LINE(:ILEN), 1, LOUT, KSYM, KK, KNUM,
1 NVAL, VAL, IERR)
IF (IERR) THEN
WRITE (LOUT,*) ' Error reading moles...'
KERR = .TRUE.
ELSE
X(KNUM) = VAL
ENDIF
ENDIF
GO TO 40
ENDIF
C
45 CONTINUE
C
IF (KERR) STOP
C
C*****Normalize mole fractions
C
XTOT = 0.00
DO 50 K = 1, KK
XTOT = XTOT + X(K)
50 CONTINUE
DO 55 K = 1, KK
X(K) = X(K) / XTOT
55 CONTINUE
C
C*****Set time interval for integration constant at 0.001 s
C Inititalise accumulated residence time
C Set system pressure constant at 1.15 bar
C
DT = 0.001
RTIME = 0.0
PA = 1.15
P = PA*PATM
C
C
C*****Read first set of conditions, T and T2
C
60 READ (LIN, *) T, T2
C
C*****Convert mole fractions to mass fractions
C
CALL CKXTY (X, IWORK, RWORK, Z(2))
C
C*****Print spreadsheet heading and first set of conditions
C
WRITE (LOUT, 7020) (K, K=1, KK+2)
WRITE (LOUT, 7000) (KSYM(K)(:10), K=1, KK)
WRITE (LOUT, 7010) RTIME, (10**6 * Z(K), K=2, KK+1), T
C
C*****Integration loop begins here
C*****Read new temperature and final time from input file
C
100 READ (LIN, *) T, T2
C
C*****End of computation
C
IF (T .EQ. 0.0 .AND. T2 .EQ. 0.0) THEN
STOP
ENDIF
C
C*****Sets initial conditions and mass fractions and integration
C parameters for DVODE
C
TT1 = 0.0
TT2 = TT1
Z(1) = T
MF = 22
ISTATE= 1
NLINES=NLMAX + 1
C
C
250 CONTINUE
C
C*****Calculate accumulated residence time and
C print solution of present stage to output file
C
IF (TT2 .GE. T2) THEN
RTIME = RTIME + T2
WRITE (LOUT, 7010) RTIME, (10**6 * Z(K), K=2, KK+1), T
GOTO 100
ENDIF
C
C*****Increase computation time
C
TT2 = MIN(TT2 + DT, T2)
C
C*****Call the differential equation solver
C
350 CONTINUE
C*****precision > double
CALL DVODE
C*****END precision > double
* (FUN, NEQ, Z, TT1, TT2, ITOL, RTOL, ATOL, ITASK,
1 ISTATE, IOPT, RWORK(NVODE), LRW, IWORK(IVODE),
2 LIW, JAC, MF, RWORK, IWORK)
C
IF (ISTATE .LE. -2) THEN
IF (ISTATE .EQ. -1) THEN
ISTATE = 2
GO TO 350
ELSE
WRITE (LOUT,*) ' ISTATE=',ISTATE
STOP
ENDIF
ENDIF
GO TO 250
C
C FORMATS
C
7000 FORMAT (4X, 'Time/ss', 1X, 61(1X,A11), 2X, 'Temperat')
7010 FORMAT (100E12.4)
7020 FORMAT (100I12)
END
C
SUBROUTINE FUN (N, TIME, Z, ZP, RPAR, IPAR)
C
C*****precision > double
IMPLICIT DOUBLE PRECISION(A-H,O-Z), INTEGER(I-N)
C*****END precision > double
C
COMMON /RCONS/ P, RU, TT2, T
COMMON /ICONS/ KK, NWT, NH, NWDOT
DIMENSION Z(*), ZP(*), RPAR(*), IPAR(*)
C
C Variables in Z are: Z(1) = T, Z(K+1) = Y(K)
C
C Call CHEMKIN subroutines
C
CALL CKRHOY (P, T, Z(2), IPAR, RPAR, RHO)
CALL CKWYP (P, T, Z(2), IPAR, RPAR, RPAR(NWDOT))
C
C Form governing equation
C
DO 100 K = 1, KK
WDOT = RPAR(NWDOT + K - 1)
WT = RPAR(NWT + K - 1)
ZP(K+1) = WDOT * WT / RHO
100 CONTINUE
C
RETURN
END
![]() Previous | ![]() Table of Contents |