FESTUNG模型介绍—1.对流方程求解

1. 控制方程

对流问题中,控制方程表达式为

\[\partial_t C + \partial_x (u^1 C) + \partial_y (u^2 C) = 0, \quad \mathrm{in} \; \Omega
\]

其中边界处包含 Dirichlet 和 Neumann 边界条件,分别为

\[\begin{array}{cl}
C = C_D & \mathrm{on} \; \partial \Omega_D, \\
- \nabla C \cdot \mathbf{v} = g_N & \mathrm{on} \; \partial \Omega_N.
\end{array}
\]

2. 数值离散

将控制方程利用间断有限元离散后,积分方程形式为

\[\underbrace{ \int_{\mathcal{T}_k} \varphi_{ki} \sum_{j=1}^N \partial_t C_{kj} \varphi_{kj} }_{I}
- \underbrace{ \int_{\mathcal{T}_k} \partial_x \varphi_{ki} \sum_{j=1}^N C_{kj} \varphi_{kj} \sum_{j=1}^N u^1_{kl} \varphi_{kl}
- \int_{\mathcal{T}_k} \partial_y \varphi_{ki} \sum_{j=1}^N C_{kj} \varphi_{kj} \sum_{j=1}^N u^1_{kl} \varphi_{kl} }_{II} \\
+ \underbrace{ \left \{
\begin{array}{c}
\sum_{n=1}^3 \int_{\partial \mathcal{T}_k} v_{kn}^1 u^1_{k} \varphi_{ki} \sum_{j=1}^N C_{kj}^* \varphi_{kj}
+ \sum_{n=1}^3 \int_{\partial \mathcal{T}_k} v_{kn}^2 u^2_{k} \varphi_{ki} \sum_{j=1}^N C_{kj}^* \varphi_{kj} \quad \mathrm{on} \; \mathcal{E}_{\Omega} \\
\sum_{n=1}^3 \int_{\partial \mathcal{T}_k} v_{kn}^1 u^1_{k} \varphi_{ki} \sum_{j=1}^N C_D^* \varphi_{kj}
+ \sum_{n=1}^3 \int_{\partial \mathcal{T}_k} v_{kn}^2 u^2_{k} \varphi_{ki} \sum_{j=1}^N C_D^* \varphi_{kj} \quad \mathrm{on} \; \mathcal{E}_{D}
\end{array} \right \}
}_{III} = 0.
\]

将方程写为矩阵形式

\[\mathbf{M} \partial_t \mathbf{C} + \left( - \mathbf{G}^1 - \mathbf{G}^2 + \mathbf{S} \right) \mathbf{C} = \mathbf{K}_D,
\]

其中 \(\mathbf{C}=[C_{11}, \cdots, C_{1N}, \cdots, C_{K1}, \cdots, C_{KN}]^\top\) 未知数待求系数。在方程中,\(\mathbf{M}, \mathbf{G}^1,\mathbf{G}^2,\mathbf{S}\) 为各系数矩阵,下面分别介绍各个矩阵表达式。

\(\mathbf{M}\) 为质量矩阵,由于间断有限元局部性,可由各个单元质量矩阵组合而成

\[\mathbf{M} = \begin{bmatrix}
M_{\mathcal{T}_1} & & \\
& \ldots & \\
& & M_{\mathcal{T}_K}
\end{bmatrix} \quad
M_{\mathcal{T}_k} = \int_{\mathcal{T}_k} \begin{bmatrix}
\varphi_{k1} \varphi_{k1} & \ldots & \varphi_{k1} \varphi_{kN} \\
\ldots & \ldots & \ldots \\
\varphi_{kN} \varphi_{k1} & \ldots & \varphi_{kN} \varphi_{kN}
\end{bmatrix}
\]

或者也可写为 \(\mathbf{M} = \mathrm{diag} \left ( M_{\mathcal{T}_1}, \ldots, M_{\mathcal{T}_K} \right )\)。在第 \(II\) 项面积分中,由于包含三个基函数积分形式,因此 \(\mathbf{G}^1,\mathbf{G}^2\) 与传统刚度矩阵并不相同。与质量矩阵类似,\(\mathbf{G}^m = \mathrm{diag} \left ( G^m_{\mathcal{T}_1}, \ldots, G^m_{\mathcal{T}_K} \right ), m\in \{1,2 \}\) 可写为对角矩阵块形式,其中每个单元内矩阵系数可写为

