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 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"); }
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"); }
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"); }