前言:
如今兄弟们对“ubuntu安装gfortran”可能比较关怀,兄弟们都想要分析一些“ubuntu安装gfortran”的相关文章。那么小编也在网摘上收集了一些对于“ubuntu安装gfortran””的相关资讯,希望咱们能喜欢,你们快快来学习一下吧!声明:本文转自知乎专栏千张的文章,本文只做学术交流,不做商业用途,原文请点击文末原文链接。
按照前文[1]我们配置好适合计算化学的WSL环境之后,就可以开始安装一些常用的软件了。
VASP 是 Fortran 写的平面波 DFT 程序。虽然不是 free software,但 VASP 的 license 并不贵,计算效率高,而且允许用户自行修改源码实现想要的功能;这几点比起某些软件来说不知良心到哪里去了(不点名,怕吃律师函)。此外,VASP 的速度与精度综合来说强于市面上的其他免费开源替代,还有非常齐的赝势库。因此,笔者算固体和表面的时候还是多用 VASP(主要是因为组里买都买了,不用白不用)。
虽然个人电脑肯定算不了大任务,但是有许多琐碎的小任务完全可以在本地做,比如计算真空盒子内的分子、百原子以内PREC=LOW粗优化、以及读服务器上收敛的 WAVECAR CHGCAR 在本地算单点(DOS/ELF 等)。虽然 VASP.6 已经出了,但是笔者许多前期数据都是 VASP5.4.1 计算的(程序版本要保持一致),而且 WSL1 不支持 GPU(WSL2 支持 GPU 了但不能 JIT,还是拉垮),新版主打 GPU 加速和 ML 的 feature 就残废了,所以笔者选择在自己的 WSL 下安装 VASP.5.4.1。在编译器的选择上,虽然 Intel 系编译出的速度更快,但是 Intel 全家桶对于个人电脑实在太臃肿,因此笔者选择【GNU 套件】+【可白嫖的 Intel MKL】来进行编译。
VASP 对待源码比较开放的态度催生了许多好用的代码包,比如 Graeme 组的 VTST[2] 、Hennig 组的 VASPsol[3] 等。VTST 实现了过渡态搜索的功能,且提供了大量实用的脚本;而 VASPsol 实现了隐式溶剂模型和 Poisson-Boltzmann 模型。这两者都需要加入源码重新编译,如果嫌麻烦的话可以用 ASE 代替 VTST,但 VASPsol 就没有替代了。
本文基于 Windows 10 v1909 + WSL1 Ubuntu 20.04 LTS + Intel 处理器
使用的 VASP 版本为 5.4.1.05Feb16.tar.gz,请自行下载(不分享,怕律师函)
使用的 VTST 版本为 170,但安装过程适用于新版本(目前是 180)
VASPsol 直接下载最新 Release 即可
安装依赖库
首先安装 GNU 全家桶
sudo apt-get install make build-essential g++ gfortran
然后安装 BLAS、LAPACK、SCALAPACK、FFTW3、OpenMPI
sudo apt-get install libblas-dev liblapack-dev libscalapack-mpi-dev libfftw3-dev libopenmpi-dev
为了加速计算,可以安装 Intel MKL(闭源、学术免费)。首先下载 GnuPG key
cd /tmpwget apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
然后把 MKL 加到 apt-get 的列表里
sudo sh -c 'echo deb all main > /etc/apt/sources.list.d/intel-mkl.list'sudo apt-get update
最后,安装 MKL,一路按 Tab 补全,查看选择最新的版本:
sudo apt-get intel-mkl-64bit-2020.4-912
安完之后在 ~/.bashrc 里设置 MKLROOT 环境变量,可以加入~/.bashrc:
export MKLROOT=/opt/intel/mklexport PATH=$PATH:/opt/intel/binexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/intel/mkl/lib/intel64_linexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/intel/mkl/lib/intel64
打官方补丁
官方补丁里含有一些 bugfix,以及新功能,建议打上。解压 vasp 的压缩包后,进入文件夹
tar xzf vasp.5.4.1.05Feb16.tar.gztar xzf vasp.potentials.tar.gzcd vasp.5.4.1
从官网下载补丁包[4],放到 vasp.5.4.1 路径下,打补丁
patch -p0 < patch.5.4.1.14032016patch -p0 < patch.5.4.1.03082016
加入 VTST 代码
解压到和 vasp.5.4.1 同级的目录,然后进入 vasp.5.4.1/src,打补丁、拷源码
cd srcpatch -p0 < ../../vtstcode-170/vasp-5.4.1-mpmd.patchpatch -p2 < ../../patch.vtstcp ../../vtstcode-170/*.F .cd ..
其中笔者使用的 patch.vtst 如下:
--- ./src/main.F 2016-09-14 14:30:57.143321000 -0700+++ ../vasp-test/src/main.F 2016-09-14 14:29:33.375003000 -0700@@ -3220,7 +3220,7 @@ CALL DYNMATFULL_ENERGY_FORCE(SCALEE, T_INFO%NIONS, DYN%POSION, TOTEN, TIFOR, LATT_CUR%A , IO%IU0)CALL CHAIN_FORCE(T_INFO%NIONS,DYN%POSION,TOTEN,TIFOR, &- LATT_CUR%A,LATT_CUR%B,IO%IU6)+ TSIF,LATT_CUR%A,LATT_CUR%B,IO%IU6)
CALL PARALLEL_TEMPERING(NSTEP,T_INFO%NIONS,DYN%POSION,DYN%VEL,TOTEN,TIFOR,DYN%TEBEG,DYN%TEEND, & LATT_CUR%A,LATT_CUR%B,IO%IU6)--- ./src/.objects 2016-02-08 06:28:27.000000000 -0800+++ ../.newobjects 2016-10-22 00:37:05.000000000 -0700@@ -64,7 +64,7 @@ tet.o \ tetweight.o \ hamil_rot.o \- chain.o \+ bfgs.o dynmat.o instanton.o lbfgs.o sd.o cg.o dimer.o bbm.o fire.o lanczos.o neb.o qm.o opt.o chain.o \ dyna.o \ k-proj.o \ sphpro.o \@@ -255,7 +255,7 @@ tet.o \ tetweight.o \ hamil_rot.o \- chain.o \+ bfgs.o dynmat.o instanton.o lbfgs.o sd.o cg.o dimer.o bbm.o fire.o lanczos.o neb.o qm.o opt.o chain.o \ dyna.o \ k-proj.o \ sphpro.o \
加入 VASPsol 代码
解压到和 vasp.5.4.1 同级的目录,然后进入 vasp.5.4.1,拷源码、打补丁
cp ../VASPsol-master/src/solvation.F src/patch src/pot.F < ../VASPsol-master/src/patches/pbz_patch_541
在笔者电脑上,直接如此编译会导致solvation.f90往 OUTCAR 写参数时候报错invalid memory reference;而笔者在服务器上编译时并没有发生此错误,暂时未知原因。读者可以先编译试试,不行的话就把main.F里SOL_WRITER那一行注释掉了事:
sed -i 's/CALL SOL_WRITER/!CALL SOL_WRITER/g' src/main.F
编译 vasp_xxx 可执行文件
纯 GNU 的版本,使用如下 makefile.include:
# Precompiler optionsCPP_OPTIONS= -DHOST=\"LinuxGNU\" \ -DMPI -DMPI_BLOCK=8000 -Duse_collective \ -DscaLAPACK -DCACHE_SIZE=4000 \ -Davoidalloc -Duse_bse_te \ -DtbdynCPP = gcc -E -P -C -w $*$(FUFFIX) >$*$(SUFFIX) $(CPP_OPTIONS)
FC = mpif90FCL = mpif90
FREE = -ffree-form -ffree-line-length-none
FFLAGS = -wOFLAG = -O2 -mtune=native -m64OFLAG_IN = $(OFLAG)DEBUG = -O0
LIBDIR = /usr/lib/x86_64-linux-gnuBLAS = -L$(LIBDIR) -lblasLAPACK = -L$(LIBDIR) -llapackBLACS = SCALAPACK = -L/usr/lib -lscalapack-openmpi $(BLACS)
LLIBS = $(SCALAPACK) $(LAPACK) $(BLAS)
LLIBS += -lfftw3INCS = -I/usr/include
OBJECTS = fftmpiw.o fftmpi_map.o fftw3d.o fft3dlib.o
OBJECTS_O1 += fftw3d.o fftmpi.o fftmpiw.oOBJECTS_O2 += fft3dlib.o
# For what used to be vasp.5.libCPP_LIB = $(CPP)FC_LIB = $(FC)CC_LIB = gccCFLAGS_LIB = -OFFLAGS_LIB = -O1FREE_LIB = $(FREE)
OBJECTS_LIB= linpack_double.o getshmem.o
# Normally no need to change thisSRCDIR = ../../srcBINDIR = ../../bin
如果使用 MKL 加速,则使用这一个 makefile.include:
# Precompiler optionsCPP_OPTIONS= -DHOST=\"LinuxGNU\" \ -DMPI -DMPI_BLOCK=8000 -Duse_collective \ -DscaLAPACK -DCACHE_SIZE=4000 \ -Davoidalloc -Duse_bse_te \ -DtbdynCPP = gcc -E -P -C -w $*$(FUFFIX) >$*$(SUFFIX) $(CPP_OPTIONS)
FC = mpif90 -m64 -I$(MKLROOT)/includeFCL = mpif90 -m64 -I$(MKLROOT)/include
FREE = -ffree-form -ffree-line-length-none
FFLAGS = -wOFLAG = -O2 -mtune=native -m64OFLAG_IN = $(OFLAG)DEBUG = -O0
LIBDIR = /usr/lib/x86_64-linux-gnuBLAS = LAPACK = BLACS = SCALAPACK = -L/usr/lib -lscalapack-openmpi $(BLACS)
LLIBS = $(SCALAPACK) $(LAPACK) $(BLAS)
LLIBS += -L$(MKLROOT)/lib/intel64 -Wl,--no-as-needed -lmkl_gf_lp64 -lmkl_sequential -lmkl_core -lpthread -lm -ldl
INCS = -I$(MKLROOT)/include/fftw
OBJECTS = fftmpiw.o fftmpi_map.o fftw3d.o fft3dlib.o
OBJECTS_O1 += fftw3d.o fftmpi.o fftmpiw.oOBJECTS_O2 += fft3dlib.o
# For what used to be vasp.5.lib CPP_LIB = $(CPP)FC_LIB = $(FC)CC_LIB = gccCFLAGS_LIB = -OFFLAGS_LIB = -O1FREE_LIB = $(FREE)
OBJECTS_LIB= linpack_double.o getshmem.o
# Normally no need to change thisSRCDIR = ../../srcBINDIR = ../../bin
把 makefile.include 放到 vasp.5.4.1 路径下,编译出三个可执行文件:
make std gam ncl
完工!
测试
为了方便使用,建议在 ~/.bashrc 里把VASPHOME设置为 vasp.5.4.1/bin(绝对路径),然后运行如下命令即可运行 VASP:
mpirun -np N $VASPHOME/vasp_xxx
注意,如果你的处理器支持超线程,建议开启,且并行线程总数不要超过物理核心数,具体原因可参考 sob 老师博文[5]。笔者在笔记本上四核并行试了一下,在 400 eV 截断能下用vasp_gam可以算得动 70 原子表面的几何优化,但是加速比不太行,毕竟不是原生,不过对付小任务是足够的了。
VASPsol 的验证很简单,随便往一个任务的 INCAR 里加入 LSOL=T,运行时如果 stdout 里有 SOL 字样以及 Fermi Shift,则编译成功。
VTST 的验证可以跑官方的氨分子反转算例[6] ,运行之后在 OUTCAR 能找到 NEB 信息就表示编译成功。
(待补充)
参考
1.WSL 科学计算〇 | 环境配置
2.
3.
4.VASP.5.X.XPatches hes
5.正确认识超线程(HT)技术对计算化学运算的影响
6.Transition State Search of Ammonia