FlowCalculation.java 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package holeg.power_flow;
  2. public class FlowCalculation {
  3. public static FlowData calculate(AdmittanceMatrix admittanceMatrix, Bus[] buses, Line[] lines, ComplexNumber[] voltages) {
  4. FlowData result = new FlowData();
  5. // Current calculation I = U / R; R = 1 / Y => I = Y * U
  6. ComplexMatrix busCurrent = admittanceMatrix.multiply(voltages);
  7. // Calculate line currents
  8. ComplexMatrix lineCurrent = ComplexMatrix.sameSizeAs(admittanceMatrix);
  9. for (int i = 0; i < lines.length; i++) {
  10. Line line = lines[i];
  11. // Calculate current by multiplying the voltage dropped between the line and the admittance
  12. ComplexNumber voltageDrop = voltages[line.from].subtract(voltages[line.to]);
  13. ComplexNumber current = voltageDrop.multiply(admittanceMatrix.get(line.to, line.from));
  14. // Symmetrical
  15. lineCurrent.set(line.to, line.from, current.negate());
  16. lineCurrent.set(line.from, line.to, current);
  17. }
  18. // Power calculation (P = U * I)
  19. ComplexMatrix linePower = ComplexMatrix.sameSizeAs(lineCurrent);
  20. for (int i = 0; i < linePower.getWidth(); i++)
  21. for (int j = 0; j < linePower.getHeight(); j++)
  22. if (i != j)
  23. linePower.set(i, j, voltages[i].multiply(lineCurrent.get(i, j).conjugate()));
  24. // Create result and calculate losses
  25. result.busCurrent = new double[buses.length];
  26. result.lineCurrent = new double[lines.length];
  27. result.busInjection = new ComplexNumber[buses.length];
  28. result.linePower = new ComplexNumber[lines.length];
  29. result.linePowerLoss = new ComplexNumber[lines.length];
  30. for (int i = 0; i < buses.length; i++) {
  31. result.busCurrent[i] = busCurrent.get(i, 0).len();
  32. // Power = Current * Voltage
  33. result.busInjection[i] = busCurrent.get(i, 0).conjugate().multiply(voltages[i]);
  34. }
  35. for (int i = 0; i < lines.length; i++) {
  36. Line line = lines[i];
  37. result.lineCurrent[i] = lineCurrent.get(line.from, line.to).len();
  38. result.linePower[i] = linePower.get(line.from, line.to).negate();
  39. result.linePowerLoss[i] = linePower.get(line.from, line.to).add(linePower.get(line.to, line.from));
  40. }
  41. return result;
  42. }
  43. }