【OpenFOAM v2106】プログラム実装で使う演算まとめ

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 && TmagSqr(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には引数にshchemewordが入っているが使ったことがない

\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を見てほしい

↓テンソル演算についての詳細はこちら

 

 

 

 

 

コメント

タイトルとURLをコピーしました