曲面上的高階數值積分

曲面上的高階數值積分

簡介

基本思想就是將3D區域或者2D曲面上的重積分寫成累次積分的方式,再用高斯積分方法進行計算。

它需要找單變量非線性函數的根以及估計被積函數、指定點水平集函數及其積分。

Ω\Omega是三維區域,Ωh\Omega_h是它的一個四面體剖分,Γ\Gamma是水平集函數L(x)L(x)決定的一個曲面。TT是選定的一個四面體。

我們想要做的其實就是計算:

I=TΩu(x)dx;I0=TΓu(x)dΓ I^{-}=\int_{T \cap \Omega^{-}} u(\mathbf{x}) \mathrm{d} \mathbf{x} ; \quad I^{0}=\int_{T \cap \Gamma} u(\mathbf{x}) \mathrm{d} \Gamma

這裏的Ω\Omega^-表示水平集函數值爲負的一部分。

選定三個原點和正交的方向,建立座標系,使得四面體包含在其中,即

T{x0+rnu+snv+tnwr(0,a),s(0,b),t(0,c)} T \subset\left\{\mathbf{x}_{0}+r \mathbf{n} \mathbf{u}+s \mathbf{n} \mathbf{v}+\operatorname{tnw} | r \in(0, a), s \in(0, b), t \in(0, c)\right\}

如圖:

在這裏插入圖片描述

我們可以將重積分變成沿着三個方向各個方向的一維積分,再使用一維的高斯積分公式。關鍵的問題在於處理一維積分中被積函數的不連續性。

算法

以計算II^-爲例,來介紹一下。

一個單變量函數在一點不連續,我們一般稱這個點爲“間斷”,記爲x0x_0。如果在間斷的左右兩邊能夠找到足夠小的兩個區域,使得函數在(x0ϵ,x0](x_0-\epsilon,x_0][x0,x0+ϵ)[x_0,x_0+\epsilon)上都是連續的,那麼這個間斷叫做非本質的間斷,否則叫做本質的間斷。

曲面在四面體的某個面上的跡就定義爲曲面和這個面的交線。

事實上,要算的積分就是:

I=0c0b0au(r,s,t)χ(r,s,t)drdsdt=0c0b0af(r,s,t)drdsdt=0c0bg(s,t)dsdt=0ch(t)dt \begin{aligned} I^{-} &=\int_{0}^{c} \int_{0}^{b} \int_{0}^{a} u(r, s, t) \chi^{-}(r, s, t) \mathrm{d} r \mathrm{d} s \mathrm{d} t \\ &=\int_{0}^{c} \int_{0}^{b} \int_{0}^{a} f(r, s, t) \mathrm{d} r \mathrm{d} s \mathrm{d} t \\ &=\int_{0}^{c} \int_{0}^{b} g(s, t) \mathrm{d} s \mathrm{d} t \\ &=\int_{0}^{c} h(t) \mathrm{d} t \end{aligned}

這裏的χ(x)\chi^{-}(\mathbf{x})是我們要求積分的區域上的特徵函數。其中,

f(r,s,t):=u(r,s,t)χ(r,s,t),g(s,t):=0af(r,s,t)dr,h(t):=0bg(s,t)ds f(r, s, t) :=u(r, s, t) \chi^{-}(r, s, t), \quad g(s, t) :=\int_{0}^{a} f(r, s, t) \mathrm{d} r, \quad h(t) :=\int_{0}^{b} g(s, t) \mathrm{d} s

一維積分的計算可以將積分區域分爲分片連續的子區域,然後在每個子區域上使用高斯積分公式。

算法的關鍵步驟在於:

  • 選好座標軸方向,以避免被積函數的本質間斷。
  • 如果本質間斷不可避免,我們就要細分四面體
  • 確認被積函數的非本質間斷

非本質間斷典型發生在座標系的第一個積分軸或者前兩個積分軸構成的平面穿過四面體的面面交線或者四面體某個面和曲面的交線。如圖所示,說明了非本質間斷的發生。

在這裏插入圖片描述

t=t0t=t_0處,就是非本質的間斷,而在t=0t=0處就是本質的間斷。

本質的間斷已確認只有在g(s,t)g(s,t)h(t)h(t)中會發生,而且現在遇到的只有兩種情況。

