/// <summary> /// Adds the WaterPackets and returns them as the most advanced type. /// </summary> /// <param name="Waters"></param> /// <returns></returns> public static IWaterPacket Mix(IEnumerable <IWaterPacket> Waters) { if (Waters.Count() == 0) { return(null); } else if (Waters.Count() == 1) { return(Waters.First()); } else { IWaterPacket[] warr = Waters.ToArray(); IWaterPacket Water1 = warr[0]; for (int i = 1; i < warr.Count(); i++) { if (warr[i].GetType().IsSubclassOf(Water1.GetType())) { warr[i].Add(Water1); Water1 = warr[i]; } else { Water1.Add(warr[i]); } } return(Water1); } }
public void Mix(double Volume, IWaterPacket WP) { if (_anythingToMix) { double d = Volume / _totalVolume; if (_inflow != null) { WP.Add(_inflow.Substract(d * _inflowVolume)); } WP.Evaporate(d * _evapoVolume); WP.Substract(d * _sinkVolume); } }
public void Mix(double Volume, IWaterPacket WP) { if (_anythingToMix) { double d = Volume / _totalVolume; if (_inflow != null) WP.Add(_inflow.Substract(d*_inflowVolume)); WP.Evaporate(d*_evapoVolume ); WP.Substract(d*_sinkVolume); } }
/// <summary> /// Mixes the incoming water and sorts it in queue according to time /// </summary> private void PrePareIncomingWater() { double ControlVolume = Incoming.Sum(var => var.Third.Volume); Queue <DateTime> Starts = new Queue <DateTime>(); Queue <DateTime> Ends = new Queue <DateTime>(); List <Tuple <DateTime, DateTime> > TimeSpans = new List <Tuple <DateTime, DateTime> >(); foreach (DateTime D in Incoming.Select(var => var.First).OrderBy(var => var).Distinct()) { Starts.Enqueue(D); } foreach (DateTime D in Incoming.Select(var => var.Second).OrderBy(var => var).Distinct()) { Ends.Enqueue(D); } while (Starts.Count > 0 & Ends.Count > 0) { DateTime d = Starts.Dequeue(); if (Starts.Count > 0) { if (Starts.Peek() < Ends.Peek()) { TimeSpans.Add(new Tuple <DateTime, DateTime>(d, Starts.Peek())); } else { DateTime e = Ends.Dequeue(); TimeSpans.Add(new Tuple <DateTime, DateTime>(d, e)); Starts.Enqueue(e); var p = Starts.OrderBy(var => var).ToList(); Starts.Clear(); foreach (DateTime D in p) { Starts.Enqueue(D); } } } else { DateTime e = Ends.Dequeue(); TimeSpans.Add(new Tuple <DateTime, DateTime>(d, e)); Starts.Enqueue(e); } } //Store the volumes before substracting anything Dictionary <IWaterPacket, double> _vols = new Dictionary <IWaterPacket, double>(); foreach (var i in Incoming) { _vols.Add(i.Third, i.Third.Volume); } foreach (var v in TimeSpans) { var l = Incoming.Where(var => var.First <v.Item2& var.Second> v.Item1).ToList(); if (l.Count > 0) { double d = v.Item2.Subtract(v.Item1).TotalSeconds; IWaterPacket wp = l[0].Third.Substract(d / (l[0].Second.Subtract(l[0].First).TotalSeconds) * _vols[l[0].Third]); for (int i = 1; i < l.Count; i++) { wp.Add(l[i].Third.Substract(d / (l[i].Second.Subtract(l[i].First).TotalSeconds) * _vols[l[i].Third])); } _incomingWater.Enqueue(wp); } } //Check the mass balance if (_incomingWater.Sum(var => var.Volume) - ControlVolume > 1E-4) { throw new Exception("Error in algorithm to mix incoming water"); } Incoming.Clear(); }