public void RunOnstoredData()
        {
            Lake L = new Lake("Test", 1000);
            GroundWaterBoundary gwb = new GroundWaterBoundary(L, 14 - 5, 1, 10, (XYPolygon)L.Geometry);

            L.WaterLevel = 9;
            DateTime Start = new DateTime(2000, 1, 1);
            DateTime End   = new DateTime(2000, 2, 1);

            L.GroundwaterBoundaries.Add(gwb);
            Model m = new Model();

            m._waterBodies.Add(L);
            m.SetState("Initial", Start, new WaterPacket(1));
            m.MoveInTime(End, TimeSpan.FromDays(1));

            DateTime Mid = new DateTime(2000, 1, 15);

            double flow = L.Output.GroundwaterInflow.GetValue(Mid);

            gwb.FlowType = GWType.Flow;
            gwb.HydraulicConductivity = 1;
            gwb.GroundwaterHead       = 1;

            m.RestoreState("Initial");
            m.MoveInTime(End, TimeSpan.FromDays(1));
            Assert.AreEqual(flow, L.Output.GroundwaterInflow.GetValue(Mid));
        }
Exemple #2
0
        public void Run()
        {
            Engine.RestoreState("Initial");


            if (Calibration != 1)
            {
                GroundWaterBoundary gwb = ((GroundWaterBoundary)_lake.GroundwaterBoundaries.First());
                double WaterVolume      = ((XYPolygon)gwb.ContactGeometry).GetArea() * gwb.HydraulicConductivity * (gwb.GroundwaterHead - WaterLevel) / gwb.Distance;

                HydraulicConductivity *= Calibration;

                EvaporationRateBoundary er = new EvaporationRateBoundary((Calibration - 1) * WaterVolume);
                _lake.EvaporationBoundaries.Add(er);
            }


            Engine.MoveInTime(new DateTime(2007, 12, 31), TimeSpan.FromDays(30));
            _storageTimeEnd  = new DateTime(2007, 12, 23);
            StorageTimeStart = new DateTime(2007, 1, 1);
            StorageTimeEnd   = new DateTime(2007, 12, 24);

            if (Calibration != 1)
            {
                HydraulicConductivity /= Calibration;
                _lake.EvaporationBoundaries.RemoveAt(1);
            }
        }
Exemple #3
0
        public void Vedsted3()
        {
            WaterPacket GroundWater = new WaterPacket(1);

            GroundWater.AddChemical(ChemicalFactory.Instance.GetChemical(ChemicalNames.Radon), 0.01);

            Model m       = ModelFactory.GetModel(testDataPath + "VedstedNoGroundwater.xml");
            Lake  Vedsted = (Lake)m._waterBodies[0];

            Vedsted.Precipitation.First().WaterSample.IDForComposition = 2;
            Vedsted.Sources.First().WaterSample.IDForComposition = 3;

            GroundWaterBoundary Inflow = new GroundWaterBoundary(Vedsted, 1e-6, 1, 46.7, XYPolygon.GetSquare(Vedsted.Area / 2));

            Inflow.Name        = "Inflow";
            Inflow.ID          = 4;
            Inflow.WaterSample = GroundWater;
            Inflow.WaterSample.IDForComposition = 4;

            GroundWaterBoundary Outflow = new GroundWaterBoundary(Vedsted, 1e-6, 1, 44.7, XYPolygon.GetSquare(Vedsted.Area / 2));

            Outflow.Name        = "Outflow";
            Outflow.ID          = 5;
            Outflow.WaterSample = GroundWater;

            Vedsted.GroundwaterBoundaries.Add(Inflow);
            Vedsted.GroundwaterBoundaries.Add(Outflow);

            DateTime End = new DateTime(2009, 12, 31);

            m.MoveInTime(End, TimeSpan.FromDays(30));

            ModelFactory.SaveModel(testDataPath + "Vedsted3.xml", m);
        }
        void GroundwaterBoundaryView_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            GroundWaterBoundary g = DataContext as GroundWaterBoundary;

            if (g != null)
            {
                WaterExpander.DataContext = new WaterViewModel(g.WaterSample);
            }
        }
Exemple #5
0
        private Model CreateHydroNetModel()
        {
            // Upper Lake configuration
            Lake upperLake = new Lake("Upper Lake", 1000);

            //Simple inflow boundary
            SinkSourceBoundary inflow = new SinkSourceBoundary(2);

            inflow.Name            = "Inflow to Upper lake";
            inflow.ContactGeometry = new HydroNumerics.Geometry.XYPoint(350, 625);
            upperLake.Sources.Add(inflow);

            //Ground water boundary
            HydroNumerics.Geometry.XYPolygon contactPolygon = new HydroNumerics.Geometry.XYPolygon();
            contactPolygon.Points.Add(new HydroNumerics.Geometry.XYPoint(350, 625));
            contactPolygon.Points.Add(new HydroNumerics.Geometry.XYPoint(447, 451));
            contactPolygon.Points.Add(new HydroNumerics.Geometry.XYPoint(715, 433));
            contactPolygon.Points.Add(new HydroNumerics.Geometry.XYPoint(863, 671));
            contactPolygon.Points.Add(new HydroNumerics.Geometry.XYPoint(787, 823));
            contactPolygon.Points.Add(new HydroNumerics.Geometry.XYPoint(447, 809));
            GroundWaterBoundary groundWaterBoundary = new GroundWaterBoundary();

            groundWaterBoundary.Connection            = upperLake;
            groundWaterBoundary.ContactGeometry       = contactPolygon;
            groundWaterBoundary.Distance              = 2.3;
            groundWaterBoundary.HydraulicConductivity = 1e-4;
            groundWaterBoundary.GroundwaterHead       = 3.4;
            groundWaterBoundary.Name = "Groundwater boundary under Upper Lake";
            upperLake.GroundwaterBoundaries.Add(groundWaterBoundary);

            //Stream between the lakes
            Stream stream = new Stream("stream", 2000, 2, 1.1);

            //Lower Lake configuration
            Lake lowerLake = new Lake("Lower Lake", 20);

            //Connecting the waterbodies.
            upperLake.AddDownStreamWaterBody(stream);
            stream.AddDownStreamWaterBody(lowerLake);

            //Creating the model
            Model model = new Model();

            model._waterBodies.Add(upperLake);
            model._waterBodies.Add(stream);
            model._waterBodies.Add(lowerLake);

            DateTime startTime = new DateTime(2010, 1, 1);

            model.SetState("MyState", startTime, new WaterPacket(1000));
            upperLake.SetState("MyState", startTime, new WaterPacket(2));
            model.Name = "HydroNet test model";
            model.Initialize();

            return(model);
        }
 public void MyTestInitialize()
 {
     hydraulicConductivity = 0.0001; //m/s
     area               = 2.5;       //m2
     distance           = 34;        //m
     head               = 22;        // m
     s                  = new Lake("s", 100);
     target             = new GroundWaterBoundary(s, hydraulicConductivity, distance, head, XYPolygon.GetSquare(2.5));
     target.WaterSample = new WaterPacket(1, 150);
 }
Exemple #7
0
        public void GroundwaterBoundaryTest()
        {
            Stream stream = new Stream("S", 1, 1, 1);

            stream.WaterLevel = 2;
            GroundWaterBoundary gwb = new GroundWaterBoundary(stream, 2, 4, 5, XYPolygon.GetSquare(23));

            gwb.WaterSample = new WaterPacket(1);

            GroundWaterBoundary gwb2 = (GroundWaterBoundary)ReadWrite(gwb);

            Assert.AreEqual(gwb.IsSource(DateTime.Now), gwb2.IsSource(DateTime.Now));
            WaterEquals(gwb.GetSourceWater(DateTime.Now, TimeSpan.FromDays(1)), gwb2.GetSourceWater(DateTime.Now, TimeSpan.FromDays(1)));
        }
        private Model CreateHydroNetModel()
        {
            // Upper Lake configuration
            Lake lake = new Lake("The Lake", 1000);

            lake.WaterLevel = 5.1;

            SinkSourceBoundary inflow = new SinkSourceBoundary(2);

            inflow.Name = "Inflow to lake";

            HydroNumerics.Geometry.XYPolygon contactPolygon = new HydroNumerics.Geometry.XYPolygon();



            contactPolygon.Points.Add(new HydroNumerics.Geometry.XYPoint(350, 625));
            contactPolygon.Points.Add(new HydroNumerics.Geometry.XYPoint(447, 451));
            contactPolygon.Points.Add(new HydroNumerics.Geometry.XYPoint(715, 433));
            contactPolygon.Points.Add(new HydroNumerics.Geometry.XYPoint(863, 671));
            contactPolygon.Points.Add(new HydroNumerics.Geometry.XYPoint(787, 823));
            contactPolygon.Points.Add(new HydroNumerics.Geometry.XYPoint(447, 809));
            GroundWaterBoundary groundWaterBoundary = new GroundWaterBoundary();

            groundWaterBoundary.Connection            = lake;
            groundWaterBoundary.ContactGeometry       = contactPolygon;
            groundWaterBoundary.Distance              = 2.3;
            groundWaterBoundary.HydraulicConductivity = 1e-9;
            groundWaterBoundary.GroundwaterHead       = 5.0;
            groundWaterBoundary.Name = "Groundwater boundary under Lake";
            groundWaterBoundary.Name = "MyGWBoundary";

            lake.Sources.Add(inflow);
            lake.GroundwaterBoundaries.Add(groundWaterBoundary);

            //Creating the model
            Model model = new Model();

            model._waterBodies.Add(lake);

            DateTime startTime = new DateTime(2000, 1, 1);

            model.SetState("MyState", startTime, new WaterPacket(1000));
            lake.SetState("MyState", startTime, new WaterPacket(2));
            model.Name = "Lake model";
            model.Initialize();
            model.Update(new DateTime(2001, 1, 1));
            return(model);
        }
        public void TestHydroNetModel()
        {
            Model model = CreateHydroNetModel();
            Lake  lake  = (Lake)model._waterBodies[0];
            GroundWaterBoundary groundWaterBoundary = (GroundWaterBoundary)model._waterBodies[0].GroundwaterBoundaries[0];
            double areaOfGroundwaterboundary        = ((HydroNumerics.Geometry.XYPolygon)groundWaterBoundary.ContactGeometry).GetArea();

            double handcalckLeakage = -groundWaterBoundary.HydraulicConductivity * areaOfGroundwaterboundary * (lake.WaterLevel - groundWaterBoundary.GroundwaterHead) / groundWaterBoundary.Distance;
            double expected         = -0.0000065836086956521805;

            Assert.AreEqual(expected, handcalckLeakage, 0.000000000001);
            Assert.AreEqual(expected, groundWaterBoundary.CurrentFlowRate, 0.000000000001);

            model.Update(new DateTime(2001, 6, 2));

            Assert.AreEqual(expected, handcalckLeakage, 0.000000000001);
            Assert.AreEqual(expected, groundWaterBoundary.CurrentFlowRate, 0.000000000001);
        }
Exemple #10
0
        public void LakeTest()
        {
            Lake l = new Lake("L", 10000);

            l.ID = 3;

            GroundWaterBoundary gwb = new GroundWaterBoundary(l, 2, 4, 5, XYPolygon.GetSquare(23));

            gwb.WaterSample = new WaterPacket(1);
            l.GroundwaterBoundaries.Add(gwb);

            Lake l2 = (Lake)ReadWrite(l);

            Assert.AreEqual(l.Volume, l2.Volume);
            Assert.AreEqual(l.ID, l2.ID);
            Assert.AreEqual(l.Area, l2.Area);

            Assert.AreEqual(l.GroundwaterBoundaries.Count, l2.GroundwaterBoundaries.Count);
        }
Exemple #11
0
        public void RoutingOfGroundwaterTest()
        {
            Lake S = new Lake("L", 100);

            S.SetState("Initial", DateTime.Now, new WaterPacket(100));

            Lake storage = new Lake("Storage", 10000);

            S.AddDownStreamWaterBody(storage);

            TimeSpan ts = new TimeSpan(1, 0, 0);

            int          Id       = 2;
            IWaterPacket expected = new WaterPacket(Id, 200);
            IWaterPacket actual;

            S.WaterLevel = 8;
            GroundWaterBoundary b = new GroundWaterBoundary(S, 0.001, 100, 10, XYPolygon.GetSquare(2.5));

            b.WaterSample = expected;
            S.GroundwaterBoundaries.Add(b);
            S.Update(S.CurrentTime.Add(ts));

            actual = storage.CurrentStoredWater;
            double ExpectedVolume = b.GetSourceWater(DateTime.Now, ts).Volume;

            Assert.AreEqual(expected.Composition.Keys.First(), actual.Composition.Keys.First());
            Assert.AreEqual(ExpectedVolume, actual.Volume, 0.000001);

            S.Update(S.CurrentTime.Add(new TimeSpan(2, 0, 0)));

            actual = storage.CurrentStoredWater;
            Assert.AreEqual(expected.Composition.Keys.First(), actual.Composition.Keys.First());
            Assert.AreEqual(0.54, actual.Volume, 0.000001);

            S.AddWaterPacket(DateTime.Now, DateTime.Now, expected);
            S.Update(S.CurrentTime.Add(new TimeSpan(2, 0, 0)));
            actual = storage.CurrentStoredWater;

            Assert.AreEqual(200.9, actual.Volume, 0.000001);
        }
Exemple #12
0
        public void RoutingOfGroundwaterTest()
        {
            Stream S = new Stream("S", 100, 1, 1);

            S.SetState("Initial", DateTime.Now, new WaterPacket(100));

            TimeSpan ts = new TimeSpan(0, 1, 0);

            int          Id       = 2;
            IWaterPacket expected = new WaterPacket(Id, 200);
            IWaterPacket actual;

            S.WaterLevel = 8;
            GroundWaterBoundary b = new GroundWaterBoundary(S, 0.001, 10, 100, XYPolygon.GetSquare(250));

            b.WaterSample = expected;
            S.GroundwaterBoundaries.Add(b);
            S.Update(S.CurrentTime.Add(ts));

            actual = S.CurrentStoredWater;
            double ExpectedVolume = b.GetSourceWater(DateTime.Now, ts).Volume;

            Assert.AreEqual(expected.Composition.Keys.First(), actual.Composition.Keys.First());
            Assert.AreEqual(100, actual.Volume, 0.000001);

            S.Update(S.CurrentTime.Add(ts));

            actual = S.CurrentStoredWater;
            Assert.AreEqual(expected.Composition.Keys.First(), actual.Composition.Keys.First());
            Assert.AreEqual(100, actual.Volume, 0.000001);

            S.AddWaterPacket(DateTime.Now, DateTime.Now, expected);
            S.Update(S.CurrentTime.Add(ts));
            actual = S.CurrentStoredWater;

            Assert.AreEqual(100, actual.Volume, 0.000001);
        }
