我有兴趣在一定数量的压力期后截断二进制 MODFLOW 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 mb) 比我最终想要处理的 CBB (~55 gb) 小得多。对于我正在尝试做的事情,似乎不需要将文件读取到数组中。
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 文件并只写出我需要的数据。这将需要对标题行进行解码以确定当前的压力期,以了解何时停止写入数据。我无法解码标题信息来做到这一点。
谢谢!