人生の人生

日常のゴミ捨て場

TikZなんて使わないほうが良いよ

TikZはクソ.
フローチャートをTikZで描こうと頑張ったときのメモです.
フローチャートの内容は気にしないでください.

フローチャートその1

\documentclass[10pt, a4paper]{ltjsarticle}
\usepackage{luatex-ja}
\usepackage{tikz}
\usetikzlibrary{fit, positioning, shapes.geometric, decorations.pathreplacing}
\begin{document}

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[node distance=1.5\zh, auto]
    \tikzstyle{decis} = [draw, diamond, aspect=3, text width=7\zw, align=flush center, inner sep=0pt]
    \tikzstyle{block} = [draw, rectangle, text width=8\zw, align=center, minimum height=3\zh]
    \tikzstyle{line} = [draw, -latex]

    % Place nodes
    \node [block] (grad) {勾配の計算\\ 式ほげ};
    \node [block, below=of  grad] (recon) {物理量の再構築\\ 式ほげ};
    \node [block, below=of recon] (invis) {非粘性流束の評価\\ 式ほげ};
    \node [block, below=of invis] (visc) {粘性流束の評価\\ 式ほげ};
    \node [inner xsep=0.5\zw, inner ysep=0.5\zh, fit=(grad) (recon) (invis) (visc)] (box) {};
    \node [block, node distance=1.5cm, left=of box] (calcrhs) {右辺項の計算};
    \node [block, above=of calcrhs] (calcdt) {時間刻み幅の計算\\ 式ほげ};
    \node [block, above=of  calcdt] (init)   {初期化};
    \node [block, above=of    init] (input)  {計算条件の入力};
    \node [block, below=of calcrhs] (updvar) {保存変数の更新};
    \node [decis, below=of  updvar] (isconv) {収束?};
    \node [block, below=of  isconv] (output) {計算結果の出力};
    % Draw edges
    \path [line]    (grad) -- (recon);
    \path [line]   (recon) -- (invis);
    \path [line]   (invis) -- (visc);
    \draw [decorate, decoration={brace, amplitude=1.3cm}] (box.south west) -- (box.north west);
    \path [line]   (input) -- (init);
    \path [line]    (init) -- (calcdt);
    \path [line]  (calcdt) -- (calcrhs);
    \path [line] (calcrhs) -- (updvar);
    \path [line]  (updvar) -- (isconv);
    \path [line]  (isconv) -- node [, color=black] {yes} (output);
    \path [line]  (isconv.west) -- +(-1cm, 0) node [near start, color=black] {no} |- (calcdt);
  \end{tikzpicture}
  \caption{TikZによるフローチャートの描画の例その1.}
\end{figure}

\end{document}

f:id:sktakefumi:20191229220430p:plain
フローチャートその1.

詰まったところ:

Simple flow chart | TikZ example

    • node distance=1.5\zh, auto が便利だと知った
  • 上のページで位置指定に使われている below of=init はdeprecatedらしい
    • かわりにこっち.\usetikzlibrary{positioning}が必要

TikZ でノードを相対位置で配置する話 - マクロツイーター

  • コの字型の矢印の出し方
    • ここ

Tikz: How to create arrow with two corners? - TeX - LaTeX Stack Exchange

  • 右の4つのノードをまとめて,"右辺項の計算"の右に位置させる
    • 下記コードで見えない箱を作って,その左に"右辺項の計算"を置いた
    \node [inner xsep=0.5\zw, inner ysep=0.5\zh, fit=(grad) (recon) (invis) (visc)] (box) {};
    • 下記のグループ機能を使った方がスマート?

Positioning groups of tikz nodes relative to their centre - TeX - LaTeX Stack Exchange

  • デカい中かっこ
    • このへん.\usetikzlibrary{decorations.pathreplacing}が必要

Draw Curly Braces in TikZ - TeX - LaTeX Stack Exchange

フローチャートその2