Exemple #13
0
        public void GroundWaterTest()
        {
            WaterPacket GroundWater = new WaterPacket(1);

//      GroundWater.AddChemical(ChemicalFactory.Instance.GetChemical(ChemicalNames.Radon), 0.01);
            GroundWater.IDForComposition = 4;

            Lake Vedsted = LakeFactory.GetLake("Vedsted Sø");

            Vedsted.Depth      = 5;
            Vedsted.WaterLevel = 45.7;

            //Create and add a discharge boundary
            TimestampSeries Discharge = new TimestampSeries();

            Discharge.AddSiValue(new DateTime(2007, 3, 12), 6986 / TimeSpan.FromDays(365).TotalSeconds);
            Discharge.AddSiValue(new DateTime(2007, 4, 3), 5894 / TimeSpan.FromDays(365).TotalSeconds);
            Discharge.AddSiValue(new DateTime(2007, 4, 25), 1205 / TimeSpan.FromDays(365).TotalSeconds);
            Discharge.RelaxationFactor   = 1;
            Discharge.AllowExtrapolation = true;
            Assert.AreEqual(Discharge.GetValue(new DateTime(2007, 4, 25)), Discharge.GetValue(new DateTime(2007, 6, 25)), 0.0000001);
            SinkSourceBoundary Kilde = new SinkSourceBoundary(Discharge);

            Kilde.Name = "Small spring";
            Kilde.ID   = 3;
            Kilde.WaterSample.IDForComposition = 3;
            Vedsted.Sources.Add(Kilde);


            Vedsted.Output.LogAllChemicals = true;
            Vedsted.Output.LogComposition  = true;

            //Add to an engine
            Model Engine = new Model();

            Engine.Name = "Vedsted-opsætning";
            Engine._waterBodies.Add(Vedsted);

            //Set initial state
            WaterPacket InitialStateWater = new WaterPacket(1);

            InitialStateWater.IDForComposition = 1;
            DateTime Start = new DateTime(2007, 1, 1);
            DateTime End   = new DateTime(2007, 12, 31);

            Engine.SetState("Initial", Start, InitialStateWater);
            Engine.SimulationEndTime = End;
            Engine.TimeStep          = TimeSpan.FromDays(30);

            Engine.MoveInTime(End, TimeSpan.FromDays(30));
            Vedsted.Name = "Vedsted step 1";
            Engine.Save(testDataPath + Vedsted.Name + ".xml");
            Engine.RestoreState("Initial");

            //Create and add precipitation boundary
            TimespanSeries Precipitation = new TimespanSeries();

            Precipitation.ExtrapolationMethod = ExtrapolationMethods.RecycleYear;
            Precipitation.AllowExtrapolation  = true;
            double[] values = new double[] { 108, 83, 73, 52, 61, 86, 99, 101, 75, 108, 85, 101 };
            AddMonthlyValues(Precipitation, 2007, values);
            SinkSourceBoundary Precip = new SinkSourceBoundary(Precipitation);

            Precip.ContactGeometry = Vedsted.SurfaceArea;
            Precip.Name            = "Precipitation";
            Precip.ID = 2;
            Precip.WaterSample.IDForComposition = 2;
            Vedsted.Precipitation.Add(Precip);

            //Create and add evaporation boundary
            TimespanSeries Evaporation = new TimespanSeries();

            Evaporation.AllowExtrapolation  = true;
            Evaporation.ExtrapolationMethod = ExtrapolationMethods.RecycleYear;
            double[] values2 = new double[] { 4, 11, 34, 66, 110, 118, 122, 103, 61, 26, 7, 1 };
            AddMonthlyValues(Evaporation, 2007, values2);
            EvaporationRateBoundary eva = new EvaporationRateBoundary(Evaporation);

            eva.ContactGeometry = Vedsted.SurfaceArea;
            eva.Name            = "Evapo";

            Vedsted.EvaporationBoundaries.Add(eva);

            Engine.MoveInTime(End, TimeSpan.FromDays(30));
            Vedsted.Name = "Vedsted step 2";
            Engine.Save(testDataPath + Vedsted.Name + ".xml");
            Engine.RestoreState("Initial");


            //To be used by other tests
            Engine.Save(testDataPath + "VedstedNoGroundwater.xml");

            XYPolygon ContactArea = XYPolygon.GetSquare(Vedsted.Area / 10);

            #region Groundwater boundaries
            //Add groundwater boundaries
            GroundWaterBoundary B1 = new GroundWaterBoundary(Vedsted, 1.3e-4, 1, 45.47, ContactArea);
            B1.Name        = "B1";
            B1.ID          = 4;
            B1.WaterSample = GroundWater;
            Vedsted.GroundwaterBoundaries.Add(B1);

            GroundWaterBoundary B2 = new GroundWaterBoundary(Vedsted, 1e-6, 1, 44.96, ContactArea);
            B2.Name        = "B2";
            B2.ID          = 5;
            B2.WaterSample = GroundWater;
            Vedsted.GroundwaterBoundaries.Add(B2);

            GroundWaterBoundary B3 = new GroundWaterBoundary(Vedsted, 2e-6, 1, 44.63, ContactArea);
            B3.Name        = "B3";
            B3.ID          = 6;
            B3.WaterSample = GroundWater;
            Vedsted.GroundwaterBoundaries.Add(B3);

            GroundWaterBoundary B4 = new GroundWaterBoundary(Vedsted, 4.9e-7, 1, 44.75, ContactArea);
            B4.Name        = "B4";
            B4.ID          = 7;
            B4.WaterSample = GroundWater;
            Vedsted.GroundwaterBoundaries.Add(B4);

            GroundWaterBoundary B5 = new GroundWaterBoundary(Vedsted, 1.5e-8, 1, 44.27, ContactArea);
            B5.Name        = "B5";
            B5.ID          = 8;
            B5.WaterSample = GroundWater;
            Vedsted.GroundwaterBoundaries.Add(B5);

            GroundWaterBoundary B6 = new GroundWaterBoundary(Vedsted, 1.5e-8, 1, 44.16, ContactArea);
            B6.Name        = "B6";
            B6.ID          = 9;
            B6.WaterSample = GroundWater;
            Vedsted.GroundwaterBoundaries.Add(B6);

            GroundWaterBoundary B7 = new GroundWaterBoundary(Vedsted, 1.1e-6, 1, 45.15, ContactArea);
            B7.Name        = "B7";
            B7.ID          = 10;
            B7.WaterSample = GroundWater;
            Vedsted.GroundwaterBoundaries.Add(B7);

            GroundWaterBoundary B8 = new GroundWaterBoundary(Vedsted, 1.1e-6, 1, 44.54, ContactArea);
            B8.Name        = "B8";
            B8.ID          = 11;
            B8.WaterSample = GroundWater;
            Vedsted.GroundwaterBoundaries.Add(B8);

            GroundWaterBoundary B9 = new GroundWaterBoundary(Vedsted, 2.1e-8, 1, 45.4, ContactArea);
            B9.Name        = "B9";
            B9.ID          = 12;
            B9.WaterSample = GroundWater;
            Vedsted.GroundwaterBoundaries.Add(B9);

            GroundWaterBoundary B10 = new GroundWaterBoundary(Vedsted, 3.5e-6, 1, 45.16, ContactArea);
            B10.Name        = "B10";
            B10.ID          = 13;
            B10.WaterSample = GroundWater;
            Vedsted.GroundwaterBoundaries.Add(B10);

            #endregion

            Engine.MoveInTime(End, TimeSpan.FromDays(30));
            Vedsted.Name = "Vedsted step 3";
            Engine.Save(testDataPath + Vedsted.Name + ".xml");
            Engine.RestoreState("Initial");

            Vedsted.GroundwaterBoundaries.Clear();

            var cl = ChemicalFactory.Instance.GetChemical(ChemicalNames.IsotopeFraction);

            GroundWaterBoundary Inflow = new GroundWaterBoundary(Vedsted, 1e-7, 1, 46.7, XYPolygon.GetSquare(Vedsted.Area / 2));
            Inflow.Name = "Inflow";
            GroundWater.AddChemical(cl, 3);
            Inflow.WaterSample = GroundWater;

            Vedsted.RealData.AddChemicalTimeSeries(cl);
            Vedsted.RealData.ChemicalConcentrations[cl].AddSiValue(new DateTime(2007, 8, 7), 2.5);

            ((WaterPacket)InitialStateWater).AddChemical(cl, 2.5 * InitialStateWater.Volume);
            Engine.SetState("Initial", Start, InitialStateWater);

            GroundWaterBoundary Outflow = new GroundWaterBoundary(Vedsted, 1e-7, 1, 44.7, XYPolygon.GetSquare(Vedsted.Area / 2));
            Outflow.Name = "Outflow";

            Vedsted.GroundwaterBoundaries.Add(Inflow);
            Vedsted.GroundwaterBoundaries.Add(Outflow);

            Engine.MoveInTime(End, TimeSpan.FromDays(30));
            Vedsted.Name = "Vedsted step 4";
            Engine.Save(testDataPath + Vedsted.Name + ".xml");
            Engine.RestoreState("Initial");



            #region ////Add seepage meter boundaries
            //GroundWaterBoundary S1 = new GroundWaterBoundary(Vedsted, 4e-5, 1, 2, 46);
            //Vedsted.SinkSources.Add(S1);
            //GroundWaterBoundary S2 = new GroundWaterBoundary(Vedsted, 4e-5, 1, 2, 46);
            //Vedsted.SinkSources.Add(S2);
            //GroundWaterBoundary S3 = new GroundWaterBoundary(Vedsted, 4e-5, 1, 2, 46);
            //Vedsted.SinkSources.Add(S3);
            //GroundWaterBoundary I1 = new GroundWaterBoundary(Vedsted, 4e-5, 1, 2, 46);
            //Vedsted.SinkSources.Add(I1);
            //GroundWaterBoundary I2 = new GroundWaterBoundary(Vedsted, 4e-5, 1, 2, 46);
            //Vedsted.SinkSources.Add(I2);
            //GroundWaterBoundary I3 = new GroundWaterBoundary(Vedsted, 4e-5, 1, 2, 46);
            //Vedsted.SinkSources.Add(I3);

            #endregion


            Assert.AreEqual(Evaporation.EndTime, Engine.MaximumEndTime);
            Engine.Save(testDataPath + "Vedsted.xml");

            Engine.MoveInTime(End, TimeSpan.FromDays(30));

            double outflow2 = Vedsted.Output.Outflow.GetValue(Start, End.Subtract(TimeSpan.FromDays(5)));
            double evapo2   = Vedsted.Output.Evaporation.GetValue(Start, End.Subtract(TimeSpan.FromDays(5)));

            Engine.Save(testDataPath + "Vedsted2.xml");
        }
Exemple #14
0
        public DemoViewModel(string Name, XYPolygon SurfaceArea, TimespanSeries Evaporation, TimespanSeries Precipitation)
        {
            Calibration      = 1;
            _lake            = new Lake(Name, SurfaceArea);
            _lake.Depth      = 5;
            _lake.WaterLevel = 45.7;

            //Create and add precipitation boundary
            SinkSourceBoundary Precip = new SinkSourceBoundary(Precipitation);

            Precip.ContactGeometry = _lake.SurfaceArea;
            _lake.Sources.Add(Precip);

            //Create and add evaporation boundary
            EvaporationRateBoundary eva = new EvaporationRateBoundary(Evaporation);

            eva.ContactGeometry = _lake.SurfaceArea;
            _lake.EvaporationBoundaries.Add(eva);

            //Create and add a discharge boundary
            Discharge = new TimestampSeries();
            Discharge.AddSiValue(new DateTime(2007, 3, 12), 6986 / TimeSpan.FromDays(365).TotalSeconds);
            Discharge.AddSiValue(new DateTime(2007, 4, 3), 5894 / TimeSpan.FromDays(365).TotalSeconds);
            Discharge.AddSiValue(new DateTime(2007, 4, 25), 1205 / TimeSpan.FromDays(365).TotalSeconds);
            Discharge.RelaxationFactor   = 1;
            Discharge.AllowExtrapolation = true;
            Discharge.Name = "Inflow";
            SinkSourceBoundary Kilde = new SinkSourceBoundary(Discharge);

            _lake.Sources.Add(Kilde);

            //Add a groundwater boundary
            GroundWaterBoundary gwb = new GroundWaterBoundary(_lake, 1e-7, 1, 46, (XYPolygon)_lake.Geometry);

            _lake.GroundwaterBoundaries.Add(gwb);

            DateTime Start = new DateTime(2007, 1, 1);

            //Add to an engine
            Engine = new Model();
            Engine._waterBodies.Add(_lake);

            //Set initial state
            Engine.SetState("Initial", Start, new WaterPacket(1));

            //Add the chemicals
            Chemical cl = ChemicalFactory.Instance.GetChemical(ChemicalNames.Cl);

            //Tell the lake to log the chemicals
            _lake.Output.LogChemicalConcentration(ChemicalFactory.Instance.GetChemical(ChemicalNames.IsotopeFraction));
            _lake.Output.LogChemicalConcentration(cl);

            IsotopeWater Iw = new IsotopeWater(1);

            Iw.SetIsotopeRatio(0.2);
            Iw.AddChemical(cl, 0.1);
            Precip.WaterSample = Iw.DeepClone();

            //Evaporate some of the water to get realistic initial conditions
            Iw.Evaporate(Iw.Volume / 2);
            _lake.SetState("Initial", Start, Iw.DeepClone(_lake.Volume));
            Kilde.WaterSample = Iw.DeepClone();

            Iw.Evaporate(Iw.Volume / 2);
            gwb.WaterSample = Iw.DeepClone();
        }
