/// <summary>Generate multi-species quality report.</summary> /// <param name="msxBin">Name of the MSX simulation output file.</param> /// <param name="net">Hydraulic network.</param> /// <param name="netMsx">MSX network.</param> /// <param name="tk2">Hydraulic network - MSX bridge.</param> /// <param name="values">Species report flag.</param> public void CreateMsxReport(string msxBin, EpanetNetwork net, EpanetMSX netMsx, EnToolkit2 tk2, bool[] values) { Rtime = 0; var nodes = netMsx.Network.Node; var links = netMsx.Network.Link; string[] nSpecies = netMsx.GetSpeciesNames(); int reportCount = (int)((net.Duration - net.RStart) / net.RStep) + 1; var reader = new MsxReader( nodes.Length - 1, links.Length - 1, nSpecies.Length, netMsx.ResultsOffset); int totalSpecies = values == null ? nSpecies.Length : values.Count(b => b); reader.Open(msxBin); var nodesHead = new object[nSpecies.Length + 1]; nodesHead[0] = _sheet.TransposedMode ? "Node/Time" : "Time/Node"; var linksHead = new object[nSpecies.Length + 1]; linksHead[0] = _sheet.TransposedMode ? "Link/Time" : "Time/Link"; int count = 1; for (int i = 0; i < nSpecies.Length; i++) { if (values == null || values[i]) { nodesHead[count] = nSpecies[i]; linksHead[count++] = nSpecies[i]; } } var nodeRow = new object[totalSpecies + 1]; for (int i = 1; i < nodes.Length; i++) { if (!nodes[i].Rpt) { continue; } var spr = _sheet.NewSpreadsheet("Node<<" + tk2.ENgetnodeid(i) + ">>"); spr.AddHeader(nodesHead); for (long time = net.RStart, period = 0; time <= net.Duration; time += net.RStep, period++) { nodeRow[0] = time.GetClockTime(); for (int j = 0, ji = 0; j < nSpecies.Length; j++) { if (values == null || values[j]) { nodeRow[ji++ + 1] = reader.GetNodeQual((int)period, i, j + 1); } } spr.AddData(nodeRow); } } var linkRow = new object[totalSpecies + 1]; for (int i = 1; i < links.Length; i++) { if (!links[i].Rpt) { continue; } var spr = _sheet.NewSpreadsheet("Link<<" + tk2.ENgetlinkid(i) + ">>"); spr.AddHeader(linksHead); for (long time = net.RStart, period = 0; time <= net.Duration; time += net.RStep, period++) { linkRow[0] = time.GetClockTime(); for (int j = 0, ji = 0; j < nSpecies.Length; j++) { if (values == null || values[j]) { linkRow[ji++ + 1] = reader.GetLinkQual((int)period, i, j + 1); } } spr.AddData(linkRow); } } reader.Close(); }