Пример #1
0
        private static double GetNodeValue(NodeVariableType type, FieldsMap fmap, AwareStep step, Node node, int index)
        {
            switch (type)
            {
            case NodeVariableType.BASEDEMAND: {
                double dsum = node.Demands.Sum(demand => demand.Base);
                return(fmap.RevertUnit((FieldType)type, dsum));
            }

            case NodeVariableType.ELEVATION:
                return(fmap.RevertUnit((FieldType)type, node.Elevation));

            case NodeVariableType.DEMAND:
                return(step != null?step.GetNodeDemand(index, node, fmap) : 0);

            case NodeVariableType.HEAD:
                return(step != null?step.GetNodeHead(index, node, fmap) : 0);

            case NodeVariableType.INITQUALITY:
                return(fmap.RevertUnit((FieldType)type, node.C0));

            case NodeVariableType.PRESSURE:
                return(step != null?step.GetNodePressure(index, node, fmap) : 0);

            case NodeVariableType.QUALITY:
                return(step != null?step.GetNodeQuality(index) : 0);

            default:
                return(0.0);
            }
        }
Пример #2
0
        private void ComposeValves()
        {
            var valves = _net.Valves.ToArray();

            if (valves.Length == 0)
            {
                return;
            }

            FieldsMap fMap = _net.FieldsMap;

            _writer.WriteStartElement(SectType.VALVES.ToString().ToLower());

            foreach (Valve valve in valves)
            {
                double d  = valve.Diameter;
                double kc = double.IsNaN(valve.Kc) ? 0.0 : valve.Kc;

                switch (valve.Type)
                {
                case LinkType.FCV:
                    kc = fMap.RevertUnit(FieldType.FLOW, kc);
                    break;

                case LinkType.PRV:
                case LinkType.PSV:
                case LinkType.PBV:
                    kc = fMap.RevertUnit(FieldType.PRESSURE, kc);
                    break;
                }

                double km = valve.Km * Math.Pow(d, 4) / 0.02517;

                _writer.WriteStartElement("link");
                _writer.WriteAttributeString("name", valve.Name);
                _writer.WriteAttributeString("node1", valve.FirstNode.Name);
                _writer.WriteAttributeString("node2", valve.SecondNode.Name);
                _writer.WriteAttributeString("diameter", XmlConvert.ToString(fMap.RevertUnit(FieldType.DIAM, d)));
                _writer.WriteAttributeString("type", valve.Type.ParseStr());

                if (valve.Type == LinkType.GPV && valve.Curve != null)
                {
                    _writer.WriteAttributeString("setting", valve.Curve.Name);
                }
                else
                {
                    _writer.WriteAttributeString("setting", XmlConvert.ToString(kc));
                }

                _writer.WriteAttributeString("minorloss", XmlConvert.ToString(km));

                ComposeElement(valve);
                ComposeVertices(valve);

                _writer.WriteEndElement();
            }

            _writer.WriteEndElement();
        }
Пример #3
0
        private void ComposePipes()
        {
            var pipes = _net.Links.Where(x => x.Type == LinkType.PIPE || x.Type == LinkType.CV).ToArray();

            if (pipes.Length == 0)
            {
                return;
            }

            FieldsMap fMap = _net.FieldsMap;

            _writer.WriteStartElement(SectType.PIPES.ToString().ToLower());

            foreach (Link link in pipes)
            {
                double d  = link.Diameter;
                double kc = link.Kc;
                if (_net.FormFlag == FormType.DW)
                {
                    kc = fMap.RevertUnit(FieldType.ELEV, kc * 1000.0);
                }

                double km = link.Km * Math.Pow(d, 4.0) / 0.02517;

                _writer.WriteStartElement("link");
                _writer.WriteAttributeString("name", link.Name);
                _writer.WriteAttributeString("node1", link.FirstNode.Name);
                _writer.WriteAttributeString("node2", link.SecondNode.Name);
                _writer.WriteAttributeString("length", XmlConvert.ToString(fMap.RevertUnit(FieldType.LENGTH, link.Lenght)));
                _writer.WriteAttributeString("diameter", XmlConvert.ToString(fMap.RevertUnit(FieldType.DIAM, d)));
                _writer.WriteAttributeString("roughness", XmlConvert.ToString(kc));
                _writer.WriteAttributeString("minorloss", XmlConvert.ToString(km));

                if (link.Type == LinkType.CV)
                {
                    _writer.WriteAttributeString("status", LinkType.CV.ToString());
                }
                else if (link.Status == StatType.CLOSED)
                {
                    _writer.WriteAttributeString("status", StatType.CLOSED.ToString());
                }
                else if (link.Status == StatType.OPEN)
                {
                    _writer.WriteAttributeString("status", StatType.OPEN.ToString());
                }

                ComposeVertices(link);

                ComposeElement(link);

                _writer.WriteEndElement();
            }

            _writer.WriteEndElement();
        }
