学习自F. Moukalled, L. Mangani, M. Darwish所著The Finite Volume Method in Computational Fluid Dynamics - An Advanced Introduction with OpenFOAM and Matlab
Chapter 9 Gradient Computation
FVM in CFD 学习笔记_第9章_梯度计算
在CFD的FVM的离散过程中,在单元形心和面形心处变量ϕ \phi ϕ 的梯度是常常要用到的物理量,那么如何由单元形心处的变量ϕ \phi ϕ 来获取单元形心和面形心处的变量ϕ \phi ϕ 的梯度∇ ϕ \nabla \phi ∇ ϕ 呢?本节便讲讲FVM in CFD中梯度的计算方法。
1 笛卡尔网格上梯度的计算
由于笛卡尔网格横平竖直,有很好的正交特性,所以梯度的计算变得十分简单快捷了,对于1维问题,且均匀网格,则面e e e 上的变量梯度可直接得出:
( ∂ ϕ ∂ x ) e = ϕ E − ϕ C x E − x C = ϕ E − ϕ C δ x e
\left(\frac{\partial\phi}{\partial x}\right)_e=\frac{\phi_E-\phi_C}{x_E-x_C}=\frac{\phi_E-\phi_C}{\delta x_e}
( ∂ x ∂ ϕ ) e = x E − x C ϕ E − ϕ C = δ x e ϕ E − ϕ C
单元形心C C C 处的变量梯度也可得出( ∂ ϕ ∂ x ) C = ϕ e − ϕ w x e − x w = ϕ E + ϕ C 2 − ϕ C + ϕ W 2 Δ x C = ϕ E − ϕ W 2 Δ x C
\left(\frac{\partial\phi}{\partial x}\right)_C=\frac{\phi_e-\phi_w}{x_e-x_w}=\frac{\displaystyle \frac{\phi_E+\phi_C}{2}-\frac{\phi_C+\phi_W}{2}}{\Delta x_C}=\frac{\phi_E-\phi_W}{2 \Delta x_C}
( ∂ x ∂ ϕ ) C = x e − x w ϕ e − ϕ w = Δ x C 2 ϕ E + ϕ C − 2 ϕ C + ϕ W = 2 Δ x C ϕ E − ϕ W
这个常叫做“中心差分”,对于2维情况,与此类似,可得( ∂ ϕ ∂ x ) C = ϕ E − ϕ W x E − x W , ( ∂ ϕ ∂ y ) C = ϕ N − ϕ S x N − x S
\left(\frac{\partial\phi}{\partial x}\right)_C=\frac{\phi_E-\phi_W}{x_E-x_W},\quad \left(\frac{\partial\phi}{\partial y}\right)_C=\frac{\phi_N-\phi_S}{x_N-x_S}
( ∂ x ∂ ϕ ) C = x E − x W ϕ E − ϕ W , ( ∂ y ∂ ϕ ) C = x N − x S ϕ N − ϕ S
当处理非正交网格或非结构网格时,情况就复杂得多了,这就需要用到更加通用方法,即Green-Gauss梯度法和最小二乘梯度法等。
2 Green-Gauss Gradient(格林-高斯梯度)
这是计算梯度方法中应用最广的一个,即,单元形心处变量的梯度可以由面形心处的变量值与面积矢量复合后相加和除以单元体积来获取,用到的数学定理是Green-Gauss或梯度定理,即∫ V ∇ ϕ d V = ∮ ∂ V ϕ d S ⃗ ⇒ ∇ ϕ ‾ V = ∮ ∂ V ϕ d S ⃗ ⇒ ∇ ϕ C = 1 V C ∑ f − n b ( C ) ϕ f S ⃗ f
\int_V\nabla\phi dV=\oint_{\partial V}\phi d\vec S \Rightarrow \overline{\nabla\phi} V =\oint_{\partial V}\phi d\vec S \Rightarrow \nabla\phi_C = \frac{1}{V_C}\sum_{f-nb(C)}\phi_f \vec S_f
∫ V ∇ ϕ d V = ∮ ∂ V ϕ d S ⇒ ∇ ϕ V = ∮ ∂ V ϕ d S ⇒ ∇ ϕ C = V C 1 f − n b ( C ) ∑ ϕ f S f
即∇ ϕ C = 1 V C ∑ f − n b ( C ) ϕ f S ⃗ f
\nabla\phi_C = \frac{1}{V_C}\sum_{f-nb(C)}\phi_f \vec S_f
∇ ϕ C = V C 1 f − n b ( C ) ∑ ϕ f S f
其中V C V_C V C 为单元体积,f f f 代表单元的某个面,而S ⃗ f \vec S_f S f 为该面的面积矢量,面形心的变量值ϕ f \phi_f ϕ f 是未知的,仍旧需要计算出来,不然上面这个公式是用不了的。ϕ f \phi_f ϕ f 的计算方法有两种,一是用紧致框架(compact stencil)由面左右单元(所属单元和邻居单元,即面两侧单元)形心值来计算,二是用扩展框架(extended stencil)先用面的角点周围角点上的值来得到面的角点值,然后再由角点值来平均得到面形心的值。
方法1:紧致框架
对于上图(a)和(b)所示的2维和3维情况,一种最简单的方法是直接由面两侧单元形心值平均来获得面上变量的值,即ϕ f = g C ϕ C + ( 1 − g C ) ϕ F
\phi_f=g_C\phi_C+(1-g_C)\phi_F
ϕ f = g C ϕ C + ( 1 − g C ) ϕ F
其中g C g_C g C 为几何权重系数,等于g C = ∣ ∣ r ⃗ F − r ⃗ f ∣ ∣ ∣ ∣ r ⃗ F − r ⃗ C ∣ ∣ = d F f d F C
g_C=\frac{||\vec r_F-\vec r_f||}{||\vec r_F-\vec r_C||}=\frac{d_{Ff}}{d_{FC}}
g C = ∣ ∣ r F − r C ∣ ∣ ∣ ∣ r F − r f ∣ ∣ = d F C d F f
其中r ⃗ \vec r r 为距离矢量,而d d d 为两点之间的距离值,若该面恰好位于两单元中心的中间位置,则有ϕ f = ϕ C + ϕ F 2
\phi_f=\frac{\phi_C+\phi_F}{2}
ϕ f = 2 ϕ C + ϕ F
这个方法非常简便易行,然而遗憾的是,只有当线段C F CF C F 和面S ⃗ f \vec S_f S f 的交点与面S ⃗ f \vec S_f S f 的中心重合时(即上图(a)(b)情况),该方法才能保证2阶精度,而大多数情况下,直接由上式算得的梯度精度是没法保证的。
然而,对于通常的非正交网格和非结构网格来说,是没有办法来保证这个条件的,比如上图中的(c)(d)情况,网格的偏斜(非正交,skewness(non-conjunctionality))使得线段C F CF C F 和面S ⃗ f \vec S_f S f 交点为f ′ f' f ′ ,与面形心f f f 是不重合的。此时,需要把插值得到的ϕ f ′ \phi_{f'} ϕ f ′ 修正以得到ϕ f \phi_f ϕ f ,修正方程为ϕ f = ϕ f ′ + c o r r e c t i o n = ϕ f ′ + ( ∇ ϕ ) f ′ ⋅ ( r ⃗ f − r ⃗ f ′ )
\phi_f=\phi_{f'}+correction=\phi_{f'}+(\nabla\phi)_{f'}\cdot(\vec r_f-\vec r_{f'})
ϕ f = ϕ f ′ + c o r r e c t i o n = ϕ f ′ + ( ∇ ϕ ) f ′ ⋅ ( r f − r f ′ )
即,用梯度( ∇ ϕ ) f ′ (\nabla\phi)_{f'} ( ∇ ϕ ) f ′ 来修正,修正也可以展开为如下形式:ϕ f = g C { ϕ C + ( ∇ ϕ ) C ⋅ ( r ⃗ f − r ⃗ C ) } + ( 1 − g C ) { ϕ F + ( ∇ ϕ ) F ⋅ ( r ⃗ f − r ⃗ F ) } = ϕ f ′ + g C ( ∇ ϕ ) C ⋅ ( r ⃗ f − r ⃗ C ) + ( 1 − g C ) ( ∇ ϕ ) F ⋅ ( r ⃗ f − r ⃗ F )
\phi_f=g_C\{\phi_C+(\nabla\phi)_C\cdot(\vec r_f-\vec r_C)\}+(1-g_C)\{ \phi_F+(\nabla\phi)_F\cdot(\vec r_f-\vec r_F) \}\\
\quad \\
=\phi_{f'}+g_C(\nabla\phi)_C\cdot(\vec r_f-\vec r_C)+(1-g_C)(\nabla\phi)_F\cdot(\vec r_f-\vec r_F)
ϕ f = g C { ϕ C + ( ∇ ϕ ) C ⋅ ( r f − r C ) } + ( 1 − g C ) { ϕ F + ( ∇ ϕ ) F ⋅ ( r f − r F ) } = ϕ f ′ + g C ( ∇ ϕ ) C ⋅ ( r f − r C ) + ( 1 − g C ) ( ∇ ϕ ) F ⋅ ( r f − r F )
即,{ ϕ C + ( ∇ ϕ ) C ⋅ ( r ⃗ f − r ⃗ C ) } \{\phi_C+(\nabla\phi)_C\cdot(\vec r_f-\vec r_C)\} { ϕ C + ( ∇ ϕ ) C ⋅ ( r f − r C ) } 是把C C C 处的值修正到f f f 处,而{ ϕ F + ( ∇ ϕ ) F ⋅ ( r ⃗ f − r ⃗ F ) } \{ \phi_F+(\nabla\phi)_F\cdot(\vec r_f-\vec r_F) \} { ϕ F + ( ∇ ϕ ) F ⋅ ( r f − r F ) } 是把F F F 处的值修正到f f f 处,然后再做加权插值处理,就得到了ϕ f \phi_f ϕ f 。
不难发现,ϕ f \phi_f ϕ f 的修正计算要用到( ∇ ϕ ) C (\nabla\phi)_C ( ∇ ϕ ) C 和( ∇ ϕ ) F (\nabla\phi)_F ( ∇ ϕ ) F ,而( ∇ ϕ ) C (\nabla\phi)_C ( ∇ ϕ ) C 和( ∇ ϕ ) F (\nabla\phi)_F ( ∇ ϕ ) F 则是用ϕ f \phi_f ϕ f 算得的,也就是说,这里ϕ f \phi_f ϕ f 的计算是不能一蹴而就的,而是一个迭代计算的过程,但是过多的迭代反而会造成解的振荡,一般做两次迭代就好了。
另外,g C g_C g C 是与点f ′ f' f ′ 的位置密切相关的,有三种选择方式:
选择1
点f ′ f' f ′ 就选择在线段C F CF C F 和面S ⃗ f \vec S_f S f 的交点处,以n ⃗ \vec n n 代表面积单位矢量,即,n ⃗ = S ⃗ f / ∣ ∣ S ⃗ f ∣ ∣ \vec n=\vec S_f/||\vec S_f|| n = S f / ∣ ∣ S f ∣ ∣ ,以e ⃗ \vec e e 代表沿着C F CF C F 的单位矢量,即e ⃗ = C F → / ∣ ∣ C F → ∣ ∣ \vec e=\overrightarrow{CF}/||\overrightarrow{CF}|| e = C F / ∣ ∣ C F ∣ ∣ ,则f ′ f' f ′ 的位置可由几何关系算出,为r ⃗ f ′ = ( r ⃗ f − r ⃗ C ) ⋅ n ⃗ e ⃗ ⋅ n ⃗ e ⃗ + r ⃗ C = r ⃗ f ⋅ n ⃗ e ⃗ ⋅ n ⃗ e ⃗
\vec r_{f'}=\frac{(\vec r_f - \vec r_C) \cdot \vec n}{\vec e \cdot \vec n}\vec e+\vec r_C=\frac{\vec r_f \cdot \vec n}{\vec e \cdot \vec n}\vec e
r f ′ = e ⋅ n ( r f − r C ) ⋅ n e + r C = e ⋅ n r f ⋅ n e
其中,( r ⃗ f − r ⃗ C ) ⋅ n ⃗ (\vec r_f - \vec r_C) \cdot \vec n ( r f − r C ) ⋅ n 为点C C C 到面S ⃗ f \vec S_f S f 的垂直距离向量,分母e ⃗ ⋅ n ⃗ \vec e \cdot \vec n e ⋅ n 为该垂直向量与C F → \overrightarrow{CF} C F 夹角的余弦值c o s θ cos\theta c o s θ ,于是两者相除便得到了C C C 到f ′ f' f ′ 的向量C f ′ → \overrightarrow{Cf'} C f ′ ,再与r ⃗ C \vec r_C r C 相加便是点f ′ f' f ′ 的位置矢量。
得到f ′ f' f ′ 的位置后,可以直接算出g C g_C g C 的值g C = ∣ ∣ r ⃗ F − r ⃗ f ′ ∣ ∣ ∣ ∣ r ⃗ F − r ⃗ C ∣ ∣ = d F f ′ d F C
g_C=\frac{||\vec r_F - \vec r_{f'}||}{||\vec r_F - \vec r_{C}||}=\frac{d_{Ff'}}{d_{FC}}
g C = ∣ ∣ r F − r C ∣ ∣ ∣ ∣ r F − r f ′ ∣ ∣ = d F C d F f ′
计算流程如下:
计算ϕ f ′ \phi_{f'} ϕ f ′ 使用ϕ f ′ = g C ϕ C + ( 1 − g C ) ϕ F \phi_{f'}=g_C\phi_C+(1-g_C)\phi_F ϕ f ′ = g C ϕ C + ( 1 − g C ) ϕ F
计算∇ ϕ C \nabla\phi_C ∇ ϕ C 使用∇ ϕ C = 1 V C ∑ f − n b ( C ) ϕ f ′ S ⃗ f \displaystyle \nabla\phi_C = \frac{1}{V_C}\sum_{f-nb(C)}\phi_{f'} \vec S_f ∇ ϕ C = V C 1 f − n b ( C ) ∑ ϕ f ′ S f
接下来用下面步骤来修正梯度场
更新ϕ f \phi_{f} ϕ f 使用ϕ f = ϕ f ′ + g C ( ∇ ϕ ) C ⋅ ( r ⃗ f − r ⃗ C ) + ( 1 − g C ) ( ∇ ϕ ) F ⋅ ( r ⃗ f − r ⃗ F ) \phi_f=\phi_{f'}+g_C(\nabla\phi)_C\cdot(\vec r_f-\vec r_C)+(1-g_C)(\nabla\phi)_F\cdot(\vec r_f-\vec r_F) ϕ f = ϕ f ′ + g C ( ∇ ϕ ) C ⋅ ( r f − r C ) + ( 1 − g C ) ( ∇ ϕ ) F ⋅ ( r f − r F )
计算∇ ϕ C \nabla\phi_C ∇ ϕ C 使用∇ ϕ C = 1 V C ∑ f − n b ( C ) ϕ f S ⃗ f \displaystyle \nabla\phi_C = \frac{1}{V_C}\sum_{f-nb(C)}\phi_{f} \vec S_f ∇ ϕ C = V C 1 f − n b ( C ) ∑ ϕ f S f
返回步骤3再迭代一次。
选择2
点f ′ f' f ′ 就选择在线段C F CF C F 的中点,相当于g C = 0.5 g_C=0.5 g C = 0 . 5 ,这就使得计算简单多了,其计算流程如下:
计算ϕ f ′ \phi_{f'} ϕ f ′ 使用ϕ f ′ = ϕ C + ϕ F 2 \displaystyle \phi_{f'}=\frac{\phi_C+\phi_F}{2} ϕ f ′ = 2 ϕ C + ϕ F
计算∇ ϕ C \nabla\phi_C ∇ ϕ C 使用∇ ϕ C = 1 V C ∑ f − n b ( C ) ϕ f ′ S ⃗ f \displaystyle \nabla\phi_C = \frac{1}{V_C}\sum_{f-nb(C)}\phi_{f'} \vec S_f ∇ ϕ C = V C 1 f − n b ( C ) ∑ ϕ f ′ S f
接下来用下面步骤来修正梯度场
更新ϕ f \phi_{f} ϕ f 使用ϕ f = ϕ f ′ + ( ∇ ϕ ) C + ( ∇ ϕ ) F 2 ⋅ ( r ⃗ f − r ⃗ C + r ⃗ F 2 ) \displaystyle \phi_f=\phi_{f'}+\frac{(\nabla\phi)_C+(\nabla\phi)_F}{2}\cdot\left(\vec r_f-\frac{\vec r_C+\vec r_F}{2}\right) ϕ f = ϕ f ′ + 2 ( ∇ ϕ ) C + ( ∇ ϕ ) F ⋅ ( r f − 2 r C + r F )
计算∇ ϕ C \nabla\phi_C ∇ ϕ C 使用∇ ϕ C = 1 V C ∑ f − n b ( C ) ϕ f S ⃗ f \displaystyle \nabla\phi_C = \frac{1}{V_C}\sum_{f-nb(C)}\phi_{f} \vec S_f ∇ ϕ C = V C 1 f − n b ( C ) ∑ ϕ f S f
返回步骤3再迭代一次。
选择3
点f ′ f' f ′ 的位置选择要保证距离f f ′ ff' f f ′ 是最短的,即,f f ′ ff' f f ′ 是垂直于C F CF C F 的,这使得第1步迭代计算变得更加准确。f ′ f' f ′ 的位置计算很简单,直接把向量C f → \overrightarrow {Cf} C f 投影到C F → \overrightarrow {CF} C F 上就妥了,即r ⃗ f ′ = r ⃗ C + r ⃗ C f ⋅ r ⃗ C F r ⃗ C F ⋅ r ⃗ C F ( r ⃗ F − r ⃗ C )
\vec r_{f'}=\vec r_C+\frac{\vec r_{Cf} \cdot \vec r_{CF}}{\vec r_{CF} \cdot \vec r_{CF}}(\vec r_F-\vec r_C)
r f ′ = r C + r C F ⋅ r C F r C f ⋅ r C F ( r F − r C )
其计算流程如下:
计算r ⃗ f ′ \vec r_{f'} r f ′ 使用r ⃗ f ′ = r ⃗ C + r ⃗ C f ⋅ r ⃗ C F r ⃗ C F ⋅ r ⃗ C F ( r ⃗ F − r ⃗ C ) \displaystyle\vec r_{f'}=\vec r_C+\frac{\vec r_{Cf} \cdot \vec r_{CF}}{\vec r_{CF} \cdot \vec r_{CF}}(\vec r_F-\vec r_C) r f ′ = r C + r C F ⋅ r C F r C f ⋅ r C F ( r F − r C )
计算g C g_C g C 使用g C = ∣ ∣ r ⃗ F − r ⃗ f ′ ∣ ∣ ∣ ∣ r ⃗ F − r ⃗ C ∣ ∣ \displaystyle g_C=\frac{||\vec r_F - \vec r_{f'}||}{||\vec r_F - \vec r_C||} g C = ∣ ∣ r F − r C ∣ ∣ ∣ ∣ r F − r f ′ ∣ ∣
计算ϕ f ′ \phi_{f'} ϕ f ′ 使用ϕ f ′ = g C ϕ C + ( 1 − g C ) ϕ F \phi_{f'}=g_C\phi_C+(1-g_C)\phi_F ϕ f ′ = g C ϕ C + ( 1 − g C ) ϕ F
计算∇ ϕ C \nabla\phi_C ∇ ϕ C 使用∇ ϕ C = 1 V C ∑ f − n b ( C ) ϕ f ′ S ⃗ f \displaystyle \nabla\phi_C = \frac{1}{V_C}\sum_{f-nb(C)}\phi_{f'} \vec S_f ∇ ϕ C = V C 1 f − n b ( C ) ∑ ϕ f ′ S f
接下来用下面步骤来修正梯度场
计算∇ ϕ f ′ \nabla\phi_{f'} ∇ ϕ f ′ 使用∇ ϕ f ′ = g C ∇ ϕ C + ( 1 − g C ) ∇ ϕ F \nabla\phi_{f'}=g_C\nabla\phi_C+(1-g_C)\nabla\phi_F ∇ ϕ f ′ = g C ∇ ϕ C + ( 1 − g C ) ∇ ϕ F
更新ϕ f \phi_{f} ϕ f 使用ϕ f = ϕ f ′ + ∇ ϕ f ′ ⋅ ( r ⃗ f − r ⃗ f ′ ) \phi_f=\phi_{f'}+\nabla\phi_{f'}\cdot(\vec r_f-\vec r_{f'}) ϕ f = ϕ f ′ + ∇ ϕ f ′ ⋅ ( r f − r f ′ )
计算∇ ϕ C \nabla\phi_C ∇ ϕ C 使用∇ ϕ C = 1 V C ∑ f − n b ( C ) ϕ f S ⃗ f \displaystyle \nabla\phi_C = \frac{1}{V_C}\sum_{f-nb(C)}\phi_{f} \vec S_f ∇ ϕ C = V C 1 f − n b ( C ) ∑ ϕ f S f
返回步骤5再迭代一次。
例1
上图所示网格,单元形心C C C 与其邻近单元形心F 1 F_1 F 1 到F 6 F_6 F 6 的坐标为C ( 13 , 11 ) , F 1 ( 4.5 , 9.5 ) , F 2 ( 8 , 3 ) , F 3 ( 17 , 3.5 ) , F 4 ( 22 , 10 ) , F 5 ( 16 , 20 ) , F 6 ( 7 , 18 )
C(13, 11), \quad F_1(4.5,9.5), \quad F_2(8,3), \quad F_3(17,3.5), \quad F_4(22,10), \quad F_5(16,20), \quad F_6(7,18) C ( 1 3 , 1 1 ) , F 1 ( 4 . 5 , 9 . 5 ) , F 2 ( 8 , 3 ) , F 3 ( 1 7 , 3 . 5 ) , F 4 ( 2 2 , 1 0 ) , F 5 ( 1 6 , 2 0 ) , F 6 ( 7 , 1 8 )
角点n 1 n_1 n 1 到n 2 n_2 n 2 的坐标为n 1 ( 9 , 14 ) , n 2 ( 8 , 8 ) , n 3 ( 12 , 5 ) , n 4 ( 17 , 9 ) , n 5 ( 17.5 , 14 ) , n 6 ( 12 , 17 )
n_1(9,14), \quad n_2(8,8), \quad n_3(12,5), \quad n_4(17,9), \quad n_5(17.5,14), \quad n_6(12,17)
n 1 ( 9 , 1 4 ) , n 2 ( 8 , 8 ) , n 3 ( 1 2 , 5 ) , n 4 ( 1 7 , 9 ) , n 5 ( 1 7 . 5 , 1 4 ) , n 6 ( 1 2 , 1 7 )
变量ϕ \phi ϕ 在单元形心的值为ϕ C = 167 , ϕ F 1 = 56.75 , ϕ F 2 = 35 , ϕ F 3 = 80 , ϕ F 4 = 252 , ϕ F 5 = 356 , ϕ F 6 = 151
\phi_C=167, \quad \phi_{F_1}=56.75, \quad \phi_{F_2}=35, \quad \phi_{F_3}=80, \quad \phi_{F_4}=252, \quad \phi_{F_5}=356, \quad\phi_{F_6}=151
ϕ C = 1 6 7 , ϕ F 1 = 5 6 . 7 5 , ϕ F 2 = 3 5 , ϕ F 3 = 8 0 , ϕ F 4 = 2 5 2 , ϕ F 5 = 3 5 6 , ϕ F 6 = 1 5 1
C单元的邻近单元形心处变量ϕ \phi ϕ 的梯度值∇ ϕ \nabla\phi ∇ ϕ 为∇ ϕ F 1 = 10.5 i + 5.5 j , ∇ ϕ F 2 = 4 i + 9 j , ∇ ϕ F 3 = 4.5 i + 18 j , ∇ ϕ F 4 = 11 i + 23 j , ∇ ϕ F 5 = 21 i + 17 j , ∇ ϕ F 6 = 19 i + 8 j
\nabla\phi_{F_1}=10.5\bold i+5.5 \bold j ,\quad \nabla\phi_{F_2}=4\bold i+9 \bold j, \quad \nabla\phi_{F_3}=4.5\bold i+18 \bold j, \\
\nabla\phi_{F_4}=11 \bold i+23 \bold j, \quad \nabla\phi_{F_5}=21 \bold i+17 \bold j, \quad \nabla\phi_{F_6}=19\bold i+8 \bold j
∇ ϕ F 1 = 1 0 . 5 i + 5 . 5 j , ∇ ϕ F 2 = 4 i + 9 j , ∇ ϕ F 3 = 4 . 5 i + 1 8 j , ∇ ϕ F 4 = 1 1 i + 2 3 j , ∇ ϕ F 5 = 2 1 i + 1 7 j , ∇ ϕ F 6 = 1 9 i + 8 j
单元C的体积V C = 76
V_C=76
V C = 7 6
求解单元C形心处的梯度值∇ ϕ C \nabla\phi_C ∇ ϕ C ,使用如下方法:
a. Green-Gauss方法,不含修正
b. Green-Gauss方法,含skewness correction,f ′ f' f ′ 选择为线段CF的中点
解法a. Green-Gauss方法求解∇ ϕ C \nabla\phi_C ∇ ϕ C ,不含修正
计算面形心(2维情况下就是面中心)坐标值x f 1 = ( x n 1 + x n 2 ) / 2 = ( 9 + 8 ) / 2 = 8.5 y f 1 = ( y n 1 + y n 2 ) / 2 = ( 14 + 8 ) / 2 = 11
x_{f_1}=(x_{n_1}+x_{n_2})/2=(9+8)/2=8.5 \\
y_{f_1}=(y_{n_1}+y_{n_2})/2=(14+8)/2=11
x f 1 = ( x n 1 + x n 2 ) / 2 = ( 9 + 8 ) / 2 = 8 . 5 y f 1 = ( y n 1 + y n 2 ) / 2 = ( 1 4 + 8 ) / 2 = 1 1
即f 1 ( 8.5 , 11 )
f_1(8.5, 11)
f 1 ( 8 . 5 , 1 1 )
同样方法算得单元C的其余面的形心坐标f 2 ( 10 , 6.5 ) , f 3 ( 14.5 , 7 ) , f 4 ( 17.25 , 11.5 ) , f 5 ( 14.75 , 15.5 ) , f 6 ( 10.5 , 15.5 )
f_2(10, 6.5), \quad f_3(14.5, 7), \quad f_4(17.25, 11.5), \quad f_5(14.75, 15.5), \quad f_6(10.5,15.5)
f 2 ( 1 0 , 6 . 5 ) , f 3 ( 1 4 . 5 , 7 ) , f 4 ( 1 7 . 2 5 , 1 1 . 5 ) , f 5 ( 1 4 . 7 5 , 1 5 . 5 ) , f 6 ( 1 0 . 5 , 1 5 . 5 )
计算面积矢量S ⃗ f 1 \vec S_{f_1} S f 1 S ⃗ f 1 = Δ y i − Δ x j = ( y n 2 − y n 1 ) i − ( x n 2 − x n 1 ) j = ( 8 − 14 ) i − ( 8 − 9 ) j = − 6 i + j
\vec S_{f_1}=\Delta y\bold i - \Delta x\bold j=(y_{n_2}-y_{n_1})\bold i - (x_{n_2}-x_{n_1}) \bold j \\
=(8-14)\bold i - (8-9) \bold j=-6\bold i + \bold j
S f 1 = Δ y i − Δ x j = ( y n 2 − y n 1 ) i − ( x n 2 − x n 1 ) j = ( 8 − 1 4 ) i − ( 8 − 9 ) j = − 6 i + j
同样方法算得其余面的面积矢量S ⃗ f 2 = − 3 i − 4 j S ⃗ f 3 = 4 i − 5 j S ⃗ f 4 = 5 i − 0.5 j S ⃗ f 5 = 3 i + 5.5 j S ⃗ f 6 = − 3 i + 3 j
\vec S_{f_2}=-3\bold i -4 \bold j \quad \vec S_{f_3}=4\bold i -5 \bold j \quad \vec S_{f_4}=5\bold i -0.5 \bold j \quad \vec S_{f_5}=3\bold i +5.5 \bold j \quad \vec S_{f_6}=-3\bold i +3 \bold j
S f 2 = − 3 i − 4 j S f 3 = 4 i − 5 j S f 4 = 5 i − 0 . 5 j S f 5 = 3 i + 5 . 5 j S f 6 = − 3 i + 3 j
计算插值系数g C 1 g_{C_1} g C 1 g C 1 = F 1 f 1 F 1 f 1 + C f 1
g_{C_1}=\frac{F_1 f_1}{F_1 f_1+Cf_1}
g C 1 = F 1 f 1 + C f 1 F 1 f 1 F 1 f 1 = ( 4.5 − 8.5 ) 2 + ( 9.5 − 11 ) 2 = 4.272
F_1 f_1=\sqrt{(4.5-8.5)^2+(9.5-11)^2}=4.272
F 1 f 1 = ( 4 . 5 − 8 . 5 ) 2 + ( 9 . 5 − 1 1 ) 2 = 4 . 2 7 2 C f 1 = ( 13 − 8.5 ) 2 + ( 11 − 11 ) 2 = 4.5
Cf_1=\sqrt{(13-8.5)^2+(11-11)^2}=4.5
C f 1 = ( 1 3 − 8 . 5 ) 2 + ( 1 1 − 1 1 ) 2 = 4 . 5
算得g C 1 = 0.487
g_{C_1}=0.487
g C 1 = 0 . 4 8 7
同样,算得其它面的插值系数g C 2 = 0.427 , g C 3 = 0.502 , g C 4 = 0.538 , g C 5 = 0.492 , g C 6 = 0.455
g_{C_2}=0.427, \quad g_{C_3}=0.502, \quad g_{C_4}=0.538, \quad g_{C_5}=0.492, \quad g_{C_6}=0.455
g C 2 = 0 . 4 2 7 , g C 3 = 0 . 5 0 2 , g C 4 = 0 . 5 3 8 , g C 5 = 0 . 4 9 2 , g C 6 = 0 . 4 5 5
计算面形心的变量值ϕ f \phi_f ϕ f ϕ f 1 = g C 1 ϕ C + ( 1 − g C 1 ) ϕ F 1 = 0.487 ∗ 167 + ( 1 − 0.487 ) ∗ 56.75 = 110.442
\phi_{f_1}=g_{C_1}\phi_C+(1-g_{C_1})\phi_{F_1}=0.487*167+(1-0.487)*56.75=110.442
ϕ f 1 = g C 1 ϕ C + ( 1 − g C 1 ) ϕ F 1 = 0 . 4 8 7 ∗ 1 6 7 + ( 1 − 0 . 4 8 7 ) ∗ 5 6 . 7 5 = 1 1 0 . 4 4 2
同样算得其它面形心的变量值ϕ f 2 = 91.364 , ϕ f 3 = 123.674 , ϕ f 4 = 206.27 , ϕ f 5 = 263.012 , ϕ f 6 = 158.28
\phi_{f_2}=91.364, \quad \phi_{f_3}=123.674, \quad \phi_{f_4}=206.27, \quad \phi_{f_5}=263.012, \quad \phi_{f_6}=158.28
ϕ f 2 = 9 1 . 3 6 4 , ϕ f 3 = 1 2 3 . 6 7 4 , ϕ f 4 = 2 0 6 . 2 7 , ϕ f 5 = 2 6 3 . 0 1 2 , ϕ f 6 = 1 5 8 . 2 8
计算单元形心C处的梯度值∇ ϕ C = 1 V C ∑ f = 1 6 ϕ f S ⃗ f = 1 76 { [ 110.442 ( − 6 i + j ) + 91.364 ( 3 i − 4 j ) + 123.674 ( 4 i − 5 j ) + 206.27 ( 5 i − 0.5 j ) + 263.012 ( 3 i + 5.5 j ) + 158.28 ( − 3 i + 3 j ) ] } = 11.889 i + 12.433 j
\nabla\phi_C = \frac{1}{V_C}\sum_{f=1}^6\phi_{f} \vec S_f \\
=\frac{1}{76}\left\{ \begin{bmatrix}
110.442(-6\bold i + \bold j)+91.364(3\bold i -4 \bold j)+123.674(4\bold i -5 \bold j) \\
+206.27(5\bold i -0.5 \bold j)+263.012(3\bold i +5.5 \bold j)+158.28(-3\bold i +3 \bold j)
\end{bmatrix}
\right\} \\
= 11.889 \bold i +12.433 \bold j
∇ ϕ C = V C 1 f = 1 ∑ 6 ϕ f S f = 7 6 1 { [ 1 1 0 . 4 4 2 ( − 6 i + j ) + 9 1 . 3 6 4 ( 3 i − 4 j ) + 1 2 3 . 6 7 4 ( 4 i − 5 j ) + 2 0 6 . 2 7 ( 5 i − 0 . 5 j ) + 2 6 3 . 0 1 2 ( 3 i + 5 . 5 j ) + 1 5 8 . 2 8 ( − 3 i + 3 j ) ] } = 1 1 . 8 8 9 i + 1 2 . 4 3 3 j
to be continued …
方法2:扩展框架
由于面是由角点构成的,所以用角点处的值的平均来算得面形心的值就理所当然了,那么角点处的值要如何获取呢?用围绕该角点的单元形心处的值来加权平均计算即可。比较拗口哈,看下图:
用F 1 , F 2 , F 3 F_1, F_2, F_3 F 1 , F 2 , F 3 处的值来算得n 1 n_1 n 1 处的值,用F 2 , F 3 , F 4 F_2, F_3, F_4 F 2 , F 3 , F 4 处的值来算得n 2 n_2 n 2 处的值,最后再用n 1 , n 2 n_1,n_2 n 1 , n 2 处的值来算得f f f 处的值,即可。
角点处的值由围绕角点的单元形心处的值加权平均算出,加权系数取为距离的倒数(距离越远,影响越小),即ϕ n = ∑ k = 1 N B ( n ) ϕ F k ∣ ∣ r ⃗ n − r ⃗ F k ∣ ∣ ∑ k = 1 N B ( n ) 1 ∣ ∣ r ⃗ n − r ⃗ F k ∣ ∣
\displaystyle \phi_n=\frac{\displaystyle \sum_{k=1}^{NB(n)}\frac{\phi_{F_k}}{||\vec r_n-\vec r_{F_k}||}}{\displaystyle \sum_{k=1}^{NB(n)} \frac{1}{{||\vec r_n-\vec r_{F_k}||}}}
ϕ n = k = 1 ∑ N B ( n ) ∣ ∣ r n − r F k ∣ ∣ 1 k = 1 ∑ N B ( n ) ∣ ∣ r n − r F k ∣ ∣ ϕ F k
其中n n n 代表角点,F k F_k F k 代表邻近单元,N B ( n ) NB(n) N B ( n ) 为围绕角点n n n 的单元总数,∣ ∣ r ⃗ n − r ⃗ F k ∣ ∣ ||\vec r_n-\vec r_{F_k}|| ∣ ∣ r n − r F k ∣ ∣ 为角点到邻近单元形心的距离。
角点值得到后,面形心的值也可得到,单元形心的梯度值随后可得出,以2维问题为例,ϕ f \phi_f ϕ f 为ϕ f = ϕ n 1 + ϕ n 2 2
\phi_f=\frac{\phi_{n1}+\phi_{n2}}{2}
ϕ f = 2 ϕ n 1 + ϕ n 2
单元形心的梯度∇ ϕ C \nabla\phi_C ∇ ϕ C 为∇ ϕ C = 1 V C ∑ f − n b ( C ) ϕ f S ⃗ f
\displaystyle \nabla\phi_C = \frac{1}{V_C}\sum_{f-nb(C)}\phi_{f} \vec S_f
∇ ϕ C = V C 1 f − n b ( C ) ∑ ϕ f S f
对于3维情况,面形心的值ϕ f \phi_f ϕ f 由角点值的距离加权平均计算,即ϕ f = ∑ k = 1 n b ( f ) ϕ n k ∣ ∣ r ⃗ f − r ⃗ n k ∣ ∣ ∑ k = 1 n b ( f ) 1 ∣ ∣ r ⃗ f − r ⃗ n k ∣ ∣
\displaystyle \phi_f=\frac{\displaystyle \sum_{k=1}^{nb(f)}\frac{\phi_{n_k}}{||\vec r_f-\vec r_{n_k}||}}{\displaystyle \sum_{k=1}^{nb(f)} \frac{1}{{||\vec r_f-\vec r_{n_k}||}}}
ϕ f = k = 1 ∑ n b ( f ) ∣ ∣ r f − r n k ∣ ∣ 1 k = 1 ∑ n b ( f ) ∣ ∣ r f − r n k ∣ ∣ ϕ n k
而单元形心梯度值的计算方法照旧不变。
例2
3 Least-Square Gradient(最小二乘梯度)
最小二乘法计算梯度,提供了更高的精度,以及更加灵活的选择,用的框架点也更多,然而其需要计算较多的加权系数,当然计算消耗也比较大。
考虑上图,单元C C C 由第1层邻近单元和第2层邻近单元,那么,如果单元形心的梯度∇ ϕ C \nabla\phi_C ∇ ϕ C 是精确的话,有ϕ F = ϕ C + ( ∇ ϕ ) C ⋅ ( r ⃗ F − r ⃗ C )
\phi_F=\phi_C+(\nabla\phi)_C\cdot(\vec r_F - \vec r_C)
ϕ F = ϕ C + ( ∇ ϕ ) C ⋅ ( r F − r C )
在最小二乘法中,设法让上式算得的单元邻近单元值的加权加和值最小,即找到如下函数的最小值G C = ∑ k = 1 N B ( C ) { w k [ ϕ F k − ( ϕ C + ( ∇ ϕ ) C ⋅ r ⃗ C F k ) ] 2 } = ∑ k = 1 N B ( C ) { w k [ Δ ϕ k − ( Δ x k ( ∂ ϕ ∂ x ) C + Δ y k ( ∂ ϕ ∂ y ) C + Δ z k ( ∂ ϕ ∂ z ) C ) ] 2 }
G_C=\sum_{k=1}^{NB(C)}\{ w_k[\phi_{F_k}-(\phi_C+(\nabla\phi)_C\cdot\vec r_{CF_k})]^2 \} \\
=\sum_{k=1}^{NB(C)}\left\{ w_k\left[\Delta\phi_k - \left( \Delta x_k\left(\frac{\partial\phi}{\partial x}\right)_C + \Delta y_k\left(\frac{\partial\phi}{\partial y}\right)_C + \Delta z_k\left(\frac{\partial\phi}{\partial z}\right)_C \right) \right]^2 \right\}
G C = k = 1 ∑ N B ( C ) { w k [ ϕ F k − ( ϕ C + ( ∇ ϕ ) C ⋅ r C F k ) ] 2 } = k = 1 ∑ N B ( C ) { w k [ Δ ϕ k − ( Δ x k ( ∂ x ∂ ϕ ) C + Δ y k ( ∂ y ∂ ϕ ) C + Δ z k ( ∂ z ∂ ϕ ) C ) ] 2 }
其中w k w_k w k 为加权系数Δ ϕ k = ϕ F k − ϕ C Δ x k = r ⃗ C F k ⋅ i ⃗ Δ y k = r ⃗ C F k ⋅ j ⃗ Δ z k = r ⃗ C F k ⋅ k ⃗
\Delta\phi_k=\phi_{F_k}-\phi_C \\
\quad \\
\Delta x_k=\vec r_{CF_k}\cdot\vec i \\
\quad \\
\Delta y_k=\vec r_{CF_k}\cdot\vec j \\
\quad \\
\Delta z_k=\vec r_{CF_k}\cdot\vec k
Δ ϕ k = ϕ F k − ϕ C Δ x k = r C F k ⋅ i Δ y k = r C F k ⋅ j Δ z k = r C F k ⋅ k G C G_C G C 函数的最小值应满足如下条件∂ G C ∂ ( ∂ ϕ ∂ x ) = ∂ G C ∂ ( ∂ ϕ ∂ y ) = ∂ G C ∂ ( ∂ ϕ ∂ z ) = 0
\frac{\partial G_C}{\partial \displaystyle \left( \frac{\partial\phi}{\partial x} \right)} = \frac{\partial G_C}{\partial \displaystyle \left( \frac{\partial\phi}{\partial y} \right)} =\frac{\partial G_C}{\partial \displaystyle \left( \frac{\partial\phi}{\partial z} \right)} = 0
∂ ( ∂ x ∂ ϕ ) ∂ G C = ∂ ( ∂ y ∂ ϕ ) ∂ G C = ∂ ( ∂ z ∂ ϕ ) ∂ G C = 0
得到了如下含三个未知量的三个方程∑ k = 1 N B ( C ) { 2 w k Δ x k [ − Δ ϕ k + Δ x k ( ∂ ϕ ∂ x ) C + Δ y k ( ∂ ϕ ∂ y ) C + Δ z k ( ∂ ϕ ∂ z ) C ] } = 0 ∑ k = 1 N B ( C ) { 2 w k Δ y k [ − Δ ϕ k + Δ x k ( ∂ ϕ ∂ x ) C + Δ y k ( ∂ ϕ ∂ y ) C + Δ z k ( ∂ ϕ ∂ z ) C ] } = 0 ∑ k = 1 N B ( C ) { 2 w k Δ z k [ − Δ ϕ k + Δ x k ( ∂ ϕ ∂ x ) C + Δ y k ( ∂ ϕ ∂ y ) C + Δ z k ( ∂ ϕ ∂ z ) C ] } = 0
\sum_{k=1}^{NB(C)}\left\{ 2w_k\Delta x_k\left[-\Delta\phi_k + \Delta x_k\left(\frac{\partial\phi}{\partial x}\right)_C + \Delta y_k\left(\frac{\partial\phi}{\partial y}\right)_C + \Delta z_k\left(\frac{\partial\phi}{\partial z}\right)_C \right] \right\}=0 \\
\sum_{k=1}^{NB(C)}\left\{ 2w_k\Delta y_k\left[-\Delta\phi_k + \Delta x_k\left(\frac{\partial\phi}{\partial x}\right)_C + \Delta y_k\left(\frac{\partial\phi}{\partial y}\right)_C + \Delta z_k\left(\frac{\partial\phi}{\partial z}\right)_C \right] \right\}=0 \\
\sum_{k=1}^{NB(C)}\left\{ 2w_k\Delta z_k\left[-\Delta\phi_k + \Delta x_k\left(\frac{\partial\phi}{\partial x}\right)_C + \Delta y_k\left(\frac{\partial\phi}{\partial y}\right)_C + \Delta z_k\left(\frac{\partial\phi}{\partial z}\right)_C \right] \right\}=0
k = 1 ∑ N B ( C ) { 2 w k Δ x k [ − Δ ϕ k + Δ x k ( ∂ x ∂ ϕ ) C + Δ y k ( ∂ y ∂ ϕ ) C + Δ z k ( ∂ z ∂ ϕ ) C ] } = 0 k = 1 ∑ N B ( C ) { 2 w k Δ y k [ − Δ ϕ k + Δ x k ( ∂ x ∂ ϕ ) C + Δ y k ( ∂ y ∂ ϕ ) C + Δ z k ( ∂ z ∂ ϕ ) C ] } = 0 k = 1 ∑ N B ( C ) { 2 w k Δ z k [ − Δ ϕ k + Δ x k ( ∂ x ∂ ϕ ) C + Δ y k ( ∂ y ∂ ϕ ) C + Δ z k ( ∂ z ∂ ϕ ) C ] } = 0
可以写成矩阵形式[ ∑ k = 1 N B ( C ) w k Δ x k Δ x k ∑ k = 1 N B ( C ) w k Δ x k Δ y k ∑ k = 1 N B ( C ) w k Δ x k Δ z k ∑ k = 1 N B ( C ) w k Δ y k Δ x k ∑ k = 1 N B ( C ) w k Δ y k Δ y k ∑ k = 1 N B ( C ) w k Δ y k Δ z k ∑ k = 1 N B ( C ) w k Δ z k Δ x k ∑ k = 1 N B ( C ) w k Δ z k Δ y k ∑ k = 1 N B ( C ) w k Δ z k Δ z k ] [ ( ∂ ϕ ∂ x ) C ( ∂ ϕ ∂ y ) C ( ∂ ϕ ∂ z ) C ] = [ ∑ k = 1 N B ( C ) w k Δ x k Δ ϕ k ∑ k = 1 N B ( C ) w k Δ y k Δ ϕ k ∑ k = 1 N B ( C ) w k Δ z k Δ ϕ k ]
\begin{bmatrix}
\displaystyle \sum_{k=1}^{NB(C)}w_k\Delta x_k\Delta x_k & \sum_{k=1}^{NB(C)}w_k\Delta x_k\Delta y_k & \sum_{k=1}^{NB(C)}w_k\Delta x_k\Delta z_k \\
\displaystyle \sum_{k=1}^{NB(C)}w_k\Delta y_k\Delta x_k & \sum_{k=1}^{NB(C)}w_k\Delta y_k\Delta y_k & \sum_{k=1}^{NB(C)}w_k\Delta y_k\Delta z_k \\
\displaystyle \sum_{k=1}^{NB(C)}w_k\Delta z_k\Delta x_k & \sum_{k=1}^{NB(C)}w_k\Delta z_k\Delta y_k & \sum_{k=1}^{NB(C)}w_k\Delta z_k\Delta z_k \\
\end{bmatrix} \begin{bmatrix}
\displaystyle \left(\frac{\partial\phi}{\partial x}\right)_C \\
\\
\displaystyle \left(\frac{\partial\phi}{\partial y}\right)_C \\
\\
\displaystyle \left(\frac{\partial\phi}{\partial z}\right)_C
\end{bmatrix} = \begin{bmatrix}
\displaystyle \sum_{k=1}^{NB(C)}w_k\Delta x_k\Delta \phi_k \\
\displaystyle \sum_{k=1}^{NB(C)}w_k\Delta y_k\Delta \phi_k \\
\displaystyle \sum_{k=1}^{NB(C)}w_k\Delta z_k\Delta \phi_k
\end{bmatrix}
⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ k = 1 ∑ N B ( C ) w k Δ x k Δ x k k = 1 ∑ N B ( C ) w k Δ y k Δ x k k = 1 ∑ N B ( C ) w k Δ z k Δ x k ∑ k = 1 N B ( C ) w k Δ x k Δ y k ∑ k = 1 N B ( C ) w k Δ y k Δ y k ∑ k = 1 N B ( C ) w k Δ z k Δ y k ∑ k = 1 N B ( C ) w k Δ x k Δ z k ∑ k = 1 N B ( C ) w k Δ y k Δ z k ∑ k = 1 N B ( C ) w k Δ z k Δ z k ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ ( ∂ x ∂ ϕ ) C ( ∂ y ∂ ϕ ) C ( ∂ z ∂ ϕ ) C ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ = ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ k = 1 ∑ N B ( C ) w k Δ x k Δ ϕ k k = 1 ∑ N B ( C ) w k Δ y k Δ ϕ k k = 1 ∑ N B ( C ) w k Δ z k Δ ϕ k ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤
求解上述方程组,便可得到单元形心的梯度值∇ ϕ C \nabla\phi_C ∇ ϕ C ,只要左端项矩阵不奇异,即存在解。w k w_k w k 的选择是至关重要的,比如把它设成1就不太合适了,常见的设置方法是距离的倒数,即w k = 1 ∣ ∣ r ⃗ F k − r ⃗ C ∣ ∣ = 1 Δ x F k 2 + Δ y F k 2 + Δ z F k 2
w_k=\frac{1}{||\vec r_{F_k}-\vec r_C||}=\frac{1}{\sqrt{\Delta x_{F_k}^2+\Delta y_{F_k}^2 + \Delta z_{F_k}^2}}
w k = ∣ ∣ r F k − r C ∣ ∣ 1 = Δ x F k 2 + Δ y F k 2 + Δ z F k 2 1
也可以用距离的n n n 次幂的倒数来做加权系数,即w k = 1 ∣ ∣ r ⃗ F k − r ⃗ C ∣ ∣ n
w_k=\frac{1}{||\vec r_{F_k}-\vec r_C||^n}
w k = ∣ ∣ r F k − r C ∣ ∣ n 1
幂次n n n 可以是1,2,3等。
4 梯度插值到面
同样地,由面两侧的单元值插值获取,然后再做修正,修正的原则是让面梯度沿着C F CF C F 方向的值与由C C C 和F F F 处ϕ \phi ϕ 值定义的局部梯度相等,如此,面梯度∇ ϕ f \nabla\phi_f ∇ ϕ f 为∇ ϕ f = ∇ ϕ f ‾ + [ ϕ F − ϕ C d C F − ( ∇ ϕ f ‾ ⋅ e ⃗ C F ) ] e ⃗ C F
\nabla\phi_f=\overline{\nabla\phi_f}+\left[\frac{\phi_F-\phi_C}{d_{CF}}-(\overline{\nabla\phi_f}\cdot\vec e_{CF})\right]\vec e_{CF}
∇ ϕ f = ∇ ϕ f + [ d C F ϕ F − ϕ C − ( ∇ ϕ f ⋅ e C F ) ] e C F
其中∇ ϕ f ‾ = g C ∇ ϕ C + g F ∇ ϕ F
\overline{\nabla\phi_f}=g_C\nabla\phi_C+g_F\nabla\phi_F
∇ ϕ f = g C ∇ ϕ C + g F ∇ ϕ F e ⃗ C F = d ⃗ C F d C F
\vec e_{CF}=\frac{\vec d_{CF}}{d_{CF}}
e C F = d C F d C F d ⃗ C F = r ⃗ F − r ⃗ C
\vec d_{CF}=\vec r_F - \vec r_C
d C F = r F − r C
5 代码讲解