4. MODFLOW时间离散与应力期管理
MODFLOW把模拟时间切成两层:应力期(Stress Period)与时间步(Time Step)。应力期是“外部条件保持不变”的时间段,抽水量、补给强度、定水头值、边界类型等应力在同一个应力期内视为常量;时间步则是求解器实际推进的离散步长,每个应力期被划分为若干个时间步,每个时间步求解一次方程组。理解这两层结构,是控制计算精度、稳定性和输出节奏的前提。
在MODFLOW的输入文件中,时间离散由DIS(或DISU)包的几个数组描述:NPER为应力期总数,PERLEN为各应力期长度,NSTP为各应力期内的时间步数,TSMULT为时间步长增长因子。若某应力期PERLEN=1、NSTP=1、TSMULT=1,则该应力期只含一个时间步,常用于稳定流。瞬态流则要求NSTP>1,且PERLEN与NSTP共同决定初始步长:首步长 = PERLEN × (TSMULT−1) / (TSMULT^NSTP − 1)(TSMULT≠1时),后续步长按TSMULT逐级放大,直到该应力期末尾。
稳定流与瞬态流的切换,本质上是“是否需要记录水位随时间的变化”。若只关心最终平衡水位,可把所有应力期设为单步稳定流;若关心抽水过程中的水位下降、恢复或季节波动,则必须使用瞬态流,并把关键变化时段切分为较密的时间步。实际建模中常见做法是:先跑一个稳定流应力期获得初始水头场,再切换到瞬态应力期模拟抽水过程。MODFLOW通过STEADY-STATE标识每个应力期是否为稳定流,同一模型中可以混合使用。
输出时间点控制是时间离散中容易被忽视的一环。MODFLOW默认在每个时间步结束时输出水头,若NSTP很大,输出文件会非常庞大。实际做法是利用OC(Output Control)包,按“应力期—时间步”指定输出频率,例如只在每个应力期的最后一步输出,或在抽水初期每步输出、后期每若干步输出一次。这样既保留了关键过程曲线,又控制了结果文件体积。
下面给出一个可直接参考的DIS时间离散配置示例(3个应力期:稳定流初始化、抽水瞬态、恢复瞬态):
# DIS 包时间离散参数(示例)
NPER 3
PERLEN 1.0 365.0 180.0
NSTP 1 20 10
TSMULT 1.0 1.3 1.2
# 应力期1:稳定流,单步
# 应力期2:抽水365天,20步,步长按1.3递增
# 应力期3:恢复180天,10步,步长按1.2递增
以应力期2为例,首步长 = 365 × (1.3−1) / (1.3²⁰−1) ≈ 365 × 0.3 / 189.0 ≈ 0.58天,末步长约为0.58 × 1.3¹⁹ ≈ 84天。这意味着抽水初期的水位快速下降被细密捕捉,而后期趋于平稳时用大步长推进,兼顾精度与效率。若发现抽水初期水位曲线出现明显折线或跳变,应减小TSMULT或增加NSTP;若计算耗时过长而曲线已足够平滑,则可适当增大TSMULT。
实践中建议按“事件驱动”划分应力期:抽水开始、抽水停止、补给季节变化、边界条件调整,每一个事件对应一个新应力期。应力期内部保持应力恒定,时间步只负责数值推进。这样既符合MODFLOW的输入逻辑,也使模型的时间结构与实际水文过程一一对应,便于后续结果判读和参数调整。