// Copyright (C) Stichting Deltares 2018. All rights reserved. // // This file is part of the Dam Engine. // // The Dam Engine is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . // // All names, logos, and references to "Deltares" are registered trademarks of // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. using System; using System.Collections.Generic; using Deltares.DamEngine.Data.General; using Deltares.DamEngine.Data.General.Results; using Deltares.DamEngine.Data.General.TimeSeries; using Deltares.DamEngine.Data.Geometry; using Deltares.DamEngine.Data.Geotechnics; using Deltares.DamEngine.Data.RegionalAssessmentResults; using Deltares.DamEngine.Data.Standard; using Deltares.DamEngine.Data.Standard.Calculation; using Deltares.DamEngine.Data.Standard.Logging; using Deltares.DamEngine.Io; using Deltares.DamEngine.Io.XmlOutput; using KellermanSoftware.CompareNetObjects; using NUnit.Framework; using DesignResult = Deltares.DamEngine.Data.General.Results.DesignResult; using RegionalScenarioResult = Deltares.DamEngine.Data.RegionalAssessmentResults.RegionalScenarioResult; using UpliftSituation = Deltares.DamEngine.Data.General.UpliftSituation; namespace Deltares.DamEngine.Interface.Tests { [TestFixture] public class FillXmlOutputFromDamTests { [Test] public void CanWriteAndReadDamProjectDataToXml() { const string outputFilename = "OutputFile.xml"; DamProjectData expectedDamProjectData = CreateExampleDamProjectData(); Output output = FillXmlOutputFromDam.CreateOutput(expectedDamProjectData); DamXmlSerialization.SaveOutputAsXmlFile(outputFilename, output); output = DamXmlSerialization.LoadOutputFromXmlFile(outputFilename); var inputData = CreateExampleDamProjectData(); DamProjectData actualDamProjectData = FillDamFromXmlOutput.CreateDamProjectData(inputData, output); CompareDamProjectData(actualDamProjectData, expectedDamProjectData); } [Test] public void CanWriteAndReadDamProjectDataToXmlString() { DamProjectData expectedDamProjectData = CreateExampleDamProjectData(); Output output = FillXmlOutputFromDam.CreateOutput(expectedDamProjectData); var xmlString = DamXmlSerialization.SaveOutputAsXmlString(output); output = DamXmlSerialization.LoadOutputFromXmlString(xmlString); var inputData = CreateExampleDamProjectData(); DamProjectData actualDamProjectData = FillDamFromXmlOutput.CreateDamProjectData(inputData, output); CompareDamProjectData(actualDamProjectData, expectedDamProjectData); } private DamProjectData CreateExampleDamProjectData() { const int designResultsCount = 3; const int locationResultsCount = 2; var damProjectData = new DamProjectData { DesignCalculations = new List() }; for (int i = 0; i < designResultsCount; i++) { var result = new DesignResult("location " + i, "Scenario " + (i * 2)) { BaseFileName = "my basefilename " + i, CalculationSubDir = "CalcSubDir", ProfileName = "profile" + i }; result.CalculationResult = CalculationResult.RunFailed; // Note : as Wti2017HcriticalPiping is in use in this test, the modeltype MUST be Wti2017. result.PipingDesignResults = new PipingDesignResults(PipingModelType.Wti2017) { ResultMessage = "no run made", UpliftFactor = 1.3 * i, HeaveFactor = 1.1 * i, BlighFactor = 1.03 * i, BlighHcritical = 0.4, LocalExitPointX = 34.21, Wti2017DeltaPhiCu = 1.09 * i, EffectiveStress = 13.23 * i, Wti2017HcriticalUplift = 1.19 * i, Wti2017HcriticalPiping = 1.29 * i, Wti2017HcriticalHeave = 1.24 * i, Wti2017SafetyFactorPiping = 1.39 * i, Wti2017SafetyFactorUplift = 1.49 * i, Wti2017SafetyFactorHeave = 1.59 * i, Wti2017Gradient = 1.69 * i, Wti2017HcriticalOverall = 1.79 * i, Wti2017SafetyFactorOverall = 3.21 * i }; var situation = new UpliftSituation { IsUplift = true, Pl3MinUplift = 0.1, Pl3HeadAdjusted = 0.2, Pl3LocationXMinUplift = 0.3, Pl4MinUplift = 0.1 * i, Pl4HeadAdjusted = 0.2 * i, Pl4LocationXMinUplift = 0.3 * i }; var surfaceline = new SurfaceLine2(); surfaceline.Name = "Redesigned Surfaceline"; surfaceline.CharacteristicPoints.Geometry = surfaceline.Geometry; var p1 = new CharacteristicPoint { CharacteristicPointType = CharacteristicPointType.SurfaceLevelOutside, GeometryPoint = new GeometryPoint(), X = 0, Z = 0 }; surfaceline.CharacteristicPoints.Add(p1); var p2 = new CharacteristicPoint { CharacteristicPointType = CharacteristicPointType.DikeToeAtRiver, GeometryPoint = new GeometryPoint(), X = 10, Z = 0 }; surfaceline.CharacteristicPoints.Add(p2); var p3 = new CharacteristicPoint { CharacteristicPointType = CharacteristicPointType.DikeTopAtRiver, GeometryPoint = new GeometryPoint(), X = 15, Z = 2 }; surfaceline.CharacteristicPoints.Add(p3); var p4 = new CharacteristicPoint { CharacteristicPointType = CharacteristicPointType.DikeTopAtPolder, GeometryPoint = new GeometryPoint(), X = 18, Z = 2 }; surfaceline.CharacteristicPoints.Add(p4); var p5 = new CharacteristicPoint { CharacteristicPointType = CharacteristicPointType.DikeToeAtPolder, GeometryPoint = new GeometryPoint(), X = 23, Z = 0 }; surfaceline.CharacteristicPoints.Add(p5); var p6 = new CharacteristicPoint { CharacteristicPointType = CharacteristicPointType.SurfaceLevelInside, GeometryPoint = new GeometryPoint(), X = 100, Z = 0 }; surfaceline.CharacteristicPoints.Add(p6); result.PipingDesignResults.RedesignedSurfaceLine = surfaceline; result.PipingDesignResults.UpliftSituation = situation; result.StabilityDesignResults = new StabilityDesignResults { ResultMessage = "no problemo", SafetyFactor = (i + 1) * 0.66, Zone1SafetyFactor = (i + 1) * 0.64, LocalZone1EntryPointX = (i + 1) * 12.66, LocalZone1ExitPointX = (i + 1) * 21.66, Zone2SafetyFactor = (i + 2) * 0.64, LocalZone2EntryPointX = (i + 2) * 12.66, LocalZone2ExitPointX = (i + 2) * 21.66, NumberOfIterations = (i + 1) * 3, UpliftSituation = situation, RedesignedSurfaceLine = surfaceline, StabilityModelType = MStabModelType.BishopUpliftVan }; damProjectData.DesignCalculations.Add(result); } damProjectData.Dike = new Dike(); for (int i = 0; i < locationResultsCount; i++) { var location = new Location(); location.Name = "A" + (i + 1); location.Segment = new Segment(); var soilGeometryProbability = new SoilGeometryProbability(); soilGeometryProbability.SoilProfile1D = new SoilProfile1D(); soilGeometryProbability.SoilProfile1DName = soilGeometryProbability.SoilProfile1D.Name; location.Segment.SoilProfileProbabilities.Add(soilGeometryProbability); damProjectData.Dike.Locations.Add(location); var result = new LocationResult(); result.RegionalScenariosResult = new RegionalScenariosResult(); result.RegionalScenariosResult.CalculationResult = CalculationResult.NoLicense; result.RegionalScenariosResult.SafetyFactor = 0.2 * (1 + i); result.RegionalScenariosResult.RegionalScenarioResults = new List(); var regionalScenarioResult = new RegionalScenarioResult(); regionalScenarioResult.CalculationResult = CalculationResult.InvalidInputStructure; regionalScenarioResult.DikeDrySensitivity = DikeDrySensitivity.Dry; regionalScenarioResult.HydraulicShortcutType = HydraulicShortcutType.HydraulicShortcut; regionalScenarioResult.LoadSituation = LoadSituation.Wet; regionalScenarioResult.ModelOption = MStabModelType.HorizontalBalance; regionalScenarioResult.SafetyFactor = 0.34 * (i + 1); regionalScenarioResult.ScenarioType = ScenarioType.Scenario03; regionalScenarioResult.UpliftType = UpliftType.Uplift; regionalScenarioResult.RegionalScenarioProfileResults = new List(); var regionalScenarioProfileResult = new RegionalScenarioProfileJob(location, soilGeometryProbability); regionalScenarioProfileResult.BaseFileName = "base " + (i * 3); regionalScenarioProfileResult.DikeDrySensitivity = DikeDrySensitivity.None; regionalScenarioProfileResult.FailureMechanismType = FailureMechanismSystemType.Piping; regionalScenarioProfileResult.HydraulicShortcutType = HydraulicShortcutType.NoHydraulicShortcut; regionalScenarioProfileResult.LoadSituation = LoadSituation.Dry; regionalScenarioProfileResult.MstabModelOption = MStabModelType.Fellenius; regionalScenarioProfileResult.PipingModelOption = PipingModelType.SellmeijerVnk; regionalScenarioProfileResult.ScenarioType = ScenarioType.Scenario07; regionalScenarioProfileResult.UpliftType = UpliftType.Uplift; regionalScenarioResult.RegionalScenarioProfileResults.Add(regionalScenarioProfileResult); result.RegionalScenariosResult.RegionalScenarioResults.Add(regionalScenarioResult); var locationJob = new LocationJob(location); locationJob.LocationResult = result; damProjectData.LocationJobs.Add(locationJob); } damProjectData.CalculationMessages = new List(); damProjectData.CalculationMessages.Add(new LogMessage(LogMessageType.Error, null, "Error 1")); damProjectData.CalculationMessages.Add(new LogMessage(LogMessageType.Error, null, "Error 2")); damProjectData.CalculationMessages.Add(new LogMessage(LogMessageType.Warning, null, "Warning 1")); FillOutputTimeSeries(damProjectData); return damProjectData; } private void FillOutputTimeSeries(DamProjectData damProjectData) { const int timeSeriesCount = 2; const int timeEntriesCount = 3; const string idPipingBligh = "PipingFactorBligh"; const string idStabilityInsideFactor = "StabilityInsideFactor"; damProjectData.OutputTimeSerieCollection = new TimeSerieCollection(); for (int i = 0; i < timeSeriesCount; i++) { string locationId = String.Format("location{0}", i); var timeSerie = damProjectData.OutputTimeSerieCollection.AddNewSeries(locationId); timeSerie.ParameterId = (i % 2 == 0) ? idPipingBligh : idStabilityInsideFactor; timeSerie.ForecastDateTime = DateTime.Now; timeSerie.Type = "instantaneous"; timeSerie.StartDateTime = new DateTime(2012, 12, 31); timeSerie.EndDateTime = new DateTime(2012, 12, 31, 1, 0, 0); timeSerie.MissVal = -9999.0; timeSerie.LongName = timeSerie.LocationId + "long"; timeSerie.StationName = String.Format("station{0}", i); timeSerie.Units = "m"; timeSerie.SourceOrganisation = String.Format("organisation{0}", i); timeSerie.SourceSystem = String.Format("system{0}", i); timeSerie.FileDescription = String.Format("filedescription{0}", i); timeSerie.Region = String.Format("region{0}", i); timeSerie.TimeStep.Multiplier = 3600; timeSerie.TimeStep.Unit = TimeStepUnit.Second; for (int j = 0; j < timeEntriesCount; j++) { timeSerie.Entries.Add(new TimeSerieEntry { DateTime = new DateTime(2012, 12, 31, 1, j * 10, 0), Value = 1 + j * 0.1, Flag = 1, BasisFileName = String.Format("BasisFileName{0}", i) }); } } } private void CompareDamProjectData(DamProjectData actual, DamProjectData expected) { var compare = new CompareLogic { Config = { MaxDifferences = 100 } }; var result = compare.Compare(expected, actual); Assert.AreEqual(0, result.Differences.Count, "Differences found read/write Input object"); } } }