有限要素プログラミング

この記事は、拡散反応方程式系の有限要素法の独自の実装(ソルバージョーカーFEM )に特化しています。


通常、既製のソリューションを使用することをお勧めしますが、問題に特定の機能がある場合は、単純なライブラリに基づいて、タスクを解決するのが簡単です。


はじめに


有限要素法[1-4]は、数理物理学、連続体力学の問題を解決するための効果的な方法のグループです。 FEMプログラミングの質問は、ソース[5–9]に当てられています。


問題の声明


システムのロビン境界値問題 N限られた領域での拡散反応方程式 \オ\サ mathbbR2ボーダー付き \ガ


ai Deltauix+ sumk=1Nqikxukx=gixx in Omega


ai frac partialuix partial mathbfn+bixuix=bixwixx in\ガ


ここに i=12 ldotsN mathbfn外部法線のベクトルは \ガ


弱い表現


それぞれを掛ける N任意のテスト関数の方程式 v、取得したアイデンティティを統合します \オ、グリーンの式を適用し、境界条件を考慮します。 ゲット


ai int limits Omega nablaui nablav\、dx+ int limits Gammabiuiv\、d Gamma+ sumk=1N int limits Omegaqikukv\、dx= int limits Omegagiv\、dx+ int limits Gammabiwiv\、d Gammai=1 ldotsN.


機能的なソボレフ空間を紹介します V=H1\オ。 機能 u1 ldotsuN inVこれらの恒等式が任意のテスト関数に当てはまる場合、元の境界値問題の弱解と呼ばれます v inV


弱い表現は次のように書くことができます:関数を見つける u1 ldotsuN inVそのような


Aiuiv+ sumk=1NBikukv=Fiv forallv inVi=1 ldotsN


どこで AiBik-バイリニア形式、 Fi-線形形式:


Aiuv=ai int limits Omega nablau nablav\、dx+ int limits Gammabiuv\、d Gamma quadBikuv= sumk=1N int limits Omegaqikuv\、dx


Fiv= int limits Omegagiv\、dx+ int limits Gammabiwiv\、d Gamma


FEMアルゴリズム


宇宙で紹介します V有限次元部分空間 Vm。 ガラーキン法によると、離散問題に到達します:関数を見つける u1 ldotsuN inVmそのような


Aiuiv+ sumk=1NBikukv=Fiv forallv Vmi=1 ldotsN


させる  phi1 ldots phim-基礎 Vm。 入れたら uix= displaystyle sums=1mcis phisxvx= phijx、それから問題はSLAE Nm不明 cks


 sums=1mAi phis phijcis+ sumk=1N sums=1mBik phis phijcks=Fi phiji=1 ldotsNj=1 ldotsm


または


