using AForge;
|
using CodeProvider;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
|
namespace Eptools
|
{
|
|
public class EPAModelInput
|
{
|
public static Dictionary<eType, int> defineEPATypeCode = new Dictionary<eType, int>()
|
{
|
{ eType.press,EpanetBase.Const_class.Const_Node.EN_TANKLEVEL },
|
{ eType.demand,EpanetBase.Const_class.Const_Node.EN_DEMAND },
|
{ eType.level,EpanetBase.Const_class.Const_Node.EN_TANKLEVEL },
|
{ eType.initPumpRS,EpanetBase.Const_class.Const_Link.EN_INITSETTING },
|
{ eType.initSettings,EpanetBase.Const_class.Const_Link.EN_INITSETTING },
|
{ eType.initStatus,EpanetBase.Const_class.Const_Link.EN_INITSTATUS },
|
};
|
public enum eType
|
{
|
/// <summary>
|
/// 绝对压力,单位米水柱
|
/// </summary>
|
press = 0, //绝对压力
|
|
/// <summary>
|
/// 用水量,单位是立方米每小时
|
/// </summary>
|
demand = 1,// 用水量
|
|
|
/// <summary>
|
/// 水池水位,单位是米
|
/// </summary>
|
level = 2,// 水池液位
|
|
|
/// <summary>
|
/// 水泵转速比
|
/// </summary>
|
initPumpRS = 3,// 0 水泵状态0/1还是水泵频率0~1 频率/50 转速/额定转速
|
/// <summary>
|
/// 粗糙度、阀门开度
|
/// </summary>
|
initSettings = 4,
|
/// <summary>
|
/// 开关状态
|
/// </summary>
|
initStatus = 5,// 0 水泵状态0/1还是水泵频率0~1 频率/50 转速/额定转速
|
/// <summary>
|
/// 管径
|
/// </summary>
|
diameter = 6,
|
/// <summary>
|
/// 长度
|
/// </summary>
|
length =7
|
|
|
|
|
|
|
|
}
|
|
/// <summary>
|
/// 结合INP文件,输入要设置的对象的编号
|
/// </summary>
|
public string ObjectID;
|
|
/// <summary>
|
/// 结合INP文件,输入要设置的对象类型,类型包括:
|
/// </summary>
|
public eType Type;
|
|
/// <summary>
|
/// 输入参数的数值
|
/// </summary>
|
public float Value { get; set; }
|
|
|
}
|
[Serializable]
|
public class EPAModelParams
|
{
|
public Guid ID = new Guid();
|
public List<variable> 初始条件 = new List<variable>();
|
public List<variable> 下阶段条件 = new List<variable>();
|
public List<variable> 约束变量 = new List<variable>();
|
public List<variable> 试算变量 = new List<variable>();
|
public List<variable> 变量 = new List<variable>();
|
|
public OBJFunction OFunction;
|
|
}
|
|
[Serializable]
|
public class variable
|
{
|
public int ID;
|
public string modelObjectID;
|
public string Name;
|
public int modelIndex;
|
public int ParentID;
|
public bool isNode;
|
public bool? isOutput;
|
public dynamic Type;
|
public dynamic resultType;
|
public double value;
|
public double initValue;
|
public double resultValue;
|
public DRange doubleRange;
|
public double? accuracy;
|
public string DEFINEVALUE;
|
public string expressType;
|
public int ObjType;
|
|
|
}
|
[Serializable]
|
public class DRange
|
{
|
private double min;
|
|
private double max;
|
|
public double Min
|
{
|
get
|
{
|
return min;
|
}
|
set
|
{
|
min = value;
|
}
|
}
|
|
public double Max
|
{
|
get
|
{
|
return max;
|
}
|
set
|
{
|
max = value;
|
}
|
}
|
|
public double Length => max - min;
|
|
public DRange(double min, double max)
|
{
|
this.min = min;
|
this.max = max;
|
}
|
|
|
}
|
|
[Serializable]
|
public class OBJFunction
|
{
|
public string Text_origin;
|
public string Text;
|
public string ExpressType;
|
public string Name;
|
/// <summary>
|
/// true:使用表达式模式,false:使用编号模式
|
/// </summary>
|
public bool? isUseExpression = true;
|
public double value;
|
public double DefineValue;
|
public variable variable;
|
public List<variable> paramVariables;
|
public List<double> paramValues;
|
public MyEval eval;
|
|
}
|
|
public class GeneticParams
|
{
|
public List<double> list_BestEnerge;
|
public List<double> list_AvgHz;
|
public List<DRange> ranges;
|
public List<int> DLengths;
|
public List<double?> accuracys;
|
public double[] list_AtemtpArr;
|
|
public int populationSize;
|
public int selectionMethod;
|
public int optimizationMode;
|
public bool showOnlyBest;
|
public int iterations;
|
public double accuracyNum;
|
|
public int num;
|
public double BestOptValue;
|
|
public FinishEvent onFinished;
|
public FinishEvent onError;
|
public FinishEvent onReportProgress;
|
|
}
|
public delegate void FinishEvent(dynamic txt);
|
|
//public event FinishEvent ss;
|
class ResultCombine
|
{
|
public double[] arrayTryValue = null;
|
public double ObjFunctionValue;
|
}
|
|
|
public class EPAModelOutput
|
{
|
public enum ObjType
|
{
|
/// <summary>
|
/// 节点
|
/// </summary>
|
EN_JUNCTION = 0,
|
/// <summary>
|
/// 水库节点
|
/// </summary>
|
EN_RESERVOIR = 1,
|
/// <summary>
|
/// 水池节点
|
/// </summary>
|
EN_TANK = 2,
|
|
|
|
/// <summary>
|
/// 具有止回阀的管道
|
/// </summary>
|
EN_CVPIPE = 10,
|
/// <summary>
|
/// 管道
|
/// </summary>
|
EN_PIPE = 11,
|
|
/// <summary>
|
/// 水泵
|
/// </summary>
|
EN_PUMP = 12,
|
/// <summary>
|
/// 减压阀
|
/// </summary>
|
EN_PRV = 13,
|
/// <summary>
|
/// 稳压阀
|
/// </summary>
|
EN_PSV = 14,
|
/// <summary>
|
/// 压力制动阀
|
/// </summary>
|
EN_PBV = 15,
|
/// <summary>
|
/// 流量控制阀
|
/// </summary>
|
EN_FCV = 16,
|
/// <summary>
|
/// 节流控制阀
|
/// </summary>
|
EN_TCV = 17,
|
/// <summary>
|
/// 常规阀门
|
/// </summary>
|
EN_GPV = 18,
|
}
|
|
public enum eType
|
{
|
/// <summary>
|
/// 绝对水压
|
/// </summary>
|
HEAD = (int)EpanetBase.Const_class.Const_Node.EN_HEAD,//10
|
/// <summary>
|
/// 流量(计算结果,单位立方米每小时,从开始节点流向结束节点为正)
|
/// </summary>
|
FLOW = (int)EpanetBase.Const_class.Const_Link.EN_FLOW,//8
|
/// <summary>
|
/// 流速
|
/// </summary>
|
VELOCITY=(int)EpanetBase.Const_class.Const_Link.EN_VELOCITY,//9
|
/// <summary>
|
/// 能耗
|
/// </summary>
|
EN_ENERGY=(int)EpanetBase.Const_class.Const_Link.EN_ENERGY,//13
|
/// <summary>
|
/// 开关量
|
/// </summary>
|
EN_INITSTATUS = (int)EpanetBase.Const_class.Const_Link.EN_INITSTATUS,//4
|
}
|
|
|
public string ObjectID;
|
public ObjType Type;
|
|
}
|
|
public class EpaModelOutputNode : EPAModelOutput
|
{
|
public class Result
|
{
|
/// <summary>
|
/// 标高
|
/// </summary>
|
public double EN_ELEVATION { get; set; }
|
/// <summary>
|
/// 基本需水量
|
/// </summary>
|
public double EN_BASEDEMAND { get; set; }
|
|
/// <summary>
|
/// 实际需水量
|
/// </summary>
|
public double EN_DEMAND { get; set; }
|
/// <summary>
|
/// 绝对压力(计算结果,单位米水柱)
|
/// </summary>
|
public double EN_HEAD { get; set; }
|
/// <summary>
|
/// 自由压力(计算结果,单位米水柱)
|
/// </summary>
|
public double EN_PRESSURE { get; set; }
|
|
|
}
|
|
|
public int[] Get_list_ValueIndex()
|
{
|
return new int[] { 0, 1, 9, 10, 11 };
|
}
|
|
public void SetValue(int i, float value)
|
{
|
switch (i)
|
{
|
case 0:
|
result.EN_ELEVATION = value;
|
break;
|
case 1:
|
result.EN_BASEDEMAND = value;
|
break;
|
case 9:
|
result.EN_DEMAND = value;
|
break;
|
case 10:
|
result.EN_HEAD = value;
|
break;
|
case 11:
|
result.EN_PRESSURE = value;
|
break;
|
|
|
}
|
}
|
public Result result = new Result();
|
|
}
|
|
public class EpaModelOutputLink : EPAModelOutput
|
{
|
public class Result
|
{
|
/// <summary>
|
/// 直径
|
/// </summary>
|
public double EN_DIAMETER { get; set; }
|
/// <summary>
|
/// 长度
|
/// </summary>
|
public double EN_LENGTH { get; set; }
|
/// <summary>
|
/// 流量(计算结果,单位立方米每小时,从开始节点流向结束节点为正)
|
/// </summary>
|
public double EN_FLOW { get; set; }
|
/// <summary>
|
/// 流速(计算结果,单位米每秒)
|
/// </summary>
|
public double EN_VELOCITY { get; set; }
|
/// <summary>
|
/// 水头损失(计算结果,如果是水泵,则表示提升水头,值为负)
|
/// </summary>
|
public double EN_HEADLOSS { get; set; }
|
/// <summary>
|
/// 实际管段状态(0关1开)
|
/// </summary>
|
public double EN_STATUS { get; set; }
|
/// <summary>
|
/// 实际水泵转速比(计算结果,转换为Hz一般乘以50)
|
/// </summary>
|
public double EN_SETTING { get; set; }
|
/// <summary>
|
/// 消耗能量(计算结果,千瓦)
|
/// </summary>
|
public double EN_ENERGY { get; set; }
|
|
|
|
}
|
|
public int[] Get_list_ValueIndex()
|
{
|
return new int[] { 0, 1, 8, 9, 10, 11, 12, 13 };
|
}
|
public void SetValue(int i, float value)
|
{
|
switch (i)
|
{
|
case 0:
|
result.EN_DIAMETER = value;
|
break;
|
case 1:
|
result.EN_LENGTH = value;
|
break;
|
|
case 8:
|
result.EN_FLOW = value;
|
break;
|
case 9:
|
result.EN_VELOCITY = value;
|
break;
|
case 10:
|
result.EN_HEADLOSS = value;
|
break;
|
case 11:
|
result.EN_STATUS = value;
|
break;
|
case 12:
|
result.EN_SETTING = value;
|
break;
|
case 13:
|
result.EN_ENERGY = value;
|
break;
|
|
|
}
|
}
|
public Result result = new Result();
|
}
|
|
|
public class Quene
|
{
|
public static Dictionary<Guid, double?> ResultDictionary;
|
public static List<calcParam> MissionQuene;
|
public static DateTime ScadaTime;
|
public static EPAModelParams Params;
|
}
|
public class calcParam
|
{
|
|
public double[] vars;
|
public Guid ID;
|
}
|
|
public class TimePoint
|
{
|
public DateTime ValueTime { get; set; }
|
public string TagName { get; set; }
|
public double Value { get; set; }
|
}
|
public class Factory
|
{
|
public int ID { get; set; }
|
public double Value { get; set; }
|
}
|
public class WdnmoParam
|
{
|
public int type { get; set; }
|
public List<TimePoint> TimeLine { get; set; }
|
public List<Factory> Factories { get; set; }
|
public List<DataConfig> DataConfigs { get; set; }
|
|
public List<FactoryDefine> FactoryDefines { get; set; }
|
public List<ResultPoint> ResultPoints { get; set; }
|
|
}
|
|
|
public class DataConfig
|
{
|
public int type { get; set; }
|
public string ConfigPath { get; set; }
|
public string ModelPath { get; set; }
|
}
|
|
|
|
|
public class ResultPoint
|
{
|
public string Key { get; set; }
|
public double Value { get; set; }
|
}
|
|
public class FactoryDefine
|
{
|
public string ID { get; set; }
|
public string ModelObjectID { get; set; }
|
}
|
}
|