// 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;
}
}
}