\documentclass[10pt, a4paper]{ltjsarticle}
\usepackage{luatex-ja}
\usepackage{tikz}
\usetikzlibrary{fit, positioning, shapes.geometric, decorations.pathreplacing}
\begin{document}

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[node distance=1.5\zh, auto]
    \tikzstyle{decis} = [draw, diamond, aspect=3, text width=7\zw, align=flush center, inner sep=0pt]
    \tikzstyle{block} = [draw, rectangle, text width=7\zw, align=center, minimum height=3\zh]
    \tikzstyle{line} = [draw, -latex]
    % Place nodes
    \node [block] (input) {計算条件\&形状の入力};
    \node [block, below=of input]   (init) {初期格子};
    \node [block, below=of init]   (fcalc) {流体計算};
    \node [decis, below=of fcalc]  (isamr) {AMR?};
    \node [block, below=of isamr] (output) {計算結果の出力};
    \node [block, node distance=3\zw, right=of isamr] (amrprm) {AMR指標\\ の計算};
    \node [block, right=of amrprm]  (eval) {セルの評価};
    \node [block]  (regen) at (fcalc -| eval)  {格子の再作成};
    \node [block] (interp) at (fcalc -| amrprm) {物理量の補完};
    % Draw edges
    \path [line]  (input) -- (init);
    \path [line]   (init) -- (fcalc);
    \path [line]  (fcalc) -- (isamr);
    \path [line]  (isamr) -- node [near start, color=black] {yes} (amrprm);
    \path [line]  (isamr) -- node [, color=black] {no} (output);
    \path [line] (amrprm) -- (eval);
    \path [line] (eval.east) -- +(1, 0) |- (regen.east);
    \path [line]  (regen) -- (interp);
    \path [line] (interp) -- (fcalc);
  \end{tikzpicture}
  \caption{TikZによるフローチャートの描画の例その1.}
\end{figure}
\end{document}

f:id:sktakefumi:20191229220427p:plain
フローチャートその2.

詰まったところ:

  • "物理量の補完"を"AMR指標の計算"の上かつ"流体計算"の右に置く
    • ここ

tikz: positioning above of point a, left of point b - TeX - LaTeX Stack Exchange

    • at (fcalc -| eval) なんて書き方があるのね

???「効率的な環境を整備したところで,研究しなきゃ意味なくない?」

この記事は東京大学航空宇宙工学科/専攻 Advent Calendar 2019の2日目の記事です.

0. はじめに

どうもこんばんは,人生さんです.助けてください.
人生さんは勉強も研究にロクにしていないので他の人のような学術的なアドベントカレンダーは書けません.
そこで,勉強と研究をなおざりにしつつかき集めたしょうもないtipsを遺言として書き記しておこうと思います.
知っている人にとっては当たり前な,しょうもないtips集ですが,ほんの数人かのほんの少しの労力だけでも削減できればいいなと思います.
記事の対象はもっぱらWindowsユーザーですので,シャレオツまか~やリナックスチョットデキルメン/ウーメンには読む価値はほとんどないものと思います.

1. エクスプローラー編

Windowsユーザーはファイルの操作にエクスプローラーを多用するものと思います.
しかしGUI操作はやはり疲れるので(疲れるとは言っていない),できればキーボードで操作したいものです.

移動・ファイル操作

以下に示すキー操作は全てエクスプローラーのウィンドウがアクティブになっている状態で有効です.
ウィンドウがアクティブになっていない場合は,Alt+Tabキーでアクティブにするか,ウィンドウの適当なところをクリックしてください.

まず,Alt+↑で上のディレクトリに移動できます.

f:id:sktakefumi:20191201124206g:plain
Alt+↑で上のディレクトリに移動.
あるディレクトリに入った後,カーソルは一番上のファイルまたはディレクトリにいます.
この状態でSpaceキーを押すと,一番上のファイルまたはディレクトリが選択される状態になります.
この"選択状態"になっていると,お馴染みのCtrl+Cが使えたり,Enterキーで既定のアプリに遷移できたりします.
ディレクトリを選択している場合はそのディレクトリに移動できます.
f:id:sktakefumi:20191201125407g:plain
Spaceキーによる選択+Enter.
また,上下矢印キーでファイルへのカーソルを移動することもできます.
あるディレクトリに入った直後に↓キーを押すと,カーソルは2つ目のファイルで有効になります.
これはおそらく,カーソルの初期位置が1つ目のファイルだからだと思っています.
f:id:sktakefumi:20191201142418g:plain
上下キーによるカーソル移動.
カーソル移動はファイル名によっても可能です.
あるディレクトリにいるときにファイルの名前を打ち込むと,そのファイルに逐次カーソルが飛んで選択状態になってくれます.
検索順は現在のカーソル位置の1個下から下方向で,折り返し検索が有効です.
f:id:sktakefumi:20191201144130g:plain
ファイル名押下によるカーソル移動.
このキー入力は一定時間(1秒くらい?)の間,連続した打ち込みが可能で,一定時間待つかEscキーで入力をリセットできます.
実際に使うには,ファイル名全てを打ち込むのではなくて,お目当てのファイルに近いところまでファイル名押下で移動して,上下キーで移動,という感じでしょうか.

