这篇笔记在做什么

这篇笔记专门抽出原始会话里最难也最容易混乱的部分:全局基函数如何代入连续弱形式,为什么绝大多数单元积分自动为零,局部基函数怎样带着方向符号回到全局矩阵。

我保留了推导里的每一步筛选与变换,让“全局到局部、局部回到全局”不再只是口号,而是一条完整可验证的计算链。


从全局到局部,再从局部到全局

——弱形式离散化的完整推导


一、出发点:连续弱形式

求 $\mathbf{E}^{sca} \in H(\text{curl};\Omega)$,使得对所有 $\mathbf{T} \in H(\text{curl};\Omega)$:

$$ \begin{aligned} &\underbrace{\int_\Omega (\nabla\times\mathbf{T})\cdot(\nabla\times\mathbf{E}^{sca})\,dV}_{a_1(\mathbf{T},\mathbf{E}^{sca})} \\ &\quad - k_0^2 \underbrace{\int_\Omega \mathbf{T}\cdot\bar{\bar{\varepsilon}}_r\mathbf{E}^{sca}\,dV}_{a_2(\mathbf{T},\mathbf{E}^{sca})} \\ &\quad - jk_0 \underbrace{\oint_{S_{ABC}}(\hat{n}\times\mathbf{T})\cdot(\hat{n}\times\mathbf{E}^{sca})\,dS}_{a_3(\mathbf{T},\mathbf{E}^{sca})} \\ &= \underbrace{k_0^2\int_{\Omega_d}\mathbf{T}\cdot(\bar{\bar{\varepsilon}}_r-\bar{\bar{I}})\mathbf{E}^{inc}\,dV}_{F(\mathbf{T})} \end{aligned} $$

简记为:

$$ \boxed{a(\mathbf{T}, \mathbf{E}^{sca}) = F(\mathbf{T}), \quad \forall\,\mathbf{T} \in H(\text{curl};\Omega)} $$

其中:

$$ a(\mathbf{T}, \mathbf{E}) = a_1(\mathbf{T},\mathbf{E}) - k_0^2 a_2(\mathbf{T},\mathbf{E}) + a_3(\mathbf{T},\mathbf{E}) $$

注意 $a_3$ 已经包含了 ABC 边界条件(自然边界条件),它来自弱形式推导中的面积分项。


二、全局编号下的场逼近

2.1 全局棱边编号与全局基函数

设网格共有 $N_E$ 条全局棱边,编号为 $I = 1, 2, \ldots, N_E$。

每条全局棱边 $I$ 对应一个全局基函数 $\boldsymbol{\mathcal{N}}_I(\mathbf{r})$。

全局基函数的定义:

$$ \boldsymbol{\mathcal{N}}_I(\mathbf{r}) = \begin{cases} \text{在包含棱边 } I \text{ 的单元内:由该单元的局部基函数组合而成} \\ \mathbf{0} \quad \text{在不包含棱边 } I \text{ 的单元内} \end{cases} $$

关键性质:

$$ \int_{E_J} \boldsymbol{\mathcal{N}}_I \cdot d\mathbf{l} = \delta_{IJ}, \quad I, J = 1, \ldots, N_E $$

全局基函数的支撑域(support)只覆盖包含该棱边的所有单元:

                全局棱边 I 被3个四面体共享
                
    ┌──────┐
    │Tet a │
    │      │
    │   ╱──┤────╲
    │  ╱ I │Tet c╲
    ├─╱────┤      │
    │╱Tet b│      │
    │      │      │
    └──────┴──────┘
    
    N_I(r) ≠ 0 只在 Tet a, Tet b, Tet c 内
    N_I(r) = 0 在其他所有单元内

2.2 散射场的全局展开

用全局基函数展开散射场:

$$ \boxed{ \mathbf{E}^{sca}_h(\mathbf{r}) = \sum_{I=1}^{N_E} E_I \,\boldsymbol{\mathcal{N}}_I(\mathbf{r}) } $$

其中 $E_I$ 是第 $I$ 条全局棱边上的自由度(DOF),即电场沿该棱边的切向线积分:

$$ E_I = \int_{E_I} \mathbf{E}^{sca}_h \cdot d\mathbf{l} $$

$\{E_I\}_{I=1}^{N_E}$ 就是我们要求解的 $N_E$ 个未知数。

2.3 测试函数的选择(Galerkin法)

取测试函数 $\mathbf{T}$ 也从同一组基函数中选取:

$$ \mathbf{T} = \boldsymbol{\mathcal{N}}_J, \quad J = 1, 2, \ldots, N_E $$

三、代入弱形式——全局编号下的离散方程

3.1 代入过程

将 $\mathbf{E}^{sca}_h = \sum_{I=1}^{N_E} E_I \boldsymbol{\mathcal{N}}_I$ 和 $\mathbf{T} = \boldsymbol{\mathcal{N}}_J$ 代入弱形式:

$$ a\left(\boldsymbol{\mathcal{N}}_J,\; \sum_{I=1}^{N_E} E_I \boldsymbol{\mathcal{N}}_I\right) = F(\boldsymbol{\mathcal{N}}_J), \quad J = 1, \ldots, N_E $$

利用 $a(\cdot, \cdot)$ 关于第二个变量的线性性

$$ \sum_{I=1}^{N_E} a(\boldsymbol{\mathcal{N}}_J, \boldsymbol{\mathcal{N}}_I)\,E_I = F(\boldsymbol{\mathcal{N}}_J), \quad J = 1, \ldots, N_E $$

3.2 全局矩阵方程

定义全局矩阵元素

$$ A_{JI} = a(\boldsymbol{\mathcal{N}}_J, \boldsymbol{\mathcal{N}}_I) $$

定义全局右端项

$$ b_J = F(\boldsymbol{\mathcal{N}}_J) $$

得到全局线性方程组:

$$ \boxed{ \sum_{I=1}^{N_E} A_{JI}\,E_I = b_J, \quad J = 1, \ldots, N_E } $$

即:

$$ [A]_{N_E \times N_E}\{E\}_{N_E \times 1} = \{b\}_{N_E \times 1} $$

3.3 展开每个全局矩阵元素

$$ \begin{aligned} A_{JI} &= \underbrace{\int_\Omega (\nabla\times\boldsymbol{\mathcal{N}}_J)\cdot(\nabla\times\boldsymbol{\mathcal{N}}_I)\,dV}_{S_{JI}} \\ &\quad - k_0^2 \underbrace{\int_\Omega \boldsymbol{\mathcal{N}}_J\cdot\bar{\bar{\varepsilon}}_r\boldsymbol{\mathcal{N}}_I\,dV}_{T_{JI}} \\ &\quad - jk_0 \underbrace{\oint_{S_{ABC}}(\hat{n}\times\boldsymbol{\mathcal{N}}_J)\cdot(\hat{n}\times\boldsymbol{\mathcal{N}}_I)\,dS}_{B_{JI}} \end{aligned} $$$$ b_J = k_0^2 \int_{\Omega_d} \boldsymbol{\mathcal{N}}_J\cdot(\bar{\bar{\varepsilon}}_r - \bar{\bar{I}})\mathbf{E}^{inc}\,dV $$

到此为止,一切都是全局编号 $I, J$。


四、关键观察:全局积分 → 单元积分之和

4.1 体积积分的分解

计算域 $\Omega$ 由 $M$ 个四面体单元组成:$\Omega = \bigcup_{e=1}^{M} \Omega^e$

因此全域体积积分可以分解为单元积分之和:

$$ \int_\Omega (\cdots)\,dV = \sum_{e=1}^{M} \int_{\Omega^e} (\cdots)\,dV $$

对 $S_{JI}$:

$$ S_{JI} = \int_\Omega (\nabla\times\boldsymbol{\mathcal{N}}_J)\cdot(\nabla\times\boldsymbol{\mathcal{N}}_I)\,dV = \sum_{e=1}^{M} \int_{\Omega^e} (\nabla\times\boldsymbol{\mathcal{N}}_J)\cdot(\nabla\times\boldsymbol{\mathcal{N}}_I)\,dV $$

对 $T_{JI}$:

$$ T_{JI} = \int_\Omega \boldsymbol{\mathcal{N}}_J\cdot\bar{\bar{\varepsilon}}_r\boldsymbol{\mathcal{N}}_I\,dV = \sum_{e=1}^{M} \int_{\Omega^e} \boldsymbol{\mathcal{N}}_J\cdot\bar{\bar{\varepsilon}}_r^{(e)}\boldsymbol{\mathcal{N}}_I\,dV $$

4.2 面积积分的分解

ABC面由 $M_f$ 个三角形面元组成:$S_{ABC} = \bigcup_{f=1}^{M_f} \Delta^f$

$$ B_{JI} = \oint_{S_{ABC}}(\hat{n}\times\boldsymbol{\mathcal{N}}_J)\cdot(\hat{n}\times\boldsymbol{\mathcal{N}}_I)\,dS = \sum_{f=1}^{M_f}\int_{\Delta^f}(\hat{n}\times\boldsymbol{\mathcal{N}}_J)\cdot(\hat{n}\times\boldsymbol{\mathcal{N}}_I)\,dS $$

4.3 关键简化:大部分单元积分为零

在单元 $\Omega^e$ 内部,全局基函数 $\boldsymbol{\mathcal{N}}_I$ 只有当棱边 $I$ 属于单元 $e$ 时才非零。

设单元 $e$ 包含的全局棱边编号为 $I_1^{(e)}, I_2^{(e)}, \ldots, I_6^{(e)}$(共6条),则:

$$ \int_{\Omega^e} (\nabla\times\boldsymbol{\mathcal{N}}_J)\cdot(\nabla\times\boldsymbol{\mathcal{N}}_I)\,dV \neq 0 \quad \text{仅当 } I \in \{I_k^{(e)}\}_{k=1}^{6} \text{ 且 } J \in \{I_k^{(e)}\}_{k=1}^{6} $$

如果 $I$ 或 $J$ 不属于单元 $e$,则该单元的贡献为零。

因此:

$$ S_{JI} = \sum_{\substack{e=1\\I \in e,\; J \in e}}^{M} \int_{\Omega^e} (\nabla\times\boldsymbol{\mathcal{N}}_J)\cdot(\nabla\times\boldsymbol{\mathcal{N}}_I)\,dV $$

求和只需遍历同时包含棱边 $I$ 和棱边 $J$ 的单元。


五、在单元内部:全局基函数与局部基函数的关系

5.1 单元 $e$ 的局部基函数

单元 $e$ 有4个局部节点 $n_1^{(e)}, n_2^{(e)}, n_3^{(e)}, n_4^{(e)}$,6条局部棱边 $e_1, \ldots, e_6$。

局部基函数:

$$ \mathbf{N}_k^{(e)}(\mathbf{r}) = \lambda_{a_k}\nabla\lambda_{b_k} - \lambda_{b_k}\nabla\lambda_{a_k}, \quad k = 1, \ldots, 6 $$

其中 $(a_k, b_k)$ 是局部棱边 $e_k$ 的两个局部节点。

5.2 全局基函数在单元 $e$ 内的表达

全局棱边 $I$ 对应单元 $e$ 的某条局部棱边 $e_k$。

但方向可能不一致。

设全局棱边 $I$ 的约定方向为 $N_A \to N_B$($A < B$),而局部棱边 $e_k$ 在单元 $e$ 中的方向为 $n_{a_k} \to n_{b_k}$,对应全局节点 $N_{A'} \to N_{B'}$。

如果 $A' = A, B' = B$(方向一致),则 $s_k^{(e)} = +1$; 如果 $A' = B, B' = A$(方向相反),则 $s_k^{(e)} = -1$。

全局基函数在单元内的限制(restriction):

$$ \boxed{ \boldsymbol{\mathcal{N}}_I\big|_{\Omega^e} = s_k^{(e)}\,\mathbf{N}_k^{(e)}(\mathbf{r}) } $$

其中 $k$ 满足 $\text{map}(e,k) = I$,即局部棱边 $k$ 映射到全局棱边 $I$。

为什么需要符号 $s_k^{(e)}$?

全局基函数 $\boldsymbol{\mathcal{N}}_I$ 在全局棱边 $I$ 上的切向方向与全局约定一致。但局部基函数 $\mathbf{N}_k^{(e)}$ 的切向方向由局部节点的编号顺序决定。当两者方向相反时,需要乘以 $-1$ 来修正。

5.3 旋度的关系

由于 $\nabla\times(c\,\mathbf{F}) = c\,\nabla\times\mathbf{F}$($c$ 为常数):

$$ \nabla\times\boldsymbol{\mathcal{N}}_I\big|_{\Omega^e} = s_k^{(e)}\,\nabla\times\mathbf{N}_k^{(e)}(\mathbf{r}) $$

5.4 用一个具体例子说明

取之前的网格,全局棱边 $E_9$,节点对 $(N_3, N_4)$,全局方向 $N_3 \to N_4$。

在 Tet 2 中:

  • 局部节点:$n_1=N_1, n_2=N_4, n_3=N_3, n_4=N_7$
  • 局部棱边 $e_4$ 连接 $(n_2, n_3) = (N_4, N_3)$
  • 全局方向是 $N_3 \to N_4$,但局部方向是 $N_4 \to N_3$
  • 方向相反,所以 $s_4^{(2)} = -1$

因此:

$$ \boldsymbol{\mathcal{N}}_{E_9}\big|_{\text{Tet 2}} = (-1)\cdot\mathbf{N}_4^{(2)} $$$$ = -(\lambda_2\nabla\lambda_3 - \lambda_3\nabla\lambda_2)\big|_{\text{Tet 2}} $$$$ = \lambda_3\nabla\lambda_2 - \lambda_2\nabla\lambda_3\big|_{\text{Tet 2}} $$

这等价于以 $(N_3, N_4)$ 方向构造的基函数 $\lambda_{N_3}\nabla\lambda_{N_4} - \lambda_{N_4}\nabla\lambda_{N_3}$,与全局方向一致。✓


六、将全局积分用局部基函数表达

6.1 刚度矩阵 $S_{JI}$ 的变换

设全局棱边 $I$ 在单元 $e$ 中对应局部棱边 $i$(即 $\text{map}(e,i) = I$), 设全局棱边 $J$ 在单元 $e$ 中对应局部棱边 $j$(即 $\text{map}(e,j) = J$)。

则在单元 $e$ 内:

$$ \boldsymbol{\mathcal{N}}_I\big|_{\Omega^e} = s_i^{(e)}\,\mathbf{N}_i^{(e)}, \quad \boldsymbol{\mathcal{N}}_J\big|_{\Omega^e} = s_j^{(e)}\,\mathbf{N}_j^{(e)} $$

代入 $S_{JI}$ 的单元积分:

$$ \int_{\Omega^e} (\nabla\times\boldsymbol{\mathcal{N}}_J)\cdot(\nabla\times\boldsymbol{\mathcal{N}}_I)\,dV = \int_{\Omega^e} \left(s_j^{(e)}\nabla\times\mathbf{N}_j^{(e)}\right)\cdot\left(s_i^{(e)}\nabla\times\mathbf{N}_i^{(e)}\right)dV $$$$ = s_i^{(e)}\,s_j^{(e)} \int_{\Omega^e} (\nabla\times\mathbf{N}_j^{(e)})\cdot(\nabla\times\mathbf{N}_i^{(e)})\,dV $$$$ = s_i^{(e)}\,s_j^{(e)}\,S^e_{ji} $$

其中:

$$ S^e_{ji} = \int_{\Omega^e} (\nabla\times\mathbf{N}_j^{(e)})\cdot(\nabla\times\mathbf{N}_i^{(e)})\,dV $$

纯粹用局部编号计算的单元刚度矩阵元素

因此全局刚度矩阵:

$$ \boxed{ S_{JI} = \sum_{\substack{e:\\ I \in e,\; J \in e}} s_i^{(e)}\,s_j^{(e)}\,S^e_{ji} } $$

6.2 质量矩阵 $T_{JI}$ 的变换

完全类似:

$$ \int_{\Omega^e} \boldsymbol{\mathcal{N}}_J\cdot\bar{\bar{\varepsilon}}_r\boldsymbol{\mathcal{N}}_I\,dV = s_i^{(e)}\,s_j^{(e)} \int_{\Omega^e} \mathbf{N}_j^{(e)}\cdot\bar{\bar{\varepsilon}}_r^{(e)}\mathbf{N}_i^{(e)}\,dV = s_i^{(e)}\,s_j^{(e)}\,T^e_{ji} $$$$ \boxed{ T_{JI} = \sum_{\substack{e:\\ I \in e,\; J \in e}} s_i^{(e)}\,s_j^{(e)}\,T^e_{ji} } $$

6.3 ABC面矩阵 $B_{JI}$ 的变换

ABC面由三角形面元 $\Delta^f$ 构成。每个面元属于某个四面体单元 $e(f)$,面上有3条棱边。

设面 $f$ 上的3条局部棱边编号为 $\alpha_1, \alpha_2, \alpha_3$。

