Biome-BGCモデルを使おう

西田顕郎

2001_0713作成; 2003_0428改訂; 2004_0814改訂


Biome-BGCとは?

 Biome-BGCは、モンタナ大学のNumerical Terradynamic Simulation Groupが作成し、改良を続けている、陸域植生の物質循環モデルである。ソースコードは公開されており、誰でも自由に使うことができる。

 Biome-BGCの特長は、非常に少ない入力データでも走るということである。最低限必要なのは、日平均気温・日最高気温・日最低気温・日積算降水量のわずか4つの時系列データ(最低1年ぶん)である。湿度や日射はこれらから推定算出される。もちろん個別に湿度や日射のデータを与えることも可能である。植生の生理・生態や土壌水分特性に関するパラメータも必要だが、それらがわからなくても、各植生帯の代表的なパラメータ群がEPCファイルという名前で用意されている。

* 日平均気温・日最高気温・日最低気温・日積算降水量から湿度や日射を推定するには、MT-CLIMというモデルを使う。ダウンロードサイトはこちら

* Biome-BGCモデルに関する情報交換のために日本語で「Biome-BGCユーザーメーリングリスト」を運営しています。御関心のある方は、当方まで御連絡下さい。

* ARMによるBiome-BGC解説サイト

Note: 以下、プロンプトを$で表すので、以下の説明で、$は打ち込まなくてよい。
Note: #は管理者(ルート)のプロンプトを表す。これも打ち込まなくてよい。


インストールガイド (Linux, Cygwinなど)

1. まずソースコードをダウンロード.

2. 次にこれを展開:

  $ gunzip unixbgc411.tar.gz
  $ tar xvf unixbgc411.tar

3. コンパイルの設定に関して,Makefileを何カ所か書き換えねばならない.

unixbgc411/src/bgclib_v4.1.1に移動し、makefileの以下の部分を書き換え:
  ROOTDIR = (自分のホームディレクトリに)/unixbgc411/src
  CC = gcc (xLCをgccに書き換える)

unixbgc411/src/pointbgc_4.1.1に移動し、makefileを上と同様に書き換え, さらに同ファイルの下記の部分を書き換え:

  OBJS3 = (ここから、metarr_init.oを削除)

4. unixbgc411/srcに移動し、下記のコマンドを実行:

  $ make

