使用Flopy截断CBB文件

2024-09-26 22:11:10 发布

您现在位置:Python中文网/ 问答频道 /正文

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

单凭弗洛比,我觉得我就快得到我需要的结果了。我确信有一些特定于Python的库可以用来获得所需的结果,但是我想我会先看看是否可以用Flopy实现。在

以下是我目前所调查的情况:

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

输出来自CBB.list_记录()对于第一个和最后一个压力期:

^{pr2}$

。。。。在

(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文件比我最终要处理的CBB文件(约55gb)小得多(约460mb)。看来,对于我正在尝试的操作,可能不需要将文件读取到数组中。在

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文件,只写出我需要的数据。这将需要对标题行进行解码,以确定当前的压力期,以知道何时停止写入数据。我无法解码头信息这样做。在

谢谢!在


Tags: 文件数据实用程序二进制数组flowheadlist
1条回答
网友
1楼 · 发布于 2024-09-26 22:11:10

对于重写二进制预算文件,没有任何特定的flopy实用程序。flopy develop branch有一个方法(.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

位置数据可以用标准python创建一个二进制文件,其中包含二进制预算文件的一部分。在

^{pr2}$

相关问题 更多 >

    热门问题