たまに書きます。

気になって調べたことを書いていきます。まずはAboutページをご覧ください。

DJに入門した話

実は3年くらい前から、DJに憧れていた。 きっかけは、知り合いのエンジニアの方が、いつぞやのプログラミング言語のカンファレンスの懇親会でDJをやっているのを見たから。その後、今の研究室に移ってからはなんとプロのDJがいて、ちょっと教えてもらうにも非常に良い環境でもあるのだが、 なかなかお金もかかるもので結局やらないままだった。(ずっと「いつか始めたいんですけどね。。。」と言うだけだった)

そうこうすること3年弱、この前我が研究室のDJの方が、こいつ↓を持って来て、プレイするところを見せてくれた。

jp.monstergodj.com

そもそも自分がなかなか始められなかったのは、DJを始める上での初期投資となる

  • タンテ×2(もしくはCD×2)

  • ミキサー

  • ヘッドホン

のコストが自分の経済力ではやれなかったからなのだけど、今の時代(ここ数年?)こんな小さなマシンであんなカッコいいことが出来るとかマジでヤバい。鞄からさっと取り出していきなりバンバン音を操りまくって。。。ていうのがカッチョよすぎる。
就職活動でなんとなく落ち着かない生活も終わったということで、迷わず再入荷のタイミングで買いました。

こんな感じ。やばい。かっこいい。 f:id:salondunord:20170711002759j:plain

今はまだ操作の仕方も全然感覚的でなくて(まだどのボタンを押したらどうなるのかもよくわかってない)、曲を繋ぐとかもってのほかなのだけど、それでも自分がPCに入れていた曲がちょっとボタンを押したりつまみをひねるだけで音が変わったりするのは本当に面白い。 それ以来、毎晩帰宅してからちょこちょこ弄って遊んでるんだけど、しっかり練習していつか僕も何かの懇親会とか結婚式の二次会とかそういうところで回させてもらえるようになりたいと思う。

以上、やめない為の決意表明でした。

MONSTER GODJ Portable, Stand-Alone DJ System and Production Studio【正規代理店品】

MONSTER GODJ Portable, Stand-Alone DJ System and Production Studio【正規代理店品】

量子化学計算のプログラムを自作してみた

普段、量子化学の計算を行う際は、GaussianやGAMESS他のソフトが用いられることが殆どで、自分でコードを書くのは計算手法の研究をされている一部の方に限られるのではないかと思います。

近年では、B3LYP汎関数の使用を始めとする、密度汎関数理論(Density Functional Theory; DFT)が用いられるケースが殆どですが、それに先立って確立された手法として、Hartree Fock法があります。 Hartree Fock (HF)法は、計算結果のエネルギーの見積もりの不正確さ*1から、今ではこの手法が単体で使用される場面は多くはありません。 しかし、近似の仕方が明確なため*2量子化学の基礎として多くの方が一度は勉強される理論かと思います。

私も、数年前に教科書でHFの理論を勉強してから、一度は自分でコードを書いておきたいという気持ちがずっとあったのですが、毎回途中やめになっており、このたび漸くそのminimalな実装をC++で書ききりました。実際に書いてみると、式を読んで分かった気になっていたものの、実際の理解は曖昧だったりといったことがよくわかりました。

コードは、下記のリポジトリにおいていますので、気になる方、これから同じことを勉強しようと言う方はどうぞ。

github.com

感想としては、結構大変でした。Gaussianなどの開発チームだったり、もしくは日々新たな計算手法を開発されている方たちが神に見えてきます。 以下に気づき、感想、苦労した点を列挙します。

1. Gauss型の短縮基底関数の正規化

これは、自分で書いてみるまで気がつかなかったことです。 (といっても書き始めたのが2年くらいは前なので、その頃に気がついたのですが。。。) 例えば、STO-3Gという最も基本的な基底関数系で、水素の1S軌道は、軌道指数(Orbital exponent, よくαと書かれます)と計数を強調して、

 H_{1s} (r) = 0.44635 g(-0.168856) + 0.535328 g(-0.623913) + 0.154329 g(-3.42525)

という感じでよく表されます。ただ、これを  g(\alpha) = \exp(-\alpha r^{2}) と考えて素直に計算すると、一番簡単なはずの重なり積分から数字が合いません。

実際には、(後で気づけば当たり前のことではあるのですが…)それぞれのプリミティブガウス関数に、それぞれを全空間で積分した際の値が1になるように、規格化因子がかけられています。また、さらに、それらを重ね合わせた関数(短縮ガウス関数)にも、規格化因子が掛けられます。したがって、より正しい表記は、

 H_{1s} (r) = \frac{1}{0.999999 } (0.44635 \frac{\exp(-0.168856 r^{2})}{0.187736} + 0.535328 \frac{\exp(-0.623913 r^{2})}{0.500326} + 0.154329\frac{\exp(-3.42525  r^{2})}{1.79444} )

