简介:CASTEP-19.11.tar.gz是Materials Studio等软件中CASTEP模块的19.11版源码与文档压缩包,面向从事固体材料电子结构计算的研究人员、材料科学/物理专业高年级学生。该版本基于密度泛函理论,支持几何优化、能带结构、频率分析、电荷密度、反应路径等典型计算,适合需要在Linux集群上自行编译部署CASTEP的用户。压缩包共4542个文件,大小20.12MB,内含233个C源码、222个Fortran源码、1317个param输入参数、1067个cell结构文件、99个cif晶体结构示例、95个usp赝势及大量makefile、configure编译脚本、tex说明文档和py后处理工具,目录结构完整,便于按模块查阅。目前已有1595人学习下载。解压后即可获得完整源代码、编译指南、文档与示例,用户可依据指南安装依赖并编译,或直接参考示例输入文件快速上手,是学习CASTEP编译与使用、了解新版算法改进的实用资料。
1. 你拿到的 CASTEP-19.11.tar.gz,到底比旧版多了什么
做计算材料的人对 CASTEP 应该不陌生,但真正动手把 CASTEP-19.11.tar.gz 从压缩包变成能算任务的二进制,是另一回事。这个包本身是 SourceForge 上 CASTEP 官方发布的 19.11 版本源码压缩包,Linux 下最常见的分发形式,里面是完整的 Fortran 源码、文档和构建脚本。19.11 这个版本号对应的是 2019 年 11 月的周期性维护版本,跟更早的 18.1、17.2 相比,它对 Intel 编译器、AMD 平台的兼容性更好,还默认启用了 OpenMP + MPI 混合并行,也支持了 ENCUT 自动判断、TS 搜索的改进等一批实用功能。对大多数课题组来说,这意味着同样的硬件条件下,旧版本跑不动或收敛不了的任务,在这个版本里有更高的概率直接跑通。
这篇文章就是顺着这个 tar.gz 包展开的实战笔记。读者是刚拿到源码包的学生,或者是组里负责维护计算服务器的工程师——你们关心的不是 CASTEP 是什么,而是这个包怎么编译、参数怎么设、任务怎么往下算。后面章节会从解压检查开始,依次走完依赖库准备、编译配置、性能调优、常见报错排查,最后落到日常使用习惯上。如果你手里正好有个编译到一半就卡住的 19.11,或者打算从旧版本迁移过来,这篇文章应该能帮你省下几天的折腾时间。
2. 解压之前先看包内结构:不要急着敲 make
2.1 解压命令与包结构检查
我见过不少人拿到 CASTEP-19.11.tar.gz 就迫不及待地 tar -zxvf,解压完直接 ./configure 或者 make,然后被一堆缺失的头文件劝退。其实这个包的结构是固定的,先花两分钟检查一下,能避免后面一半的编译错误。最常见的解压方式是:
tar -zxvf CASTEP-19.11.tar.gz cd CASTEP-19.11 ls -la解压后你应该看到一个典型布局:根目录下是 charset、Docs、Examples、Src,还有 install 相关的脚本。打开 Docs 目录里的 ReleaseNotes.txt,第一件事是确认你下载的版本号和日期,避免拿到的文件被传输过程损坏。ReleaseNotes 里还会写明这个版本需要的编译器版本下限——19.11 对 Intel 编译器要求 2017 版本以上,对 GCC 要求 6.0 以上,这是个硬门槛,低于这些版本编译时会有大量莫名的语法报错。
包内校验也是值得养成的习惯。源码包在传输过程中偶尔会出问题,很多人忽略这一步,等编译到一半报错才开始怀疑是不是包坏了。我的做法是先在下载目录里检查压缩包的完整性:
gzip -t CASTEP-19.11.tar.gz md5sum CASTEP-19.11.tar.gzgzip -t 只校验压缩流完整性,md5sum 用于记录一个常规基线。如果你的文件来源渠道本身提供了哈希值,直接比对即可;如果没提供,至少确认 gzip -t 输出正常。这一步不需要花很多时间,但能直接过滤掉一类最让人抓狂的“随机编译错误”。
2.2 源码包内目录如何决定你的编译策略
CASTEP-19.11 源码包的 Src 目录内部结构,基本决定了你接下来要走哪条编译路径。打开 Src 目录,会有 common、modules、io、parser 这些子目录,共同点是全部代码在编译前由一个定制脚本预处理,生成机器相关的 Fortran 源文件。这意味着 CPATH 或 Fortran 编译器版本不对,你在预处理阶段就会被卡住,而不是等到链接阶段。
我一般会在解压后先执行一次./install.sh --check,这是了解当前环境最直接的手段。如果包内没有这个脚本,就去 Docs 目录看安装说明,不同途径拿到的包可能在打包粒度上有差异,但构建系统本质上是同一套。这里刻意强调“先检查”,因为常见做法是直接跑./install.sh,靠脚本的交互式配置去设置编译器和数学库路径,而交互式脚本一旦碰到默认路径不对就会自动跳过去,编译时才发现某些库没链接上。
./install.sh --check这个命令会输出一个环境检查快照,包括哪些编译器可见、哪些数学库在当前环境能找到。注意--check参数不是所有 CASTEP 分发版本都自带,拿不准就去 Docs 里翻一下说明。它检查到缺失项时不会中断安装流程,只会留下几行警告,你要做的是记下这些警告,在下一步编译命令里手动指定库位置。这一步是后面所有编译配置的基础,别偷懒跳过。
3. 编译 CASTEP-19.11 之前的三板斧:编译器、数学库、环境变量
3.1 先定编译器:Intel 还是 GCC
CASTEP-19.11 的源码对 Fortran 标准特性依赖较重,编译器选错了,后面全是泪。业界在这个版本上默认推荐 Intel 编译器,如果你有正版或者学术许可,选 ifort/ifx 会让你后面的日子好过很多。Intel 编译器对 CASTEP 的优化程度最好,生成的二进制效率也更高。用 GCC 倒是也能编译,但有两个明显的坑:一是 gfortran 版本低了编译报错,版本太高了链接阶段被某些新选项卡住;二是同样数量的核,GCC 编译出来的二进制跑起来会比 Intel 慢 10%~20% 不等。
我的建议是,先看看你的集群上装了什么。如果节点上已经有 Intel oneAPI 或者 Parallel Studio XE,直接走 ifort + MKL 路线。如果只有开源的 GCC 环境,关注gfortran --version是否 >= 6.0。需要说明的是,系统的 GCC 是 4.8.x 这种老版本的话,编译 CASTEP-19.11 基本等于在十字路口迷路,该考虑的是怎么装新一点的编译器,而不是在旧版本上浪费时间调参数。
# 检查当前环境里可用的编译器 which ifort ifx gfortran ifort --version 2>/dev/null || ifx --version 2>/dev/null gfortran --version | head -n 1输出结果里如果有 ifort 或者 ifx,那就优先用 Intel 路线。如果只有 gfortran,继续往前走也要心里有数:后面配置数学库的时候,BLAS/LAPACK 要么用纯参考实现,要么用 OpenBLAS,折腾程度比 MKL 稍高。
3.2 数学库是编译成败的分水岭:MKL、FFTW 和 ScaLAPACK
CASTEP 是平面波 DFT 代码,它的大部分时间花在 FFT 和线性代数上,所以数学库的选择直接决定你编译出来的东西到底能不能用。CASTEP-19.11 支持两种数学库组合:一种是 Intel MKL 全家桶,包含 BLAS、LAPACK、FFTW 接口和 ScaLAPACK;另一种是 OpenBLAS/参考 BLAS + FFTW + 独立的 ScaLAPACK。对大多数课题组来说,MKL 是最省心的方案,因为接口一致性最好,不用手工拼装。
这里有个容易误解的地方:CASTEP 源码包本身不捆绑数学库,也不捆绑 MPI 库。你以为是“解压即可编译”,实际是“解压只是开始”。编译前你必须确认以下东西都已经在系统里并且版本兼容:
# 假定用户用 Intel oneAPI source /opt/intel/oneapi/setvars.sh --force # 检查 MKL 是否可用 echo $MKLROOT ls ${MKLROOT}/lib/intel64/libmkl_scalapack_lp64.a如果$MKLROOT是空的,说明 Intel 环境没有正确 source 进来或者根本没有装 oneAPI。这时候就得考虑 MPI 是不是也缺失了,which mpifort mpirun同样需要检查。MPI 方面,19.11 版本并不会强制使用某一种 MPI,但 Intel MPI 配 Intel 编译器、OpenMPI 配 gfortran 是更不出错的组合,交叉使用偶尔能跑通,遇到问题排查起来却要double工作量。
3.3 把环境变量一次性配齐,后面少受罪
编译 CASTEP-19.11 的时候环境变量没有配好,最常见的现象是:cs_make能开始跑,但过一会儿就报cannot find -lfftw3或者libmpi_mpifh.so: cannot open shared object file。理论上数学库路径都写进cs_make的配置里就不会出问题,但你不可能每次都手动改 Makefile 里的几十行变量,所以你需要的是把这套环境固化到 shell 配置里。
# 以 bash 为例,把以下内容放到 ~/.bashrc 或 ~/.bash_profile export PATH=/opt/intel/oneapi/compiler/latest/linux/bin/intel64:/opt/intel/oneapi/mpi/latest/bin:$PATH source /opt/intel/oneapi/setvars.sh --force > /dev/null 2>&1 # FFTW 接口由 MKL 提供,无需再独立编译 FFTW export CASTEP_FFTW=1 export CASTEP_ARCH=linux_x86_64_ifort注意CASTEP_ARCH这个变量不是官方制定的必选设置,但它是很多编译脚本里用来识别平台和编译器组合的识别符,如果版本匹配会自动选择对应的预编译配置。实际使用中还是以你手里包内提供的 ARCH 选择为准,不要照抄这里。设置好后,新开一个 shell 确认echo $MKLROOT有输出,再进行下一步。
我再强调一遍:这一步的目的是把“已知好用的环境”固定下来,不是为了装样子。如果你跟别人共用一台服务器,这些变量应该写进你自己的工作目录下的环境脚本里,每次编译前source env.sh即可,别去动系统级的 profile,否则会给其他用户带去困扰。
4. 从 tar.gz 到 castep.mpi:编译配置与两个关键命令
4.1 使用命令行配置的两种方式:交互脚本与非交互参数
CASTEP-19.11 的构建方式有种“半自动”的感觉,它不像 cmake 那样有个统一的 CMakeLists.txt 入口,而是提供了一套基于 make 的构建流程。实际项目里,我通常用./install.sh交互式配置,但交互脚本有时候在后台服务器上跑会卡在等待输入的地方,或者某些终端环境下会把选项显示得乱七八糟,所以更推荐的方式是把参数一次性写在命令行里,即使某个参数不生效,也比卡住要好排查。
./install.sh --compiler ifort --mpi intelmpi --math mkl --arch linux_x86_64_ifort --prefix /your/local/install--compiler指定 Fortran 编译器,--mpi指定 MPI 实现,--math指定数学库,--prefix指定最终安装路径。这些参数的命名和可选值会因分发版本略有差异,但思路一致。如果你手里的包没有install.sh或者参数对不上,就去 Docs 里的构建文档里查对应的 make 目标名,通常在Src目录下直接执行make <target>也能完成编译,只是没有自动安装步骤。
配置过程本身并不保证万事大吉。参数识别是一回事,实际的编译错误又是另一回事。我见过最多的情况是--mpi intelmpi已经指定了,但 make 阶段依然用了 mpif90 去连接 MPI 程序,导致一堆 MPI 符号找不到。这时候你需要进入Src目录,找到生成的 Makefile,检查里面MPI_F90或者F90变量到底指向哪个路径,必要时手动修正后再编译。
4.2 编译命令与并行选项:cs_make 是入口
编译命令的核心是cs_make。这个名字在 CASTEP 语境里等同于“Castep make”,你用make直接编译也不是完全不行,但cs_make会额外处理一些依赖顺序和平台相关的配置,所以推荐入口是cs_make。
cd Src ./cs_make -j8-j8表示同时用 8 个进程编译,具体数值按机器 CPU 核数来定,一般取物理核心数或者稍低。注意这里不要用make -j的惯用思维直接把数字拉满,因为 CASTEP 编译过程中预处理和编译之间的文件依赖很长,并行进程太多会把 IO 拖爆,反而更慢。你可以边编译边看输出里有没有 with warnings 字样,这个阶段最常见的错误是把数学库路径设错,表现为cannot find -lfftw3这类信息。
如果cs_make中途失败,不要立刻重新运行一遍,先找到最后一屏的报错行。根据我维护计算服务器的经验,90% 的情况下是配置阶段埋下的问题——某个库路径不对,或者某个编译选项跟编译器版本不匹配。清掉之前编译产生的所有中间文件再重试是标准操作:
./cs_make distclean ./cs_make -j4distclean会删除所有之前生成的 .o 和 .mod 文件,给你一个干净的编译现场。重新编译时建议降一下并行数,便于观察错误输出来自哪一步。
4.3 二进制产物验证:拿到 castep.mpi 后先做静态确认
编译成功后的目录下会出现几个可执行文件,最核心的是castep.mpi,另外还有castep.serial在某些配置下也会生成。先用file命令确认二进制格式正确,再执行一个最简单的--help或者无参数运行,看它能不能打印版本信息:
file bin/castep.mpi bin/castep.mpi --help 2>&1 | head -n 20如果输出的是 ELF 格式信息,并且能看到 CASTEP 版本信息或者命令行参数列表,说明编译阶段已经通过了。这时候先不要高兴得太早,建议编一个包含三个原子的简单体系跑一次单点能计算,验证结果是否合理。CASTEP 的 Docs 目录里自带了一些 Examples,你可以选Examples/xi这类最基础的工作目录,直接复制过来运行。
cd Examples/xi cp ../InputFiles/xi.param . cp ../InputFiles/xi.cell . mpirun -np 2 ../../bin/castep.mpi xi如果能顺利跑完并且.castep文件里出现收敛信息,才可以认为这一步编译成功。第一次跑通后,把这个命令和运行目录记录下来,后面调优和部署都用得上。
5. 性能调优与边界:从跑通到省时的关键四步
5.1 先看 castep.mpi 的并行效率,再说调参
编译只是第一步,跑得快才是目的。19.11 版本的 CASTEP 支持混合并行,但默认情况下计算效率未必最优。当你在单机或集群上编译好之后,第一次实际运行任务时,重点观察castep输出文件里每一步计算时间的分布。大部分时间应该花在 FFT 和矩阵对角化上,如果某个环节的时间占比异常高,那通常说明某类参数需要调整。
常见做法是先用一个中小体系做并行测试。选取一个 10~30 原子的结构,分别用 1、2、4、8、16 个核跑一遍单点能,看加速比曲线。CASTEP 的并行是跨 k 点和 band 的,体系越大并行度越好;体系太小核数开多了,通信开销反而拖垮整体时间。我刚上手时犯过一个错:拿一个 8 原子的分子用 64 核跑,跑完比 8 核还慢一倍,纯粹是通信成本超过了计算收益。
# 典型并行测试命令 for np in 1 2 4 8 16; do mpirun -np $np ../../bin/castep.mpi Si16 grep -E "Total CPU time|Total wall time" Si16.castep done对比不同核数下的 wall time,如果从 8 核到 16 核加速比低于 1.5 倍,基本可以判断这个体系不适合开到 16 核,或者你在编译时没有启用 OpenMP 层的混合并行支持。
5.2 设置合理的 ENCUT 与 k 点,不要照抄默认值
CASTEP-19.11 有几个参数经常造成翻车,最常见的当属cut_off_energy。默认值有时偏小,结构优化或者计算能量学量时精度不够。对于一般金属体系,400 eV 起步是底线,氧化物或半导体体系通常要 500 eV 以上。收敛测试是判断cut_off_energy是否合适的最直接手段,但没有必要每个体系都从 200 eV 开始扫,合理的做法是先在 300、400、500、600 eV 各算一次单点能,看总能量变化是否已经进入你想要的误差范围内。
k 点密度同理。金属体系和小带隙半导体需要的 k 点密度通常很高,绝缘体则相对稀疏。CASTEP 里通过kpoint_mp_grid设置:
# xxx.cell 文件里设置 kpoint_mp_grid 8 8 8 kpoint_mp_offset 0.05 0.05 0.05kpoint_mp_grid是 3 个整数,表示在倒空间三个方向上生成多少分点。kpoint_mp_offset是 Monkhorst-Pack 网格的偏移量,大多数体系用默认的 0 0 0 就行,金属体系有时会需要加一点偏移来改善 Fermi 面附近的分辨率。不要小看这两行配置,很多论文里的结构优化结果不收敛,问题就出在这里。
5.3 合理控制空带数,别让 Dipp 算法滑向边缘
CASTEP-19.11 中,空带数由num_dump_cycles和nextra_bands参数间接控制。默认情况下 CASTEP 会根据体系自动分配一部分空带,但如果你计算的是宽带隙半导体、绝缘体,或者含有过渡金属/稀土元素的体系,默认空带数常常不够。空带数不足的后果是 SCF 循环极难收敛,或总能量出现非物理的缓慢漂移。
一个实用的尝试是逐步增加nextra_bands,比如从默认值增加到 10% 或 20% 的能带数,观察 SCF 收敛代数和最终能量变化。不要一次性给到 50% 以上,会白白拉长计算时间。输出电压致密度、介电函数这类需要较高空带数的性质时,nextra_bands的作用就很关键,可以直接决定结果是否可信。
5.4 固定好一批运行脚本,避免每次手工拼命令
集群环境中跑 CASTEP 通常要提交作业脚本,不要每次手动敲 mpirun。一个比较通用的作业脚本模板如下:
#!/bin/bash #$ -N ca_opt #$ -pe mpich 16 #$ -cwd source /your/env/path/env.sh mpirun -np $NSLOTS ../../bin/castep.mpi Si16脚本的作用是固定住环境变量、并行配置和输入文件路径。许多课题组里的初学者在相同节点上跑了很多次都失败,原因就是这次忘了 source 环境变量,那次 mpirun 参数写错,做法上是白费了许多时间。我把这套模板固化下来后,组里的学生基本上开箱即用。
6. 新手最容易掉的坑:19.11 编译运行中的排查清单
6.1 现象:编译报错compilation aborted for file xxxx.f90
- 原因:编译器版本过低,或预处理阶段宏定义冲突。CASTEP-19.11 在代码里使用了较新的 Fortran 特性,GCC 6.0 以下基本过不了预处理。
- 解决:首先确认编译器版本;如果是 gfortran,建议换一台有新版编译器的节点或者用 Intel 编译器;如果版本没问题,把报错文件路径和行号贴出来搜一下,大概率是某个宏需要关闭,例如
-DCOMMS_MPI之类的定义冲突。
6.2 现象:mpirun无法启动或一启动就崩
- 原因:MPI 库与编译器匹配不上。比如用 ifort 编译却用 OpenMPI 去跑,或者集群上不同节点 MPI 版本不一致。
- 解决:严格按编译时使用的 MPI 启动方式运行。Intel MPI 用
mpirun或mpiexec.hydra,OpenMPI 用的命令是mpirun,但是两者在进程管理上机制不同。最直接的检查办法是ldd castep.mpi | grep mpi,看清楚它到底链接的是哪个 MPI 库,再决定用什么命令拉起任务。
6.3 现象:SCF 循环一直收敛不了
- 原因:这个太多重可能。最常见的是
cut_off_energy太低,或者空带数不足,特别是磁性体系没有设置spin_polarized。 - 解决:先提高
cut_off_energy往 500 eV 附近靠,再把nextra_bands加到 10% 试一遍;如果体系带有强关联电子,检查+U设置是否生效。不要先急着去调mix_scheme这些电子步参数,那是在浪费调试时间。
6.4 现象:几何优化前几步很顺利,后几步能量震荡、跑飞
- 原因:原子坐标或者晶胞设置有问题,常见的是多个原子位置重叠;也有可能是最大步长设置太大,结构往不合理方向闯。
- 解决:先检查原始结构,用可视化软件重新观察原子间距;然后看看
.castep文件里的受力是否在合理范围。实在找不到原因,就把geom_max_step调小,比如设成 0.01 Å,然后再慢慢恢复。
6.5 现象:运行中途NaN或Inf出现
- 原因:不同体系的数值稳定性问题,通常是初始磁性状态或者波函数初猜不当,也有时候是 k 点网格设置与体系对称性不匹配。
- 解决:修改输入文件,加入初始磁性设置:
spin 3*2.0这类初始磁矩;如果是纯非磁体系,确保结构文件中没有多余的对称性重复原子,必要时降低kpoint_mp_grid到较低的网格先跑通,再逐渐加密。
7. 一台服务器上的日常技巧:CASTEP-19.11 的隐性设置与备用手段
编译完成、算例能跑,这只是迈过了门槛。日常维护中,还有几个细节值得养成习惯。第一个习惯是不要往系统路径里装 CASTEP,而是每个项目维护一个独立的运行目录,里面放一个env.sh和一组作业脚本。这样的好处是,别人在你这台机器上跑任务,或者你升级了编译器环境,不会因为路径冲突导致重建整个编译链。具体做法是把castep.mpi放在固定的安装目录,然后在每个项目目录下用一个符号链接指过去:
ln -s /your/install/bin/castep.mpi /project/jobs/castep.mpi第二个是学会利用--dryrun或者并行检查类命令去审查输入文件,而不是浪费节点资源去试错。某些情况下,一个明显错写的cell文件会直接在 SCF 第一步就爆炸,但如果你先用快速检查模式让它报出输入文件错误,就能省下大量排队时间。这个检查模式在不同分发版本中的名字不完全一样,有些版本里是castep.serial <seed> --check,有些是castep.mpi <seed> --check,具体以你编译出的二进制--help输出为准。
第三个习惯跟效率调优有关:CASTEP-19.11 带的O(N)算法在大型非周期性体系里很有价值,但默认运行并不一定开启。如果你的体系是上千原子的非晶结构或者大表面模型,且只关心基态能量和结构弛豫,可以尝试在cell文件里加入O(N)相关关键字。它的收敛性比常规方法敏感,但一旦收敛,计算成本明显低于平面波对角化方案。这部分是加分项,新手还是先把标准流程跑通。还有一个小技巧,是对计算结果做重复利用——把算好的波函数文件.castep_bin保留下来,后续需要接着算态密度、能带时,在参数文件里加上:
# xxx.param 文件里 continuation : default只要顺序变化不大,continuation可以沿续旧的波函数初猜,跳过重新 SCF 的成本。这招在长流程的几何优化和过渡态搜索里非常省时,但要注意体系也发生了剧烈变化时,沿用旧波函数反而会拖慢收敛,这时删掉.castep_bin重新从头算反而是最快的。
回到开始时的那个关键词:CASTEP-19.11.tar.gz不只是个文件名,它是你进入一套材料模拟工作流的入场券。编译它、跑通它、理解它,每个环节背后都对应着不同的计算思维习惯。希望这篇笔记能帮你在自己的服务器上少踩几个坑,早日跑出像样的数据。我自己的习惯是每次新拿到一个版本,先在一个独立目录里编译,再把默认配置记录下来,之后所有项目都从这份记录起步——这个习惯帮我省了不少时间,希望能帮到你。
本文还有配套的精品资源,点击获取