本文へスキップ
半農エンジニアラボENGINEERING × EVERYDAY

FIELD NOTE / 2026

HAIZU開発シリーズ⑤|火山灰の分布は、どう計算しているのか?Tephra2と単位の話

HAIZUのPC画面。Tephra2と簡易時間モデルによる仮定条件下の降灰分布

地図の上に色が広がっていても、その色が何から作られたのかは、画面を見るだけでは分かりません。「風向きを選ぶと、その方向へ色を伸ばしているだけなの?」「厚さ1cmという数字は、どこから出てくるの?」。HAIZUの計算を説明するなら、まずここからです。

HAIZUでは、Tephra2で求めた地点ごとの堆積質量をもとに、簡易時間モデルで時刻ごとの量を求め、仮定した密度で厚さへ換算します。その厚さを色にして、地図に重ねています。計算で得る数値、時間の扱い、画面の色は、それぞれ別の役割です。

第4回は、スマホでも地図を見やすくする画面設計でした。第5回では、その画面へ渡す数値を作る側へ進みます。専門的な式を追う前に、何を入力し、何が返り、どこで単位が変わるのかを見ていきましょう。

前回:第4回:スマホでも地図を見やすくするには?折りたたみと操作画面の設計
シリーズの入口:紹介・第0回:HAIZUの完成画面と開発ログ

本記事は、防災学習用アプリの実装を説明するものです。HAIZUは実際の噴火・降灰を予測するサービスではありません。図は処理を説明する模式図です。キャプチャは2026年10月18日に公開Web版で撮影した入力画面で、背景には初期の操作体験用デモが表示されています。今回、新しい降灰計算や予測精度の検証を行ったわけではありません。

まずは「重さの分布」と「画面の色」を分けて考える

一連の流れを、料理の材料と盛り付けに分けて考えると少し分かりやすくなります。計算結果の数値が材料で、地図の色が盛り付けです。色だけを見ても、元の量や単位まで分かるとは限りません。

HAIZUがTephra2から受け取る中心的な値は、格子状に並べた地点ごとの「堆積質量」です。単位はkg/m²。1㎡の面積に何kgの火山灰が積もるか、という意味です。たとえば10kg/m²なら、1m四方の面積に10kgという読み方になります。これは厚さ10cmという意味ではありません。

HAIZUの計算と表示の流れ。Tephra2の堆積質量に簡易時間モデルを適用し、嵩密度で厚さに換算して色付き画像にする
図1:数値が地図になるまでの流れ。上段がTephra2の空間計算、下段がHAIZU側の時間・厚さ・表示処理です。公開版では、事前に計算した空間分布を利用します。

厚さを表示するには、火山灰がどれくらいの密度で積もるかという仮定が必要です。さらに、噴火から何時間後を見せるかで、その時刻までに積もる割合を決めます。最後に厚さを色へ変換します。

この区切りを意識しておくと、「色が変わった」原因を考えやすくなります。元の堆積質量が変わったのか、時間が変わったのか、厚さに換算する密度が変わったのか。見た目は同じ色の変化でも、内部で変わったものは同じとは限りません。

Tephra2には、何を任せているのか

Tephra2の開発元リポジトリでは、噴火の条件を与えて、指定した地点や地域に堆積する量を推定するモデルとして説明されています。HAIZUが使うのは、条件から結果を求める「順計算」の側です。観測結果に合う条件を探す逆計算は使っていません。

初心者向けに言えば、順計算は「この量、この噴煙高度、この風なら、どの地点にどれくらい積もる計算になるか」を求めることです。現実に明日どんな噴火が起きるかを決める仕事とは違います。入力に置いた仮定が、出てくる分布の前提になります。

HAIZU側のプログラムは、画面の値をそのまま渡すのではなく、Tephra2の入力形式へ組み直します。噴出量などの設定、計算地点の一覧、風の一覧を用意し、計算の出力を読み取ります。二つのプログラムの間で、言葉や単位をそろえる通訳に近い役目です。