以上に挙げたキー操作で,エクスプローラー内での移動はほとんどキーボードだけで完結できるかと思います.

アドレスバー

アドレスバーで,パスが通っているコマンド,プログラムを走らせることができます.
Alt+Dでカーソルが移動して入力できる状態になるほか,F4でアドレスバーに打ち込んだことがあるコマンドの履歴が表示・選択できます.
ここから起動したプログラムは,作業パスがエクスプローラーでのパスに設定された状態で起動されます.
このディレクトリにあるファイルをgnuplotで可視化したい,gvimで開きたい,なんて時に役立ちます.
一応起動オプションを渡すこともできます(e.g. "gvim hoge.txt")が,履歴が汚れるのであまり使いたくありません.

f:id:sktakefumi:20191201153152g:plain
Alt+Dによるアドレスバーの選択とコマンドの実行.

小ネタ
  • Spaceキーで選択/選択解除はShift/Ctrlキーと併用すると楽しい.

f:id:sktakefumi:20191201155057g:plain
Spaceキーによる選択/選択解除とShift/Ctrlキーの併用.

  • F2キーでファイル名を変更できる.
  • Alt+Enterでオプションを開ける.
  • Shift+Deleteでゴミ箱を介さずにファイルを消せる.大いなる力には大いなる責任が伴うので注意.
  • Ctrl+Shift+Nで新しいフォルダを作れる.
  • 左上のかどっこをダブルクリックするとウィンドウを消せるって友達のげってぃ君が言ってた.

2. PowerShell

PowerShellを使おう

みんなもっとPowerShellを使えばいいのにと思っています.
(ちなみに私は未だにPowerShell v6を導入せずにv5を使っているし,Windows Terminalも試していないのであまり上から言えない)
例えば,理系の大学生のWindowsユーザーがターミナル(厳密にはPowerShellはシェルらしい)を使う用途ってほとんどがSSH接続用だと思うんですが(偏見),やれputtyやらやれCygwinやらを構築する必要もなく,PowerShellと最近のWindows10にデフォルトで入っているOpenSSHクライアントとの組み合わせで事足ります.
百歩譲ってWSL.使ったことほとんどないけどCygwinは無いと思ってる.
ちょっとしんどいけどX11も導入できます.
意外にもtarコマンドもデフォルトで入っている(C:\WINDOWS\system32\tar.exe)ので,unix系サーバとのファイルのやり取りもできます.
ただ,文字コードとか,その他の謎のエラーには非常に困らされるのが欠点.
ほとんどの人はPowerShellなんか使わないので,とにかく情報が少ないのである.

  • PowerShellのイイところ
    • Windows機に標準で入っているので導入に管理者権限を必要としない
    • 雑なスクリプトでも意外と動く
  • PowerShellのクソなところ
    • 起動が遅くてクソ
    • 文字コード周りのアレがあまりにもクソ
    • 関数名がクソ
    • 情報が少なくてクソ
    • 結局Bashにはなれないからクソ
    • とりあえずクソ
色とフォント

フォントはともかく,デフォルトのPowerShellの配色は本当に酷い.
よほど頭がおかしくないと作れないだろってくらいに酷い.
Quality of PowerShell Lifeを上げるためにはカラースキームを適用することをお勧めします.
そのときの奮闘記がこちら.
sktakefumi.hatenablog.com
ただ,配色に関してはもしかしたら既存のWindowsのメジャーアップデートで既に改善されているかも?
ちなみに,この変更は全てのターミナルっぽいソフト(cmd.exe,gnuplot.exe,Git Bash.exe,vim.exe,python.exeなど)に適用されます.

