//-----------------------------------------------------------------------
//
// Copyright (c) 2011 Deltares. All rights reserved.
//
// B.S.T.I.M. The
// tom.the@deltares.nl
// 23-06-2011
// Evaluate if uplift occurs
//-----------------------------------------------------------------------
namespace Deltares.Dam.Data
{
using System;
using System.Collections.Generic;
public class UpliftRWEvaluator : RWEvaluator
{
private DikeDrySensitivity dikeDrySensitivity = DikeDrySensitivity.None;
private LoadSituation loadSituation = LoadSituation.Wet;
private HydraulicShortcutType hydraulicShortcutType = HydraulicShortcutType.NoHydraulicShortcut;
public UpliftRWEvaluator()
{
}
public override Enum Evaluate(Location location, SoilGeometry soilGeometry, params Enum[] previousChoices)
{
base.Evaluate(location, soilGeometry, previousChoices);
Dictionary choices = new Dictionary();
foreach (Enum enumValue in previousChoices)
{
if (enumValue != null)
{
choices[enumValue.GetType()] = enumValue;
}
}
dikeDrySensitivity = (DikeDrySensitivity)choices[typeof(DikeDrySensitivity)];
loadSituation = (LoadSituation)choices[typeof(LoadSituation)];
hydraulicShortcutType = (HydraulicShortcutType) choices[typeof (HydraulicShortcutType)];
// determine uplift here
double? upliftFactor = GetLowestUpliftFactor();
UpliftType upliftType = UpliftType.NoUplift;
if (upliftFactor != null)
{
if (upliftFactor.Value < location.ModelFactors.UpliftCriterionStability)
{
return UpliftType.Uplift;
}
}
return upliftType;
}
///
/// Create PL-lines
///
///
private PLLines CreatePLLines()
{
PLLinesCreator plLinesCreator = new PLLinesCreator();
double waterLevel = GetBoezemLevel();
plLinesCreator.WaterLevelRiverHigh = waterLevel;
plLinesCreator.HeadInPLLine2 = location.HeadPL2;
plLinesCreator.HeadInPLLine3 = location.HeadPl3;
plLinesCreator.HeadInPLLine4 = location.HeadPl4;
plLinesCreator.SurfaceLine = location.LocalXZSurfaceLine2;
plLinesCreator.WaterLevelPolder = location.PolderLevel;
plLinesCreator.ModelParametersForPLLines = location.CreateModelParametersForPLLines();
plLinesCreator.SoilProfile = soilGeometry.SoilProfile;
plLinesCreator.SoilGeometry2DName = null;
plLinesCreator.SoilGeometryType = SoilGeometryType.SoilGeometry1D;
plLinesCreator.GaugePLLines = null;
plLinesCreator.Gauges = null;
plLinesCreator.GaugeMissVal = 0.0;
plLinesCreator.IsAdjustPL3AndPL4SoNoUpliftWillOccurEnabled = true; // for stability this must set to true
plLinesCreator.PlLineOffsetBelowDikeTopAtRiver = location.PlLineOffsetBelowDikeTopAtRiver;
plLinesCreator.PlLineOffsetBelowDikeTopAtPolder = location.PlLineOffsetBelowDikeTopAtPolder;
plLinesCreator.SoilBaseDB = null; // soilbase;
plLinesCreator.DikeEmbankmentMaterial = location.GetDikeEmbankmentSoil();
plLinesCreator.IsUseOvenDryUnitWeight = (dikeDrySensitivity == DikeDrySensitivity.Dry);
plLinesCreator.IsHydraulicShortcut = (hydraulicShortcutType == HydraulicShortcutType.HydraulicShortcut);
plLinesCreator.XSoilGeometry2DOrigin = location.XSoilGeometry2DOrigin;
PLLines plLines = plLinesCreator.CreateAllPLLines(location);
return plLines;
}
///
/// Determine boezemlevel according to loadsituation
///
///
private double GetBoezemLevel()
{
double boezemLevel = 0.0;
switch (loadSituation)
{
case LoadSituation.Wet:
boezemLevel = location.BoezemLevelTp;
break;
case LoadSituation.Dry:
boezemLevel = location.BoezemLevelHbp;
break;
}
return boezemLevel;
}
///
/// Determine where lowest uplift factor occurs and the value of that factor
///
///
private double? GetLowestUpliftFactor()
{
UpliftLocationDeterminator upliftLocationDeterminator = new UpliftLocationDeterminator()
{
SurfaceLine = location.LocalXZSurfaceLine2,
SoilProfile = soilGeometry.SoilProfile,
SoilGeometry2DName = null,
SoilBaseDB = null, //soilbase,
DikeEmbankmentMaterial = location.GetDikeEmbankmentSoil(),
PLLines = CreatePLLines(),
IsUseOvenDryUnitWeight = (dikeDrySensitivity == DikeDrySensitivity.Dry),
XSoilGeometry2DOrigin = location.XSoilGeometry2DOrigin
};
UpliftLocationAndResult upliftLocationAndResult = upliftLocationDeterminator.GetLocationAtWithLowestUpliftFactor();
if (upliftLocationAndResult != null)
return upliftLocationAndResult.UpliftFactor;
else
return null;
}
}
}