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