プロンプトの変更

私はposh-gitを導入しているので,posh-git経由でプロンプトをカスタマイズしています.
github.com

Import-Module posh-git
$GitPromptSettings.DefaultPromptPath.ForegroundColor='DarkOrange'
$GitPromptSettings.DefaultPromptBeforeSuffix.Text = '`n $(Get-Date -f "HH:mm:ss") '
$GitPromptSettings.DefaultPromptBeforeSuffix.ForegroundColor = [ConsoleColor]::Magenta

上記の設定で下図右のようになります.

f:id:sktakefumi:20191129234130p:plainf:id:sktakefumi:20191129234134p:plain
PowerShellプロンプトのカスタマイズ.左: デフォルト,右: カスタマイズしたもの.
posh-gitを導入していなくても,$PROFILEに下のコードを書き足してprompt関数を上書きすれば変更できます.

function prompt{
  (Get-Host).UI.RawUI.WindowTitle = $pwd
  Write-Host (Get-Location) -ForegroundColor Yellow
  Write-Host (" " + (Get-Date -f "HH:mm:ss") + " ") -NoNewLine -ForegroundColor Magenta
  Write-Host ('>' * ($nestedPromptLevel + 1)) -NoNewLine
  return " "
}
小ネタ
  • Windowsキーから起動できるショートカット(C:\Users\USER\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell)は作業フォルダを変更できる.
    • 例えば%HOMEDRIVE%%HOMEPATH%としておけばBash風にC:\Users\USER\で起動してくれる.
  • チルダ"~"でC:\Users\USER\のTab補完が効く.

f:id:sktakefumi:20191130230720p:plainf:id:sktakefumi:20191130230724p:plain
PowerShell小ネタ.左: 作業フォルダの設定,右: "~"の使用.

  • パスは基本的にはスラッシュとバックスラッシュ両方受け付けてくれる.なんやねん.
    • コマンドによっては片方しか受け付けないかもしれない.
  • start (パス)で,パス位置でエクスプローラーを開いてくれる.
  • PowerShellはなぜかAlt+F4でウィンドウを閉じられない.
    • Exitと打ち込むか,viモードの場合はCtrl+Dで消せる.
  • 環境変数にパスをぽこじゃか通してるとunixライクなコマンドが衝突しうるので注意.

3. vim

便利な設定
alias emacs='vim'
vim-plug

プラグイン管理はvim-plugが良いと思っています.
github.com
別途Gitが必要ですが,導入が簡単ですし,vimrcの記述も非常に簡単です.

vim-plugの設定例を展開

"vim-plug
call plug#begin('~/vimfiles/plugged')
  Plug 'lervag/vimtex'
  Plug 'Yggdroot/indentLine'
  Plug 'tomasr/molokai'
  Plug 'tyru/caw.vim'
  Plug 'bronson/vim-trailing-whitespace'
  Plug 'PProvost/vim-ps1'
call plug#end()


guifontwide

シンタックスハイライトによって文字が斜体で装飾されるとき,下図左のように,文字が1文字分の枠を超えて隣の文字と重なってしまうことがある.

f:id:sktakefumi:20191128230944p:plainf:id:sktakefumi:20191128230946p:plain
vimシンタックスハイライトによって斜体字が重なる様子.左: 修正前,右: 修正後.
これはgvimrcで

set guifont=Consolas:h12
set guifontwide=MS_Gothic:h12

のように,guifontで英数字用フォント,guifontwideで日本字用フォントを個別に指定することで解消できる.
日本語版vimユーザーが多く使っているであろうkaoriyaさん版vimに同封されているgvimrcは,初期状態で

set guifont=MS_Gothic:h12:cSHIFTJIS

としか書かれていない.
このため,斜体フォントが用意されていない日本語用フォントを無理やりせん断変形することで,隣の字に重なるということが生じるらしい.

vimrc小ネタ
set shellslash
set isfname-={,}

