//----------------------------------------------------------------------- // // Copyright (c) 2010 Deltares. All rights reserved. // // B.S.T.I.M. The // tom.the@deltares.nl // 17-11-2010 // Perform piping calculations for a time serie of waterlevels //----------------------------------------------------------------------- namespace Deltares.Dam.Data { using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using Deltares.Piping.Data; using System.Text.RegularExpressions; public class TimeSeriePipingCalculatorException : ApplicationException { public TimeSeriePipingCalculatorException(string message) : base(message) { } } public class TimeSeriePipingCalculator { public string PipingWorkingPath { get; set; } /// /// Create time serie with results for Pipingfactor Bligh /// /// /// /// public TimeSerie CreatePipingFactorBlighTimeSerie(TimeSerie source, Location location) { string serieName = TimeSerieParameters.PipingFactorBligh.ToString(); TimeSerie serie = TimeSerie.CreateTimeSerie(source, serieName); int timeSerieEntryCounter = 0; foreach (var sourceEntry in source.Entries) { TimeSerieEntry entry = sourceEntry.GetShallowCopy(); var calculator = new PipingCalculatorBligh(location.CreateModelParametersForPLLines(), location.ModelFactors.RequiredSafetyFactorPiping.Value, location.GaugePLLines, location.Gauges, location.ModelFactors.UpliftCriterionPiping.Value); try { string calculationName = String.Format("Calc(Bligh)_Loc({0})_Pro({1})_TS({2})", location.Name, location.GetMostProbableProfile(FailureMechanismSystemType.Piping).Name, timeSerieEntryCounter); calculationName = Regex.Replace(calculationName, @"[\\\/:\*\?""'<>|.]", "_"); calculator.FilenameCalculation = PipingWorkingPath + calculationName; entry.Value = sourceEntry.Value != source.MissVal ? calculator.CalculatePipingFactor( location, location.LocalXZSurfaceLine2, location.GetMostProbableProfile(FailureMechanismSystemType.Piping), sourceEntry.Value).Value : source.MissVal; } catch { entry.Value = source.MissVal; // TODO: Need some error handling for scenarios where the soil profile only had one sand layer } serie.Entries.Add(entry); timeSerieEntryCounter++; } return serie; } /// /// Create time serie with results for Pipingfactor Piping Sellmeijer /// /// /// /// public TimeSerie CreatePipingFactorSellmeijerTimeSerie(TimeSerie source, Location location) { string serieName = TimeSerieParameters.PipingFactorSellmeijer.ToString(); TimeSerie serie = TimeSerie.CreateTimeSerie(source, serieName); int timeSerieEntryCounter = 0; foreach (TimeSerieEntry sourceEntry in source.Entries) { TimeSerieEntry entry = sourceEntry.GetShallowCopy(); var calculator = new PipingCalculatorSellmeijer(location.CreateModelParametersForPLLines(), location.ModelFactors.RequiredSafetyFactorPiping.Value, location.GaugePLLines, location.Gauges, null, location.ModelFactors.UpliftCriterionPiping.Value); try { string calculationName = String.Format("Calc(Sellmeijer)_Loc({0})_Pro({1})_TS({2})", location.Name, location.GetMostProbableProfile(FailureMechanismSystemType.Piping).Name, timeSerieEntryCounter); calculationName = Regex.Replace(calculationName, @"[\\\/:\*\?""'<>|.]", "_"); calculator.FilenameCalculation = PipingWorkingPath + calculationName; entry.Value = sourceEntry.Value != source.MissVal ? calculator.CalculatePipingFactor( location, location.LocalXZSurfaceLine2, location.GetMostProbableProfile(FailureMechanismSystemType.Piping), sourceEntry.Value).Value : source.MissVal; } catch { entry.Value = source.MissVal; } serie.Entries.Add(entry); timeSerieEntryCounter++; } return serie; } /// /// Create time serie with results for Probability of Failure Piping Sellmeijer /// /// /// /// public TimeSerie CreateProbabilityOfFailurePipingSellmeijerTimeSerie(TimeSerie source, Location location) { string serieName = TimeSerieParameters.ProbabilityOfFailurePipingSellmeijer.ToString(); TimeSerie serie = TimeSerie.CreateTimeSerie(source, serieName); int timeSerieEntryCounter = 0; foreach (TimeSerieEntry sourceEntry in source.Entries) { TimeSerieEntry entry = sourceEntry.GetShallowCopy(); var calculator = new PipingCalculatorSellmeijer(location.CreateModelParametersForPLLines(), location.ModelFactors.RequiredSafetyFactorPiping.Value, location.GaugePLLines, location.Gauges, new PipingProbabilisticParameters(location.LayerHeightDistribution, location.LayerHeightDeviation), location.ModelFactors.UpliftCriterionPiping.Value); try { string calculationName = String.Format("Calc(ProbSellmeijer)_Loc({0})_Pro({1})_TS({2})", location.Name, location.GetMostProbableProfile(FailureMechanismSystemType.Piping).Name, timeSerieEntryCounter); calculationName = Regex.Replace(calculationName, @"[\\\/:\*\?""'<>|.]", "_"); calculator.FilenameCalculation = PipingWorkingPath + calculationName; ProbabilisticStruct waterLevelProbabilistic = new ProbabilisticStruct( sourceEntry.StochastValue.Mean, sourceEntry.StochastValue.StandardDeviation, sourceEntry.StochastValue.Distribution, true); entry.Value = sourceEntry.Value != source.MissVal ? calculator.CalculatePipingFailureProbability( location, location.LocalXZSurfaceLine2, location.GetMostProbableProfile(FailureMechanismSystemType.Piping), waterLevelProbabilistic).Value : source.MissVal; } catch { entry.Value = source.MissVal; } serie.Entries.Add(entry); timeSerieEntryCounter++; } return serie; } } }