Beispiel #1
0
 public static Lst <ReactionValue> ToReactions(Lst <Polynomize.PolyODE> odes, Style style)
 {
     if (odes is Cons <Polynomize.PolyODE> cons)
     {
         Lst <ReactionValue> reactions = ToReactions(cons.head.var, cons.head.poly.monomials, ToReactions(cons.tail, style), style);
         if (cons.head.split == Polynomize.Split.Pos)
         {
             SpeciesFlow   pos     = cons.head.var;
             SpeciesFlow   neg     = (cons.tail is Cons <Polynomize.PolyODE> tailCons && tailCons.head.split == Polynomize.Split.Neg) ? tailCons.head.var : throw new Error("ToReactions annihilation");
             ReactionValue annihil = new ReactionValue(new List <Symbol> {
                 pos.species, neg.species
             }, new List <Symbol> {
             }, new MassActionNumericalRate(1.0));
             //ReactionValue annihil = new ReactionValue(new List<Symbol> { pos.species, pos.species, neg.species, neg.species }, new List<Symbol> { }, new MassActionNumericalRate(1.0));
             return(new Cons <ReactionValue>(annihil, reactions));
         }
         else
         {
             return(reactions);
         }
     }
     else
     {
         return(new Nil <ReactionValue>());
     }
 }
Beispiel #2
0
        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);
        }
Beispiel #3
0
 public ReactionEntry(ReactionValue reaction)
 {
     this.reaction = reaction;
 }