\[G^m_{\mathcal{T}_k} = \sum_{l=1}^N u^m_{kl} \int_{\mathcal{T}_k} \begin{bmatrix}
\partial_{x^m} \varphi_{k1} \varphi_{kl} \varphi_{k1} & \ldots & \partial_{x^m} \varphi_{k1} \varphi_{kl} \varphi_{kN} \\
\ldots & \ldots & \ldots \\
\partial_{x^m} \varphi_{kN} \varphi_{kl} \varphi_{k1} & \ldots & \partial_{x^m} \varphi_{kN} \varphi_{kl} \varphi_{kN}
\end{bmatrix}
\]

在第 \(III\) 项面积分中,与前两项不同的是,由于面积分计算时边界通量可能采用其他单元内数值解,因此系数矩阵 \(\mathbf{S}\) 不为对角形式。在文献 [1] 中,Frank 等将 \(\mathbf{S}^m, m\in \{1,2 \}\) 写为对角块 (8a) 和非对角块 (8c) 部分,分别表示为

\[\left [ \mathbf{S}^m \right ]_{(k-1)N+i, (k-1)N+j} := \sum_{E_{k n} \in \partial T_{k} \cap \mathcal{E}_{\Omega}} v_{k n}^{m} u_{k}^m \int_{E_{k n}} \varphi_{k i} \varphi_{k j} =
\sum_{E_{k n} \in \partial T_{k} \cap \mathcal{E}_{\Omega}} v_{k n}^{m} \left[ \mathbf{S}_{E_{kn}} \right]
\]
\[\left[\mathbf{S}^{m}\right]_{\left(k^{-}-1\right) N+i,\left(k^{+}-1\right) N+j} := v_{k^{-} n^{-}}^{m} u_{k^{+}} \int_{E_{k^{-} n^{-}}} \varphi_{k^{-} i} \varphi_{k^{+} j}
\]

上式中由于试验函数定义在 \(k^-\) 单元上,因此相邻单元基函数 \(\varphi_{k^{+} l}\) 和 \(\varphi_{k^{+} j}\) 在 \(k^-\) 单元边界 \(E_{k^{-} n^{-}}\) 上始终为 0,所以第二项表达式存在一定问题。但是由于相邻单元内相同编号的基函数 \(\varphi_{k^{-} j}\) 和 \(\varphi_{k^{+} j}\) 在边界 \(E_{k^{-} n^{-}}\) 上函数值分布不同,因此必须采用单元 \(k^{+}\) 的基函数进行表示。

在 Dirichlet 边界处,面积分计算需考虑边界条件 \(C = C_D\),由此包含右端项 \(\mathbf{K}_D\) 等。

获得矩阵形式离散方程后,即可采用 Runge-Kutta 等方法进行计算,右端项表达式为

\[\mathrm{rhs} = \mathbf{M}^{-1} \left( \mathbf{V} - \mathbf{A} \mathbf{C}^{(n)} \right)
\]

其中

\[\mathbf{A} = - \mathbf{G}^1 - \mathbf{G}^2 + \mathbf{S}, \quad \mathbf{V} = \mathbf{L} - \mathbf{K}_D - \mathbf{K}_N
\]

2.1. 体积分与面积分主要区别

在离散后得到的控制方程中,面积分和体积分系数矩阵中基函数个数并不相同,其中体积分中为两个基函数与一个基函数导数相乘,而面积分为两个基函数相乘。存在这种区别的原因是,在体积分中,用基函数近似值 \(u_h = \sum_{j=1}^N u^m_{kl} \varphi_{kl}\) 来近似流速,而在面积分中,则直接采用 \(u_h^m\) 在边界积分节点函数值进行计算。因此面积分中省去了基函数 \(\varphi_{kl}\) 项,仅包含 \(\varphi_{ki}\) 与 \(\varphi_{kj}\) 的积分计算。

3. 模型实现