Exemple #15
0
        public void TestMethod1()
        {
            Lake Hampen = LakeFactory.GetLake("Hampen Sø");

            Hampen.Depth = 3.2e6 / 760000 / 1000;

            DateTime start = new DateTime(2008, 1, 1);
            DateTime end   = new DateTime(2008, 12, 31);

            Assert.AreEqual(Hampen.Area, 722200, 1);

            EvaporationRateBoundary er = new EvaporationRateBoundary(407.0 / 1000 / 365 / 86400);

            er.ContactGeometry = Hampen.Geometry;
            er.Name            = "Fordampning";
            Hampen.EvaporationBoundaries.Add(er);

            SourceBoundary pr = new SourceBoundary(901.0 / 1000 / 365 / 86400);

            pr.ContactGeometry = Hampen.Geometry;
            pr.Name            = "Nedbør";
            Hampen.Precipitation.Add(pr);

            SinkSourceBoundary outlet = new SinkSourceBoundary(-200.0 / 1000 / 365 / 86400);

            outlet.ContactGeometry = Hampen.Geometry;
            outlet.Name            = "Udløb";
            Hampen.Sinks.Add(outlet);

            GroundWaterBoundary gwb = new GroundWaterBoundary();

            gwb.FlowType  = GWType.Flow;
            gwb.Name      = "Ud";
            gwb.WaterFlow = new HydroNumerics.Time.Core.TimespanSeries("inflow", new DateTime(2008, 1, 1), 2, 1, HydroNumerics.Time.Core.TimestepUnit.Years, -294.0 / 1000 / 365 / 86400 * Hampen.Area);
            Hampen.GroundwaterBoundaries.Add(gwb);


            Model m = new Model();

            m._waterBodies.Add(Hampen);

            m.SetState("start", start, new WaterPacket(1));
            m.SimulationStartTime = start;
            m.SimulationEndTime   = end;
            m.MoveInTime(end, TimeSpan.FromDays(30));
            m.Save(@"..\..\..\TestData\Hampen1.xml");

            WaterPacket ChlorideWater = new WaterPacket(1);

            ChlorideWater.SetConcentration(ChemicalNames.Cl, 20);
            ChlorideWater.SetConcentration(ChemicalNames.IsotopeFraction, 4);
            ChlorideWater.SetConcentration(ChemicalNames.Nitrate, 0.2);
            ChlorideWater.SetConcentration(ChemicalNames.Phosphate, 0.02);

            m.SetState("start", start, ChlorideWater);
            Hampen.Output.LogAllChemicals = true;

            double gwinflow = 1000.0;


            gwb.WaterFlow = new HydroNumerics.Time.Core.TimespanSeries("inflow", new DateTime(2008, 1, 1), 2, 1, HydroNumerics.Time.Core.TimestepUnit.Years, -(294.0 + gwinflow) / 1000 / 365 / 86400 * Hampen.Area);

            GroundWaterBoundary gwbin = new GroundWaterBoundary();

            gwbin.FlowType  = GWType.Flow;
            gwbin.WaterFlow = new HydroNumerics.Time.Core.TimespanSeries("inflow", new DateTime(2008, 1, 1), 2, 1, HydroNumerics.Time.Core.TimestepUnit.Years, 0.955 * gwinflow / 1000 / 365 / 86400 * Hampen.Area);
            ChlorideWater.SetConcentration(ChemicalNames.Cl, 30);
            ChlorideWater.SetConcentration(ChemicalNames.IsotopeFraction, 8);
            ChlorideWater.SetConcentration(ChemicalNames.Nitrate, 1.6);
            ChlorideWater.SetConcentration(ChemicalNames.Phosphate, 0.017);
            gwbin.Name        = "Ind Skov";
            gwbin.WaterSample = ChlorideWater.DeepClone();
            Hampen.GroundwaterBoundaries.Add(gwbin);

            GroundWaterBoundary gwbin2 = new GroundWaterBoundary();

            gwbin2.FlowType  = GWType.Flow;
            gwbin2.WaterFlow = new HydroNumerics.Time.Core.TimespanSeries("inflow", new DateTime(2008, 1, 1), 2, 1, HydroNumerics.Time.Core.TimestepUnit.Years, 0.045 * gwinflow / 1000 / 365 / 86400 * Hampen.Area);
            ChlorideWater.SetConcentration(ChemicalNames.Nitrate, 65.3);
            gwbin2.Name        = "Ind Landbrug";
            gwbin2.WaterSample = ChlorideWater.DeepClone();

            Hampen.GroundwaterBoundaries.Add(gwbin2);
            ChlorideWater.SetConcentration(ChemicalNames.Cl, 10);
            ChlorideWater.SetConcentration(ChemicalNames.Phosphate, 0);
            ChlorideWater.SetConcentration(ChemicalNames.Nitrate, 1.7);
            pr.WaterSample = ChlorideWater.DeepClone();

            m.MoveInTime(end, TimeSpan.FromDays(30));
            m.Save(@"..\..\..\TestData\Hampen2.xml");
        }
