話題になっていたので少し遊んでみた。スワップゲートを使うと大きく点数が伸びたが、10万点に届かず…
「Ruby」カテゴリーアーカイブ
CP2K@物性研ohtaka 2023
古いintelコンパイラが突然使えなくなったので、コンパイルし直し。
色々試したがintelではうまくいかず、最終的には
CP2K 2023.1 gcc10.1.0 openmpi4.0.4
の組み合わせ。分子研のページに示されている3つのパッチをあて、toolchainオプションは下記。
–mpi-mode=openmpi –math-mode=openblas –with-gcc=system –with-cmake=system –with-openmpi=system –with-mpich=no –with-intelmpi=no –with-libxc=install –with-libint=install –with-fftw=install –with-acml=no –with-mkl=no –with-openblas=install –with-scalapack=install –with-libxsmm=install –with-elpa=install –with-ptscotch=install –with-superlu=install –with-pexsi=install –with-quip=install –with-plumed=install –with-sirius=install –with-gsl=install –with-libvdwxc=install –with-spglib=install –with-hdf5=install –with-spfft=install –with-spla=install –with-cosma=install –with-libvori=install –with-libtorch=install
make途中で
・libint_f.modが見つからないとエラー → fortranディレクトリにあったのをincludeにコピーして解決
・src/core_ppl.f で 下記のエラー
Error: ‘deltaR’ not specified in enclosing ‘parallel’
ちゃんと定義されてるんだが… DEFAULT(NONE)をDEFAULT(SHARED)にして解決
これでひとまず過去のDFTMDの続きを回すことができた。intelより10%くらい遅いが仕方なし。
かえる飛びループ
for文で三つ飛ばしのループにしたい場合。
いくつかバリエーションはあるが、個人的にわかりやすかったのが
for i in (0..N).step(3) do puts i end
ファイルの行数の読み込み
事前にファイルの行数を取得したい場合。
巨大なファイルを誤って読み込もうとしてしまった場合、スタックしてしまいそうではある。
nlines=File.read("filename").count("\n")
現在何行目かを知りたい場合はこちら。
f = open(ARGV[0], "r") while a = f.gets puts f.lineno end
メソッド []=
ベクトルの要素を上書きするようなメソッドを作成したものの、'[]=’メソッドがないと言われて怒られるので、作成してみる。これで、直観的な取扱いが可能に。
class Vector def []=(i, x) @elements[i]=x end end
変数を含むファイル名
Dir.chdir("#{work}/#{dirname}")
ゼロ埋めの番号づけ
for i in 1..32 do num=sprintf("%02d",i) end
カレントディレクトリの取得
RubyではBashよりも簡単かも。
work=Dir.pwd
降順ループ
for i in (n).downto(0) do 処理 end
よくある昇順ループは 0..n などと書くが、上のようにすると降順ループとなる。
配列の各要素の和
[a,b]+[c,d]=[a+c,b+d]
としたい。
まずtranspose methodで[a,b]と[c,d]から[[a,c],[b,d]]という配列を作成し、それぞれの小配列の中身をinject methodを用いて足し合わせる。直観的にはarray1+array2のようにできるとよいのだろうけれど(methodを定義すればよいのだが、ひとまずはこれで)。
[array1,array2].transpose.map{|array| array.inject(&:+)}