HolegGateway.java 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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.model.*;
  14. import java.util.HashMap;
  15. public class HolegGateway {
  16. private static Grid convert(MinimumNetwork network, int iteration, FlexManager flexManager) {
  17. SimpleGridBuilder gridBuilder = new SimpleGridBuilder();
  18. HashMap<AbstractCanvasObject, SimpleGridNode> canvasToGrid = new HashMap<>();
  19. for (HolonObject object : network.getHolonObjectList()) {
  20. double power = object.getEnergyAtTimeStep(iteration);
  21. SimpleGridNode node;
  22. if (power <= 0)
  23. node = gridBuilder.addHouse(new ComplexNumber(-power, 0));
  24. else
  25. node = gridBuilder.addGenerator(new ComplexNumber(power, 0));
  26. node.tag = object;
  27. if (object.getElements().stream().anyMatch(e -> e.getEleName().equalsIgnoreCase("SLACK")))
  28. node.typeByDesign = NodeType.Slack;
  29. else if (object.getElements().stream().anyMatch(e -> e.getEleName().equalsIgnoreCase("TRANSFORMER")))
  30. node.typeByDesign = NodeType.Transformer;
  31. else
  32. node.typeByDesign = NodeType.Bus;
  33. canvasToGrid.put(object, node);
  34. }
  35. for (AbstractCanvasObject object : network.getNodeAndSwitches()) {
  36. SimpleGridNode node = gridBuilder.addHouse(new ComplexNumber(0, 0));
  37. node.tag = object;
  38. canvasToGrid.put(object, node);
  39. }
  40. for (IntermediateCableWithState cable : network.getEdgeList()) {
  41. SimpleGridNode a = canvasToGrid.get(cable.getModel().getA());
  42. SimpleGridNode b = canvasToGrid.get(cable.getModel().getB());
  43. if (a == null || b == null)
  44. continue;
  45. SimpleGridEdge edge = gridBuilder.connect(a, b, cable.getModel().getRealLength());
  46. edge.overrideImpedance = new ComplexNumber(cable.getModel().getOverrideResistance(), cable.getModel().getOverrideReactance());
  47. edge.overrideShuntSusceptance = cable.getModel().getOverrideShuntSusceptance();
  48. edge.tag = cable;
  49. }
  50. return gridBuilder.getGrid();
  51. }
  52. private static void decorateNetwork(MinimumNetwork network, int iteration, FlexManager flexManager, DecoratedNetwork decoratedNetwork, Grid grid) {
  53. for (GridNode node : grid.getNodes()) {
  54. SimpleGridNode simpleNode = (SimpleGridNode) node;
  55. if (node.getPowerGeneration().lenSquared() > 0)
  56. decoratedNetwork.getSupplierList().add(new Supplier((HolonObject) simpleNode.tag, (float) node.getPowerGeneration().real, 0, simpleNode.voltage, simpleNode.phaseDegrees, simpleNode.typeSolved == NodeType.Slack));
  57. else if (node.getPowerConsumption().lenSquared() > 0)
  58. 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));
  59. else if (simpleNode.tag instanceof HolonObject)
  60. decoratedNetwork.getPassivNoEnergyList().add(new Passiv((HolonObject) simpleNode.tag));
  61. }
  62. for (GridEdge edge : grid.getEdges()) {
  63. SimpleGridEdge simpleGridEdge = (SimpleGridEdge) edge;
  64. decoratedNetwork.getDecoratedCableList().add(
  65. new DecoratedCable(
  66. ((IntermediateCableWithState)simpleGridEdge.tag).getModel(),
  67. DecoratedCable.CableState.Working,
  68. (float)simpleGridEdge.power.real,
  69. (float)simpleGridEdge.loss.real));
  70. }
  71. }
  72. public static void solve(HolegPowerFlowContext context, MinimumNetwork minimumNetwork, int iteration, FlexManager flexManager, DecoratedNetwork network) {
  73. Grid grid = convert(minimumNetwork, iteration, flexManager);
  74. // Check if the grid is equal to the one already solved
  75. if (context != null) {
  76. for (Grid lastSolved : context.lastSolvedGrids) {
  77. if (GridComparator.isEqual(lastSolved, grid)) {
  78. decorateNetwork(minimumNetwork, iteration, flexManager, network, lastSolved);
  79. return;
  80. }
  81. }
  82. // Keep size constrained to 32 saved grids
  83. if (context.lastSolvedGrids.size() >= 32)
  84. context.lastSolvedGrids.remove(0);
  85. context.lastSolvedGrids.add(grid);
  86. }
  87. HolegPowerFlow powerFlow = new HolegPowerFlow();
  88. GridSolverResult result = powerFlow.solve(grid, PowerFlowSettings.getDefault());
  89. decorateNetwork(minimumNetwork, iteration, flexManager, network, grid);
  90. if (PowerFlowAnalysisMenu.getInstance().shouldShowResult())
  91. SolveResultMessageBox.show(result);
  92. }
  93. }