Esempio n. 1
0
        public LoadFlowResult GetLoadFlow(long gid)
        {
            LoadFlowResult result = null;

            loadFlow.TryGetValue(gid, out result);
            return(result);
        }
Esempio n. 2
0
        double CalculateVoltageForACLineSegment(Node node, Dictionary <long, LoadFlowResult> lf, Dictionary <long, Complex> currents)
        {
            Complex current;

            if (!currents.TryGetValue(node.IO.GID, out current))
            {
                return(double.MaxValue);
            }

            ACLineSegment segment = node.IO as ACLineSegment;

            List <Node> nodes = new List <Node>(2);

            for (int i = node.AdjacentOffset; i < node.AdjacentOffset + node.AdjacentCount; ++i)
            {
                Node n = adjacency[i];

                if (!nodes.Contains(n) && ModelCodeHelper.GetTypeFromGID(n.IO.GID) == DMSType.ConnectivityNode)
                {
                    nodes.Add(n);
                }
            }

            if (nodes.Count != 2)
            {
                return(0);
            }

            LoadFlowResult lfr1;

            if (!lf.TryGetValue(nodes[0].IO.GID, out lfr1))
            {
                return(0);
            }

            Complex u1 = new Complex(lfr1.Get(LoadFlowResultType.UR), lfr1.Get(LoadFlowResultType.UI));
            Complex u2 = u1.Subtract(new Complex(segment.PerLengthPhaseResistance * segment.Length, segment.PerLengthPhaseReactance * segment.Length).Multiply(current));

            LoadFlowResult lfr2;
            double         relDelta = double.MaxValue;

            if (!lf.TryGetValue(nodes[1].IO.GID, out lfr2))
            {
                lfr2 = new LoadFlowResult();
                lf[nodes[1].IO.GID] = lfr2;
            }
            else
            {
                relDelta = GetVoltageRelativeDifference(new Complex(lfr2.Get(LoadFlowResultType.UR), lfr2.Get(LoadFlowResultType.UI)), u2);
            }

            lfr2.Remove(LoadFlowResultType.UR);
            lfr2.Remove(LoadFlowResultType.UI);

            lfr2.Add(new LoadFlowResultItem(u2.X, LoadFlowResultType.UR));
            lfr2.Add(new LoadFlowResultItem(u2.Y, LoadFlowResultType.UI));

            return(relDelta);
        }
Esempio n. 3
0
        Complex CalculateCurrentForACLineSegment(Node node, IEnumerable <Complex> childCurrents, Dictionary <long, LoadFlowResult> lf)
        {
            Complex result = CalculateCurrentDefault(node, childCurrents, lf);

            LoadFlowResult lfr;

            if (!lf.TryGetValue(node.IO.GID, out lfr))
            {
                lfr             = new LoadFlowResult();
                lf[node.IO.GID] = lfr;
            }

            lfr.Remove(LoadFlowResultType.IR);
            lfr.Remove(LoadFlowResultType.II);

            lfr.Add(new LoadFlowResultItem(result.X, LoadFlowResultType.IR));
            lfr.Add(new LoadFlowResultItem(result.Y, LoadFlowResultType.II));

            List <Node> nodes = new List <Node>(2);

            for (int i = node.AdjacentOffset; i < node.AdjacentOffset + node.AdjacentCount; ++i)
            {
                Node n = adjacency[i];

                if (!nodes.Contains(n) && ModelCodeHelper.GetTypeFromGID(n.IO.GID) == DMSType.ConnectivityNode)
                {
                    nodes.Add(n);
                }
            }

            if (nodes.Count != 2)
            {
                return(result);
            }

            LoadFlowResult lfr1;
            LoadFlowResult lfr2;

            if (!lf.TryGetValue(nodes[0].IO.GID, out lfr1) || !lf.TryGetValue(nodes[1].IO.GID, out lfr2))
            {
                return(result);
            }

            ACLineSegment segment = node.IO as ACLineSegment;
            Complex       u1      = new Complex(lfr1.Get(LoadFlowResultType.UR), lfr1.Get(LoadFlowResultType.UI));
            Complex       u2      = new Complex(lfr2.Get(LoadFlowResultType.UR), lfr2.Get(LoadFlowResultType.UI));
            Complex       s       = u1.Subtract(u2).Multiply(new Complex(result.X, -result.Y));

            lfr.Remove(LoadFlowResultType.SR);
            lfr.Remove(LoadFlowResultType.SI);

            lfr.Add(new LoadFlowResultItem(s.X, LoadFlowResultType.SR));
            lfr.Add(new LoadFlowResultItem(s.Y, LoadFlowResultType.SI));

            return(result);
        }
