//----------------------------------------------------------------------- // // Copyright (c) 2010 Deltares. All rights reserved. // // B.S.T. The // tom.the@deltares.nl // 8-9-2010 // //----------------------------------------------------------------------- namespace Deltares.Piping.Data { using System; using System.Text; using System.IO; using System.Runtime.InteropServices; using System.Globalization; using Deltares.Standard; using Deltares.Standard.Language; using System.Collections.Generic; [StructLayout(LayoutKind.Sequential)] public struct RingDataStruct { public double WaterUnitWeight; //1 public double WaterViscosity; //2 public double ParticleUnitWeight; //3 public double ParticleDiameter; //4 public double Model2Layer1Thickness; //5 public double Model2Layer2Thickness; //6 public double Model2Soil1Permeability; //7 public double Model2Soil2Permeability; //8 public double Model2Soil3Permeability; //9 public double VerticalSeepageLength; //10 public double SeepageLength; //11 public double BeddingAngle; //12 public double WhitesConstant; //13 public double SafetyFactor; //14 public double FluidisationGradient; //15 } ; [StructLayout(LayoutKind.Sequential)] public struct SoilPropertiesStruct { public double ParticleUnitWeight; //1 public double ParticleD70; //2 public double BeddingAngle; //3 public double WhitesConstant; //4 } ; [StructLayout(LayoutKind.Sequential)] public struct WaterPropertiesStruct { public double UnitWeight; public double Viscosity; } ; [StructLayout(LayoutKind.Sequential)] public struct CalculationParametersStruct { public int CalculationType; //1 [MarshalAs(UnmanagedType.I1)] public bool IsAdjustHeadDrop; //2 public double SafetyFactor; //3 public double FluidisationGradient; //4 } [StructLayout(LayoutKind.Sequential)] public struct ProbabilisticStruct { public ProbabilisticStruct(double mean, double standardDeviation, int distribution, bool isUsed) { Mean = mean; StandardDeviation = standardDeviation; Distribution = distribution; IsUsed = isUsed; } public double Mean; // 1 public double StandardDeviation; // 2 public int Distribution; // 3 [MarshalAs(UnmanagedType.I1)] public bool IsUsed; // 4 } [StructLayout(LayoutKind.Sequential)] public struct ProbabilisticSoilPropertiesStruct { public ProbabilisticStruct ProbParticleUnitWeight; public ProbabilisticStruct ProbParticleD70; public ProbabilisticStruct ProbBeddingAngle; public ProbabilisticStruct ProbWhitesConstant; } [StructLayout(LayoutKind.Sequential)] public struct ProbabilisticGeometryPropertiesStruct { public ProbabilisticStruct ProbSeepageLength; public ProbabilisticStruct ProbExternalWaterlevel; public ProbabilisticStruct ProbLayer1Thickness; public ProbabilisticStruct ProbLayer2Thickness; public ProbabilisticStruct ProbSoil1Permeability; public ProbabilisticStruct ProbSoil2Permeability; public ProbabilisticStruct ProbSoil3Permeability; } public class PipingModel2Calculation { private const string sPipingParametersSectionId = "[PipingParameters]"; private const int cTotalParameterCount = 15; private const string sDebugFile = "VNK-Debug.log"; private const int cMaxPath = 256; private PipingModelModel2Data fCurrentCalculationData = null; private string fHomeDir = ""; private string fSessionId = ""; public PipingModel2Calculation() { fCurrentCalculationData = new PipingModelModel2Data(); } public PipingModel2Calculation(ref PipingCommonData aPipingCommonData) { fCurrentCalculationData = new PipingModelModel2Data(ref aPipingCommonData); } // wrap the Model2 data as properties here again (VNK) public PipingCommonData PipingCommonData { set { fCurrentCalculationData.PipingCommonData = value; } get { return fCurrentCalculationData.PipingCommonData; } } public bool IsHeadDropCalculation { set { fCurrentCalculationData.IsHeadDropCalculation = value; } get { return fCurrentCalculationData.IsHeadDropCalculation; } } public double SeepageLength { set { fCurrentCalculationData.SeepageLength = value; } get { return fCurrentCalculationData.SeepageLength; } } public double CrackLength { set { fCurrentCalculationData.CrackLength = value; } get { return fCurrentCalculationData.CrackLength; } } public double ParticleDiameter { set { fCurrentCalculationData.ParticleDiameter = value; } get { return fCurrentCalculationData.ParticleDiameter; } } public double Height1 { set { fCurrentCalculationData.Height1 = value; } get { return fCurrentCalculationData.Height1; } } public double Height2 { set { fCurrentCalculationData.Height2 = value; } get { return fCurrentCalculationData.Height2; } } public double Permeability1 { set { fCurrentCalculationData.Permeability1 = value; } get { return fCurrentCalculationData.Permeability1; } } public double Permeability2 { set { fCurrentCalculationData.Permeability2 = value; } get { return fCurrentCalculationData.Permeability2; } } public double Permeability3 { set { fCurrentCalculationData.Permeability3 = value; } get { return fCurrentCalculationData.Permeability3; } } public double HeadDrop { get { return fCurrentCalculationData.HeadDrop; } set { fCurrentCalculationData.HeadDrop = value; } } public string Messages { get { return fCurrentCalculationData.Messages; } set { fCurrentCalculationData.Messages = value; } } public string HomeDir { get { return fHomeDir; } set { fHomeDir = value; } } public string SessionId { get { return fSessionId; } set { fSessionId = value; } } public ProbabilisticStruct? ProbSeepageLength { get; set; } public ProbabilisticStruct? ProbExternalWaterlevel { get; set; } public ProbabilisticStruct? ProbLayer1Thickness { get; set; } public ProbabilisticStruct? ProbLayer2Thickness { get; set; } public ProbabilisticStruct? ProbSoil1Permeability { get; set; } public ProbabilisticStruct? ProbSoil2Permeability { get; set; } public ProbabilisticStruct? ProbSoil3Permeability { get; set; } public void CalculateHeadDropPCRing() { // clear the debug file flag //PCR_ClearDebugFlag(); // fill the PCRingData struct RingDataStruct ringData = new RingDataStruct(); double headDrop = 0.0; ringData.WaterUnitWeight = fCurrentCalculationData.PipingCommonData.WaterUnitWeight; ringData.WaterViscosity = fCurrentCalculationData.PipingCommonData.WaterViscosity; ringData.SeepageLength = fCurrentCalculationData.SeepageLength; ringData.VerticalSeepageLength = fCurrentCalculationData.CrackLength; ringData.ParticleUnitWeight = fCurrentCalculationData.PipingCommonData.ParticleUnitWeight; ringData.WhitesConstant = fCurrentCalculationData.PipingCommonData.WhitesConstant; ringData.BeddingAngle = fCurrentCalculationData.PipingCommonData.BeddingAngle; ringData.ParticleDiameter = fCurrentCalculationData.ParticleDiameter; ringData.Model2Layer1Thickness = fCurrentCalculationData.Height1; ringData.Model2Layer2Thickness = fCurrentCalculationData.Height2; ringData.Model2Soil1Permeability = fCurrentCalculationData.Permeability1; ringData.Model2Soil2Permeability = fCurrentCalculationData.Permeability2; ringData.Model2Soil3Permeability = fCurrentCalculationData.Permeability3; // set the debug flag PipingCalc2Dll.Model2PCRSetDebugFlag(); StringBuilder LSb = new StringBuilder(cMaxPath); if (fSessionId == "") LSb.Append(fHomeDir + Path.DirectorySeparatorChar + fSessionId); else LSb.Append(fHomeDir + Path.DirectorySeparatorChar + sDebugFile); //LSb.Append('\0'); PipingCalc2Dll.Model2PCRSetDebugFile(LSb.ToString()); // call the calc dll int res; try { if (fCurrentCalculationData.PipingCommonData.IsAdjustHeadDrop) { ringData.SafetyFactor = fCurrentCalculationData.PipingCommonData.SafetyFactor; ringData.FluidisationGradient = fCurrentCalculationData.PipingCommonData.FluidisationGradient; res = PipingCalc2Dll.Model2PCRCalculateHeadDrop /*PCR_CalcHeadDrop*/(ref ringData, cTotalParameterCount, ref headDrop); } else res = PipingCalc2Dll.Model2PCRCalculateHeadDrop(ref ringData, cTotalParameterCount - 2, ref headDrop); } catch { res = 1; } string message = ReadDebugLog(LSb.ToString()); // results if (res == 0) { fCurrentCalculationData.HeadDrop = headDrop; if (message == null) fCurrentCalculationData.Messages = PipingConstants.CMessageGeen; else fCurrentCalculationData.Messages = message; // archive the current set of input data and results PipingModelModel2Data LNewCalculatedData = new PipingModelModel2Data(fCurrentCalculationData); } else { fCurrentCalculationData.HeadDrop = 0.0; if (message == null) fCurrentCalculationData.Messages = PipingConstants.CMessageError; else fCurrentCalculationData.Messages = message; } } public void CalculateHeadDropPC2() { fCurrentCalculationData.Messages = ""; var fCalcHandle = PipingCalc2Dll.Model2PC2CreateHandle(); if (fCalcHandle == IntPtr.Zero) { fCurrentCalculationData.HeadDrop = 0.0; fCurrentCalculationData.Messages = PipingConstants.CMessageError; return; } bool result; try { // soil properties SoilPropertiesStruct soilProperties = new SoilPropertiesStruct(); soilProperties.BeddingAngle = fCurrentCalculationData.PipingCommonData.BeddingAngle; soilProperties.ParticleD70 = fCurrentCalculationData.ParticleDiameter; soilProperties.ParticleUnitWeight = fCurrentCalculationData.PipingCommonData.ParticleUnitWeight; soilProperties.WhitesConstant = fCurrentCalculationData.PipingCommonData.WhitesConstant; PipingCalc2Dll.Model2PC2SetSoilProperties(fCalcHandle, soilProperties); // water properties WaterPropertiesStruct waterProperties = new WaterPropertiesStruct(); waterProperties.UnitWeight = fCurrentCalculationData.PipingCommonData.WaterUnitWeight; waterProperties.Viscosity = fCurrentCalculationData.PipingCommonData.WaterViscosity; PipingCalc2Dll.Model2PC2SetWaterProperties(fCalcHandle, waterProperties); PipingCalc2Dll.Model2PC2SetCrackLength(fCalcHandle, fCurrentCalculationData.CrackLength); PipingCalc2Dll.Model2PC2SetHeadDrop(fCalcHandle, fCurrentCalculationData.HeadDrop); PipingCalc2Dll.Model2PC2SetSeepageLength(fCalcHandle, fCurrentCalculationData.SeepageLength); // heights double[] heightArray = new double[2]; heightArray[0] = fCurrentCalculationData.Height1; heightArray[1] = fCurrentCalculationData.Height2; PipingCalc2Dll.Model2PC2SetHeights(fCalcHandle, heightArray.Length, heightArray); // permeabilities double[] permeabilityArray = new double[3]; permeabilityArray[0] = fCurrentCalculationData.Permeability1; permeabilityArray[1] = fCurrentCalculationData.Permeability2; permeabilityArray[2] = fCurrentCalculationData.Permeability3; PipingCalc2Dll.Model2PC2SetPermeabilities(fCalcHandle, permeabilityArray.Length, permeabilityArray); //calculation parameters CalculationParametersStruct calculationParameters = new CalculationParametersStruct(); if (fCurrentCalculationData.IsHeadDropCalculation == true) calculationParameters.CalculationType = 1; else calculationParameters.CalculationType = 2; calculationParameters.FluidisationGradient = fCurrentCalculationData.PipingCommonData.FluidisationGradient; calculationParameters.IsAdjustHeadDrop = fCurrentCalculationData.PipingCommonData.IsAdjustHeadDrop; // Note: next safety factor only relevant when IsAdjustHeadDrop is true. calculationParameters.SafetyFactor = fCurrentCalculationData.PipingCommonData.SafetyFactor; PipingCalc2Dll.Model2PC2SetCalculationParameters(fCalcHandle, calculationParameters); // calculate result = true; try { //if (fCurrentCalculationData.IsHeadDropCalculation == true) // fCurrentCalculationData.HeadDrop = Double.NaN; //else // fCurrentCalculationData.SeepageLength = Double.NaN; PipingCalc2Dll.Model2PC2Calculate(fCalcHandle); if (fCurrentCalculationData.IsHeadDropCalculation == true) fCurrentCalculationData.HeadDrop = PipingCalc2Dll.Model2PC2GetHeadDrop(fCalcHandle); else fCurrentCalculationData.SeepageLength = PipingCalc2Dll.Model2PC2GetSeepageLength(fCalcHandle); } catch { throw new PipingCalculationException("Error in Piping DLL"); } // results // Following call (Model2PC2GetCalculationMessages) is flawed and could result in a crash (string as return value raises issues with ownership of the memory) // So we comment it out // fCurrentCalculationData.WarningMessage = (PipingCalc2Dll.Model2PC2GetCalculationMessages(fCalcHandle)); //if (fCurrentCalculationData.WarningMessage == "") // fCurrentCalculationData.Messages = LanguageSupport.GetText("CMessageGeen", // System.Threading.Thread.CurrentThread. // CurrentCulture); //else // fCurrentCalculationData.Messages = fCurrentCalculationData.WarningMessage; fCurrentCalculationData.Messages = ""; if (Double.IsNaN(fCurrentCalculationData.HeadDrop) || result == false) fCurrentCalculationData.Messages = LanguageSupport.GetText("CMessageError", System.Threading.Thread.CurrentThread. CurrentCulture); } finally { // cleanup PipingCalc2Dll.Model2PC2DestroyHandle(fCalcHandle); } // archive the current set of input data and results if (Double.IsNaN(fCurrentCalculationData.HeadDrop) == false && result == true) { PipingModelModel2Data LNewCalculatedData = new PipingModelModel2Data(fCurrentCalculationData); } } /// /// Throw helper /// /// public void ThrowIfNotAssigned(Object currentObject, string objectName) { if (currentObject == null) { throw new PipingCalculationException(string.Format("Missing input {0}", objectName)); } } /// /// Check if alll probabilistic input available /// public void ThrowsIfProbabilisticInputInComplete() { ThrowIfNotAssigned(PipingCommonData, "PipingCommonData"); ThrowIfNotAssigned(PipingCommonData.ProbBeddingAngle, "ProbBeddingAngle"); ThrowIfNotAssigned(PipingCommonData.ProbParticleD70, "ProbParticleD70"); ThrowIfNotAssigned(PipingCommonData.ProbParticleUnitWeight, "ProbParticleUnitWeight"); ThrowIfNotAssigned(PipingCommonData.ProbWhitesConstant, "ProbWhitesConstant"); ThrowIfNotAssigned(ProbSeepageLength, "ProbSeepageLength"); ThrowIfNotAssigned(ProbExternalWaterlevel, "ProbExternalWaterlevel"); ThrowIfNotAssigned(ProbLayer1Thickness, "ProbLayer1Thickness"); ThrowIfNotAssigned(ProbLayer2Thickness, "ProbLayer2Thickness"); ThrowIfNotAssigned(ProbSoil1Permeability, "ProbSoil1Permeability"); ThrowIfNotAssigned(ProbSoil2Permeability, "ProbSoil2Permeability"); ThrowIfNotAssigned(ProbSoil3Permeability, "ProbSoil3Permeability"); } /// /// Calculate reliability index /// /// public double CalculateReliabilityIndex() { ThrowsIfProbabilisticInputInComplete(); fCurrentCalculationData.Messages = ""; var fCalcHandle = PipingCalc2Dll.Model2PC2CreateHandle(); if (fCalcHandle == IntPtr.Zero) { fCurrentCalculationData.HeadDrop = 0.0; fCurrentCalculationData.Messages = PipingConstants.CMessageError; throw new PipingCalculationException( "Cannot create calculation handle for MPipingCalc2Dll in CalculateReliabilityIndex()"); } double reliabilityIndex = 0.0; try { // soil properties var probabilisticSoilPropertiesStruct = new ProbabilisticSoilPropertiesStruct(); probabilisticSoilPropertiesStruct.ProbBeddingAngle = PipingCommonData.ProbBeddingAngle.Value; probabilisticSoilPropertiesStruct.ProbParticleD70 = PipingCommonData.ProbParticleD70.Value; probabilisticSoilPropertiesStruct.ProbParticleUnitWeight = PipingCommonData.ProbParticleUnitWeight.Value; probabilisticSoilPropertiesStruct.ProbWhitesConstant = PipingCommonData.ProbWhitesConstant.Value; PipingCalc2Dll.Model2SetProbabilisticSoilProperties(fCalcHandle, probabilisticSoilPropertiesStruct); // geometry properties var probabilisticGeometryPropertiesStruct = new ProbabilisticGeometryPropertiesStruct(); probabilisticGeometryPropertiesStruct.ProbExternalWaterlevel = ProbExternalWaterlevel.Value; probabilisticGeometryPropertiesStruct.ProbLayer1Thickness = ProbLayer1Thickness.Value; probabilisticGeometryPropertiesStruct.ProbLayer2Thickness = ProbLayer2Thickness.Value; probabilisticGeometryPropertiesStruct.ProbSeepageLength = ProbSeepageLength.Value; probabilisticGeometryPropertiesStruct.ProbSoil1Permeability = ProbSoil1Permeability.Value; probabilisticGeometryPropertiesStruct.ProbSoil2Permeability = ProbSoil2Permeability.Value; probabilisticGeometryPropertiesStruct.ProbSoil3Permeability = ProbSoil3Permeability.Value; PipingCalc2Dll.Model2SetProbabilisticGeometryProperties(fCalcHandle, probabilisticGeometryPropertiesStruct); // water properties WaterPropertiesStruct waterProperties = new WaterPropertiesStruct(); waterProperties.UnitWeight = fCurrentCalculationData.PipingCommonData.WaterUnitWeight; waterProperties.Viscosity = fCurrentCalculationData.PipingCommonData.WaterViscosity; PipingCalc2Dll.Model2PC2SetWaterProperties(fCalcHandle, waterProperties); PipingCalc2Dll.Model2PC2SetCrackLength(fCalcHandle, fCurrentCalculationData.CrackLength); //calculation parameters CalculationParametersStruct calculationParameters = new CalculationParametersStruct(); if (fCurrentCalculationData.IsHeadDropCalculation == true) calculationParameters.CalculationType = 1; else calculationParameters.CalculationType = 2; calculationParameters.FluidisationGradient = fCurrentCalculationData.PipingCommonData.FluidisationGradient; calculationParameters.IsAdjustHeadDrop = fCurrentCalculationData.PipingCommonData.IsAdjustHeadDrop; calculationParameters.SafetyFactor = fCurrentCalculationData.PipingCommonData.SafetyFactor; PipingCalc2Dll.Model2PC2SetCalculationParameters(fCalcHandle, calculationParameters); // calculate PipingCalc2Dll.Model2CalculateProbabilistic(fCalcHandle); reliabilityIndex = PipingCalc2Dll.Model2GetReliabilityIndex(fCalcHandle); if (reliabilityIndex == -1.0) { throw new PipingCalculationException("Error in Piping DLL (Beta = -1.0)"); } // results fCurrentCalculationData.WarningMessage = (PipingCalc2Dll.Model2PC2GetCalculationMessages(fCalcHandle)); if (fCurrentCalculationData.WarningMessage == "") fCurrentCalculationData.Messages = LanguageSupport.GetText("CMessageGeen", System.Threading.Thread.CurrentThread. CurrentCulture); else fCurrentCalculationData.Messages = fCurrentCalculationData.WarningMessage; if (Double.IsNaN(reliabilityIndex)) fCurrentCalculationData.Messages = LanguageSupport.GetText("CMessageError", System.Threading.Thread.CurrentThread. CurrentCulture); } catch (Exception e) { throw new PipingCalculationException(string.Format("Error in Piping DLL {0}", e.Message)); } finally { // cleanup PipingCalc2Dll.Model2PC2DestroyHandle(fCalcHandle); } return reliabilityIndex; } /// /// Read debug log from file /// /// /// private string ReadDebugLog(string APath) { try { StreamReader stream = File.OpenText(APath); stream.ReadLine(); // first line string LLine2 = stream.ReadToEnd(); stream.Close(); File.Delete(APath); return LLine2; } catch { return null; } } // TEMP... this has to be done more generically private void SetCurrentValueFromString(string aField, string aValue) { double doubleValue = 0.0; bool boolValue = true; switch (aField) { case "gamma_w": { if (ValidateDoubleToRangeFromString(aValue, PipingConstants.CNoiseTolerance, PipingConstants.CDelphiMaxDouble, ref doubleValue)) fCurrentCalculationData.PipingCommonData.WaterUnitWeight = doubleValue; break; } case "mu": { if (ValidateDoubleToRangeFromString(aValue, PipingConstants.CMinWaterViscosity, PipingConstants.CMaxWaterViscosity, ref doubleValue)) fCurrentCalculationData.PipingCommonData.WaterViscosity = doubleValue; break; } case "gamma_p": { if (ValidateDoubleToRangeFromString(aValue, PipingConstants.CNoiseTolerance, PipingConstants.CDelphiMaxDouble, ref doubleValue)) fCurrentCalculationData.PipingCommonData.ParticleUnitWeight = doubleValue; break; } case "eta": { if (ValidateDoubleToRangeFromString(aValue, PipingConstants.CMinWhitesConstant, PipingConstants.CMaxWhitesConstant, ref doubleValue)) fCurrentCalculationData.PipingCommonData.WhitesConstant = doubleValue; break; } case "theta": { if (ValidateDoubleToRangeFromString(aValue, PipingConstants.CMinBeddingAngle, PipingConstants.CMaxBeddingAngle, ref doubleValue)) fCurrentCalculationData.PipingCommonData.BeddingAngle = doubleValue; break; } case "Adapt": { if (GetBoolValueFromString(aValue, ref boolValue)) fCurrentCalculationData.PipingCommonData.IsAdjustHeadDrop = boolValue; break; } case "F": { if (ValidateDoubleToRangeFromString(aValue, PipingConstants.CMinSafetyFactor, PipingConstants.CMaxSafetyFactor, ref doubleValue)) fCurrentCalculationData.PipingCommonData.SafetyFactor = doubleValue; break; } case "i": { if (ValidateDoubleToRangeFromString(aValue, PipingConstants.CMinFluidisationGradient, PipingConstants.CMaxFluidisationGradient, ref doubleValue)) fCurrentCalculationData.PipingCommonData.FluidisationGradient = doubleValue; break; } case "D1": { if (ValidateDoubleToRangeFromString(aValue, PipingConstants.CNoiseTolerance, PipingConstants.CDelphiMaxDouble, ref doubleValue)) fCurrentCalculationData.Height1 = doubleValue; break; } case "D2": { if (ValidateDoubleToRangeFromString(aValue, PipingConstants.CNoiseTolerance, PipingConstants.CDelphiMaxDouble, ref doubleValue)) fCurrentCalculationData.Height2 = doubleValue; break; } case "K1": { if (ValidateDoubleToRangeFromString(aValue, PipingConstants.CNoiseTolerance, PipingConstants.CDelphiMaxDouble, ref doubleValue)) fCurrentCalculationData.Permeability1 = doubleValue; break; } case "K2": { if (ValidateDoubleToRangeFromString(aValue, PipingConstants.CNoiseTolerance, PipingConstants.CDelphiMaxDouble, ref doubleValue)) fCurrentCalculationData.Permeability2 = doubleValue; break; } case "K3": { if (ValidateDoubleToRangeFromString(aValue, PipingConstants.CNoiseTolerance, PipingConstants.CDelphiMaxDouble, ref doubleValue)) fCurrentCalculationData.Permeability3 = doubleValue; break; } case "Do": { if (ValidateDoubleToRangeFromString(aValue, 0.0, PipingConstants.CDelphiMaxDouble, ref doubleValue)) fCurrentCalculationData.CrackLength = doubleValue; break; } case "d70": { if (ValidateDoubleToRangeFromString(aValue, PipingConstants.CNoiseTolerance, PipingConstants.CDelphiMaxDouble, ref doubleValue)) fCurrentCalculationData.ParticleDiameter = doubleValue; break; } case "L": { if (ValidateDoubleToRangeFromString(aValue, PipingConstants.CNoiseTolerance, PipingConstants.CDelphiMaxDouble, ref doubleValue)) fCurrentCalculationData.SeepageLength = doubleValue; break; } case "dH": { if (ValidateDoubleToRangeFromString(aValue, PipingConstants.CNoiseTolerance, PipingConstants.CDelphiMaxDouble, ref doubleValue)) fCurrentCalculationData.HeadDrop = doubleValue; break; } case "Calculate": { if (aValue == PipingModelModel2Data.RowHeaderTextList[15]) fCurrentCalculationData.IsHeadDropCalculation = false; else fCurrentCalculationData.IsHeadDropCalculation = true; break; } default: break; } } // TEMP... this has to be done more generically private bool ValidateDoubleToRangeFromString(string aStringValue, double aMin, double aMax, ref double aValue) { double doubleValue = 0.0; // the CSV read would have changed all decimal separators to '.' // specify this to the double parsing, else we'd get wrong values // if the current thread has a diff decimal separator NumberFormatInfo ni = new NumberFormatInfo(); ni.CurrencyDecimalSeparator = "."; ni.NumberDecimalSeparator = "."; try { doubleValue = Double.Parse(aStringValue, ni); } catch { return false; } if (doubleValue < aMin) doubleValue = aMin; else if (doubleValue > aMax) doubleValue = aMax; aValue = doubleValue; return true; } private bool GetBoolValueFromString(string aStringValue, ref bool aValue) { bool boolValue = true; try { boolValue = bool.Parse(aStringValue); } catch { return false; } aValue = boolValue; return true; } /// /// /// /// public List ParametersDeterministicToStrings() { List parameterStrings = new List(); // soil properties parameterStrings.Add(sPipingParametersSectionId); parameterStrings.Add(String.Format("BeddingAngle={0}", fCurrentCalculationData.PipingCommonData.BeddingAngle)); parameterStrings.Add(String.Format("ParticleDiameter={0}", fCurrentCalculationData.ParticleDiameter)); parameterStrings.Add(String.Format("ParticleUnitWeight={0:0.00}", fCurrentCalculationData.PipingCommonData.ParticleUnitWeight)); parameterStrings.Add(String.Format("WhitesConstant={0}", fCurrentCalculationData.PipingCommonData.WhitesConstant)); //// water properties parameterStrings.Add(String.Format("WaterUnitWeight={0:0.00}", fCurrentCalculationData.PipingCommonData.WaterUnitWeight)); parameterStrings.Add(String.Format("WaterViscosity={0:E4}", fCurrentCalculationData.PipingCommonData.WaterViscosity)); parameterStrings.Add(String.Format("CrackLength={0:0.00}", fCurrentCalculationData.CrackLength)); parameterStrings.Add(String.Format("HeadDrop={0:0.00}", fCurrentCalculationData.HeadDrop)); parameterStrings.Add(String.Format("SeepageLength={0:0.00}", fCurrentCalculationData.SeepageLength)); //// heights parameterStrings.Add(String.Format("Height1={0:0.00}", fCurrentCalculationData.Height1)); parameterStrings.Add(String.Format("Height2={0:0.00}", fCurrentCalculationData.Height2)); //// permeabilities parameterStrings.Add(String.Format("Permeability1={0:E5}", fCurrentCalculationData.Permeability1)); parameterStrings.Add(String.Format("Permeability2={0:E5}", fCurrentCalculationData.Permeability2)); parameterStrings.Add(String.Format("Permeability3={0:E5}", fCurrentCalculationData.Permeability3)); parameterStrings.Add(String.Format("IsHeadDropCalculation={0}", fCurrentCalculationData.IsHeadDropCalculation)); parameterStrings.Add(String.Format("IsAdjustHeadDrop={0}", fCurrentCalculationData.PipingCommonData.IsAdjustHeadDrop)); parameterStrings.Add(String.Format("SafetyFactor={0:0.00}", fCurrentCalculationData.PipingCommonData.SafetyFactor)); parameterStrings.Add(String.Format("FluidisationGradient={0:0.00}", fCurrentCalculationData.PipingCommonData.FluidisationGradient)); return parameterStrings; } /// /// /// /// public List ParametersProbabilisticToStrings() { List parameterStrings = new List(); // Make sure data is written in neutral format NumberFormatInfo numberFormatInfo = new NumberFormatInfo(); numberFormatInfo.CurrencyDecimalSeparator = "."; numberFormatInfo.NumberDecimalSeparator = "."; // soil properties parameterStrings.Add(sPipingParametersSectionId); parameterStrings.Add(String.Format(numberFormatInfo, "BeddingAngleMean={0:0.000000}", PipingCommonData.ProbBeddingAngle.Value.Mean)); parameterStrings.Add(String.Format(numberFormatInfo, "BeddingAngleStd={0:0.000000}", PipingCommonData.ProbBeddingAngle.Value.StandardDeviation)); parameterStrings.Add(String.Format(numberFormatInfo, "BeddingAngleDist={0}", PipingCommonData.ProbBeddingAngle.Value.Distribution)); parameterStrings.Add(String.Format(numberFormatInfo, "ParticleDiameterMean={0:0.000000}", PipingCommonData.ProbParticleD70.Value.Mean)); parameterStrings.Add(String.Format(numberFormatInfo, "ParticleDiameterStd={0:0.000000}", PipingCommonData.ProbParticleD70.Value.StandardDeviation)); parameterStrings.Add(String.Format(numberFormatInfo, "ParticleDiameterDist={0}", PipingCommonData.ProbParticleD70.Value.Distribution)); parameterStrings.Add(String.Format(numberFormatInfo, "ParticleUnitWeightMean={0:0.000000}", PipingCommonData.ProbParticleUnitWeight.Value.Mean)); parameterStrings.Add(String.Format(numberFormatInfo, "ParticleUnitWeightStd={0:0.000000}", PipingCommonData.ProbParticleUnitWeight.Value.StandardDeviation)); parameterStrings.Add(String.Format(numberFormatInfo, "ParticleUnitWeightDist={0}", PipingCommonData.ProbParticleUnitWeight.Value.Distribution)); parameterStrings.Add(String.Format(numberFormatInfo, "WhitesConstantMean={0:0.000000}", PipingCommonData.ProbWhitesConstant.Value.Mean)); parameterStrings.Add(String.Format(numberFormatInfo, "WhitesConstantStd={0:0.000000}", PipingCommonData.ProbWhitesConstant.Value.StandardDeviation)); parameterStrings.Add(String.Format(numberFormatInfo, "WhitesConstantDist={0}", PipingCommonData.ProbWhitesConstant.Value.Distribution)); // water properties parameterStrings.Add(String.Format(numberFormatInfo, "WaterUnitWeight={0:0.000000}", fCurrentCalculationData.PipingCommonData.WaterUnitWeight)); parameterStrings.Add(String.Format(numberFormatInfo, "WaterViscosity={0:E4}", fCurrentCalculationData.PipingCommonData.WaterViscosity)); parameterStrings.Add(String.Format(numberFormatInfo, "CrackLength={0:0.000000}", fCurrentCalculationData.CrackLength)); parameterStrings.Add(String.Format(numberFormatInfo, "ExternalWaterlevelMean={0:0.000000}", ProbExternalWaterlevel.Value.Mean)); parameterStrings.Add(String.Format(numberFormatInfo, "ExternalWaterlevelStd={0:0.000000}", ProbExternalWaterlevel.Value.StandardDeviation)); parameterStrings.Add(String.Format(numberFormatInfo, "ExternalWaterlevelDist={0}", ProbExternalWaterlevel.Value.Distribution)); parameterStrings.Add(String.Format(numberFormatInfo, "SeepageLengthMean={0:0.000000}", ProbSeepageLength.Value.Mean)); parameterStrings.Add(String.Format(numberFormatInfo, "SeepageLengthStd={0:0.000000}", ProbSeepageLength.Value.StandardDeviation)); parameterStrings.Add(String.Format(numberFormatInfo, "SeepageLengthDist={0}", ProbSeepageLength.Value.Distribution)); // heights parameterStrings.Add(String.Format(numberFormatInfo, "Height1Mean={0:0.000000}", ProbLayer1Thickness.Value.Mean)); parameterStrings.Add(String.Format(numberFormatInfo, "Height1Std={0:0.000000}", ProbLayer1Thickness.Value.StandardDeviation)); parameterStrings.Add(String.Format(numberFormatInfo, "Height1Dist={0}", ProbLayer1Thickness.Value.Distribution)); parameterStrings.Add(String.Format(numberFormatInfo, "Height2Mean={0:0.000000}", ProbLayer2Thickness.Value.Mean)); parameterStrings.Add(String.Format(numberFormatInfo, "Height2Std={0:0.000000}", ProbLayer2Thickness.Value.StandardDeviation)); parameterStrings.Add(String.Format(numberFormatInfo, "Height2Dist={0}", ProbLayer2Thickness.Value.Distribution)); // permeabilities parameterStrings.Add(String.Format(numberFormatInfo, "Permeability1Mean={0:E7}", ProbSoil1Permeability.Value.Mean)); parameterStrings.Add(String.Format(numberFormatInfo, "Permeability1Std={0:E7}", ProbSoil1Permeability.Value.StandardDeviation)); parameterStrings.Add(String.Format(numberFormatInfo, "Permeability1Dist={0}", ProbSoil1Permeability.Value.Distribution)); parameterStrings.Add(String.Format(numberFormatInfo, "Permeability2Mean={0:E7}", ProbSoil2Permeability.Value.Mean)); parameterStrings.Add(String.Format(numberFormatInfo, "Permeability2Std={0:E7}", ProbSoil2Permeability.Value.StandardDeviation)); parameterStrings.Add(String.Format(numberFormatInfo, "Permeability2Dist={0}", ProbSoil2Permeability.Value.Distribution)); parameterStrings.Add(String.Format(numberFormatInfo, "Permeability3Mean={0:E7}", ProbSoil3Permeability.Value.Mean)); parameterStrings.Add(String.Format(numberFormatInfo, "Permeability3Std={0:E7}", ProbSoil3Permeability.Value.StandardDeviation)); parameterStrings.Add(String.Format(numberFormatInfo, "Permeability3Dist={0}", ProbSoil3Permeability.Value.Distribution)); parameterStrings.Add(String.Format(numberFormatInfo, "IsHeadDropCalculation={0}", fCurrentCalculationData.IsHeadDropCalculation)); parameterStrings.Add(String.Format(numberFormatInfo, "IsAdjustHeadDrop={0}", fCurrentCalculationData.PipingCommonData.IsAdjustHeadDrop)); parameterStrings.Add(String.Format(numberFormatInfo, "SafetyFactor={0:0.000000}", fCurrentCalculationData.PipingCommonData.SafetyFactor)); parameterStrings.Add(String.Format(numberFormatInfo, "FluidisationGradient={0:0.000000}", fCurrentCalculationData.PipingCommonData.FluidisationGradient)); return parameterStrings; } } }