既に定義しておいたメッシュと、
要素の種類を表す名前 (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()() で数値積分したりも出来る (いずれも後述)。