Esempio n. 4
0
        double CalculateVoltageForSwitch(Node node, Dictionary <long, LoadFlowResult> lf, Dictionary <long, Complex> currents)
        {
            if (!currents.ContainsKey(node.IO.GID))
            {
                return(double.MaxValue);
            }

            List <Node> nodes = new List <Node>(2);

            for (int i = node.AdjacentOffset; i < node.AdjacentOffset + node.AdjacentCount; ++i)
            {
                Node n = adjacency[i];

                if (!nodes.Contains(n) && ModelCodeHelper.GetTypeFromGID(n.IO.GID) == DMSType.ConnectivityNode)
                {
                    nodes.Add(n);
                }
            }

            if (nodes.Count != 2)
            {
                return(0);
            }

            LoadFlowResult lfr1;

            if (!lf.TryGetValue(nodes[0].IO.GID, out lfr1))
            {
                return(0);
            }

            Complex u1 = new Complex(lfr1.Get(LoadFlowResultType.UR), lfr1.Get(LoadFlowResultType.UI));
            Complex u2 = GetSwitchState(node.IO as Switch) ? new Complex(0, 0) : u1;

            LoadFlowResult lfr2;
            double         relDelta = double.MaxValue;

            if (!lf.TryGetValue(nodes[1].IO.GID, out lfr2))
            {
                lfr2 = new LoadFlowResult();
                lf[nodes[1].IO.GID] = lfr2;
            }
            else
            {
                relDelta = GetVoltageRelativeDifference(new Complex(lfr2.Get(LoadFlowResultType.UR), lfr2.Get(LoadFlowResultType.UI)), u2);
            }

            lfr2.Remove(LoadFlowResultType.UR);
            lfr2.Remove(LoadFlowResultType.UI);

            lfr2.Add(new LoadFlowResultItem(u2.X, LoadFlowResultType.UR));
            lfr2.Add(new LoadFlowResultItem(u2.Y, LoadFlowResultType.UI));

            return(relDelta);
        }
Esempio n. 5
0
        double CalculateVoltageForTransformerWinding(Node node, Dictionary <long, LoadFlowResult> lf, Dictionary <long, Complex> currents)
        {
            TransformerWinding tw = node.IO as TransformerWinding;

            if (IsTransformerWindingPrimary(tw))
            {
                return(0);
            }

            if (!currents.ContainsKey(node.IO.GID))
            {
                return(double.MaxValue);
            }

            PowerTransformer   pw  = Get(tw.PowerTransformer) as PowerTransformer;
            TransformerWinding tw1 = null;

            for (int i = 0; i < pw.TransformerWindings.Count; ++i)
            {
                long twGid = pw.TransformerWindings[i];

                if (twGid != tw.GID)
                {
                    tw1 = Get(twGid) as TransformerWinding;
                    break;
                }
            }

            long node1Gid = (Get(tw1.Terminals[0]) as Terminal).ConnectivityNode;
            long node2Gid = (Get(tw.Terminals[0]) as Terminal).ConnectivityNode;

            LoadFlowResult lfr1;

            if (!lf.TryGetValue(node1Gid, out lfr1))
            {
                return(0);
            }

            Complex u1 = new Complex(lfr1.Get(LoadFlowResultType.UR), lfr1.Get(LoadFlowResultType.UI));
            Complex u2 = u1.Scale(1.0 / GetPowerTransformerRatio(pw));

            LoadFlowResult lfr2;
            double         relDelta = double.MaxValue;

            if (!lf.TryGetValue(node2Gid, out lfr2))
            {
                lfr2         = new LoadFlowResult();
                lf[node2Gid] = lfr2;
            }
            else
            {
                relDelta = GetVoltageRelativeDifference(new Complex(lfr2.Get(LoadFlowResultType.UR), lfr2.Get(LoadFlowResultType.UI)), u2);
            }

            lfr2.Remove(LoadFlowResultType.UR);
            lfr2.Remove(LoadFlowResultType.UI);

            lfr2.Add(new LoadFlowResultItem(u2.X, LoadFlowResultType.UR));
            lfr2.Add(new LoadFlowResultItem(u2.Y, LoadFlowResultType.UI));

            return(relDelta);
        }
