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逐级放大,直到该应力期末尾。

增长因子TSMULT的典型取值在1.0~1.5之间。取1.0表示等步长;取1.2表示每步比前一步长20%。TSMULT过大(如2.0以上)会使后期步长跳跃过猛,瞬态过程被“跨过”,出现水位突变或收敛困难。

稳定流与瞬态流的切换,本质上是“是否需要记录水位随时间的变化”。若只关心最终平衡水位,可把所有应力期设为单步稳定流;若关心抽水过程中的水位下降、恢复或季节波动,则必须使用瞬态流,并把关键变化时段切分为较密的时间步。实际建模中常见做法是:先跑一个稳定流应力期获得初始水头场,再切换到瞬态应力期模拟抽水过程。MODFLOW通过STEADY-STATE标识每个应力期是否为稳定流,同一模型中可以混合使用。

应力期与时间步的两层时间结构 t 应力期 1(稳定流) NSTP=1, TSMULT=1 应力期 2(瞬态流,抽水) NSTP=5, TSMULT=1.3 Δt₁ Δt₂ Δt₃ Δt₄ Δt₅ 应力期 3(瞬态流,恢复) NSTP=4, TSMULT=1.2 输出点 输出点 输出点 输出点 稳定流应力期 瞬态流应力期 输出时间点

输出时间点控制是时间离散中容易被忽视的一环。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。

应力期长度之和必须等于模拟总时长,且每个应力期的NSTP必须≥1。修改PERLEN后务必同步检查NSTP与TSMULT,否则首步长可能小到引起舍入误差,或大到跨过关键瞬态过程。稳定流应力期若误设NSTP>1,求解器会重复求解同一方程组,浪费计算量。

实践中建议按“事件驱动”划分应力期:抽水开始、抽水停止、补给季节变化、边界条件调整,每一个事件对应一个新应力期。应力期内部保持应力恒定,时间步只负责数值推进。这样既符合MODFLOW的输入逻辑,也使模型的时间结构与实际水文过程一一对应,便于后续结果判读和参数调整。