PowerFlowProblem.java 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package holeg.power_flow;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. public class PowerFlowProblem {
  5. public final Bus[] buses;
  6. public final Line[] lines;
  7. public final double scaleVoltage;
  8. public final double scalePower;
  9. public PowerFlowProblem(Bus[] buses, Line[] lines, double scaleVoltage, double scalePower) {
  10. if (buses == null)
  11. throw new IllegalArgumentException("buses is null");
  12. if (lines == null)
  13. throw new IllegalArgumentException("lines is null");
  14. this.buses = buses;
  15. this.lines = lines;
  16. this.scaleVoltage = scaleVoltage;
  17. this.scalePower = scalePower;
  18. }
  19. public List<Integer> getProducers() {
  20. List<Integer> producers = new ArrayList<>();
  21. for (int i = 0; i < buses.length; i++)
  22. if (buses[i].isProducer())
  23. producers.add(i);
  24. return producers;
  25. }
  26. public boolean checkForValidData() {
  27. // Check per unit scale
  28. if (scaleVoltage <= 0)
  29. return false;
  30. if (scalePower <= 0)
  31. return false;
  32. // Check buses
  33. for (int i = 0; i < buses.length; i++) {
  34. Bus bus = buses[i];
  35. if (bus == null)
  36. return false;
  37. // Invalid voltage
  38. if (bus.voltage <= 0)
  39. return false;
  40. // Check for multiple slack buses
  41. if (bus.type == BusType.Slack && i != 0)
  42. return false;
  43. if (bus.type != BusType.Slack && i == 0)
  44. return false;
  45. }
  46. // Check lines
  47. for (int i = 0; i < lines.length; i++) {
  48. Line line = lines[i];
  49. if (line == null)
  50. return false;
  51. // Invalid index of to/from
  52. if (line.to < 0 || line.to >= buses.length)
  53. return false;
  54. if (line.from < 0 || line.from >= buses.length)
  55. return false;
  56. if (line.from == line.to)
  57. return false;
  58. // Invalid values for R and X
  59. if (line.R < 0 || line.X < 0)
  60. return false;
  61. }
  62. return true;
  63. }
  64. }