123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- package holeg.power_flow;
- public class FlowCalculation {
- public static FlowData calculate(AdmittanceMatrix admittanceMatrix, Bus[] buses, Line[] lines, ComplexNumber[] voltages) {
- FlowData result = new FlowData();
- // Current calculation I = U / R; R = 1 / Y => I = Y * U
- ComplexMatrix busCurrent = admittanceMatrix.multiply(voltages);
- // Calculate line currents
- ComplexMatrix lineCurrent = ComplexMatrix.sameSizeAs(admittanceMatrix);
- for (int i = 0; i < lines.length; i++) {
- Line line = lines[i];
- // Calculate current by multiplying the voltage dropped between the line and the admittance
- ComplexNumber voltageDrop = voltages[line.from].subtract(voltages[line.to]);
- ComplexNumber current = voltageDrop.multiply(admittanceMatrix.get(line.to, line.from));
- // Symmetrical
- lineCurrent.set(line.to, line.from, current.negate());
- lineCurrent.set(line.from, line.to, current);
- }
- // Power calculation (P = U * I)
- ComplexMatrix linePower = ComplexMatrix.sameSizeAs(lineCurrent);
- for (int i = 0; i < linePower.getWidth(); i++)
- for (int j = 0; j < linePower.getHeight(); j++)
- if (i != j)
- linePower.set(i, j, voltages[i].multiply(lineCurrent.get(i, j).conjugate()));
- // Create result and calculate losses
- result.busCurrent = new double[buses.length];
- result.lineCurrent = new double[lines.length];
- result.busInjection = new ComplexNumber[buses.length];
- result.linePower = new ComplexNumber[lines.length];
- result.linePowerLoss = new ComplexNumber[lines.length];
- for (int i = 0; i < buses.length; i++) {
- result.busCurrent[i] = busCurrent.get(i, 0).len();
- // Power = Current * Voltage
- result.busInjection[i] = busCurrent.get(i, 0).conjugate().multiply(voltages[i]);
- }
- for (int i = 0; i < lines.length; i++) {
- Line line = lines[i];
- result.lineCurrent[i] = lineCurrent.get(line.from, line.to).len();
- result.linePower[i] = linePower.get(line.from, line.to).negate();
- result.linePowerLoss[i] = linePower.get(line.from, line.to).add(linePower.get(line.to, line.from));
- }
- return result;
- }
- }
|