1つ目はパス補完とかで出るパスの区切り文字を"\"から"/"に変更する.
2つ目は最近知ったもので,波かっこ"{"の後でのCtrl-X+Ctrl-Fによるパス補完を有効にする.
Windowsではファイル名に"{ }"を含められないための処置が関係しているのだろう.

f:id:sktakefumi:20191129231853g:plain
波かっこの後のCtrl-X+Ctrl-Fによるパス補完.

4. LaTeX

コーディング環境について

\LaTeXのコーディング環境にはTeXworksやTeXstudioのような統合環境があるようですが,私はvimで書いてます.
vimユーザーかつ\LaTeXユーザーの方にはぜひvimtexをお勧めしたいです.
github.com
このプラグインはハチャメチャに高機能で,各種コマンドが利用可能になるほか,例えば適切なlatexmkの設定をしていれば,コードの変更を検知して再コンパイルしてくれたり,

f:id:sktakefumi:20191123182054g:plain
latexmkとの連携による逐次コンパイル.実際にすごいのはlatexmkである.
ログをパースしてquickfixウィンドウに出してくれて,エラー箇所にジャンプできたり,
f:id:sktakefumi:20191123182326g:plain
エラーの表示と該当箇所へのジャンプ.
文書をパースして,本文との行き来が可能なtable of contentsを作ってくれたりします.
f:id:sktakefumi:20191202201546g:plain
目次の作成,表示と該当箇所へのジャンプ.
機能が多すぎて未だに全機能を把握しきれていませんが,簡単なコマンドだけでも大きな助けになります.

vimtexは設定がめんどくさいので,私のvimrcをupしておきます.

vimtex用vimrcを展開

