7 有限要素空間 fespace

既に定義しておいたメッシュと、 要素の種類を表す名前 (P1, P2, ...) を用いて、 有限要素空間 (数学では $ V_h$ などの記号で表すことが多い) を定義する。
有限要素空間(型)の定義
fespace 名前(メッシュの名前, 要素の種類を表す名前);
例えば
fespace Vh(Th, P1);
要素の種類としては、 P1, P2, P1b, ... P2Morley (load "Morley"; が必要), P3 (load "Element_P3"; が必要), … 山のようにある。


有限要素空間は、数学的には (数ベクトルもどきの) 集合であるので、 Freefem++ 的には (数ベクトルもどきを表す) 型名である。 具体的に変数を宣言するには、 定義した型名 変数名; とするわけだ。
有限要素空間の元 (有限要素空間型を持つ変数) の定義
型名 変数名;
例えば
Vh u,v;

有限要素空間の元は実質的に数ベクトルである (という構造を持っている) から、 足したり、実数をかけたりできる。 (注: u が有限要素空間の元であるとき、 u[] は配列となる、らしい。)

一方で、有限要素空間の元は、単なる数ベクトルでなく、区分的多項式であり、 節点以外での関数値が定義されていて、 それが (例えば u が2次元の有限要素空間の変数である場合) u($ x$ ,$ y$ ) のようにして計算できる。

正方形領域での「格子点」上の値を出力
mesh Th=square(N,N);
...
fespace Vh(Th,P1);
Vh u;
...
ofstream f("u.dat");
real xi,yj; // x,y だと名前が衝突して警告されるので
real h=1.0/N;
for (int i=0; i<=N; i++) {
  xi=i*h;
  for (int j=0; j<=N; j++) {
    yj=j*h;
    f << u(xi,yj) << " "; // ここに注目
  }
  f << endl;
}

x, y という定義済みの名前は、 節点の $ x$ 座標, $ y$ 座標を並べたベクトルになっているので、 それを使って関数の値を設定出来る。
Vh g = sin(pi*x)+cos(pi*y);

メッシュ上の数ベクトルであるから、 plot() で等高線を描いたり、 int2d()() で数値積分したりも出来る (いずれも後述)。

桂田 祐史
2018-01-17