Index: dam engine/trunk/src/Deltares.DamEngine.Calculators/PlLinesCreator/PLLinesCreator.cs =================================================================== diff -u -r578 -r630 --- dam engine/trunk/src/Deltares.DamEngine.Calculators/PlLinesCreator/PLLinesCreator.cs (.../PLLinesCreator.cs) (revision 578) +++ dam engine/trunk/src/Deltares.DamEngine.Calculators/PlLinesCreator/PLLinesCreator.cs (.../PLLinesCreator.cs) (revision 630) @@ -1677,176 +1677,176 @@ /// /// /// -// private void CreatePhreaticLineSegmentsInShoulderAndPolder(PLLine phreaticLine) -// { -// PLLinePoint intersectionPolderLevelWithDike = DetermineIntersectionBetweenPolderLevelAndDike(this.WaterLevelPolder); -// GeometryPoint dikeToeAtPolderPoint = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder); -// -// double maxXCoordinateSurface = surfaceLine.Geometry.Points.Max(x => x.X); -// if (modelParametersForPLLines.PLLineCreationMethod != PLLineCreationMethod.ExpertKnowledgeLinearInDike) -// { -// // Points created below are points starting at shoulder point to the right -// GeometryPoint shoulderBaseInsidePoint = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderBaseInside); -// if (shoulderBaseInsidePoint != null) -// { -// double zLevel = Math.Min(phreaticLine.Points.Last().Z, -// shoulderBaseInsidePoint.Z - -// Math.Max(cOffsetPhreaticLineBelowSurface, PlLineOffsetBelowShoulderBaseInside)); -// zLevel = Math.Max(zLevel, this.WaterLevelPolder); -// // Add point if it lies left of intersection of polderlevel with dike) -// if ((intersectionPolderLevelWithDike == null) || -// (intersectionPolderLevelWithDike.X > shoulderBaseInsidePoint.X)) -// { -// phreaticLine.Points.Add(new PLLinePoint(shoulderBaseInsidePoint.X, zLevel)); -// } -// -// if (UsePlLineOffsetFactorBelowShoulderCrest.HasValue && UsePlLineOffsetFactorBelowShoulderCrest.Value && -// PlLineOffsetFactorBelowShoulderCrest != null && dikeToeAtPolderPoint != null) -// { -// GeometryPoint shoulderTopInsidePoint = -// surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderTopInside); -// if (shoulderTopInsidePoint != null) -// { -// zLevel = dikeToeAtPolderPoint.Z + (PlLineOffsetFactorBelowShoulderCrest.Value* -// (shoulderTopInsidePoint.Z - dikeToeAtPolderPoint.Z)); -// zLevel = Math.Min(zLevel, shoulderTopInsidePoint.Z - cOffsetPhreaticLineBelowSurface); -// zLevel = Math.Min(zLevel, phreaticLine.Points.Last().Z); -// zLevel = Math.Max(zLevel, this.WaterLevelPolder); -// phreaticLine.Points.Add(new PLLinePoint(shoulderTopInsidePoint.X, zLevel)); -// } -// } -// } -// } -// -// GeometryPoint ditchDikeSidePoint = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchDikeSide); -// if (dikeToeAtPolderPoint != null) -// { -// -// double zLevel = Math.Min(phreaticLine.Points.Last().Z, dikeToeAtPolderPoint.Z - Math.Max(cOffsetPhreaticLineBelowSurface, PlLineOffsetBelowDikeToeAtPolder)); -// if (ditchDikeSidePoint != null) -// { -// if (ditchDikeSidePoint.LocationEquals(dikeToeAtPolderPoint)) -// { -// // If DikeToeAtPolder is same as DitchDikeSide pl1 should always go to polderlevel at this point -// zLevel = this.WaterLevelPolder; -// } -// } -// zLevel = Math.Max(zLevel, this.WaterLevelPolder); -// // Add point if it lies left of intersection of polderlevel with dike -// if ((intersectionPolderLevelWithDike == null) || (intersectionPolderLevelWithDike.X > dikeToeAtPolderPoint.X)) -// { -// phreaticLine.Points.Add(new PLLinePoint(dikeToeAtPolderPoint.X, zLevel)); -// } -// } -// -// if (intersectionPolderLevelWithDike != null) -// { -// phreaticLine.Points.Add(intersectionPolderLevelWithDike); -// } -// -// var isDitchPresent = (ditchDikeSidePoint != null); -// var isNonWaterRetainingOjectPresent = ((NWOPhreaticAdaption != null) && surfaceLine.HasAnnotation(CharacteristicPointType.NonWaterRetainingObjectPoint1)); -// var adjustDitch = false; -// // Handle making the waterlevel horizontal in the NWO at the Polderside when needed (For Riverside see AdaptPL1ForNonWaterRetainingObject). -// var nonWaterRetainingGeometryPoint = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.NonWaterRetainingObjectPoint1); -// if (isNonWaterRetainingOjectPresent && (NWOPhreaticAdaption != PhreaticAdaptionType.Fill) && -// (nonWaterRetainingGeometryPoint.X >= surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder).X)) -// { -// // if there is a ditch and it is to the left of the NWO, then only the ditch needs to be adjusted and the NWO will be correct automatically. -// // if there is a ditch but it is to the right of the NWO, the NWO needs adjusting and the Ditch will be correct automatically. -// // if there is no ditch then the NWO needs adjusting. -// if (isDitchPresent) -// { -// adjustDitch = (nonWaterRetainingGeometryPoint.X >= surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchPolderSide).X); -// } -// if (!adjustDitch) -// { -// GeometryPoint nw1 = nonWaterRetainingGeometryPoint; -// int surfacePointIndex = surfaceLine.Geometry.Points.IndexOf(nw1); -// AdjustForDitchAndOrNonWaterRetainingObjectatPolderSide(phreaticLine, surfacePointIndex); -// } -// } -// else -// { -// // No (relevant) NWO so enable handling of ditch. -// // If there is a ditch but there is also a NWO to the right of it at polder side, then do not adjust the ditch. Do in all other cases. -// // First see if there is a NWO. -// adjustDitch = !isNonWaterRetainingOjectPresent; -// if (!adjustDitch) -// { -// // there is a NWO, check the position -// adjustDitch = -// !((isDitchPresent) && -// (surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.NonWaterRetainingObjectPoint1).X >= -// surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder).X) && -// (surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.NonWaterRetainingObjectPoint4).X <= -// surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchDikeSide).X)); -// } -// } -// // if the NWO is not there or irrelevant and there is a ditch, then adjust it. -// if ((adjustDitch) && (isDitchPresent)) -// { -// int surfacePointIndex = surfaceLine.Geometry.Points.IndexOf(ditchDikeSidePoint); -// AdjustForDitchAndOrNonWaterRetainingObjectatPolderSide(phreaticLine, surfacePointIndex); -// } -// else -// { -// // if no ditch then the PL1 will continue horizontally until the end of the profile -// // another choice could be to let the PL1 go to polderlevel at the end of the profile, but that could be too optimistic for uplift. -// // Discussion about this was done between Vastenburg, Knoeff and The. -// // After a renewed discussion with Vastenburg, Van der Zwan and Bka, it has been decided that the PL1 should follow the -// // surfaceline (with offset) until either end of surface line or polder level. Note: this is only needed when the phreatic level -// // at dike toe is above polder level. -// if ((!isNonWaterRetainingOjectPresent) && (!isDitchPresent)) -// { -// if (phreaticLine.Points[phreaticLine.Points.Count - 1].Z > WaterLevelPolder) -// { -// AddPhreaticLineAlongSurfaceLevel(phreaticLine); -// } -// } -// } -// -// //Validate if endpoint surface has reached -// if (phreaticLine.Points.Last().X != maxXCoordinateSurface) -// { -// PLLinePoint endPoint = new PLLinePoint(maxXCoordinateSurface, phreaticLine.Points.Last().Z); -// phreaticLine.Points.Add(endPoint); -// } -// } + private void CreatePhreaticLineSegmentsInShoulderAndPolder(PLLine phreaticLine) + { + PLLinePoint intersectionPolderLevelWithDike = DetermineIntersectionBetweenPolderLevelAndDike(this.WaterLevelPolder); + GeometryPoint dikeToeAtPolderPoint = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder); -// private void AddPhreaticLineAlongSurfaceLevel(PLLine phreaticLine) -// { -// // Add phreatic point at offset below every surface line point as long as depth > polder level. Else determine the -// // proper position of the point at polder level (intersection) and stop. -// var surfacePointIndex = surfaceLine.Geometry.Points.IndexOf(surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder)) + 1; -// bool intersected = false; -// for (int i = surfacePointIndex; i < surfaceLine.Geometry.Points.Count; i++) -// { -// double z = Math.Max(waterLevelPolder, surfaceLine.Geometry.Points[i].Z - PlLineOffsetBelowDikeToeAtPolder); -// double x = surfaceLine.Geometry.Points[i].X; -// if (waterLevelPolder > surfaceLine.Geometry.Points[i].Z - PlLineOffsetBelowDikeToeAtPolder) -// { -// // Determine intersection between would be phreatic segment and polderlevel. Add that as next point. -// Line waterLevelPolderLine = new Line(new GeometryPoint(surfaceLine.Geometry.Points.First().X, WaterLevelPolder), -// new GeometryPoint(surfaceLine.Geometry.Points.Last().X, 0, WaterLevelPolder)); -// Line slopeLine = new Line(new GeometryPoint(phreaticLine.Points[phreaticLine.Points.Count - 1].X, phreaticLine.Points[phreaticLine.Points.Count - 1].Z), -// new GeometryPoint(surfaceLine.Geometry.Points[i].X, surfaceLine.Geometry.Points[i].Z - PlLineOffsetBelowDikeToeAtPolder)); -// GeometryPoint intersectionPoint = new GeometryPoint(); -// if (waterLevelPolderLine.IntersectsZ(slopeLine, out intersectionPoint)) -// { -// x = intersectionPoint.X; -// } -// intersected = true; -// } -// PLLinePoint point = new PLLinePoint(x, z); -// phreaticLine.Points.Add(point); -// if (intersected) -// { -// break; -// } -// } -// } + double maxXCoordinateSurface = surfaceLine.Geometry.Points.Max(x => x.X); + if (modelParametersForPLLines.PLLineCreationMethod != PLLineCreationMethod.ExpertKnowledgeLinearInDike) + { + // Points created below are points starting at shoulder point to the right + GeometryPoint shoulderBaseInsidePoint = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderBaseInside); + if (shoulderBaseInsidePoint != null) + { + double zLevel = Math.Min(phreaticLine.Points.Last().Z, + shoulderBaseInsidePoint.Z - + Math.Max(cOffsetPhreaticLineBelowSurface, PlLineOffsetBelowShoulderBaseInside)); + zLevel = Math.Max(zLevel, this.WaterLevelPolder); + // Add point if it lies left of intersection of polderlevel with dike) + if ((intersectionPolderLevelWithDike == null) || + (intersectionPolderLevelWithDike.X > shoulderBaseInsidePoint.X)) + { + phreaticLine.Points.Add(new PLLinePoint(shoulderBaseInsidePoint.X, zLevel)); + } + if (UsePlLineOffsetFactorBelowShoulderCrest.HasValue && UsePlLineOffsetFactorBelowShoulderCrest.Value && + PlLineOffsetFactorBelowShoulderCrest != null && dikeToeAtPolderPoint != null) + { + GeometryPoint shoulderTopInsidePoint = + surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderTopInside); + if (shoulderTopInsidePoint != null) + { + zLevel = dikeToeAtPolderPoint.Z + (PlLineOffsetFactorBelowShoulderCrest.Value * + (shoulderTopInsidePoint.Z - dikeToeAtPolderPoint.Z)); + zLevel = Math.Min(zLevel, shoulderTopInsidePoint.Z - cOffsetPhreaticLineBelowSurface); + zLevel = Math.Min(zLevel, phreaticLine.Points.Last().Z); + zLevel = Math.Max(zLevel, this.WaterLevelPolder); + phreaticLine.Points.Add(new PLLinePoint(shoulderTopInsidePoint.X, zLevel)); + } + } + } + } + + GeometryPoint ditchDikeSidePoint = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchDikeSide); + if (dikeToeAtPolderPoint != null) + { + + double zLevel = Math.Min(phreaticLine.Points.Last().Z, dikeToeAtPolderPoint.Z - Math.Max(cOffsetPhreaticLineBelowSurface, PlLineOffsetBelowDikeToeAtPolder)); + if (ditchDikeSidePoint != null) + { + if (ditchDikeSidePoint.LocationEquals(dikeToeAtPolderPoint)) + { + // If DikeToeAtPolder is same as DitchDikeSide pl1 should always go to polderlevel at this point + zLevel = this.WaterLevelPolder; + } + } + zLevel = Math.Max(zLevel, this.WaterLevelPolder); + // Add point if it lies left of intersection of polderlevel with dike + if ((intersectionPolderLevelWithDike == null) || (intersectionPolderLevelWithDike.X > dikeToeAtPolderPoint.X)) + { + phreaticLine.Points.Add(new PLLinePoint(dikeToeAtPolderPoint.X, zLevel)); + } + } + + if (intersectionPolderLevelWithDike != null) + { + phreaticLine.Points.Add(intersectionPolderLevelWithDike); + } + + var isDitchPresent = (ditchDikeSidePoint != null); + var isNonWaterRetainingOjectPresent = ((NWOPhreaticAdaption != null) && surfaceLine.HasAnnotation(CharacteristicPointType.NonWaterRetainingObjectPoint1)); + var adjustDitch = false; + // Handle making the waterlevel horizontal in the NWO at the Polderside when needed (For Riverside see AdaptPL1ForNonWaterRetainingObject). + var nonWaterRetainingGeometryPoint = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.NonWaterRetainingObjectPoint1); + if (isNonWaterRetainingOjectPresent && (NWOPhreaticAdaption != PhreaticAdaptionType.Fill) && + (nonWaterRetainingGeometryPoint.X >= surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder).X)) + { + // if there is a ditch and it is to the left of the NWO, then only the ditch needs to be adjusted and the NWO will be correct automatically. + // if there is a ditch but it is to the right of the NWO, the NWO needs adjusting and the Ditch will be correct automatically. + // if there is no ditch then the NWO needs adjusting. + if (isDitchPresent) + { + adjustDitch = (nonWaterRetainingGeometryPoint.X >= surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchPolderSide).X); + } + if (!adjustDitch) + { + GeometryPoint nw1 = nonWaterRetainingGeometryPoint; + int surfacePointIndex = surfaceLine.Geometry.Points.IndexOf(nw1); + AdjustForDitchAndOrNonWaterRetainingObjectatPolderSide(phreaticLine, surfacePointIndex); + } + } + else + { + // No (relevant) NWO so enable handling of ditch. + // If there is a ditch but there is also a NWO to the right of it at polder side, then do not adjust the ditch. Do in all other cases. + // First see if there is a NWO. + adjustDitch = !isNonWaterRetainingOjectPresent; + if (!adjustDitch) + { + // there is a NWO, check the position + adjustDitch = + !((isDitchPresent) && + (surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.NonWaterRetainingObjectPoint1).X >= + surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder).X) && + (surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.NonWaterRetainingObjectPoint4).X <= + surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchDikeSide).X)); + } + } + // if the NWO is not there or irrelevant and there is a ditch, then adjust it. + if ((adjustDitch) && (isDitchPresent)) + { + int surfacePointIndex = surfaceLine.Geometry.Points.IndexOf(ditchDikeSidePoint); + AdjustForDitchAndOrNonWaterRetainingObjectatPolderSide(phreaticLine, surfacePointIndex); + } + else + { + // if no ditch then the PL1 will continue horizontally until the end of the profile + // another choice could be to let the PL1 go to polderlevel at the end of the profile, but that could be too optimistic for uplift. + // Discussion about this was done between Vastenburg, Knoeff and The. + // After a renewed discussion with Vastenburg, Van der Zwan and Bka, it has been decided that the PL1 should follow the + // surfaceline (with offset) until either end of surface line or polder level. Note: this is only needed when the phreatic level + // at dike toe is above polder level. + if ((!isNonWaterRetainingOjectPresent) && (!isDitchPresent)) + { + if (phreaticLine.Points[phreaticLine.Points.Count - 1].Z > WaterLevelPolder) + { + AddPhreaticLineAlongSurfaceLevel(phreaticLine); + } + } + } + + //Validate if endpoint surface has reached + if (phreaticLine.Points.Last().X != maxXCoordinateSurface) + { + PLLinePoint endPoint = new PLLinePoint(maxXCoordinateSurface, phreaticLine.Points.Last().Z); + phreaticLine.Points.Add(endPoint); + } + } + + private void AddPhreaticLineAlongSurfaceLevel(PLLine phreaticLine) + { + // Add phreatic point at offset below every surface line point as long as depth > polder level. Else determine the + // proper position of the point at polder level (intersection) and stop. + var surfacePointIndex = surfaceLine.Geometry.Points.IndexOf(surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder)) + 1; + bool intersected = false; + for (int i = surfacePointIndex; i < surfaceLine.Geometry.Points.Count; i++) + { + double z = Math.Max(waterLevelPolder, surfaceLine.Geometry.Points[i].Z - PlLineOffsetBelowDikeToeAtPolder); + double x = surfaceLine.Geometry.Points[i].X; + if (waterLevelPolder > surfaceLine.Geometry.Points[i].Z - PlLineOffsetBelowDikeToeAtPolder) + { + // Determine intersection between would be phreatic segment and polderlevel. Add that as next point. + Line waterLevelPolderLine = new Line(new Point2D(surfaceLine.Geometry.Points.First().X, WaterLevelPolder), + new Point2D(surfaceLine.Geometry.Points.Last().X, WaterLevelPolder)); + Line slopeLine = new Line(new Point2D(phreaticLine.Points[phreaticLine.Points.Count - 1].X, phreaticLine.Points[phreaticLine.Points.Count - 1].Z), + new Point2D(surfaceLine.Geometry.Points[i].X, surfaceLine.Geometry.Points[i].Z - PlLineOffsetBelowDikeToeAtPolder)); + Point2D intersectionPoint = new Point2D(); + if (waterLevelPolderLine.IntersectsZ(slopeLine, out intersectionPoint)) + { + x = intersectionPoint.X; + } + intersected = true; + } + PLLinePoint point = new PLLinePoint(x, z); + phreaticLine.Points.Add(point); + if (intersected) + { + break; + } + } + } + private void AdjustForDitchAndOrNonWaterRetainingObjectatPolderSide(PLLine phreaticLine, int surfacePointIndex) { const double maxDouble = 99999.999; @@ -2116,7 +2116,7 @@ { CreatePhreaticLineSegmentsInsideDikeForHighRiverLevel(phreaticLine); } - //CreatePhreaticLineSegmentsInShoulderAndPolder(phreaticLine); ##Bka + CreatePhreaticLineSegmentsInShoulderAndPolder(phreaticLine); //Check if phreatic line is above ValidatePhreaticAboveWaterLevelPolder(phreaticLine); Index: dam engine/trunk/src/Deltares.DamEngine.Interface.Tests/PipingBlighTests.cs =================================================================== diff -u -r612 -r630 --- dam engine/trunk/src/Deltares.DamEngine.Interface.Tests/PipingBlighTests.cs (.../PipingBlighTests.cs) (revision 612) +++ dam engine/trunk/src/Deltares.DamEngine.Interface.Tests/PipingBlighTests.cs (.../PipingBlighTests.cs) (revision 630) @@ -21,13 +21,15 @@ using System; using System.IO; +using Deltares.DamEngine.Io; using NUnit.Framework; namespace Deltares.DamEngine.Interface.Tests { [TestFixture] public class PipingBlighTests { + private const double tolerance = 0.0005; [Test] public void CanPerformBlighDesignPipingVoorbeeld1() { @@ -36,7 +38,32 @@ EngineInterface engineInterface = new EngineInterface(inputString); Assert.IsNotNull(engineInterface.DamProjectData); string outputString = engineInterface.Run(); + // Factor piping = 0.521 + // Kritische hoogte = 1.667 + // Factor opdrijven = 0.351 + // Kwelweglengte piping = 25.0 + // Intredepunt x-lokaal = 10.0 + // Uittredepunt x-lokaal = 35.0 + // Opdrijven = true + // Profielnaam = soilprofile_01 + // PL3 opdrijven = 0.582 + // PL3 stijghoogte aangepast = 1.262 + // PL3 locatie opdriven lokaal = 35.0 + // PL4 opdrijven = 0.0 + // PL4 stijghoogte aangepast = 0.0 + // PL4 locatie opdrijven lokaal = 0.0 + // Locatie naam = "profiel 1" + // ID locatie scenario = "1" + // Heave Factor = 90.0 Assert.IsNotNull(outputString); + var output = DamXmlSerialization.LoadOutputFromXmlString(outputString); + Assert.AreEqual(0.521, output.Results.CalculationResults.DesignResults[0].PipingDesignResults.BlighFactor, tolerance); + Assert.AreEqual(1.667, output.Results.CalculationResults.DesignResults[0].PipingDesignResults.BlighHcritical, tolerance); + //Assert.AreEqual(0.351, output.Results.CalculationResults.DesignResults[0].PipingDesignResults.UpliftFactor, tolerance); + //Assert.AreEqual(true, output.Results.CalculationResults.DesignResults[0].PipingDesignResults.UpliftSituation.IsUplift); + //Assert.AreEqual(1.262, output.Results.CalculationResults.DesignResults[0].PipingDesignResults.UpliftSituation.Pl3HeadAdjusted, tolerance); + //Assert.AreEqual(35.0, output.Results.CalculationResults.DesignResults[0].PipingDesignResults.UpliftSituation.Pl3LocationXMinUplift, tolerance); + //Assert.AreEqual(0.351, output.Results.CalculationResults.DesignResults[0].PipingDesignResults.UpliftSituation.Pl3MinUplift, tolerance); } [Test, ExpectedException(typeof(NullReferenceException))] Index: dam engine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/DamPipingBligh/DamPipingBlighKernelWrapper.cs =================================================================== diff -u -r624 -r630 --- dam engine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/DamPipingBligh/DamPipingBlighKernelWrapper.cs (.../DamPipingBlighKernelWrapper.cs) (revision 624) +++ dam engine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/DamPipingBligh/DamPipingBlighKernelWrapper.cs (.../DamPipingBlighKernelWrapper.cs) (revision 630) @@ -18,6 +18,7 @@ /// public class DamPipingBlighKernelWrapper : IKernelWrapper { + private const double factorMeterToMicroMeter = 1.0e6; private const double defaultFluidisationGradient = 0.3; public const double defaultMaxReturnValue = 90.0; @@ -55,7 +56,7 @@ xExit = upliftLocationAndResult.X; surfaceLevel = surfaceLine.Geometry.GetZatX(upliftLocationAndResult.X); SoilLayer1D heaveLayer = soilProfile1D.GetLayerWithName(upliftLocationAndResult.LayerWhereUpliftOccuresId); - d70 = heaveLayer.Soil.DiameterD70; + d70 = factorMeterToMicroMeter * heaveLayer.Soil.DiameterD70; var topLevelAquifer = soilProfile1D.GetLayerWithName(upliftLocationAndResult.LayerWhereUpliftOccuresId).TopLevel; dCoverLayer = DamPipingHelper.DetermineHeightCoverLayer(topLevelAquifer, surfaceLevel); } @@ -178,6 +179,11 @@ pipingDesignResults.BlighFactor = damPipingBlighOutput.FoSp; pipingDesignResults.BlighHcritical = damPipingBlighOutput.Hc; designResult.PipingDesignResults = pipingDesignResults; + // Location name + // LocationscenarioId + // Profilename + // Calculationresult + } }