3.1. 计算流程

在 FESTUNG 模型中建立求解器时,需要在文件夹内包含以下 4 个文件:

文件名 函数功能
configureProblem.m 算例设置文件,包括网格宽度,计算步数,边界条件等
preprocessProblem.m 前处理需要数据,包括计算网格,常系数矩阵等
initializeProblem.m 初始化函数
主循环 计算过程
postprocessProblme.m 后处理函数

其中主循环求解部分包括四个步骤:

函数名 说明
preprocessStep 计算前处理
solveStep 采用 Runge-Kutta 进行每步计算
postprocessStep 每步计算后执行必要的数值处理
outputStep 输出以及插值过程

在计算步 solveStep.m 中,调用了函数 iterateSubSteps,在此函数中每一步进行了 \(m\) 次 Runge-Kutta 时间递进分步的计算,每步调用如下三个函数

函数名 说明
preprocessSubStep 组装 \(\mathbf{G}, \mathbf{R}, \mathbf{K}_D, \mathbf{K}_N, \mathbf{L}\) 等系数矩阵
solveSubStep 计算右端项,求解线性方程组
postprocessSubStep 判断 RK 迭代是否完成

preprocessSubStep 函数中,需要组装系数矩阵 \(\mathbf{G}^m, \mathbf{R}, \mathbf{K}_D, \mathbf{K}_N, \mathbf{L}\) 等系数矩阵,这是由于在每步计算过程中需要更新 \( u^1, u^2, f\) 等变量数值表达式,以及边界条件 \(C_D, g_N\) 等也可能随时间发生变化。

3.2. 通量计算

在对流方程计算中,面积分计算时采用迎风格式计算,因此在 \(\mathbf{S}^m\) 组装时需要考虑边界处流速方向。在组装边界积分矩阵时,调用函数 assembleMatEdgePhiPhiValUpwind

首先考察面积分的化简,在 \(\mathbf{S}_{E_{kn}}\) 中,其表达式为

\[\mathbf{S}_{E_{kn}}^m =
v_{k n}^{m} u^m_{kn} \int_{E_{kn}} \begin{bmatrix}
\varphi_{k1} \varphi_{k1} & \ldots & \varphi_{k1} \varphi_{kN} \\
\ldots & \ldots & \ldots \\
\varphi_{kN} \varphi_{k1} & \ldots & \varphi_{kN} \varphi_{kN}
\end{bmatrix}
\]

对于面积分,首先将其投影至标准单元,随后转化为 \(s \in [0,1]\) 范围进行计算

\[\int_{E_{k n}} \varphi_{k i} \varphi_{k j}
= \frac{\left|E_{k n}\right|}{\left|\hat{E}_{n}\right|} \int_{\hat{E}_{n}} \hat{\varphi}_{i}(\hat{\boldsymbol{x}}) \hat{\varphi}_{j}(\hat{\boldsymbol{x}}) \mathrm{d} \hat{\boldsymbol{x}}
= \left|E_{k n}\right|
\underbrace {\int_{0}^{1} \hat{\varphi}_{i} \circ \hat{\gamma}_{n}(s) \hat{\varphi}_{j} \circ \hat{\gamma}_{n}(s) \mathrm{d} s }_{=:\left[ \mathbf{ \hat{S} }^{\mathrm{diag}} \right]_{i,j,n}}
\]

其中 \(\hat{\gamma}_{n}(s) : [0,1] \rightarrow \hat{E}_{n}\) 为标准单元边界投影,可将一维线单元的局部坐标转换为标准单元内边界节点坐标,表达式为

\[\hat{\gamma}_{1}(s) :=\left[\begin{array}{c}{1-s} \\ {s}\end{array}\right], \qquad \hat{\gamma}_{2}(s) :=\left[\begin{array}{c}{0} \\ {1-s}\end{array}\right], \qquad \hat{\gamma}_{3}(s) :=\left[\begin{array}{l}{s} \\ {0}\end{array}\right].
\]

对于单位长度上面积分表达式,可将 \([ \mathbf{ \hat{S} }^{\mathrm{diag}} ]_{i,j,n}\) 提前进行计算,随后系数矩阵可表示为