$$ \int_{\Delta^f}(\hat{n}\times\boldsymbol{\mathcal{N}}_J)\cdot(\hat{n}\times\boldsymbol{\mathcal{N}}_I)\,dS $$

只有当 $I, J$ 都是面 $f$ 上的棱边时才非零。

设 $I = \text{map}(e(f), \alpha)$,$J = \text{map}(e(f), \beta)$,则:

$$ \int_{\Delta^f}(\hat{n}\times\boldsymbol{\mathcal{N}}_J)\cdot(\hat{n}\times\boldsymbol{\mathcal{N}}_I)\,dS = s_\alpha^{(e)}\,s_\beta^{(e)}\,\int_{\Delta^f}(\hat{n}\times\mathbf{N}_\alpha^{(e)})\cdot(\hat{n}\times\mathbf{N}_\beta^{(e)})\,dS $$$$ = s_\alpha^{(e)}\,s_\beta^{(e)}\,\tilde{B}^f_{\beta\alpha} $$

全局ABC矩阵:

$$ \boxed{ B_{JI} = \sum_{\substack{f:\\ I \in f,\; J \in f}} s_\alpha^{(e(f))}\,s_\beta^{(e(f))}\,\tilde{B}^f_{\beta\alpha} } $$

6.4 右端项 $b_J$ 的变换

$$ b_J = k_0^2\int_{\Omega_d}\boldsymbol{\mathcal{N}}_J\cdot(\bar{\bar{\varepsilon}}_r-\bar{\bar{I}})\mathbf{E}^{inc}\,dV = k_0^2\sum_{\substack{e \in \Omega_d\\ J \in e}} s_j^{(e)}\int_{\Omega^e}\mathbf{N}_j^{(e)}\cdot(\bar{\bar{\varepsilon}}_r^{(e)}-\bar{\bar{I}})\mathbf{E}^{inc}\,dV $$$$ \boxed{ b_J = \sum_{\substack{e \in \Omega_d\\ J \in e}} s_j^{(e)}\,f^e_j } $$

其中:

$$ f^e_j = k_0^2\int_{\Omega^e}\mathbf{N}_j^{(e)}\cdot(\bar{\bar{\varepsilon}}_r^{(e)}-\bar{\bar{I}})\mathbf{E}^{inc}\,dV $$

七、全局方程用局部量表达的完整形式

将 $A_{JI} = S_{JI} - k_0^2 T_{JI} + (-jk_0)B_{JI}$ 汇总:

$$ \boxed{ A_{JI} = \sum_{\substack{e:\\ I \in e,\; J \in e}} s_i^{(e)}\,s_j^{(e)}\left(S^e_{ji} - k_0^2 T^e_{ji}\right) + \sum_{\substack{f:\\ I \in f,\; J \in f}} s_\alpha^{(e(f))}\,s_\beta^{(e(f))}\left(-jk_0\,\tilde{B}^f_{\beta\alpha}\right) } $$$$ \boxed{ b_J = \sum_{\substack{e \in \Omega_d\\ J \in e}} s_j^{(e)}\,f^e_j } $$

这就完成了全局 $\to$ 局部的变换:全局矩阵元素用局部单元矩阵元素表达。


八、局部单元矩阵的计算(纯局部编号)

这一步完全在局部编号下进行,不涉及任何全局信息。

8.1 局部刚度矩阵 $[S^e]_{6\times 6}$

$$ S^e_{ji} = \int_{\Omega^e}(\nabla\times\mathbf{N}_j^{(e)})\cdot(\nabla\times\mathbf{N}_i^{(e)})\,dV $$

利用 $\nabla\times\mathbf{N}_k^{(e)} = 2\,\nabla\lambda_{a_k}\times\nabla\lambda_{b_k}$(常矢量):

$$ S^e_{ji} = 4\,(\nabla\lambda_{a_j}\times\nabla\lambda_{b_j})\cdot(\nabla\lambda_{a_i}\times\nabla\lambda_{b_i})\cdot V^e $$

这里所有量($\nabla\lambda$、$V^e$)都由局部节点坐标计算,与全局编号无关。

8.2 局部质量矩阵 $[T^e]_{6\times 6}$

$$ T^e_{ji} = \int_{\Omega^e}\mathbf{N}_j^{(e)}\cdot\bar{\bar{\varepsilon}}_r^{(e)}\mathbf{N}_i^{(e)}\,dV $$$$ = D_{b_j b_i}I_{a_j a_i} - D_{b_j a_i}I_{a_j b_i} - D_{a_j b_i}I_{b_j a_i} + D_{a_j a_i}I_{b_j b_i} $$

其中 $D_{pq} = (\nabla\lambda_p)^T\bar{\bar{\varepsilon}}_r^{(e)}(\nabla\lambda_q)$,$I_{pq} = (1+\delta_{pq})V^e/20$。

8.3 局部面矩阵 $[\tilde{B}^f]_{3\times 3}$(仅在ABC面上)

$$ \tilde{B}^f_{\beta\alpha} = \int_{\Delta^f}(\hat{n}\times\mathbf{N}_\beta^{(e)})\cdot(\hat{n}\times\mathbf{N}_\alpha^{(e)})\,dS $$$$ = \int_{\Delta^f}\mathbf{N}_\beta^{(e)}\cdot\mathbf{N}_\alpha^{(e)}\,dS \quad\text{(面上切向时)} $$

展开后用面积分公式 $J^f_{mn} = (1+\delta_{mn})A^f/12$ 计算。

8.4 局部右端矢量 $\{f^e\}_{6\times 1}$

$$ f^e_j = k_0^2\int_{\Omega^e}\mathbf{N}_j^{(e)}\cdot(\bar{\bar{\varepsilon}}_r^{(e)}-\bar{\bar{I}})\mathbf{E}^{inc}\,dV $$

用高斯积分或解析公式计算。

以上所有计算只用到局部节点坐标和局部编号,完全不需要知道全局编号。


九、从局部回到全局:组装

现在我们已经有了每个单元的局部矩阵,需要把它们正确地放回全局矩阵

9.1 完整的组装公式推导

全局矩阵元素 $A_{JI}$ 需要遍历所有同时包含全局棱边 $I$ 和 $J$ 的单元。但在实际计算中,我们不是按全局行列扫描,而是按单元循环

九(续):从局部回到全局——组装

9.1 完整的组装公式推导(续)

等价地,我们可以将组装写成按单元循环而非按全局行列扫描的形式。

核心等价关系:

原始表达(按全局行列扫描):

$$ A_{JI} = \sum_{\substack{e:\\ I \in e,\; J \in e}} s_{i(I,e)}^{(e)}\,s_{j(J,e)}^{(e)}\,K^e_{j(J,e),\,i(I,e)} $$

其中 $i(I,e)$ 表示"全局棱边 $I$ 在单元 $e$ 中的局部编号",$K^e = S^e - k_0^2 T^e$。

等价表达(按单元循环):

$$ A_{JI} = \sum_{e=1}^{M}\sum_{i=1}^{6}\sum_{j=1}^{6} s_i^{(e)} s_j^{(e)} K^e_{ji}\;\delta_{I,\,\text{map}(e,i)}\;\delta_{J,\,\text{map}(e,j)} $$

证明这两种表达等价:

右边的 $\delta_{I,\,\text{map}(e,i)}$ 选出了 $i = i(I,e)$(如果 $I$ 属于单元 $e$),$\delta_{J,\,\text{map}(e,j)}$ 选出了 $j = j(J,e)$。对 $i,j$ 求和后只剩下一项 $s_{i(I,e)}^{(e)} s_{j(J,e)}^{(e)} K^e_{j(J,e),i(I,e)}$。再对 $e$ 求和就得到左边。✓

9.2 组装的实际操作方式

实际中不会对每个 $(J,I)$ 去遍历所有单元。而是反过来:对每个单元,把它的 $6\times 6$ 贡献散布(scatter)到全局矩阵中。

逐单元散布法:

初始化:A = 0(N_E × N_E),b = 0(N_E × 1)

对每个单元 e = 1, ..., M:
    计算局部矩阵 K^e(6×6)和 f^e(6×1)
    
    对每个局部行 j = 1, ..., 6:
        J = map(e, j)         ← 全局行号
        s_j = sign(e, j)      ← 方向符号
        
        b[J] += s_j × f^e[j]  ← 右端项散布
        
        对每个局部列 i = 1, ..., 6:
            I = map(e, i)     ← 全局列号
            s_i = sign(e, i)  ← 方向符号
            
            A[J, I] += s_j × s_i × K^e[j, i]   ← 矩阵散布

9.3 用矩阵语言表达组装过程

定义布尔-符号关联矩阵(connectivity matrix)$[C^{(e)}]_{N_E \times 6}$:

$$ C^{(e)}_{I,k} = \begin{cases} s_k^{(e)} & \text{if } \text{map}(e,k) = I \\ 0 & \text{otherwise} \end{cases} $$

即 $[C^{(e)}]$ 的第 $k$ 列只有一个非零元素,在第 $I = \text{map}(e,k)$ 行,值为 $s_k^{(e)}$。

示例(Tet 2 的关联矩阵,18×6):

        e1   e2   e3   e4   e5   e6     ← 局部棱边
E1  [    0    0    0    0    0    0 ]
E2  [    0   +1    0    0    0    0 ]    ← map(2,e2)=E2, sign=+1
E3  [   +1    0    0    0    0    0 ]    ← map(2,e1)=E3, sign=+1
E4  [    0    0    0    0    0    0 ]
E5  [    0    0    0    0    0    0 ]
E6  [    0    0   +1    0    0    0 ]    ← map(2,e3)=E6, sign=+1
E7  [    0    0    0    0    0    0 ]
E8  [    0    0    0    0    0    0 ]
E9  [    0    0    0   -1    0    0 ]    ← map(2,e4)=E9, sign=-1 !!!
E10 [    0    0    0    0    0   +1 ]    ← map(2,e6)=E10, sign=+1
E11 [    0    0    0    0    0    0 ]
E12 [    0    0    0    0   +1    0 ]    ← map(2,e5)=E12, sign=+1
E13 [    0    0    0    0    0    0 ]
...
E18 [    0    0    0    0    0    0 ]
         ↑ 每列恰好一个非零元素

组装公式的矩阵表达:

$$ \boxed{ [A] = \sum_{e=1}^{M} [C^{(e)}]\,[K^e]\,[C^{(e)}]^T } $$$$ \boxed{ \{b\} = \sum_{e=1}^{M} [C^{(e)}]\,\{f^e\} } $$

证明:

$$ \left([C^{(e)}]\,[K^e]\,[C^{(e)}]^T\right)_{JI} = \sum_{j=1}^{6}\sum_{i=1}^{6} C^{(e)}_{J,j}\,K^e_{ji}\,C^{(e)}_{I,i} $$

由 $C^{(e)}_{J,j}$ 的定义:

  • 当 $\text{map}(e,j)=J$ 时 $C^{(e)}_{J,j} = s_j^{(e)}$,否则为 0
  • 当 $\text{map}(e,i)=I$ 时 $C^{(e)}_{I,i} = s_i^{(e)}$,否则为 0

所以非零贡献只有 $j = j(J,e)$,$i = i(I,e)$ 时:

$$ = s_{j(J,e)}^{(e)}\,K^e_{j(J,e),\,i(I,e)}\,s_{i(I,e)}^{(e)} $$

对 $e$ 求和即得 $A_{JI}$。✓

9.4 完整图解:一个矩阵元素的组装

考虑全局矩阵元素 $A_{E_9, E_3}$,即 $J = E_9$,$I = E_3$。

哪些单元同时包含 $E_9$ 和 $E_3$?

E3  = (N1, N4):出现在 Tet1(e2), Tet2(e1), Tet5(e1)
E9  = (N3, N4):出现在 Tet2(e4)

同时包含两者的单元:仅 Tet2

在 Tet2 中:

  • $E_3$ 对应局部 $e_1$,$s_1^{(2)} = +1$
  • $E_9$ 对应局部 $e_4$,$s_4^{(2)} = -1$
$$ A_{E_9, E_3} = s_4^{(2)} \cdot s_1^{(2)} \cdot K^{(2)}_{4,1} = (-1)(+1) K^{(2)}_{4,1} = -K^{(2)}_{4,1} $$

如果还有其他单元同时包含这两条棱边,则继续叠加。

再看一个多单元贡献的例子:$A_{E_{11}, E_{11}}$

E11 = (N4, N6):出现在 Tet1(e6), Tet4(e1), Tet5(e4)

所有三个单元都包含 $E_{11}$,所以对角元素有3个贡献:

$$ A_{E_{11},E_{11}} = \underbrace{s_6^{(1)}s_6^{(1)}K^{(1)}_{6,6}}_{\text{Tet1}} + \underbrace{s_1^{(4)}s_1^{(4)}K^{(4)}_{1,1}}_{\text{Tet4}} + \underbrace{s_4^{(5)}s_4^{(5)}K^{(5)}_{4,4}}_{\text{Tet5}} $$

由于 $s_k^2 = 1$(无论符号如何):

$$ = K^{(1)}_{6,6} + K^{(4)}_{1,1} + K^{(5)}_{4,4} $$

对角元素不受符号影响!(但非对角元素受影响。)


十、ABC边界条件的完整代入过程

10.1 回到弱形式的面积分项

弱形式中的面积分项(来自分部积分):

$$ -\oint_{\partial\Omega}(\hat{n}\times\mathbf{T})\cdot(\nabla\times\mathbf{E}^{sca})\,dS $$

计算域边界 $\partial\Omega$ 可能包含多种边界:

$$ \partial\Omega = S_{ABC} \cup S_{PEC} \cup S_{\text{other}} $$

10.2 在不同边界上的处理

在 $S_{ABC}$ 上: 代入ABC条件

$$ \nabla\times\mathbf{E}^{sca} = jk_0\,\hat{n}\times\mathbf{E}^{sca} \quad \text{($e^{-j\omega t}$ 约定)} $$

面积分变为:

$$ -\oint_{S_{ABC}}(\hat{n}\times\mathbf{T})\cdot\left(jk_0\,\hat{n}\times\mathbf{E}^{sca}\right)dS = -jk_0\oint_{S_{ABC}}(\hat{n}\times\mathbf{T})\cdot(\hat{n}\times\mathbf{E}^{sca})\,dS $$

这就是 $a_3(\mathbf{T}, \mathbf{E}^{sca})$,它留在方程左边,贡献矩阵 $[B]$。

在 $S_{PEC}$ 上(如果有的话): 这是本质边界条件(Dirichlet型)

$$ \hat{n}\times\mathbf{E}^{tot} = 0 \implies \hat{n}\times\mathbf{E}^{sca} = -\hat{n}\times\mathbf{E}^{inc} $$

处理方式不是通过面积分,而是直接强制自由度

10.3 代入全局逼近:ABC项

$$ \mathbf{E}^{sca}_h = \sum_{I=1}^{N_E} E_I\,\boldsymbol{\mathcal{N}}_I, \quad \mathbf{T} = \boldsymbol{\mathcal{N}}_J $$

代入ABC面积分项:

$$ -jk_0\oint_{S_{ABC}}(\hat{n}\times\boldsymbol{\mathcal{N}}_J)\cdot\left(\hat{n}\times\sum_{I=1}^{N_E}E_I\boldsymbol{\mathcal{N}}_I\right)dS $$$$ = -jk_0\sum_{I=1}^{N_E}E_I\oint_{S_{ABC}}(\hat{n}\times\boldsymbol{\mathcal{N}}_J)\cdot(\hat{n}\times\boldsymbol{\mathcal{N}}_I)\,dS $$$$ = \sum_{I=1}^{N_E}\left(-jk_0\,B_{JI}\right)E_I $$

这项并入全局矩阵 $[A]$ 的左端:

$$ \sum_{I=1}^{N_E}\left(S_{JI} - k_0^2 T_{JI} - jk_0\,B_{JI}\right)E_I = b_J $$

10.4 ABC面积分的局部化

$$ B_{JI} = \oint_{S_{ABC}}(\hat{n}\times\boldsymbol{\mathcal{N}}_J)\cdot(\hat{n}\times\boldsymbol{\mathcal{N}}_I)\,dS = \sum_{f=1}^{M_f}\int_{\Delta^f}(\hat{n}\times\boldsymbol{\mathcal{N}}_J)\cdot(\hat{n}\times\boldsymbol{\mathcal{N}}_I)\,dS $$

在面元 $\Delta^f$ 上,它属于母单元 $e(f)$。面上有3条棱边,编号为局部 $\alpha_1, \alpha_2, \alpha_3$。

关键:在面上,6条局部棱边中只有3条的切向分量非零(面上那3条),另外3条(包含对面节点 $n_s$ 的棱边)在面上切向分量为零。

因此面积分中,全局基函数 $\boldsymbol{\mathcal{N}}_I$ 只有当 $I$ 对应面上某条棱边时才有贡献。

设 $I = \text{map}(e(f), \alpha)$,$J = \text{map}(e(f), \beta)$,其中 $\alpha, \beta$ 是面上的3条局部棱边之一。

