FreeFEM

1950 年代に構造解析から誕生した「有限要素法」は偏微分方程式の標準的な数値解法の 一つとして定着しましたが、

  1. 複雑な境界形状に良く適合した要素分割ができる
  2. ポテンシャル分布に適応した自由な要素分割ができる
  3. 材料定数の取扱が容易
といった際だった利点の半面、構造データとプログラムの作成が面倒で、 電卓のように気軽に使えるものではありませんでした。

ところが、 FreeFEM という見事なアイデアで、この状況はずいぶん改善されたと思います。 このプログラムは、フランスの UPMC (当時 Pierre et Marie Curie 大学)スタッフによって開発された もので、Gfemと呼ばれるPascal風の言語により、

  1) 境界形状
  2) 境界条件
  3) 偏微分方程式
を記述するだけで、メッシュの自動生成から数値解を求める作業のすべてをやって くれますから、何とも気軽にいろいろな問題を解くことができます。

例えば、長径 2、短径 1 の楕円膜全体に垂直方向の力 1 を加えたときの変位を求 める問題は、

border(1,0,2*pi,40) {	/* 境界番号 1、パラメータは 0 から 2*pi まで */
 x:=2*cos(t);		/* 頂点数 40 でパラメトリックに楕円を描く */
 y:=sin(t);
};

buildmesh(800);	/* メッシュ生成 (最大頂点数 800) */

solve(v) {	/* 偏微分方程式の指定と求解 */
 onbdy(1) v=0;	/* 境界条件 */
 pde(v) -laplace(v) = 1	/* ポアソン方程式 */
};
plot(u);	/* 等ポテンシャル線の作図 */
といった極めて簡単な記述で済んでしまいます。

ご興味を持たれた方は、ぜひ前記のURLをお尋ねになってください。C++ で 書かれたソースはLinuxFreeBSDでも簡単にコンパイルできますし、 Mac や Windows ならバイナリも用意されています。私は Windows を使いませんが、 Makefile を追加する程度で、Windows95 の Visual C++ 4.0 でもコンパイルでき ました。しかし、Unix のほうが圧倒的に使いやすいです。

使い方は、付属のドキュメントと実例をもとに、少し実験するとわかりますが、 最近、出版された、フランス語からの英訳

  Brigitte Lucquin, Oliver Pironneau,- Introduction to
    Scientific Computing
      (John Wiley & Sons) ISBN 0-471-97266-5
の1章にも、かなり多くのサンプルが載っています。下記は、その中の1つ、 「1.8.2 Lame's system」のプログラムと出力例ですが、中央に割け目のある 方形断面ビームの上下の面に引き離す方向の力を加えたときの歪み解析です。 縦方向の面は自由に動けます。対称性を利用して、右上半分の 1/4 を解析して います。
/* Lame's system */
border(1,0,1,20) { x:=1-(t-1)^2; y:=0 };
border(2,1,2,20) { x:=(t-1)^2+1; y:=0 };
border(3,0,1,5) { x:=2; y:=t };
border(4,0,2,10) { x:=2-t; y:=1 };
border(5,0,1,5) { x:=0; y:=1-t };
buildmesh(500);

E:=2.15; sigma:=0.29; lambda:=E/(2*(1+sigma));
nu:=E*sigma/((1+sigma)*(1-2*sigma));
mu:=nu+sigma;

solve(u,v) {
 onbdy(3,5) u=0;
 onbdy(2) v=0;
 onbdy(4) dnu(v)=1;
 pde(u) -laplace(u)*mu-dxx(u)*nu-dxy(v)*nu=0;
 pde(v) -laplace(v)*mu-dyx(u)*nu-dyy(v)*nu=0;
};
plotmesh;
x=x+0.1*u;
y=y+0.1*v;
plotmesh;

なお、このすばらしいアイデアを日本でも気軽に使えるようにしたいと思って、 日本語のドキュメント、WEB 版のデモ、気づいた範囲でのパッチを用意してみました。

なお、開発元では、Freefem++FreeFEM++FreeFEM3Dといった機能強化した新しいバージョンの開発が進んでいて、 http://www.freefem.org/ で Unix 用のソース、ドキュメント、教材が公開され、 最近は FreeBSD 等でも、ports が用意されるようになりました。

現在の FreeFem+++ version 2.3-1 では、bug fix が進み、過去のバージョンで問題の 多かった complex もちゃんと扱えるようになりましたし、固有値問題のサポートとか、 優れたメッシュ生成など、格段によくなっています。

