用途
Landlab 是一个基于 Python 的地表过程与地貌演化数值建模框架,用于构建二维数值模型,模拟侵蚀、水文、土壤搬运和地貌演化等过程。它采用模块化组件设计,可将多种地表过程组合在同一个模拟中运行。
主要能力
网格类型
Landlab 提供多种网格类型,适用于不同场景:
| 网格 | 用途 |
|---|---|
RasterModelGrid |
规则矩形网格(最常用) |
HexModelGrid |
六边形网格(各向同性流动) |
VoronoiDelaunayGrid |
不规则点分布 |
NetworkModelGrid |
仅河道网络 |
字段与边界
字段(fields)是存储在网格元素(节点、链接、单元)上的数据。例如:
z = grid.add_zeros('topographic__elevation', at='node')
grid.at_node['drainage_area'] # 访问已有字段
边界条件可设置网格边缘的开闭状态,例如关闭三条边、保留一条作为出口:
grid.set_closed_boundaries_at_grid_edges(True, True, True, False)
z[grid.core_nodes] += uplift * dt # 核心节点排除边界节点
核心组件
水流路径(Flow Routing)
from landlab.components import FlowAccumulator
fa = FlowAccumulator(grid, flow_director='D8') # 或 'Steepest'、'MFD'
fa.run_one_step()
drainage_area = grid.at_node['drainage_area']
河流功率侵蚀(Stream Power Erosion)
from landlab.components import StreamPowerEroder
sp = StreamPowerEroder(grid, K_sp=1e-5, m_sp=0.5, n_sp=1.0)
sp.run_one_step(dt=1000) # dt 单位为年
坡面扩散(Hillslope Diffusion)
from landlab.components import LinearDiffuser
ld = LinearDiffuser(grid, linear_diffusivity=0.01) # m^2/yr
ld.run_one_step(dt=100)
DEM 数据读写
from landlab.io import read_esri_ascii, write_esri_ascii
from landlab.io.netcdf import read_netcdf, write_netcdf
grid, z = read_esri_ascii('dem.asc', name='topographic__elevation')
write_esri_ascii('output.asc', grid, names='topographic__elevation')
write_netcdf('output.nc', grid) # 保存所有字段
使用方式
多组件模型示例
from landlab import RasterModelGrid
from landlab.components import FlowAccumulator, StreamPowerEroder, LinearDiffuser
import numpy as np
grid = RasterModelGrid((100, 100), xy_spacing=100.0)
z = grid.add_zeros('topographic__elevation', at='node')
z += grid.node_y / 1000 + np.random.rand(grid.number_of_nodes) * 0.1
grid.set_closed_boundaries_at_grid_edges(True, True, True, False)
fa = FlowAccumulator(grid, flow_director='D8')
sp = StreamPowerEroder(grid, K_sp=1e-5)
ld = LinearDiffuser(grid, linear_diffusivity=0.01)
dt, uplift_rate = 1000, 0.001
for _ in range(500):
fa.run_one_step()
sp.run_one_step(dt)
ld.run_one_step(dt)
z[grid.core_nodes] += uplift_rate * dt
典型工作流
- 创建具有合适尺寸和间距的
RasterModelGrid - 初始化
topographic__elevation字段(平坦加噪声,或加载 DEM) - 设置边界条件(开放一条边作为出口,关闭其余边)
- 创建
FlowAccumulator,选择水流方向算法(D8 或 MFD) - 创建
StreamPowerEroder,设置侵蚀系数 K_sp - 创建
LinearDiffuser处理坡面过程 - 定义时间步 dt 和总运行时长,选择抬升速率
- 运行时间循环:水流路径、侵蚀、扩散,然后抬升
- 按间隔用
write_netcdf()或write_esri_ascii()保存快照 - 用
grid.imshow()可视化最终地形 - 分析汇水面积和河道剖面
- 提取河流纵剖面用于陡峭度分析
适用场景
- 地貌演化模拟:需要模块化、基于组件的框架,在单次模拟中组合多种地表过程(侵蚀、扩散、水流路径、风化)
- 地表-地下水耦合:包含水文与地貌组件
- 河道网络提取:Landlab 或 pysheds 均可较好处理水流路径
- 土壤生成与搬运:提供专门的 weathering 和 soil 组件
- 地貌学教学:组件 API 清晰,教程完善
与其他工具的对比:
| 场景 | 工具 | 原因 |
|---|---|---|
| 地貌演化模拟 | Landlab | 模块化组件,Python 原生 |
| 流域尺度地层学 | Badlands | 侧重沉积物沉积与盆地充填 |
| 地形分析(MATLAB) | TopoToolbox | 成熟的 MATLAB DEM 分析工具包 |
| 简单扩散/侵蚀 | 自定义 numpy | 基础模型依赖更少 |
| 地表-地下水耦合 | Landlab | 包含水文与地貌组件 |
| 河道网络提取 | Landlab 或 pysheds | 两者都能较好处理水流路径 |
| 土壤生成与搬运 | Landlab | 专门的 weathering 和 soil 组件 |
| 地貌学教学 | Landlab | 组件 API 清晰,教程完善 |
限制与常见问题
| 问题 | 解决方案 |
|---|---|
| 平坦区域阻断水流 | 在初始地形中加入小的随机噪声 |
| 边界效应 | 确保至少有一条开放边界边用于排水 |
| 侵蚀不稳定 | 减小 dt 或 K_sp;检查 Courant 条件 |
| 字段名错误 | 使用 Landlab 精确名称:'topographic__elevation'、'drainage_area' |
| 大网格内存问题 | 降低网格分辨率,或仅对河道使用 NetworkModelGrid |
使用提示
- 先设置边界——在添加组件之前完成
- 使用
core_nodes——排除边界节点进行操作 - 检查字段名——组件期望特定名称(如 'topographic__elevation')
- 从简单开始——逐步添加组件并逐一验证
参考资料
- Components Reference - 按类别列出的可用组件
- Grids Reference - 网格类型与配置
脚本
scripts/erosion_model.py- 基础侵蚀模型模板