コード例 #1
0
 public void ValidateWellLocationUniqness()
 {
     if (WellsList != null && WellsList.Count > 0)
     {
         List <WellRecord> localWellRecords = WellsList.Distinct(new WellLocationComparator()).ToList();
         FailedRecords.AddRange(WellsList.Except(localWellRecords).ToList());
         WellsList = localWellRecords;
     }
 }
コード例 #2
0
        private QGradientAndConsumptions SendWellsForGradient(QGradient gradient)
        {
            WellsList wellsList = _gvm.wellsList;
            GradientAndWellsList <QGradient> gradientAndWellsList = new GradientAndWellsList <QGradient>
            {
                Gradient  = gradient,
                WellsList = wellsList,
            };
            QGradientAndConsumptions gradientAndConsumptions = Functions.QGradientMethod(gradientAndWellsList);

            return(gradientAndConsumptions);
        }
コード例 #3
0
        private PGradientAndPressures SendWellsForGradient(PGradient gradient)
        {
            WellsList wellsList = _gvm.wellsList;
            GradientAndWellsList <PGradient> gradientAndWellsList = new GradientAndWellsList <PGradient>
            {
                Gradient  = gradient,
                WellsList = wellsList,
            };
            PGradientAndPressures pGradientAndPressures = Functions.PGradientMethod(gradientAndWellsList);

            return(pGradientAndPressures);
        }
コード例 #4
0
 public void GetGroupsWellsLists()
 {
     Records?.ForEach(record =>
     {
         if (record.GetType() == typeof(GroupRecord))
         {
             GroupsList.Add((GroupRecord)record);
         }
         else
         {
             WellsList.Add((WellRecord)record);
         }
     });
 }
コード例 #5
0
        public static PressuresAndTimes GetPressures(WellsList wellsList, bool prepareStatic = true)
        {
            PressuresAndTimes pressuresAndTimes = Functions.GetTimesAndPressures(wellsList);
            List <double>     staticPressures   = new List <double>();

            if (prepareStatic)
            {
                Functions.PrepareStaticPressures(wellsList, staticPressures);
                if (wellsList.Wells[0].Mode == Mode.Reverse)
                {
                    pressuresAndTimes.StaticPressures = staticPressures;
                }
            }
            wellsList.Wells[0].CalculatedP = pressuresAndTimes.Pressures1f.Last();
            wellsList.Wells[1].CalculatedP = pressuresAndTimes.Pressures2f.Last();
            wellsList.Wells[2].CalculatedP = pressuresAndTimes.Pressures3.Last();
            return(pressuresAndTimes);
        }
コード例 #6
0
        private void AddWellsToGroups()
        {
            if (WellsList != null && WellsList.Count > 0)
            {
                foreach (KeyValuePair <IRecord, List <WellRecord> > group in GroupsDictionary)
                {
                    List <WellRecord> deletedWells = new List <WellRecord>();
                    foreach (var well in WellsList)
                    {
                        if (IsWellGroupChild((GroupRecord)group.Key, (WellRecord)well))
                        {
                            GroupsDictionary[group.Key].Add((WellRecord)well);
                            deletedWells.Add(well);
                        }
                    }

                    WellsList = WellsList.Except(deletedWells).ToList();
                }
            }
        }
コード例 #7
0
        public static void PrepareStaticPressures(WellsList wells, List <double> staticPressures)
        {
            switch (wells.Indexes.Count)
            {
            case 1:
                for (int i = 0; i != wells.Indexes[0]; i++)
                {
                    staticPressures.Add(wells.Wells[0].P);
                }
                break;

            case 2:
                for (int i = 0; i != wells.Indexes[0]; i++)
                {
                    staticPressures.Add(wells.Wells[0].P);
                }
                for (int i = wells.Indexes[0]; i < wells.Indexes[1] + 1; i++)
                {
                    staticPressures.Add(wells.Wells[1].P);
                }
                break;

            case 3:
                for (int i = 0; i != wells.Wells[0].N; i++)
                {
                    staticPressures.Add(wells.Wells[0].P);
                }
                for (int i = 0; i < wells.Wells[1].N; i++)
                {
                    staticPressures.Add(wells.Wells[1].P);
                }
                for (int i = 0; i < wells.Wells[2].N; i++)
                {
                    staticPressures.Add(wells.Wells[2].P);
                }
                break;
            }
        }