コンパイルは、freefem++-2.3-1.tar.gz を展開したディレクトルで、 下記のように行います。

  ./configure --enable-download
  gmake
  gmake install
wget が使えないと、エラーになりますので、 前もってインストールしておいてください。 FreeBSD の 4.x 系統の c++ ではコンパイルできません。

なお、FreeFEM++では、解くべき問題を記述する微分方程式として、 導関数の階数が低いWeak Form(弱形式)だけを使うようになりましたので、 偏微分方程式の記述が以前の FreeFEM と違っていることに注意してください。

Weak Form については、境界条件の記述を含めて、 全面改定されたマニュアル(freefem++doc.pdf)にも、 豊富な例題と共に解説がありますし、前期の書籍にも書かれていますが、 日本語で読めるものとしては、下記の記述も簡潔で良いと思います。

  菊地文雄,- 有限要素法概説
	(サイエンス社) ISBN4-7819-0308-8

ここでは、 円柱導体の表皮効果を計算する例を1つだけつけておきます。

2010-02-01 追記

FreeFem++ も実用レベルになりましたし、FreeBSD でも ports/math/freefem++ に入って きましたので、この解説も、もう要らないと思ったのですが、FreeBSD-8.0 になった ら、 ports/math/freefem++ がなくなって(注1)、ports/math/freefem (FreeFEM-3.5.8) だけ だけになってしまいましたし、偏微分方程式が Strong form (強形式) で記述できると、 数値計算に馴染のない方にはわかりやすいと思いますので、freefem 3.5 の参考資料と して、当面残すことにしました。

私が自社の問題に適用した際に、必要と感じた機能を追加した FreeFem-3.4 のソースコ ードは FreeBSD-8.0 までコンパイルできるようにしてありますので、必要な場合は、 ご連絡ください。

注1 - FreeBSD-8.0 に於ける freefem++-3.8 のインストール

FreeBSD-8.0 では ports/math/freefem++ がなくなってしまいましたが、3D が要らなけ れば、下記の手順でコンパイルできます。X11 のドライバで OpenGL をサポートしてい ないと、medit による表示ができませんので、注意してください。

  1. http://www.freefem.org/ff++/ から Unix 用 sources archive を取ってくる
  2. freefem++-3.8.tar.gz を展開し、下記を実行
    1. cd freefem++-3.8
    2. ./configure F77=gfortran44
    3. gmake
    4. gmake install
最後の「gmake install」は root 権限で実行しますが、 これで、/usr/local/bin/FreeFem++,FreeFem++-nw,FreeFem++-x11 ができて、 /usr/local/share/freefem++/3.8/ にサンプルプログラムが作られます。 ドキュメントは /usr/local/share/freefem++/freefem++doc.pdf になります。

OpenGL, GLUT を使った 3D まで動かす場合は、freeglut も使えるようにしておくほう が良いと思いますが、これも FreeBSD-8.0 では ports/graphics/freeglut が broken になっていますので、下記のようにコンパイルします。

  1. cd freefem++-3.8
  2. ./configure F77=gfortran44 LDFLAGS="-L/usr/local/lib -lglut -lX11 -lxcb -lXdmcp -lXau"
  3. gmake
  4. gmake install

さらに、EigenValue(固有値)を含めて、MPI 以外のすべてのパッケージを使えるように するなら、

  1. cd freefem++-3.8
  2. ./configure --with-blas=/usr/local/lib/libblas.a --with-arpack=/usr/local/lib/libarpack.a --with-umfpack=/usr/local/lib/libumfpack.a F77=gfortran44 LDFLAGS="-L/usr/local/lib -lglut -lX11 -lxcb -lXdmcp -lXau"
  3. gmake
  4. gmake install
とするのが確実です。blas や arpack は ports/math/ から入れますが、数学関連のプ ログラムをいくつかインストールすると自動的に入ると思います。 ./configure --with-download でコンパイルできると楽なのですが、私の環境ではライ ブラリ間に矛盾が出て、うまくゆきませんでした。

FreeFem++ で 3D mesh を可視化するために使われている medit を単独で動かす場合は FreeBSD-8.0 でも ports/science/medit に入っているのですが、これも実行時にライブ ラリがないと言われますので、とりあえずなら、下記のような方法でごまかします。

  ln -s /usr/local/lib/libglut.so.3 /usr/local/lib/libglut.so.4
  ln -s /lib/libm.so.7 /lib/libm.so.6
  ln -s /lib/libc.so.7 /lib/libc.so.6
