ガジェットとはちょっとした小物・気のきいた小道具のこと。Macのコネタを紹介。スマートフォンなどなど。Mac!!!ガジェットとはちょっとした小物・気のきいた小道具のこと。Macのコネタを紹介。スマートフォンなどなど。ishogaki0目的GPU使った流体計算に興味があって,今までGPUを全く買ったことがなかったので買ってみました。GTX960を買ってみた全く知らないのでとりあえずCUDAが使えればいいや+予算3万までとおもって,NVIDIAのGTX960を買いました。GPU計算について順番がおかしいですが,買ってから性能とか調べてみました。Wikipediaが一番詳しかったです。https://en.wikipedia.org/wiki/GeForce_900_series衝撃的事実。最近のGPUは倍精度計算の性能がほとんどない。単精度2.3TFLOPSに対して,倍精度は1/32の72GFLOPSしかない。数値計算する上では倍精度の速度がほしいのに。なにを買えばよかったか?GPU計算するならGPGPUとして出てるTeslaを素直に買うのが一番だというのが結論だと思います。それは知ってましたが,個人で買うようなものでもないので,様子見がしたかった。個人が手が出せるとしたらTitanが限界かと。Xだと倍精度計算の性能は全然だめです。Zなら倍精度計算性能が2.7TFLOPSもあります。まとめ買ってしまった以上GTX960でなんかできることを考えてやってみようと思います。倍精度はやめて単精度でベンチマークとってみるとか。OpenFOAMのCUDA版RapidCFDをとりあえずやってみようと思います。ishogaki0はじめに縁あって流体解析なんぞやっていて,オープンソースのOpenFOAMをよく使うので,それについてメモ書き。ややこしいコードなので間違ってるかもしれませんが,そのときはご指摘ください。ブログの本筋からは大分外れててすいません。}pEqn.flux()関数の呼び出しがあります。Globalによるソースコードの読解で調べてみました。GDBとGlobalGDBGDBはGCCのデバッガです。OpenFOAMでGDBを使えるようにするには,コンパイルオプションWM_COMPILE_OPTIONをDebugにしてAllwmakeします。詳細は下記なんかがわかりやすいです。Globalはソースコードにタグをつけてくれるソフトです。関数のソースがどこにあるかなどの情報が見やすくなります。EclipseのF3を押しても同様のことができますが,候補が一覧で表示されるので,個人的にはEclipseよりも使いやすいです。除外の仕方は以下を参考にしました。http://d.hatena.ne.jp/ohtorii/20110219/1298092604pisoFOAMのソースコードを見るはじめにGlobalでflux()関数を見るGlobalでpisoFoam.Cを見ると,flux()へのリンクができています。リンクをたどると以下のような候補が表示されます。limitedSurfaceInterpolationScheme<Type>::fluxごちゃごちゃしてますが,pEqnがfvMatrixのオブジェクトなので,fvMatrix.Cのflux()を見てみます。}途中boundaryFieldの量を各パッチで計算したりしています。Nozakiの資料にあるように,flux()は圧力勾配から来る流束の修正を行っているように見えます。}faceFluxCorrectionPtr_の示す値が追加されています。これが何をやっているかを調べてみます。faceFluxCorrectionPtr_についてfaceFluxCorrecitonPtr_のゲッターとしてfaceFluxCorrectionPtr()関数があります。}pisoFoamのfaceFluxCorrectionPtr()関数の詳細について次で調べてみます。GDBでデバッグしてみるここからGDBによるデバッグでfaceFluxCorrectionPtr()関数について調べてみます。デバッグのためのセットアップGDBの結果を見るのにはEmacsが便利だと思います。以下の設定を.emacs.d/init.elや.emacsにします。Emacs+GDBは以下参照。gdbでGDBを起動します。起動時にはpisoFOAMが立ち上がるようにします。bufferを閉じておきます。しないとデバッグが途中で停止します。flowのチュートリアルをもとにしてデバッグします。fvSchemesはそのままです。非直交補正のについて調べるので,laplacianスキーム,snGradスキームがcorrectedになっているか確認して下さい。//fvSolutionは以下のようにしました。0;}メッシュ数が多いとデバッグで見ていくときに何かと大変なので,セル数5個のメッシュを作成しました。以下がそのメッシュを生成するためのblockMeshdictです。blockMeshでメッシュを生成します。初期条件,境界条件は適当に設定します。//GDBでブレークポイントを設定する実際にブレイクポイントを設定して,pisoFoamのfaceFluxCorrectionPtr()関数の挙動を見てみます。fvMatrix.Hはsrc/finiteVolume/fvMatrices/fvMatrix/fvMatrix.Hにありますが,計算時に参照されるのはsrc/finiteVolume/lnInclude/fvMatrix.Hです。ここにブレイクポイントを置きます。runで計算を走らせます。コールスタックを抜き出したのが以下。pisoFoam.C:102#1をクリックするとその呼出が表示されます。gaussLapalacianSchemes.Cの該当箇所を見ると,gaussLapacianSchemes.CC++declareFvmLaplacianScalarGamma(scalar);12declareFvmLaplacianScalarGamma(scalar);となっています。これはマクロでその定義はすぐ上にあります。}64行目以降が非直交補正に関係有るところです。fvSchemesでfluxRequiredを指定してあるので,68行目でfaceFluxCorrectionPtr()関数に対して,snGradの非直交補正による補正量が代入されています。74行目でsource項に非直交補正による補正を代入しています。このようにGDBを使うことで,OpenFOAMの深い関数呼び出しの関係を調べられます。途中マクロ展開で関数呼び出しを実装することがOpenFOAMの場合には多くあります。このため,関数にあたりをつけて,適切にブレイクポイントを設定する必要があります。次に71行目のcorrection()関数についてGlobalで見てみます。gammaMagSf*this->tsnGradScheme_().correction(vf)GlobalでtsnGradScheme_().correction()を調べるcorrection()関数の候補はたくさん表示されます。ここではcorrectedSnGradを使っているので,correctedSnGrad.Cのcorrection()を見てみます。実装が以下で,correction()関数の計算には102行目にあるfullGradCorrection()関数が関わっています。}fullGradCorrection()はその上に定義されています。}mesh.nonOrthCorrectionVectors()とlinearで補間されたgradの値の内積を計算しています。)にある,非直交補正の式と対応します。以上の内容はNozakiさんの資料にも説明がありますので,そちらを参考にするとわかりやすいです。まとめflux()関数を使った流束の補正とfaceFluxCorrectionPtr()関数から始まる非直交補正の詳細について調べてみました。GDBとGlobalでいろいろたどれるので,使ってみてください。ishogaki0ドキュメント作成ツールSphinxで,TeXのコマンドを直接使う方法について。latex\newpageのようにrawディレクティブを使います。\newpageはTeXで改ページするためのコマンド。普通はhtmlのタグをそのまま使うときなどに使うようですが,TeXにも使えます。ishogaki2ドキュメント作成システムSphinxが便利という話を書きました。PDFを出力する方法は2つあって,rst2pdfという拡張を使う方法とLaTeXのファイルをつくってPDFに変換する方法です。ここでは自動で生成されるTeXのフォーマットを変更する方法について述べます。Sphinxは1.2.2を使ってます。LaTeXでPDFを作るにはまずTeXを一式インストールしておく必要があります。これはユーザー会のサイトに詳しい説明があります。SphinxとLaTeXの設定が終わったとして,いざ日本語のドキュメントを作ってみると,ドキュメントクラスにjsarticleを使っていてもかなり個性的なフォーマットになっています。気に入らないので,SphinxのTeXソース自動生成の設定を変更します。(ただし,まだ試行錯誤中なので,完全に自分の好みにするには至ってません)まずSphinxのPythonのソースコードを見ます。MacPortsでMacにインストールした場合は/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sphinx/にSphinxのソースコードがあります。他の方法でインストールした場合は適宜探して下さい。このディレクトリには多くのファイルがあります。writers/がでます。sphinxmanual.clsです。config.pyです。Sphinxではデフォルトの用紙サイズがletterpaperになっているので,a4paperに変更します。これはconfig.pyの中のlatex関係の設定のところにあります。None),latex_paper_sizeの設定を変更します。diffの様子(-が修正前,+が修正後です。以下同様)sphinxにはsphinx-quickstartという必要なファイルを一気に作ってくれるコマンドがあります。便利なのですが,LaTeXのreportクラスを使う”manual”がデフォルトになっています。(jsarticle)クラスを使う”howto”をデフォルトにします。これはquickstart.pyにあります。quickstart.py内に自動生成するconf.pyの内容がそのまま書いてあるので,そこのLaTeX関連のところを変更します。‘howto’),上のように自動生成するタイプを変更します。次にwriterディレクトリのlatex.pyを変更します。このファイルで,元のreSTファイルからTeXのソースファイルを生成するための設定を行っていると思われます。デフォルトの行間が広すぎ気がするので,行間を狭くするように設定しました。全体の行間指定をどこで行っているのかよくわからないので,とりあえず\baselinestretchのコマンドを挿入するようにしました。\baselinestrechを1以下にすると全体の行間が狭くなります。TeXソースの最初のほうに設定が入るように,BEGIN_DOCを以下のように設定しました。r”’\begin{document}%(shorthandoff)s\renewcommand{\baselinestretch}{0.8}”’途中にdefault_elementsという設定があるので,とりあえず余計な設定は消しました。ここでもpapersizeとpointsizeがありますが,ここだけ変更しても反映されません。config.pyの修正が必要になります。jsbookを使いたいので,以下のようにしました。sphinxmanual.clsを変更します。ドキュメントをhowtoにすると,sphinxhowto.cls,manualにするとsphinxmanual.clsが使われます。ここではsphinxhowto.clsを使うとします。manualの場合は適宜読み替えて下さい。ページ番号が表示されるようにpagestyleをplainにします。sphinx.styにあります。\pagestyle{plain}最初のページのページスタイルはsphinxhowto.clsで指定していますので,それを修正します。ページスタイルが全体で統一されるように81行目あたりの\thispagestyleをコメントアウト。sectionにしか番号がふられないので,番号がふられる階層を深くします。sphinxhowto.clsのsecnumdepthを変えます。preamble.%-\setcounter{secnumdepth}{2}+\setcounter{secnumdepth}{3}タイトルと目次を変更します。sphinxhowto.clsを修正します。デフォルトの設定だとタイトル部分が広すぎるので,狭くなるように文字サイズを縮小して,リリース番号を消去しました。仕切りの横罫線も消すようにしました。\par\end{flushright}目次の横罫線を消去。sphinxmanual.clsの修正で行えます。これらの修正はTeXの知識が必要になってきます。今回書いたことがSphinxユーザーの役に立てば幸いです。疑問なこともまだあります。情報あれば教えて下さい。languageをjaにすると日本語設定になる。”release”が「リリース」になったり,日付が「年月日」になったりする。ishogaki0WWDC直前ですが,ドキュメント作成のお話を。Wordのドキュメントを生成するシステムSphinxが便利そうで,試行錯誤しています。SphinxはPythonのドキュメント作成のための作られたシステムです。以下のリンクでSphinxのことがよく分かります。Sphinxユーザー会ドキュメントを作りたくなってしまう魔法のツールSphinxPythonのドキュメントを作れるシステムなので,コードハイライトがきれい。数式はTeXで処理するのできれい。プレーンテキストで書くので,Gitなどでバージョン管理可能。Python環境があれば,すぐにインストールできる。関連するドキュメントが日本語化されている。いいところがあります。reSTはreStructuredTextで,マークアップ言語の1種です。世間ではMarkdownのほうが知られていますが,似たような記法です。^などで囲めばタイトルになり,+を頭につけるだけで箇条書きになるので,読みやすい文章がかけます。GithubやQiitaの原稿がMarkdownなので,Markdownを使うことが多いかと思います。その場合はPandocで変換できるので,reSTに変換することができるので,特に問題ないです。htmlでざっくりかいて,確認して,完成版をPDFに変換するということができます。Wordで作文するのに飽きている人にはぜひおすすめします。WordPress.com.。