HolegGateway.java 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. package holeg;
  2. import classes.AbstractCanvasObject;
  3. import classes.HolonObject;
  4. import classes.Node;
  5. import holeg.model.*;
  6. import holeg.power_flow.ComplexNumber;
  7. import holeg.simple_grid.SimpleGridBuilder;
  8. import holeg.simple_grid.SimpleGridEdge;
  9. import holeg.simple_grid.SimpleGridNode;
  10. import holeg.ui.PowerFlowAnalysisMenu;
  11. import holeg.ui.SolveResultMessageBox;
  12. import ui.controller.FlexManager;
  13. import ui.controller.SingletonControl;
  14. import ui.model.*;
  15. import java.util.HashMap;
  16. public class HolegGateway {
  17. private static Grid convert(MinimumNetwork network, int iteration, FlexManager flexManager) {
  18. SimpleGridBuilder gridBuilder = new SimpleGridBuilder();
  19. HashMap<AbstractCanvasObject, SimpleGridNode> canvasToGrid = new HashMap<>();
  20. for (HolonObject object : network.getHolonObjectList()) {
  21. double power = object.getEnergyAtTimeStep(iteration);
  22. SimpleGridNode node;
  23. if (power <= 0)
  24. node = gridBuilder.addHouse(new ComplexNumber(-power, 0));
  25. else
  26. node = gridBuilder.addGenerator(new ComplexNumber(power, 0));
  27. node.tag = object;
  28. if (object.getElements().stream().anyMatch(e -> e.getEleName().equalsIgnoreCase("SLACK")))
  29. node.typeByDesign = NodeType.Slack;
  30. else if (object.getElements().stream().anyMatch(e -> e.getEleName().equalsIgnoreCase("TRANSFORMER")))
  31. node.typeByDesign = NodeType.Transformer;
  32. else
  33. node.typeByDesign = NodeType.Bus;
  34. canvasToGrid.put(object, node);
  35. }
  36. for (AbstractCanvasObject object : network.getNodeAndSwitches()) {
  37. SimpleGridNode node = gridBuilder.addHouse(new ComplexNumber(0, 0));
  38. node.tag = object;
  39. node.typeByDesign = NodeType.Bus;
  40. canvasToGrid.put(object, node);
  41. }
  42. for (IntermediateCableWithState cable : network.getEdgeList()) {
  43. SimpleGridNode a = canvasToGrid.get(cable.getModel().getA());
  44. SimpleGridNode b = canvasToGrid.get(cable.getModel().getB());
  45. if (a == null || b == null)
  46. continue;
  47. SimpleGridEdge edge = gridBuilder.connect(a, b, cable.getModel().getRealLength());
  48. edge.overrideImpedance = new ComplexNumber(cable.getModel().getOverrideResistance(), cable.getModel().getOverrideReactance());
  49. edge.overrideShuntSusceptance = cable.getModel().getOverrideShuntSusceptance();
  50. edge.tag = cable;
  51. }
  52. return gridBuilder.getGrid();
  53. }
  54. private static void decorateNetwork(MinimumNetwork network, int iteration, FlexManager flexManager, DecoratedNetwork decoratedNetwork, Grid grid) {
  55. synchronized (decoratedNetwork.getLockObject()) {
  56. decoratedNetwork.clear();
  57. for (GridNode node : grid.getNodes()) {
  58. SimpleGridNode simpleNode = (SimpleGridNode) node;
  59. if (node.getPowerGeneration().lenSquared() > 0)
  60. decoratedNetwork.getSupplierList().add(new Supplier((HolonObject) simpleNode.tag, (float) node.getPowerGeneration().real, 0, simpleNode.voltage, simpleNode.phaseDegrees, simpleNode.typeSolved == NodeType.Slack));
  61. else if (node.getPowerConsumption().lenSquared() > 0)
  62. decoratedNetwork.getConsumerList().add(new Consumer((HolonObject) simpleNode.tag, (float) node.getPowerConsumption().real, simpleNode.voltage, simpleNode.phaseDegrees, Math.cos(simpleNode.getPowerConsumption().angle()), simpleNode.typeSolved == NodeType.Slack));
  63. else if (simpleNode.tag instanceof HolonObject)
  64. decoratedNetwork.getPassivNoEnergyList().add(new Passiv((HolonObject) simpleNode.tag));
  65. }
  66. for (GridEdge edge : grid.getEdges()) {
  67. SimpleGridEdge simpleGridEdge = (SimpleGridEdge) edge;
  68. decoratedNetwork.getDecoratedCableList().add(
  69. new DecoratedCable(
  70. ((IntermediateCableWithState) simpleGridEdge.tag).getModel(),
  71. DecoratedCable.CableState.Working,
  72. (float) simpleGridEdge.power.real,
  73. (float) simpleGridEdge.loss.real));
  74. }
  75. decoratedNetwork.calculateStates();
  76. }
  77. }
  78. public static void solve(HolegPowerFlowContext context, MinimumNetwork minimumNetwork, int iteration, FlexManager flexManager, DecoratedNetwork network) {
  79. boolean solve = !PowerFlowAnalysisMenu.getInstance().areUpdatesDisabled();
  80. Grid grid = convert(minimumNetwork, iteration, flexManager);
  81. // Check if the grid is equal to the one already solved
  82. if (context != null) {
  83. for (Grid lastSolved : context.lastSolvedGrids) {
  84. if (GridComparator.isEqual(lastSolved, grid)) {
  85. decorateNetwork(minimumNetwork, iteration, flexManager, network, lastSolved);
  86. return;
  87. }
  88. }
  89. // Only remember grid when solving
  90. if (solve) {
  91. // Keep size constrained to 32 saved grids
  92. if (context.lastSolvedGrids.size() >= 32)
  93. context.lastSolvedGrids.remove(0);
  94. // Grid is updated by solver directly, so we can save the reference to the grid
  95. context.lastSolvedGrids.add(grid);
  96. }
  97. }
  98. // Stop old solver
  99. if (context != null && context.solverJob != null) {
  100. try {
  101. context.solverJob.interrupt();
  102. context.solverJob.join(200);
  103. }
  104. catch(InterruptedException ignored) {
  105. }
  106. context.solverJob = null;
  107. }
  108. // Create solver job
  109. Thread solverJob = new Thread(() -> {
  110. long start = System.nanoTime();
  111. GridSolverResult result = null;
  112. if (solve) {
  113. HolegPowerFlow powerFlow = new HolegPowerFlow();
  114. result = powerFlow.solve(grid, PowerFlowSettings.getDefault());
  115. }
  116. // Decorate network
  117. decorateNetwork(minimumNetwork, iteration, flexManager, network, grid);
  118. if (context != null)
  119. context.solverTimeMilliseconds = (System.nanoTime() - start) / 1e6f;
  120. SingletonControl.getInstance().getControl().calculateVisual();
  121. // Show result
  122. if (result != null && PowerFlowAnalysisMenu.getInstance().shouldShowResult())
  123. SolveResultMessageBox.show(result);
  124. });
  125. // Wait or save solver job
  126. try {
  127. if (context == null || context.settings.waitForSolverJob) {
  128. solverJob.start();
  129. solverJob.join();
  130. }
  131. else {
  132. decorateNetwork(minimumNetwork, iteration, flexManager, network, grid);
  133. context.solverJob = solverJob;
  134. solverJob.start();
  135. }
  136. }
  137. catch(InterruptedException e) {
  138. e.printStackTrace();
  139. }
  140. }
  141. }