/// <summary>Builds linked list of links adjacent to each node.</summary> /// <param name="adjlist">Nodes adjacency list.</param> /// <param name="nodes">Collecion of hydraulic simulation nodes.</param> /// <param name="links">Collection of hydraulic simulation links.</param> /// <param name="paraflag">Remove parallel links.</param> private void BuildLists( List <AdjItem>[] adjlist, IEnumerable <SimulationNode> nodes, IEnumerable <SimulationLink> links, bool paraflag) { bool pmark = false; foreach (SimulationLink link in links) { int k = link.Index + 1; int i = link.First.Index + 1; int j = link.Second.Index + 1; if (paraflag) { pmark = ParaLink(adjlist, i, j, k); } // Include link in start node i's list AdjItem alink = new AdjItem(!pmark ? j : 0, k); adjlist[i].Insert(0, alink); // Include link in end node j's list alink = new AdjItem(!pmark ? i : 0, k); adjlist[j].Insert(0, alink); } }
///<summary>Creates new entries in knode's adjacency list for all unlinked pairs of active nodes that are adjacent to knode.</summary> /// <param name="adjlist">Nodes adjacency list.</param> /// <param name="knode">Node id.</param> private void GrowList(List <AdjItem>[] adjlist, int knode) { for (int i = 0; i < adjlist[knode].Count; i++) { AdjItem alink = adjlist[knode][i]; int node = alink.Node; if (_degree[node] > 0) { _degree[node]--; NewLink(adjlist, adjlist[knode], i); } } }
/// <summary> /// Links end of current adjacent link to end nodes /// of all links that follow it on adjacency list. /// </summary> /// <param name="adjList">Nodes adjacency list.</param> /// <param name="list">Adjacent links</param> /// <param name="id">Link id.</param> private void NewLink(List <AdjItem>[] adjList, List <AdjItem> list, int id) { int inode = list[id].Node; for (int i = id + 1; i < list.Count; i++) { AdjItem blink = list[i]; int jnode = blink.Node; if (_degree[jnode] > 0) { if (!Linked(adjList, inode, jnode)) { _coeffsCount++; AddLink(adjList, inode, jnode, _coeffsCount); AddLink(adjList, jnode, inode, _coeffsCount); _degree[inode]++; _degree[jnode]++; } } } }
/// <summary>Augments node i's adjacency list with node j.</summary> private static void AddLink(List <AdjItem>[] adjList, int i, int j, int n) { AdjItem alink = new AdjItem(j, n); adjList[i].Insert(0, alink); }