コード例 #8
0
        public static PressuresAndTimes GetTimesAndPressures(WellsList wells)
        {
            List <double> times             = GetTimes(wells.Wells, true);
            List <double> pressures         = new List <double>();
            var           pressuresAndTimes = new PressuresAndTimes();

            #region Unused

            //if (wells.Wells.Count == 1)
            //{
            //    List<double> tOne = new List<double>(wells.Wells[0].N);
            //    List<double> pOne = new List<double>(wells.Wells[0].N);
            //    double step = (wells.Wells[0].Time2 - wells.Wells[0].Time1) / (wells.Wells[0].N - 1);
            //    for (int i = 0; i < wells.Wells[0].N; i++)
            //    {
            //        tOne.Add(wells.Wells[0].Time1 + i * step);
            //    }
            //    for (int i = 0; i != wells.Wells[0].N; i++)
            //    {
            //        if (tOne[i] == 0.0)
            //        {
            //            pOne.Add(0 + wells.Wells[0].P0);
            //        }
            //        else
            //        {
            //            pOne.Add(Pressure(wells.Wells[0], wells.Wells[0].Q, tOne[i]) + wells.Wells[0].P0);
            //        }
            //    }
            //    pressures = pOne;
            //    times = tOne;
            //    pressuresAndTimes.Pressures1 = pressures;
            //    pressuresAndTimes.Times1 = times;
            //    //indexes.Add(times.Count);
            //    wells.Wells[0].P = pressures.Last();
            //}

            //if (wells.Wells.Count == 2)
            //{
            //    List<double> tOne = new List<double>();
            //    List<double> tTwo = new List<double>();
            //    List<double> pOne = new List<double>();
            //    List<double> pTwo = new List<double>();
            //    int counter1 = 0;
            //    double step1 = (wells.Wells[0].Time2 - wells.Wells[0].Time1) / (wells.Wells[0].N - 1);
            //    double step2 = (wells.Wells[1].Time2 - wells.Wells[1].Time1) / (wells.Wells[1].N - 1);
            //    for (int i = 0; i != wells.Wells[0].N; i++)
            //    {
            //        tOne.Add(wells.Wells[0].Time1 + i * step1);
            //    }
            //    for (int i = 0; i != wells.Wells[1].N; i++)
            //    {
            //        tTwo.Add(wells.Wells[1].Time1 + i * step2);
            //    }
            //    times.AddRange(tOne);
            //    times.AddRange(tTwo);
            //    for (int i = 0; i != times.Count; i++)
            //    {
            //        if (times[i] == 0.0)
            //        {
            //            pOne.Add(0.0 + wells.Wells[0].P0);
            //        }
            //        else
            //        {
            //            pOne.Add(Pressure(wells.Wells[0], wells.Wells[0].Q, times[i]) + wells.Wells[0].P0);

            //            if ((times[i] >= wells.Wells[1].Time1) && (i >= wells.Wells[0].N))
            //            {
            //                counter1++;
            //                {
            //                    pTwo.Add(Pressure(wells.Wells[0], wells.Wells[0].Q, times[i])
            //                           + Pressure(wells.Wells[0], wells.Wells[1].Q - wells.Wells[0].Q, times[i] - wells.Wells[1].Time1) + wells.Wells[0].P0);

            //                }
            //            }

            //        }
            //    }
            //    List<double> P1f = new List<double>();
            //    List<double> P1s = new List<double>();
            //    List<double> T1f = new List<double>();
            //    List<double> T1s = new List<double>();
            //    for (int i = 0; i != times.Count - counter1; i++)
            //    {
            //        P1f.Add(pOne[i]);
            //        T1f.Add(times[i]);
            //    }
            //    for (int i = 0; i != counter1; i++)
            //    {
            //        P1s.Add(pOne[times.Count - counter1 + i]);
            //        T1s.Add(times[times.Count - counter1 + i]);
            //    }

            //    List<double> P2new = new List<double>(counter1);
            //    List<double> T2new = new List<double>(counter1);
            //    for (int i = 0; i < counter1; i++)
            //    {
            //        T2new.Add(times[times.Count - counter1 + i]);
            //        P2new.Add(pTwo[i]);
            //    }

            //    // T2new to P1S
            //    pressures.AddRange(P1f);
            //    wells.Wells[0].P = P1f.Last();
            //    //indexes.Add(pressures.Count);
            //    pressures.AddRange(P2new);
            //    wells.Wells[1].P = P2new.Last();
            //    pressures.RemoveAt(wells.Wells[0].N);
            //    // indexes.Add(pressures.Count);
            //    times.RemoveAt(wells.Wells[0].N);

            //    pressuresAndTimes.Pressures1f = P1f;
            //    pressuresAndTimes.Times1f = T1f;
            //    pressuresAndTimes.Pressures1s = P1s;
            //    pressuresAndTimes.Times1s = T1s;
            //    pressuresAndTimes.Pressures2 = P2new;
            //    pressuresAndTimes.Times2 = T2new;
            //}

            #endregion
            if (wells.Wells.Count == 3)
            {
                List <double> tOne      = new List <double>();
                List <double> tTwo      = new List <double>();
                List <double> tThree    = new List <double>();
                List <double> pOne      = new List <double>();
                List <double> pTwo      = new List <double>();
                List <double> pThree    = new List <double>();
                int           index1    = 0;
                int           index2    = 0;
                bool          ind_flag1 = false;
                bool          ind_flag2 = false;
                double        step1     = (wells.Wells[0].Time2 - wells.Wells[0].Time1) / (wells.Wells[0].N - 1);
                double        step2     = (wells.Wells[1].Time2 - wells.Wells[1].Time1) / (wells.Wells[1].N - 1);
                double        step3     = (wells.Wells[2].Time2 - wells.Wells[2].Time1) / (wells.Wells[2].N - 1);

                for (int i = 0; i != wells.Wells[0].N; i++)
                {
                    tOne.Add(wells.Wells[0].Time1 + i * step1);
                    tTwo.Add(wells.Wells[1].Time1 + i * step2);
                    tThree.Add(wells.Wells[2].Time1 + i * step3);
                }
                double Q1, Q2, Q3;
                if (wells.Wells[0].Mode == Mode.Reverse)
                {
                    Q1 = wells.Wells[0].CalculatedQ;
                    Q2 = wells.Wells[1].CalculatedQ;
                    Q3 = wells.Wells[2].CalculatedQ;
                }
                else
                {
                    Q1 = wells.Wells[0].Q;
                    Q2 = wells.Wells[1].Q;
                    Q3 = wells.Wells[2].Q;
                }
                for (int i = 0; i != times.Count; i++)
                {
                    if (times[i] == 0.0)
                    {
                        pOne.Add(0.0 + wells.Wells[0].P0);
                    }
                    else
                    {
                        pOne.Add(Pressure(wells.Wells[0], Q1, times[i]) + wells.Wells[0].P0);
                        if (times[i] > wells.Wells[1].Time1 || i > wells.Wells[0].N - 1)
                        {
                            if (ind_flag1 == false)
                            {
                                index1    = i;
                                ind_flag1 = true;
                            }

                            pTwo.Add(Pressure(wells.Wells[0], Q1, times[i])
                                     + Pressure(wells.Wells[1], Q2 - Q1, times[i] - wells.Wells[1].Time1)
                                     + wells.Wells[0].P0);
                        }
                        if ((times[i] > wells.Wells[2].Time1) || (i > wells.Wells[0].N + wells.Wells[1].N - 1))
                        {
                            if (ind_flag2 == false)
                            {
                                index2    = i;
                                ind_flag2 = true;
                            }
                            pThree.Add(Pressure(wells.Wells[0], Q1, times[i])
                                       + Pressure(wells.Wells[1], Q2 - Q1, times[i] - wells.Wells[1].Time1)
                                       + Pressure(wells.Wells[1], Q3 - Q2, times[i] - wells.Wells[2].Time1)
                                       + wells.Wells[0].P0);
                        }
                    }
                }


                List <double> P1f = new List <double>();
                List <double> P1s = new List <double>();
                List <double> T1f = new List <double>();
                List <double> T1s = new List <double>();

                for (int i = 0; i < index1; i++)
                {
                    P1f.Add(pOne[i]);
                    T1f.Add(times[i]);
                }
                for (int i = 0; i < times.Count - (index1); i++)
                {
                    P1s.Add(pOne[i + index1]);
                    T1s.Add(times[i + index1]);
                }

                List <double> T2f = new List <double>((index2 + 1) - (index1 + 1));
                List <double> P2f = new List <double>((index2 + 1) - (index1 + 1));
                List <double> T2s = new List <double>((times.Count - 1) - (index2));
                List <double> P2s = new List <double>((times.Count - 1) - (index2));
                for (int i = 0; i < (index2 - index1); i++)
                {
                    T2f.Add(times[i + index1]);
                    P2f.Add(pTwo[i]);
                }
                for (int i = 0; i != (times.Count) - index2; i++)
                {
                    T2s.Add(times[i + index2]);
                    P2s.Add(pTwo[i + index2 - wells.Wells[0].N]);
                }
                List <double> T3new = new List <double>(times.Count - 1 - index2);
                List <double> P3new = new List <double>(times.Count - 1 - index2);
                for (int i = 0; i != times.Count - (index2); i++)
                {
                    T3new.Add(times[i + index2]);
                    P3new.Add(pThree[i]);
                }


                pressures.AddRange(P1f);
                wells.Wells[0].CalculatedP = P1f.Last();
                //indexes.Add(pressures.Count);
                pressures.AddRange(P2f);
                wells.Wells[1].CalculatedP = P2f.Last();
                pressures.RemoveAt(wells.Wells[0].N);
                //indexes.Add(pressures.Count);
                pressures.AddRange(P3new);
                wells.Wells[2].CalculatedP = P3new.Last();
                pressures.RemoveAt(wells.Wells[0].N + wells.Wells[1].N - 1);
                //indexes.Add(pressures.Count);
                times.RemoveAt(wells.Wells[0].N);
                times.RemoveAt(wells.Wells[0].N + wells.Wells[1].N - 1);

                pressuresAndTimes.Pressures1f = P1f;
                pressuresAndTimes.Times1f     = T1f;
                pressuresAndTimes.Pressures1s = P1s;
                pressuresAndTimes.Times1s     = T1s;
                pressuresAndTimes.Pressures2f = P2f;
                pressuresAndTimes.Times2f     = T2f;
                pressuresAndTimes.Pressures2s = P2s;
                pressuresAndTimes.Times2s     = T2s;
                pressuresAndTimes.Pressures3  = P3new;
                pressuresAndTimes.Times3      = T3new;
            }
            return(pressuresAndTimes);
        }