AkaiKKRとOpenMP並列化

AkaiKKR(machikaneyama)ではOpenMPを用いた並列計算を行うに際して、August 26, 2015に公開されたバージョンから OMP_NUM_THREADS などの環境変数を設定する必要が無くなったようです。その反面、並列化する際のスレッド数の制御もできなくなりました。

今回は、それよりも古いバージョンであるMay 22, 2015を使って、計算に使うスレッドの数と計算時間の関係を調べました。

001_20150915141750561.png

Fig.1: スレッド数と計算時間の関係。計算時間は単一スレッドで計算した時間で規格化してある。スレッド数を増やすごとに計算時間が短縮されていく。短縮の度合いは、計算する物質の種類にはほとんど依存しない事がわかる。


その結果、少なくとも私が思っていたよりは、効率的に計算速度が上がっており、何も考えずに全スレッドを使った計算をしてしまってもよさそうな感触を得ました。


OpenMPによる並列化


August 26, 2015よりも以前のバージョンのAkaiKKR(machikaneyama)でもOpenMPを用いた並列化が可能でしたが、August 26, 2015のバージョンでは並列化に対する考え方が変わったようです。

以前はOpenMPを使うためには OMP_NUM_THREADS などの環境変数を設定しなければなりませんでした。この点は、初めてAkaiKKRをインストールする初心者にとって躓きやすいポイントでした(参考:AkaiKKR掲示板の6548 コンパイルスレッド)。August 26, 2015では、環境変数を設定する必要が無くなりコンパイラを指定してmakeするだけでOpenMP並列版のバイナリを作成、実行することができるようです。

その反面、以前は OMP_NUM_THREADS に実際のCPUのスレッド数よりも小さい値を指定することによって、使用するスレッドの数を制限することができていました。August 26, 2015では(少なくとも同じ方法では)スレッドの数を制限できなくなってしまいました。

並列化による速度の上昇


AkaiKKRはコヒーレントポテンシャル近似(CPA)を用いた合金の計算が得意です。従って、使われる用途は必然的に広い組成の範囲を持った合金の計算になりがちです。例えばAkaiKKRでFeCoの磁気モーメントと格子定数では、鉄とコバルトの二元合金に対して、コバルト濃度を0%から100%まで10%刻みで計算しています。

このような計算をするときに、CPUを並列化して組成を一種類ずつ順番に計算していく場合と、それぞれの計算にはCPUを1スレッドずつしか使わずに、複数の組成を平行して計算する場合の、どちらの方が高速に計算を終えることができるのか気になります。
そこで今回は、スレッド数と計算時間の関係をAugust 26, 2015よりも以前のバージョンであるMay 22, 2015で調べました。

計算条件


2015年9月の第27回CMDワークショップに参加させていただき、9月末まで大阪大学のコンピューターを使わせていただけるという事なのでcmd2の私のアカウントにMay 22, 2015のバージョンをインストールして計算を行いました。

計算セルの大きさやCPAの有無によってどの程度の影響があるのかを知るため、もっとも単純なbccFe, CPAを用いたfccNi50Fe50, 計算セルに5個の原子を持ち三成分のCPAを行う立方晶Sr(Ti0.97Ta0.02Ni0.01)O3ペロフスカイト, かなりオープンな構造であるため多量の空港を入れてあるグラファイトの4種類の計算を行いました。

#!/bin/csh -f

## *** プロジェクト名 ***
set PROJECT="Fe"
#set PROJECT="NiFe"
#set PROJECT="SrTiO3"
#set PROJECT="graphite"

setenv OMP_STACKSIZE 100M
limit stacksize unlimited

# ## スレッド数 6
setenv OMP_NUM_THREADS 6
echo "OMP_NUM_THREADS=6"
time ~/old/cpa2002v009c/specx < in/${PROJECT}.in > out/${PROJECT}_6.out