第一種情況就是積分的方向和積分區域相切了,那麼積出來的被積函數在切點的地方就是本質的間斷,如上圖的t=0t=0的位置。這個情況比較容易避免,只要選擇座標系的軸垂直於曲面。

第二種本質間斷只存在於h(t)h(t)中,它是對於最後一層積分而言,發生於曲面在TT的某個面上的“跡”和掃過的前兩個積分變量構成的平面的交點處,如圖所示。

在這裏插入圖片描述

如圖,積分掃到pp點的時候,就是一個本質間斷,這個時候,曲面的跡(紅線),和用來掃的那個面(褐綠色)叫四面體的面形成的曲線,是相切的,切點爲pp

積分方向

第一個座標軸方向

爲了避免g(s,t)g(s,t)的本質間斷,我們一般選第一個積分方向nu\mathbf{nu}垂直於曲面。

nu\mathbf{nu}可以選爲L(c)\nabla L(c)cc是元的質心,這樣其實nu\mathbf{nu}就已經很好地逼近了曲面的法向。

當然,nu\mathbf{nu}也可以選爲四面體四個面的法向,但是這總會出一些問題,畢竟另外兩個方向組成的平面平行於四面體的某個面了。

第二個、第三個座標軸方向

nu\mathbf{nu}選出來了,那麼nv,nw\mathbf{nv},\mathbf{nw}可以被參數化爲:

ww=we1+1w2e2nw=ww/wwnv=nu×nw \begin{aligned} \mathbf{w}_{w} &=w \mathbf{e}_{1}+\sqrt{1-w^{2}} \mathbf{e}_{2} \\ \mathbf{n w} &=\mathbf{w}_{w} /\left|\mathbf{w}_{w}\right| \\ \mathbf{n v} &=\mathbf{n u} \times \mathbf{n w} \end{aligned}

這裏的e1,e2e_1,e_2是線性獨立的垂直於nu\mathbf{nu}的向量,w[1,1]w \in [-1,1]

h(t)h(t)的積分平面寫作P=(nu,nv)P = (\mathbf{nu,nv})。假定nF\mathbf{n_F}是四面某個面(記爲F)上的法向量,那麼PP在其上的跡平行於ww,nF\mathbf{w_w,n_F}。假定γF\gamma _F是曲線Γ\GammaFF上的跡,tF(p)t_F(p)γF\gamma_F在點pp出的切向量。

爲了避免第二種本質不連續性,ww的選擇要使得wwxnFw_wxn_FγF\gamma_F不相切於γF\gamma_F的的任何點。

如果選一個ww值使得對任何的四面體的面,這種相切的情況都不發生,那麼這個ww值就說是容許的,否則稱爲是不容許的。不容許值之間的區間就叫做不容許區間。

我們要做的其實就是,儘量避開不容許的ww值。

爲了說明這個問題,我們定義一個新的函數:

ϕ(t):=(g(t)×(ww×nF)) \phi(t) :=\left(\mathbf{g}^{\prime}(t) \times\left(\mathbf{w}_{w} \times \mathbf{n}_{F}\right)\right)

這裏的g(t)g(t)表示PPFF上的跡的一個表達,其中t[0,1]t \in [0,1],那麼g(t)g'(t)表示其切向。那麼ϕ(t)\phi(t)本質上就是γF\gamma _F的在各點處的切向量和PPFF的跡線的夾角的大小。

爲敘述方便,記PPFF上的跡爲PFP_F

如上述,我們知道,若果ww是容許的,意味着PFP_F不切γF\gamma _F於任何的PFP _F上的點,也就是ϕ(t)\phi(t)[0,1][0,1]上無根。由介值定理,我們知道ww不容許的一個充分條件就是,ϕ(0)ϕ(1)0\phi(0) \phi(1) \leq 0,等價於:

((t0×(ww×nF))nF)((t1×(ww×nF))nF)0 \left(\left(\mathbf{t}_{0} \times\left(\mathbf{w}_{w} \times \mathbf{n}_{F}\right)\right) \cdot \mathbf{n}_{F}\right)\left(\left(\mathbf{t}_{1} \times\left(\mathbf{w}_{w} \times \mathbf{n}_{F}\right)\right) \cdot \mathbf{n}_{F}\right) \leq 0