Exemple #16
0
        private Model CreateHydroNetModel()
        {
            DateTime startTime = new DateTime(2000, 1, 1);


            // -------------------- Polygons --------------------------------------
            HydroNumerics.Geometry.XYPolygon upperLakeGeometry = new HydroNumerics.Geometry.XYPolygon();
            upperLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(535.836, 2269.625));
            upperLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(675.768, 2187.713));
            upperLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(771.331, 2177.474));
            upperLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(887.372, 2184.300));
            upperLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(935.154, 2255.973));
            upperLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(945.392, 2385.666));
            upperLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(931.741, 2505.119));
            upperLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(877.133, 2546.075));
            upperLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(812.287, 2638.225));
            upperLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(696.246, 2675.768));
            upperLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(638.225, 2627.986));
            upperLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(573.379, 2587.031));

            HydroNumerics.Geometry.XYPolygon lowerLakeGeometry = new HydroNumerics.Geometry.XYPolygon();
            lowerLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1935.154, 1150.171));
            lowerLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1901.024, 1058.020));
            lowerLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1877.133, 965.870));
            lowerLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1894.198, 897.611));
            lowerLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1938.567, 808.874));
            lowerLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(2023.891, 761.092));
            lowerLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(2116.041, 740.614));
            lowerLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(2232.082, 747.440));
            lowerLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(2327.645, 808.874));
            lowerLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(2389.078, 969.283));
            lowerLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(2372.014, 1109.215));
            lowerLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(2262.799, 1218.430));
            lowerLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(2105.802, 1235.495));
            lowerLakeGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1982.935, 1225.256));

            HydroNumerics.Geometry.XYPolygon upperStreamGeometry = new HydroNumerics.Geometry.XYPolygon();
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(863.481, 2177.474));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(914.676, 2129.693));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(965.870, 2071.672));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(976.109, 2027.304));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(976.109, 1989.761));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1006.826, 1959.044));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1051.195, 1918.089));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1095.563, 1877.133));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1126.280, 1808.874));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1187.713, 1781.570));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1228.669, 1730.375));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1262.799, 1665.529));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1283.276, 1597.270));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1317.406, 1535.836));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1341.297, 1484.642));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1389.078, 1457.338));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1423.208, 1440.273));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1477.816, 1402.730));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1511.945, 1358.362));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1539.249, 1327.645));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1566.553, 1354.949));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1535.836, 1406.143));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1508.532, 1457.338));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1440.273, 1522.184));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1368.601, 1580.205));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1327.645, 1631.399));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1307.167, 1696.246));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1269.625, 1767.918));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1221.843, 1819.113));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1191.126, 1843.003));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1136.519, 1894.198));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1088.737, 1935.154));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1061.433, 1976.109));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1030.717, 2040.956));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1013.652, 2105.802));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(972.696, 2177.474));
            upperStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(918.089, 2228.669));

            HydroNumerics.Geometry.XYPolygon lowerStreamGeometry = new HydroNumerics.Geometry.XYPolygon();
            lowerStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1904.437, 1081.911));
            lowerStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1921.502, 1153.584));
            lowerStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1771.331, 1255.973));
            lowerStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1573.379, 1354.949));
            lowerStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1542.662, 1324.232));
            lowerStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1597.270, 1273.038));
            lowerStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1709.898, 1215.017));
            lowerStreamGeometry.Points.Add(new HydroNumerics.Geometry.XYPoint(1839.590, 1143.345));

            // --- precipitation --------------------------------------------------

            const int numberOfTimesteps = 2190;

            double[] precipitation = new double[numberOfTimesteps] {
                0.0000, 0.0000, 2.3000, 0.2000, 0.0000, 0.1000, 0.1000, 0.0000, 0.3000, 0.4000, 0.1000, 0.1000, 1.0000, 0.0000, 0.5000, 5.3000, 1.9000, 0.1000, 0.0000, 0.4000, 1.1000, 1.2000, 2.6000, 0.0000, 1.5000, 3.4000, 6.0000, 0.7000, 4.0000, 0.1000, 0.6000, 2.0000, 0.4000, 0.1000, 0.0000, 0.0000, 0.0000, 4.1000, 0.2000, 4.0000, 0.3000, 0.6000, 3.1000, 14.1000, 3.9000, 0.1000, 3.7000, 2.4000, 4.3000, 0.0000, 0.0000, 0.0000, 0.0000, 2.7000, 1.0000, 0.1000, 0.3000, 0.2000, 0.0000, 0.2000, 8.7000, 2.0000, 1.8000, 0.9000, 0.1000, 0.2000, 0.1000, 0.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1000, 0.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.6000, 1.8000, 0.0000, 1.1000, 4.7000, 2.4000, 0.0000, 0.1000, 8.2000, 4.6000, 1.0000, 0.1000, 0.0000, 0.0000, 7.8000, 2.0000, 0.3000, 0.0000, 0.1000, 0.1000, 0.0000, 0.0000, 0.3000, 0.1000, 2.2000, 2.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1000, 6.7000, 0.0000, 0.0000, 0.0000, 5.4000, 2.2000, 1.0000, 10.8000, 3.6000, 3.1000, 10.1000, 0.0000, 0.3000, 2.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.3000, 0.0000, 0.0000, 7.6000, 3.6000, 0.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1000, 4.5000, 0.0000, 12.8000, 0.0000, 4.4000, 0.0000, 0.0000, 0.0000, 0.0000, 4.9000, 0.0000, 0.8000, 0.0000, 2.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 7.1000, 0.2000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 4.4000, 1.5000, 4.6000, 1.4000, 0.8000, 0.0000, 0.0000, 0.0000, 0.0000, 5.5000, 4.6000, 1.3000, 0.1000, 2.8000, 2.6000, 0.0000, 0.1000, 3.5000, 1.0000, 8.7000, 0.5000, 0.0000, 0.4000, 0.0000, 0.0000, 0.0000, 0.0000, 3.8000, 4.9000, 4.6000, 2.5000, 7.9000, 0.1000, 4.7000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.6000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.2000, 14.4000, 2.0000, 6.2000, 0.5000, 0.3000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 3.2000, 8.1000, 1.3000, 20.2000, 13.5000, 1.1000, 1.3000, 0.0000, 0.0000, 2.1000, 13.7000, 3.9000, 0.5000, 0.1000, 0.0000, 0.0000, 0.1000, 0.0000, 0.0000, 0.2000, 4.8000, 7.2000, 0.4000, 0.0000, 4.6000, 0.2000, 0.0000, 0.0000, 0.5000, 4.8000, 9.8000, 0.6000, 0.0000, 0.0000, 0.0000, 0.0000, 3.2000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5000, 8.5000, 0.5000, 1.9000, 1.2000, 0.0000, 3.2000, 1.7000, 12.3000, 1.9000, 0.0000, 4.3000, 3.6000, 1.1000, 6.7000, 5.4000, 0.0000, 0.0000, 0.9000, 10.0000, 7.8000, 0.1000, 1.3000, 0.5000, 0.1000, 0.2000, 0.5000, 0.0000, 7.2000, 0.0000, 0.0000, 10.2000, 9.7000, 0.2000, 0.1000, 0.9000, 3.5000, 1.2000, 4.9000, 4.6000, 3.5000, 1.1000, 5.8000, 0.4000, 0.0000, 0.0000, 0.6000, 0.1000, 1.2000, 0.8000, 9.4000, 1.5000, 0.1000, 0.1000, 0.2000, 0.9000, 4.8000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1000, 0.0000, 0.1000, 1.9000, 0.8000, 0.9000, 2.1000, 7.9000, 3.8000, 3.8000, 9.6000, 1.4000, 7.9000, 0.4000, 0.6000, 0.7000, 0.0000, 0.0000, 0.0000, 7.0000, 0.1000, 0.1000, 0.1000, 5.3000, 1.0000, 4.3000, 0.2000, 0.0000, 1.8000, 0.1000, 0.6000, 0.0000, 1.5000, 3.2000, 0.1000, 4.1000, 5.5000, 10.6000, 9.0000, 0.9000, 0.8000, 2.7000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4000, 0.6000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1000, 0.1000, 2.5000, 5.7000, 2.3000, 2.0000, 0.6000, 0.8000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 4.2000, 9.6000, 0.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.7000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 9.3000, 0.0000, 0.0000, 0.0000, 0.0000, 5.3000, 0.0000, 0.0000, 0.7000, 9.0000, 0.2000, 0.0000, 0.0000, 2.8000, 2.4000, 1.5000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 6.4000, 0.0000, 0.0000, 0.8000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 7.1000, 0.1000, 0.0000, 0.2000, 0.0000, 0.0000, 0.2000, 0.0000, 0.6000, 0.9000, 10.0000, 5.1000, 4.1000, 10.3000, 1.9000, 0.0000, 0.0000, 0.0000, 0.2000, 4.2000, 0.4000, 5.8000, 0.5000, 0.1000, 3.3000, 4.9000, 1.4000, 0.5000, 0.0000, 1.8000, 2.5000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1000, 1.4000, 0.0000, 2.4000, 7.6000, 5.2000, 11.4000, 0.1000, 1.1000, 0.7000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.8000, 0.0000, 2.3000, 0.4000, 0.0000, 0.0000, 0.0000, 0.0000, 5.2000, 2.2000, 0.0000, 10.0000, 5.3000, 1.2000, 8.0000, 30.7000, 2.9000, 0.0000, 0.0000, 0.0000, 6.8000, 0.0000, 0.0000, 0.0000, 1.4000, 0.5000, 4.1000, 0.1000, 10.6000, 11.2000, 2.5000, 6.2000, 5.3000, 4.5000, 12.8000, 0.1000, 1.0000, 0.0000, 0.0000, 22.7000, 2.5000, 5.5000, 3.7000, 0.8000, 0.0000, 1.6000, 1.7000, 3.8000, 0.2000, 0.3000, 0.0000, 0.4000, 0.0000, 0.2000, 0.5000, 1.0000, 16.3000, 0.3000, 4.3000, 14.8000, 0.0000, 2.7000, 0.0000, 2.8000, 3.2000, 5.3000, 2.1000, 0.0000, 2.2000, 0.4000, 0.3000, 0.1000, 0.0000, 0.0000, 1.8000, 0.5000, 9.4000, 11.4000, 2.4000, 9.2000, 1.1000, 11.1000, 6.4000, 8.3000, 15.3000, 0.1000, 6.8000, 2.9000, 0.0000, 0.3000, 0.4000, 0.2000, 3.3000, 6.2000, 1.0000, 9.0000, 5.5000, 0.0000, 0.0000, 3.0000, 1.1000, 0.0000, 10.8000, 0.0000, 7.1000, 2.0000, 1.6000, 7.2000, 9.4000, 0.9000, 6.1000, 1.4000, 2.5000, 0.6000, 8.1000, 0.9000, 2.8000, 5.0000, 3.3000, 2.1000, 9.5000, 0.0000, 6.0000, 7.0000, 0.0000, 2.2000, 1.8000, 0.2000, 1.1000, 5.2000, 0.0000, 0.3000, 1.6000, 0.8000, 0.4000, 0.0000, 0.2000, 1.4000, 5.9000, 7.1000, 7.0000, 1.9000, 1.5000, 0.1000, 0.3000, 5.6000, 4.1000, 4.8000, 1.5000, 1.5000, 2.7000, 11.4000, 8.6000, 3.7000, 5.7000, 1.3000, 13.4000, 5.6000, 5.9000, 5.4000, 5.3000, 0.1000, 0.1000, 0.2000, 0.0000, 0.5000, 0.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 4.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1000, 0.0000, 2.9000, 3.0000, 1.0000, 14.6000, 0.6000, 5.0000, 0.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1000, 1.6000, 2.2000, 0.0000, 0.0000, 0.6000, 0.0000, 0.2000, 2.4000, 0.3000, 0.0000, 0.3000, 5.8000, 1.6000, 1.6000, 5.7000, 2.8000, 1.9000, 0.6000, 2.8000, 0.0000, 8.8000, 2.5000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 3.1000, 0.0000, 0.0000, 0.0000, 0.2000, 0.5000, 0.0000, 3.7000, 5.0000, 10.2000, 1.2000, 0.4000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.6000, 0.3000, 0.0000, 0.0000, 2.2000, 8.4000, 11.5000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.8000, 12.4000, 2.8000, 3.9000, 10.1000, 4.5000, 6.6000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5000, 0.5000, 0.0000, 0.7000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.3000, 0.7000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 3.2000, 1.4000, 7.3000, 0.0000, 3.7000, 11.1000, 1.2000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1000, 8.3000, 2.2000, 6.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.2000, 0.0000, 0.0000, 0.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 11.6000, 5.9000, 0.0000, 0.0000, 8.9000, 17.1000, 0.1000, 4.9000, 2.3000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 14.5000, 2.7000, 1.9000, 3.3000, 0.0000, 0.0000, 19.9000, 2.4000, 4.1000, 2.0000, 4.2000, 0.9000, 0.3000, 0.0000, 0.1000, 0.3000, 0.0000, 3.1000, 2.5000, 0.0000, 1.6000, 3.8000, 8.2000, 5.7000, 7.7000, 0.3000, 0.0000, 5.4000, 7.9000, 1.3000, 10.0000, 0.6000, 0.7000, 0.0000, 0.0000, 0.0000, 0.9000, 0.0000, 0.0000, 0.1000, 2.6000, 6.3000, 4.7000, 0.7000, 0.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.2000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 2.3000, 2.0000, 0.0000, 3.1000, 0.9000, 0.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.3000, 0.4000, 7.5000, 12.4000, 2.9000, 0.5000, 7.6000, 1.6000, 2.3000, 0.0000, 0.0000, 2.1000, 2.3000, 8.0000, 2.1000, 1.7000, 0.0000, 0.0000, 17.9000, 4.5000, 0.5000, 0.7000, 0.3000, 0.0000, 1.1000, 0.1000, 0.0000, 0.0000, 1.1000, 0.1000, 0.0000, 1.2000, 0.0000, 1.2000, 0.8000, 0.7000, 0.0000, 0.1000, 0.2000, 0.2000, 0.0000, 0.4000, 1.3000, 0.0000, 0.0000, 0.0000, 0.1000, 1.4000, 0.0000, 0.0000, 2.3000, 0.2000, 0.0000, 0.1000, 0.1000, 0.0000, 0.3000, 0.4000, 0.1000, 0.1000, 1.0000, 0.0000, 0.5000, 5.3000, 1.9000, 0.1000, 0.0000, 0.4000, 1.1000, 1.2000, 2.6000, 0.0000, 1.5000, 3.4000, 6.0000, 0.7000, 4.0000, 0.1000, 0.6000, 2.0000, 0.4000, 0.1000, 0.0000, 0.0000, 0.0000, 4.1000, 0.2000, 4.0000, 0.3000, 0.6000, 3.1000, 14.1000, 3.9000, 0.1000, 3.7000, 2.4000, 4.3000, 0.0000, 0.0000, 0.0000, 0.0000, 2.7000, 1.0000, 0.1000, 0.3000, 0.2000, 0.0000, 0.2000, 8.7000, 2.0000, 1.8000, 0.9000, 0.1000, 0.2000, 0.1000, 0.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1000, 0.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.6000, 1.8000, 0.0000, 1.1000, 4.7000, 2.4000, 0.0000, 0.1000, 8.2000, 4.6000, 1.0000, 0.1000, 0.0000, 0.0000, 7.8000, 2.0000, 0.3000, 0.0000, 0.1000, 0.1000, 0.0000, 0.0000, 0.3000, 0.1000, 2.2000, 2.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1000, 6.7000, 0.0000, 0.0000, 0.0000, 5.4000, 2.2000, 1.0000, 10.8000, 3.6000, 3.1000, 10.1000, 0.0000, 0.3000, 2.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.3000, 0.0000, 0.0000, 7.6000, 3.6000, 0.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1000, 4.5000, 0.0000, 12.8000, 0.0000, 4.4000, 0.0000, 0.0000, 0.0000, 0.0000, 4.9000, 0.0000, 0.8000, 0.0000, 2.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 7.1000, 0.2000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 4.4000, 1.5000, 4.6000, 1.4000, 0.8000, 0.0000, 0.0000, 0.0000, 0.0000, 5.5000, 4.6000, 1.3000, 0.1000, 2.8000, 2.6000, 0.0000, 0.1000, 3.5000, 1.0000, 8.7000, 0.5000, 0.0000, 0.4000, 0.0000, 0.0000, 0.0000, 0.0000, 3.8000, 4.9000, 4.6000, 2.5000, 7.9000, 0.1000, 4.7000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.6000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.2000, 14.4000, 2.0000, 6.2000, 0.5000, 0.3000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 3.2000, 8.1000, 1.3000, 20.2000, 13.5000, 1.1000, 1.3000, 0.0000, 0.0000, 2.1000, 13.7000, 3.9000, 0.5000, 0.1000, 0.0000, 0.0000, 0.1000, 0.0000, 0.0000, 0.2000, 4.8000, 7.2000, 0.4000, 0.0000, 4.6000, 0.2000, 0.0000, 0.0000, 0.5000, 4.8000, 9.8000, 0.6000, 0.0000, 0.0000, 0.0000, 0.0000, 3.2000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5000, 8.5000, 0.5000, 1.9000, 1.2000, 0.0000, 3.2000, 1.7000, 12.3000, 1.9000, 0.0000, 4.3000, 3.6000, 1.1000, 6.7000, 5.4000, 0.0000, 0.0000, 0.9000, 10.0000, 7.8000, 0.1000, 1.3000, 0.5000, 0.1000, 0.2000, 0.5000, 0.0000, 7.2000, 0.0000, 0.0000, 10.2000, 9.7000, 0.2000, 0.1000, 0.9000, 3.5000, 1.2000, 4.9000, 4.6000, 3.5000, 1.1000, 5.8000, 0.4000, 0.0000, 0.0000, 0.6000, 0.1000, 1.2000, 0.8000, 9.4000, 1.5000, 0.1000, 0.1000, 0.2000, 0.9000, 4.8000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1000, 0.0000, 0.1000, 1.9000, 0.8000, 0.9000, 2.1000, 7.9000, 3.8000, 3.8000, 9.6000, 1.4000, 7.9000, 0.4000, 0.6000, 0.7000, 0.0000, 0.0000, 0.0000, 7.0000, 0.1000, 0.1000, 0.1000, 5.3000, 1.0000, 4.3000, 0.2000, 0.0000, 1.8000, 0.1000, 0.6000, 0.0000, 1.5000, 3.2000, 0.1000, 4.1000, 5.5000, 10.6000, 9.0000, 0.9000, 0.8000, 2.7000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4000, 0.6000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1000, 0.1000, 2.5000, 5.7000, 2.3000, 2.0000, 0.6000, 0.8000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 4.2000, 9.6000, 0.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.7000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 9.3000, 0.0000, 0.0000, 0.0000, 0.0000, 5.3000, 0.0000, 0.0000, 0.7000, 9.0000, 0.2000, 0.0000, 0.0000, 2.8000, 2.4000, 1.5000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 6.4000, 0.0000, 0.0000, 0.8000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 7.1000, 0.1000, 0.0000, 0.2000, 0.0000, 0.0000, 0.2000, 0.0000, 0.6000, 0.9000, 10.0000, 5.1000, 4.1000, 10.3000, 1.9000, 0.0000, 0.0000, 0.0000, 0.2000, 4.2000, 0.4000, 5.8000, 0.5000, 0.1000, 3.3000, 4.9000, 1.4000, 0.5000, 0.0000, 1.8000, 2.5000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1000, 1.4000, 0.0000, 2.4000, 7.6000, 5.2000, 11.4000, 0.1000, 1.1000, 0.7000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.8000, 0.0000, 2.3000, 0.4000, 0.0000, 0.0000, 0.0000, 0.0000, 5.2000, 2.2000, 0.0000, 10.0000, 5.3000, 1.2000, 8.0000, 30.7000, 2.9000, 0.0000, 0.0000, 0.0000, 6.8000, 0.0000, 0.0000, 0.0000, 1.4000, 0.5000, 4.1000, 0.1000, 10.6000, 11.2000, 2.5000, 6.2000, 5.3000, 4.5000, 12.8000, 0.1000, 1.0000, 0.0000, 0.0000, 22.7000, 2.5000, 5.5000, 3.7000, 0.8000, 0.0000, 1.6000, 1.7000, 3.8000, 0.2000, 0.3000, 0.0000, 0.4000, 0.0000, 0.2000, 0.5000, 1.0000, 16.3000, 0.3000, 4.3000, 14.8000, 0.0000, 2.7000, 0.0000, 2.8000, 3.2000, 5.3000, 2.1000, 0.0000, 2.2000, 0.4000, 0.3000, 0.1000, 0.0000, 0.0000, 1.8000, 0.5000, 9.4000, 11.4000, 2.4000, 9.2000, 1.1000, 11.1000, 6.4000, 8.3000, 15.3000, 0.1000, 6.8000, 2.9000, 0.0000, 0.3000, 0.4000, 0.2000, 3.3000, 6.2000, 1.0000, 9.0000, 5.5000, 0.0000, 0.0000, 3.0000, 1.1000, 0.0000, 10.8000, 0.0000, 7.1000, 2.0000, 1.6000, 7.2000, 9.4000, 0.9000, 6.1000, 1.4000, 2.5000, 0.6000, 8.1000, 0.9000, 2.8000, 5.0000, 3.3000, 2.1000, 9.5000, 0.0000, 6.0000, 7.0000, 0.0000, 2.2000, 1.8000, 0.2000, 1.1000, 5.2000, 0.0000, 0.3000, 1.6000, 0.8000, 0.4000, 0.0000, 0.2000, 1.4000, 5.9000, 7.1000, 7.0000, 1.9000, 1.5000, 0.1000, 0.3000, 5.6000, 4.1000, 4.8000, 1.5000, 1.5000, 2.7000, 11.4000, 8.6000, 3.7000, 5.7000, 1.3000, 13.4000, 5.6000, 5.9000, 5.4000, 5.3000, 0.1000, 0.1000, 0.2000, 0.0000, 0.5000, 0.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 4.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1000, 0.0000, 2.9000, 3.0000, 1.0000, 14.6000, 0.6000, 5.0000, 0.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1000, 1.6000, 2.2000, 0.0000, 0.0000, 0.6000, 0.0000, 0.2000, 2.4000, 0.3000, 0.0000, 0.3000, 5.8000, 1.6000, 1.6000, 5.7000, 2.8000, 1.9000, 0.6000, 2.8000, 0.0000, 8.8000, 2.5000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 3.1000, 0.0000, 0.0000, 0.0000, 0.2000, 0.5000, 0.0000, 3.7000, 5.0000, 10.2000, 1.2000, 0.4000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.6000, 0.3000, 0.0000, 0.0000, 2.2000, 8.4000, 11.5000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.8000, 12.4000, 2.8000, 3.9000, 10.1000, 4.5000, 6.6000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5000, 0.5000, 0.0000, 0.7000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.3000, 0.7000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 3.2000, 1.4000, 7.3000, 0.0000, 3.7000, 11.1000, 1.2000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1000, 8.3000, 2.2000, 6.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.2000, 0.0000, 0.0000, 0.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 11.6000, 5.9000, 0.0000, 0.0000, 8.9000, 17.1000, 0.1000, 4.9000, 2.3000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 14.5000, 2.7000, 1.9000, 3.3000, 0.0000, 0.0000, 19.9000, 2.4000, 4.1000, 2.0000, 4.2000, 0.9000, 0.3000, 0.0000, 0.1000, 0.3000, 0.0000, 3.1000, 2.5000, 0.0000, 1.6000, 3.8000, 8.2000, 5.7000, 7.7000, 0.3000, 0.0000, 5.4000, 7.9000, 1.3000, 10.0000, 0.6000, 0.7000, 0.0000, 0.0000, 0.0000, 0.9000, 0.0000, 0.0000, 0.1000, 2.6000, 6.3000, 4.7000, 0.7000, 0.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.2000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 2.3000, 2.0000, 0.0000, 3.1000, 0.9000, 0.1000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.3000, 0.4000, 7.5000, 12.4000, 2.9000, 0.5000, 7.6000, 1.6000, 2.3000, 0.0000, 0.0000, 2.1000, 2.3000, 8.0000, 2.1000, 1.7000, 0.0000, 0.0000, 17.9000, 4.5000, 0.5000, 0.7000, 0.3000, 0.0000, 1.1000, 0.1000, 0.0000, 0.0000, 1.1000, 0.1000, 0.0000, 1.2000, 0.0000, 1.2000, 0.8000, 0.7000, 0.0000, 0.1000, 0.2000, 0.2000, 0.0000, 0.4000, 1.3000, 0.0000, 0.0000, 0.0000, 0.1000, 1.4000
            };
            HydroNumerics.Time.Core.TimestampSeries precipitationTs = new HydroNumerics.Time.Core.TimestampSeries("PrecipitationTS", startTime, numberOfTimesteps, 1, HydroNumerics.Time.Core.TimestepUnit.Days, -99999, new HydroNumerics.Core.Unit("m3PrSec", 1, 0));
            //HydroNumerics.Time.Core.TimestampSeries precipitationTs = new HydroNumerics.Time.Core.TimestampSeries("PrecipitationTS", startTime, numberOfTimesteps, 1, HydroNumerics.Time.Core.TimestepUnit.Days, -99999, new HydroNumerics.Core.Unit("mmPrDay", 1.0/(1000*24*3600), 0));
            for (int i = 0; i < numberOfTimesteps; i++)
            {
                precipitationTs.Items[i].Value = precipitation[i] / (24 * 3600 * 1000);
                //precipitationTs.Items[i].Value = precipitation[i];
            }
            // --------------------------------------------------------------------


            // Upper Lake configuration
            //Lake upperLake = new Lake("Upper Lake", 2 * upperLakeGeometry.GetArea());
            Lake upperLake = new Lake("Upper Lake", upperLakeGeometry);

            upperLake.WaterLevel             = 6.1;
            upperLake.Depth                  = 2;
            upperLake.Output.LogAllChemicals = true;


            //Lake lowerLake = new Lake("lower Lake", 2 * lowerLakeGeometry.GetArea());
            Lake lowerLake = new Lake("lower Lake", lowerLakeGeometry);

            lowerLake.Depth                  = 2;
            lowerLake.WaterLevel             = 6.0;
            lowerLake.Output.LogAllChemicals = true;

            HydroNet.Core.Stream upperStream = new HydroNet.Core.Stream("The stream", 2000, 2, 1);
            upperStream.WaterLevel             = 6.0;
            upperStream.Output.LogAllChemicals = true;

            HydroNet.Core.Stream lowerStream = new HydroNet.Core.Stream("Lower Stream", 1000, 2, 1);
            lowerStream.WaterLevel             = 6.0;
            lowerStream.Output.LogAllChemicals = true;

            //SinkSourceBoundary upperLakePrecipitation = new SinkSourceBoundary(0.002 * contactPolygonUpperLake.GetArea() / (24 * 3600));
            SinkSourceBoundary upperLakePrecipitation = new SinkSourceBoundary(precipitationTs);

            upperLakePrecipitation.ContactGeometry = upperLakeGeometry;

            upperLakePrecipitation.Name = "Inflow to upperlake";


            //SinkSourceBoundary lowerLakePrecipitation = new SinkSourceBoundary(0.002 * contactPolygonLowerLake.GetArea()/ (24 * 3600));
            SinkSourceBoundary lowerLakePrecipitation = new SinkSourceBoundary(precipitationTs);

            lowerLakePrecipitation.ContactGeometry = lowerLakeGeometry;
            upperLakePrecipitation.Name            = "Inflow to lowerlake";

            // -------- Groundwater boundary under upper lake ----------
            GroundWaterBoundary groundWaterBoundaryUpperLake = new GroundWaterBoundary();

            groundWaterBoundaryUpperLake.Connection            = upperLake;
            groundWaterBoundaryUpperLake.ContactGeometry       = upperLakeGeometry;
            groundWaterBoundaryUpperLake.Distance              = 2.3;
            groundWaterBoundaryUpperLake.HydraulicConductivity = 1e-9;
            groundWaterBoundaryUpperLake.GroundwaterHead       = 5.0;
            groundWaterBoundaryUpperLake.Name = "Groundwater boundary under UpperLake";
            groundWaterBoundaryUpperLake.Name = "UpperGWBoundary";
            ((WaterPacket)groundWaterBoundaryUpperLake.WaterSample).AddChemical(ChemicalFactory.Instance.GetChemical(ChemicalNames.Radon), 2.3);
            ((WaterPacket)groundWaterBoundaryUpperLake.WaterSample).AddChemical(ChemicalFactory.Instance.GetChemical(ChemicalNames.Cl), 2.3);

            // -------- Groundwater boundary under lower lake ----------
            GroundWaterBoundary groundWaterBoundaryLowerLake = new GroundWaterBoundary();

            groundWaterBoundaryLowerLake.Connection            = lowerLake;
            groundWaterBoundaryLowerLake.ContactGeometry       = lowerLakeGeometry;
            groundWaterBoundaryLowerLake.Distance              = 2.3;
            groundWaterBoundaryLowerLake.HydraulicConductivity = 1e-12;
            groundWaterBoundaryLowerLake.GroundwaterHead       = 5.0;
            groundWaterBoundaryLowerLake.Name = "Groundwater boundary under LowerLake";
            groundWaterBoundaryLowerLake.Name = "LowerGWBoundary";

            //--- Ground water boundary upper Stream ------
            GroundWaterBoundary groundWaterBoundaryUpperStream = new GroundWaterBoundary();

            groundWaterBoundaryUpperStream.Connection            = upperStream;
            groundWaterBoundaryUpperStream.ContactGeometry       = upperStreamGeometry;
            groundWaterBoundaryUpperStream.Distance              = 2.3;
            groundWaterBoundaryUpperStream.HydraulicConductivity = 1e-12;
            groundWaterBoundaryUpperStream.GroundwaterHead       = 5.0;
            groundWaterBoundaryUpperStream.Name = "Groundwater boundary Upper Stream";
            groundWaterBoundaryUpperStream.Name = "UpperStreamGWBoundary";

            // ---------  Ground water boundary lower stream ------------------------------------------
            GroundWaterBoundary groundWaterBoundaryLowerStream = new GroundWaterBoundary();

            groundWaterBoundaryLowerStream.Connection            = lowerStream;
            groundWaterBoundaryLowerStream.ContactGeometry       = lowerStreamGeometry;
            groundWaterBoundaryLowerStream.Distance              = 2.3;
            groundWaterBoundaryLowerStream.HydraulicConductivity = 1e-12;
            groundWaterBoundaryLowerStream.GroundwaterHead       = 5.0;
            groundWaterBoundaryLowerStream.Name = "Groundwater boundary Lower Stream";
            groundWaterBoundaryLowerStream.Name = "LowerStreamGWBoundary";
            // ------------------------------------------------------------------------------

            upperLake.SurfaceArea = upperLakeGeometry;
            lowerLake.SurfaceArea = lowerLakeGeometry;
            upperLake.Precipitation.Add(upperLakePrecipitation);
            lowerLake.Precipitation.Add(lowerLakePrecipitation);

            upperLake.GroundwaterBoundaries.Add(groundWaterBoundaryUpperLake);
            upperStream.GroundwaterBoundaries.Add(groundWaterBoundaryUpperStream);
            lowerStream.GroundwaterBoundaries.Add(groundWaterBoundaryLowerStream);
            lowerLake.GroundwaterBoundaries.Add(groundWaterBoundaryLowerLake);


            upperLake.DownStreamConnections.Add(upperStream);
            upperStream.DownStreamConnections.Add(lowerStream);
            lowerStream.DownStreamConnections.Add(lowerLake);

            //Creating the model
            Model model = new Model();

            model._waterBodies.Add(upperLake);
            model._waterBodies.Add(upperStream);
            model._waterBodies.Add(lowerStream);
            model._waterBodies.Add(lowerLake);


            WaterPacket waterPacket = new WaterPacket(1000);

            waterPacket.AddChemical(ChemicalFactory.Instance.GetChemical(ChemicalNames.Cl), 9.2);

            WaterPacket waterpacketLowerLake = new WaterPacket(lowerLake.Volume);

            waterpacketLowerLake.AddChemical(ChemicalFactory.Instance.GetChemical(ChemicalNames.Cl), 4.2);


            model.SetState("MyState", startTime, waterPacket);
            lowerLake.SetState("MyState", startTime, waterpacketLowerLake);

            //model.SetState("kkk", startTime, new
            //upperLake.SetState("MyState", startTime, new WaterPacket(2));
            model.Name = "Lake model";
            model.Initialize();
            //model.Update(new DateTime(2001, 1, 1));
            return(model);
        }
