Juliaに傷心(ハートブレイク)

2019年5月18日(土)に富山CiCビルで開催された第72回オープンCAE勉強会@富山で,プログラミング言語Juliaに関する話題提供を行いました.その内容をざっくり纏めてみましたので,ご紹介します.

報告内容

  • Juliaとは?
  • Juliaのインストール
  • Jupyterでの利用
  • Pythonとの速度比較(暫定版)
  • まとめ

Juliaとは?

Juliaは2012年に発表された新しいプログラミング言語であり,個人的には次のような特徴が気に入っています.プログラミングの導入教育には最適だと考えられます.

  • Python同様動的型付け言語だが,静的型付け言語に迫る実行速度を持つらしい.
  • 計算実行時にコンパイルするJIT(Just-In-Time)コンパイラを採用しており,PythonやRuby等のインタプリタと同じように簡単に利用できる.
  • Python同様,Jupyterをインターフェイスとして利用できる.

Juliaのインストール

公式サイトで各種OS用のインストーラが配布されています.私はmacOS版を手元のMacBookにインストールして使っています.

Mac版Juliaは,通常のアプリケーションとして登録されますので,ダブルクリックするとターミナル上でREPL (Read-Eval-Print Loop)環境が動作します.パッケージの追加・アップデートはこの環境で行うことができます.さらに,”?”をつけてコマンド等を入力すると詳しいヘルプ画面が表示されます.

Jupyterでの利用

私にとって最大のJuliaの魅力は,Jupyter notebookやJupyter lab上で実行できることです(そもそもJupyterの”Ju”はJuliaを指しているらしいので,当たり前と言えば当たり前ですが).

既にJupyterがインストールされていれば,Jupyterとの連携は簡単です.私の環境(Mac+Anaconda)の場合,JuliaのREPL環境で”]”をタイプしてpkgモードにした後,次のようにしてIJuliaパッケージをインストールすれば,Jupyterのカーネル・リストにJuliaが追加され,利用できるようになりました.

(v1.1) pkg> add IJulia

Pythonとの速度比較(暫定版)

Pythonプログラムと,それをJuliaに移植したプログラムとで計算速度の比較を行ってみました.

計算対象は,Barba先生のCFD-Python Step 5で取り上げられている2次元線形移流方程式

\displaystyle {\partial u \over \partial t}+c{\partial u \over \partial x} + c{\partial u \over \partial y}=0

の差分近似

\displaystyle u^{n+1}_{i, j} = u^{n}_{i, j} - c \Delta t \left( {u^n_{i, j}-u^n_{i-1, j} \over \Delta x} + {u^n_{i, j}-u^n_{i, j-1} \over \Delta y} \right)

です.これを以下の初期条件,境界条件の下で解いてみました.

初期条件:

