LOG ENTRY / post
水槽と熱帯魚の生態系シミュレーター「アクアラボ」を作った
水槽と熱帯魚の生態系シミュレーター「アクアラボ」を作った
水槽の中で起きていることを、できるだけごまかさずに一本の収支で解いてみたくなりました。
→ アクアラボ
ブラウザだけで動きます。スマホでも動きますが、3Dは重めなのでPC推奨です。調べたこと・決めたこと・失敗したことは別のページに書きました。
どういうものか
水槽・底床・フィルター・ヒーター・照明・餌・水道水・室温を機材DBから選んで魚を入れると、時間が進みます。倍速で1年でも回せます。
- 窒素は台帳で閉じている。 餌として入った窒素が、魚の体・アンモニア・亜硝酸・硝酸・デトリタス・生物膜・水草・エビ・換水で出た分のどこにあるか、半年回しても相対残差が 1e-9 以下で一致します。反応網は正値性と質量保存を両立させる修正 Patankar–Euler で解いています(普通の陽的オイラーだと、濃度が負になるかプールが漏れるかのどちらかになります)
- 計器が三層ある。 真値、試薬(テトラ6in1・API などの段階丸めと発色待ち)、電子計器(Seneye・pHペンのドリフトと校正・TDS)。「試薬では0.25と出ているが真値は0.4」のようなずれが普通に起きます
- 濾過装置の中身がある。 外掛け・上部・外部・投げ込み・スポンジ・底面・サンプを実機の構造で作り、濾材を層ごとに通水順に重ねます。空塔速度・接触時間・目詰まり・洗浄まで入れてあります。濾材を水道水で洗うと出るのはアンモニアではなく亜硝酸のスパイクだ、というのはやってみて分かりました
- 水流を解いている。 水槽内を約7,000セルの格子で非圧縮流体として解き、軌跡付きの粒子で見せます。外掛け1台の60cm水槽で遠端が淀む、あの実感がそのまま出ます
- 魚は骨格から泳ぐ。 剛体の頭蓋+椎骨チェーン(スズメダイ科26・ニザダイ科22は科の標準形質、オスカーとピラニアは科の範囲からの推定)+受動的な尾鰭。重心は断面の面積分布と鰾の位置から積分して出しています(吻端から全長の 0.34〜0.38、文献値と整合)。曲がった体が抵抗の異方性で自分の中心線に沿って滑るので、旋回は「頭が先に切り込み、体幹が頭の軌跡を追う」形になります。剛体をその場で回しているわけではありません
- 一期一会の個体差。 導入のたびに L∞・成長速度・食欲・基礎代謝・大胆さ・気性・模様を乱数で引きます。CV は文献値のあるものは文献値、無いものは推定と明記
- 海水(リーフ)版もある。 塩分・炭酸系・ホウ酸・アラゴナイト飽和度を解き、プロテインスキマー・ドージング・ライブロックの脱窒・サンゴの石灰化と白化まで。海水の硝化群集は淡水と別物(コマモックスが居ない、AOA と AOB が拮抗)なので、文献で作り直しました
- 水草・藻・ヌマエビ(v0.8)。 水草19種の光合成は P–I 曲線で、CO2 は飽和値を下げるが初期勾配は変えない、という形にしてあります。単純に光×CO2 を掛けると弱光域を 1/3 に過小評価して、低光量水槽の陰性草が枯れてしまいます。これが実装中に見つかった一番大きい修正でした。藻は5種(珪藻・緑スポット・糸状・黒髭・ラン藻)で付着面積に頭打ち。エビは8節の外骨格で矢状面1自由度、全屈曲で25°(Crangon の実測値)、歩脚は10本のうち常に3本以上接地。ヤマトヌマエビは汽水が要るので淡水では殖えません
作りながら分かったこと
- アルカリ度の正味消費は 3.57 mg CaCO3/mg N。 趣味界でよく見る 7.14 は塩化アンモニウムを投入するフィッシュレスサイクリングでだけ成り立つ数字で、魚の排泄はアンモニア化の時点で半分戻してきます。それでも成魚オスカーの90cmで 0.4 dKH/日 は減ります
- 境界層の物質移動上限を入れないと濾過が効きすぎる。 生物膜の反応速度だけで計算すると1パス除去率が 99% になってアンモニアが 0.001 mg/L まで落ちます。kD ≈ 1.3 m/日 を入れると 40% 程度になって現実的な値になりました
- 放置水槽の主な死因は NH3 ではない。 「放置したあとの大量換水でアンモニア中毒」は、換水がアンモニアも希釈するのでモデル上は思ったほど致死的になりません。実際に効いてくるのは KH が枯れて pH が落ちたあとの遊離亜硝酸と慢性ストレスでした。正直にそう見せています
- 東京の水道水(KH 2.5)で KH を補給せずにサイクリングすると10日で pH 6 に落ちて止まります。 趣味界で言われる「サイクリング中の pH クラッシュ」がそのまま出ます
直した恥ずかしいやつ
- ソイルのアンモニア溶出が窒素を無から生成していた(v0.7 以前からずっと)
- 藻の被食をエビ側と藻側で二重に引いていた
- 孵化のときに稚エビの体重を母体から引く量がずれていた
- 進行波の振幅包絡を全長基準の式に体長を入れていて、尾柄の振幅が6割増しになっていた
- 過飽和した酸素が抜けずに飽和度 350% まで上がった(葉に泡がつく pearling を脱気として入れて 150% で頭打ちにした)
いずれも台帳の残差が教えてくれました。収支が閉じるように作っておくと、こういう間違いが数値として浮いてきます。
できていないこと
病気(白点・ネオン病)は未実装。水草の水上葉・水中葉の転換もありません。魚の推力は運動学的で、尾の力から速度を出しているわけではありません。エビの背腹方向は剛体。濾材の目詰まり速度や吸着容量は推定値です。文献値と推定値の区別は、機材DBの全項目と実装ノートに残してあります。