\ sum_ {s = 1 c_ {is} + \ sum_ {k = 1} ^ N \ sum_ {s = 1} ^ m \ left(\ int_ \ Omega q_ {ik} \ phi_s \ phi_j \、dx \ right)c_ {ks} =


= int limits Omegagi phij\、dx+ int limits Gammabiwi phij\、d Gammai=1 ldotsNj=1 ldotsm


部分空間の最も単純な例 Vm-連続的な区分的線形関数の空間。 面積 \オ有限要素(通常は三角形)に分割され、各三角形の関数 Vm線形。 FEMでは、基底関数は、ほとんどの領域でゼロになるように選択され、SLAE行列には多くのゼロがあります。 基本機能として  phij1つのグリッドノードで1、残りのノードで0に等しい「ピラミッド」を取得します。 各グリッドノードには独自の基底関数があり、ディメンション m部分空間はグリッドノードの数に等しくなります。


ことに注意してください sそして jノードがエッジで接続されていない場合、  varphis varphij equiv0 nabla varphis cdot nabla varphij equiv0、したがって、合計すると sインデックスのみを反復処理するのに十分 sその間 sそして j番目のノードはエッジを s=j


したがって、有限要素法による境界値問題の解は、対応するSLAEの構築と解に還元されます。


区分線形関数


機能を設定するには u inVm、グリッドのノードでその値を指定する必要があります。 座標を示します i番目のノード XiYi、および関数の値 ui番目のノード-スルー Ui=uXiYi


関数の値を見つけるには u任意の点で xyとの三角形に属する i番目 jそして k頂点、重心座標を導入します L1L2L30から1の値を取り、デカルト座標に関連付けられています xy次の関係([3、セクション4.7.1]、[4、p。35]を参照):


 begingatheredx=L1Xi+L2Xj+L3Xky=L1Yi+L2Yj+L3Yk1=L1+L2+L3 endgathered


ここから


 begingatheredL1xy= frac12Aai+bix+ciyai=XjYkXkYjbi=YjYkci=XkXjL2xy= frac12Aaj+bjx+cjyaj=XkYiXiYkbj=YkYicj=XiXkL3xy= frac12Aak+bkx+ckyak=XiYjXjYibk=YiYjck=XjXi endgathered


どこで A= dfrac12 beginvmatrix1XiYi1XjYj1XkYk endvmatrix-記号の付いた三角形の領域。


関数の値は、式によって見つけることができます uxy=UiL1xy+UjL2xy+UkL3xy


数値積分


境界エッジ上の積分を iそして jセグメント上の積分に終わる [11]


 int limitsijfxy\、dl= frac|i\、j|2 int limits11fxtyt\、dt


ここに |i\、j|-リブの長さ xt= dfracXi+Xj2+ dfracXjXi2t
yt= dfracYi+Yj2+ dfracYjYi2t


最後の積分を計算するには、ガウス求積式を適用します。


 int limits11 varphis\、ds\お sumj=1nwj varphi xij


ポイント  xij in[11]および重み係数 wjテーブルから取られた[3、秒。 5.9.2]。


三角形の積分を i番目 jそして k三角形上の積分への頂点 D = \ {(L_1、L_2)\ in [0,1] \ times [0,1] \ colon L_1 + L_2 \ leq 1 \}


 int limitsi\、j\、kfxy\、dxdy=2|i\、j\、k| int limitsDfxL1L2yL1L2\、dL1dL2


ここに |i\、j\、k|=|A|三角形の面積です xL1L2=L1Xi+L2Xj+1L1L2Xk
yL1L2=L1Yi+L2Yj+1L1L2Yk


最後の積分を計算するために、求積式[3、Sec。 5.11]。


ソフトウェア実装


一般的な考慮事項


このサブジェクト領域では、テストが難しい[10]ため、コードを非常に明確に記述することが重要です。 OOPを使用すると、コードを読みやすくすることができますOOPを使用するには、一連の概念を選択し、これらの用語でアルゴリズムを策定する必要があります。 これにより、まずアルゴリズムに注意を払い、次に実装の詳細にのみ注意を払うことができます。


三角測量


グリッドを構築するには、 FreeFem ++パッケージが使用され、三角測量は.mesh形式で保存されます。


ライブラリには、ファイルから読み取られるグリッドに関する情報を含むMeshクラスが導入されています。


SLAUの構築


アルゴリズムを記述するために、基底関数と被積分関数(関数の積)のクラスが導入され、これらは基底クラスIntegrandおよびBoundaryIntegrandから継承されます。 これらのクラスには、それぞれフィールドsupport (media)およびboundary_support (境界メディア)があります。 キャリアは、関数が0に等しくない三角形のリストです。境界キャリアは、関数が0に等しくない境界エッジのリストですValueメソッドは、被積分関数のクラスに対しても定義され、特定のポイントで関数の値を計算します。


IntegrateおよびBoundaryIntegrate関数は、被積分関数を入力として受け取り、ホストリストを反復処理し、 Integrand基本クラス( BoundaryIntegrand )で定義された特定の三角形(または境界エッジ)で積分関数を呼び出し、仮想関数Valueを呼び出します。


したがって、SLAU構築コードの形式は次のとおりです。


 for (int i = 0; i < data.N; ++i) { for (int j = 0; j < data.mesh.nodes_num; ++j) { for (auto s : data.mesh.adjacent_nodes[j]) { sys.AddCoeff(i, j, i, s, data.a[i] * Integrate(grad(phi[s]) * grad(phi[j])) + BoundaryIntegrate(data.b[i] * phi[s] * phi[j]) ); } for (int k = 0; k < data.N; ++k) { for (auto s : data.mesh.adjacent_nodes[j]) { sys.AddCoeff(i, j, k, s, Integrate(data.q[i][k] * phi[s] * phi[j]) ); } } sys.AddRhs(i, j, Integrate(data.g[i] * phi[j]) + BoundaryIntegrate(data.b[i] * data.w[i] * phi[j]) ); } } 

SLAUソリューション


SLAEを解決するには、 MTL4ライブラリに実装されている反復法が使用されます。


結果へのアクセス


特定のポイントで解の値を見つけるには、このポイントを含む三角形を短時間で見つける必要があります。 これにはハッシュテーブルを使用できます。


領域を囲む長方形を破る \オnmブロックどこ n=[W/a]m=[H/b]WH-囲む長方形の長さと幅、 ab-三角形分割三角形を囲む長方形の平均寸法。


それぞれの nmブロックは、交差する三角形のリストを塗りつぶします。 これを行うには、すべての三角形をループして、それらを囲む長方形を見つけます。
交差するブロックを簡単に見つけることができます。


特定のポイントに対してクエリを実行すると、それが属するブロックを見つけ、このブロックに対応する三角形のリストを調べて、特定のポイントがどのブロックに属しているかを確認します。


テスト中


プログラムのテストは、既知の正確なソリューションを使用してタスクで実行されました。 ダブルメッシュリファインメントでは、誤差は約4倍または2倍減少します。これは、メソッドの精度が2次または1次であることを示しています。 1番目への収束の順序の減少は、関数の異なる値が与えられる境界部分の接合部での境界条件の不一致による可能性があります wi


おわりに


開発されたライブラリの大きなソルバーに対する利点は、そのシンプルさと、タスクの特定の機能(境界条件での区分的に一定の係数)を考慮できることです。 将来、3次元問題用の同様のライブラリを実装する予定です。このライブラリは、複雑な熱伝達のモデルで境界係数の最適制御の問題を解決するために使用されます。


ソース


  1. アレクシーエフG.V. 数理物理学の数値的方法。 有限要素法の紹介。 ウラジオストク:ダルナウカ、1999年。
  2. ダウトフR.Z.、カルチェフスキーM.M. 有限要素法の理論の紹介。 カザン:KSU、2004年。
  3. Zienkiewicz OC、Taylor RL、Zhu JZ有限要素法:その基礎と基礎。 エルゼビア、2005年。
  4. Segerlind L.有限要素法の適用。 M。:ミール、1979年。
  5. ポアソン方程式の例の有限要素法 // Habrahabr、07.27.2015。
  6. 180行未満のコードでFEM電卓を作成する //
    Habrahabr、2015年12月1日。
  7. Freefem ++の使用方法 // Habrahabr、2013年6月6日。
  8. Gockenbach MS有限要素法の理解と実装。 SIAM、2006年。
  9. Smith IM、Griffiths DV、Margetts L.有限要素法のプログラミング。 ワイリー、2014年。
  10. 科学的なアプリケーションでユニットテストが機能しない理由 // Habrahabr、2010年4月26日。
  11. グレンキンG.V. 複雑な熱伝達モデルの境界最適制御問題を解決するためのアルゴリズム // Dalnevost。 仲間。 ジャーナル 2016.V. 16. No. 1. P. 24-38。


Source: https://habr.com/ru/post/J344564/


All Articles