ここで分けておきたいのは、Tephra2という計算モデルと、HAIZUがそのモデルへ与えている条件です。モデル自体に表現できることがあっても、アプリ側で単純な値を渡せば、結果はその単純な条件に基づきます。モデルの名前だけで、アプリ全体の詳しさや精度は決まりません。

入力画面の数字には、それぞれ役割と単位がある

まず、公開Web版の入力画面を見てみます。噴火規模、噴煙高度、風向などを選べます。撮影時の画面には、計算済み分布を使い、新しい重い計算は行わないという案内も出ています。

HAIZUの条件入力上部。計算済み分布の案内、噴火規模、海抜の噴煙高度、風が吹いてくる方向を表示
キャプチャ1:公開Web版の条件入力。噴煙高度は海抜、風向は風が吹いてくる方向です。背後の地図は初期デモで、今回計算した結果ではありません。
項目 何を表すか 読み違えやすい点
総噴出量:kg モデルへ与える噴出物の総量 ある地点に積もる量や、厚さそのものではない
噴煙高度:km 海抜での噴煙の高さ 火口から上へ何kmか、という値とは区別する
風向:度、風速:m/s 火山灰を運ぶ風の条件 画面の風向は、風が吹いてくる側を表す
中央粒径:φ モデルで使う粒の大きさの分布の中心 φはmmの数値とは別の尺度
拡散係数:m²/s モデル上の広がり方に関わる値 風速の単位m/sと混同しない
嵩密度:kg/m³ 堆積質量から厚さへ換算するための仮定 同じ質量でも、密度の値で表示厚さが変わる

噴火規模のボタンは、学習用に用意した数値の組み合わせです。「宝永噴火級」という名前が付いていても、歴史上の宝永噴火をそのまま再現したという意味にはしません。現行実装には、小規模で1,000億kg、宝永噴火級で1兆kg、大規模で3兆kgという例示用の総噴出量を置いています。研究や防災判断のために校正した区分ではありません。

また、表にある項目を公開版で自由にすべて変更できるわけではありません。計算済み分布を使うモードでは、中央粒径、拡散係数、総噴出量の直接入力は無効になっています。実装に存在する条件と、今の画面で利用者が操作できる条件は、分けて読む必要があります。

風の向きと高さは、計算へ渡す前にそろえる

計算用データを作るときに引っかかりやすいのが、同じ「方向」「高さ」という言葉でも基準が違うことです。数値がきれいに入っていても、意味が反対なら、結果は別のものになります。

風向の例で見てみます。画面の「西風」は、西から吹いてくる風です。運ばれていく先は東側になります。一方、HAIZUからTephra2の風データへ渡すときは、風が向かう方向にそろえます。そのため、画面の角度に180度を足し、360度で一周する値へ戻す変換を入れています。

たとえば、入力を西の270度とした説明例なら、計算へ渡す向きは東の90度です。今回のキャプチャは西南西の表示ですが、考え方は同じです。「どこから来るか」と「どこへ進むか」を取り違えないための変換です。

噴煙高度も同様です。画面は海抜のkmで示し、計算用の設定にはmへ直して渡します。15kmなら15,000mです。富士山の代表地点の標高は別に設定されており、15kmへさらに山の標高を足す処理にはしていません。

このような単位変換は、画面のあちこちに散らすより、計算へ渡す境目に集めるほうが確認しやすくなります。画面で見せる単位と、計算プログラムが期待する単位を、項目ごとに書いて照合できるからです。業務システムでも、円と千円、秒とミリ秒、税込と税抜などで同じ種類の取り違えが起こります。

地図全体を、格子状の計算地点として扱う

Tephra2から地図画像が直接返ってくるわけではありません。HAIZUでは、地図に対応する192×160の格子を用意し、それぞれの中心を計算地点にしています。地点数は30,720です。各地点の値を、あとから画像の画素に対応させます。

