Я заинтересован в обрезании двоичного файла 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 и записывать только те данные, которые янеобходимость.Это потребует декодирования строки заголовка, чтобы определить текущий период стресса, чтобы узнать, когда прекратить запись данных.Мне не удалось декодировать информацию заголовка, чтобы сделать это.
Спасибо!