//----------------------------------------------------------------------- // // Copyright (c) 2011 Deltares. All rights reserved. // // Tom The // tom.the@deltares.nl // 05-04-2011 // Tests for Import Waterboard data //----------------------------------------------------------------------- using System.Collections.Generic; using System.IO; using System.Linq; using Deltares.Standard; using NUnit.Framework; using Deltares.Geometry; using Deltares.Geotechnics; using Deltares.Probabilistic; using Deltares.Dam.Data; using Deltares.Dam.Data.DataPlugins; using Deltares.Dam.Data.DataPlugins.Configuration; using Deltares.Geotechnics.Soils; using Deltares.Geotechnics.SurfaceLines; using Deltares.Standard.Logging; using Deltares.Standard.TestUtils; using Segment = Deltares.Dam.Data.Segment; namespace Deltares.Dam.Tests { [TestFixture] public class WaterBoardImporterTests { const string DirectoryWithCsvFiles = @"..\..\..\data\Dam\Waterboards\Groot Salland\Binnenwaarts"; List srcDataSources; DataPluginImporter dataPluginImporter; DataSourceContainer dataSourceContainer; public void SetupForCsvFilesImport() { srcDataSources = new List { new DataSource { DataSourceType = DataSourceType.CsvFiles, DataLocation = DirectoryWithCsvFiles } }; dataPluginImporter = new DataPluginImporter(); dataPluginImporter.SetDataSources("", srcDataSources); dataSourceContainer = new DataSourceContainer { DataSourceList = srcDataSources }; } [Test] [Category(Categories.Slow)] public void WaterBoardImportedWithCsvFilesHasValidData() { const string soilKleiDuin = "klei duin"; const string soilProfileId = "10Z_275_STBI_p"; const string segmentId = "segment_dijkring10_dwp02_4"; const string surfacelineId = "dijkring10_dwp40_0"; const string locationId = "dwp02_4"; const double cTolerance = 0.00001; const double cToleranceCoordinate = 0.00001; SetupForCsvFilesImport(); using (var waterBoard = WaterBoardImporter.ImportAllData("", dataSourceContainer, DamType.Primary, DamProjectType.Calamity, null)) { // Check Dike Assert.AreEqual(1, waterBoard.Dikes.Count); Dike dike = waterBoard.Dikes[0]; //Check Soils Assert.AreEqual(47, dike.SoilList.Soils.Count); Soil soil = dike.SoilList.Soils[dike.SoilList.GetSoilIndexByName(soilKleiDuin)]; Assert.AreEqual(15.7, soil.AbovePhreaticLevel, cTolerance); // Check Soilprofiles Assert.AreEqual(26, dike.SoilProfiles.Count); SoilProfile1D soilProfile = dike.SoilProfiles.First(x => x.Name.Equals(soilProfileId)); Assert.AreEqual(soilKleiDuin, soilProfile.Layers[0].Soil.Name); // Check Segments Assert.AreEqual(24, waterBoard.Segments.Count); Segment segment = waterBoard.Segments.First(x => x.Name.Equals(segmentId)); Assert.AreEqual("10Y_024_STBI.sti", segment.SoilProfileProbabilities[0].SoilGeometryName); Assert.AreEqual(100.0, segment.SoilProfileProbabilities[0].Probability, cTolerance); Assert.IsTrue(segment.SoilProfileProbabilities[0].SegmentFailureMechanismType.Equals(FailureMechanismSystemType.StabilityInside)); // Check segment with stability and piping segment = waterBoard.Segments.Where(x => x.Name.Equals("segment_dijkring10_dwp02_4")).FirstOrDefault(); Assert.AreEqual("10Y_024_STBI.sti", segment.SoilProfileProbabilities[0].SoilGeometryName); Assert.AreEqual(100.0, segment.SoilProfileProbabilities[0].Probability, cTolerance); Assert.IsTrue(segment.SoilProfileProbabilities[0].SegmentFailureMechanismType.Equals(FailureMechanismSystemType.StabilityInside)); Assert.AreEqual("10Y_024_STBI.sti", segment.SoilProfileProbabilities[1].SoilGeometryName); Assert.AreEqual(100.0, segment.SoilProfileProbabilities[1].Probability, cTolerance); Assert.IsTrue(segment.SoilProfileProbabilities[1].SegmentFailureMechanismType.Equals(FailureMechanismSystemType.Piping)); // Check surfacelines Assert.AreEqual(24, dike.SurfaceLines2.Count); SurfaceLine2 surfaceline = dike.SurfaceLines2.First(x => x.Name.Equals(surfacelineId)); Assert.IsTrue(surfaceline.Geometry.Points.Any()); Assert.AreEqual(0.0, surfaceline.Geometry.Points[0].X, cToleranceCoordinate); Assert.AreEqual(0.0, surfaceline.Geometry.Points[0].Y, cToleranceCoordinate); Assert.AreEqual(-0.48, surfaceline.Geometry.Points[0].Z, cToleranceCoordinate); int lastPointIndex = surfaceline.Geometry.Count - 1; Assert.AreEqual(71.25, surfaceline.Geometry.Points[lastPointIndex].X, cToleranceCoordinate); Assert.AreEqual(0.0, surfaceline.Geometry.Points[lastPointIndex].Y, cToleranceCoordinate); Assert.AreEqual(-0.36, surfaceline.Geometry.Points[lastPointIndex].Z, cToleranceCoordinate); GeometryPoint point = surfaceline.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside); Assert.AreEqual(71.25, point.X, cToleranceCoordinate); Assert.AreEqual(0.0, point.Y, cToleranceCoordinate); Assert.AreEqual(-0.36, point.Z, cToleranceCoordinate); // Check locations Assert.AreEqual(24, dike.Locations.Count); Location location = dike.Locations.First(x => x.Name.Equals(locationId)); Assert.AreEqual(-0.35, location.PolderLevel, cTolerance); // Assert.AreEqual(0.5, location.LevelReductionInside, cTolerance); // is default from modelparameters // Assert.AreEqual(0.6, location.LevelReductionOutside, cTolerance); // is default from modelparameters // Assert.AreEqual(0.25, location.MinimalCircleDepth, cTolerance); // is default from modelparameters // Assert.AreEqual(0.05, location.LayerHeightDeviation, cTolerance); // is default from modelparameters // Assert.AreEqual(DistributionType.LogNormal, location.LayerHeightDistribution); // is default from modelparameters Assert.AreEqual("segment_dijkring10_dwp02_4", location.Segment.Name); Assert.AreEqual("dijkring10_dwp02_4", location.SurfaceLine2.Name); dike.Validate(); } } [Test] [Category(Categories.Slow)] public void ImportWaterBoardOnlyCsvFiles1D() { const double cTolerance = 0.0001; const string definitionFilename = @".\TestData\CSVData\Full1DProject\Import.defx"; dataSourceContainer = DataSourceContainer.Deserialize(definitionFilename); string damImportFolder = Path.GetDirectoryName(definitionFilename); List importLogMessages; IList dikeList = WaterBoardImporter.ImportDikeRingIds(damImportFolder, dataSourceContainer, DamType.Primary, DamProjectType.Calamity, out importLogMessages).ToList(); using (WaterBoard waterBoard = WaterBoardImporter.ImportDataForDikeRings("", damImportFolder, dataSourceContainer, dikeList, DamType.Primary, DamProjectType.Calamity, null)) { //WaterBoard waterBoard = WaterBoardImporter.ImportAllData(damImportFolder, dataSourceContainer, DamType.Primary, null); // Check Dike Assert.AreEqual(1, waterBoard.Dikes.Count); Dike dike = waterBoard.Dikes[0]; //Check locations Assert.AreEqual(2, dike.Locations.Count); // Check Soilprofiles Assert.AreEqual(23, dike.SoilProfiles.Count); SoilProfile1D soilProfile = dike.SoilProfiles.First(x => x.Name.Equals("25_2_1_bz_4")); Assert.AreEqual("kade", soilProfile.Layers[0].Soil.Name); //Check Soils Assert.AreEqual(51, dike.SoilList.Soils.Count); Soil soil = dike.SoilList.Soils[dike.SoilList.GetSoilIndexByName("kade")]; Assert.AreEqual(17.0, soil.AbovePhreaticLevel, cTolerance); // Check Segments Assert.AreEqual(2, waterBoard.Segments.Count); Segment segment = waterBoard.Segments.First(x => x.Name.Equals("106")); Assert.AreEqual("25_2_1_bz_1", segment.SoilProfileProbabilities[0].SoilGeometryName); Assert.AreEqual(35.0, segment.SoilProfileProbabilities[0].Probability, cTolerance); Assert.IsTrue(segment.SoilProfileProbabilities[0].SegmentFailureMechanismType.Equals(FailureMechanismSystemType.StabilityInside)); } } [Test] [Category(Categories.Slow)] public void ImportWaterBoardOnlyCsvFiles2D() { //const double cTolerance = 0.0001; const string definitionFilename = @".\TestData\CSVData\Full2DProject\Import.defx"; const string projectFilename = @".\TestData\TestWithGeometries2D.damx"; using (DamProject damProject = new DamProject()) { dataSourceContainer = DataSourceContainer.Deserialize(definitionFilename); string damImportFolder = Path.GetDirectoryName(definitionFilename); List importLogMessages; IList dikeList = WaterBoardImporter.ImportDikeRingIds(damImportFolder, dataSourceContainer, DamType.Primary, DamProjectType.Calamity, out importLogMessages).ToList(); damProject.DamProjectData.WaterBoard = WaterBoardImporter.ImportDataForDikeRings("", damImportFolder, dataSourceContainer, dikeList, DamType.Primary, DamProjectType.Calamity, null); damProject.AssignGeometry2DMapnameIfNotAssigned(Path.Combine(damImportFolder, dataSourceContainer.MapSoilProfile2D)); // Save the data damProject.SaveXMLProject(projectFilename, damProject); // Check Dike Assert.AreEqual(1, damProject.DamProjectData.WaterBoard.Dikes.Count); Dike dike = damProject.DamProjectData.WaterBoard.Dikes[0]; //Check locations Assert.AreEqual(32, dike.Locations.Count); } } [Test] [Category(Categories.Slow)] public void ImportWaterBoardOnlyWithoutPl3AndPl4CsvFiles() { const string definitionFilename = @".\TestData\CSVData\DataWithoutPl3AndPl4\Import.defx"; dataSourceContainer = DataSourceContainer.Deserialize(definitionFilename); string damImportFolder = Path.GetDirectoryName(definitionFilename); List importLogMessages; IList dikeList = WaterBoardImporter.ImportDikeRingIds(damImportFolder, dataSourceContainer, DamType.Primary, DamProjectType.Calamity, out importLogMessages).ToList(); using (WaterBoard waterBoard = WaterBoardImporter.ImportDataForDikeRings("", damImportFolder, dataSourceContainer, dikeList, DamType.Primary, DamProjectType.Calamity, null)) { //WaterBoard waterBoard = WaterBoardImporter.ImportAllData(damImportFolder, dataSourceContainer, DamType.Primary, null); // Check Dike Assert.AreEqual(1, waterBoard.Dikes.Count); Dike dike = waterBoard.Dikes[0]; //Check locations Assert.AreEqual(2, dike.Locations.Count); Assert.IsNull(dike.Locations[0].HeadPL2); Assert.IsNull(dike.Locations[0].HeadPl3); Assert.IsNull(dike.Locations[0].HeadPl4); } } [Test] [Category(Categories.Slow)] public void ImportWaterBoardOnlyCsvFiles1DRelativeSoilProfiles() { const double cTolerance = 0.0001; const string definitionFilename = @".\TestData\CSVData\Full1DProject\Import relative soilprofiles.defx"; dataSourceContainer = DataSourceContainer.Deserialize(definitionFilename); string damImportFolder = Path.GetDirectoryName(definitionFilename); List importLogMessages; IList dikeList = WaterBoardImporter.ImportDikeRingIds(damImportFolder, dataSourceContainer, DamType.Primary, DamProjectType.Calamity, out importLogMessages).ToList(); using(WaterBoard waterBoard = WaterBoardImporter.ImportDataForDikeRings("", damImportFolder, dataSourceContainer, dikeList, DamType.Primary, DamProjectType.Calamity, null)) using (WaterBoard referenceWaterBoard = WaterBoardImporter.ImportDataForDikeRings("", damImportFolder, dataSourceContainer, dikeList, DamType.Primary, DamProjectType.Calamity, null)) { // If profiles are defined as relative profiles, new absolute profiles will be generated for each location if (dataSourceContainer.IsImportAsRelativeProfiles) { WaterBoardPostProcessRelativeProfiles.CreateAbsoluteProfiles(waterBoard, dataSourceContainer.SoilProfileCharacteristicPointReference); } // Check Dike Assert.AreEqual(1, waterBoard.Dikes.Count); Dike dike = waterBoard.Dikes[0]; //Check locations Assert.AreEqual(2, dike.Locations.Count); // Check Soilprofiles Assert.AreEqual(23, dike.SoilProfiles.Count); SoilProfile1D soilProfile = dike.SoilProfiles.First(x => x.Name.Equals("25_2_1_bz_4")); Assert.AreEqual("kade", soilProfile.Layers[0].Soil.Name); Assert.AreEqual(60.0, soilProfile.TopLevel); // Check if all profiles are made absolute from relative foreach (var location in waterBoard.Locations) { foreach (var soilProfileProbability in location.Segment.SoilProfileProbabilities) { var dikeToeAtPolder = location.SurfaceLine2.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder); Assert.AreEqual(soilProfileProbability.SoilProfile.TopLevel, dikeToeAtPolder.Z, cTolerance); } } // Compare reference waterboard to converted waterboard foreach (var location in waterBoard.Locations) { Location referenceLocation = referenceWaterBoard.Locations.Find(l => l.Name.Equals(location.Name)); foreach (var soilProfileProbability in location.Segment.SoilProfileProbabilities) { SoilGeometryProbability referenceSoilProfileProbability = referenceLocation.Segment.SoilProfileProbabilities.Find(s => s.SoilProfile.Name.Equals(soilProfileProbability.SoilProfile.Name)); for (int layerIndex = 0; layerIndex < soilProfileProbability.SoilProfile.LayerCount; layerIndex++) { Assert.AreEqual(referenceSoilProfileProbability.SoilProfile.Layers[layerIndex].Height, soilProfileProbability.SoilProfile.Layers[layerIndex].Height, cTolerance, string.Format("Location {0} Segment {1} soilProfile {2} Layer {3} ({4}/{5}), Org ({6}/{7})", location.Name, location.Segment.Name, soilProfileProbability.SoilProfile.Name, soilProfileProbability.SoilProfile.Layers[layerIndex].ToString(), soilProfileProbability.SoilProfile.Layers[layerIndex].TopLevel, soilProfileProbability.SoilProfile.Layers[layerIndex].BottomLevel, referenceSoilProfileProbability.SoilProfile.Layers[layerIndex].TopLevel, referenceSoilProfileProbability.SoilProfile.Layers[layerIndex].BottomLevel)); } } } } } [Test] [Category(Categories.Slow)] public void IsZoneDataReadCorrectlyFromCsvFiles() { const double cTolerance = 0.0001; const string definitionFilename = @".\TestData\CSVData\ProjectZoneType\Import.defx"; dataSourceContainer = DataSourceContainer.Deserialize(definitionFilename); string damImportFolder = Path.GetDirectoryName(definitionFilename); List importLogMessages; IList dikeList = WaterBoardImporter.ImportDikeRingIds(damImportFolder, dataSourceContainer, DamType.Primary, DamProjectType.Calamity, out importLogMessages).ToList(); using (WaterBoard waterBoard = WaterBoardImporter.ImportDataForDikeRings("", damImportFolder, dataSourceContainer, dikeList, DamType.Primary, DamProjectType.Calamity, null)) { // Check Dike Assert.AreEqual(1, waterBoard.Dikes.Count); Dike dike = waterBoard.Dikes[0]; //Check locations Assert.AreEqual(2, dike.Locations.Count); Assert.AreEqual(MStabZonesType.ZoneAreas, dike.Locations[0].StabilityZoneType); Assert.AreEqual(0.5, dike.Locations[0].ForbiddenZoneFactor, cTolerance); Assert.AreEqual(1.6, dike.Locations[0].ZoneAreaRestSlopeCrestWidth, cTolerance); Assert.AreEqual(MStabZonesType.ForbiddenZone, dike.Locations[1].StabilityZoneType); Assert.AreEqual(0.9, dike.Locations[1].ForbiddenZoneFactor, cTolerance); Assert.AreEqual(2.1, dike.Locations[1].ZoneAreaRestSlopeCrestWidth, cTolerance); } } } }