VASP编译前的目录 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ./ ├── arch │   ├── makefile.include.linux_gnu │   ├── makefile.include.linux_intel │   ├── makefile.include.linux_intel_serial │   └── makefile.include.linux_pgi ├── bin ├── build ├── build.sh ├── makefile ├── makefile.include ├── O2AVX2 ├── O2AVX512 ├── O3AVX2 ├── O3AVX512 ├── patch.5.4.4.16052018 ├── README └── src     ├── acfdt.F     ├── aedens.F     ├── asa.F     ├── auger.F     ├── ......             └── zgemmtest.F 
其中build.sh为自动化编译脚本,O2AVX2、O2AVX512、O3AVX2、O3AVX512为对应的不同优化参数的编译文件,内容格式与makefile.include一致。
其中O2AVX2的文件内容如下(用于编译vasp5.4.4):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 #  Precompiler options CPP_OPTIONS= -DHOST=\"LinuxIFC\"\              -DMPI -DMPI_BLOCK=8000 \              -Duse_collective \              -DscaLAPACK \              -DCACHE_SIZE=4000 \              -Davoidalloc \              -Duse_bse_te \              -Dtbdyn \              -Duse_shmem CPP        = fpp -f_com=no -free -w0  $*$(FUFFIX) $*$(SUFFIX) $(CPP_OPTIONS) FC         = mpiifort FCL        = mpiifort -qmkl=sequential -lstdc++ FREE       = -free -names lowercase FFLAGS     = -assume byterecl -w OFLAG      = -O2 -xcore-avx2 OFLAG_IN   = $(OFLAG) DEBUG      = -O0 MKL_PATH   = $(MKLROOT)/lib/intel64 BLAS       = LAPACK     = BLACS      = -lmkl_blacs_intelmpi_lp64 SCALAPACK  = $(MKL_PATH)/libmkl_scalapack_lp64.a $(BLACS) OBJECTS    = fftmpiw.o fftmpi_map.o fft3dlib.o fftw3d.o /opt/intel/oneapi/mkl/latest/interfaces/fftw3xf/libfftw3xf_intel.a INCS       =-I$(MKLROOT)/include/fftw LLIBS      = $(SCALAPACK) $(LAPACK) $(BLAS) OBJECTS_O1 += fftw3d.o fftmpi.o fftmpiw.o OBJECTS_O2 += fft3dlib.o #  For what used to be vasp.5.lib CPP_LIB    = $(CPP) FC_LIB     = $(FC) CC_LIB     = icc CFLAGS_LIB = -O FFLAGS_LIB = -O1 FREE_LIB   = $(FREE) OBJECTS_LIB= linpack_double.o getshmem.o #  For the parser library CXX_PARS   = icpc LIBS       += parser LLIBS      += -Lparser -lparser -lstdc++ #  Normally no need to change this SRCDIR     = ../../src BINDIR     = ../../bin # ================================================ #  GPU Stuff CPP_GPU    = -DCUDA_GPU -DRPROMU_CPROJ_OVERLAP -DUSE_PINNED_MEMORY -DCUFFT_MIN=28 -UscaLAPACK OBJECTS_GPU = fftmpiw.o fftmpi_map.o fft3dlib.o fftw3d_gpu.o fftmpiw_gpu.o CC         = icc CXX        = icpc CFLAGS     = -fPIC -DADD_ -Wall -openmp -DMAGMA_WITH_MKL -DMAGMA_SETAFFINITY -DGPUSHMEM=300 -DHAVE_CUBLAS CUDA_ROOT  ?= /usr/local/cuda/ NVCC       := $(CUDA_ROOT)/bin/nvcc -ccbin=icc CUDA_LIB   := -L$(CUDA_ROOT)/lib64 -lnvToolsExt -lcudart -lcuda -lcufft -lcublas GENCODE_ARCH    := -gencode=arch=compute_30,code=\"sm_30,compute_30\" \                    -gencode=arch=compute_35,code=\"sm_35,compute_35\" \                    -gencode=arch=compute_60,code=\"sm_60,compute_60\" MPI_INC    = $(I_MPI_ROOT)/include64/ 
这里主要修改了OFLAG = -O2 -xcore-avx2。
自动化编译脚本 编译脚本内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 # !/bin/bash #  启用严格错误检查(可选,根据需求注释) set -euo pipefail #  加载编译器环境 # source  /opt/intel/oneapi/setvars.sh#  定义编译目标和版本号 VASP_TARGETS=("vasp_gam" "vasp_ncl" "vasp_std") VERSION_SUFFIX="544" #  创建日志目录 mkdir -p build_logs #  遍历所有以O开头的配置文件 for config in O*; do     # 跳过非文件和非常规文件(如目录)     if [[ ! -f "$config" ]]; then         echo "跳过非文件项: $config"         continue     fi     echo "================================================================="     echo "正在处理配置: $config"     echo "================================================================="     # 清理项目     if ! make veryclean > /dev/null 2>&1; then         echo "警告:清理阶段可能有错误,继续执行..."     fi     # 应用配置文件     cp -v "$config" makefile.include || { echo "错误:复制配置文件失败"; exit 1; }     # 并行编译并记录日志     timestamp=$(date +%Y%m%d_%H%M%S)     log_file="build_logs/build_${config}_${timestamp}.log"     if ! time make all > "$log_file" 2>&1; then         echo "错误:编译失败,详见日志 $log_file"         continue  # 跳过后续步骤进入下一个配置     fi     # 重命名生成的可执行文件     for target in "${VASP_TARGETS[@]}"; do         if [[ -f "bin/$target" ]]; then             new_name="bin/${target}-${VERSION_SUFFIX}-${config}"             mv -v "bin/$target" "$new_name"         else             echo "警告:可执行文件 bin/$target 未找到"         fi     done     echo "配置 $config 处理完成"     echo "-----------------------------------------------------------------" done echo "所有配置处理完毕" 
使用时可以先加载并行环境source /opt/intel/oneapi/setvars.sh,然后在运行脚本 ./build.sh即可。
编译后效果 编译完成后,所有不同优化参数编译的vasp已经被自动命名,并保存到当前目录的bin目录:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 bin/ ├── vasp_gam-544-O2AVX2 ├── vasp_gam-544-O2AVX512 ├── vasp_gam-544-O3AVX2 ├── vasp_gam-544-O3AVX512 ├── vasp_ncl-544-O2AVX2 ├── vasp_ncl-544-O2AVX512 ├── vasp_ncl-544-O3AVX2 ├── vasp_ncl-544-O3AVX512 ├── vasp_std-544-O2AVX2 ├── vasp_std-544-O2AVX512 ├── vasp_std-544-O3AVX2 └── vasp_std-544-O3AVX512 0 directories, 12 files 
所有编译时的日志在build_logs目录下:
1 2 3 4 5 6 7 8 9 build_logs/ ├── build_O2AVX2_20250327_153710.log ├── build_O2AVX2_20250327_153916.log ├── build_O2AVX512_20250327_153717.log ├── build_O2AVX512_20250327_160944.log ├── build_O3AVX2_20250327_153726.log ├── build_O3AVX2_20250327_163749.log ├── build_O3AVX512_20250327_153735.log └── build_O3AVX512_20250327_171925.log