\[\mathbf{S}_{E_{kn}}^m = v_{k n}^{m} u_{kn}^m \left| {E}_{kn} \right| [ \mathbf{ \hat{S} }^{\mathrm{diag}} ]_{:,:,n}.
\]

首先考察对角部分矩阵块

\[\mathbf{S}^{m, \mathrm{diag}} =
\sum_{n=1}^{3} \left[\begin{array}{ccc}{\delta_{E_{1 n} \in \mathcal{E}_{\Omega}}} & {} \\ {} & {\ddots} & {} \\ {} & {} & {\delta_{E_{K n} \in \mathcal{E}_{\Omega}}}\end{array}\right] \circ \left[\begin{array}{cccc}{v_{1}^{m}\left|E_{1 n}\right| u_{1 n}^m} & {} & {} \\ {} & {\ddots} & {} \\ {} & {} & {} & {v_{K n}^{m} \left|E_{K n}\right| u_{K n}^m}\end{array}\right]
\otimes [\hat{\mathbf{S}}^{\mathrm{diag}} ]_{ :, :, n} \\
= \sum_{n=1}^{3} \boldsymbol{\delta}_E \circ \mathrm{diag} (v_k^m u_{kn}^m |E_{kn}| ) \otimes [\hat{\mathbf{S}}^{\mathrm{diag}} ]_{ :, :, n}
\]

在上式中 \(\boldsymbol{\delta}_E\) 为 \(K \times K\) 大小的对角矩阵,其中每个元素代表单元对应面是否位于内部面 \(\delta_{E_{k n} \in \mathcal{E}_{\Omega}}\),\(\mathrm{diag} (v_k^m u_{kn}^m |E_{kn}| )\) 则为每个单元上面积分时对应积分系数,最终 \([\hat{\mathbf{R}}^{\mathrm{diag}} ]_{ :, :, l, n}\) 为标准单元中基函数面积分大小。符号 \(\circ\) 代表 Hadamard 乘积(矩阵元素点乘),\(\otimes\) 为 Kronecker 算子。

为了考虑迎风通量,面积分时需要对系数 \(v_k^m u_{kn}^m\) 正负进行判断,当 \(v_k^m u_{kn}^m > 0\) 时采用原始系数矩阵,而当 \(v_k^m u_{kn}^m \le 0\) 时则应将对应系数修改为 0,代表本单元数值解并不参与此单元面的计算。

此外,在面积分计算时必须采用数值积分方法进行计算。令 \(R\) 为积分节点总数,数值积分可进一步写为

\[\mathbf{S}^{m, \mathrm{diag}} = \sum_{n=1}^{3} \sum_{r=1}^{R} \boldsymbol{\delta}_E \circ \mathrm{diag} (v_k^m u_{kn}^m(\hat{q}_r) |E_{kn}| ) \otimes [\hat{\mathbf{S}}^{\mathrm{diag}} ]_{ :, :, n, r}
\]

其中

\[[\hat{\mathbf{S}}^{\mathrm{diag}} ]_{ :, :, n, r} = \omega_r \begin{bmatrix}
\varphi_{k1}(\hat{q}_r) \varphi_{k1}(\hat{q}_r) & \ldots & \varphi_{k1}(\hat{q}_r) \varphi_{kN}(\hat{q}_r) \\
\ldots & \ldots & \ldots \\
\varphi_{kN}(\hat{q}_r) \varphi_{k1}(\hat{q}_r) & \ldots & \varphi_{kN}(\hat{q}_r) \varphi_{kN}(\hat{q}_r)
\end{bmatrix}
\]

在非对角部分,同样可将面积分投影至标准长度线段中进行计算。需要注意的是,由于非对角部分表示相邻单元边界数值解在本单元边界上展开,因此积分计算时必须选取本地单元边界上相同位置的高斯节点进行计算。例如,当本地单元 \(k^{-}\) 边 \(n^- = 1\) 和相邻单元 \(k^{+}\) 边 \(n^+ = 3\) 相邻时,\(n^{+}\) 边界上的高斯节点局部坐标 \(s^{+}\) 与 \(n^{-}\) 边界上局部坐标是完全相反的 \(s^{+} = 1 - s^{-}\)。为此,模型提出了一个投影算子 \(\theta_{n^-, n^+}: \hat{E}_{n^-} \rightarrow \hat{E}_{n^+}\)(theta.m),保证最终两侧边界计算时投影至相同高斯积分节点局部坐标大小相同,即二者有相同的坐标,保证 \(\varphi_{k^+, j}(s^{+}) = \varphi_{k^-, j}(s^{-})\),其中