となります。これらの規格化因子は、プリミティブガウス関数のそれぞれについてまず求め、その後、短縮ガウス関数について求める必要があります。なお、p軌道以上の角運動量を持つ軌道には、 x^{l}y^{m}z^{n}という因子がかかるので、これも考慮に入れる必要があります。

2.積分の実装

積分は、1966年に竹田、藤永、大旗の3名が書いた論文を参考にしました。これの実装がとにかく難しかったです。慣れれば、重なり積分と、運動エネルギー積分はまだなんとかなります。難しいのは、核引力積分(Nuclear Attraction Integral)と電子間反発(4中心)積分の部分です。

これらは、とにかく展開方法もなかなか理解できませんし、非常に入れ子の深いループになってしまいます。

現状は上記の論文をそのまま参考にしており、STO-3G基底での水素分子やHeH+イオン程度は一瞬で計算は終わりますが、試しにp軌道を分極関数として追加してみると、一気に遅くなりました。

近年のGaussianを始めとする量子化学計算プログラムは、PRISMアルゴリズムなど、積分ごとに20種類くらいのパスを使い分けるような非常に複雑な実装*3がなされているそうですが、その重要性がよーく分かりました。 今後は、できればDKRの積分方法や、Obara-Saikaの展開公式なども実装してみたいと思います(できれば、です。2電子積分の展開など、まだ全然理解できていません。)

3. 何を使って行列演算を行うか

王道はBLASなどのライブラリを使うことなのだろうと思いますが、恥ずかしながら私は他のプログラムからリンクさせる為にコンパイルした程度の経験しかありませんでした。

以前にnumpyを使って今回と同じようなものを書こうとしたことがありました*4ので、今回は比較的それと似たような感覚で使えそうなEigenというテンプレートライブラリを使用しました。

おそらくBLASなどのような高度なチューニングは難しいでしょうが、今回のような目的には非常に使い勝手が良かったと思います。

今後

現状はHartree FockのRHF計算のみ実装しましたので、今後はUHF計算をまずは実装したいと思います。 あとは、スパコンが使える今のうちに、少しくらいMPIチューニングなどで遊んでみるのも良いかもしれません。 その次は、DFTか微分計算ではありますが、おそらくUHFを書いてみるころには学生生活が終了している気がします…苦笑

2017.07.15 追記

UHFの計算はSzaboの本を見ながらすぐにかけてしまいました。 今はDFTを実装するべくいろいろ調べていますが、交換・相関ポテンシャルの空間積分のためのグリッド生成がなかなか難しいです。またここにメモをする予定です。

Modern Quantum Chemistry: Introduction to Advanced Electronic Structure Theory (Dover Books on Chemistry)

Modern Quantum Chemistry: Introduction to Advanced Electronic Structure Theory (Dover Books on Chemistry)

新しい量子化学―電子構造の理論入門〈上〉

新しい量子化学―電子構造の理論入門〈上〉

密度汎関数法の基礎 (KS物理専門書)

密度汎関数法の基礎 (KS物理専門書)

*1:電子相関(≒電子同士の避け合いの効果)を考慮しない

*2:基底関数以外に経験的なパラメータを含めていない

*3:すいません、嘘言っているかも。全然この辺りの詳細は知りません

*4:どうしても2電子積分の値がズレてしまい放置…

就職活動しました

タイトルの通りです。 無事就職活動を終え、来春からは新卒としてアカデミックを離れてインダストリーに行くことになりました。行き先は化学・素材系の企業です。
この間に実はいろいろなことを考えたりしていたので、忘れないためにもここに書いておこうと思います。

そもそも、なぜインダストリーか

