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; } }