private void OnSimulationCommencing(object sender, EventArgs e) { ZoneList = Apsim.Children(this.Parent, typeof(Zone)); SetupTreeProperties(); //pre-fetch static information forestryZones = Apsim.ChildrenRecursively(Parent, typeof(Zone)); treeZone = ZoneList[0] as Zone; treeZoneWater = Apsim.Find(treeZone, typeof(Soils.SoilWater)) as Soils.SoilWater; TreeWaterUptake = new double[ZoneList.Count]; }
/// <summary> /// Returns soil water uptake from each zone by the static tree model /// </summary> /// <param name="soilstate"></param> /// <returns></returns> public List <Soils.Arbitrator.ZoneWaterAndN> GetSWUptakes(Soils.Arbitrator.SoilState soilstate) { double SWDemand = 0; // Tree water demand (L) double PotSWSupply = 0; // Total water supply (L) foreach (ZoneInfo ZI in ZoneInfoList) { Soils.SoilWater S = Apsim.Find(ZI.zone, typeof(Soils.SoilWater)) as Soils.SoilWater; SWDemand += S.Eo * (1 / (1 - ZI.Shade / 100) - 1) * ZI.zone.Area * 10000; } List <ZoneWaterAndN> Uptakes = new List <ZoneWaterAndN>(); foreach (ZoneWaterAndN Z in soilstate.Zones) { foreach (ZoneInfo ZI in ZoneInfoList) { if (Z.Name == ZI.zone.Name) { ZoneWaterAndN Uptake = new ZoneWaterAndN(); //Find the soil for this zone Zone ThisZone = new Zone(); Soils.Soil ThisSoil = new Soils.Soil(); foreach (Zone SearchZ in Apsim.ChildrenRecursively(Parent, typeof(Zone))) { if (SearchZ.Name == Z.Name) { ThisSoil = Apsim.Find(SearchZ, typeof(Soils.Soil)) as Soils.Soil; } } Uptake.Name = Z.Name; double[] SW = Z.Water; Uptake.NO3N = new double[SW.Length]; Uptake.NH4N = new double[SW.Length]; Uptake.Water = new double[SW.Length]; for (int i = 0; i <= SW.Length - 1; i++) { double[] LL15mm = MathUtilities.Multiply(ThisSoil.LL15, ThisSoil.Thickness); Uptake.Water[i] = (SW[i] - LL15mm[i]) * ZI.RLD[i]; PotSWSupply += Uptake.Water[i] * ZI.zone.Area * 10000; } Uptakes.Add(Uptake); } } } // Now scale back uptakes if supply > demand double F = 0; // Uptake scaling factor if (PotSWSupply > 0) { F = SWDemand / PotSWSupply; if (F > 1) { F = 1; } } else { F = 1; } foreach (ZoneWaterAndN Z in Uptakes) { Z.Water = MathUtilities.Multiply_Value(Z.Water, F); } return(Uptakes); }