使用Flopy截断CBB文件

时间:2018-12-20 19:56:14

标签: python flopy

我有兴趣在一定数量的压力周期后截断二进制MODFLOW CBB文件。使用Flopy二进制文件实用程序,我已经能够了解如何解压缩二进制文件并将值提取到数组中。但是,尚不清楚我是否可以直接使用Flopy实用程序来创建新的二进制文件。 Flopy是否有实用程序来帮助将CBB文件的一部分写到新的二进制文件中?新的CBB文件将用作MODPATH的输入,因此CBB文件的格式需要保持不变。

仅凭Flopy,我就感觉自己已经接近获得所需的结果。我确定有一些特定于Python的库可以用来获得预期的结果,但是我认为我可以先使用Flopy来实现。

这是到目前为止我研究的内容:

Domain

从CBB.list_records()输出的第一个和最后一个压力周期:

import flopy.utils.binaryfile as bf
CBBFile = 'PRE_WT_WP3_PREISS_MidK.cbb'
CBB = bf.CellBudgetFile(CBBFile)
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, '', '', '', '')

我希望将所有这些预算条款保留在新的二进制文件中,但想删除最后一个压力期(在此示例中为“压力期6”)中的所有条款。

我尝试将压力周期数据查询到数组中,然后使用以下代码将此数据写入新的二进制文件。我正在使用此代码遇到内存问题。这里要处理的示例CBB文件比我最终要处理的CBB(〜55 gb)小得多(〜460 mb)。似乎对于我要执行的操作而言,将文件读取到数组可能是不必要的。

(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, '', '', '', '')

我的另一个想法是逐行读取CBB文件,只写出我需要的数据。这将需要对标题行进行解码以确定当前压力周期,以知道何时停止写入数据。我无法解码标头信息。

谢谢!

1 个答案:

答案 0 :(得分:0)

没有任何特定的flopy实用程序来重写二进制预算文件。 flopy develop branch具有一种方法(.get_position()),用于确定二进制预算文件中记录的数据开始位置(和标题信息)。 .get_position()方法将在以后的浮动版本(版本> 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

位置数据可用于使用标准python使用二进制预算文件的一部分创建二进制文件。

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