Exemple #17
0
        public void KrabbenhoftExample()
        {
            Lake L = new Lake("Sparkling Lake", XYPolygon.GetSquare(0.81e6));

            L.Depth = 8.84e6 / L.Area;
            L.Output.LogAllChemicals = true;

            IsotopeWater LakeWater = new IsotopeWater(1);

            LakeWater.SetIsotopeRatio(5.75);
            TimestampSeries EvapoConcentrations = new TimestampSeries();

            EvapoConcentrations.AddSiValue(new DateTime(1985, 4, 1), 3.95);
            EvapoConcentrations.AddSiValue(new DateTime(1985, 5, 1), 13.9);
            EvapoConcentrations.AddSiValue(new DateTime(1985, 6, 1), 25.24);
            EvapoConcentrations.AddSiValue(new DateTime(1985, 7, 1), 23.97);
            EvapoConcentrations.AddSiValue(new DateTime(1985, 8, 1), 17.13);
            EvapoConcentrations.AddSiValue(new DateTime(1985, 9, 1), 10.40);
            EvapoConcentrations.AddSiValue(new DateTime(1985, 10, 1), 6.12);
            EvapoConcentrations.AddSiValue(new DateTime(1985, 10, 1), 33.24);
            EvapoConcentrations.AllowExtrapolation  = true;
            EvapoConcentrations.ExtrapolationMethod = ExtrapolationMethods.RecycleYear;
            LakeWater.EvaporationConcentration      = EvapoConcentrations;

            TimestampSeries PrecipConcentrations = new TimestampSeries();

            PrecipConcentrations.AddSiValue(new DateTime(1985, 1, 1), 22.8);
            PrecipConcentrations.AddSiValue(new DateTime(1985, 2, 1), 22.8);
            PrecipConcentrations.AddSiValue(new DateTime(1985, 3, 1), 22.8);
            PrecipConcentrations.AddSiValue(new DateTime(1985, 4, 1), 14.8);
            PrecipConcentrations.AddSiValue(new DateTime(1985, 5, 1), 10.7);
            PrecipConcentrations.AddSiValue(new DateTime(1985, 6, 1), 6.3);
            PrecipConcentrations.AddSiValue(new DateTime(1985, 7, 1), 5.1);
            PrecipConcentrations.AddSiValue(new DateTime(1985, 8, 1), 8.4);
            PrecipConcentrations.AddSiValue(new DateTime(1985, 9, 1), 11.1);
            PrecipConcentrations.AddSiValue(new DateTime(1985, 10, 1), 13.8);
            PrecipConcentrations.AddSiValue(new DateTime(1985, 10, 1), 21.9);
            PrecipConcentrations.AllowExtrapolation  = true;
            PrecipConcentrations.ExtrapolationMethod = ExtrapolationMethods.RecycleYear;

            TimespanSeries Precipitation = new TimespanSeries();

            Precipitation.Unit = new HydroNumerics.Core.Unit("cm/month", 1.0 / 100.0 / (86400.0 * 30.0), 0);
            Precipitation.AddValue(new DateTime(1985, 1, 1), new DateTime(1985, 3, 1), 0);
            Precipitation.AddValue(new DateTime(1985, 3, 1), new DateTime(1985, 3, 31), 12.5);
            Precipitation.AddValue(new DateTime(1985, 4, 1), new DateTime(1985, 4, 30), 7.1);
            Precipitation.AddValue(new DateTime(1985, 5, 1), new DateTime(1985, 5, 31), 7.6);
            Precipitation.AddValue(new DateTime(1985, 6, 1), new DateTime(1985, 6, 30), 8.8);
            Precipitation.AddValue(new DateTime(1985, 7, 1), new DateTime(1985, 7, 31), 8.6);
            Precipitation.AddValue(new DateTime(1985, 8, 1), new DateTime(1985, 8, 31), 12.7);
            Precipitation.AddValue(new DateTime(1985, 9, 1), new DateTime(1985, 9, 30), 11);
            Precipitation.AddValue(new DateTime(1985, 10, 1), new DateTime(1985, 10, 31), 6.2);
            Precipitation.AddValue(new DateTime(1985, 11, 1), new DateTime(1985, 11, 30), 4.8);
            Precipitation.AddValue(new DateTime(1985, 11, 30), new DateTime(1985, 12, 31), 0);
            Precipitation.AllowExtrapolation  = true;
            Precipitation.ExtrapolationMethod = ExtrapolationMethods.RecycleYear;

            Assert.AreEqual(79, 12 * Precipitation.GetValue(new DateTime(1985, 1, 1), new DateTime(1985, 12, 31)), 3);

            SourceBoundary Precip = new SourceBoundary(Precipitation);

            Precip.WaterSample = new IsotopeWater(1);
            Precip.AddChemicalConcentrationSeries(ChemicalFactory.Instance.GetChemical(ChemicalNames.IsotopeFraction), PrecipConcentrations);

            TimespanSeries Evaporation = new TimespanSeries();

            Evaporation.Unit = new HydroNumerics.Core.Unit("cm/month", 1.0 / 100.0 / (86400.0 * 30.0), 0);
            Evaporation.AddValue(new DateTime(1985, 1, 1), new DateTime(1985, 4, 1), 0);
            Evaporation.AddValue(new DateTime(1985, 4, 1), new DateTime(1985, 4, 30), 2.8);
            Evaporation.AddValue(new DateTime(1985, 5, 1), new DateTime(1985, 5, 31), 7.0);
            Evaporation.AddValue(new DateTime(1985, 6, 1), new DateTime(1985, 6, 30), 10.5);
            Evaporation.AddValue(new DateTime(1985, 7, 1), new DateTime(1985, 7, 31), 11.1);
            Evaporation.AddValue(new DateTime(1985, 8, 1), new DateTime(1985, 8, 31), 10.0);
            Evaporation.AddValue(new DateTime(1985, 9, 1), new DateTime(1985, 9, 30), 7.0);
            Evaporation.AddValue(new DateTime(1985, 10, 1), new DateTime(1985, 10, 31), 4.7);
            Evaporation.AddValue(new DateTime(1985, 11, 1), new DateTime(1985, 11, 30), 0.6);
            Evaporation.AddValue(new DateTime(1985, 11, 30), new DateTime(1985, 12, 31), 0);
            Evaporation.AllowExtrapolation  = true;
            Evaporation.ExtrapolationMethod = ExtrapolationMethods.RecycleYear;
            EvaporationRateBoundary erb = new EvaporationRateBoundary(Evaporation);

            Assert.AreEqual(54, 12 * Evaporation.GetValue(new DateTime(1985, 1, 1), new DateTime(1985, 12, 31)), 3);


            GroundWaterBoundary grb = new GroundWaterBoundary(L, 1e-7, 1, 1, (XYPolygon)L.Geometry);

            grb.FlowType  = GWType.Flow;
            grb.WaterFlow = new TimespanSeries();
            grb.WaterFlow.AddSiValue(DateTime.MinValue, DateTime.MaxValue, Evaporation.Unit.ToSiUnit(29 / 12) * L.Area);
            IsotopeWater gwsp25 = new IsotopeWater(1);

            gwsp25.SetIsotopeRatio(11.5);
            grb.WaterSample = gwsp25;

            GroundWaterBoundary gout = new GroundWaterBoundary(L, 1e-7, 1, -1, (XYPolygon)L.Geometry);

            gout.FlowType  = GWType.Flow;
            gout.WaterFlow = new TimespanSeries();
            gout.WaterFlow.AddSiValue(DateTime.MinValue, DateTime.MaxValue, -Evaporation.Unit.ToSiUnit(54 / 12) * L.Area);

            DateTime Start = new DateTime(1985, 1, 1);

            L.Precipitation.Add(Precip);
            Precip.ContactGeometry = L.Geometry;
            L.EvaporationBoundaries.Add(erb);
            erb.ContactGeometry = L.Geometry;
            L.GroundwaterBoundaries.Add(grb);
            L.GroundwaterBoundaries.Add(gout);

            Model M = new Model();

            M.WaterBodies.Add(L);
            M.SetState("Initial", Start, LakeWater);

            L.Depth *= 1.5;
            ((IsotopeWater)L.CurrentStoredWater).CurrentTime = Start;
            M.MoveInTime(new DateTime(1985, 12, 31), TimeSpan.FromDays(10));

            M.Save(@"..\..\..\TestData\Krabbenhoft.xml");
        }
        public void TestMethod1()
        {
            Lake Vedsted = LakeFactory.GetLake("Vedsted Sø");

            Vedsted.Depth      = 5;
            Vedsted.WaterLevel = 45.7;


            //Create and add precipitation boundary
            TimespanSeries Precipitation = new TimespanSeries();

            double[] values = new double[] { 108, 83, 73, 52, 61, 86, 99, 101, 75, 108, 85, 101 };
            LakeVedsted.AddMonthlyValues(Precipitation, 2007, values);
            SinkSourceBoundary Precip = new SinkSourceBoundary(Precipitation);

            Precip.ContactGeometry = Vedsted.SurfaceArea;
            Vedsted.Sources.Add(Precip);

            //Create and add evaporation boundary
            TimespanSeries Evaporation = new TimespanSeries();

            double[] values2 = new double[] { 4, 11, 34, 66, 110, 118, 122, 103, 61, 26, 7, 1 };
            LakeVedsted.AddMonthlyValues(Evaporation, 2007, values2);
            EvaporationRateBoundary eva = new EvaporationRateBoundary(Evaporation);

            eva.ContactGeometry = Vedsted.SurfaceArea;
            Vedsted.EvaporationBoundaries.Add(eva);

            //Create and add a discharge boundary
            TimestampSeries Discharge = new TimestampSeries();

            Discharge.AddSiValue(new DateTime(2007, 3, 12), 6986 / TimeSpan.FromDays(365).TotalSeconds);
            Discharge.AddSiValue(new DateTime(2007, 4, 3), 5894 / TimeSpan.FromDays(365).TotalSeconds);
            Discharge.AddSiValue(new DateTime(2007, 4, 25), 1205 / TimeSpan.FromDays(365).TotalSeconds);
            Discharge.RelaxationFactor   = 1;
            Discharge.AllowExtrapolation = true;
            Assert.AreEqual(Discharge.GetValue(new DateTime(2007, 4, 25)), Discharge.GetValue(new DateTime(2007, 6, 25)), 0.0000001);
            SinkSourceBoundary Kilde = new SinkSourceBoundary(Discharge);

            Vedsted.Sources.Add(Kilde);

            //Add a groundwater boundary
            GroundWaterBoundary gwb = new GroundWaterBoundary(Vedsted, 1e-5, 1, 46, (XYPolygon)Vedsted.Geometry);

            DateTime Start = new DateTime(2007, 1, 1);

            //Add the chemicals
            Chemical cl = ChemicalFactory.Instance.GetChemical(ChemicalNames.Cl);

            //Tell the lake to log the chemicals
            Vedsted.Output.LogChemicalConcentration(ChemicalFactory.Instance.GetChemical(ChemicalNames.IsotopeFraction));
            Vedsted.Output.LogChemicalConcentration(cl);

            IsotopeWater Iw = new IsotopeWater(1);

            Iw.SetIsotopeRatio(10);
            Iw.AddChemical(cl, 0.1);
            Precip.WaterSample = Iw.DeepClone();

            //Evaporate some of the water to get realistic initial conditions
            Iw.Evaporate(Iw.Volume / 2);
            Vedsted.SetState("Initial", Start, Iw.DeepClone());
            Kilde.WaterSample = Iw.DeepClone();

            Iw.Evaporate(Iw.Volume / 2);
            gwb.WaterSample = Iw.DeepClone();

            //Add to an engine
            Model Engine = new Model();

            Engine.Name = "Vedsted-opsætning";
            Engine._waterBodies.Add(Vedsted);

            //Set initial state
            Engine.SetState("Initial", Start, new WaterPacket(1));

            Engine.Save(@"c:\temp\setup.xml");
        }
