如何在Flopy中定义MODFLOW 6模型的瞬态/稳态模拟?
在Flopy中定义MODFLOW 6的稳态/瞬态模式
一、稳态模式设置
稳态模式的核心是在TDIS(时间离散)包中,将所有应力期的steady参数设为True。此时模型不考虑时间变化,每个应力期内的水文地质参数保持恒定。
示例代码:
import flopy # 初始化模拟对象 sim = flopy.mf6.MFSimulation(sim_name="steady_state_model", version="mf6", exe_name="mf6") # 定义TDIS包,设置为稳态 tdis = flopy.mf6.ModflowTdis( sim, pname="tdis", time_units="DAYS", nper=1, # 单个应力期 perioddata=[[365.0, 1, 1.0]], # [应力期时长, 时间步数量, 时间步长乘数] steady=[True] # 标记该应力期为稳态 )
二、瞬态模式设置
瞬态模式需要满足两个条件:
- 在TDIS包中,至少有一个应力期的
steady参数设为False; - 结合
stress_period_data和MFTransientList对象,定义随时间变化的边界条件或源汇项(如抽水井、河流、水头边界等)。
示例代码:
# 初始化模拟对象 sim = flopy.mf6.MFSimulation(sim_name="transient_model", version="mf6", exe_name="mf6") # 定义TDIS包,设置为瞬态 tdis = flopy.mf6.ModflowTdis( sim, pname="tdis", time_units="DAYS", nper=2, # 两个应力期 # 每个应力期的时长、时间步数量、时间步长乘数 perioddata=[[180.0, 10, 1.0], [185.0, 10, 1.0]], steady=[False, False] # 两个应力期均为瞬态 ) # 创建地下水流模型对象 gwf = flopy.mf6.ModflowGwf(sim, modelname="transient_gwf", save_flows=True) # 以抽水井(WEL)为例,用MFTransientList定义瞬态抽水量 wel_transient_data = flopy.mf6.ModflowGwfwel.TransientList([ [0, 0, 0, -1200.0], # 第1应力期第1时间步:(层,行,列)位置抽水量-1200 m³/d [0, 0, 0, -900.0], # 第1应力期第2时间步抽水量 [0, 0, 0, -600.0] # 第2应力期第1时间步抽水量 ]) # 添加WEL包到模型 wel = flopy.mf6.ModflowGwfwel(gwf, pname="wel", stress_period_data=wel_transient_data)
三、关于瞬态触发的疑问解答
不是只要某个包使用stress_period_data和MFTransientList,模型就会自动按瞬态求解,核心控制逻辑在TDIS包的steady参数:
- 如果TDIS中所有应力期的
steady都设为True,即使某包传入了MFTransientList数据,模型仍会按稳态求解——此时瞬态数据会被忽略,仅取第一个时间步的参数值; - 只有当TDIS中至少有一个应力期的
steady设为False时,模型才会进入瞬态求解模式,stress_period_data中的时间序列数据才会生效。
内容的提问来源于stack exchange,提问作者Aeonian
相关产品推荐
相关产品推荐