このとき、最後に
mv: cannot unlink `pointbgc': No such file or directory
というようなエラーメッセージが出るかも知れないが、とりあえずOK。

5. unixbgc411に移動し、pointbgcというファイルができていることを確認し、それを下記のようにテストランしてみる:

  $ ./pointbgc ini/enf_test1_spinup.ini
  $ ./pointbgc ini/enf_test1.ini


データの順備、プログラムの実行

入力気象データには、日長を含めねばならないが、ふつうの気象ルーチンデータには日長が入っていないことが多いので、緯度から計算する必要がある。このプログラムを使えば、緯度を与えて1年分の各日の日長を計算することができる。

変数にはID#がふってあるので、そのID#を用いて、出力したい変数をiniファイルで指定する。各変数のID#を知るには、src/bgclib_v4.1.1/output_map_init.cを見れば良い。各変数の単位や意味などは、src/include/bgcstruct.hを参照。


結果の表示など

Biome-BGCの出力には、年単位・月単位・日単位のファイルがあるが、もっとも詳細・多様な情報が得られるのは日単位の出力である。しかし日単位出力のデータファイルは4バイトの浮動小数点形式(バイナリーデータ)なので、直接、グラフツールなどに読みこませるのは難しい。そこで開発者はIDLなどの解析ツールの使用を推奨しているが、ここでは純粋にUNIXのコマンドだけでテキスト形式に処理する方法を述べる:

たとえば、データ項目が10個の場合、つぎのようにすれば、任意の項目の時系列データを取りだすことができる:

$ od -v -t f4 -w40 BGC_output_file.dayout | awk '{print NR,$2}'

こうすると、テキストファイルに変換できる。

この場合、-w40の40は、4バイト×10項目に対応するので、例えば6項目なら-w24になったりする。awkのなかの$2は、表示したい項目の順番(プラス1)。複数の項目を並列して出力したい場合は、awk '{print NR,$2,$3,$4}'などのようにすればよい。

あるいは、どうってことないプログラムだが、例えばこれを使って頂いても良い。
このプログラムは、数値の型式の変換を行う。バイナリからテキストとかその逆とか、バイナリでもchar, short, float, doubleなどを扱うことができる。使い方は、オプションなしで実行すれば表示される。


いろいろ遊ぶには・・・・

restartファイルの編集

Biome-BGCでは、各コンパートメントの初期条件をスピンアップで設定するが、これだけでは面白くない。たとえば森林を伐採したあとにどのように生態系の挙動が変化するかを知るには、スピンアップの初期条件に変更を加え、地上部の炭素・窒素コンパートメントをゼロにしてから走らせてみたくなる。それをするには、コンパートメントの初期状態を格納しているデータファイル(restartファイル)を書き換えれば良い。そのための簡単なプログラムはこちら

$ gcc restart_edit.c -o restart_edit

としてコンパイルしたら、まずはオプション無しで

$ ./restart_edit

とすれば、使い方が表示される。手短かに言えば、restartファイルはバイナリーなので、このプログラムでテキストに変換し、それをエディターで適当に変えて、またこのプログラムでバイナリー型式のrestartファイルに戻す、という手順。ファイルの入出力は全てリダイレクションで行う。


アルゴリズムの理解のための手がかり

・ 炭素・窒素については、リターのコンパートメントは4つ、細根のコンパートメントも4つ、土のコンパートメントも4つ。それぞれは層序ではなく、化学成分(の分解しやすさ)で分類されている。リターと細根はほとんど同じプロセスで処理されるので、以下ではリターだけに着目。リター1と土1は分解されやすい糖類など、リター2と土2はちょっと分解されにくいセルロース。リター3はリグニンに被覆されてかなり分解されにくいセルロースで、これは土には対応するものがない。リター4と土3はとても分解されにくいリグニン。土4は極めて分解されにくい成分。このように、リターと土の化学成分は番号での対応がちょっと不規則なので注意。基本的には、同じ成分のリターから土へ移動が起き、さらに、土どうしで分解されやすいものから順に分解されにくいものへ移動が起きる。

・ キャノピーは、日なたの葉と日陰の葉の2層(というか2枚)モデル。土壌面も独立に扱って、合計3つの層についてぞれでペンマン・モンティース式を解いて蒸発散を出す。つまり3-big-leaf model。ただし土壌面蒸発については、ペンマンのポテンシャル蒸発量を無降雨日数で指数関数的に減らしたもの。

・ 群落コンダクタンスはJarvisモデルの気孔コンダクタンスに葉面積をかけたもの(ひなた・日陰それぞれ)。JarvisモデルのPARは日射(入力気象データ)と放射伝達(門司・佐伯の式)から。Jarvisモデルの水ポテンシャルは、土の水ポテンシャルを使う。つまり、植物体内のポテンシャル分布や水の貯留は考えない。

・ キャノピーの境界層コンダクタンス(空気力学的コンダクタンス)は一定値×葉面積。地面の境界層コンダクタンスは一定値。

・ 水のコンパートメントは炭素・窒素とは別で、かなり単純。樹冠遮断量と土壌水分(と積雪)だけ。

・ 遮断雨量は葉面積×雨量×定数。これをポテンシャル蒸発量で蒸発させ、余ったぶんは土へ。1日ごとに清算し、樹冠遮断量を翌日に持ち越すことはしない。

・ リターの分解は、係数×リター量。その係数には、土壌水分と地温で制限を効かせている。リターが分解されると、炭素は一部が土壌呼吸として消費され、残りが土へ入る。

・ 光合成はFarquharモデル。気孔コンダクタンスは蒸発散のところでJarvisモデルで計算したものを変換して流用。光合成も、ひなたと日陰のそれぞれの層で計算される。

・ 光合成で獲得された炭素は、いったん炭素プールに入る。系への炭素入力は光合成だけ。炭素のretranslocationは無い。

・ 炭素プール(C pool)からは、一部がすぐに(毎日の)アロケーションで葉や幹・根・細根などの実際のバイオマスの炭素プール(display)に行く。残りは翌年の芽吹き用に持ち越すために、いったんstorageというプールに溜められ、storageプールは年の終わりにtransferというプールにごっそり移しかえられる。翌年、transferプールからdisplayに徐々に移される。その間、storageプールにはさらに翌年のための炭素が溜まる。

・ 炭素のアロケーションは、各コンパートメントのアロケーション比(EPCファイルで設定)で仮に行われる。その後、各コンパートメントのC:N比から必要な窒素量が計算され、この窒素量が窒素プール(土壌無機体窒素とretranslocatedな窒素)でまかなうことができれば炭素の方も正式決定。窒素が足りなければ、手持ちの窒素でまかなうことのできる炭素量を逆算し、炭素量を決定。

・ 葉面積は、葉にアロケーションされる炭素量を、所与のSLA(比葉面積。単位重さあたりの葉面積)で割って求める。従ってSLAは重要なパラメータ。これはEPCファイルで設定。日向の葉と日陰の葉のSLAが違うことに注意(一般にひなたの葉のほうが厚い)。

・ 生体に固定される炭素と窒素は、光合成がその日にすぐに固定されるだけでなく、翌年のための貯蔵にもとっておかれる。それがstorageプールとtransferプール。storageに翌年分の炭素・窒素が貯蔵され、年の終わりにそれがtransferプールに移動して、翌春の成長に使われる。これが無いと、落葉樹林は春になっても葉を出せない。

・ 流出はバケツモデル。飽和の体積含水率に土層深をかけたものよりも土壌水分が多くなればさっさと流出。不飽和の側方流とかは考えない。不飽和の水が出て行く先は蒸発散のみ。

・ 枯死は係数×コンパートメント量。係数はEPCファイルで設定。

・ 幹や太い枝が枯死したぶんの炭素・窒素はCWDCプールにいったん入り、分解されてリターへ入るのを待つ。ただし、storageやtransferの枯死は直接リターへ入る。

・ CWDCのリターへの分解は、リターの土への分解と同様に、係数×CWDCプールの量で、係数は土壌水分と地温に依存する。

・ 葉や細根の枯死はリターへ入る。

・ 空からの長波放射のエネルギーは無視している。入力放射は短波放射だけであり、それをアルベドで減らして、一方、表面から出て行く長波放射の影響は、ペンマンモンティース式に放射抵抗として組みこんでいる。

・ 土壌の窒素プール(soil1nとか)はぜんぶ、微生物(やその死骸)が保持する有機体窒素。無機態窒素はsminnというプールに別に保管される。

・ リタープールから土壌プールに炭素・窒素が移動するとき、土壌プールのC/Nは大抵低いから、余分の窒素を土壌無機態窒素プールから持ってくる必要がある。この成分が、sminn__to_soil1n_l1とか。この量はマイナスになることがあって、それは、リターから土壌に移動するときに窒素が消化しきれずに、無機態窒素としてプールされるケース。そのレンジを決めるのがpmnf_l1s1とか。

・ 土壌pFカーブは、粒径分布で決める。砂、シルト、粘土の構成比で。式としては、ψ/ψ0=(θ/θ0)^ bというかんじ。

・ 飽和時(VWC=間隙率?)でも水ポテンシャルは負圧が残ると考えられている。

BGCの構造(自分用のメモ)

woodyバイオマスのstem woodとcoarse rootは、見たところ全く同じ処理。実際、それぞれの炭素プールの比を時系列で追ってやると、EPCファイルで設定したnew croot C : new stem Cと同じ値で不変。従ってここは実質的にはひとつのコンパートメントと考えて良い。

トラブルシューティング

症状: Segmentation faultエラーが出て停止してしまう。
原因: 気象データの日付がスピンアップに連続していない可能性がある。
対策: iniファイルのRESTARTセクションの第3フラグ(restart metyear)をゼロにする。

症状: 正常終了するが、LAIがずっとゼロなど出力結果がおかしい。
原因: 気象データの左端の年フィールドが抜けている。MT-CLIMの出力をそのまま使うとこの症状が出やすい。
対策: 気象データの左端に年フィールドを挿入する。MT-CLIMを使用している場合は、MT-CLIMのiniファイルのCONTROLセクションの第5フィールドを1にし、MT-CLIMへの入力データに年フィールドを挿入しておく。

症状: unixbgc411/src/pointbgc_v4.1.1/pointbgc.exeが、unixbgc411/ のディレクトリに移動されなかった。
環境: WINDOWS XP (Home Edition Version 2002 Service Pack 1)+CYGWIN_NT5.1 外付けHDDにおいて作業。
対策: unixbgc411/src/pointbgc_v4.1.1/に作成されたpointbgc.exeを、手動でunixbgc411/へ移動した。
(レポート: 東大緑地研、森さん)