日々の雑記帳

日々感じたこと、学んだことの備忘録

GW前半 京都旅行(3)

京都旅行3日目、最終日。 最終日は、奈良方面へ行ってみることにした。奈良といえば、思いつくメジャーな観光スポットがいくつかあるが、まず法隆寺に行った。聖徳太子の時代に建立されたこともあって、ある意味、京都の有名どころの神社仏閣よりも地味であるが、歴史の重みを感じた。それが返って、安定感というか表面上だけではない本格さを感じた。京都よりも人も少なく、ゆっくりと見ることができた。のんびりした住宅街の中にポツンとある感じで、周辺があまり観光地化されていないのも、ゆっくりと見学するには良い。法隆寺の後は、京都方面に戻る途中で宇治の平等院に立ち寄った。平等院へ行ったのは、高校の修学旅行以来だろうか。

GW前半 京都旅行(2)

4/29京都旅行2日目。2日目は太秦東映映画村から。実際の映画のセットや楽屋も見学できるかなと期待していたが、あまり実際に使われているものは少なく、アトラクション的なものが中心であった。
東映映画村の後は、亀岡までJR嵯峨野線で上がっていき、保津川下りを体験した。 確か6年前にも行ったが、今回は前から2列目の座席だったこともあり、特に急流域を下る時は、迫力が感じられスリリングであった。けっこう、水しぶきが来て、濡れることもあった。
夜は、先斗町焼肉店で夕食をとった。近江牛が売りということもあって、かなり美味しかった。値段もそれなりにしたが・・・

GW前半 京都旅行(1)

このGW前半(4/27〜4/29)に2泊3日で京都に旅行に行ってきた。

まず、初日(4/27)から。
京都駅に13:30頃に到着して、河原町のホテルに移動し14:00 頃にホテルにチェックイン。
チェックイン後は、四条大橋祇園周辺を散策しながら、三十三間堂まで歩いて、そのまま三十三間堂を見学した。
千体もの仏像が並んでいる様相はやはり圧巻であった。
思い出してみると、三十三間堂は高校の修学旅行以来なので、20年以上ぶりになる。その時も鮮明に覚えているが、それだけ歴史的な重みや手入れがちゃんと行き届いているからであろう。 残念ながら、三十三間堂は内部は撮影できず。 夜は、祇園の裏道に入ったところの和食居酒屋で夕食を取った。京都らしく味付けは上品であるが、出汁がちゃんとしていて、美味しかった。

gmshインストールメモ

gmshインストールメモ

これは、gmshをインストールした際のメモである。

インストール環境

インストーラーの取得&インストール

gsmhの公式ホームページ中のmacOS(ARM)をダウンロード。
gmsh公式ホームページ
https://gmsh.info

2024年5月3日現在、安定版最新バージョンは、4.12.2である。

ダウンロードしたインストーラー「gmsh-4.12.2-MacOSARM.dmg」をダブルクリックしてインストール。
下図のようなウィンドウが現れる。「Gmsh.app」をApplicationsフォルダに移動する。

  

Gmshの起動

アプリケーション中の「Gmsh.app」アイコンをダブルクリックすると、以下のようにgmshが起動する。

Gmshのインストール(Homebrew経由)

Homebrew経由でもgmshをインストール可能である。 ターミナルを開いて、以下のコマンドを入力する。

brew install gmsh  

which gmshを入力すると、以下のフォルダにインストールされているようである。
/opt/homebrew/bin/gmsh

こちらのインストールでは、CUIも使えるので、コマンドを使用しての高度な利用や自動化においては、こちらの方が良いかもしれない。

simpleFoam流体力履歴のプロット

概要・背景

物体周りの流れの解析を定常解析で実施する場合、特に形状が複雑な場合、目標残差に収束せず計算が何ステップにわたり継続し、計算がなかなか終了できない状況も起こりうる。

そのような場合、残差だけではなく、評価したい物理量の履歴をプロットして、その変動が落ち着いている(変動幅が一定範囲内にあるか、周期的であるか等)ことを確認して計算の終了を判断することも一つの手段である。

評価する物理量としては、解析する対象により様々であるが、物体周りの流れ解析の場合は、例えば以下のものが代表的であろう。

  • 物体に作用する流体力(圧力、粘性力、圧力と粘性力の合成)
  • 抗力
  • 揚力
  • モーメント

ここでは、OpenFOAMのsimpleFomaソルバー(定常乱流場解析)で出力される物体に作用する流体力(圧力、粘性力、圧力と粘性力の合成)の履歴をプロットするPythonスクリプトを作成したメモである。

使用環境

使用環境は以下になる。
- OpenFOAM ver2312 - Python 3.10