Esempio n. 6
0
        void CalculateLoadFlowForSubGraph(Node source, List <KeyValuePair <long, LoadFlowResult> > result)
        {
            Dictionary <long, LoadFlowResult> lf = new Dictionary <long, LoadFlowResult>();

            EnergySource es = source.IO as EnergySource;

            if (es == null)
            {
                return;
            }

            Complex u1 = GetVoltageFromEnergySource(es);

            if (u1.IsNaN())
            {
                return;
            }

            Dictionary <long, Complex> currents = new Dictionary <long, Complex>();

            for (int iteration = 0; iteration < maxIterations; ++iteration)
            {
                double maxVoltageRelativeDelta = 0;

                Stack <Triple <Node, int, List <Complex> > > stack = new Stack <Triple <Node, int, List <Complex> > >();
                stack.Push(new Triple <Node, int, List <Complex> >(source, 0, new List <Complex>(source.AdjacentCount - 1)));

                HashSet <long> visited = new HashSet <long>();

                while (stack.Count > 0)
                {
                    Triple <Node, int, List <Complex> > triple = stack.Pop();
                    Node node        = triple.First;
                    int  childrenPos = triple.Second;
                    Func <Node, IEnumerable <Complex>, Dictionary <long, LoadFlowResult>, Complex> currentFunction = CalculateCurrentDefault;

                    visited.Add(node.IO.GID);
                    DMSType type = ModelCodeHelper.GetTypeFromGID(node.IO.GID);

                    switch (type)
                    {
                    case DMSType.Recloser:
                        continue;

                    case DMSType.ConnectivityNode:
                    {
                        LoadFlowResult lfr;

                        if (!lf.TryGetValue(node.IO.GID, out lfr))
                        {
                            lfr = new LoadFlowResult();
                            lfr.Add(new LoadFlowResultItem(u1.X, LoadFlowResultType.UR));
                            lfr.Add(new LoadFlowResultItem(u1.Y, LoadFlowResultType.UI));
                            lf[node.IO.GID] = lfr;
                        }
                    }
                    break;

                    case DMSType.EnergyConsumer:
                    {
                        currentFunction = CalculateCurrentForEnergyConsumer;

                        LoadFlowResult lfr;

                        if (!lf.TryGetValue(node.IO.GID, out lfr))
                        {
                            Complex s = GetPowerForEnergyConsumer(node.IO as EnergyConsumer);

                            lfr = new LoadFlowResult();
                            lfr.Add(new LoadFlowResultItem(s.X, LoadFlowResultType.SR));
                            lfr.Add(new LoadFlowResultItem(s.Y, LoadFlowResultType.SI));
                            lf[node.IO.GID] = lfr;
                        }
                    }
                    break;

                    case DMSType.Breaker:
                    case DMSType.Disconnector:
                    {
                        currentFunction = CalculateCurrentForSwitch;

                        if (childrenPos == 0)
                        {
                            double maxDelta = CalculateVoltageForSwitch(node, lf, currents);

                            if (maxDelta > maxVoltageRelativeDelta)
                            {
                                maxVoltageRelativeDelta = maxDelta;
                            }
                        }
                    }
                    break;

                    case DMSType.DistributionGenerator:
                    {
                        currentFunction = CalculateCurrentForDistributionGenerator;
                    }
                    break;

                    case DMSType.TransformerWinding:
                    {
                        currentFunction = CalculateCurrentForTransformerWinding;

                        if (childrenPos == 0)
                        {
                            double maxDelta = CalculateVoltageForTransformerWinding(node, lf, currents);

                            if (maxDelta > maxVoltageRelativeDelta)
                            {
                                maxVoltageRelativeDelta = maxDelta;
                            }
                        }
                    }
                    break;

                    case DMSType.ACLineSegment:
                    {
                        currentFunction = CalculateCurrentForACLineSegment;

                        if (childrenPos == 0)
                        {
                            double maxDelta = CalculateVoltageForACLineSegment(node, lf, currents);

                            if (maxDelta > maxVoltageRelativeDelta)
                            {
                                maxVoltageRelativeDelta = maxDelta;
                            }
                        }
                    }
                    break;
                    }

                    Node childNode = null;

                    for (int i = node.AdjacentOffset + childrenPos; i < node.AdjacentOffset + node.AdjacentCount; ++i)
                    {
                        Node adjacentNode = adjacency[i];

                        if (adjacentNode == null || visited.Contains(adjacentNode.IO.GID))
                        {
                            continue;
                        }

                        childNode = adjacentNode;
                        break;
                    }

                    if (childNode != null)
                    {
                        stack.Push(new Triple <Node, int, List <Complex> >(node, childrenPos + 1, triple.Third));
                        stack.Push(new Triple <Node, int, List <Complex> >(childNode, 0, new List <Complex>(childNode.AdjacentCount - 1)));
                        continue;
                    }

                    if (stack.Count > 0)
                    {
                        Complex current = currentFunction(node, triple.Third, lf);
                        stack.Peek().Third.Add(current);
                        currents[node.IO.GID] = current;
                    }
                }

                if (maxVoltageRelativeDelta < voltageRelativeDelta)
                {
                    break;
                }
            }

            result.AddRange(lf);
        }
