境界面の任意の座標に作用する壁せん断応力の出力方法について

700 views
Skip to first unread message

MiyashitaKousei

unread,
Jan 20, 2023, 7:27:27 AM1/20/23
to OpenFOAM
宮下と申します。
OpenFOAM等の解析ソフトに触れるのは初めてで、サンプルプログラムを動かしたり、ネットの文献を見ながら勉強しています。

 境界面の一つに凸形状を作成し、凸形状のある境界面と反対側の境界面から非定常の流れを与え、流れは凸形状のある面に衝突した後に、凸形状と流入面の2つの面を除いた4つの境界面から流出させる計算モデルを作成しました。
 (0 3 2 1)面に凸形状を作成し、(4 5 6 7)面を流入面として、それ以外の4面は流出面としました。
Screenshot_20230118_185704_Galaxy Notes.jpg
nagare.png
 先日質問した「icoFOAMでコアダンプしてしまうことの解決方法について」と同じ計算モデルを使用しています。流速や時間刻みなどは少し変えましたが、境界条件などに変更はありません。


【やりたいこと】
 境界面に作成した凸形状の頂点に作用する壁せん断応力の値を出力し、他の凸形状との値の比較や流れの条件による比較を行いたいです。指定した座標(x y z)の壁せん断応力をCプログラム等で操作できる形(明確な値として)で出力したいです。座標の値は計算実行前に判明しています。

【困っていること」
 壁せん断応力の出力方法がわかりません。壁せん断応力という有名な項目についての出力方法が実装されていないはずがないので、明らかに私の調べが悪いということは自覚しています。
 使用しているバージョンは8で、icoFoamで解析しています。以前のバージョンであればwallShearStressなどコマンドが使えたようなのですが、バージョン8では コマンドが見つかりません といわれてしまいました。
 過去の質問も参考にしながら試行錯誤していますが、任意の座標となると難しく、OpenFOAMユーザーガイドのユーティリティ欄-有効そうなものが見当たりませんでした。(私の見落としも十分に考えられると思います。)

【やらなければ行けないと考えていること】
 現在やろうとしていることがあまりにも都合が良すぎるので、現状のケースフォルダのどこかに壁せん断応力を出力できるようなプログラムを加筆する必要があるのではないかと考えています。

非常に初歩的な質問だと思いますが、
どなたかにご教授いただければ幸いです。よろしくお願い致します。
Message has been deleted

M.TANAKA

unread,
Jan 20, 2023, 10:09:38 AM1/20/23
to OpenFOAM
icoFoamでwallShearStressが使えないなら、simpleFoam + "simulationType laminar;"としてみてはいかがでしょうか。

2023年1月20日金曜日 21:27:27 UTC+9 MiyashitaKousei:

M.TANAKA

unread,
Jan 20, 2023, 10:20:21 AM1/20/23
to OpenFOAM
訂正:icoFoamは非定常ソルバなので、対応させるならsimpleFoamではなくpimpleFoamですね。

2023年1月21日土曜日 0:09:38 UTC+9 M.TANAKA:

MiyashitaKousei

unread,
Jan 20, 2023, 11:14:19 AM1/20/23
to OpenFOAM
M.TANAKA様
夜分遅くに返信ありがとうございます。

確かに他のソルバーに切り替えて計算をしてみるのはいい手だと感じました。
しかし、私はあくまで非定常流で計算をしたいと考えていたので、定常流解析ソルバーのsimpleFoamではそれが実現できません。同じ非圧縮性流体のソルバーならpisoFoamとpimpleFoamがあるので、そのどちらかをsimulationType laminarとして計算してみようと思います。

質問をしてから返信をいただくまでの間に調べていたのですが、postProcess(ポスト処理)が使えるのではないかと感じたため、
postProcess -list のコマンドを打ち込んだところ、

Available configured functionObjects;
74
CourantNo
Lambda2
.
.
.
shearStress
.
)

