Google ColabでFreeFEMを使う:フォルダー作成からPoisson方程式の可視化まで
Introduction
Google Colab は,ブラウザから気軽に計算実験を始められる便利な環境です.一方で,有限要素法の実験では,環境構築だけでなく,どこに .edp ファイルを書き,どこへ出力ファイルを置くかでも少し迷いやすいです.このページでは,Google Colab 上で FreeFEM を導入し,作業用フォルダーを作り,その中に FreeFEM の入力ファイルと出力ファイルをまとめながら,Poisson 方程式を解いて Python で可視化するまでの流れを整理します.
今回の目標は 5 つです.
1.Google Colab 上で FreeFEM を動かすための基本手順を確認すること.
2.FreeFem++-nw を使って,headless 環境でも安定に実行すること.
3.mkdir -p と cat > ファイル名 <<'EOF' を使って,作業用フォルダーの中に .edp ファイルを作ること.
4.Poisson 方程式の最小例を通じて,FreeFEM で有限要素法を解く基本の形を見ること.
5.FreeFEM 側で数値を書き出し,Python 側で図示する流れに慣れること.
ここで扱う問題は単位正方形 \[ \Omega=(0,1)^2 \] 上の Poisson 方程式 \[ -\Delta u = 1 \quad \text{in } \Omega, \qquad u=0 \quad \text{on } \partial\Omega \] です.厳密解を使った誤差評価の前段階として,まずは「Colab で FreeFEM が動き,計算結果がファイルに保存され,その結果を図にできる」ことを目標にします.
Google Colabでの実行手順
まず Google Colab を開き,新しいノートブックを作成します.この例では GPU は不要なので,通常の CPU ランタイムで十分です.Colab はセッションごとに環境が初期化されることがあるため,FreeFEM のインストールセルを毎回上から実行する前提でノートブックを組むと分かりやすいです.
また,環境構築と動作確認を分けておくと,エラーが出たときの切り分けがしやすくなります.さらに,作業用フォルダーを最初から作っておくと,.edp ファイルと出力ファイルが散らばらず,あとから見直しやすくなります.
セル1:FreeFEM のインストール
最初のセルは FreeFEM を Colab に入れるためのものです.ここでは Ubuntu の版を確認して,対応する .deb を取得し,最後に利用可能なバイナリ名を確認します.このセルでは,まだ .edp の実行までは行いません.
%%bash
set -e
apt-get update -y
apt-get install -y wget ca-certificates \
libgsl-dev libhdf5-dev liblapack-dev libopenmpi-dev freeglut3-dev
source /etc/os-release
echo "Ubuntu version: $VERSION_ID"
if [ "$VERSION_ID" = "24.04" ]; then
URL="https://github.com/FreeFem/FreeFem-sources/releases/download/v4.15/FreeFEM-4.15-amd64-ubuntu24.04.deb"
elif [ "$VERSION_ID" = "22.04" ]; then
URL="https://github.com/FreeFem/FreeFem-sources/releases/download/v4.15/FreeFEM-4.15-amd64-ubuntu22.04.deb"
else
echo "Unsupported Ubuntu version in this Colab runtime: $VERSION_ID"
exit 1
fi
wget -q "$URL" -O /tmp/freefem.deb
dpkg -i /tmp/freefem.deb || apt-get -f install -y
echo "Installed binaries:"
which FreeFem++ || true
which FreeFem++-nw || true
ls -l /usr/local/bin/FreeFem* || trueこのセルの役割は環境構築だけです.もしこの段階で止まるなら,依存ライブラリや Ubuntu の版の問題です.逆に,ここが通れば,次は FreeFEM 本体が実際に動くかどうかを小さな例で確かめればよいことになります.
セル2:作業用フォルダーを作って最小の疎通確認をする
次に,freefem_demo という作業用フォルダーを作り,その中に最小の .edp ファイルを書きます.ここでは正方形メッシュを作り,頂点数と三角形数を表示するだけです.FreeFEM の実行には,graphics window を使わない FreeFem++-nw を用います.
%%bash
mkdir -p freefem_demo
cat > freefem_demo/hello.edp <<'EOF'
cout << "Hello from FreeFEM" << endl;
mesh Th = square(4,4);
cout << "number of vertices = " << Th.nv << endl;
cout << "number of triangles = " << Th.nt << endl;
EOF
FreeFem++-nw freefem_demo/hello.edp
このセルでは最初に
mkdir -p freefem_demo
と書いています.これは freefem_demo という新しいフォルダーを作る命令です.-p を付けると,すでに同じ名前のフォルダーが存在していても扱いやすく,また必要に応じて親フォルダーもまとめて作れます.
次の
cat > freefem_demo/hello.edp <<'EOF'
から最後の EOF までは,bash でテキストファイルを作っている部分です.ここでは,その間に書いた文字列がそのまま freefem_demo/hello.edp の中身になります.つまり,Colab のセルの中で FreeFEM 用の入力ファイルをその場で作っているわけです.
作業用フォルダーを最初に作っておく利点は単純で,.edp ファイル,出力テキスト,あとで作る図や補助ファイルを同じ場所にまとめられることです.最小例の段階からこの形にしておくと,本格的な計算へ拡張するときも整理しやすいです.
セル3:Poisson 方程式を解いて,出力も同じフォルダーに保存する
ここで,Poisson 方程式
\[
-\Delta u = 1, \quad u|_{\partial\Omega}=0
\]
を単位正方形上で解きます.弱形式
\[
\int_\Omega
\nabla u \cdot \nabla v\,dx = \int_\Omega f v\,dx
\]
を solve でそのまま書き,さらに格子点上でサンプリングした値を freefem_demo/u_samples.txt に保存します.
%%bash
mkdir -p freefem_demo
cat > freefem_demo/poisson.edp <<'EOF'
verbosity = 2;
mesh Th = square(40, 40);
fespace Vh(Th, P1);
Vh u, v;
func f = 1.0;
solve Poisson(u, v)
= int2d(Th)( dx(u)*dx(v) + dy(u)*dy(v) )
- int2d(Th)( f*v )
+ on(1, 2, 3, 4, u=0);
ofstream out("freefem_demo/u_samples.txt");
int N = 101;
for (int j = 0; j < N; j++) {
real y = j * 1.0 / (N - 1);
for (int i = 0; i < N; i++) {
real x = i * 1.0 / (N - 1);
out << x << " " << y << " " << u(x,y) << endl;
}
}
cout << "u(0.5,0.5) = " << u(0.5,0.5) << endl;
EOF
FreeFem++-nw freefem_demo/poisson.edp
ここでも最初に
mkdir -p freefem_demo
を書いています.このセル単体で実行してもフォルダーが存在するようにするためです.Colab ではセルをあとから個別に実行し直すことがよくあるので,各セルがなるべく自立していた方が扱いやすいです.
また,
cat > freefem_demo/poisson.edp <<'EOF'
は,FreeFEM のプログラムをその場で freefem_demo/poisson.edp に書き込む bash の書き方です.最後の EOF までの部分が,そのままファイルの中身になります.
コードの先頭にある
verbosity = 2;
は,FreeFEM の出力の詳しさを指定する設定です.verbosity が大きいほど実行時に表示される情報が増えます.最初の段階では,完全に静かにするよりも,ある程度メッセージが出た方が「どこまで進んだか」を確認しやすいので,ここでは 2 にしています.
さらに,
ofstream out("freefem_demo/u_samples.txt");
としているのは,出力ファイルも同じ作業用フォルダーにまとめるためです.このようにしておくと,入力ファイル poisson.edp と出力ファイル u_samples.txt の対応が見やすくなります.
セル4:Python で可視化する
セル 3 で書き出した freefem_demo/u_samples.txt を NumPy で読み込み,Matplotlib で等高線図を描きます.FreeFEM で計算し,Python で図を描くという役割分担です.
import numpy as np
import matplotlib.pyplot as plt
data = np.loadtxt("freefem_demo/u_samples.txt")
x = data[:, 0]
y = data[:, 1]
u = data[:, 2]
N = int(np.sqrt(len(u)))
X = x.reshape(N, N)
Y = y.reshape(N, N)
U = u.reshape(N, N)
plt.figure(figsize=(6, 5))
cp = plt.contourf(X, Y, U, levels=30)
plt.colorbar(cp)
plt.xlabel("x")
plt.ylabel("y")
plt.title("FreeFEM solution of -Δu = 1 on the unit square")
plt.tight_layout()
plt.show()これで,境界で 0 になり,内部で山型になる Poisson 解の典型的な形が確認できます.最初は「解けたかどうか」だけでも十分ですが,図が出ると計算対象の感覚が一気につかみやすくなります.
この 4 セルの役割
この 4 セルは,それぞれ別の役割を持っています.
セル 1 は環境構築です.Colab 上で FreeFEM を使える状態にします.
セル 2 は疎通確認です.作業用フォルダーを作り,最小の .edp を通して「FreeFEM が生きている」ことを見ます.
セル 3 は有限要素法の本体です.弱形式を書いて解き,さらにデータを書き出します.
セル 4 は可視化です.Colab で見やすい図にするために Python を使います.
この分け方にしておくと,あとからコードを拡張しやすいです.右辺を変える,境界条件を変える,メッシュ数を変える,誤差評価を加える,3 次元表示へ進む,といった変更は主にセル 3 とセル 4 に集まります.一方で,セル 1 とセル 2 はほぼそのまま流用できます.
bash 側でやっていることをもう少し丁寧に読む
Colab で FreeFEM を使うときは,FreeFEM の文法だけでなく,bash 側の基本も少し分かっていると見通しがよくなります.今回のセルで重要なのは次の 3 つです.
mkdir -p freefem_demo は,新しいフォルダーを作る命令です.
cat > freefem_demo/poisson.edp <<'EOF' は,そのフォルダー内にテキストファイルを書くための書き方です.
最後の FreeFem++-nw freefem_demo/poisson.edp は,作ったファイルを no-window 版の FreeFEM で実行する命令です.
つまり,Colab の 1 つのセルの中で「フォルダーを作る,プログラムファイルを書く,そのファイルを実行する」までを一気に行っています.この流れにしておくと,ノートブックを他人に渡したときも,再現しやすいです.
FreeFEM の記法の最小限の読み方
FreeFEM のコードは,一度慣れるとかなり直接的です.今回の例で大事なのは次の点です.
mesh Th = square(40,40); は,単位正方形を分割したメッシュを作ります.
fespace Vh(Th, P1); は,そのメッシュ上の P1 有限要素空間を作ります.
Vh u, v; で,数値解と試験関数に相当する有限要素関数を用意します.
solve Poisson(u, v) = ... の部分で,弱形式をほぼ数式どおりに書きます.
on(1,2,3,4,u=0) は,境界ラベル 1,2,3,4 上で同次 Dirichlet 条件を課しています.
ここで「数式に近い形で書ける」というのが FreeFEM の大きな利点です.とくに,有限要素法の講義や実験ノートでは,理論とコードの対応が見やすいです.
なぜ Colab では Python 可視化が便利なのか
FreeFEM には描画機能がありますが,Colab のようなブラウザ実行環境では,ローカルデスクトップのような感覚でそのまま使えるとは限りません.そのため,数値解を一度テキストファイルへ書き出し,Python 側で読み込んで図示する方が扱いやすいです.
この方法の利点は 3 つあります.
1.Colab 上で安定して図を表示しやすいこと.
2.NumPy や Matplotlib にそのままつなげられること.
3.あとで誤差表や log-log プロットなども同じ Python ノートブックの中で扱えること.
将来的に,厳密解を入れて相対誤差を測る,複数のメッシュで収束率を出す,3 次元曲面図を描く,という拡張をする場合にも,この流れはそのまま使えます.
次に拡張するなら何をやるか
今回の記事は,まずは Colab で FreeFEM を動かし,作業用フォルダーの中に計算ファイルと出力ファイルを整理するところまでに集中した最小構成です.この次の段階としては,次のような拡張が自然です.
1.右辺を厳密解から作って,誤差評価へ進むこと.
2.メッシュ数を変えて収束率を見ること.
3.メッシュ図や 3 次元曲面図まで描くこと.
4.出力ファイルを複数保存して,比較実験の形にすること.
いずれの場合にも,今回のように freefem_demo のようなフォルダーを最初から作っておくと,実験結果の整理がかなりしやすくなります.