地図上の場所は経度・緯度で表せますが、計算へ渡す地点はメートル単位の座標へ変換します。富士山のケースではUTMという座標系の54N帯を使っています。「東西・南北に何mの位置か」という形へそろえるためです。経度の139という数字と、メートルの距離を混ぜて計算しないようにします。

出力を読み戻すときも、単に「上から何行目だから、この場所」と決め付けません。返ってきた座標を元の格子と対応させます。行の順番が変わっただけで別の場所へ数値を置いてしまうと、地図はそれらしく描けても、位置が間違ってしまうからです。

現行の読み取り処理では、格子点の欠落、同じ地点の重複、負の堆積質量、通常の数値として扱えない値などを検出してエラーにします。「計算プログラムが終了した」だけで、正しい形の結果が全部そろったとは判断しません。

ただし、格子が細かく見えることと、科学的な予測が細かく当たることも別です。地図を拡大して道路が読めても、道路一本ずつを計算しているわけではありません。HAIZUの地点表示は格子に対応した値であり、住所ごとの精密な評価とは区別します。

「kg/m²」から「cm」への換算を、数値で追ってみる

ここが、画面の厚さを理解するための要所です。Tephra2由来の堆積質量を、そのままcmとして表示することはできません。重さを体積へ変えるために、嵩密度を使います。ここでいう嵩密度は、粒の間の空隙も含む、積もった状態の体積に対する重さです。

HAIZUの換算は、次の関係です。

厚さ(cm)= 堆積質量(kg/m²)÷ 嵩密度(kg/m³)× 100

たとえば、ある時刻の堆積質量を10kg/m²、嵩密度を1,000kg/m³と仮定します。10÷1,000は0.01m。それをcmへ直して、厚さは1cmです。式に出てくる100は、mをcmへ直すための数です。

同じ堆積質量 仮定する嵩密度 換算した厚さ
10kg/m² 500kg/m³ 2cm
10kg/m² 1,000kg/m³ 1cm
10kg/m² 2,000kg/m³ 0.5cm

これは式を確かめるための例で、特定の地点の計算結果ではありません。同じ重さでも、密度を2倍にすれば厚さは半分になります。密度を変えて画面の厚さが変わっても、それだけで空から降ってきた総量が増減したわけではありません。

HAIZUの詳細設定。嵩密度1000kg/m³と、操作できない中央粒径・拡散係数・総噴出量の入力欄を表示
キャプチャ2:詳細設定の単位。撮影時は嵩密度を変更でき、計算済み分布に関わる中央粒径・拡散係数・総噴出量の直接入力は無効になっています。入力値の変更や表示更新は実行していません。

現行実装では、密度は堆積質量から厚さへの換算で使います。密度だけの変更のために、Tephra2の空間計算をやり直す構成にはしていません。ただし、現実の堆積物が時間とともに締まったり、雨で状態が変わったりする過程を再現しているわけではありません。表示する厚さにも、置いた仮定が残ります。

公開版は、計算済みの分布を選んで使う

ここまで計算の中身を説明しましたが、公開画面で条件を選ぶたびにTephra2を一から動かしている、と読むと実際の構成とずれます。撮影時の公開版は、事前に用意した計算済みの分布を利用するモードです。

画面には12,480件という案内が出ていました。この件数は2026年10月18日の撮影時の表示で、今後のデータ追加によって変わります。件数が多いこと自体が予測精度の高さを示すものでもありません。どの条件の組み合わせを用意したかを示す運用上の情報です。

計算済み分布を使う構成では、用意できている風向・風速・噴煙高度などを選び、その条件の質量分布を読み出します。対応するデータがない場合に、勝手に新しい重い計算へ切り替えることはしません。利用者が待つ時間と、サーバーがその場で計算する負荷を抑えるための構成です。

この説明は、「数値が架空の絵になった」という意味ではありません。Tephra2で用意した空間分布を、利用時に選び直す方式です。一方、アプリを開いた直後の操作体験用デモは別にあります。初期デモ、計算済みデータ、表示時刻の処理を区別すると、画面の案内も読みやすくなります。

