5 サンプルプログラム potential2d-2026.edp 解説

potential2d-2026.edp

   1 // potential2d-2026-naive.edp --- 2次元非圧縮ポテンシャル流
   2 //   https://nalab.mind.meiji.ac.jp/~mk/complex2/potential2d-2026-naive.edp
   3 //     速度ポテンシャル,速度を求め、等ポテンシャル線, 速度場を描く
   4 
   5 
   6 border Gamma(t=0,2*pi) { x = cos(t); y = sin(t); } // 円盤領域
   7 int m=40;
   8 mesh Th=buildmesh(Gamma(m));
   9 plot(Th, wait=1, ps="Th.eps");
  10 // 次の2行は区分1次多項式を使うという意味
  11 fespace Vh(Th,P1);
  12 Vh phi, v;
  13 // 境界条件の設定
  14 //func Vn=x+2*y; // これは一様流 v=(1,2) の場合、v・n=(1,2)・(x,y)=x+2y
  15 func Vn=((x>0&&y>0)||(x<0&&y<0))*(x+2*y);//右上と左下のみ出入りがある
  16 // 整合条件 ∫ V_n ds=0 のチェック
  17 cout << "check the compatibility condition: " << int1d(Th,Gamma)(Vn) << endl;
  18 
  19 // 有限要素法で速度ポテンシャルφを求める
  20 solve Laplace(phi,v,solver=CG) =
  21   int2d(Th)(dx(phi)*dx(v)+dy(phi)*dy(v)) -int1d(Th,Gamma)(Vn*v);
  22 
  23 // 平均を0にする (解の一意性がないので、時々生じるずれを消す)
  24 real meanphi = int2d(Th)(phi)/Th.area; // Th.areaはint2d(Th)(1);でも計算可能
  25 cout << "mean phi=" << meanphi << endl;
  26 phi=phi-meanphi;
  27 
  28 // 速度ポテンシャルφの等高線 (等ポテンシャル線) を描く
  29 plot(phi,ps="contourpotential.eps",wait=1);
  30 
  31 // ベクトル場 (v1,v2)=∇φ を描く (ちょっと雑なやり方)
  32 Vh v1, v2;
  33 v1=dx(phi); v2=dy(phi);
  34 plot([v1,v2],ps="vectorfield.eps",wait=1);
  35 
  36 // 等ポテンシャル線とベクトル場を同時に描く
  37 plot([v1,v2],phi,ps="both.eps", wait=1);

図 1: potential-2d-2026.edp の結果 (左下と右上で出入りがある)
\includegraphics[width=10cm]{report2-prog/potential2d-2026.eps}


\begin{jremark}[解の一意性と連立1次方程式の解法について]
領...
...い(真似すれば良い)ので、
詳細は省略する。 \qed
\end{jremark}



桂田 祐史