こんにちは(@t_kun_kamakiri

オープンCAE勉強会@横浜で勉強会があり、最近取り組んでいる「シュレーディンガーFoamの開発」を発表しました。OpenFOAM を改造してシュレーディンガー方程式(グロス・ピタエフスキー方程式)を解く、というテーマです。

当日のタイムスケジュールはこちら。私は「シュレーディンガーFoamの開発」で発表しました。

いつものように資料は当日の朝からバタバタ作っていましたが、claude codeを使った1時間程度で資料を作りました。資料の出来栄えも悪くないですね。

とういうか今回のソースコード開発もclaude codeにやってもらったので、実質自分が手を動かしている場面はほとんどありません。指示をひたすら出し続けただけです。

発表資料

コード一式は GitHub にあります。

https://github.com/kamakiri1225/schrodingerFoam

発表スライドはブラウザでそのまま見られます。

やっていることをざっくり言うと、次のとおりです。

  • OpenFOAM は流体専用ではなく偏微分方程式(PDE)を解く道具。シュレーディンガー方程式も時空間微分を含む PDE なので解ける。
  • ベースは拡散方程式だけを解く最小ソルバ laplacianFoam。これを4点だけ改造した(①場を実部・虚部の2本に ②式をGP方程式の連立に ③実時間は Crank–Nicolson 反復 ④虚時間は完全陰的+規格化)。
  • 前進オイラーだとノルムが増えて発散するので、Crank–Nicolson(ケーリー変換)でノルムを保存させて安定化。
  • トンネル効果・調和振動子・虚時間発展での基底状態づくり・量子渦(渦対)・ダークソリトンの崩壊までを再現。

量子力学のトンネル効果

量子流体のダークソリトンからの量子渦

量子と古典粒子の捕獲ポテンシャルからの広がりの違い

今後はこのようにOpenFOAMでも量子力学が学習できるようソルバの開発を続けます。量子力学のチュートリアルを置くことで、だれか使ってくれたりするかなと期待しています。
ブログにも「OpenFOAMで量子力学 シリーズ」の記事を書いていきます。

詳しい解説(OpenFOAMで量子力学 シリーズ)
  • 総集編:なぜ流体ソルバでシュレーディンガー方程式が解けるのか
  • シュレーディンガー方程式ソルバを自作する|laplacianFoam 改造4ステップ
  • 量子トンネル効果/調和振動子のコヒーレント状態
  • 波束の広がりは量子と古典でどう違うか/虚時間発展で基底状態を作る
  • 走る渦対(渦-反渦ダイポール)/2次元ダークソリトンの崩壊

質疑・コメント

発表中〜発表後にチャットでいただいたコメントです(一部リンク付き)。超流動や不確定性原理、さらには宇宙の慣性まで話が広がって面白かったです。

  • suzukit(14:00):超流動は熱はなくても、天の川銀河や太陽系の運動慣性はあるので、それかもしれないですよね……
  • Shinji NAKAGAWA(14:13):地球や宇宙空間の微振動と運動慣性を定義できないと難しいです……。不確定性原理も働くので全てが不確定になります。光子自体の観測か光子の産出物の観測か判断できず、位置の観測ができているので光子でない可能性も出てきます……
  • suzukit(14:15)OpenFOAM の complexField.H(GitLab)
  • zeta_plusplus(14:15):流体になった際には量子性を失った亜量子的速度だったら大変ですね……。OpenFOAM に複素数用のクラスが有るみたいです → Foam::complex クラス

OpenFOAM に複素数クラス(complex / complexField)があるのは知らなかったので、これを使えば実部・虚部を2場に分けなくても、もう少しすっきり書けるかもしれません。今後の宿題にします。

質問

  • Q:OpenFOAM のソルバは何を使ったのか?
  • A:laplacianFoam です。拡散方程式だけを解く最小ソルバなので、そこを改造しました。
  • Q:オイラー方程式みたいということは、圧縮性流体特有の解き方が必要なのですか?
  • A:圧縮性ではあるのですが、元の方程式に対流(移流)項がないので、実際には普通の拡散方程式を解いているだけです。なので逆に、Madelung 変換でオイラー方程式のような形に変換してしまうと、対流項が出てきて解き方でかえって苦労します。今回はそのまま拡散方程式の形で解くのが素直です。

というわけで、量子力学という畑違いに見えるテーマでも、いろいろコメントや質問をいただけてありがたかったです。「OpenFOAM に複素数クラスがある」という発見もあったので、次はそれを使った実装も試してみたいと思います。