using System;
using System.Collections.Generic;
using System.Diagnostics.Contracts;
using System.Linq;
using Deltares.AssessmentMechanism;
using Deltares.Geotechnics;
using Deltares.Geotechnics.Soils;
using Deltares.Standard;
using Deltares.Standard.Attributes;
using Deltares.Standard.Language;
using Deltares.Standard.Logging;
namespace Deltares.Stability.Calculation2
{
///
/// Calculator of stability inwards for Ringtoets Level 2a
/// Executes a spencer calculation, if evaluation is not correct a LiftVanUp calculation
///
[XmlOldName("Deltares.Ringtoets.StabilityInwardsCalculation")]
public class StabilityInwardsCalculation : AssessmentCalculation
{
internal StabilitySafetyFactorCalculation StabilitySafetyFactorCalculation = new StabilitySafetyFactorCalculation();
// SmoothSlidingPlaneValidator slidingPlaneValidator = new SmoothSlidingPlaneValidator(min, MaxAllowedAngleBetweenSlices);
///
/// Executes the specified location information.
///
/// The location information.
///
public override AssessmentCalculationResult Execute(DikeLocationInfo dikeLocationInfo)
{
Contract.Assume(dikeLocationInfo is StabilityDikeLocationInfo);
LogManager.Messages.Clear();
var stabilityDikeLocationInfo = (StabilityDikeLocationInfo) dikeLocationInfo;
ApplySettings(stabilityDikeLocationInfo);
SlidingCurve resultCurve = null;
switch (stabilityDikeLocationInfo.StabilityMethod)
{
case StabilityMethod.Bishop:
resultCurve = RunBishop(stabilityDikeLocationInfo);
break;
case StabilityMethod.Spencer:
resultCurve = RunSpencer(stabilityDikeLocationInfo);
break;
case StabilityMethod.UpliftVan:
resultCurve = RunUpliftVan(stabilityDikeLocationInfo);
break;
case StabilityMethod.SpencerUpliftVan:
resultCurve = RunSpencerUpliftVan(stabilityDikeLocationInfo);
break;
default:
throw new NotImplementedException(String.Format("Modeloption {0} not implemented", stabilityDikeLocationInfo.StabilityModel.ModelOption));
}
var result = new StabilityAssessmentCalculationResult
{
FactorOfSafety = resultCurve != null ? CalculateFactorOfSafetyBasedOnModelUncertainty(stabilityDikeLocationInfo.Settings.ModelUncertaintyParameter, resultCurve) : double.NaN,
ZValue = resultCurve != null ? resultCurve.SafetyFactor - 1 : double.NaN,
Calculated = resultCurve != null,
Curve = resultCurve,
Location = stabilityDikeLocationInfo.StabilityModel.Location,
Waternet = stabilityDikeLocationInfo.StabilityModel.GeotechnicsData.CurrentWaternet
};
result.Approved = resultCurve != null && !double.IsNaN(resultCurve.SafetyFactor) && result.FactorOfSafety >= stabilityDikeLocationInfo.AllowedFailureProbability;
result.Messages.AddRange(LogManager.Messages);
stabilityDikeLocationInfo.SafetyFactor = result.FactorOfSafety;
stabilityDikeLocationInfo.SafetyFactorCorrected = result.FactorOfSafety;
stabilityDikeLocationInfo.StabilityAcceptable = result.Approved;
return result;
}
internal double CalculateFactorOfSafetyBasedOnModelUncertainty(double modelFactor, SlidingCurve resultCurve)
{
Contract.Assume(modelFactor > 0.0);
resultCurve.SafetyFactor = resultCurve.SafetyFactor/modelFactor;
return resultCurve.SafetyFactor;
}
///
/// Set the correct setting for an UpliftVan calculation and executes.
///
/// The stability dike location information.
///
///
internal SlidingCurve RunUpliftVan(StabilityDikeLocationInfo locationInfo)
{
SetUpliftVanSettings(locationInfo);
var result = StabilitySafetyFactorCalculation.Execute(locationInfo);
if (!result.Calculated)
{
LogManager.Add(new LogMessage(LogMessageType.Error, this, LocalizationManager.GetTranslatedText(this, "UpliftVanCalculationError")));
}
return locationInfo.SlidingCurve;
}
///
/// Runs the spencer calculation with high slip planes
///
/// The stability dike location information.
/// Resulting sliding curve
internal SlidingCurve RunSpencerHigh(StabilityDikeLocationInfo locationInfo)
{
Contract.Requires(locationInfo.StabilityModel != null);
Contract.Ensures(Contract.Result() != null);
locationInfo.StabilityModel.SlipPlanePosition = SlipPlanePosition.High;
return RunSpencer(locationInfo);
}
///
/// Runs the spencer calculation with low slip planes
///
/// The stability dike location information.
/// Resulting sliding curve
internal SlidingCurve RunSpencerLow(StabilityDikeLocationInfo locationInfo)
{
Contract.Requires(locationInfo.StabilityModel != null);
Contract.Ensures(Contract.Result() != null);
locationInfo.StabilityModel.SlipPlanePosition = SlipPlanePosition.Low;
return RunSpencer(locationInfo);
}
///
/// Runs the spencer.
///
/// The stability dike location information.
///
internal SlidingCurve RunSpencer(StabilityDikeLocationInfo locationInfo)
{
Contract.Requires(locationInfo.StabilityModel != null);
Contract.Ensures(Contract.Result() != null);
SetSpencerSettings(locationInfo);
//Run
var result = StabilitySafetyFactorCalculation.Execute(locationInfo);
if (!result.Calculated)
{
LogManager.Add(new LogMessage(LogMessageType.Error, this, LocalizationManager.GetTranslatedText(this, "SpencerCalculationError")));
}
return locationInfo.SlidingCurve;
}
private static void ApplySettings(StabilityDikeLocationInfo stabilityDikeLocationInfo)
{
stabilityDikeLocationInfo.ApplySettings();
stabilityDikeLocationInfo.UpdateTrafficLoad();
}
private static void SetUpliftVanSettings(StabilityDikeLocationInfo locationInfo)
{
locationInfo.StabilityModel.CalculationModel = CalculationModel.RTO;
locationInfo.StabilityModel.GridOrientation = GridOrientation.Inwards;
locationInfo.StabilityModel.ModelOption = ModelOptions.UpliftVan;
locationInfo.StabilityModel.SearchAlgorithm = SearchAlgorithm.Grid;
}
///
/// Set the correct setting for a Bishop calculation and executes.
///
/// The stability dike location information.
///
private SlidingCurve RunBishop(StabilityDikeLocationInfo locationInfo)
{
SetBishopSettings(locationInfo);
var result = StabilitySafetyFactorCalculation.Execute(locationInfo);
if (!result.Calculated)
{
LogManager.Add(new LogMessage(LogMessageType.Error, this, LocalizationManager.GetTranslatedText(this, "UpliftVanCalculationError")));
}
return locationInfo.SlidingCurve;
}
private static void SetBishopSettings(StabilityDikeLocationInfo locationInfo)
{
locationInfo.StabilityModel.CalculationModel = CalculationModel.RTO;
locationInfo.StabilityModel.GridOrientation = GridOrientation.Inwards;
locationInfo.StabilityModel.ModelOption = ModelOptions.Bishop;
locationInfo.StabilityModel.SearchAlgorithm = SearchAlgorithm.Grid;
}
///
/// Executes a spencer calculation, if evaluation is not correct a LiftVanUp calculation
///
/// The stability dike location information.
///
private SlidingCurve RunSpencerUpliftVan(StabilityDikeLocationInfo stabilityDikeLocationInfo)
{
SlidingCurve lowCurve = RunSpencerLow(stabilityDikeLocationInfo);
SlidingCurve highCurve = RunSpencerHigh(stabilityDikeLocationInfo);
SlidingCurve upliftVanCurve = null;
if (highCurve == null || lowCurve == null)
{
upliftVanCurve = RunUpliftVan(stabilityDikeLocationInfo);
}
var resultCurves = new List();
if (highCurve != null)
{
resultCurves.Add(highCurve);
}
if (lowCurve != null)
{
resultCurves.Add(lowCurve);
}
if (upliftVanCurve != null)
{
resultCurves.Add(upliftVanCurve);
}
SlidingCurve resultCurve = null;
if (resultCurves.Count > 0)
{
resultCurve = resultCurves.OrderBy(p => p.SafetyFactor).First();
stabilityDikeLocationInfo.StabilityModel.MinimumSafetyCurve = resultCurve;
if (resultCurve == highCurve)
{
SetSpencerSettings(stabilityDikeLocationInfo);
stabilityDikeLocationInfo.StabilityModel.SlipPlanePosition = SlipPlanePosition.High;
}
else if (resultCurve == lowCurve)
{
SetSpencerSettings(stabilityDikeLocationInfo);
stabilityDikeLocationInfo.StabilityModel.SlipPlanePosition = SlipPlanePosition.Low;
}
else if (resultCurve == upliftVanCurve)
{
SetUpliftVanSettings(stabilityDikeLocationInfo);
}
stabilityDikeLocationInfo.StabilityModel.UpdateAutomaticDefinitions();
}
return resultCurve;
}
private static void SetSpencerSettings(StabilityDikeLocationInfo locationInfo)
{
locationInfo.StabilityModel.CalculationModel = CalculationModel.RTO;
locationInfo.StabilityModel.GridOrientation = GridOrientation.Inwards;
locationInfo.StabilityModel.ModelOption = ModelOptions.Spencer;
locationInfo.StabilityModel.SearchAlgorithm = SearchAlgorithm.GeneticAndLevenbergMarquardt;
if (!locationInfo.StabilityModel.SlipPlanes.Any())
{
locationInfo.StabilityModel.SlipPlanes.Add(new SlipPlane());
}
}
}
}