public AssimilationArea( AssimilationPathway Ac1, AssimilationPathway Ac2, AssimilationPathway Aj, IAssimilation assimilation ) { pathways = new List <AssimilationPathway>(); // Always include Ac1 Ac1.Type = PathwayType.Ac1; pathways.Add(Ac1); // Conditionally include Ac2 Ac2.Type = PathwayType.Ac2; if (!(assimilation is AssimilationC3)) { pathways.Add(Ac2); } // Always include Aj Aj.Type = PathwayType.Aj; pathways.Add(Aj); this.assimilation = assimilation; }
/// <summary> /// /// </summary> /// <param name="assimilation"></param> /// <param name="pathway"></param> /// <returns></returns> public AssimilationFunction UpdateA(IAssimilation assimilation, AssimilationPathway pathway) { var func = assimilation.GetFunction(pathway, Leaf); if (Limited) { var molarMassWater = 18; var g_to_kg = 1000; var hrs_to_seconds = 3600; pathway.WaterUse = MaxRate * Fraction; var WaterUseMolsSecond = pathway.WaterUse / molarMassWater * g_to_kg / hrs_to_seconds; Resistance = Water.LimitedWaterResistance(pathway.WaterUse); var Gt = Water.TotalCO2Conductance(Resistance); func.Ci = Canopy.AirCO2 - WaterUseMolsSecond * Canopy.AirCO2 / (Gt + WaterUseMolsSecond / 2.0); func.Rm = 1 / (Gt + WaterUseMolsSecond / 2) + 1.0 / Leaf.GmT; pathway.CO2Rate = func.Value(); assimilation.UpdateIntercellularCO2(pathway, Gt, WaterUseMolsSecond); } else { pathway.IntercellularCO2 = Pathway.IntercellularToAirCO2Ratio * Canopy.AirCO2; func.Ci = pathway.IntercellularCO2; func.Rm = 1 / Leaf.GmT; pathway.CO2Rate = func.Value(); Resistance = Water.UnlimitedWaterResistance(pathway.CO2Rate, Canopy.AirCO2, pathway.IntercellularCO2); pathway.WaterUse = Water.HourlyWaterUse(Resistance); } pathway.VPD = Water.VPD; return(func); }