(一)Lammps安裝
寫在前面:
作為一個從Windows剛轉到linux的孩子,上手就讓我安裝Lammps真的有點太嚴格了些。Lammps作為分子動力學模擬領域裡一款極為優秀的軟體,有著無可替代的優勢,但是的確難易上手。加之由於過於專業,受眾小,網上能查到的資料也少,所以從配置到開展工作花費了大量的時間和精力。在此,我希望能把我學習的過程記錄下來,一是能見證我的努力,二是能幫助新接觸這個領域的同學節約時間,投入到更有意義的工作中去。但是囿於水平,可能有所疏漏甚至錯誤,在此給出我的聯繫方式,隨時給予力所能及的幫助或者共同研究探討,和大家一起共同進步。
email lijichen365@126.com wechat lijichen365
【2018年8月22號的更新,你沒有見過的船新安裝,系兄弟就來嘗鮮】
這次更新的cmake方法將省去手動修改Makefile的過程,會自動去搜索所依賴的庫,不需要手動輸入晦澀的路徑,大大減少了出錯的機會。經過兩天的摸索,終於編譯成功。首先是本方法概括。
通過CMake,我們將安裝分成多個階段:
配置:定義我們想要啟用/禁用哪些功能以及如何編譯它們
編譯:編譯每個源文件並根據配置生成二進位文件和庫
安裝(可選):將依賴的庫文件和可執行文件部署到機器上,然後就可以將其他不需要的部分刪除,使環境更為整潔
在之前基於GNU Make的LAMMPS構建系統中,通過運行make yes-MOLECULAR等特殊make目標進行配置。這些目標必須通過手動編輯Makefile以添加編譯器選項和/或更正包含目錄和庫路徑。
使用CMake進行編譯時,不再需要這些編輯和複製操作。源目錄保持不變,可以自動檢查出來依賴並可以編譯許多不同形式的LAMMPS。它支持真正的源外構建。
使用CMake時,您可以在源目錄之外的任何文件夾中進行編譯。您選擇的任何工作目錄都將成為所謂的構建目錄。所有配置文件和編譯結果都存儲在此文件夾中。我們建議將其稱為build /。
0.手冊信息
3.1. Build LAMMPS with CMake 這個是lammps的手冊頁,高度概括。
https://github.com/lammps/lammps/blob/master/cmake/README.md 安裝方法作者的github頁,是詳細的教程。本次的教程就是在這個的指導下完成的。
1.安裝過程
首先安裝依賴:
apt install build-essential;
apt install cmake
apt install gfortran
apt update
apt upgrade
fftw,如果不裝自己制定的版本的話,會從lammps自帶的快速傅里葉變換中編譯,速度和表現都是一樣的。
裝並行的lammps首先需要安裝mpich或者OpenMpi,這裡以mpich為例。首先去mpich的官網下載mpich3的壓縮包。
tar -zxvf mpich3.tar.gz #解壓縮
./configure --enable-shared=yes #配置。注意如果不加shared的話將無法檢查到mpicxx的位置。
make #本次建議將其安裝到默認位置。如果是自定義位置的話,可能需要將位置加入到PATH中,不清楚
make install #此處的檢測是通過什麼來實現。能用就完事了。
此處使用github上的lammps資源,方便
git clone https://github.com/lammps/lammps.git #下載所需文件
cd lammps
mkdir build
cd build
下面就是使用cmake來配置的環節。
首先是最impatient的方法。
cmake ../cmake
make
make install
完。每次僅需要通過mpirun -np N lmp < in.script 調用就好。下面不用看了,點了贊快走。
自定安裝將複雜一些。過去我們在安裝之前需要用make yes-all這樣的指令去選擇需要的包。為了實現相同的功能,cmake需要通過傳入命令行參數來挨個指定,可是很快命令行就長得一塌糊塗。所以可以通過預製文件+參數微調的方式快速完成這個工作。
cmake -C ../cmake/presets/std_nolib.cmake -D PKG_GPU=on ../cmake
# -C後跟預製文件的路徑 -D後跟可選參數。具體的可選參數在0。資料中第二個github readme中的Reference有,完全可以實現之前修改Makefile的全部功能。
#有幾個比較有用的LAMMPS_MACHINE=str 可以指定lmp文件名,默認無。(格式lmp_str)
#PKG就是是否安裝哪一個包
當cmake完之後,僅僅是產生了配置文件,之後還需要有make來編譯。編譯完成後當前文件夾下就有一個lmp開頭的可執行文件(具體文件名取決於你指定的LAMMPS_MACHINE參數)。但是如果僅僅如此每次計算的時候都需要指定這個文件的位置非常麻煩,所以可以通過make install命令將此文件和依賴庫部署到本機上(默認/usr/local)然後就可以把之前的爛攤子刪了,每次直接用就可以了。
傳統方法:在Ubuntu 18.04LTS系統下安裝並行lammps
第零步:原料準備
下載lammps,mpich,fftw安裝包.這幾個安裝包均有自己的官方網站.
第一步:安裝fftw
解壓:
在文件夾下的終端依次輸入
./configure --prefix=/opt/fftw --enable-shared=yes
make
make install
安裝完畢,注意此時fftw安裝在/opt路徑下,後面修改Makefile.mpi文件和profile文件都會用到這個路徑。當然路徑可以自定,但是要確定位置.
第二步:安裝mpich
解壓:
./configure --prefix=/opt/mpich
make
make install
安裝完成。
這裡會出現第一個問題,錯誤提示是缺少Fortran編譯器.有兩種解決方案,第一種是在configure命令最後加上--disable-fortran以禁用Fortran部分,第二種是安裝Fortran77編譯器:
sudo apt install gfortran
第三步:設置fftw和mpich全局環境變數,此步驟很重要!!否則運算會出現無法載入共享庫的錯誤。
路徑添加在/etc/profile文件中,因此先打開此文件。
vi
/etc/profile
在文件最後添加:
PATH=/opt/mpich/bin:/opt/fftw/bin:$PATH #這一行是找到各個庫的位置
LD_LIBRARY_PATH=/opt/mpich/lib:/opt/fftw/lib:$LD_LIBRARY_PATH
PATH=/home/『usrname』/LAMMPS/src:$PATH 這一行是將lmp可執行文件添加到路徑,從哪都可以調用
保存並退出,最後別忘了更新重啟使其生效:
source /etc/profile
第三步:安裝lammps(重災區)
1、 解壓,在src/目錄下輸入:make yes-all (先把所有包安裝了)
2、 在src/目錄下輸入:make no-lib (卸載一些需要鏈接外部數學庫的package)
第四步:修改/src/MAKE中Makefile.mpi, 生成lmp_mpi
進入 /lammps-31Mar17/src/MAKE
打開 Makefile.mpi
按照以下修改文件(排版很亂一行一行對著看。主要是設定MPI和fftw)
#
mpi = MPI with its default compiler
SHELL
= /bin/sh
#
---------------------------------------------------------------------
#
compiler/linker settings
#
specify flags and libraries needed for your compiler
CC
= mpicxx
CCFLAGS
= -g -O3
SHFLAGS
= -fPIC
DEPFLAGS
= -M
LINK
= mpicxx
LINKFLAGS
= -g -O
LIB
=
SIZE
= size
ARCHIVE
= ar
ARFLAGS
= -rc
SHLIBFLAGS
= -shared
#
---------------------------------------------------------------------
#
LAMMPS-specific settings, all OPTIONAL
#
specify settings for LAMMPS features you will use
#
if you change any -D setting, do full re-compile after "make
clean"
#
LAMMPS ifdef settings
#
see possible settings in Section 2.2 (step 4) of manual
LMP_INC
= -DLAMMPS_GZIP -DLAMMPS_MEMALIGN=64
#
MPI library
#
see discussion in Section 2.2 (step 5) of manual
#
MPI wrapper compiler/linker can provide this info
#
can point to dummy MPI library in src/STUBS as in Makefile.serial
#
use -D MPICH and OMPI settings in INC to avoid C++ lib conflicts
#
INC = path for mpi.h, MPI compiler settings
#
PATH = path for MPI library
#
LIB = name of MPI library
MPI_INC
= -I/opt/mpich/include -DMPICH_SKIP_MPICXX -DOMPI_SKIP_MPICXX=1####上面是大寫的i別搞錯了MPI_PATH
= -L/opt/mpich/lib#MPI_LIB= -lmpich -lmpl –lpthreadMPI_LIB= -lmpich -lmpl
#
FFT library
#
see discussion in Section 2.2 (step 6) of manual
#
can be left blank to use provided KISS FFT library
#
INC = -DFFT setting, e.g. -DFFT_FFTW, FFT compiler settings
#
PATH = path for FFT library
#
LIB = name of FFT library
FFT_INC
= -I/opt/fftw/include -DFFT_FFTW3 ###大寫i別搞錯了FFT_PATH(這一行可能有問題,有可能是在/bin里也有可能在/lib里,自己找找)= -L/opt/fftw/libFFT_LIB
= -lfftw3
(注釋:本例中採用的是fftw3版本,所以後面有個3,如果用的是fftw2.1.5,則去掉3)
#
JPEG and/or PNG library
#
see discussion in Section 2.2 (step 7) of manual
#
only needed if -DLAMMPS_JPEG or -DLAMMPS_PNG listed with LMP_INC
#
INC = path(s) for jpeglib.h and/or png.h
#
PATH = path(s) for JPEG library and/or PNG library
#
LIB = name(s) of JPEG library and/or PNG library
JPG_INC
=
JPG_PATH
=
JPG_LIB
=
#
---------------------------------------------------------------------
#
build rules and dependencies
#
do not edit this section
include
Makefile.package.settings
include
Makefile.package
EXTRA_INC
= $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC)
$(PKG_SYSINC)
EXTRA_PATH
= $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH)
EXTRA_LIB
= $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB)
EXTRA_CPP_DEPENDS
= $(PKG_CPP_DEPENDS)
EXTRA_LINK_DEPENDS
= $(PKG_LINK_DEPENDS)
#
Path to src files
vpath
%.cpp ..
vpath
%.h ..
#
Link target
$(EXE):
$(OBJ) $(EXTRA_LINK_DEPENDS)
$(LINK)
$(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(EXTRA_LIB) $(LIB) -o $(EXE)
$(SIZE)
$(EXE)
#
Library targets
lib:
$(OBJ) $(EXTRA_LINK_DEPENDS)
$(ARCHIVE)
$(ARFLAGS) $(EXE) $(OBJ)
shlib:
$(OBJ) $(EXTRA_LINK_DEPENDS)
$(CC)
$(CCFLAGS) $(SHFLAGS) $(SHLIBFLAGS) $(EXTRA_PATH) -o $(EXE)
$(OBJ)
$(EXTRA_LIB) $(LIB)
#
Compilation rules
%.o:%.cpp
$(CC)
$(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) -c $<
#
Individual dependencies
depend
: fastdep.exe $(SRC)
@./fastdep.exe
$(EXTRA_INC) -- $^ > .depend || exit 1
fastdep.exe:
../DEPEND/fastdep.c
cc
-O -o $@ $<
sinclude
.depend
(1) -I (大寫i)
編譯程序按照-I指定的路進去搜索頭文件。
-I/home/include/表示將-I/home/include/目錄作為第一個尋找頭文件的目錄,尋找的順序是: /home/include/ -->/usr/include-->/usr/local/include
(2)-L(大寫l)
表示:編譯程序按照-L指定的路進去尋找庫文件,一般的在-L的後面可以一次用-l指定多個庫文件。
-L/lib/表示到/lib/目錄下找庫文件
(3)-l(小寫l)
表示:編譯程序到系統默認路進搜索,如果找不到,到當前目錄,如果當前目錄找不到,則到LD_LIBRARY_PATH等環境變數置頂的路進去查找,如果還找不到,那麼編譯程序提示找不到庫。
本例子使用的是gunzip庫,庫文件名是libz.so,庫名是z。很容易看出,把庫文件名的頭lib和尾.so去掉就是庫名了。
第五步 編譯
在修改完後,轉到/src下輸入
make clean-all
make mpi
如果編譯成功,完成上述操作後會在src路徑下生成一個lmp_mpi文件,就是我們編譯出的文件,在進行計算時,將該文件放到和in文件一個路徑下。
到這裡就安裝成功了!找一個例子測試一下:
從example下找到shear文件夾,複製in.shear 和lmp_mpi放到一起,輸入
mpirun –np 4 ./lmp_mpi < in.shear
有output就ok了。
推薦閱讀:
TAG:科技 |