using Deltares.Mathematics; using Deltares.Standard; namespace Deltares.Stability.Calculation2 { public class LevenbergMarquardtSingleCircleCalculation : SlidingCurvesProcessor, IExtremeCalculation { private SlipCircleGrid calculationgrid; private LevenbergMarquardtExtreme levenbergMarquardtExtreme = new LevenbergMarquardtExtreme(); private SlidingCircle minimumSlidingCurve; private SlipCircleTangentLine slipCircleTangentLine; public LevenbergMarquardtSingleCircleCalculation(SlipCircle slipCircle) { calculationgrid = slipCircle.SlipCircleGrid; slipCircleTangentLine = slipCircle.SlipCircleTangentLine; } public override void Initialize(StabilityModel stabilityModel) { base.Initialize(stabilityModel); levenbergMarquardtExtreme.LevenbergMarquardtOptions = stabilityModel.LevenbergMarquardtOptions; levenbergMarquardtExtreme.ParameterCount = 3; levenbergMarquardtExtreme.VariableCount = 3; // Set the bounds for the Levenberg Marquardt; the radius is composed of middle point and tanggeent line levenbergMarquardtExtreme.Parameters[0] = (calculationgrid.GridXLeft + calculationgrid.GridXRight)/2; levenbergMarquardtExtreme.Parameters[1] = (calculationgrid.GridZBottom + calculationgrid.GridZTop)/2; levenbergMarquardtExtreme.Parameters[2] = (slipCircleTangentLine.TangentLineZBottom + slipCircleTangentLine.TangentLineZTop)/2; // 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) { var slidingCircle = new SlidingCircle(); slidingCircle.Center = new Point2D(AParameters[0], AParameters[1]); slidingCircle.Radius = AParameters[1] - AParameters[2]; // Calculation double stabilityFactor = GetSafetyFactor(slidingCircle); if (minimumSlidingCurve == null || stabilityFactor < minimumSlidingCurve.SafetyFactor) { minimumSlidingCurve = slidingCircle; } return stabilityFactor; } } }