「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%くらい遅いが仕方なし。


ファイルの行数の読み込み

事前にファイルの行数を取得したい場合。
巨大なファイルを誤って読み込もうとしてしまった場合、スタックしてしまいそうではある。

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

配列の各要素の和

[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(&:+)}