graph LR
In("💧 注入水<br>(200℃, 1.0 mL/min)") --> C1[セル 1]
C1 --> C2[セル 2]
C2 -.->|移流・分散<br>& 化学反応| C14[...]
C14 --> C15[セル 15]
C15 --> Out("🧪 流出水<br>(水質変化を観測)")
style In fill:#a2d2ff,stroke:#023e8a,stroke-width:2px,color:#000
style Out fill:#ffc8dd,stroke:#c9184a,stroke-width:2px,color:#000
style C1 fill:#f5f5f5,stroke:#999
style C2 fill:#f5f5f5,stroke:#999
style C14 fill:#f5f5f5,stroke:#999
style C15 fill:#f5f5f5,stroke:#999
本稿では、Python を用いた地球化学的反応輸送シミュレーション(Reactive Transport Simulation)フレームワークの設計思想と全体構成を解説します。
200 °Cの高温条件下における「岩石カラム貫流実験」をターゲットとし、以下の3つを統合的に実行するシステムを構築します: 1. 流体流れ場の計算(MODFLOW 6) 2. 地球化学反応の計算(PHREEQC / Thermoddem データベース) 3. データの可視化と実験値の比較
Pythonのオブジェクト指向設計により、複雑なパラメータ管理や化学反応の定義をすっきりと整理しました。
1. はじめに:反応輸送モデル(RTM)とは?
水–岩石相互作用(water–rock interaction)は、地熱発電、放射性廃棄物の深地層処分、CO₂の地中貯留(CCS)など、地球科学における最重要テーマの一つです。
これらをコンピュータ上で再現し、定量的に予測するために使われるのが 反応輸送モデル(Reactive Transport Model: RTM) です。RTM は、以下の2つの現象を同時に計算します。
- 移流・分散(Advection-Dispersion): 水が地下をどのように流れていくか。
- 化学反応(Chemical Reactions): 流れる水と岩石の間で、どんな鉱物が溶け(溶解)、どんな新しい鉱物が生まれるか(沈殿)。
川が流れる様子をシミュレーションするアプリ(MODFLOW)と、試験管の中で試薬を混ぜて反応を見るアプリ(PHREEQC)が、1ステップごとに「ここまで水が動いたよ」「そこでこんな反応が起きたよ」とキャッチボールしながら進んでいくイメージです。
本シリーズでは、高温(200 °C)・高圧条件下で行われる「岩石カラム貫流実験」をモデル化し、流出水の化学組成(ケイ素、カルシウム、ナトリウムなど)が時間とともにどう変化するかを予測するシステムを構築します。
2. シミュレーション対象の物理系
2.1 カラム実験の概要
実験装置(カラム)のモデル化を図解します。円柱状の岩石サンプルを15分割(15セル)し、左端から200℃の水を注入して、右端から出てくる成分を調べます。
【基本パラメータ】
| パラメータ | 値 | 意味 |
|---|---|---|
| カラム長 \(L\) | 0.15 m | 岩石サンプルの全体の長さ |
| カラム半径 \(r\) | 0.01 m | サンプルの太さ(半径) |
| セル数 \(N\) | 15 | シミュレーション上の分割数(\(\Delta x = 0.01\) m) |
| 流量 \(Q\) | 1.0 mL/min | 注水するペース |
| 間隙率 \(\phi\) | 0.35 | 岩石の隙間の割合(35%が隙間) |
| 透水係数 \(K\) | \(1\times 10^{-4}\) m/s | 水の通りやすさ |
| 温度・圧力 | 200 °C / 98.7 atm | 高温高圧の過酷な環境 |
| 実験時間 | 144 時間 | 6日間にわたる連続反応 |
2.2 対象鉱物(一次鉱物と二次鉱物)
水と触れることで、岩石の成分が溶け出したり、逆に新しい鉱物が結晶化したりします。
- 一次鉱物(Primary minerals): 最初から岩石に含まれている鉱物。熱水と触れることで徐々に溶解し、水中にイオン(成分)を放出します。
- 二次鉱物(Secondary minerals): 水中に溶け出した成分が飽和状態になり、新しく沈殿(結晶化)して生まれる鉱物。
| 分類 | 鉱物名 | 役割 |
|---|---|---|
| 一次(溶ける) | Albite(low) (曹長石) | Na・Si・Al を放出 |
| Anorthite (灰長石) | Ca・Al を放出 | |
| Enstatite(α) (頑火輝石) | Mg・Si を放出 | |
| Ferrosilite(α) (鉄珪輝石) | Fe・Si を放出 | |
| Diopside (透輝石) | Ca・Mg・Si を放出 | |
| Microcline (微斜長石) | K・Al を放出 | |
| Amorphous silica (非晶質シリカ) | Si のバッファー(緩衝)役 | |
| 二次(生まれる) | Calcite (方解石) | Ca と炭素をトラップして結晶化 |
| Boehmite (ベーム石) | Al をトラップして結晶化 | |
| Beidellite(Na) (バイデライト) | Na・Al スメクタイト(粘土鉱物) |
3. フレームワークのアーキテクチャ
複雑なパラメータや計算ロジックが絡み合うため、本フレームワークでは オブジェクト指向 を採用し、役割ごとに 4つのクラス に分割しました。
graph TD
Config["⚙️ GeochemicalTransportConfig<br>(パラメータ一元管理)"] --> Sim
Chem["🧪 ChemistryFactory<br>(化学反応定義の生成)"] --> Sim
Sim["💻 GeochemicalSimulator<br>(流れ場・輸送計算の実行)"] --> Vis["📊 Visualizer<br>(結果の可視化・CSV出力)"]
style Sim fill:#e1f5fe,stroke:#0288d1,stroke-width:2px,color:#000
style Config fill:#fff3e0,stroke:#f57c00,stroke-width:1px,color:#000
style Chem fill:#e8f5e9,stroke:#388e3c,stroke-width:1px,color:#000
style Vis fill:#f3e5f5,stroke:#7b1fa2,stroke-width:1px,color:#000
GeochemicalTransportConfig: 温度や計算時間などの設定を一つにまとめます。温度を変えて何度も実験(バッチ実行)する際に非常に便利です。ChemistryFactory: PHREEQCに渡す「化学反応の数式(速度論的反応速度式)」を作ります。GeochemicalSimulator: システムの心臓部です。水の動きを計算するrun_flowと、化学反応と移動を連成させるrun_transportを実行します。Visualizer: 計算された膨大なデータを、美しいグラフやCSVファイルとして出力します。
4. 使用ソフトウェアと熱力学データベース
本システムは以下の強力なオープンソースツールを組み合わせて構築されています。
| ツール・DB | 役割 |
|---|---|
| Python 3.x | システム全体を制御するメインプログラム |
| FloPy | PythonからMODFLOW 6を操作するライブラリ |
| MODFLOW 6 | 水がどこをどの速さで流れるかを計算するエンジン |
| phreeqpy | PythonからPHREEQCを操作するライブラリ |
| PHREEQC | 化学反応(溶解・沈殿・平衡など)を計算するエンジン |
| Thermoddem v1 | 高温(最大300℃)に対応した熱力学データベース |
水と岩石の反応シミュレーションでは「どの温度で、どのくらい物質が溶けやすいか」というデータ(平衡定数など)が必須です。通常のデータベースは常温(25℃付近)を前提としていますが、今回は200℃の高温を扱うため、フランスBRGMが開発した Thermoddem v1 という特殊なデータベースを採用しています。
5. 計算フローの全体像
実際のプログラムが動くときのデータの流れ(フロー)は以下の5ステップです。
sequenceDiagram
participant Flow as 🌊 MODFLOW<br>(流れ場)
participant Transport as 🔄 Python<br>(メイン制御)
participant Chem as 🧪 PHREEQC<br>(化学計算)
participant Out as 📊 出力<br>(可視化・CSV)
Note over Transport: Step 1: 流れ場計算
Transport->>Flow: 水理パラメータ送信
Flow-->>Transport: ダルシー流速 (v) を返却
Note over Transport: Step 2: 反応輸送計算ループ
loop タイムステップごと・セルごと
Transport->>Chem: 水の移動&現在の化学状態を送信
Chem-->>Transport: 反応後の新しい水質・鉱物量を返却
end
Note over Out: Step 3〜5: 結果出力
Transport->>Out: 時系列データのプロット (水化学)
Transport->>Out: 鉱物変化量のプロット
Transport->>Out: CSVファイル保存
第2回では、このシステムの前半部分である 「Step 1: 流れ場計算」 と 「PHREEQCのセットアップ(Step 2の準備)」 の具体的なコード実装について解説します。
6. まとめ
本稿では、200℃の高温カラム実験をターゲットにした「地球化学的反応輸送シミュレーション」のシステム概要と設計思想を解説しました。
複雑になりがちな化学・物理計算のコードをオブジェクト指向で整理することで、温度や鉱物を変えたシミュレーションにも柔軟に対応できる拡張性の高い設計になっています。
次回(第2回)は、いよいよ具体的なPythonコードを使って、MODFLOWによる流速計算とPHREEQCへの化学条件設定を行っていきます!お楽しみに。