//----------------------------------------------------------------------- // // Copyright (c) 2009 Deltares. All rights reserved. // // B. Faassen // barry.faassen@deltares.nl // 7-7-2009 // n.a. //----------------------------------------------------------------------- using Deltares.Standard.Language; namespace Deltares.Piping.Data { using System; using System.Threading; using Deltares.Standard; public class PipingModel3Calculation { private readonly PipingModelModel3Data currentCalculationData; private IntPtr calculationHandle = IntPtr.Zero; /// /// Standard constructor /// public PipingModel3Calculation() { SessionId = ""; HomeDir = ""; currentCalculationData = new PipingModelModel3Data(); calculationHandle = IntPtr.Zero; } /// /// Constructor with initializing values /// /// public PipingModel3Calculation(PipingCommonData pipingCommonData) { SessionId = ""; HomeDir = ""; currentCalculationData = new PipingModelModel3Data(pipingCommonData); calculationHandle = IntPtr.Zero; } // wrap the Model2 data as properties here again (VNK) public PipingCommonData PipingCommonData { set { currentCalculationData.PipingCommonData = value; } get { return currentCalculationData.PipingCommonData; } } public bool IsHeadDropCalculation { set { currentCalculationData.IsHeadDropCalculation = value; } get { return currentCalculationData.IsHeadDropCalculation; } } public double SeepageLength { set { currentCalculationData.SeepageLength = value; } get { return currentCalculationData.SeepageLength; } } public double CrackLength { set { currentCalculationData.CrackLength = value; } get { return currentCalculationData.CrackLength; } } public double ParticleDiameter { set { currentCalculationData.ParticleDiameter = value; } get { return currentCalculationData.ParticleDiameter; } } public double Height1 { set { currentCalculationData.Height1 = value; } get { return currentCalculationData.Height1; } } public double Height2 { set { currentCalculationData.Height2 = value; } get { return currentCalculationData.Height2; } } public double Permeability1 { set { currentCalculationData.Permeability1 = value; } get { return currentCalculationData.Permeability1; } } public double Permeability2 { set { currentCalculationData.Permeability2 = value; } get { return currentCalculationData.Permeability2; } } public double Permeability3 { set { currentCalculationData.Permeability3 = value; } get { return currentCalculationData.Permeability3; } } public double HeadDrop { get { return currentCalculationData.HeadDrop; } set { currentCalculationData.HeadDrop = value; } } public double HeadDropWell { get { return currentCalculationData.HeadDropWell; } set { currentCalculationData.HeadDropWell = value; } } public double WellContent { get { return currentCalculationData.WellContent; } set { currentCalculationData.WellContent = value; } } public string Messages { get { return currentCalculationData.Messages; } set { currentCalculationData.Messages = value; } } /// /// /// public string HomeDir { get; set; } /// /// /// public string SessionId { get; set; } /// /// Actual piping calculation /// public void CalculateHeadDropPC3() { currentCalculationData.Messages = ""; calculationHandle = PipingCalc3Dll.Model3PC3CreateHandle(); if (calculationHandle == IntPtr.Zero) { currentCalculationData.HeadDrop = 0.0; currentCalculationData.Messages = PipingConstants.CMessageError; return; } // soil properties var soilProperties = new SoilPropertiesStruct(); soilProperties.BeddingAngle = currentCalculationData.PipingCommonData.BeddingAngle; soilProperties.ParticleD70 = currentCalculationData.ParticleDiameter; soilProperties.ParticleUnitWeight = currentCalculationData.PipingCommonData.ParticleUnitWeight; soilProperties.WhitesConstant = currentCalculationData.PipingCommonData.WhitesConstant; PipingCalc3Dll.Model3PC3SetSoilProperties(calculationHandle, soilProperties); // water properties var waterProperties = new WaterPropertiesStruct(); waterProperties.UnitWeight = currentCalculationData.PipingCommonData.WaterUnitWeight; waterProperties.Viscosity = currentCalculationData.PipingCommonData.WaterViscosity; PipingCalc3Dll.Model3PC3SetWaterProperties(calculationHandle, waterProperties); PipingCalc3Dll.Model3PC3SetCrackLength(calculationHandle, currentCalculationData.CrackLength); PipingCalc3Dll.Model3PC3SetHeadDrop(calculationHandle, currentCalculationData.HeadDrop); PipingCalc3Dll.Model3PC3SetSeepageLength(calculationHandle, currentCalculationData.SeepageLength); PipingCalc3Dll.Model3PC3SetWellContent(calculationHandle, currentCalculationData.WellContent); // heights var heightArray = new double[2]; heightArray[0] = currentCalculationData.Height1; heightArray[1] = currentCalculationData.Height2; PipingCalc3Dll.Model3PC3SetHeights(calculationHandle, heightArray.Length, heightArray); // permeabilities var permeabilityArray = new double[3]; permeabilityArray[0] = currentCalculationData.Permeability1; permeabilityArray[1] = currentCalculationData.Permeability2; permeabilityArray[2] = currentCalculationData.Permeability3; PipingCalc3Dll.Model3PC3SetPermeabilities(calculationHandle, permeabilityArray.Length, permeabilityArray); //calculation parameters var calculationParameters = new CalculationParametersStruct(); calculationParameters.CalculationType = currentCalculationData.IsHeadDropCalculation ? 1 : 2; calculationParameters.FluidisationGradient = currentCalculationData.PipingCommonData.FluidisationGradient; calculationParameters.IsAdjustHeadDrop = currentCalculationData.PipingCommonData.IsAdjustHeadDrop; calculationParameters.SafetyFactor = currentCalculationData.PipingCommonData.SafetyFactor; PipingCalc3Dll.Model3PC3SetCalculationParameters(calculationHandle, calculationParameters); // calculate var result = true; try { PipingCalc3Dll.Model3PC3Calculate(calculationHandle); if (currentCalculationData.IsHeadDropCalculation) { currentCalculationData.HeadDrop = PipingCalc3Dll.Model3PC3GetHeadDrop(calculationHandle); currentCalculationData.HeadDropWell = PipingCalc3Dll.Model3PC3GetHeadDropWell(calculationHandle); } else { currentCalculationData.SeepageLength = PipingCalc3Dll.Model3PC3GetSeepageLength(calculationHandle); } } catch { result = false; } // results currentCalculationData.WarningMessage = (PipingCalc3Dll.Model3PC3GetCalculationMessages(calculationHandle)); if (currentCalculationData.WarningMessage == "") currentCalculationData.Messages = LanguageSupport.GetText("CMessageGeen", Thread.CurrentThread.CurrentCulture); else currentCalculationData.Messages = currentCalculationData.WarningMessage; if (Double.IsNaN(currentCalculationData.HeadDrop) || result == false) currentCalculationData.Messages = LanguageSupport.GetText("CMessageError", Thread.CurrentThread.CurrentCulture); // cleanup PipingCalc3Dll.Model3PC3DestroyHandle(calculationHandle); calculationHandle = IntPtr.Zero; } } }