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);