Esempio n. 1
0
 private void CalcNode(Node node)
 {
     if (node.wells.Count != 0)
     {
         double TG = 0, PG = 0, G = 0;
         foreach (var well in node.wells)
         {
             if (well.Data.gas_output + well.Data.cond_output != 0) CalcShtutzer(well);
             TG += well.Data.inlet_T * (well.Gg + well.Gl);
             PG += well.Data.inlet_P * (well.Gg + well.Gl);
             G += (well.Gg + well.Gl);
         }
         if (G == 0)
         {
             node.T = 0;
             node.P = 0;
         }
         else
         {
             node.T = TG/G;
             node.P = PG/G;
         }
         node.G = G;
     }
     else
     {
         var _pipes = _graph.pipes.Where(x => x.EndNode == node).ToList();
         if (_pipes.Count == 0)
         {
             node.P = 0;
             node.T = 0;
             node.G = 0;
         }
         else
         {
             foreach (var pipe in _pipes)
             {
                 CalcPipe(pipe);
             }
             if (node.G != 0)
             {
                 node.T /= node.G;
                 node.P /= node.G;
             }
             else
             {
                 node.T = 0;
                 node.P = 0;
             }
         }
     }
 }
Esempio n. 2
0
 private void FindBindNodes(Node endNode)
 {
     var bindNodes =
         dbEntities.gather_points.Where(x => x.next_gather_point_id == endNode.Id).ToList().Select(x => new Node {Id = x.gather_point_id, Name = x.name, NextNode = endNode}).ToList();
     if (bindNodes.Count > 0)
     {
         nodes.AddRange(bindNodes);
         foreach (var node in bindNodes)
         {
             FindBindNodes(node);
         }
     }
 }
Esempio n. 3
0
 private void GetNodes()
 {
     var sborNode = dbEntities.gather_points.Where(x => x.next_gather_point_id == null).ToList();
     if (sborNode.Count() != 1)
         throw new Exception("Конечный пункт сбора либо не задан, либо не уникален.");
     nodes.Add(new Node {Id = sborNode.First().gather_point_id, Name = sborNode.First().name, NextNode = null, P = 0, G = 0, T = 0});
     endNode = nodes[0];
     FindBindNodes(endNode);
     AddWells();
 }
        private void CalcNode(Node node)
        {
            if (node.wells.Count != 0)
            {
                WellData firstWell = null;
                double TG = 0, PG = 0, G = 0;
                for (int i = 0; i < node.wells.Count(); i++) //выполняем расчет G для всех скважин
                {

                    node.wells[i].G = new double[5];
                    node.wells[i].P = new double[5];
                    if (node.wells[i].Gkr == 0) continue;
                    if (firstWell == null) //если скважина первая, то считаем для нее давление
                    {
                        firstWell = node.wells[i];
                        node.wells[i].P[0] = beta_kr * node.wells[i].Pkr;
                        node.wells[i].G[0] = Math.Sqrt(node.wells[i].a[2])
                            * node.wells[i].Gkr;
                        for (int m = 1; m < 5; m++)
                        {
                            node.wells[i].P[m] = (m * 0.25 * (1 - beta_kr) + beta_kr) * node.wells[i].Pkr;
                            node.wells[i].G[m] = Math.Sqrt(node.wells[i].a[0] * Math.Pow(m * 0.25,2) + node.wells[i].a[1] * m * 0.25 + node.wells[i].a[2])
                                * node.wells[i].Gkr;
                        }
                    }
                    else
                    {
                        for (int m = 0; m < 5; m++)
                        {
                            node.wells[i].G[m] = Math.Sqrt(node.wells[i].a[0] * Math.Pow(m * 0.25, 2) + node.wells[i].a[1] * m * 0.25 + node.wells[i].a[2])
                                * node.wells[i].Gkr;
                        }
                    }
                }
                //считаем в узле сбора
                node.P_ = new double[5];
                node.G_ = new double[5];
                node.T_ = new double[5];

                if (firstWell == null)
                {
                    node.T = 0;
                    node.P = 0;
                    return;
                }

                for (int i = 0; i < 5; i++)
                {
                    double big_unkown_coef = 300;
                    node.P_[i] = firstWell.P[i] - K_p * big_unkown_coef * firstWell.G[i];
                    for (int j = 0; j < node.wells.Count(); j++)
                        TG += node.wells[j].Data.inlet_T*node.wells[j].G[i];
                    node.G_[i] = node.wells.Sum(x => x.G[i]);
                    if (node.G_[i] == 0) node.T_[i] = 0;
                        else node.T_[i] = TG/node.G_[i];
                    TG = 0;
                }

                node.a = GetParabolCoefs(new[] {node.P_[0], node.P_[1], node.P_[2]}, new[] {node.G_[0], node.G_[1], node.G_[2]});
                node.b = GetParabolCoefs(new[] { node.P_[2], node.P_[3], node.P_[4] }, new[] { node.G_[2], node.G_[3], node.G_[4]});

                //считаем давление в остальных скважинах

                for (int j = 1; j < node.wells.Count(); j++) //выполняем расчет для первой скважины
                {
                    for (int m = 1; m < 5; m++)
                    {
                        double big_unkown_coef = 300;
                        node.wells[j].P[m] = firstWell.P[m] + K_p * big_unkown_coef * firstWell.G[m];
                    }
                }
            }
            else
            {
                if (node.Name == "K336")
                {
                    string f = "";
                }
                var _pipes = _graph.pipes.Where(x => x.EndNode == node).ToList();
                if (_pipes.Count == 0)
                {
                    node.P_ = new double[5];
                    node.G_ = new double[5];
                    node.a = new double[5];
                    node.b = new double[5];
                    node.P = 0;
                    node.T = 0;
                    node.G = 0;
                }
                else
                {
                    foreach (var pipe in _pipes)
                    {
                        CalcPipe(pipe);
                    }
                    for (int i = 0; i < 5; i++)
                    {
                        if (node.G_[i] == 0)
                        {
                            node.T_[i] = 0;
                            node.P_[i] = 0;
                        }
                        else
                        {
                            node.T_[i] /= node.G_[i];
                            node.P_[i] /= node.G_[i];
                        }
                    }
                    if (node.P_.Max(x => x) == 0)
                    {
                        node.a = new double[5];
                        node.b = new double[5];
                    }
                    else
                    {
                        node.a = GetParabolCoefs(new[] {node.P_[0], node.P_[1], node.P_[2]}, new[] {node.G_[0], node.G_[1], node.G_[2]});
                        node.b = GetParabolCoefs(new[] {node.P_[2], node.P_[3], node.P_[4]}, new[] {node.G_[2], node.G_[3], node.G_[4]});
                    }

                }
            }
        }