/// <summary> /// Use this constructor to create an empty lake. Should only be used for unit testing /// </summary> /// <param name="VolumeOfLakeWater"></param> public Lake(string name, double VolumeOfLakeWater) : base(name) { SurfaceArea = XYPolygon.GetSquare(VolumeOfLakeWater); Depth = 1; //Only used in unit test. Otherwise it should be set through the state CurrentStoredWater = new WaterPacket(0); Initialize(); }
public void ContainsTest() { XYPolygon target = XYPolygon.GetSquare(25); IXYPoint p = new XYPoint(3, 3); Assert.AreEqual(true, target.Contains(p)); Assert.AreEqual(false, target.Contains(new XYPoint(3, 6))); Assert.IsTrue(target.Contains(new XYPoint(0.1, 0.1))); }
public void GetSourceWaterTest() { SinkSourceBoundary target = new SinkSourceBoundary(200); target.ContactGeometry = XYPolygon.GetSquare(1); IWaterPacket actual = target.GetSourceWater(DateTime.Now, new TimeSpan(1, 0, 0)); Assert.AreEqual(200 * 3600, actual.Volume); }
public void GetSinkVolumesTest() { SinkSourceBoundary target = new SinkSourceBoundary(-200); target.ContactGeometry = XYPolygon.GetSquare(1); target.WaterSample = new WaterPacket(1); double actual = target.GetSinkVolume(DateTime.Now, new TimeSpan(1, 0, 0)); Assert.AreEqual(200 * 3600, actual, 0.000001); }
public void EvaporationRateBoundaryTest() { EvaporationRateBoundary evp = new EvaporationRateBoundary(23); evp.ContactGeometry = XYPolygon.GetSquare(2); evp.Name = "Test"; EvaporationRateBoundary evp2 = (EvaporationRateBoundary)ReadWrite(evp); Assert.AreEqual(evp.Name, evp2.Name); Assert.AreEqual(((XYPolygon)evp.ContactGeometry).GetArea(), ((XYPolygon)evp.ContactGeometry).GetArea()); Assert.AreEqual(evp.GetSinkVolume(DateTime.Now, TimeSpan.FromDays(1.5)), evp2.GetSinkVolume(DateTime.Now, TimeSpan.FromDays(1.5))); }
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))); }
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); }
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); }
public void TestMethod1() { Lake L = new Lake("Deep lake", XYPolygon.GetSquare(10000)); L.Depth = 4; L.Output.LogAllChemicals = true; Lake L2 = new Lake("Shallow lake", XYPolygon.GetSquare(40000)); L2.Depth = 1; L2.Output.LogAllChemicals = true; SinkSourceBoundary flow = new SinkSourceBoundary(L.Volume / (15.0 * 86400.0)); L.Sources.Add(flow); L2.Sources.Add(flow); Chemical rn = ChemicalFactory.Instance.GetChemical(ChemicalNames.Radon); Chemical cl = ChemicalFactory.Instance.GetChemical(ChemicalNames.Cl); WaterPacket groundwater = new WaterPacket(1); groundwater.SetConcentration(rn, 200); groundwater.SetConcentration(cl, 200); SinkSourceBoundary gwflow = new SinkSourceBoundary(L.Volume / (15.0 * 86400.0)); gwflow.WaterSample = groundwater; L.Sources.Add(gwflow); L2.Sources.Add(gwflow); Model M = new Model(); M.WaterBodies.Add(L); M.WaterBodies.Add(L2); DateTime start = new DateTime(2010, 1, 1); M.SetState("Initial", start, new WaterPacket(1)); M.MoveInTime(new DateTime(2010, 12, 31), TimeSpan.FromDays(5)); M.Save(@"..\..\..\TestData\Radon.xml"); }
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); }
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 SquareTest() { XYPolygon pol = XYPolygon.GetSquare(25); Assert.AreEqual(25, pol.GetArea()); }
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"); }
public void TracerTest() { int count = 3; double length = 10870; DateTime Start = new DateTime(2000, 1, 1); List <Lake> lakes = NetworkBuilder.CreateConnectedLakes(count); foreach (Lake L in lakes) { L.SurfaceArea = XYPolygon.GetSquare(length / count); L.Depth = 1; L.SetState("Initial", Start, new WaterPacket(L.Volume)); } Chemical c = ChemicalFactory.Instance.GetChemical(ChemicalNames.Cl); SinkSourceBoundary fb = new SinkSourceBoundary(10870.0 / (8.49 * 3600)); fb.WaterSample = new WaterPacket(1); lakes.First().Sources.Add(fb); WaterPacket plug = new WaterPacket(1); plug.AddChemical(c, 10000); lakes.First().AddWaterPacket(Start, Start.AddHours(1), plug.DeepClone()); lakes.First().Output.LogChemicalConcentration(c); lakes.Last().Output.LogChemicalConcentration(c); Stream us = new Stream("us", 1, 1, 1); us.Sources.Add(fb); Stream s = new Stream("s", 1000, 1, 1); Lake L2 = new Lake("L2", 870); Stream s1 = new Stream("s1", 9000, 1, 1); s.AddWaterPacket(Start, Start.AddSeconds(1), plug.DeepClone()); s1.Output.LogChemicalConcentration(c); us.AddDownStreamWaterBody(s); s.AddDownStreamWaterBody(L2); L2.AddDownStreamWaterBody(s1); Model m = new Model(); m._waterBodies.AddRange(lakes.Cast <IWaterBody>()); m._waterBodies.Add((IWaterBody)us); m._waterBodies.Add((IWaterBody)s); m._waterBodies.Add((IWaterBody)L2); m._waterBodies.Add((IWaterBody)s1); m.SetState("Initial", Start, new WaterPacket(1)); m.MoveInTime(Start.AddHours(15), TimeSpan.FromMinutes(1)); lakes.Last().Output.Save(@"C:\temp\LastLake.xts"); s1.Output.Save(@"C:\temp\Stream.xts"); int n = 15; List <IWaterBody> wbs = NetworkBuilder.CreateCombo(n, 10870 / n / 2.0); foreach (IWaterBody wb in wbs) { wb.SetState("Initial", Start, new WaterPacket(wb.Volume)); } wbs.First().AddWaterPacket(Start, Start.AddHours(1), plug.DeepClone()); us.AddDownStreamWaterBody(wbs.First()); us.RestoreState("Initial"); m._waterBodies.Clear(); m._waterBodies.Add(us); m._waterBodies.AddRange(wbs); m.SetState("Initial", Start, new WaterPacket(1)); ((Stream)wbs.Last()).Output.LogChemicalConcentration(c); m.MoveInTime(Start.AddHours(15), TimeSpan.FromMinutes(1)); ((Stream)wbs.Last()).Output.Save(@"C:\temp\Stream.xts"); }
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); }
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"); }
private EvaporationRateBoundary() { ContactGeometry = XYPolygon.GetSquare(1); }
public SinkSourceBoundary() { WaterSample = new WaterPacket(1); ContactGeometry = XYPolygon.GetSquare(1); }
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 TestMethod1() { Model M = new Model(); M.Name = "Cook"; WaterPacket HyporhericWater = new WaterPacket(1); HyporhericWater.AddChemical(ChemicalFactory.Instance.GetChemical(ChemicalNames.Radon), 0.6 / HyporhericWater.Volume); for (int i = 0; i < 10; i++) { Lake s1 = new Lake("s" + i, XYPolygon.GetSquare(50 * 2)); s1.Depth = 0.3; StagnantExchangeBoundary seb = new StagnantExchangeBoundary(s1.Volume / 20000); seb.WaterSample = HyporhericWater.DeepClone(s1.Area * 0.2 * 0.4); seb.Output.LogAllChemicals = true; s1.Output.LogAllChemicals = true; s1.Sinks.Add(seb); s1.Sources.Add(seb); if (i > 0) { M._waterBodies[i - 1].AddDownStreamWaterBody(s1); } M._waterBodies.Add(s1); } //Bromide injection TimespanSeries ts = new TimespanSeries(); ts.AddSiValue(DateTime.MinValue, new DateTime(2005, 10, 18, 12, 0, 0), 0); ts.AddSiValue(new DateTime(2005, 10, 18, 12, 0, 0), new DateTime(2005, 10, 18, 12, 40, 0), 0.001 * 60); ts.AddSiValue(new DateTime(2005, 10, 18, 12, 40, 0), DateTime.MaxValue, 0); SinkSourceBoundary Bromide = new SinkSourceBoundary(ts); WaterPacket P = new WaterPacket(1); P.AddChemical(new Chemical("Bromide", 1), 1.13); Bromide.WaterSample = P; //SF6 injection TimespanSeries ts2 = new TimespanSeries(); ts2.AddSiValue(DateTime.MinValue, new DateTime(2005, 10, 15, 12, 0, 0), 0); ts2.AddSiValue(new DateTime(2005, 10, 15, 12, 0, 0), new DateTime(2005, 10, 19, 12, 0, 0), 1e-6); ts2.AddSiValue(new DateTime(2005, 10, 19, 12, 0, 0), DateTime.MaxValue, 0); SinkSourceBoundary SF6 = new SinkSourceBoundary(ts2); WaterPacket SF6w = new WaterPacket(1); SF6w.AddChemical(new Chemical("SF6", 1), 1.13); SF6.WaterSample = SF6w; M._waterBodies.First().Sources.Add(Bromide); M._waterBodies.First().Sources.Add(SF6); M._waterBodies.First().Sources.Add(new SinkSourceBoundary(0.2)); DateTime Start = new DateTime(2005, 10, 13); DateTime End = new DateTime(2005, 10, 19); M.SetState("Initial", Start, new WaterPacket(1)); M.MoveInTime(new DateTime(2005, 10, 18, 12, 0, 0), TimeSpan.FromHours(2)); M.MoveInTime(new DateTime(2005, 10, 18, 13, 0, 0), TimeSpan.FromHours(0.02)); M.MoveInTime(End, TimeSpan.FromHours(2)); M.Save(@"..\..\..\TestData\CookEtAl.xml"); M.RestoreState("Initial"); TimespanSeries ts3 = new TimespanSeries(); ts3.AddSiValue(DateTime.MinValue, new DateTime(2005, 10, 16, 12, 0, 0), 0); ts3.AddSiValue(new DateTime(2005, 10, 16, 12, 0, 0), new DateTime(2005, 10, 17, 0, 0, 0), 0.4); ts3.AddSiValue(new DateTime(2005, 10, 17, 0, 0, 0), DateTime.MaxValue, 0); M._waterBodies.First().Sources.Add(new SinkSourceBoundary(ts3)); M.MoveInTime(new DateTime(2005, 10, 18, 12, 0, 0), TimeSpan.FromHours(2)); M.MoveInTime(new DateTime(2005, 10, 18, 13, 0, 0), TimeSpan.FromHours(0.02)); M.MoveInTime(End, TimeSpan.FromHours(2)); M.Save(@"..\..\..\TestData\CookEtAl2.xml"); }