Усечение файла CBB с использованием Flopy - PullRequest
0 голосов
/ 20 декабря 2018

Я заинтересован в обрезании двоичного файла MODBLOW CBB после определенного количества периодов нагрузки.Используя утилиты двоичных файлов Flopy, я смог понять, как распаковать двоичный файл и извлечь значения в массив.Тем не менее, неясно, могу ли я использовать утилиты Flopy напрямую для создания нового двоичного файла.Есть ли у Flopy утилита, которая поможет облегчить запись части файла CBB в новый двоичный файл?Новый файл CBB будет использоваться в качестве входных данных для MODPATH, поэтому форматирование файла CBB должно остаться неизменным.

С одной лишь Flopy я чувствую, что близок к получению необходимых результатов.Я уверен, что есть специфичные для Python библиотеки, которые можно использовать для получения желаемых результатов, но я подумал, что посмотрю, смогу ли я сначала добраться до него с помощью Flopy.

Вот что я изучил до сих пор:

import flopy.utils.binaryfile as bf
CBBFile = 'PRE_WT_WP3_PREISS_MidK.cbb'
CBB = bf.CellBudgetFile(CBBFile)
CBB.list_records()

Вывод из CBB.list_records () для первого и последнего периодов стресса:

(1, 1, '         STORAGE', 537, 341, 12, 0, 0.0, 0.0, -1.0, '', '', '', '')
(1, 1, '   CONSTANT HEAD', 537, 341, 12, 0, 0.0, 0.0, -1.0, '', '', '', '')
(1, 1, 'FLOW RIGHT FACE ', 537, 341, 12, 0, 0.0, 0.0, -1.0, '', '', '', '')
(1, 1, 'FLOW FRONT FACE ', 537, 341, 12, 0, 0.0, 0.0, -1.0, '', '', '', '')
(1, 1, 'FLOW LOWER FACE ', 537, 341, 12, 0, 0.0, 0.0, -1.0, '', '', '', '')
(1, 1, '          DRAINS', 537, 341, 12, 0, 0.0, 0.0, -1.0, '', '', '', '')
(1, 1, '   RIVER LEAKAGE', 537, 341, 12, 0, 0.0, 0.0, -1.0, '', '', '', '')
(1, 1, ' HEAD DEP BOUNDS', 537, 341, 12, 0, 0.0, 0.0, -1.0, '', '', '', '')
(1, 1, '        RECHARGE', 537, 341, 12, 0, 0.0, 0.0, -1.0, '', '', '', '')

....

(1, 6, '         STORAGE', 537, 341, 12, 0, 0.0, 0.0, -1.0, '', '', '', '')
(1, 6, '   CONSTANT HEAD', 537, 341, 12, 0, 0.0, 0.0, -1.0, '', '', '', '')
(1, 6, 'FLOW RIGHT FACE ', 537, 341, 12, 0, 0.0, 0.0, -1.0, '', '', '', '')
(1, 6, 'FLOW FRONT FACE ', 537, 341, 12, 0, 0.0, 0.0, -1.0, '', '', '', '')
(1, 6, 'FLOW LOWER FACE ', 537, 341, 12, 0, 0.0, 0.0, -1.0, '', '', '', '')
(1, 6, '          DRAINS', 537, 341, 12, 0, 0.0, 0.0, -1.0, '', '', '', '')
(1, 6, '   RIVER LEAKAGE', 537, 341, 12, 0, 0.0, 0.0, -1.0, '', '', '', '')
(1, 6, ' HEAD DEP BOUNDS', 537, 341, 12, 0, 0.0, 0.0, -1.0, '', '', '', '')
(1, 6, '        RECHARGE', 537, 341, 12, 0, 0.0, 0.0, -1.0, '', '', '', '')

Я хочу сохранитьвсе эти бюджетные термины в новом двоичном файле, но хотелось бы удалить все термины из последнего периода стресса (в этом примере период стресса 6).

Я попытался запросить данные периода стресса в массив, а затемзапишите эти данные в новый двоичный файл с кодом ниже.Я сталкиваюсь с проблемами памяти с этим кодом.Пример файла CBB, обрабатываемого здесь, значительно меньше (~ 460 МБ), чем CBB, который я в конечном итоге хотел бы обработать (~ 55 ГБ).Кажется, что чтение файла в массив может быть ненужным для того, что я пытаюсь сделать.

allRec = CBB.get_data(kstpkper = (0,1))
i = 1
while i < 45:
   rec = CBB.get_data(kstpkper = (0,i))
   allRec = np.append(allRec, rec)
   i += 1
np.save('StrippedCBBFile', allRec)

Моя другая идея состояла в том, чтобы построчно читать файл CBB и записывать только те данные, которые янеобходимость.Это потребует декодирования строки заголовка, чтобы определить текущий период стресса, чтобы узнать, когда прекратить запись данных.Мне не удалось декодировать информацию заголовка, чтобы сделать это.

Спасибо!

1 Ответ

0 голосов
/ 04 января 2019

Специальных утилит для флоппи для перезаписи двоичных бюджетных файлов не существует. ветвь разработки flopy имеет метод (.get_position()) для определения позиции начала данных (и информации заголовка) для записи в двоичном файле бюджета.Метод .get_position() будет доступен в будущих версиях Flopy (версия> 3.2.10).

>>> import flopy 
>>> cobj = flopy.utils.CellBudgetFile('freyberg.gitcbc')
>>> cobj.get_indices(text='CONSTANT HEAD')
array([   0,    8,   16, ..., 8752, 8760, 8767])
>>> cobj.get_position(8767)
50235424
>>> cobj.get_position(8767, header=True)
50235372

Данные о местоположении могут быть использованы для создания двоичного файла с фрагментом двоичного файла бюджета с использованием стандартныхпитон.

fin = open('freyberg.gitcbc', 'rb')
fin.seek(50235372)
length = os.path.getsize(fpth) - 50235372

buffsize = 32
with open('end.cbc', 'wb') as fout:
    while length:
        chunk = min(buffsize, length)
        data = fin.read(chunk)
        fout.write(data)
        length -= chunk 
...