OpenFOAMのプログラム実装でよく使う演算についてまとめる
keywords: OpenFOAM,テンソル演算,ddt,div,fvm,fvc
はじめに
OpenFOAMのプログラム実装でよく使う演算についてまとめる
実際のプログラム解説はこちら
参考資料はこちら(※PDFダウンロード)
≫OpenFOAM® Documentation – Programmer’s Guide
スカラー,ベクトル,テンソル
基本的にはセル中心で定義されたfieldであるvolField<Type>として扱うことが多い(volScalarField,volVectorField,volTensorField,volSymmTensorField)
スカラー(scalar)
\begin{equation}
s
\end{equation}
ベクトル(vector)
データ格納順は,x(), y(), z()
\begin{equation}
v_{i}
\end{equation}
テンソル(tensor)
データ格納順は,xx(), xy(), xz(), yx(), yy(), yz(), zx(), zy(), zz()
\begin{equation}
T_{ij}
\end{equation}
対称テンソル(symmTensor)
データ格納順は,xx(), xy(), xz(), yy(), yz(), zz()
\begin{equation}
T_{ij}
\end{equation}
テンソル演算
スカラーは0階のテンソル,ベクトルは1階のテンソルなので,下に示すテンソル演算はスカラーにもベクトルにも行列にも使用可能である
四則演算
足し算
\begin{equation}
\mathbf{a}+\mathbf{b}
\end{equation}
a + b
引き算
\begin{equation}
\mathbf{a}-\mathbf{b}
\end{equation}
a - b
スカラーとの掛け算
\begin{equation}
s\mathbf{a}
\end{equation}
s * a
スカラーによる割り算
\begin{equation}
\mathbf{a}/s
\end{equation}
a / s
二乗
\begin{equation}
\mathbf{a}^{2}
\end{equation}
sqr(a)
累乗
\begin{equation}
\mathbf{a}^{n}
\end{equation}
pow(a,n)
外積
クロス積ではなくテンソル積のほう(\(\mathbf{a}\otimes\mathbf{b}\))
\begin{equation}
T_{ij}=a_{i}b_{j}=\begin{bmatrix}
a_{1}b_{1} & a_{1}b_{2} & a_{1}b_{3} \\
a_{2}b_{1} & a_{2}b_{2} & a_{2}b_{3} \\
a_{3}b_{1} & a_{3}b_{2} & a_{3}b_{3} \end{bmatrix}
\end{equation}
a * b
線型代数学における直積(ちょくせき、英: direct product[1])あるいは外積(がいせき、英: outer product)は典型的には二つのベクトルのテンソル積を言う。座標ベクトル(英語版)の外積をとった結果は行列になる。外積の名称は内積に対照するもので、内積はベクトルの対をスカラーにする。外積は、クロス積の意味で使われることもあるため、どちらの意味で使われているか注意が必要である。
出典: フリー百科事典『ウィキペディア(Wikipedia)』
ベクトルとベクトルの外積 \(\mathbf{a}\otimes\mathbf{b}\) は,ベクトル\(\mathbf{a}\)と転置ベクトル\(\mathbf{b}^{\mathrm{T}}\)の積で表現できる
\begin{equation}
\mathbf{a}\otimes\mathbf{b}
=\mathbf{a}\mathbf{b}^{\mathrm{T}}
=\begin{bmatrix}
a_{1} \\
a_{2} \\
a_{3}
\end{bmatrix}
\begin{bmatrix} b_{1} & b_{2} & b_{3} \end{bmatrix}
=\begin{bmatrix}
a_{1}b_{1} & a_{1}b_{2} & a_{1}b_{3} \\
a_{2}b_{1} & a_{2}b_{2} & a_{2}b_{3} \\
a_{3}b_{1} & a_{3}b_{2} & a_{3}b_{3} \end{bmatrix}
\end{equation}
内積
ベクトルとベクトル
\begin{equation}
s=\mathbf{a}\cdot\mathbf{b}=a_{i}b_{i}= a_{1}b_{1} + a_{2}b_{2} + a_{3}b_{3}
\end{equation}
ベクトルとテンソル(\(\mathbf{b}=\mathbf{T}\cdot\mathbf{a}\))
\begin{equation}
b_{i}=T_{ij}a_{j}= \begin{bmatrix}
T_{11}a_{1} + T_{12}a_{2} + T_{13}b_{3} \\
T_{21}a_{1} + T_{22}a_{2} + T_{23}b_{3} \\
T_{31}a_{1} + T_{32}a_{2} + T_{33}b_{3} \end{bmatrix}
\end{equation}
ベクトルとテンソル(\(\mathbf{b}=\mathbf{a}\cdot\mathbf{T}=\mathbf{T}^{\mathrm{T}}\cdot\mathbf{a}\))
\begin{equation}
b_{i}=T_{ji}a_{j}= \begin{bmatrix}
T_{11}a_{1} + T_{21}a_{2} + T_{31}b_{3} \\
T_{12}a_{1} + T_{22}a_{2} + T_{32}b_{3} \\
T_{13}a_{1} + T_{23}a_{2} + T_{33}b_{3} \end{bmatrix}
\end{equation}
テンソルとテンソル(\(\mathbf{P}=\mathbf{T}\cdot\mathbf{S}\))
\begin{equation}
P_{ij}=T_{ik}S_{kj}
\end{equation}
a & b
二重内積
T && T
はmagSqr(T)
と同じ
2階以上のテンソルに使用可能
\begin{align}
s = \mathbf{T}\colon\mathbf{S} = T_{ij}S_{ij} =
& T_{11}S_{11} + T_{12}S_{12} + T_{13}S_{13} + \\
& T_{21}S_{21} + T_{22}S_{22} + T_{23}S_{23} + \\
& T_{31}S_{31} + T_{32}S_{32} + T_{33}S_{33}
\end{align}
a && b
クロス積(Cross product)
使ったことがない
\begin{equation}
\mathbf{c}=\mathbf{a}\times\mathbf{b}
=\begin{bmatrix}
a_{2}b_{3}-a_{3}b_{2} \\
a_{3}b_{1}-a_{1}b_{3} \\
a_{1}b_{2}-a_{2}b_{1} \end{bmatrix}
\end{equation}
a ^ b
大きさ(Magnitude)
ベクトル
\begin{equation}
|\mathbf{a}|=\sqrt{\mathbf{a}\cdot\mathbf{a}}=\sqrt{a_{i}a_{i}}=\sqrt{a_{1}a_{1}+a_{2}a_{2}+a_{3}a_{3}}
\end{equation}
テンソル
\begin{equation}
|\mathbf{T}|=\sqrt{\mathbf{T}\colon\mathbf{T}}=\sqrt{T_{ij}T_{ij}}
\end{equation}
mag(a)
大きさの二乗
\begin{equation}
|\mathbf{a}|^{2}
\end{equation}
magSqr(a)
2階のテンソル限定
転置(Transpose)
テンソル\(\mathbf{T}=T_{ij}\)
\begin{equation}
\mathbf{T}^{\mathrm{T}}=T_{ji}
\end{equation}
T.T()
Diagonal
2階のテンソルの対角成分を要素に持つベクトル
\begin{equation}
\mathrm{diag}~\mathbf{T}=\begin{bmatrix} T_{11} \\ T_{22} \\ T_{33} \end{bmatrix}
\end{equation}
diag(T)
トレース(Trace)
対角成分の和(スカラー)
\begin{equation}
\mathrm{tr}~\mathbf{T}=T_{ii}=T_{11}+T_{22}+T_{33}
\end{equation}
tr(T)
偏差テンソルと静水圧テンソル(Deviatoric and Hydrostatic tensors)
\begin{equation}
\mathbf{T}=\mathbf{T}-\frac{1}{3}\left(\mathrm{tr}~\mathbf{T}\right)\mathbf{I}+\frac{1}{3}\left(\mathrm{tr}~\mathbf{T}\right)\mathbf{I}
=\mathrm{dev}~\mathbf{T}+\mathrm{hyd}~\mathbf{T}
\end{equation}
\begin{equation}
\mathrm{dev}~\mathbf{T}
=\mathbf{T}-\frac{1}{3}\left(\mathrm{tr}~\mathbf{T}\right)\mathbf{I}
=T_{ij}-\frac{1}{3}T_{kk}\delta_{ij}
\end{equation}
\begin{equation}
\mathrm{hyd}~\mathbf{T}
=\frac{1}{3}\left(\mathrm{tr}~\mathbf{T}\right)\mathbf{I}
=\frac{1}{3}T_{kk}\delta_{ij}
\end{equation}
dev(T)
\begin{equation}
\mathrm{dev}\mathbf{T}
=\begin{bmatrix}
T_{11}-\frac{T_{11}+T_{22}+T_{33}}{3} & T_{12} & T_{13} \\
T_{21} & T_{22}-\frac{T_{11}+T_{22}+T_{33}}{3} & T_{23} \\
T_{31} & T_{32} & T_{33}-\frac{T_{33}+T_{22}+T_{33}}{3}
\end{bmatrix}
\end{equation}
\begin{equation}
\mathrm{hyd}\mathbf{T}
=\begin{bmatrix}
\frac{T_{11}+T_{22}+T_{33}}{3} & 0 & 0 \\
0 & \frac{T_{11}+T_{22}+T_{33}}{3} & 0 \\
0 & 0 & \frac{T_{33}+T_{22}+T_{33}}{3}
\end{bmatrix}
\end{equation}
対称テンソルと非対称テンソル(Symmetric and Skew tensors)
対称テンソルは\(T_{ij}=T_{ji}\)で volSymmTensorField,非対称テンソルは\(T_{ij}\neq T_{ji}\)で volTensorField
\begin{equation}
\mathbf{T}
=\frac{1}{2}\left(\mathbf{T}+\mathbf{T}^{\mathrm{T}}\right)
+\frac{1}{2}\left(\mathbf{T}-\mathbf{T}^{\mathrm{T}}\right)
=\mathrm{symm}~\mathbf{T}+\mathrm{skew}~\mathbf{T}
\end{equation}
\begin{equation}
\mathrm{symm}~\mathbf{T}
=\frac{1}{2}\left(\mathbf{T}+\mathbf{T}^{\mathrm{T}}\right)
=\frac{1}{2}\left(T_{ij}+T_{ji}\right)
\end{equation}
symm(T)
\begin{equation}
\mathrm{skew}~\mathbf{T}
=\frac{1}{2}\left(\mathbf{T}-\mathbf{T}^{\mathrm{T}}\right)
=\frac{1}{2}\left(T_{ij}-T_{ji}\right)
\end{equation}
skew(T)
\begin{equation}
\mathrm{symm}\mathbf{T}
=\begin{bmatrix}
T_{11} & \frac{1}{2}\left(T_{12}+T_{21}\right) & \frac{1}{2}\left(T_{13}+T_{31}\right) \\
\frac{1}{2}\left(T_{21}+T_{12}\right) & T_{22} & \frac{1}{2}\left(T_{23}+T_{32}\right) \\
\frac{1}{2}\left(T_{31}+T_{13}\right) & \frac{1}{2}\left(T_{32}+T_{23}\right) & T_{33} \end{bmatrix}
\end{equation}
\begin{equation}
\mathrm{skew}\mathbf{T}
=\begin{bmatrix}
0 & \frac{1}{2}\left(T_{12}-T_{21}\right) & \frac{1}{2}\left(T_{13}-T_{31}\right) \\
\frac{1}{2}\left(T_{21}-T_{12}\right) & 0 & \frac{1}{2}\left(T_{23}-T_{32}\right) \\
\frac{1}{2}\left(T_{31}-T_{13}\right) & \frac{1}{2}\left(T_{32}-T_{23}\right) & 0 \end{bmatrix}
\end{equation}
対称テンソルの2倍
2*symm(T)
と同じ
Programmer's Guideには載っていない
\begin{equation}
2\times\mathrm{symm}~ \mathbf{T}
\end{equation}
twoSymm(T)
スカラー限定
平方根
\begin{equation}\sqrt{s}\end{equation}
sqrt(s)
指数関数
\begin{equation}\exp{s}\end{equation}
exp(s)
自然対数
\begin{equation}\ln{s}\end{equation}
log(s)
正弦関数
\begin{equation}\sin{s}\end{equation}
sin(s)
余弦関数
\begin{equation}\cos{s}\end{equation}
cos(s)
正接関数
\begin{equation}\tan{s}\end{equation}
tan(s)
偏微分方程式の離散化項
文字の説明
\(\phi\):vol<Type>Field
\(\rho\):scalar,volScalarField
\(\psi\):surfaceScalarField
\(\chi\):surface<Type>Field,vol<Type>Field
↓有限体積法における差分についてはこちら
(準備中)
ラプラシアン(Laplacian)
ラプラシアン演算子
\begin{align}
\Delta
=\nabla^{2}=\nabla\cdot\nabla
=\frac{\partial^{2}}{\partial x_{1}^{2}} + \frac{\partial^{2}}{\partial x_{2}^{2}} + \frac{\partial^{2}}{\partial x_{3}^{2}}
\end{align}
\begin{equation}\nabla^{2}\mathbf{\phi}\end{equation}
laplacian(phi)
\begin{equation}\nabla\cdot\Gamma\nabla\mathbf{\phi}\end{equation}
laplacian(Gamma,phi)
時間項
\begin{equation}\frac{\partial \mathbf{\phi}}{\partial t}\end{equation}
ddt(phi)
\begin{equation}\frac{\partial \rho\mathbf{\phi}}{\partial t}\end{equation}
ddt(rho, phi)
対流項
Programmer's Guideには引数にshcheme
やword
が入っているが使ったことがない
\begin{equation}\nabla\cdot\left(\psi\right)\end{equation}
div(psi)
\begin{equation}\nabla\cdot\left(\psi\mathbf{\phi}\right)\end{equation}
div(psi, phi)
発散
\begin{equation}\nabla\cdot\chi\end{equation}
div(chi)
勾配
他にもgGrad()
やlsGrad()
,snGrad()
などの派生形があるが使ったことがない
\begin{equation}\nabla\chi\end{equation}
grad(chi)
ソース項
\begin{equation}\rho\phi\end{equation}
Sp()は陰関数
Sp(rho, phi)
SuSp()はrhoの符号で陰関数か陽関数かが変わる
SuSp(rho, phi)
fvm::
とfvc::
の違い
上に示したコードをOpenFOAMで使う際は,fvm::
もしくはfvc::
を頭に付ける必要がある
2つの違いは,それぞれの関数が返してくる値にある
fvm::
は陰関数を指定するもので,偏微分方程式の変数を含んだ代数方程式を返してくる
一方,fvc::
は陽関数を指定するもので,偏微分方程式で定数として扱われる特定の値が返ってくる
≫陰関数と陽関数の意味と違いについて _ 高校数学の美しい物語
fvm and fvc contain static functions, representing differential operators, e.g. \(\nabla^{2}\), \(\nabla\cdot\) and \(\partial/\partial t\), that discretise geometricField<Type>s. The purpose of defining these functions within two classes, fvm and fvc, rather than one, is to distinguish:
・functions of fvm that calculate implicit derivatives of and return an fvMatrix
・some functions of fvc that calculate explicit derivatives and other explicit calculations, returning a geometricField.
OpenFOAM® Documentation – Programmer’s Guide P-38
おわりに
OpenFOAMでプログラムを実装する際に使う演算についてまとめた
今回紹介していない演算も多くあるので,詳細はProgrammer's Guideを見てほしい
↓テンソル演算についての詳細はこちら
コメント