public Flow RateFunction(ReactionValue reaction) { Flow monomial = NumberFlow.numberFlowOne; if (reaction.rate is MassActionNumericalRate) { double rate = ((MassActionNumericalRate)reaction.rate).Rate(this.temperature); foreach (SpeciesValue sp in sample.stateMap.species) { int spStoichio = reaction.Stoichiometry(sp.symbol, reaction.reactants); monomial = OpFlow.Op("*", monomial, OpFlow.Op("^", new SpeciesFlow(sp.symbol), new NumberFlow(spStoichio))); } monomial = OpFlow.Op("*", new NumberFlow(rate), monomial); } else if (reaction.rate is MassActionFlowRate) { Flow rate = (reaction.rate as MassActionFlowRate).rateFunction; foreach (SpeciesValue sp in sample.stateMap.species) { int spStoichio = reaction.Stoichiometry(sp.symbol, reaction.reactants); monomial = OpFlow.Op("*", monomial, OpFlow.Op("^", new SpeciesFlow(sp.symbol), new NumberFlow(spStoichio))); } monomial = OpFlow.Op("*", rate, monomial); } else if (reaction.rate is GeneralFlowRate) { monomial = (reaction.rate as GeneralFlowRate).rateFunction; } else { throw new Error("RateFunction"); } return(monomial); }