## スレッド数 5
setenv OMP_NUM_THREADS 5
echo "OMP_NUM_THREADS=5"
time ~/old/cpa2002v009c/specx < in/${PROJECT}.in > out/${PROJECT}_5.out

## スレッド数 4
setenv OMP_NUM_THREADS 4
echo "OMP_NUM_THREADS=4"
time ~/old/cpa2002v009c/specx < in/${PROJECT}.in > out/${PROJECT}_4.out

## スレッド数 3
setenv OMP_NUM_THREADS 3
echo "OMP_NUM_THREADS=3"
time ~/old/cpa2002v009c/specx < in/${PROJECT}.in > out/${PROJECT}_3.out

## スレッド数 2
setenv OMP_NUM_THREADS 2
echo "OMP_NUM_THREADS=2"
time ~/old/cpa2002v009c/specx < in/${PROJECT}.in > out/${PROJECT}_2.out

## スレッド数 1
setenv OMP_NUM_THREADS 1
echo "OMP_NUM_THREADS=1"
time ~/old/cpa2002v009c/specx < in/${PROJECT}.in > out/${PROJECT}_1.out


結果


Fig.1はスレッドの数と計算時間の関係をプロットしたものです。
CPUの処理時間は、それぞれの物質を単一スレッドで計算したときの値を1として規格化してあります。
したがって、理想的に言えば2スレッドを使った時には時間が1/2になり、3スレッドを使った時には1/3となる、といったように減少していってほしいところです。実際には多少のオーバーヘッドがありもう少し長い時間がかかっています。

スレッド数を増していくほど並列化の効果は減っていきますが、6スレッド程度までなら並列化の効果が頭打ちになってしまうという事はないようです。また、結晶構造の複雑さに応じて、並列化の効果が変わるのではないかと予想していましたが、結果を見る限りほとんど影響はないようです。

計算してみる前は、状況に応じて並列化の有無をコントロールすることで、効率よく計算ができるのではないかと考えていましたが、結果を見る限り全てOpenMP並列化でやってしまってもよさそうな気がします。
August 26, 2015にバージョンアップすることにより、OMP_NUM_THREADSで並列化数のコントロールができなくなりますが、それでもOpenMP関連に関しては、デメリットよりもメリットの方が大きそうです。

関連エントリ




参考URL




付録


このエントリで使用したファイルを添付します。ファイル名末尾の".txt"を削除して、"_"を"."に変更すれば使えるはずです。(参考:ねがてぃぶろぐの付録)


参考文献/使用機器




フィードバック



にほんブログ村 その他趣味ブログ 電子工作へ

 ↑ 電子工作ブログランキング参加中です。1クリックお願いします。


コメント・トラックバックも歓迎です。 ↓      


 ↓ この記事が面白かった方は「拍手」をお願いします。

tag: AkaiKKR machikaneyama KKR CPA OpenMP 

AkaiKKRで固定スピンモーメント計算

AkaiKKR(machikaneyama)では固定スピンモーメント(fsm)計算を行うことができます。今回は体心立方構造(bcc)鉄のスピンモーメントを変化させながら、全エネルギーと状態密度を計算しました。

001_20150914155956606.gif
Fig.1: スピンモーメントの大きさを変化させたときのbcc鉄の状態密度の変化。緑で示したときが磁気モーメントが2.2μBの場合で、エネルギー的に最安定。



固定スピンモーメント計算


AkaiKKR(machikaneyama)ではmagtypをmagとしてgo計算を行うと自動的に強磁性の安定な状態が(強磁性の解が存在すれば)計算されます。例えば体心立方構造(bcc)の鉄の計算を行うと、スピンモーメントM=2.17μBという値が自動的に得られます。

これに対して、スピンモーメントを指定して計算する方法をfixed spn moment(固定スピンモーメント: fsm)計算と呼びます。AkaiKKRのソースコードやInstalling and Running AKAIKKR (PDF)等を見るに、fsm計算は実行可能な感触を受けていたのですが、私の記憶が確かなら、以前のバージョンでは上手く行かなかったように思います。このエントリを書いている段階での最新版であるAugust 26, 2015では、計算できるようになっていたので報告します。