""" vimtex
let g:tex_flavor='latex'
let g:tex_conceal=''
let g:vimtex_include_search_enabled=0
let g:vimtex_fold_enabled=1
let g:vimtex_fold_manual=1
let g:vimtex_fold_types = {
      \ 'comments' : {'enabled' : 1},
      \}
let g:vimtex_complete_close_braces=1
let g:vimtex_complete_ref = {
      \ 'custom_patterns': [
      \     '\\tref\*\?{[^}]*$',
      \     '\\eref\*\?{[^}]*$',
      \     '\\fref\*\?{[^}]*$',
      \     '\\sref\*\?{[^}]*$'
      \   ]
      \}
let g:vimtex_compiler_latexmk={
      \ 'backend': 'jobs',
      \ 'background': 1,
      \ 'build_dir': '',
      \ 'continuous': 1,
      \ 'executable': 'latexmk',
      \ 'options': [
      \    '-lualatex',
      \    '-file-line-error',
      \    '-synctex=1',
      \    '-interaction=nonstopmode',
      \ ],
      \}
let g:vimtex_view_general_viewer='C:\PROGRA~1\SumatraPDF\SumatraPDF.exe'
let g:vimtex_view_general_options='-reuse-instance -forward-search @tex @line @pdf'
let g:vimtex_view_general_options_latexmk='-reuse-instance'
let g:vimtex_quickfix_latexlog = {
      \ 'ignore_filters' : ['Package caption Warning'],
      \}


TeXworksやTeXstudioを使うにしても,最低限latexmkとの連携はしておくと幸せになれると思います.

gnuplot-lua-tikz

グラフの貼りこみにはgnuplot-lua-tikzを使っています.
例えば以下のgnuplot設定ファイルを書いて,

gnuplotのコードを展開

reset session

set term tikz size 144mm, 81mm
set output "graph.tex"

set key outside top center box Left spacing 4 width -18
set xl "$x$"
set yl "$y$"

set xtics pi format "$%.1P\\pi$"
set mxtics 4
set mytics 5

set xr[-2*pi:2*pi]
set yr[-1.5:1.5]

f(x, n) = sum[m = 1:n] 4.0 / pi / (2*m-1) * sin((2*m-1)*x)

set samples 1000
plot f(x, 10) w l t "$\\displaystyle f(x) = \\sum_{n=1}^{10} \\frac{4}{(2n-1)\\pi} \\sin ((2n-1)x)$, cited from \\cite{cite:graph}"

set output


出力されるgraph.tex\LaTeXで\inputすると(タイプセットはLuaLaTexを使っています),

\begin{figure}[htbp]
  \centering
  \input{fig/graph.tex}
  \caption{Gnuplot-lua-tikzによるグラフ描画の例.}
  \label{fig:graph}
\end{figure}

このような絵が描けます.

f:id:sktakefumi:20191123165143p:plain
Gnuplot-lua-tikzによるグラフ描画の例.
次のようなメリット/デメリットがあると思っています.

  • 良いところ
    • グラフ中に\LaTeXの書式を使える
    • 文献などの相互参照をねじ込むことも可能
    • フォントサイズが文書基準に決定されるので図中の字の大きさに気を配らなくていい
  • 悪いところ
    • 設定ファイルを書くのにクソ手間がかかる
    • 後述の\linewidthでグラフ幅を指定したいけどできない
    • 凡例の余白に\LaTeXのコマンドの文字数が反映されてしまうので調整がめんどい
    • 点数が多いグラフだとコンパイルと描画が遅くなる
    • 作ったグラフをパワポスライドに流用しづらい
    • 正直PDFでいい

== 2019/12/2 15時追記 ==
vimtex環境下でgnuplot-lua-tikzによるgraph.texを大量に\inputしていると,main.texの読み込みにえらい時間を食うようになる.
graph.texの実態はtikzのコマンドとベクターのパスを羅列している長大なファイルなため,読み込みやらパースやらなんやらに時間がかかるのであろう.
加えて,例えばmain.texをテンプレとして利用するために,graph.texが存在しない別のディレクトリに移した場合(移すな),graph.texが見つからないので,kpsewhichコマンドでgraph.texを検索し始めてしまい,さらに時間がかかる.
この\inputによる*.texの検索とパースは

let g:vimtex_include_indicators = ['include', 'subfile']

とすれば無効にできる.

==== さらに追記 ====
g:vimtex_include_indicatorsからinputを除くと,\input{}後のCtrl-X+Ctrl-Oファイル名補完が効かなくなってしまう.
流石にこの設定はできなさそうなので,その場しのぎにvimtex/autoload/vimtex/complete.vim内のs:completer_incをちょろっと書き換えて\input{}でも補完が効くようにした.
==== さらに追記終わり ====

== 追記終わり ==

図の大きさについて

\linewidth基準で指定するのが幸せだと思う.
\linewidthを超えるようなデカい図を貼りたい場合(貼るな),\includegraphicsを\makebox[0pt][c]{}で囲ってあげれば下図のように中心に来てくれる.
横並びの図をできるだけ大きく貼りたいときに便利.
だけど,正式な文書だと\linewidthを超えて図を貼りこむのはいかがなものかとも思う.

f:id:sktakefumi:20191123192718p:plain
\linewidthを超えるような大きな図を貼りたい場合.

texソースコードを展開

\begin{figure}[htbp]
  \centering
  \includegraphics[width=1.1\linewidth, height=30mm]{example-image-a}
  \caption{めっちゃでかい図が右に寄るでござる.}
  \label{fig:meccha_dekai_zu_zureru}
\end{figure}

\begin{figure}[htbp]
  \centering
  \makebox[0pt][c]{
    \centering
    \includegraphics[width=1.1\linewidth, height=30mm]{example-image-b}
  }
  \caption{めっちゃでかい図が中心に来るでござる.}
  \label{fig:meccha_dekai_zu_mannnaka}
\end{figure}

\begin{figure}[htbp]
  \centering
  \makebox[0pt][c]{
    \begin{minipage}[c]{0.6\linewidth}
      \centering
      \includegraphics[width=1\linewidth, height=30mm]{example-image-a}
      \subcaption{minipageの幅は0.6\textbackslash linewidth}
      \label{fig:meccha_dekai_zu_mannnaka_1maime}
    \end{minipage}
    \begin{minipage}[c]{0.6\linewidth}
      \centering
      \includegraphics[width=1\linewidth, height=30mm]{example-image-b}
      \subcaption{minipageの幅は0.6\textbackslash linewidth}
      \label{fig:meccha_dekai_zu_mannnaka_2maime}
    \end{minipage}
  }
  \caption{できる限り大きく横並びの図を貼りたいんじゃ.}
  \label{fig:meccha_dekai_zu_mannnaka_2mai}
\end{figure}


体裁,禁止コマンドについて

文書の本質は当然ながら体裁より内容ですが,私はロクな内容が書けないので体裁を整えるのが趣味と化しています.
禁止コマンドはここ参照
ichiro-maruta.blogspot.com

体裁についてはこれら参照
qiita.com
qiita.com

5. その他

Officeにベクタ画像を貼るには

私はベクタ画像教教徒なのでOfficeの文書にもベクタ画像を貼りたくなります.
Mac版ならPDFでもSVGでもサクッと貼れるのですが,Windows版で貼るならEMFにするのが吉です.
EMFとSVGを比較すると,下図のように,編集画面上では,線の太さに多少の差はあるものの両者ともイイ感じに見られるのですが,

f:id:sktakefumi:20191123224554p:plain
パワポ上での編集画面.
PDFとして出力しようとするとSVGはどうも不安定になります.
下図は,左がエクスポート>PDF/XPSの作成,右が印刷>Microsoft Print to PDFで印刷,でPDFを作成したものです.
左ではSVGの線の太さがEMFに比べて太く,右ではSVGが謎の低解像度JPGに変換されてしまっています.
謎です.
f:id:sktakefumi:20191123224936p:plainf:id:sktakefumi:20191123225031p:plain
PDF出力.左: エクスポート>PDF/XPSの作成,右: 印刷>Microsoft Print to PDFで印刷.

gnuplot小ネタ
  • statsコマンドを使えば合計値や標準偏差などの基本的な統計量がサクッと得られる.
  • helpコマンドでヘルプが読める.

f:id:sktakefumi:20191130233136p:plain
gnuplotのヘルプ.

  • ~/.gnuplotgnuplotのデフォルトが設定できる.(gnuplotのインストールフォルダ)/share/gnuplotrcがテンプレ.
    • 下のように書けば,罫線を描画させて,線の色をRGBの原色系にして,現在のパスを表示するようにできる.
set grid xtics ytics mxtics mytics lt -1 lc rgb "gray30", lt -1 lc rgb "gray"
set colorsequence classic
pwd

6. まとめ

研究しないでこんなことばっかりやってる院生になっちゃダメだよ.

私と円柱と抵抗と

この記事は東京大学航空宇宙工学科/専攻 Advent Calendar 2018の21日目の記事です.

0. はじめに

どうもこんばんは,人生です.主な生息場所はTwitterです.Twitter社さん,もう凍結しないでください.
普段は所属研究室内製のCFDソルバで遊んでいたりします.
本稿でもCFDソルバで遊んでみた結果を書きます.

1. 解析対象

本稿では,空気抵抗を受ける2次元円柱の弾道計算を行います.
本当は球を用いた3次元解析をして現実世界での結果と比較~~~!なんてことをしたいのですが,計算コストがエグいので2次元円柱 (つまり,円) を用いた2次元解析を行います.
円柱や球に働く空気抵抗は実験値や近似値,解析値が出回っていますが,本稿ではこの空気抵抗値を所属研究室内製のCFDソルバで推算します.
特に,円柱の運動とともに対気速度やレイノルズ数が変化すると考え,その刻々に対して空気抵抗値を更新しながら運動を発展させることを狙います.
結局のところただのルンゲクッタなので読む価値はないです.
ていうか,空気力推算でミスってる気しかしないです.
レイノルズ数ってなんだっけ....無次元化ってなんだっけ....

2. 計算条件

2.1. 問題設定等

円のサイズは野球の硬式球を想定して直径74 mm,質量145 gとします.
これに初速30 m/sを持たせて,30 degの投射角で0 ℃,1 atmの静止気体中に投げます.

また,下図のように座標系と力を定義します.

f:id:sktakefumi:20181213232104p:plain:w300
座標系,力の定義
 L,  D はいわゆる揚力,抗力です.
本稿では静止気体中の運動を考えているので図中の向きとなります.
運動方程式は以下のようになります.

  \left\{
  \begin{align}
    \dot{x}(t) &= u(t) \\
    \dot{u}(t) &= F_x(t)/m \\
    \dot{y}(t) &= v(t) \\
    \dot{v}(t) &= F_y(t)/m - g \\
  \end{align}
  \right.
さらに, L,  D は揚力係数  C_l,抗力係数  C_d を用いて次のように書かれます.

  \left\{
  \begin{align}
    L &= \frac{1}{2} \rho |\vec{V}|^2 S C_l \\
    D &= \frac{1}{2} \rho |\vec{V}|^2 S C_d \\
    F_x &= - L \sin \gamma - D \cos \gamma \\
    F_y &= L \cos \gamma - D \sin \gamma \\
  \end{align}
  \right.
力の定義の仕方に頭の悪さがにじみ出ていますが,ソースコードではちゃんと

  \begin{align}
    \dot{v}(t) &= F_y(t)/m \\
    F_y &= L \cos \gamma - D \sin \gamma - mg \\
  \end{align}
としているので許してください (?)

再三になりますが,本稿では  C_l C_d をCFDソルバを用いて推算します.
なお,この流れでは  C_l=0 となるはずなので,0以外の値は計算上のミスとして0で上書きします.
じゃあなんで定義したんだ,人生くん....
また,CFD解析は各時間ステップで初期状態から計算するため,前の時間ステップで形成された流れ場は次の時間ステップには影響を及ぼさないものとします.
これは,CFDソルバが動体解析に対応していないためです.
先日出席した学会ではいろんな人が平然と非定常構造連成解析をしててビビりました.

後は普通に4次のルンゲクッタにぶち込みます.
この際,  t+dt/2 の時点でも  C_l C_d を推算しようとすると計算量がエグいことになるので, t t+dt 間の  C_d t における値で一定とします.

2.1. CFDについて

本稿では,支配方程式をRANS方程式として,2次元定常計算を行います.
計算スキーム等は省きますので,詳しいことやそのほかソルバについては参考文献[1]をご覧ください.

計算格子に関して,本稿では申し訳程度の研究 () 要素として,解適合格子細分化法 (Solution-Adaptive Mesh Refinement) を利用します.
最近はもっぱらこれをいろんな解析対象に適用して計算結果の向上を目指すみたいな,小学生の自由研究にも満たないことをやっています.
頭が欲しいんだ.

本解析では例えば下図のような格子が生成されます.

f:id:sktakefumi:20181220215254p:plain
AMRによる計算格子の発展
これにより,円柱からの後流が,初期格子では素早く拡散してしまうのに対し,AMR格子では風下方向に長く維持されるようになります.
f:id:sktakefumi:20181220215726p:plainf:id:sktakefumi:20181220215733p:plain
マッハ数  M 分布,気流は左から右,左: 初期格子 (4,356セル),右: 3サイクル適合格子 (8,376セル)
この解像度の向上は  C_d に若干の感度を有し,初期格子の234 cnt (カウント) からAMR格子の226 cntまで,3.4 %ほどの変化量をもたらします.
あんま意味ねえな....
f:id:sktakefumi:20181220220739p:plain
抵抗係数  C_d の収束履歴,擾乱位置でAMRを適用している
ただ正直なところ,抵抗係数については最小格子幅  \Delta x が支配するところも大きく, セル数の増分を壁面と空間のどちらに割くかというのは微妙なところです.
現時点では,摩擦抵抗  C_{d,f} を突き詰めたければ壁面の,圧力抵抗  C_{d,p} を突き詰めたければ空間の解像度を上げる必要があるという見解です.

3. 計算結果

こんな感じになりました.

f:id:sktakefumi:20181220222631p:plain
軌道の計算結果
ただただ,「それっぽい」絵が描けたというだけでした.
個人的にはそんなに前に落ちるのかというのが驚きですが,計算をミスってる感がどうもぬぐえないのでそういうことかもしれません.
本当はエネルギーの収支とかを考えたら面白いのかもしれませんがなんかあまりにもしょうもなさすぎてやる気を失ってしまったのでこれで終わります.

4. まとめ

まじでしょうもねえ.
助けてください.

参考文献

[1] Yoshiharu Tamaki and Taro Imamura. "Turbulent Flow Simulations of the Common Research Model Using Immersed Boundary Method", AIAA Journal, Vol. 56, No. 6 (2018), pp. 2271–2282. https://doi.org/10.2514/1.J056654