Post

NWChem的编译安装

NWChem的编译安装

准备入门CDFT,先把NWChem编译一下。

mpi3.1.3

官网下载openmpi-3.1.3,解压:

1
tar -zvxf openmpi-3.1.3.tar.gz

进入目录,运行configure并安装:

1
2
./configure prefix=~/.local/share/mpi3.1.3
make all install -j

mpi的编译是很慢的,所以笔者喜欢编译一个版本之后把编译产物存一份留着给其他机子用。

1
tar -hcjvf mpi3.1.3.tar.bz mpi3.1.3

一个问题是mpi里有不少符号链接过来的东西,tar会跳过。搜了一下,tar打包时使用-h会自动把符号链接的本体找到包进去,我测试运行好像能用,如果有bug再来更新。

NWChem-7.2.3

GitHub上下载NWChem-7.2.3的源码,解压:

1
tar -xjvf nwchem-7.2.3-src.2024-08-27.tar.bz2

编译前,先设置一些环境变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
# openmpi
export PATH=~/.local/share/mpi3.1.3/bin:$PATH
export LD_LIBRARY_PATH=~/.local/share/mpi3.1.3/lib:$LD_LIBRARY_PATH
# NWChem
export NWCHEM_TOP=$HOME/apprepo/nwchem-7.2.3
export NWCHEM_TARGET=LINUX64
export NWCHEM_MODULES=all
export USE_MPI=y
export USE_MPIF=y
export USE_MPIF4=y
export USE_INTERNALBLAS=y
# sob老师说设置上面的就行,不过我这样直接make config会报错,提示我设置这个
export BLAS_SIZE=8

设置完成后,开始编译

1
2
make nwchem_config
make -j

笔者用的是登陆节点的老爷机,编译非常非常慢,估计编译一次得有半个小时。为什么不交到计算节点?因为编译过程中好像要下载啥东西,而计算节点连不了外网:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
attempt no. 4
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0curl: (6) Could not resolve host: web.archive.org; Unknown error
attempt no. 5
download failed
if internet connectivity is missing
set NO_NWPWXC_VDW3A=1
make[4]: *** [GNUmakefile:45: nwpwxc_vdw3a.F] Error 1
make[4]: Leaving directory '/work/home/gaus24/apprepo/nwchem-7.2.3/src/nwpw/nwpwlib/nwpwxc'
make[3]: *** [../../../config/makelib.h:146: optimized] Error 2
make[3]: Leaving directory '/work/home/gaus24/apprepo/nwchem-7.2.3/src/nwpw/nwpwlib/nwpwxc'
make[2]: *** [../../config/makelib.h:226: subdirs] Error 1
make[2]: Leaving directory '/work/home/gaus24/apprepo/nwchem-7.2.3/src/nwpw/nwpwlib'
make[1]: *** [../config/makelib.h:226: subdirs] Error 1
make[1]: Leaving directory '/work/home/gaus24/apprepo/nwchem-7.2.3/src/nwpw'
make: *** [GNUmakefile:105: libraries] Error 1

编译完成后,发现有个库找不到:

1
2
3
4
5
6
7
(micro) [gaus24@login01 LINUX64]$ ldd nwchem
        linux-vdso.so.1 =>  (0x00007ffed5d11000)
        ...
>>>>    libhwloc.so.15 => not found
        librt.so.1 => /lib64/librt.so.1 (0x00002b170654a000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b1706752000)
        ...

搜了下,libhwloc.so.15是个硬件拓扑检测的库,估计是为了做CPU绑定。7月在BDF暑校听一位老师说NWChem里面有大量炫技式的高效率计算代码,所以用到这种库也不奇怪。在一个犄角旮旯里翻到了这个库,检查一下依赖,很好,用的都是标准库,可以直接复制过来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(micro) [gaus24@login05 LINUX64]$ ldd /opt/hpc/software/mpi/hwloc/lib/libhwloc.so.15
        linux-vdso.so.1 =>  (0x00007ffc9b998000)
        libm.so.6 => /lib64/libm.so.6 (0x00002ad43711e000)
        libudev.so.1 => /lib64/libudev.so.1 (0x00002ad437420000)
        libxml2.so.2 => /lib64/libxml2.so.2 (0x00002ad437636000)
        libc.so.6 => /lib64/libc.so.6 (0x00002ad4379a0000)
        /lib64/ld-linux-x86-64.so.2 (0x00002ad436cb0000)
        librt.so.1 => /lib64/librt.so.1 (0x00002ad437d6d000)
        libcap.so.2 => /lib64/libcap.so.2 (0x00002ad437f75000)
        libdw.so.1 => /lib64/libdw.so.1 (0x00002ad43817a000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00002ad4383c9000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00002ad4385cd000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00002ad4387e3000)
        libz.so.1 => /lib64/libz.so.1 (0x00002ad4389ff000)
        liblzma.so.5 => /lib64/liblzma.so.5 (0x00002ad438c15000)
        libattr.so.1 => /lib64/libattr.so.1 (0x00002ad438e3b000)
        libelf.so.1 => /lib64/libelf.so.1 (0x00002ad439040000)
        libbz2.so.1 => /lib64/libbz2.so.1 (0x00002ad439258000)

复制过来后再次检查依赖,已经正常了,进行测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cat << 'EOF' > test.nw
title "Nitrogen cc-pvtz SCF geometry optimization"
geometry
n 0 0 0
n 0 0 1.08
end
basis
n library cc-pvtz
end
task scf optimize
EOF

export PATH=~/apprepo/nwchem-7.2.3/bin/LINUX64:$PATH

# 串行测试
nwchem test.nw > test_serial.out
# 根据官网的编译说明,nwchem运行时有一个主程序不参与并行计算,所以-np值至少为2 
mpirun -np 4 nwchem test.nw > test_parallel.out

看着是成功了,不过串行和并行的输出略有些区别。在BDF暑校听八卦的时候也听到了一点相关的,似乎NWChem为了大规模并行,对数值的精度控制比较狂放,所以用不同的核数精度损失不一致,可能会导致完全不同的结果,因此NWChem最好固定核数运行以确保可重复性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
                                Z-matrix (autoz)
                                -------- 

 Units are Angstrom for bonds and degrees for angles

      Type          Name      I     J     K     L     M      Value     Gradient
      ----------- --------  ----- ----- ----- ----- ----- ---------- ----------
    1 Stretch                  1     2                       1.06686   -0.00009


      ----------------------
      Optimization converged
      ----------------------


  Step       Energy      Delta E   Gmax     Grms     Xrms     Xmax   Walltime
  ---- ---------------- -------- -------- -------- -------- -------- --------
@    2    -108.98724218 -9.3D-07  0.00009  0.00009  0.00029  0.00051     10.5
                                     ok       ok       ok       ok  

Reference:

This post is licensed under CC BY 4.0 by the author.
Total hits!