計算済みデータの作り方や速く表示する工夫は、後の回で扱います。今回は「計算する仕組み」と「公開版でいつその計算をするか」は別の設計、と押さえておけば十分です。

動くことの確認と、予測精度の確認を混同しない

計算結果を地図へ表示できたら、ひとまずアプリとしては動きます。それでも、実際の降灰をどこまで説明できるかは、さらに別の確認が必要です。

たとえば、HAIZUの現行アダプターは、計算地点の地表標高を一律0mで渡しています。富士山の代表地点の標高は設定していますが、周囲の山や谷を細かく地形として入れているわけではありません。背景に地形が見えても、その形すべてが計算条件へ入っているとは限りません。

風も、現行の入力生成では高さごとに同じ風向・風速を並べています。上空で風が曲がる、時間とともに向きが変わる、といった変化を、この入力で再現しているわけではありません。画面で選んだ一定条件のもとで見るための単純化です。

さらに、時刻ごとの累積量は、Tephra2の空間分布へHAIZU独自の簡易時間モデルを組み合わせます。アニメーションがなめらかでも、粒を一つずつ追跡した詳細な輸送計算と受け取らないようにします。到達時刻や噴出の中断・再開の扱いは、次回の主題にします。

プログラムとして確認するなら、入力の範囲、方向の変換、格子の対応、密度換算、欠けた出力の拒否などを調べられます。実際の予測精度を評価するなら、信頼できる例題との数値比較や、観測に基づく条件の校正などが必要です。コードのテストが通ることを、そのまま科学的な精度の証明には使えません。

HAIZUで条件の違いを眺めるときも、「この色なら安全」という判断へ直結させないでください。実際の火山活動や避難等の判断には、気象庁の火山情報や自治体の案内を確認します。

計算をアプリへつなぐときは、境目を確認する

今回の流れを振り返ると、HAIZUが扱う数字は一種類ではありません。噴出する総量はkg、地点ごとの堆積質量はkg/m²、厚さへ換算する密度はkg/m³、表示する厚さはcmです。どれも「量」に見えますが、置き換えられる数字ではありません。

開発で確かめたいのは、画面から計算へ渡すときの意味と単位、計算から受け取るデータのそろい方、表示用に換算するときの仮定です。計算部分を別のプログラムへ任せても、この境目はアプリ側で責任を持って扱います。

初めて似たアプリを作るなら、最初に「入力する値」「返ってくる値」「画面へ出す値」を一枚の表に書いてみるとよさそうです。それぞれに単位と基準を書き添えます。数式を増やす前に、この表がつながっているかを確かめるだけでも、見た目では気づけない取り違えを探せます。

次回の第6回は「時間を動かすと、なぜ降灰が増えていくのか?」を予定しています。今回扱った空間分布に、到達までの時間と噴出の推移をどう組み合わせるか。簡易モデルの考え方と、そこで置いている仮定を説明します。

HAIZU開発シリーズ
紹介・第0回:HAIZUの完成画面と開発ログ
第1回:アプリを作る前に、何を決めたのか?
第2回:画面・サーバー・計算係の役割は?
第3回:地図に火山灰の広がりを重ねるには?
第4回:スマホでも地図を見やすくするには?
第5回:火山灰の分布は、どう計算しているのか?(この記事)
第6回:時間を動かすと、なぜ降灰が増えていくのか?(執筆予定。公開後にリンクを追加します)

HAIZUをブラウザで開く / 使い方とシミュレーションの前提を読む

本記事は2026年10月18日に確認した実装と公開Web版の画面に基づきます。換算の数値例は説明用です。新しい計算の実行、実際の降灰との比較、予測精度の検証は今回の作業に含めていません。

参考情報

kobashinのプロフィール画像

WRITTEN BY

kobashin

個人事業のシステムエンジニア。開発の実務と、AI・身体ケア・家庭菜園の実践を行き来しながら、試してわかったことを記録しています。

運営者情報を読む ↗