コンテンツにスキップ
開発版ドキュメント — このサイトはmainブランチ向けで、インストール済みリリースと異なる場合があります。変更履歴を確認してください。

Direct solver

Direct solverは、各評価点で全source要素の寄与を加算します。triangle_p0のsource離散化を近似せずに 評価するため、小規模計算に使えるだけでなく、TreecodeやFMMの近似誤差を測る基準にもなります。

特性内容
計算量source数NN、評価点数MMに対してO(MN)O(MN)
要素kerneltriangle P0(固定)
通常の場境界free
幾何plan不要。評価時に現在のq_elemを読む
[fields]
boundary = "free"
[fields.solver]
method = "direct"

BEACHは要素面積AiA_i上に一定面密度σi=qi/Ai\sigma_i=q_i/A_iを置きます。triangle_p0は暗黙の 唯一の要素kernelであり、設定で選択しません。

ϕi(r)=kc∫Tiσi∥r−r′∥ dS′,Ei(r)=kc∫Tiσir−r′∥r−r′∥3 dS′.\phi_i(\mathbf{r})= k_c\int_{T_i}\frac{\sigma_i}{\lVert\mathbf{r}-\mathbf{r}'\rVert}\,dS', \qquad \mathbf{E}_i(\mathbf{r})= k_c\int_{T_i}\sigma_i \frac{\mathbf{r}-\mathbf{r}'}{\lVert\mathbf{r}-\mathbf{r}'\rVert^3}\,dS'.

BEACHは三角形の辺に沿う対数項と立体角を使う解析kernelでこの積分を評価します。 遠方と近傍の寄与を同じpanel kernelで評価します。

面上の電位は連続で、自己電位にはprincipal valueを使います。電場の法線成分には面電荷によるjumpがあり、 真空側の極限は

E±=EPV±σi2ϵ0ni\mathbf{E}^{\pm}=\mathbf{E}^{\mathrm{PV}} \pm\frac{\sigma_i}{2\epsilon_0}\mathbf{n}_i

となります。この符号を決めるため、各要素にnormal_plusまたはnormal_minusのvacuum sideが必要です。 各要素の mesh.parts[i].surface_side で指定します。 outward_closedは、向きが整合した閉じたtwo-manifoldにだけ使用できます。 2 つの頂点は、全座標の差が 128 eps × max(1, mesh 全体の最大座標絶対値) 以内なら同じ頂点とみなします。 辺の相手は、この許容差の 4 倍の格子で始点を hash して探すため、part の要素数に比例する時間で解決します。

現行要件は次のとおりです。

  • 有限で面積が正の三角形
  • 全要素でvacuum sideが解決済み
  • solverはdirect、treecode、fmm、またはdirect/fmmを選ぶauto

設定例はexamples/panel_direct.tomlにあります。

要素中心電位では自己項を加える

Section titled “要素中心電位では自己項を加える”

potential_history.csvなどの要素中心電位は、自要素を含む解析panel積分を使います。面上で有限な triangle P0自己電位をそのまま含み、別の経験的自己係数は加えません。

要素中心を全要素について評価するため、Directの電位履歴はO(N2)O(N^2)です。履歴を細かく保存すると、 粒子位置の場評価とは別に大きなコストになることがあります。

内部座標はfields.solver.normalizationで正規化され、電場と電位はSIへ戻されます。1

Directは固定geometryのtreeや展開係数を持たず、各評価で現在のmesh%q_elemを直接読みます。batch中は 参照する要素電荷を固定し、batch末尾にcommitした電荷を次batchの場へ反映する更新順序は他のsolverと同じです。

Directを基準に誤差を切り分ける

Section titled “Directを基準に誤差を切り分ける”

Directにはsolverによる近似誤差がありませんが、次の誤差は残ります。

  • surface meshの解像度と形状誤差
  • 粒子の時間刻みと衝突判定誤差
  • periodic/outer modelを含む場合のmodel化誤差

Directとの差が小さければ、FMMやTreecodeの近似誤差が小さいことは確認できます。ただし、それだけでは 物理解全体の収束を保証できません。source meshと粒子時間刻みも独立に細分化してください。