Change curvature calculator

This commit is contained in:
Evgeny Redikultsev
2025-11-29 21:43:00 +05:00
parent 5daa32a954
commit f381229a63
73 changed files with 1361 additions and 406 deletions

View File

@@ -11,18 +11,24 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
{
public class CrackForceBynarySearchCalculator : ICrackForceCalculator
{
private CrackForceResult result;
private IIsSectionCrackedByFactorLogic crackedByFactorLogic;
private ICheckInputDataLogic<ICrackForceCalculatorInputData> checkInputDataLogic;
ExpSofteningLogic softeningLogic = new();
static readonly CrackStrainLogic crackStrainLogic = new();
static readonly SofteningFactorLogic softeningFactorLogic = new();
IForceTupleCalculator forceTupleCalculator;
private CrackForceResult result;
private ExpSofteningLogic softeningLogic = new();
private readonly CrackStrainLogic crackStrainLogic = new();
private readonly SofteningFactorLogic softeningFactorLogic = new();
private IForceTupleCalculator forceTupleCalculator = new ForceTupleCalculator();
private FindParameterCalculator parameterCalculator;
private IForceTupleServiceLogic forceTupleServiceLogic;
private IForceTupleServiceLogic ForceTupleServiceLogic => forceTupleServiceLogic ??= new ForceTupleServiceLogic();
public string Name { get; set; }
public ICrackForceCalculatorInputData InputData { get; set; }
public Accuracy Accuracy { get; set; }
public Accuracy Accuracy { get; set; } = new Accuracy()
{
IterationAccuracy = 0.0001d,
MaxIterationCount = 10000
};
public IResult Result => result;
public IShiftTraceLogger? TraceLogger { get; set; }
@@ -36,15 +42,11 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
{
this.crackedByFactorLogic = crackedByFactorLogic;
this.checkInputDataLogic = checkInputDataLogic;
Accuracy ??= new Accuracy()
{
IterationAccuracy = 0.0001d,
MaxIterationCount = 10000
};
forceTupleCalculator = new ForceTupleCalculator();
InputData = new CrackForceCalculatorInputData();
}
public CrackForceBynarySearchCalculator() : this(new IsSectionCrackedByFactorLogic(), new CheckCrackForceCalculatorInputDataLogic())
public CrackForceBynarySearchCalculator() : this(
new IsSectionCrackedByFactorLogic(),
new CheckCrackForceCalculatorInputDataLogic())
{
}
@@ -54,17 +56,8 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
if (CheckInputData() == false) { return; }
parameterCalculator = new FindParameterCalculator();
parameterCalculator.InputData.Predicate = crackedByFactorLogic.IsSectionCracked;
if (TraceLogger is not null)
{
forceTupleCalculator.TraceLogger = TraceLogger.GetSimilarTraceLogger(100);
parameterCalculator.TraceLogger = TraceLogger.GetSimilarTraceLogger(50);
crackedByFactorLogic.TraceLogger = TraceLogger.GetSimilarTraceLogger(150);
}
TraceLogger?.AddMessage($"Calculator type: {GetType()}", TraceLogStatuses.Service);
TraceLogger?.AddMessage($"Start force combination");
TraceLogger?.AddEntry(new TraceTablesFactory().GetByForceTuple(InputData.StartTuple));
TraceLogger?.AddMessage($"Actual (end) force combination");
TraceLogger?.AddEntry(new TraceTablesFactory().GetByForceTuple(InputData.EndTuple));
SetCalculatorsTraceLoggers();
TraceInputData();
crackedByFactorLogic.IsSectionCrackedByForceLogic = new IsSectionCrackedByForceLogic()
{
CheckedNdmCollection = InputData.CheckedNdmCollection,
@@ -74,24 +67,34 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
crackedByFactorLogic.EndTuple = InputData.EndTuple;
try
{
CheckInputData();
bool IsSectionCrackedInZeroForce = crackedByFactorLogic.IsSectionCracked(0d);
if (IsSectionCrackedInZeroForce == true)
{
TraceLogger?.AddMessage($"Crack is appeared in start force combination", TraceLogStatuses.Warning);
SectionCrackedAtStart();
return;
}
}
catch (Exception ex)
{
result.IsValid = false;
result.Description += ex;
result.Description +="\n" + ex.Message;
return;
}
if (crackedByFactorLogic.IsSectionCracked(0d) == true)
try
{
TraceLogger?.AddMessage($"Crack is appeared in start force combination", TraceLogStatuses.Warning);
SectionCrackedAtStart();
return;
bool isSectionCrackedUndefFullForce = crackedByFactorLogic.IsSectionCracked(1d);
if (isSectionCrackedUndefFullForce == false)
{
TraceLogger?.AddMessage($"Crack is not appeared from actual (end) force combination", TraceLogStatuses.Warning);
SectionIsNotCracked();
return;
}
}
if (crackedByFactorLogic.IsSectionCracked(1d) == false)
catch (Exception ex)
{
TraceLogger?.AddMessage($"Crack is not appeared from actual (end) force combination", TraceLogStatuses.Warning);
SectionIsNotCracked();
result.IsValid = false;
result.Description += "\n" + ex.Message;
return;
}
@@ -109,6 +112,22 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
}
}
private void TraceInputData()
{
TraceLogger?.AddMessage($"Calculator type: {GetType()}", TraceLogStatuses.Service);
TraceLogger?.AddMessage($"Start force combination");
TraceLogger?.AddEntry(new TraceTablesFactory().GetByForceTuple(InputData.StartTuple));
TraceLogger?.AddMessage($"Actual (end) force combination");
TraceLogger?.AddEntry(new TraceTablesFactory().GetByForceTuple(InputData.EndTuple));
}
private void SetCalculatorsTraceLoggers()
{
forceTupleCalculator.TraceLogger = TraceLogger?.GetSimilarTraceLogger(100);
parameterCalculator.TraceLogger = TraceLogger?.GetSimilarTraceLogger(50);
crackedByFactorLogic.TraceLogger = TraceLogger?.GetSimilarTraceLogger(150);
}
private void PrepareNewResult()
{
result = new CrackForceResult();
@@ -125,7 +144,7 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
}
softeningLogic.ForceRatio = factorOfCrackAppearance;
var psiS = softeningLogic.GetSofteningFactor();
var tupleOfCrackApeearence = ForceTupleService.InterpolateTuples(InputData.StartTuple, InputData.EndTuple, factorOfCrackAppearance);
var tupleOfCrackApeearence = ForceTupleServiceLogic.InterpolateTuples(InputData.StartTuple, InputData.EndTuple, factorOfCrackAppearance);
TraceLogger?.AddMessage($"Crack is appeared in force combination");
TraceLogger?.AddEntry(new TraceTablesFactory().GetByForceTuple(tupleOfCrackApeearence));
var reducedStrainTuple = GetReducedStrainTuple(factorOfCrackAppearance, psiS);
@@ -158,7 +177,7 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
private IForceTuple GetReducedStrainTuple(double factorOfCrackAppearance, double softeningFactor)
{
const double notCrackedForceFactor = 0.99d;
var notCrackedForceTuple = ForceTupleService.InterpolateTuples(InputData.StartTuple, InputData.EndTuple, factorOfCrackAppearance * notCrackedForceFactor) as ForceTuple;
var notCrackedForceTuple = ForceTupleServiceLogic.InterpolateTuples(InputData.StartTuple, InputData.EndTuple, factorOfCrackAppearance * notCrackedForceFactor) as ForceTuple;
var crackAppearanceStrainTuple = GetStrainTuple(notCrackedForceTuple);
var actualStrainTuple = GetStrainTuple(InputData.EndTuple);
crackStrainLogic.BeforeCrackingTuple = crackAppearanceStrainTuple;

View File

@@ -1,24 +1,18 @@
using LoaderCalculator.Data.Ndms;
using StructureHelperCommon.Models.Forces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StructureHelperLogics.NdmCalculations.Cracking
{
/// <inheritdoc/>
public class CrackForceCalculatorInputData : ICrackForceCalculatorInputData
{
public IForceTuple StartTuple { get; set; }
public IForceTuple EndTuple { get; set; }
/// <inheritdoc/>
public IForceTuple StartTuple { get; set; } = new ForceTuple();
/// <inheritdoc/>
public IForceTuple EndTuple { get; set; } = new ForceTuple();
/// <inheritdoc/>
public IEnumerable<INdm> CheckedNdmCollection { get; set; }
/// <inheritdoc/>
public IEnumerable<INdm> SectionNdmCollection { get; set; }
public CrackForceCalculatorInputData()
{
StartTuple = new ForceTuple();
EndTuple = new ForceTuple();
}
}
}

View File

@@ -10,13 +10,15 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
{
internal class CrackStrainLogic : ICrackStrainLogic
{
private IForceTupleServiceLogic forceTupleServiceLogic;
private IForceTupleServiceLogic ForceTupleServiceLogic => forceTupleServiceLogic ??= new ForceTupleServiceLogic();
public IForceTuple BeforeCrackingTuple { get; set; }
public IForceTuple AfterCrackingTuple { get; set; }
public double SofteningFactor { get; set; }
public IForceTuple GetCrackedStrainTuple()
{
var strainTuple = ForceTupleService.InterpolateTuples(BeforeCrackingTuple, AfterCrackingTuple, SofteningFactor) as StrainTuple;
var strainTuple = ForceTupleServiceLogic.InterpolateTuples(BeforeCrackingTuple, AfterCrackingTuple, SofteningFactor) as StrainTuple;
return strainTuple;
}
}

View File

@@ -2,14 +2,8 @@
using StructureHelperCommon.Infrastructures.Enums;
using StructureHelperCommon.Models;
using StructureHelperCommon.Models.Loggers;
using StructureHelperLogics.Models.Primitives;
using StructureHelperLogics.NdmCalculations.Primitives;
using StructureHelperLogics.Services.NdmPrimitives;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StructureHelperLogics.NdmCalculations.Cracking
{
@@ -17,29 +11,26 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
public class CrackedSectionTriangulationLogic : ICrackedSectionTriangulationLogic
{
const LimitStates limitState = LimitStates.SLS;
const CalcTerms shortTerm = CalcTerms.ShortTerm;
private ITriangulatePrimitiveLogic triangulateLogic;
private string ndmPrimitiveCountMessage;
public CalcTerms CalcTerm { get; set; }
public IEnumerable<INdmPrimitive> NdmPrimitives { get; private set; }
public IShiftTraceLogger? TraceLogger { get; set; }
public CrackedSectionTriangulationLogic(IEnumerable<INdmPrimitive> ndmPrimitives)
public CrackedSectionTriangulationLogic(IEnumerable<INdmPrimitive> ndmPrimitives, CalcTerms calcTerm)
{
NdmPrimitives = ndmPrimitives;
CalcTerm = calcTerm;
ndmPrimitiveCountMessage = $"Source collection containes {NdmPrimitives.Count()} primitives";
triangulateLogic = new TriangulatePrimitiveLogic
{
Primitives = NdmPrimitives,
LimitState = limitState,
CalcTerm = shortTerm,
CalcTerm = CalcTerm,
TraceLogger = TraceLogger?.GetSimilarTraceLogger(50)
};
}
public CrackedSectionTriangulationLogic()
{
}
/// <inheritdoc/>
public List<INdm> GetNdmCollection()
{
@@ -48,7 +39,7 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
triangulateLogic = new TriangulatePrimitiveLogic()
{
LimitState = limitState,
CalcTerm = shortTerm,
CalcTerm = CalcTerm,
Primitives = NdmPrimitives,
TraceLogger = TraceLogger?.GetSimilarTraceLogger(50)
};
@@ -62,7 +53,7 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
triangulateLogic = new TriangulatePrimitiveLogic(new MeshCrackedConcreteLogic())
{
LimitState = limitState,
CalcTerm = shortTerm,
CalcTerm = CalcTerm,
Primitives = NdmPrimitives,
TraceLogger = TraceLogger?.GetSimilarTraceLogger(50)
};
@@ -95,7 +86,7 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
triangulateLogic = new TriangulatePrimitiveLogic(new MeshElasticLogic())
{
LimitState = limitState,
CalcTerm = shortTerm,
CalcTerm = CalcTerm,
Primitives = NdmPrimitives,
TraceLogger = TraceLogger?.GetSimilarTraceLogger(50)
};

View File

@@ -13,6 +13,8 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
{
public class IsSectionCrackedByFactorLogic : IIsSectionCrackedByFactorLogic
{
private IForceTupleServiceLogic forceTupleServiceLogic;
private IForceTupleServiceLogic ForceTupleServiceLogic => forceTupleServiceLogic ??= new ForceTupleServiceLogic();
public IIsSectionCrackedByForceLogic IsSectionCrackedByForceLogic { get; set; }
public IForceTuple StartTuple { get; set; }
public IForceTuple EndTuple { get; set; }
@@ -31,7 +33,7 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
public bool IsSectionCracked(double factor)
{
IsSectionCrackedByForceLogic.TraceLogger ??= TraceLogger?.GetSimilarTraceLogger(50);
var actualTuple = ForceTupleService.InterpolateTuples(StartTuple, EndTuple, factor);
var actualTuple = ForceTupleServiceLogic.InterpolateTuples(StartTuple, EndTuple, factor);
IsSectionCrackedByForceLogic.ForceTuple = actualTuple;
return IsSectionCrackedByForceLogic.IsSectionCracked();
}

View File

@@ -1,14 +1,8 @@
using LoaderCalculator.Data.Ndms;
using StructureHelper.Models.Materials;
using StructureHelperCommon.Models.Calculators;
using StructureHelperCommon.Infrastructures.Enums;
using StructureHelperCommon.Models.Forces;
using StructureHelperLogics.NdmCalculations.Primitives;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace StructureHelperLogics.NdmCalculations.Cracking
{
@@ -21,10 +15,10 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
this.triangulationLogicLoc = triangulationLogicLoc;
}
public RebarCrackInputDataFactory(TupleCrackInputData inputData) : this (new CrackedSectionTriangulationLogic(inputData.Primitives))
{
//public RebarCrackInputDataFactory(TupleCrackInputData inputData) : this (new CrackedSectionTriangulationLogic(inputData.Primitives))
//{
}
//}
public RebarCrackInputDataFactory()
{
@@ -45,7 +39,7 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
rebarCopy = Rebar.Clone() as RebarNdmPrimitive;
rebarCopy.NdmElement.HeadMaterial = rebarCopy.NdmElement.HeadMaterial.Clone() as IHeadMaterial;
triangulationLogicLoc = new CrackedSectionTriangulationLogic(InputData.Primitives);
triangulationLogicLoc = new CrackedSectionTriangulationLogic(InputData.Primitives, CalcTerms.ShortTerm);
crackableNdmsLoc = triangulationLogicLoc.GetNdmCollection();
crackedNdmsLoc = triangulationLogicLoc.GetCrackedNdmCollection();

View File

@@ -18,10 +18,8 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
{
private const CalcTerms crackingTerm = CalcTerms.ShortTerm;
private const LimitStates crackingLimitState = LimitStates.SLS;
private ILengthBetweenCracksLogic lengthLogic;
private TupleCrackResult result;
private ICrackedSectionTriangulationLogic triangulationLogic;
private ITupleRebarsCrackSolver solver;
private List<IRebarNdmPrimitive>? rebarPrimitives;
private IEnumerable<INdm> crackableNdms;
private IEnumerable<INdm> crackedNdms;
@@ -32,6 +30,11 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
private double longLength;
private double shortLength;
private ICheckInputDataLogic<TupleCrackInputData> checkInputDataLogic;
private ILengthBetweenCracksLogic lengthLogic;
private ITupleRebarsCrackSolver crackSolver;
private ICheckInputDataLogic<TupleCrackInputData> CheckInputDataLogic => checkInputDataLogic ??= new CheckTupleCalculatorInputDataLogic();
private ILengthBetweenCracksLogic LengthLogic => lengthLogic ??= new LengthBetweenCracksLogicSP63();
private ITupleRebarsCrackSolver CrackSolver => crackSolver ??= new TupleRebarsCrackSolver();
public TupleCrackInputData InputData { get; set; }
public IResult Result => result;
@@ -46,16 +49,10 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
this.checkInputDataLogic = checkInputDataLogic;
this.lengthLogic = lengthLogic;
this.triangulationLogic = triangulationLogic;
this.solver = solver;
this.crackSolver = solver;
}
public TupleCrackCalculator() : this (new CheckTupleCalculatorInputDataLogic(),
new LengthBetweenCracksLogicSP63(),
new CrackedSectionTriangulationLogic(),
new TupleRebarsCrackSolver())
{
}
public TupleCrackCalculator() { }
public void Run()
{
@@ -139,19 +136,19 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
private void SolveRebarResult()
{
result.RebarResults.Clear();
solver.Rebars = rebarPrimitives;
solver.InputData = InputData;
solver.LongLength = longLength;
solver.ShortLength = shortLength;
solver.TraceLogger = TraceLogger?.GetSimilarTraceLogger(0);
solver.Run();
if (solver.IsResultValid == false)
CrackSolver.Rebars = rebarPrimitives;
CrackSolver.InputData = InputData;
CrackSolver.LongLength = longLength;
CrackSolver.ShortLength = shortLength;
CrackSolver.TraceLogger = TraceLogger?.GetSimilarTraceLogger(0);
CrackSolver.Run();
if (CrackSolver.IsResultValid == false)
{
result.IsValid = false;
result.Description += solver.Description;
result.Description += CrackSolver.Description;
return;
}
result.RebarResults.AddRange(solver.Result);
result.RebarResults.AddRange(CrackSolver.Result);
}
private StrainTuple CalcStrainMatrix(ForceTuple forceTuple, IEnumerable<INdm> ndms)
@@ -181,15 +178,15 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
private double GetLengthBetweenCracks(StrainTuple strainTuple)
{
lengthLogic.NdmCollection = elasticNdms;
lengthLogic.TraceLogger = TraceLogger;
lengthLogic.StrainMatrix = ForceTupleConverter.ConvertToLoaderStrainMatrix(strainTuple);
return lengthLogic.GetLength();
LengthLogic.NdmCollection = elasticNdms;
LengthLogic.TraceLogger = TraceLogger;
LengthLogic.StrainMatrix = ForceTupleConverter.ConvertToLoaderStrainMatrix(strainTuple);
return LengthLogic.GetLength();
}
private void Triangulate()
{
triangulationLogic = new CrackedSectionTriangulationLogic(InputData.Primitives)
triangulationLogic = new CrackedSectionTriangulationLogic(InputData.Primitives, crackingTerm)
{
//TraceLogger = TraceLogger?.GetSimilarTraceLogger(50)
};
@@ -201,12 +198,12 @@ namespace StructureHelperLogics.NdmCalculations.Cracking
private bool CheckInputData()
{
checkInputDataLogic.InputData = InputData;
if (checkInputDataLogic.Check() == false)
CheckInputDataLogic.InputData = InputData;
if (CheckInputDataLogic.Check() == false)
{
result.IsValid = false;
result.Description += checkInputDataLogic.CheckResult;
TraceLogger?.AddMessage($"Input data is not correct: {checkInputDataLogic.CheckResult}", TraceLogStatuses.Error);
result.Description += CheckInputDataLogic.CheckResult;
TraceLogger?.AddMessage($"Input data is not correct: {CheckInputDataLogic.CheckResult}", TraceLogStatuses.Error);
return false;
};
return true;