Exemple #19
0
        public void TestMethod1()
        {
            Lake Gjeller = LakeFactory.GetLake("Gjeller Sø");

            Gjeller.Depth      = 1.2;
            Gjeller.WaterLevel = 0.4;

            WaterPacket GjellerWater = new WaterPacket(1, 1);

            GjellerWater.AddChemical(ChemicalFactory.Instance.GetChemical(ChemicalNames.Cl), 1);

            TimeSeriesGroup climate = TimeSeriesGroupFactory.Create("climate.xts");

            foreach (var I in climate.Items)
            {
                I.ExtrapolationMethod = ExtrapolationMethods.RecycleYear;
                I.AllowExtrapolation  = true;
            }

            EvaporationRateBoundary evap = new EvaporationRateBoundary((TimespanSeries)climate.Items[1]);

            evap.ContactGeometry = Gjeller.Geometry;
            Gjeller.EvaporationBoundaries.Add(evap);

            SinkSourceBoundary precip = new SinkSourceBoundary(climate.Items[0]);

            precip.ContactGeometry = Gjeller.Geometry;
            Gjeller.Precipitation.Add(precip);
            precip.ID          = 2;
            precip.WaterSample = GjellerWater.DeepClone();
            precip.WaterSample.IDForComposition = precip.ID;;

            GroundWaterBoundary GWIN = new GroundWaterBoundary(Gjeller, 1e-5, 2, 0.45, XYPolygon.GetSquare(Gjeller.Area / 2));

            GWIN.WaterSample = GjellerWater.DeepClone();
            GWIN.ID          = 3;
            GWIN.WaterSample.IDForComposition = GWIN.ID;
            GWIN.Name = "Inflow";
            Gjeller.GroundwaterBoundaries.Add(GWIN);

            GroundWaterBoundary GWout = new GroundWaterBoundary(Gjeller, 1e-5, 2, 0.35, XYPolygon.GetSquare(Gjeller.Area / 2));

            GWout.Name = "Outflow";
            Gjeller.GroundwaterBoundaries.Add(GWout);


            TimespanSeries pumping = new TimespanSeries();

            pumping.AddSiValue(new DateTime(1990, 01, 01), new DateTime(2010, 01, 01), 0);
            pumping.AddSiValue(new DateTime(2010, 01, 01), new DateTime(2010, 05, 01), 0.05);
            pumping.AddSiValue(new DateTime(2010, 05, 01), DateTime.Now, 0);


            SinkSourceBoundary DrainageWater = new SinkSourceBoundary(pumping);

            DrainageWater.ID          = 4;
            DrainageWater.WaterSample = GjellerWater.DeepClone();
            DrainageWater.WaterSample.IDForComposition = DrainageWater.ID;
            DrainageWater.Name = "Indpumpet Drænvand";
            Gjeller.Sources.Add(DrainageWater);


            var tsg = TimeSeriesGroupFactory.Create(@"..\..\..\TestData\GjellerObservations.xts");

            foreach (var ts in tsg.Items)
            {
                Chemical c = new Chemical(ts.Name, 1);
                Gjeller.RealData.AddChemicalTimeSeries(c);
                Gjeller.RealData.ChemicalConcentrations[c] = (TimestampSeries)ts;
            }

            Model M = new Model();

            M._waterBodies.Add(Gjeller);
            Gjeller.Output.LogAllChemicals = true;
            Gjeller.Output.LogComposition  = true;

            M.SetState("Initial", new DateTime(1995, 1, 1), GjellerWater);


            M.MoveInTime(DateTime.Now, TimeSpan.FromDays(10));
            M.Save(@"..\..\..\TestData\Gjeller.xml");
        }
