pisoFOAMのpEqn.flux()について調べてみる

Share on Facebook

はじめに

縁あって流体解析なんぞやっていて,オープンソースのOpenFOAMをよく使うので,それについてメモ書き。ややこしいコードなので間違ってるかもしれませんが,そのときはご指摘ください。

ブログの本筋からは大分外れててすいません。

概要

OpenFOAM2.3.xのpisoFOAM中にある非直交補正のループ内に

pisoFoam.C

pEqn.flux()関数の呼び出しがあります。(行頭は行番号です)flux()関数がどうなっているかをGDBによるデバッグとGNU Globalによるソースコードの読解で調べてみました。

GDBとGlobal

GDB

GDBはGCCのデバッガです。OpenFOAMでGDBを使えるようにするには,コンパイルオプションWM_COMPILE_OPTIONをDebugにしてAllwmakeします。詳細は下記なんかがわかりやすいです。

http://www.tfd.chalmers.se/~hani/kurser/OS_CFD_2008/debugging.pdf

Global

GNU Globalはソースコードにタグをつけてくれるソフトです。関数のソースがどこにあるかなどの情報が見やすくなります。EclipseのF3を押しても同様のことができますが,候補が一覧で表示されるので,個人的にはEclipseよりも使いやすいです。

参考

http://www.machu.jp/diary/20090307.html#p01
http://uguisu.skr.jp/Windows/gtags.html

Globalはソースコードにタグ付けを行うので,OpenFOAMで使う場合にはtutorials, etc, bin, docを除外します。除外の仕方は以下を参考にしました。
http://d.hatena.ne.jp/ohtorii/20110219/1298092604

pisoFOAMのソースコードを見る

はじめにGlobalでflux()関数を見る

GlobalでpisoFoam.Cを見ると,flux()へのリンクができています。リンクをたどると以下のような候補が表示されます。

ごちゃごちゃしてますが,pEqnがfvMatrixのオブジェクトなので,fvMatrix.Cのflux()を見てみます。

fvMatrix.C

途中boundaryFieldの量を各パッチで計算したりしています。これは

の資料にあるように,flux()は圧力勾配から来る流束の修正を行っているように見えます。
(上のNozakiさんの資料は大変参考になります)

気になるのが955行目からの以下の部分

faceFluxCorrectionPtr_の示す値が追加されています。これが何をやっているかを調べてみます。

faceFluxCorrectionPtr_について

faceFluxCorrecitonPtr_のゲッターとしてfaceFluxCorrectionPtr()関数があります。fvMatrix.Hより

fvMatrix.H

pisoFoamのfaceFluxCorrectionPtr()関数の詳細について次で調べてみます。

GDBでデバッグしてみる

ここからGDBによるデバッグでfaceFluxCorrectionPtr()関数について調べてみます。

デバッグのためのセットアップ

GDBの結果を見るのにはEmacsが便利だと思います。以下の設定を.emacs.d/init.elや.emacsにします。Emacs+GDBは以下参照。 http://d.hatena.ne.jp/higepon/20090505/p1

EmacsをGUIで起動して,M-x gdbでGDBを起動します。起動時にはpisoFOAMが立ち上がるようにします。OpenFOAMのコードを走らせるときにはLocal bufferを閉じておきます。こうしないとデバッグが途中で停止します。

cavity flowのチュートリアルをもとにしてデバッグします。fvSchemesはそのままです。非直交補正のについて調べるので,laplacianスキーム,snGradスキームがcorrectedになっているか確認して下さい。

fvSchemes

fvSolutionは以下のようにしました。

fvSolution

メッシュ数が多いとデバッグで見ていくときに何かと大変なので,セル数5個のメッシュを作成しました。以下がそのメッシュを生成するためのblockMeshdictです。blockMeshでメッシュを生成します。初期条件,境界条件は適当に設定します。

blockMeshDict

GDBでブレークポイントを設定する

実際にブレイクポイントを設定して,pisoFoamのfaceFluxCorrectionPtr()関数の挙動を見てみます。

fvMatrix.Hはsrc/finiteVolume/fvMatrices/fvMatrix/fvMatrix.Hにありますが,計算時に参照されるのはsrc/finiteVolume/lnInclude/fvMatrix.Hです。ここにブレイクポイントを置きます。

runで計算を走らせます。コールスタックを抜き出したのが以下。

#1をクリックするとその呼出が表示されます。gaussLapalacianSchemes.Cの該当箇所を見ると,

gaussLapacianSchemes.C

となっています。これはマクロでその定義はすぐ上にあります。

gaussLapacianSchemes.C

