//-----------------------------------------------------------------------
//
// Copyright (c) 2009 Deltares. All rights reserved.
//
// B.S.T.I.M. The
// tom.the@deltares.nl
// 18-05-2009
// Calculator for Uplift
//-----------------------------------------------------------------------
using System;
using System.Collections.Generic;
using Deltares.Geometry;
using Deltares.Geotechnics.Soils;
using Deltares.Standard;
namespace Deltares.Geotechnics.WaternetCreator
{
public class UpliftCalculator
{
public UpliftCalculator()
{
VolumicWeightOfWater = Physics.UnitWeightOfwater;
UnitWeightSoilEmbankment = null;
IsUseOvenDryUnitWeight = false;
}
public bool IsUseOvenDryUnitWeight { get; set; }
public double VolumicWeightOfWater { get; set; }
public SoilProfile1D SoilProfile { get; set; }
public double TopOfLayerToBeEvaluated { get; set; }
public List PLLines { get; set; }
public double SurfaceLevel { get; set; }
public double PhreaticLevel { get; set; }
public double UpLiftTopLevel { get; set; }
public double? UnitWeightSoilEmbankment { get; set; }
///
///
///
///
///
public double CalculateUpliftFactor(double headOfPLLine)
{
var massCalculator = CreateSoilVolumeMassCalculator();
massCalculator.IsUseOvenDryUnitWeight = IsUseOvenDryUnitWeight;
var mass = massCalculator.Calculate();
var height = headOfPLLine - TopOfLayerToBeEvaluated;
var phreaticPressure = VolumicWeightOfWater*height;
if (phreaticPressure > 0)
{
return mass/phreaticPressure;
}
else
{
return double.MaxValue;
}
}
///
/// Calculate soil extra height to be added to obtain the specified upliftFactor with a given head of PLline
///
///
///
///
/// Required extra height
public double CalculateExtraHeight(double headOfPLLine, double upliftFactor)
{
var massCalculator = CreateSoilVolumeMassCalculator();
var mass = massCalculator.Calculate();
var toplevel = Math.Min(SurfaceLevel, TopOfLayerToBeEvaluated);
var height = headOfPLLine - toplevel;
var phreaticPressure = VolumicWeightOfWater*height;
double requiredExtraMass = upliftFactor*phreaticPressure - mass;
double unitWeightSoil = SoilProfile.Layers[0].Soil.AbovePhreaticLevel;
if (UnitWeightSoilEmbankment != null)
{
unitWeightSoil = UnitWeightSoilEmbankment.Value;
}
if (requiredExtraMass > 0)
{
return requiredExtraMass/unitWeightSoil;
}
else
{
return 0.0;
}
}
///
///
///
///
///
public double CalculateHeadOfPLLine(double upliftFactor)
{
var massCalculator = CreateSoilVolumeMassCalculator();
massCalculator.IsUseOvenDryUnitWeight = IsUseOvenDryUnitWeight;
var massSoils = massCalculator.Calculate();
var massWater = massSoils/(upliftFactor*VolumicWeightOfWater);
return massWater + TopOfLayerToBeEvaluated;
}
///
///
///
///
private SoilVolumeMassCalculator CreateSoilVolumeMassCalculator()
{
return new SoilVolumeMassCalculator
{
PhreaticLevel = PhreaticLevel,
SoilProfile = SoilProfile,
TopOfLayerToBeEvaluated = TopOfLayerToBeEvaluated,
SurfaceLevel = SurfaceLevel,
VolumicWeightOfWater = VolumicWeightOfWater
};
}
}
}