$$ \int_{\Delta^f}(\hat{n}\times\boldsymbol{\mathcal{N}}_J)\cdot(\hat{n}\times\boldsymbol{\mathcal{N}}_I)\,dS = s_\alpha^{(e)} s_\beta^{(e)}\int_{\Delta^f}(\hat{n}\times\mathbf{N}_\alpha^{(e)})\cdot(\hat{n}\times\mathbf{N}_\beta^{(e)})\,dS $$$$ = s_\alpha^{(e)} s_\beta^{(e)}\,\tilde{B}^f_{\beta\alpha} $$

10.5 ABC面矩阵的详细展开

面 $f$ 上3个局部节点为 $n_p, n_q, n_r$(对面节点 $n_s$ 不在面上),面上3条局部棱边为:

面上序号 $\alpha$局部棱边号局部节点对
1$e_{pq}$$(n_p, n_q)$
2$e_{pr}$$(n_p, n_r)$
3$e_{qr}$$(n_q, n_r)$

面矩阵元素(以 $\tilde{B}^f_{12}$ 为例):

$$ \tilde{B}^f_{12} = \int_{\Delta^f} \mathbf{N}_{pq}\cdot\mathbf{N}_{pr}\,dS $$

展开 $\mathbf{N}_{pq} = \lambda_p\nabla\lambda_q - \lambda_q\nabla\lambda_p$,$\mathbf{N}_{pr} = \lambda_p\nabla\lambda_r - \lambda_r\nabla\lambda_p$:

$$ \mathbf{N}_{pq}\cdot\mathbf{N}_{pr} = \lambda_p\lambda_p(\nabla\lambda_q\cdot\nabla\lambda_r) -\lambda_p\lambda_r(\nabla\lambda_q\cdot\nabla\lambda_p) -\lambda_q\lambda_p(\nabla\lambda_p\cdot\nabla\lambda_r) +\lambda_q\lambda_r(\nabla\lambda_p\cdot\nabla\lambda_p) $$

积分($\nabla\lambda$ 是常数,提出积分号):

$$ \tilde{B}^f_{12} = (\nabla\lambda_q\cdot\nabla\lambda_r)\,J^f_{pp} -(\nabla\lambda_q\cdot\nabla\lambda_p)\,J^f_{pr} -(\nabla\lambda_p\cdot\nabla\lambda_r)\,J^f_{qp} +(\nabla\lambda_p\cdot\nabla\lambda_p)\,J^f_{qr} $$

代入 $J^f_{pp} = A^f/6$,$J^f_{mn}(m\neq n) = A^f/12$:

$$ \tilde{B}^f_{12} = \frac{A^f}{6}(\nabla\lambda_q\cdot\nabla\lambda_r) - \frac{A^f}{12}\left[(\nabla\lambda_q\cdot\nabla\lambda_p) + (\nabla\lambda_p\cdot\nabla\lambda_r)\right] + \frac{A^f}{12}(\nabla\lambda_p\cdot\nabla\lambda_p) $$

通用公式(面上棱边 $\alpha$ 连接 $(p_\alpha, q_\alpha)$,棱边 $\beta$ 连接 $(p_\beta, q_\beta)$):

$$ \boxed{ \tilde{B}^f_{\beta\alpha} = (\nabla\lambda_{q_\beta}\cdot\nabla\lambda_{q_\alpha})\,J^f_{p_\beta p_\alpha} -(\nabla\lambda_{q_\beta}\cdot\nabla\lambda_{p_\alpha})\,J^f_{p_\beta q_\alpha} -(\nabla\lambda_{p_\beta}\cdot\nabla\lambda_{q_\alpha})\,J^f_{q_\beta p_\alpha} +(\nabla\lambda_{p_\beta}\cdot\nabla\lambda_{p_\alpha})\,J^f_{q_\beta q_\alpha} } $$

注意:如果 $p_\alpha, q_\alpha, p_\beta, q_\beta$ 中任何一个是对面节点 $n_s$(不在面上),则对应的 $J^f$ 项为零。但由于面上棱边两端都在面上,这种情况不会出现。

10.6 ABC面矩阵对全局矩阵的完整贡献

用关联矩阵的语言,面 $f$ 上3条棱边的关联矩阵为 $[C^{(f)}]_{N_E \times 3}$:

$$ C^{(f)}_{I, \alpha} = \begin{cases} s_{\alpha}^{(e(f))} & \text{if } I = \text{map}(e(f), \alpha) \\ 0 & \text{otherwise} \end{cases} $$

ABC面对全局矩阵的贡献:

$$ [A]_{ABC} = \sum_{f=1}^{M_f} (-jk_0)\,[C^{(f)}]\,[\tilde{B}^f]\,[C^{(f)}]^T $$

总的全局矩阵:

$$ [A] = \underbrace{\sum_{e=1}^{M}[C^{(e)}][K^e][C^{(e)}]^T}_{\text{体积积分贡献}} + \underbrace{\sum_{f=1}^{M_f}(-jk_0)[C^{(f)}][\tilde{B}^f][C^{(f)}]^T}_{\text{ABC面贡献}} $$

十一、PEC边界条件的代入(如果有的话)

11.1 PEC条件与自由度的关系

PEC面上 $\hat{n}\times\mathbf{E}^{tot} = 0$,即 $\hat{n}\times\mathbf{E}^{sca} = -\hat{n}\times\mathbf{E}^{inc}$。

这意味着PEC面上切向棱边的自由度是已知的。

设PEC面上的切向棱边集合为 $\mathcal{P} = \{P_1, P_2, \ldots, P_{N_P}\}$,则:

$$ E_{P_m} = -\int_{E_{P_m}}\mathbf{E}^{inc}\cdot d\mathbf{l} \equiv g_m, \quad m = 1, \ldots, N_P $$

其中 $g_m$ 是已知量(由入射场决定)。

11.2 将PEC条件代入全局方程

原始全局方程:

$$ \sum_{I=1}^{N_E} A_{JI}\,E_I = b_J, \quad J = 1, \ldots, N_E $$

将自由度分为两组:

$$ \{E_I\} = \{E_U\}_{\text{未知}} \cup \{E_P\}_{\text{已知(PEC)}} $$

$E_P = g_m$(已知),$E_U$(未知,待求解)。

方程变为:

$$ \sum_{I \in \mathcal{U}} A_{JI}\,E_I + \sum_{I \in \mathcal{P}} A_{JI}\,g_I = b_J $$

移项:

$$ \sum_{I \in \mathcal{U}} A_{JI}\,E_I = b_J - \sum_{I \in \mathcal{P}} A_{JI}\,g_I $$

对 $J \in \mathcal{U}$(未知自由度对应的方程行):

$$ \boxed{ \sum_{I \in \mathcal{U}} A_{JI}\,E_I = b_J - \sum_{I \in \mathcal{P}} A_{JI}\,g_I, \quad J \in \mathcal{U} } $$

右端项被修正了!PEC边界条件的已知值通过矩阵-向量乘积"转移"到了右端。

对 $J \in \mathcal{P}$(PEC自由度对应的方程行):

$$ E_J = g_J \quad \text{(直接替换)} $$

11.3 具体实现方式

方法一:缩减法(Reduction)

直接删除PEC行和列,得到缩减系统:

$$ [A_{UU}]\{E_U\} = \{b_U\} - [A_{UP}]\{g_P\} $$

矩阵维度从 $N_E \times N_E$ 缩减为 $(N_E - N_P) \times (N_E - N_P)$。

方法二:大数法(Penalty Method)

将PEC行的对角元素设为大数 $\Lambda$(如 $10^{20}$),右端设为 $\Lambda \cdot g_m$:

$$ A_{P_m, P_m} = \Lambda, \quad b_{P_m} = \Lambda \cdot g_m $$

其他元素不变。这样 $E_{P_m} \approx g_m$。

方法三:直接置零法

for m in PEC_edges:
    g_m = -integrate_E_inc_along_edge(m)  # 已知值
    
    # 修正右端项
    for J in range(N_E):
        if J != m:
            b[J] -= A[J, m] * g_m
    
    # 清除该行和列
    A[m, :] = 0
    A[:, m] = 0
    A[m, m] = 1.0
    b[m] = g_m

11.4 PEC条件在局部-全局框架中的完整图解

┌─────────────────────────────────────────────────────────────────┐
│                                                                 │
│  第1步:正常组装全局矩阵(忽略PEC,把所有棱边都当未知)         │
│                                                                 │
│    [A]{E} = {b}    (N_E × N_E 系统)                            │
│                                                                 │
│  第2步:识别PEC面上的棱边                                       │
│                                                                 │
│    PEC面上的棱边 P_m:                                          │
│    ┌───────────────────┐                                        │
│    │     PEC face       │                                        │
│    │   ─── P₁ ───      │ ← 这些棱边的DOF是已知的               │
│    │   │         │      │    E_{P₁} = g₁ = -∫E^inc·dl          │
│    │   P₃       P₂     │    E_{P₂} = g₂                        │
│    │   │         │      │    E_{P₃} = g₃                        │
│    │   ───────────      │                                        │
│    └───────────────────┘                                        │
│                                                                 │
│  第3步:修正方程组                                               │
│                                                                 │
│    对每个PEC棱边 P_m:                                          │
│      (a) 将 A_{P_m,P_m}×g_m 的贡献从其他行的右端扣除           │
│      (b) 将第 P_m 行设为 E_{P_m} = g_m                        │
│                                                                 │
│    修正后的系统(等效于缩减系统):                               │
│                                                                 │
│    ┌                                          ┐ ┌    ┐   ┌      ┐│
│    │ A_{U₁U₁} A_{U₁U₂} ... 0   0   ...      │ │E_U₁│   │b'_U₁ ││
│    │ A_{U₂U₁} A_{U₂U₂} ... 0   0   ...      │ │E_U₂│   │b'_U₂ ││
│    │ ...                                      │ │... │ = │...   ││
│    │ 0        0        ... 1   0   ...        │ │E_P₁│   │g₁    ││
│    │ 0        0        ... 0   1   ...        │ │E_P₂│   │g₂    ││
│    │ ...                                      │ │... │   │...   ││
│    └                                          ┘ └    ┘   └      ┘│
│                                                                 │
│    其中 b'_J = b_J - Σ_{m} A_{J,P_m} g_m                       │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

11.5 纯介质散射(无PEC)的简化

本问题中散射体是介质,无PEC面。因此:

  • $\mathcal{P} = \emptyset$,所有 $N_E$ 个自由度都是未知的
  • 不需要第3步的修正
  • 直接求解 $[A]\{E\} = \{b\}$

十二、完整推导的全景图

12.1 从弱形式到最终方程的完整路径

十二(续):完整推导的全景图

12.1 从弱形式到最终方程的完整路径(续)

$$ \boxed{ \begin{aligned} &\textbf{第一阶段:连续弱形式(物理空间)}\\[4pt] &a(\mathbf{T}, \mathbf{E}^{sca}) = F(\mathbf{T}), \quad \forall\,\mathbf{T} \in H(\text{curl};\Omega) \end{aligned} } $$$$ \downarrow \quad \text{代入全局逼近 } \mathbf{E}^{sca}_h = \sum_{I=1}^{N_E} E_I \boldsymbol{\mathcal{N}}_I,\quad \mathbf{T} = \boldsymbol{\mathcal{N}}_J $$$$ \boxed{ \begin{aligned} &\textbf{第二阶段:全局离散方程}\\[4pt] &\sum_{I=1}^{N_E} \underbrace{a(\boldsymbol{\mathcal{N}}_J, \boldsymbol{\mathcal{N}}_I)}_{A_{JI}} E_I = \underbrace{F(\boldsymbol{\mathcal{N}}_J)}_{b_J}, \quad J = 1, \ldots, N_E \end{aligned} } $$$$ \downarrow \quad \text{全域积分分解为单元积分之和} $$$$ \boxed{ \begin{aligned} &\textbf{第三阶段:全局矩阵元素用全局基函数在单元内的积分表达}\\[4pt] &A_{JI} = \sum_{e=1}^{M}\int_{\Omega^e}\left[(\nabla\times\boldsymbol{\mathcal{N}}_J)\cdot(\nabla\times\boldsymbol{\mathcal{N}}_I) - k_0^2\boldsymbol{\mathcal{N}}_J\cdot\bar{\bar{\varepsilon}}_r^{(e)}\boldsymbol{\mathcal{N}}_I\right]dV \\ &\quad\quad\quad + \sum_{f=1}^{M_f}(-jk_0)\int_{\Delta^f}(\hat{n}\times\boldsymbol{\mathcal{N}}_J)\cdot(\hat{n}\times\boldsymbol{\mathcal{N}}_I)\,dS \end{aligned} } $$$$ \downarrow \quad \text{在每个单元内代入 } \boldsymbol{\mathcal{N}}_I\big|_{\Omega^e} = s_{i}^{(e)}\mathbf{N}_{i}^{(e)} $$$$ \boxed{ \begin{aligned} &\textbf{第四阶段:用局部基函数表达全局矩阵元素}\\[4pt] &A_{JI} = \sum_{\substack{e:\\I\in e,\,J\in e}} s_i^{(e)}s_j^{(e)}\underbrace{\left(S^e_{ji} - k_0^2 T^e_{ji}\right)}_{K^e_{ji}} + \sum_{\substack{f:\\I\in f,\,J\in f}} s_\alpha^{(e(f))}s_\beta^{(e(f))}\underbrace{(-jk_0\tilde{B}^f_{\beta\alpha})}_{\text{ABC面贡献}} \end{aligned} } $$$$ \downarrow \quad \text{在纯局部编号下计算 } S^e_{ji},\, T^e_{ji},\, \tilde{B}^f_{\beta\alpha} $$$$ \boxed{ \begin{aligned} &\textbf{第五阶段:局部矩阵计算(纯局部编号,不涉及全局)}\\[4pt] &S^e_{ji} = 4(\nabla\lambda_{a_j}\times\nabla\lambda_{b_j})\cdot(\nabla\lambda_{a_i}\times\nabla\lambda_{b_i})\,V^e\\[4pt] &T^e_{ji} = D_{b_jb_i}I_{a_ja_i} - D_{b_ja_i}I_{a_jb_i} - D_{a_jb_i}I_{b_ja_i} + D_{a_ja_i}I_{b_jb_i}\\[4pt] &\tilde{B}^f_{\beta\alpha} = (\nabla\lambda_{q_\beta}\cdot\nabla\lambda_{q_\alpha})J^f_{p_\beta p_\alpha} - \cdots \end{aligned} } $$$$ \downarrow \quad \text{用 edge\_map 和 sign\_map 将局部矩阵散布到全局矩阵} $$$$ \boxed{ \begin{aligned} &\textbf{第六阶段:组装回全局(散布操作)}\\[4pt] &A_{JI} \mathrel{+}= s_i^{(e)}\,s_j^{(e)}\,K^e_{ji} \quad \text{其中 } I=\text{map}(e,i),\;J=\text{map}(e,j)\\[4pt] &b_J \mathrel{+}= s_j^{(e)}\,f^e_j \quad \text{其中 } J=\text{map}(e,j) \end{aligned} } $$$$ \downarrow \quad \text{施加PEC等本质边界条件} $$$$ \boxed{ \begin{aligned} &\textbf{第七阶段:最终方程组}\\[4pt] &[A]\{E^{sca}\} = \{b\}\\[4pt] &\text{其中PEC棱边的DOF已被强制设定} \end{aligned} } $$

12.2 每一步的详细展开

下面我将每一步之间的变换完全展开,不省略任何中间步骤。

步骤 1→2:代入全局逼近

弱形式的每一项分别代入:

第一项(旋度-旋度项):

$$ \int_\Omega (\nabla\times\mathbf{T})\cdot(\nabla\times\mathbf{E}^{sca}_h)\,dV $$$$ = \int_\Omega \left(\nabla\times\boldsymbol{\mathcal{N}}_J\right)\cdot\left(\nabla\times\sum_{I=1}^{N_E}E_I\boldsymbol{\mathcal{N}}_I\right)dV $$$$ = \int_\Omega \left(\nabla\times\boldsymbol{\mathcal{N}}_J\right)\cdot\left(\sum_{I=1}^{N_E}E_I\nabla\times\boldsymbol{\mathcal{N}}_I\right)dV $$$$ = \sum_{I=1}^{N_E}E_I\int_\Omega (\nabla\times\boldsymbol{\mathcal{N}}_J)\cdot(\nabla\times\boldsymbol{\mathcal{N}}_I)\,dV $$$$ = \sum_{I=1}^{N_E} S_{JI}\,E_I $$

第二项(质量项,含各向异性):

$$ -k_0^2\int_\Omega \mathbf{T}\cdot\bar{\bar{\varepsilon}}_r\mathbf{E}^{sca}_h\,dV $$$$ = -k_0^2\int_\Omega \boldsymbol{\mathcal{N}}_J\cdot\bar{\bar{\varepsilon}}_r\left(\sum_{I=1}^{N_E}E_I\boldsymbol{\mathcal{N}}_I\right)dV $$$$ = -k_0^2\sum_{I=1}^{N_E}E_I\int_\Omega \boldsymbol{\mathcal{N}}_J\cdot\bar{\bar{\varepsilon}}_r\boldsymbol{\mathcal{N}}_I\,dV $$