Пример #4
0
        public float ENgetnodevalue(int index, int code)
        {
            double v;

            FieldsMap fMap = _net.FieldsMap;

            if (index <= 0 || index > _nodes.Count)
            {
                return(203);
            }

            Tank tank;

            switch (code)
            {
            case EN_INITVOLUME:
                v    = 0.0;
                tank = _nodes[index - 1] as Tank;
                if (tank != null)
                {
                    v = fMap.RevertUnit(FieldType.VOLUME, tank.V0);
                }
                break;

            case EN_MIXMODEL:
                v    = (double)Enums.MixType.MIX1;
                tank = _nodes[index - 1] as Tank;
                if (tank != null)
                {
                    v = (double)tank.MixModel;
                }
                break;


            case EN_MIXZONEVOL:
                v    = 0.0;
                tank = _nodes[index - 1] as Tank;
                if (tank != null)
                {
                    v = fMap.RevertUnit(FieldType.VOLUME, tank.V1Max);
                }
                break;

            default:
                throw new ENException(ErrorCode.Err251);
            }
            return((float)v);
        }
Пример #5
0
        private void ComposeReservoirs(Network net)
        {
            FieldsMap fMap = net.FieldsMap;

            if (!net.Reservoirs.Any())
            {
                return;
            }

            buffer.WriteLine(SectType.RESERVOIRS.ParseStr());
            buffer.WriteLine(RESERVOIRS_SUBTITLE);

            foreach (Tank tank in net.Reservoirs)
            {
                buffer.Write(" {0}\t{1}", tank.Name, fMap.RevertUnit(FieldType.ELEV, tank.Elevation));


                if (tank.Pattern != null)
                {
                    buffer.Write("\t{0}", tank.Pattern.Name);
                }


                if (!string.IsNullOrEmpty(tank.Comment))
                {
                    buffer.Write("\t;" + tank.Comment);
                }

                buffer.WriteLine();
            }

            buffer.WriteLine();
        }
Пример #6
0
        private void ComposeQuality()
        {
            FieldsMap fmap = _net.FieldsMap;

            if (_net.Nodes.Count == 0)
            {
                return;
            }

            _writer.WriteStartElement(SectType.QUALITY.ToString().ToLower());

            foreach (Node node in _net.Nodes)
            {
                if (node.C0 == 0.0)
                {
                    continue;
                }

                _writer.WriteStartElement("node");
                _writer.WriteAttributeString("name", node.Name);
                _writer.WriteAttributeString("value", XmlConvert.ToString(fmap.RevertUnit(FieldType.QUALITY, node.C0)));
                _writer.WriteEndElement();
            }

            _writer.WriteEndElement();
        }
Пример #7
0
        public double GetLinkHeadLoss(int id, Link link, FieldsMap fMap)
        {
            try {
                if (GetLinkFlow(id, link, null) == 0)
                {
                    return(0.0);
                }
                else
                {
                    double hh = _dh[id];
                    if (!(link is Pump))
                    {
                        hh = Math.Abs(hh);
                    }

                    if (link.Type <= LinkType.PIPE)
                    {
                        return(1000 * hh / link.Lenght);
                    }
                    else
                    {
                        return(fMap != null?fMap.RevertUnit(FieldType.HEADLOSS, hh) : hh);
                    }
                }
            }
            catch (ENException) {
                return(0);
            }
        }
Пример #8
0
 public double GetLinkFlow(int id, Link link, FieldsMap fMap)
 {
     try {
         return(fMap != null?fMap.RevertUnit(FieldType.FLOW, _q[id]) : _q[id]);
     }
     catch (ENException) {
         return(0);
     }
 }
Пример #9
0
 public double GetNodeHead(int id, Node node, FieldsMap fMap)
 {
     try {
         return(fMap != null?fMap.RevertUnit(FieldType.HEAD, _h[id]) : _h[id]);
     }
     catch (ENException) {
         return(0);
     }
 }
Пример #10
0
 public double GetNodeDemand(int id, Node node, FieldsMap fMap)
 {
     try {
         return(fMap != null?fMap.RevertUnit(FieldType.DEMAND, _d[id]) : _d[id]);
     }
     catch (ENException) {
         return(0);
     }
 }
Пример #11
0
        public float ENgetlinkvalue(int index, int code)
        {
            FieldsMap fMap = _net.FieldsMap;

            double v;

            if (index <= 0 || index > _links.Count)
            {
                throw new ENException(ErrorCode.Err204);
            }

            var link = _links[index - 1];

            switch (code)
            {
            case EN_DIAMETER:
                v = link is Pump
                    ? 0.0
                    : fMap.RevertUnit(FieldType.DIAM, link.Diameter);
                break;

            case EN_LENGTH:
                v = fMap.RevertUnit(FieldType.ELEV, link.Lenght);
                break;

            case EN_ROUGHNESS:
                if (link.Type <= LinkType.PIPE)
                {
                    v = _net.FormFlag == FormType.DW
                        ? fMap.RevertUnit(FieldType.ELEV, link.Kc * 1000.00)
                        : link.Kc;
                }
                else
                {
                    v = 0.0;
                }
                break;

            default:
                throw new ENException(ErrorCode.Err251);
            }
            return((float)v);
        }