自分がインダストリーをとった理由は列挙するなら以下のような感じです。

  1. 身分の安定性、収入面

  2. 指導教員の影響

 まず一つ目には、やはりアカデミックの不安定さがあります。自分よりも全然優秀な方でも、学振PDに不採用となったり、あるいはポストを探すのに苦労していることを見ると、とても今の自分の戦闘力では戦える気がしませんでした。ちなみに、私は奨学金を借りて大学院に行きました(第1種=利子なしですが)。この返済の必要があることを考えると、少なくとも5年程度は安定性が保障される身分をもつことが必要だとも思っています。ポスドクだと給与面でも安定性の面でも、とりあえずこれは難しいだろうと考えました。
 (ニッチな分野の、しかもベースの給与が高くなってしまう博士課程学生をとってくれた会社には本当に感謝しています)

 2つ目は、自分の指導教員の影響です。私の指導教員は、企業で30年間仕事をして、そのあとで現ラボのPIになりました。
 そのボスによく言われることが二点あります。1つ目は、『アカデミックは「自分の研究したいことを研究する」のに対して、企業では当然ながら「お金になるものを研究する」ということ』、そしてもう1つは、『アカデミックでの研究の目的はひとまず論文であるのに対して、インダストリーの場合は製品であって、そのために多くの人が自分の名前を出すことなく仕事をしていること』。 つまり、製品化のための要素技術・プロセス技術は、おそらく大学などの研究所などで見るよりもはるかに精度の高いものと思います(←実験しないからイメージではあるのですが)。そしてこの違いを理解することなく、アカデミックの方に居続けるのは、かえって研究の面でも、どういうものがブレークスルーとなるのか、という点を見極められなくなる気がしました。
 この両者の違いは聞けば当たり前のことではあるのですが、これをはっきりと言ってくれる大学の先生はほとんどいないと思います。そういう指導教員に出会えたことは偶然ながら、とてもよかった思っています。

大企業か、中小企業か

 これはここで書くべきかどうかわかりませんが、結果的に自分は大企業をとりました。その理由は、場合によっては次のステップのために「辞めやすい」からです。よく、「大企業の歯車にはなりたくない」という意見も聞きますが、ずっと学生を続けていた自分に今見えているものは恐らくかなり限られたものだと思っています。そこで、一旦時間をおいて、卒業後に、自分は何をやって稼ぎたいか、もしくは何がお金を取れるスキルなのかを冷静に考えて、しっくりくるものがあればその先を考えたい後思っています。
 実は非常に魅力的な中小のベンチャー企業を知り合いに紹介してもらったりしました。ここに行くことも時間を頂いて冷静に検討しましたが、今の自分には、十数年、もしくは数十年にわたり会社の屋台骨を支える、という覚悟を決めることはできませんでした。(こういう場合、入社数年でやめる、とかだと知り合いにも迷惑をかけることになります。)  

もうアカデミックには興味がないか

 正直に言えば、現時点では、アカデミックに残っていたい気持ちはとてもあります。(視野が狭いだけかもしれませんが)
これまで2年少し過ごした博士課程は確かに貧乏ではありましたが、それでもいろいろな本を読んだり、数学~物理~化学といろいろ勉強してとても充実していました。大学の外の研究所で過ごせたことも自分にとっては大変幸せなことだと感じていて、ぜひここに戻ってきたいと考えています。

 一方で、研究者たるもの、独り立ちしてからは新しい「研究分野」を開拓することこそが理想なわけですが、今の自分のキャパシティだと、単に「食つなぐための論文」に自分の時間の90%以上を持っていかれる生活に終始する気がします。その先で高齢ポスドクになって、必死で転職活動をするよりは今のうちにインダストリーに行った方が自分の場合はよいだろうと考えました。(見る人によっては「そんなん考えが甘いわ!」と言われるかもしれませんが)
 その他に、近年の化学をタコツボ化していると批判する向きもあり、自分でもいろいろ調べていると、こんな論文に行き当たりました。

onlinelibrary.wiley.com

 今後、インダストリーに行って、新しい視点を持てるよう精一杯働きつつ、いろいろ勉強していきたいと思っています。そこで今の原子・分子を相手にした化学から発展した次の化学の意味を冷静に考えてみて、海外ポスドクなど再びアカデミックの道を模索したい、というのが正直なところです。

大学生のための、理化学研究所で研究するガイド

はじめに

私は今、博士課程の大学院生をしており、理化学研究所という研究機関で研究をしています。

高校生の頃から理研には憧れていて、いつかは理研で働きたいと考えていました。 一時期は不祥事などもありましたが、やはり素晴らしい研究環境であることに変わりはありません。 ここに来るには、博士号をとってその後ですごく優秀な実績を出して認められる、くらいしか方法は無いと考えていました。 しかしながら、実際にはそうではありません。

この記事では、理研にあこがれる高校生や大学生が理研で活動するには、どのような入り口があるのか、ということを紹介したいと思います。

そのためには、手続き(身分の取得)と研究室探しの二つをクリアする必要があります。 本記事ではその両方を紹介したいと思います。

1、手続き方法

学生で主な方法としてとれるのは、主に3種類のパスがあります。 このうち、私は②、③の方法を利用しました。

①アルバイト

これは学部生から可能です。 まずは理研の採用情報を見てみて、そこにパートタイマー募集が無いかを探してみます。 研究室所属になる前ならば、これしかルートは無いと思います。

