コード例 #1
0
        /// <summary>Generate quality report.</summary>
        ///  <param name="qualFile">Name of the quality simulation output file.</param>
        /// <param name="net">Hydraulic network.</param>
        /// <param name="nodes">Show nodes quality flag.</param>
        /// <param name="links">Show links quality flag.</param>
        public void CreateQualReport(string qualFile, EpanetNetwork net, bool nodes, bool links)
        {
            Rtime = 0;

            int reportCount = (int)((net.Duration - net.RStart) / net.RStep) + 1;

            using (QualityReader dseek = new QualityReader(qualFile, net.FieldsMap)) {
                var netNodes = net.Nodes;
                var netLinks = net.Links;

                var nodesHead = new object[dseek.Nodes + 1];
                nodesHead[0] = _sheet.TransposedMode ? "Node/Time" : "Time/Node";
                for (int i = 0; i < netNodes.Count; i++)
                {
                    nodesHead[i + 1] = netNodes[i].Name;
                }

                var linksHead = new object[dseek.Links + 1];
                linksHead[0] = _sheet.TransposedMode ? "Link/Time" : "Time/Link";
                for (int i = 0; i < netLinks.Count; i++)
                {
                    linksHead[i + 1] = netLinks[i].Name;
                }

                var resultSheets = new XlsxWriter.Spreadsheet[HydVariable.Values.Length];

                for (int i = 0; i < QualVariable.Values.Length; i++)
                {
                    var qvar = QualVariable.Values[i];
                    if ((!qvar.isNode || !nodes) && (qvar.isNode || !links))
                    {
                        continue;
                    }

                    resultSheets[i] = _sheet.NewSpreadsheet(qvar.name);
                    resultSheets[i].AddHeader(qvar.isNode ? nodesHead : linksHead);
                }

                var nodeRow = new object[dseek.Nodes + 1];
                var linkRow = new object[dseek.Links + 1];

                using (var qIt = dseek.GetEnumerator())
                    for (long time = net.RStart; time <= net.Duration; time += net.RStep)
                    {
                        if (!qIt.MoveNext())
                        {
                            return;
                        }

                        var step = qIt.Current;
                        if (step == null)
                        {
                            continue;
                        }

                        nodeRow[0] = time.GetClockTime();
                        linkRow[0] = time.GetClockTime();

                        if (resultSheets[(int)QualVariable.Type.Nodes] != null)
                        {
                            for (int i = 0; i < dseek.Nodes; i++)
                            {
                                nodeRow[i + 1] = (double)step.GetNodeQuality(i);
                            }

                            resultSheets[(int)QualVariable.Type.Nodes].AddData(nodeRow);
                        }

                        if (resultSheets[(int)QualVariable.Type.Links] != null)
                        {
                            for (int i = 0; i < dseek.Links; i++)
                            {
                                linkRow[i + 1] = (double)step.GetLinkQuality(i);
                            }

                            resultSheets[(int)QualVariable.Type.Links].AddData(linkRow);
                        }

                        Rtime = time;
                    }
            }
        }
