private void AddBranchToModel(MPBranch branch, EPhaseCode?phasesToAdd = null) { long node1Lid, node2Lid; long[] node1Ind, node2Ind; phasesToAdd = phasesToAdd ?? branch.OriginalPhases & ~EPhaseCode.N; node1Lid = branch.EndNodes[(sbyte)EBranchEnd.END_1]; node2Lid = branch.EndNodes[(sbyte)EBranchEnd.END_2]; GetIndicesFromNode(node1Lid, out node1Ind); GetIndicesFromNode(node2Lid, out node2Ind); long branchLid = branch.Lid; //A FAZA if ((phasesToAdd & EPhaseCode.A) != 0) { AddBranchToMatrix(node1Ind[(long)EPhaseIndex.A], node2Ind[(long)EPhaseIndex.A], branchLid, node1Lid, node2Lid); } //B FAZA if ((phasesToAdd & EPhaseCode.B) != 0) { AddBranchToMatrix(node1Ind[(long)EPhaseIndex.B], node2Ind[(long)EPhaseIndex.B], branchLid, node1Lid, node2Lid); } //C FAZA if ((phasesToAdd & EPhaseCode.C) != 0) { AddBranchToMatrix(node1Ind[(long)EPhaseIndex.C], node2Ind[(long)EPhaseIndex.C], branchLid, node1Lid, node2Lid); } }
private void RemoveBranchFromModel(MPBranch branch, EPhaseCode?phasesToRemove = null) { long node1, node2; long[] node1Ind, node2Ind; phasesToRemove = phasesToRemove ?? branch.OriginalPhases & ~EPhaseCode.N; node1 = branch.EndNodes[(sbyte)EBranchEnd.END_1]; node2 = branch.EndNodes[(sbyte)EBranchEnd.END_2]; GetIndicesFromNode(node1, out node1Ind); GetIndicesFromNode(node2, out node2Ind); //A FAZA if ((phasesToRemove & EPhaseCode.A) != 0) { RemoveBranchFromMatrix(node1Ind[(long)EPhaseIndex.A], node2Ind[(long)EPhaseIndex.A]); } //B FAZA if ((phasesToRemove & EPhaseCode.B) != 0) { RemoveBranchFromMatrix(node1Ind[(long)EPhaseIndex.B], node2Ind[(long)EPhaseIndex.B]); } //C FAZA if ((phasesToRemove & EPhaseCode.C) != 0) { RemoveBranchFromMatrix(node1Ind[(long)EPhaseIndex.C], node2Ind[(long)EPhaseIndex.C]); } }
public void UpdateTopologyAfterRemovingBranch(long branch) { MPBranch stateBranch = internalModel.Branches[branch]; if (stateBranch.Marker != EEnergizationStatus.TA_UNENERGIZED) { FindRootsToUpdate(branch); bfScanner.Init(); if ((stateBranch.OriginalPhases & EPhaseCode.A) != EPhaseCode.NONE) { long nodeLid = stateBranch.DownNode[(long)EPhaseIndex.A]; bfScanner.Add(new ActiveNodeInfo(LIDtoIND[nodeLid] + (long)EPhaseIndex.A, (long)EPhaseIndex.A)); } if ((stateBranch.OriginalPhases & EPhaseCode.B) != EPhaseCode.NONE) { long nodeLid = stateBranch.DownNode[(long)EPhaseIndex.B]; bfScanner.Add(new ActiveNodeInfo(LIDtoIND[nodeLid] + (long)EPhaseIndex.B, (long)EPhaseIndex.B)); } if ((stateBranch.OriginalPhases & EPhaseCode.C) != EPhaseCode.NONE) { long nodeLid = stateBranch.DownNode[(long)EPhaseIndex.C]; bfScanner.Add(new ActiveNodeInfo(LIDtoIND[nodeLid] + (long)EPhaseIndex.C, (long)EPhaseIndex.C)); } ProcessIsland(); AnalyzeTopology(internalModel.Roots); } }
private void SaveBranchResultsForIsland(Dictionary <long, CVisitedBranch> visitedBranches) { foreach (CVisitedBranch visitedbranch in visitedBranches.Values) { MPBranch branch = internalModel.Branches[visitedbranch.Lid]; branch.NextInRoot = new long[3]; branch.PrevInRoot = new long[3]; branch.UpNode = new long[3]; branch.DownNode = new long[3]; branch.OwnerCircuit = new long[3]; branch.ActivePhases = EPhaseCode.NONE; branch.Marker = EEnergizationStatus.TA_UNENERGIZED; } }
private void SaveBranchResultsForRoot(Dictionary <long, CVisitedBranch> visitedBranches, MPRoot root) { foreach (CVisitedBranch visitedbranch in visitedBranches.Values) { MPBranch branch = internalModel.Branches[visitedbranch.Lid]; branch.NextInRoot = visitedbranch.NextInRoot; branch.PrevInRoot = visitedbranch.PrevInRoot; branch.UpNode = visitedbranch.UpNode; branch.DownNode = visitedbranch.DownNode; branch.OwnerCircuit = visitedbranch.OwnerCircuit; branch.ActivePhases = CalculateActivePhases(visitedbranch.Visited); branch.Marker = CalculateEnergization(branch.OriginalPhases, branch.ActivePhases, visitedbranch.Loop); root.GraphElems.Add(visitedbranch.Lid); } }
public void UpdateTopologyAfterOpeningPhaseOfSwitch(long branch, EPhaseCode phaseToClose) { MPBranch stateBranch = internalModel.Branches[branch]; if (stateBranch.Marker != EEnergizationStatus.TA_UNENERGIZED) { FindRootsToUpdate(branch); EPhaseIndex phaseIndex = PhaseHelper.PhaseCodeToIndex(phaseToClose); long nodeLid = stateBranch.DownNode[(long)phaseIndex]; bfScanner.Init(); bfScanner.Add(new ActiveNodeInfo(LIDtoIND[nodeLid] + (long)phaseIndex, (long)phaseIndex)); ProcessIsland(); AnalyzeTopology(internalModel.Roots); } }
private void InsertSwitchDeviceInMatrixModel(MPSwitchDevice bay) { MPBranch oldBranch = internalModel.Branches[bay.EndBranch]; // Krajevi grane na kojoj se nalazi prekidac long node2Lid = bay.EndNode; long node1Lid = oldBranch.EndNodes[0] == node2Lid ? oldBranch.EndNodes[1] : oldBranch.EndNodes[0]; // Kreiranje novog cvora sa faznoscu stare grane long connNodeLid = internalModel.LidManager.FindFreeTemporaryIndex("MPConnectivityNode"); MPConnectivityNode connNode = new MPConnectivityNode(connNodeLid, oldBranch.OriginalPhases); AddNodeInModel(connNodeLid); internalModel.Nodes.Add(connNodeLid, connNode); // Kreiranje prve grane sa faznoscu stare grane long connBranch1Lid = internalModel.LidManager.FindFreeTemporaryIndex("MPConnectivityBranch"); MPConnectivityBranch connBranch1 = new MPConnectivityBranch(connBranch1Lid, oldBranch.Lid, oldBranch.OriginalPhases, node1Lid, connNodeLid); AddBranchToModel(connBranch1); internalModel.Branches.Add(connBranch1Lid, connBranch1); // Kreiranje druge grane sa faznoscu i stanjem prekidaca long connBranch2Lid = internalModel.LidManager.FindFreeTemporaryIndex("MPConnectivityBranch"); MPConnectivityBranch connBranch2 = new MPConnectivityBranch(connBranch2Lid, oldBranch.Lid, bay.OriginalPhases, connNodeLid, node2Lid); AddBranchToModel(connBranch2, bay.State); internalModel.Branches.Add(connBranch2Lid, connBranch2); // Povezivanje prekidaca sa granom koja modelira njegovo stanje bay.StateBranch = connBranch2Lid; // Brisanje stare grane RemoveBranchFromModel(oldBranch); internalModel.Branches.Remove(oldBranch.Lid); }