Пример #12
0
        private void ComposeJunctions(Network net)
        {
            FieldsMap fMap = net.FieldsMap;

            if (!net.Junctions.Any())
            {
                return;
            }

            buffer.WriteLine(SectType.JUNCTIONS.ParseStr());
            buffer.WriteLine(JUNCS_SUBTITLE);

            foreach (Node node in net.Junctions)
            {
                buffer.Write(" {0}\t{1}", node.Name, fMap.RevertUnit(FieldType.ELEV, node.Elevation));

                //if(node.getDemand()!=null && node.getDemand().size()>0 && !node.getDemand()[0].getPattern().getId().equals(""))
                //    buffer.write("\t"+node.getDemand()[0].getPattern().getId());

                if (node.Demands.Count > 0)
                {
                    Demand demand = node.Demands[0];
                    buffer.Write("\t{0}", fMap.RevertUnit(FieldType.DEMAND, demand.Base));

                    if (!string.IsNullOrEmpty(demand.pattern.Name) &&
                        !net.DefPatId.Equals(demand.pattern.Name, StringComparison.OrdinalIgnoreCase))
                    {
                        buffer.Write("\t" + demand.pattern.Name);
                    }
                }

                if (!string.IsNullOrEmpty(node.Comment))
                {
                    buffer.Write("\t;" + node.Comment);
                }

                buffer.WriteLine();
            }


            buffer.WriteLine();
        }
Пример #13
0
        public double GetNodePressure(int id, Node node, FieldsMap fMap)
        {
            try {
                double p = (GetNodeHead(id, node, null) - node.Elevation);

                return(fMap != null?fMap.RevertUnit(FieldType.PRESSURE, p) : p);
            }
            catch (ENException) {
                return(0);
            }
        }
Пример #14
0
        private static double GetLinkValue(
            LinkVariableType type,
            FormType formType,
            FieldsMap fmap,
            AwareStep step,
            Link link,
            int index)
        {
            switch (type)
            {
            case LinkVariableType.LENGHT:
                return(fmap.RevertUnit((FieldType)type, link.Lenght));

            case LinkVariableType.DIAMETER:
                return(fmap.RevertUnit((FieldType)type, link.Diameter));

            case LinkVariableType.ROUGHNESS:
                return(link.Type == LinkType.PIPE && formType == FormType.DW
                    ? fmap.RevertUnit(FieldType.DIAM, link.Kc)
                    : link.Kc);

            case LinkVariableType.FLOW:
                return(step != null?Math.Abs(step.GetLinkFlow(index, link, fmap)) : 0);

            case LinkVariableType.VELOCITY:
                return(step != null?Math.Abs(step.GetLinkVelocity(index, link, fmap)) : 0);

            case LinkVariableType.UNITHEADLOSS:
                return(step != null?step.GetLinkHeadLoss(index, link, fmap) : 0);

            case LinkVariableType.FRICTIONFACTOR:
                return(step != null?step.GetLinkFriction(index, link, fmap) : 0);

            case LinkVariableType.QUALITY:
                return(step != null?fmap.RevertUnit((FieldType)type, step.GetLinkAvrQuality(index)) : 0);

            default:
                return(0.0);
            }
        }
Пример #15
0
        public double GetLinkVelocity(int id, Link link, FieldsMap fMap)
        {
            try {
                double v;
                double flow = GetLinkFlow(id, link, null);
                if (link is Pump)
                {
                    v = 0;
                }
                else
                {
                    v = (Math.Abs(flow) / (Math.PI * Math.Pow(link.Diameter, 2) / 4.0));
                }

                return(fMap != null?fMap.RevertUnit(FieldType.VELOCITY, v) : v);
            }
            catch (ENException) {
                return(0);
            }
        }
Пример #16
0
        private void ComposeQuality(Network net)
        {
            FieldsMap fmap = net.FieldsMap;

            if (net.Nodes.Count == 0)
            {
                return;
            }

            buffer.WriteLine(SectType.QUALITY.ParseStr());
            buffer.WriteLine(QUALITY_SUBTITLE);

            foreach (Node node  in  net.Nodes)
            {
                if (node.C0 == 0.0)
                {
                    continue;
                }
                buffer.WriteLine(" {0}\t{1}", node.Name, fmap.RevertUnit(FieldType.QUALITY, node.C0));
            }

            buffer.WriteLine();
        }
Пример #17
0
        public double GetLinkFriction(int id, Link link, FieldsMap fMap)
        {
            try {
                double f;

                double flow = GetLinkFlow(id, link, null);
                if (link.Type <= LinkType.PIPE && Math.Abs(flow) > Constants.TINY)
                {
                    double hh = Math.Abs(_dh[id]);
                    f = 39.725 * hh * Math.Pow(link.Diameter, 5) / link.Lenght /
                        (flow * flow);
                }
                else
                {
                    f = 0;
                }

                return(fMap != null?fMap.RevertUnit(FieldType.FRICTION, f) : f);
            }
            catch (ENException) {
                return(0);
            }
        }
Пример #18
0
        private void ComposeTanks(Network net)
        {
            FieldsMap fMap = net.FieldsMap;

            if (!net.Tanks.Any())
            {
                return;
            }

            buffer.WriteLine(SectType.TANKS.ParseStr());
            buffer.WriteLine(TANK_SUBTITLE);

            foreach (Tank tank in net.Tanks)
            {
                double vmin = tank.Vmin;
                if (Math.Round(vmin / tank.Area) == Math.Round(tank.Hmin - tank.Elevation))
                {
                    vmin = 0;
                }

                buffer.Write(
                    " {0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}",
                    tank.Name,
                    fMap.RevertUnit(FieldType.ELEV, tank.Elevation),
                    fMap.RevertUnit(FieldType.ELEV, tank.H0 - tank.Elevation),
                    fMap.RevertUnit(FieldType.ELEV, tank.Hmin - tank.Elevation),
                    fMap.RevertUnit(FieldType.ELEV, tank.Hmax - tank.Elevation),
                    fMap.RevertUnit(FieldType.ELEV, 2 * Math.Sqrt(tank.Area / Math.PI)),
                    fMap.RevertUnit(FieldType.VOLUME, vmin));

                if (tank.Vcurve != null)
                {
                    buffer.Write(" " + tank.Vcurve.Name);
                }

                if (!string.IsNullOrEmpty(tank.Comment))
                {
                    buffer.Write("\t;" + tank.Comment);
                }
                buffer.WriteLine();
            }

            buffer.WriteLine();
        }