メッシュデータのサンプルは /usr/local/share/examples/medit/ にインストールされ ます。 medit のドキュメントは http://www.ann.jussieu.fr/~frey/publications/RT-0253.pdf にあります。ソースコードは http://www.ann.jussieu.fr/~frey/ftp/archives/ です。

注2 - FreeBSD-8.1 に於ける freefem++-3.9 のインストール

FreeBSD-8.1 では ports/graphics/freeglut, libgult も broken ではなくなりましたから、ports から直接コンパイルできて、その他は注1と同じ方法 でコンパイルすることができます。 medit も port/science/medit からインストールできますが、ライブラリのバージョン が合いませんので、下記の方法でごまかしました。

  ln -s /usr/local/lib/libglut.so.3 /usr/local/lib/libglut.so.4
  ln -s /lib/libm.so.5 /lib/libm.so.4
  ln -s /lib/libc.so.7 /lib/libc.so.6
ports/print/ghostscript8 がインストールされていると、ドキュメントの一部が epstopdf で変換できずにエラー終了しますので注意してください。 ports/print/ghostscript7-jpfont のほうは大丈夫です。 ghostscript8 の問題は http://bugs.ghostscript.com/attachment.cgi?id=5834のパッチで直ります。

注3 - FreeBSD-8.2 に於ける freefem++-3.12 のインストール

ghostscript8 の問題は Free-BSD-8.2 でも解決されていませんので、 このパッチ をあてて修正しておくか、 ghostscript7 に切替えてから freefem++-3.12 をインストールしてください。

最初に、freefem++-3.12.tar.gz を展開した後、 freefem++-3.12/download/metis/patch-metis にこの パッチをあててください。 これで、download した download/pkg/metis-4.0.tar.gz に期待した変更ができます。

次に、

$ ./configure --enable-download F77=gfortran45 LDFLAGS="-L/usr/local/lib"
$ gmake
# gmake install
でコンパイルします。 example は /usr/local/share/freefem++/3.12/ にインストールされますので、 例えば、
  $ cd /usr/local/share/freefem++/3.12/examples++
  $ FreeFem++ all.edp
で動作確認ができます。 マニュアルは /usr/local/share/freefem++/freefem++doc.pdf にあります。 以前のマニュアルの 部分訳も役立つと思います。

gfortran44 が gfortran45 に変わっていますので、 F77=gfortran45 を指定すること以外は、基本的に FreeBSD-8.0 の場合と同じです。

なお、port/science/medit がコンパイルできなくなっていますので、 port/science/medit/files/patch-makefile を次ぎのように修正してください。

--- ORGpatch-makefile	2010-10-17 23:45:12.000000000 +0900
+++ patch-makefile	2011-03-22 11:46:45.000000000 +0900
@@ -16,7 +16,7 @@
 +	$(MAKE) $(MFLAGS) -f Makefile.arch \
 +        "prog   = medit" \
 +        "INCDIR = -I. -I$(WRKSRC)/sources -I$(LOCALBASE)/include" \
-+	"XLIBS  = -L$(LOCALBASE)/lib -lXmu -lXext -lX11" \
++	"XLIBS  = -L$(LOCALBASE)/lib -lXmu -lXext -lX11 -lthr" \
 +        "GL_LIB   = -lGL" \
 +	"GLU_LIB  = -lGLU" \
 +	"GLUT_LIB = -lglut" \

ライブラリのバージョン問題はありません。

注4 - FreeBSD-8.2 に於ける freefem++-3.16 のインストール

下記の手順でインストールできます。

freefem++-3.16.tar.gz を展開し、
freefem++-3.16/download/pkg と freefem++-3.16/download/lib ディレクトリを作成して、
下記を追加
  MUMPS_4.9.2.tar.gz (http://graal.ens-lyon.fr/MUMPS/index.php?page=dwnld#form)
        (http://mumps.enseeiht.fr/MUMPS_4.9.2.tar.gz か
        http://graal.ens-lyon.fr/MUMPS/MUMPS_4.9.2.tar.gz)
  mmg3d4.0.tgz (http://www.math.u-bordeaux1.fr/~dobj/logiciels/download.php)
cd freefem++-3.16/download/lib
ln -s libmmg3d-v4.a libmmg3d.a
以上の準備をした後で、下記を実行
cd freefem++-3.16
./configure --enable-download F77=gfortran45 LDFLAGS="-L/usr/local/lib"
gmake
gmake install

平林浩一, 1998-08-26, 2006-02-25, 2010-03-01, 2010-08-04, 2011-03-22, 2011-11-09