13 CHARACTER(LEN=1),
PARAMETER ::
end_str =
')' 16 CHARACTER(LEN=4),
PARAMETER ::
rxn_blk =
'RXNS' 18 CHARACTER(LEN=3),
PARAMETER ::
end_blk =
'END' 34 CHARACTER(len=32),
DIMENSION(:),
ALLOCATABLE ::
rxn_name 38 DOUBLE PRECISION,
DIMENSION(:),
ALLOCATABLE ::
usrdh 40 DOUBLE PRECISION,
DIMENSION(:,:),
ALLOCATABLE ::
usrfdh 52 DOUBLE PRECISION,
DIMENSION(:),
ALLOCATABLE ::
des_usrdh 54 DOUBLE PRECISION,
DIMENSION(:,:),
ALLOCATABLE ::
des_usrfdh 70 SUBROUTINE setreaction(RxN, lNg, lSAg, lM, lNs, lSAs, lDH, lfDH)
82 INTEGER,
INTENT(IN) :: lNg
84 CHARACTER(len=32),
DIMENSION(DIM_N_g),
INTENT(IN) :: lSAg
86 INTEGER,
INTENT(IN) :: lM
88 INTEGER,
DIMENSION(DIM_M),
INTENT(IN) :: lNs
90 CHARACTER(len=32),
DIMENSION(DIM_M, DIM_N_s),
INTENT(IN) :: lSAs
92 DOUBLE PRECISION,
INTENT(IN) :: lDH
94 DOUBLE PRECISION,
DIMENSION(0:DIM_M),
INTENT(IN) :: lfDH
99 CHARACTER(LEN=32),
DIMENSION(50) :: rAlias , pAlias
100 DOUBLE PRECISION,
DIMENSION(50) :: rCoeff , pCoeff
111 DOUBLE PRECISION sumFDH
113 CHARACTER(LEN=512) lChemEq
115 CHARACTER(LEN=32) lName
121 INTEGER nSpecies, nPhases
126 lname = trim(adjustl(rxn%Name))
127 lchemeq = trim(adjustl(rxn%ChemEq))
129 rxn%Classification =
"Undefined" 136 CALL checksplit(lname, lchemeq, rend, pstart, skip)
143 IF(ldh /=
undefined) rxn%Calc_DH = .false.
146 CALL splitentries(lname, lchemeq, 1, rend, rno, ralias, rcoeff)
148 CALL splitentries(lname, lchemeq, pstart, len_trim(lchemeq), &
152 rxn%nSpecies = nspecies
153 Allocate( rxn%Species( nspecies ))
159 CALL mapaliases(lname, lchemeq, lng, lsag, lm, lns, lsas, rno, &
160 ralias, rcoeff, -
one, 0, blankalias, rxn)
164 CALL mapaliases(lname, lchemeq, lng, lsag, lm, lns, lsas, pno, &
165 palias, pcoeff,
one, rno, blankalias, rxn)
171 Allocate( rxn%rPhase( ll+l ))
178 m = rxn%Species(ln)%pMap
180 rxn%Species(ln)%mXfr = m
181 rxn%Species(ln)%xXfr =
zero 183 IF(.NOT.pmap(m))
THEN 185 nphases = nphases + 1
188 rxn%nPhases = nphases
193 IF(.NOT.rxn%Calc_DH)
THEN 195 Allocate( rxn%HoR( 0:lm ))
200 IF(pmap(m) .AND. lfdh(m) .NE.
undefined)
THEN 202 rxn%HoR(m) = lfdh(m) * ldh
203 sumfdh = sumfdh + lfdh(m)
206 ELSEIF(.NOT.pmap(m) .AND. lfdh(m) .NE.
undefined)
THEN 208 write(*,1000) trim(lname)
222 IF(.NOT.rxn%Calc_DH .AND. lfdh(m) .NE.
undefined)
THEN 224 write(*,1000) trim(lname)
239 IF(.NOT.rxn%Calc_DH .AND. .NOT.
compare(sumfdh,
one))
THEN 241 write(*,1002) trim(lname)
253 1000
FORMAT(/1x,70(
'*')/
' From: From: setReaction:',/ &
254 ' Message: Heat of reaction is proportioned to a phase not', &
255 ' referenced',/
' by the chemical equation for reaction ',a,
'.')
257 1001
FORMAT(/
' If this is a catalytic reaction, reference one of the',&
258 ' species of the',/
' catalyst phase within the chemical', &
259 ' equation with a stoichiometric',/
' coefficient of zero.'/)
261 1002
FORMAT(/1x,70(
'*')/
' From: From: setReaction:',/ &
262 ' Message: The heat of reaction partitions (fracDH) to all', &
263 ' phases do',/
' not sum to one for reaction ',a,
'.')
265 1010
FORMAT(
' Please refer to the Readme file for chemical equation', &
266 ' input formats',/
' and correct the data file.',/1x,70(
'*')/)
286 SUBROUTINE checksplit(lName, lChemEq, lrEnd, lpStart, lSkip)
293 CHARACTER(len=*),
INTENT(IN) :: lName
295 CHARACTER(len=*),
INTENT(IN) :: lChemEq
297 INTEGER,
INTENT(OUT) :: lrEnd
299 INTEGER,
INTENT(OUT) :: lpStart
302 LOGICAL,
INTENT(OUT) :: lSkip
313 CHARACTER(LEN=512) FLAG
319 IF(index(lchemeq,
'NONE') > 0)
THEN 327 tarr = index(lchemeq,
'-', back=.false.)
328 harr = index(lchemeq,
">", back=.true.)
330 teqs = index(lchemeq,
"=", back=.false.)
331 heqs = index(lchemeq,
"=", back=.true.)
333 hrarr = index(lchemeq,
"<", back=.false.)
334 trarr = index(lchemeq,
"-", back=.true.)
341 flag =
setflag(20, hrarr, harr)
342 ELSEIF(trarr > 0)
THEN 343 flag =
setflag(20, hrarr, trarr)
348 write(*,1000) trim(lname)
349 write(*,1002)
'Illegal' 350 write(*,1010) trim(lchemeq), trim(flag)
355 write(
unit_log,1010) trim(lchemeq), trim(flag)
362 IF(harr /= 0 .AND. heqs /= 0)
THEN 367 write(*,1000) trim(lname)
368 write(*,1002)
'Too many' 369 write(*,1010) trim(lchemeq), trim(flag)
374 write(
unit_log,1010) trim(lchemeq), trim(flag)
380 ELSEIF(harr == 0 .AND. heqs == 0)
THEN 382 write(*,1000) trim(lname)
384 write(*,1011) trim(lchemeq)
395 ELSEIF(harr /= 0)
THEN 401 write(*,1000) trim(lname)
402 write(*,1003)
'Missing the tail; -->' 403 write(*,1010) trim(lchemeq), trim(flag)
407 write(
unit_log,1003)
'Missing the tail; -->' 408 write(
unit_log,1010) trim(lchemeq), trim(flag)
413 ELSEIF(tarr > harr)
THEN 415 flag =
setflag(20, harr, index(lchemeq,
'-',back=.true.))
416 write(*,1000) trim(lname)
417 write(*,1003)
'Arror head preceeds the tail; -->' 418 write(*,1010) trim(lchemeq), trim(flag)
422 write(
unit_log,1003)
'Arror head preceeds the tail; -->' 423 write(
unit_log,1010) trim(lchemeq), trim(flag)
436 ELSEIF(heqs /= 0)
THEN 443 write(*,1000) trim(lname)
445 write(*,1011) trim(lchemeq)
450 write(
unit_log,1010) trim(lchemeq), trim(flag)
459 1000
FORMAT(/1x,70(
'*')/
' From: From: setReaction --> checkSplit',/ &
460 ' Message: Error in determining the reactants and products', &
461 ' in the',/
' chemical equation for reaction ',a,
'.')
463 1001
FORMAT(
' Please refer to the Readme file for chemical equation', &
464 ' input formats',/
' and correct the data file.',/1x,70(
'*')/)
466 1002
FORMAT(/1x,a,
' operators were found!')
468 1003
FORMAT(
' Incorrect operator format! ',a)
470 1004
FORMAT(
' FATAL ERROR: All logical checks failed.')
472 1010
FORMAT(/
' Chemical Equation: ',a,/1x, a/)
474 1011
FORMAT(/
' Chemical Equation: ',a,/)
492 SUBROUTINE splitentries(lName, lChemEq, lStart, lEnd, lNo, &
500 CHARACTER(len=*),
INTENT(IN) :: lName
502 CHARACTER(len=*),
INTENT(IN) :: lChemEq
504 INTEGER,
INTENT(IN) :: lStart
506 INTEGER,
INTENT(IN) :: lEnd
508 INTEGER,
INTENT(OUT) :: lNo
510 CHARACTER(LEN=32),
DIMENSION(50),
INTENT(OUT) :: lAlias
512 DOUBLE PRECISION,
DIMENSION(50),
INTENT(OUT) :: lCoeff
536 rpos = (lpos-1) + index(lchemeq(lpos:lend),
"+", back=.false.)
538 IF(rpos .GT. lpos)
THEN 542 lalias(lno), lcoeff(lno))
550 lalias(lno), lcoeff(lno))
584 CHARACTER(len=*),
INTENT(IN) :: lName
586 CHARACTER(len=*),
INTENT(IN) :: lChemEq
588 INTEGER,
INTENT(IN) :: lStart
590 INTEGER,
INTENT(IN) :: lEnd
592 CHARACTER(LEN=32),
INTENT(OUT) :: lAlias
594 DOUBLE PRECISION,
INTENT(OUT) :: lCoeff
602 INTEGER L, N, IOS, aPOS, a2POS
604 CHARACTER(LEN=12),
PARAMETER :: Numbers =
'.0123456789' 607 CHARACTER(LEN=512) FLAG
611 apos = index(lchemeq(lstart:lend),
"*", back=.false.)
613 IF(apos .GT.
zero)
THEN 615 a2pos = index(lchemeq(lstart:lend),
"*", back=.true.)
616 IF(apos /= a2pos)
THEN 619 flag =
setflag(20, lstart+apos, lstart+a2pos)
621 write(*,1000) trim(lname)
622 write(*,1002)
'Too many' 623 write(*,1010) trim(lchemeq), trim(flag)
628 write(
unit_log,1010) trim(lchemeq), trim(flag)
637 READ(lchemeq(lstart:(lstart+apos-2)),*,iostat=ios) lcoeff
640 flag =
setflag(20, lstart + int(apos/2))
642 write(*,1000) trim(lname)
643 write(*,1010) trim(lchemeq), trim(flag)
647 write(
unit_log,1010) trim(lchemeq), trim(flag)
653 WRITE(lalias,
"(A)") &
654 trim(adjustl(lchemeq((lstart+apos):lend)))
665 IF(lchemeq(l:l) /= numbers(n:n)) cycle
676 IF(trim(lchemeq(lstart:npos)) ==
'')
THEN 680 READ(lchemeq(lstart:npos),*,iostat=ios) lcoeff
685 lstart+int(len_trim(lchemeq(lstart:npos))/2))
687 write(*,1000) trim(lname)
688 write(*,1010) trim(lchemeq), trim(flag)
692 write(
unit_log,1010) trim(lchemeq), trim(flag)
699 READ(lchemeq(npos+1:lend),*,iostat=ios) lalias
702 IF(len_trim(lalias) == 0 .AND.
mype ==
pe_io)
THEN 704 flag =
setflag(20, lstart + int(lend/2))
706 write(*,1003) trim(lname)
707 write(*,1010) trim(lchemeq), trim(flag)
711 write(
unit_log,1010) trim(lchemeq), trim(flag)
719 1000
FORMAT(/1x,70(
'*')/
' From: From: setReaction -->', &
720 ' splitAliasAndCoeff',/
' Message: Error determining the', &
721 ' stoichiometric coefficient in the',/
' chemical equation', &
722 ' for reaction ',a,
'.')
725 1001
FORMAT(
' Please refer to the Readme file for chemical equation', &
726 ' input formats',/
' and correct the data file.',/1x,70(
'*')/)
728 1002
FORMAT(/1x,a,
' operators were found!')
730 1003
FORMAT(/1x,70(
'*')/
' From: From: setReaction -->', &
731 ' splitAliasAndCoeff',/
' Message: Error determining the', &
732 ' speices in the chemical equation for',/
' reaction ',a,
'.'/)
734 1010
FORMAT(/
' Chemical Equation: ',a,/1x, a/)
736 1011
FORMAT(/
' Chemical Equation: ',a,/)
754 INTEGER,
INTENT(IN) :: lNg
756 CHARACTER(len=32),
DIMENSION(DIM_N_g),
INTENT(IN) :: lSAg
758 INTEGER,
INTENT(IN) :: lM
760 INTEGER,
DIMENSION(DIM_M),
INTENT(IN) :: lNs
762 CHARACTER(len=32),
DIMENSION(DIM_M, DIM_N_s),
INTENT(IN) :: lSAs
778 IF(len_trim(lsag(n)) == 0)
THEN 789 IF(len_trim(lsas(m,n)) == 0)
THEN 814 SUBROUTINE mapaliases(lName, lChemEq, lNg, lSAg, lM, lNs, lSAs, &
815 lno, lalias, lcoeff, lsgn, lstart, lba, lrxn)
824 CHARACTER(len=*),
INTENT(IN) :: lName
826 CHARACTER(len=*),
INTENT(IN) :: lChemEq
828 INTEGER,
INTENT(IN) :: lNg
830 CHARACTER(len=32),
DIMENSION(DIM_N_g),
INTENT(IN) :: lSAg
832 INTEGER,
INTENT(IN) :: lM
834 INTEGER,
DIMENSION(DIM_M),
INTENT(IN) :: lNs
836 CHARACTER(len=32),
DIMENSION(DIM_M, DIM_N_s),
INTENT(IN) :: lSAs
838 INTEGER,
INTENT(IN) :: lNo
840 CHARACTER(LEN=32),
DIMENSION(50),
INTENT(IN) :: lAlias
842 DOUBLE PRECISION,
DIMENSION(50),
INTENT(IN) :: lCoeff
844 DOUBLE PRECISION,
INTENT(IN) :: lSgn
846 INTEGER,
INTENT(IN) :: lStart
859 CHARACTER(LEN=512) FLAG
871 lrxn%Species(lstart + l)%pMap = 0
872 lrxn%Species(lstart + l)%sMap = nn
873 lrxn%Species(lstart + l)%Coeff = lsgn * lcoeff(l)
881 lrxn%Species(lstart + l)%pMap = m
882 lrxn%Species(lstart + l)%sMap = nn
883 lrxn%Species(lstart + l)%Coeff = lsgn * lcoeff(l)
891 lpos = index(lchemeq,trim(lalias(l)), back=.false.)
892 rpos = index(lchemeq,trim(lalias(l)), back=.true.)
893 flag =
setflag(20, 1 + int((lpos + rpos)/2))
895 write(*,1000) trim(lalias(l)), trim(lname)
896 write(*,1010) trim(lchemeq), trim(flag)
900 write(
unit_log,1000) trim(lalias(l)), trim(lname)
901 write(
unit_log,1010) trim(lchemeq), trim(flag)
912 1000
FORMAT(/1x,70(
'*')/
' From: From: setReaction --> mapAliases',/ &
913 ' Message: Unable to match species ',a,
' in the chemical', &
914 ' equation for ',/
' reaction ',a,
'.')
916 1001
FORMAT(/
' Please refer to the Readme file for chemical equation',&
917 ' input formats',/
' and correct the data file.',/1x,70(
'*')/)
919 1010
FORMAT(/
' Chemical Equation: ',a,/1x, a/)
921 1011
FORMAT(/
' Chemical Equation: ',a,/)
941 CHARACTER(LEN=32),
INTENT(IN) :: lSA, ceSA
945 CHARACTER(LEN=32) tlSA
953 IF(trim(tlsa) == trim(cesa))
checkmatch = .true.
975 INTEGER,
INTENT(INOUT) :: lnP
977 LOGICAL,
INTENT(INOUT) :: lpMap
978 INTEGER,
INTENT(INOUT) :: llNoP
1011 INTEGER,
OPTIONAL,
INTENT(IN) :: FUNIT
1018 IF(.NOT.
PRESENT(funit))
THEN 1030 IF(.NOT.
PRESENT(funit))
THEN 1044 IF(.NOT.
PRESENT(funit))
THEN 1047 write(funit,1002)m, n
1055 1000
FORMAT(
' Species aliases were not provided for the following:')
1056 1001
FORMAT(3x,
' Gas phase species ',i2)
1057 1002
FORMAT(3x,
' Solid phase ',i2,
' specie ',i2)
1072 CHARACTER(len=512) FUNCTION setflag(fill, flg1, flg2) RESULT(OUT)
1080 INTEGER,
INTENT(IN) :: fill
1082 INTEGER,
INTENT(IN) :: flg1
1084 INTEGER,
INTENT(IN),
OPTIONAL :: flg2
1088 INTEGER L, FILL1, FILL2
1093 WRITE(out,
"(A,A)") trim(out),
'-' 1097 IF(
PRESENT(flg2))
THEN 1098 IF(flg1 < flg2)
THEN 1100 fill2 = (flg2-flg1) - 1
1103 fill2 = (flg1-flg2) - 1
1112 WRITE(out,
"(A,A)") trim(out),
'-' 1114 WRITE(out,
"(A,A)") trim(out),
'^' 1118 WRITE(out,
"(A,A)") trim(out),
'-' 1120 WRITE(out,
"(A,A)") trim(out),
'^' subroutine writeba(FUNIT)
integer, parameter dim_n_g
subroutine setreaction(RxN, lNg, lSAg, lM, lNs, lSAs, lDH, lfDH)
subroutine splitaliasandcoeff(lName, lChemEq, lStart, lEnd, lAlias, lCoeff)
character(len=32), dimension(:), allocatable rxn_name
logical function compare(V1, V2)
double precision, parameter one
subroutine splitentries(lName, lChemEq, lStart, lEnd, lNo, lAlias, lCoeff)
character(len=3), parameter end_blk
logical function checkmatch(lSA, ceSA)
double precision, dimension(:,:), allocatable des_usrfdh
character(len=8), parameter des_rxn_blk
subroutine updatemap(lnP, lpMap, llNoP)
double precision, parameter undefined
character(len=4), parameter rxn_blk
subroutine checksplit(lName, lChemEq, lrEnd, lpStart, lSkip)
character(len=512) function setflag(fill, flg1, flg2)
character(len=32), dimension(:), allocatable des_rxn_name
subroutine mapaliases(lName, lChemEq, lNg, lSAg, lM, lNs, lSAs, lNo, lAlias, lCoeff, lSgn, lStart, lBA, lRxN)
subroutine mfix_exit(myID, normal_termination)
subroutine checkblankaliases(lNg, lSAg, lM, lNs, lSAs, lBA)
double precision, dimension(:), allocatable usrdh
double precision, dimension(:), allocatable des_usrdh
integer, parameter unit_log
character(len=512), dimension(:), allocatable des_rxn_chem_eq
character(len=1), parameter end_str
double precision, dimension(:,:), allocatable usrfdh
character(len=512), dimension(:), allocatable rxn_chem_eq
integer, parameter undefined_i
integer, parameter dim_n_s
character(len=2), parameter start_str
subroutine make_upper_case(LINE_STRING, MAXCOL)
double precision, parameter zero