Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesAssessmentRegional/RegionalScenariosCalculation.cs =================================================================== diff -u -r1181 -r1184 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesAssessmentRegional/RegionalScenariosCalculation.cs (.../RegionalScenariosCalculation.cs) (revision 1181) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesAssessmentRegional/RegionalScenariosCalculation.cs (.../RegionalScenariosCalculation.cs) (revision 1184) @@ -180,7 +180,7 @@ catch(Exception exception) { sendMessageDelegate(new LogMessage(LogMessageType.Warning, null, "Unexpected error:" + exception.Message)); - throw exception; + throw; } } @@ -365,39 +365,55 @@ { if (job.Location.ModelFactors.UpliftCriterionPiping.HasValue) { -// var modelParametersForPLLines = new ModelParametersForPlLines(); -// var calculator = GetCalculatorForPipingModel(job, modelParametersForPLLines); -// double waterLevel; -// switch (job.LoadSituation) -// { -// case LoadSituation.Dry: -// waterLevel = job.Location.BoezemLevelLbp; -// break; -// default: // LoadSituation.Wet -// waterLevel = job.Location.BoezemLevelTp; -// break; -// } -// //job.SoilGeometryProbability.SoilProfile1D.EnsureUniqueLayerIds(); -// var calculationName = GetCalculationNameForPipingCalculator(job); -// calculator.FilenameCalculation = Path.Combine(Path.Combine(damProjectData.ProjectPath, job.FailureMechanismType.ToString()), calculationName); -// calculator.IsHydraulicShortcut = (job.HydraulicShortcutType == HydraulicShortcutType.HydraulicShortcut); -// double? pipingFactor = calculator.CalculatePipingFactor(job.Location, job.Location.SurfaceLine, job.SoilGeometryProbability.SoilProfile1D, waterLevel); -// job.BaseFileName = calculator.FilenameCalculation; -// -// job.RegionalResultType = RegionalResultType.SafetyFactor; -// if (pipingFactor.HasValue) -// { -// job.SafetyFactor = pipingFactor.Value; -// job.CalculationResult = CalculationResult.Succeeded; -// job.ProbabilityOfFailure = double.NaN; -// job.RegionalResultType = RegionalResultType.SafetyFactor; -// } -// -// else -// { -// job.SafetyFactor = double.NaN; -// job.CalculationResult = CalculationResult.RunFailed; -// } + var currentSpecification = damProjectData.DamProjectCalculationSpecification.CurrentSpecification; // must this be a copy? + currentSpecification.FailureMechanismSystemType = job.FailureMechanismType; + currentSpecification.PipingModelType = job.PipingModelOption; + var calculator = CreateKernelWrapper(currentSpecification); + // For piping waterlevel needs to be set here + switch (job.LoadSituation) + { + case LoadSituation.Dry: + job.Location.BoezemLevelHbp = job.Location.BoezemLevelLbp; + break; + case LoadSituation.Wet: + job.Location.BoezemLevelLbp = job.Location.BoezemLevelHbp; + break; + } + PerformJob(job, calculator, currentSpecification); + + // var modelParametersForPLLines = new ModelParametersForPlLines(); + // var calculator = GetCalculatorForPipingModel(job, modelParametersForPLLines); + // double waterLevel; + // switch (job.LoadSituation) + // { + // case LoadSituation.Dry: + // waterLevel = job.Location.BoezemLevelLbp; + // break; + // default: // LoadSituation.Wet + // waterLevel = job.Location.BoezemLevelTp; + // break; + // } + // //job.SoilGeometryProbability.SoilProfile1D.EnsureUniqueLayerIds(); + // var calculationName = GetCalculationNameForPipingCalculator(job); + // calculator.FilenameCalculation = Path.Combine(Path.Combine(damProjectData.ProjectPath, job.FailureMechanismType.ToString()), calculationName); + // calculator.IsHydraulicShortcut = (job.HydraulicShortcutType == HydraulicShortcutType.HydraulicShortcut); + // double? pipingFactor = calculator.CalculatePipingFactor(job.Location, job.Location.SurfaceLine, job.SoilGeometryProbability.SoilProfile1D, waterLevel); + // job.BaseFileName = calculator.FilenameCalculation; + // + // job.RegionalResultType = RegionalResultType.SafetyFactor; + // if (pipingFactor.HasValue) + // { + // job.SafetyFactor = pipingFactor.Value; + // job.CalculationResult = CalculationResult.Succeeded; + // job.ProbabilityOfFailure = double.NaN; + // job.RegionalResultType = RegionalResultType.SafetyFactor; + // } + // + // else + // { + // job.SafetyFactor = double.NaN; + // job.CalculationResult = CalculationResult.RunFailed; + // } } else { @@ -430,9 +446,9 @@ damKernelInput.Location = location; damKernelInput.SubSoilScenario = soilGeometryProbability; damKernelInput.DamFailureMechanismeCalculationSpecification = damProjectData.DamProjectCalculationSpecification.CurrentSpecification; - damKernelInput.RiverLevelHigh = damKernelInput.Location.BoezemLevelHbp;// #Bka juiste waarde nakijken in classic - damKernelInput.RiverLevelLow = damKernelInput.Location.BoezemLevelLbp;// #Bka juiste waarde nakijken in classic - damKernelInput.FilenamePrefix = string.Format("Loc({0})_Sce({1})", location.Name, scenarioType.ToString()); + damKernelInput.RiverLevelHigh = damKernelInput.Location.BoezemLevelHbp; + damKernelInput.RiverLevelLow = damKernelInput.Location.BoezemLevelLbp; + damKernelInput.FilenamePrefix = string.Format("Loc({0})_Sce({1})", location.Name, scenarioType); PrepareResult prepareResult = kernelWrapper.Prepare(damKernelInput, 0, out kernelDataInput, out kernelDataOutput); // Sometimes the kernelDataInput is not created (p.e when soilprofileprobablility is meant for @@ -514,41 +530,74 @@ var currentSpecification = damProjectData.DamProjectCalculationSpecification.CurrentSpecification; // must this be a copy? currentSpecification.FailureMechanismSystemType = job.FailureMechanismType; currentSpecification.FailureMechanismParametersMStab.MStabParameters.Model = job.MstabModelOption; + var calculator = CreateKernelWrapper(currentSpecification); + + PerformJob(job, calculator, currentSpecification); + } + + private void PerformJob(RegionalScenarioProfileResult job, IKernelWrapper calculator, DamFailureMechanismeCalculationSpecification currentSpecification) + { IKernelDataInput kernelDataInput; IKernelDataOutput kernelDataOutput; DamKernelInput damKernelInput; - var calculator = CreateKernelWrapper(currentSpecification); lock (runningJobs) { runningJobs[calculator] = job; } var calculationCreationMessages = CreateKernelWrapperforJob(calculator, job.ScenarioType, job.Location, job.SoilGeometryProbability, - out kernelDataInput, out kernelDataOutput, out damKernelInput); - List messages; - calculator.Execute(kernelDataInput, kernelDataOutput, out messages); - job.CalculationResult = CalculationResult.Succeeded; //Run(); + out kernelDataInput, out kernelDataOutput, out damKernelInput); - if (job.CalculationResult == CalculationResult.Succeeded) + // Check if prepare is ok + var errorFound = false; + foreach (var calculationCreationMessage in calculationCreationMessages) { - string resultMessage = ""; - List results; - calculator.PostProcess(damKernelInput, kernelDataOutput, null, resultMessage, out results); - - if (results[0].SafetyFactor != null) + if (calculationCreationMessage.MessageType == LogMessageType.Error) { - job.SafetyFactor = results[0].SafetyFactor.Value; + job.CalculationResult = CalculationResult.InvalidInputData; + errorFound = true; + break; } - job.CalculationResult = results[0].CalculationResult; - job.RegionalResultType = RegionalResultType.SafetyFactor; - job.ProbabilityOfFailure = double.NaN; } - else + if (!errorFound && calculationCreationMessages.Count > 0) { - job.RegionalResultType = (currentSpecification.FailureMechanismParametersMStab.MStabParameters.IsProbabilistic ? RegionalResultType.ProbabilityOfFailure : RegionalResultType.SafetyFactor); - job.SafetyFactor = double.NaN; - job.ProbabilityOfFailure = double.NaN; + job.CalculationResult = CalculationResult.NoRun; } + // if preparation has error or shows not relevant, then skip this + if (!errorFound && calculationCreationMessages.Count == 0) + { + List messages; + calculator.Execute(kernelDataInput, kernelDataOutput, out messages); + job.CalculationResult = CalculationResult.Succeeded; + + if (job.CalculationResult == CalculationResult.Succeeded) + { + string resultMessage = ""; + List results; + calculator.PostProcess(damKernelInput, kernelDataOutput, null, resultMessage, out results); + + if (results[0].SafetyFactor != null) + { + job.SafetyFactor = results[0].SafetyFactor.Value; + } + job.CalculationResult = results[0].CalculationResult; + job.RegionalResultType = RegionalResultType.SafetyFactor; + job.ProbabilityOfFailure = double.NaN; + } + else + { + if (job.FailureMechanismType == FailureMechanismSystemType.Piping) + { + job.RegionalResultType = RegionalResultType.SafetyFactor; + } + else + { + job.RegionalResultType = (currentSpecification.FailureMechanismParametersMStab.MStabParameters.IsProbabilistic ? RegionalResultType.ProbabilityOfFailure : RegionalResultType.SafetyFactor); + } + job.SafetyFactor = double.NaN; + job.ProbabilityOfFailure = double.NaN; + } + } lock (runningJobs) { runningJobs.Remove(calculator); Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/RegionalAssessment/RegionalScenariosCalculationTests.cs =================================================================== diff -u -r1181 -r1184 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/RegionalAssessment/RegionalScenariosCalculationTests.cs (.../RegionalScenariosCalculationTests.cs) (revision 1181) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/RegionalAssessment/RegionalScenariosCalculationTests.cs (.../RegionalScenariosCalculationTests.cs) (revision 1184) @@ -67,7 +67,7 @@ // engineInterface.DamProjectData.LocationJobs[0].Location.ModelFactors.UpliftCriterionStability = 1.2; // engineInterface.DamProjectData.LocationJobs[0].Location.ModelFactors.UpliftCriterionPiping = 1.2; - engineInterface.DamProjectData.MaxCalculationCores = 1; + engineInterface.DamProjectData.MaxCalculationCores = 7; string outputString = engineInterface.Run(); Assert.IsNotNull(outputString); @@ -78,13 +78,48 @@ Assert.AreEqual(4, output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult.Length); // scenario03: 3 results Assert.AreEqual(3, output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[0].RegionalScenarioProfileResults.Length); + Assert.AreEqual("Segment_235_1D1", output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[0].RegionalScenarioProfileResults[0].SoilProfileName); + Assert.AreEqual(0.261, output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[0].RegionalScenarioProfileResults[0].RegionalResult.SafetyFactor); + Assert.AreEqual("Segment_235_1D3", output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[0].RegionalScenarioProfileResults[1].SoilProfileName); + Assert.AreEqual(0.384, output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[0].RegionalScenarioProfileResults[1].RegionalResult.SafetyFactor); + Assert.AreEqual("Segment_235_1D5", output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[0].RegionalScenarioProfileResults[2].SoilProfileName); + Assert.AreEqual(0.697, output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[0].RegionalScenarioProfileResults[2].RegionalResult.SafetyFactor); // scenario07: 3 results Assert.AreEqual(3, output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[1].RegionalScenarioProfileResults.Length); + Assert.AreEqual("Segment_235_1D1", output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[1].RegionalScenarioProfileResults[0].SoilProfileName); + Assert.AreEqual(0.251, output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[1].RegionalScenarioProfileResults[0].RegionalResult.SafetyFactor); + Assert.AreEqual("Segment_235_1D3", output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[1].RegionalScenarioProfileResults[1].SoilProfileName); + Assert.AreEqual(0.452, output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[1].RegionalScenarioProfileResults[1].RegionalResult.SafetyFactor); + Assert.AreEqual("Segment_235_1D5", output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[1].RegionalScenarioProfileResults[2].SoilProfileName); + Assert.AreEqual(0.576, output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[1].RegionalScenarioProfileResults[2].RegionalResult.SafetyFactor); // scenario08: 9 results Assert.AreEqual(9, output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[2].RegionalScenarioProfileResults.Length); + Assert.AreEqual("Segment_235_1D2", output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[2].RegionalScenarioProfileResults[0].SoilProfileName); + Assert.AreEqual(0.373, output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[2].RegionalScenarioProfileResults[0].RegionalResult.SafetyFactor); + Assert.AreEqual("Segment_235_1D4", output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[2].RegionalScenarioProfileResults[1].SoilProfileName); + Assert.AreEqual(0.601, output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[2].RegionalScenarioProfileResults[1].RegionalResult.SafetyFactor); + Assert.AreEqual("Segment_235_1D6", output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[2].RegionalScenarioProfileResults[2].SoilProfileName); + Assert.AreEqual(0.761, output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[2].RegionalScenarioProfileResults[2].RegionalResult.SafetyFactor); + Assert.AreEqual("Segment_235_1D7", output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[2].RegionalScenarioProfileResults[3].SoilProfileName); + Assert.AreEqual(0.389, output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[2].RegionalScenarioProfileResults[3].RegionalResult.SafetyFactor); + Assert.AreEqual("Segment_235_1D8", output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[2].RegionalScenarioProfileResults[4].SoilProfileName); + Assert.AreEqual(0.369, output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[2].RegionalScenarioProfileResults[4].RegionalResult.SafetyFactor); + Assert.AreEqual("Segment_235_1D9", output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[2].RegionalScenarioProfileResults[5].SoilProfileName); + Assert.AreEqual(0.618, output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[2].RegionalScenarioProfileResults[5].RegionalResult.SafetyFactor); + Assert.AreEqual("Segment_235_1D10", output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[2].RegionalScenarioProfileResults[6].SoilProfileName); + Assert.AreEqual(0.597, output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[2].RegionalScenarioProfileResults[6].RegionalResult.SafetyFactor); + Assert.AreEqual("Segment_235_1D11", output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[2].RegionalScenarioProfileResults[7].SoilProfileName); + Assert.AreEqual(0.779, output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[2].RegionalScenarioProfileResults[7].RegionalResult.SafetyFactor); + Assert.AreEqual("Segment_235_1D12", output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[2].RegionalScenarioProfileResults[8].SoilProfileName); + Assert.AreEqual(0.757, output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[2].RegionalScenarioProfileResults[8].RegionalResult.SafetyFactor); // scenario10: 3 results - //Assert.AreEqual(0.410, output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.SafetyFactor, tolerance); - // Zone1SafetyFactor=1.282 + Assert.AreEqual(3, output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[3].RegionalScenarioProfileResults.Length); + Assert.AreEqual("Segment_235_1D1", output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[3].RegionalScenarioProfileResults[0].SoilProfileName); + Assert.AreEqual(90.00, output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[3].RegionalScenarioProfileResults[0].RegionalResult.SafetyFactor); + Assert.AreEqual("Segment_235_1D3", output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[3].RegionalScenarioProfileResults[1].SoilProfileName); + Assert.AreEqual(90.00, output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[3].RegionalScenarioProfileResults[1].RegionalResult.SafetyFactor); + Assert.AreEqual("Segment_235_1D5", output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[3].RegionalScenarioProfileResults[2].SoilProfileName); + Assert.AreEqual(90.00, output.Results.CalculationResults.LocationResults[0].RegionalScenariosResult.RegionalScenarioResult[3].RegionalScenarioProfileResults[2].RegionalResult.SafetyFactor); } } }