Пример #19
0
        private void ComposeReservoirs()
        {
            if (!_net.Reservoirs.Any())
            {
                return;
            }

            FieldsMap fMap = _net.FieldsMap;

            _writer.WriteStartElement(SectType.RESERVOIRS.ToString().ToLower());

            foreach (Tank r in _net.Reservoirs)
            {
                _writer.WriteStartElement("node");
                _writer.WriteAttributeString("name", r.Name);
                _writer.WriteAttributeString("head", XmlConvert.ToString(fMap.RevertUnit(FieldType.ELEV, r.Elevation)));


                if (r.Pattern != null)
                {
                    _writer.WriteAttributeString("pattern", r.Pattern.Name);
                }

                if (!r.Position.IsInvalid)
                {
                    _writer.WriteAttributeString("x", XmlConvert.ToString(r.Position.X));
                    _writer.WriteAttributeString("y", XmlConvert.ToString(r.Position.Y));
                }

                ComposeElement(r);

                _writer.WriteEndElement();
            }

            _writer.WriteEndElement();
        }
Пример #20
0
        private void ComposeOptions()
        {
            FieldsMap fMap = _net.FieldsMap;

            _writer.WriteStartElement(SectType.OPTIONS.ToString().ToLower());

            WriteOption("units", _net.FlowFlag.ParseStr());
            WriteOption("pressure", _net.PressFlag.ParseStr());
            WriteOption("headloss", _net.FormFlag.ParseStr());

            if (!string.IsNullOrEmpty(_net.DefPatId))
            {
                WriteOption("pattern", _net.DefPatId);
            }

            switch (_net.HydFlag)
            {
            case HydType.USE:
                WriteOption("hydraulics use", _net.HydFname);
                break;

            case HydType.SAVE:
                WriteOption("hydraulics save", _net.HydFname);
                break;
            }

            if (_net.ExtraIter == -1)
            {
                WriteOption("unbalanced stop", "");
            }
            else if (_net.ExtraIter >= 0)
            {
                WriteOption("unbalanced continue", _net.ExtraIter.ToString());
            }

            switch (_net.QualFlag)
            {
            case QualType.CHEM:
                _writer.WriteStartElement("option");
                _writer.WriteAttributeString("name", "quality");
                _writer.WriteAttributeString("value", "chem");
                _writer.WriteAttributeString("chemname", _net.ChemName);
                _writer.WriteAttributeString("chemunits", _net.ChemUnits);
                _writer.WriteEndElement();
                break;

            case QualType.TRACE:
                _writer.WriteStartElement("option");
                _writer.WriteAttributeString("name", "quality");
                _writer.WriteAttributeString("value", "trace");
                _writer.WriteAttributeString("node", _net.TraceNode);
                _writer.WriteEndElement();
                break;

            case QualType.AGE:
                WriteOption("quality", "age");
                break;

            case QualType.NONE:
                WriteOption("quality", "none");
                break;
            }

            WriteOption("demand_multiplier", XmlConvert.ToString(_net.DMult));
            WriteOption("emitter_exponent", XmlConvert.ToString(1.0 / _net.QExp));
            WriteOption("viscosity", XmlConvert.ToString(_net.Viscos / Constants.VISCOS));
            WriteOption("diffusivity", XmlConvert.ToString(_net.Diffus / Constants.DIFFUS));
            WriteOption("specific_gravity", XmlConvert.ToString(_net.SpGrav));
            WriteOption("trials", _net.MaxIter.ToString());
            WriteOption("accuracy", _net.HAcc.ToString(CultureInfo.InvariantCulture));
            WriteOption("tolerance", fMap.RevertUnit(FieldType.QUALITY, _net.Ctol).ToString(CultureInfo.InvariantCulture));
            WriteOption("checkfreq", _net.CheckFreq.ToString());
            WriteOption("maxcheck", _net.MaxCheck.ToString());
            WriteOption("damplimit", _net.DampLimit.ToString(CultureInfo.InvariantCulture));

            ComposeExtraOptions();

            _writer.WriteEndElement();
        }
Пример #21
0
 /// <summary>Get link quality values in user units.</summary>
 /// <param name="id">Link sequential identification number.</param>
 /// <returns>Species concentration, trace or age value in user units.</returns>
 public float GetLinkQuality(int id)
 {
     return((float)fld.RevertUnit(FieldType.QUALITY, linkQ[id]));
 }
