117 lines
4.6 KiB
C#
117 lines
4.6 KiB
C#
using StructureHelperCommon.Infrastructures.Exceptions;
|
|
using StructureHelperCommon.Models.Calculators;
|
|
using StructureHelperCommon.Models;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace StructureHelperCommon.Models.Soils
|
|
{
|
|
public class AnchorCalculator : ICalculator
|
|
{
|
|
private AnchorResult result;
|
|
|
|
public string Name { get; set; }
|
|
|
|
public IAnchorSoilProperties Soil { get; set; }
|
|
public SoilAnchor Anchor { get; set; }
|
|
|
|
public IResult Result => result;
|
|
|
|
public Action<IResult> ActionToOutputResults { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
|
|
public IShiftTraceLogger? TraceLogger { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
|
|
|
|
public AnchorCalculator(SoilAnchor soilAnchor, IAnchorSoilProperties anchorSoilProperties)
|
|
{
|
|
Anchor = soilAnchor;
|
|
Soil = anchorSoilProperties;
|
|
}
|
|
|
|
public object Clone()
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
public void Run()
|
|
{
|
|
const double ratioFactor = 1.01d;
|
|
|
|
CheckParameters();
|
|
|
|
result = new() { IsValid = true };
|
|
|
|
var alpha = Math.PI / 180d * Anchor.AngleToHorizont;
|
|
var fi = Math.PI / 180d * Soil.FrictionAngle;
|
|
var sinFi = Math.Sin(fi);
|
|
|
|
double ksi0 = GetKsi();
|
|
|
|
var hk = Anchor.GroundLevel - Anchor.HeadLevel;
|
|
hk += Anchor.FreeLength * Math.Sin(alpha);
|
|
result.AnchorCenterLevel = hk;
|
|
|
|
var decrement = Math.Sqrt(Math.Pow(Math.Cos(alpha), 2) + Math.Pow(ksi0 * Math.Sin(alpha), 2));
|
|
var sigma0g = 0.5d * (Soil.VolumetricWeight * hk + Anchor.AdditionalSurfPressure) * (ksi0 + decrement);
|
|
result.AverageSidePressure = sigma0g;
|
|
|
|
var overA1 = (1 + Soil.PoissonRatio) * (sigma0g + Soil.Coheasion / Math.Tan(fi)) * sinFi;
|
|
var a1 = Soil.YoungsModulus / overA1;
|
|
|
|
double kp = GetKp(ratioFactor, sinFi, a1);
|
|
|
|
var charRak = Math.PI * Anchor.RootDiameter * Anchor.RootLength;
|
|
charRak *= 1 + sinFi;
|
|
charRak *= sigma0g * Math.Tan(fi) + Soil.Coheasion;
|
|
charRak *= kp * GetGammaC();
|
|
|
|
result.CharBearingCapacity = charRak;
|
|
result.DesignBearingCapacity = charRak / GetGammaN();
|
|
|
|
result.MortarVolumeFstStady = 0.5d * (Anchor.RootDiameter * Anchor.RootDiameter - Anchor.JetTubeDiameter * Anchor.JetTubeDiameter) * (1 + 3.1 * Anchor.WaterCementRatio) * Anchor.RootLength;
|
|
result.MortarVolumeSndStady = 0.5d * (Anchor.RootDiameter * Anchor.RootDiameter - Anchor.BoreHoleDiameter * Anchor.BoreHoleDiameter) * (1 + 3.1d * Anchor.WaterCementRatio) * Anchor.RootLength;
|
|
}
|
|
|
|
private void CheckParameters()
|
|
{
|
|
if (Anchor.RootDiameter < Anchor.BoreHoleDiameter)
|
|
{
|
|
throw new StructureHelperException(ErrorStrings.DataIsInCorrect + $": Diameter of root {Anchor.RootDiameter}m must be greater than diameter of borehole {Anchor.BoreHoleDiameter}m");
|
|
}
|
|
}
|
|
|
|
private double GetKp(double ratioFactor, double sinFi, double a1)
|
|
{
|
|
var tetta = sinFi / (1 + sinFi);
|
|
var kp = ratioFactor - Math.Pow(Anchor.BoreHoleDiameter / Anchor.RootDiameter, 2);
|
|
kp /= ratioFactor - a1 * a1 / (1 + a1 * a1);
|
|
kp = Math.Pow(kp, tetta);
|
|
return kp;
|
|
}
|
|
|
|
private double GetKsi()
|
|
{
|
|
if (Soil.SoilType == SoilType.SandAndSemiSand) { return 0.43d; }
|
|
else if (Soil.SoilType == SoilType.SemiClay) { return 0.55d; }
|
|
else if (Soil.SoilType == SoilType.Clay) { return 0.72d; }
|
|
else { throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknown); }
|
|
}
|
|
|
|
private double GetGammaC()
|
|
{
|
|
if (Soil.SoilType == SoilType.SandAndSemiSand) { return 0.72d; }
|
|
else if (Soil.SoilType == SoilType.SemiClay) { return 0.64d; }
|
|
else if (Soil.SoilType == SoilType.Clay) { return 0.64; }
|
|
else { throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknown + $": {Soil.SoilType}"); }
|
|
}
|
|
|
|
private double GetGammaN()
|
|
{
|
|
if (Anchor.DurabilityType == DurabilityType.Temporary) { return 1.2d; }
|
|
else if (Anchor.DurabilityType == DurabilityType.Eturnal) { return 1.4d; }
|
|
else { throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknown + $": {Anchor.DurabilityType}"); }
|
|
}
|
|
}
|
|
}
|