' ' Copyright 2000-2005 James C. Ianni. All Rights Reserved. ' DECLARE FUNCTION ZC$ (A$) 'DECLARE SUB ZEROCUT (A$) DECLARE SUB CP (A$) DECLARE SUB WIPESPACES (A$) DECLARE SUB WIPESLASH (A$) DEFINT A-Z DECLARE SUB pause (DUM) DECLARE SUB readline (A$) DECLARE SUB BRAKE (ln$) DECLARE SUB CLEANSPACES (A$) DECLARE SUB SMASHSPACES (A$) DIM WORDS$(50), KEYS$(30) COMMON SHARED WORDS$(), dl$, w COMMON SHARED unix COLOR 0, 2: CLS PRINT COUT = 0 ' if cout=1 then, include CHEMKIN statements as comments in Kintecus unix = 0' 1 if file in unix format or 0 in dos-text format CLS PRINT CALL CP("Chemkin II/III to Kintecus V2.X Converter V1.1") PRINT PRINT "This program assumes a valid Chemkin II/III model. " PRINT "It does not do any Chemkin syntax checking!" PRINT "Converted model file will be called MODEL.DAT." PRINT dl$ = CHR$(9) od$ = CHR$(9) NK = 4: FOR L = 0 TO NK: READ KEYS$(L): NEXT L DATA LOW,TROE,SRI,LT,REV ' CALL pause(0) BACK: ON ERROR GOTO RECOVER fl$ = "" PRINT PRINT " Please enter name of Chemkin-II/III file " PRINT " (type dir or dir w/ wildcard [ie dir CHEM*] to diplay current" PRINT " directory listings or enter cd [pathname] to change current" PRINT " directory.)" LINE INPUT " >"; fl$ PRINT IF fl$ = "" THEN END CALL SMASHSPACES(fl$) 'PRINT "fl$="; fl$ IF LEFT$(UCASE$(fl$), 3) = "DIR" THEN L = INSTR(fl$, " "): B$ = "": IF L > 1 THEN B$ = MID$(fl$, L + 1) IF B$ = "" THEN FILES ELSE L = INSTR(fl$, "."): IF L = 0 THEN B$ = B$ + ".*" FILES B$ END IF GOTO BACK END IF IF LEFT$(UCASE$(fl$), 2) = "CD" THEN L = INSTR(fl$, " "): B$ = "": IF L > 1 THEN B$ = MID$(fl$, L + 1) IF B$ = "" THEN PRINT : PRINT "**ERROR: PLEASE ENTER PATHNAME AFTER CD!!!": PRINT GOTO BACK ELSE PRINT : PRINT "Switching to directory path:"; B$: PRINT CHDIR B$ END IF GOTO BACK END IF B$ = "" PRINT " Include Chemkin statements as comments" LINE INPUT " inside new model ? (y/n) "; A$ IF LEFT$(UCASE$(A$), 1) = "Y" THEN COUT = 1 PRINT OPEN fl$ FOR INPUT AS #1 out$ = "MODEL.DAT" OPEN out$ FOR OUTPUT AS #2 again: WORDS$(0) = " " WHILE (NOT EOF(1)) AND A$ <> "REACTIONS" AND A$ <> "REAC" CALL readline(A$) CALL CLEANSPACES(A$) A$ = UCASE$(A$) A$ = LEFT$(A$, 4) WEND GOON = 0 WHILE NOT EOF(1) AND GOON = 0 top: CALL readline(A$): PRINT " '"; A$; "'" IF COUT = 1 THEN PRINT #2, "# '"; A$; "'" top3: DOREV = 0: R$ = "": LOW$ = "": TROE$ = "": SRI$ = "": LT$ = "": ENH$ = "" dl$ = "!" CALL CLEANSPACES(A$): 'PRINT ASC(MID$(A$, 1, 1)); " "; ASC(MID$(A$, 2, 1)): PRINT "AT TOP CLEANSPACES A$="; A$ CALL SMASHSPACES(A$) CALL BRAKE(A$) ' PRINT "W,BRAKE()="; W: FOR L = 0 TO W: PRINT WORDS$(L); : NEXT IF LEFT$(A$, 1) = "!" THEN MID$(A$, 1, 1) = "#" PRINT #2, A$: GOTO BOTTOM ELSE IF w = 1 THEN COM$ = WORDS$(1): 'PRINT "COM$="; COM$ END IF IF LEFT$(UCASE$(A$), 9) = "DUPLICATE" OR LEFT$(UCASE$(A$), 3) = "DUP" THEN GOTO BOTTOM LINE$ = WORDS$(0): ' PRINT "--WORDS$(0)="; WORDS$(0) CALL CLEANSPACES(LINE$): ' PRINT "After cleanspaces="; LINE$ IF UCASE$(LINE$) = "END" THEN PRINT #2, "END": GOON = 1: GOTO BOTTOM dl$ = " " CALL BRAKE(LINE$): ' PRINT "After brake w="; W LINE$ = "": ' PRINT "WORDS$(W-2);WORDS$(W-1);WORDS$(W)="; WORDS$(W - 2); " "; WORDS$(W - 1); " "; WORDS$(W) LINE$ = ZC$(WORDS$(w - 2)) + od$ + ZC$(WORDS$(w - 1)) + od$ + ZC$(WORDS$(w)) + od$ FOR L = 0 TO w - 3: LINE$ = LINE$ + WORDS$(L): NEXT L t = INSTR(LINE$, "<=>") IF t > 0 THEN LINE$ = LEFT$(LINE$, t - 1) + "=" + MID$(LINE$, t + 3) END IF t = INSTR(LINE$, "=>") IF t > 0 THEN LINE$ = LEFT$(LINE$, t - 1) + "==>" + MID$(LINE$, t + 2) END IF GOON2 = 0 WHILE NOT EOF(1) AND GOON2 = 0 CALL readline(A$): ' PRINT "2nd loop >>>> '"; A$; "'" dl$ = "!" CALL SMASHSPACES(A$): CALL CLEANSPACES(A$) IF LEFT$(A$, 1) = "!" THEN MID$(A$, 1, 1) = "#" PRINT #2, A$: GOTO BOTTOM2 END IF CALL BRAKE(A$) IF w = 1 THEN A$ = WORDS$(0): COM2$ = WORDS$(1): ' ged rid of comments t = INSTR(A$, "/"): t2 = INSTR(t + 1, A$, "/") '*** ' check if we have special keywords and modify line$ on the way!! '*** IF t > 0 AND t2 > 0 THEN PRINT ">>> '"; A$; "'": IF COUT = 1 THEN PRINT #2, "#"; CHR$(9); " '"; A$; "'" CALL WIPESLASH(A$) CALL CLEANSPACES(A$) CALL SMASHSPACES(A$) dl$ = " " CALL BRAKE(A$) ' now match to see if LOW or SRI there ?? find the special keys... P$ = WORDS$(0) TK = -1 FOR L = 0 TO NK IF UCASE$(P$) = KEYS$(L) THEN TK = L NEXT L IF TK = -1 THEN ' THIS MUST BE AN THIRD BODY + enhancment R$ = "": FOR L = 0 TO w: R$ = R$ + " " + WORDS$(L): NEXT L 'PRINT "R$="; R$; "<" CALL WIPESLASH(R$) CALL SMASHSPACES(R$): CALL CLEANSPACES(R$) CALL BRAKE(R$) WW! = w + 1 IF WW! / 2 <> INT(WW! / 2) THEN PRINT "PROBLEM WITH 3BODY UNEVEN, LINE="; R$: STOP FOR L = 0 TO w STEP 2: P2$ = WORDS$(L + 1): 'PRINT "P2$='"; P2$; "'" WORDS$(L + 1) = ZC$(P2$) ENH$ = ENH$ + WORDS$(L) + "(" + WORDS$(L + 1) + ");": NEXT L 'PRINT "BEFORE LEFT$ ENH$="; ENH$ ENH$ = LEFT$(ENH$, LEN(ENH$) - 1)': PRINT "FINI ENH$="; ENH$ ELSE ' *** We have a special reaction key here OP$ = "" R$ = "": FOR L = 1 TO w: R$ = R$ + " " + WORDS$(L): NEXT L CALL WIPESLASH(R$) CALL SMASHSPACES(R$): CALL CLEANSPACES(R$) CALL BRAKE(R$) IF TK = 4 THEN ' DO REV DOREV = 1 IF w <> 2 THEN PRINT "PROBLEM WITH REV// FORMAT, LINE="; R$: STOP FOR L = 0 TO 2: HREV$(L) = WORDS$(L): NEXT L END IF IF TK = 0 THEN '*** DO LOW *** LOW$ = "": ' PRINT "DO LOW W="; W IF w <> 2 THEN PRINT "PROBLEM WITH LOW// FORMAT, LINE="; R$: STOP FOR L = 0 TO 1: LOW$ = LOW$ + ZC$(WORDS$(L)) + ";": NEXT L LOW$ = LOW$ + ZC$(WORDS$(2)): ' PRINT "FINAL LOW$="; LOW$ END IF IF TK = 1 THEN '*** DO TROE *** TROE$ = "" IF w < 2 THEN PRINT "PROBLEM WITH TROE// FORMAT, LINE="; R$: STOP FOR L = 0 TO w - 1: TROE$ = TROE$ + ZC$(WORDS$(L)) + ";": NEXT L TROE$ = TROE$ + ZC$(WORDS$(w)) END IF IF TK = 2 THEN '*** DO SRI *** SRI$ = "" IF w < 2 THEN PRINT "PROBLEM WITH SRI// FORMAT, LINE="; R$: STOP FOR L = 0 TO w - 1: SRI$ = SRI$ + ZC$(WORDS$(L)) + ";": NEXT L SRI$ = SRI$ + ZC$(WORDS$(w)) END IF IF TK = 3 THEN ' *** DO LT *** PRINT PRINT "LINDUA-TELLER REACTIONS NOT DONE IN THIS VERSION" PRINT "IF YOU NEED THEM TO BE CONVERTED, CONTACT AUTHOR..." STOP END IF END IF ELSE ' okay, nothing else left, print and process current read line GOON2 = 1: SET = 0 IF LOW$ <> "" THEN SET = 1 IF TROE$ <> "" THEN R$ = "+M[TROE;" + LOW$ + ";" + TROE$ ELSE IF SRI$ <> "" THEN R$ = "+M[SRI;" + LOW$ + ";" + SRI$ ELSE R$ = "+M[LIN;" + LOW$ END IF END IF END IF 'PRINT "BEFORE R$="; R$: PRINT "LINE$="; LINE$ IF ENH$ <> "" THEN IF SET = 0 THEN R$ = "+M[" + ENH$ + "]" ELSE R$ = R$ + ";" + ENH$ + "]" END IF ELSE L = INSTR(LINE$, "(+")' make sure no special (+N2) in reaction IF L > 1 THEN L$ = MID$(LINE$, L, 4) IF L$ = "(+m)" OR L$ = "(+M)" THEN L = 0 END IF IF L = 0 THEN R$ = R$ + "]": 'PRINT "LINE$="; LINE$ 'PRINT "==>R$="; R$ END IF END IF CALL WIPESPACES(LINE$): ' PRINT "AFTER WIPESPACES="; LINE$ L = INSTR(LINE$, "(+M)"): IF L = 0 THEN L = INSTR(LINE$, "(+m)") IF L > 1 THEN LINE$ = LEFT$(LINE$, L - 1) + R$ + MID$(LINE$, L + 4) ' get rid of (+M) on products side? L = INSTR(LINE$, "(+M)") LINE$ = LINE$ + " " IF L > 1 THEN LINE$ = LEFT$(LINE$, L - 1) + MID$(LINE$, L + 4) END IF 'NOW GET RID OF ANY (+M) ON RIGHT HAND SIDE L = INSTR(LINE$, "==>"): IF L = 0 THEN L = INSTR(LINE$, "=") M = INSTR(L + 1, LINE$, "(+m)"): IF M = 0 THEN M = INSTR(L + 1, LINE$, "(+M)") IF M > 1 THEN LINE$ = LINE$ + " " LINE$ = LEFT$(LINE$, M - 1) + MID$(LINE$, M + 4) END IF ELSE L = INSTR(LINE$, "(+") IF L > 1 THEN M = INSTR(L + 1, LINE$, ")") ENH$ = MID$(LINE$, L + 2, M - (L + 2))' extract enhaned species 'PRINT "(+N2) EXTRACT="; ENH$ IF SET = 0 THEN R$ = "+M[-" + ENH$ + "(1)]" ELSE R$ = R$ + ";-" + ENH$ + "(1)]" END IF ' get rid of the O2(+H2O)= in LINE LINE$ = LEFT$(LINE$, L - 1) + R$ + MID$(LINE$, M + 1) ' GET RID OF ANY (+N2) ON RIGHT HAND SIDE L = INSTR(LINE$, "==>"): IF L = 0 THEN L = INSTR(LINE$, "=") M = INSTR(L + 1, LINE$, "(+") IF M > 1 THEN N = INSTR(M + 2, LINE$, ")") LINE$ = LINE$ + " " LINE$ = LEFT$(LINE$, M - 1) + MID$(LINE$, N + 1) 'PRINT "SP ENH LINE$="; LINE$ END IF ELSE L = INSTR(LINE$, "+m="): SET2 = 0: IF L = 0 THEN SET2 = 1: L = INSTR(LINE$, "+M=") IF L > 1 THEN IF SET2 = 0 THEN MID$(LINE$, L + 1, 1) = "M" IF ENH$ <> "" THEN ' OK, add the enhanced species after the M[ LINE$ = LEFT$(LINE$, L - 1) + "+M[" + ENH$ + "]" + MID$(LINE$, L + 2) ' ELSE ' LINE$ = LEFT$(LINE$, L - 1) + "+M[" + ENH$ + "]" + MID$(LINE$, L + 2) END IF ' GET RID OF ANY +M ON RIGHT HAND SIDE IF ENH$ <> "" OR LOW$ <> "" OR TROE$ <> "" OR SRI$ <> "" THEN L = INSTR(LINE$, "==>"): IF L = 0 THEN L = INSTR(LINE$, "=") LINE$ = LINE$ + " " M = INSTR(L + 1, LINE$, "+m ") IF M > 1 THEN LINE$ = LEFT$(LINE$, M - 1) + MID$(LINE$, M + 2) END IF ELSE L = INSTR(LINE$, "==>"): IF L = 0 THEN L = INSTR(LINE$, "=") LINE$ = LINE$ + " " M = INSTR(L + 1, LINE$, "+m "): IF M > 1 THEN LINE$ = LINE$ + " " MID$(LINE$, M + 1, 1) = "M" END IF END IF END IF END IF END IF ' Put tests in here for SPECIAL reactions like LT... **** ' ' ' IF DOREV = 1 THEN L = INSTR(LINE$, "=") LINE$ = LEFT$(LINE$, L) + "=>" + MID$(LINE$, L + 1) END IF IF COM$ <> "" THEN PRINT #2, LINE$ + od$ + COM$: COM$ = "" ELSE PRINT #2, LINE$ END IF IF DOREV = 1 THEN dl$ = CHR$(9) CALL BRAKE(LINE$) LINE$ = ZC$(HREV$(0)) + od$ + ZC$(HREV$(1)) + od$ + ZC$(HREV$(2)) + od$ L = INSTR(WORDS$(3), "==>"): IF L = 0 THEN PRINT "PROBLEM WITH REV 434": STOP LINE$ = LINE$ + MID$(WORDS$(3), L + 3) + "==>" + LEFT$(WORDS$(3), L - 1) ' Now remove any special +M[ or +S[ and place on other side IF LOW$ <> "" OR TROE$ <> "" OR SRI$ <> "" OR ENH$ <> "" THEN L = INSTR(LINE$, R$): IF L = 0 THEN PRINT "PROBLEM WITH FINDING R$ IN LINE:"; LINE$; "R$="; R$: STOP LINE$ = LEFT$(LINE$, L - 1) + MID$(LINE$, L + LEN(R$)) L = INSTR(LINE$, "==>"): IF L = 0 THEN PRINT "PROBELM WITH REV 434": STOP LINE$ = LEFT$(LINE$, L - 1) + R$ + MID$(LINE$, L) END IF IF COM$ <> "" THEN PRINT #2, LINE$ + od$ + COM$: COM$ = "" ELSE PRINT #2, LINE$ END IF DOREV = 0 END IF A$ = A$ + " !" + COM2$ END IF BOTTOM2: WEND IF GOON2 = 1 THEN PRINT " '"; A$; "'": IF COUT = 1 THEN PRINT #2, "# '"; A$; "'" GOTO top3 ELSE PRINT "EOF REACHED..PROCESS LINE AND QUIT" END IF BOTTOM: WEND CLOSE #1 CLOSE #2 BEEP: BEEP PRINT : PRINT "FINISHED CONVERSION" END RECOVER: PRINT : PRINT "*** ERROR HAPPENED OF TYPE:"; ERR; " ***" IF ERR = 76 THEN PRINT "PATH SPECIFIED NOT FOUND": PRINT IF ERR = 53 THEN PRINT " NO FILES OF THAT TYPE FOUND IN CURRENT PATH ": PRINT RESUME BACK ' ' END OF PROGRAM.... BLEEP ' SUB BRAKE (ln$) SHARED WORDS$(), dl$, w% w = 0 L = 1: A$ = MID$(ln$, 1, 1): P$ = "" WHILE L <= LEN(ln$) WHILE A$ <> dl$ AND L <= LEN(ln$) P$ = P$ + A$: L = L + 1: IF L <= LEN(ln$) THEN A$ = MID$(ln$, L, 1) WEND L = L + 1: IF L <= LEN(ln$) THEN A$ = MID$(ln$, L, 1) WORDS$(w) = P$: P$ = "": w = w + 1 WEND w = w - 1 ' ' Now get rid of spaces before and after ' FOR z = 0 TO w ct = 1 P$ = MID$(WORDS$(z), ct, 1) WHILE P$ = " " ct = ct + 1 P$ = MID$(WORDS$(z), ct, 1) WEND skip1: WORDS$(z) = RIGHT$(WORDS$(z), LEN(WORDS$(z)) - ct + 1) 'PRINT "1.words$(z)= '"; words$(z); "'" ' 'get rid of spaces to the left... ' ct = LEN(WORDS$(z)) IF ct > 0 THEN P$ = MID$(WORDS$(z), ct, 1) ELSE GOTO SKIP2 'PRINT "p$='"; p$; "'" WHILE P$ = " " ct = ct - 1 P$ = MID$(WORDS$(z), ct, 1) 'PRINT "p$='"; p$; "'" WEND SKIP2: IF ct > 0 THEN WORDS$(z) = LEFT$(WORDS$(z), ct) 'PRINT "4.words$(z)='"; WORDS$(z); "'" NEXT z END SUB SUB CLEANSPACES (A$) ' 'convert tab to space ' FOR L = 1 TO LEN(A$) P$ = MID$(A$, L, 1) IF ASC(P$) = 9 THEN MID$(A$, L, 1) = " " NEXT L ' ' Now get rid of spaces before and after ' ct = 1 P$ = MID$(A$, ct, 1) WHILE P$ = " " ct = ct + 1 P$ = MID$(A$, ct, 1) WEND A$ = RIGHT$(A$, LEN(A$) - ct + 1) 'PRINT "1.INSIDE CLEANSPACES a$= '"; A$; "'" ' 'get rid of spaces to the left... ' ct = LEN(A$) IF ct <> 0 THEN P$ = MID$(A$, ct, 1) WHILE P$ = " " ct = ct - 1 P$ = MID$(A$, ct, 1) WEND A$ = LEFT$(A$, ct) ' PRINT "2. AFTER LEFT$ A$="; A$ END IF END SUB SUB CP (A$) L = 40 - (LEN(A$) / 2 + .5) PRINT TAB(L); A$ END SUB SUB pause (DUM) A$ = "" WHILE A$ = "": A$ = INKEY$: WEND END SUB SUB readline (ln$) SHARED unix A$ = INPUT$(1, 1) ln$ = "" IF unix = 1 THEN tend = 10 ELSE tend = 13 WHILE A$ <> CHR$(tend) ln$ = ln$ + A$ A$ = INPUT$(1, 1) WEND IF unix = 0 THEN A$ = INPUT$(1, 1) 'PRINT "'"; ln$; "'" END SUB SUB SMASHSPACES (A$) ' 'convert tab to space ' FOR L = 1 TO LEN(A$) P$ = MID$(A$, L, 1) IF ASC(P$) = 9 THEN MID$(A$, L, 1) = " " NEXT L L = 1 WHILE L < LEN(A$) IF MID$(A$, L, 1) = " " THEN ct = L + 1 fs% = L WHILE (MID$(A$, ct, 1) = " ") ct = ct + 1 WEND A$ = LEFT$(A$, fs%) + RIGHT$(A$, LEN(A$) - ct + 1) END IF L = L + 1 WEND END SUB SUB WIPESLASH (A$) L = 1 FOR L = 1 TO LEN(A$) IF MID$(A$, L, 1) = "/" THEN MID$(A$, L, 1) = " " END IF NEXT L END SUB SUB WIPESPACES (A$) ' 'convert tab to space ' 'FOR L = 1 TO LEN(A$) ' P$ = MID$(A$, L, 1) ' IF ASC(P$) = 9 THEN MID$(A$, L, 1) = " " 'NEXT L L = 1 WHILE L < LEN(A$) IF MID$(A$, L, 1) = " " THEN ct = L fs% = L WHILE (MID$(A$, ct, 1) = " ") ct = ct + 1 WEND A$ = LEFT$(A$, fs%) + RIGHT$(A$, LEN(A$) - ct + 1) END IF L = L + 1 WEND END SUB FUNCTION ZC$ (A$) H# = VAL(A$) IF H# = 0 THEN A$ = "0" IF ABS(H#) < 10000 THEN IF H# = INT(H#) THEN IF H# < 0 THEN A$ = STR$(VAL(A$)) ELSE A$ = MID$(STR$(VAL(A$)), 2) END IF END IF END IF ' X = INSTR(A$, ".") ' IF X > 0 THEN ' IF (VAL(MID$(A$, X)) = 0) AND (RIGHT$(A$, 1) = "0") THEN A$ = LEFT$(A$, X - 1) ' END IF ' X = INSTR(A$, ".") ' IF X > 0 THEN ' IF RIGHT$(A$, 3) = "000" THEN ' A$ = LEFT$(A$, LEN(A$) - 3) ' END IF ' IF RIGHT$(A$, 2) = "00" THEN ' A$ = LEFT$(A$, LEN(A$) - 2) ' END IF ' IF RIGHT$(A$, 1) = "0" THEN ' A$ = LEFT$(A$, LEN(A$) - 1) ' END IF ' END IF ' IF RIGHT$(A$, LEN(A$)) = "." THEN A$ = LEFT$(A$, LEN(A$) - 1) ' ' B$ = UCASE$(RIGHT$(A$, 2)) ' IF B$ = "E+" OR B$ = "D+" OR B$ = "G+" THEN ' A$ = LEFT$(A$, LEN(A$) - 2) ' END IF IF A$ = "" OR A$ = " " OR A$ = "." THEN A$ = "0" ZC$ = A$ END FUNCTION