landlab について
Landlabは、地形発達モデリング向けのPythonフレームワークです。研究や教育に適しており、グリッドとプロセスコンポーネントを組み合わせて水流、侵食、斜面拡散をシミュレーションできます。
主な機能
- 01複数のグリッド形式
- 02流向と集水面積の計算
- 03河川侵食と斜面拡散
- 04DEMデータの読み書き
- 05地形プロセスの組み合わせ
活用シーン
- 01侵食と隆起を含む地形モデルの構築
- 02集水面積と河道縦断形の分析
- 03DEMデータの読み込みと保存
- 04地形プロセスモデリングの教育
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ steadfastasart/ geoscience-skills --skill landlabインストール後、Claude Code で/landlabを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/components.mdgrids.mdscripts/erosion_model.py詳細
Landlab - 地表プロセスモデリング
クイックリファレンス
from landlab import RasterModelGrid
from landlab.components import FlowAccumulator, StreamPowerEroder
import numpy as np
# Create grid
grid = RasterModelGrid((100, 100), xy_spacing=10.0)
z = grid.add_zeros('topographic__elevation', at='node')
z += np.random.rand(grid.number_of_nodes) * 0.1
# Set boundaries (open bottom edge)
grid.set_closed_boundaries_at_grid_edges(True, True, True, False)
# Create and run components
fa = FlowAccumulator(grid, flow_director='D8')
sp = StreamPowerEroder(grid, K_sp=1e-5)
for _ in range(100):
fa.run_one_step()
sp.run_one_step(dt=1000)
z[grid.core_nodes] += 0.001 * 1000 # Uplift
grid.imshow('topographic__elevation', cmap='terrain')
グリッドの種類
| グリッド | 用途 |
|---|---|
RasterModelGrid | 規則的な矩形グリッド(最も一般的) |
HexModelGrid | 六角形グリッド(等方的な流れ) |
VoronoiDelaunayGrid | 不規則な点の分布 |
NetworkModelGrid | 水路ネットワークのみ |
主要な概念
フィールドと境界
# Fields: data stored at grid elements (nodes, links, cells)
z = grid.add_zeros('topographic__elevation', at='node')
grid.at_node['drainage_area'] # Access existing field
# Boundaries: close all edges except outlet
grid.set_closed_boundaries_at_grid_edges(True, True, True, False)
z[grid.core_nodes] += uplift * dt # Core nodes exclude boundaries
必須の操作
流向の割り当て
from landlab.components import FlowAccumulator
fa = FlowAccumulator(grid, flow_director='D8') # or 'Steepest', 'MFD'
fa.run_one_step()
drainage_area = grid.at_node['drainage_area']
河川流力侵食
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 in years
斜面拡散
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) # Save all fields
複数コンポーネントのモデル
from landlab import RasterModelGrid
from landlab.components import FlowAccumulator, StreamPowerEroder, LinearDiffuser
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
使用する場面と代替ツール
| 用途 | ツール | 理由 |
|---|---|---|
| 地形進化モデリング | Landlab | モジュール式コンポーネント、Python ネイティブ |
| 流域スケールの層序解析 | Badlands | 堆積物の堆積と流域の充填に焦点 |
| 地形解析(MATLAB) | TopoToolbox | DEM 解析向けの成熟した MATLAB ツールキット |
| 単純な拡散/侵食 | Custom numpy | 基本的なモデルで依存関係を削減 |
| 地表と地下の連成 | Landlab | 水文学と地形学のコンポーネント |
| 水路ネットワークの抽出 | Landlab または pysheds | どちらも流向の割り当てに適しています |
| 土壌の生成と輸送 | Landlab | 風化と土壌に特化したコンポーネント |
| 地形学の教育 | Landlab | 明確なコンポーネント API、優れたチュートリアル |
Landlab を選ぶ場合:侵食、拡散、流向の割り当て、風化など、複数の地表プロセスを単一のシミュレーションに組み合わせる、モジュール式のコンポーネントベースの地形進化モデリング用フレームワークが必要な場合です。
Badlands を選ぶ場合:堆積物輸送と層序構造を重視する、流域スケールの地形進化に重点を置く場合です。
custom numpy を選ぶ場合:コンポーネントフレームワーク全体を使わずに、単純な 2D 拡散モデルまたは河川流力モデルだけが必要な場合です。
一般的なワークフロー
侵食と隆起を伴う地形進化モデル
- 適切な寸法と間隔で
RasterModelGridを作成する -
topographic__elevationフィールドを初期化する(平坦地形+ノイズ、または DEM を読み込む) - 境界条件を設定する(1 辺を流出口として開き、他の辺を閉じる)
- 選択した流向アルゴリズム(D8 または MFD)を指定して
FlowAccumulatorを作成する - 侵食係数 K_sp を指定して
StreamPowerEroderを作成する - 斜面プロセス用に
LinearDiffuserを作成する - 時間ステップ
dtと合計実行時間を定義し、隆起速度を選択する - 時間ループを実行する:流向の割り当て、侵食、拡散、続いて隆起
-
write_netcdf()またはwrite_esri_ascii()で一定間隔ごとにスナップショットを保存する -
grid.imshow()で最終的な地形を可視化する - 集水面積と水路縦断面を解析する
- 急勾配度の解析用に河川の縦断形を抽出する
よくある問題
| 問題 | 解決策 |
|---|---|
| 平坦地で流れが止まる | 初期地形に小さなランダムノイズを加える |
| 境界の影響 | 排水用に少なくとも 1 辺の境界を開放する |
| 侵食が不安定 | dt または K_sp を小さくし、クーラン条件を確認する |
| フィールド名が違う | Landlab の正確な名前('topographic__elevation'、'drainage_area')を使用する |
| 大規模グリッドでのメモリ使用量 | グリッド解像度を下げるか、水路のみの場合は NetworkModelGrid を使用する |
ヒント
- 最初に境界を設定する - コンポーネントを追加する前に設定します
- core_nodes を使用する - 操作対象から境界ノードを除外します
- フィールド名を確認する - コンポーネントは特定の名前(例:'topographic__elevation')を想定しています
- シンプルに始める - コンポーネントを段階的に追加し、それぞれを検証します
参考資料
- コンポーネントリファレンス - カテゴリ別の利用可能なコンポーネント
- グリッドリファレンス - グリッドの種類と設定
スクリプト
- scripts/erosion_model.py - 基本的な侵食モデルのテンプレート
コメント
Markdown 対応