Index: DamEngine/trunk/src/Deltares.DamEngine.TestHelpers/Factories/FactoryForDamProjectData.cs =================================================================== diff -u -r4053 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.TestHelpers/Factories/FactoryForDamProjectData.cs (.../FactoryForDamProjectData.cs) (revision 4053) +++ DamEngine/trunk/src/Deltares.DamEngine.TestHelpers/Factories/FactoryForDamProjectData.cs (.../FactoryForDamProjectData.cs) (revision 4412) @@ -387,6 +387,7 @@ location.Scenarios.Add(designScenario); } + location.CurrentScenario = location.Scenarios[0]; location.DikeEmbankmentMaterial = "DikeMat"; location.StabilityOptions = new StabilityOptions { @@ -494,7 +495,7 @@ designScenario.RequiredSafetyFactorStabilityInnerSlope = 1.0 * factor + 0.64; designScenario.RequiredSafetyFactorStabilityOuterSlope = 1.0 * factor + 0.65; designScenario.RequiredSafetyFactorPiping = 1.0 * factor + 0.66; - designScenario.Location = location; + designScenario.LocationName = location.Name; return designScenario; } Index: DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/MultiCoreMacroStabilityTests.cs =================================================================== diff -u -r4331 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/MultiCoreMacroStabilityTests.cs (.../MultiCoreMacroStabilityTests.cs) (revision 4331) +++ DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/MultiCoreMacroStabilityTests.cs (.../MultiCoreMacroStabilityTests.cs) (revision 4412) @@ -419,6 +419,165 @@ } } + [Test] + [TestCase(1, true)] + [TestCase(4, true)] + [TestCase(16, true)] + [TestCase(1, false)] + [TestCase(4, false)] + [TestCase(16, false)] + public void DesignBishopAdaptionWithScenariosForHeadPL3CalculatesCorrect(int maxCores, bool justOneScenario) + { + const string inputFilename = "InputFileMultiCoreTestForScenarioAdaption.xml"; + string fullInputFilename = Path.Combine(mapTestFiles, inputFilename); + Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; + string inputString = File.ReadAllText(fullInputFilename); + var engineInterface = new EngineInterface(inputString); + engineInterface.DamProjectData.MaxCalculationCores = maxCores; + var calcDir = engineInterface.DamProjectData.CalculationMap + "_Cores_" + maxCores; + if (justOneScenario) + { + var firstScenario = engineInterface.DamProjectData.Dike.Locations.First().Scenarios.First(); + engineInterface.DamProjectData.Dike.ClearScenarios(); + engineInterface.DamProjectData.Dike.AddScenarioToAllLocations(firstScenario); + calcDir = engineInterface.DamProjectData.CalculationMap + "_OneScenario_Cores_" + maxCores; + } + + engineInterface.DamProjectData.CalculationMap = calcDir; + Assert.IsNotNull(engineInterface.DamProjectData); + calcDir = Directory.GetCurrentDirectory() + "\\" + calcDir; + if (Directory.Exists(calcDir)) + { + Directory.Delete(calcDir, true); // delete previous results + } + string result = engineInterface.Validate(); + Assert.IsTrue(result == null, "Validation must succeed but does not, see output xml in debugger"); + string outputString = engineInterface.Run(); + File.WriteAllText("Results_Cores_" + maxCores + ".xml", outputString); + Output output = DamXmlSerialization.LoadOutputFromXmlString(outputString); + if (justOneScenario) + { + Assert.AreEqual(9, output.Results.CalculationResults.Length); + Assert.AreEqual(1465, output.Results.CalculationMessages.Length); + } + else + { + Assert.AreEqual(18, output.Results.CalculationResults.Length); + Assert.AreEqual(3299, output.Results.CalculationMessages.Length); + } + foreach (var designResult in output.Results.CalculationResults) + { + if (designResult.BaseFileName.Equals("Loc(KR093_0013)_Sce(3)_Pro(segment_627_1D1-KR093_0013-1)_Ite23")) + { + Assert.AreEqual(9.300, designResult.StabilityDesignResults.SafetyFactor, tolerance); + Assert.AreEqual("3", designResult.ScenarioName); + Assert.AreEqual(-0.94, designResult.StabilityDesignResults.UpliftSituation.Pl3HeadAdjusted, tol2Digits); + } + if (designResult.BaseFileName.Equals("Loc(KR093_0013)_Sce(4)_Pro(segment_627_1D1-KR093_0013-1)")) + { + Assert.AreEqual(7.888, designResult.StabilityDesignResults.SafetyFactor, tolerance); + Assert.AreEqual("4", designResult.ScenarioName); + Assert.AreEqual(-0.37, designResult.StabilityDesignResults.UpliftSituation.Pl3HeadAdjusted, tol2Digits); + } + if (designResult.BaseFileName.Equals("Loc(KR093_0013)_Sce(3)_Pro(segment_627_1D2-KR093_0013-2)")) + { + Assert.AreEqual(7.023, designResult.StabilityDesignResults.SafetyFactor, tolerance); + Assert.AreEqual("3", designResult.ScenarioName); + Assert.AreEqual(-0.94, designResult.StabilityDesignResults.UpliftSituation.Pl3HeadAdjusted, tol2Digits); + } + if (designResult.BaseFileName.Equals("Loc(KR093_0013)_Sce(4)_Pro(segment_627_1D2-KR093_0013-2)")) + { + Assert.AreEqual(5.968, designResult.StabilityDesignResults.SafetyFactor, tolerance); + Assert.AreEqual("4", designResult.ScenarioName); + Assert.AreEqual(-0.37, designResult.StabilityDesignResults.UpliftSituation.Pl3HeadAdjusted, tol2Digits); + } + if (designResult.BaseFileName.Equals("Loc(KR093_0013)_Sce(3)_Pro(segment_627_1D3-KR093_0013-3)")) + { + Assert.AreEqual(7.555, designResult.StabilityDesignResults.SafetyFactor, tolerance); + Assert.AreEqual("3", designResult.ScenarioName); + Assert.AreEqual(-0.94, designResult.StabilityDesignResults.UpliftSituation.Pl3HeadAdjusted, tol2Digits); + } + if (designResult.BaseFileName.Equals("Loc(KR093_0013)_Sce(4)_Pro(segment_627_1D3-KR093_0013-3)")) + { + Assert.AreEqual(6.477, designResult.StabilityDesignResults.SafetyFactor, tolerance); + Assert.AreEqual("4", designResult.ScenarioName); + Assert.AreEqual(-0.37, designResult.StabilityDesignResults.UpliftSituation.Pl3HeadAdjusted, tol2Digits); + } + if (designResult.BaseFileName.Equals("Loc(KR093_0018)_Sce(3)_Pro(segment_629_1D1-KR093_0018-1)")) + { + Assert.AreEqual(7.353, designResult.StabilityDesignResults.SafetyFactor, tolerance); + Assert.AreEqual("3", designResult.ScenarioName); + Assert.AreEqual(-1.00, designResult.StabilityDesignResults.UpliftSituation.Pl3HeadAdjusted, tol2Digits); + } + if (designResult.BaseFileName.Equals("Loc(KR093_0018)_Sce(4)_Pro(segment_629_1D1-KR093_0018-1)")) + { + Assert.AreEqual(6.278, designResult.StabilityDesignResults.SafetyFactor, tolerance); + Assert.AreEqual("4", designResult.ScenarioName); + Assert.AreEqual(-0.61, designResult.StabilityDesignResults.UpliftSituation.Pl3HeadAdjusted, tol2Digits); + } + if (designResult.BaseFileName.Equals("Loc(KR093_0018)_Sce(3)_Pro(segment_629_1D2-KR093_0018-2)")) + { + Assert.AreEqual(5.945, designResult.StabilityDesignResults.SafetyFactor, tolerance); + Assert.AreEqual("3", designResult.ScenarioName); + Assert.AreEqual(-1.00, designResult.StabilityDesignResults.UpliftSituation.Pl3HeadAdjusted, tol2Digits); + } + if (designResult.BaseFileName.Equals("Loc(KR093_0018)_Sce(4)_Pro(segment_629_1D2-KR093_0018-2)")) + { + Assert.AreEqual(1.225, designResult.StabilityDesignResults.SafetyFactor, tolerance); + Assert.AreEqual("4", designResult.ScenarioName); + Assert.AreEqual(-0.37, designResult.StabilityDesignResults.UpliftSituation.Pl3HeadAdjusted, tol2Digits); + } + if (designResult.BaseFileName.Equals("Loc(KR093_0018)_Sce(3)_Pro(segment_629_1D3-KR093_0018-3)")) + { + Assert.AreEqual(1.608, designResult.StabilityDesignResults.SafetyFactor, tolerance); + Assert.AreEqual("3", designResult.ScenarioName); + Assert.AreEqual(-1.00, designResult.StabilityDesignResults.UpliftSituation.Pl3HeadAdjusted, tol2Digits); + } + if (designResult.BaseFileName.Equals("Loc(KR093_0018)_Sce(4)_Pro(segment_629_1D3-KR093_0018-3)")) + { + Assert.AreEqual(1.397, designResult.StabilityDesignResults.SafetyFactor, tolerance); + Assert.AreEqual("4", designResult.ScenarioName); + Assert.AreEqual(-0.37, designResult.StabilityDesignResults.UpliftSituation.Pl3HeadAdjusted, tol2Digits); + } + if (designResult.BaseFileName.Equals("Loc(KR093_0019)_Sce(3)_Pro(segment_629_1D1-KR093_0019-1)")) + { + Assert.AreEqual(4.557, designResult.StabilityDesignResults.SafetyFactor, tolerance); + Assert.AreEqual("3", designResult.ScenarioName); + Assert.AreEqual(-1.03, designResult.StabilityDesignResults.UpliftSituation.Pl3HeadAdjusted, tol2Digits); + } + if (designResult.BaseFileName.Equals("Loc(KR093_0019)_Sce(4)_Pro(segment_629_1D1-KR093_0019-1)")) + { + Assert.AreEqual(3.985, designResult.StabilityDesignResults.SafetyFactor, tolerance); + Assert.AreEqual("4", designResult.ScenarioName); + Assert.AreEqual(-0.57, designResult.StabilityDesignResults.UpliftSituation.Pl3HeadAdjusted, tol2Digits); + } + if (designResult.BaseFileName.Equals("Loc(KR093_0019)_Sce(3)_Pro(segment_629_1D2-KR093_0019-2)")) + { + Assert.AreEqual(4.087, designResult.StabilityDesignResults.SafetyFactor, tolerance); + Assert.AreEqual("3", designResult.ScenarioName); + Assert.AreEqual(-1.03, designResult.StabilityDesignResults.UpliftSituation.Pl3HeadAdjusted, tol2Digits); + } + if (designResult.BaseFileName.Equals("Loc(KR093_0019)_Sce(4)_Pro(segment_629_1D2-KR093_0019-2)")) + { + Assert.AreEqual(3.418, designResult.StabilityDesignResults.SafetyFactor, tolerance); + Assert.AreEqual("4", designResult.ScenarioName); + Assert.AreEqual(-0.37, designResult.StabilityDesignResults.UpliftSituation.Pl3HeadAdjusted, tol2Digits); + } + if (designResult.BaseFileName.Equals("Loc(KR093_0019)_Sce(3)_Pro(segment_629_1D3-KR093_0019-3)")) + { + Assert.AreEqual(4.432, designResult.StabilityDesignResults.SafetyFactor, tolerance); + Assert.AreEqual("3", designResult.ScenarioName); + Assert.AreEqual(-1.03, designResult.StabilityDesignResults.UpliftSituation.Pl3HeadAdjusted, tol2Digits); + } + if (designResult.BaseFileName.Equals("Loc(KR093_0019)_Sce(4)_Pro(segment_629_1D3-KR093_0019-3)")) + { + Assert.AreEqual(3.745, designResult.StabilityDesignResults.SafetyFactor, tolerance); + Assert.AreEqual("4", designResult.ScenarioName); + Assert.AreEqual(-0.37, designResult.StabilityDesignResults.UpliftSituation.Pl3HeadAdjusted, tol2Digits); + } + } + } + private static void RemoveTestWorkingDirectory(string testWorkingFolder) { Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/Common/PlLinesHelper.cs =================================================================== diff -u -r4331 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/Common/PlLinesHelper.cs (.../PlLinesHelper.cs) (revision 4331) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/Common/PlLinesHelper.cs (.../PlLinesHelper.cs) (revision 4412) @@ -110,10 +110,6 @@ public static PlLines CreatePlLinesForStabilityExpertKnowledge(Location location, SoilGeometryProbability subSoilScenario, double waterLevel, double? waterLevelRiverLow, out UpliftSituation upliftSituation) { - if (location.CurrentScenario == null) - { - location.CurrentScenario = location.Scenarios[0]; - } var plLinesCreator = new PlLinesCreator.PlLinesCreator { WaterLevelRiverLow = waterLevelRiverLow, @@ -166,10 +162,6 @@ /// public static PlLines CreatePlLinesForPiping(DateTime timeStepDateTime, Location location, SoilProfile1D soilProfile, double waterLevel) { - if (location.CurrentScenario == null) - { - location.CurrentScenario = location.Scenarios[0]; - } var plLinesCreator = new PlLinesCreator.PlLinesCreator { WaterLevelRiverHigh = waterLevel, Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculatorCombinedSlopeAndShoulderAdaption.cs =================================================================== diff -u -r4052 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculatorCombinedSlopeAndShoulderAdaption.cs (.../DesignCalculatorCombinedSlopeAndShoulderAdaption.cs) (revision 4052) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculatorCombinedSlopeAndShoulderAdaption.cs (.../DesignCalculatorCombinedSlopeAndShoulderAdaption.cs) (revision 4412) @@ -50,19 +50,19 @@ /// The kernel data input. /// The kernel data output. /// The dam kernel input. - /// The design scenario. /// The calculation messages. /// The design calculations. /// /// /// public static void PerformDesignCalculationCombinedSlopeAdaptionAndShoulderAdaption( IKernelWrapper kernelWrapper, IKernelDataInput kernelDataInput, IKernelDataOutput kernelDataOutput, - DamKernelInput damKernelInput, DesignScenario designScenario, + DamKernelInput damKernelInput, List calculationMessages, List designCalculations) { List designResults; Location location = damKernelInput.Location; + DesignScenario designScenario = location.CurrentScenario; SoilGeometryProbability subSoilScenario = damKernelInput.SubSoilScenario; const int maxRedesignIterations = 200; var resultMessage = ""; @@ -72,20 +72,29 @@ EmbankmentDesignParameters embankmentDesignParameters; // Prepare the kernel for design - kernelWrapper.PrepareDesign(kernelDataInput, kernelDataOutput, damKernelInput, iterationIndex, out embankmentDesignParameters); - SurfaceLine2 surfaceLine = designScenario.GetMostRecentSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.SoilProfile2D).FullDeepClone(); + kernelWrapper.PrepareDesign(kernelDataInput, kernelDataOutput, damKernelInput, iterationIndex, + out embankmentDesignParameters); + SurfaceLine2 surfaceLine = designScenario.GetMostRecentSurfaceLine(subSoilScenario.SoilProfile1D, + subSoilScenario.SoilProfile2D); + if (surfaceLine == null) + { + surfaceLine = location.SurfaceLine; + } + surfaceLine = surfaceLine.FullDeepClone(); try { iterationIndex = 1; bool isRedesignRequired; - damKernelInput.Location.SurfaceLine = surfaceLine; + location.SurfaceLine = surfaceLine; location.AlignBoundaryPointsOfPl1LineWithAdaptedSurfaceLine(surfaceLine); List locationCalculationMessages; - DesignCalculatorUtils.KernelCalculate(out kernelDataInput, kernelWrapper, out kernelDataOutput, damKernelInput, iterationIndex, out locationCalculationMessages); + DesignCalculatorUtils.KernelCalculate(out kernelDataInput, kernelWrapper, out kernelDataOutput, damKernelInput, + iterationIndex, out locationCalculationMessages); calculationMessages.AddRange(locationCalculationMessages); DesignAdvise designAdvise; string evaluationMessage; - isRedesignRequired = !kernelWrapper.EvaluateDesign(damKernelInput, kernelDataInput, kernelDataOutput, out designAdvise, out evaluationMessage); + isRedesignRequired = !kernelWrapper.EvaluateDesign(damKernelInput, kernelDataInput, kernelDataOutput, + out designAdvise, out evaluationMessage); if (!isRedesignRequired && surfaceLine != null) { @@ -94,9 +103,10 @@ } else { - double maxFractionOfDikeHeightForShoulderHeight = location.UseNewMaxHeightShoulderAsFraction ? location.NewMaxHeightShoulderAsFraction : defaultMaxFractionOfDikeHeightForShoulderHeight; + double maxFractionOfDikeHeightForShoulderHeight = location.UseNewMaxHeightShoulderAsFraction ? + location.NewMaxHeightShoulderAsFraction : defaultMaxFractionOfDikeHeightForShoulderHeight; double maxShoulderLevel = DesignCalculatorUtils.CalculateMaximumShoulderLevel(surfaceLine, - maxFractionOfDikeHeightForShoulderHeight); + maxFractionOfDikeHeightForShoulderHeight); while (isRedesignRequired && surfaceLine != null) { iterationIndex++; @@ -110,10 +120,13 @@ double shoulderHeight; double shoulderLength; DesignCalculatorUtils.DetermineNewShoulderLengthAndHeight(location.StabilityShoulderGrowDeltaX, - location.StabilityShoulderGrowSlope, surfaceLine, limitPointForShoulderDesign, out shoulderHeight, out shoulderLength); + location.StabilityShoulderGrowSlope, + surfaceLine, limitPointForShoulderDesign, + out shoulderHeight, out shoulderLength); // Create new shoulder - var surfaceLineShoulderAdapter = new SurfaceLineShoulderAdapter(surfaceLine, location, designScenario.PolderLevel); + var surfaceLineShoulderAdapter = new SurfaceLineShoulderAdapter(surfaceLine, location, + designScenario.PolderLevel); surfaceLineShoulderAdapter.MaxShoulderLevel = maxShoulderLevel; surfaceLine = surfaceLineShoulderAdapter.ConstructNewSurfaceLine(shoulderLength, shoulderHeight, false); @@ -123,12 +136,14 @@ throw new SurfaceLineException(validationError.Text); } - designScenario.SetRedesignedSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.SoilProfile2D, surfaceLine); + designScenario.SetRedesignedSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.SoilProfile2D, + surfaceLine); } else if (designAdvise == DesignAdvise.SlopeInwards) { // If exit point of circle is in the slope (inward) of the dike or the top of the shoulder then adapt slope - var surfaceLineSlopeAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, designScenario.PolderLevel); + var surfaceLineSlopeAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, + designScenario.PolderLevel); surfaceLine = surfaceLineSlopeAdapter.ConstructNewSurfaceLine(location.StabilitySlopeAdaptionDeltaX); ValidationResult validationError = surfaceLine.Validate().FirstOrDefault(vr => vr.MessageType == ValidationResultType.Error); @@ -137,31 +152,31 @@ throw new SurfaceLineException(validationError.Text); } - designScenario.SetRedesignedSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.SoilProfile2D, surfaceLine); + designScenario.SetRedesignedSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.SoilProfile2D, + surfaceLine); } else { throw new NotImplementedException(); } // Calculate again - designScenario.Location.AlignBoundaryPointsOfPl1LineWithAdaptedSurfaceLine(surfaceLine); - damKernelInput.Location.SurfaceLine = surfaceLine; + location.AlignBoundaryPointsOfPl1LineWithAdaptedSurfaceLine(surfaceLine); + location.SurfaceLine = surfaceLine; kernelWrapper.PrepareDesign(kernelDataInput, kernelDataOutput, damKernelInput, iterationIndex, out embankmentDesignParameters); - if (damKernelInput.SubSoilScenario.SoilProfileType == SoilProfileType.ProfileType2D) + if (subSoilScenario.SoilProfileType == SoilProfileType.ProfileType2D) { Soil embankmentSoil = - damKernelInput.Location.SoilList.GetSoilByName(embankmentDesignParameters - .EmbankmentMaterialname); - damKernelInput.SubSoilScenario.SoilProfile2D = - AdaptProfile2DToNewSurfaceLine(damKernelInput.SubSoilScenario.SoilProfile2D, surfaceLine, embankmentSoil); + location.SoilList.GetSoilByName(embankmentDesignParameters.EmbankmentMaterialname); + subSoilScenario.SoilProfile2D = + AdaptProfile2DToNewSurfaceLine(subSoilScenario.SoilProfile2D, surfaceLine, embankmentSoil); } DesignCalculatorUtils.KernelCalculate(out kernelDataInput, kernelWrapper, out kernelDataOutput, damKernelInput, iterationIndex, out locationCalculationMessages); calculationMessages.AddRange(locationCalculationMessages); - isRedesignRequired = !kernelWrapper.EvaluateDesign(damKernelInput, kernelDataInput, kernelDataOutput, out designAdvise, - out evaluationMessage); + isRedesignRequired = !kernelWrapper.EvaluateDesign(damKernelInput, kernelDataInput, kernelDataOutput, + out designAdvise, out evaluationMessage); } } Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/Common/PlLinesHelperTests.cs =================================================================== diff -u -r4052 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/Common/PlLinesHelperTests.cs (.../PlLinesHelperTests.cs) (revision 4052) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/Common/PlLinesHelperTests.cs (.../PlLinesHelperTests.cs) (revision 4412) @@ -39,7 +39,7 @@ // expected values retrieved from debugging Dam Classic (rev.663) // test CanCalculateThePipingFactorUsingSellmeijer4Forces var location = new Location(); - location.Scenarios.Add(new DesignScenario()); + location.CurrentScenario = new DesignScenario(); location.SurfaceLine = FactoryForSurfaceLines.CreateSurfaceLineTutorial1(); SoilProfile1D soilProfile1D = FactoryForSoilProfiles.CreatePipingSellmeijerProfileWithOneSandlayer(); var riverLevel = 1.0; @@ -70,7 +70,7 @@ // Same as TestCreatePlLinesNoHydraulicShortcut because HeadInPlLine3 is not given. var location = new Location(); - location.Scenarios.Add(new DesignScenario()); + location.CurrentScenario= new DesignScenario(); location.SurfaceLine = FactoryForSurfaceLines.CreateSurfaceLineTutorial1(); SoilProfile1D soilProfile1D = FactoryForSoilProfiles.CreatePipingSellmeijerProfileWithOneSandlayer(); var riverLevel = 1.0; @@ -108,7 +108,7 @@ { HeadPl3 = 1.0 }; - location.Scenarios.Add(scenario); + location.CurrentScenario = scenario; location.SurfaceLine = FactoryForSurfaceLines.CreateSurfaceLineTutorial1(); SoilProfile1D soilProfile1D = FactoryForSoilProfiles.CreatePipingSellmeijerProfileWithOneSandlayer(); AddLayerToSoilProfile(soilProfile1D, -4, false); Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculatorSingle.cs =================================================================== diff -u -r4052 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculatorSingle.cs (.../DesignCalculatorSingle.cs) (revision 4052) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculatorSingle.cs (.../DesignCalculatorSingle.cs) (revision 4412) @@ -47,14 +47,15 @@ /// The design scenario. /// The calculation messages. /// The design calculations. - public static void PerformSingleCalculation(IKernelWrapper kernelWrapper, IKernelDataInput kernelDataInput, IKernelDataOutput kernelDataOutput, - DamKernelInput damKernelInput, DesignScenario designScenario, + public static void PerformSingleCalculation(IKernelWrapper kernelWrapper, IKernelDataInput kernelDataInput, + IKernelDataOutput kernelDataOutput, DamKernelInput damKernelInput, List calculationMessages, List designCalculations) { // Perform validation var designResults = new List(); var locationCalculationMessages = new List(); List validationMessages; + DesignScenario designScenario = damKernelInput.Location.CurrentScenario; designScenario.CalculationResult = CalculationResult.NoRun; try { Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/DamPipingBligh/DamPipingBlighKernelWrapperTests.cs =================================================================== diff -u -r4052 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/DamPipingBligh/DamPipingBlighKernelWrapperTests.cs (.../DamPipingBlighKernelWrapperTests.cs) (revision 4052) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/DamPipingBligh/DamPipingBlighKernelWrapperTests.cs (.../DamPipingBlighKernelWrapperTests.cs) (revision 4412) @@ -56,7 +56,7 @@ UpliftCriterionPiping = 1.0 } }; - location.Scenarios.Add(new DesignScenario()); + location.CurrentScenario = new DesignScenario(); var damFailureMechanismeCalculationSpecification = new DamFailureMechanismeCalculationSpecification { FailureMechanismSystemType = FailureMechanismSystemType.Piping, @@ -97,7 +97,7 @@ var designScenario = new DesignScenario { LocationScenarioID = "1", - Location = location + LocationName = location.Name }; List results; kernelWrapper.PostProcess(damKernelInput, damPipingOutput, designScenario, "", out results); @@ -128,7 +128,7 @@ var location = new Location(); location.SurfaceLine = FactoryForSurfaceLines.CreateSurfaceLineTutorial1(); location.ModelFactors.UpliftCriterionPiping = 1.0; - location.Scenarios.Add(new DesignScenario()); + location.CurrentScenario = new DesignScenario(); var subSoilScenario = new SoilGeometryProbability(); subSoilScenario.SoilProfile1D = FactoryForSoilProfiles.CreateClaySandProfileForPipingBligh(); subSoilScenario.SegmentFailureMechanismType = SegmentFailureMechanismType.Piping; @@ -221,7 +221,7 @@ var designScenario = new DesignScenario { LocationScenarioID = "1", - Location = new Location() + LocationName = "nieuw" }; List results; kernelWrapper.PostProcess(input, output, designScenario, "", out results); Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/Sensors/SensorPLLineCreatorTest.cs =================================================================== diff -u -r4052 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/Sensors/SensorPLLineCreatorTest.cs (.../SensorPLLineCreatorTest.cs) (revision 4052) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/Sensors/SensorPLLineCreatorTest.cs (.../SensorPLLineCreatorTest.cs) (revision 4412) @@ -408,7 +408,7 @@ { RiverLevel = 5 }; - location.Scenarios[0].PolderLevel = -1; + location.CurrentScenario.PolderLevel = -1; location.AddSensorLocation(); location.SensorLocation.SourceTypePl1PlLineOffsetBelowDikeTopAtRiver = DataSourceTypeSensors.LocationData; location.SensorLocation.SourceTypePl1PlLineOffsetBelowDikeTopAtPolder = DataSourceTypeSensors.LocationData; Index: DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geotechnics/SurfaceLine2Tests.cs =================================================================== diff -u -r4052 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geotechnics/SurfaceLine2Tests.cs (.../SurfaceLine2Tests.cs) (revision 4052) +++ DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geotechnics/SurfaceLine2Tests.cs (.../SurfaceLine2Tests.cs) (revision 4412) @@ -33,6 +33,116 @@ [Test] public void TestAddingCharacteristicPointsOnSameLocationDoesNotAddDoublePointsInGeometry() { + SurfaceLine2 surfaceLine = FillSurfaceLine2(); + Assert.AreEqual(10, surfaceLine.CharacteristicPoints.Count); + ValidateSurfaceLine(surfaceLine); + } + + private static void ValidateSurfaceLine(SurfaceLine2 surfaceLine) + { + var tolerance = 0.001; + Assert.AreEqual(2, surfaceLine.CharacteristicPoints.Count(cp => Math.Abs(cp.X - 13.0) < tolerance && Math.Abs(cp.Z - 5.4) < tolerance)); + // Because TrafficLoadOutside and DikeTopAtPolder are on the same location, 1 point less should be in the geometry + Assert.AreEqual(9, surfaceLine.Geometry.Points.Count); + Assert.AreEqual(1, surfaceLine.Geometry.Points.Count(cp => Math.Abs(cp.X - 13.0) < tolerance && Math.Abs(cp.Z - 5.4) < tolerance)); + } + + [Test] + public void TestDeepCloneWithoutGeometryMustContainPoint() + { + SurfaceLine2 surfaceLine = FillSurfaceLine2(); + Assert.AreEqual(10, surfaceLine.CharacteristicPoints.Count); + Assert.AreEqual(9, surfaceLine.Geometry.Points.Count); + // Note: resetting GeometryMustContainPoint to false after filling the surface line will erase all Characteristic Points. + // So the actual code should NEVER reset the GeometryMustContainPoint for filled surface lines. + surfaceLine.CharacteristicPoints.GeometryMustContainPoint = false; + Assert.AreEqual(0, surfaceLine.CharacteristicPoints.Count); + var newSurfaceLine = surfaceLine.FullDeepClone(); + surfaceLine.CharacteristicPoints.Clear(); + surfaceLine.Geometry.CalcPoints.Clear(); + surfaceLine.Geometry.SyncPoints(); + Assert.AreEqual(0, newSurfaceLine.CharacteristicPoints.Count); + Assert.AreEqual(9, newSurfaceLine.Geometry.Points.Count); + } + + [Test] + public void TestDeepCloneWithGeometryMustContainPoint() + { + SurfaceLine2 surfaceLine = FillSurfaceLine2(); + Assert.AreEqual(10, surfaceLine.CharacteristicPoints.Count); + Assert.AreEqual(9, surfaceLine.Geometry.Points.Count); + // Note: resetting GeometryMustContainPoint to true after filling the surface line reset the Characteristic Points to be + // equal to the amount of geometry points, keeping only one type, possibly making the surface line invalid. + // So the actual code should NEVER reset the GeometryMustContainPoint for filled surface lines. + surfaceLine.CharacteristicPoints.GeometryMustContainPoint = true; + Assert.AreEqual(9, surfaceLine.Geometry.Points.Count); + Assert.AreEqual(9, surfaceLine.CharacteristicPoints.Count); + var newSurfaceLine = surfaceLine.FullDeepClone(); + surfaceLine.CharacteristicPoints.Clear(); + surfaceLine.Geometry.CalcPoints.Clear(); + surfaceLine.Geometry.SyncPoints(); + Assert.AreEqual(9, newSurfaceLine.CharacteristicPoints.Count); + Assert.AreEqual(9, newSurfaceLine.Geometry.Points.Count); + } + + [Test] + public void TestDeepCloneWithoutSettingGeometryMustContainPoint() + { + SurfaceLine2 surfaceLine = FillSurfaceLine2(); + Assert.AreEqual(10, surfaceLine.CharacteristicPoints.Count); + Assert.AreEqual(9, surfaceLine.Geometry.Points.Count); + var newSurfaceLine = surfaceLine.FullDeepClone(); + surfaceLine.CharacteristicPoints.Clear(); + surfaceLine.Geometry.CalcPoints.Clear(); + surfaceLine.Geometry.SyncPoints(); + Assert.AreEqual(10, newSurfaceLine.CharacteristicPoints.Count); + Assert.AreEqual(9, newSurfaceLine.Geometry.Points.Count); + var tolerance = 1e-8; + surfaceLine = FillSurfaceLine2(); + Assert.AreEqual(surfaceLine.CharacteristicPoints[0].X, newSurfaceLine.CharacteristicPoints[0].X, tolerance); + Assert.AreEqual(surfaceLine.CharacteristicPoints[0].Z, newSurfaceLine.CharacteristicPoints[0].Z, tolerance); + Assert.AreEqual(surfaceLine.CharacteristicPoints[0].CharacteristicPointType, + newSurfaceLine.CharacteristicPoints[0].CharacteristicPointType); + Assert.AreEqual(surfaceLine.CharacteristicPoints[1].X, newSurfaceLine.CharacteristicPoints[1].X, tolerance); + Assert.AreEqual(surfaceLine.CharacteristicPoints[1].Z, newSurfaceLine.CharacteristicPoints[1].Z, tolerance); + Assert.AreEqual(surfaceLine.CharacteristicPoints[1].CharacteristicPointType, + newSurfaceLine.CharacteristicPoints[1].CharacteristicPointType); + Assert.AreEqual(surfaceLine.CharacteristicPoints[2].X, newSurfaceLine.CharacteristicPoints[2].X, tolerance); + Assert.AreEqual(surfaceLine.CharacteristicPoints[2].Z, newSurfaceLine.CharacteristicPoints[2].Z, tolerance); + Assert.AreEqual(surfaceLine.CharacteristicPoints[2].CharacteristicPointType, + newSurfaceLine.CharacteristicPoints[2].CharacteristicPointType); + Assert.AreEqual(surfaceLine.CharacteristicPoints[3].X, newSurfaceLine.CharacteristicPoints[3].X, tolerance); + Assert.AreEqual(surfaceLine.CharacteristicPoints[3].Z, newSurfaceLine.CharacteristicPoints[3].Z, tolerance); + Assert.AreEqual(surfaceLine.CharacteristicPoints[3].CharacteristicPointType, + newSurfaceLine.CharacteristicPoints[3].CharacteristicPointType); + Assert.AreEqual(surfaceLine.CharacteristicPoints[4].X, newSurfaceLine.CharacteristicPoints[4].X, tolerance); + Assert.AreEqual(surfaceLine.CharacteristicPoints[4].Z, newSurfaceLine.CharacteristicPoints[4].Z, tolerance); + Assert.AreEqual(surfaceLine.CharacteristicPoints[4].CharacteristicPointType, + newSurfaceLine.CharacteristicPoints[4].CharacteristicPointType); + Assert.AreEqual(surfaceLine.CharacteristicPoints[5].X, newSurfaceLine.CharacteristicPoints[5].X, tolerance); + Assert.AreEqual(surfaceLine.CharacteristicPoints[5].Z, newSurfaceLine.CharacteristicPoints[5].Z, tolerance); + Assert.AreEqual(surfaceLine.CharacteristicPoints[5].CharacteristicPointType, + newSurfaceLine.CharacteristicPoints[5].CharacteristicPointType); + Assert.AreEqual(surfaceLine.CharacteristicPoints[6].X, newSurfaceLine.CharacteristicPoints[6].X, tolerance); + Assert.AreEqual(surfaceLine.CharacteristicPoints[6].Z, newSurfaceLine.CharacteristicPoints[6].Z, tolerance); + Assert.AreEqual(surfaceLine.CharacteristicPoints[6].CharacteristicPointType, + newSurfaceLine.CharacteristicPoints[6].CharacteristicPointType); + Assert.AreEqual(surfaceLine.CharacteristicPoints[7].X, newSurfaceLine.CharacteristicPoints[7].X, tolerance); + Assert.AreEqual(surfaceLine.CharacteristicPoints[7].Z, newSurfaceLine.CharacteristicPoints[7].Z, tolerance); + Assert.AreEqual(surfaceLine.CharacteristicPoints[7].CharacteristicPointType, + newSurfaceLine.CharacteristicPoints[7].CharacteristicPointType); + Assert.AreEqual(surfaceLine.CharacteristicPoints[8].X, newSurfaceLine.CharacteristicPoints[8].X, tolerance); + Assert.AreEqual(surfaceLine.CharacteristicPoints[8].Z, newSurfaceLine.CharacteristicPoints[8].Z, tolerance); + Assert.AreEqual(surfaceLine.CharacteristicPoints[8].CharacteristicPointType, + newSurfaceLine.CharacteristicPoints[8].CharacteristicPointType); + Assert.AreEqual(surfaceLine.CharacteristicPoints[9].X, newSurfaceLine.CharacteristicPoints[9].X, tolerance); + Assert.AreEqual(surfaceLine.CharacteristicPoints[9].Z, newSurfaceLine.CharacteristicPoints[9].Z, tolerance); + Assert.AreEqual(surfaceLine.CharacteristicPoints[9].CharacteristicPointType, + newSurfaceLine.CharacteristicPoints[9].CharacteristicPointType); + } + + private SurfaceLine2 FillSurfaceLine2() + { var surfaceLine = new SurfaceLine2(); surfaceLine.CharacteristicPoints.Geometry = surfaceLine.Geometry; AddPointToSurfaceLine(surfaceLine, 0.0, 0.0, CharacteristicPointType.SurfaceLevelOutside); @@ -46,12 +156,7 @@ AddPointToSurfaceLine(surfaceLine, 18.0, 1.0, CharacteristicPointType.DikeToeAtPolder); AddPointToSurfaceLine(surfaceLine, 24.0, 1.0, CharacteristicPointType.SurfaceLevelInside); surfaceLine.Geometry.SyncCalcPoints(); - Assert.AreEqual(10, surfaceLine.CharacteristicPoints.Count); - var tolerance = 0.001; - Assert.AreEqual(2, surfaceLine.CharacteristicPoints.Count(cp => Math.Abs(cp.X - 13.0) < tolerance && Math.Abs(cp.Z - 5.4) < tolerance)); - // Because TrafficLoadOutside and DikeTopAtPolder are on the same location, 1 point less should be in the geometry - Assert.AreEqual(9, surfaceLine.Geometry.Points.Count); - Assert.AreEqual(1, surfaceLine.Geometry.Points.Count(cp => Math.Abs(cp.X - 13.0) < tolerance && Math.Abs(cp.Z - 5.4) < tolerance)); + return surfaceLine; } private void AddPointToSurfaceLine(SurfaceLine2 surfaceLine, double xCoordinate, double zCoordinate, CharacteristicPointType characteristicPointType) Index: DamEngine/trunk/src/Deltares.DamEngine.Data/General/Dike.cs =================================================================== diff -u -r4053 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.Data/General/Dike.cs (.../Dike.cs) (revision 4053) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/General/Dike.cs (.../Dike.cs) (revision 4412) @@ -172,20 +172,29 @@ } } - public virtual List Scenarios + /// + /// Clears all the scenarios. + /// + public void ClearScenarios() { - get + foreach (Location location in Locations) { - var scenarios = new List(); - foreach (Location location in Locations) - { - scenarios.AddRange(location.Scenarios); - } - - return scenarios; + location.Scenarios.Clear(); } } + /// + /// Adds given scenario to all locations + /// + /// + public void AddScenarioToAllLocations(DesignScenario designScenario) + { + foreach (Location location in Locations) + { + location.Scenarios.Add(designScenario); + } + } + public string Description { get; set; } = ""; /// Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculator.cs =================================================================== diff -u -r4396 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculator.cs (.../DesignCalculator.cs) (revision 4396) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculator.cs (.../DesignCalculator.cs) (revision 4412) @@ -85,42 +85,40 @@ /// The kernel data input. /// The kernel data output. /// The dam kernel input. - /// The design scenario. /// The calculation messages. /// The design calculations. public static void PerformDesignCalculation( IKernelWrapper kernelWrapper, IKernelDataInput kernelDataInput, IKernelDataOutput kernelDataOutput, DamKernelInput damKernelInput, - DesignScenario designScenario, List calculationMessages, List designCalculations) { // During the design calculation the location.SurfaceLine is adapted; so store a copy to restore it after the calculation Location location = damKernelInput.Location; + DesignScenario designScenario = location.CurrentScenario; SurfaceLine2 orgLocationSurfaceLine = location.SurfaceLine.FullDeepClone(); try { - if (damKernelInput.Location.RedesignDikeShoulder) + if (location.RedesignDikeShoulder) { // Redesign the surfaceline with shoulder and or slope adaption switch (kernelWrapper.GetDesignStrategy(damKernelInput)) { case DesignStrategy.ShoulderPerPoint: DesignCalculatorShoulderPerPoint.PerformDesignCalculationShoulderPerPoint( kernelWrapper, kernelDataInput, kernelDataOutput, - damKernelInput, designScenario, calculationMessages, - designCalculations); + damKernelInput, calculationMessages, designCalculations); break; case DesignStrategy.NoDesignPossible: throw new NotImplementedException("No design is possible for this failure mechanism"); case DesignStrategy.SlopeAdaptionBeforeShoulderAdaption: DesignCalculatorFirstSlopeAdaptionThenShoulderAdaption.PerformDesignCalculationFirstSlopeAdaptionThenShoulderAdaption( - kernelWrapper, kernelDataInput, kernelDataOutput, damKernelInput, designScenario, - calculationMessages, designCalculations); + kernelWrapper, kernelDataInput, kernelDataOutput, damKernelInput, calculationMessages, + designCalculations); break; case DesignStrategy.OptimizedSlopeAndShoulderAdaption: DesignCalculatorCombinedSlopeAndShoulderAdaption.PerformDesignCalculationCombinedSlopeAdaptionAndShoulderAdaption( - kernelWrapper, kernelDataInput, kernelDataOutput, damKernelInput, designScenario, - calculationMessages, designCalculations); + kernelWrapper, kernelDataInput, kernelDataOutput, damKernelInput, calculationMessages, + designCalculations); break; } } @@ -161,7 +159,7 @@ for (var designScenarioIndex = 0; designScenarioIndex < location.Scenarios.Count; designScenarioIndex++) { DesignScenario designScenario = location.Scenarios[designScenarioIndex]; - designScenario.Location = location; + designScenario.LocationName = location.Name; string projectPath = damProjectData.ProjectPath != "" ? damProjectData.ProjectPath : Directory.GetCurrentDirectory(); @@ -282,16 +280,12 @@ switch (analysisType) { case AnalysisType.AdaptGeometry: - PerformDesignCalculation( - kernelWrapper, kernelDataInput, kernelDataOutput, - damKernelInput, designScenario, calculationMessages, - designResults); + PerformDesignCalculation(kernelWrapper, kernelDataInput, kernelDataOutput, + damKernelInput, calculationMessages, designResults); break; case AnalysisType.NoAdaption: - DesignCalculatorSingle.PerformSingleCalculation( - kernelWrapper, kernelDataInput, kernelDataOutput, - damKernelInput, designScenario, calculationMessages, - designResults); + DesignCalculatorSingle.PerformSingleCalculation(kernelWrapper, kernelDataInput, kernelDataOutput, + damKernelInput, calculationMessages, designResults); break; } } @@ -383,7 +377,8 @@ { // Synchronize scenario data (Note: do not attempt to synchronize the ModelFactors as these are set by the direct // properties in the scenario such as the Required Safeties. ModelFactors is just a place holder. - location.CurrentScenario = location.SynchronizeCurrentScenarioWithScenarioData(designScenario); + location.CurrentScenario = location.SynchronizeCurrentScenarioWithScenarioData(designScenario); + location.Scenarios.Clear(); location.PlLineOffsetBelowDikeToeAtPolder = designScenario.PlLineOffsetBelowDikeToeAtPolder; location.PlLineOffsetBelowDikeTopAtPolder = designScenario.PlLineOffsetBelowDikeTopAtPolder; location.PlLineOffsetBelowDikeTopAtRiver = designScenario.PlLineOffsetBelowDikeTopAtRiver; Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculatorShoulderPerPoint.cs =================================================================== diff -u -r4052 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculatorShoulderPerPoint.cs (.../DesignCalculatorShoulderPerPoint.cs) (revision 4052) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculatorShoulderPerPoint.cs (.../DesignCalculatorShoulderPerPoint.cs) (revision 4412) @@ -53,21 +53,26 @@ /// The kernel data input. /// The kernel data output. /// The dam kernel input. - /// The design scenario. /// The calculation messages. /// The design calculations. /// public static void PerformDesignCalculationShoulderPerPoint (IKernelWrapper kernelWrapper, IKernelDataInput kernelDataInput, IKernelDataOutput kernelDataOutput, DamKernelInput damKernelInput, - DesignScenario designScenario, List calculationMessages, List designCalculations) { var designResults = new List(); Location location = damKernelInput.Location; SoilGeometryProbability subSoilScenario = damKernelInput.SubSoilScenario; - SurfaceLine2 surfaceLine = designScenario.GetMostRecentSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.SoilProfile2D); - damKernelInput.Location.SurfaceLine = surfaceLine; + DesignScenario designScenario = location.CurrentScenario; + SurfaceLine2 surfaceLine = designScenario.GetMostRecentSurfaceLine(subSoilScenario.SoilProfile1D, + subSoilScenario.SoilProfile2D); + if (surfaceLine == null) + { + surfaceLine = location.SurfaceLine; + } + surfaceLine = surfaceLine.FullDeepClone(); + location.SurfaceLine = surfaceLine; try { List locationCalculationMessages; @@ -128,7 +133,7 @@ newSurfaceLine = surfaceLineShoulderAdapter.ConstructNewSurfaceLine(desiredShoulderLength, desiredShoulderHeight, true); } - damKernelInput.Location.SurfaceLine = newSurfaceLine; + location.SurfaceLine = newSurfaceLine; kernelWrapper.Prepare(damKernelInput, 0, out kernelDataInput, out kernelDataOutput); kernelWrapper.Execute(kernelDataInput, kernelDataOutput, out locationCalculationMessages); // Process output Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Design/DesignScenario.cs =================================================================== diff -u -r4331 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Design/DesignScenario.cs (.../DesignScenario.cs) (revision 4331) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Design/DesignScenario.cs (.../DesignScenario.cs) (revision 4412) @@ -59,6 +59,11 @@ /// The location scenario identifier. /// public string LocationScenarioID { get; set; } + + /// + /// The name of the location to which the scenario belongs + /// + public string LocationName { get; set; } /// /// Gets or sets the polder level. @@ -274,9 +279,6 @@ /// public double? HeadPl4 { get; set; } - /// Aggregation relationship. - public Location Location { get; set; } - /// /// Clears the errors. /// @@ -384,7 +386,7 @@ /// public override string ToString() { - return $"Location={Location.Name}, ID={LocationScenarioID} RiverLevel={RiverLevel} " + + return $"Location={LocationName}, ID={LocationScenarioID} RiverLevel={RiverLevel} " + $"RiverLevelLow={(RiverLevelLow.HasValue ? RiverLevelLow.ToString() : "?")} " + $"DikeTableHeight={(DikeTableHeight.HasValue ? DikeTableHeight.ToString() : "?")} " + $"SafetyFactorStabilityInnerSlope={modelFactors.RequiredSafetyFactorStabilityInnerSlope} " + @@ -448,17 +450,17 @@ { //return redesignedSurfaceLines.ContainsKey(objectAsKey) ? redesignedSurfaceLines[objectAsKey] ?? Location.SurfaceLine : Location.SurfaceLine; // For debugging: following code is the same as above, but better debuggable - SurfaceLine2 surfaceline = Location.SurfaceLine; + SurfaceLine2 surfaceLine = null; if (redesignedSurfaceLines.ContainsKey(objectAsKey)) { SurfaceLine2 s = redesignedSurfaceLines[objectAsKey]; if (s != null) { - surfaceline = s; + surfaceLine = s; } } - return surfaceline; + return surfaceLine; } return null; Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapperTests.cs =================================================================== diff -u -r4052 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapperTests.cs (.../MacroStabilityInwardsKernelWrapperTests.cs) (revision 4052) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapperTests.cs (.../MacroStabilityInwardsKernelWrapperTests.cs) (revision 4412) @@ -184,7 +184,7 @@ var designScenario = new DesignScenario { - Location = kernelInput.Location + LocationName = kernelInput.Location.Name }; var resultSlice = new StabilityResultSlice { @@ -512,7 +512,7 @@ // Fill the design results var designScenario = new DesignScenario { - Location = kernelInput.Location + LocationName = kernelInput.Location.Name }; kernelWrapper.PostProcess(kernelInput, macroStabilityOutput, designScenario, "", out List results); Assert.IsTrue(results.Count > 0); @@ -605,7 +605,7 @@ // Fill the design results var designScenario = new DesignScenario { - Location = kernelInput.Location + LocationName = kernelInput.Location.Name }; kernelWrapper.PostProcess(kernelInput, macroStabilityOutput, designScenario, "", out List results); Assert.IsTrue(results.Count > 0); Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/TestHelpers/DamEngineDataTestFactory.cs =================================================================== diff -u -r4052 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/TestHelpers/DamEngineDataTestFactory.cs (.../DamEngineDataTestFactory.cs) (revision 4052) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/TestHelpers/DamEngineDataTestFactory.cs (.../DamEngineDataTestFactory.cs) (revision 4412) @@ -40,7 +40,7 @@ { var scenario = new DesignScenario { - Location = location, + LocationName = location.Name, LocationScenarioID = "ScenarioID" }; return scenario; @@ -55,7 +55,7 @@ { var location = new Location(); var scenario = new DesignScenario(); - location.Scenarios.Add(scenario); + location.CurrentScenario = scenario; location.Name = "LocationName"; location.DikeEmbankmentMaterial = "OB1"; location.ShoulderEmbankmentMaterial = "OB2"; Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/WtiPipingSellmeijerRevised/WtiPipingSellmeijerRevisedKernelWrapperTests.cs =================================================================== diff -u -r4294 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/WtiPipingSellmeijerRevised/WtiPipingSellmeijerRevisedKernelWrapperTests.cs (.../WtiPipingSellmeijerRevisedKernelWrapperTests.cs) (revision 4294) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/KernelWrappers/WtiPipingSellmeijerRevised/WtiPipingSellmeijerRevisedKernelWrapperTests.cs (.../WtiPipingSellmeijerRevisedKernelWrapperTests.cs) (revision 4412) @@ -122,7 +122,7 @@ var designScenario = new DesignScenario { - Location = input.Location + LocationName = input.Location.Name }; List results; kernelWrapper.PostProcess(input, output, designScenario, "", out results); @@ -367,9 +367,9 @@ var designScenario = new DesignScenario { LocationScenarioID = "1", - Location = location + LocationName = location.Name }; - location.Scenarios.Add(designScenario); + location.CurrentScenario = designScenario; var subSoilScenario = new SoilGeometryProbability { SoilProfile1D = FactoryForSoilProfiles.CreatePipingSellmeijerProfileWithOneSandlayer(), @@ -474,7 +474,7 @@ DampingFactorPl4 = 0.10 } }; - location.Scenarios.Add(new DesignScenario()); + location.CurrentScenario = new DesignScenario(); var subSoilScenario = new SoilGeometryProbability { SoilProfile1D = FactoryForSoilProfiles.CreatePipingSellmeijerProfileWithOneSandlayer(), Index: DamEngine/trunk/src/Deltares.DamEngine.Data/General/Location.cs =================================================================== diff -u -r4396 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.Data/General/Location.cs (.../Location.cs) (revision 4396) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/General/Location.cs (.../Location.cs) (revision 4412) @@ -451,6 +451,7 @@ // Synchronize scenario data (Note: do not attempt to synchronize the ModelFactors as these are set by the direct // properties in the scenario such as the Required Safeties. ModelFactors is just a place holder. var newCurrentScenario = new DesignScenario(); + newCurrentScenario.LocationName = Name; newCurrentScenario.LocationScenarioID = designScenario.LocationScenarioID; newCurrentScenario.PolderLevel = designScenario.PolderLevel; newCurrentScenario.RiverLevel = designScenario.RiverLevel; Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/DamPipingBligh/DamPipingBlighKernelWrapper.cs =================================================================== diff -u -r4229 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/DamPipingBligh/DamPipingBlighKernelWrapper.cs (.../DamPipingBlighKernelWrapper.cs) (revision 4229) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/DamPipingBligh/DamPipingBlighKernelWrapper.cs (.../DamPipingBlighKernelWrapper.cs) (revision 4412) @@ -205,7 +205,7 @@ // The following 2 parameters are dependent on the position of the point and have to be recalculated for the current point double dCoverLayer = DamPipingHelper.DetermineHeightCoverLayer(topLevelAquifer, point.Z); // point.Z is surfacelevel damPipingBlighInput.DTotal = dCoverLayer; - double referenceLevel = Math.Max(location.Scenarios[0].PolderLevel, point.Z); // point.Z is surfacelevel + double referenceLevel = Math.Max(location.CurrentScenario.PolderLevel, point.Z); // point.Z is surfacelevel damPipingBlighInput.HExit = referenceLevel; // Calculate the piping safety factor using the level of the given point @@ -308,7 +308,7 @@ // bij zeedijken en de maatgevende hoogwaterstand (MHW bij rivierdijken) en de waterstand binnendijks ter plaatse van het uittredepunt, // rekening houdend met zeespiegelrijzing etc.(zie paragraaf 3.7.2). In dien ter plaatse van het uittreepunt of de opbarstlocatie // geen vrije waterstand heerst kan gerekend worden met het maaiveldniveau, rekening houdend met eventuele maaiveld daling (zie paragraaf 3.7.2)." - double referenceLevel = Math.Max(location.Scenarios[0].PolderLevel, surfaceLevel); + double referenceLevel = Math.Max(location.CurrentScenario.PolderLevel, surfaceLevel); kernelDataInput = new DamPipingBlighInput { HRiver = waterLevel, Index: DamEngine/trunk/src/Deltares.DamEngine.Data/General/Results/DesignResult.cs =================================================================== diff -u -r4076 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.Data/General/Results/DesignResult.cs (.../DesignResult.cs) (revision 4076) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/General/Results/DesignResult.cs (.../DesignResult.cs) (revision 4412) @@ -68,7 +68,7 @@ { if (scenario != null) { - LocationName = scenario.Location.Name; + LocationName = scenario.LocationName; ScenarioName = scenario.LocationScenarioID; } Index: DamEngine/trunk/src/Deltares.DamEngine.Interface/FillDamFromXmlInput.cs =================================================================== diff -u -r4373 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.Interface/FillDamFromXmlInput.cs (.../FillDamFromXmlInput.cs) (revision 4373) +++ DamEngine/trunk/src/Deltares.DamEngine.Interface/FillDamFromXmlInput.cs (.../FillDamFromXmlInput.cs) (revision 4412) @@ -486,14 +486,18 @@ } } - // Set locations for scenarios + // Set location name for scenarios foreach (Location location in project.Dike.Locations) { foreach (DesignScenario designScenario in location.Scenarios) { - designScenario.Location = location; + designScenario.LocationName = location.Name; } + if (location.CurrentScenario == null) + { + location.CurrentScenario = location.Scenarios[0]; + } location.SoilList = project.Dike.SoilList; } } Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculatorFirstSlopeAdaptionThenShoulderAdaption.cs =================================================================== diff -u -r4052 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculatorFirstSlopeAdaptionThenShoulderAdaption.cs (.../DesignCalculatorFirstSlopeAdaptionThenShoulderAdaption.cs) (revision 4052) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculatorFirstSlopeAdaptionThenShoulderAdaption.cs (.../DesignCalculatorFirstSlopeAdaptionThenShoulderAdaption.cs) (revision 4412) @@ -50,18 +50,18 @@ /// The kernel data input. /// The kernel data output. /// The dam kernel input. - /// The design scenario. /// The calculation messages. /// The design calculations. /// /// /// public static void PerformDesignCalculationFirstSlopeAdaptionThenShoulderAdaption(IKernelWrapper kernelWrapper, IKernelDataInput kernelDataInput, IKernelDataOutput kernelDataOutput, DamKernelInput damKernelInput, - DesignScenario designScenario, List calculationMessages, List designCalculations) + List calculationMessages, List designCalculations) { Location location = damKernelInput.Location; SoilGeometryProbability subSoilScenario = damKernelInput.SubSoilScenario; + DesignScenario designScenario = location.CurrentScenario; const int maxRedesignIterations = 200; var resultMessage = ""; List designResults; @@ -72,8 +72,13 @@ // Prepare the kernel for design kernelWrapper.PrepareDesign(kernelDataInput, kernelDataOutput, damKernelInput, iterationIndex, out embankmentDesignParameters); - SurfaceLine2 surfaceLine = designScenario.GetMostRecentSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.SoilProfile2D).FullDeepClone(); - + SurfaceLine2 surfaceLine = designScenario.GetMostRecentSurfaceLine(subSoilScenario.SoilProfile1D, + subSoilScenario.SoilProfile2D); + if (surfaceLine == null) + { + surfaceLine = location.SurfaceLine; + } + surfaceLine = surfaceLine.FullDeepClone(); try { iterationIndex = 1; @@ -92,7 +97,7 @@ } else { - double maxFractionOfDikeHeightForShoulderHeight = designScenario.Location.UseNewMaxHeightShoulderAsFraction ? designScenario.Location.NewMaxHeightShoulderAsFraction : defaultMaxFractionOfDikeHeightForShoulderHeight; + double maxFractionOfDikeHeightForShoulderHeight = location.UseNewMaxHeightShoulderAsFraction ? location.NewMaxHeightShoulderAsFraction : defaultMaxFractionOfDikeHeightForShoulderHeight; double maxShoulderLevel = DesignCalculatorUtils.CalculateMaximumShoulderLevel(surfaceLine, maxFractionOfDikeHeightForShoulderHeight); // First slope adaption @@ -131,7 +136,7 @@ // Recalculate new surfaceline location.AlignBoundaryPointsOfPl1LineWithAdaptedSurfaceLine(surfaceLine); - damKernelInput.Location.SurfaceLine = surfaceLine; + location.SurfaceLine = surfaceLine; kernelWrapper.PrepareDesign(kernelDataInput, kernelDataOutput, damKernelInput, iterationIndex, out embankmentDesignParameters); DesignCalculatorUtils.KernelCalculate(out kernelDataInput, kernelWrapper, out kernelDataOutput, damKernelInput, iterationIndex, out locationCalculationMessages); calculationMessages.AddRange(locationCalculationMessages); @@ -150,12 +155,12 @@ double shoulderHeight; double shoulderLength; GeometryPoint limitPointForShoulderDesign = surfaceLine.GetLimitPointForShoulderDesign(); - DesignCalculatorUtils.DetermineNewShoulderLengthAndHeight(designScenario.Location.StabilityShoulderGrowDeltaX, - designScenario.Location.StabilityShoulderGrowSlope, surfaceLine, limitPointForShoulderDesign, + DesignCalculatorUtils.DetermineNewShoulderLengthAndHeight(location.StabilityShoulderGrowDeltaX, + location.StabilityShoulderGrowSlope, surfaceLine, limitPointForShoulderDesign, out shoulderHeight, out shoulderLength); // Create new shoulder - var surfaceLineShoulderAdapter = new SurfaceLineShoulderAdapter(surfaceLine, designScenario.Location, designScenario.PolderLevel); + var surfaceLineShoulderAdapter = new SurfaceLineShoulderAdapter(surfaceLine, location, designScenario.PolderLevel); surfaceLineShoulderAdapter.MaxShoulderLevel = maxShoulderLevel; surfaceLineShoulderAdapter.SlopeOfNewShoulder = currentCoTangent; surfaceLine = surfaceLineShoulderAdapter.ConstructNewSurfaceLine(shoulderLength, shoulderHeight, false); @@ -169,8 +174,8 @@ designScenario.SetRedesignedSurfaceLine(subSoilScenario.SoilProfile1D, subSoilScenario.SoilProfile2D, surfaceLine); // Recalculate new surfaceline - designScenario.Location.AlignBoundaryPointsOfPl1LineWithAdaptedSurfaceLine(surfaceLine); - damKernelInput.Location.SurfaceLine = surfaceLine; + location.AlignBoundaryPointsOfPl1LineWithAdaptedSurfaceLine(surfaceLine); + location.SurfaceLine = surfaceLine; kernelWrapper.PrepareDesign(kernelDataInput, kernelDataOutput, damKernelInput, iterationIndex, out embankmentDesignParameters); DesignCalculatorUtils.KernelCalculate(out kernelDataInput, kernelWrapper, out kernelDataOutput, damKernelInput, iterationIndex, out locationCalculationMessages); calculationMessages.AddRange(locationCalculationMessages); Index: DamEngine/trunk/src/Deltares.DamEngine.Data/General/Sensors/SensorLocation.cs =================================================================== diff -u -r4052 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.Data/General/Sensors/SensorLocation.cs (.../SensorLocation.cs) (revision 4052) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/General/Sensors/SensorLocation.cs (.../SensorLocation.cs) (revision 4412) @@ -23,6 +23,7 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; +using Deltares.DamEngine.Data.Design; using Deltares.DamEngine.Data.General.Sensors.Specifications; using Deltares.DamEngine.Data.General.Specifications.Extensions; using Deltares.DamEngine.Data.Geometry; @@ -259,6 +260,20 @@ } } + private DesignScenario CurrentScenario + { + get + { + var scenario = Location.CurrentScenario; + if (scenario == null) + { + scenario = Location.Scenarios[0]; + } + + return scenario; + } + } + /// /// Gets the polder level. /// @@ -269,7 +284,7 @@ { get { - return Location.Scenarios[0].PolderLevel; + return CurrentScenario.PolderLevel; } } @@ -283,15 +298,15 @@ { get { - return Location.Scenarios[0].HeadPl3; + return CurrentScenario.HeadPl3; } } public double? HeadPl4 { get { - return Location.Scenarios[0].HeadPl4; + return CurrentScenario.HeadPl4; } } @@ -454,7 +469,7 @@ { if (SourceTypePl1WaterLevelAtPolder == DataSourceTypeSensors.LocationData) { - return Location.Scenarios[0].PolderLevel; + return CurrentScenario.PolderLevel; } if (SourceTypePl1WaterLevelAtPolder == DataSourceTypeSensors.Sensor) @@ -467,7 +482,7 @@ { if (SourceTypePl3 == DataSourceTypeSensors.LocationData) { - return Location.Scenarios[0].HeadPl3; + return CurrentScenario.HeadPl3; } if (SourceTypePl3 == DataSourceTypeSensors.Sensor) @@ -480,7 +495,7 @@ { if (SourceTypePl4 == DataSourceTypeSensors.LocationData) { - return Location.Scenarios[0].HeadPl4; + return CurrentScenario.HeadPl4; } if (SourceTypePl4 == DataSourceTypeSensors.Sensor) Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/Sensors/SensorLocationTests.cs =================================================================== diff -u -r4052 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/Sensors/SensorLocationTests.cs (.../SensorLocationTests.cs) (revision 4052) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/Sensors/SensorLocationTests.cs (.../SensorLocationTests.cs) (revision 4412) @@ -43,7 +43,7 @@ var factory = new SensorFactory(); var scenario = new DesignScenario(); - location.Scenarios.Add(scenario); + location.CurrentScenario = scenario; SensorLocation sensorLocation = factory.CreateSensorLocation(location); return sensorLocation; } @@ -387,7 +387,7 @@ } }; SensorLocation sensorLocation = CreateValidSensorLocation(); - location.Scenarios[0].PolderLevel = testValue; + location.CurrentScenario.PolderLevel = testValue; sensorLocation.SourceTypePl1WaterLevelAtPolder = DataSourceTypeSensors.LocationData; @@ -530,7 +530,7 @@ }; SensorLocation sensorLocation = CreateValidSensorLocation(); - location.Scenarios[0].HeadPl3 = testValue; + location.CurrentScenario.HeadPl3 = testValue; sensorLocation.SourceTypePl3 = DataSourceTypeSensors.LocationData; // call @@ -600,7 +600,7 @@ }; SensorLocation sensorLocation = CreateValidSensorLocation(); - location.Scenarios[0].HeadPl4 = testValue; + location.CurrentScenario.HeadPl4 = testValue; sensorLocation.SourceTypePl4 = DataSourceTypeSensors.LocationData; // call Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/WtiPipingSellmeijerRevised/WtiPipingSellmeijerRevisedKernelWrapper.cs =================================================================== diff -u -r4331 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/WtiPipingSellmeijerRevised/WtiPipingSellmeijerRevisedKernelWrapper.cs (.../WtiPipingSellmeijerRevisedKernelWrapper.cs) (revision 4331) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/WtiPipingSellmeijerRevised/WtiPipingSellmeijerRevisedKernelWrapper.cs (.../WtiPipingSellmeijerRevisedKernelWrapper.cs) (revision 4412) @@ -79,7 +79,7 @@ double waterLevel = damKernelInput.RiverLevelHigh; if (double.IsNaN(waterLevel)) { - waterLevel = location.Scenarios[0].RiverLevel; + waterLevel = location.CurrentScenario.RiverLevel; } PlLines plLines = @@ -325,7 +325,7 @@ // The following 2 parameters are dependent on the position of the point and have to be recalculated for the current point double dCoverLayer = DamPipingHelper.DetermineHeightCoverLayer(topLevelAquifer, point.Z); // point.Z is surfacelevel damPipingInput.DTotal = dCoverLayer; - double referenceLevel = Math.Max(location.Scenarios[0].PolderLevel, point.Z); // point.Z is surfacelevel + double referenceLevel = Math.Max(location.CurrentScenario.PolderLevel, point.Z); // point.Z is surfacelevel damPipingInput.HExit = referenceLevel; // Initialize result as no run. damPipingOutput.CalculationResult = CalculationResult.NoRun; @@ -547,7 +547,7 @@ // bij zeedijken en de maatgevende hoogwaterstand (MHW bij rivierdijken) en de waterstand binnendijks ter plaatse van het uittredepunt, // rekening houdend met zeespiegelrijzing etc.(zie paragraaf 3.7.2). In dien ter plaatse van het uittreepunt of de opbarstlocatie // geen vrije waterstand heerst kan gerekend worden met het maaiveldniveau, rekening houdend met eventuele maaiveld daling (zie paragraaf 3.7.2)." - double referenceLevel = Math.Max(location.Scenarios[0].PolderLevel, surfaceLevel); + double referenceLevel = Math.Max(location.CurrentScenario.PolderLevel, surfaceLevel); Soil inBetweenAquiferlayerSoil = soilProfile1D.BottomAquiferLayer.Soil; if (soilProfile1D.InBetweenAquiferLayer != null) @@ -563,8 +563,8 @@ rExit = 1 - location.ModelParametersForPlLines.DampingFactorPl4; } - EffectiveThicknessCalculator effectiveThicknessCalculator = CreateEffectiveThicknessCalculator(soilProfile1D, surfaceLine, location.Scenarios[0].PolderLevel, - Physics.UnitWeightOfwater, xExit); + EffectiveThicknessCalculator effectiveThicknessCalculator = CreateEffectiveThicknessCalculator(soilProfile1D, + surfaceLine, location.CurrentScenario.PolderLevel, Physics.UnitWeightOfwater, xExit); effectiveThicknessCalculator.Calculate(); double effectiveStress = effectiveThicknessCalculator.EffectiveStress; Index: DamEngine/trunk/src/Deltares.DamEngine.Interface.Tests/FillDamFromXmlInputTests.cs =================================================================== diff -u -r4052 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.Interface.Tests/FillDamFromXmlInputTests.cs (.../FillDamFromXmlInputTests.cs) (revision 4052) +++ DamEngine/trunk/src/Deltares.DamEngine.Interface.Tests/FillDamFromXmlInputTests.cs (.../FillDamFromXmlInputTests.cs) (revision 4412) @@ -20,6 +20,7 @@ // All rights reserved. using System.Collections.Generic; +using Deltares.DamEngine.Data.Design; using Deltares.DamEngine.Data.General; using Deltares.DamEngine.Io; using Deltares.DamEngine.Io.XmlInput; @@ -122,6 +123,11 @@ DamProjectData expectedDamProjectData = FactoryForDamProjectData.CreateExampleDamProjectData(); Location location = expectedDamProjectData.Dike.Locations[0]; location.Name = id; + location.CurrentScenario.LocationName = id; + foreach (DesignScenario scenario in location.Scenarios) + { + scenario.LocationName = id; + } // When Writing Xml string xmlString; Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesOperational/OperationalCalculator.cs =================================================================== diff -u -r4358 -r4412 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesOperational/OperationalCalculator.cs (.../OperationalCalculator.cs) (revision 4358) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesOperational/OperationalCalculator.cs (.../OperationalCalculator.cs) (revision 4412) @@ -119,7 +119,6 @@ { // For Operational only ONE scenario is allowed (decided by Irene/Bernard on 30-07-2020). So that's the one that must be used. designScenario = location.Scenarios[0]; - designScenario.Location = location; } IDictionary sensorValues = values[entry.DateTime][location]; @@ -593,6 +592,7 @@ { if (designScenario != null) { + location.CurrentScenario = location.SynchronizeCurrentScenarioWithScenarioData(designScenario); location.ModelFactors.RequiredSafetyFactorStabilityInnerSlope = designScenario.RequiredSafetyFactorStabilityInnerSlope; location.ModelFactors.RequiredSafetyFactorStabilityOuterSlope =