Esempio n. 1
0
        public int NACTIV; // Количество активных ячеек

        public EGRID(string filename)
        {
            FileReader br = new FileReader();

            br.OpenBinaryFile(filename);

            System.Diagnostics.Debug.WriteLine("EGRID");

            while (br.Position < br.Length - 24)
            {
                br.ReadHeader();
                if (br.header.keyword == "FILEHEAD")
                {
                    FILEHEAD   = br.ReadIntList();
                    GRIDTYPE   = FILEHEAD[4];
                    DUALPORO   = FILEHEAD[5];
                    FORMATDATA = FILEHEAD[6];
                    continue;
                }

                if (br.header.keyword == "MAPUNITS")
                {
                    br.ReadBytes(4);
                    MAPUNITS = br.ReadString(8);
                    br.ReadBytes(4);
                    continue;
                }

                if (br.header.keyword == "MAPAXES")
                {
                    br.ReadBytes(4);
                    XENDYAXIS = br.ReadFloat();
                    YENDYAXIS = br.ReadFloat();
                    XORIGIN   = br.ReadFloat();
                    YORIGIN   = br.ReadFloat();
                    XENDXAXIS = br.ReadFloat();
                    YENDXAXIS = br.ReadFloat();
                    br.ReadBytes(4);
                    continue;
                }

                if (br.header.keyword == "GRIDHEAD")
                {
                    GRIDHEAD = br.ReadIntList();
                    NX       = GRIDHEAD[1];
                    NY       = GRIDHEAD[2];
                    NZ       = GRIDHEAD[3];
                    continue;
                }

                if (br.header.keyword == "COORD")
                {
                    COORD = br.ReadFloatList(6 * (NY + 1) * (NX + 1));
                    continue;
                }

                if (br.header.keyword == "ZCORN")
                {
                    ZCORN = br.ReadBigList((ulong)(8 * NX * NY * NZ));
                    continue;
                }

                if (br.header.keyword == "ACTNUM")
                {
                    ACTNUM = br.ReadIntList();

                    // Для сжатого формата хранения данных
                    // требуется провести индексирования массива активных ячеек
                    // ACTNUM сам по себе это "1" для активной ячейки и "0" для не активной

                    int index = 1;
                    for (int iw = 0; iw < ACTNUM.Length; ++iw)
                    {
                        if (ACTNUM[iw] > 0)
                        {
                            ACTNUM[iw] = index++;
                        }
                    }

                    NACTIV = index - 1;

                    // Теперь ACTNUM хранит ещё и индекс ячейки INDEX, который есть просто линейный порядковый номер
                    // увеличенный на "1", так как надо сохранить нулевые значения в неактивных ячейках
                    continue;
                }

                System.Diagnostics.Debug.WriteLine(br.header.keyword);
                br.SkipEclipseData();
            }
            br.CloseBinaryFile();
        }