Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityCommonHelper.cs =================================================================== diff -u -r4000 -r4052 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityCommonHelper.cs (.../MacroStabilityCommonHelper.cs) (revision 4000) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/KernelWrappers/MacroStabilityCommon/MacroStabilityCommonHelper.cs (.../MacroStabilityCommonHelper.cs) (revision 4052) @@ -43,463 +43,462 @@ using MacroStabilityOutput = Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityInwards.MacroStabilityOutput; using Soil = Deltares.DamEngine.Data.Geotechnics.Soil; -namespace Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon +namespace Deltares.DamEngine.Calculators.KernelWrappers.MacroStabilityCommon; + +/// +/// Class with helper methods for the Macro Stability Wrappers. +/// +public static class MacroStabilityCommonHelper { /// - /// Class with helper methods for the Macro Stability Wrappers. + /// Ensures the soil profile2d is filled. /// - public static class MacroStabilityCommonHelper + /// The sub soil scenario. + /// The surface line2. + /// The dike embankment soil. + public static void EnsureSoilProfile2DIsFilled(SoilGeometryProbability subSoilScenario, SurfaceLine2 surfaceLine2, Soil dikeEmbankmentSoil) { - /// - /// Ensures the soil profile2d is filled. - /// - /// The sub soil scenario. - /// The surface line2. - /// The dike embankment soil. - public static void EnsureSoilProfile2DIsFilled(SoilGeometryProbability subSoilScenario, SurfaceLine2 surfaceLine2, Soil dikeEmbankmentSoil) + SoilProfile2D soilProfile2D = subSoilScenario.SoilProfile2D; + if (soilProfile2D == null) { - SoilProfile2D soilProfile2D = subSoilScenario.SoilProfile2D; - if (soilProfile2D == null) + var soilSurfaceProfile = new SoilSurfaceProfile { - var soilSurfaceProfile = new SoilSurfaceProfile - { - SoilProfile = subSoilScenario.SoilProfile1D, - SurfaceLine2 = surfaceLine2, - Name = subSoilScenario.SoilProfile1D.Name, - DikeEmbankmentMaterial = dikeEmbankmentSoil - }; - // Convert the soilSurfaceProfile to a SoilProfile2D to be able to edit it properly. - SoilProfile2D soilProfile2DNew = soilSurfaceProfile.ConvertToSoilProfile2D(); - subSoilScenario.SoilProfile2D = soilProfile2DNew; - subSoilScenario.SoilProfile2DName = soilProfile2DNew.Name; - subSoilScenario.SoilProfileType = SoilProfileType.ProfileType2D; - subSoilScenario.SoilProfile1D = null; - } + SoilProfile = subSoilScenario.SoilProfile1D, + SurfaceLine2 = surfaceLine2, + Name = subSoilScenario.SoilProfile1D.Name, + DikeEmbankmentMaterial = dikeEmbankmentSoil + }; + // Convert the soilSurfaceProfile to a SoilProfile2D to be able to edit it properly. + SoilProfile2D soilProfile2DNew = soilSurfaceProfile.ConvertToSoilProfile2D(); + subSoilScenario.SoilProfile2D = soilProfile2DNew; + subSoilScenario.SoilProfile2DName = soilProfile2DNew.Name; + subSoilScenario.SoilProfileType = SoilProfileType.ProfileType2D; + subSoilScenario.SoilProfile1D = null; } + } - /// - /// Fills the traffic load. - /// - /// The dam kernel input. - /// - public static TrafficLoad FillTrafficLoad(DamKernelInput damKernelInput) + /// + /// Fills the traffic load. + /// + /// The dam kernel input. + /// + public static TrafficLoad FillTrafficLoad(DamKernelInput damKernelInput) + { + TrafficLoad trafficLoad = null; + if (damKernelInput.Location.StabilityOptions != null && damKernelInput.Location.StabilityOptions.TrafficLoad.HasValue && + !(Math.Abs(damKernelInput.Location.StabilityOptions.TrafficLoad.Value) < 1e-6)) { - TrafficLoad trafficLoad = null; - if (damKernelInput.Location.StabilityOptions != null && damKernelInput.Location.StabilityOptions.TrafficLoad.HasValue && - !(Math.Abs(damKernelInput.Location.StabilityOptions.TrafficLoad.Value) < 1e-6)) + trafficLoad = new TrafficLoad { - trafficLoad = new TrafficLoad - { - Pressure = damKernelInput.Location.StabilityOptions.TrafficLoad.Value, - XEnd = damKernelInput.Location.SurfaceLine - .CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).X, - XStart = damKernelInput.Location.SurfaceLine - .CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).X - }; - } - - return trafficLoad; + Pressure = damKernelInput.Location.StabilityOptions.TrafficLoad.Value, + XEnd = damKernelInput.Location.SurfaceLine + .CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).X, + XStart = damKernelInput.Location.SurfaceLine + .CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).X + }; } - /// - /// Fills the bishop calculation grid. - /// - /// The dam kernel input. - /// - public static BishopCalculationGrid FillBishopCalculationGrid(DamKernelInput damKernelInput) - { - SlipCircleDefinition slipCircleDefinition = damKernelInput.DamFailureMechanismeCalculationSpecification - .FailureMechanismParametersMStab.MStabParameters.SlipCircleDefinition; - double minimumCircleDepth = damKernelInput.DamFailureMechanismeCalculationSpecification - .FailureMechanismParametersMStab.MStabParameters.CalculationOptions.MinimalCircleDepth; - MStabGridPosition gridPosition = damKernelInput.DamFailureMechanismeCalculationSpecification - .FailureMechanismParametersMStab.MStabParameters.GridPosition; - BishopCalculationGrid bishopCalculationGrid = BishopGridCreator.DetermineGridsFromSettings(gridPosition, - slipCircleDefinition, damKernelInput.Location.SurfaceLine); - double centerOfLeftGridXCoordinate = (bishopCalculationGrid.GridXLeft + bishopCalculationGrid.GridXRight) * 0.5; - SoilProfile1D soilProfile1DAtCenterOfLeftGridXCoordinate = - damKernelInput.SubSoilScenario.DetermineSoilProfile1DAtX(centerOfLeftGridXCoordinate, damKernelInput.Location.SurfaceLine, - damKernelInput.Location.GetDikeEmbankmentSoil()); - BishopGridCreator.DetermineTangentLines(bishopCalculationGrid, slipCircleDefinition, - soilProfile1DAtCenterOfLeftGridXCoordinate, minimumCircleDepth); + return trafficLoad; + } - return bishopCalculationGrid; - } + /// + /// Fills the bishop calculation grid. + /// + /// The dam kernel input. + /// + public static BishopCalculationGrid FillBishopCalculationGrid(DamKernelInput damKernelInput) + { + SlipCircleDefinition slipCircleDefinition = damKernelInput.DamFailureMechanismeCalculationSpecification + .FailureMechanismParametersMStab.MStabParameters.SlipCircleDefinition; + double minimumCircleDepth = damKernelInput.DamFailureMechanismeCalculationSpecification + .FailureMechanismParametersMStab.MStabParameters.CalculationOptions.MinimalCircleDepth; + MStabGridPosition gridPosition = damKernelInput.DamFailureMechanismeCalculationSpecification + .FailureMechanismParametersMStab.MStabParameters.GridPosition; + BishopCalculationGrid bishopCalculationGrid = BishopGridCreator.DetermineGridsFromSettings(gridPosition, + slipCircleDefinition, damKernelInput.Location.SurfaceLine); + double centerOfLeftGridXCoordinate = (bishopCalculationGrid.GridXLeft + bishopCalculationGrid.GridXRight) * 0.5; + SoilProfile1D soilProfile1DAtCenterOfLeftGridXCoordinate = + damKernelInput.SubSoilScenario.DetermineSoilProfile1DAtX(centerOfLeftGridXCoordinate, damKernelInput.Location.SurfaceLine, + damKernelInput.Location.GetDikeEmbankmentSoil()); + BishopGridCreator.DetermineTangentLines(bishopCalculationGrid, slipCircleDefinition, + soilProfile1DAtCenterOfLeftGridXCoordinate, minimumCircleDepth); - /// - /// Gets the name of the stability input file. - /// - /// The dam kernel input. - /// Index of the iteration. - /// The model. - /// - public static string GetStabilityInputFileName(DamKernelInput damKernelInput, int iterationIndex, MStabModelType model) + return bishopCalculationGrid; + } + + /// + /// Gets the name of the stability input file. + /// + /// The dam kernel input. + /// Index of the iteration. + /// The model. + /// + public static string GetStabilityInputFileName(DamKernelInput damKernelInput, int iterationIndex, MStabModelType model) + { + // Assume 2D sti-file, then check on type being 1D + string soilGeometryName = damKernelInput.SubSoilScenario.SoilProfile2DName; + string calculationName = DetermineCalculationFilename(damKernelInput.FilenamePrefix, soilGeometryName, iterationIndex); + const string filenameExtension = ".skx"; + string fileName = calculationName + filenameExtension; + string stabilityDirectory = GetStabilityCalculationDirectory(model, damKernelInput.CalculationDir); + return Path.Combine(stabilityDirectory, fileName); + } + + /// + /// Throws the when macro stability kernel input is not assigned. + /// + /// The dam macro stability input. + /// + public static void ThrowWhenMacroStabilityKernelInputNull(MacroStabilityKernelDataInput macroStabilityKernelDataInput) + { + if (macroStabilityKernelDataInput == null) { - // Assume 2D sti-file, then check on type being 1D - string soilGeometryName = damKernelInput.SubSoilScenario.SoilProfile2DName; - string calculationName = DetermineCalculationFilename(damKernelInput.FilenamePrefix, soilGeometryName, iterationIndex); - const string filenameExtension = ".skx"; - string fileName = calculationName + filenameExtension; - string stabilityDirectory = GetStabilityCalculationDirectory(model, damKernelInput.CalculationDir); - return Path.Combine(stabilityDirectory, fileName); + throw new NoNullAllowedException(Resources.MacroStabilityKernelWrapper_NoMacroStabilityInputObjectDefined); } + } - /// - /// Throws the when macro stability kernel input is not assigned. - /// - /// The dam macro stability input. - /// - public static void ThrowWhenMacroStabilityKernelInputNull(MacroStabilityKernelDataInput macroStabilityKernelDataInput) + /// + /// Throws the when macro stability kernel output is not assigned. + /// + /// The dam macro stability output. + /// + public static void ThrowWhenMacroStabilityKernelOutputNull(MacroStabilityOutput macroStabilityOutput) + { + if (macroStabilityOutput == null) { - if (macroStabilityKernelDataInput == null) - { - throw new NoNullAllowedException(Resources.MacroStabilityKernelWrapper_NoMacroStabilityInputObjectDefined); - } + throw new NoNullAllowedException(Resources.MacroStabilityKernelWrapper_NoMacroStabilityOutputObjectDefined); } + } - /// - /// Throws the when macro stability kernel output is not assigned. - /// - /// The dam macro stability output. - /// - public static void ThrowWhenMacroStabilityKernelOutputNull(MacroStabilityOutput macroStabilityOutput) + /// + /// Throws the when macro stability dam kernel input is not assigned. + /// + /// The dam kernel input. + /// + public static void ThrowWhenMacroStabilityDamKernelInputNull(DamKernelInput damKernelInput) + { + if (damKernelInput == null) { - if (macroStabilityOutput == null) - { - throw new NoNullAllowedException(Resources.MacroStabilityKernelWrapper_NoMacroStabilityOutputObjectDefined); - } + throw new NoNullAllowedException(Resources.MacroStabilityKernelWrapper_NoDamInputObjectDefinedForMacroStability); } + } - /// - /// Throws the when macro stability dam kernel input is not assigned. - /// - /// The dam kernel input. - /// - public static void ThrowWhenMacroStabilityDamKernelInputNull(DamKernelInput damKernelInput) + /// + /// Creates new designresult. + /// + /// The dam kernel input. + /// The design scenario. + /// + public static DesignResult NewDesignResult(DamKernelInput damKernelInput, DesignScenario designScenario) + { + var soilProfile2DName = damKernelInput.SubSoilScenario.ToString(); + var designResult = new DesignResult(damKernelInput.DamFailureMechanismeCalculationSpecification, + designScenario, damKernelInput.SubSoilScenario.SoilProfile1D, soilProfile2DName) { - if (damKernelInput == null) - { - throw new NoNullAllowedException(Resources.MacroStabilityKernelWrapper_NoDamInputObjectDefinedForMacroStability); - } + // initialize as failed + CalculationResult = CalculationResult.RunFailed, + StabilityDesignResults = new StabilityDesignResults() + }; + var stabilityDesignResults = new StabilityDesignResults + { + RedesignedSurfaceLine = damKernelInput.Location.SurfaceLine + }; + designResult.ProfileName = soilProfile2DName; + designResult.StabilityDesignResults = stabilityDesignResults; + designResult.CalculationSubDir = damKernelInput.CalculationDir; + return designResult; + } + + /// + /// Fills the design result. + /// + /// The macro stability output item. + /// The design result. + public static void FillDesignResult(MacroStabilityOutputItem macroStabilityOutputItem, DesignResult designResult) + { + designResult.BaseFileName = Path.GetFileNameWithoutExtension(macroStabilityOutputItem.ProjectName); + designResult.CalculationSubDir = macroStabilityOutputItem.CalculationPath; + designResult.CalculationResult = macroStabilityOutputItem.CalculationResult; + designResult.StabilityDesignResults.StabilityModelType = macroStabilityOutputItem.StabilityModelType; + if (designResult.CalculationResult == CalculationResult.Succeeded) + { + designResult.StabilityDesignResults.SafetyFactor = macroStabilityOutputItem.SafetyFactor; } - /// - /// Creates new designresult. - /// - /// The dam kernel input. - /// The design scenario. - /// - public static DesignResult NewDesignResult(DamKernelInput damKernelInput, DesignScenario designScenario) + designResult.StabilityDesignResults.ActiveCenterPoint = + macroStabilityOutputItem.ActiveCenterPoint; + designResult.StabilityDesignResults.ActiveCenterPointRadius = + macroStabilityOutputItem.ActiveCenterPointRadius; + designResult.StabilityDesignResults.ResultSlices = macroStabilityOutputItem.ResultSlices; + if (macroStabilityOutputItem.StabilityModelType == MStabModelType.UpliftVan || + macroStabilityOutputItem.StabilityModelType == MStabModelType.BishopUpliftVan) { - var soilProfile2DName = damKernelInput.SubSoilScenario.ToString(); - var designResult = new DesignResult(damKernelInput.DamFailureMechanismeCalculationSpecification, - designScenario, damKernelInput.SubSoilScenario.SoilProfile1D, soilProfile2DName) - { - // initialize as failed - CalculationResult = CalculationResult.RunFailed, - StabilityDesignResults = new StabilityDesignResults() - }; - var stabilityDesignResults = new StabilityDesignResults - { - RedesignedSurfaceLine = damKernelInput.Location.SurfaceLine - }; - designResult.ProfileName = soilProfile2DName; - designResult.StabilityDesignResults = stabilityDesignResults; - designResult.CalculationSubDir = damKernelInput.CalculationDir; - return designResult; + designResult.StabilityDesignResults.PassiveCenterPoint = + macroStabilityOutputItem.PassiveCenterPoint; + designResult.StabilityDesignResults.PassiveCenterPointRadius = + macroStabilityOutputItem.PassiveCenterPointRadius; } + } - /// - /// Fills the design result. - /// - /// The macro stability output item. - /// The design result. - public static void FillDesignResult(MacroStabilityOutputItem macroStabilityOutputItem, DesignResult designResult) + /// + /// Prepares the kernel. + /// + /// The calculator. + /// Name of the file. + /// + public static PrepareResult PrepareKernel(Calculator calculator, string fileName) + { + try { - designResult.BaseFileName = Path.GetFileNameWithoutExtension(macroStabilityOutputItem.ProjectName); - designResult.CalculationSubDir = macroStabilityOutputItem.CalculationPath; - designResult.CalculationResult = macroStabilityOutputItem.CalculationResult; - designResult.StabilityDesignResults.StabilityModelType = macroStabilityOutputItem.StabilityModelType; - if (designResult.CalculationResult == CalculationResult.Succeeded) - { - designResult.StabilityDesignResults.SafetyFactor = macroStabilityOutputItem.SafetyFactor; - } + // For now a simple check to see if any data has been past at all. + string inputAsXml = calculator.KernelInputXml; - designResult.StabilityDesignResults.ActiveCenterPoint = - macroStabilityOutputItem.ActiveCenterPoint; - designResult.StabilityDesignResults.ActiveCenterPointRadius = - macroStabilityOutputItem.ActiveCenterPointRadius; - designResult.StabilityDesignResults.ResultSlices = macroStabilityOutputItem.ResultSlices; - if (macroStabilityOutputItem.StabilityModelType == MStabModelType.UpliftVan || - macroStabilityOutputItem.StabilityModelType == MStabModelType.BishopUpliftVan) + File.WriteAllText(fileName, inputAsXml); + + if (inputAsXml.Length > 10) { - designResult.StabilityDesignResults.PassiveCenterPoint = - macroStabilityOutputItem.PassiveCenterPoint; - designResult.StabilityDesignResults.PassiveCenterPointRadius = - macroStabilityOutputItem.PassiveCenterPointRadius; + return PrepareResult.Successful; } + + return PrepareResult.Failed; } + catch + { + return PrepareResult.Failed; + } + } - /// - /// Prepares the kernel. - /// - /// The calculator. - /// Name of the file. - /// - public static PrepareResult PrepareKernel(Calculator calculator, string fileName) + /// + /// Validates the specified kernel data input. + /// + /// The kernel data input. + /// The kernel data output. + /// The return messages. + /// + /// Zero when there are no errors, one when there are errors that prevent a calculation + /// + public static int Validate(IKernelDataInput kernelDataInput, IKernelDataOutput kernelDataOutput, out List messages) + { + var macroStabilityKernelDataInput = (MacroStabilityKernelDataInput) kernelDataInput; + messages = new List(); + try { - try + ValidationOutput result = new Validator(macroStabilityKernelDataInput.Input).Validate(); + if (result.IsValid) { - // For now a simple check to see if any data has been past at all. - string inputAsXml = calculator.KernelInputXml; - - File.WriteAllText(fileName, inputAsXml); - - if (inputAsXml.Length > 10) - { - return PrepareResult.Successful; - } - - return PrepareResult.Failed; + return 0; } - catch + + if (kernelDataOutput != null) { - return PrepareResult.Failed; + ((MacroStabilityOutput) kernelDataOutput).CalculationResult = CalculationResult.InvalidInputData; } - } - /// - /// Validates the specified kernel data input. - /// - /// The kernel data input. - /// The kernel data output. - /// The return messages. - /// - /// Zero when there are no errors, one when there are errors that prevent a calculation - /// - public static int Validate(IKernelDataInput kernelDataInput, IKernelDataOutput kernelDataOutput, out List messages) - { - var macroStabilityKernelDataInput = (MacroStabilityKernelDataInput) kernelDataInput; - messages = new List(); - try + foreach (Message resultMessage in result.Messages) { - ValidationOutput result = new Validator(macroStabilityKernelDataInput.Input).Validate(); - if (result.IsValid) + var message = new LogMessage { - return 0; - } - - if (kernelDataOutput != null) + Message = resultMessage.Content + }; + switch (resultMessage.MessageType) { - ((MacroStabilityOutput) kernelDataOutput).CalculationResult = CalculationResult.InvalidInputData; - } - - foreach (Message resultMessage in result.Messages) - { - var message = new LogMessage + case MessageType.Error: { - Message = resultMessage.Content - }; - switch (resultMessage.MessageType) + message.MessageType = LogMessageType.Error; + break; + } + case MessageType.Info: { - case MessageType.Error: - { - message.MessageType = LogMessageType.Error; - break; - } - case MessageType.Info: - { - message.MessageType = LogMessageType.Info; - break; - } - case MessageType.Warning: - { - message.MessageType = LogMessageType.Warning; - break; - } + message.MessageType = LogMessageType.Info; + break; } - - messages.Add(message); + case MessageType.Warning: + { + message.MessageType = LogMessageType.Warning; + break; + } } - return 1; - } - catch (Exception e) - { - var message = new LogMessage - { - MessageType = LogMessageType.FatalError, - Message = e.Message - }; messages.Add(message); - if (kernelDataOutput != null) - { - ((MacroStabilityOutput) kernelDataOutput).CalculationResult = CalculationResult.InvalidInputData; - } - - return 1; } - } - /// - /// Performs the stability calculation. - /// - /// The input. - /// The macro stability output. - /// Name of the file. - /// The calculator. - /// The messages. - public static void PerformStabilityCalculation(MacroStabilityInput input, MacroStabilityOutput macroStabilityOutput, - string fileName, ICalculator calculator, out List messages) - { - macroStabilityOutput.CalculationResult = CalculationResult.NoRun; - macroStabilityOutput.StabilityOutputItems = new List(); - messages = new List(); - try - { - MacroStability.CSharpWrapper.Output.MacroStabilityOutput macroStabilityOutputKernel = calculator.Calculate(); - FillEngineFromMacroStabilityWrapperOutput.FillEngineDataWithResults(macroStabilityOutputKernel, macroStabilityOutput, - out messages); -#if DEBUG - foreach (MacroStabilityOutputItem stabilityOutputItem in macroStabilityOutput.StabilityOutputItems) - { - switch (stabilityOutputItem.StabilityModelType) - { - case MStabModelType.Bishop: - input.StabilityModel.BishopCalculationCircle = stabilityOutputItem.BishopCalculationCircle; - break; - case MStabModelType.UpliftVan: - input.StabilityModel.UpliftVanCalculationGrid = stabilityOutputItem.UpliftVanCalculationGrid; - break; - } - - WriteStixFileBasedOnInputAndResultsSearchGrid(fileName, input); - } -#endif - WriteStixFileBasedOnInputAndResultsSlipPlane(fileName, input, macroStabilityOutput); - } - catch (Exception e) - { - macroStabilityOutput.CalculationResult = CalculationResult.UnexpectedError; - messages.Add(new LogMessage(LogMessageType.Error, null, e.Message)); - } + return 1; } - - /// - /// Determines the calculation filename. - /// - /// The filename prefix. - /// Name of the soil geometry. - /// Index of the iteration. - /// - private static string DetermineCalculationFilename(string filenamePrefix, string soilGeometryName, int iterationIndex) + catch (Exception e) { - string calculationName; - if (iterationIndex <= 0) + var message = new LogMessage { - calculationName = $"{filenamePrefix}_Pro({soilGeometryName})"; - } - else + MessageType = LogMessageType.FatalError, + Message = e.Message + }; + messages.Add(message); + if (kernelDataOutput != null) { - calculationName = $"{filenamePrefix}_Pro({soilGeometryName})_Ite({iterationIndex})"; + ((MacroStabilityOutput) kernelDataOutput).CalculationResult = CalculationResult.InvalidInputData; } - return Regex.Replace(calculationName, @"[\\\/:\*\?""'<>|.]", "_"); + return 1; } + } - /// - /// Gets the stability calculation directory. - /// - /// The model. - /// The project working path. - /// - private static string GetStabilityCalculationDirectory(MStabModelType model, string projectWorkingPath) + /// + /// Performs the stability calculation. + /// + /// The input. + /// The macro stability output. + /// Name of the file. + /// The calculator. + /// The messages. + public static void PerformStabilityCalculation(MacroStabilityInput input, MacroStabilityOutput macroStabilityOutput, + string fileName, ICalculator calculator, out List messages) + { + macroStabilityOutput.CalculationResult = CalculationResult.NoRun; + macroStabilityOutput.StabilityOutputItems = new List(); + messages = new List(); + try { - string calculationBaseDirectory = projectWorkingPath; - string stabilitySubDir = GetCalculationSubDir(model); - string stabilityDirectory = Path.Combine(calculationBaseDirectory, stabilitySubDir); - if (!Directory.Exists(stabilityDirectory)) + MacroStability.CSharpWrapper.Output.MacroStabilityOutput macroStabilityOutputKernel = calculator.Calculate(); + FillEngineFromMacroStabilityWrapperOutput.FillEngineDataWithResults(macroStabilityOutputKernel, macroStabilityOutput, + out messages); +#if DEBUG + foreach (MacroStabilityOutputItem stabilityOutputItem in macroStabilityOutput.StabilityOutputItems) { - Directory.CreateDirectory(stabilityDirectory); + switch (stabilityOutputItem.StabilityModelType) + { + case MStabModelType.Bishop: + input.StabilityModel.BishopCalculationCircle = stabilityOutputItem.BishopCalculationCircle; + break; + case MStabModelType.UpliftVan: + input.StabilityModel.UpliftVanCalculationGrid = stabilityOutputItem.UpliftVanCalculationGrid; + break; + } + + WriteStixFileBasedOnInputAndResultsSearchGrid(fileName, input); } +#endif + WriteStixFileBasedOnInputAndResultsSlipPlane(fileName, input, macroStabilityOutput); + } + catch (Exception e) + { + macroStabilityOutput.CalculationResult = CalculationResult.UnexpectedError; + messages.Add(new LogMessage(LogMessageType.Error, null, e.Message)); + } + } - return stabilityDirectory; + /// + /// Determines the calculation filename. + /// + /// The filename prefix. + /// Name of the soil geometry. + /// Index of the iteration. + /// + private static string DetermineCalculationFilename(string filenamePrefix, string soilGeometryName, int iterationIndex) + { + string calculationName; + if (iterationIndex <= 0) + { + calculationName = $"{filenamePrefix}_Pro({soilGeometryName})"; } + else + { + calculationName = $"{filenamePrefix}_Pro({soilGeometryName})_Ite({iterationIndex})"; + } - /// - /// Gets the calculation sub dir. - /// - /// The model. - /// - private static string GetCalculationSubDir(MStabModelType model) + return Regex.Replace(calculationName, @"[\\\/:\*\?""'<>|.]", "_"); + } + + /// + /// Gets the stability calculation directory. + /// + /// The model. + /// The project working path. + /// + private static string GetStabilityCalculationDirectory(MStabModelType model, string projectWorkingPath) + { + string calculationBaseDirectory = projectWorkingPath; + string stabilitySubDir = GetCalculationSubDir(model); + string stabilityDirectory = Path.Combine(calculationBaseDirectory, stabilitySubDir); + if (!Directory.Exists(stabilityDirectory)) { - const string stabilitySubDir = @"Stability\"; - var modelSubDirectory = model.ToString(); - string dir = Path.Combine(stabilitySubDir, modelSubDirectory); - return dir; + Directory.CreateDirectory(stabilityDirectory); } + return stabilityDirectory; + } + + /// + /// Gets the calculation sub dir. + /// + /// The model. + /// + private static string GetCalculationSubDir(MStabModelType model) + { + const string stabilitySubDir = @"Stability\"; + var modelSubDirectory = model.ToString(); + string dir = Path.Combine(stabilitySubDir, modelSubDirectory); + return dir; + } + #if DEBUG - /// - /// Writes the stix file based on input and results search grid. - /// - /// Name of the file. - /// The input. - private static void WriteStixFileBasedOnInputAndResultsSearchGrid(string fileName, MacroStabilityInput input) + /// + /// Writes the stix file based on input and results search grid. + /// + /// Name of the file. + /// The input. + private static void WriteStixFileBasedOnInputAndResultsSearchGrid(string fileName, MacroStabilityInput input) + { + if (!(input.StabilityModel.ModelOption == StabilityModelOptionType.UpliftVan && + input.StabilityModel.SearchAlgorithm == SearchAlgorithm.Beeswarm)) { - if (!(input.StabilityModel.ModelOption == StabilityModelOptionType.UpliftVan && - input.StabilityModel.SearchAlgorithm == SearchAlgorithm.Beeswarm)) - { - string fileNameForCalculationAsStix = DetermineStixFilename(fileName, "input"); - var inputStixFile = new StixWriter(); - inputStixFile.FillInfo("DAM Engine", Path.GetDirectoryName(fileName), - Path.GetFileName(fileName), true); - StixFileWrite(inputStixFile, fileNameForCalculationAsStix, input); - } + string fileNameForCalculationAsStix = DetermineStixFilename(fileName, "input"); + var inputStixFile = new StixWriter(); + inputStixFile.FillInfo("DAM Engine", Path.GetDirectoryName(fileName), + Path.GetFileName(fileName), true); + StixFileWrite(inputStixFile, fileNameForCalculationAsStix, input); } + } #endif - /// - /// Writes the stix file based on input and results slip plane. - /// - /// Name of the file. - /// The input. - /// The macro stability output. - private static void WriteStixFileBasedOnInputAndResultsSlipPlane(string fileName, MacroStabilityInput input, - MacroStabilityOutput macroStabilityOutput) + /// + /// Writes the stix file based on input and results slip plane. + /// + /// Name of the file. + /// The input. + /// The macro stability output. + private static void WriteStixFileBasedOnInputAndResultsSlipPlane(string fileName, MacroStabilityInput input, + MacroStabilityOutput macroStabilityOutput) + { + if (macroStabilityOutput.CalculationResult == CalculationResult.Succeeded) { - if (macroStabilityOutput.CalculationResult == CalculationResult.Succeeded) + foreach (MacroStabilityOutputItem macroStabilityOutputItem in macroStabilityOutput.StabilityOutputItems) { - foreach (MacroStabilityOutputItem macroStabilityOutputItem in macroStabilityOutput.StabilityOutputItems) - { - macroStabilityOutputItem.CalculationPath = Path.GetDirectoryName(fileName); - macroStabilityOutputItem.ProjectName = Path.GetFileName(fileName); - string fileNameForCalculationAsStix = DetermineStixFilename(fileName, "result"); - var resultStixWrite = new StixWriter(); - resultStixWrite.FillInfo("DAM Engine", macroStabilityOutputItem.CalculationPath, - macroStabilityOutputItem.ProjectName, true); - resultStixWrite.FillCalculatedCircle(macroStabilityOutputItem.ActiveCenterPoint.X, - macroStabilityOutputItem.ActiveCenterPoint.Z, - macroStabilityOutputItem.ActiveCenterPointRadius); - StixFileWrite(resultStixWrite, fileNameForCalculationAsStix, input); - } + macroStabilityOutputItem.CalculationPath = Path.GetDirectoryName(fileName); + macroStabilityOutputItem.ProjectName = Path.GetFileName(fileName); + string fileNameForCalculationAsStix = DetermineStixFilename(fileName, "result"); + var resultStixWrite = new StixWriter(); + resultStixWrite.FillInfo("DAM Engine", macroStabilityOutputItem.CalculationPath, + macroStabilityOutputItem.ProjectName, true); + resultStixWrite.FillCalculatedCircle(macroStabilityOutputItem.ActiveCenterPoint.X, + macroStabilityOutputItem.ActiveCenterPoint.Z, + macroStabilityOutputItem.ActiveCenterPointRadius); + StixFileWrite(resultStixWrite, fileNameForCalculationAsStix, input); } } + } - private static void StixFileWrite(StixWriter stixWriter, string fileName, MacroStabilityInput input) + private static void StixFileWrite(StixWriter stixWriter, string fileName, MacroStabilityInput input) + { + if (File.Exists(fileName)) { - if (File.Exists(fileName)) - { - File.Delete(fileName); - } - - stixWriter.WriteStixFile(fileName, input); + File.Delete(fileName); } - private static string DetermineStixFilename(string fileNameForCalc, string suffix, string extension = ".stix") - { - return Path.Combine(Path.GetDirectoryName(fileNameForCalc) ?? string.Empty, - $"{Path.GetFileNameWithoutExtension(fileNameForCalc)}_{suffix}{extension}"); - } + stixWriter.WriteStixFile(fileName, input); } + + private static string DetermineStixFilename(string fileNameForCalc, string suffix, string extension = ".stix") + { + return Path.Combine(Path.GetDirectoryName(fileNameForCalc) ?? string.Empty, + $"{Path.GetFileNameWithoutExtension(fileNameForCalc)}_{suffix}{extension}"); + } } \ No newline at end of file