主には、プログラマーか実験補助が多いと思います。 個人的なおすすめはプログラマーです。 実験補助よりも汎用性の高いスキルであるためです。 私自身、もともとコンピュータが好きだったこともあり、始めは民間のベンチャー企業でアルバイトをしていました。 あるとき、理研主催の学生向けイベントで知り合ったあるPIの先生に誘われて、その研究室で開発しているソフトウェアのプログラミングを手伝っていました。

②、研究指導委託もしくは連携大学院制度

研究室配属後、もしくは大学院生(修士・博士)になったらこのルートを使って理研で研究をすることが可能になります。 この方法を使うためには、大学(院)と理研の間で協定が締結されていることが条件になります。

http://www.riken.jp/outreach/partnerships/ ここに協定の締結を行った大学院のリストがあります。とりあえずは、ここに書いてあるところに入学をするのが良いでしょう。 ちなみに、私の出身大学(東京工業大学)は、修士課程は2年のうちの1年しか委託してもらうことは出来ないという学内ルールが存在します。

大学院の専攻に、理研の連携教授などの職名の先生がいると、大抵理研で研究をすることになります。 この場合は、指導委託扱いにならないので、修士の2年間ずっと理研で研究が可能でした(東工大の場合)

③、大学院生リサーチアソシエイト

博士課程の大学院生になると、この方法をとることができます。理化学研究所の非常勤職員として、お給料をもらいながら研究をさせてもらえる制度です。 この方法は博士課程の学生しか利用できませんが、これを目論んで、修士課程までは②の研究指導委託制度を利用して研究活動をするのは悪くないと思います。 待遇は、月164000円です。ここから生活費や国民年金、学費等の支払いが必要となってきます。

http://www.riken.jp/careers/programs/#studentlevel

私は博士課程から理研に移りましたが、D1, D2の二年間は落ちたり補欠だったりで、結局採用して頂けたのはD3になるタイミングでした。

2、研究室探し

こちらはむしろ楽しみながら行った方が良いです。 最終的には、自分からコンタクトをとっていきましょう。

まず、非常にざっくりですが、各事業所の分担をここに記します。 和光は、物理、化学系、それと脳科学系の研究室がメインですが、生物系(脳科学を除く)のラボもいくつか存在します。 有楽町線副都心線の終点である和光市駅からは徒歩で15分ほどです。

横浜は、医科学系がメインです。免疫などの研究が盛んで、実験用のマウスなどもたくさんいると聞いたことがあります。鶴見駅からバスで行きます。 筑波はバイオリソースセンターという、遺伝子組み換えなどを行った実験動物(遺伝子ごとに組み換え動物を作るのは結構難しいらしく、それをここでストックしておくようです)のセンターがあります。(私は行ったことない) 大阪・神戸は主に生物学の研究を行っています。

あとは神戸に計算科学研究機構(スパコンの京があるところ)や兵庫県の播磨にSpring-8があります。

①一般公開

理研の主な事業所(和光、横浜、つくば、大阪、神戸など)はいずれも一般公開をしています。和光とつくばは大体4月末のことが多いです。 普段理研の中にいても、自分のいる研究室以外のところに行く機会は(学生ですし)あまり無いので、この機会にいろいろと見せてもらえるのは楽しいです。

理研の広報誌

理研からは、毎月広報誌が出ていて、そこで数研究室が取材されています。これを広く見てみて、興味のありそうな研究室を探すのもありです。 私も現在の先生を初めて知ったのはこの広報誌です。それを基にコンタクトをとっていきました。

③その他の講演会など

一例として、理研は毎年、年末ごろに科学講演会というのを行っています。 http://www.riken.jp/pr/blog/2016/161122_1/ こういうのに参加してみるのもありだと思いますが、毎回3名程度の先生しか講演されないので、それほど効率のよい探し方とは言えないかと思います。

④学生向けのセミナーなど たとえば、神戸の理研などは、

QBiC スプリングコース2017

のようなセミナーを毎年開催しています。こういうのを行っているセンターもありますので、機会があれば積極的に参加するのもありだと思います。 私も学部4年生のころに参加したこのスプリングコースで知り合った先生から、プログラマとして雇っていただきました。

ここまで理研に限って述べてきましたが、他にも国内の様々な国立の研究所にはいろいろと活動に参加する方法があります。 興味のある方はぜひ調べてみてください。

VASPで計算したバンド構造の可視化のためのスクリプト

固体のバンド構造計算をこれまでは主にQuantum Espressoというフリーのコードを使って行っていたのですが、最近になってvaspを時々利用するようになりました。

