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はその後、freerem+に引き継がれ、 freefem+1.2.10 freefem+1.2.10になりましたが、 一方、Freefem++FreeFEM++FreeFEM3Dといった機能強化した新しいバージョンの開発が進んでいて、 http://www.freefem.org/ff++/ で Unix 用のソース、ドキュメント、教材が公開されておます。

当初の FreeFEM++ では complex が使えないとか、固有値問題が扱えないとか、 いろいろ不便なところがありましたが、急速に改良が進み、格段の進化を遂げました。

一時は FreeBSD でも ports が用意されたのですが、残念ながら maintainer が見付からないようで、すぐになくなってしまいました。

最近まで FreeBSD でコンパイルするのに手がかかりましたが、 FreeFem++ v3.21 では格段に移植性がよくなって、 FreeBSD で必要なパッチも少なくなり、 次ぎのバージョンでは、後記のパッチ取り込まれることになっています。

以下、FreeBSD に於けるコンパイルで苦労される方向けに、 今まで私自身が FreeBSD でコンパイルしたときのメモを付けておきます。

freefem++-2.3-1 のコンパイル

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.4/9.1 までコンパイルできるようにしてありますので、必要な場合は、 ご連絡ください。

注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

注5 - FreeBSD-8.2 に於ける freefem++-3.19-1 のインストール

0) 前もって、下記の ports をインストールしておきます。

  ports/math/gsl
  ports/math/arpack
  ports/math/fftw3
  ports/math/tetgen
  ports/cad/scotch
  ports/cad/mumps
  ports/devel/mercurial

また /usr/local/bin/gfortran がなければ、

  # ln -s /usr/local/bin/gfortran45 /usr/local/bin/gfortran

で作っておいてください。


1) freefem++-3.19-1 のソースコードを入手します。

  cd /var/local/src  .. ご自分の作業場所にしてください
  hg clone  http://www.freefem.org/ff++/ff++

2) 一時的に BSD の make を gmake に変更しておきます。

  # cd /usr/bin
  # mv make BSDmake
  # ln -s /usr/local/bin/gmake make

3) ソースコードの修正

/var/local/src/ff++ にこのパッチをコピーして、
ソースコードにパッチを当てます。

  cd /var/local/src/ff++
  patch < ff++3.19-1_patch

4) download/hips/Makefile と pastix/Makefile の行末の CR ('\r') を削除します。

さもないと、(/usr/local/bin/)gmake がエラーになります。

5) ff++/examples++-load/WHERE_LIBRARY を作ります。
   (実際のファイルでは HTML ファイルの &lt; を < で置き換えてください。)

cd ff++
cat > ff++/examples++-load/WHERE_LIBRARY << !
gsl LD '-L/usr/local/lib -lgsl'
gsl INCLUDE '-I/usr/local/include/gsl'
blas LD '-L/usr/local/lib -lblas'
lapack LD '-L/usr/local/lib -llapack'
fftw3 LD '-L/usr/local/lib -lfftw3'
tetgen LD '-L/usr/local/lib -ltet'
scotch LD '-L/usr/local/lib -lscotch'
mumps LD '-L/usr/local/lib -lmumps'
!

6) コンパイルします。

  ./configure --enable-download F77=gfortran45 LDFLAGS="-L/usr/local/lib" \
FCFLAGS="-L/usr/local/lib"
  ( cd download/hips; make install )
  ( cd download/pastix; make install )
  make
  # make install

7) 最後に make コマンドを元に戻します。

  # cd /usr/bin
  # mv BSDmake make

注 6 - FreeBSD-8.3 に於ける freefem++-3.19-1 のインストール

FreeBSD-8.3 の gfortran46 に 問題 があって、examples++-load の一部にある fortran と c++ の混在プログラムが コンパイルできませんので、前記のパッチに代えて、 このパッチで対処します。 これ以外は、FreeBSD-8.2 の場合と同じです。

注 7 - FreeFEM-9.1, FreeBSD-8.2 に於ける freefem++-3.21 のインストール

長くなりましたので、別のファイルに 置きます。

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