www_w的表達式帶進去,得到:

(a0w+b01w2)(a1w+b11w2)0 \left(a_{0} w+b_{0} \sqrt{1-w^{2}}\right)\left(a_{1} w+b_{1} \sqrt{1-w^{2}}\right) \leq 0

這裏的ai=(ti×(e1×nF))nFa_{i}=\left(\mathbf{t}_{i} \times\left(\mathbf{e}_{1} \times \mathbf{n}_{F}\right)\right) \cdot \mathbf{n}_{F}bi=(ti×(e2×nF))nF,i=0,1b_{i}=\left(\mathbf{t}_{i} \times\left(\mathbf{e}_{2} \times \mathbf{n}_{F}\right)\right) \cdot \mathbf{n}_{F}, i=0,1。令δ:=1w2/w\delta :=\sqrt{1-w^{2}}/{w},那麼上式可以寫爲:

(a0+b0δ)(a1+b1δ)0 \left(a_{0}+b_{0} \delta\right)\left(a_{1}+b_{1} \delta\right) \leq 0

從這裏可以解出ww的不被容許空間,它的補是容許的,我們成爲候選區間。我們想要的ww應該從候選區間中去選。

找到了候選區間,爲了在候選區間中找到一個最好的ww值,另外,我們定義:

α(w)=maxFF(T){maxpγF(wwww×nF)tF(p)} \alpha(w)=\max _{F \in \mathcal{F}(T)}\left\{\max _{\mathbf{p} \in \gamma_{F}}\left|\left(\frac{\mathbf{w} w}{\left|\mathbf{w}_{w}\right|} \times \mathbf{n}_{F}\right) \cdot \mathbf{t}_{F}(\mathbf{p})\right|\right\}

其實就體現了γF\gamma _F在各點切線和PFP_F夾角餘弦的絕對值的最大值。如果等於1就說明發生了相切的情況,是不容許的。另外,因爲α(1)=α(1)\alpha(1)=\alpha(-1),那麼這個函數其實可以擴展爲整個實軸上的週期函數。

爲了評估a(w)a(w),我們必須求水平集函數一階導的極值,或者說水平集函數二階導的零點。爲簡單起見,我們假定γF\gamma _F是凸的,那麼α(w)\alpha(w)可以簡化爲:

α(w)=maxFF(T){maxpI(F)(wwww×nF)tF(p)} \alpha(w)=\max _{F \in \mathcal{F}(T)}\left\{\max _{p \in \mathcal{I}(F)}\left|\left(\frac{\mathbf{w}_{w}}{\left|\mathbf{w}_{w}\right|} \times \mathbf{n}_{F}\right) \cdot \mathbf{t}_{F}(\mathbf{p})\right|\right\}

這裏的I(F)\mathcal{I}(F)表示的是曲面Γ\Gamma和多邊形邊的交點。如果交點多於一個或者沒有交點,我們一般把它丟到不容許空間中去。

一般來講,如果PFP_FγF\gamma _F越是垂直,那麼誤差越小,如下圖所示:

在這裏插入圖片描述

這裏,實線是α\alpha的值,而虛線是誤差。從中,我們可以看出二者的正相關關係。

我們在搜索使PFP_FγF\gamma _F最垂直的ww時,因爲每個容許區間中的α\alpha都是當峯函數,所以我們一般採用0.618方法。

實際操作當中,我們一般是設定一個閾值,如果這個α\alpha的選定總是大於這個閾值,我們往往對該多面體進行二分。我們不能保證這種剖分是有限步終止的,所以我們往往在剖分尺度很小的情況下,使用積分規則和平面逼近。實際上,這種無限剖分的情況是很少發生的。

被積函數中的不連續性

第一層積分(關於f(r,s,t)f(r,s,t))的間斷

爲了使用高斯積分規則,我們需要把積分的不連續點給找出來,將積分拆成間斷的。當然,這裏的間斷指的是非本質的間斷,本質的間斷已經在前面所述的方法中處理掉了。

關於ff的積分的間斷只會發生在四面體的四個面和曲面Γ\Gamma上,而在TΩT \cap \Omega^{-}中,事實上只有一個間斷,最後第一層的積分,可以寫爲:

