// ## operation writeChemkinReactions(ReactionModel) // 10/26/07 gmagoon: changed to take temperature as parameter (it doesn't seem like this method is // currently used anywhere) public static String writeChemkinReactions( ReactionModel p_reactionModel, Temperature p_temperature) { // #[ operation writeChemkinReactions(ReactionModel) StringBuilder result = new StringBuilder(); result.append("REACTIONS KCAL/MOLE\n"); CoreEdgeReactionModel cerm = (CoreEdgeReactionModel) p_reactionModel; LinkedHashSet all = cerm.getReactedReactionSet(); HashSet hs = new HashSet(); int numfor = 0; int numrev = 0; int numdup = 0; int numnorev = 0; for (Iterator iter = all.iterator(); iter.hasNext(); ) { Reaction rxn = (Reaction) iter.next(); if (rxn.isForward()) { result.append( " " + rxn.toChemkinString(p_temperature) + "\n"); // 10/26/07 gmagoon: changed to avoid use of Global.temperature // result.append(" " + rxn.toChemkinString(Global.temperature) + "\n"); } } result.append("END\n"); return result.toString(); // #] }
private static Kinetics[] getReactionKinetics(Reaction r) { Kinetics[] allKinetics; if (r.isForward()) { allKinetics = r.getKinetics(); } else if (r.isBackward()) { allKinetics = r.getFittedReverseKinetics(); } else { allKinetics = r.getKinetics(); } return allKinetics; }
// ## operation writeChemkinReactions(ReactionModel) public static String writeChemkinPdepReactions( ReactionModel p_reactionModel, SystemSnapshot p_beginStatus) { // #[ operation writeChemkinReactions(ReactionModel) StringBuilder result = new StringBuilder(); // result.append("REACTIONS KCAL/MOLE\n"); String reactionHeader = ""; String units4Ea = ArrheniusKinetics.getEaUnits(); if (units4Ea.equals("cal/mol")) reactionHeader = "CAL/MOL\t"; else if (units4Ea.equals("kcal/mol")) reactionHeader = "KCAL/MOL\t"; else if (units4Ea.equals("J/mol")) reactionHeader = "JOULES/MOL\t"; else if (units4Ea.equals("kJ/mol")) reactionHeader = "KJOULES/MOL\t"; else if (units4Ea.equals("Kelvins")) reactionHeader = "KELVINS\t"; String units4A = ArrheniusKinetics.getAUnits(); if (units4A.equals("moles")) reactionHeader += "MOLES\n"; else if (units4A.equals("molecules")) reactionHeader += "MOLECULES\n"; result.append("REACTIONS\t" + reactionHeader); LinkedList pDepList = new LinkedList(); LinkedList nonPDepList = new LinkedList(); LinkedList duplicates = new LinkedList(); CoreEdgeReactionModel cerm = (CoreEdgeReactionModel) p_reactionModel; // first get troe and thirdbodyreactions for (Iterator iter = cerm.getReactionSet().iterator(); iter.hasNext(); ) { Reaction r = (Reaction) iter.next(); /* * 1Jul2009-MRH: * Added extra set of parenthesis. Before, if the rxn was reverse but an instance of * TROEReaction, it would also be added to the pDepList, resulting in RMG reporting * both rxns (forward and reverse) in the chem.inp file, w/o a DUP tag. Furthermore, * both rxns were given the same set of Arrhenius parameters. Running this in * Chemkin-v4.1.1 resulted in an error. */ if (r.isForward() && (r instanceof ThirdBodyReaction || r instanceof TROEReaction || r instanceof LindemannReaction)) { pDepList.add(r); } } for (Iterator iter = PDepNetwork.getNetworks().iterator(); iter.hasNext(); ) { PDepNetwork pdn = (PDepNetwork) iter.next(); for (ListIterator pdniter = pdn.getNetReactions().listIterator(); pdniter.hasNext(); ) { PDepReaction rxn = (PDepReaction) pdniter.next(); if (cerm.categorizeReaction(rxn) != 1) continue; // check if this reaction is not already in the list and also check if this reaction has a // reverse reaction // which is already present in the list. if (rxn.getReverseReaction() == null) rxn.generateReverseReaction(); if (!rxn.reactantEqualsProduct() && !pDepList.contains(rxn) && !pDepList.contains(rxn.getReverseReaction())) { pDepList.add(rxn); } } } LinkedList removeReactions = new LinkedList(); for (Iterator iter = p_reactionModel.getReactionSet().iterator(); iter.hasNext(); ) { Reaction r = (Reaction) iter.next(); boolean presentInPDep = false; if (r.isForward() && !(r instanceof ThirdBodyReaction) && !(r instanceof TROEReaction) && !(r instanceof LindemannReaction)) { Iterator r_iter = pDepList.iterator(); while (r_iter.hasNext()) { Reaction pDepr = (Reaction) r_iter.next(); if (pDepr.equals(r)) { // removeReactions.add(pDepr); // duplicates.add(pDepr); // if (!r.hasAdditionalKinetics()){ // duplicates.add(r); // presentInPDep = true; // } presentInPDep = true; nonPDepList.add(r); } } if (!presentInPDep) nonPDepList.add(r); } } for (Iterator iter = removeReactions.iterator(); iter.hasNext(); ) { Reaction r = (Reaction) iter.next(); pDepList.remove(r); } for (Iterator iter = pDepList.iterator(); iter.hasNext(); ) { Reaction r = (Reaction) iter.next(); // 6Jul2009-MRH: // Pass both system temperature and pressure to function toChemkinString. // The only PDepKineticsModel that uses the passed pressure is RATE result.append( r.toChemkinString(p_beginStatus.getTemperature(), p_beginStatus.getPressure()) + "\n"); // 10/26/07 gmagoon: eliminating use of Global.temperature; **** I use // beginStatus here, which may or may not be appropriate // result.append(r.toChemkinString(Global.temperature)+"\n"); } for (Iterator iter = nonPDepList.iterator(); iter.hasNext(); ) { Reaction r = (Reaction) iter.next(); result.append( r.toChemkinString(p_beginStatus.getTemperature(), p_beginStatus.getPressure()) + "\n"); // result.append(r.toChemkinString(Global.temperature)+"\n"); } for (Iterator iter = duplicates.iterator(); iter.hasNext(); ) { Reaction r = (Reaction) iter.next(); result.append( r.toChemkinString(p_beginStatus.getTemperature(), p_beginStatus.getPressure()) + "\n\tDUP\n"); // result.append(r.toChemkinString(Global.temperature)+"\n\tDUP\n"); } result.append("END\n"); return result.toString(); // #] }
public static String writeOutputString(Reaction r, TemplateReactionGenerator rtLibrary) { String listOfReactions = ""; Temperature stdtemp = new Temperature(298, "K"); double Hrxn = r.calculateHrxn(stdtemp); // If r Reaction is from Reaction Library add it to list of reaction append its kinetics and // return String source = r.getKineticsSource(0); if (source == null) { // If source is null I am assuming that its not a Reaction from Reaction Library or Seed // Mechanism source = "TemplateReaction:"; } StringTokenizer st = new StringTokenizer(source, ":"); String reaction_type = st.nextToken(); // Reactions from Reaction Libraries: if (reaction_type.equals("ReactionLibrary")) { // We will get the forward reaction if (r.isBackward()) { r = r.getReverseReaction(); Hrxn = -Hrxn; // Reversing the heat of reaction } Kinetics[] allKinetics = getReactionKinetics(r); for (int numKinetics = 0; numKinetics < allKinetics.length; ++numKinetics) { listOfReactions += r.toString() + "\t" + getFormattedKinetics(allKinetics[numKinetics], Hrxn); if (allKinetics.length != 1) listOfReactions += "\tDUP\n"; } return listOfReactions; } // Reactions NOT from Reaction Libraries are from Templates: if (r.isForward()) { Kinetics[] allKinetics = r.getKinetics(); for (int numKinetics = 0; numKinetics < allKinetics.length; ++numKinetics) { listOfReactions += r.toString() + "\t" + getFormattedKinetics(allKinetics[numKinetics], Hrxn); if (allKinetics.length != 1) listOfReactions += "\tDUP\n"; } } else if (r.isBackward()) { LinkedHashSet reverseReactions = new LinkedHashSet(); Iterator iter2 = r.getStructure().getProducts(); Species species1 = (Species) iter2.next(); Species species2 = species1; while (iter2.hasNext()) species2 = (Species) iter2.next(); String rxnFamilyName = ""; if (r instanceof TemplateReaction) { rxnFamilyName = ((TemplateReaction) r.getReverseReaction()).getReactionTemplate().getName(); } LinkedHashSet speciesHashSet = new LinkedHashSet(); speciesHashSet.add(species1); reverseReactions = rtLibrary.react(speciesHashSet, species2, rxnFamilyName); for (Iterator iter3 = reverseReactions.iterator(); iter3.hasNext(); ) { Reaction currentRxn = (Reaction) iter3.next(); if (currentRxn.getStructure() == r.getReverseReaction().getStructure()) { Kinetics[] allKinetics = currentRxn.getKinetics(); for (int numKinetics = 0; numKinetics < allKinetics.length; ++numKinetics) { listOfReactions += currentRxn.toString() + "\t" + getFormattedKinetics(allKinetics[numKinetics], -Hrxn); if (allKinetics.length != 1) listOfReactions += "\tDUP\n"; } } } } else { Kinetics[] allKinetics = r.getKinetics(); for (int numKinetics = 0; numKinetics < allKinetics.length; ++numKinetics) { listOfReactions += r.toString() + "\t" + getFormattedKinetics(allKinetics[numKinetics], Hrxn); if (allKinetics.length != 1) listOfReactions += "\tDUP\n"; } } return listOfReactions; }