計算手法


Installing and Running AKAIKKR (PDF)には以下のようにあります。

If the calculational mode is set to fsm (ids = 5) then the value for the fixed spin has to be given at the end of the input file.

そこで、計算の種類をgoからfsmに変更し、ファイルの末尾に指定するスピンモーメントを入力したインプットファイルを以下のように準備しました。

c----------------------Fe------------------------------------
fsm data/fefsm
c------------------------------------------------------------
c brvtyp a c/a b/a alpha beta gamma
bcc 5.27 , , , , , ,
c------------------------------------------------------------
c edelt ewidth reltyp sdftyp magtyp record
0.001 1.0 sra mjw mag 2nd
c------------------------------------------------------------
c outtyp bzqlty maxitr pmix
update 8 200 0.035
c------------------------------------------------------------
c ntyp
1
c------------------------------------------------------------
c type ncmp rmt field mxl anclr conc
Fe 1 1 0.0 2
26 100
c------------------------------------------------------------
c natm
1
c------------------------------------------------------------
c atmicx(in the unit of a) atmtyp
0 0 0 Fe
c------------------------------------------------------------
c moment
2.2
c------------------------------------------------------------


通常のgo計算と同様にfsm計算で得られたポテンシャルファイルを利用してdos計算やspc計算を行えば、スピンモーメントを指定した状態密度やバンド構造が計算できるようです。今回はシェルスクリプトを作成して、スピンモーメントを0(つまり非磁性)から2.5まで0.1ずつ変化させたときの全エネルギーと状態密度を計算しました。

#!/bin/csh -f

## *** フォルダ構造 ***
## FeFSM/─┬─analysis/─FeFSM.plt
## ├─in/
## ├─out/
## ├─data/
## ├─template/─FeFSM.in
## └─FeFSM.sh

## *** スピンモーメント ***
set SPIN_LIST=( 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 )

## *** 保存先のファイルが存在していたら削除 ***
rm -f analysis/FeFSM.txt

## *** スピンモーメントごとに計算 ***
foreach SPIN ( ${SPIN_LIST} )
## テンプレートから入力ファイルを作成
sed 's/'SPIN'/'${SPIN}'/g' template/FeFSM.in > in/FeFSM_${SPIN}.in
## 第一原理計算
specx < in/FeFSM_${SPIN}.in > out/FeFSM_${SPIN}.out
## 計算結果の保存
tail -n 2 data/fefsm-${SPIN}.info | sed '$d' >> analysis/FeFSM.txt
end


結果


冒頭に示したFig.1がスピンモーメントを変化させた際の状態密度の変化です。緑のときがM=2.2で実験値に最も近いときの状態密度です。スピンモーメントとは、つまるところ、upスピンとdownスピンの電子の個数の差なので、スピンモーメントが大きくなるにつれてupスピンの状態密度は低エネルギー側へ、downスピンの状態密度は高エネルギー側へ移動していきます。

002_201509141559564ea.png
Fig.2: スピンモーメントと全エネルギーの関係


Fig.2に示したのは、スピンモーメントに対する全エネルギーの変化をプロットしたものです。実験値に最も近いM=2.2μBで全エネルギーが最低になっていることがわかります。

関連エントリ




参考URL




付録


このエントリで使用したファイルを添付します。ファイル名末尾の".txt"を削除して、"_"を"."に変更すれば使えるはずです。(参考:ねがてぃぶろぐの付録)


参考文献/使用機器




フィードバック



にほんブログ村 その他趣味ブログ 電子工作へ

 ↑ 電子工作ブログランキング参加中です。1クリックお願いします。


コメント・トラックバックも歓迎です。 ↓      


 ↓ この記事が面白かった方は「拍手」をお願いします。

