fluentの計算結果からカーペット図を作成
By M.Sato
はじめに
解析結果を評価する際に、コンター図を表示して値の大小を色で表示することができます。 一般には、これで問題ないと思いますが、直感的に値の分布を把握するために、三次元的にコンター図を表示したい場合もあると思います。 三次元的なコンター図とは以下に示すような図のことです。
この図の水平面(xy面)が座標平面を表しており、縦軸(z軸)が変数の値を高さとして表示しています。 山の高低で値の大小を表示しているということですね。 このような図は、カーペット図などと呼ばれます。 fluentにはこのような図を表示する機能がないため、pythonのmatplotlibライブラリを使い、三次元散布図で近似的に表示できるようにしてみました。
計算モデル
ここでは、fluentのツートリアル例題 mixing-elbow の計算結果を使用します。
2次元面で表示したコンター図
三次元計算モデルの場合、面を指定してコンター図を表示することになります。
$z=0$面、$y=0.1$面における圧力コンター、温度コンター図を示します。これらをカーペット図として表示してみます。
カーペット図の作成
作成手順は以下のようになります。
(A) 検査面の作成(面の局所座標軸$\xi$、$\eta$の方向を確認しておきます)
(B) 検査面上の節点座標値、出力したい変数値をxyプロットデータとして出力
(C) プロット用のデータ点ファイルを作成。データ点は($\xi$軸値,$\eta$軸値,出力変数値)の集合
(D) matplotlibを使い図を表示
💡 $\xi,\eta$は全体座標系の$x,y,z$のいずれかになる
それでは、各手順を説明します。
(A) 検査面の作成
カーペット図を表示したい断面を予め作成しておきます。 ここは通常fluentの操作と同じなので詳細は説明しません。 またここでは、処理を簡単に行うために座標軸に直交する断面を使いました(座表軸に直交していない場合は座標値をスケールする必要があります)。
- $z=0$面 (境界symmetry-xyplaneと同じ)
- $y=0.1$面 (新規作成)
(B) 検査面上の節点データを出力
次にfluent内で plot -> xyplot コマンドを使い検査面上のデータ(座標値、出力したい変数値)をファイルに出力します。 $z=0$面については、$x$、$y$座標値、温度値が必要になります。 “節点並べ替え無し”で$z=0$面(symmetry-xyplane面)での$y$座標値を表示すると以下に示すようにメッシュ図が表示されます。 “節点並べ替え有り”の場合は、連続した折れ線として表示されます。 どうやら、この面内における節点座標を対象にして図を作成しているようです。 この面上のデータをファイルに出力します。
なお、”節点並べ替え”オプションはどちらでもよいと思いますが、各ファイルを出力する際には、必ず同じ指定にしておいてください(節点の場所がずれる)。
検査面$z=0$では、面内の局所座標($\xi,\eta$)が$x,y$となるので、x座標値、y座標値を出力するようにします。
出力ファイル(xxxx-z=0.xy、yyyy-z=0.xy、temp-z=0.xy)の内容は以下のようになっています。データは横軸値、縦軸値の組になっています。
- ファイル xxxx-z=0.xy
(title "X-Coordinate")
(labels "Position" "X-Coordinate")
((xy/key/label "symmetry-xyplane")
-0.2 -0.2
-0.2 -0.2
-0.2 -0.2
-0.2 -0.2
-0.2 -0.2
-0.2 -0.2
[snip]
0.2 0.2
0.2 0.2
0.2 0.2
0.2 0.2
0.2 0.2
0.2 0.2
)
- ファイル yyyy-z=0.xy
(title "Y-Coordinate")
(labels "Position" "Y-Coordinate")
((xy/key/label "symmetry-xyplane")
-0.2 -0.2
-0.2 -0.198605
-0.2 -0.196953
-0.2 -0.195002
-0.2 -0.192315
-0.2 -0.186897
[snip]
0.2 0.165051
0.2 0.172704
0.2 0.180356
0.2 0.188136
0.2 0.196045
0.2 0.2
)
- ファイル temp-z=0.xy
(title "Static Temperature")
(labels "Position" "Static Temperature")
((xy/key/label "symmetry-xyplane")
-0.2 293.15
-0.2 293.15
-0.2 293.15
-0.2 293.15
-0.2 293.15
-0.2 293.15
[snip]
0.2 297.689
0.2 297.809
0.2 297.917
0.2 298.005
0.2 298.107
0.2 298.148
)
(C) プロット用データの作成
各ファイルの縦軸値を組み合わせて作図用データを作成します。 手作業で作図用データファイルを作成するのは煩雑なので以下のようなシェルスクリプトを作成し、バッチ処理で変換を行います。 これで$(x,y,T)$のデータ組を作成することができます。対象とするファイル名は適当に修正してください。
- $z=0$面の温度データ(temp-z=0.txt)を作成する例
paste xxxx-z=0.xy yyyy-z=0.xy temp-z=0.xy | \ # ファイルを横に並べて結合
sed -e 's/\r//g' | \ # 余分な改行文字が入っている場合は削除
sed -n -e '/^[0-9-]/p' | \ # 数値で始まる行のみを抽出
cut -f 2,4,6 > temp-z=0.txt # 第2,4,6フィールドのみを抽出
- $y=0.1$面の圧力データ(pres-y=0.1.txt)を作成する例 (ここでは局所座標$\xi=x,\eta=z$になっていることに注意)
paste xxxx-y=0.1.xy zzzz-y=0.1.xy pres-y=0.1.xy | \ # ファイルを横に並べて結合
sed -e 's/\r//g' | \ # 余分な改行文字が入っている場合は削除
sed -n -e '/^[0-9-]/p' | \ # 数値で始まる行のみを抽出
cut -f 2,4,6 > pres-y=0.1.txt # 第2,4,6フィールドのみを抽出
$y=0.1$面の圧力データ(pres-y=0.1.txt)を作成する例 (ここでは局所座標$\xi=x,\eta=z$になっていることに注意)
例えば、作成された temp-z=0.txtの中身は以下のようになります。 これは散布データ($x,y,T$)の組になっています。
- ファイル temp-z=0.txt
-0.2 -0.2 293.15
-0.2 -0.198605 293.15
-0.2 -0.196953 293.15
-0.2 -0.195002 293.15
[snip]
0.2 0.180356 297.917
0.2 0.188136 298.005
0.2 0.196045 298.107
0.2 0.2 298.148
(D) matplotlibで図表示
pythonのプロットライブラリmatplotlibを使い散布図を作成します。 散布図なので離散点の表示になっていますが、変数の大小を定性的に把握できるのではないかと思います (標高面として表示するためには基底$xy$面を三角形で分割する必要があるので、点列データでは簡単には表示できません)。 なお、表示された図は三次元グラフィックになっているのでマウスで向きを自由に変えることができます。 図表示を行うpythonスクリプトを以下に示します。
- pythonスクリプト (carpet-z0.py)
import matplotlib.pyplot as plt
import numpy as np
#-------------------------------- read data
file_path = "temp-z=0.txt" # 読み込みファイル名指定
with open(file_path, "r") as file:
lines = file.readlines()
x = []; y = []; z = []
for line in lines:
coordinates = line.strip().split()
xx, yy, zz = map(float, coordinates)
x.append(xx)
y.append(yy)
z.append(zz)
(mini, maxi) = (min(z), max(z))
zmin = mini - (maxi-mini)*0.1
zmax = maxi + (maxi-mini)*0.1
#-------------------------------- end
plt.rcParams['font.family'] = 'sans-serif'
fig = plt.figure(figsize=(8,8))
ax = fig.add_subplot(projection='3d')
ax.set_title("temperature (z=0)",size=20) # 図タイトル
ax.set_xlabel("x[m]",size=15,color="black") # x軸ラベル
ax.set_ylabel("z[m]",size=15,color="black") # y軸ラベル
ax.set_zlabel("temperature[C]",size=15,color="black") # z軸ラベル
ax.set_xlim((-0.25,0.25)) # x軸表示範囲
ax.set_ylim((-0.25,0.25)) # y軸表示範囲
ax.set_zlim((zmin,zmax)) # z軸表示範囲
ax.scatter(x,y,z,s=10,c=z,cmap="coolwarm") # 散布図として表示。s=10はシンボルサイズ、c=zはz値で色表示の意味
plt.show()
端末から以下のコマンドを実行します。
pyhton carpet-z0.py
最後に4種類の図($z=0,y=0.1$面での温度、圧力)を同時に表示する例を示します。 configという辞書に各プロット図のパラメータを定義しています。
- pythonスクリプト (carpet-all.py)
import matplotlib.pyplot as plt
import numpy as np
config = {
'temp-z0': {
'file': 'temp-z=0.txt',
'limit': { 'xmin': -0.25,
'xmax': 0.25,
'ymin': -0.25,
'ymax': 0.25, },
'title': 'temperature (z=0)',
'xlabel': 'x[m]',
'ylabel': 'y[m]',
'zlabel': 'temperature[C]',
'symbolsize': 10,
},
'pres-z0': {
'file': 'pres-z=0.txt',
'limit': { 'xmin': -0.25,
'xmax': 0.25,
'ymin': -0.25,
'ymax': 0.25, },
'title': 'pressure (z=0)',
'xlabel': 'x[m]',
'ylabel': 'y[m]',
'zlabel': 'pressure[Pa]',
'symbolsize': 10,
},
'temp-y01': {
'file': 'temp-y=0.1.txt',
'limit': { 'xmin': 0.1,
'xmax': 0.2,
'ymin': 0.0,
'ymax': 0.1, },
'title': 'temperature (y=0.1)',
'xlabel': 'x[m]',
'ylabel': 'z[m]',
'zlabel': 'temperature[C]',
'symbolsize': 50,
},
'pres-y01': {
'file': 'pres-y=0.1.txt',
'limit': { 'xmin': 0.1,
'xmax': 0.2,
'ymin': 0.0,
'ymax': 0.1, },
'title': 'pressure (y=0.1)',
'xlabel': 'x[m]',
'ylabel': 'z[m]',
'zlabel': 'pressure[Pa]',
'symbolsize': 50,
},
}
plt.rcParams['font.family'] = 'sans-serif'
fig = plt.figure(figsize=(8,8))
nplot=0
for plot in ('temp-z0', 'pres-z0', 'temp-y01', 'pres-y01'):
nplot += 1
file = config[plot]['file']
xmin = config[plot]['limit']['xmin']
xmax = config[plot]['limit']['xmax']
ymin = config[plot]['limit']['ymin']
ymax = config[plot]['limit']['ymax']
title = config[plot]['title']
xlabel = config[plot]['xlabel']
ylabel = config[plot]['ylabel']
zlabel = config[plot]['zlabel']
symbolsize = config[plot]['symbolsize']
#-------------------------------- read data
with open(file, "r") as file:
lines = file.readlines()
x = []; y = []; z = []
for line in lines:
coordinates = line.strip().split()
xx, yy, zz = map(float, coordinates)
x.append(xx)
y.append(yy)
z.append(zz)
(mini, maxi) = (min(z), max(z))
zmin = mini - (maxi-mini)*0.1
zmax = maxi + (maxi-mini)*0.1
#-------------------------------- end
ax = fig.add_subplot(2,2,nplot,projection='3d')
ax.set_title(title,size=20)
ax.set_xlabel(xlabel,size=15,color="black")
ax.set_ylabel(ylabel,size=15,color="black")
ax.set_zlabel(zlabel,size=15,color="black")
ax.set_xlim((xmin,xmax))
ax.set_ylim((ymin,ymax))
ax.set_zlim((zmin,zmax))
ax.scatter(x,y,z,s=symbolsize,c=z,cmap="coolwarm")
plt.show()
端末から以下のコマンドを実行します
pyhton carpet-all.py
まとめ
pythonのプロットライブラリmatplotlibを使い、コンターをカーペット図として近似的に表示できるようにしてみました。 変数の分布を三次元的に標高データとして表示することができるようになります。 少し手間がかかりますが、計算モデルによってはこのような図表示をすることで直感的に分布を把握しやすくなると思います。 適当に参考にしてください。
👉 本記事で使用したデータやプログラムを実際に試したい場合は、弊社までお問い合わせください。
弊社の解析事例
弊社の流体解析事例については、下記のリンクからご覧ください.