Exemple #20
0
        private Model CreateHydroNetModel()
        {
            // Upper Lake configuration
            Lake upperLake = new Lake("Upper Lake", 1000);

            upperLake.WaterLevel             = 6.1;
            upperLake.Output.LogAllChemicals = true;

            Lake lowerLake = new Lake("lower Lake", 1000);

            lowerLake.WaterLevel             = 6.0;
            lowerLake.Output.LogAllChemicals = true;

            Stream upperStream = new Stream("The stream", 2000, 2, 1);

            upperStream.WaterLevel             = 6.0;
            upperStream.Output.LogAllChemicals = true;

            Stream lowerStream = new Stream("Lower Stream", 1000, 2, 1);

            lowerStream.WaterLevel             = 6.0;
            lowerStream.Output.LogAllChemicals = true;

            SinkSourceBoundary upperLakeInflow = new SinkSourceBoundary(0.001);

            upperLakeInflow.Name = "Inflow to upperlake";


            SinkSourceBoundary lowerLakeInflow = new SinkSourceBoundary(0.001);

            upperLakeInflow.Name = "Inflow to lowerlake";

            // -------- Groundwater boundary under upper lake ----------
            HydroNumerics.Geometry.XYPolygon contactPolygonUpperLake = new HydroNumerics.Geometry.XYPolygon();
            contactPolygonUpperLake.Points.Add(new HydroNumerics.Geometry.XYPoint(535.836, 2269.625));
            contactPolygonUpperLake.Points.Add(new HydroNumerics.Geometry.XYPoint(675.768, 2187.713));
            contactPolygonUpperLake.Points.Add(new HydroNumerics.Geometry.XYPoint(771.331, 2177.474));
            contactPolygonUpperLake.Points.Add(new HydroNumerics.Geometry.XYPoint(887.372, 2184.300));
            contactPolygonUpperLake.Points.Add(new HydroNumerics.Geometry.XYPoint(935.154, 2255.973));
            contactPolygonUpperLake.Points.Add(new HydroNumerics.Geometry.XYPoint(945.392, 2385.666));
            contactPolygonUpperLake.Points.Add(new HydroNumerics.Geometry.XYPoint(931.741, 2505.119));
            contactPolygonUpperLake.Points.Add(new HydroNumerics.Geometry.XYPoint(877.133, 2546.075));
            contactPolygonUpperLake.Points.Add(new HydroNumerics.Geometry.XYPoint(812.287, 2638.225));
            contactPolygonUpperLake.Points.Add(new HydroNumerics.Geometry.XYPoint(696.246, 2675.768));
            contactPolygonUpperLake.Points.Add(new HydroNumerics.Geometry.XYPoint(638.225, 2627.986));
            contactPolygonUpperLake.Points.Add(new HydroNumerics.Geometry.XYPoint(573.379, 2587.031));

            GroundWaterBoundary groundWaterBoundaryUpperLake = new GroundWaterBoundary();

            groundWaterBoundaryUpperLake.Connection            = upperLake;
            groundWaterBoundaryUpperLake.ContactGeometry       = contactPolygonUpperLake;
            groundWaterBoundaryUpperLake.Distance              = 2.3;
            groundWaterBoundaryUpperLake.HydraulicConductivity = 1e-9;
            groundWaterBoundaryUpperLake.GroundwaterHead       = 5.0;
            groundWaterBoundaryUpperLake.Name = "Groundwater boundary under UpperLake";
            groundWaterBoundaryUpperLake.Name = "UpperGWBoundary";
            ((WaterPacket)groundWaterBoundaryUpperLake.WaterSample).AddChemical(ChemicalFactory.Instance.GetChemical(ChemicalNames.Radon), 2.3);
            ((WaterPacket)groundWaterBoundaryUpperLake.WaterSample).AddChemical(ChemicalFactory.Instance.GetChemical(ChemicalNames.Cl), 2.3);

            // -------- Groundwater boundary under lower lake ----------
            HydroNumerics.Geometry.XYPolygon contactPolygonLowerLake = new HydroNumerics.Geometry.XYPolygon();
            contactPolygonLowerLake.Points.Add(new HydroNumerics.Geometry.XYPoint(1935.154, 1150.171));
            contactPolygonLowerLake.Points.Add(new HydroNumerics.Geometry.XYPoint(1901.024, 1058.020));
            contactPolygonLowerLake.Points.Add(new HydroNumerics.Geometry.XYPoint(1877.133, 965.870));
            contactPolygonLowerLake.Points.Add(new HydroNumerics.Geometry.XYPoint(1894.198, 897.611));
            contactPolygonLowerLake.Points.Add(new HydroNumerics.Geometry.XYPoint(1938.567, 808.874));
            contactPolygonLowerLake.Points.Add(new HydroNumerics.Geometry.XYPoint(2023.891, 761.092));
            contactPolygonLowerLake.Points.Add(new HydroNumerics.Geometry.XYPoint(2116.041, 740.614));
            contactPolygonLowerLake.Points.Add(new HydroNumerics.Geometry.XYPoint(2232.082, 747.440));
            contactPolygonLowerLake.Points.Add(new HydroNumerics.Geometry.XYPoint(2327.645, 808.874));
            contactPolygonLowerLake.Points.Add(new HydroNumerics.Geometry.XYPoint(2389.078, 969.283));
            contactPolygonLowerLake.Points.Add(new HydroNumerics.Geometry.XYPoint(2372.014, 1109.215));
            contactPolygonLowerLake.Points.Add(new HydroNumerics.Geometry.XYPoint(2262.799, 1218.430));
            contactPolygonLowerLake.Points.Add(new HydroNumerics.Geometry.XYPoint(2105.802, 1235.495));
            contactPolygonLowerLake.Points.Add(new HydroNumerics.Geometry.XYPoint(1982.935, 1225.256));

            GroundWaterBoundary groundWaterBoundaryLowerLake = new GroundWaterBoundary();

            groundWaterBoundaryLowerLake.Connection            = lowerLake;
            groundWaterBoundaryLowerLake.ContactGeometry       = contactPolygonLowerLake;
            groundWaterBoundaryLowerLake.Distance              = 2.3;
            groundWaterBoundaryLowerLake.HydraulicConductivity = 1e-9;
            groundWaterBoundaryLowerLake.GroundwaterHead       = 5.0;
            groundWaterBoundaryLowerLake.Name = "Groundwater boundary under LowerLake";
            groundWaterBoundaryLowerLake.Name = "LowerGWBoundary";

            //--- Ground water boundary upper Stream ------
            HydroNumerics.Geometry.XYPolygon contactPolygonUpperStream = new HydroNumerics.Geometry.XYPolygon();
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(863.481, 2177.474));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(914.676, 2129.693));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(965.870, 2071.672));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(976.109, 2027.304));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(976.109, 1989.761));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1006.826, 1959.044));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1051.195, 1918.089));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1095.563, 1877.133));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1126.280, 1808.874));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1187.713, 1781.570));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1228.669, 1730.375));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1262.799, 1665.529));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1283.276, 1597.270));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1317.406, 1535.836));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1341.297, 1484.642));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1389.078, 1457.338));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1423.208, 1440.273));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1477.816, 1402.730));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1511.945, 1358.362));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1539.249, 1327.645));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1566.553, 1354.949));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1535.836, 1406.143));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1508.532, 1457.338));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1440.273, 1522.184));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1368.601, 1580.205));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1327.645, 1631.399));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1307.167, 1696.246));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1269.625, 1767.918));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1221.843, 1819.113));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1191.126, 1843.003));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1136.519, 1894.198));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1088.737, 1935.154));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1061.433, 1976.109));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1030.717, 2040.956));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1013.652, 2105.802));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(972.696, 2177.474));
            contactPolygonUpperStream.Points.Add(new HydroNumerics.Geometry.XYPoint(918.089, 2228.669));

            GroundWaterBoundary groundWaterBoundaryUpperStream = new GroundWaterBoundary();

            groundWaterBoundaryUpperStream.Connection            = upperStream;
            groundWaterBoundaryUpperStream.ContactGeometry       = contactPolygonUpperStream;
            groundWaterBoundaryUpperStream.Distance              = 2.3;
            groundWaterBoundaryUpperStream.HydraulicConductivity = 1e-9;
            groundWaterBoundaryUpperStream.GroundwaterHead       = 5.0;
            groundWaterBoundaryUpperStream.Name = "Groundwater boundary Upper Stream";
            groundWaterBoundaryUpperStream.Name = "UpperStreamGWBoundary";

            // ---------  Ground water boundary lower stream ------------------------------------------
            HydroNumerics.Geometry.XYPolygon contactPolygonLowerStream = new HydroNumerics.Geometry.XYPolygon();
            contactPolygonLowerStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1904.437, 1081.911));
            contactPolygonLowerStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1921.502, 1153.584));
            contactPolygonLowerStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1771.331, 1255.973));
            contactPolygonLowerStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1573.379, 1354.949));
            contactPolygonLowerStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1542.662, 1324.232));
            contactPolygonLowerStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1597.270, 1273.038));
            contactPolygonLowerStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1709.898, 1215.017));
            contactPolygonLowerStream.Points.Add(new HydroNumerics.Geometry.XYPoint(1839.590, 1143.345));

            GroundWaterBoundary groundWaterBoundaryLowerStream = new GroundWaterBoundary();

            groundWaterBoundaryLowerStream.Connection            = lowerStream;
            groundWaterBoundaryLowerStream.ContactGeometry       = contactPolygonLowerStream;
            groundWaterBoundaryLowerStream.Distance              = 2.3;
            groundWaterBoundaryLowerStream.HydraulicConductivity = 1e-9;
            groundWaterBoundaryLowerStream.GroundwaterHead       = 5.0;
            groundWaterBoundaryLowerStream.Name = "Groundwater boundary Lower Stream";
            groundWaterBoundaryLowerStream.Name = "LowerStreamGWBoundary";
            // ------------------------------------------------------------------------------

            //upperLake.Sources.Add(upperLakeInflow);
            //lowerLake.Sources.Add(lowerLakeInflow);

            upperLake.GroundwaterBoundaries.Add(groundWaterBoundaryUpperLake);
            upperStream.GroundwaterBoundaries.Add(groundWaterBoundaryUpperStream);
            lowerStream.GroundwaterBoundaries.Add(groundWaterBoundaryLowerStream);
            lowerLake.GroundwaterBoundaries.Add(groundWaterBoundaryLowerLake);



            upperLake.DownStreamConnections.Add(upperStream);
            upperStream.DownStreamConnections.Add(lowerStream);
            lowerStream.DownStreamConnections.Add(lowerLake);

            //Creating the model
            Model model = new Model();

            model._waterBodies.Add(upperLake);
            model._waterBodies.Add(upperStream);
            model._waterBodies.Add(lowerStream);
            model._waterBodies.Add(lowerLake);


            DateTime startTime = new DateTime(2000, 1, 1);

            model.SetState("MyState", startTime, new WaterPacket(1000));
            //upperLake.SetState("MyState", startTime, new WaterPacket(2));
            model.Name = "Lake model";
            model.Initialize();
            //model.Update(new DateTime(2001, 1, 1));
            return(model);
        }
