using System.Collections.Generic;
public string C { get; set; }
public int N { get; set; }
public string T { get; set; }
public double V { get; set; }
public Complex Vit { get; set; }
public double Vo { get; set; }
public double Deg { get; set; }
public double Vpu { get; set; }
public double Vb { get; set; }
public Complex Ybb { get; set; }
public Complex Sit { get; set; }
public List<Bus> Cn { get; set; }
public Bus(string c, string t, double v)
Cn = new List<Bus>() { };
public string C { get; set; }
public int N { get; set; }
public string T { get; set; }
public Bus Bf { get; set; }
public Bus Bt { get; set; }
public Complex Yact { get; set; }
public Complex Y { get; set; }
public Branch(string c, string t, Bus bf, Bus bt, Complex y)
public string C { get; set; }
public int Bfn { get; set; }
public int Btn { get; set; }
public string T { get; set; }
public int N { get; set; }
public Bus Bf { get; set; }
public Bus Bt { get; set; }
public double R { get; set; }
public double X { get; set; }
public double Rn { get; set; }
public double L { get; set; }
public double Vb { get; set; }
public double Zb { get; set; }
public double Ib { get; set; }
public Complex Y { get; set; }
public Cable(string c, string t, string bft, string btt, double r, double x, double rn, double l)
Bf = Buses.Where(bus => bus.T == bft).ToList()[0];
Bt = Buses.Where(bus => bus.T == btt).ToList()[0];
if (Bf == null || Bt == null)
Console.WriteLine(String.Format("Error !! Branch Tag {0} connected to bus {1} and {2} is not defined yet.", T, Bf.N, Bt.N));
if (Bf.Cn.Contains(Bt) == false) { Bf.Cn.Add(Bt); }
if (Bt.Cn.Contains(Bf) == false) { Bt.Cn.Add(Bf); }
Console.WriteLine(String.Format("Error !! Branch Tag {0} " +
"connected to bus {1} and {2} which are of different voltages {3} and {4}",
T, Bf.N, Bt.N, Bf.V, Bt.V));
public string C { get; set; }
public int N { get; set; }
public int Bfn { get; set; }
public int Btn { get; set; }
public string T { get; set; }
public Bus Bf { get; set; }
public Bus Bt { get; set; }
public double Z { get; set; }
public double V1 { get; set; }
public double V2 { get; set; }
public double XR { get; set; }
public double KVA { get; set; }
public double KVAF { get; set; }
public Complex Y { get; set; }
public Transformer(string c, string t, string bft, string btt, double v1, double v2, double kVA, double z, double xr, double kVAF)
Bf = Buses.Where(bus => bus.T == bft).ToList()[0];
Bt = Buses.Where(bus => bus.T == btt).ToList()[0];
if (Bf == null || Bt == null)
Console.WriteLine(String.Format("Error !! Transformer Tag {0} connected to bus {1} and {2} is not defined yet.", T, Bf.N, Bt.N));
if (Bf.Cn.Contains(Bt) == false) { Bf.Cn.Add(Bt); }
if (Bt.Cn.Contains(Bf) == false) { Bt.Cn.Add(Bf); }
public string C { get; set; }
public int N { get; set; }
public string T { get; set; }
public int Bn { get; set; }
public Bus B { get; set; }
public Complex S { get; set; }
public Complex Spu { get; set; }
public double P { get; set; }
public double Q { get; set; }
public double FXZPC { get; set; }
public double F { get; set; }
public Load(string c, string t, string bt, double p, double q, double fxzpc, double f)
C = c; T = t; P = p; Q = q;
FXZPC = (fxzpc < 0 || fxzpc >= 100) ? 100 : ((fxzpc >= 0 && fxzpc <= 1) ? fxzpc * 100 : fxzpc);
F = (f < 0 || f > 100) ? 1 : (f > 1 ? f / 100 : f);
B = Buses.Where(bus => bus.T == bt).ToList()[0];
S = new Complex(1000 * P * F, 1000 * Q * F) / Sb;
public Bus B { get; set; }
public bool V { get; set; }
public BusVisit(Bus b, bool v)
public static double Sb = 5000000;
public static double Vbg = 1000;
public static List<Bus> Buses = new List<Bus>();
public static List<Branch> Branches = new List<Branch>();
public static List<Cable> Cables = new List<Cable>();
public static List<Transformer> Transformers = new List<Transformer>();
public static List<Load> Loads = new List<Load>();
public static List<BusVisit> BusVisited = new List<BusVisit>();
public static void Main()
Buses.Add(new Bus("Swing", "Bus53", 33));
Buses.Add(new Bus("Variable", "Bus52", 33));
Buses.Add(new Bus("Variable", "Bus54", 33));
Buses.Add(new Bus("Variable", "Bus59", 33));
Buses.Add(new Bus("Variable", "Bus51", 6.6));
Buses.Add(new Bus("Variable", "Bus50", 6.6));
Buses.Add(new Bus("Variable", "Bus67", 6.6));
Buses.Add(new Bus("Variable", "Bus64", 6.6));
Buses.Add(new Bus("Variable", "Bus56", 6.6));
Buses.Add(new Bus("Variable", "Bus70", 0.415));
Buses.Add(new Bus("Variable", "Bus71", 0.415));
Buses.Add(new Bus("Variable", "Bus75", 0.415));
Buses.Add(new Bus("Variable", "Bus77", 0.415));
Buses.Add(new Bus("Variable", "Bus78", 0.415));
Transformers.Add(new Transformer("Transformer", "T8", "Bus54", "Bus51", 33, 6.9, 20000, 10, 10, 25000));
Transformers.Add(new Transformer("Transformer", "T10", "Bus56", "Bus70", 6.6, 0.433, 2000, 6.25, 10, 2500));
Cables.Add(new Cable("Cable", "C44", "Bus53", "Bus52", 0.051, 0.113, 1, 700));
Cables.Add(new Cable("Cable", "C47", "Bus52", "Bus54", 0.051, 0.113, 1, 70));
Cables.Add(new Cable("Cable", "C56", "Bus52", "Bus59", 0.051, 0.113, 1, 400));
Cables.Add(new Cable("Cable", "C43", "Bus51", "Bus50", 0.102, 0.0999, 1, 100));
Cables.Add(new Cable("Cable", "C66", "Bus50", "Bus67", 0.161, 0.105, 1, 100));
Cables.Add(new Cable("Cable", "C62", "Bus50", "Bus64", 0.161, 0.105, 1, 100));
Cables.Add(new Cable("Cable", "C51", "Bus50", "Bus56", 0.161, 0.105, 1, 100));
Cables.Add(new Cable("Cable", "C70", "Bus70", "Bus71", 0.033, 0.091, 4, 100));
Cables.Add(new Cable("Cable", "C74", "Bus71", "Bus75", 0.157, 0.073, 1, 100));
Cables.Add(new Cable("Cable", "C76", "Bus71", "Bus77", 0.157, 0.073, 1, 100));
Cables.Add(new Cable("Cable", "C78", "Bus71", "Bus78", 0.205, 0.074, 1, 300));
Loads.Add(new Load("Lump", "Lump2", "Bus59", 8000, 6000, 100, 100));
Loads.Add(new Load("Motor", "Mtr5", "Bus67", 589, 247, 0, 100));
Loads.Add(new Load("Lump", "Lump5", "Bus64", 800, 600, 100, 100));
Loads.Add(new Load("Lump", "Lump8", "Bus75", 240, 180, 0, 100));
Loads.Add(new Load("Lump", "Load11", "Bus77", 296, 400, 0, 100));
Loads.Add(new Load("Lump", "Mtr8", "Bus78", 130, 57, 0, 100));
foreach (Cable cable in Cables)
Branches.Add(new Branch("Cable", cable.T, cable.Bf, cable.Bt, cable.Y));
foreach (Transformer trafo in Transformers)
Branches.Add(new Branch("Transformer", trafo.T, trafo.Bf, trafo.Bt, trafo.Y));
foreach (Load load in Loads)
Console.WriteLine(String.Format("#{0} Tag: {1} Connected to{2} ({3}V) S: {8} p.u. P: {4} kW Q:{5} kVAR FixedZ: {6} Load Factor: {7})", load.N, load.T, load.B.T, load.B.V, load.P, load.Q, load.FXZPC, load.F, load.S.Magnitude ));
foreach (Bus bus in Buses) { BusVisited.Add(new BusVisit(bus, false)); };
Buses.Sort((x, y) => x.C.CompareTo(y.C));
foreach (Bus swingBus in Buses.Where(b => b.C == "Swing").ToList()) {
ParentBus = Buses.Where(b => b.T == ParentBusT).ToList()[0];
Buses.Where(b => b.T == ParentBusT).ToList()[0].Vb = Buses.Where(b => b.T == ParentBusT).ToList()[0].V;
Buses.Where(b => b.T == ParentBusT).ToList()[0].Vpu = 1;
FunctionBFS(Buses.Where(b => b.T == ParentBusT).ToList()[0], Buses.Where(b => b.T == ParentBusT).ToList()[0]);
foreach (Cable cable in Cables)
cable.Zb = Math.Pow(cable.Vb, 2) / Sb;
cable.Y = new Complex(cable.Zb, 0) / new Complex(cable.R * (cable.L / 1000) / cable.Rn, cable.X * (cable.L / 1000) / cable.Rn);
Branches.Where(b => b.T == cable.T).ToList()[0].Y = cable.Y;
foreach (Transformer trafo in Transformers)
trafo.Y = Math.Pow(trafo.V1/trafo.Bf.Vb,2)* new Complex(0.01 * trafo.Z, 0) / (new Complex(1, trafo.XR) / Math.Pow((1 + trafo.XR * trafo.XR), 0.5)) * (Sb / (1000 * trafo.KVA));
public static void FunctionBFS(Bus prntBus, Bus thisBus)
Bus B = Buses.Where(b => b.T == thisBus.T).ToList()[0];
foreach (Bus childBus in B.Cn)
if (childBus.T == prntBus.T) { continue; }
Branch BR = Branches.Where(br => (br.Bf.T == thisBus.T && br.Bt.T == childBus.T) || (br.Bt.T == thisBus.T && br.Bf.T == childBus.T)).ToList()[0];
Buses.Where(b => b.T == childBus.T).ToList()[0].Vb = thisBus.Vb;
else if (BR.C == "Transformer")
Transformer TR = Transformers.Where(tr => tr.T == BR.T).ToList()[0];
V1 = (TR.Bf.T == thisBus.T) ? TR.V1 : TR.V2;
V2 = (TR.Bt.T == thisBus.T) ? TR.V1 : TR.V2;
Buses.Where(b => b.T == childBus.T).ToList()[0].Vb = thisBus.Vb * V2 / V1;
Buses.Where(b => b.T == childBus.T).ToList()[0].Vpu = 1;
if (childBus.Cn.Count() == 1 )
BusVisited.Where(bv => bv.B.T == childBus.T).ToList()[0].V = true;
if (BusVisitComplete(childBus, thisBus)== true)
BusVisited.Where(bv => bv.B.T == thisBus.T).ToList()[0].V = true;
FunctionBFS(thisBus, childBus);
static bool BusVisitComplete(Bus bb, Bus parentBus)
if (b.T == parentBus.T) { continue; }
BusVisit BV = BusVisited.Where(bv => bv.B.T == b.T).ToList()[0];
if (BusVisitComplete(BV.B, bb) == false) { return false; }
Console.WriteLine("Starting Load Flow.......");
Buses.Sort((x, y) => x.C.CompareTo(y.C));
foreach (Bus b1 in Buses)
b1.Ybb = new Complex(0, 0);
foreach (Bus b2 in b1.Cn)
b1.Ybb = b1.Ybb + Branches.Where(branch => (branch.Bf == b1 && branch.Bt == b2) || branch.Bf == b2 && branch.Bt == b1).ToList()[0].Y;
for (int k = 0; k < iteration; k++)
foreach (Bus bus in Buses)
if (bus.C == "Swing") continue;
List<Load> BLoads = new List<Load>() { };
BLoads = Loads.Where(load => load.B.T == bus.T).ToList();
bus.Sit = new Complex(0, 0);
foreach (Load load in BLoads)
bus.Sit = bus.Sit + load.S* (1-load.FXZPC/100) + load.S * (load.FXZPC/100) * Math.Pow(bus.Vit.Magnitude / bus.Vpu, 2); ;
Console.WriteLine(String.Format("Iteration {0} : Bus {1} ({2}) : S: {7} ({3} {4}) : Vit : {5} Vpu : {6}", k, bus.N, bus.T, Math.Round(Sb*bus.Sit.Real/1000, 2), Math.Round(Sb*bus.Sit.Imaginary/1000, 2), Math.Round(bus.Vit.Magnitude, 2), Math.Round(bus.Vpu, 2), Math.Round(bus.Sit.Magnitude,3) ));
Complex IV = new Complex(bus.Vit.Real, bus.Vit.Imaginary);
Complex VY = new Complex(0, 0);
foreach (Bus b1 in bus.Cn)
BB = Branches.Where(branch => (branch.Bf == bus && branch.Bt == b1) || branch.Bt == bus && branch.Bf == b1).ToList()[0];
string stemp = BB.Bf.N.ToString() + " - " + BB.Bt.N.ToString();
bus.Vit = (VY - Complex.Conjugate(bus.Sit / IV)) / bus.Ybb;
d = (bus.Vit - IV).Magnitude / bus.Vit.Magnitude;
IV = new Complex(bus.Vit.Real, bus.Vit.Imaginary);
} while (d > 0.000001 && count < 10);
Console.WriteLine(String.Format(
"Bus # {0} : {1} : Voltage : {2}% {3} deg [{4},{5}]",
b.N, b.T, Math.Round(100 * Complex.Abs(b.Vit), 2), Math.Round(b.Vit.Phase * 180 / Math.PI, 2),
Math.Round(100 * b.Vit.Real, 2), Math.Round(100 * b.Vit.Imaginary, 2)));
foreach (Branch br in Branches)
Complex In = (br.Bf.Vit - br.Bt.Vit) * br.Y;
Complex Sn1 = br.Bf.Vit * Complex.Conjugate(In);
Complex Sn2 = br.Bt.Vit * Complex.Conjugate(In);
Complex Loss = (br.Bf.Vit - br.Bt.Vit) * Complex.Conjugate(In);
Console.WriteLine(String.Format(
"Branch {0}-{1}: {2} A S{0}: {3} ({4},{5}) S{1}: {6} ({7},{8}) Loss: ({9}, {10})",
br.Bf.N, br.Bt.N, Math.Round((500 / 1.732) * Complex.Abs(In), 3),
Math.Round(500 * Complex.Abs(Sn1), 1), Math.Round(500 * Sn1.Real, 1), Math.Round(500 * Sn1.Imaginary, 1),
Math.Round(500 * Complex.Abs(Sn2), 1), Math.Round(500 * Sn2.Real, 1), Math.Round(500 * Sn2.Imaginary, 1),
Math.Round(500 * Loss.Real, 3), Math.Round(500 * Loss.Imaginary, 3)));