Esempio n. 7
0
        public IEnumerable <LoadFlowResult> Get([FromRoute] int id)
        {
            //-------------Load Flow Algorithm---------------
            //-----obliczenia wykonywane sa na jednostkach wzglednych
            List <int> buses = new List <int>();
            int        N_bus;                                //liczba szyn/wezlow
            int        N_ser;                                //liczba elementow galeziowych
            double     Sb = 100;                             //MVA moc bazowa
            double     Ub = 60;                              //kV napiecie bazowe
            double     Zb = Math.Pow(Ub, 2) / Sb;            //Ohm impedancja bazowa
            double     Yb = 1 / Zb;                          //admitancja bazowa
            double     Ib = Sb / (Math.Sqrt(3) * Ub) * 1000; //A - prad bazowy

            //obliczenia wykonuj na danym projekcie
            ExternalGrid[]        extgrids      = _context.ExternalGrids.Where(m => m.ProjectId == id).ToArray();
            OverheadLine[]        ovheads       = _context.OverheadLines.Where(m => m.ProjectId == id).ToArray();
            TwoPhaseTransformer[] twophasetrafo = _context.TwoPhaseTransformers.Where(m => m.ProjectId == id).ToArray();
            Bus[] busbars = _context.Buses.Where(m => m.ProjectId == id).ToArray();

            /*
             * if (project == null)
             * {
             *  return NotFound();
             * }
             */


            //Jesli nie istnieja tego typu elementy to oznacza sie numer szyny rowny 1 oraz wartosc zero w drugiej kolumnie.
            int[] shunts = new int[] { 1, 0 }; //elementy poprzeczne

            //int N_sh = 1; // liczba element�w poprzecznych

            //pomocnicze tablice
            List <int>    Is    = new List <int>(); //numery szyn poczatkowych
            List <int>    Js    = new List <int>(); // numery szyn koncowych
            List <string> Itype = new List <string>();
            List <double> Pb    = new List <double>();
            List <double> Qb    = new List <double>();

            //Complex c1 = new Complex(1.2, 2.0);

            //ilosc elementow podluznych
            N_ser = ovheads.Count() + twophasetrafo.Count();

            //okresl ilosc szyn
            foreach (var row in extgrids)
            {
                if (!buses.Contains(row.NodeNo))
                {
                    buses.Add(row.NodeNo);
                }
                Itype.Add(row.NodeType);

                //obliczenia na podstawie jednostek wzglednych
                Pb.Add((row.ActivePower.HasValue) ? row.ActivePower.Value / Sb : 0);
                Qb.Add((row.ReactivePower.HasValue) ? row.ReactivePower.Value / Sb : 0);
            }
            foreach (var row in ovheads)
            {
                if (!buses.Contains(row.StartNodeNo))
                {
                    buses.Add(row.StartNodeNo);
                }
                if (!buses.Contains(row.EndNodeNo))
                {
                    buses.Add(row.EndNodeNo);
                }

                Is.Add(row.StartNodeNo);
                Js.Add(row.EndNodeNo);
            }
            N_bus = buses.Count;

            System.Diagnostics.Debug.WriteLine("BUS.COUNT: " + buses.Count);

            System.Diagnostics.Debug.WriteLine("ExternalGrid.COUNT: " + _context.ExternalGrids.Count());

            //uformuj macierz z elementami podluznymi - Series_pu
            Complex[,] Series_pu = new Complex[N_ser, 5];

            int irow = 0;

            foreach (var row in ovheads)
            {
                Complex RX = new Complex(row.UnitaryResistance * row.Length, row.UnitaryReactance * row.Length);
                Complex B  = new Complex(0, row.UnitaryCapacitance * row.Length);
                Series_pu[irow, 0] = row.StartNodeNo;
                Series_pu[irow, 1] = row.EndNodeNo;
                Series_pu[irow, 2] = RX / Zb;
                Series_pu[irow, 3] = B / (Yb * Math.Pow(10, 6)); //przeliczenie z uS
                Series_pu[irow, 4] = 1;                          //TUTAJ BEDA PRZEKLADNIE TRANSFORMATOROW
                irow++;
            }

            foreach (var row in twophasetrafo)
            {
                Complex RX = new Complex((row.LoadLossesRated * row.HVVoltageRated * row.HVVoltageRated) / (1000 * row.ApparentPowerRated * row.ApparentPowerRated), row.ShortCircuitVoltage / 100); //zastanow sie jak wyliczac parametry transformatora
                Complex B  = new Complex(0, 0);
                Series_pu[irow, 0] = row.HVNodeNo;
                Series_pu[irow, 1] = row.LVNodeNo;
                Series_pu[irow, 2] = RX / Zb;
                Series_pu[irow, 3] = B / Yb;
                irow++;
            }

            double?[] sigma = new double?[N_bus];

            //uformuj macierz - buses
            foreach (var row in extgrids)
            {
                sigma[row.NodeNo] = row.VoltageAngle; //row.ID-1
            }

            double[] U   = new double[N_bus];
            double[] Upu = new double[N_bus];

            //uformuj macierz - U
            foreach (var row in busbars)
            {
                Upu[row.NodeNo] = row.NominalVoltage / Ub; //row.ID-1
            }


            /*
             * //wartosci napiec z bezwglednych na wzgledne
             *
             * for (int c = 0; c <= (U.Length-1); c++)
             * {
             *  Upu[c] = U[c] / Ub;
             * }
             */

            double[] normalSigma = new double[N_bus];
            for (int n = 0; n <= (N_bus - 1); n++)
            {
                normalSigma[n] = (sigma[n].HasValue) ? sigma[n].Value : 0; //przekonwertowanie double? na double
            }

            //uformuj macierz admitancyjna
            Complex[,] Ybus = new Complex[N_bus, N_bus];
            Ybus            = formYmatrix(N_bus, N_ser, Is, Js, Series_pu, shunts);

            //oblicz macierz Jacobiego
            double[,] Jac = new double[N_bus + 1, N_bus + 1];
            Jac           = calcJacobiMatrix(N_bus, Ybus, Upu, normalSigma, Itype);

            //odwroc macierz Jacobiego
            double[,] JacInv = new double[Jac.GetLength(0), Jac.GetLength(1)];
            JacInv           = MatrixInverseFunc.Main(Jac);

            int    maxIter = 25; //maksymalna liczba iteracji
            double lambda  = 1;  //acceleration coefficient. This coefficient takes values less than one and improves the convergence characteristics of the problem.  The user may change the value of l to see its effect on the mismatch at the end of the iterations.

            for (int i = 0; i <= (maxIter - 1); i++)
            {
                for (int m = 1; m <= (N_bus - 1); m++)
                {
                    Upu[m] = Upu[m] + deltaV(m, N_bus, Itype, JacInv, Ybus, normalSigma, Upu, Pb, Qb) * lambda;

                    normalSigma[m] = normalSigma[m] + deltaSigma(m, N_bus, Itype, JacInv, Ybus, normalSigma, Upu, Pb, Qb) * lambda;
                    //System.Diagnostics.Debug.WriteLine("m " + m + "normalSigma[m]" + normalSigma[m]);
                    //System.Diagnostics.Debug.WriteLine("m " + m + "deltaSigma" + deltaSigma(m, N_bus, Itype, JacInv, Ybus, normalSigma, U, Pb, Qb));
                }
            }

            //z wartosci wzglednych na bezwzgledne
            for (int m = 0; m <= (Upu.Length - 1); m++)
            {
                U[m] = Upu[m] * Ub;
            }

            //obliczanie strat mocy na poszczególnych gałeziach
            double[] Ploss = new double[N_bus];
            Ploss = activePowerLoss(Upu, normalSigma, Series_pu, N_bus, Is, Js, Sb);
            double[] Qloss = new double[N_bus];
            Qloss = reactivePowerLoss(Upu, normalSigma, Series_pu, N_bus, Is, Js, Sb);



            //prąd wpywajacy od wezla i i doplywajacy do wezla j
            Complex[] IloadI = new Complex[N_bus];
            IloadI = Iload_i(Upu, normalSigma, Series_pu, N_bus, Is, Js, Ib);
            Complex[] IloadJ = new Complex[N_bus];
            IloadJ = Iload_j(Upu, normalSigma, Series_pu, N_bus, Is, Js, Ib);

            int[] busStart_I = new int[N_bus];
            busStart_I = busStartI(N_bus, Is);
            int[] busEnd_J = new int[N_bus];
            busEnd_J = busEndJ(N_bus, Js);



            //radian to degree
            double[] normalSigmaDegrees = new double[N_bus];
            for (int c = 0; c <= (normalSigma.Length - 1); c++)
            {
                normalSigmaDegrees[c] = normalSigma[c] * (180.0 / Math.PI);
            }

            var list = new LoadFlows();

            list.Results = new List <LoadFlowResult>();
            for (int z = 0; z <= (N_bus - 1); z++)
            {
                var a = new LoadFlowResult()
                {
                    busNo = z, resultU = U[z], resultUpu = Upu[z], resultSigma = normalSigmaDegrees[z], resultPloss = Ploss[z], resultQloss = Qloss[z], resultIload_i = IloadI[z].Magnitude, resultIload_j = IloadJ[z].Magnitude, busNoStart = busStart_I[z], busNoEnd = busEnd_J[z]
                };
                list.Results.Add(a);
            }
            return(list.Results);
        }
        void RedrawLoadFlow()
        {
            if (!loadFlowChanged || topology == null)
            {
                return;
            }

            loadFlowChanged = false;
            List <GraphicsText> loadFlows = new List <GraphicsText>();

            for (int i = 0; i < elements.Count; ++i)
            {
                GraphicsElement element = elements[i];

                if (element.IO == null)
                {
                    continue;
                }

                LoadFlowResult lfResult = topology.GetLoadFlow(element.IO.GID);

                if (lfResult == null)
                {
                    continue;
                }

                switch (ModelCodeHelper.GetTypeFromGID(element.IO.GID))
                {
                case DMSType.ConnectivityNode:
                {
                    double ur = lfResult.Get(LoadFlowResultType.UR);
                    double ui = lfResult.Get(LoadFlowResultType.UI);

                    if (double.IsNaN(ur) || double.IsNaN(ui))
                    {
                        break;
                    }

                    GraphicsText gtu = new GraphicsText(element.X + loadFlowXOffset, 0, GetLoadFlowItemText(ur, ui, "V"), Brushes.Black, Brushes.Transparent, element, loadFlowFontSize);
                    gtu.Y = element.Y - gtu.CalculateSize().Height / 2;
                    loadFlows.Add(gtu);
                }
                break;

                case DMSType.ACLineSegment:
                {
                    double ir = lfResult.Get(LoadFlowResultType.IR);
                    double ii = lfResult.Get(LoadFlowResultType.II);
                    double sr = lfResult.Get(LoadFlowResultType.SR);
                    double si = lfResult.Get(LoadFlowResultType.SI);

                    if (double.IsNaN(ir) || double.IsNaN(ii) || double.IsNaN(sr) || double.IsNaN(si))
                    {
                        break;
                    }

                    bool         abnormalCurrent = ComplexLength(ir, ii) > ((ACLineSegment)element.IO).RatedCurrent;
                    GraphicsText gti             = new GraphicsText(element.X + loadFlowXOffset, 0, GetLoadFlowItemText(ir, ii, "A"), abnormalCurrent ? Brushes.White : Brushes.Black, abnormalCurrent ? Brushes.DarkRed : Brushes.Transparent, element, loadFlowFontSize);
                    GraphicsText gts             = new GraphicsText(element.X + loadFlowXOffset, 0, GetLoadFlowItemText(sr, si, "VA"), Brushes.Black, Brushes.Transparent, element, loadFlowFontSize);
                    Size         gtiSize         = gti.CalculateSize();
                    Size         gtsSize         = gts.CalculateSize();

                    gti.Y = element.Y - (gtiSize.Height + gtsSize.Height) / 2;
                    gts.Y = gti.Y + gtiSize.Height;

                    loadFlows.Add(gti);
                    loadFlows.Add(gts);
                }
                break;

                case DMSType.EnergyConsumer:
                {
                    double sr = lfResult.Get(LoadFlowResultType.SR);
                    double si = lfResult.Get(LoadFlowResultType.SI);

                    if (double.IsNaN(sr) || double.IsNaN(si))
                    {
                        break;
                    }

                    GraphicsText gts = new GraphicsText(0, element.Y + loadFlowYOffset, GetLoadFlowItemText(sr, si, "VA"), Brushes.Black, Brushes.Transparent, element, loadFlowFontSize);
                    gts.X = element.X - gts.CalculateSize().Width / 2;
                    loadFlows.Add(gts);
                }
                break;
                }
            }

            this.loadFlows = loadFlows;
        }
