Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesAssessmentRegional/RegionalScenariosCalculation.cs =================================================================== diff -u -r1343 -r1372 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesAssessmentRegional/RegionalScenariosCalculation.cs (.../RegionalScenariosCalculation.cs) (revision 1343) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesAssessmentRegional/RegionalScenariosCalculation.cs (.../RegionalScenariosCalculation.cs) (revision 1372) @@ -247,7 +247,7 @@ if (soilGeometryProbabilities.Count == 0) { evaluationJob.FailedEvaluatedLocations.Add(location); - SendMessage(new LogMessage(LogMessageType.Warning, location, string.Format("Location has no soilprofiles: ") + + SendMessage(new LogMessage(LogMessageType.Warning, location, "Location has no soilprofiles: " + string.Format("Segment: {0}", location.Segment.Name))); } @@ -327,7 +327,7 @@ catch (Exception e) { job.CalculationResult = CalculationResult.UnexpectedError; - SendMessage(new LogMessage(LogMessageType.Warning, job, String.Format(job.LocationName + " Error: {0}", e.Message))); + SendMessage(new LogMessage(LogMessageType.Warning, job, string.Format(job.LocationName + " Error: {0}", e.Message))); } } @@ -337,7 +337,7 @@ /// private void ProcessJob(RegionalScenarioProfileResult job) { - Debug.WriteLine(String.Format("Job {0}, location {1}, Scenario {2}", job.FailureMechanismType.ToString(), job.LocationName, job.ScenarioType.ToString())); + Debug.WriteLine("Job {0}, location {1}, Scenario {2}", job.FailureMechanismType.ToString(), job.LocationName, job.ScenarioType.ToString()); switch (job.FailureMechanismType) { case FailureMechanismSystemType.StabilityInside: @@ -357,13 +357,13 @@ /// private void ProcessJobStability(RegionalScenarioProfileResult job) { - var currentSpecification = damProjectData.DamProjectCalculationSpecification.CurrentSpecification; // must this be a copy? - currentSpecification.FailureMechanismSystemType = job.FailureMechanismType; - currentSpecification.FailureMechanismParametersMStab.MStabParameters.Model = job.MstabModelOption; - currentSpecification.AssessmentScenarioJobSettings.LoadSituation = job.LoadSituation; - currentSpecification.AssessmentScenarioJobSettings.DikeDrySensitivity = job.DikeDrySensitivity; - currentSpecification.AssessmentScenarioJobSettings.HydraulicShortcutType = job.HydraulicShortcutType; - var calculator = CreateKernelWrapper(currentSpecification); + job.CurrentSpecification = damProjectData.DamProjectCalculationSpecification.CurrentSpecification; // must this be a copy? + job.CurrentSpecification.FailureMechanismSystemType = job.FailureMechanismType; + job.CurrentSpecification.FailureMechanismParametersMStab.MStabParameters.Model = job.MstabModelOption; + job.CurrentSpecification.AssessmentScenarioJobSettings.LoadSituation = job.LoadSituation; + job.CurrentSpecification.AssessmentScenarioJobSettings.DikeDrySensitivity = job.DikeDrySensitivity; + job.CurrentSpecification.AssessmentScenarioJobSettings.HydraulicShortcutType = job.HydraulicShortcutType; + var calculator = CreateKernelWrapper(job.CurrentSpecification); var boezemLevelHbp = job.Location.BoezemLevelHbp; var boezemLevelLbp = job.Location.BoezemLevelLbp; @@ -373,7 +373,7 @@ job.Location.BoezemLevelHbp = job.Location.BoezemLevelTp; job.Location.BoezemLevelLbp = job.Location.BoezemLevelTp; } - PerformJob(job, calculator, currentSpecification); + PerformJob(job, calculator); job.Location.BoezemLevelHbp = boezemLevelHbp; job.Location.BoezemLevelLbp = boezemLevelLbp; } @@ -386,13 +386,13 @@ { if (job.Location.ModelFactors.UpliftCriterionPiping.HasValue) { - var currentSpecification = damProjectData.DamProjectCalculationSpecification.CurrentSpecification; // must this be a copy? - currentSpecification.FailureMechanismSystemType = job.FailureMechanismType; - currentSpecification.PipingModelType = job.PipingModelOption; - currentSpecification.AssessmentScenarioJobSettings.LoadSituation = job.LoadSituation; - currentSpecification.AssessmentScenarioJobSettings.DikeDrySensitivity = job.DikeDrySensitivity; - currentSpecification.AssessmentScenarioJobSettings.HydraulicShortcutType = job.HydraulicShortcutType; - var calculator = CreateKernelWrapper(currentSpecification); + job.CurrentSpecification = damProjectData.DamProjectCalculationSpecification.CurrentSpecification; // must this be a copy? + job.CurrentSpecification.FailureMechanismSystemType = job.FailureMechanismType; + job.CurrentSpecification.PipingModelType = job.PipingModelOption; + job.CurrentSpecification.AssessmentScenarioJobSettings.LoadSituation = job.LoadSituation; + job.CurrentSpecification.AssessmentScenarioJobSettings.DikeDrySensitivity = job.DikeDrySensitivity; + job.CurrentSpecification.AssessmentScenarioJobSettings.HydraulicShortcutType = job.HydraulicShortcutType; + var calculator = CreateKernelWrapper(job.CurrentSpecification); // For piping waterlevel needs to be set here. Piping kernel only uses waterlevelhigh which is set from BoezemLevelHbp. var boezemLevelHbp = job.Location.BoezemLevelHbp; switch (job.LoadSituation) @@ -404,7 +404,7 @@ job.Location.BoezemLevelHbp = job.Location.BoezemLevelTp; break; } - PerformJob(job, calculator, currentSpecification); + PerformJob(job, calculator); job.Location.BoezemLevelHbp = boezemLevelHbp; } else @@ -425,21 +425,21 @@ return kernelWrapper; } - private void PerformJob(RegionalScenarioProfileResult job, IKernelWrapper calculator, DamFailureMechanismeCalculationSpecification currentSpecification) + private void PerformJob(RegionalScenarioProfileResult job, IKernelWrapper calculator) { - IKernelDataInput kernelDataInput; - IKernelDataOutput kernelDataOutput; - DamKernelInput damKernelInput; lock (runningJobs) { runningJobs[calculator] = job; } - var calculationCreationMessages = CreateKernelWrapperforJob(calculator, job.FailureMechanismType, job.ScenarioType, job.Location, job.SoilGeometryProbability, - out kernelDataInput, out kernelDataOutput, out damKernelInput); + + CreateKernelWrapperforJob(calculator, job); + var kernelDataInput = (job.KernelDataInput as IKernelDataInput); + var kernelDataOutput = (job.KernelDataOutput as IKernelDataOutput); + var damKernelInput = (job.DamKernelInput as DamKernelInput); // Check if prepare is ok var errorFound = false; - foreach (var calculationCreationMessage in calculationCreationMessages) + foreach (var calculationCreationMessage in job.CalculationMessages) { if (calculationCreationMessage.MessageType == LogMessageType.Error) { @@ -448,13 +448,13 @@ break; } } - if (!errorFound && calculationCreationMessages.Count > 0) + if (!errorFound && job.CalculationMessages.Count > 0) { job.CalculationResult = CalculationResult.NoRun; } // if preparation has error or shows not relevant, then skip this - if (!errorFound && calculationCreationMessages.Count == 0) + if (!errorFound && job.CalculationMessages.Count == 0) { List messages; calculator.Execute(kernelDataInput, kernelDataOutput, out messages); @@ -471,6 +471,7 @@ string resultMessage = ""; List results; calculator.PostProcess(damKernelInput, kernelDataOutput, null, resultMessage, out results); + job.Results = results; var stbOutput = kernelDataOutput as DamMacroStabilityOutput; if (stbOutput != null) { @@ -494,7 +495,7 @@ } else { - job.RegionalResultType = (currentSpecification.FailureMechanismParametersMStab.MStabParameters.IsProbabilistic ? RegionalResultType.ProbabilityOfFailure : RegionalResultType.SafetyFactor); + job.RegionalResultType = (job.CurrentSpecification.FailureMechanismParametersMStab.MStabParameters.IsProbabilistic ? RegionalResultType.ProbabilityOfFailure : RegionalResultType.SafetyFactor); } job.SafetyFactor = double.NaN; job.ProbabilityOfFailure = double.NaN; @@ -506,26 +507,30 @@ } } - private List CreateKernelWrapperforJob(IKernelWrapper kernelWrapper, FailureMechanismSystemType failureMechanismType, ScenarioType scenarioType, - Location location, SoilGeometryProbability soilGeometryProbability, out IKernelDataInput kernelDataInput, - out IKernelDataOutput kernelDataOutput, out DamKernelInput damKernelInput) + private void CreateKernelWrapperforJob(IKernelWrapper kernelWrapper, RegionalScenarioProfileResult job) { // Todo Bka: eliminate damProjectData usages. - var calculationMessages = new List(); + job.CalculationMessages = new List(); // Prepare input - damKernelInput = new DamKernelInput(); + job.DamKernelInput = new DamKernelInput(); var projectPath = damProjectData.ProjectPath != "" ? damProjectData.ProjectPath : Directory.GetCurrentDirectory(); + var damKernelInput = job.DamKernelInput as DamKernelInput; damKernelInput.ProjectDir = projectPath; damKernelInput.CalculationDir = Path.Combine(projectPath, damProjectData.CalculationMap); - damKernelInput.Location = location; - damKernelInput.SubSoilScenario = soilGeometryProbability; + damKernelInput.Location = job.Location; + damKernelInput.SubSoilScenario = job.SoilGeometryProbability; damKernelInput.DamFailureMechanismeCalculationSpecification = damProjectData.DamProjectCalculationSpecification.CurrentSpecification; - damKernelInput.RiverLevelHigh = damKernelInput.Location.BoezemLevelHbp; - damKernelInput.RiverLevelLow = damKernelInput.Location.BoezemLevelLbp; - damKernelInput.FilenamePrefix = string.Format("Loc({0})_Sce({1})", location.Name, scenarioType); - damKernelInput.SubSoilScenario.SegmentFailureMechanismType = failureMechanismType; - PrepareResult prepareResult = kernelWrapper.Prepare(damKernelInput, 0, out kernelDataInput, out kernelDataOutput); + damKernelInput.DamFailureMechanismeCalculationSpecification.FailureMechanismSystemType = job.FailureMechanismType; + damKernelInput.RiverLevelHigh = job.Location.BoezemLevelHbp; + damKernelInput.RiverLevelLow = job.Location.BoezemLevelLbp; + damKernelInput.FilenamePrefix = string.Format("Loc({0})_Sce({1})", job.Location.Name, job.ScenarioType); + damKernelInput.SubSoilScenario.SegmentFailureMechanismType = job.FailureMechanismType; + IKernelDataInput kernelDataInput; + IKernelDataOutput kernelDataOutput; + PrepareResult prepareResult = kernelWrapper.Prepare(damKernelInput, 0, out kernelDataInput, out kernelDataOutput); + job.KernelDataInput = kernelDataInput; + job.KernelDataOutput = kernelDataOutput; // Sometimes the kernelDataInput is not created (p.e when soilprofileprobablility is meant for // stability where Piping calc is wanted). In that case, do nothing but just skip. if (prepareResult == PrepareResult.Successful) @@ -540,33 +545,14 @@ } if (prepareResult == PrepareResult.Failed) { - calculationMessages.Add(new LogMessage(LogMessageType.Error, null, - string.Format(Resources.DesignCalculatorPrepareError, location.Name, - soilGeometryProbability.ToString(), ""))); // TODO #The correct regional scenario ID? + job.CalculationMessages.Add(new LogMessage(LogMessageType.Error, null, + string.Format(Resources.DesignCalculatorPrepareError, job.Location.Name, + job.SoilGeometryProbability, ""))); // TODO #The correct regional scenario ID? } - } - return calculationMessages; + } } /// - /// Log messages - /// - /// - private void SendStabilityMessage(LogMessage logMessage) - { - lock (runningJobs) - { - if (logMessage.Subject != null) - { - var job = (RegionalScenarioProfileResult)runningJobs[(ICalculation)logMessage.Subject]; - logMessage.Subject = job.Location; - } - } - - SendMessage(logMessage); - } - - /// /// Fill the results for the scenarios /// private void FillResults(List tasks) @@ -635,8 +621,9 @@ CalculationResult = CalculationResult.RunFailed, SafetyFactor = double.NaN }; + evaluationJob.Results.Add(scenariosResult); SendMessage(new LogMessage(LogMessageType.Warning, location, - String.Format("Error in location {0}: {1}", location.Name, e.Message))); + string.Format("Error in location {0}: {1}", location.Name, e.Message))); } } Index: DamEngine/trunk/src/Deltares.DamEngine.Data/RegionalAssessmentResults/RegionalScenarioProfileResult.cs =================================================================== diff -u -r1065 -r1372 --- DamEngine/trunk/src/Deltares.DamEngine.Data/RegionalAssessmentResults/RegionalScenarioProfileResult.cs (.../RegionalScenarioProfileResult.cs) (revision 1065) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/RegionalAssessmentResults/RegionalScenarioProfileResult.cs (.../RegionalScenarioProfileResult.cs) (revision 1372) @@ -19,7 +19,11 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System; +using System.Collections.Generic; using Deltares.DamEngine.Data.General; +using Deltares.DamEngine.Data.General.Results; +using Deltares.DamEngine.Data.Standard.Logging; namespace Deltares.DamEngine.Data.RegionalAssessmentResults { @@ -230,5 +234,54 @@ return soilGeometryProbability.Probability; } } + + /// + /// Gets or sets the current specification. + /// + /// + /// The current specification. + /// + public DamFailureMechanismeCalculationSpecification CurrentSpecification { get; set; } + + /// + /// Gets or sets the calculation messages. + /// + /// + /// The calculation messages. + /// + public List CalculationMessages { get; set;} + + /// + /// Gets or sets the kernel data input. + /// + /// + /// The kernel data input. + /// + public Object KernelDataInput { get; set; } + + /// + /// Gets or sets the kernel data output. + /// + /// + /// The kernel data output. + /// + public Object KernelDataOutput { get; set; } + + /// + /// Gets or sets the dam kernel input. + /// + /// + /// The dam kernel input. + /// + public Object DamKernelInput { get; set; } + + /// + /// Gets or sets the results. + /// + /// + /// The results. + /// + public List Results { get; set; } + } }