コード例 #2
0
        /// <summary>Generate hydraulic report.</summary>
        ///  <param name="hydBinFile">Name of the hydraulic simulation output file.</param>
        /// <param name="net">Hydraulic network.</param>
        /// <param name="values">Variables report flag.</param>
        public void CreateHydReport(string hydBinFile, EpanetNetwork net, bool[] values)
        {
            Rtime = 0;
            HydraulicReader dseek       = new HydraulicReader(new BinaryReader(File.OpenRead(hydBinFile)));
            int             reportCount = (int)((net.Duration - net.RStart) / net.RStep) + 1;
            var             nodes       = net.Nodes;
            var             links       = net.Links;

            object[] nodesHead = new object[dseek.Nodes + 1];
            nodesHead[0] = _sheet.TransposedMode ? "Node/Time" : "Time/Node";
            for (int i = 0; i < nodes.Count; i++)
            {
                nodesHead[i + 1] = nodes[i].Name;
            }

            var linksHead = new object[dseek.Links + 1];

            linksHead[0] = _sheet.TransposedMode ? "Link/Time" : "Time/Link";
            for (int i = 0; i < links.Count; i++)
            {
                linksHead[i + 1] = links[i].Name;
            }

            XlsxWriter.Spreadsheet[] resultSheets = new XlsxWriter.Spreadsheet[HydVariable.Values.Length];
            // Array.Clear(resultSheets, 0, resultSheets.Length);

            for (int i = 0; i < resultSheets.Length; i++)
            {
                if (values != null && !values[i])
                {
                    continue;
                }
                resultSheets[i] = _sheet.NewSpreadsheet(HydVariable.Values[i].name);
                resultSheets[i].AddHeader(HydVariable.Values[i].isNode ? nodesHead : linksHead);
            }

            var nodeRow = new object[dseek.Nodes + 1];
            var linkRow = new object[dseek.Links + 1];

            for (long time = net.RStart; time <= net.Duration; time += net.RStep)
            {
                var step = dseek.GetStep(time);

                if (step == null)
                {
                    Rtime = time;
                    continue;
                }

                nodeRow[0] = time.GetClockTime();
                linkRow[0] = time.GetClockTime();

                // NODES HEADS
                if (resultSheets[(int)HydVariable.Type.Head] != null)
                {
                    for (int i = 0; i < nodes.Count; i++)
                    {
                        nodeRow[i + 1] = step.GetNodeHead(i, nodes[i], net.FieldsMap);
                    }

                    resultSheets[(int)HydVariable.Type.Head].AddData(nodeRow);
                }

                // NODES DEMANDS
                if (resultSheets[(int)HydVariable.Type.Demands] != null)
                {
                    for (int i = 0; i < nodes.Count; i++)
                    {
                        nodeRow[i + 1] = step.GetNodeDemand(i, nodes[i], net.FieldsMap);
                    }

                    resultSheets[(int)HydVariable.Type.Demands].AddData(nodeRow);
                }

                // NODES PRESSURE
                if (resultSheets[(int)HydVariable.Type.Pressure] != null)
                {
                    for (int i = 0; i < nodes.Count; i++)
                    {
                        nodeRow[i + 1] = step.GetNodePressure(i, nodes[i], net.FieldsMap);
                    }

                    resultSheets[(int)HydVariable.Type.Pressure].AddData(nodeRow);
                }

                // LINK FLOW
                if (resultSheets[(int)HydVariable.Type.Flows] != null)
                {
                    for (int i = 0; i < links.Count; i++)
                    {
                        linkRow[i + 1] = step.GetLinkFlow(i, links[i], net.FieldsMap);
                    }

                    resultSheets[(int)HydVariable.Type.Flows].AddData(linkRow);
                }

                // LINK VELOCITY
                if (resultSheets[(int)HydVariable.Type.Velocity] != null)
                {
                    for (int i = 0; i < links.Count; i++)
                    {
                        linkRow[i + 1] = step.GetLinkVelocity(i, links[i], net.FieldsMap);
                    }

                    resultSheets[(int)HydVariable.Type.Velocity].AddData(linkRow);
                }

                // LINK HEADLOSS
                if (resultSheets[(int)HydVariable.Type.Headloss] != null)
                {
                    for (int i = 0; i < links.Count; i++)
                    {
                        linkRow[i + 1] = step.GetLinkHeadLoss(i, links[i], net.FieldsMap);
                    }

                    resultSheets[(int)HydVariable.Type.Headloss].AddData(linkRow);
                }

                // LINK FRICTION
                if (resultSheets[(int)HydVariable.Type.Friction] != null)
                {
                    for (int i = 0; i < links.Count; i++)
                    {
                        linkRow[i + 1] = step.GetLinkFriction(i, links[i], net.FieldsMap);
                    }

                    resultSheets[(int)HydVariable.Type.Friction].AddData(linkRow);
                }

                Rtime = time;
            }

            dseek.Close();
        }