Crack Calculator was added
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
using LoaderCalculator.Data.Ndms;
|
||||
using StructureHelperCommon.Infrastructures.Exceptions;
|
||||
using StructureHelperCommon.Models.Calculators;
|
||||
using StructureHelperCommon.Models.Forces;
|
||||
using StructureHelperCommon.Services;
|
||||
using StructureHelperCommon.Services.Forces;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StructureHelperLogics.NdmCalculations.Cracking
|
||||
{
|
||||
public class CrackForceCalculator : ICalculator
|
||||
{
|
||||
static readonly CrackedLogic crackedLogic = new();
|
||||
private CrackForceResult result;
|
||||
|
||||
public string Name { get; set; }
|
||||
public IForceTuple StartTuple { get; set; }
|
||||
public IForceTuple EndTuple { get; set; }
|
||||
public IEnumerable<INdm> NdmCollection { get; set; }
|
||||
public Accuracy Accuracy {get;set; }
|
||||
public IResult Result => result;
|
||||
public CrackForceCalculator()
|
||||
{
|
||||
StartTuple ??= new ForceTuple();
|
||||
Accuracy ??= new Accuracy() { IterationAccuracy = 0.0001d, MaxIterationCount = 10000 };
|
||||
}
|
||||
|
||||
public void Run()
|
||||
{
|
||||
result = new CrackForceResult();
|
||||
crackedLogic.StartTuple = StartTuple;
|
||||
crackedLogic.EndTuple = EndTuple;
|
||||
crackedLogic.NdmCollection = NdmCollection;
|
||||
try
|
||||
{
|
||||
Check();
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
result.IsValid = false;
|
||||
result.Description += ex;
|
||||
return;
|
||||
}
|
||||
if (crackedLogic.IsSectionCracked(0d) == true)
|
||||
{
|
||||
result.IsValid = true;
|
||||
result.ActualFactor = 0d;
|
||||
result.ActualTuple = (IForceTuple)StartTuple.Clone();
|
||||
result.IsSectionCracked = true;
|
||||
result.Description += "Section cracked in start tuple";
|
||||
return;
|
||||
}
|
||||
if (crackedLogic.IsSectionCracked(1d) == false)
|
||||
{
|
||||
result.IsValid = true;
|
||||
result.IsSectionCracked = false;
|
||||
result.Description = "Section is not cracked";
|
||||
return;
|
||||
}
|
||||
var parameterCalculator = new FindParameterCalculator()
|
||||
{
|
||||
Accuracy = Accuracy,
|
||||
Predicate = crackedLogic.IsSectionCracked
|
||||
};
|
||||
parameterCalculator.Run();
|
||||
var paramResult = parameterCalculator.Result as FindParameterResult;
|
||||
if (paramResult.IsValid == true)
|
||||
{
|
||||
result.IsValid = true;
|
||||
result.IsSectionCracked = true;
|
||||
result.Description += paramResult.Description;
|
||||
result.ActualFactor = paramResult.Parameter;
|
||||
result.ActualTuple = ForceTupleService.InterpolateTuples(EndTuple, StartTuple, paramResult.Parameter);
|
||||
}
|
||||
else
|
||||
{
|
||||
result.IsValid = false;
|
||||
result.Description += paramResult.Description;
|
||||
}
|
||||
}
|
||||
|
||||
private void Check()
|
||||
{
|
||||
CheckObject.IsNull(EndTuple);
|
||||
if (StartTuple == EndTuple)
|
||||
{
|
||||
throw new StructureHelperException(ErrorStrings.DataIsInCorrect + ": Section is not cracked");
|
||||
}
|
||||
}
|
||||
|
||||
public object Clone()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
using StructureHelperCommon.Models.Calculators;
|
||||
using StructureHelperCommon.Models.Forces;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StructureHelperLogics.NdmCalculations.Cracking
|
||||
{
|
||||
public class CrackForceResult : IResult
|
||||
{
|
||||
public bool IsValid { get; set; }
|
||||
public string Description { get; set; }
|
||||
public bool IsSectionCracked { get; set; }
|
||||
public double ActualFactor { get; set; }
|
||||
public IForceTuple ActualTuple { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
using LoaderCalculator.Data.Ndms;
|
||||
using StructureHelperCommon.Models.Forces;
|
||||
using StructureHelperCommon.Services.Forces;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StructureHelperLogics.NdmCalculations.Cracking
|
||||
{
|
||||
internal class CrackedLogic : ICrackedLogic
|
||||
{
|
||||
ISectionCrackedLogic sectionCrackedLogic;
|
||||
public IForceTuple StartTuple { get; set; }
|
||||
public IForceTuple EndTuple { get; set; }
|
||||
public IEnumerable<INdm> NdmCollection { get; set; }
|
||||
public CrackedLogic(ISectionCrackedLogic sectionLogic)
|
||||
{
|
||||
sectionCrackedLogic = sectionLogic;
|
||||
}
|
||||
public CrackedLogic() : this (new HoleSectionCrackedLogic())
|
||||
{
|
||||
|
||||
}
|
||||
public bool IsSectionCracked(double factor)
|
||||
{
|
||||
var actualTuple = ForceTupleService.InterpolateTuples(EndTuple, StartTuple, factor);
|
||||
sectionCrackedLogic.Tuple = actualTuple;
|
||||
sectionCrackedLogic.NdmCollection = NdmCollection;
|
||||
return sectionCrackedLogic.IsSectionCracked();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
using StructureHelperCommon.Infrastructures.Exceptions;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StructureHelperLogics.NdmCalculations.Cracking
|
||||
{
|
||||
public class ExponentialSofteningLogic : ICrackSofteningLogic
|
||||
{
|
||||
private double forceRatio;
|
||||
private double powerFactor;
|
||||
|
||||
public double PowerFactor
|
||||
{
|
||||
get => powerFactor;
|
||||
set
|
||||
{
|
||||
if (value < 0)
|
||||
{
|
||||
throw new StructureHelperException(ErrorStrings.DataIsInCorrect + ": Power Factor must not be less than zero");
|
||||
}
|
||||
powerFactor = value;
|
||||
}
|
||||
}
|
||||
public double BettaFactor { get; set; }
|
||||
public double ForceRatio
|
||||
{
|
||||
get => forceRatio;
|
||||
set
|
||||
{
|
||||
if (value < 0)
|
||||
{
|
||||
throw new StructureHelperException(ErrorStrings.DataIsInCorrect + ": Force Ratio must not be less than zero");
|
||||
}
|
||||
else if (value > 1)
|
||||
{
|
||||
throw new StructureHelperException(ErrorStrings.DataIsInCorrect + ": Force Ratio must not be greater than 1.0");
|
||||
}
|
||||
forceRatio = value;
|
||||
}
|
||||
}
|
||||
public double FiMin {get;set;}
|
||||
public ExponentialSofteningLogic()
|
||||
{
|
||||
FiMin = 0.2d;
|
||||
PowerFactor = 2d;
|
||||
BettaFactor = 0.8;
|
||||
}
|
||||
public double SofteningFactor()
|
||||
{
|
||||
double fi;
|
||||
fi = 1 - BettaFactor * Math.Pow(ForceRatio, PowerFactor);
|
||||
fi = Math.Max(fi, FiMin);
|
||||
return fi;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
using LoaderCalculator.Data.Ndms;
|
||||
using LoaderCalculator.Logics;
|
||||
using StructureHelperCommon.Infrastructures.Exceptions;
|
||||
using StructureHelperCommon.Models.Calculators;
|
||||
using StructureHelperCommon.Models.Forces;
|
||||
using StructureHelperLogics.NdmCalculations.Analyses.ByForces;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StructureHelperLogics.NdmCalculations.Cracking
|
||||
{
|
||||
internal class HoleSectionCrackedLogic : ISectionCrackedLogic
|
||||
{
|
||||
static readonly IStressLogic stressLogic = new StressLogic();
|
||||
public IForceTuple Tuple { get; set; }
|
||||
public IEnumerable<INdm> NdmCollection { get; set; }
|
||||
public Accuracy Accuracy { get; set; }
|
||||
public HoleSectionCrackedLogic()
|
||||
{
|
||||
if (Accuracy is null)
|
||||
{
|
||||
Accuracy = new Accuracy() { IterationAccuracy = 0.001d, MaxIterationCount = 10000 };
|
||||
}
|
||||
}
|
||||
public bool IsSectionCracked()
|
||||
{
|
||||
var inputData = new ForceTupleInputData()
|
||||
{
|
||||
Accuracy = Accuracy,
|
||||
Tuple = Tuple,
|
||||
NdmCollection = NdmCollection
|
||||
};
|
||||
var calculator = new ForceTupleCalculator(inputData);
|
||||
calculator.Run();
|
||||
var calcResult = calculator.Result as ForcesTupleResult;
|
||||
if (calcResult.IsValid == false)
|
||||
{
|
||||
throw new StructureHelperException(ErrorStrings.ResultIsNotValid + ": Result of Section Calculation is not valid");
|
||||
}
|
||||
var strainMatrix = calcResult.LoaderResults.ForceStrainPair.StrainMatrix;
|
||||
return stressLogic.IsSectionCracked(strainMatrix, NdmCollection);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StructureHelperLogics.NdmCalculations.Cracking
|
||||
{
|
||||
public interface ICrackSofteningLogic
|
||||
{
|
||||
double SofteningFactor();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +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
|
||||
{
|
||||
internal interface ICrackedLogic
|
||||
{
|
||||
IForceTuple StartTuple { get; set; }
|
||||
IForceTuple EndTuple { get; set; }
|
||||
IEnumerable<INdm> NdmCollection { get; set; }
|
||||
bool IsSectionCracked(double factor);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
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
|
||||
{
|
||||
internal interface ISectionCrackedLogic
|
||||
{
|
||||
IForceTuple Tuple { get; set; }
|
||||
IEnumerable<INdm> NdmCollection { get; set; }
|
||||
bool IsSectionCracked();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user