OpenFOAMにおける設定

simpleFoamの計算で物体に作用する流体力を出力するには、functionObjectの機能を用いる。具体的には、/system/controlDictファイルに以下の出力指示を追加する。設定項目の詳細説明は追々調査して記事にしてみようと思う。

なお、ここではmotorbikeのチュートリアルで実施した。

functions
{
    forces1
    {
        type    forces;
        libs    (forces);
        writeControl timeStep;
        timeInterval 1;
        patches (motorBikeGroup);
        rho     rhoInf;
        log     true;
        rhoInf  1;
        CofR    (0.72 0 0);
        pitchAxis   (0 1 0);
    }
}

流体力の出力

流体力は以下のとおり、/postProcessing/ディレクトリに出力される。
- 流体力の履歴 /postProcessing/forces1/0/force.dat

流体力のプロット

上記で出力された流体力の履歴データファイルを読み込み、プロットする。 以下、プロットするのに作成したPythonスクリプトを示す。

流体力の履歴をプロットするPythonスクリプト例。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os

# Forceダータの読み込み
def read_force_dat():
    df_force = np.loadtxt("./postProcessing/forces1/0/force.dat")
    df_force = pd.DataFrame(df_force, columns=['Time','total_x','total_y','total_z','pressure_x','pressure_y','pressure_z','viscous_x','viscous_y','viscous_z'])
    return df_force

# 読み込んだForceデータのプロット
def force_plot(df):
    x = ['Time']
    y1 = ['total_x','total_y','total_z']
    y2 = ['pressure_x','pressure_y','pressure_z']
    y3 = ['viscous_x','viscous_y','viscous_z']

    for i in range(len(y1)):
        plt.plot(df[x[0]], df[y1[i]],label=y1[i])
        plt.grid()
        plt.legend(loc='best', bbox_to_anchor=(1, 1))
        plt.xlabel(x[0])
        plt.ylabel('force_total')
    plt.savefig("force_total.png")
    plt.show()
    
    for i in range(len(y2)):
        plt.plot(df[x[0]], df[y2[i]],label=y2[i])
        plt.grid()
        plt.legend(loc='best', bbox_to_anchor=(1, 1))
        plt.xlabel(x[0])
        plt.ylabel('force_pressure')
    plt.savefig("force_pressure.png")
    plt.show()

    for i in range(len(y3)):
        plt.plot(df[x[0]], df[y3[i]],label=y3[i])
        plt.grid()
        plt.legend(loc='best', bbox_to_anchor=(1, 1))
        plt.xlabel(x[0])
        plt.ylabel('force_viscous')
    plt.savefig("force_viscous.png")
    plt.show()

# メイン処理
df = read_force_dat()
force_plot(df)

以下に上記Pythonスクリプトでプロットした図を示す。
流体力の履歴としては以下の3種類出力される。
- トータル(圧力+粘性力) - 圧力 - 粘性力   

履歴のプロットから分かるように、流体力は圧力の寄与分が支配的である。

流体力の履歴プロット(圧力+粘性力)

流体力の履歴プロット(圧力)

流体力の履歴プロット(粘性)

simpleFoamの残差プロット

概要

本記事は、OpenFOAMのsimpleFomaソルバー(定常乱流場解析)の残差をプロットするPythonスクリプトを作成したメモである。

使用環境

使用環境は以下になる。
- OpenFOAM ver2312 - Python 3.10

OpenFOAMにおける設定

simpleFOAMの計算において、logファイルに残差が出力されるが、logファイルだけでは残差を抽出するには、少々フォーマットが煩雑で扱いにくい。幸い、OpemFOAMでは残差だけを抽出するような設定が準備されている。以下のように、/system/controlDictファイルに残差を出力するように命令を追記する。
continuityError1は連続式の残差(保存則)、residualsは速度、乱流諸量の残差の出力設定である。

functions
{
    continuityError1
    {
        type  continuityError;
        libs
        (
            fieldFunctionObjects
        ); // Mandatory enties (unmodifiable) // Optional entries (runtime modifiable)
        phi phi;  //Optional (inrerited) entries
        writePrecision 8;
        writeToFile yes;
        useUserTime yes;
        region region0;
        enabled yes;
        log yes;
        timeStart 0;
        timeEnd 500;
        executeControl timeStep;
        executeInterval 1;
        writeControl timeStep;
        writeInterval 50;
    }

    residuals
    {
        type    solverInfo;
        libs    ("libutilityFunctionObjects.so");
        fields  (U p k omega);
    }
}

残差の出力

残差は以下のとおり、/postProcessing/ディレクトリに出力される。
- 連続式の残差 /postProcessing/continuityError1/0/continuityError.dat - 流速、乱流諸量の残差 /postProcessing/residuals/0/solverInfo.dat

