using System; using Deltares.Geotechnics; using Deltares.Geotechnics.Soils; namespace Deltares.Stability.Calculation2 { public class SlicesFiller { public PreProcesStabilityCalculation PreProces { get; set; } /// /// The slice data is pre calculated in the geometry /// by interpolation the values are retrieved for slices /// /// /// /// public void FillSlicesByInterpolation(Slice slice, double deltaValue) { // find the column and area from ZBottom mid InterpolationColumn interpolationcolumn = PreProces.GetColumnAtX(slice.XCenter); // ... first get column data interpolationcolumn.RetrieveColumnData(); slice.PoreOnSurface = interpolationcolumn.PoreOnSurface; double angle = interpolationcolumn.TopAngle; double force = slice.PoreOnSurface*slice.Width/Math.Cos(angle); slice.HPoreOnSurface = force*Math.Sin(angle); slice.VPoreOnSurface = -force*Math.Cos(angle); double zFrea = interpolationcolumn.ZFrea; double gammaWater = PreProces.Waternet.UnitWeight; slice.HydrostaticPorePressure = Math.Max(0, (zFrea - slice.ZCenterBottom) * gammaWater); InterpolationArea interpolationArea = interpolationcolumn.getArea(slice.ZCenterBottom + deltaValue); // ... calculate all variables in area at position ZBottomMid ... if (interpolationArea != null) { interpolationArea.DetermineParameters(); // ... determine the multiplication factor to apply on cohesion and phi to take uplift into account double xMiddleLeft = 0.5*(interpolationArea.TopLeftPoint.XCoordinate + interpolationArea.BottomLeftPoint.XCoordinate); double xMiddleRight = 0.5*(interpolationArea.TopRightPoint.XCoordinate + interpolationArea.BottomRightPoint.XCoordinate); double multiFactLeft = interpolationArea.MultiplicationFactorCPhiLeft; double gradient = (multiFactLeft - interpolationArea.MultiplicationFactorCPhiRight)/(xMiddleLeft - xMiddleRight); double multiFactorAtX = gradient*(slice.XCenter - xMiddleLeft) + multiFactLeft; // ... copy the calculated data to the slices switch (interpolationArea.ShearStrenghModel) { case ShearStrengthModel.CPhi: slice.Cohesion = interpolationArea.Cohesion*multiFactorAtX; slice.Phi = interpolationArea.Phi*multiFactorAtX; break; case ShearStrengthModel.CuMeasured: slice.Cohesion = interpolationArea.Su*multiFactorAtX; slice.Phi = 0; slice.POP = interpolationArea.POP; slice.OCR = interpolationArea.OCR; slice.PGrens = interpolationArea.PGrens; break; case ShearStrengthModel.CuCalculated: slice.Cohesion = interpolationArea.Su*multiFactorAtX; slice.Phi = 0; slice.POP = interpolationArea.POP; slice.OCR = interpolationArea.OCR; slice.PGrens = interpolationArea.PGrens; break; } slice.Dilatancy = interpolationArea.Dilatancy; slice.SoilStress = interpolationArea.SoilStress; slice.Weight = slice.SoilStress * slice.Width; // in kN/m slice.ExternalLoad = (interpolationcolumn.UniformLoadPermMagnitude + interpolationcolumn.UniformLoadTempMagnitude) * slice.Width; // in kN/m slice.LoadStress = interpolationcolumn.UniformLoadPermMagnitude + interpolationcolumn.UniformLoadTempMagnitude; slice.PoreOnSurface = interpolationcolumn.PoreOnSurface; slice.TotalStress = Math.Max(0, (slice.SoilStress + slice.PoreOnSurface + slice.LoadStress)); slice.DegreeofConsolidationPorePressure = interpolationArea.AanpasPore; slice.PiezometricPorePressure = interpolationArea.PnLinePore; slice.PorePressureDueToDegreeOfConsolidationLoad = interpolationArea.PorePressureDueToDegreeofConsolidationLoad; slice.TotalPorePressure = slice.DegreeofConsolidationPorePressure + slice.PiezometricPorePressure + slice.PorePressureDueToDegreeOfConsolidationLoad; slice.EffectiveStress = slice.TotalStress - slice.TotalPorePressure; if (slice.EffectiveStress < 0) { slice.TotalPorePressure = slice.TotalPorePressure + slice.EffectiveStress; slice.EffectiveStress = 0.0; } } } } }