Пример #1
0
        /// <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);
            }
        }
Пример #2
0
            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);
                }
            }
Пример #3
0
      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);
        }
      }
Пример #4
0
        /// <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();
        }