using LoaderCalculator.Data.Matrix; using LoaderCalculator.Data.Ndms; using LoaderCalculator.Logics; using StructureHelperCommon.Infrastructures.Exceptions; using StructureHelperCommon.Models; using StructureHelperCommon.Models.Loggers; using StructureHelperLogics.Services; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace StructureHelperLogics.NdmCalculations.Cracking { /// /// Logic for obtaining of length between cracks according to SP63.13330.2018 /// public class LengthBetweenCracksLogicSP63 : ILengthBetweenCracksLogic { const double minDiameterFactor = 10d; const double maxDiameterFactor = 40d; const double minLength = 0.1d; const double maxLength = 0.4d; private const double areaFactor = 0.5d; readonly IAverageDiameterLogic diameterLogic; readonly ITensileConcreteAreaLogic concreteAreaLogic; ITensionRebarAreaLogic rebarAreaLogic; /// public IEnumerable NdmCollection { get; set; } /// public IStrainMatrix StrainMatrix { get; set; } /// public IShiftTraceLogger? TraceLogger { get; set; } public LengthBetweenCracksLogicSP63(IAverageDiameterLogic diameterLogic, ITensileConcreteAreaLogic concreteAreaLogic, ITensionRebarAreaLogic rebarAreaLogic) { this.diameterLogic = diameterLogic; this.concreteAreaLogic = concreteAreaLogic; this.rebarAreaLogic = rebarAreaLogic; } public LengthBetweenCracksLogicSP63() : this ( new EquivalentDiameterLogic(), new TensileConcreteAreaLogicSP63(), new TensionRebarAreaSimpleSumLogic()) { } /// public double GetLength() { TraceLogger?.AddMessage(LoggerStrings.CalculatorType(this), TraceLogStatuses.Service); IEnumerable rebars = GetRebars(); double rebarArea = GetRebarArea(rebars); double rebarDiameter = GetAverageDiameter(rebars); double concreteArea = GetConcreteArea(); double length = GetLengthBetweenCracks(rebarArea, rebarDiameter, concreteArea); return length; } private IEnumerable GetRebars() { var rebars = NdmCollection .Where(x => x is RebarNdm) .Select(x => x as RebarNdm); if (!rebars.Any()) { string errorString = ErrorStrings.DataIsInCorrect + ": Collection of rebars does not contain any tensile rebars"; TraceLogger?.AddMessage(errorString, TraceLogStatuses.Error); throw new StructureHelperException(errorString); } return rebars; } private double GetLengthBetweenCracks(double rebarArea, double rebarDiameter, double concreteArea) { var length = areaFactor * concreteArea / rebarArea * rebarDiameter; TraceLogger?.AddMessage($"Base length between cracks Lcrc = {areaFactor} * {concreteArea} / {rebarArea} * {rebarDiameter} = {length}(m)"); double minLengthByDiameter = minDiameterFactor * rebarDiameter; TraceLogger?.AddMessage($"Minimum length by diameter Lcrc = {minDiameterFactor} * {rebarDiameter} = {minLengthByDiameter}(m)"); TraceLogger?.AddMessage($"Minimum absolute length Lcrc = {minLength}(m)"); var restrictedByMinLength = new List { length, minLengthByDiameter, minLength }.Max(); TraceLogger?.AddMessage($"Consider minimum length restriction Lcrc = max({length}(m), {minLengthByDiameter}(m), {minLength}(m)) = {length}(m)"); double maxLengthByDiameter = maxDiameterFactor * rebarDiameter; TraceLogger?.AddMessage($"Maximum length by diameter Lcrc = {maxDiameterFactor} * {rebarDiameter} = {maxLengthByDiameter}(m)"); TraceLogger?.AddMessage($"Maximum absolute length Lcrc = {maxLength}(m)"); var restrictedByMaxLength = new List { restrictedByMinLength, maxLengthByDiameter, maxLength }.Min(); TraceLogger?.AddMessage($"Consider maximum length restriction Lcrc = max({restrictedByMinLength}(m), {maxLengthByDiameter}(m), {maxLength}(m)) = {restrictedByMaxLength}(m)"); length = restrictedByMaxLength; TraceLogger?.AddMessage($"Finally Lcrc = {length}(m)"); return length; } private double GetConcreteArea() { concreteAreaLogic.TraceLogger = TraceLogger?.GetSimilarTraceLogger(50); concreteAreaLogic.NdmCollection = NdmCollection; concreteAreaLogic.StrainMatrix = StrainMatrix; var concreteArea = concreteAreaLogic.GetTensileArea(); TraceLogger?.AddMessage($"Concrete effective area Ac,eff = {concreteArea}(m^2)"); return concreteArea; } private double GetAverageDiameter(IEnumerable rebars) { diameterLogic.TraceLogger = TraceLogger?.GetSimilarTraceLogger(50); diameterLogic.Rebars = rebars; var rebarDiameter = diameterLogic.GetAverageDiameter(); TraceLogger?.AddMessage($"Average rebar diameter ds = {rebarDiameter}"); return rebarDiameter; } private double GetRebarArea(IEnumerable rebars) { rebarAreaLogic.StrainMatrix = StrainMatrix; rebarAreaLogic.Rebars = rebars; rebarAreaLogic.TraceLogger = TraceLogger?.GetSimilarTraceLogger(50); var rebarArea = rebarAreaLogic.GetTensionRebarArea(); TraceLogger?.AddMessage($"Summary rebar area As = {rebarArea}(m^2)"); return rebarArea; } } }