が確認できたので、せん断応力を求める希望が見えてきました。
ユーザーガイドも見ながら使い方を学んでいますが、以下の2つのサイトを参考にして今勉強しています。

OpenFOAMのpostProcessについて
【OpenFOAM】ポスト処理チートシート(随時更新)

2つ目のサイトに取得したい物理量と点の座標をしていしている例があったので、実際に試してみました。
systems内にprobesという新しいディクショナリファイルを用意し

「probes内容」
fields (shearStress);      // 取得したい物理用
probeLocations
(
  (x y z)     // 取得したい点の座標(x y z)
);

を記入したあと、
caseDir$  で postProcess -func probes コマンドを実行しました。
その結果、以下のようなエラーが出てしまいました。
-------------------------------------------------------
Create time
Create mesh for time = 0

--> FOAM FATAL IO ERROR:
keyword type is undefined in dictionary "controlDict/functions/probes"

file: controlDict/functions/probes from line 4 to line 5.

    From function const Foam::entry& Foam::dictionary::lookupEntry(const Foam::word&, bool, bool) const
    in file db/dictionary/dictionary.C at line 797.
--------------------------------------------------------

触っていないはずのcontrolDictについて言及されたので、これから詳しい内容を探っていきます。
とりあえず打ち込んでみた icoFoam -postProcess -func shearStressコマンドを実行したところ、次のようなオプションが提示されました。おそらくはオプションが不足していることを示されているのではないかと思っています。
--------------------------------------------------------
Usage: icoFoam [OPTIONS]
options:
  -case <dir>       specify alternate case directory, default is the cwd
  -fileHandler <handler>
                    override the fileHandler
  -hostRoots <(((host1 dir1) .. (hostN dirN))>
                    slave root directories (per host) for distributed running
  -libs <(lib1 .. libN)>
                    pre-load libraries
  -listFunctionObjects
                    List functionObjects
  -listRegisteredSwitches
                    List switches registered for run-time modification
  -listScalarBCs    List scalar field boundary conditions (fvPatchField<scalar>)
  -listSwitches     List switches declared in libraries but not set in
                    etc/controlDict
  -listUnsetSwitches
                    List switches declared in libraries but not set in
                    etc/controlDict
  -listVectorBCs    List vector field boundary conditions (fvPatchField<vector>)
  -noFunctionObjects
                    do not execute functionObjects
  -parallel         run in parallel
  -roots <(dir1 .. dirN)>
                    slave root directories for distributed running
  -srcDoc           display source code in browser
  -doc              display application documentation in browser
  -help             print the usage

Using: OpenFOAM-8 (see https://openfoam.org)
Build: 8-1c9b5879390b



--> FOAM FATAL ERROR:
Wrong number of arguments, expected 0 found 1
Invalid option: -postProcess
Invalid option: -func


FOAM exiting
--------------------------------------------------------------

引き続き問題解決にむけて作業していきます。

MiyashitaKousei

unread,
Jan 20, 2023, 11:27:20 AM1/20/23
to OpenFOAM
追記です。

postProcess -func probesコマンドを実行した際に出たエラー分ですが、

「nonNewtonianicoFoam例題での壁面せん断応力の出力の方法についてのご質問」で書かれていた内容を真似て自分でcontrolDictに手を加えていました。これが原因していたのではないかと思います。

controlDictに可筆した部分は
--------------------------------------------------------
func
    {
        type        wallShearStress;
        patches    ("noSlipWall");
        outpurtControl    outputTime;
        outputInterval    0.1;
    }
-----------------------------------------------------------
です。おそらく様々なサイトを見ながら作業しているため、コマンドや可筆文に入れ違いが多数発生していると思うので、今一度新しくケースディレクトリを作り直し、pimpleFoam用にまとめ直したいと思います。
2023年1月21日土曜日 1:14:19 UTC+9 MiyashitaKousei:

MiyashitaKousei

unread,
Jan 20, 2023, 3:21:50 PM1/20/23
to OpenFOAM
途中経過です。
pimpleFoamを層流に設定して、壁せん断応力を出力するfunctionもcontrolDictに埋め込み、blockMeshでメッシュを作成し、checkMeshの結果もOK。あとはpimpleFoamを実行するだけというところでエラー文が出ました。

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

Create time

Create mesh for time = 0

PIMPLE: No convergence criteria found

PIMPLE: Operating solver in transient mode with 1 outer corrector
PIMPLE: Operating solver in PISO mode

Reading field p

Reading field U

Reading/calculating face flux field phi

Selecting incompressible transport model Newtonian
Selecting turbulence model type laminar
Selecting laminar stress model Stokes
No MRF models present

No finite volume options present
Courant Number mean: 2.50948e-05 max: 0.000552873

Starting time loop



--> FOAM FATAL IO ERROR:
incorrect first token, expected <int> or '(', found on line 6 the word 'fieldFunctionObjects'

file: /home/miyashita/pimple/pim01/pim1/system/controlDict/functions/shearStress1/libs at line 6.

    From function Foam::Istream& Foam::operator>>(Foam::Istream&, Foam::List<T>&) [with T = Foam::fileName]
    in file /home/ubuntu/OpenFOAM/OpenFOAM-8/src/OpenFOAM/lnInclude/ListIO.C at line 148.

----------------------------------------------------------------------------------------------------------
これを見る限り、system/shearStressのlibsが悪さをしているのだと思うのですが、いまいちその解決方法がわかっていません。
system/shearStressの中身は
--------------------------------------------------------------------------------------------
shearStress1
{
    type        wallShearStress;
    libs        (fieldFunctionObjects);
   
    patches    (noSlipWall);
   
    writePrecision    8;
    writeToFile    true;
    useUserTime    true;
    region        region0;
    enabled    true;
    log        true;
    timeStart    0;
    timeEnd    0.1;
    executeControl    timeStep;
    executeInterval    1;
    writeControl    timeStep;
    writeInterval    10;
}
-----------------------------------------------------------------------------------------------------
controlDictの表記は以下の通りで、いくつかの設定はpim1.paramsに記載してあります。
個人的にはshearStressのlibsの記載の仕方が間違っている。もしくはpimpleFoamを実行するための他のパラメータが揃っていない。などが考えられると思います。層流の設定をしてしまえばある程度の設定を省略できると考えていたので、もし間違いでしたら教えていただけたら嬉しいです。
----------------------------------------------------------------------------------------------------
application     pimpleFoam;

startFrom       startTime;

startTime       0;

stopAt          endTime;

endTime         endTimeValue;

deltaT          deltaTValue;

writeControl    timeStep;

writeInterval   writeIntervalValue;

purgeWrite      0;

writeFormat     ascii;

writePrecision  6;

writeCompression off;

timeFormat      general;

timePrecision   6;

runTimeModifiable true;

functions
{
    #include    "shearStress"
}
--------------------------------------------------------------------------------------

2023年1月21日土曜日 1:27:20 UTC+9 MiyashitaKousei:
pim01.zip

M.TANAKA

unread,
Jan 20, 2023, 6:32:30 PM1/20/23
to OpenFOAM
OpenFOAM8のリポジトリを検索すると、以下が出てきました。
https://github.com/OpenFOAM/OpenFOAM-8/blob/c84029a9929412f2fc3c053eb2a14aaca97d9ceb/etc/caseDicts/postProcessing/fields/wallShearStress

libs ("libfieldFunctionObjects.so");と書くのが正しいようですね。
OpenFOAMは2つのバージョン(v8, v9,... v2112, v2206,...)があり、両者では記法が若干異なります。さらにバージョンの新旧での違いもあるので、使用するバージョンのリポジトリ内で例を検索するのが無難です。

もっと簡単な解決策は、#includeFunc wallShearStressとすることです。ファイルshearStressが不要になるはずです。
よろしくお願いします。
2023年1月21日土曜日 5:21:50 UTC+9 MiyashitaKousei:

MiyashitaKousei

unread,
Jan 20, 2023, 8:45:48 PM1/20/23
to OpenFOAM
M.TANAKA様

紹介していただいたリポジトリを参考にしたところ、libsのエラーは解決しました。その他にfvSchemesに不足していた要素を追加するなど、表示されたエラーに対応していく形で修正を繰り返した結果、なんとかpimpleFoamで流れの計算ができました。

pimpleFoam実行後、ケーズディレクトリ内に postProcessingというフォルダが作られ、さらにその中にshearStress1というフォルダが作られ、0フォルダの後に「wallShearStress.dat」と「wallShearStress_0.dat」の作成が確認できました。中身は経過時間と対象の境界面、せん断応力の最小値を取った座標、最大値を取った座標と思われるデータが生成されていました。

以下に2つの作成されたデータのファイルを書きます。
ケースディレクトリ/postProcessing/shearStress1/0/wallShearStress.dat
-----------------------------------------------------------------------------------------------------------------------------------
# Wall shear stress
# Time            patch             min               max          
0.000000e+00    noSlipWall    (0.000000e+00 0.000000e+00 0.000000e+00)    (0.000000e+00 0.000000e+00 0.000000e+00)
------------------------------------------------------------------------------------------------------------------------------------

ケースディレクトリ/postProcessing/shearStress1/0/wallShearStress_0.dat
------------------------------------------------------------------------------------------------------------------------------------
# Wall shear stress
# Time            patch             min               max          
0.000000e+00    noSlipWall    (0.000000e+00 0.000000e+00 0.000000e+00)    (0.000000e+00 0.000000e+00 0.000000e+00)
1.000000e-02    noSlipWall    (-2.369412e-07 -2.369412e-07 7.564784e-09)    (2.369412e-07 2.369412e-07 3.705063e-08)
2.000000e-02    noSlipWall    (-2.428694e-07 -2.428694e-07 7.755747e-09)    (2.428694e-07 2.428694e-07 3.667162e-08)
3.000000e-02    noSlipWall    (-2.427392e-07 -2.427392e-07 7.766011e-09)    (2.427392e-07 2.427392e-07 3.662777e-08)
4.000000e-02    noSlipWall    (-2.426696e-07 -2.426696e-07 7.766585e-09)    (2.426696e-07 2.426696e-07 3.662418e-08)
5.000000e-02    noSlipWall    (-2.426570e-07 -2.426570e-07 7.766608e-09)    (2.426570e-07 2.426570e-07 3.662396e-08)
6.000000e-02    noSlipWall    (-2.426551e-07 -2.426551e-07 7.766611e-09)    (2.426551e-07 2.426551e-07 3.662387e-08)
7.000000e-02    noSlipWall    (-2.426548e-07 -2.426548e-07 7.766611e-09)    (2.426548e-07 2.426548e-07 3.662381e-08)
8.000000e-02    noSlipWall    (-2.426548e-07 -2.426548e-07 7.766612e-09)    (2.426548e-07 2.426548e-07 3.662461e-08)
9.000000e-02    noSlipWall    (-2.426547e-07 -2.426547e-07 7.766611e-09)    (2.426547e-07 2.426547e-07 3.662397e-08)
----------------------------------------------------------------------------------------------------------------------------------------

目標まであと少しのところまでは来れたと思います。
wallshearstressの具体的な大きさについての出力の仕方はまだわかっていないので、リポジトリの中で気になったものを試してみるなどして、値が得られればと考えています。

2023年1月21日土曜日 8:32:30 UTC+9 M.TANAKA:

M.TANAKA

unread,
Jan 24, 2023, 8:39:53 AM1/24/23
to OpenFOAM
MiyashitaKousei さん

postProcess/の他に、時刻フォルダの下にpやUと並んでwallShearStressが出力されているのではありませんか?
ParaViewで可視化する際にデフォルトでinternalMeshがチェックされている箇所で壁面Patchを選択すれば、p, Uのように剪断応力も可視化できるはずです。それにこの辺(https://docs.paraview.org/en/latest/UsersGuide/selectingData.html#selecting-in-render-view)の機能を合わせれば、(手動でなら)任意フェイスでの値を確認できると思います。

2023年1月21日土曜日 10:45:48 UTC+9 MiyashitaKousei:

MiyashitaKousei

unread,
Jan 24, 2023, 8:51:15 PM1/24/23
to OpenFOAM
M.TANAKA様

確認したところ、確かにUやPと並んでwallShearStressが出力されていました。作業は進んでいたのですが、それに夢中になってしまい、ここに経過報告をするのを忘れてしまっていました。はじめはsystem/controlDictにfunction等の書き込みを追加して、あれやこれやしようとしていましたが、調べているうちにこのようなものを見つけました。

CFD Online Integration of wallShearStress over the surface of a body

ここにあったやり方は
1 : はじめにblockMesh等でメッシュを作成する。system内のcontrolDict等への書き込みや追加ファイルの用意は不要
2 : 次に一度pimpleFoamコマンドを実行する
3 : pimpleFoam終了。この時点ではまだ時刻フォルダにwallShearStressについてのデータは出力されていない。
4 : 最後に次のコマンドを打ち込み、実行する
 pimpleFoam -postProcess -func wallShearStress
5 : 実行終了後に時刻フォルダを確認するとwallShearStressのデータが出力されていました。
6 : paraViewで確認すると、FieldにwallShearStressのデータが新たに出現し、チェックを入れて時間を進めるとnoSlipWallなどでWSSの分布が確認できました。
pim2wss_07_3.png

任意の点のWSS値についてですが、多少ゴリ押し気味で確認することができました。ParaView5.6.0でのやり方です。
1 : paraViewのモデル表示をsurface With Edgeに変更
2 : select points機能で計算格子を構成する点を範囲選択する形で選択→Apply
3 : (モデル表示されている画面の右上にある)split Holizontalから2つ目の作業画面を作成
4 : spredsheatviewを選択
5 : 座標、速度、圧力、WSS等の値が表となって出てくるので、先程選択した点を読み込むために点の読み込み参照先を〇〇.OpenFoamからselect points1などに変更
6 : これで選択した点のWSS値を読み込むことができ、表は.csvなどで出力してexcel等で確認することも可能になりました。

M・TANAKA様に教えていただいたやり方もさっそく試して見ようと思います。
ありがとうございます。


2023年1月24日火曜日 22:39:53 UTC+9 M.TANAKA:

MiyashitaKousei

unread,
Jan 24, 2023, 11:25:39 PM1/24/23
to OpenFOAM
先程の書き込みに誤りがあったため修正します。

1 : はじめにblockMesh等でメッシュを作成する。system内のcontrolDict等への書き込みや追加ファイルの用意は不要

と書きましたが、もう一度ファイルの中身を確認したところ、system内のcontrolDictへの追記とそれに伴いsystem内にもう一つデータファイルを作成する必要がありました。
このスレッド内にある2023/1/21/5:21:50の返信内容にあった
controlDictへの追記である
functions
{
    #include    "shearStress"
}

と、controlDictと同じ場所に新たに
shearStress1
{
    type        wallShearStress;
    libs        (fieldFunctionObjects);
   
    patches    (noSlipWall);
   
    writePrecision    8;
    writeToFile    true;
    useUserTime    true;
    region        region0;
    enabled    true;
    log        true;
    timeStart    0;
    timeEnd    0.1;
    executeControl    timeStep;
    executeInterval    1;
    writeControl    timeStep;
    writeInterval    10;
}

が必要でした。shearStressのwriteIntervalでU、Pと同様にWSSについてのデータの書き込み時間が調整できるようです。


2023年1月25日水曜日 10:51:15 UTC+9 MiyashitaKousei:
Reply all
Reply to author
Forward
0 new messages