FreeFEM

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

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

ところが、 FreeFEM という見事なアイデアで、この状況はずいぶん改善されたと思います。 このプログラムは、フランスの 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でも簡単にコンパイルできますし、 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
  make
  make install
wget が使えないと、エラーになりますので、 前もってインストールしておいてください。 FreeBSD の 4.x 系統の c++ ではコンパイルできません。

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

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

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

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

最後に、 FreeFem++ も実用レベルになりましたので、もう要らないとは思いますが、 私が自社の問題に適用した際に、必要と感じた機能を追加した FreeFem-3.4 の FreeBSD-4.7 用バイナリをもうしばらく残しておきます。 ソースが必要な場合は、ご連絡ください。

平林浩一, 1998-08-26, 2006-02-25