注意:这里利用了 $\bar{\bar{\varepsilon}}_r$ 作用在 $\boldsymbol{\mathcal{N}}_I$ 上是线性的,而 $E_I$ 是标量可以提出积分。但 $\bar{\bar{\varepsilon}}_r$ 不能从积分中提出(它一般随空间变化,不同单元内取值不同)。

$$ = -k_0^2\sum_{I=1}^{N_E} T_{JI}\,E_I $$

第三项(ABC面积分):

$$ -jk_0\oint_{S_{ABC}}(\hat{n}\times\mathbf{T})\cdot(\hat{n}\times\mathbf{E}^{sca}_h)\,dS $$$$ = -jk_0\oint_{S_{ABC}}(\hat{n}\times\boldsymbol{\mathcal{N}}_J)\cdot\left(\hat{n}\times\sum_{I=1}^{N_E}E_I\boldsymbol{\mathcal{N}}_I\right)dS $$$$ = -jk_0\sum_{I=1}^{N_E}E_I\oint_{S_{ABC}}(\hat{n}\times\boldsymbol{\mathcal{N}}_J)\cdot(\hat{n}\times\boldsymbol{\mathcal{N}}_I)\,dS $$$$ = \sum_{I=1}^{N_E}(-jk_0\,B_{JI})\,E_I $$

右端项:

$$ F(\boldsymbol{\mathcal{N}}_J) = k_0^2\int_{\Omega_d}\boldsymbol{\mathcal{N}}_J\cdot(\bar{\bar{\varepsilon}}_r-\bar{\bar{I}})\mathbf{E}^{inc}\,dV = b_J $$

这里 $\mathbf{E}^{inc}$ 是已知函数,不需要展开。

合并三项:

$$ \sum_{I=1}^{N_E}\left(S_{JI} - k_0^2 T_{JI} - jk_0 B_{JI}\right)E_I = b_J $$$$ \sum_{I=1}^{N_E} A_{JI}\,E_I = b_J, \quad J = 1,\ldots,N_E $$

步骤 2→3:全域积分 → 单元积分

以 $S_{JI}$ 为例:

$$ S_{JI} = \int_\Omega (\nabla\times\boldsymbol{\mathcal{N}}_J)\cdot(\nabla\times\boldsymbol{\mathcal{N}}_I)\,dV $$$$ = \int_{\Omega^1 \cup \Omega^2 \cup \cdots \cup \Omega^M} (\nabla\times\boldsymbol{\mathcal{N}}_J)\cdot(\nabla\times\boldsymbol{\mathcal{N}}_I)\,dV $$

由于单元不重叠($\Omega^{e_1}\cap\Omega^{e_2}$ 至多共享面/边/点,测度为零):

$$ = \sum_{e=1}^{M}\int_{\Omega^e} (\nabla\times\boldsymbol{\mathcal{N}}_J)\cdot(\nabla\times\boldsymbol{\mathcal{N}}_I)\,dV $$

关键筛选:如果全局棱边 $I$ 不属于单元 $e$,则 $\boldsymbol{\mathcal{N}}_I|_{\Omega^e} = \mathbf{0}$,该单元的积分为零。因此:

$$ S_{JI} = \sum_{\substack{e=1\\I\in e \text{ and } J\in e}}^{M}\int_{\Omega^e} (\nabla\times\boldsymbol{\mathcal{N}}_J)\cdot(\nabla\times\boldsymbol{\mathcal{N}}_I)\,dV $$

质量矩阵 $T_{JI}$ 完全类似。

对于 $B_{JI}$,将面积分 $S_{ABC}$ 分解为三角形面元之和:

$$ B_{JI} = \sum_{f=1}^{M_f}\int_{\Delta^f}(\hat{n}\times\boldsymbol{\mathcal{N}}_J)\cdot(\hat{n}\times\boldsymbol{\mathcal{N}}_I)\,dS $$

同样,只有当 $I, J$ 都是面 $f$ 上的棱边时才有贡献。

对于 $b_J$,注意 $(\bar{\bar{\varepsilon}}_r - \bar{\bar{I}})$ 只在介质区域 $\Omega_d$ 非零:

$$ b_J = k_0^2 \sum_{\substack{e=1\\e\subset\Omega_d,\;J\in e}}^{M}\int_{\Omega^e}\boldsymbol{\mathcal{N}}_J\cdot(\bar{\bar{\varepsilon}}_r^{(e)}-\bar{\bar{I}})\mathbf{E}^{inc}\,dV $$

步骤 3→4:代入全局-局部关系

在单元 $e$ 内,全局基函数与局部基函数的关系是:

$$ \boldsymbol{\mathcal{N}}_I\big|_{\Omega^e} = s_{i(I,e)}^{(e)}\,\mathbf{N}_{i(I,e)}^{(e)} $$

为简化记号,令 $i \equiv i(I,e)$,$j \equiv j(J,e)$。

$S_{JI}$ 的单元积分变换:

$$ \int_{\Omega^e}(\nabla\times\boldsymbol{\mathcal{N}}_J)\cdot(\nabla\times\boldsymbol{\mathcal{N}}_I)\,dV $$$$ = \int_{\Omega^e}\left(\nabla\times\left[s_j^{(e)}\mathbf{N}_j^{(e)}\right]\right)\cdot\left(\nabla\times\left[s_i^{(e)}\mathbf{N}_i^{(e)}\right]\right)dV $$

由于 $s_j^{(e)}, s_i^{(e)}$ 是常数($\pm 1$),可从旋度和积分中提出:

$$ = s_j^{(e)}\,s_i^{(e)}\int_{\Omega^e}(\nabla\times\mathbf{N}_j^{(e)})\cdot(\nabla\times\mathbf{N}_i^{(e)})\,dV $$$$ = s_j^{(e)}\,s_i^{(e)}\,S^e_{ji} $$

$T_{JI}$ 的单元积分变换(各向异性张量):

$$ \int_{\Omega^e}\boldsymbol{\mathcal{N}}_J\cdot\bar{\bar{\varepsilon}}_r^{(e)}\boldsymbol{\mathcal{N}}_I\,dV $$$$ = \int_{\Omega^e}\left(s_j^{(e)}\mathbf{N}_j^{(e)}\right)\cdot\bar{\bar{\varepsilon}}_r^{(e)}\left(s_i^{(e)}\mathbf{N}_i^{(e)}\right)dV $$$$ = s_j^{(e)}\,s_i^{(e)}\int_{\Omega^e}\mathbf{N}_j^{(e)}\cdot\bar{\bar{\varepsilon}}_r^{(e)}\mathbf{N}_i^{(e)}\,dV $$

注意:$\bar{\bar{\varepsilon}}_r^{(e)}$ 是张量,作用在 $\mathbf{N}_i^{(e)}$ 上得到一个矢量,然后与 $\mathbf{N}_j^{(e)}$ 做点积。标量 $s_i^{(e)}$ 可以从张量-矢量乘积中提出,因为 $\bar{\bar{\varepsilon}}_r\,(c\,\mathbf{v}) = c\,\bar{\bar{\varepsilon}}_r\,\mathbf{v}$。

$$ = s_j^{(e)}\,s_i^{(e)}\,T^e_{ji} $$

$B_{JI}$ 的面积分变换:

在面 $f$ 上,$\boldsymbol{\mathcal{N}}_I|_{\Delta^f} = s_\alpha^{(e(f))}\mathbf{N}_\alpha^{(e(f))}$:

$$ \int_{\Delta^f}(\hat{n}\times\boldsymbol{\mathcal{N}}_J)\cdot(\hat{n}\times\boldsymbol{\mathcal{N}}_I)\,dS $$$$ = \int_{\Delta^f}\left(\hat{n}\times s_\beta^{(e)}\mathbf{N}_\beta^{(e)}\right)\cdot\left(\hat{n}\times s_\alpha^{(e)}\mathbf{N}_\alpha^{(e)}\right)dS $$

利用 $\hat{n}\times(c\,\mathbf{v}) = c\,(\hat{n}\times\mathbf{v})$:

$$ = s_\beta^{(e)}\,s_\alpha^{(e)}\int_{\Delta^f}(\hat{n}\times\mathbf{N}_\beta^{(e)})\cdot(\hat{n}\times\mathbf{N}_\alpha^{(e)})\,dS $$$$ = s_\beta^{(e)}\,s_\alpha^{(e)}\,\tilde{B}^f_{\beta\alpha} $$

右端项 $b_J$ 的变换:

$$ \int_{\Omega^e}\boldsymbol{\mathcal{N}}_J\cdot(\bar{\bar{\varepsilon}}_r^{(e)}-\bar{\bar{I}})\mathbf{E}^{inc}\,dV $$$$ = \int_{\Omega^e}s_j^{(e)}\mathbf{N}_j^{(e)}\cdot(\bar{\bar{\varepsilon}}_r^{(e)}-\bar{\bar{I}})\mathbf{E}^{inc}\,dV $$$$ = s_j^{(e)}\int_{\Omega^e}\mathbf{N}_j^{(e)}\cdot(\bar{\bar{\varepsilon}}_r^{(e)}-\bar{\bar{I}})\mathbf{E}^{inc}\,dV $$

注意:$\mathbf{E}^{inc}$ 不是常数(它随空间变化),但 $s_j^{(e)}$ 是常数可以提出。$(\bar{\bar{\varepsilon}}_r^{(e)}-\bar{\bar{I}})$ 在单元内是常张量(假设材料在每个单元内均匀),也可以提出。$\mathbf{E}^{inc}$ 需要在积分中保留(或用高斯积分数值处理)。

$$ = s_j^{(e)}\,\frac{f^e_j}{k_0^2} $$

所以:

$$ b_J = \sum_{\substack{e\subset\Omega_d\\J\in e}} s_j^{(e)}\,f^e_j $$

步骤 4→5:纯局部矩阵计算

这一步完全在局部编号下进行。详细公式已在前面给出,此处强调结构:

输入:单元 $e$ 的4个节点坐标 $\mathbf{r}_1^{(e)}, \mathbf{r}_2^{(e)}, \mathbf{r}_3^{(e)}, \mathbf{r}_4^{(e)}$,材料 $\bar{\bar{\varepsilon}}_r^{(e)}$

计算过程

$$ [J] \xrightarrow{\text{求逆}} [J]^{-1} \xrightarrow{\text{转置取行}} \nabla\lambda_1,\ldots,\nabla\lambda_4 $$$$ V^e = |\det J|/6 $$$$ \nabla\times\mathbf{N}_k = 2\nabla\lambda_{a_k}\times\nabla\lambda_{b_k} \xrightarrow{\text{点积}} S^e_{ji} $$$$ D_{pq} = (\nabla\lambda_p)^T\bar{\bar{\varepsilon}}_r^{(e)}(\nabla\lambda_q),\quad I_{pq} = (1+\delta_{pq})V^e/20 \xrightarrow{\text{四项展开}} T^e_{ji} $$$$ K^e_{ji} = S^e_{ji} - k_0^2 T^e_{ji} $$

输出:$6\times 6$ 矩阵 $[K^e]$ 和 $6\times 1$ 矢量 $\{f^e\}$

全程不需要任何全局信息!

步骤 5→6:散布回全局矩阵

输入:局部矩阵 $[K^e]$,映射表 $\text{map}(e,\cdot)$,符号表 $\text{sign}(e,\cdot)$

操作

$$ \text{for } j = 1,\ldots,6: \quad J = \text{map}(e,j), \quad s_j = \text{sign}(e,j) $$$$ \quad\text{for } i = 1,\ldots,6: \quad I = \text{map}(e,i), \quad s_i = \text{sign}(e,i) $$$$ \quad\quad A_{JI} \mathrel{+}= s_j\,s_i\,K^e_{ji} $$$$ \quad b_J \mathrel{+}= s_j\,f^e_j $$

十三、为什么符号 $s_i^{(e)} s_j^{(e)}$ 是正确的——严格证明

13.1 物理要求:场的切向连续性

考虑两个相邻单元 $e_1$ 和 $e_2$,共享一条全局棱边 $I$。

全局基函数 $\boldsymbol{\mathcal{N}}_I$ 必须跨单元连续(切向分量连续)。

在单元 $e_1$ 内:$\boldsymbol{\mathcal{N}}_I|_{e_1} = s_{k_1}^{(e_1)}\mathbf{N}_{k_1}^{(e_1)}$

在单元 $e_2$ 内:$\boldsymbol{\mathcal{N}}_I|_{e_2} = s_{k_2}^{(e_2)}\mathbf{N}_{k_2}^{(e_2)}$

在共享棱边 $I$ 上,两个局部基函数的切向线积分必须相等:

$$ \int_{E_I}\boldsymbol{\mathcal{N}}_I\big|_{e_1}\cdot d\mathbf{l} = \int_{E_I}\boldsymbol{\mathcal{N}}_I\big|_{e_2}\cdot d\mathbf{l} = 1 $$

13.2 验证

在单元 $e_1$ 中

$$ \int_{E_I}\boldsymbol{\mathcal{N}}_I\big|_{e_1}\cdot d\mathbf{l} = s_{k_1}^{(e_1)}\int_{E_I}\mathbf{N}_{k_1}^{(e_1)}\cdot d\mathbf{l}_{局部} $$

这里 $d\mathbf{l}_{局部}$ 是沿局部方向的线元。但全局线积分 $d\mathbf{l}$ 是沿全局方向

如果局部方向与全局方向一致($s_{k_1}^{(e_1)}=+1$):

$$ d\mathbf{l} = d\mathbf{l}_{局部}, \quad \int_{E_I}\mathbf{N}_{k_1}^{(e_1)}\cdot d\mathbf{l}_{局部} = +1 $$$$ \implies s_{k_1}^{(e_1)}\cdot(+1) = (+1)(+1) = 1 \quad \checkmark $$

如果局部方向与全局方向相反($s_{k_1}^{(e_1)}=-1$):

$$ d\mathbf{l} = -d\mathbf{l}_{局部}, \quad \int_{E_I}\mathbf{N}_{k_1}^{(e_1)}\cdot d\mathbf{l}_{局部} = +1 $$

但沿全局方向积分:

$$ \int_{E_I}\mathbf{N}_{k_1}^{(e_1)}\cdot d\mathbf{l} = \int_{E_I}\mathbf{N}_{k_1}^{(e_1)}\cdot(-d\mathbf{l}_{局部}) = -1 $$$$ \implies s_{k_1}^{(e_1)}\cdot(-1) = (-1)(-1) = 1 \quad \checkmark $$

无论哪种情况,全局基函数在棱边上的线积分都等于 1。

13.3 对全局散射场的影响

全局散射场:

$$ \mathbf{E}^{sca}_h = \sum_{I=1}^{N_E} E_I\,\boldsymbol{\mathcal{N}}_I $$

在单元 $e$ 内限制(restriction):

$$ \mathbf{E}^{sca}_h\big|_{\Omega^e} = \sum_{I \in e} E_I\,\boldsymbol{\mathcal{N}}_I\big|_{\Omega^e} = \sum_{k=1}^{6} E_{\text{map}(e,k)}\,s_k^{(e)}\,\mathbf{N}_k^{(e)} $$

定义局部自由度

$$ \boxed{ E_k^{(e,loc)} \equiv s_k^{(e)}\,E_{\text{map}(e,k)} } $$

则在单元内:

$$ \mathbf{E}^{sca}_h\big|_{\Omega^e} = \sum_{k=1}^{6} E_k^{(e,loc)}\,\mathbf{N}_k^{(e)} $$

从局部自由度恢复全局自由度:

$$ \boxed{ E_{\text{map}(e,k)} = s_k^{(e)}\,E_k^{(e,loc)} } $$

(利用了 $s_k^{(e)} \cdot s_k^{(e)} = 1$。)

13.4 符号对单元方程的影响——完整推导

单元方程在局部编号下:

$$ \sum_{i=1}^{6} K^e_{ji}\,E_i^{(e,loc)} = f^e_j, \quad j=1,\ldots,6 $$

将 $E_i^{(e,loc)} = s_i^{(e)}\,E_{\text{map}(e,i)}$ 代入:

$$ \sum_{i=1}^{6} K^e_{ji}\,s_i^{(e)}\,E_{\text{map}(e,i)} = f^e_j $$

两边乘以 $s_j^{(e)}$:

$$ \sum_{i=1}^{6} s_j^{(e)}\,K^e_{ji}\,s_i^{(e)}\,E_{\text{map}(e,i)} = s_j^{(e)}\,f^e_j $$

令 $I = \text{map}(e,i)$,$J = \text{map}(e,j)$:

$$ \sum_{I \in e} \left(s_j^{(e)}\,s_i^{(e)}\,K^e_{ji}\right)\,E_I = s_j^{(e)}\,f^e_j $$

