Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/PlLinesCreator/PlLinesCreator.cs =================================================================== diff -u -r5235 -r5250 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/PlLinesCreator/PlLinesCreator.cs (.../PlLinesCreator.cs) (revision 5235) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/PlLinesCreator/PlLinesCreator.cs (.../PlLinesCreator.cs) (revision 5250) @@ -380,22 +380,23 @@ var plLine = new PlLine(); if (SoilProfile != null) { - IList aquiferLayers = SoilProfile.GetAquiferLayers(); + SoilProfile1D relevantSoilProfile = GetRelevantSoilProfileForAquiferLayersSearch(); + IList aquiferLayers = relevantSoilProfile.GetAquiferLayers(); if (aquiferLayers.Count == 0) { throw new PlLinesCreatorException("Soil profile contains no aquifer layers."); } if (penetrationLength > 0 && aquiferLayers.Count > 0) { - IList infiltrationLayers = (from SoilLayer1D layer in SoilProfile.Layers - where (SoilProfile.InBetweenAquiferLayer == null || layer.TopLevel < SoilProfile.InBetweenAquiferLayer.TopLevel) && - layer.TopLevel > SoilProfile.BottomAquiferLayer.TopLevel + IList infiltrationLayers = (from SoilLayer1D layer in relevantSoilProfile.Layers + where (relevantSoilProfile.InBetweenAquiferLayer == null || layer.TopLevel < relevantSoilProfile.InBetweenAquiferLayer.TopLevel) && + layer.TopLevel > relevantSoilProfile.BottomAquiferLayer.TopLevel select layer).ToList(); if (infiltrationLayers.Count > 0) { - double separationLevel = SoilProfile.BottomAquiferLayer.TopLevel + penetrationLength; + double separationLevel = relevantSoilProfile.BottomAquiferLayer.TopLevel + penetrationLength; if (separationLevel <= infiltrationLayers.First().TopLevel) { @@ -409,15 +410,20 @@ if (separationLevel < separationLayer.TopLevel) { // Split layer at separation level - var extraLayer = new SoilLayer1D(); + var extraLayer = new SoilLayer1D + { + Name = separationLayer.Name + "extra" + }; extraLayer.Assign(separationLayer); extraLayer.TopLevel = separationLevel; - SoilProfile.Layers.Insert(SoilProfile.Layers.IndexOf(separationLayer) + 1, extraLayer); + + SoilProfile.Layers.Insert(relevantSoilProfile.Layers.IndexOf(separationLayer) + 1, extraLayer); + relevantSoilProfile = GetRelevantSoilProfileForAquiferLayersSearch(); } } } - SoilProfile.DetermineInfiltrationLayer(penetrationLength); + SoilProfile.DetermineInfiltrationLayer(penetrationLength, relevantSoilProfile); } } @@ -466,9 +472,6 @@ private PlLine CreatePlLine3Or4ByExpertKnowledge(double headValue, double dampingFactor, PlLineType plLineType, double slopeGradient) { - // Offset to solve issue MWDAM-557 - const double offset = 0.01; - var plLine = new PlLine(); ThrowIfInsufficientSoilGeometryData(); @@ -478,12 +481,8 @@ // The assumption is made that if there is an aquifer at the riverside and at the polderside, // that there is a connection between these aquifers. // In the uplift calculation there will also be a check on the existence of an aquifer. - SoilProfile1D actualSoilProfile = GetSoilProfileBelowPoint(SurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtRiver).X + offset); - if (SurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtRiver) == null) - { - throw new PlLinesCreatorException("Characteristic point \"dike toe at river\" is not defined."); - } - + SoilProfile1D actualSoilProfile = GetRelevantSoilProfileForAquiferLayersSearch(); + if (dampingFactor < 0.0) { throw new PlLinesCreatorException("Damping factor < 0.0"); @@ -1781,6 +1780,20 @@ } } + private SoilProfile1D GetRelevantSoilProfileForAquiferLayersSearch() + { + // Offset to solve issue MWDAM-557 + const double offset = 0.01; + + GeometryPoint relevantPoint = SurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder); + if (relevantPoint == null) + { + throw new PlLinesCreatorException("Characteristic point \"dike toe at polder\" is not defined."); + } + + return GetSoilProfileBelowPoint(relevantPoint.X + offset); + } + /// /// Throws the when water level above dike. /// Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/PlLinesCreator/PlLinesCreatorTest.cs =================================================================== diff -u -r5241 -r5250 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/PlLinesCreator/PlLinesCreatorTest.cs (.../PlLinesCreatorTest.cs) (revision 5241) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/PlLinesCreator/PlLinesCreatorTest.cs (.../PlLinesCreatorTest.cs) (revision 5250) @@ -1056,7 +1056,7 @@ } }; surfaceLine.AddCharacteristicPoint(new GeometryPoint(1.0, 2.0)); - surfaceLine.AddCharacteristicPoint(new GeometryPoint(10.0, 2.0)); + surfaceLine.EnsurePointOfType(10.0, 2.0, CharacteristicPointType.DikeToeAtPolder); surfaceLine.AddCharacteristicPoint(new GeometryPoint(21.0, 2.5)); surfaceLine.Geometry.SyncCalcPoints(); @@ -1149,7 +1149,7 @@ } }; surfaceLine.AddCharacteristicPoint(new GeometryPoint(1.0, 2.0)); - surfaceLine.AddCharacteristicPoint(new GeometryPoint(10.0, 2.0)); + surfaceLine.EnsurePointOfType(10.0, 2.0, CharacteristicPointType.DikeToeAtPolder); surfaceLine.AddCharacteristicPoint(new GeometryPoint(21.0, 2.5)); surfaceLine.Geometry.SyncCalcPoints(); @@ -1170,7 +1170,7 @@ } /// - /// Test if PL2 is created correctly if no inbetween aquifer present and penetration length ending in that aquifer + /// Test if PL2 is NOT created if in-between aquifer present and penetration length ending in that aquifer /// [Test] public void CreatePL2For1DGeometryWithExpertKnowledgeRRDWithSandLayerInBetweenAndPenetrationLengthInThisAquiferLayer() @@ -1189,7 +1189,7 @@ }, WaterLevelRiverHigh = 4.0, WaterLevelPolder = -0.5, - SoilProfile = FactoryForSoilProfiles.CreateClaySandClaySandProfile(), + SoilProfile = FactoryForSoilProfiles.CreateClaySandClaySandProfile(10, -0.5, -1.5, -5), SurfaceLine = surfaceLineTutorial1 }; @@ -1255,7 +1255,7 @@ } }; surfaceLine.AddCharacteristicPoint(new GeometryPoint(1.0, 2.0)); - surfaceLine.AddCharacteristicPoint(new GeometryPoint(10.0, 2.0)); + surfaceLine.EnsurePointOfType(10.0, 2.0, CharacteristicPointType.DikeToeAtPolder); surfaceLine.AddCharacteristicPoint(new GeometryPoint(21.0, 2.5)); surfaceLine.Geometry.SyncCalcPoints(); @@ -1269,7 +1269,7 @@ PenetrationLength = cPenetrationLength } }; - int orgLayerCount = plLineCreator.SoilProfile.Layers.Count; + int originalLayerCount = plLineCreator.SoilProfile.Layers.Count; PlLine plLine = plLineCreator.CreatePlLineByExpertKnowledge(PlLineType.Pl2, 0.02); @@ -1279,9 +1279,9 @@ Assert.That(plLine.Points[0].LocationEquals(new PlLinePoint(1.0, cHeadPl2)), Is.True); Assert.That(plLine.Points[1].LocationEquals(new PlLinePoint(21.0, cHeadPl2)), Is.True); // Check if extra layer is added to soil profile - Assert.That(plLineCreator.SoilProfile.Layers, Has.Count.EqualTo(orgLayerCount + 1)); + Assert.That(plLineCreator.SoilProfile.Layers, Has.Count.EqualTo(originalLayerCount + 1)); }); - Assert.That(plLineCreator.SoilProfile.Layers[orgLayerCount - 1].TopLevel, Is.EqualTo(-2.0).Within(0.01)); + Assert.That(plLineCreator.SoilProfile.Layers[originalLayerCount - 1].TopLevel, Is.EqualTo(-2.0).Within(0.01)); } [Test] @@ -1298,7 +1298,7 @@ } }; surfaceLine.AddCharacteristicPoint(new GeometryPoint(1.0, 2.0)); - surfaceLine.AddCharacteristicPoint(new GeometryPoint(10.0, 2.0)); + surfaceLine.EnsurePointOfType(10.0, 2.0, CharacteristicPointType.DikeToeAtPolder); surfaceLine.AddCharacteristicPoint(new GeometryPoint(21.0, 2.5)); surfaceLine.Geometry.SyncCalcPoints(); @@ -1350,7 +1350,7 @@ } }; surfaceLine.AddCharacteristicPoint(new GeometryPoint(1.0, 2.0)); - surfaceLine.AddCharacteristicPoint(new GeometryPoint(10.0, 2.0)); + surfaceLine.EnsurePointOfType(10.0, 2.0, CharacteristicPointType.DikeToeAtPolder); surfaceLine.AddCharacteristicPoint(new GeometryPoint(21.0, 2.5)); surfaceLine.Geometry.SyncCalcPoints(); @@ -1401,7 +1401,7 @@ } }; surfaceLine.AddCharacteristicPoint(new GeometryPoint(1.0, 2.0)); - surfaceLine.AddCharacteristicPoint(new GeometryPoint(10.0, 2.0)); + surfaceLine.EnsurePointOfType(10.0, 2.0, CharacteristicPointType.DikeToeAtPolder); surfaceLine.AddCharacteristicPoint(new GeometryPoint(21.0, 2.5)); surfaceLine.Geometry.SyncCalcPoints(); @@ -1534,10 +1534,6 @@ plLineCreator.HeadInPlLine2 = -5.0; plLine = plLineCreator.CreatePlLineByExpertKnowledge(PlLineType.Pl3, 0.02); CheckPl3For1DGeometryWithExpertKnowledgeRrdWithHeadPl2Specified(plLine); - - - - } /// Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile1D.cs =================================================================== diff -u -r4934 -r5250 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile1D.cs (.../SoilProfile1D.cs) (revision 4934) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile1D.cs (.../SoilProfile1D.cs) (revision 5250) @@ -364,7 +364,7 @@ /// Determines the infiltration layer. /// /// Length of the penetration. - public void DetermineInfiltrationLayer(double penetrationLength) + public void DetermineInfiltrationLayer(double penetrationLength, SoilProfile1D relevantSoilProfileForAquifersSearch) { InfiltrationLayer = null; @@ -374,10 +374,10 @@ { SoilLayer1D inBetweenAquiferLayer = InBetweenAquiferLayer; - double aquiferBottom = inBetweenAquiferLayer == null ? Double.PositiveInfinity : inBetweenAquiferLayer.BottomLevel; + double aquiferBottom = inBetweenAquiferLayer == null ? double.PositiveInfinity : inBetweenAquiferLayer.BottomLevel; - IList infiltrationLayers = - layers.Where(l => l.TopLevel <= aquiferBottom && l.TopLevel > bottomAquiferLayer.TopLevel) + IList infiltrationLayers = + relevantSoilProfileForAquifersSearch.Layers.Where(l => l.TopLevel <= aquiferBottom && l.TopLevel > bottomAquiferLayer.TopLevel) .ToList(); if (infiltrationLayers.Count > 0)