//-----------------------------------------------------------------------
//
// 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;
}
}
}