Crack width calculation was added
This commit is contained in:
@@ -1,53 +1,164 @@
|
||||
using LoaderCalculator.Logics;
|
||||
using LoaderCalculator.Data.Ndms;
|
||||
using LoaderCalculator.Logics;
|
||||
using StructureHelperCommon.Infrastructures.Enums;
|
||||
using StructureHelperCommon.Infrastructures.Exceptions;
|
||||
using StructureHelperCommon.Models.Calculators;
|
||||
using StructureHelperCommon.Models;
|
||||
using StructureHelperCommon.Models.Forces;
|
||||
using StructureHelperCommon.Services.Forces;
|
||||
using StructureHelperLogics.NdmCalculations.Analyses.ByForces;
|
||||
using StructureHelperLogics.NdmCalculations.Triangulations;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using StructureHelperCommon.Infrastructures.Interfaces;
|
||||
using StructureHelperCommon.Models.Loggers;
|
||||
using LoaderCalculator.Data.Materials;
|
||||
using StructureHelperLogics.NdmCalculations.Primitives;
|
||||
|
||||
namespace StructureHelperLogics.NdmCalculations.Cracking
|
||||
{
|
||||
internal enum CrackWidthLogicType
|
||||
internal class CrackWidthLogicInputDataFactory : ILogic
|
||||
{
|
||||
SP63
|
||||
}
|
||||
internal static class CrackWidthLogicInputDataFactory
|
||||
{
|
||||
static IStressLogic stressLogic => new StressLogic();
|
||||
public static ICrackWidthLogicInputData GetCrackWidthLogicInputData(CrackWidthLogicType logicType, ICrackWidthSimpleCalculatorInputData inputData)
|
||||
private IStressLogic stressLogic => new StressLogic();
|
||||
|
||||
private const double minimumPsiSFactor = 0.2d;
|
||||
private INdm concreteNdm;
|
||||
private INdm rebarNdm;
|
||||
private StrainTuple strainTupleActual;
|
||||
private double rebarStrainActual;
|
||||
private double concreteStrainActual;
|
||||
private double rebarStressActual;
|
||||
|
||||
public CalcTerms CalcTerm { get; set; }
|
||||
public RebarPrimitive RebarPrimitive { get; set; }
|
||||
public RebarCrackInputData InputData { get; set; }
|
||||
public IShiftTraceLogger? TraceLogger { get; set; }
|
||||
|
||||
public ICrackWidthLogicInputData GetCrackWidthLogicInputData()
|
||||
{
|
||||
if (logicType == CrackWidthLogicType.SP63)
|
||||
GetNdms();
|
||||
CrackWidthLogicInputDataSP63 data = new();
|
||||
if (CalcTerm == CalcTerms.LongTerm)
|
||||
{
|
||||
CrackWidthLogicInputDataSP63 data = new();
|
||||
ProcessBaseProps(inputData, data);
|
||||
if (inputData.CalcTerm == CalcTerms.LongTerm) { data.TermFactor = 1.4d; }
|
||||
else { data.TermFactor = 1d; }
|
||||
data.PsiSFactor = inputData.PsiSFactor;
|
||||
data.StressStateFactor = inputData.StressState is SectionStressStates.Tension ? 1.2d : 1.0d;
|
||||
data.BondFactor = 0.5;
|
||||
return data;
|
||||
data.TermFactor = 1.4d;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknown);
|
||||
data.TermFactor = 1d;
|
||||
}
|
||||
|
||||
data.PsiSFactor = GetPsiSFactor(InputData.ForceTuple, InputData.NdmCollection);
|
||||
data.StressStateFactor = 1.0d;
|
||||
data.BondFactor = 0.5d;
|
||||
data.Length = InputData.Length;
|
||||
data.ConcreteStrain = concreteStrainActual;
|
||||
data.RebarStrain = rebarStrainActual;
|
||||
return data;
|
||||
}
|
||||
|
||||
private static void ProcessBaseProps(ICrackWidthSimpleCalculatorInputData inputData, ICrackWidthLogicInputData data)
|
||||
private void GetNdms()
|
||||
{
|
||||
var strainMatrix = TupleConverter.ConvertToLoaderStrainMatrix(inputData.StrainTuple);
|
||||
var triangulationOptions = new TriangulationOptions { LimiteState = LimitStates.SLS, CalcTerm = inputData.CalcTerm };
|
||||
var ndms = inputData.RebarPrimitive.GetNdms(triangulationOptions).ToArray();
|
||||
var concreteNdm = ndms[0];
|
||||
var rebarNdm = ndms[1];
|
||||
data.ConcreteStrain = concreteNdm.Prestrain;// stressLogic.GetTotalStrain(strainMatrix, concreteNdm) - stressLogic.GetTotalStrainWithPresrain(strainMatrix, concreteNdm);
|
||||
data.RebarStrain = stressLogic.GetTotalStrainWithPrestrain(strainMatrix, rebarNdm);
|
||||
data.Length = inputData.Length;
|
||||
var options = new TriangulationOptions()
|
||||
{
|
||||
CalcTerm = CalcTerms.ShortTerm,
|
||||
LimiteState = LimitStates.SLS,
|
||||
};
|
||||
concreteNdm = RebarPrimitive.GetConcreteNdm(options);
|
||||
concreteNdm.StressScale = 1d;
|
||||
rebarNdm = RebarPrimitive.GetRebarNdm(options);
|
||||
}
|
||||
|
||||
private double GetPsiSFactor(ForceTuple forceTuple, IEnumerable<INdm> ndms)
|
||||
{
|
||||
var crackResult = calculateCrackTuples(forceTuple, ndms);
|
||||
strainTupleActual = CalcStrainMatrix(forceTuple, ndms);
|
||||
rebarStrainActual = stressLogic.GetTotalStrain(TupleConverter.ConvertToLoaderStrainMatrix(strainTupleActual), rebarNdm);
|
||||
TraceLogger?.AddMessage($"Actual strain of rebar EpsilonS = {rebarStrainActual}(dimensionless)");
|
||||
concreteStrainActual = concreteNdm.Prestrain;
|
||||
//concreteStrainActual = stressLogic.GetTotalStrain(TupleConverter.ConvertToLoaderStrainMatrix(strainTupleActual), concreteNdm);
|
||||
TraceLogger?.AddMessage($"Actual strain of concrete on the axis of rebar EpsilonC = {concreteStrainActual}(dimensionless");
|
||||
if (crackResult.IsValid == false)
|
||||
{
|
||||
string errorString = LoggerStrings.CalculationError + crackResult.Description;
|
||||
TraceLogger?.AddMessage(errorString, TraceLogStatuses.Error);
|
||||
throw new StructureHelperException(errorString);
|
||||
}
|
||||
if (crackResult.IsSectionCracked == false)
|
||||
{
|
||||
TraceLogger?.AddMessage($"Section is not cracked PsiS = {minimumPsiSFactor}");
|
||||
return minimumPsiSFactor;
|
||||
}
|
||||
if (crackResult.FactorOfCrackAppearance == 0d)
|
||||
{
|
||||
TraceLogger?.AddMessage($"Section is cracked in start force combination, PsiS = 1.0");
|
||||
return 1d;
|
||||
}
|
||||
var strainTupleInCacking = CalcStrainMatrix(crackResult.TupleOfCrackAppearance as ForceTuple, ndms);
|
||||
var stressInCracking = stressLogic.GetStress(TupleConverter.ConvertToLoaderStrainMatrix(strainTupleInCacking), rebarNdm);
|
||||
TraceLogger?.AddMessage($"Stress in rebar immediately after cracing Sigma,scrc = {stressInCracking}(Pa)");
|
||||
rebarStressActual = stressLogic.GetStress(TupleConverter.ConvertToLoaderStrainMatrix(strainTupleActual), rebarNdm);
|
||||
TraceLogger?.AddMessage($"Actual stress in rebar Sigma,s = {rebarStressActual}(Pa)");
|
||||
var stressRatio = stressInCracking / rebarStressActual;
|
||||
var logic = new ExpSofteningLogic()
|
||||
{
|
||||
ForceRatio = stressRatio,
|
||||
PsiSMin = minimumPsiSFactor,
|
||||
PowerFactor = 1d,
|
||||
BettaFactor = 0.8d,
|
||||
TraceLogger = TraceLogger?.GetSimilarTraceLogger(50)
|
||||
};
|
||||
double psiS = logic.GetSofteningFactor();
|
||||
TraceLogger?.AddMessage($"PsiS = {psiS}");
|
||||
return psiS;
|
||||
}
|
||||
|
||||
private CrackForceResult calculateCrackTuples(ForceTuple forceTuple, IEnumerable<INdm> ndms)
|
||||
{
|
||||
var sectionCrackedLogic = new SectionCrackedLogic()
|
||||
{
|
||||
NdmCollection = ndms,
|
||||
CheckedNdmCollection = new List<INdm>() { concreteNdm },
|
||||
TraceLogger = TraceLogger?.GetSimilarTraceLogger(100)
|
||||
};
|
||||
var crackedLogis = new CrackedLogic(sectionCrackedLogic)
|
||||
{
|
||||
StartTuple = new ForceTuple(),
|
||||
EndTuple = forceTuple,
|
||||
TraceLogger = TraceLogger?.GetSimilarTraceLogger(100)
|
||||
};
|
||||
var calculator = new CrackForceCalculator(crackedLogis)
|
||||
{
|
||||
NdmCollection = ndms,
|
||||
EndTuple = forceTuple,
|
||||
TraceLogger = TraceLogger?.GetSimilarTraceLogger(150)
|
||||
};
|
||||
calculator.Run();
|
||||
return calculator.Result as CrackForceResult;
|
||||
}
|
||||
|
||||
private StrainTuple CalcStrainMatrix(ForceTuple forceTuple, IEnumerable<INdm> ndms)
|
||||
{
|
||||
IForceTupleInputData inputData = new ForceTupleInputData()
|
||||
{
|
||||
NdmCollection = ndms,
|
||||
Tuple = forceTuple
|
||||
};
|
||||
IForceTupleCalculator calculator = new ForceTupleCalculator()
|
||||
{
|
||||
InputData = inputData,
|
||||
TraceLogger = TraceLogger?.GetSimilarTraceLogger(50)
|
||||
};
|
||||
calculator.Run();
|
||||
var forceResult = calculator.Result as IForcesTupleResult;
|
||||
if (forceResult.IsValid == false)
|
||||
{
|
||||
TraceLogger?.AddMessage(LoggerStrings.CalculationError + $": {forceResult.Description}", TraceLogStatuses.Error);
|
||||
throw new StructureHelperException(ErrorStrings.CalculationError);
|
||||
}
|
||||
var strain = TupleConverter.ConvertToStrainTuple(forceResult.LoaderResults.StrainMatrix);
|
||||
return strain;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user