Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapper.cs =================================================================== diff -u -r3762 -r3763 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapper.cs (.../MacroStabilityInwardsKernelWrapper.cs) (revision 3762) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityInwards/MacroStabilityInwardsKernelWrapper.cs (.../MacroStabilityInwardsKernelWrapper.cs) (revision 3763) @@ -50,7 +50,9 @@ public class MacroStabilityInwardsKernelWrapper : IKernelWrapper { private Calculator stabilityCalculator; + private Calculator stabilityCalculatorForSecondCalculation; private string fileNameForCalculation; + private string fileNameForSecondCalculation; private int lastIterationIndex; /// @@ -74,6 +76,7 @@ public PrepareResult Prepare(DamKernelInput damKernelInput, int iterationIndex, out IKernelDataInput kernelDataInput, out IKernelDataOutput kernelDataOutput) { fileNameForCalculation = ""; + fileNameForSecondCalculation = ""; var macroStabilityInput = new MacroStabilityKernelDataInput(); kernelDataInput = macroStabilityInput; var macroStabilityOutput = new MacroStabilityOutput @@ -86,51 +89,80 @@ { try { + var bishopUpliftVan = FailureMechanismParametersMStab.MStabParameters.Model == MStabModelType.BishopUpliftVan; + var model = FailureMechanismParametersMStab.MStabParameters.Model; + if (bishopUpliftVan) + { + // if current model is BishopUpliftVan then set to Bishop for proper name/path for inputfile + model = MStabModelType.Bishop; + } + EnsureSoilProfile2DIsFilled(damKernelInput.SubSoilScenario, damKernelInput.Location.SurfaceLine, damKernelInput.Location.GetDikeEmbankmentSoil()); - const bool useRivelLevelLow = false; - var plLines = UpliftHelper.DeterminePlLinesForStability(damKernelInput, useRivelLevelLow, out var upliftSituation); + const bool useRiverLevelLow = false; + // Determine whether there is uplift + var plLines = UpliftHelper.DeterminePlLinesForStability(damKernelInput, useRiverLevelLow, out var upliftSituation); + upliftSituation.IsUplift = UpliftHelper.DetermineIsUplift(plLines, damKernelInput.Location, damKernelInput.SubSoilScenario); + var fillMacroStabilityWrapperFromEngine = new FillMacroStabilityWrapperInputFromEngine + { + TrafficLoad = FillTrafficLoad(damKernelInput) + }; + + + if (FailureMechanismParametersMStab.MStabParameters.Model == MStabModelType.Bishop || + FailureMechanismParametersMStab.MStabParameters.Model == MStabModelType.BishopUpliftVan) + { + fillMacroStabilityWrapperFromEngine.BishopCalculationGrid = FillBishopCalculationGrid(damKernelInput); + } + + if (FailureMechanismParametersMStab.MStabParameters.Model == MStabModelType.UpliftVan || + FailureMechanismParametersMStab.MStabParameters.Model == MStabModelType.BishopUpliftVan) + { + macroStabilityOutput.UpliftSituation = upliftSituation; + if (!upliftSituation.IsUplift) + { + return PrepareResult.NotRelevant; + } + // relevant for beeswarm? + fillMacroStabilityWrapperFromEngine.UpliftVanCalculationGrid = FillUpliftVanCalculationGrid(damKernelInput); + } + + FailureMechanismParametersMStab.MStabParameters.Model = model; + var left = damKernelInput.Location.SurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelOutside).X; var right = damKernelInput.Location.SurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside).X; var penetrationLength = damKernelInput.Location.ModelParametersForPlLines.PenetrationLength; var soilProfile1D = damKernelInput.SubSoilScenario.SoilProfile2D.GetSoilProfile1D( damKernelInput.Location.SurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder).X); var waterNet = PlLinesToWaternetConverter.ConvertPlLineToWaternet(plLines, soilProfile1D, penetrationLength, left, right); - - var fillMacroStabilityWrapperFromEngine = new FillMacroStabilityWrapperInputFromEngine(); + macroStabilityInput.Input = fillMacroStabilityWrapperFromEngine.CreateMacroStabilityInput(damKernelInput, FailureMechanismParametersMStab.MStabParameters, waterNet); + fileNameForCalculation = GetStabilityInputFileName(damKernelInput, iterationIndex, FailureMechanismParametersMStab.MStabParameters.Model); + stabilityCalculator = new Calculator(macroStabilityInput.Input); + var firstPrepareResult = PrepareKernel(stabilityCalculator, fileNameForCalculation); - switch (FailureMechanismParametersMStab.MStabParameters.Model) + if (bishopUpliftVan && upliftSituation.IsUplift && firstPrepareResult == PrepareResult.Successful) { - case MStabModelType.Bishop: - { - fillMacroStabilityWrapperFromEngine.BishopCalculationGrid = - FillBishopCalculationGrid(damKernelInput); - break; - } - case MStabModelType.UpliftVan: - { - // Determine whether there is uplift - upliftSituation.IsUplift = UpliftHelper.DetermineIsUplift(plLines, damKernelInput.Location, damKernelInput.SubSoilScenario); - macroStabilityOutput.UpliftSituation = upliftSituation; - if (!upliftSituation.IsUplift) - { - return PrepareResult.NotRelevant; - } - - fillMacroStabilityWrapperFromEngine.TrafficLoad = FillTrafficLoad(damKernelInput); - fillMacroStabilityWrapperFromEngine.UpliftVanCalculationGrid = FillUpliftVanCalculationGrid(damKernelInput); - break; - } - default: - throw new ArgumentOutOfRangeException(nameof(FailureMechanismParametersMStab.MStabParameters.Model)); + model = MStabModelType.UpliftVan; + FailureMechanismParametersMStab.MStabParameters.Model = model; + macroStabilityInput.Input = fillMacroStabilityWrapperFromEngine.CreateMacroStabilityInput(damKernelInput, FailureMechanismParametersMStab.MStabParameters, waterNet); + fileNameForSecondCalculation = GetStabilityInputFileName(damKernelInput, iterationIndex, FailureMechanismParametersMStab.MStabParameters.Model); + + // reset model + FailureMechanismParametersMStab.MStabParameters.Model = MStabModelType.BishopUpliftVan; + + stabilityCalculatorForSecondCalculation = new Calculator(macroStabilityInput.Input); + return PrepareKernel(stabilityCalculatorForSecondCalculation, fileNameForSecondCalculation); } - - macroStabilityInput.Input = fillMacroStabilityWrapperFromEngine.CreateMacroStabilityInput(damKernelInput, FailureMechanismParametersMStab.MStabParameters, waterNet); - fileNameForCalculation = GetStabilityInputFileName(damKernelInput, iterationIndex, FailureMechanismParametersMStab.MStabParameters.Model); - return PrepareKernel(macroStabilityInput.Input); + if (bishopUpliftVan) + { + // reset model + FailureMechanismParametersMStab.MStabParameters.Model = MStabModelType.BishopUpliftVan; + } + + return firstPrepareResult; } catch(Exception e) { @@ -164,24 +196,21 @@ } } - private PrepareResult PrepareKernel(MacroStabilityInput input) + private PrepareResult PrepareKernel(Calculator stabilityCalculator, string fileName) { try { - stabilityCalculator = new Calculator(input); // For now a simple check to see if any data has been past at all. var inputAsXml = stabilityCalculator.KernelInputXml; - File.WriteAllText(fileNameForCalculation, inputAsXml); + File.WriteAllText(fileName, inputAsXml); if (inputAsXml.Length > 10) { return PrepareResult.Successful; } - else - { - return PrepareResult.Failed; - } + + return PrepareResult.Failed; } catch { @@ -324,20 +353,38 @@ MacroStabilityOutput macroStabilityOutput = (MacroStabilityOutput)kernelDataOutput; ThrowWhenMacroStabilityKernelInputNull(macroStabilityKernelDataInput); ThrowWhenMacroStabilityKernelOutputNull(macroStabilityOutput); - PerformStabilityCalculation(macroStabilityKernelDataInput, macroStabilityOutput, out messages); + + var bishopUpliftVan = FailureMechanismParametersMStab.MStabParameters.Model == MStabModelType.BishopUpliftVan; + if (bishopUpliftVan) + { + macroStabilityKernelDataInput.Input.StabilityModel.ModelOption = StabilityModelOptionType.Bishop; + } + + PerformStabilityCalculation(macroStabilityKernelDataInput, macroStabilityOutput, fileNameForCalculation, stabilityCalculator, out messages); var fileName = Path.GetFileNameWithoutExtension(fileNameForCalculation); foreach (var logMessage in messages) { logMessage.Message = fileName + ": " + logMessage.Message; } + + if (bishopUpliftVan) + { + macroStabilityKernelDataInput.Input.StabilityModel.ModelOption = StabilityModelOptionType.UpliftVan; + PerformStabilityCalculation(macroStabilityKernelDataInput, macroStabilityOutput, fileNameForSecondCalculation, stabilityCalculatorForSecondCalculation, out messages); + fileName = Path.GetFileNameWithoutExtension(fileNameForSecondCalculation); + foreach (var logMessage in messages) + { + logMessage.Message = fileName + ": " + logMessage.Message; + } + } } - private void PerformStabilityCalculation(MacroStabilityKernelDataInput input, MacroStabilityOutput macroStabilityOutput, out List messages) + private void PerformStabilityCalculation(MacroStabilityKernelDataInput input, MacroStabilityOutput macroStabilityOutput, + string fileName, ICalculator stabilityCalculator, out List messages) { macroStabilityOutput.CalculationResult = CalculationResult.NoRun; macroStabilityOutput.StabilityOutputItems = new List(); messages = new List(); - try { var macroStabilityOutputKernel = stabilityCalculator.Calculate(); @@ -357,10 +404,10 @@ break; } - WriteStixFileBasedOnInputAndResultsSearchGrid(fileNameForCalculation, inputStixFile); + WriteStixFileBasedOnInputAndResultsSearchGrid(fileName, inputStixFile); } #endif - WriteStixFileBasedOnInputAndResultsSlipPlane(input, macroStabilityOutput); + WriteStixFileBasedOnInputAndResultsSlipPlane(fileName, input, macroStabilityOutput); } catch (Exception e) { @@ -382,16 +429,16 @@ } } - private void WriteStixFileBasedOnInputAndResultsSlipPlane(MacroStabilityKernelDataInput input, + private void WriteStixFileBasedOnInputAndResultsSlipPlane(string filename, MacroStabilityKernelDataInput input, MacroStabilityOutput macroStabilityOutput) { if (macroStabilityOutput.CalculationResult == CalculationResult.Succeeded) { foreach (var macroStabilityOutputItem in macroStabilityOutput.StabilityOutputItems) { - macroStabilityOutputItem.CalculationPath = Path.GetDirectoryName(fileNameForCalculation); - macroStabilityOutputItem.ProjectName = Path.GetFileName(fileNameForCalculation); - var fileNameForCalculationAsStix = DetermineStixFilename(fileNameForCalculation, "result"); + macroStabilityOutputItem.CalculationPath = Path.GetDirectoryName(filename); + macroStabilityOutputItem.ProjectName = Path.GetFileName(filename); + var fileNameForCalculationAsStix = DetermineStixFilename(filename, "result"); var resultStixWrite = new StixWriter(); resultStixWrite.FillInfo("DAM Engine", macroStabilityOutputItem.CalculationPath, macroStabilityOutputItem.ProjectName, true); Index: DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/MacroStabilityInwardsTests.cs =================================================================== diff -u -r3695 -r3763 --- DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/MacroStabilityInwardsTests.cs (.../MacroStabilityInwardsTests.cs) (revision 3695) +++ DamEngine/trunk/src/Deltares.DamEngine.IntegrationTests/IntegrationTests/MacroStabilityInwardsTests.cs (.../MacroStabilityInwardsTests.cs) (revision 3763) @@ -59,6 +59,7 @@ RemoveUsedDirectoryAfterTests("TestGiveFeedBackWhenNoProfilesAreAvailable"); RemoveUsedDirectoryAfterTests("TestStabInwardsBishopWithStixFiles"); RemoveUsedDirectoryAfterTests("TestStabInwardsUpliftVanWithStixFiles"); + RemoveUsedDirectoryAfterTests("TestStabInwardsBishopUpliftVanWithStixFiles"); } private void RemoveUsedDirectoryAfterTests(string directory) @@ -860,7 +861,80 @@ Assert.IsTrue(File.Exists(file),file + " does not exists"); } } + + [Test, Category("Slow")] + public void TestRunMacroStabilityDeltaDijkBishopUpliftVanWith1DProducesStixFiles() + { + // Expected results are taken as is from the first run with the new kernel + // This tests use of 1D profiles + // Selected location (6-4-1-A-1-F) + // Analysis type "No adaption" + // Calculation options: Stability Inside - Bishop + const string calcDir = "TestStabInwardsBishopUpliftVanWithStixFiles"; + if (Directory.Exists(calcDir)) + { + Directory.Delete(calcDir, true); // delete previous results + } + Directory.CreateDirectory(calcDir); + + const string fileName = @"TestFiles\DeltaDijkBishopInwards.xml"; + string inputString = File.ReadAllText(fileName); + inputString = ChangeInputModel(inputString, InputStabilityModelType.BishopUpliftVan); + inputString = XmlAdapter.ChangeValueInXml(inputString, "ProjectPath", ""); // Current directory will be used + inputString = XmlAdapter.ChangeValueInXml(inputString, "CalculationMap", calcDir); // Current directory will be used + inputString = XmlAdapter.ChangeValueInXml(inputString, "MapForSoilgeometries2D", @"TestFiles\DeltaDijk normal.geometries2D.0\"); + inputString = XmlAdapter.ChangeValueInXml(inputString, "SoilDatabaseName", @"TestFiles\DeltaDijk normal0.soilmaterials.mdb"); + + EngineInterface engineInterface = new EngineInterface(inputString); + Assert.IsNotNull(engineInterface.DamProjectData); + + string outputString = engineInterface.Run(); + + Assert.IsNotNull(outputString); + var output = DamXmlSerialization.LoadOutputFromXmlString(outputString); + + // one location is calculated with 3 1D profiles + //Assert.AreEqual(2, output.Results.CalculationResults.Length); + Assert.AreEqual("6-4-1-A-1-F", output.Results.CalculationResults[0].LocationName); + Assert.AreEqual("6-4-1-A-1-F_1_s", output.Results.CalculationResults[0].ProfileName); + Assert.AreEqual("6-4-1-A-1-F", output.Results.CalculationResults[1].LocationName); + Assert.AreEqual("6-4-1-A-1-F_2_s", output.Results.CalculationResults[1].ProfileName); + + var result = output.Results.CalculationResults[0]; + // SafetyFactor=1.638 + Assert.AreEqual(1.638, result.StabilityDesignResults.SafetyFactor, Tolerance); + + // skip testing some of the results like uplift etc. + + // Calculation Result + Assert.AreEqual(CalculationResult.Succeeded, ConversionHelper.ConvertToCalculationResult(result.CalculationResult)); + + // test safety factor for other profiles + result = output.Results.CalculationResults[1]; + // SafetyFactor=1.551 + Assert.AreEqual(1.551, result.StabilityDesignResults.SafetyFactor, Tolerance); + + // Stix file + var fileList = new List + { +#if DEBUG + "Stability\\Bishop\\Loc(6-4-1-A-1-F)_Sce(1)_Pro(6-4-1-A-1-F_1_s)_input.stix", + "Stability\\Bishop\\Loc(6-4-1-A-1-F)_Sce(1)_Pro(6-4-1-A-1-F_2_s)_input.stix", + "Stability\\UpliftVan\\Loc(6-4-1-A-1-F)_Sce(1)_Pro(6-4-1-A-1-F_1_s)_input.stix", + "Stability\\UpliftVan\\Loc(6-4-1-A-1-F)_Sce(1)_Pro(6-4-1-A-1-F_2_s)_input.stix", +#endif + "Stability\\Bishop\\Loc(6-4-1-A-1-F)_Sce(1)_Pro(6-4-1-A-1-F_1_s)_result.stix", + "Stability\\Bishop\\Loc(6-4-1-A-1-F)_Sce(1)_Pro(6-4-1-A-1-F_2_s)_result.stix", + "Stability\\UpliftVan\\Loc(6-4-1-A-1-F)_Sce(1)_Pro(6-4-1-A-1-F_1_s)_result.stix", + "Stability\\UpliftVan\\Loc(6-4-1-A-1-F)_Sce(1)_Pro(6-4-1-A-1-F_2_s)_result.stix" + }; + foreach (var file in fileList.Select(file => Path.Combine(Path.GetFullPath(calcDir), file))) + { + Assert.IsTrue(File.Exists(file), file + " does not exists"); + } + } + private static string GetOutputStringForProject(string analysisType) { const string calcDir = "TestStabInwardsBishop";