tag: AkaiKKR machikaneyama KKR FSM 固定スピンモーメント 強磁性 状態密度 DOS 

AkaiKKRの.infoファイルから情報を取り出す

AkaiKKR(machikaneyama)は、その計算結果のうち「全エネルギー」と「磁気モーメント」の二つを格子定数aとともに.infoファイルに出力します。これらの二つの値をtail, sed, awkの3つの命令を利用して、上手に取り出す方法を知っていれば、結果の解析を行うためのシェルスクリプトが作れます。

例えばcshスクリプトでdata/fe.infoの最後から2行目の全エネルギーをENEという変数に代入するには以下のようにします。

set ENE=`tail -n 2 data/fe.info | sed '$d' | awk '{print $2}'`



AkaiKKRの.infoファイル


AkaiKKR(machikaneyama)は、その実行ファイルであるspecxの実行が終了する度にデータディレクトリの.infoファイルの末尾に「格子定数a」「全エネルギー」「磁気モーメント」の3つの値が出力されます。標準出力に出力される(悪く言えば雑多な)情報に比べて、最低限の重要な値だけが出力されるので便利ではあります。

以下に示すのは、AkaiKKRでテスト計算で行った鉄の計算の後のdata/fe.infoの内容です。

       5.2700       -2522.8222938   2.17548
5.2700 -2522.8222950 2.17547
5.2700 -2517.8475965 0.30790

ここで.infoへの出力はspecxの実行終了ごとに毎回行われることに注意が必要です。例えばAkaiKKRでテスト計算の場合ではdata/fe.infoに保存された3行3列の数字のうちで真ん中の2列目だけが意味を持つ値でした。
今回は、このような.infoファイルの中から、指定した行だけを出力するのに便利なコマンドについてまとめます。実行にはsedawkを利用するので、これらをインストールしておく必要があります。

最後の行だけを取り出す


tail -n 1 data/fe.info

tailコマンドは、ファイルの後ろの方のデータを読みだすことができます。tail -n 1とすれば、指定されたファイルの最後の1行だけを取り出すことができます。収束させるため複数回go計算を行うと、一番最後の行が最新の(つまり収束した)値となっているはずです。

最後から2行目だけを取り出す


tail -n 2 data/fe.info | sed '$d'

tailコマンドはtail -n 2 data/fe.infoとすれば後ろから2行分、tail -n 3 data/fe.infoとすれば後ろから3行分読み出します。後ろから2行分を取り出した後、sedを利用して最後の行を削除すれば最後から2行目だけが残ります。
AkaiKKRでテスト計算の様に、go計算を行った後でdos計算を行うなど、最後の行が不要なデータのときには、このようにして最後から2行目だけを取り出します。

最後から3行目だけを取り出す


tail -n 3 data/fe.info | sed '$d' | sed '$d'

後ろから3行分を取り出した後、最後の行を削除する工程を2回行えば、最後から3行目だけが残ります。
go計算を収束させた後、dos計算とspc計算の両方を行った場合などは、後ろの2行が不要データで後ろから3行目が必要なデータという事になります。同様な方法で後ろから4行目、5行目を取り出すこともできるでしょう。はっきり言って力技です。おそらくもっとスマートな方法があると思います、誰か教えてください。

最後の行の全エネルギーを取り出す


tail -n 1 data/fe.info | awk '{print $2}'

ここからは、列を取り出す方法です。.infoファイルの中で全エネルギーは2列目です。tailコマンドで最後の行を取り出した後、awkをつかって2列目を取り出します。

最後の行の磁気モーメントを取り出す


tail -n 1 data/fe.info | awk '{print $3}'

同様に3列目を取り出せば、磁気モーメントです。また1列目を取り出せば、格子定数aを読みだすことができます(格子定数を読みだすケースはまれと思いますが)。

最後から2行目の全エネルギーを取り出す


tail -n 2 data/fe.info | sed '$d' | awk '{print $2}'

