// Copyright (C) Stichting Deltares 2019. 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.IO; using Deltares.DamEngine.Calculators.General; using Deltares.DamEngine.Data.Geotechnics; using Deltares.DamEngine.TestHelpers.Factories; using NUnit.Framework; namespace Deltares.DamEngine.Calculators.Tests.KernelWrappers.DamMacroStabilityCommon { [TestFixture] public class Geometry2DTo1DConverterTest { const double cTolerance = 0.00001; private const string testFolder = @"..\..\Deltares.DamEngine.Calculators.Tests\KernelWrappers\DamMacroStabilityCommon\TestData"; private readonly string geometryFileName1D1 = Path.Combine(testFolder, "1D1.sti"); private readonly string geometryFileName18_4_94 = Path.Combine(testFolder, "18_4_94.sti"); string cDikeMaterial = "OA"; SurfaceLine2 surfaceLine; Soil dikeEmbankmentMaterial; [TestFixtureSetUp] public void FixtureSetup() { surfaceLine = FactoryForSurfaceLines.CreateSurfaceLineTutorial1(); dikeEmbankmentMaterial = new Soil(); dikeEmbankmentMaterial.Name = cDikeMaterial; } [SetUp] public void Setup() {} [TestFixtureTearDown] public void FixtureTearDown() {} [Test] public void CanCreateSoilProfileIfSurfaceLinePointBelowGeometrySurface() { SoilList soilList = CreateSoilList(); var geometry2DTo1DConverter = new Geometry2DTo1DConverter(geometryFileName1D1, surfaceLine, dikeEmbankmentMaterial, soilList); SoilProfile1D soilProfile = geometry2DTo1DConverter.Convert(64.0); Assert.AreEqual(6, soilProfile.Layers.Count); Assert.AreEqual("DKN5", soilProfile.Layers[0].SoilName); Assert.AreEqual("DKN5", soilProfile.Layers[0].Soil.Name); Assert.AreEqual(1.31640522876, soilProfile.Layers[0].TopLevel, cTolerance); Assert.AreEqual(17.50, soilProfile.Layers[0].Soil.AbovePhreaticLevel, cTolerance); Assert.AreEqual(17.50, soilProfile.Layers[0].Soil.BelowPhreaticLevel, cTolerance); } [Test] public void CanCreateSoilProfileWithOriginOffsetIfSurfaceLinePointBelowGeometrySurface() { const double offset = 10.0; SoilList soilList = CreateSoilList(); var geometry2DTo1DConverter = new Geometry2DTo1DConverter(geometryFileName1D1, surfaceLine, dikeEmbankmentMaterial, soilList, offset); SoilProfile1D soilProfile = geometry2DTo1DConverter.Convert(64.0 - offset); Assert.AreEqual(6, soilProfile.Layers.Count); Assert.AreEqual("DKN5", soilProfile.Layers[0].SoilName); Assert.AreEqual("DKN5", soilProfile.Layers[0].Soil.Name); Assert.AreEqual(1.31640522876, soilProfile.Layers[0].TopLevel, cTolerance); Assert.AreEqual(17.50, soilProfile.Layers[0].Soil.AbovePhreaticLevel, cTolerance); Assert.AreEqual(17.50, soilProfile.Layers[0].Soil.BelowPhreaticLevel, cTolerance); } [Test] public void CanCreateSoilProfileIfSurfaceLinePointAboveGeometrySurface() { SoilList soilList = CreateSoilList(); var geometry2DTo1DConverter = new Geometry2DTo1DConverter(geometryFileName1D1, surfaceLine, dikeEmbankmentMaterial, soilList); SoilProfile1D soilProfile = geometry2DTo1DConverter.Convert(73.0); Assert.AreEqual(6, soilProfile.Layers.Count); Assert.AreEqual(cDikeMaterial, soilProfile.Layers[0].SoilName); Assert.AreEqual(cDikeMaterial, soilProfile.Layers[0].Soil.Name); Assert.AreEqual(18.00, soilProfile.Layers[0].Soil.AbovePhreaticLevel, cTolerance); Assert.AreEqual(20.00, soilProfile.Layers[0].Soil.BelowPhreaticLevel, cTolerance); Assert.AreEqual("DKN4", soilProfile.Layers[1].SoilName); Assert.AreEqual("DKN4", soilProfile.Layers[1].Soil.Name); Assert.AreEqual(17.16, soilProfile.Layers[1].Soil.AbovePhreaticLevel, cTolerance); Assert.AreEqual(17.16, soilProfile.Layers[1].Soil.BelowPhreaticLevel, cTolerance); } /// /// This test fails sometimes and random (see MWDAM-303) /// You may need to run it a couple of times before it fails /// [Test] public void RandomFailingCase() { SoilList soilList = CreateSoilList(); var geometry2DTo1DConverter = new Geometry2DTo1DConverter(geometryFileName18_4_94, surfaceLine, dikeEmbankmentMaterial, soilList); for (int i = 0; i < 10; i++) { Console.WriteLine(String.Format("Index = {0}", i)); SoilProfile1D soilProfile = geometry2DTo1DConverter.Convert(110.0); Assert.AreEqual(-16.43, soilProfile.BottomLevel, String.Format("Random fail on index = {0}", i)); } } private SoilList CreateSoilList() { var soilList = new SoilList(); var s1 = new Soil("DKN5") { AbovePhreaticLevel = 17.5, BelowPhreaticLevel = 17.50 }; soilList.Soils.Add(s1); var s2 = new Soil("DKN4") { AbovePhreaticLevel = 17.16, BelowPhreaticLevel = 17.16 }; soilList.Soils.Add(s2); var s3 = new Soil("OA") { AbovePhreaticLevel = 18.00, BelowPhreaticLevel = 20.00 }; soilList.Soils.Add(s3); var s4 = new Soil("DKN3"); soilList.Soils.Add(s4); var s5 = new Soil("LM"); soilList.Soils.Add(s5); var s6 = new Soil("Dijks (17,5)"); soilList.Soils.Add(s6); var s7 = new Soil("Tiel naast (15,0) (1)"); soilList.Soils.Add(s7); var s8 = new Soil("Tiel onder (15,5)"); soilList.Soils.Add(s8); var s9 = new Soil("G2 onder (16,0)"); soilList.Soils.Add(s9); var s10 = new Soil("G2 naast (14,5)"); soilList.Soils.Add(s10); var s11 = new Soil("G1 onder (14,0) (1)"); soilList.Soils.Add(s11); var s12 = new Soil("G1 naast (12,6)"); soilList.Soils.Add(s12); var s13 = new Soil("HV onder (11,0)"); soilList.Soils.Add(s13); var s14 = new Soil("HV naast (10,40)"); soilList.Soils.Add(s14); var s15 = new Soil("BV onder (12,0) (4)"); soilList.Soils.Add(s15); var s16 = new Soil("BV naast (11,0)"); soilList.Soils.Add(s16); var s17 = new Soil("kreft onder (18,5)"); soilList.Soils.Add(s17); var s18 = new Soil("kreft naast (18,5)"); soilList.Soils.Add(s18); var s19 = new Soil("verkeer (14)"); soilList.Soils.Add(s19); var s20 = new Soil("pleistoceen (4)"); soilList.Soils.Add(s20); var s21 = new Soil("WL_pleistoceen (4)"); soilList.Soils.Add(s21); return soilList; } } }