// Copyright (C) Stichting Deltares 2024. 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 Deltares.DamEngine.Data.Geotechnics; using NUnit.Framework; namespace Deltares.DamEngine.Data.Tests.Geotechnics; [TestFixture] public class SoilProfile1DTests { private const double topLevelLayer1 = 17; private const double topLevelLayer2 = 12; private const double topLevelLayer3 = 4; private const double topLevelLayer4 = 0; private const double topLevelLayer5 = -5; private const double topLevelLayer6 = -9; private const double bottomLevelLayer6 = -20; [Test] public void GivenASoilProfile1D_WhenGettingTheAquifersPosition_ThenExpectedPositionsAreReturned() { // 3 layers with aquifer, aquitard, aquifer => no in-between aquifer, bottom aquifer is layer 3 and highest aquifer // is also layer 3 because the other aquifer (layer 1) is the top layer so not relevant for the waternet. SoilProfile1D soilProfile1D = CreateProfileWith3Layers(true, false, true); Assert.Multiple(() => { Assert.That(soilProfile1D.GetInBetweenAquiferClusters, Is.Empty); Assert.That(soilProfile1D.InBetweenAquiferLayer, Is.Null); Assert.That(soilProfile1D.GetHighestAquifer().TopLevel, Is.EqualTo(topLevelLayer3)); Assert.That(soilProfile1D.GetHighestAquifer().BottomLevel, Is.EqualTo(topLevelLayer4)); Assert.That(soilProfile1D.BottomAquiferLayer.TopLevel, Is.EqualTo(topLevelLayer3)); Assert.That(soilProfile1D.BottomAquiferLayer.BottomLevel, Is.EqualTo(topLevelLayer4)); Assert.That(soilProfile1D.GetLowestLayerOfHighestAquiferCluster().TopLevel, Is.EqualTo(topLevelLayer3)); Assert.That(soilProfile1D.GetLowestLayerOfHighestAquiferCluster().BottomLevel, Is.EqualTo(topLevelLayer4)); }); // 3 clusters with aquifer, aquitard, aquifer => no in-between aquifer and bottom aquifer is the highest layer of cluster 5-6 soilProfile1D = CreateProfileWith6Layers(true, true, false, false, true, true); Assert.Multiple(() => { Assert.That(soilProfile1D.GetInBetweenAquiferClusters, Is.Empty); Assert.That(soilProfile1D.InBetweenAquiferLayer, Is.Null); Assert.That(soilProfile1D.GetHighestAquifer().TopLevel, Is.EqualTo(topLevelLayer5)); Assert.That(soilProfile1D.GetHighestAquifer().BottomLevel, Is.EqualTo(topLevelLayer6)); Assert.That(soilProfile1D.BottomAquiferLayer.TopLevel, Is.EqualTo(topLevelLayer5)); Assert.That(soilProfile1D.BottomAquiferLayer.BottomLevel, Is.EqualTo(topLevelLayer6)); Assert.That(soilProfile1D.GetLowestLayerOfHighestAquiferCluster().TopLevel, Is.EqualTo(topLevelLayer6)); Assert.That(soilProfile1D.GetLowestLayerOfHighestAquiferCluster().BottomLevel, Is.EqualTo(bottomLevelLayer6)); }); // All layers are aquifers => no in-between aquifer and bottom aquifer is the highest aquifer (layer 1) soilProfile1D = CreateProfileWith6Layers(true, true, true, true, true, true); Assert.Multiple(() => { Assert.That(soilProfile1D.GetInBetweenAquiferClusters, Is.Empty); Assert.That(soilProfile1D.InBetweenAquiferLayer, Is.Null); Assert.That(soilProfile1D.GetHighestAquifer().TopLevel, Is.EqualTo(topLevelLayer1)); Assert.That(soilProfile1D.GetHighestAquifer().BottomLevel, Is.EqualTo(topLevelLayer2)); Assert.That(soilProfile1D.BottomAquiferLayer.TopLevel, Is.EqualTo(topLevelLayer1)); Assert.That(soilProfile1D.BottomAquiferLayer.BottomLevel, Is.EqualTo(topLevelLayer2)); Assert.That(soilProfile1D.GetLowestLayerOfHighestAquiferCluster().TopLevel, Is.EqualTo(topLevelLayer6)); Assert.That(soilProfile1D.GetLowestLayerOfHighestAquiferCluster().BottomLevel, Is.EqualTo(bottomLevelLayer6)); }); // All layers are aquitard => no in-between aquifer and no bottom aquifer soilProfile1D = CreateProfileWith6Layers(false, false, false, false, false, false); Assert.Multiple(() => { Assert.That(soilProfile1D.GetInBetweenAquiferClusters, Is.Empty); Assert.That(soilProfile1D.InBetweenAquiferLayer, Is.Null); Assert.That(soilProfile1D.GetHighestAquifer(), Is.Null); Assert.That(soilProfile1D.BottomAquiferLayer, Is.Null); Assert.That(soilProfile1D.GetLowestLayerOfHighestAquiferCluster(), Is.Null); }); // Aquifers are at top and bottom of the profile => no in-between aquifer and bottom aquifer is the highest layer of cluster 3-6 soilProfile1D = CreateProfileWith6Layers(true, false, true, true, true, true); Assert.Multiple(() => { Assert.That(soilProfile1D.GetInBetweenAquiferClusters, Is.Empty); Assert.That(soilProfile1D.InBetweenAquiferLayer, Is.Null); Assert.That(soilProfile1D.GetHighestAquifer().TopLevel, Is.EqualTo(topLevelLayer3)); Assert.That(soilProfile1D.GetHighestAquifer().BottomLevel, Is.EqualTo(topLevelLayer4)); Assert.That(soilProfile1D.BottomAquiferLayer.TopLevel, Is.EqualTo(topLevelLayer3)); Assert.That(soilProfile1D.BottomAquiferLayer.BottomLevel, Is.EqualTo(topLevelLayer4)); Assert.That(soilProfile1D.GetLowestLayerOfHighestAquiferCluster().TopLevel, Is.EqualTo(topLevelLayer6)); Assert.That(soilProfile1D.GetLowestLayerOfHighestAquiferCluster().BottomLevel, Is.EqualTo(bottomLevelLayer6)); }); // Top aquitard cluster and bottom aquifer cluster => no in-between aquifer and bottom aquifer is the highest layer of cluster 4-6 soilProfile1D = CreateProfileWith6Layers(false, false, false, true, true, true); Assert.Multiple(() => { Assert.That(soilProfile1D.GetInBetweenAquiferClusters, Is.Empty); Assert.That(soilProfile1D.InBetweenAquiferLayer, Is.Null); Assert.That(soilProfile1D.GetHighestAquifer().TopLevel, Is.EqualTo(topLevelLayer4)); Assert.That(soilProfile1D.GetHighestAquifer().BottomLevel, Is.EqualTo(topLevelLayer5)); Assert.That(soilProfile1D.BottomAquiferLayer.TopLevel, Is.EqualTo(topLevelLayer4)); Assert.That(soilProfile1D.BottomAquiferLayer.BottomLevel, Is.EqualTo(topLevelLayer5)); Assert.That(soilProfile1D.GetLowestLayerOfHighestAquiferCluster().TopLevel, Is.EqualTo(topLevelLayer6)); Assert.That(soilProfile1D.GetLowestLayerOfHighestAquiferCluster().BottomLevel, Is.EqualTo(bottomLevelLayer6)); }); // 2 in-between aquifers present (layers 2 and 4) and bottom aquifer is the lowest layer soilProfile1D = CreateProfileWith6Layers(false, true, false, true, false, true); Assert.That(soilProfile1D.GetInBetweenAquiferClusters, Has.Count.EqualTo(2)); Assert.Multiple(() => { Assert.That(soilProfile1D.GetInBetweenAquiferClusters[0].Item1.TopLevel, Is.EqualTo(topLevelLayer2)); Assert.That(soilProfile1D.GetInBetweenAquiferClusters[0].Item2.BottomLevel, Is.EqualTo(topLevelLayer3)); Assert.That(soilProfile1D.GetInBetweenAquiferClusters[1].Item1.TopLevel, Is.EqualTo(topLevelLayer4)); Assert.That(soilProfile1D.GetInBetweenAquiferClusters[1].Item2.BottomLevel, Is.EqualTo(topLevelLayer5)); Assert.That(soilProfile1D.InBetweenAquiferLayer.TopLevel, Is.EqualTo(topLevelLayer2)); Assert.That(soilProfile1D.InBetweenAquiferLayer.BottomLevel, Is.EqualTo(topLevelLayer3)); Assert.That(soilProfile1D.GetHighestAquifer().TopLevel, Is.EqualTo(topLevelLayer2)); Assert.That(soilProfile1D.GetHighestAquifer().BottomLevel, Is.EqualTo(topLevelLayer3)); Assert.That(soilProfile1D.BottomAquiferLayer.TopLevel, Is.EqualTo(topLevelLayer6)); Assert.That(soilProfile1D.BottomAquiferLayer.BottomLevel, Is.EqualTo(bottomLevelLayer6)); Assert.That(soilProfile1D.GetLowestLayerOfHighestAquiferCluster().TopLevel, Is.EqualTo(topLevelLayer2)); Assert.That(soilProfile1D.GetLowestLayerOfHighestAquiferCluster().BottomLevel, Is.EqualTo(topLevelLayer3)); }); // 1 in-between aquifers cluster present (layers 2-4) and bottom aquifer is the lowest layer soilProfile1D = CreateProfileWith6Layers(false, true, true, true, false, true); Assert.That(soilProfile1D.GetInBetweenAquiferClusters, Has.Count.EqualTo(1)); Assert.Multiple(() => { Assert.That(soilProfile1D.GetInBetweenAquiferClusters[0].Item1.TopLevel, Is.EqualTo(topLevelLayer2)); Assert.That(soilProfile1D.GetInBetweenAquiferClusters[0].Item2.BottomLevel, Is.EqualTo(topLevelLayer5)); Assert.That(soilProfile1D.InBetweenAquiferLayer.TopLevel, Is.EqualTo(topLevelLayer2)); Assert.That(soilProfile1D.InBetweenAquiferLayer.BottomLevel, Is.EqualTo(topLevelLayer3)); Assert.That(soilProfile1D.GetHighestAquifer().TopLevel, Is.EqualTo(topLevelLayer2)); Assert.That(soilProfile1D.GetHighestAquifer().BottomLevel, Is.EqualTo(topLevelLayer3)); Assert.That(soilProfile1D.BottomAquiferLayer.TopLevel, Is.EqualTo(topLevelLayer6)); Assert.That(soilProfile1D.BottomAquiferLayer.BottomLevel, Is.EqualTo(bottomLevelLayer6)); Assert.That(soilProfile1D.GetLowestLayerOfHighestAquiferCluster().TopLevel, Is.EqualTo(topLevelLayer4)); Assert.That(soilProfile1D.GetLowestLayerOfHighestAquiferCluster().BottomLevel, Is.EqualTo(topLevelLayer5)); }); // 1 in-between aquifer present (layer 2) and bottom aquifer is the highest layer of cluster 4-6 soilProfile1D = CreateProfileWith6Layers(false, true, false, true, true, true); Assert.That(soilProfile1D.GetInBetweenAquiferClusters, Has.Count.EqualTo(1)); Assert.Multiple(() => { Assert.That(soilProfile1D.GetInBetweenAquiferClusters[0].Item1.TopLevel, Is.EqualTo(topLevelLayer2)); Assert.That(soilProfile1D.GetInBetweenAquiferClusters[0].Item2.BottomLevel, Is.EqualTo(topLevelLayer3)); Assert.That(soilProfile1D.InBetweenAquiferLayer.TopLevel, Is.EqualTo(topLevelLayer2)); Assert.That(soilProfile1D.InBetweenAquiferLayer.BottomLevel, Is.EqualTo(topLevelLayer3)); Assert.That(soilProfile1D.GetHighestAquifer().TopLevel, Is.EqualTo(topLevelLayer2)); Assert.That(soilProfile1D.GetHighestAquifer().BottomLevel, Is.EqualTo(topLevelLayer3)); Assert.That(soilProfile1D.BottomAquiferLayer.TopLevel, Is.EqualTo(topLevelLayer4)); Assert.That(soilProfile1D.BottomAquiferLayer.BottomLevel, Is.EqualTo(topLevelLayer5)); Assert.That(soilProfile1D.GetLowestLayerOfHighestAquiferCluster().TopLevel, Is.EqualTo(topLevelLayer2)); Assert.That(soilProfile1D.GetLowestLayerOfHighestAquiferCluster().BottomLevel, Is.EqualTo(topLevelLayer3)); }); } private static SoilProfile1D CreateProfileWith6Layers(bool isLayer1Aquifer, bool isLayer2Aquifer, bool isLayer3Aquifer, bool isLayer4Aquifer, bool isLayer5Aquifer, bool isLayer6Aquifer) { var soilProfile1D = new SoilProfile1D(); var soilLayer1 = new SoilLayer1D { TopLevel = topLevelLayer1, IsAquifer = isLayer1Aquifer }; soilProfile1D.Layers.Add(soilLayer1); var soilLayer2 = new SoilLayer1D { TopLevel = topLevelLayer2, IsAquifer = isLayer2Aquifer }; soilProfile1D.Layers.Add(soilLayer2); var soilLayer3 = new SoilLayer1D { TopLevel = topLevelLayer3, IsAquifer = isLayer3Aquifer }; soilProfile1D.Layers.Add(soilLayer3); var soilLayer4 = new SoilLayer1D { TopLevel = topLevelLayer4, IsAquifer = isLayer4Aquifer }; soilProfile1D.Layers.Add(soilLayer4); var soilLayer5 = new SoilLayer1D { TopLevel = topLevelLayer5, IsAquifer = isLayer5Aquifer }; soilProfile1D.Layers.Add(soilLayer5); var soilLayer6 = new SoilLayer1D { TopLevel = topLevelLayer6, IsAquifer = isLayer6Aquifer }; soilProfile1D.Layers.Add(soilLayer6); soilProfile1D.BottomLevel = bottomLevelLayer6; return soilProfile1D; } private static SoilProfile1D CreateProfileWith3Layers(bool isLayer1Aquifer, bool isLayer2Aquifer, bool isLayer3Aquifer) { var soilProfile1D = new SoilProfile1D(); var soilLayer1 = new SoilLayer1D { TopLevel = topLevelLayer1, IsAquifer = isLayer1Aquifer }; soilProfile1D.Layers.Add(soilLayer1); var soilLayer2 = new SoilLayer1D { TopLevel = topLevelLayer2, IsAquifer = isLayer2Aquifer }; soilProfile1D.Layers.Add(soilLayer2); var soilLayer3 = new SoilLayer1D { TopLevel = topLevelLayer3, IsAquifer = isLayer3Aquifer }; soilProfile1D.Layers.Add(soilLayer3); soilProfile1D.BottomLevel = topLevelLayer4; return soilProfile1D; } }