这正是单元 $e$ 对全局方程第 $J$ 行的贡献:

十三(续):符号的严格证明

13.4 符号对单元方程的影响(续)

$$ \boxed{ A_{JI} \mathrel{+}= s_j^{(e)}\,s_i^{(e)}\,K^e_{ji}, \quad b_J \mathrel{+}= s_j^{(e)}\,f^e_j } $$

这就严格证明了组装公式中符号 $s_j s_i$ 的来源。

让我们用一个完整的矩阵语言来重新表述这个推导:

单元方程(局部编号):

$$ [K^e]\{E^{(e,loc)}\} = \{f^e\} $$

$$ \begin{pmatrix} K^e_{11} & K^e_{12} & \cdots & K^e_{16} \ K^e_{21} & K^e_{22} & \cdots & K^e_{26} \ \vdots & & \ddots & \vdots \ K^e_{61} & K^e_{62} & \cdots & K^e_{66} \end{pmatrix} \begin{pmatrix} E_1^{(e,loc)} \ E_2^{(e,loc)} \ \vdots \ E_6^{(e,loc)} \end{pmatrix}

\begin{pmatrix} f^e_1 \ f^e_2 \ \vdots \ f^e_6 \end{pmatrix} $$

定义符号矩阵:

$$ [\Sigma^{(e)}] = \text{diag}(s_1^{(e)}, s_2^{(e)}, \ldots, s_6^{(e)}) = \begin{pmatrix} s_1^{(e)} & & & \\ & s_2^{(e)} & & \\ & & \ddots & \\ & & & s_6^{(e)} \end{pmatrix} $$

局部自由度与全局自由度的关系:

$$ \{E^{(e,loc)}\} = [\Sigma^{(e)}]\{E^{(e,glob)}\} $$

其中 $\{E^{(e,glob)}\}$ 是从全局DOF向量中提取出来的、对应单元 $e$ 的6个全局自由度(按局部顺序排列):

$$ E_k^{(e,glob)} = E_{\text{map}(e,k)}, \quad k=1,\ldots,6 $$

代入单元方程:

$$ [K^e][\Sigma^{(e)}]\{E^{(e,glob)}\} = \{f^e\} $$

左乘 $[\Sigma^{(e)}]$(注意 $[\Sigma^{(e)}]^{-1} = [\Sigma^{(e)}]$,因为 $s_k^2 = 1$):

$$ [\Sigma^{(e)}][K^e][\Sigma^{(e)}]\{E^{(e,glob)}\} = [\Sigma^{(e)}]\{f^e\} $$

定义变换后的单元矩阵

$$ \boxed{ [\tilde{K}^e] = [\Sigma^{(e)}][K^e][\Sigma^{(e)}] } $$$$ \boxed{ \{\tilde{f}^e\} = [\Sigma^{(e)}]\{f^e\} } $$

展开分量:

$$ \tilde{K}^e_{ji} = s_j^{(e)}\,K^e_{ji}\,s_i^{(e)} $$$$ \tilde{f}^e_j = s_j^{(e)}\,f^e_j $$

正是组装公式!

变换后的单元方程(全局自由度):

$$ [\tilde{K}^e]\{E^{(e,glob)}\} = \{\tilde{f}^e\} $$

这个方程直接将全局自由度与变换后的单元矩阵联系起来。组装就是把这个方程散布到全局矩阵中。

13.5 完整示例:Tet 2 的符号变换

Tet 2 的符号向量为 $\{s_k^{(2)}\} = (+1, +1, +1, -1, +1, +1)$

$$ [\Sigma^{(2)}] = \text{diag}(+1, +1, +1, -1, +1, +1) $$

变换后的单元矩阵(以一个 $3\times 3$ 的子块为例,只关注涉及 $e_4$(sign=-1)的行和列):

$$ \tilde{K}^{(2)}_{4,j} = (-1)\cdot K^{(2)}_{4,j}\cdot s_j^{(2)}, \quad j=1,\ldots,6 $$$$ \tilde{K}^{(2)}_{j,4} = s_j^{(2)}\cdot K^{(2)}_{j,4}\cdot(-1), \quad j=1,\ldots,6 $$$$ \tilde{K}^{(2)}_{4,4} = (-1)\cdot K^{(2)}_{4,4}\cdot(-1) = K^{(2)}_{4,4} \quad \text{(对角元不变!)} $$$$ \tilde{K}^{(2)}_{4,1} = (-1)\cdot K^{(2)}_{4,1}\cdot(+1) = -K^{(2)}_{4,1} \quad \text{(非对角元变号!)} $$$$ \tilde{K}^{(2)}_{1,4} = (+1)\cdot K^{(2)}_{1,4}\cdot(-1) = -K^{(2)}_{1,4} \quad \text{(对称位置也变号!)} $$

写出完整的变换:

$$ [\tilde{K}^{(2)}] = \begin{pmatrix} K_{11} & K_{12} & K_{13} & -K_{14} & K_{15} & K_{16} \\ K_{21} & K_{22} & K_{23} & -K_{24} & K_{25} & K_{26} \\ K_{31} & K_{32} & K_{33} & -K_{34} & K_{35} & K_{36} \\ -K_{41} & -K_{42} & -K_{43} & K_{44} & -K_{45} & -K_{46} \\ K_{51} & K_{52} & K_{53} & -K_{54} & K_{55} & K_{56} \\ K_{61} & K_{62} & K_{63} & -K_{64} & K_{65} & K_{66} \end{pmatrix} $$

第4行和第4列全部反号(对角元除外,因为 $(-1)(-1)=+1$)。

右端项:

$$ \{\tilde{f}^{(2)}\} = (f_1, f_2, f_3, -f_4, f_5, f_6)^T $$

十四、从全局到局部再回到全局——一个 $3\times 3$ 的微型完整示例

14.1 问题设置

为了把整个过程看得清清楚楚,我构造一个最小的非平凡例子:2个三角形(2D),3条全局棱边,展示完整流程。

虽然真正的问题是3D四面体,但逻辑完全相同。这里用2D简化以便手算每一步。

         N3
         /\
        /  \
    E3 /    \ E2
      / Tri1 \
     /________\
   N1   E1    N2
     \        /
      \ Tri2 /
    E4 \    / E5
        \  /
         \/
         N4

2个三角形,5条棱边,但假设 E4, E5 在边界上已知,只有 E1, E2, E3 是未知的。

为进一步简化,假设 E4, E5 是PEC边界($E_4 = E_5 = 0$),则只需要 $3\times 3$ 系统。

三角形单元的棱边基函数类似于四面体,每个单元3条局部棱边。

14.2 连接关系

                    局部节点           全局节点
Tri 1:              n1, n2, n3     →   N1, N2, N3
Tri 2:              n1, n2, n3     →   N1, N4, N2

局部棱边定义:$e_1=(n_1,n_2)$,$e_2=(n_1,n_3)$,$e_3=(n_2,n_3)$

14.3 全局棱边表和映射

全局棱边全局节点对(小,大)Tri 1中的局部棱边Tri 2中的局部棱边
E1(N1,N2)$e_1$, sign=+1$e_3$, sign=?
E2(N1,N3)$e_2$, sign=+1
E3(N2,N3)$e_3$, sign=+1
E4(N1,N4)$e_2$, sign=+1
E5(N2,N4)$e_3$?→不,需仔细看

等等,让我重新仔细定义 Tri 2 的映射。

Tri 2:局部节点 $(n_1, n_2, n_3) = (N_1, N_4, N_2)$

局部棱边:

局部棱边局部节点对全局节点对排序后全局棱边sign
$e_1$$(n_1,n_2)=(N_1,N_4)$$(1,4)$$(1,4)$E4+1
$e_2$$(n_1,n_3)=(N_1,N_2)$$(1,2)$$(1,2)$E1+1
$e_3$$(n_2,n_3)=(N_4,N_2)$$(4,2)$$(2,4)$E5-1

Tri 2 的 $e_3$ 符号为 -1,因为局部方向 $N_4 \to N_2$ 与全局方向 $N_2 \to N_4$ 相反。

完整映射表:

              e1         e2         e3
Tri 1:    E1,+1      E2,+1      E3,+1
Tri 2:    E4,+1      E1,+1      E5,-1

14.4 第一阶段:写出连续弱形式

$$ a(\mathbf{T}, \mathbf{E}) = F(\mathbf{T}), \quad \forall\,\mathbf{T} $$

14.5 第二阶段:代入全局展开

$$ \mathbf{E}_h = E_1\boldsymbol{\mathcal{N}}_{E1} + E_2\boldsymbol{\mathcal{N}}_{E2} + E_3\boldsymbol{\mathcal{N}}_{E3} + \underbrace{E_4\boldsymbol{\mathcal{N}}_{E4} + E_5\boldsymbol{\mathcal{N}}_{E5}}_{\text{PEC边界,}E_4=E_5=0} $$$$ = E_1\boldsymbol{\mathcal{N}}_{E1} + E_2\boldsymbol{\mathcal{N}}_{E2} + E_3\boldsymbol{\mathcal{N}}_{E3} $$

取 $\mathbf{T} = \boldsymbol{\mathcal{N}}_{EJ}$,$J=1,2,3$:

$$ \sum_{I=1}^{3} A_{JI}\,E_I = b_J, \quad J = 1, 2, 3 $$

完整的 $5\times 5$ 系统(代入PEC前):

$$ \begin{pmatrix} A_{11} & A_{12} & A_{13} & A_{14} & A_{15} \ A_{21} & A_{22} & A_{23} & A_{24} & A_{25} \ A_{31} & A_{32} & A_{33} & A_{34} & A_{35} \ A_{41} & A_{42} & A_{43} & A_{44} & A_{45} \ A_{51} & A_{52} & A_{53} & A_{54} & A_{55} \end{pmatrix} \begin{pmatrix} E_1 \ E_2 \ E_3 \ E_4 \ E_5 \end{pmatrix}

\begin{pmatrix} b_1 \ b_2 \ b_3 \ b_4 \ b_5 \end{pmatrix} $$

代入PEC条件 $E_4 = 0$,$E_5 = 0$:

前3个方程变为:

$$ \sum_{I=1}^{3} A_{JI}\,E_I + A_{J4}\cdot 0 + A_{J5}\cdot 0 = b_J $$$$ \sum_{I=1}^{3} A_{JI}\,E_I = b_J, \quad J=1,2,3 $$

缩减系统:

$$ \begin{pmatrix} A_{11} & A_{12} & A_{13} \ A_{21} & A_{22} & A_{23} \ A_{31} & A_{32} & A_{33} \end{pmatrix} \begin{pmatrix} E_1 \ E_2 \ E_3 \end{pmatrix}

\begin{pmatrix} b_1 \ b_2 \ b_3 \end{pmatrix} $$

14.6 第三阶段:分解为单元积分

以 $A_{11}$ 为例:

$$ A_{11} = \int_\Omega (\nabla\times\boldsymbol{\mathcal{N}}_{E1})\cdot(\nabla\times\boldsymbol{\mathcal{N}}_{E1})\,dV - k_0^2\int_\Omega \boldsymbol{\mathcal{N}}_{E1}\cdot\bar{\bar{\varepsilon}}_r\boldsymbol{\mathcal{N}}_{E1}\,dV + \text{ABC项} $$

E1 出现在哪些单元中? Tri 1(局部 $e_1$)和 Tri 2(局部 $e_2$)。

$$ \begin{aligned} A_{11} &= \underbrace{\int_{\text{Tri1}}(\nabla\times\boldsymbol{\mathcal{N}}_{E1})\cdot(\nabla\times\boldsymbol{\mathcal{N}}_{E1})\,dV}_{\text{Tri1对}A_{11}\text{的贡献}} \\ &\quad + \underbrace{\int_{\text{Tri2}}(\nabla\times\boldsymbol{\mathcal{N}}_{E1})\cdot(\nabla\times\boldsymbol{\mathcal{N}}_{E1})\,dV}_{\text{Tri2对}A_{11}\text{的贡献}} \\ &\quad - k_0^2(\cdots) \end{aligned} $$

再看 $A_{12}$:

E1 和 E2 同时出现在哪些单元中? 只有 Tri 1。

$$ A_{12} = \int_{\text{Tri1}}(\nabla\times\boldsymbol{\mathcal{N}}_{E1})\cdot(\nabla\times\boldsymbol{\mathcal{N}}_{E2})\,dV - k_0^2\int_{\text{Tri1}}\boldsymbol{\mathcal{N}}_{E1}\cdot\bar{\bar{\varepsilon}}_r\boldsymbol{\mathcal{N}}_{E2}\,dV $$

(Tri 2 中不含 E2,所以 Tri 2 的贡献为零。)

14.7 第四阶段:代入全局-局部关系

Tri 1 中

$$ \boldsymbol{\mathcal{N}}_{E1}\big|_{\text{Tri1}} = s_1^{(1)}\mathbf{N}_1^{(1)} = (+1)\mathbf{N}_1^{(1)} = \mathbf{N}_1^{(1)} $$$$ \boldsymbol{\mathcal{N}}_{E2}\big|_{\text{Tri1}} = s_2^{(1)}\mathbf{N}_2^{(1)} = (+1)\mathbf{N}_2^{(1)} = \mathbf{N}_2^{(1)} $$$$ \boldsymbol{\mathcal{N}}_{E3}\big|_{\text{Tri1}} = s_3^{(1)}\mathbf{N}_3^{(1)} = (+1)\mathbf{N}_3^{(1)} = \mathbf{N}_3^{(1)} $$

Tri 2 中

$$ \boldsymbol{\mathcal{N}}_{E4}\big|_{\text{Tri2}} = s_1^{(2)}\mathbf{N}_1^{(2)} = (+1)\mathbf{N}_1^{(2)} = \mathbf{N}_1^{(2)} $$$$ \boldsymbol{\mathcal{N}}_{E1}\big|_{\text{Tri2}} = s_2^{(2)}\mathbf{N}_2^{(2)} = (+1)\mathbf{N}_2^{(2)} = \mathbf{N}_2^{(2)} $$$$ \boldsymbol{\mathcal{N}}_{E5}\big|_{\text{Tri2}} = s_3^{(2)}\mathbf{N}_3^{(2)} = (-1)\mathbf{N}_3^{(2)} = -\mathbf{N}_3^{(2)} $$

代入 $A_{11}$:

Tri 1 的贡献(E1 在 Tri1 中是局部 $e_1$,sign=+1):

$$ \int_{\text{Tri1}}(\nabla\times\boldsymbol{\mathcal{N}}_{E1})\cdot(\nabla\times\boldsymbol{\mathcal{N}}_{E1})\,dV = (+1)(+1)\int_{\text{Tri1}}(\nabla\times\mathbf{N}_1^{(1)})\cdot(\nabla\times\mathbf{N}_1^{(1)})\,dV = S^{(1)}_{11} $$

Tri 2 的贡献(E1 在 Tri2 中是局部 $e_2$,sign=+1):

$$ \int_{\text{Tri2}}(\nabla\times\boldsymbol{\mathcal{N}}_{E1})\cdot(\nabla\times\boldsymbol{\mathcal{N}}_{E1})\,dV = (+1)(+1)\int_{\text{Tri2}}(\nabla\times\mathbf{N}_2^{(2)})\cdot(\nabla\times\mathbf{N}_2^{(2)})\,dV = S^{(2)}_{22} $$

合计(仅旋度-旋度项):

$$ S_{E1,E1} = S^{(1)}_{11} + S^{(2)}_{22} $$

这个结果非常直观:全局棱边 E1 的"对角刚度"是它所属的所有单元中对应局部对角刚度之和。

代入 $A_{12}$(展示符号效应的关键例子):

E1 和 E2 只同时出现在 Tri 1 中。

在 Tri 1 中:E1 → 局部 $e_1$(sign=+1),E2 → 局部 $e_2$(sign=+1)

$$ A_{12}^{\text{Tri1}} = (+1)(+1)\cdot K^{(1)}_{12}= K^{(1)}_{12} $$

(因为两个符号都是+1,没有符号效应。)

14.8 一个有符号效应的例子

假设 Tri 2 的 PEC 棱边 E5 不是零,而是某个非零已知值 $g_5$。那么我们需要计算 $A_{E1, E5}$。

E1 和 E5 同时出现在 Tri 2 中:

  • E1 在 Tri 2 中是局部 $e_2$,sign=+1
  • E5 在 Tri 2 中是局部 $e_3$,sign=-1
$$ A_{E1,E5} = s_2^{(2)}\,s_3^{(2)}\,K^{(2)}_{23} = (+1)(-1)K^{(2)}_{23} = -K^{(2)}_{23} $$

符号改变了矩阵元素的正负!

如果不考虑符号(错误地写成 $+K^{(2)}_{23}$),那么PEC条件对右端项的修正:

$$ b'_{E1} = b_{E1} - A_{E1,E5}\cdot g_5 $$

就会出现错误,导致整个解不正确。

14.9 第五阶段:局部矩阵计算

