GROMACS の xtc ファイルを自分の C++ プログラムで読む方法を紹介します。
既存のプログラムではサポートされていない独自の解析方法を試したい・・・という時に役に立つでしょう。
以下の前提で書いています。
- Linux 環境
- GROMACS はインストール済み
- GROMACS のコンパイルにはインテルコンパイラを使用している
GROMACS のインストールについては以下のリンクが参考になるでしょう。
Gromacs 2019.3をmacOS / Linux上にインストール
Gromacsのインストールとパフォーマンスの検証 on Docker and CentOS 7
サンプルソースコード
sample.cpp
#include <iostream>
#include "gromacs/fileio/xtcio.h"
using namespace std;
int main (int argc, char** argv)
{
t_fileio* fi = open_xtc(argv[1], "r");
int n;
gmx_int64_t step;
real time;
real prec;
matrix box;
rvec *x;
gmx_bool bOK;
// 原子数もここでゲット
read_first_xtc(fi, &n, &step, &time, box, &x, &prec, &bOK);
cout << "REMARK natom = " << n << '\n';
read_next_xtc(fi, n, &step, &time, box, x, &prec, &bOK);
cout << "Time: " << time << '\n';
cout << "Step: " << step << '\n';
cout << "Prec: " << prec << '\n';
cout << "boxx: " << box[0][0] << '\n';
cout << "boxy: " << box[1][1] << '\n';
cout << "boxz: " << box[2][2] << '\n';
cout << x[0][0] << '\n';
cout << x[0][1] << '\n';
cout << x[0][2] << '\n';
cout << x[1][0] << '\n';
cout << x[1][1] << '\n';
cout << x[1][2] << '\n';
close_xtc(fi);
}
Makefile
makefile_sample
TARGET=sample.x
CXX=icpc
CXXFLAGS= -O3 -std=c++11 -I/home/hoge/include -L/home/hoge/lib -I/home/hoge/gromacs-2018.3/src -L/home/hoge/gromacs-2018.3/build/lib
LIBS= -lgromacs
SRCS = sample.cpp
OBJS = $(SRCS:.cpp=.o)
HEADS=
$(TARGET): $(OBJS) $(HEADS)
$(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS) $(LIBS)
clean:
rm -f $(OBJS) $(TARGET)
GROMACS の共有ライブラリの場所は、インストール時の設定で変わるので適当に設定する。
コンパイル
$ make -f makefile_sample
実行
$ ./sample.x foo.xtc
実行時に
error while loading shared libraries: libgromacs.so.3: cannot open shared object file: No such file or directory
というエラーが出る場合、環境変数 LD_LIBRARY_PATH に、共有ライブラリがあるディレクトリへのパス(今回の場合は /home/hoge/gromacs-2018.3/build/lib)を追加する。