|
using IStation.Model;
|
using System;
|
using System.Collections.Generic;
|
using System.IO;
|
using System.Linq;
|
|
namespace IStation.Calc
|
{
|
internal partial class ErQuCalcBaseHelper
|
{
|
//长江水位
|
protected List<IStation.Model.TimeWaterLevel> _riverWaterLevels = null;
|
protected DateTime _riverWaterLevelStart;
|
protected DateTime _riverWaterLevelEnd;
|
//
|
protected List<Model.RiverWaterLevelDrop> _listRiverWaterLevelDrop = null;
|
|
protected double GetDropHeightByPumpCount(int openPumpCount)
|
{
|
if (openPumpCount >= 4)
|
{
|
return 2.5;
|
}
|
else if (openPumpCount == 3)
|
{
|
return 1.54;
|
}
|
else if (openPumpCount == 3)
|
{
|
return 0.81;
|
}
|
else if (openPumpCount == 2)
|
{
|
return 0.32;
|
}
|
else
|
{
|
return 0.25;
|
}
|
}
|
|
protected double GetDropHeightByFlow(double totalFlow)
|
{
|
if (totalFlow < _listRiverWaterLevelDrop.Last().Flow)
|
{
|
for (int i = 0; i < _listRiverWaterLevelDrop.Count; i++)
|
{
|
if (totalFlow < _listRiverWaterLevelDrop[i].Flow)
|
{
|
return _listRiverWaterLevelDrop[i].DropHeight;
|
}
|
}
|
}
|
return _listRiverWaterLevelDrop.Last().DropHeight;
|
}
|
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="riverWaterLevels"></param>
|
protected void SetRiverWaterLevels(List<IStation.Model.TimeWaterLevel> riverWaterLevels)
|
{
|
this._riverWaterLevels = riverWaterLevels;
|
if (this._riverWaterLevels != null)
|
{
|
_riverWaterLevelStart = this._riverWaterLevels.First().Time;
|
_riverWaterLevelEnd = this._riverWaterLevels.Last().Time;
|
}
|
}
|
|
|
/// <summary>
|
/// 计算长江水位
|
/// </summary>
|
/// <param name="time"></param>
|
/// <returns></returns>
|
public double GetRiverWaterLevelByTime(DateTime time)
|
{
|
if (this._riverWaterLevels.Count() == 1)
|
return this._riverWaterLevels[0].Level;
|
if (time <= this._riverWaterLevelStart)
|
return this._riverWaterLevels[0].Level;
|
if (time >= this._riverWaterLevelEnd)
|
return this._riverWaterLevels.Last().Level;
|
for (int i = 1; i < this._riverWaterLevels.Count; i++)
|
{
|
if (time <= this._riverWaterLevels[i].Time)
|
{
|
return this._riverWaterLevels[i - 1].Level +
|
(this._riverWaterLevels[i].Level - this._riverWaterLevels[i - 1].Level) * (time - this._riverWaterLevels[i - 1].Time).TotalSeconds
|
/ (this._riverWaterLevels[i].Time - this._riverWaterLevels[i - 1].Time).TotalSeconds;
|
}
|
}
|
return this._riverWaterLevels.Last().Level;
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="riverWaterLevels"></param>
|
/// <param name="time"></param>
|
/// <returns></returns>
|
static public double GetRiverWaterLevelByTime(List<IStation.Model.TimeWaterLevel> riverWaterLevels, DateTime time)
|
{
|
if (riverWaterLevels == null)
|
return 0;
|
if (riverWaterLevels.Count() == 1)
|
return riverWaterLevels[0].Level;
|
if (time <= riverWaterLevels.First().Time)
|
return riverWaterLevels[0].Level;
|
if (time >= riverWaterLevels.Last().Time)
|
return riverWaterLevels.Last().Level;
|
for (int i = 1; i < riverWaterLevels.Count; i++)
|
{
|
if (time <= riverWaterLevels[i].Time)
|
{
|
return riverWaterLevels[i - 1].Level +
|
(riverWaterLevels[i].Level - riverWaterLevels[i - 1].Level) * (time - riverWaterLevels[i - 1].Time).TotalSeconds
|
/ (riverWaterLevels[i].Time - riverWaterLevels[i - 1].Time).TotalSeconds;
|
}
|
}
|
return riverWaterLevels.Last().Level;
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="riverWaterLevels"></param>
|
/// <param name="start_time"></param>
|
/// <param name="end_time"></param>
|
/// <returns></returns>
|
static public List<IStation.Model.TimeWaterLevel> GetRiverWaterLevelByTimeRange(
|
List<IStation.Model.TimeWaterLevel> riverWaterLevels,
|
DateTime start_time, DateTime end_time)
|
{
|
if (start_time >= end_time)
|
return null;
|
List<IStation.Model.TimeWaterLevel> okList = new List<TimeWaterLevel>();
|
okList.Add(
|
new TimeWaterLevel() { Time = start_time, Level = GetRiverWaterLevelByTime(riverWaterLevels, start_time) });
|
for (int i = 0; i < riverWaterLevels.Count; i++)
|
{
|
if (start_time < riverWaterLevels[i].Time && riverWaterLevels[i].Time < end_time)
|
{
|
okList.Add(riverWaterLevels[i]);
|
}
|
}
|
okList.Add(
|
new TimeWaterLevel() { Time = end_time, Level = GetRiverWaterLevelByTime(riverWaterLevels, end_time) });
|
return okList;
|
}
|
|
|
}
|
}
|