\[\begin{matrix}
\hat{\boldsymbol{\vartheta}}_{11} :\left[\begin{array}{c}{\hat{x}^{1}} \\ {\hat{x}^{2}}\end{array}\right] \mapsto\left[\begin{array}{c}{1-\hat{x}^{1}} \\ {1-\hat{x}^{2}}\end{array}\right] &
\hat{\boldsymbol{\vartheta}}_{12} :\left[\begin{array}{c}{\hat{x}^{1}} \\ {\hat{x}^{2}}\end{array}\right] \mapsto\left[\begin{array}{c}{0} \\ {\hat{x}^{2}}\end{array}\right] &
\hat{\boldsymbol{\vartheta}}_{13} :\left[\begin{array}{c}{\hat{x}^{1}} \\ {\hat{x}^{2}}\end{array}\right] \mapsto\left[\begin{array}{c}{\hat{x}^{1}} \\ {0}\end{array}\right] \\
\hat{\boldsymbol{\vartheta}}_{21} :\left[\begin{array}{c}{\hat{x}^{1}} \\ {\hat{x}^{2}}\end{array}\right] \mapsto\left[\begin{array}{c}{1-\hat{x}^{2}} \\ {\hat{x}^{2}}\end{array}\right] &
\hat{\boldsymbol{\vartheta}}_{22} :\left[\begin{array}{c}{\hat{x}^{1}} \\ {\hat{x}^{2}}\end{array}\right] \mapsto\left[\begin{array}{c}{0} \\ {1-\hat{x}^{2}}\end{array}\right] &
\hat{\boldsymbol{\vartheta}}_{23} :\left[\begin{array}{c}{\hat{x}^{1}} \\ {\hat{x}^{2}}\end{array}\right] \mapsto\left[\begin{array}{c}{\hat{x}^{2}} \\ {0}\end{array}\right] \\
\hat{\boldsymbol{\vartheta}}_{31} :\left[\begin{array}{c}{\hat{x}^{1}} \\ {\hat{x}^{2}}\end{array}\right] \mapsto\left[\begin{array}{c}{\hat{x}^{1}} \\ {1-\hat{x}^{1}}\end{array}\right] &
\hat{\boldsymbol{\vartheta}}_{32} :\left[\begin{array}{c}{\hat{x}^{1}} \\ {\hat{x}^{2}}\end{array}\right] \mapsto\left[\begin{array}{c}{0} \\ {\hat{x}^{1}}\end{array}\right] &
\hat{\boldsymbol{\vartheta}}_{33} :\left[\begin{array}{c}{\hat{x}^{1}} \\ {\hat{x}^{2}}\end{array}\right] \mapsto\left[\begin{array}{c}{1-\hat{x}^{1}} \\ {0}\end{array}\right] \\
\end{matrix}
\]

而标准单元中面积分矩阵表达式可写为

\[\left[\hat{\mathbf{S}}^{\text { offdiag }}\right]_{i, j, n^{-}, n^{+}} :=\int_{0}^{1} \hat{\varphi}_{i} \circ \hat{\gamma}_{n^{-}}(s) \hat{\varphi}_{j} \circ \hat{\boldsymbol{\vartheta}}_{n^{-}n^{+}} \circ \hat{\gamma}_{n^{-}}(s) \mathrm{d} s
\]

尽管 \(\theta_{n^-, n^+}\) 表达式较为复杂,但是可以看出,其作用就是根据 \(k^{+}\) 单元相邻面的编号将面局部坐标投影为相反顺序,如