ここからは単なる組み合わせです。
tailで最後から2行分を取り出した後、sedで最後の行を削除することによって、最後から2行目だけを取り出し、awkをつかって2列目だけを取り出します。

関連エントリ




参考URL




参考文献/使用機器




フィードバック



にほんブログ村 その他趣味ブログ 電子工作へ

 ↑ 電子工作ブログランキング参加中です。1クリックお願いします。


コメント・トラックバックも歓迎です。 ↓      


 ↓ この記事が面白かった方は「拍手」をお願いします。

tag: AkaiKKR machikaneyama シェルスクリプト 

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

密度汎関数理論入門: 理論とその応用を購入したのでレビューします。

英文タイトルは Density Functional Theory A PRACTICAL INTRODUCTION です。この PRACTICAL の部分が日本語のタイトルには反映されていないのですが、この本の重要な点は、まさに PRACTICAL な入門書であるという点です。




PRACTICALな入門書という点に関して、訳者まえがきから引用します。
国内では, このDFTの理論を取り扱った書籍は, 和書・翻訳書ともにある程度の数が存在する. 特にDFTそのものについての解説には優れた書籍が出版されている. しかし, 量子力学に十分精通していない研究者や技術者がこういった書籍を読みこなすには多くの困難が待ち受けていると思われる. これに対し, 本書は, DFTを用いて物性値(あるいは「材料の特性値」)を実際に導くために, どのような条件を設定するか, 何に気を付けないといけないか, またDFT計算から直接得られる値をどう用いるかについて丁寧に書かれており, 非常に実践的な(副題にもなっている, プラクティカルな)内容となっている.


つまり密度汎関数理論の高尚な解説ではなく、第一原理計算ソフトウエアのユーザーのための入門書という事です。
魔法のように物性値を計算してくれる(?)第一原理計算ソフトに興味を持ったものの、少し勉強しようと思ったら、いきなりシュレディンガー方程式が出てきて、自分の知りたい知識(求めたい物性を計算する方法)とのあまりものギャップに面食らったという人のための本です。

具体的な第一原理計算パッケージに依存した記述はありませんが、基本的には平面波基底+擬ポテンシャル法(VASPとかAbinitとかQuantum ESPRESSOとか)のソフトの利用を想定しているようです。そういう意味では全電子法であるAkaiKKR(machikaneyama)などには当てはまらない内容もあります。ただ、どのパッケージを使うにしても、(最も良く使われているであろう)平面波基底+擬ポテンシャル法の知識はあった方がいいと思います。(さもなければ自分の使うコードのアドバンテージを説明できません。)

内容はおおざっぱに言って3パートに分類できると思います。

1章と10章は、基本的な背景となる理論です。
このパートには、密度汎関数理論のお決まりの説明(シュレディンガー方程式は多体問題だから直接は解けなくて、密度汎関数理論を使ってコーンシャム方程式に書き直して...でも、多体問題のところは結局どうしようもないから、局所密度近似などの近似を使うけど、その近似のせいでときどき変な結果になって困る...というような話)が書いてあります。
このたぐいの話も理解しておきたいのですが、重要な点は、このパートに出てくる数式を理解できなくても以降のパートを読むのに支障はないという事です。

2章と3章がこの本のメインだと思います。
2章は、実際に最も簡単な固体の計算を行うために必要な知識について書いてあります。まず計算のための入力ファイルを作るために必要な最低限の結晶学について、次に計算結果である全エネルギーを理解するための最低限の熱力学です。
3章は、もう少しDFT計算寄りの話です。第一原理計算の文献によく出てくるパラメータの意味(k点の数とかカットオフエネルギーとか)について解説されています。