Пример #22
0
        private void ComposeControls()
        {
            var       controls = _net.Controls;
            FieldsMap fmap     = _net.FieldsMap;

            if (controls.Count == 0)
            {
                return;
            }

            _writer.WriteStartElement(SectType.CONTROLS.ToString().ToLower());

            foreach (Control control in controls)
            {
                // Check that controlled link exists
                if (control.Link == null)
                {
                    continue;
                }

                _writer.WriteStartElement("control");

                // Get text of control's link status/setting
                if (double.IsNaN(control.Setting))
                {
                    _writer.WriteAttributeString("link", control.Link.Name);
                    _writer.WriteAttributeString("status", control.Status.ToString());
                }
                else
                {
                    double kc = control.Setting;
                    switch (control.Link.Type)
                    {
                    case LinkType.PRV:
                    case LinkType.PSV:
                    case LinkType.PBV:
                        kc = fmap.RevertUnit(FieldType.PRESSURE, kc);
                        break;

                    case LinkType.FCV:
                        kc = fmap.RevertUnit(FieldType.FLOW, kc);
                        break;
                    }

                    _writer.WriteAttributeString("link", control.Link.Name);
                    _writer.WriteAttributeString("status", XmlConvert.ToString(kc));
                }


                switch (control.Type)
                {
                // Print level control
                case ControlType.LOWLEVEL:
                case ControlType.HILEVEL:
                    double kc = control.Grade - control.Node.Elevation;
                    kc = fmap.RevertUnit(control.Node.Type == NodeType.JUNC ? FieldType.PRESSURE : FieldType.HEAD, kc);

                    _writer.WriteAttributeString("type", control.Type.ParseStr());
                    _writer.WriteAttributeString("node", control.Node.Name);
                    _writer.WriteAttributeString("value", XmlConvert.ToString(kc));

                    break;

                case ControlType.TIMER:
                case ControlType.TIMEOFDAY:
                    // Print timer control
                    // Print time-of-day control
                    _writer.WriteAttributeString("type", control.Type.ParseStr());
                    _writer.WriteAttributeString("value", XmlConvert.ToString(control.Time));

                    break;
                }

                _writer.WriteEndElement();
            }

            _writer.WriteEndElement();
        }
Пример #23
0
        /// <summary>Write simulation summary to one worksheet.</summary>
        ///  <param name="inpFile">Hydraulic network file name.</param>
        /// <param name="net">Hydraulic network.</param>
        /// <param name="msxFile">MSX file.</param>
        /// <param name="msx">MSX solver.</param>
        public void WriteSummary(string inpFile, EpanetNetwork net, string msxFile, EpanetMSX msx)
        {
            var sh = _sheet.NewSpreadsheet("Summary");

            try {
                FieldsMap fMap = net.FieldsMap;

                if (net.Title != null)
                {
                    for (int i = 0; i < net.Title.Count && i < 3; i++)
                    {
                        if (!string.IsNullOrEmpty(net.Title[i]))
                        {
                            sh.AddData(
                                net.Title[i].Length > 70
                                ? net.Title[i].Substring(0, 70)
                                : net.Title[i]);
                        }
                    }
                }

                sh.AddData("\n");
                sh.AddData(Text.FMT19, inpFile);
                sh.AddData(Text.FMT20, net.Junctions.Count());

                int nReservoirs = net.Reservoirs.Count();
                int nTanks      = net.Tanks.Count();
                int nValves     = net.Valves.Count();
                int nPumps      = net.Pumps.Count();
                int nPipes      = net.Links.Count - nPumps - nValves;

                sh.AddData(Text.FMT21a, nReservoirs);
                sh.AddData(Text.FMT21b, nTanks);
                sh.AddData(Text.FMT22, nPipes);
                sh.AddData(Text.FMT23, nPumps);
                sh.AddData(Text.FMT24, nValves);
                sh.AddData(Text.FMT25, net.FormFlag.ParseStr());

                sh.AddData(Text.FMT26, net.HStep.GetClockTime());
                sh.AddData(Text.FMT27, net.HAcc);
                sh.AddData(Text.FMT27a, net.CheckFreq);
                sh.AddData(Text.FMT27b, net.MaxCheck);
                sh.AddData(Text.FMT27c, net.DampLimit);
                sh.AddData(Text.FMT28, net.MaxIter);

                switch (net.Duration == 0 ? QualType.NONE : net.QualFlag)
                {
                case QualType.NONE:
                    sh.AddData(Text.FMT29, "None");
                    break;

                case QualType.CHEM:
                    sh.AddData(Text.FMT30, net.ChemName);
                    break;

                case QualType.TRACE:
                    sh.AddData(Text.FMT31, "Trace From Node", net.GetNode(net.TraceNode).Name);
                    break;

                case QualType.AGE:
                    sh.AddData(Text.FMT32, "Age");
                    break;
                }

                if (net.QualFlag != QualType.NONE && net.Duration > 0)
                {
                    sh.AddData(Text.FMT33, "Time Step", net.QStep.GetClockTime());
                    sh.AddData(
                        Text.FMT34,
                        "Tolerance",
                        fMap.RevertUnit(FieldType.QUALITY, net.Ctol),
                        fMap.GetField(FieldType.QUALITY).Units);
                }

                sh.AddData(Text.FMT36, net.SpGrav);
                sh.AddData(Text.FMT37a, net.Viscos / Constants.VISCOS);
                sh.AddData(Text.FMT37b, net.Diffus / Constants.DIFFUS);
                sh.AddData(Text.FMT38, net.DMult);
                sh.AddData(
                    Text.FMT39,
                    fMap.RevertUnit(FieldType.TIME, net.Duration),
                    fMap.GetField(FieldType.TIME).Units);

                if (msxFile != null && msx != null)
                {
                    sh.AddData("");
                    sh.AddData("MSX data file", msxFile);
                    sh.AddData("Species");
                    Species[] spe = msx.Network.Species;
                    for (int i = 1; i < msx.Network.Species.Length; i++)
                    {
                        sh.AddData(spe[i].Id, spe[i].Units);
                    }
                }
            }
            catch (IOException) {}
            catch (ENException e) {
                Debug.Print(e.ToString());
            }
        }