0af(r,s,t)dr=i=0nrirt+1f(r,s,t)dr\int_{0}^{a} f(r, s, t) \mathrm{d} r=\sum_{i=0}^{n} \int_{r_{i}}^{r_{t+1}} f(r, s, t) \mathrm{d} r

關於gg積分的間斷

若定義後兩個座標向量構成的積分平面:

P={x0+snv+tnws(0,b) and t(0,c)} \mathcal{P}=\left\{\mathrm{x}_{0}+s \mathrm{nv}+\operatorname{tnw} | s \in(0, b) \text { and } t \in(0, c)\right\}

那麼,關於g(s,t)g(s,t)的間斷,一般只發生在四面體的四條邊以及曲面在四個面上的跡到P\mathcal{P}的投影。

我們可以在每個間斷的區間上使用高斯積分規則:

0bg(s,t)ds=j=0msjsj+1g(s,t)ds \int_{0}^{b} g(s, t) \mathrm{d} s=\sum_{j=0}^{m} \int_{s_{j}}^{s_{j+1}} g(s, t) \mathrm{d} s

h(t)h(t)的間斷

定義線段:

L={x0+tnwt[0,c]} \mathcal{L}=\left\{\mathrm{x}_{0}+\operatorname{tnw} | t \in[0, c]\right\}

那麼,關於h(t)h(t)的間斷髮生在四面體的四個頂點以及四面體的邊和曲面的交點在L\mathcal{L}上的投影。

同樣地,在間斷點處拆開寫積分,爲:

0ch(t)dt=k=0ltktk+1h(t)dt \int_{0}^{c} h(t) \mathrm{d} t=\sum_{k=0}^{l} \int_{t_{k}}^{t_{k+1}} h(t) \mathrm{d} t

曲面積分

曲面上的積分相對於三維區域上的積分就更爲簡單一些,遵從第二類曲面積分的投影計算,計算方式爲:

I0=TΓu(x)dΓ=0c0bg~(s,t)dsdt=0ch~(t)dt I^{0}=\int_{T \cap \Gamma} u(\mathrm{x}) \mathrm{d} \Gamma=\int_{0}^{c} \int_{0}^{b} \tilde{g}(s, t) \mathrm{d} s \mathrm{d} t=\int_{0}^{c} \tilde{h}(t) \mathrm{d} t