u(x, y, 0) = \left\{ \begin{array}{c} 2 \quad \mbox{for} \quad 0.5 \leq x, y \leq 1 \\ 1  \quad \mbox{for everywhere else} \end{array} \right.

境界条件:

u(x, y, t) = 1 \quad \mbox{for} \left\{ \begin{array}{c} x=0, 2 \\  y=0, 2 \end{array} \right.

空間の分割数はx, y方向ともに80分割(n_x=n_y=81)で,100タイムステップn_t=100の計算にかかる時間を計測しました.

CFD-Pythonのコードのコア部分は以下のようなものです.

for n in range(nt + 1):
un = u.copy()
for j in range(1, ny):
      for i in range(1, nx):
           u[j, i] = un[j, i] – c * dt*( (un[j, i] – un[j, i – 1])/dx+ (un[j, i] – un[j – 1, i])/dy)

これをJuliaに移植すると

for n in 1:nt
     un = copy(u)
     for i in 2:nx-1
          for j in 2:ny-1
               u[i, j] = un[i, j] – c * dt*((un[i, j]-un[i-1, j])/dx+(un[i, j]-un[i, j-1])/dy)
               u[1, j] = 1
               u[nx, j] = 1
          end
          u[i, 1] = 1
           u[i, ny] = 1
     end
end

シンプルで,初心者にも分かり易いコードだと思います.このコードで計算した結果,Pythonコードでは2.5 s程度掛かっていた時間がJuliaコードでは0.41 sに短縮され,6倍程度高速になりました.

元になったPythonコードの計算過程も分かり易いのですが,3重のfor-loopで書かれていて,ものすごく遅いため,普段Pythonを使っている人は配列操作(Array Operation)を用いるようです.実際,CFD-Pythonでも配列操作を利用するコードが紹介されていて,こちらで計算すると6 ms程度で計算が終了しました.私が書いたJuliaコード(3重のfor-loopを用いたもの)の60倍以上のスピードが出ています(速い!).

せっかくJuliaを使ったのに配列操作を使ったPythonに惨敗という結果になりまして,傷心気味だったのですが,@ceptreeさんの記事「Juliaの速さを体感する」を見つけ,メインループの関数化を試みたところ,Juliaでの計算時間を0.14 sにまで短縮することができました.それでもなお,配列操作を使ったPythonコードにスピードでは圧倒的に負けていますので,引き続き,Juliaの高速化について調べてみたいと思っています.

まとめ

  • Juliaはシンプルで使いやすい(あくまでも,個人の感想です).
  • Jupyterをインターフェイスとして使用できる.
  • Juliaはfor-loopを使ったPythonよりは速いが,配列操作を使ったPythonより遅かった.(引き続き,検討予定)
  • Juliaでは,関数内にfor-loopをまとめると計算速度が向上する.

本研究室の研究成果が国際会議プロシーディングスに掲載されました.

われわれの研究成果が国際会議プロシーディングスに掲載され,オンラインで公開されました。

Sakamura Y., Oshima M., Nakayama K., Motoyama K. (2019) Shock-Induced Motion of a Spherical Particle Floating in Air. In: Sasoh A., Aoki T., Katayama M. (eds) 31st International Symposium on Shock Waves 2. ISSW 2017. Springer, Cham

日本機械学会 北陸信越支部 第56期総会・講演会で研究成果を発表しました.

2019年3月2日(土)に富山大学五福キャンパスで開催された標記講演会におきまして,本研究室の研究成果を発表しました.

演題:2温度モデルを用いた非平衡窒素プラズマ流れの数値シミュレーション

著者:八重尾猛史(登壇者),坂村芳孝,大嶋元啓

ハンス・ロスリング,オーラ・ロスリング,アンナ・ロスリング・ロンランド 著(上杉周作,関美和 訳)『FACTFULNESS』は今年一押しの一冊!

人の脳(考え方)にはある種の「クセ」(認知バイアス)があることは多くの人が指摘しているところですが,本書を読むことで,どうすればそれらを克服し,世界を正しく認識できるのかを,具体的な事例を通じて学ぶことができます.何より,客観的データに基づいて物事を捉えようとする著者等の姿勢は科学者・技術者の見本でもあります.学生の皆さんには是非読んでもらいたい一冊です.著者らによる素晴らしいプレゼンはこちらから.こちらもオススメの動画です.

Free teaching material from www.gapminder.org

 

科学探求力アップ講座2018が終了しました。

2018年12月10日(月)9〜12時に科学探求力アップ講座2018「スターリングエンジンの動作原理を探る」(2回目)を本学L205会議室で実施しました.

受講者は小杉高校の2年生(25名)で,11月12日(月)に小杉高校で行った講義内容を復習した後,スターリングエンジン模型の製作と動作確認実験を行いました.

最後に実施した動作時間コンテストの結果は以下の通りでした。(時間はチーム内で平均した最長動作時間)

  • 「山そー」:5分【優勝】
  • 「やまちゃん」4分35秒
  • 「ポケモンだいすきクラブ小杉支店」2分50秒
  • 「チーム、ゆなです。!ピンポーンッ!」3分46秒
  • 「おすおす」4分58秒
  • 「木卵」3分50秒

社会に学ぶ『14歳の挑戦』

富山県では「社会に学ぶ『14歳の挑戦』」という教育プログラムが実施されています.このプログラムでは,県内の中学2年生(14歳)が校外の様々な職場に出向き,5日間仕事を体験することになっています.平成11年度から行われており,本学でも今年度は小杉南中学校の生徒さん(3名)を受入れています.

中学生の皆さんには学内の様々な業務を体験してもらっているのですが,私のところでは教材作成を手伝ってもらいました.

手伝ってもらって作成した教材は,「エネルギー変換工学」や「機械システム工学実験」等の授業で使用するスターリングエンジンの動画です.エンジンを組み立て,実際に動かすまでにはかなりの時間がかかりましたが,3名の生徒の皆さんの粘り強い協力によって,無事撮影することができました.

 

 

 

 

H29年度 COC FD研修会に参加しました.

2018年3月19日(月)(10:00~11:00)L205会議室で開催された標記研修会に参加しました.

最初にこれまで5年間の活動を振り返った後,4~5名程度のグループに分かれてワークショップ形式でCOC事業の課題と解決策について議論しました.

ワークショップでは,最初に次の約束事を確認して進行されていました.研究室のゼミでも取り入れていきたいと思います.

  • やさしい口調で話す.
  • 人の意見を否定しない.
  • 発言はコンパクトに

 

日本機械学会北陸信越支部第55期総会・講演会および第47回学生員卒業研究発表講演会で研究成果を発表しました.

2018年3月3日(土)福井工業大学で開催された標記講演会で以下の研究成果を発表しました.発表後にいただいた質問は今後の研究にとって貴重な指針となりました.

  • 演題:粉体層上を伝播する衝撃波によって形成される粉体雲の可視化
  • 著者:坂村芳孝 (富山県大), 大嶋元啓, 室谷拓也, 菅内和輝, 志村啓 (慶応大), 松尾亜紀子

また,前日3月2日(金)には同会場で,日本機械学会北陸信越学生会第47回学生員卒業研究発表講演会が開催され,卒研生がポスター発表を行いました(発表者:○).

  • 「大気圧誘電体バリア放電プラズマ噴流の可視化」○小原弘之(富山県立大),八重尾猛史,大嶋元啓, 坂村芳孝
  • 「感温発光薄膜によるマイクロチャネル壁面の温度計測」 ○内堀光(富山県立大),坂村芳孝,大嶋元啓, 川端繁樹,加藤巧也
  • 「領域分割に基づく近傍粒子探索によるMPSシミュレーションの高速化」  ○小林竜志(富山県立大), 坂村芳孝, 大嶋元啓,邉見隆洋(マルヤス機械株式会社)
  • 「伝播する衝撃波による粉体の舞い上がり」 ○菅内和輝(富山県立大),室谷拓也,大嶋元啓, 坂村芳孝,志村啓(慶應大),松尾亜紀子
  • 「衝撃波管を用いた炭化水素燃料の自着火特性の解明 (高圧衝撃波管の作製と性能評価) 」 ○森田裕人(富山県立大),倉本拓実,大嶋元啓, 坂村芳孝
  • 「衝撃波管を用いた炭化水素燃料の自着火特性の解明(自着火過程の計算とその検証) 」 ○倉本拓実(富山県立大),森田裕人,大嶋元啓, 坂村芳孝

dsc_0219-e1520157186274.jpg