Пример #24
0
        private void ComposePumps()
        {
            var pumps = _net.Pumps.ToArray();

            if (pumps.Length == 0)
            {
                return;
            }

            FieldsMap fMap = _net.FieldsMap;

            _writer.WriteStartElement(SectType.PUMPS.ToString().ToLower());

            foreach (Pump pump in pumps)
            {
                _writer.WriteStartElement("link");
                _writer.WriteAttributeString("name", pump.Name);
                _writer.WriteAttributeString("node1", pump.FirstNode.Name);
                _writer.WriteAttributeString("node2", pump.SecondNode.Name);

                bool oldFormat = false;

                if (pump.Ptype == PumpType.CONST_HP)
                {
                    // Pump has constant power
                    _writer.WriteAttributeString("power", XmlConvert.ToString(pump.Km));
                }
                else if (pump.HCurve != null)
                {
                    // Pump has a head curve
                    _writer.WriteAttributeString("head", pump.HCurve.Name);
                }
                else
                {
                    // Old format used for pump curve
                    _writer.WriteAttributeString("h0", XmlConvert.ToString(fMap.RevertUnit(FieldType.HEAD, -pump.H0)));
                    _writer.WriteAttributeString("h1", XmlConvert.ToString(fMap.RevertUnit(FieldType.HEAD, -pump.H0 - pump.FlowCoefficient * Math.Pow(pump.Q0, pump.N))));
                    _writer.WriteAttributeString("q1", XmlConvert.ToString(fMap.RevertUnit(FieldType.FLOW, pump.Q0)));
                    _writer.WriteAttributeString("h2", XmlConvert.ToString(0.0));
                    _writer.WriteAttributeString("q2", XmlConvert.ToString(fMap.RevertUnit(FieldType.FLOW, pump.Qmax)));

                    oldFormat = true;
                }

                if (!oldFormat)
                {
                    if (pump.UPat != null)
                    {
                        _writer.WriteAttributeString("pattern", pump.UPat.Name);
                    }

                    if (pump.Kc != 1.0)
                    {
                        _writer.WriteAttributeString("speed", XmlConvert.ToString(pump.Kc));
                    }
                }

                ComposeElement(pump);
                ComposeVertices(pump);
                _writer.WriteEndElement();
            }

            _writer.WriteEndElement();
        }
Пример #25
0
        private void ComposePipes(Network net)
        {
            FieldsMap fMap = net.FieldsMap;

            if (net.Links.Count == 0)
            {
                return;
            }

            List <Link> pipes = new List <Link>();

            foreach (Link link  in  net.Links)
            {
                if (link.Type == LinkType.PIPE || link.Type == LinkType.CV)
                {
                    pipes.Add(link);
                }
            }


            buffer.WriteLine(SectType.PIPES.ParseStr());
            buffer.WriteLine(PIPES_SUBTITLE);

            foreach (Link link  in  pipes)
            {
                double d  = link.Diameter;
                double kc = link.Kc;
                if (net.FormFlag == FormType.DW)
                {
                    kc = fMap.RevertUnit(FieldType.ELEV, kc * 1000.0);
                }

                double km = link.Km * Math.Pow(d, 4.0) / 0.02517;

                buffer.Write(
                    " {0}\t{1}\t{2}\t{3}\t{4}",
                    link.Name,
                    link.FirstNode.Name,
                    link.SecondNode.Name,
                    fMap.RevertUnit(FieldType.LENGTH, link.Lenght),
                    fMap.RevertUnit(FieldType.DIAM, d));

                // if (net.FormFlag == FormType.DW)
                buffer.Write(" {0}\t{1}", kc, km);

                if (link.Type == LinkType.CV)
                {
                    buffer.Write(" CV");
                }
                else if (link.Status == StatType.CLOSED)
                {
                    buffer.Write(" CLOSED");
                }
                else if (link.Status == StatType.OPEN)
                {
                    buffer.Write(" OPEN");
                }

                if (!string.IsNullOrEmpty(link.Comment))
                {
                    buffer.Write("\t;" + link.Comment);
                }

                buffer.WriteLine();
            }

            buffer.WriteLine();
        }