这一步完全在局部编号下计算,和全局编号无关。

Tri 1 的局部矩阵 $[K^{(1)}]_{3\times 3}$:

用 Tri 1 的3个节点坐标计算 $\nabla\lambda_i$,然后:

$$ K^{(1)}_{ji} = S^{(1)}_{ji} - k_0^2 T^{(1)}_{ji} $$

Tri 2 的局部矩阵 $[K^{(2)}]_{3\times 3}$:

用 Tri 2 的3个节点坐标计算,完全独立于 Tri 1。

14.10 第六阶段:散布回全局

Tri 1 的散布(所有符号为+1):

[K^(1)] 的局部编号:       映射到全局编号:
         e1   e2   e3             E1   E2   E3
   e1 [ K11  K12  K13 ]    E1 [ K11  K12  K13 ]
   e2 [ K21  K22  K23 ] →  E2 [ K21  K22  K23 ]
   e3 [ K31  K32  K33 ]    E3 [ K31  K32  K33 ]
   
   因为所有 sign = +1,所以直接放入,无符号变化

Tri 2 的散布($e_3$ 的符号为-1):

[K^(2)] 的局部编号:       
         e1     e2     e3    
   e1 [ K11    K12    K13  ]   e1 → E4 (sign=+1)
   e2 [ K21    K22    K23  ]   e2 → E1 (sign=+1)
   e3 [ K31    K32    K33  ]   e3 → E5 (sign=-1)
   
   符号变换:Σ = diag(+1, +1, -1)
   
   [Σ][K^(2)][Σ] = 
         e1     e2     e3    
   e1 [  K11    K12   -K13  ]
   e2 [  K21    K22   -K23  ]
   e3 [ -K31   -K32    K33  ]

   散布到全局位置:
              E4      E1      E5
       E4 [  K11    K12   -K13  ]
       E1 [  K21    K22   -K23  ]
       E5 [ -K31   -K32    K33  ]

合并两个单元的贡献到全局矩阵($5\times 5$):

$$ [A]_{5\times 5} = \begin{array}{c|ccccc} & E1 & E2 & E3 & E4 & E5 \\\hline E1 & K^{(1)}_{11}+K^{(2)}_{22} & K^{(1)}_{12} & K^{(1)}_{13} & K^{(2)}_{21} & -K^{(2)}_{23} \\ E2 & K^{(1)}_{21} & K^{(1)}_{22} & K^{(1)}_{23} & 0 & 0 \\ E3 & K^{(1)}_{31} & K^{(1)}_{32} & K^{(1)}_{33} & 0 & 0 \\ E4 & K^{(2)}_{12} & 0 & 0 & K^{(2)}_{11} & -K^{(2)}_{13} \\ E5 & -K^{(2)}_{32} & 0 & 0 & -K^{(2)}_{31} & K^{(2)}_{33} \end{array} $$

观察要点:

  1. E1 的对角元 = Tri1 中 $e_1$ 的对角 + Tri2 中 $e_2$ 的对角:$K^{(1)}_{11} + K^{(2)}_{22}$
  2. E5 相关的非对角元全部带负号(因为 E5 在 Tri2 中的符号为-1)
  3. E5 的对角元不变号($(-1)(-1)=+1$)
  4. E2, E3 与 E4, E5 之间全部为零(它们不共享任何单元)

14.11 第七阶段:施加PEC条件

设 $E_4 = g_4 = 0$,$E_5 = g_5 = 0$。

修正后的 $3\times 3$ 系统:

$$ \begin{pmatrix} K^{(1)}{11}+K^{(2)}{22} & K^{(1)}{12} & K^{(1)}{13} \ K^{(1)}{21} & K^{(1)}{22} & K^{(1)}{23} \ K^{(1)}{31} & K^{(1)}{32} & K^{(1)}{33} \end{pmatrix} \begin{pmatrix} E_1 \ E_2 \ E_3 \end{pmatrix}

\begin{pmatrix} b_1 - K^{(2)}{21}\cdot 0 -(-K^{(2)}{23})\cdot 0 \ b_2 \ b_3 \end{pmatrix}

\begin{pmatrix} b_1 \ b_2 \ b_3 \end{pmatrix} $$

因为 $g_4 = g_5 = 0$,右端项没有修正。

如果 $g_5 \neq 0$(非零PEC值,例如散射场公式下 $E^{sca} = -E^{inc}$ 的切向积分):

$$ b'_1 = b_1 - A_{E1,E4}\cdot g_4 - A_{E1,E5}\cdot g_5 = b_1 - K^{(2)}_{21}\cdot g_4 + K^{(2)}_{23}\cdot g_5 $$

注意那个 $+K^{(2)}_{23}$:因为 $A_{E1,E5} = -K^{(2)}_{23}$,所以 $-A_{E1,E5}\cdot g_5 = +K^{(2)}_{23}\cdot g_5$。如果忘记符号,会得到 $-K^{(2)}_{23}\cdot g_5$,差了一个负号!


十五、回到三维四面体——完整流程的严格表述

15.1 符号约定汇总

全局基函数的支撑域与单元积分的筛选机制

——逐步严格推导


一、全局基函数的精确定义

1.1 从局部基函数构造全局基函数

全局基函数 $\boldsymbol{\mathcal{N}}_I(\mathbf{r})$ 并不是一个"一次性给出的公式",而是逐单元拼接而成的。

定义:对于全局棱边 $I$,其全局基函数 $\boldsymbol{\mathcal{N}}_I(\mathbf{r})$ 在每个单元内的表达式为:

$$ \boldsymbol{\mathcal{N}}_I(\mathbf{r})\bigg|_{\Omega^e} = \begin{cases} s_{k(I,e)}^{(e)}\,\mathbf{N}_{k(I,e)}^{(e)}(\mathbf{r}) & \text{如果棱边 } I \text{ 属于单元 } e \\[6pt] \mathbf{0} & \text{如果棱边 } I \text{ 不属于单元 } e \end{cases} $$

其中:

  • $k(I,e)$:全局棱边 $I$ 在单元 $e$ 中的局部编号($k \in \{1,2,3,4,5,6\}$)
  • $s_{k(I,e)}^{(e)}$:方向符号($\pm 1$)
  • $\mathbf{N}_{k(I,e)}^{(e)}(\mathbf{r})$:单元 $e$ 的第 $k$ 条局部棱边的局部基函数

1.2 为什么"不属于"时为零?

局部基函数 $\mathbf{N}_k^{(e)}$ 的形式为:

$$ \mathbf{N}_k^{(e)} = \lambda_{a_k}^{(e)}\nabla\lambda_{b_k}^{(e)} - \lambda_{b_k}^{(e)}\nabla\lambda_{a_k}^{(e)} $$

其中 $\lambda_p^{(e)}$ 是单元 $e$ 的第 $p$ 个节点对应的体积坐标。

关键性质:$\lambda_p^{(e)}(\mathbf{r})$ 仅在单元 $e$ 内部定义且非零,在单元 $e$ 外部无意义(或视为零)。

因此,$\mathbf{N}_k^{(e)}(\mathbf{r})$ 仅在 $\Omega^e$ 内部非零。

如果全局棱边 $I$ 不是单元 $e$ 的6条棱边之一,那么不存在任何局部基函数 $\mathbf{N}_k^{(e)}$ 与之对应,因此该单元内部该全局基函数恒为零。

全局基函数的支撑域与单元积分为零的严格论证


一、全局基函数到底是什么?

1.1 我们面对的根本问题

有限元法要求在整个计算域 $\Omega$ 上构造基函数 $\boldsymbol{\mathcal{N}}_I(\mathbf{r})$,使得场可以写成:

$$ \mathbf{E}^{sca}_h(\mathbf{r}) = \sum_{I=1}^{N_E} E_I\,\boldsymbol{\mathcal{N}}_I(\mathbf{r}), \quad \mathbf{r} \in \Omega $$

但我们从来不会直接写出全局基函数 $\boldsymbol{\mathcal{N}}_I(\mathbf{r})$ 在整个 $\Omega$ 上的表达式。相反,我们只知道局部基函数 $\mathbf{N}_k^{(e)}(\mathbf{r})$,它们定义在每个单独的单元内。

所以第一个问题是:全局基函数和局部基函数到底是什么关系?

1.2 局部基函数的定义域

单元 $e$ 有4个节点,对应4个体积坐标函数 $\lambda_1^{(e)}(\mathbf{r}), \lambda_2^{(e)}(\mathbf{r}), \lambda_3^{(e)}(\mathbf{r}), \lambda_4^{(e)}(\mathbf{r})$。

体积坐标的定义域

$$ \lambda_p^{(e)}(\mathbf{r}) \text{ 在 } \Omega^e \text{ 内满足 } 0 \leq \lambda_p^{(e)}(\mathbf{r}) \leq 1 $$$$ \lambda_p^{(e)}(\mathbf{r}) \text{ 在 } \Omega^e \text{ 的第 } p \text{ 个节点处取值 } 1,在对面的面上取值 } 0 $$

严格地说,$\lambda_p^{(e)}(\mathbf{r})$ 是一个仿射函数(线性函数加常数),在整个空间都有定义。但在单元 $e$ 外部,$\lambda_p^{(e)}(\mathbf{r})$ 可能取负值大于1的值,失去了"体积坐标"的物理意义。

在有限元中,我们只在单元 $e$ 内部使用 $\lambda_p^{(e)}$。对于全局基函数的构造,我们需要明确在单元外部如何定义

1.3 全局基函数的逐单元定义

定义:全局棱边 $I$ 对应的全局基函数 $\boldsymbol{\mathcal{N}}_I(\mathbf{r})$ 是一个在整个 $\Omega$ 上定义的矢量函数,在每个单元内分别给出

$$ \boldsymbol{\mathcal{N}}_I(\mathbf{r}) = \begin{cases} s_{k}^{(e)}\,\mathbf{N}_{k}^{(e)}(\mathbf{r}) & \text{若 } \mathbf{r} \in \Omega^e \text{ 且棱边 } I \text{ 是单元 } e \text{ 的第 } k \text{ 条局部棱边} \\[8pt] \mathbf{0} & \text{若 } \mathbf{r} \in \Omega^e \text{ 且棱边 } I \text{ 不是单元 } e \text{ 的任何一条棱边} \end{cases} $$

这个定义的含义是:

  • 对于包含棱边 $I$ 的单元:全局基函数等于(带符号的)对应局部基函数
  • 对于不包含棱边 $I$ 的单元:全局基函数恒等于零矢量

1.4 为什么在不包含棱边 $I$ 的单元内为零?

这不是一个可以推导的结论,而是全局基函数的定义方式。让我解释为什么必须这样定义

物理要求:全局基函数 $\boldsymbol{\mathcal{N}}_I$ 必须满足:

$$ \int_{E_J} \boldsymbol{\mathcal{N}}_I \cdot d\mathbf{l} = \delta_{IJ}, \quad \forall\, J = 1, \ldots, N_E $$

即:$\boldsymbol{\mathcal{N}}_I$ 沿自己对应的棱边 $E_I$ 的切向线积分为1,沿其他所有棱边的切向线积分为0。

现在考虑一条远离棱边 $I$ 的棱边 $E_J$,它与 $E_I$ 不共享任何单元

    ┌──────┐           ┌──────┐
    │ 单元a │           │ 单元c │
    │   I   │           │   J   │
    │      │           │      │
    └──────┘           └──────┘
    
    棱边 I 在单元 a,b 中       棱边 J 在单元 c,d 中
    I 和 J 没有公共单元

在棱边 $E_J$ 所在的单元(如单元 $c$)内部,$\boldsymbol{\mathcal{N}}_I$ 必须使得沿 $E_J$ 的线积分为0。最自然也最简单的方式就是让 $\boldsymbol{\mathcal{N}}_I$ 在这些单元内恒为零。

更深层的原因:棱边有限元的"局部性"。每个局部基函数 $\mathbf{N}_k^{(e)}$ 只和单元 $e$ 的节点/棱边关联。如果棱边 $I$ 不是单元 $e$ 的棱边,那么单元 $e$ 的6个局部基函数中没有一个和棱边 $I$ 有关。因此不存在任何局部基函数可以"代表" $\boldsymbol{\mathcal{N}}_I$ 在 $\Omega^e$ 内的行为,只能令其为零。

1.5 支撑域(Support)的概念

定义:全局基函数 $\boldsymbol{\mathcal{N}}_I$ 的支撑域(support)是使 $\boldsymbol{\mathcal{N}}_I(\mathbf{r}) \neq \mathbf{0}$ 的区域的闭包:

$$ \text{supp}(\boldsymbol{\mathcal{N}}_I) = \overline{\{\mathbf{r} \in \Omega : \boldsymbol{\mathcal{N}}_I(\mathbf{r}) \neq \mathbf{0}\}} $$

由上面的定义:

$$ \boxed{ \text{supp}(\boldsymbol{\mathcal{N}}_I) = \bigcup_{\substack{e:\\\text{棱边 }I\text{ 属于单元 }e}} \overline{\Omega^e} } $$

即,支撑域恰好是包含棱边 $I$ 的所有单元的并集

图示

棱边 I 被 3 个四面体共享:

         ╱╲
        ╱  ╲
       ╱ e₂ ╲
      ╱______╲
     ╱╲  I   ╱╲
    ╱  ╲    ╱  ╲
   ╱ e₁ ╲  ╱ e₃ ╲
  ╱______╲╱______╲

supp(N_I) = Ω^{e₁} ∪ Ω^{e₂} ∪ Ω^{e₃}

在 Ω^{e₁}, Ω^{e₂}, Ω^{e₃} 内:N_I ≠ 0(一般地)
在所有其他单元内:N_I ≡ 0

二、全域积分分解为单元积分——严格推导

2.1 积分的分解

计算域 $\Omega$ 被分割为 $M$ 个不重叠的四面体单元:

$$ \Omega = \Omega^1 \cup \Omega^2 \cup \cdots \cup \Omega^M $$$$ \Omega^{e_1} \cap \Omega^{e_2} = \emptyset \text{ 或者是低维集(公共面/棱/点)}, \quad e_1 \neq e_2 $$

对于任何在 $\Omega$ 上可积的函数 $g(\mathbf{r})$:

$$ \int_\Omega g(\mathbf{r})\,dV = \sum_{e=1}^{M}\int_{\Omega^e} g(\mathbf{r})\,dV $$

这是因为低维集(面、棱、点)的三维测度(体积)为零,对积分无贡献。

2.2 应用于刚度矩阵 $S_{JI}$

$$ S_{JI} = \int_\Omega (\nabla\times\boldsymbol{\mathcal{N}}_J(\mathbf{r}))\cdot(\nabla\times\boldsymbol{\mathcal{N}}_I(\mathbf{r}))\,dV $$

将全域积分分解为单元积分:

$$ S_{JI} = \sum_{e=1}^{M}\int_{\Omega^e} (\nabla\times\boldsymbol{\mathcal{N}}_J(\mathbf{r}))\cdot(\nabla\times\boldsymbol{\mathcal{N}}_I(\mathbf{r}))\,dV $$$$ \begin{aligned} &= \int_{\Omega^1} (\nabla\times\boldsymbol{\mathcal{N}}_J)\cdot(\nabla\times\boldsymbol{\mathcal{N}}_I)\,dV \\ &\quad + \int_{\Omega^2} (\nabla\times\boldsymbol{\mathcal{N}}_J)\cdot(\nabla\times\boldsymbol{\mathcal{N}}_I)\,dV \\ &\quad + \cdots \\ &\quad + \int_{\Omega^M} (\nabla\times\boldsymbol{\mathcal{N}}_J)\cdot(\nabla\times\boldsymbol{\mathcal{N}}_I)\,dV \end{aligned} $$

到这里,这只是一个恒等式,没有任何近似。 共有 $M$ 项求和。

2.3 逐项分析:每个单元积分是否为零?

现在逐一检查每个单元 $e$ 的积分:

$$ \mathcal{I}^{(e)}_{JI} \equiv \int_{\Omega^e} (\nabla\times\boldsymbol{\mathcal{N}}_J)\cdot(\nabla\times\boldsymbol{\mathcal{N}}_I)\,dV $$

情况一:棱边 $I$ 不属于单元 $e$

由全局基函数的定义(§1.3):

$$ \boldsymbol{\mathcal{N}}_I(\mathbf{r}) = \mathbf{0}, \quad \forall\,\mathbf{r} \in \Omega^e $$

因此:

$$ \nabla\times\boldsymbol{\mathcal{N}}_I(\mathbf{r}) = \nabla\times\mathbf{0} = \mathbf{0}, \quad \forall\,\mathbf{r} \in \Omega^e $$

所以被积函数:

$$ (\nabla\times\boldsymbol{\mathcal{N}}_J(\mathbf{r}))\cdot\underbrace{(\nabla\times\boldsymbol{\mathcal{N}}_I(\mathbf{r}))}_{=\,\mathbf{0}} = \mathbf{0} $$

积分结果:

$$ \mathcal{I}^{(e)}_{JI} = \int_{\Omega^e} \mathbf{0}\,dV = 0 $$