g~(s,t):={u(r0,s,t)L(x(r0,s,t))nuL(x(r0,s,t)), if r0, s. t. x(r0,s,t)T and L(x(r0,s,t))=00, otherwise  \tilde{g}(s, t) :=\left\{\begin{array}{ll}{u\left(r_{0}, s, t\right)} & {\frac{\left|\nabla L\left(\mathrm{x}\left(r_{0}, s, t\right)\right)\right|}{\left|\mathrm{nu} \cdot \nabla L\left(\mathrm{x}\left(r_{0}, s, t\right)\right)\right|},} & {\text { if } \exists r_{0}, \text { s. t. } \mathrm{x}\left(r_{0}, s, t\right) \in T \text { and } L\left(\mathrm{x}\left(r_{0}, s, t\right)\right)=0} \\ {0,} & {\text { otherwise }}\end{array}\right.

h~(t):=0bg~(s,t)ds \tilde{h}(t) :=\int_{0}^{b} \tilde{g}(s, t) \mathrm{d} s

實施

在四面體和曲面交的區域和曲面上的任意精度的積分算法,被實現在了開源軟件PHG當中。PHG下載地址

主要程序寫在了文件quad-interface.c以及quad-interface.h當中,但是在phg的框架下,調用起來比較困難。

作者也寫了可以在非PHG環境中使用的外調函數phgQuadInterface2,它的調用方式是:

int phgQuadInterface2(DOF_USER_FUNC ls, int ls_order,
DOF_USER_FUNC ls_grad, FLOAT (*tet)[3],
DOF_USER_FUNC func, int dim, DOF_PROJ proj,
int quad_type, int quad_order,
FLOAT *res, FLOAT **prule_data);

可以閱讀test文件夾下的quad_test3.c,它是一個簡單的使用示例。

數值結果

p-收斂性測試

所謂的p-收斂性測試,就是說固定網格的剖分,我們來看誤差隨着高斯積分規則的階數的提高而呈現出指數型的減小。

考慮三個例子如下圖:

在這裏插入圖片描述

網格剖分成了1843塊:

在這裏插入圖片描述

三個圖中的曲面對應的水平集函數是:

L(x,y,z)=(x12)2+(y12)2+(z12)2116 L(x, y, z)=\left(x-\frac{1}{2}\right)^{2}+\left(y-\frac{1}{2}\right)^{2}+\left(z-\frac{1}{2}\right)^{2}-\frac{1}{16}

L(x,y,z)=2(x12)28(y12)316(z12)4150 L(x, y, z)=2\left(x-\frac{1}{2}\right)^{2}-8\left(y-\frac{1}{2}\right)^{3}-16\left(z-\frac{1}{2}\right)^{4}-\frac{1}{50}

cos(4γx2γ)sin(4γy2γ)+cos(4γy2γ)sin(2γzγ)+cos(2γzγ)sin(4γx2γ) \cos (4 \gamma x-2 \gamma) \sin (4 \gamma y-2 \gamma)+\cos (4 \gamma y-2 \gamma) \sin (2 \gamma z-\gamma)+\cos (2 \gamma z-\gamma) \sin (4 \gamma x-2 \gamma)

結果如下:

在這裏插入圖片描述

可以看得出來,出差呈指數型下降。

h-收斂性測試

因爲上述的後兩種情況沒有解析解,我們值針對第一種情況來做h-收斂性測試。

所謂的h收斂性,就是說固定高斯積分的階數,隨着剖分的加密,誤差的收斂階。

結果如下:

在這裏插入圖片描述

在這裏插入圖片描述

一個橢圓界面問題的小例子

考慮橢圓界面問題:

在這裏插入圖片描述

通過有限元方法,變分可得:

ah(u,v):=i=12ΩiauvdxeIh({aun}[v]+β[u]{avn})dΓ+J0(u,v)+J1(u,v)J0(u,v):=eIhγ0p2hee[u][v]dΓJ1(u,v):=eIhγ1hep2e[aun][avn]dΓ \begin{aligned} a_{h}(u, v) & :=\sum_{i=1}^{2} \int_{\Omega_{i}} a \nabla u \cdot \nabla v \mathrm{d} \mathbf{x}-\sum_{e \in \mathcal{I}_{h}} \int(\{a \nabla u \cdot \mathbf{n}\}[v]+\beta[u]\{a \nabla v \cdot \mathbf{n}\}) \mathrm{d} \Gamma+J_{0}(u, v)+J_{1}(u, v) \\ J_{0}(u, v) & :=\sum_{e \in \mathcal{I}_{h}} \frac{\gamma_{0} p^{2}}{h_{e}} \int_{e}[u][v] \mathrm{d} \Gamma \\ J_{1}(u, v) & :=\sum_{e \in \mathcal{I}_{h}} \frac{\gamma_{1} h_{e}}{p^{2}} \int_{e}[a \nabla u \cdot \mathbf{n}][a \nabla v \cdot \mathbf{n}] \mathrm{d} \Gamma \end{aligned}

Fh(v):=Ωfvdx+ΓgN{v}dΓβΓgD{avn}dΓ+JD(v)+JN(v)JD(v):=eIhγ0p2heegD[v]dΓJN(v):=eIhγ1hep2egN[avn]dΓ \begin{aligned} F_{h}(v) & :=\int_{\Omega} f v \mathrm{d} \mathbf{x}+\int_{\Gamma} g_{N}\{v\} \mathrm{d} \Gamma-\beta \int_{\Gamma} g_{D}\{a \nabla v \cdot \mathbf{n}\} \mathrm{d} \Gamma+J_{D}(v)+J_{N}(v) \\ J_{D}(v) & :=\sum_{e \in \mathcal{I}_{h}} \frac{\gamma_{0} p^{2}}{h_{e}} \int_{e} g_{D}[v] \mathrm{d} \Gamma \\ J_{N}(v) & :=\sum_{e \in \mathcal{I}_{h}} \frac{\gamma_{1} h_{e}}{p^{2}} \int_{e} g_{N}[a \nabla v \cdot \mathbf{n}] \mathrm{d} \Gamma \end{aligned}

結果貼圖如下(後面一個圖是說明求積的階數在數值解精度上的影響):

在這裏插入圖片描述

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章