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(); }