情况二:棱边 $J$ 不属于单元 $e$(但 $I$ 属于)

类似地:

$$ \boldsymbol{\mathcal{N}}_J(\mathbf{r}) = \mathbf{0}, \quad \forall\,\mathbf{r} \in \Omega^e $$$$ \nabla\times\boldsymbol{\mathcal{N}}_J(\mathbf{r}) = \mathbf{0}, \quad \forall\,\mathbf{r} \in \Omega^e $$$$ \underbrace{(\nabla\times\boldsymbol{\mathcal{N}}_J(\mathbf{r}))}_{=\,\mathbf{0}}\cdot(\nabla\times\boldsymbol{\mathcal{N}}_I(\mathbf{r})) = 0 $$$$ \mathcal{I}^{(e)}_{JI} = 0 $$

情况三:棱边 $I$ 和棱边 $J$ 都不属于单元 $e$

更加显然为零(两个因子都是零矢量)。

情况四:棱边 $I$ 和棱边 $J$ 都属于单元 $e$

设棱边 $I$ 在单元 $e$ 中是第 $i$ 条局部棱边,棱边 $J$ 在单元 $e$ 中是第 $j$ 条局部棱边。

$$ \boldsymbol{\mathcal{N}}_I(\mathbf{r})\big|_{\Omega^e} = s_i^{(e)}\,\mathbf{N}_i^{(e)}(\mathbf{r}) \neq \mathbf{0} \quad \text{(一般地)} $$$$ \boldsymbol{\mathcal{N}}_J(\mathbf{r})\big|_{\Omega^e} = s_j^{(e)}\,\mathbf{N}_j^{(e)}(\mathbf{r}) \neq \mathbf{0} \quad \text{(一般地)} $$

被积函数:

$$ (\nabla\times\boldsymbol{\mathcal{N}}_J)\cdot(\nabla\times\boldsymbol{\mathcal{N}}_I)\bigg|_{\Omega^e} = \left(s_j^{(e)}\nabla\times\mathbf{N}_j^{(e)}\right)\cdot\left(s_i^{(e)}\nabla\times\mathbf{N}_i^{(e)}\right) $$$$ = s_j^{(e)}\,s_i^{(e)}\,(\nabla\times\mathbf{N}_j^{(e)})\cdot(\nabla\times\mathbf{N}_i^{(e)}) $$

一般不为零

积分结果:

$$ \mathcal{I}^{(e)}_{JI} = s_j^{(e)}\,s_i^{(e)}\int_{\Omega^e}(\nabla\times\mathbf{N}_j^{(e)})\cdot(\nabla\times\mathbf{N}_i^{(e)})\,dV = s_j^{(e)}\,s_i^{(e)}\,S^e_{ji} $$

2.4 四种情况的汇总

$$ \mathcal{I}^{(e)}_{JI} = \int_{\Omega^e}(\nabla\times\boldsymbol{\mathcal{N}}_J)\cdot(\nabla\times\boldsymbol{\mathcal{N}}_I)\,dV = \begin{cases} s_j^{(e)}\,s_i^{(e)}\,S^e_{ji} & \text{若 } I \in e \text{ 且 } J \in e \\[6pt] 0 & \text{若 } I \notin e \text{ 或 } J \notin e \end{cases} $$

这里 “$I \in e$” 是 “$I$ 是单元 $e$ 的6条棱边之一” 的简写。

2.5 代回全域积分

$$ S_{JI} = \sum_{e=1}^{M}\mathcal{I}^{(e)}_{JI} $$

在 $M$ 项求和中,只有满足 “$I \in e$ 且 $J \in e$” 的那些单元 $e$ 才有非零贡献。其余的项全部是零,可以跳过。

因此:

$$ \boxed{ S_{JI} = \sum_{\substack{e=1\\I \in e \text{ and } J \in e}}^{M} s_i^{(e)}\,s_j^{(e)}\,S^e_{ji} } $$

这个求和只遍历同时包含棱边 $I$ 和棱边 $J$ 的单元。

2.6 几何意义

两条全局棱边 $I$ 和 $J$ 同时属于某个单元 $e$,意味着 $I$ 和 $J$ 在网格中是"邻近的"——它们至少共享一个单元。

情况A:I 和 J 在同一个四面体中
        
         ╱╲
        ╱  ╲
       ╱    ╲
      ╱  I   ╲    I 和 J 是同一个四面体的两条棱
     ╱________╲   → 存在公共单元 → S_{JI} ≠ 0(一般地)
      J
      
情况B:I 和 J 没有公共单元

    ┌──────┐       ┌──────┐
    │  I   │       │  J   │
    │      │  ...  │      │
    └──────┘       └──────┘
    
    → 没有任何单元同时包含 I 和 J → S_{JI} = 0

这就是全局矩阵稀疏性的根本原因!


三、对质量矩阵 $T_{JI}$ 的完全相同的论证

3.1 全域积分

$$ T_{JI} = \int_\Omega \boldsymbol{\mathcal{N}}_J(\mathbf{r})\cdot\bar{\bar{\varepsilon}}_r(\mathbf{r})\,\boldsymbol{\mathcal{N}}_I(\mathbf{r})\,dV $$

3.2 分解为单元积分

$$ T_{JI} = \sum_{e=1}^{M}\int_{\Omega^e}\boldsymbol{\mathcal{N}}_J\cdot\bar{\bar{\varepsilon}}_r^{(e)}\,\boldsymbol{\mathcal{N}}_I\,dV $$

注意 $\bar{\bar{\varepsilon}}_r(\mathbf{r})$ 在每个单元内可能取不同的常张量 $\bar{\bar{\varepsilon}}_r^{(e)}$,但这不影响零/非零的判断。

3.3 逐项分析

若 $I \notin e$

$$ \boldsymbol{\mathcal{N}}_I(\mathbf{r}) = \mathbf{0} \quad \text{在 } \Omega^e \text{ 内} $$$$ \bar{\bar{\varepsilon}}_r^{(e)}\,\boldsymbol{\mathcal{N}}_I(\mathbf{r}) = \bar{\bar{\varepsilon}}_r^{(e)}\,\mathbf{0} = \mathbf{0} $$$$ \boldsymbol{\mathcal{N}}_J\cdot\underbrace{\bar{\bar{\varepsilon}}_r^{(e)}\,\boldsymbol{\mathcal{N}}_I}_{=\,\mathbf{0}} = 0 $$$$ \int_{\Omega^e}(\cdots)\,dV = 0 $$

若 $J \notin e$(但 $I \in e$):

$$ \boldsymbol{\mathcal{N}}_J(\mathbf{r}) = \mathbf{0} \quad \text{在 } \Omega^e \text{ 内} $$$$ \underbrace{\boldsymbol{\mathcal{N}}_J}_{=\,\mathbf{0}}\cdot\bar{\bar{\varepsilon}}_r^{(e)}\,\boldsymbol{\mathcal{N}}_I = 0 $$$$ \int_{\Omega^e}(\cdots)\,dV = 0 $$

注意这里即使 $\bar{\bar{\varepsilon}}_r^{(e)}\,\boldsymbol{\mathcal{N}}_I \neq \mathbf{0}$,但乘以零矢量 $\boldsymbol{\mathcal{N}}_J = \mathbf{0}$ 后仍为零。各向异性张量不改变"零或非零"的结论。

若 $I \in e$ 且 $J \in e$

$$ \boldsymbol{\mathcal{N}}_I\big|_{\Omega^e} = s_i^{(e)}\,\mathbf{N}_i^{(e)}, \quad \boldsymbol{\mathcal{N}}_J\big|_{\Omega^e} = s_j^{(e)}\,\mathbf{N}_j^{(e)} $$$$ \int_{\Omega^e}\boldsymbol{\mathcal{N}}_J\cdot\bar{\bar{\varepsilon}}_r^{(e)}\,\boldsymbol{\mathcal{N}}_I\,dV = s_j^{(e)}\,s_i^{(e)}\int_{\Omega^e}\mathbf{N}_j^{(e)}\cdot\bar{\bar{\varepsilon}}_r^{(e)}\,\mathbf{N}_i^{(e)}\,dV = s_j^{(e)}\,s_i^{(e)}\,T^e_{ji} $$

3.4 最终结果

$$ \boxed{ T_{JI} = \sum_{\substack{e=1\\I \in e \text{ and } J \in e}}^{M} s_i^{(e)}\,s_j^{(e)}\,T^e_{ji} } $$

与刚度矩阵完全相同的筛选机制


四、对ABC面矩阵 $B_{JI}$ 的论证

4.1 全域面积分

$$ B_{JI} = \oint_{S_{ABC}}(\hat{n}\times\boldsymbol{\mathcal{N}}_J)\cdot(\hat{n}\times\boldsymbol{\mathcal{N}}_I)\,dS $$

4.2 分解为面元积分

ABC面由 $M_f$ 个三角形面元构成:

$$ B_{JI} = \sum_{f=1}^{M_f}\int_{\Delta^f}(\hat{n}\times\boldsymbol{\mathcal{N}}_J)\cdot(\hat{n}\times\boldsymbol{\mathcal{N}}_I)\,dS $$

每个面元 $\Delta^f$ 属于某个四面体(母单元)$e(f)$。面元 $\Delta^f$ 有3条棱边(面上的棱边),它们是母单元 $e(f)$ 的6条棱边中的3条。

4.3 逐项分析——比体积积分更严格的筛选

在面元 $\Delta^f$ 上,全局基函数 $\boldsymbol{\mathcal{N}}_I$ 为零的条件更强。

不仅要求 $I$ 属于母单元 $e(f)$,还要求 $I$ 是面 $\Delta^f$ 上的棱边(而不是母单元中不在该面上的棱边)。

为什么?

面元 $\Delta^f$ 由母单元的3个节点定义,第4个节点 $n_s$ 不在面上。在面上,$\lambda_s^{(e)} = 0$。

局部棱边如果包含节点 $n_s$(即棱边的一个端点是 $n_s$),那么:

$$ \mathbf{N}_k^{(e)} = \lambda_{a_k}\nabla\lambda_{b_k} - \lambda_{b_k}\nabla\lambda_{a_k} $$

其中 $a_k$ 或 $b_k$ 等于 $s$。在面上($\lambda_s = 0$),基函数 $\mathbf{N}_k^{(e)}$ 简化为只有一项(另一项含 $\lambda_s = 0$ 而消失)。

但更关键的是 $\hat{n}\times\mathbf{N}_k^{(e)}$ 在面上的值:

结论:对于包含对面节点 $n_s$ 的棱边,$\hat{n}\times\mathbf{N}_k^{(e)}\big|_{\Delta^f} = \mathbf{0}$。

这意味着面积分中又多了一层筛选:

$$ \int_{\Delta^f}(\hat{n}\times\boldsymbol{\mathcal{N}}_J)\cdot(\hat{n}\times\boldsymbol{\mathcal{N}}_I)\,dS \neq 0 $$

仅当 $I$ 和 $J$ 都是面 $\Delta^f$ 上的3条棱边之一时

因此每个面元只有 $3\times 3 = 9$ 个非零贡献(而非 $6\times 6$)。

4.4 最终结果

$$ \boxed{ B_{JI} = \sum_{\substack{f=1\\I \in \Delta^f \text{ and } J \in \Delta^f}}^{M_f} s_\alpha^{(e(f))}\,s_\beta^{(e(f))}\,\tilde{B}^f_{\beta\alpha} } $$

五、对右端项 $b_J$ 的论证

5.1 全域积分

$$ b_J = k_0^2\int_{\Omega_d}\boldsymbol{\mathcal{N}}_J(\mathbf{r})\cdot\left(\bar{\bar{\varepsilon}}_r(\mathbf{r})-\bar{\bar{I}}\right)\mathbf{E}^{inc}(\mathbf{r})\,dV $$

5.2 分解为单元积分

$$ b_J = k_0^2\sum_{e=1}^{M}\int_{\Omega^e}\boldsymbol{\mathcal{N}}_J\cdot(\bar{\bar{\varepsilon}}_r^{(e)}-\bar{\bar{I}})\mathbf{E}^{inc}\,dV $$

5.3 逐项分析

若 $J \notin e$

$$ \boldsymbol{\mathcal{N}}_J(\mathbf{r}) = \mathbf{0} \quad \text{在 } \Omega^e \text{ 内} $$$$ \underbrace{\boldsymbol{\mathcal{N}}_J}_{=\,\mathbf{0}}\cdot(\bar{\bar{\varepsilon}}_r^{(e)}-\bar{\bar{I}})\mathbf{E}^{inc} = 0 $$

即使 $(\bar{\bar{\varepsilon}}_r^{(e)}-\bar{\bar{I}})\mathbf{E}^{inc}$ 非零(介质单元内),零矢量与之点积仍为零。

五(续):右端项 $b_J$ 的论证

5.3 逐项分析(续)

若 $J \notin e$

$$ \underbrace{\boldsymbol{\mathcal{N}}_J(\mathbf{r})}_{=\,\mathbf{0}}\cdot(\bar{\bar{\varepsilon}}_r^{(e)}-\bar{\bar{I}})\mathbf{E}^{inc}(\mathbf{r}) = 0, \quad \forall\,\mathbf{r} \in \Omega^e $$

即使 $(\bar{\bar{\varepsilon}}_r^{(e)}-\bar{\bar{I}})\mathbf{E}^{inc}$ 非零(介质单元内),零矢量与任何矢量的点积仍为零。

$$ \int_{\Omega^e}\boldsymbol{\mathcal{N}}_J\cdot(\bar{\bar{\varepsilon}}_r^{(e)}-\bar{\bar{I}})\mathbf{E}^{inc}\,dV = 0 $$

若 $J \in e$,但 $e \not\subset \Omega_d$(自由空间单元):

$$ \bar{\bar{\varepsilon}}_r^{(e)} = \bar{\bar{I}} \implies \bar{\bar{\varepsilon}}_r^{(e)}-\bar{\bar{I}} = \bar{\bar{0}} $$$$ \boldsymbol{\mathcal{N}}_J\cdot\underbrace{(\bar{\bar{\varepsilon}}_r^{(e)}-\bar{\bar{I}})}_{=\,\bar{\bar{0}}}\mathbf{E}^{inc} = \boldsymbol{\mathcal{N}}_J\cdot\mathbf{0} = 0 $$$$ \int_{\Omega^e}(\cdots)\,dV = 0 $$

注意:这里零的原因与前一种情况不同。前一种是基函数为零,这一种是材料差异为零。

若 $J \in e$,且 $e \subset \Omega_d$(介质单元):

两个因素都非零:

$$ \boldsymbol{\mathcal{N}}_J\big|_{\Omega^e} = s_j^{(e)}\,\mathbf{N}_j^{(e)} \neq \mathbf{0} \quad \text{(一般地)} $$$$ (\bar{\bar{\varepsilon}}_r^{(e)}-\bar{\bar{I}})\mathbf{E}^{inc} \neq \mathbf{0} \quad \text{(各向异性介质中)} $$

积分结果:

$$ \int_{\Omega^e}\boldsymbol{\mathcal{N}}_J\cdot(\bar{\bar{\varepsilon}}_r^{(e)}-\bar{\bar{I}})\mathbf{E}^{inc}\,dV = s_j^{(e)}\int_{\Omega^e}\mathbf{N}_j^{(e)}\cdot(\bar{\bar{\varepsilon}}_r^{(e)}-\bar{\bar{I}})\mathbf{E}^{inc}\,dV $$$$ = s_j^{(e)}\,\frac{f_j^e}{k_0^2} $$

5.4 汇总三种情况

$$ \int_{\Omega^e}\boldsymbol{\mathcal{N}}_J\cdot(\bar{\bar{\varepsilon}}_r^{(e)}-\bar{\bar{I}})\mathbf{E}^{inc}\,dV = \begin{cases} 0 & \text{若 } J \notin e \text{(基函数为零)}\\[6pt] 0 & \text{若 } J \in e \text{ 但 } e \not\subset \Omega_d \text{(材料差异为零)}\\[6pt] s_j^{(e)}\,\frac{f_j^e}{k_0^2} & \text{若 } J \in e \text{ 且 } e \subset \Omega_d \text{(两者都非零)} \end{cases} $$

5.5 最终结果

$$ b_J = k_0^2\sum_{e=1}^{M}\int_{\Omega^e}\boldsymbol{\mathcal{N}}_J\cdot(\bar{\bar{\varepsilon}}_r^{(e)}-\bar{\bar{I}})\mathbf{E}^{inc}\,dV $$

经过筛选后:

$$ \boxed{ b_J = \sum_{\substack{e=1\\J \in e \text{ and } e \subset \Omega_d}}^{M} s_j^{(e)}\,f_j^e } $$

注意:右端项需要通过两重筛选——棱边 $J$ 必须属于单元 $e$,且单元 $e$ 必须是介质单元。这与矩阵元素只需通过一重筛选不同。


六、全局矩阵 $A_{JI}$ 的完整表达——所有项汇总

