Files
StructureHelper/StructureHelperLogics/NdmCalculations/Buckling/PhiLogicSP63.cs

68 lines
3.0 KiB
C#

using StructureHelperCommon.Models;
using StructureHelperCommon.Models.Forces;
using StructureHelperCommon.Models.Loggers;
using StructureHelperCommon.Models.Shapes;
using StructureHelperCommon.Services.Forces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StructureHelperLogics.NdmCalculations.Buckling
{
public class PhiLogicSP63 : IConcretePhiLLogic
{
private const double maxValueOfPhiL = 2d;
private const double minValueOfPhiL = 1d;
readonly IForceTuple fullForceTuple;
readonly IForceTuple longForceTuple;
readonly IPoint2D point;
public PhiLogicSP63(IForceTuple fullForceTuple, IForceTuple longForceTuple, IPoint2D point)
{
this.fullForceTuple = fullForceTuple;
this.longForceTuple = longForceTuple;
this.point = point;
}
public IShiftTraceLogger? TraceLogger { get; set; }
public double GetPhil()
{
TraceLogger?.AddMessage(LoggerStrings.CalculatorType(this), TraceLogStatuses.Service);
var distance = Math.Sqrt(point.X * point.X + point.Y * point.Y);
string distMessage = string.Format("Distance = Sqrt(dX ^2 + dY^2) = Sqrt(({0})^2 + ({1})^2) = {2}, m", point.X, point.Y, distance);
TraceLogger?.AddMessage(distMessage);
var fullMoment = GetMoment(fullForceTuple, distance);
string fullMomentMessage = string.Format("FullMoment = {0}, N*m", fullMoment);
TraceLogger?.AddMessage(fullMomentMessage);
var longMoment = GetMoment(longForceTuple, distance);
string longMomentMessage = string.Format("LongMoment = {0}, N*m", longMoment);
TraceLogger?.AddMessage(longMomentMessage);
if (fullMoment == 0d)
{
return maxValueOfPhiL;
}
var phiL = 1 + longMoment / fullMoment;
string phiLMessage = string.Format("PhiL = 1 + LongMoment / FullMoment = 1+ {0} / {1} = {2}, (dimensionless)", longMoment, fullMoment, phiL);
TraceLogger?.AddMessage(phiLMessage);
TraceLogger?.AddMessage(string.Format("But not less than {0}, and not greater than {1}", minValueOfPhiL, maxValueOfPhiL));
phiL = Math.Max(minValueOfPhiL, phiL);
phiL = Math.Min(maxValueOfPhiL, phiL);
TraceLogger?.AddMessage(string.Format("PhiL = {0}, (dimensionless)", phiL));
return phiL;
}
private double GetMoment(IForceTuple forceTuple, double distance)
{
double nz = Math.Abs(forceTuple.Nz);
double mx = Math.Abs(forceTuple.Mx);
double my = Math.Abs(forceTuple.My);
double moment = nz * distance + mx + my;
string message = string.Format("Moment = Nz * distance + Abs(Mx) + Abs(My) = {0} * {1} + {2} + {3} = {4}, N *m", nz, distance, mx, my, moment);
TraceLogger?.AddMessage(message);
return moment;
}
}
}