4章から9章までは各論です。興味のある順番に読むのが良いと思います。
AkaiKKR(machikaneyama)に最も向いているのは8章の「電子構造と磁気的性質」なので、私はそこから読みました。

  1. 密度汎関数理論とはなんだろう?
  2. 単純な固体のDFT計算
  3. DFT計算の実際
  4. 固体表面のDFT計算
  5. 振動数のDFT計算
  6. 遷移状態理論による化学反応速度の計算
  7. 第一原理熱力学による平衡状態図
  8. 電子構造と磁気的性質
  9. 非経験的分子動力学法
  10. 正確さと“標準的な”計算を超えた方法


関連エントリ




フィードバック



にほんブログ村 その他趣味ブログ 電子工作へ

 ↑ 電子工作ブログランキング参加中です。1クリックお願いします。


コメント・トラックバックも歓迎です。 ↓      


 ↓ この記事が面白かった方は「拍手」をお願いします。
FC2カウンター
カテゴリ
ユーザータグ

LTspiceAkaiKKRmachikaneyamaScilabKKRPSoCOPアンプCPA強磁性PICモンテカルロ解析常微分方程式odeトランジスタecalj状態密度DOSインターフェース定電流スイッチング回路PDS5022半導体シェルスクリプト乱数レベルシフトHP6632A温度解析分散関係I2Cトランジスタ技術R6452A可変抵抗ブレッドボードセミナーバンドギャップ数値積分確率論反強磁性偏微分方程式バンド構造絶縁熱設計非線形方程式ソルバフォトカプラシュミットトリガLEDLM358カオスISO-I2C三端子レギュレータGW近似A/Dコンバータカレントミラーアナログスイッチ数値微分マフィンティン半径TL431発振回路サーボPC817CUSB直流動作点解析74HC4053補間FFTBSch開発環境パラメトリック解析2ちゃんねるチョッパアンプ量子力学bzqlty電子負荷イジング模型LDA標準ロジックアセンブラ基本並進ベクトルブラべ格子単振り子熱伝導位相図TLP621キュリー温度繰り返し状態方程式MaximaVESTAスイッチト・キャパシタ相対論FETランダムウォークスピン軌道相互作用SMP六方最密充填構造抵抗不規則合金ewidthスレーターポーリング曲線GGAラプラス方程式cygwingfortranQSGW失敗談コバルト条件分岐TLP521テスタLM555Writer509TLP552格子比熱マントルデータロガー自動計測詰め回路ガイガー管ダイヤモンドQNAPMCUFXA-7020ZR過渡解析三角波UPSNE555固有値問題熱力学ブラウン運動フェルミ面awk起電力第一原理計算OpenMPfsolveubuntu最大値xcrysden最小値最適化仮想結晶近似VCA差し込みグラフスーパーセル井戸型ポテンシャル平均場近似シュレディンガー方程式FSMフラクタルOPA2277固定スピンモーメント2SC1815全エネルギー合金multiplotgnuplotc/aTeX結晶磁気異方性interp1ウィグナーザイツ胞初期値マンデルブロ集合疎行列面心立方構造fcc不純物問題非線型方程式ソルバフィルタL10構造PGA半金属二相共存SICZnOウルツ鉱構造BaO重積分クーロン散乱磁気モーメント電荷密度三次元CIF岩塩構造CapSenseノコギリ波デバイ模型ハーフメタル正規分布フォノンquantumESPRESSOルチル構造スワップ領域リジッドバンド模型edelt縮退キーボード軸ラベルグラフの分割凡例トラックボールPC不規則局所モーメント片対数グラフトランス両対数グラフCK1026MAS830L直流解析Excel円周率パラメータ・モデルヒストグラム日本語最小二乗法等価回路モデルGimp線種シンボルTS-110TS-112PIC16F785LMC662化学反応文字列specx.f入出力ifortマテリアルデザインヒストグラム確率論Realforce等高線ジバニャン方程式P-10Ubuntuナイキスト線図Crank-Nicolson法陰解法熱拡散方程式HiLAPWAACircuit連立一次方程式負帰還安定性境界条件EAGLEMBE関数フィッティング

最新コメント
リンク

にほんブログ村 その他趣味ブログ 電子工作へ