Exemple #21
0
        public void Initialize(System.Collections.Hashtable properties)
        {
            if (!properties.Contains("InputFilename"))
            {
                throw new Exception("Missing key \"InputFilename\" in parameter to method HydroNumerics.HydroNet.OpenMI.EngineWrapper.Initialize(...)");
            }

            if (!properties.Contains("TimestepLength"))
            {
                throw new Exception("Missing key \"TimestepLength\" in parameter to method HydroNumerics.HydroNet.OpenMI.EngineWrapper.Initialize(...)");
            }


            inputFilename = (string)properties["InputFilename"];

            double dt = Convert.ToDouble((string)properties["TimestepLength"]);

            timestepLength = System.TimeSpan.FromSeconds(dt);


            // because the OpenMI configuration editor works makes paths relative to locations of OMI files or the configuration editor itselves, thigs may go wrong.
            // In order to overcome this problem, the full path for the input file is saves, so when the Finish method is invoked, the output is save to the input file again and not
            // a file at some random location :-). See below
            System.IO.FileInfo fileInfo = new System.IO.FileInfo(inputFilename);
            inputFilename = fileInfo.FullName;

            model = HydroNumerics.HydroNet.Core.ModelFactory.GetModel(inputFilename);
            model.Initialize();
            //model = ModelFactory.GetModel(inputFilename);


            foreach (var wb in model._waterBodies)
            {
                //Build exchangeitems from groundwater boundaries
                foreach (var gwb in wb.GroundwaterBoundaries)
                {
                    GroundWaterBoundary GWB = gwb as GroundWaterBoundary;
                    if (GWB != null)
                    {
                        ElementSet elementSet = new ElementSet();
                        elementSet.ID               = GWB.Name;
                        elementSet.Description      = "Location: " + GWB.Name;
                        elementSet.SpatialReference = new SpatialReference("Undefined");
                        Element element = new Element();
                        element.ID = GWB.Name;

                        elementSet.ElementType = ElementType.XYPolygon;
                        foreach (XYPoint xyPoint in ((XYPolygon)GWB.ContactGeometry).Points)
                        {
                            element.AddVertex(new Vertex(xyPoint.X, xyPoint.Y, 0));
                        }

                        elementSet.AddElement(element);

                        //Head
                        HydroNumerics.OpenMI.Sdk.Backbone.Dimension dimension = new HydroNumerics.OpenMI.Sdk.Backbone.Dimension();
                        dimension.Length = 1;

                        HydroNumerics.OpenMI.Sdk.Backbone.Unit unit = new HydroNumerics.OpenMI.Sdk.Backbone.Unit();
                        unit.ID                   = "m";
                        unit.Description          = "meter";
                        unit.ConversionFactorToSI = 1;
                        unit.OffSetToSI           = 0;

                        Quantity quantity = new Quantity();
                        quantity.ID          = "Head";
                        quantity.Description = "Head at:" + GWB.Name;
                        quantity.Dimension   = dimension;
                        quantity.Unit        = unit;

                        InputExchangeItem inputExchangeItem = new InputExchangeItem();
                        inputExchangeItem.Quantity   = quantity;
                        inputExchangeItem.ElementSet = elementSet;
                        inputExchangeItems.Add(inputExchangeItem);

                        HeadBoundaries.Add(GWB.Name, GWB);

                        //Leakage
                        Quantity leakage = new Quantity("Leakage");
                        leakage.Description = "Leakage at:" + GWB.Name;
                        var leakageDimension = new HydroNumerics.OpenMI.Sdk.Backbone.Dimension();
                        leakageDimension.Length = 3;
                        leakageDimension.Time   = -1;
                        leakage.Dimension       = leakageDimension;
                        leakage.Unit            = new HydroNumerics.OpenMI.Sdk.Backbone.Unit("m3/s", 1, 0);

                        OutputExchangeItem outputitem = new OutputExchangeItem();
                        outputitem.Quantity   = leakage;
                        outputitem.ElementSet = elementSet;
                        outputExchangeItems.Add(outputitem);
                        LeakageBoundaries.Add(GWB.Name, GWB);
                    }
                }

                foreach (var S in wb.Sources)
                {
                    ElementSet elementSet = new ElementSet();
                    elementSet.ID               = S.Name;
                    elementSet.Description      = "Location: " + S.Name;
                    elementSet.SpatialReference = new SpatialReference("Undefined");
                    Element element = new Element();
                    element.ID = S.Name;

                    elementSet.ElementType = ElementType.IDBased;


                    //Flow
                    Quantity leakage = new Quantity("Flow");
                    leakage.Description = "Flow at:" + S.Name;
                    var leakageDimension = new HydroNumerics.OpenMI.Sdk.Backbone.Dimension();
                    leakageDimension.Length = 3;
                    leakageDimension.Time   = -1;
                    leakage.Dimension       = leakageDimension;
                    leakage.Unit            = new HydroNumerics.OpenMI.Sdk.Backbone.Unit("m3/s", 1, 0);

                    InputExchangeItem outputitem = new InputExchangeItem();
                    outputitem.Quantity   = leakage;
                    outputitem.ElementSet = elementSet;
                    inputExchangeItems.Add(outputitem);
                    FlowBoundaries.Add(S.Name, (SinkSourceBoundary)S);
                }
            }



            //foreach (var exchangeItem in model.ExchangeItems)
            //{
            //    HydroNumerics.OpenMI.Sdk.Backbone.Dimension dimention = new HydroNumerics.OpenMI.Sdk.Backbone.Dimension();
            //    dimention.AmountOfSubstance = exchangeItem.Unit.Dimension.AmountOfSubstance;
            //    dimention.Currency = exchangeItem.Unit.Dimension.Currency;
            //    dimention.ElectricCurrent = exchangeItem.Unit.Dimension.ElectricCurrent;
            //    dimention.Length = exchangeItem.Unit.Dimension.AmountOfSubstance;
            //    dimention.LuminousIntensity = exchangeItem.Unit.Dimension.Length;
            //    dimention.Mass = exchangeItem.Unit.Dimension.LuminousIntensity;
            //    dimention.AmountOfSubstance = exchangeItem.Unit.Dimension.Mass;
            //    dimention.Time = exchangeItem.Unit.Dimension.Time;

            //    HydroNumerics.OpenMI.Sdk.Backbone.Unit unit = new HydroNumerics.OpenMI.Sdk.Backbone.Unit();
            //    unit.ID = exchangeItem.Unit.ID;
            //    unit.Description = exchangeItem.Unit.Description;
            //    unit.ConversionFactorToSI = exchangeItem.Unit.ConversionFactorToSI;
            //    unit.OffSetToSI = unit.OffSetToSI;

            //    Quantity quantity = new Quantity();
            //    quantity.ID = exchangeItem.Quantity;
            //    quantity.Description = exchangeItem.Description;
            //    quantity.Dimension = dimention;
            //    quantity.Unit = unit;

            //    ElementSet elementSet = new ElementSet();
            //    elementSet.ID = exchangeItem.Location;
            //    elementSet.Description = "Location: " + exchangeItem.Location;
            //    elementSet.SpatialReference = new SpatialReference("Undefined");
            //    Element element = new Element();
            //    element.ID = exchangeItem.Location;

            //    if (exchangeItem.Geometry is XYPolygon)
            //    {
            //        elementSet.ElementType = ElementType.XYPolygon;
            //        foreach (XYPoint xyPoint in ((XYPolygon)exchangeItem.Geometry).Points)
            //        {
            //            element.AddVertex(new Vertex(xyPoint.X, xyPoint.Y, 0));
            //        }
            //    }
            //    else if (exchangeItem.Geometry is XYPoint)
            //    {
            //        throw new NotImplementedException();
            //    }
            //    else if (exchangeItem.Geometry is XYPolyline)
            //    {
            //        throw new NotImplementedException();
            //    }
            //    else
            //    {
            //        elementSet.ElementType = global::OpenMI.Standard.ElementType.IDBased;
            //    }


            //    elementSet.AddElement(element);


            //    if (exchangeItem.IsOutput)
            //    {
            //        OutputExchangeItem outputExchangeItem = new OutputExchangeItem();
            //        outputExchangeItem.Quantity = quantity;
            //        outputExchangeItem.ElementSet = elementSet;
            //        outputExchangeItems.Add(outputExchangeItem);
            //    }
            //    if (exchangeItem.IsInput)
            //    {
            //        InputExchangeItem inputExchangeItem = new InputExchangeItem();
            //        inputExchangeItem.Quantity = quantity;
            //        inputExchangeItem.ElementSet = elementSet;
            //        inputExchangeItems.Add(inputExchangeItem);
            //    }
            //}
        }
    public void Vedsted3()
    {
      WaterPacket GroundWater = new WaterPacket(1);
      GroundWater.AddChemical(ChemicalFactory.Instance.GetChemical(ChemicalNames.Radon), 0.01);

      Model m = ModelFactory.GetModel(testDataPath + "VedstedNoGroundwater.xml");
      Lake Vedsted = (Lake)m._waterBodies[0];

      Vedsted.Precipitation.First().WaterSample.IDForComposition = 2;
      Vedsted.Sources.First().WaterSample.IDForComposition = 3;

      GroundWaterBoundary Inflow = new GroundWaterBoundary(Vedsted,1e-6,1,46.7,XYPolygon.GetSquare(Vedsted.Area/2));
      Inflow.Name ="Inflow";
      Inflow.ID =4;
      Inflow.WaterSample = GroundWater;
      Inflow.WaterSample.IDForComposition = 4;

      GroundWaterBoundary Outflow = new GroundWaterBoundary(Vedsted, 1e-6, 1, 44.7, XYPolygon.GetSquare(Vedsted.Area / 2));
      Outflow.Name = "Outflow";
      Outflow.ID = 5;
      Outflow.WaterSample = GroundWater;

      Vedsted.GroundwaterBoundaries.Add(Inflow);
      Vedsted.GroundwaterBoundaries.Add(Outflow);

      DateTime End = new DateTime(2009, 12, 31);

      m.MoveInTime(End, TimeSpan.FromDays(30));

      ModelFactory.SaveModel(testDataPath + "Vedsted3.xml", m);


    }
    public void GroundWaterTest()
    {
      WaterPacket GroundWater = new WaterPacket(1);
//      GroundWater.AddChemical(ChemicalFactory.Instance.GetChemical(ChemicalNames.Radon), 0.01);
      GroundWater.IDForComposition = 4;

      Lake Vedsted= LakeFactory.GetLake("Vedsted Sø");
      Vedsted.Depth = 5;
      Vedsted.WaterLevel = 45.7;

      //Create and add a discharge boundary
      TimestampSeries Discharge = new TimestampSeries();
      Discharge.AddSiValue(new DateTime(2007, 3, 12), 6986 / TimeSpan.FromDays(365).TotalSeconds);
      Discharge.AddSiValue(new DateTime(2007, 4, 3), 5894 / TimeSpan.FromDays(365).TotalSeconds);
      Discharge.AddSiValue(new DateTime(2007, 4, 25), 1205 / TimeSpan.FromDays(365).TotalSeconds);
      Discharge.RelaxationFactor = 1;
      Discharge.AllowExtrapolation = true;
      Assert.AreEqual(Discharge.GetValue(new DateTime(2007, 4, 25)), Discharge.GetValue(new DateTime(2007, 6, 25)), 0.0000001);
      SinkSourceBoundary Kilde = new SinkSourceBoundary(Discharge);
      Kilde.Name = "Small spring";
      Kilde.ID = 3;
      Kilde.WaterSample.IDForComposition = 3;
      Vedsted.Sources.Add(Kilde);


      Vedsted.Output.LogAllChemicals = true;
      Vedsted.Output.LogComposition = true;

      //Add to an engine
      Model Engine = new Model();
      Engine.Name = "Vedsted-opsætning";
      Engine._waterBodies.Add(Vedsted);

      //Set initial state
      WaterPacket InitialStateWater = new WaterPacket(1);
      InitialStateWater.IDForComposition = 1;
      DateTime Start = new DateTime(2007, 1, 1);
      DateTime End = new DateTime(2007, 12, 31);
      Engine.SetState("Initial", Start, InitialStateWater);
      Engine.SimulationEndTime = End;
      Engine.TimeStep = TimeSpan.FromDays(30);

      Engine.MoveInTime(End, TimeSpan.FromDays(30));
      Vedsted.Name = "Vedsted step 1";
      Engine.Save(testDataPath + Vedsted.Name + ".xml");
      Engine.RestoreState("Initial");

      //Create and add precipitation boundary
      TimespanSeries Precipitation = new TimespanSeries();
      Precipitation.ExtrapolationMethod = ExtrapolationMethods.RecycleYear;
      Precipitation.AllowExtrapolation = true;
      double[] values = new double[] { 108, 83, 73, 52, 61, 86, 99, 101, 75, 108, 85, 101 };
      AddMonthlyValues(Precipitation, 2007, values);
      SinkSourceBoundary Precip = new SinkSourceBoundary(Precipitation);
      Precip.ContactGeometry = Vedsted.SurfaceArea;
      Precip.Name = "Precipitation";
      Precip.ID = 2;
      Precip.WaterSample.IDForComposition = 2;
      Vedsted.Precipitation.Add(Precip);

      //Create and add evaporation boundary
      TimespanSeries Evaporation = new TimespanSeries();
      Evaporation.AllowExtrapolation = true;
      Evaporation.ExtrapolationMethod = ExtrapolationMethods.RecycleYear;
      double[] values2 = new double[] {4,11,34,66,110,118,122,103,61,26,7,1 };
      AddMonthlyValues(Evaporation, 2007, values2);
      EvaporationRateBoundary eva = new EvaporationRateBoundary(Evaporation);
      eva.ContactGeometry = Vedsted.SurfaceArea;
      eva.Name = "Evapo";
      
      Vedsted.EvaporationBoundaries.Add(eva);

      Engine.MoveInTime(End, TimeSpan.FromDays(30));
      Vedsted.Name = "Vedsted step 2";
      Engine.Save(testDataPath + Vedsted.Name + ".xml");
      Engine.RestoreState("Initial");


      //To be used by other tests
      Engine.Save(testDataPath + "VedstedNoGroundwater.xml");

      XYPolygon ContactArea = XYPolygon.GetSquare(Vedsted.Area/10);

      #region Groundwater boundaries
      //Add groundwater boundaries
      GroundWaterBoundary B1 = new GroundWaterBoundary(Vedsted, 1.3e-4, 1, 45.47, ContactArea);
      B1.Name = "B1";
      B1.ID = 4;
      B1.WaterSample = GroundWater;
      Vedsted.GroundwaterBoundaries.Add(B1);

      GroundWaterBoundary B2 = new GroundWaterBoundary(Vedsted, 1e-6, 1, 44.96, ContactArea);
      B2.Name = "B2";
      B2.ID = 5;
      B2.WaterSample = GroundWater;
      Vedsted.GroundwaterBoundaries.Add(B2);

      GroundWaterBoundary B3 = new GroundWaterBoundary(Vedsted, 2e-6, 1, 44.63, ContactArea);
      B3.Name = "B3";
      B3.ID = 6;
      B3.WaterSample = GroundWater;
      Vedsted.GroundwaterBoundaries.Add(B3);

      GroundWaterBoundary B4 = new GroundWaterBoundary(Vedsted, 4.9e-7, 1, 44.75, ContactArea);
      B4.Name = "B4";
      B4.ID = 7;
      B4.WaterSample = GroundWater;
      Vedsted.GroundwaterBoundaries.Add(B4);

      GroundWaterBoundary B5 = new GroundWaterBoundary(Vedsted, 1.5e-8, 1, 44.27, ContactArea);
      B5.Name = "B5";
      B5.ID = 8;
      B5.WaterSample = GroundWater;
      Vedsted.GroundwaterBoundaries.Add(B5);

      GroundWaterBoundary B6 = new GroundWaterBoundary(Vedsted, 1.5e-8, 1, 44.16, ContactArea);
      B6.Name = "B6";
      B6.ID = 9;
      B6.WaterSample = GroundWater;
      Vedsted.GroundwaterBoundaries.Add(B6);

      GroundWaterBoundary B7 = new GroundWaterBoundary(Vedsted, 1.1e-6, 1, 45.15, ContactArea);
      B7.Name = "B7";
      B7.ID = 10;
      B7.WaterSample = GroundWater;
      Vedsted.GroundwaterBoundaries.Add(B7);

      GroundWaterBoundary B8 = new GroundWaterBoundary(Vedsted, 1.1e-6, 1, 44.54, ContactArea);
      B8.Name = "B8";
      B8.ID = 11;
      B8.WaterSample = GroundWater;
      Vedsted.GroundwaterBoundaries.Add(B8);

      GroundWaterBoundary B9 = new GroundWaterBoundary(Vedsted, 2.1e-8, 1, 45.4, ContactArea);
      B9.Name = "B9";
      B9.ID = 12;
      B9.WaterSample = GroundWater;
      Vedsted.GroundwaterBoundaries.Add(B9);

      GroundWaterBoundary B10 = new GroundWaterBoundary(Vedsted, 3.5e-6, 1, 45.16, ContactArea);
      B10.Name = "B10";
      B10.ID = 13;
      B10.WaterSample = GroundWater;
      Vedsted.GroundwaterBoundaries.Add(B10);

      #endregion

      Engine.MoveInTime(End, TimeSpan.FromDays(30));
      Vedsted.Name = "Vedsted step 3";
      Engine.Save(testDataPath + Vedsted.Name + ".xml");
      Engine.RestoreState("Initial");

      Vedsted.GroundwaterBoundaries.Clear();

      var cl =ChemicalFactory.Instance.GetChemical(ChemicalNames.IsotopeFraction);

      GroundWaterBoundary Inflow = new GroundWaterBoundary(Vedsted, 1e-7,1,46.7,XYPolygon.GetSquare(Vedsted.Area/2));
      Inflow.Name = "Inflow";
      GroundWater.AddChemical(cl, 3);
      Inflow.WaterSample = GroundWater;

      Vedsted.RealData.AddChemicalTimeSeries(cl);
      Vedsted.RealData.ChemicalConcentrations[cl].AddSiValue(new DateTime(2007, 8, 7), 2.5);

      ((WaterPacket)InitialStateWater).AddChemical(cl, 2.5 * InitialStateWater.Volume);
      Engine.SetState("Initial", Start, InitialStateWater);

      GroundWaterBoundary Outflow = new GroundWaterBoundary(Vedsted, 1e-7,1,44.7,XYPolygon.GetSquare(Vedsted.Area/2));
      Outflow.Name = "Outflow";

      Vedsted.GroundwaterBoundaries.Add(Inflow);
      Vedsted.GroundwaterBoundaries.Add(Outflow);

      Engine.MoveInTime(End, TimeSpan.FromDays(30));
      Vedsted.Name = "Vedsted step 4";
      Engine.Save(testDataPath + Vedsted.Name + ".xml");
      Engine.RestoreState("Initial");



      #region ////Add seepage meter boundaries
      //GroundWaterBoundary S1 = new GroundWaterBoundary(Vedsted, 4e-5, 1, 2, 46);
      //Vedsted.SinkSources.Add(S1);
      //GroundWaterBoundary S2 = new GroundWaterBoundary(Vedsted, 4e-5, 1, 2, 46);
      //Vedsted.SinkSources.Add(S2);
      //GroundWaterBoundary S3 = new GroundWaterBoundary(Vedsted, 4e-5, 1, 2, 46);
      //Vedsted.SinkSources.Add(S3);
      //GroundWaterBoundary I1 = new GroundWaterBoundary(Vedsted, 4e-5, 1, 2, 46);
      //Vedsted.SinkSources.Add(I1);
      //GroundWaterBoundary I2 = new GroundWaterBoundary(Vedsted, 4e-5, 1, 2, 46);
      //Vedsted.SinkSources.Add(I2);
      //GroundWaterBoundary I3 = new GroundWaterBoundary(Vedsted, 4e-5, 1, 2, 46);
      //Vedsted.SinkSources.Add(I3);

#endregion


      Assert.AreEqual(Evaporation.EndTime, Engine.MaximumEndTime);
      Engine.Save(testDataPath + "Vedsted.xml");

      Engine.MoveInTime(End, TimeSpan.FromDays(30));

      double outflow2 = Vedsted.Output.Outflow.GetValue(Start, End.Subtract(TimeSpan.FromDays(5)));
      double evapo2 = Vedsted.Output.Evaporation.GetValue(Start, End.Subtract(TimeSpan.FromDays(5)));

      Engine.Save(testDataPath + "Vedsted2.xml");

    }