超音波流体屋のプログラム備忘録
有限要素法・付録
最終更新:
usapfrog
-
view
有限要素法・導出の付録部分。
積分形
今回の導出で使わないと思うが、積分形ならこんな形をしてる。
(弾): $ \iint {\bf \sigma} d{\bf S} = \iiint \rho (\ddot{\bf u} - {\bf f}) dV $
(ポ): $ \iint \nabla \varphi d{\bf S} = - \iiint \varrho/\varepsilon dV $
(波): $ \iint \nabla \phi d{\bf S} = \iiint (\ddot \phi/c^2 + q) dV $
(弾): $ \iint {\bf \sigma} d{\bf S} = \iiint \rho (\ddot{\bf u} - {\bf f}) dV $
(ポ): $ \iint \nabla \varphi d{\bf S} = - \iiint \varrho/\varepsilon dV $
(波): $ \iint \nabla \phi d{\bf S} = \iiint (\ddot \phi/c^2 + q) dV $
総和規約
このページでは、テンソル演算において総和記号$\Sigma$は使わない。
$\delta{\bf \epsilon} : {\bf \sigma} = \epsilon_{ij} \sigma_{ij} = \sum_{ij} \epsilon_{ij} \sigma_{ij}$
$\delta{\bf \epsilon} : {\bf \sigma} = \epsilon_{ij} \sigma_{ij} = \sum_{ij} \epsilon_{ij} \sigma_{ij}$
全体行列の編み方・ボツ
並列計算性が著しく悪い。
- 全自由度: $L_D = L_p L_d$ (配列pのサイズを $L_p$ = length(p) とする)
- 普通は巨大行列になるので、$L_D \times L_D$の疎行列として定義する
- $r, c, M, K, h$: 一次元(空)配列
- $map$ (key:密行列ID)→(value:疎行列ID) : 連想配列 std::map など
- $free$ (key:自由度ID)→(value:非拘束自由度ID) : 連想配列
- $\ll$ = push_back関数: リストに追加を示す
for q = 1..Lq(各要素に対するループ)
for m = 1..Ln(要素内節点に対するループ)
for i = 1..Ld(1節点に対する自由度に対するループ)
- for n = 1..Ln(相手要素内節点に対するループ)
- for j = 1..Ld(相手1節点に対する自由度に対するループ)
- $p^m = e_{nq}$
- $p^n = e_{nq}$
- $p^r = i + L_d p^m$
- $p^c = j + L_d p^n$
- $key = p^r + L_D p^c $
- $idx = map(key) $
- if (idx == NULL) : これまで登録したこと無い要素なら
- $ map(key) = size(map)$
- $ r \ll p_r$
- $ c \ll p_c$
- $ K \ll {\cal K}^q_{ijmn},\ M \ll {\cal M}^q_{ijmn} $
- else
- $ K(idx) += {\cal K}^q_{ijmn},\ M(idx) += {\cal M}^q_{ijmn} $
- end
- end(自由度 j)
- end(節点 n)
- if 非拘束自由度(m,i) then $ free(p_r) = size(freemap)$
end(自由度 i)
end(節点 m)
end(要素 q)
拘束付き全体行列・ボツ?
拘束点を間引く必要があるので、一辺$size(free)$のスパース行列として定義する
$r^*, c^*, M^*, K^*, f^*$: 一次元(空)配列
$r^*, c^*, M^*, K^*, f^*$: 一次元(空)配列
for k = 1..size(r)(全体疎行列に対するループ)
- $ r^f = free( r(k) ) $
- $ c^f = free( c(k) ) $
- next if $r_f = \emptyset \ or \ c_f = \emptyset$ 拘束されているなら登録しない
- $ r^* \ll r_f $
- $ c^* \ll c_f $
- $ K^* \ll K(k),\ M^* \ll M(k)$ など
end(index k)
for k = 1..L_D(自由度に対するループ)
- $ r^f = free(k) $
- $ f^* \ll \tilde{f}(k) $ if $r_f \neq \emptyset $
end(index k)
最終的な連立方程式に
$ A = K^* - \omega^2 M^* $など