我有兴趣在一定数量的压力周期后截断二进制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文件,只写出我需要的数据。这将需要对标题行进行解码以确定当前压力周期,以知道何时停止写入数据。我无法解码标头信息。
谢谢!
答案 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