6.1 将三个矩阵的筛选结果合并

$$ A_{JI} = S_{JI} - k_0^2 T_{JI} - jk_0 B_{JI} $$

逐项代入:

$$ \begin{aligned} A_{JI} &= \sum_{\substack{e:\\I\in e,\,J\in e}} s_i^{(e)}s_j^{(e)}S^e_{ji} \\ &\quad - k_0^2\sum_{\substack{e:\\I\in e,\,J\in e}} s_i^{(e)}s_j^{(e)}T^e_{ji} \\ &\quad - jk_0\sum_{\substack{f:\\I\in f,\,J\in f}} s_\alpha^{(e(f))}s_\beta^{(e(f))}\tilde{B}^f_{\beta\alpha} \end{aligned} $$

前两项的求和范围完全相同(同时包含 $I$ 和 $J$ 的单元),可以合并:

$$ \boxed{ \begin{aligned} A_{JI} &= \sum_{\substack{e:\\I\in e,\,J\in e}} s_i^{(e)}s_j^{(e)} \underbrace{\left(S^e_{ji} - k_0^2 T^e_{ji}\right)}_{K^e_{ji}} \\ &\quad - jk_0\sum_{\substack{f:\\I\in f,\,J\in f}} s_\alpha^{(e(f))}s_\beta^{(e(f))}\tilde{B}^f_{\beta\alpha} \end{aligned} } $$

6.2 求和范围的精确定义

为了绝对清晰,让我精确定义每个求和的范围:

体积项的求和范围

$$ \mathcal{E}(I,J) \equiv \{e \in \{1,\ldots,M\} : I \in \text{edges}(e) \text{ and } J \in \text{edges}(e)\} $$

其中 $\text{edges}(e) = \{I_1^{(e)}, I_2^{(e)}, I_3^{(e)}, I_4^{(e)}, I_5^{(e)}, I_6^{(e)}\}$ 是单元 $e$ 的6条全局棱边的集合。

$$ \text{体积贡献} = \sum_{e \in \mathcal{E}(I,J)} s_{i(I,e)}^{(e)}\,s_{j(J,e)}^{(e)}\,K^e_{j(J,e),\,i(I,e)} $$

面积分项的求和范围

$$ \mathcal{F}(I,J) \equiv \{f \in \{1,\ldots,M_f\} : I \in \text{edges}(\Delta^f) \text{ and } J \in \text{edges}(\Delta^f)\} $$

其中 $\text{edges}(\Delta^f)$ 是面元 $\Delta^f$ 的3条棱边的集合。

注意 $\mathcal{F}(I,J) \subseteq \mathcal{E}(I,J)$ 的"面版本",筛选更严格(3条而非6条)。

$$ \text{面贡献} = -jk_0\sum_{f \in \mathcal{F}(I,J)} s_{\alpha(I,f)}^{(e(f))}\,s_{\beta(J,f)}^{(e(f))}\,\tilde{B}^f_{\beta(J,f),\,\alpha(I,f)} $$

右端项的求和范围

$$ \mathcal{E}_d(J) \equiv \{e \in \{1,\ldots,M\} : J \in \text{edges}(e) \text{ and } e \subset \Omega_d\} $$$$ b_J = \sum_{e \in \mathcal{E}_d(J)} s_{j(J,e)}^{(e)}\,f_{j(J,e)}^e $$

6.3 求和范围的大小——稀疏性的量化

对于一个典型的内部棱边 $I$:

  • 在三维四面体网格中,一条棱边平均被约 5-7个 四面体共享
  • 因此 $|\text{supp}(\boldsymbol{\mathcal{N}}_I)| \approx$ 5-7个单元
  • 每个单元有6条棱边,所以棱边 $I$ 通过共享单元与约 $6 \times 6 = 36$ 条棱边(含重复)有耦合
  • 去重后约 15-20条 不同的全局棱边

因此全局矩阵 $[A]$ 的第 $I$ 行约有 15-20个 非零元素,而总的列数为 $N_E$(可能是几万到几十万)。

稀疏率

$$ \text{稀疏率} \approx \frac{15\text{-}20}{N_E} \ll 1 $$

七、从"按全局行列扫描"到"按单元散布"的等价性

7.1 按全局行列扫描(概念上的方法)

概念上,我们可以这样计算全局矩阵:

对每个全局行 J = 1, ..., N_E:
    对每个全局列 I = 1, ..., N_E:
        A[J,I] = 0
        对每个单元 e = 1, ..., M:
            如果 I ∈ edges(e) 且 J ∈ edges(e):
                i = local_edge_number(I, e)
                j = local_edge_number(J, e)
                A[J,I] += sign(e,j) * sign(e,i) * K^e[j,i]

复杂度:$O(N_E^2 \times M)$——极其低效!

7.2 按单元散布(实际使用的方法)

初始化 A[J,I] = 0 对所有 J, I

对每个单元 e = 1, ..., M:
    计算局部矩阵 K^e(6×6)
    对 j = 1, ..., 6:
        J = map(e, j)
        对 i = 1, ..., 6:
            I = map(e, i)
            A[J, I] += sign(e,j) * sign(e,i) * K^e[j,i]

复杂度:$O(M \times 36) = O(36M)$——高效!

7.3 严格证明两种方法等价

命题:两种方法对每个 $A_{JI}$ 给出相同的结果。

证明

方法一给出:

$$ A_{JI}^{(\text{方法一})} = \sum_{\substack{e=1\\I\in e,\,J\in e}}^{M} s_{i(I,e)}^{(e)}\,s_{j(J,e)}^{(e)}\,K^e_{j(J,e),\,i(I,e)} $$

方法二给出的总贡献为:

$$ A_{JI}^{(\text{方法二})} = \sum_{e=1}^{M}\sum_{j=1}^{6}\sum_{i=1}^{6} s_j^{(e)}\,s_i^{(e)}\,K^e_{ji}\;\underbrace{\delta_{J,\text{map}(e,j)}}_{\text{选出 }j=j(J,e)}\;\underbrace{\delta_{I,\text{map}(e,i)}}_{\text{选出 }i=i(I,e)} $$

分析 $\delta$ 函数的作用

$\delta_{J,\text{map}(e,j)} = 1$ 当且仅当 $\text{map}(e,j) = J$,即全局棱边 $J$ 在单元 $e$ 中的局部编号为 $j$。

  • 如果 $J \notin \text{edges}(e)$,则不存在任何 $j$ 使得 $\text{map}(e,j) = J$,所以对所有 $j$ 都有 $\delta_{J,\text{map}(e,j)} = 0$。整个 $\sum_j$ 为零。
  • 如果 $J \in \text{edges}(e)$,则恰好存在一个 $j = j(J,e)$ 使得 $\delta_{J,\text{map}(e,j)} = 1$,其余 $j$ 对应的 $\delta = 0$。

同理对 $\delta_{I,\text{map}(e,i)}$。

因此,当 $J \in e$ 且 $I \in e$ 时,双重求和 $\sum_j\sum_i$ 中只有恰好一项非零:$j = j(J,e)$,$i = i(I,e)$。

$$ \sum_{j=1}^{6}\sum_{i=1}^{6} (\cdots) = s_{j(J,e)}^{(e)}\,s_{i(I,e)}^{(e)}\,K^e_{j(J,e),\,i(I,e)} $$

当 $J \notin e$ 或 $I \notin e$ 时,整个双重求和为零。

对 $e$ 再求和:

$$ A_{JI}^{(\text{方法二})} = \sum_{\substack{e=1\\I\in e,\,J\in e}}^{M} s_{j(J,e)}^{(e)}\,s_{i(I,e)}^{(e)}\,K^e_{j(J,e),\,i(I,e)} $$

这与方法一完全相同。 $\blacksquare$


八、全局散射场在单元内的限制——从全局DOF到局部DOF

8.1 全局展开在单元 $e$ 内部的表达

全局散射场:

$$ \mathbf{E}^{sca}_h(\mathbf{r}) = \sum_{I=1}^{N_E} E_I\,\boldsymbol{\mathcal{N}}_I(\mathbf{r}) $$

限制在单元 $\Omega^e$ 内:

$$ \mathbf{E}^{sca}_h(\mathbf{r})\bigg|_{\Omega^e} = \sum_{I=1}^{N_E} E_I\,\boldsymbol{\mathcal{N}}_I(\mathbf{r})\bigg|_{\Omega^e} $$

由 §1.3 的定义,$\boldsymbol{\mathcal{N}}_I|_{\Omega^e} = \mathbf{0}$ 若 $I \notin e$,所以求和中 $N_E$ 项里只有6项非零:

$$ = \sum_{\substack{I=1\\I \in e}}^{N_E} E_I\,\boldsymbol{\mathcal{N}}_I(\mathbf{r})\bigg|_{\Omega^e} $$

单元 $e$ 恰好有6条全局棱边 $I_1^{(e)}, \ldots, I_6^{(e)}$,对应局部棱边 $1, \ldots, 6$:

$$ = \sum_{k=1}^{6} E_{I_k^{(e)}}\,\boldsymbol{\mathcal{N}}_{I_k^{(e)}}(\mathbf{r})\bigg|_{\Omega^e} $$

代入 $\boldsymbol{\mathcal{N}}_{I_k^{(e)}}|_{\Omega^e} = s_k^{(e)}\,\mathbf{N}_k^{(e)}$:

$$ = \sum_{k=1}^{6} E_{I_k^{(e)}}\,s_k^{(e)}\,\mathbf{N}_k^{(e)}(\mathbf{r}) $$

用映射记号 $\text{map}(e,k) = I_k^{(e)}$ 简写:

$$ = \sum_{k=1}^{6} \underbrace{s_k^{(e)}\,E_{\text{map}(e,k)}}_{E_k^{(e,loc)}}\,\mathbf{N}_k^{(e)}(\mathbf{r}) $$$$ \boxed{ \mathbf{E}^{sca}_h(\mathbf{r})\bigg|_{\Omega^e} = \sum_{k=1}^{6} E_k^{(e,loc)}\,\mathbf{N}_k^{(e)}(\mathbf{r}) } $$

其中局部自由度为:

$$ \boxed{ E_k^{(e,loc)} = s_k^{(e)}\,E_{\text{map}(e,k)}, \quad k = 1, \ldots, 6 } $$

8.2 写成矩阵形式

定义6维局部自由度向量和对应的全局自由度提取向量:

$$ {E^{(e,loc)}} = \begin{pmatrix} E_1^{(e,loc)} \ E_2^{(e,loc)} \ \vdots \ E_6^{(e,loc)} \end{pmatrix}

\begin{pmatrix} s_1^{(e)},E_{\text{map}(e,1)} \ s_2^{(e)},E_{\text{map}(e,2)} \ \vdots \ s_6^{(e)},E_{\text{map}(e,6)} \end{pmatrix} = [\Sigma^{(e)}]{E^{(e,glob)}} $$

其中:

$$ [\Sigma^{(e)}] = \text{diag}(s_1^{(e)}, s_2^{(e)}, \ldots, s_6^{(e)}) $$$$ \{E^{(e,glob)}\} = \begin{pmatrix} E_{\text{map}(e,1)} \\ E_{\text{map}(e,2)} \\ \vdots \\ E_{\text{map}(e,6)} \end{pmatrix} = \text{从全局向量 } \{E\}_{N_E\times 1} \text{ 中按 map}(e,\cdot) \text{ 提取的6个元素} $$

8.3 提取操作的矩阵表达

定义布尔提取矩阵 $[L^{(e)}]_{6\times N_E}$:

$$ L^{(e)}_{k,I} = \begin{cases} 1 & \text{if } I = \text{map}(e,k) \\ 0 & \text{otherwise} \end{cases} $$

每行恰好有一个 1。

$$ \{E^{(e,glob)}\}_{6\times 1} = [L^{(e)}]_{6\times N_E}\{E\}_{N_E\times 1} $$$$ \{E^{(e,loc)}\}_{6\times 1} = [\Sigma^{(e)}]_{6\times 6}[L^{(e)}]_{6\times N_E}\{E\}_{N_E\times 1} $$

合并为一个矩阵:

$$ \{E^{(e,loc)}\} = [\underbrace{\Sigma^{(e)}L^{(e)}}_{P^{(e)}}]\{E\} $$

其中 $[P^{(e)}]_{6\times N_E}$ 是带符号的提取矩阵

$$ P^{(e)}_{k,I} = \begin{cases} s_k^{(e)} & \text{if } I = \text{map}(e,k) \\ 0 & \text{otherwise} \end{cases} $$

**从局部回到全局(散布操作)**的矩阵就是 $[P^{(e)}]^T$:

$$ [P^{(e)}]^T_{I,k} = P^{(e)}_{k,I} = \begin{cases} s_k^{(e)} & \text{if } I = \text{map}(e,k) \\ 0 & \text{otherwise} \end{cases} $$

注意 $[P^{(e)}]^T$ 的维度是 $N_E \times 6$,与之前定义的关联矩阵 $[C^{(e)}]$ 完全相同:

$$ [P^{(e)}]^T = [C^{(e)}] $$

8.4 全局矩阵的优雅矩阵表达

单元方程(局部编号)

$$ [K^e]\{E^{(e,loc)}\} = \{f^e\} $$

代入 $\{E^{(e,loc)}\} = [P^{(e)}]\{E\}$:

$$ [K^e][P^{(e)}]\{E\} = \{f^e\} $$

左乘 $[P^{(e)}]^T$,注意这不是"两边同乘"的等式推导,而是加权残量法的组装操作——每个单元方程乘以 $[P^{(e)}]^T$ 后累加到全局方程:

$$ [P^{(e)}]^T[K^e][P^{(e)}]\{E\} = [P^{(e)}]^T\{f^e\} $$

对所有单元求和:

$$ \left(\sum_{e=1}^{M}[P^{(e)}]^T[K^e][P^{(e)}]\right)\{E\} = \sum_{e=1}^{M}[P^{(e)}]^T\{f^e\} $$$$ \boxed{ \begin{aligned} [A] &= \sum_{e=1}^{M}[P^{(e)}]^T[K^e][P^{(e)}] \\ &\quad + \sum_{f=1}^{M_f}[Q^{(f)}]^T(-jk_0[\tilde{B}^f])[Q^{(f)}] \end{aligned} } $$$$ \boxed{ \{b\} = \sum_{e=1}^{M}[P^{(e)}]^T\{f^e\} } $$

其中 $[Q^{(f)}]_{3\times N_E}$ 是面元 $f$ 的带符号提取矩阵(只提取面上3条棱边)。

8.5 验证 $[P^{(e)}]^T[K^e][P^{(e)}]$ 的分量

$$ \left([P^{(e)}]^T[K^e][P^{(e)}]\right)_{JI} = \sum_{j=1}^{6}\sum_{i=1}^{6}P^{(e)}_{j,J}\,K^e_{ji}\,P^{(e)}_{i,I} $$

$P^{(e)}_{j,J} \neq 0$ 仅当 $J = \text{map}(e,j)$,此时 $P^{(e)}_{j,J} = s_j^{(e)}$。

$P^{(e)}_{i,I} \neq 0$ 仅当 $I = \text{map}(e,i)$,此时 $P^{(e)}_{i,I} = s_i^{(e)}$。

如果 $J \in e$ 且 $I \in e$:

$$ = s_{j(J,e)}^{(e)}\,K^e_{j(J,e),\,i(I,e)}\,s_{i(I,e)}^{(e)} $$

如果 $J \notin e$ 或 $I \notin e$:

$$ = 0 $$

对 $e$ 求和即得 $A_{JI}$。与之前的逐项分析完全一致。✓


九、全景总结:筛选机制的层次结构

┌─────────────────────────────────────────────────────────────────────┐
│                                                                     │
│  全域积分 ∫_Ω (...)dV                                               │
│      ↓                                                              │
│  分解为 M 个单元积分 Σ_e ∫_{Ω^e} (...)dV                           │
│      ↓                                                              │
│  【第一层筛选】全局基函数的支撑域                                    │
│      N_I|_{Ω^e} = 0  若 I ∉ edges(e)                               │
│      → 只有 I ∈ e 且 J ∈ e 的单元才有贡献                          │
│      → 从 M 项减少到 |E(I,J)| 项(通常只有几个)                    │
│      ↓                                                              │
│  在每个有贡献的单元内:                                              │
│      N_I|_{Ω^e} = s_i^{(e)} N_i^{(e)}                              │
│      → 全局基函数转化为带符号的局部基函数                            │
│      → 积分变为 s_i s_j × 局部矩阵元素                             │
│      ↓                                                              │
│  【第二层筛选】(仅对面积分/右端项)                                 │
│      面积分:还要求 I, J 都是面上的棱边(3条而非6条)                │
│      右端项:还要求单元在介质区域内(ε̄̄_r ≠ Ī)                     │
│                                                                     │
│  最终:全局矩阵是稀疏的                                             │
│      每行约 15-20 个非零元素(对于四面体网格)                       │
│      稀疏率 ≈ 20/N_E ≪ 1                                           │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