#include <bits/stdc++.h>
using namespace std;
class Matrix {
public:
double conductivePart;
double susceptivePart;
};
int main() {
int busBar;
printf("Enter the number of the bus bar: ");
scanf("%d", &busBar);
int genBus;
printf("Enter the number of the generator connected bus: ");
scanf("%d", &genBus);
printf("\n\nConsider zero(0) if there is no value\n");
int nonGenBus = busBar - genBus;
Matrix admittanceBusValue[busBar][busBar];
for(int i=0; i<busBar; i++) {
for(int j=0; j<busBar; j++) {
if(i>j) {
admittanceBusValue[i][j].conductivePart = admittanceBusValue[j][i].conductivePart;
admittanceBusValue[i][j].susceptivePart = admittanceBusValue[j][i].susceptivePart;
continue;
}
printf("\nFor Z%d%d\n", i+1, j+1);
printf("Conductive Part <space> Susceptive Part: ");
scanf("%lf %lf", &admittanceBusValue[i][j].conductivePart, &admittanceBusValue[i][j].susceptivePart);
}
}
printf("\n\n");
for(int n=busBar-1; n>=nonGenBus; n--) {
for(int j=0; j<n; j++) {
for(int k=0; k<n; k++) {
double mulRe = (admittanceBusValue[j][n].conductivePart * admittanceBusValue[n][k].conductivePart) - (admittanceBusValue[j][n].susceptivePart * admittanceBusValue[n][k].susceptivePart);
double mulIm = (admittanceBusValue[j][n].susceptivePart * admittanceBusValue[n][k].conductivePart) + (admittanceBusValue[j][n].conductivePart * admittanceBusValue[n][k].susceptivePart);
double divRe = ((mulRe * admittanceBusValue[n][n].conductivePart) + (mulIm * admittanceBusValue[n][n].susceptivePart)) / (pow(admittanceBusValue[n][n].conductivePart,2) + pow(admittanceBusValue[n][n].susceptivePart,2));
double divIm = ((mulIm * admittanceBusValue[n][n].conductivePart) - (mulRe * admittanceBusValue[n][n].susceptivePart)) / (pow(admittanceBusValue[n][n].conductivePart,2) + pow(admittanceBusValue[n][n].susceptivePart,2));
admittanceBusValue[j][k].conductivePart = admittanceBusValue[j][k].conductivePart - divRe;
admittanceBusValue[j][k].susceptivePart = admittanceBusValue[j][k].susceptivePart - divIm;
}
}
}
printf("\n\nReduced Admittance Bus Matrix:\n\n");
for(int i=0; i<genBus; i++) {
for(int j=0; j<genBus; j++) {
if(admittanceBusValue[i][j].susceptivePart < 0) {
printf("%0.2lf-j%0.2lf \t", admittanceBusValue[i][j].conductivePart, (-1)*admittanceBusValue[i][j].susceptivePart);
}
else {
printf("%0.2lf+j%0.2lf \t", admittanceBusValue[i][j].conductivePart, admittanceBusValue[i][j].susceptivePart);
}
if(j+1==genBus) {
printf("\n");
}
}
}
}