/// <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; } } }
/// <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(); }