1950 年代に構造解析から誕生した「有限要素法」は偏微分方程式の標準的な数値解法の 一つとして定着しましたが、
ところが、 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++ で 書かれたソースはLinuxやFreeBSDでも簡単にコンパイルできますし、 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 installwget が使えないと、エラーになりますので、 前もってインストールしておいてください。 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 による表示ができませんので、注意してください。
OpenGL, GLUT を使った 3D まで動かす場合は、freeglut も使えるようにしておくほう が良いと思いますが、これも FreeBSD-8.0 では ports/graphics/freeglut が broken になっていますので、下記のようにコンパイルします。
さらに、EigenValue(固有値)を含めて、MPI 以外のすべてのパッケージを使えるように するなら、
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
平林浩一, 1998-08-26, 2006-02-25, 2010-03-01, 2010-08-04