使用FloPy加载GMS导出的MODFLOW-USG模型出现ValueError如何解决
FloPy加载GMS导出MODFLOW-USG模型LPF包报错解决方案
错误根因
该错误由GMS导出的MODFLOW-USG原生文本格式与FloPy内置的LPF包数组解析规则不匹配导致:FloPy解析数组控制记录时,默认读取行前10位字符转换为整数类型的LOCAT参数,但GMS导出的ANGLEX数组控制行首段直接写入了浮点型的角度数值,触发类型转换失败。
可行解决方案
方案1:关闭不需要的ANGLEX参数
如果你的模拟场景不需要用到水平各向异性角度参数,可直接在GMS中关闭ANGLEX相关配置,重新导出原生文本文件后再用FloPy加载,即可跳过ANGLEX读取环节直接完成加载。
注意:修改GMS配置前请备份原始模型工程方案2:手动修正LPF文件格式
打开LPF包对应文本文件,找到hani层数据之后的ANGLEX数组控制行,按照MODFLOW-USG的数组控制记录规范调整格式:前10位填写整数0(表示数组内容紧跟在控制行之后),10位之后填写数组格式说明(如(20F10.3),根据你实际的数值宽度调整格式),调整完成后保存文件再重新加载即可。
示例调整前的错误控制行:-877.0 -921.0 -856.0 ...示例调整后的正确控制行:
0 (20F10.3) -877.0 -921.0 -856.0 ...方案3:代码端分步骤加载模型
加载模型时通过load_only参数先跳过LPF包,加载完其余包后手动读取LPF参数构造LPF对象添加到模型中,参考代码如下:# 加载除LPF外的所有所需包 load_model = flopy.modflow.Modflow.load( 'HTHModel', model_ws='model_ws', version='mfusg', exe_name='exe_name', verbose=True, check=False, load_only=['DIS', 'BAS6', 'OC'] # 按需补充其他需要加载的包名 ) # 手动构造LPF包,参数从原始LPF文件中读取填写 lpf = flopy.modflow.ModflowLpf( load_model, laytyp=[0], # 替换为你的LAYTYP参数 layavg=[0], # 替换为你的LAYAVG参数 chani=[1], # 替换为你的CHANI参数 layvka=[0], # 替换为你的LAYVKA参数 laywet=[0], # 替换为你的LAYWET参数 hdry=-1e30, # 替换为你的HDRY参数 hk=hk_array, # 替换为你读取到的hk数组 hani=hani_array, # 替换为你读取到的hani数组 anglex=anglex_array # 替换为你读取到的anglex数组 )方案4:调整FloPy版本
部分FloPy版本对MODFLOW-USG的LPF包ANGLEX参数解析存在兼容bug,可尝试升级到最新稳定版FloPy,或切换到3.3.4、3.4.1这类经过广泛测试的历史版本重试加载。
内容的提问来源于stack exchange,提问作者张鹏伟
相关产品推荐
相关产品推荐

