using System; using System.Runtime.Serialization; using Deltares.Geometry; using Deltares.Geotechnics; using Deltares.Geotechnics.GeotechnicalGeometry; using Deltares.Geotechnics.Soils; using Deltares.MStab; using Deltares.Stability.Calculation.Inner; using Deltares.Standard.Extensions; #if DELPHI using InterfaceCalls; using InterfaceData; #else #endif namespace Deltares.Stability.Calculation { [Serializable] public class DelegateFunctionsException : Exception { // // For guidelines regarding the creation of new exception types, see // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconerrorraisinghandlingguidelines.asp // and // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncscol/html/csharp07192001.asp // public DelegateFunctionsException() {} public DelegateFunctionsException(string message) : base(message) {} public DelegateFunctionsException(string message, Exception inner) : base(message, inner) {} protected DelegateFunctionsException( SerializationInfo info, StreamingContext context) : base(info, context) {} } internal static class CalculationDelegateFunctions { private static MStabProject mstabProject = null; public static void SetDelegateFunctions(ref TInterfaceData aStabilityObjects, MStabProject aMStabProject) { if (aMStabProject == null) { throw new DelegateFunctionsException("Empty MStabProject in CalculationDelegateFunctions"); } mstabProject = aMStabProject; aStabilityObjects.InterfaceCalls.SetSoilNumberFromPointDelegate(new TSoilNumberFromPoint(DetermineSoilNumberFromPoint)); aStabilityObjects.InterfaceCalls.SetLayerNumberFromPointDelegate(new TLayerNumberFromPoint(DetermineLayerNumberFromPoint)); aStabilityObjects.InterfaceCalls.SetGetZTopFromLayerDelegate(new TGetZTopFromLayer(mstabProject.Geometry.GetZTopFromLayer)); aStabilityObjects.InterfaceCalls.SetGetZTopFromLayersDelegate(new TGetZTopFromLayers(mstabProject.Geometry.IntersectLayers)); aStabilityObjects.InterfaceCalls.SetGetZBottomFromLayerDelegate(new TGetZBottomFromLayer(mstabProject.Geometry.GetZBottomFromLayer)); aStabilityObjects.InterfaceCalls.SetDetermineCentreOfGravityDelegate(new TDetermineCentreOfGravity(CenterOfGravity)); aStabilityObjects.InterfaceCalls.SetDetermZReferencelevelCuCalculatedDelegate(new TDetermZReferencelevelCuCalculated(mstabProject.Stability.DetermineZReferenceLevelCu)); aStabilityObjects.InterfaceCalls.SetDetermTotalstressDelegate(new TDetermTotalstress(CalculateTotalSoilPressure)); if (mstabProject.Geotechnics.CurrentWaternet != null) { aStabilityObjects.InterfaceCalls.SetDetermPorePressurePiezometricLevels(new TDetermPorePressurePiezometricLevels(mstabProject.Geotechnics.CurrentWaternet.PorePressureFromPiezoLevelLines)); aStabilityObjects.InterfaceCalls.SetIntersectPhreaticDelegate(new TIntersectPhreatic(mstabProject.Geotechnics.CurrentWaternet.IntersectPhreaticLine)); } } public static double CenterOfGravity(double aXCoord, double aZCoord) { double zIntersecPhreaticLine = mstabProject.Geotechnics.CurrentWaternet.IntersectPhreaticLine(aXCoord, double.MinValue); return mstabProject.Geometry.CenterOfGravity(aXCoord, aZCoord, zIntersecPhreaticLine, new GeometryData.GammaFromSurfaceDelegate(mstabProject.Stability.GetGammaFromSurface)); } public static int DetermineLayerNumberFromPoint(double aPointX, double aPointZ) { int surfaceIndex = mstabProject.Geometry.DetermineSurfaceFromPoint(aPointX, aPointZ); if (surfaceIndex >= 0) { return mstabProject.Stability.SoilProfile.Surfaces.FindIndex(x => x.GeometrySurface == (GeometrySurface) mstabProject.Geometry.Surfaces[surfaceIndex]); } return -9999; } public static int DetermineSoilNumberFromPoint(double aPointX, double aPointZ) { int surfaceIndex = mstabProject.Geometry.DetermineSurfaceFromPoint(aPointX, aPointZ); if (surfaceIndex >= 0) { SoilLayer2D soilsurface = mstabProject.Stability.SoilProfile.Surfaces.Find(x => x.GeometrySurface == (GeometrySurface) mstabProject.Geometry.Surfaces[surfaceIndex]); if (soilsurface != null) { return mstabProject.SoilModel.Soils.FindIndex(x => x.Name == soilsurface.Soil.Name); } } return -9999; } public static double CalculateTotalSoilPressure(double aXCoord, double aZCoord) { double zIntersecPhreaticLine = mstabProject.Geotechnics.CurrentWaternet.IntersectPhreaticLine(aXCoord, double.MinValue); var gammafromsurfaceDelegate = new GeometryData.GammaFromSurfaceDelegate(mstabProject.Stability.GetGammaFromSurface); return mstabProject.Geometry.CalculateTotalSoilPressure(aXCoord, aZCoord, zIntersecPhreaticLine, gammafromsurfaceDelegate); } } }