\[\hat{\boldsymbol{\vartheta}}_{n^{-}1} \circ \hat{\gamma}_{n^{-}}(s) = \left[\begin{array}{c}{s} \\ {1-s}\end{array}\right], \quad
\hat{\boldsymbol{\vartheta}}_{n^{-}2} \circ \hat{\gamma}_{n^{-}}(s) = \left[\begin{array}{c}{0} \\ {s}\end{array}\right], \quad
\hat{\boldsymbol{\vartheta}}_{n^{-}3} \circ \hat{\gamma}_{n^{-}}(s) = \left[\begin{array}{c}{1-s} \\ {0}\end{array}\right]
\]

可以看出,经过 \(\hat{\boldsymbol{\vartheta}}_{n^{-}n^{+}}\) 变换后,局部坐标与原始标准单元边界投影是完全相反的,保证边界两侧基函数在相同高斯节点进行计算。

在组装全局矩阵系数时,同样需要判断单元边界是否相邻,因此引入 \(K \times K\) 大小的 \(\delta_E^{\mathrm{offdiag}}\) 矩阵,最终非对角项系数为

\[\mathbf{S}^{\text { offdiag }} := \sum_{n^{-}=1}^{3} \sum_{n^{+}=1}^{3} \begin{bmatrix}
0 & \delta_{E_{1, n^{-}} = E_{2, n^{+}}} & \cdots & \cdots & \delta_{E_{1, n^{-}} = E_{K, n^{+}}} \\
\delta_{E_{2, n^{-}} = E_{1, n^{+}}} & 0 & \ddots & & \vdots \\
\vdots & \vdots & \ddots & & \vdots \\
\delta_{E_{K, n^{-}} = E_{K, n^{+}}} & \ldots & \ldots & \delta_{E_{K, n^{-}} = E_{{K-1}, n^{+}}} & 0
\end{bmatrix} \\
\circ \begin{bmatrix}
v_{1 n^{-}}^m u_{1 n^{-}}^m | E_{1 n^{-}} | & \ldots & v_{1 n^{-}}^m u_{1 n^{-}}^m | E_{1 n^{-}} | \\
\vdots & \ddots & \vdots \\
v_{K n^{-}}^m u_{K n^{-}}^m | E_{K n^{-}} | & \ldots & v_{K n^{-}}^m u_{K n^{-}}^m | E_{K n^{-}} |
\end{bmatrix}
\otimes\left[\hat{\mathbf{S}}^{\text { offdiag }}\right]_{:, :, n^{-}, n^{+} }
\]

由于非对角项考虑的是相邻单元对本单元影响,因此当 \(v_{kn^{-}}^m u_{kn^{-}}^m < 0\) 时(边界为入流),对应系数不为 0,其他情况对应边界系数为 0。

