既に定義しておいたメッシュと、 要素の種類を表す名前 (P1, P2, ...) を用いて、 有限要素空間 (数学では などの記号で表すことが多い) を定義する。
有限要素空間(型)の定義 |
fespace 名前(メッシュの名前, 要素の種類を表す名前);例えば fespace Vh(Th, P1); |
有限要素空間は、数学的には (数ベクトルもどきの) 集合であるので、 Freefem++ 的には (数ベクトルもどきを表す) 型名である。 具体的に変数を宣言するには、 定義した型名 変数名; とするわけだ。
有限要素空間の元 (有限要素空間型を持つ変数) の定義 |
型名 変数名;例えば Vh u,v; |
有限要素空間の元は実質的に数ベクトルである (という構造を持っている) から、 足したり、実数をかけたりできる。 (注: u が有限要素空間の元であるとき、 u[] は配列となる、らしい。)
一方で、有限要素空間の元は、単なる数ベクトルでなく、区分的多項式であり、 節点以外での関数値が定義されていて、 それが (例えば u が2次元の有限要素空間の変数である場合) u(,) のようにして計算できる。
正方形領域での「格子点」上の値を出力 |
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 という定義済みの名前は、 節点の 座標, 座標を並べたベクトルになっているので、 それを使って関数の値を設定出来る。
Vh g = sin(pi*x)+cos(pi*y); |
メッシュ上の数ベクトルであるから、 plot() で等高線を描いたり、 int2d()() で数値積分したりも出来る (いずれも後述)。