using Deltares.Mathematics; namespace Deltares.Stability.Calculation2 { internal class LevenbergMarquardtDualCircleCalculation : SlidingCurvesProcessor, IExtremeCalculation { private SlipCircleGrid leftGridActive; private LevenbergMarquardtExtreme levenbergMarquardtExtreme = new LevenbergMarquardtExtreme(); private SlidingCurve minimumSlidingCurve; private SlipCircleGrid rightGridPassive; private SlipCircleTangentLine slipCircleTangentLine; private SlipPlaneUpliftVan slipPlaneUpliftVan; public LevenbergMarquardtDualCircleCalculation(StabilityModel stabilityModel) { slipPlaneUpliftVan = stabilityModel.SlipPlaneUpliftVan; //TODO: check slipPlaneUplift.SlipPlaneLeftGrid or right leftGridActive = slipPlaneUpliftVan.SlipPlaneLeftGrid; rightGridPassive = slipPlaneUpliftVan.SlipPlaneRightGrid; slipCircleTangentLine = stabilityModel.SlipCircle.SlipCircleTangentLine; } public override void Initialize(StabilityModel stabilityModel) { base.Initialize(stabilityModel); levenbergMarquardtExtreme.LevenbergMarquardtOptions = stabilityModel.LevenbergMarquardtOptions; levenbergMarquardtExtreme.ParameterCount = 5; levenbergMarquardtExtreme.VariableCount = 5; // Set the bounds for the Levenberg Marquardt; the radius is composed of middle point and tanggeent line levenbergMarquardtExtreme.Parameters[0] = leftGridActive.GridXLeft; levenbergMarquardtExtreme.Parameters[1] = leftGridActive.GridZBottom; levenbergMarquardtExtreme.Parameters[2] = rightGridPassive.GridXLeft; levenbergMarquardtExtreme.Parameters[3] = rightGridPassive.GridZBottom; levenbergMarquardtExtreme.Parameters[4] = slipCircleTangentLine.TangentLineZBottom; // Communicate the address of the calculation levenbergMarquardtExtreme.LevenbergMarquardtCalculation = this; } public override SlidingCurve Calculate() { minimumSlidingCurve = null; // Determine safety factor levenbergMarquardtExtreme.Calculation(); return minimumSlidingCurve; } public double ComputeExtremeResult(double[] AParameters) { // Create sliding dual circle and pass data var slidingCircle = new SlidingDualCircle(); slidingCircle.ActiveCircle.X = AParameters[0]; slidingCircle.ActiveCircle.Y = AParameters[1]; slidingCircle.PassiveCircle.X = AParameters[2]; slidingCircle.PassiveCircle.Y = AParameters[3]; slidingCircle.TangentLine = AParameters[4]; slidingCircle.LeftCircleIsActive = slipPlaneUpliftVan.SlipPlaneLeftGrid.GridXLeft < slipPlaneUpliftVan.SlipPlaneRightGrid.GridXLeft; double stabilityFactor = GetSafetyFactor(slidingCircle); if (minimumSlidingCurve == null || stabilityFactor < minimumSlidingCurve.SafetyFactor) { minimumSlidingCurve = slidingCircle; } return stabilityFactor; } } }