Index: Ringtoets/StabilityPointStructures/src/Ringtoets.StabilityPointStructures.Service/StabilityPointStructuresCalculationService.cs =================================================================== diff -u -rd79d26d2ad423b4287d5cdaeb0ac267089a54bf9 -r276a32161f29fcba4af79cf7c7f0aeb254d4db54 --- Ringtoets/StabilityPointStructures/src/Ringtoets.StabilityPointStructures.Service/StabilityPointStructuresCalculationService.cs (.../StabilityPointStructuresCalculationService.cs) (revision d79d26d2ad423b4287d5cdaeb0ac267089a54bf9) +++ Ringtoets/StabilityPointStructures/src/Ringtoets.StabilityPointStructures.Service/StabilityPointStructuresCalculationService.cs (.../StabilityPointStructuresCalculationService.cs) (revision 276a32161f29fcba4af79cf7c7f0aeb254d4db54) @@ -19,14 +19,25 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System; using System.Collections.Generic; +using System.ComponentModel; +using System.IO; using System.Linq; +using log4net; using Ringtoets.Common.Data.AssessmentSection; +using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Common.Data.Structures; using Ringtoets.Common.Service; -using Ringtoets.Common.Service.Properties; +using Ringtoets.Common.Utils; +using Ringtoets.HydraRing.Calculation.Calculator; +using Ringtoets.HydraRing.Calculation.Calculator.Factory; +using Ringtoets.HydraRing.Calculation.Data; +using Ringtoets.HydraRing.Calculation.Data.Input.Structures; +using Ringtoets.HydraRing.Calculation.Parsers; using Ringtoets.HydraRing.IO; using Ringtoets.StabilityPointStructures.Data; +using Ringtoets.StabilityPointStructures.Service.Properties; using RingtoetsCommonServiceResources = Ringtoets.Common.Service.Properties.Resources; namespace Ringtoets.StabilityPointStructures.Service @@ -36,6 +47,11 @@ /// public class StabilityPointStructuresCalculationService { + private static readonly ILog log = LogManager.GetLogger(typeof(StabilityPointStructuresCalculationService)); + + private bool canceled; + private IStructuresStabilityPointCalculator calculator; + /// /// Performs validation over the values on the given . Error and status information is logged during /// the execution of the operation. @@ -47,12 +63,223 @@ { CalculationServiceHelper.LogValidationBeginTime(calculation.Name); var messages = ValidateInput(calculation.InputParameters, assessmentSection); - CalculationServiceHelper.LogMessagesAsError(Resources.Error_in_validation_0, messages); + CalculationServiceHelper.LogMessagesAsError(RingtoetsCommonServiceResources.Error_in_validation_0, messages); CalculationServiceHelper.LogValidationEndTime(calculation.Name); return !messages.Any(); } + /// + /// Performs a stability point structures calculation based on the supplied and sets + /// if the calculation was successful. Error and status information is + /// logged during the execution of the operation. + /// + /// The that holds all the information required to perform the calculation. + /// The that holds information about the norm used in the calculation. + /// The that holds the information about the contribution + /// and the general inputs used in the calculation. + /// The filepath of the HLCD file that should be used for performing the calculation. + /// Thrown when: + /// + /// is an invalid . + /// is an invalid . + /// + /// + public void Calculate(StructuresCalculation calculation, + IAssessmentSection assessmentSection, + StabilityPointStructuresFailureMechanism failureMechanism, + string hlcdFilePath) + { + var calculationName = calculation.Name; + + FailureMechanismSection failureMechanismSection = StructuresHelper.FailureMechanismSectionForCalculation(failureMechanism.Sections, + calculation); + + StructuresStabilityPointCalculationInput input = CreateStructuresStabilityPointCalculationInput(calculation, + failureMechanism, + failureMechanismSection); + + string hlcdDirectory = Path.GetDirectoryName(hlcdFilePath); + calculator = HydraRingCalculatorFactory.Instance.CreateStructuresStabilityPointCalculator(hlcdDirectory, assessmentSection.Id); + + CalculationServiceHelper.LogCalculationBeginTime(calculationName); + + try + { + calculator.Calculate(input); + + if (!canceled) + { + calculation.Output = ProbabilityAssessmentService.Calculate(assessmentSection.FailureMechanismContribution.Norm, + failureMechanism.Contribution, + failureMechanism.GeneralInput.N, + calculator.ExceedanceProbabilityBeta); + } + } + catch (HydraRingFileParserException) + { + if (!canceled) + { + log.ErrorFormat(Resources.StabilityPointStructuresCalculationService_Calculate_Error_in_stabilityPoint_structures_0_calculation, calculationName); + throw; + } + } + finally + { + log.InfoFormat(Resources.StabilityPointStructuresCalculationService_Calculate_Calculation_report_Click_details_for_full_report_0, calculator.OutputFileContent); + CalculationServiceHelper.LogCalculationEndTime(calculationName); + } + } + + /// + /// Cancels any ongoing structures stability point calculation. + /// + public void Cancel() + { + if (calculator != null) + { + calculator.Cancel(); + } + + canceled = true; + } + + private StructuresStabilityPointCalculationInput CreateStructuresStabilityPointCalculationInput(StructuresCalculation calculation, + StabilityPointStructuresFailureMechanism failureMechanism, + FailureMechanismSection failureMechanismSection) + { + StructuresStabilityPointCalculationInput input; + switch (calculation.InputParameters.InflowModelType) + { + case StabilityPointStructureInflowModelType.LowSill: + switch (calculation.InputParameters.LoadSchematizationType) + { + case LoadSchematizationType.Linear: + input = CreateLowSillLinearCalculationInput(calculation, failureMechanismSection, failureMechanism.GeneralInput); + break; + case LoadSchematizationType.Quadratic: + input = CreateLowSillQuadraticCalculationInput(calculation, failureMechanismSection, failureMechanism.GeneralInput); + break; + default: + throw new InvalidEnumArgumentException("calculation", + (int) calculation.InputParameters.LoadSchematizationType, + typeof(LoadSchematizationType)); + } + break; + case StabilityPointStructureInflowModelType.FloodedCulvert: + switch (calculation.InputParameters.LoadSchematizationType) + { + case LoadSchematizationType.Linear: + input = CreateFloodedCulvertLinearCalculationInput(calculation, failureMechanismSection, failureMechanism.GeneralInput); + break; + case LoadSchematizationType.Quadratic: + input = CreateFloodedCulvertQuadraticCalculationInput(calculation, failureMechanismSection, failureMechanism.GeneralInput); + break; + default: + throw new InvalidEnumArgumentException("calculation", + (int) calculation.InputParameters.LoadSchematizationType, + typeof(LoadSchematizationType)); + } + break; + default: + throw new InvalidEnumArgumentException("calculation", + (int) calculation.InputParameters.InflowModelType, + typeof(StabilityPointStructureInflowModelType)); + } + + return input; + } + + private StructuresStabilityPointLowSillLinearCalculationInput CreateLowSillLinearCalculationInput(StructuresCalculation calculation, + FailureMechanismSection failureMechanismSection, + GeneralStabilityPointStructuresInput generalInput) + { + return new StructuresStabilityPointLowSillLinearCalculationInput(calculation.InputParameters.HydraulicBoundaryLocation.Id, + new HydraRingSection(1, failureMechanismSection.GetSectionLength(), calculation.InputParameters.StructureNormalOrientation), + HydraRingInputParser.ParseForeshore(calculation.InputParameters), + HydraRingInputParser.ParseBreakWater(calculation.InputParameters), + calculation.InputParameters.VolumicWeightWater, + generalInput.GravitationalAcceleration, + calculation.InputParameters.LevelCrestStructure.Mean, + calculation.InputParameters.LevelCrestStructure.StandardDeviation, + calculation.InputParameters.StructureNormalOrientation, + calculation.InputParameters.FactorStormDurationOpenStructure, + calculation.InputParameters.ModelFactorSuperCriticalFlow.Mean, + calculation.InputParameters.ModelFactorSuperCriticalFlow.StandardDeviation, + calculation.InputParameters.ThresholdHeightOpenWeir.Mean, + calculation.InputParameters.ThresholdHeightOpenWeir.StandardDeviation, + calculation.InputParameters.InsideWaterLevelFailureConstruction.Mean, + calculation.InputParameters.InsideWaterLevelFailureConstruction.StandardDeviation, + calculation.InputParameters.FailureProbabilityRepairClosure, + calculation.InputParameters.FailureCollisionEnergy.Mean, + calculation.InputParameters.FailureCollisionEnergy.CoefficientOfVariation, + generalInput.ModelFactorCollisionLoad.Mean, + generalInput.ModelFactorCollisionLoad.CoefficientOfVariation, + calculation.InputParameters.ShipMass.Mean, + calculation.InputParameters.ShipMass.CoefficientOfVariation, + calculation.InputParameters.ShipVelocity.Mean, + calculation.InputParameters.ShipVelocity.CoefficientOfVariation, + calculation.InputParameters.LevellingCount, + calculation.InputParameters.ProbabilityCollisionSecondaryStructure, + calculation.InputParameters.FlowVelocityStructureClosable.Mean, + calculation.InputParameters.FlowVelocityStructureClosable.StandardDeviation, + calculation.InputParameters.InsideWaterLevel.Mean, + calculation.InputParameters.InsideWaterLevel.StandardDeviation, + calculation.InputParameters.AllowedLevelIncreaseStorage.Mean, + calculation.InputParameters.AllowedLevelIncreaseStorage.StandardDeviation, + generalInput.ModelFactorStorageVolume.Mean, + generalInput.ModelFactorStorageVolume.StandardDeviation, + calculation.InputParameters.StorageStructureArea.Mean, + calculation.InputParameters.StorageStructureArea.CoefficientOfVariation, + generalInput.ModelFactorInflowVolume, + calculation.InputParameters.FlowWidthAtBottomProtection.Mean, + calculation.InputParameters.FlowWidthAtBottomProtection.StandardDeviation, + calculation.InputParameters.CriticalOvertoppingDischarge.Mean, + calculation.InputParameters.CriticalOvertoppingDischarge.CoefficientOfVariation, + calculation.InputParameters.FailureProbabilityStructureWithErosion, + calculation.InputParameters.StormDuration.Mean, + calculation.InputParameters.StormDuration.CoefficientOfVariation, + calculation.InputParameters.BankWidth.Mean, + calculation.InputParameters.BankWidth.StandardDeviation, + calculation.InputParameters.EvaluationLevel, + generalInput.ModelFactorLoadEffect.Mean, + generalInput.ModelFactorLoadEffect.StandardDeviation, + generalInput.WaveRatioMaxHN, + generalInput.WaveRatioMaxHStandardDeviation, + calculation.InputParameters.VerticalDistance, + generalInput.ModificationFactorWavesSlowlyVaryingPressureComponent, + generalInput.ModificationFactorDynamicOrImpulsivePressureComponent, + calculation.InputParameters.ModelFactorSuperCriticalFlow.Mean, + calculation.InputParameters.ModelFactorSuperCriticalFlow.StandardDeviation, + calculation.InputParameters.ConstructiveStrengthLinearLoadModel.Mean, + calculation.InputParameters.ConstructiveStrengthLinearLoadModel.CoefficientOfVariation, + calculation.InputParameters.StabilityLinearLoadModel.Mean, + calculation.InputParameters.StabilityLinearLoadModel.CoefficientOfVariation, + calculation.InputParameters.WidthFlowApertures.Mean, + calculation.InputParameters.WidthFlowApertures.CoefficientOfVariation); + } + + private StructuresStabilityPointLowSillQuadraticCalculationInput CreateLowSillQuadraticCalculationInput(StructuresCalculation calculation, + FailureMechanismSection failureMechanismSection, + GeneralStabilityPointStructuresInput generalInput) + { + throw new NotImplementedException(); + } + + private StructuresStabilityPointFloodedCulvertLinearCalculationInput CreateFloodedCulvertLinearCalculationInput(StructuresCalculation calculation, + FailureMechanismSection failureMechanismSection, + GeneralStabilityPointStructuresInput generalInput) + { + throw new NotImplementedException(); + } + + private StructuresStabilityPointFloodedCulvertQuadraticCalculationInput CreateFloodedCulvertQuadraticCalculationInput(StructuresCalculation calculation, + FailureMechanismSection failureMechanismSection, + GeneralStabilityPointStructuresInput generalInput) + { + throw new NotImplementedException(); + } + private static string[] ValidateInput(StabilityPointStructuresInput inputParameters, IAssessmentSection assessmentSection) { var validationResults = new List();