vaspでバンド構造を計算すると、EIGENVALというファイルが作成されて、そこに各k点での固有値が記録されます。 このファイルを何らかのツールを使って可視化する必要があるわけですが、検索してみると主に出てくるのはp4vaspというプログラムを利用する、というもののようです。

しかし、p4vaspはなんだかバンド図の見た目がイケてない上に、磁性を考慮した場合にどうもupとdownのスピンのバンドを別々にカラーリングする方法がわからず、バンド図の可視化には使いづらいように思えました。 そこで、gnuplotによる可視化向けにEIGENVALSファイルを読み込んで整形するスクリプトRubyで作成しました。

github.com

本当はここに結果を載せたいのですが、一応vaspはライセンスの縛りがあるので、ここに結果のグラフを載せるのは避けておきます。

使い方は、EIGENVALSのあるディレクトリで、

ruby read_eigenvals.rb -n (各kpathの点の数)

とするだけです。オプションを適当に渡せば、スピンを考慮した計算結果のファイルや、gnuplot用のスクリプトも一緒に作成します。

理論化学の本を紹介していく(電子軌道の概念)

量子化学の一番初めは、とりあえず波動関数とは何ぞや?を抑えることだとすると、その後で来るのは、今度は軌道の概念を知ることだと思っています。 私は軌道のことは、友田修司先生の本で勉強をしました。

基礎量子化学―軌道概念で化学を考える

基礎量子化学―軌道概念で化学を考える

この本で使っている計算法は拡張ヒュッケル法などの現代の量子化学コミュニティではあまり使われなくなってしまった古い計算方法です。

しかし、軌道の概念をきちんと理解するためには、むしろこのような手法の方が変に原子軌道の混成を考えなくてよくなるため、定性的な理解には良いと思います。

この本はそれほど大きくない分子を用いて、

  • フロンティア軌道

  • 配位子場分裂・結晶場分裂(金属に配位したイオンなどにおいてみられる3d軌道の分裂)

などを議論しており、これらの概念を掴むには良いと思っています(ただし、すごく深いわけでもないと思います)。

また、溶解エネルギーなどの熱力学的な量に関する解説もある程度されており、数表としても私は使っています(ただし、そんなに量は無いので、本当に必要な時は化学便覧を見るのが良いです)。

私は指導教員によく言われるのは、「計算機で計算する数値データは、コンピュータとか計算手法が発展するので10年たったら役にたたないが、軌道を見た時の定性的な傾向(たとえば、フロンティア軌道は分子のどのあたりに局在しているか、など)は別の量子力学的効果を入れたりしない限り変わることは無いので、それをきちんと把握すること」ということです。

この本はその感覚をつかむために最適なのではないかと思っています。

ちなみに、軌道の概念をさらによく知るためには、洋書ですが、

Orbital Interactions in Chemistry

Orbital Interactions in Chemistry

かと思います。

化学屋から見たバンド理論 その2

今の時代、バンド計算も多くの場合、VASPやQuantum Espressoといった密度汎関数法による計算をすることになるかと思います。 バンド計算においては、必要なパラメータとして、

  • 汎関数(大体はPBE汎関数が多い模様。必要に応じて、PBE0やHSE06のようなハイブリッド汎関数を使うが計算が重くなる)

  • 擬ポテンシャル(PAWかUltrasoftを使えば大抵の場合いける、他にはノルム保存型などの選択肢がある)

  • カットオフエネルギー

  • k点メッシュ

  • スメアリング(ブロードニング)

を必ず指定する必要があります。

とりあえずこれらの意味が分からない時は、以下の本が良いと思います。

密度汎関数理論入門: 理論とその応用

密度汎関数理論入門: 理論とその応用

この本は、DFTの理論的な詳細には立ち入らず、あくまで使う側に必要な情報の提供に絞られています。 また、VASPやQuantum ESPRESSO, Ab Initなどのサンプルinputファイルが書かれているわけでもないので、 まずはネット上のチュートリアルなどからinputを探してきて、それの意味を一つ一つ理解していくのに使うべきと思います。

ちなみに、この本には、バンド構造(E-k分散図)は触れられていません。バンド構造の理解に関しては、前の記事で紹介した、ホフマンやCoxの本で理解のコツを覚えていくしかないと思っています。 また、バンド構造を計算するには、まずはブリルアンゾーンを指定する必要がありますが、私は

AFLOW.ORG: a distributed materials properties repository from high-throughput ab initio calculation

を使ってそれを指定しています(Kpath in the reciprocal spaceというのを指定して、出てきた結果をvaspの場合はKPOINTSファイルに指定)。