mcpField
L
landlab

landlab

github.com/steadfastasartデータ・データベース7357 回インストール6 週間前に更新
リポジトリ

landlab について

Landlabは、地形発達モデリング向けのPythonフレームワークです。研究や教育に適しており、グリッドとプロセスコンポーネントを組み合わせて水流、侵食、斜面拡散をシミュレーションできます。

主な機能

  1. 01複数のグリッド形式
  2. 02流向と集水面積の計算
  3. 03河川侵食と斜面拡散
  4. 04DEMデータの読み書き
  5. 05地形プロセスの組み合わせ

活用シーン

  1. 01侵食と隆起を含む地形モデルの構築
  2. 02集水面積と河道縦断形の分析
  3. 03DEMデータの読み込みと保存
  4. 04地形プロセスモデリングの教育

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/steadfastasart/geoscience-skills --skill landlab

インストール後、Claude Code で/landlabを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
components.md
grids.md
scripts/
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)TopoToolboxDEM 解析向けの成熟した 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 を使用する

ヒント

  1. 最初に境界を設定する - コンポーネントを追加する前に設定します
  2. core_nodes を使用する - 操作対象から境界ノードを除外します
  3. フィールド名を確認する - コンポーネントは特定の名前(例:'topographic__elevation')を想定しています
  4. シンプルに始める - コンポーネントを段階的に追加し、それぞれを検証します

参考資料

スクリプト

コメント