残差のプロット

上記で出力された残差データファイルを読み込み、プロットする。 以下、プロットするのに作成したPythonスクリプトを示す。

流速および乱流諸量の残差をプロットするPythonスクリプト例。

import pandas as pd
import matplotlib.pyplot as plt
import os

# 残差ファイルの読み込み
def read_residual():
    df_residual = pd.read_table('./postProcessing/residuals/0/solverInfo.dat', skiprows=1)
    df_residual = pd.DataFrame(df_residual)
    return df_residual
    #print(df_residual.columns)

# 残差プロット
def residual_plot(df):
    init_res = [data for data in df.columns if "initial" in data]
    final_res = [data for data in df.columns if "final" in data]

    # initial residualプロット
    df.plot(x="# Time        ", y=init_res)
    plt.grid()
    plt.legend(loc='best', bbox_to_anchor=(1, 1))
    plt.yscale('log')
    plt.xlabel('time')
    plt.ylabel('initial residual')
    plt.show()

    # final residualプロット
    df.plot(x="# Time        ", y=final_res)
    plt.grid()
    plt.legend(loc='best', bbox_to_anchor=(1, 1))
    plt.yscale('log')
    plt.xlabel('time')
    plt.ylabel('final residual')
    plt.show()

df = read_residual()
residual_plot(df)

連続の式の残差(保存則)をプロットするPythonスクリプト例。
連続の式の残差データファイルは、区切りスペースが統一されていないため、まずnumpyのloadtxt関数で読み込み、numpy配列とした後にpandasでデータフレーム化している。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os

# 連続の式の残差ファイルを読み込む
def read_continuity_error():
    df_continuity = np.loadtxt("./postProcessing/continuityError1/0/continuityError.dat")
    df_continuity = pd.DataFrame(df_continuity, columns=['Time','Local','Global','Cumulative'])
    return df_continuity

# 連続の式の残差プロット
def continuity_error_plot(df):
    x = ['Time']
    y = ['Local', 'Global', 'Cumulative']

    for i in range(len(y)):
        plt.plot(df[x[0]], df[y[i]])
        plt.grid()
        plt.legend(loc='best', bbox_to_anchor=(1, 1))
        plt.xlabel(x[0])
        plt.ylabel(y[i] + ' ' + 'continuity')
        plt.show()

df = read_continuity_error()
continuity_error_plot(df)

以下に上記Pythonスクリプトでプロットした図を示す。
流速、乱流諸量の残差は、initialとfinalの2種類、連続式の残差はLocal、Global、Cumulativeの3種類ある。これらの違いは追々調査してまとめる。

流速、乱流諸量の残差プロット1

流速、乱流諸量の残差プロット2

連続式の残差プロット1

連続の式の残差プロット2

連続の式の残差プロット3
連続の式の残差プロット3

reactingFoam機能確認その1

概要

OpenFOAMでは、化学反応や燃焼を計算するソルバーとして、reactingFoamが用意されている。本記事は、reactingFoamの基本的な機能を確認した際のメモである。

実施した例題

reactingFoam内にあるチュートリアルのうち、以下の例題を実施した。
- counterFlowFlame2D

燃焼計算を行う場合

チュートリアルファイルを変更せず、そのまま実行する。

blockMesh
reactingFoam

以下結果を示す。

温度 0.05sec

温度 0.5sec

メタン濃度 0.05sec

メタン濃度0.5sec

酸素濃度 0.05sec

酸素濃度 0.5sec

上記の結果より、左側より燃料(メタン)、右側より空気(酸素)が流入し、中央部で燃料と空気が混合、燃焼反応が生じて温度の上昇が見られる。

コールドフロー計算を行う場合

次は、反応を伴わない、つまりコールドフローの計算を行うことを考える。例えば、化学種の移流拡散計算を行うことに相当する。
反応を伴わない計算を実行する場合、constant/chemistryPropertiesファイルとconstant/combustionPropertiesファイルを編集する必要がある。
具体的には以下を変更する。
- constant/chemistryPropertiesの場合
chemistry on → offに変更.

  • constant/combustionPropertiesの場合
    active true → fasleに変更.

chemistryProperties変更点
.

combustionProperties変更点
.

下記に結果を示す。
左側からメタン、右側から酸素が流入しているが、燃焼反応がせず温度上昇は見られないことより、コールドフローの計算がされていることが確認できる。

温度 0.05sec
.

温度 0.5sec
.

メタン濃度 0.05sec
.

メタン濃度 0.5sec
.

酸素濃度 0.05sec
.

酸素濃度 0.5sec
.