FESTUNG模型介绍—1.对流方程求解的更多相关文章

  1. FESTUNG 模型介绍 — 2. 对流问题隐式求解

    FESTUNG 模型介绍 - 2. 对流问题隐式求解 1. 控制方程 对流问题的控制方程为 \[\partial_t C + \partial_x u^1 C + \partial_y u^2 C = ...

  2. SUNTANS 及 FVCOM 对流扩散方程求解简介[TBC]

    最近接到一个任务,就是解决FVCOM中对流扩散计算不守衡问题.导师认为是其求解时候水平和垂向计算分开求解所导致的,目前我也没搞清到底有什么问题,反正就是让把SUNTANS的对流扩散计算挪到FVCOM中 ...

  3. 文本主题模型之LDA(二) LDA求解之Gibbs采样算法

    文本主题模型之LDA(一) LDA基础 文本主题模型之LDA(二) LDA求解之Gibbs采样算法 文本主题模型之LDA(三) LDA求解之变分推断EM算法(TODO) 本文是LDA主题模型的第二篇, ...

  4. 文本主题模型之LDA(三) LDA求解之变分推断EM算法

    文本主题模型之LDA(一) LDA基础 文本主题模型之LDA(二) LDA求解之Gibbs采样算法 文本主题模型之LDA(三) LDA求解之变分推断EM算法 本文是LDA主题模型的第三篇,读这一篇之前 ...

  5. Machine Learning系列--隐马尔可夫模型的三大问题及求解方法

    本文主要介绍隐马尔可夫模型以及该模型中的三大问题的解决方法. 隐马尔可夫模型的是处理序列问题的统计学模型,描述的过程为:由隐马尔科夫链随机生成不可观测的状态随机序列,然后各个状态分别生成一个观测,从而 ...

  6. IO模型介绍

    先理解几个问题: (1)为什么读取文件的时候,需要用户进程通过系统调用内核完成(系统不能自己调用内核)什么是用户态和内核态?为什么要区分内核态和用户态呢? 在 CPU 的所有指令中,有些指令是非常危险 ...

  7. MATLAB 符号变量表达式 + 方程求解

    源代码见文末 部分源代码: % 符号变量 两种表达方式 a=sym('a'); class(a); syms b; b; % 符号常量 c=sym('); c; % 符号表达式 三种表达方式 f1=' ...

  8. 模型介绍之FastText

    模型介绍一: 1. FastText原理及实践 前言----来源&特点 fastText是Facebook于2016年开源的一个词向量计算和文本分类工具,在学术上并没有太大创新.但是它的优点也 ...

  9. python 全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)

    昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...

随机推荐

  1. Spring Security Jwt Token 自动刷新

    token的自动刷新 一.功能需求 二.功能分析 1.token 的生成 2.token 的自动延长 3.系统资源的保护 4.用户如何传递 token 三.实现思路 1.生成 token 和 refr ...

  2. spring session实现session统一管理(jdbc实现)

    最近在看一些关于spring session 的知识,特做一个笔记记录一下. 在项目中经常会遇到这么一种情况,同一个web项目有时需要部署多份,然后使用nginx实现负载均衡,那么遇到的问题就是,部署 ...

  3. CSP-S2021 退役记

    首先大家一起恭喜博主以5pts之差与省三擦肩而过!(nmd爷去年都省三今年成功打铁了) 果然这个菜鸡一年不如一年了 upd:T3死在多测上了,随便一个40+28的人可以吊打我 Day -2: 模拟赛, ...

  4. 【学习笔记】Vizing 定理

    图染色问题的经典结论 定义 称一个边染色方案合法当且仅当每个顶点连出的所有边的颜色都互不相同,如果此时出现了 \(k\) 个颜色那么称该方案是图的一组 \(k\) 染色 一张无向图的边着色数为最小的 ...

  5. cm3 逆向分析

    目录 cm3 逆向分析 前言 逆向分析 cm3 逆向分析 前言 这道题没加壳,也没加密算法,主要看代码逻辑. 逆向分析 代码很短,一共这么几句. 看提示知道只让我们输入w.s.a.d这几个字符,并且用 ...

  6. 使用jax加速Hamming Distance的计算

    技术背景 一般认为Jax是谷歌为了取代TensorFlow而推出的一款全新的端到端可微的框架,但是Jax同时也集成了绝大部分的numpy函数,这就使得我们可以更加简便的从numpy的计算习惯中切换到G ...

  7. GoLang设计模式12 - 空对象模式

    空对象设计模式是一种行为型设计模式,主要用于应对空对象的检查.使用这种设计模式可以避免对空对象进行检查.也就是说,在这种模式下,使用空对象不会造成异常. 空对象模式的组件包括: Entity:接口,定 ...

  8. KMP算法-字符匹配

    字符匹配模式-KMP算法 j直接跳到了2的位置,因为在之前的都相同. 那么就需要求如果不等了之后,j需要回跳的位置next[j] 如果tk'与tj相等,则next [j+1]=k'+1 如果tk'与t ...

  9. 装了这几个IDEA插件,基本上一站式开发了!

    前言 前几天有社区小伙伴私聊我,问我都用哪些IDEA插件,我的IDEA的主题看起来不错. 作为一个开源作者,每周要code大量的代码,提升日常工作效率是我一直追求的,在众多的IDEA插件中,我独钟爱这 ...

  10. 学好Python不加班系列之SCRAPY爬虫框架的使用

    scrapy是一个爬虫中封装好的一个明星框架.具有高性能的持久化存储,异步的数据下载,高性能的数据解析,分布式. 对于初学者来说还是需要有一定的基础作为铺垫的学习.我将从下方的思维导图中进行逐步的解析 ...