Пример #26
0
        private void ComposeTanks()
        {
            if (!_net.Tanks.Any())
            {
                return;
            }

            FieldsMap fMap = _net.FieldsMap;

            _writer.WriteStartElement(SectType.TANKS.ToString().ToLower());

            foreach (Tank tank in _net.Tanks)
            {
                double vmin = tank.Vmin;
                if (Math.Round(vmin / tank.Area) == Math.Round(tank.Hmin - tank.Elevation))
                {
                    vmin = 0;
                }

                double elev    = fMap.RevertUnit(FieldType.ELEV, tank.Elevation);
                double initlvl = fMap.RevertUnit(FieldType.ELEV, tank.H0 - tank.Elevation);
                double minlvl  = fMap.RevertUnit(FieldType.ELEV, tank.Hmin - tank.Elevation);
                double maxlvl  = fMap.RevertUnit(FieldType.ELEV, tank.Hmax - tank.Elevation);
                double diam    = fMap.RevertUnit(FieldType.ELEV, 2 * Math.Sqrt(tank.Area / Math.PI));
                double minvol  = fMap.RevertUnit(FieldType.VOLUME, vmin);

                _writer.WriteStartElement("node");
                _writer.WriteAttributeString("name", tank.Name);
                _writer.WriteAttributeString("elevation", XmlConvert.ToString(elev));
                _writer.WriteAttributeString("InitLevel", XmlConvert.ToString(initlvl));
                _writer.WriteAttributeString("MinLevel", XmlConvert.ToString(minlvl));
                _writer.WriteAttributeString("MaxLevel", XmlConvert.ToString(maxlvl));
                _writer.WriteAttributeString("diameter", XmlConvert.ToString(diam));
                _writer.WriteAttributeString("MinVolume", XmlConvert.ToString(minvol));

                if (tank.Vcurve != null)
                {
                    _writer.WriteAttributeString("volcurve", tank.Vcurve.Name);
                }

                if (!tank.Position.IsInvalid)
                {
                    _writer.WriteAttributeString("x", XmlConvert.ToString(tank.Position.X));
                    _writer.WriteAttributeString("y", XmlConvert.ToString(tank.Position.Y));
                }

                if (tank.MixModel != MixType.MIX1)
                {
                    _writer.WriteStartElement(SectType.MIXING.ToString().ToLower());
                    _writer.WriteAttributeString("model", tank.MixModel.ParseStr());
                    if (tank.MixModel == MixType.MIX2)
                    {
                        _writer.WriteAttributeString("compartment", XmlConvert.ToString(tank.V1Max / tank.Vmax));
                    }

                    _writer.WriteEndElement();
                }

                ComposeElement(tank);

                _writer.WriteEndElement();
            }

            _writer.WriteEndElement();
        }
Пример #27
0
        private void ComposeOptions(Network net)
        {
            FieldsMap fMap = net.FieldsMap;

            buffer.WriteLine(SectType.OPTIONS.ParseStr());
            buffer.WriteLine("UNITS               " + net.FlowFlag);
            buffer.WriteLine("PRESSURE            " + net.PressFlag);
            buffer.WriteLine("HEADLOSS            " + net.FormFlag);

            if (!string.IsNullOrEmpty(net.DefPatId))
            {
                buffer.WriteLine("PATTERN             " + net.DefPatId);
            }

            if (net.HydFlag == HydType.USE)
            {
                buffer.WriteLine("HYDRAULICS USE      " + net.HydFname);
            }

            if (net.HydFlag == HydType.SAVE)
            {
                buffer.WriteLine("HYDRAULICS SAVE     " + net.HydFname);
            }

            if (net.ExtraIter == -1)
            {
                buffer.WriteLine("UNBALANCED          STOP");
            }

            if (net.ExtraIter >= 0)
            {
                buffer.WriteLine("UNBALANCED          CONTINUE " + net.ExtraIter);
            }

            switch (net.QualFlag)
            {
            case QualType.CHEM:
                buffer.WriteLine("QUALITY             {0} {1}", net.ChemName, net.ChemUnits);
                break;

            case QualType.TRACE:
                buffer.WriteLine("QUALITY             TRACE " + net.TraceNode);
                break;

            case QualType.AGE:
                buffer.WriteLine("QUALITY             AGE");
                break;

            case QualType.NONE:
                buffer.WriteLine("QUALITY             NONE");
                break;
            }

            buffer.WriteLine("DEMAND MULTIPLIER {0}", net.DMult);
            buffer.WriteLine("EMITTER EXPONENT  {0}", 1.0 / net.QExp);
            buffer.WriteLine("VISCOSITY         {0}", net.Viscos / Constants.VISCOS);
            buffer.WriteLine("DIFFUSIVITY       {0}", net.Diffus / Constants.DIFFUS);
            buffer.WriteLine("SPECIFIC GRAVITY  {0}", net.SpGrav);
            buffer.WriteLine("TRIALS            {0}", net.MaxIter);
            buffer.WriteLine("ACCURACY          {0}", net.HAcc);
            buffer.WriteLine("TOLERANCE         {0}", fMap.RevertUnit(FieldType.QUALITY, net.Ctol));
            buffer.WriteLine("CHECKFREQ         {0}", net.CheckFreq);
            buffer.WriteLine("MAXCHECK          {0}", net.MaxCheck);
            buffer.WriteLine("DAMPLIMIT         {0}", net.DampLimit);
            buffer.WriteLine();
        }