Esempio n. 9
0
        public IEnumerable <LoadFlowResult> Get()
        {
            //-------------Load Flow Algorithm---------------
            List <int> buses = new List <int>();
            int        N_bus; //liczba szyn/w�z��w
            int        N_ser; //liczba element�w ga��ziowych

            //Je�li nie istniej� tego typu elementy to oznacza si� numer szyny r�wny 1 oraz warto�� zero w drugiej kolumnie.
            int[] shunts = new int[] { 1, 0 }; //elementy poprzeczne

            //int N_sh = 1; // liczba element�w poprzecznych

            //pomocnicze tablice
            List <int> Is = new List <int>(); //numery szyn pocz�tkowych
            List <int> Js = new List <int>(); // numery szyn ko�cowych

            List <string> Itype = new List <string>();
            List <double> Pb    = new List <double>();
            List <double> Qb    = new List <double>();

            //Complex c1 = new Complex(1.2, 2.0);

            //ilo�� element�w pod�u�nych
            N_ser = _context.OverheadLines.Count() + _context.TwoPhaseTransformers.Count();

            //okre�l ilo�� szyn
            foreach (var row in _context.ExternalGrids)
            {
                if (!buses.Contains(row.NodeNo))
                {
                    buses.Add(row.NodeNo);
                }
                Itype.Add(row.NodeType);
                //normalSigma[n] = (sigma[n].HasValue) ? sigma[n].Value : 0;
                Pb.Add((row.ActivePower.HasValue) ? row.ActivePower.Value : 0);
                Qb.Add((row.ReactivePower.HasValue) ? row.ReactivePower.Value : 0);
            }
            foreach (var row in _context.OverheadLines)
            {
                if (!buses.Contains(row.StartNodeNo))
                {
                    buses.Add(row.StartNodeNo);
                }
                if (!buses.Contains(row.EndNodeNo))
                {
                    buses.Add(row.EndNodeNo);
                }

                Is.Add(row.StartNodeNo);
                Js.Add(row.EndNodeNo);
            }
            N_bus = buses.Count;

            System.Diagnostics.Debug.WriteLine("BUS.COUNT: " + buses.Count);

            System.Diagnostics.Debug.WriteLine("ExternalGrid.COUNT: " + _context.ExternalGrids.Count());

            //uformuj macierz z elementami pod�u�nymi - series
            Complex[,] Series = new Complex[N_ser, 5];
            foreach (var row in _context.OverheadLines)
            {
                Complex RX = new Complex(row.UnitaryResistance * row.Length, row.UnitaryReactance * row.Length);
                Complex B  = new Complex(0, row.UnitaryCapacitance * row.Length);
                Series[(row.ID - 1), 0] = row.StartNodeNo;
                Series[(row.ID - 1), 1] = row.EndNodeNo;
                Series[(row.ID - 1), 2] = RX;
                Series[(row.ID - 1), 3] = B;
                Series[(row.ID - 1), 4] = 1; //TUTAJ BED� PRZEK�ADNIE TRANSFORMATOROW
            }

            double[]  U     = new double[N_bus];
            double?[] sigma = new double?[N_bus];

            //uformuj macierz - buses
            foreach (var row in _context.ExternalGrids)
            {
                // Buses[row.ID-1, 1] = row.NodeType;
                sigma[row.ID - 1] = row.VoltageAngle;
            }
            double[] normalSigma = new double[N_bus];
            for (int n = 0; n <= (N_bus - 1); n++)
            {
                normalSigma[n] = (sigma[n].HasValue) ? sigma[n].Value : 0; //przekonwertowanie double? na double
            }
            //sztucznie dodane napi�cia
            U[0] = 60;
            U[1] = 60;
            U[2] = 60;

            //uformuj macierz admitancyjn�
            Complex[,] Ybus = new Complex[N_bus, N_bus];
            Ybus            = formYmatrix(N_bus, N_ser, Is, Js, Series, shunts);

            //oblicz macierz Jacobiego
            double[,] Jac = new double[N_bus + 1, N_bus + 1];
            Jac           = calcJacobiMatrix(N_bus, Ybus, U, normalSigma, Itype);



            //odwr�� macierz Jacobiego
            double[,] JacInv = new double[Jac.GetLength(0), Jac.GetLength(1)];
            JacInv           = MatrixInverseFunc.Main(Jac);


            int    maxIter = 12; //maksymalna liczba iteracji
            double lambda  = 1;  //acceleration coefficient. This coefficient takes values less than one and improves the convergence characteristics of the problem.  The user may change the value of l to see its effect on the mismatch at the end of the iterations.

            for (int i = 0; i <= (maxIter - 1); i++)
            {
                for (int m = 1; m <= (N_bus - 1); m++)
                {
                    U[m] = U[m] + deltaV(m, N_bus, Itype, JacInv, Ybus, normalSigma, U, Pb, Qb) * lambda;

                    normalSigma[m] = normalSigma[m] + deltaSigma(m, N_bus, Itype, JacInv, Ybus, normalSigma, U, Pb, Qb) * lambda;
                    //System.Diagnostics.Debug.WriteLine("m " + m + "normalSigma[m]" + normalSigma[m]);
                    //System.Diagnostics.Debug.WriteLine("m " + m + "deltaSigma" + deltaSigma(m, N_bus, Itype, JacInv, Ybus, normalSigma, U, Pb, Qb));
                }
            }

            //radian to degree
            for (int c = 0; c <= (normalSigma.Length - 1); c++)
            {
                normalSigma[c] = normalSigma[c] * (180.0 / Math.PI);
            }

            //  var viewModel = new LoadFlowViewModel(U, normalSigma);

            /*
             * var viewModel = new List<LoadFlowViewModel>();
             * for(int z = 0; z <= (N_bus-1); z++)
             * {
             *    var row = new LoadFlowViewModel();
             *    row.busNo = z;
             *    row.resultU = U[z];
             *    row.resultSigma = normalSigma[z];
             *    viewModel.Add(row);
             * }
             * return viewModel;
             */

            var list = new LoadFlows();

            list.Results = new List <LoadFlowResult>();
            for (int z = 0; z <= (N_bus - 1); z++)
            {
                var a = new LoadFlowResult()
                {
                    busNo = z, resultU = U[z], resultSigma = normalSigma[z]
                };
                list.Results.Add(a);
            }
            return(list.Results);
        }