这篇笔记在做什么
这篇笔记专门抽出原始会话里最难也最容易混乱的部分:全局基函数如何代入连续弱形式,为什么绝大多数单元积分自动为零,局部基函数怎样带着方向符号回到全局矩阵。
我保留了推导里的每一步筛选与变换,让“全局到局部、局部回到全局”不再只是口号,而是一条完整可验证的计算链。
从全局到局部,再从局部到全局
——弱形式离散化的完整推导
一、出发点:连续弱形式
求 $\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_{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 $$$$ = s_j^{(e)}\,s_i^{(e)}\,T^e_{ji} $$注意:$\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}$。
$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 $$$$ = s_j^{(e)}\,\frac{f^e_j}{k_0^2} $$注意:$\mathbf{E}^{inc}$ 不是常数(它随空间变化),但 $s_j^{(e)}$ 是常数可以提出。$(\bar{\bar{\varepsilon}}_r^{(e)}-\bar{\bar{I}})$ 在单元内是常张量(假设材料在每个单元内均匀),也可以提出。$\mathbf{E}^{inc}$ 需要在积分中保留(或用高斯积分数值处理)。
所以:
$$ 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
符号改变了矩阵元素的正负!
如果不考虑符号(错误地写成 $+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} $$观察要点:
- E1 的对角元 = Tri1 中 $e_1$ 的对角 + Tri2 中 $e_2$ 的对角:$K^{(1)}_{11} + K^{(2)}_{22}$
- E5 相关的非对角元全部带负号(因为 E5 在 Tri2 中的符号为-1)
- E5 的对角元不变号($(-1)(-1)=+1$)
- 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 │
│ │
└─────────────────────────────────────────────────────────────────────┘