Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/GrassCoverErosionInwardsCalculationService.cs =================================================================== diff -u -r7371a70ed0751d341d41a7b951b780d286f83791 -rf8c28b3b04cdabb62ea37772efcb1f4ebbbf2b9e --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/GrassCoverErosionInwardsCalculationService.cs (.../GrassCoverErosionInwardsCalculationService.cs) (revision 7371a70ed0751d341d41a7b951b780d286f83791) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/GrassCoverErosionInwardsCalculationService.cs (.../GrassCoverErosionInwardsCalculationService.cs) (revision f8c28b3b04cdabb62ea37772efcb1f4ebbbf2b9e) @@ -160,15 +160,21 @@ throw new ArgumentNullException(nameof(generalInput)); } - int numberOfCalculators = CreateCalculators(calculation, Path.GetDirectoryName(hydraulicBoundaryDatabaseFilePath)); + string effectivePreprocessorDirectory = assessmentSection.HydraulicBoundaryDatabase.EffectivePreprocessorDirectory(); + bool usePreprocessor = !string.IsNullOrEmpty(effectivePreprocessorDirectory); + int numberOfCalculators = CreateCalculators(calculation, + Path.GetDirectoryName(hydraulicBoundaryDatabaseFilePath), + effectivePreprocessorDirectory); + CalculationServiceHelper.LogCalculationBegin(); try { OvertoppingOutput overtoppingOutput = CalculateOvertopping(calculation, generalInput, hydraulicBoundaryDatabaseFilePath, + usePreprocessor, assessmentSection.FailureMechanismContribution.Norm, failureMechanismContribution, numberOfCalculators); @@ -183,6 +189,7 @@ generalInput, failureMechanismContribution, hydraulicBoundaryDatabaseFilePath, + usePreprocessor, numberOfCalculators); if (canceled) { @@ -194,6 +201,7 @@ generalInput, failureMechanismContribution, hydraulicBoundaryDatabaseFilePath, + usePreprocessor, numberOfCalculators); if (canceled) @@ -216,21 +224,21 @@ } } - private int CreateCalculators(GrassCoverErosionInwardsCalculation calculation, string hlcdDirectory) + private int CreateCalculators(GrassCoverErosionInwardsCalculation calculation, string hlcdDirectory, string preprocessorDirectory) { var numberOfCalculators = 1; - overtoppingCalculator = HydraRingCalculatorFactory.Instance.CreateOvertoppingCalculator(hlcdDirectory); + overtoppingCalculator = HydraRingCalculatorFactory.Instance.CreateOvertoppingCalculator(hlcdDirectory, preprocessorDirectory); if (calculation.InputParameters.DikeHeightCalculationType != DikeHeightCalculationType.NoCalculation) { - dikeHeightCalculator = HydraRingCalculatorFactory.Instance.CreateDikeHeightCalculator(hlcdDirectory); + dikeHeightCalculator = HydraRingCalculatorFactory.Instance.CreateDikeHeightCalculator(hlcdDirectory, preprocessorDirectory); numberOfCalculators++; } if (calculation.InputParameters.OvertoppingRateCalculationType != OvertoppingRateCalculationType.NoCalculation) { - overtoppingRateCalculator = HydraRingCalculatorFactory.Instance.CreateOvertoppingRateCalculator(hlcdDirectory); + overtoppingRateCalculator = HydraRingCalculatorFactory.Instance.CreateOvertoppingRateCalculator(hlcdDirectory, preprocessorDirectory); numberOfCalculators++; } @@ -243,6 +251,7 @@ /// The calculation containing the input for the overtopping calculation. /// The general grass cover erosion inwards calculation input parameters. /// The path which points to the hydraulic boundary database file. + /// Indicator whether to use the preprocessor in the calculation. /// The norm which has been defined on the assessment section. /// The amount of contribution for this failure mechanism in the assessment section /// The total number of calculations to perform. @@ -251,6 +260,7 @@ private OvertoppingOutput CalculateOvertopping(GrassCoverErosionInwardsCalculation calculation, GeneralGrassCoverErosionInwardsInput generalInput, string hydraulicBoundaryDatabaseFilePath, + bool usePreprocessor, double norm, double failureMechanismContribution, int numberOfCalculators) @@ -259,7 +269,10 @@ Resources.GrassCoverErosionInwardsCalculationService_Overtopping), 1, numberOfCalculators); - OvertoppingCalculationInput overtoppingCalculationInput = CreateOvertoppingInput(calculation, generalInput, hydraulicBoundaryDatabaseFilePath); + OvertoppingCalculationInput overtoppingCalculationInput = CreateOvertoppingInput(calculation, + generalInput, + hydraulicBoundaryDatabaseFilePath, + usePreprocessor); PerformCalculation(() => overtoppingCalculator.Calculate(overtoppingCalculationInput), () => overtoppingCalculator.LastErrorFileContent, @@ -298,6 +311,7 @@ GeneralGrassCoverErosionInwardsInput generalInput, double failureMechanismContribution, string hydraulicBoundaryDatabaseFilePath, + bool usePreprocessor, int numberOfCalculators) { if (dikeHeightCalculator == null) @@ -318,7 +332,8 @@ DikeHeightCalculationInput dikeHeightCalculationInput = CreateDikeHeightInput(calculation, norm, generalInput, - hydraulicBoundaryDatabaseFilePath); + hydraulicBoundaryDatabaseFilePath, + usePreprocessor); var dikeHeightCalculated = true; @@ -353,6 +368,7 @@ GeneralGrassCoverErosionInwardsInput generalInput, double failureMechanismContribution, string hydraulicBoundaryDatabaseFilePath, + bool usePreprocessor, int numberOfCalculators) { if (overtoppingRateCalculator == null) @@ -373,7 +389,8 @@ OvertoppingRateCalculationInput overtoppingRateCalculationInput = CreateOvertoppingRateInput(calculation, norm, generalInput, - hydraulicBoundaryDatabaseFilePath); + hydraulicBoundaryDatabaseFilePath, + usePreprocessor); var overtoppingRateCalculated = true; @@ -480,6 +497,7 @@ /// The calculation containing the input for the overtopping calculation. /// The general grass cover erosion inwards calculation input parameters. /// The path which points to the hydraulic boundary database file. + /// Indicator whether to use the preprocessor in the calculation. /// A new instance. /// Thrown when the /// contains invalid characters. @@ -493,7 +511,8 @@ /// private static OvertoppingCalculationInput CreateOvertoppingInput(GrassCoverErosionInwardsCalculation calculation, GeneralGrassCoverErosionInwardsInput generalInput, - string hydraulicBoundaryDatabaseFilePath) + string hydraulicBoundaryDatabaseFilePath, + bool usePreprocessor) { var overtoppingCalculationInput = new OvertoppingCalculationInput(calculation.InputParameters.HydraulicBoundaryLocation.Id, calculation.InputParameters.Orientation, @@ -522,7 +541,7 @@ generalInput.FshallowModelFactor.LowerBoundary, generalInput.FshallowModelFactor.UpperBoundary); - HydraRingSettingsDatabaseHelper.AssignSettingsFromDatabase(overtoppingCalculationInput, hydraulicBoundaryDatabaseFilePath); + HydraRingSettingsDatabaseHelper.AssignSettingsFromDatabase(overtoppingCalculationInput, hydraulicBoundaryDatabaseFilePath, usePreprocessor); return overtoppingCalculationInput; } @@ -534,6 +553,7 @@ /// The norm to use in the calculation. /// The general grass cover erosion inwards calculation input parameters. /// The path which points to the hydraulic boundary database file. + /// Indicator whether to use the preprocessor in the calculation. /// A new instance. /// Thrown when the /// contains invalid characters. @@ -548,7 +568,8 @@ private static DikeHeightCalculationInput CreateDikeHeightInput(GrassCoverErosionInwardsCalculation calculation, double norm, GeneralGrassCoverErosionInwardsInput generalInput, - string hydraulicBoundaryDatabaseFilePath) + string hydraulicBoundaryDatabaseFilePath, + bool usePreprocessor) { var dikeHeightCalculationInput = new DikeHeightCalculationInput(calculation.InputParameters.HydraulicBoundaryLocation.Id, norm, @@ -577,7 +598,7 @@ generalInput.FshallowModelFactor.LowerBoundary, generalInput.FshallowModelFactor.UpperBoundary); - HydraRingSettingsDatabaseHelper.AssignSettingsFromDatabase(dikeHeightCalculationInput, hydraulicBoundaryDatabaseFilePath); + HydraRingSettingsDatabaseHelper.AssignSettingsFromDatabase(dikeHeightCalculationInput, hydraulicBoundaryDatabaseFilePath, usePreprocessor); return dikeHeightCalculationInput; } @@ -589,6 +610,7 @@ /// The norm to use in the calculation. /// The general grass cover erosion inwards calculation input parameters. /// The path which points to the hydraulic boundary database file. + /// Indicator whether to use the preprocessor in the calculation. /// A new instance. /// Thrown when the /// contains invalid characters. @@ -603,7 +625,8 @@ private static OvertoppingRateCalculationInput CreateOvertoppingRateInput(GrassCoverErosionInwardsCalculation calculation, double norm, GeneralGrassCoverErosionInwardsInput generalInput, - string hydraulicBoundaryDatabaseFilePath) + string hydraulicBoundaryDatabaseFilePath, + bool usePreprocessor) { var overtoppingRateCalculationInput = new OvertoppingRateCalculationInput(calculation.InputParameters.HydraulicBoundaryLocation.Id, norm, @@ -631,7 +654,7 @@ generalInput.FshallowModelFactor.LowerBoundary, generalInput.FshallowModelFactor.UpperBoundary); - HydraRingSettingsDatabaseHelper.AssignSettingsFromDatabase(overtoppingRateCalculationInput, hydraulicBoundaryDatabaseFilePath); + HydraRingSettingsDatabaseHelper.AssignSettingsFromDatabase(overtoppingRateCalculationInput, hydraulicBoundaryDatabaseFilePath, usePreprocessor); return overtoppingRateCalculationInput; } @@ -747,33 +770,43 @@ private static string[] ValidateInput(GrassCoverErosionInwardsInput inputParameters, IAssessmentSection assessmentSection) { - var validationResult = new List(); + var validationResults = new List(); - string validationProblem = HydraulicDatabaseHelper.ValidatePathForCalculation(assessmentSection.HydraulicBoundaryDatabase.FilePath); - if (!string.IsNullOrEmpty(validationProblem)) + string databaseFilePathValidationProblem = HydraulicBoundaryDatabaseHelper.ValidatePathForCalculation(assessmentSection.HydraulicBoundaryDatabase.FilePath); + if (!string.IsNullOrEmpty(databaseFilePathValidationProblem)) { - validationResult.Add(validationProblem); - return validationResult.ToArray(); + validationResults.Add(databaseFilePathValidationProblem); } + string preprocessorDirectoryValidationProblem = HydraulicBoundaryDatabaseHelper.ValidatePreprocessorDirectory(assessmentSection.HydraulicBoundaryDatabase.EffectivePreprocessorDirectory()); + if (!string.IsNullOrEmpty(preprocessorDirectoryValidationProblem)) + { + validationResults.Add(preprocessorDirectoryValidationProblem); + } + + if (validationResults.Any()) + { + return validationResults.ToArray(); + } + if (inputParameters.HydraulicBoundaryLocation == null) { - validationResult.Add(RingtoetsCommonServiceResources.CalculationService_ValidateInput_No_hydraulic_boundary_location_selected); + validationResults.Add(RingtoetsCommonServiceResources.CalculationService_ValidateInput_No_hydraulic_boundary_location_selected); } if (inputParameters.DikeProfile == null) { - validationResult.Add(RingtoetsCommonServiceResources.CalculationService_ValidateInput_No_dike_profile_selected); + validationResults.Add(RingtoetsCommonServiceResources.CalculationService_ValidateInput_No_dike_profile_selected); } else { - validationResult.AddRange(new NumericInputRule(inputParameters.Orientation, ParameterNameExtractor.GetFromDisplayName(RingtoetsCommonForms.Orientation_DisplayName)).Validate()); - validationResult.AddRange(new NumericInputRule(inputParameters.DikeHeight, ParameterNameExtractor.GetFromDisplayName(RingtoetsCommonForms.DikeHeight_DisplayName)).Validate()); + validationResults.AddRange(new NumericInputRule(inputParameters.Orientation, ParameterNameExtractor.GetFromDisplayName(RingtoetsCommonForms.Orientation_DisplayName)).Validate()); + validationResults.AddRange(new NumericInputRule(inputParameters.DikeHeight, ParameterNameExtractor.GetFromDisplayName(RingtoetsCommonForms.DikeHeight_DisplayName)).Validate()); } - validationResult.AddRange(new UseBreakWaterRule(inputParameters).Validate()); + validationResults.AddRange(new UseBreakWaterRule(inputParameters).Validate()); - return validationResult.ToArray(); + return validationResults.ToArray(); } private static GeneralResult ConvertIllustrationPointsResult(HydraRingGeneralResult result, string errorMessage)