![]() |
| サイトマップ | |
|
FlexPDE:有限要素法・数式処理内蔵の
|
{ Fill in the following sections, or delete those that are unused.} TITLE ' ' { the problem identification } SELECT { method controls } VARIABLES { system variables } DEFINITIONS { parameter definitions } INITIAL VALUES EQUATIONS { PDE's, one for each variable } CONSTRAINTS { Integral constraints } BOUNDARIES { The domain definition } REGION 1 { For each material region } START(,) { Walk the domain boundary } TIME { if time dependent } MONITORS { show progress } PLOTS { save result displays } HISTORIES { time dependent or staged } END |
ここで、各項目を一般的に説明しても、退屈なだけでしょうから、早速例題をやってみましょう。
f=sin(x)+x*cos(x)、f の一次微分、f の二次微分の3つを同時にプロットする問題です。
この問題を解く場合に必要なことは、関数、一次微分、二次微分を定義し、さらにプロットする範囲を指定することです。
関数の定義は DEFINITIONS のところで、f=sin(x)+x*cos(x), fx=dx(f), fxx=dxx(f) として行っています。FlexPDE は dx(f), dxx(f) をそれぞれ、関数 f の x に関する一次微分、二次微分として認識し、内部で数式処理を行います。
描画する範囲については、Lx=10, Ly=1 として、(-Lx,-Ly) を起点として ( START で指定)、ついで、(Lx,-Ly)->(Lx,Ly)->(-Lx,Ly) と反時計方向に描画するものとします (起点以後の指定は line 文で行っています)。
ついで、実際の描画を行う指定をします。これは PLOTS で行っています。
記述ファイルは以下のようになります。
{ Fill in the following sections, or delete those that are unused.} TITLE 'sin(x)*x*cos(x) ' { the problem identification } DEFINITIONS { parameter definitions } Lx=10 Ly=1 f=sin(x)+x*cos(x) fx=dx(f) fxx=dxx(f) BOUNDARIES { The domain definition } REGION 1 { For each material region } START(-Lx,-Ly) { Walk the domain boundary } line to (Lx,-Ly) to (Lx,Ly) to (-Lx,Ly) to finish PLOTS elevation(f,fx,fxx) from (-Lx,0) to (Lx,0) { save result displays } END |
上記のように入力し、不要部分を削除して、Run をクリックすれば、下図が表示されます。a, b, c 各曲線が、関数 f、 一次微分、二次微分に対応します。
f = x2 + 2y2 として、以下の2変数関数をプロットします。
DEFINITIONS で上記3つの関数を定義します。grad(f) において i,j は単位ベクトルであり、これを表現するには vector(dx(f), dy(f)) とします。また、次のラプラス方程式の2次微分の式は dxx(f)+dyy(f) と表現します。BOUNDARIES で例題1同様、図形の境界とプロット順を指定し、PLOTS でプロットすべき図を指定します。メッシュ分割状況 (grid)、f の曲面表示 (surface)、f の等高線図 (contour)、等高線図の線間を彩色した図 (contour(f) painted)、grad(f) のベクトル表示、ラプラス方程式の等高線図 (contour) の6種類をプロットします。
その結果記述ファイルは以下のようになります。
{ Fill in the following sections, or delete those that are unused.} TITLE ' x^2+2*y^2' { the problem identification } {exa022.pde} SELECT { method controls } spectral_colors {Values from red to violet} DEFINITIONS { parameter definitions } Lx=1 Ly=1 f=x^2+2*y^2 grad_f=vector(dx(f),dy(f)) laplace_f=dxx(f)+dyy(f) BOUNDARIES { The domain definition } region 'domain' start(-Lx,-Ly) line to (Lx,-Ly) to (Lx,Ly) to (-Lx,Ly) to finish PLOTS { save result displays } grid(x,y) {Triangular mesh} surface(f) {Surface in 3D} contour(f) {Contour plot of function} contour(f) painted {Color coded in plane} vector(grad_f) as 'Gradient' {Arrow plot with a title} contour(laplace_f) {Test if f(x) is harmonic} END |
ここで、Run をクリックすると、6つのグラフの縮小したものが、一度に表示されます。どれか特定のグラフ上でダブルクリックすると、そのグラフだけが、大きく表示され、ここで再度ダブルクリックすると、もとの縮小グラフに戻ります。
次に各グラフを見ていきましょう。
![]() |
|
|
![]() |
|
|
![]() |
|
|
![]() |
![]() |
|
|
![]() |
|
|
底辺に矩形の突起がある流管の 2D での速度ベクトルをナヴィア・ストークス方程式で計算します。
2D の定常非圧縮流れは、下記のナヴィア・ストークス方程式で表されます。
上式で、ρ は流体の密度、μ は粘性率、U, V は流体速度のそれぞれ、X, Y 成分、Fx, Fy は体積力のそれぞれ、X, Y 成分、P は圧力で、この式が更に必要となります。U の式 (一番上の式) を Y で微分し、連続方程式と連立させ、項を消去すると、下式が得られます。
div(U, V)=0 であるので、圧力の式に自由に項を足してもよく、流体に抗する正の圧力項を加えます (負の圧力項は、物体の破壊を意味します)。その結果、
ここで L は、保存則を満足する十分「大きな」数に選ぶものとします。
記述ファイルの EQUATIONS の最初の2つの式は、(1) の両辺を μ で除し、かつ、 を考慮すれば得られます。つまり、
EQUATIONS には、(1)’ と (2) を指定しています。
初期条件は、INITIAL VALUES で、流体速度の x, y 成分 (U, V) および圧力を以下のように設定しています。
また、DEFINITIONS で、ρ=1, μ=1 としています。
次に、BOUNDARIES では、領域の形状および各部における境界条件を value (ディリクレ条件) および load (ノイマン条件あるいは自然境界条件) で指定しています。たとえば、value(v)=0 はその個所において解 v をゼロと指定するものですし、load(p)=p0 は、その個所において、解 p を p0 と指定するものです。形状は、grid(x,y) による図を参照してください。
PLOTS では、メッシュ形状 (grid(x,y) )、U, V、速度 () の等速線図、圧力 (P) の等圧線図、U, V の流れのベクトル表示 (vector(u,v) )、連続方程式に対する誤差
、流管の入り口、中央、出口における X 方向の速度などをプロットします。
上記記述ファイルは以下のようになります。
TITLE 'Viscous flow in 2D channel, Re < 0.1' VARIABLES u(0.1) v(0.01) p(1) DEFINITIONS Lx = 5 Ly = 1.5 Gx = 0 Gy = 0 p0 = 1 speed2 = u^2+v^2 speed = sqrt(speed2) dens = 1 visc = 1 vxx = (p0/(2*visc*Lx))*(Ly-y)^2 { open-channel x-velocity } rball=0.25 conswt = 1000 INITIAL VALUES u = 0.5*vxx v = 0 p = p0*x/Lx EQUATIONS div(grad(u)) - dx(p)/visc = dens*(u*dx(u) + v*dy(u))/visc div(grad(v)) - dy(p)/visc = dens*(u*dx(v) + v*dy(v))/visc div(grad(p)) = 2*dens*[dx(U)*dy(V) - dy(U)*dx(V)] + conswt*(dx(u)+dy(v)) BOUNDARIES REGION 1 START(0,0) load(u) = 0 value(v) = 0 load(p) = 0 line to (Lx/2-rball,0) value(u)=0 value(v)=0 load(p)= 0 line to (Lx/2-rball,rball) load(p)=0 line to (Lx/2+rball,rball) load(p)=0 line to (Lx/2+rball,0) load(u) = 0 value(v) = 0 load(p) = 0 line to (Lx,0) load(u) = 0 value(p) = p0 line to (Lx,Ly) value(u) = 0 load(p) =0 line to (0,Ly) load(u) = 0 value(p) = 0 line to finish MONITORS contour(speed) PLOTS grid(x,y) contour(u) contour(v) contour(speed) painted vector(u,v) as "flow" contour(p) as "Pressure" painted contour(dx(u)+dy(v)) as "Continuity Error" contour(p) zoom(Lx/2,0,1,1) as "Pressure" elevation(u) from (0,0) to (0,Ly) elevation(u) from (Lx/2,0) to (Lx/2,Ly) elevation(u) from (Lx,0) to (Lx,Ly) END |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|
|
![]() |
重み付き残差法、適応型メッシュ、二次または三次多項式での内挿、部分積分方式、初期値問題には、BDM (Backward Difference Method by C.W.Gear) を採用しています。ユーザが解の精度を指定することもできます (SELECT ERRLIM)。
より詳細は、
の日本語訳をご参照ください。