64行目以降が非直交補正に関係有るところです。fvSchemesでfluxRequiredを指定してあるので,68行目でfaceFluxCorrectionPtr()関数に対して,snGradの非直交補正による補正量が代入されています。74行目でsource項に非直交補正による補正を代入しています。

このようにGDBを使うことで,OpenFOAMの深い関数呼び出しの関係を調べられます。途中マクロ展開で関数呼び出しを実装することがOpenFOAMの場合には多くあります。このため,関数にあたりをつけて,適切にブレイクポイントを設定する必要があります。

次に71行目のcorrection()関数についてGlobalで見てみます。

GlobalでtsnGradScheme_().correction()を調べる

correction()関数の候補はたくさん表示されます。ここではcorrectedSnGradを使っているので,correctedSnGrad.Cのcorrection()を見てみます。

実装が以下で,correction()関数の計算には102行目にあるfullGradCorrection()関数が関わっています。

correctedSnGrad.C

fullGradCorrection()はその上に定義されています。

correctedSnGrad.C

mesh.nonOrthCorrectionVectors()とlinearで補間されたgradの値の内積を計算しています。これはJasakさんのD論 ( http://powerlab.fsb.hr/ped/kturbo/OpenFOAM/docs/HrvojeJasakPhD.pdf )にある,非直交補正の式と対応します。

以上の内容はNozakiさんの資料にも説明がありますので,そちらを参考にするとわかりやすいです。

まとめ

flux()関数を使った流束の補正とfaceFluxCorrectionPtr()関数から始まる非直交補正の詳細について調べてみました。GDBとGlobalでいろいろたどれるので,使ってみてください。

SphinxでTeXのコマンドを直接使う

Share on Facebook

ドキュメント作成ツールSphinxで,TeXのコマンドを直接使う方法について。

Sphinx上でLaTeXをつかって,PDF作るのに,sectionごとに改ページしたいとかで,TeXのコマンドを直接使うには

.. raw:: latex

   \newpage

のようにrawディレクティブを使います。\newpageはTeXで改ページするためのコマンド。

普通はhtmlのタグをそのまま使うときなどに使うようですが,TeXにも使えます。

プライベートクラウドownCloudがいい感じ

Share on Facebook

2013年は一度も書かずに2014年をむかえてしまいました.それなりにネタになりそうなことはあるんですが,仕事用のドキュメントを書くのに手一杯になってました.

今回は職場で使えるDropbox代替になるものはないかと探したら,ownCloudが良さそうという話です.

職場で複数人(10人弱)間でファイル同期できたらいいなとなって,いろいろ調べました.Dropbox,Google Driveはとっても便利ですが,他所様のサーバーにデータを置きたくない.LAN内だけで使えるものはないかとおもって,Lifehackerの記事 を参考にして,BitTorrent SyncSparkleShare を使ってみましたが履歴管理や変更のコンフリクト処理がいまいちでした.Dropboxはちゃんとできてます.

それでさらに調べて候補になったのがownCloud.このへんを参考にしました.

SlideShare

MoonGift

簡単にいうとオープンソースのクラウド環境ソフトです.Dropboxみたいなファイル同期,バージョン管理,ファイル共有ができます.Windows, Mac, Linux用のファイル同期クライエントがあり,有料版でiPhone, Androidアプリもあります.さらにカレンダーとドキュメントも共有できます.DropboxとGoogleカレンダーのプライベートが作れるようなもんです.詳細は公式HPを見て下さい.

手始めに家にあるFedoraにownCloudをいれてみました.LAMP(Linux, Apache, MySQL, PHP)環境が整っていれば簡単にセットアップできます.

Apacheとか入れてなかったので,yumでちまちまインストールしました.手順はここを参照しました.Apacheの設定で若干はまりました.Fedora18のファイアウォールを切らないとLAN内の他のマシンからアクセスできない問題が発生して,これに気づくのに時間かかりました.

ownCloudは公式ページ にLinuxのディストリビューション別にyumのリポジトリの設定方法があるので,これを参考にして,yumでインストールしました.ownCloudの設定は参考になるサイトがたくさんあります.今回は以下のサイトを参考にしました.

自分だけのDropBox? owncloudでファイル共有

[Nexus7活用術]その1. ownCloudで自分専用クラウドを手に入れる手順

Owncloudのインストール

ownCloudをyumでインストールしたあとだと,いきなり設定にはいります.ユーザー設定とSQLのデータベースを指定したら,ほぼ終わり.Mac用のファイル同期クライエントもいい感じです.過去のバージョンに戻すのも簡単です.使いがってはDropboxとほぼ一緒だと思います.

最初のサーバー設定がややこしいですが,それを乗り越えたら超便利な環境が手に入ります.