Пример #28
0
        private void ComposePumps(Network net)
        {
            FieldsMap fMap = net.FieldsMap;

            if (!net.Pumps.Any())
            {
                return;
            }

            buffer.WriteLine(SectType.PUMPS.ParseStr());
            buffer.WriteLine(PUMPS_SUBTITLE);

            foreach (Pump pump in net.Pumps)
            {
                buffer.Write(
                    " {0}\t{1}\t{2}",
                    pump.Name,
                    pump.FirstNode.Name,
                    pump.SecondNode.Name);


                // Pump has constant power
                if (pump.Ptype == PumpType.CONST_HP)
                {
                    buffer.Write(" POWER " + pump.Km);
                }
                // Pump has a head curve
                else if (pump.HCurve != null)
                {
                    buffer.Write(" HEAD " + pump.HCurve.Name);
                }
                // Old format used for pump curve
                else
                {
                    buffer.Write(
                        " {0}\t{1}\t{2}\t0.0\t{3}",
                        fMap.RevertUnit(FieldType.HEAD, -pump.H0),
                        fMap.RevertUnit(
                            FieldType.HEAD,
                            -pump.H0 - pump.FlowCoefficient * Math.Pow(pump.Q0, pump.N)),
                        fMap.RevertUnit(FieldType.FLOW, pump.Q0),
                        fMap.RevertUnit(FieldType.FLOW, pump.Qmax));

                    continue;
                }

                if (pump.UPat != null)
                {
                    buffer.Write(" PATTERN " + pump.UPat.Name);
                }


                if (pump.Kc != 1.0)
                {
                    buffer.Write(" SPEED {0}", pump.Kc);
                }

                if (!string.IsNullOrEmpty(pump.Comment))
                {
                    buffer.Write("\t;" + pump.Comment);
                }

                buffer.WriteLine();
            }

            buffer.WriteLine();
        }
Пример #29
0
        private void ComposeControls(Network net)
        {
            var       controls = net.Controls;
            FieldsMap fmap     = net.FieldsMap;

            if (controls.Count == 0)
            {
                return;
            }

            buffer.WriteLine(SectType.CONTROLS.ParseStr());

            foreach (Control control  in  controls)
            {
                // Check that controlled link exists
                if (control.Link == null)
                {
                    continue;
                }

                // Get text of control's link status/setting
                if (double.IsNaN(control.Setting))
                {
                    buffer.Write(" LINK {0} {1} ", control.Link.Name, control.Status);
                }
                else
                {
                    double kc = control.Setting;
                    switch (control.Link.Type)
                    {
                    case LinkType.PRV:
                    case LinkType.PSV:
                    case LinkType.PBV:
                        kc = fmap.RevertUnit(FieldType.PRESSURE, kc);
                        break;

                    case LinkType.FCV:
                        kc = fmap.RevertUnit(FieldType.FLOW, kc);
                        break;
                    }
                    buffer.Write(" LINK {0} {1} ", control.Link.Name, kc);
                }


                switch (control.Type)
                {
                // Print level control
                case ControlType.LOWLEVEL:
                case ControlType.HILEVEL:
                    double kc = control.Grade - control.Node.Elevation;
                    kc = fmap.RevertUnit(
                        control.Node.Type == NodeType.JUNC
                            ? FieldType.PRESSURE
                            : FieldType.HEAD,
                        kc);

                    buffer.Write(
                        " IF NODE {0} {1} {2}",
                        control.Node.Name,
                        control.Type.ParseStr(),
                        kc);

                    break;

                // Print timer control
                case ControlType.TIMER:
                    buffer.Write(
                        " AT {0} {1} HOURS",
                        ControlType.TIMER.ParseStr(),
                        control.Time / 3600.0f);

                    break;

                // Print time-of-day control
                case ControlType.TIMEOFDAY:
                    buffer.Write(
                        " AT {0} {1}",
                        ControlType.TIMEOFDAY.ParseStr(),
                        control.Time.GetClockTime());

                    break;
                }
                buffer.WriteLine();
            }
            buffer.WriteLine();
        }
Пример #30
0
        private void ComposeValves(Network net)
        {
            FieldsMap fMap = net.FieldsMap;

            if (!net.Valves.Any())
            {
                return;
            }

            buffer.WriteLine(SectType.VALVES.ParseStr());
            buffer.WriteLine(VALVES_SUBTITLE);

            foreach (Valve valve in net.Valves)
            {
                double d  = valve.Diameter;
                double kc = valve.Kc;
                if (double.IsNaN(kc))
                {
                    kc = 0.0;
                }

                switch (valve.Type)
                {
                case LinkType.FCV:
                    kc = fMap.RevertUnit(FieldType.FLOW, kc);
                    break;

                case LinkType.PRV:
                case LinkType.PSV:
                case LinkType.PBV:
                    kc = fMap.RevertUnit(FieldType.PRESSURE, kc);
                    break;
                }

                double km = valve.Km * Math.Pow(d, 4) / 0.02517;

                buffer.Write(
                    " {0}\t{1}\t{2}\t{3}\t{4}",
                    valve.Name,
                    valve.FirstNode.Name,
                    valve.SecondNode.Name,
                    fMap.RevertUnit(FieldType.DIAM, d),
                    valve.Type.ParseStr());

                if (valve.Type == LinkType.GPV && valve.Curve != null)
                {
                    buffer.Write(" {0}\t{1}", valve.Curve.Name, km);
                }
                else
                {
                    buffer.Write(" {0}\t{1}", kc, km);
                }

                if (!string.IsNullOrEmpty(valve.Comment))
                {
                    buffer.Write("\t;" + valve.Comment);
                }

                buffer.WriteLine();
            }
            buffer.WriteLine();
        }