夜雨聆风学习资料网

ARTICLE · 1335693

PSI4 官方手册全译:从源码编译与安装——50 个问答讲透编译、依赖与测试

PSI4 官方手册全译:从源码编译与安装——50 个问答讲透编译、依赖与测试

往期回顾:

开源量子化学软件PSI4[1]:综述

开源量子化学软件PSI4[2]:Linux终端下使用 Anaconda 安装 PSI4

开源量子化学软件PSI4[3]:用一个例子讲解PSI4的输入文件

开源量子化学软件PSI4[4]:利用DFT计算孤立氢原子(H)的总能

开源量子化学软件PSI4[5]:利用DFT计算孤立质子(H+)的总能

开源量子化学软件PSI4[6]:利用DFT计算孤立氢负离子(H-)的总能

开源量子化学软件PSI4[7]:利用DFT优化氢气分子的结构

开源量子化学软件PSI4[8]:计算水分子分解为氧气和氢气的形成能

开源量子化学软件PSI4[9]:用振动频率分析给总能加上零点能校正

PSI4 官方手册全译:简介——能力、引用与支持

PSI4 官方手册全译:获取 PSI4——五条路径、安装命令与 GitHub 协作流程

写在前面

这是 PSI4 官方手册 Compiling and Installing from Source(从源码编译与安装)一页的完整中文翻译。它相当于每个 Linux 项目都该有的 INSTALL 文件:官方把「从源码把 PSI4 编出来」这件事拆成 50 个问答,覆盖 CMake 配置、核心与可选依赖、编译器、Python 接口、安装路径、运行环境、调试、CTest/Pytest 测试,以及插件、日志、写法规范等。

原文地址:

https://psicode.org/psi4manual/master/build_planning.html

先读官方提示:自 v1.8 起,主要的二进制分发渠道已从 psi4 频道迁到 conda-forge 频道,而本页面向用户的安装文档与面向开发者的编译文档尚未同步更新。若只是想把 PSI4 装好使用,请优先查阅 psi4/conda/psi4-path-advisor.py 或 psicode.org/installs/latest;本页主要面向打包者、系统管理员和需要自行编译的开发者。

翻译原则:叙述文字译为中文;命令、路径、环境变量名、CMake 变量、包名、版本号与所有 URL 一律逐字照录,不改动、不补写。代码块里以 # 开头的叙述性注释译成中文,命令本身、程序输出以及被注释掉的代码保持官方原样,可以直接复制使用。

读命令前先记住几个占位符:>>> 标记「这一行是要敲的命令」,实际输入时不要敲进去;{top-level-psi4-dir} 指 PSI4 源码顶层目录,{objdir} 指编译目录,{prefix} 指安装前缀,[your configuration options] 是你要自行填入的 cmake 参数。

正文里形如 [Libint 是什么?]、[Libint 最低版本] 的方括号文字,是官方手册的交叉引用链接文字,已译成中文;对应地址统一列在文末清单。各小节前的 Q1…Q50 编号是译者按原文顺序所加,便于定位,并非官方原有编号。

官方本页没有任何插图。文中三张中文整理图均由我们依据原文内容归纳绘制,已在图注中标明「示意」;封面亦为自制。官方手册会随版本更新,若命令、版本要求或表述与当前官网页面出现差异,一律以官方英文原文为准。

另有一处写法差异需要说明:官方在 Q46「如何在文字中称呼 Psi4」中建议写作 Psi4、不建议写成 PSI4;该节译文照录官方建议。本号历次译文与标题沿用 PSI4 写法,特此说明,避免读者误以为前后矛盾。

排版上的一处技术处理:官方原文部分代码块(如 CMakeLists.txt 片段、多行 cmake 命令)带有行首缩进。微信编辑器会把行首空格转成不间断空格,复制到终端后会让续行参数失效,因此这些缩进在排版时统一去掉;命令内容、参数与执行效果均未改变。

图 1 从源码编译安装 PSI4 的七个步骤(示意,据官方「详细版」第 1–7 步归纳)

图 2 本页 50 个问答的主题索引(示意,Q 编号由译者按原文顺序添加)

以下为官方原文 50 个小节的逐块译文,顺序与官方页面完全一致。

官方提示

自 v1.8 起,主要的二进制分发渠道已从 psi4 频道迁到 conda-forge 频道。面向用户的安装文档和面向开发者的编译文档都还没有更新,以反映这套新做法。最新指南请查阅 psi4/conda/psi4-path-advisor.py(完整的帮助菜单见 conda/psi4-path-advisor.py -h)或 psicode 下载页。

这一节承担了每个 Linux 项目都该有的 INSTALL 文件的职责:详细说明如何从源码构建。真正会读它的人不多(主要是打包者和系统管理员),因为它是一份面向「构建这个项目时的种种选择」的宽泛指南。要找一条具体、经过充分测试、并针对性能调优过的构建路径,请到 psicode.org/installs/latest(选「source」);要找同样经过测试与调优、且覆盖所有常见操作系统的预编译二进制包,请到 psicode.org/installs/latest(选「conda」);想看 Linux、Mac、Windows 上确实能跑通的构建配置,可参考官方的 GitHub Actions 构建工作流(原文链接为 ecosystem.yml)。

Q1 / 50

规划:如何配置 PSI4 并调用 CMake

PSI4 通过 CMake 构建。源码本身就带了一份简明的构建指南。

CMake 很擅长扫描你的电脑、定位编译所需的库、头文件和可执行文件。所以很可能你只需在源码顶层目录 top-level-psi4-dir 里执行 cmake -S. -Bobjdir,不带任何额外参数,它就会调用 cmake、探测出合适的默认值、配置好构建、创建编译目录 objdir 并结束,之后你只要在这个新目录里执行 make 或 Ninja 即可。

万一这套理想流程没能走通,或者默认构建选项不合你的意,可以借助「核心依赖」与「附加依赖」两节里的链接,规划一组贴合你这台机器的 cmake 参数,再接着看「精简版编译」或「详细版编译」。

Q2 / 50

精简版:如何编译并安装 PSI4

这一节勾勒出配置、编译、安装 PSI4 的主要步骤。更详细的说明见后文。

>>> cd {top-level-psi4-dir}>>> cmake -S. -Bobjdir [your configuration options]# 用 make(分两步)>>> cd objdir>>> make -j`getconf _NPROCESSORS_ONLN`>>> make install# 或者用通用写法(一步到位)>>> cmake --build objdir --target install -j`getconf _NPROCESSORS_ONLN`# 把 `which psi4` 与 `import psi4` 加入环境变量检查>>> eval $(stage/bin/psi4 --psiapi)

Q3 / 50

详细版:如何编译、测试并安装 PSI4

第 1 步 规划目录

拿到 PSI4 代码库,并进入源码顶层目录,以下记为 top-level-psi4-dir。

· 如何获取 PSI4:从「选代码小测验」开始,最终得到 {top-level-psi4-dir}

>>> cd {top-level-psi4-dir}

选定一个编译目录,以下记为 objdir。

· 如何选择编译目录 {objdir}?

选定一个安装目录,以下记为 prefix。

· 如何把 PSI4 装到 /usr/local/psi4 以外的地方?

第 2 步 规划配置

检查必需与可选的软件要求,确认目标机器上已装好所有必要的依赖。

· 编译 PSI4 必需的工具有哪些?依赖有哪些?

· PSI4 的附加组件(Add-On)能力有哪些?各自依赖什么?

准备好任何必要或想要的 cmake 配置选项,以下记为 [your configuration options]。

· 如何查看有哪些构建配置选项?

· 规划:如何配置 PSI4 并调用 CMake

第 3 步 配置

按前面规划好的选项与目录运行 CMake,如下所示。它会扫描这台机器,报告哪些软件找到了、哪些没找到;成功后即创建出可供编译的 objdir 目录。

>>> cmake -S. -B{objdir} -DCMAKE_INSTALL_PREFIX={prefix} [your configuration options]

第 4 步 编译

编译代码(可选的 -j 会启用并行编译)。

>>> cd {objdir}>>> cmake --build . -j`getconf _NPROCESSORS_ONLN`>>> eval $(stage/bin/psi4 --psiapi)

第 5 步 测试

可选地用 CTest 和 Pytest 测试这次构建。

· 如何跑一分钟量级的测试?

· 如何运行部分测试?

· 如何查看 CTest 的测试错误?

· 如何测试一个已安装的 PSI4?

>>> ctest -j`getconf _NPROCESSORS_ONLN`>>> make pytest

第 6 步 安装

如果测试通过,就安装代码。

>>> cmake --install .

第 7 步 配置运行环境

安装之后要运行 PSI4,还需要配置几个变量:

· 编译后如何以可执行文件方式运行 PSI4?

· 编译后如何以 Python 模块方式运行 PSI4?

Q4 / 50

编译 PSI4 必需的工具有哪些?依赖有哪些?

PSI4 的核心构建需要下面这些软件。注意:几乎全部(包括 Python、CMake、NumPy、BLAS/LAPACK、Libint,甚至 Linux 和 Mac 上的 C++ 编译器)都可以通过 conda 解决。下面各处链接给出了如何为 PSI4 配置该软件的示例,以及与之相关的说明与警告。

结构化的依赖清单及其历史,另见 psi4/codedeps.yaml。

· C++ 与 C 编译器(须符合 C++20)

· 经过优化的 BLAS 与 LAPACK 库(最好不要用标准 Linux 发行版自带的那个)

· Python 解释器与头文件(3.8+)https://www.python.org/

· CMake(3.15+)https://cmake.org/download/

· NumPy(运行时与编译时都需要)https://numpy.org/

· 系统工具:GNU make 与 GNU install,或 Ninja;以及 POSIX 线程(Pthreads)库

下面这些同样是 PSI4 必需的,但如果没检测到,构建系统会自行下载并编译。

· gau2grid — [gau2grid 是什么?] [gau2grid 最低版本]

· Libint — [Libint 是什么?] [Libint 最低版本](自 2020 年 11 月起为 Libint2;v1.4 起加入)

– Eigen https://eigen.tuxfamily.org/index.php?title=Main_Page

– Boost https://www.boost.org/ 纯头文件的预处理器库

· Libxc — [Libxc 是什么?] [Libxc 最低版本]

· pybind11 — [Pybind11 是什么?] [Pybind11 最低版本]

· QCElemental — [QCElemental 是什么?]

· QCEngine — [QCEngine 是什么?](2019 年 3 月;v1.4 起加入)

· optking — [optking 是什么?](运行时依赖,编译时也必需)

此外还有仅在运行时需要的依赖:

· msgpack-python for MessagePack https://msgpack.org/(QCElemental 的传递依赖;对 QCElemental 是可选的,对 PSI4 则是必需的)

· NumPy https://numpy.org/

· networkx https://github.com/networkx/networkx(QCElemental 的传递依赖;对 QCElemental 可选,对 PSI4 必需)

· pint https://pint.readthedocs.io/en/latest/(QCElemental 的传递依赖)

· pydantic https://pydantic-docs.helpmanual.io/#(QCElemental 的传递依赖)

· SciPy https://scipy.org/(确有需要时,可按运行时报错里的提示规避)

· py-cpuinfo(提供 import cpuinfo)https://github.com/workhorsy/py-cpuinfo(QCEngine 的传递依赖)

· psutil https://github.com/giampaolo/psutil(QCEngine 的传递依赖)

已移除的依赖:

· Boost(2016 年 9 月;v1.1 起移除)

· deepdiff https://github.com/seperman/deepdiff(2019 年 5 月;v1.4 起移除)

· MPFR https://www.mpfr.org/(2022 年 3 月;v1.6 起移除)编译 Libint2 时不再需要它

· 用于测试的 Perl(2022 年 4 月;v1.6 起移除)

Q5 / 50

PSI4 的附加组件(Add-On)能力有哪些?各自依赖什么?

下面每一项都是可以与 PSI4 一同构建的、彼此独立的可选能力;其下的子项是该附加组件各自额外的依赖。挑出你想要的(也可以一个都不要),再顺着链接查看启用它时应给 cmake 加什么参数。注意:其中很多都能从 conda 拿到预编译版本。

· PSI4 测试

– CTest https://cmake.org/download/

– pytest(用于测试已安装的 PSI4)http://doc.pytest.org/en/latest/

– pytest-xdist(用于一次并行跑很多已安装测试)https://github.com/pytest-dev/pytest-xdist

· PSI4 文档(预编译版见 psicode.org/psi4manual/master/index.html)

– Sphinx(3.5+)http://sphinx-doc.org

– Perl(部分自动文档生成脚本需要)https://www.perl.org/

– nbsphinx(用于转换 Jupyter notebook)http://nbsphinx.readthedocs.io/en/jupyter-theme/

– sphinx-psi-theme https://github.com/psi4/sphinx-psi-theme

– 获取文档依赖的建议,参见 [CMake 输出里的 message 行] 或 [conda 环境规格文件]

– 完整的文档构建流程可参照 psi4/.github/workflows/docs.yml

· Ambit — https://github.com/jturney/ambit

· CheMPS2 — [CheMPS2 是什么?] [CheMPS2 最低版本]

– HDF5 https://support.hdfgroup.org/HDF5/

– zlib http://www.zlib.net/

· ecpint — [ecpint 是什么?] [ecpint 最低版本]

· dkh — [dkh 是什么?] [dkh 最低版本]

– Fortran 编译器

· gdma — [gdma 是什么?] [gdma 最低版本]

– Fortran 编译器

· PCMSolver — [PCMSolver 是什么?]

– Fortran 编译器

– zlib http://www.zlib.net/

· simint — [simint 是什么?] [simint 最低版本]

· OpenOrbitalOptimizer — [OpenOrbitalOptimizer 是什么?](2025 年 8 月;v1.10 起加入)

此外还有运行时才加载的能力:

· PylibEFP & libefp — [LibEFP 是什么?] [LibEFP 最低版本]

· cfour — [CFOUR 是什么?]

· dftd3 — [DFTD3 是什么?](2025 年 6 月;v1.10 起移除)

· simple-dftd3 — [DFTD3 是什么?](2022 年 11 月;v1.7 起加入)dftd3 的推荐替代品 https://github.com/dftd3/simple-dftd3

· gcp — [gCP 是什么?](2025 年 6 月;v1.10 起移除)

· mctc-gcp — [gCP 是什么?](2022 年 11 月;v1.7 起加入)gcp 的推荐替代品 https://github.com/grimme-lab/gcp

· dftd4 — https://github.com/dftd4/dftd4

· mrcc — [MPCC 是什么?]

· v2rdm_casscf — [v2rdm_casscf 是什么?]

· sns-mp2 — https://github.com/DEShawResearch/sns-mp2/commits/master

· resp — https://github.com/cdsgroup/resp

· gpu_dfcc — https://github.com/edeprince3/gpu_dfcc/commits/master

· OpenFermion-Psi4 — https://github.com/quantumlib/OpenFermion

· cppe — https://github.com/maxscheurer/cppe

· mp2d — https://github.com/Chandemonium/MP2D

· FockCI — https://github.com/shannonhouck/psi4fockci

· cct3 — https://github.com/piecuch-group/cct3

· adcc — https://github.com/adc-connect/adcc

· BrianQC — https://www.brianqc.com/

· i-PI — http://ipi-code.org/

· psixas — https://github.com/Masterluke87/psixas

· MDI — https://github.com/MolSSI-MDI/MDI_Library

· ddx — https://github.com/ddsolvation/ddx

· QCManyBody — [QCManyBody 是什么?](2026 年 7 月起在 v1.12 中变为可选;2025 年 8 月 v1.10 加入时为必需;属运行时依赖,编译时可选)

图 3 编译 PSI4 的依赖分层(示意,据官方「必需工具」「附加组件」两节归纳)

Q6 / 50

如何用 conda 搭一套 PSI4 开发环境?

PSI4 的依赖很多,其中一些编译起来相当麻烦。好在 conda 能把它们全部备齐。有一个名为 psi4-dev 的 conda 包,专门用来凑齐从源码编译 PSI4 所需的依赖与构建工具。到 psicode.org/installs/latest,选「source」和「nightly build」,再选好 Linux/Mac 与 Python 版本,按页面说明创建一个带有 psi4-path-advisor 脚本的 conda 环境。运行 psi4-path-advisor --help 可以看到更多选项;不带参数直接运行该脚本,会给出一条 cmake 命令,把各个依赖 conda 包的路径写进 CMake 的缓存。执行时你还可以在这条命令后面追加更多 cmake 选项。等这条 cmake 命令把 objdir 建好,就可以编译 PSI4 了。切记:运行或开发 PSI4 期间都要激活这个 conda 环境。psi4-path-advisor 还有几个额外选项,可用于改用 conda 的 GNU 编译器(Linux)、conda 的 Clang 编译器(Mac,可靠性略低),或由 conda 的 GNU 编译器打底的你自己的 Intel 编译器(Linux)。

>>> git clone https://github.com/psi4/psi4.git && cd psi4>>> conda create -n p4dev psi4-dev python=3.8 -c psi4/label/dev>>> conda activate p4dev>>> `psi4-path-advisor --gcc`>>> cd objdir && make -j`getconf _NPROCESSORS_ONLN`

Q7 / 50

如何配置代码以使用高角动量基组?

Libint 积分代码能处理任意阶的角动量(AM),但把那样一份代码编译出来的代价高得不可接受。Libint2 的构建过程比 Libint1 更耗时,因此推荐使用 conda 包。控制角动量的关键字 MAX_AM_ERI,其定义相比 Libint1 略有变化:它用来保证常规能量计算至少能用上 MAX_AM_ERI zeta。关于角动量能力的更完整讨论,见 psi4//external/upstream/libint2/CMakeLists.txt。除非把 BUILD_Libint2_GENERATOR 设为 ON,否则内部构建 Libint2 时会下载一份至少达到 MAX_AM_ERI 角动量的预生成压缩包。如果你想完全从生成器源码构建,就打开这个关键字,但其中一部分只能串行运行、另一部分又受益于并行,所以并不推荐这样做。所有角动量生成设置都得改在上面那份 CMakeLists.txt 里,而不是直接传给 PSI4 的构建。

· 用更高角动量构建

>>> cmake -DMAX_AM_ERI=6

· 相关的 CMake 选项:

MAX_AM_ERI=N # libint 积分及其导数积分的最大角动量层级(1=p,2=d,3=f,依此类推)。# 取值 N 意味着一阶导数最高到 N-1、二阶导数最高到 N-2;# 因此以氖原子为例,默认值 5 可支持:常规 cc-pV5Z 能量、cc-pVQZ 梯度、# cc-pVTZ 频率,以及密度拟合 cc-pVQZ 能量、cc-pVTZ 梯度、cc-pVDZ 频率。[默认值:5]

注意:自 PSI4 1.1 起,可以单独构建 Libint(或只安装 libint conda 包),再让任意/全部 PSI4 构建在编译时检测到这份安装。

要把一份已完成的构建切换到更大的 Libint:进入 <objdir>,删除 make install 的产物(若曾执行过)、删除 external/upstream/libint/;如果先前的 Libint 是内部构建的(而非检测到外部安装),还要删除 stage/include/libint/、stage/share/cmake/Libint/、stage/lib/libint2.so.2。然后改 CMakeCache.txt 里的 MAX_AM_ERI 值,重新执行 make,并检查 CMake 输出里 Found Libint 旁边的数字。

注意:同一个关键字 MAX_AM_ERI 同时控制 Libint 和 simint。simint 无法编译高于 AM7 的情形,所以要得到 AM>=8 的 Libint 内部构建,就得关掉 simint。这个关键字只是检测时的下界,因此你可以把它设为 7、同时启用 Libint 与 simint,再让 CMake 指向一份预构建的 Libint AM8,完全没问题。

· 如何为构建 PSI4 配置 Libint?

Q8 / 50

如何从 conda 获取高角动量积分?

Libint2 的 conda 包覆盖 Linux、Mac 和 Windows。

Linux 包的基础 MAX_AM_ERI=7,可跑 7z 的常规能量与梯度、6z 的密度拟合能量与梯度,以及 qz 的 Hessian(常规与密度拟合皆可)。

Mac 与 Windows 包的基础 MAX_AM_ERI=5,可跑 5z 能量、qz 梯度与 tz Hessian(常规与密度拟合皆可)。

角动量设置的细节,见 psi4/external/upstream/libint2/CMakeLists.txt。

Q9 / 50

如何查看有哪些构建配置选项?

CMake 并没有为此提供一份汇总(除非你想试试 CMake GUI,而开发者从没用过它)。不过主 CMakeLists.txt 的上半部分算是一份凑合的汇总:

cmake_policy(SET CMP0167 OLD)endif ()if (POLICY CMP0190)cmake_policy(SET CMP0190 OLD)endif()# 3.15:可用的 FindPython,含 NumPy 组件与 LOCATION# 3.8:CXX_STANDARD 开始识别 C++17# 3.3:EP_add(DEPENDS interfacelib, CheckFortranCompilerFlag# 3.2:continue()# 3.1:CMAKE_CXX_STANDARD, BUILD_ALWAYSset(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build.") # 规避 Windows 上 Ninja 默认 Debug 的问题project(psi4LANGUAGES C CXX)set(psi4_URL "http://www.psicode.org/")set(psi4_EMAIL "psi4aiqc+cmake@gmail.com")set(psi4_LICENSE "GNU Lesser General Public License, version 3 (LGPL-3.0)")set(psi4_DESCRIPTION "Open-Source Quantum Chemistry")list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)message(STATUS "Building using CMake ${CMAKE_VERSION} Generator ${CMAKE_GENERATOR}")################ 选项:总览及未另列的部分 ################ <<< CMake 构建流程总览 >>>## 注:另见 `conda/psi4-path-advisor.py --help` 了解详细步骤## >>> ls# external/ COPYING psi4/ tests/ ...# >>> cmake -S. -Bobjdir -DCMAKE_INSTALL_PREFIX=/path/to/install-psi4 ...# ...# -- Generating done# -- Build files have been written to: /current/dir/objdir# >>> cmake --build objdir --target install -j`getconf _NPROCESSORS_ONLN`# >>> eval $(objdir/stage/bin/psi4 --psiapi)# <<< PSI4 无法自行构建的必需依赖;另见 codedeps.yaml >>>## - CMake(例如 `conda install cmake`)# - C++ 与 C 编译器(须符合 C++20)# - BLAS/LAPACK(也是运行时依赖;例如 `conda install mkl-devel`)# - Python(也是运行时依赖;需要解释器与头文件;例如 `conda install python`)# - NumPy(也是运行时依赖;若 gau2grid 已预构建,编译时可省;例如 `conda install numpy`)# - networkx >=2.4(仅运行时;例如 `conda install networkx`)# - pint >=0.10(仅运行时;例如 `conda install pint -c conda-forge`)# - pydantic >=1.0(仅运行时;例如 `conda install pydantic -c conda-forge`)# - msgpack-python(仅运行时;例如 `conda install msgpack-python`)# - Eigen(供 Libint2 使用;例如 `conda install eigen`)# - Boost(Libint2 需要的纯头文件库;例如 `conda install libboost-headers`)# - SciPy(仅运行时;可通过关键字设置规避;例如 `conda install scipy`)# - py-cpuinfo(仅运行时;例如 `conda install py-cpuinfo`)# - psutil(仅运行时;例如 `conda install psutil`)# - setuptools(仅编译时,除非 optking 等已预构建;例如 `conda install setuptools`)# 下面三个「### Options ###」小节列出了配置构建时有用的 CMake 变量。# <<< 编译器与编译选项 >>>## - CMAKE_C_COMPILER "C 编译器"# - CMAKE_C_FLAGS "附加的 C 编译选项"# - CMAKE_CXX_COMPILER "C++ 编译器"# - CMAKE_CXX_FLAGS "附加的 C++ 编译选项(可用按配置分类的变量如 CMAKE_CXX_FLAGS_DEBUG 覆盖,例如 -O3)"# - CMAKE_Fortran_COMPILER "Fortran 编译器(部分插件需要)"# - CMAKE_Fortran_FLAGS "附加的 Fortran 编译选项"# - CMAKE_SHARED_LINKER_FLAGS "core.so/dll 库的附加链接选项"# <<< 检测依赖与插件 >>>## - Python_EXECUTABLE "要使用的 Python 解释器(例如 /path/to/bin/python3.13)"# - Python_LIBRARY "与该解释器配套的 Python 库(例如 /path/to/lib/libpython3.13.so)"# - Python_INCLUDE_DIR "Python 头文件所在目录(例如 /path/to/include/python3.13)"# - SPHINX_ROOT "Sphinx 的根目录:该目录下应有 'bin/sphinx-build'(或类似文件)"## 对以下任一 ${AddOn}:ambit、CheMPS2、dkh、ecpint、libefp、Einsums、gau2grid、gauxc、gdma、# IntegratorXX, Libint2, OpenOrbitalOptimizer, optking, PCMSolver, pybind11,# pylibefp, qcelemental, qcengine, simint, Libxc, qcmanybody, cint# - CMAKE_PREFIX_PATH "设为若干根目录的列表,用于查找外部构建的插件与依赖# (例如 /path/to/install-libint;/path/to/install-gdma,其中存在 /path/to/install-libint/lib/libderiv.a)"# - ${AddOn}_DIR "设为包含 ${AddOn}Config.cmake 的目录,便于检测外部构建"# - CMAKE_DISABLE_FIND_PACKAGE_${AddOn} "设为 ON 以强制内部构建"# - CMAKE_INSIST_FIND_PACKAGE_${AddOn} "设为 ON 以强制检测外部版本"# <<< 检测 BLAS/LAPACK >>>## - ENV(MATH_ROOT) "检测 BLAS/LAPACK 库的根目录(例如 ${MATH_ROOT}/lib/libblas.so)"# - BLAS_TYPE "数学库检测的目标 BLAS 发行版# (默认搜索顺序:Linux 上 MKL>FLEXIBLAS>OPENBLAS>ESSL>ATLAS>ACML>SYSTEM_NATIVE;Mac 上 MKL>Accelerate>...)"# - LAPACK_TYPE "数学库检测的目标 LAPACK 发行版# (默认搜索顺序:Linux 上 MKL>FLEXIBLAS>OPENBLAS>ESSL>ATLAS>ACML>SYSTEM_NATIVE;Mac 上 MKL>Accelerate>...)"# - LAPACK_LIBRARIES "BLAS/LAPACK 库的位置,以 ';' 分隔的完整路径列表,绕过数学库检测"# - LAPACK_INCLUDE_DIRS "BLAS/LAPACK 头文件的位置(仅 MKL 需要),绕过数学库检测"# - OpenMP_LIBRARY_DIRS "OpenMP 库(iomp5/gomp/omp)的位置,以 ';' 分隔的列表,用于提示 OpenMP 检测"# <<< 安装 >>>## - CMAKE_INSTALL_PREFIX "Psi4 及内部构建的插件安装到何处(默认:/usr/local/psi4)"# - CMAKE_INSTALL_BINDIR "可执行文件安装在 CMAKE_INSTALL_PREFIX 下的哪个位置(默认:bin)"# - CMAKE_INSTALL_LIBDIR "库安装在 CMAKE_INSTALL_PREFIX 下的哪个位置(默认:lib)"# - CMAKE_INSTALL_DATADIR "资源文件安装在 CMAKE_INSTALL_PREFIX 下的哪个位置(默认:share)"# - CMAKE_INSTALL_INCLUDEDIR "头文件安装在 CMAKE_INSTALL_PREFIX 下的哪个位置(默认:include)"# - PYMOD_INSTALL_LIBDIR "Python 模块安装在 CMAKE_INSTALL_LIBDIR 下的哪个位置(默认:/)# 必须以 / 开头。用于模拟 Python 的安装路径:/python3.6/site-packages。"############################ 选项:要构建哪些功能? ############################option(ENABLE_ambit "Enables the ambit tensor library" OFF)option(ENABLE_bse "Enables the basis_set_exchange for requesting basis sets (requires jsonschema, regex; can also be added at runtime)" OFF)option(ENABLE_CheMPS2 "Enables CheMPS2 for DMRG (requires HDF5)" OFF)option(ENABLE_cppe "Enables CPPE for Polarizable Embedding" OFF)option(ENABLE_adcc "Enables adcc for algebraic-diagrammatic construction methods (requires libtensorlight; can also be added at runtime)" OFF)option(ENABLE_ddx "Enables ddx for domain-decomposition contiuum solvation models (requires Fortran; can also be added at runtime)" OFF)option(ENABLE_dkh "Enables DKH integrals (requires Fortran)" OFF)option(ENABLE_ecpint "Enables libecpint for effective core potentials (ECP)" OFF)option(ENABLE_libefp "Enables LIBEFP and PylibEFP for fragments" OFF)option(ENABLE_Einsums "Enables the Einsums tensor library" OFF)option(ENABLE_simint "Enables use of SIMINT two-electron integral library" OFF)option(ENABLE_cint "Enables use of the libcint two-electron integral library (experimental). Can also detect a qcint" OFF)option(ENABLE_gauxc "Enables use of GauXC density functional library" OFF)option(ENABLE_gdma "Enables Stone's GDMA multipole code (requires Fortran; can also be added at runtime)" OFF)option(ENABLE_IntegratorXX "Enables use of IntegratorXX density functional grids library" OFF)option(ENABLE_OpenOrbitalOptimizer "Enables the OpenOrbitalOptimizer library (requires Armadillo)" OFF)option(ENABLE_PCMSolver "Enables PCMSolver library (requires Fortran)" OFF)option(ENABLE_qcmanybody "Enables qcmanybody for n-body/BSSE workflows (can also be added at runtime)" OFF)option(ENABLE_snsmp2 "Enables SNSMP2 plugin (can also be added at runtime)" OFF)option(ENABLE_v2rdm_casscf "Enables V2RDM_CASSCF plugin (requires Fortran; can also be added at runtime)" OFF)option(ENABLE_psi4fockci "Enables Psi4FockCI plugin (can also be added at runtime)" OFF)option(ENABLE_cct3 "Enables cct3 plugin (requires Fortran; can also be added at runtime)" OFF)

注意:各个外部项目还会有自己的一套构建配置选项。上面只提到了其中最常用、面向用户的那些旋钮。

Q10 / 50

如何安装到 /usr/local/psi4 以外的位置?

安装目录指的是可执行文件脚本、Python 模块、基组数据以及其他管理性文件在文件系统里的位置。除非用可重定位的 conda 包,否则必须在编译前用 CMake 变量 CMAKE_INSTALL_PREFIX 指定安装目录。

· 指定安装目录构建

cmake -DCMAKE_INSTALL_PREFIX=/nfs/common/software/psi4

· 相关的 CMake 选项:

CMAKE_INSTALL_PREFIX=PATH # Psi4 及内部构建的# 插件安装到此处(默认:/usr/local/psi4)

提示

这一点并不保证成立,但万一你临时需要把一份已编译好的 PSI4 装到 CMAKE_INSTALL_PREFIX 未配置的位置,可以递归地把 objdir/stage/prefix 下的各文件夹复制到目标位置,按需 chown,按需修改 bin/psi4 里的 shebang 行,再递归删掉所有「.pyc」文件。说不定就能直接跑起来。

Q11 / 50

如何以调试模式编译?

在编译前用 CMake 变量 CMAKE_BUILD_TYPE 即可统一为整个项目和插件关掉优化、打开调试。注意:这些选项不会传递给那些被检测为「已预构建」而非本次构建的附加组件。

· 不做优化地构建

cmake -DCMAKE_BUILD_TYPE=debugset the CMake build type [default: release]

· 相关的 CMake 选项:

CMAKE_BUILD_TYPE=[debug|release] # 构建类型(Release 或 Debug)" [默认值:release]

Q12 / 50

如何选择编译目录 {objdir}?

· 没有默认值。

· 常见选择是在 top-level-psi4-dir 下用 objdir 或 build。

– cd {top-level-psi4-dir} && cmake -S. -Bobjdir

– cd {top-level-psi4-dir} && cmake -S. -Bbuild

· 不允许源码内构建(*.cc 与 *.o 落在同一目录)。

· 允许把编译目录放在 top-level-psi4-dir 之外。

Q13 / 50

如何保存配置,供以后编译复用?

建一个像 do-configure 这样的文件,把 cmake 命令和选项写在同一行。

>>> cd {top-level-psi4-dir}>>> cat do-configurecmake -S. -B{objdir} \-DCMAKE_INSTALL_PATH="/Users/me/psi4" \-DCMAKE_PREFIX_PATH="/Users/me/externals/install-libint" \-DMAX_AM_ERI=6 \-DENABLE_gdma=ON \-DBUILD_SHARED_LIBS=ON>>> chmod u+x do-configure>>> ./do-configure

Q14 / 50

已安装或暂存的 PSI4,目录结构是怎样的?

编译之后(cd objdir && make),objdir/stage 下会出现类似下面的目录结构。它可以像一份完整安装那样被测试和使用。

安装之后(cd objdir && make && make install),/prefix 下会出现类似下面的目录结构。这是一份完整安装。

/bin/ (executables for psi4 + any external proj)bin/psi4 (psi4 executable, actually just a py script)include/ (installed headers for psi4 + any external proj)include/psi4/ (header files for #include-ing)include/psi4/psi4-dec.h (primary psi4 header)include/psi4/masses.h (a project-wide psi4 header)include/psi4/libmints/ (psi4 library headers)include/psi4/libfock/ (ditto)share/ (read-only arch-indep files for psi4 + any external proj)share/cmake/psi4/ (files for detecting installed targets)share/cmake/psi4/psi4Config.cmake (psi4 build/install info)share/cmake/psi4/psi4ConfigVersion.cmake (psi4 cmake version info)share/doc/psi4/html/ (sphinx html documentation)share/psi4/ (text files needed by psi4)share/psi4/basis (basis sets)share/psi4/plugins (plugin template files)share/psi4/fsapt (fsapt scripts)share/psi4/samples/ (sample input files)lib/ (shared libraries and py modules for psi4 + any external proj)# 普通安装lib/psi4/ (object files)lib/psi4/driver/ (py-side, uncompiled)lib/psi4/header.py (prints file header)lib/psi4/metadata.py (psi4 version info)lib/psi4/__init__.py (module marker/loader for psi4.core)lib/psi4/core.cpython-*.so (c-side, compiled and bound by pybind11)# conda 安装lib/pythonX.X/site-packages/psi4/

下面这些环境变量指向上述目录结构里的某些位置。通常不需要设置,或只需设很少几个;详见:运行已编译的可执行文件、运行已编译的 Python 模块、运行 conda 二进制包。

· PATH 指向 bin

· PYTHONPATH 指向 lib(普通安装)或 lib/pythonX.X/site-packages(conda 安装)

· PSIDATADIR 指向 share/psi4

Q15 / 50

编译后如何以可执行文件方式运行 PSI4?

把完整的安装目录 prefix 和合适的 scratch 目录代入下面的命令,直接在终端执行,或写进你的「rc」文件后重开一个终端。(若要用暂存安装目录,把 prefix 换成 objdir/stage。)

# csh、tcsh:写入 shell 或 ~/.tcshrc 文件setenv PATH {prefix}/bin:$PATHsetenv PSI_SCRATCH /path/to/existing/writable/local-not-network/directory/for/scratch/files
# sh、bash:写入 shell 或 ~/.bashrc(Linux/Windows)、~/.bash_profile(Mac)文件export PATH={prefix}/bin:$PATHexport PSI_SCRATCH=/path/to/existing/writable/local-not-network/directory/for/scratch/files

运行 PSI4。

>>> cat sample.inmolecule {He}energy('hf/cc-pvdz')compare_values(-2.85518839, variable('current energy'), 5, 'SCF E')>>> psi4 sample.inSCF E.............................................................PASSED

Q16 / 50

如何解决 ModuleNotFoundError: No module named psi4?

你是在 PsiAPI 模式下使用 PSI4(python input.py,其中 input.py 含 import psi4),但 Python 解释器找不到 PSI4 的 Python 模块。请按「如何为 PsiAPI 配置路径」一节的说明操作。

Q17 / 50

如何为 PsiAPI 配置路径?

如果你已知 Psithon 模式下 PSI4 可执行文件(bin/psi4)的位置,想知道 PsiAPI 模式下该把哪个位置加进 PYTHONPATH,执行 psi4 --psiapi 即可。它会返回若干 bash 命令,把 PATH(指向正确的 Python 解释器)和 PYTHONPATH(用于找到 psi4 模块)设好,之后 import psi4 就能成功。

>>> psi4 --psiapi-pathexport PATH=/path/to/dir/of/python/interpreter/against/which/psi4/compiled:$PATHexport PYTHONPATH=/path/to/dir/of/psi4/core-dot-so:$PYTHONPATH>>> export PATH=/path/to/dir/of/python/interpreter/against/which/psi4/compiled:$PATH>>> export PYTHONPATH=/path/to/dir/of/psi4/core-dot-so:$PYTHONPATH>>> python -c "import psi4">>> python -c "import psi4;print(psi4.__file__, psi4.__version__)"

Q18 / 50

编译后如何以 Python 模块方式运行 PSI4?

把完整的安装目录 prefix 和合适的 scratch 目录代入下面的命令,直接在终端执行,或写进你的「rc」文件后重开一个终端。(若要用暂存安装目录,把 prefix 换成 objdir/stage。)

# csh、tcsh:写入 shell 或 ~/.tcshrc 文件setenv PYTHONPATH {prefix}/lib:$PYTHONPATHsetenv PSI_SCRATCH /path/to/existing/writable/local-not-network/directory/for/scratch/files
# sh、bash:写入 shell 或 ~/.bashrc(Linux/Windows)、~/.bash_profile(Mac)文件export PYTHONPATH={prefix}/lib:$PYTHONPATHexport PSI_SCRATCH=/path/to/existing/writable/local-not-network/directory/for/scratch/files

· 如何为 PsiAPI 配置路径?

运行 PSI4。

>>> cat sample.pyimport psi4mol = psi4.geometry("""He""")psi4.energy('hf/cc-pvdz')psi4.compare_values(-2.85518839, psi4.core.variable('current energy'), 5, 'SCF E')>>> python sample.pySCF E.............................................................PASSED

Q19 / 50

conda 安装后,如何以可执行文件或 Python 模块方式运行 PSI4?

下面的配置命令,是把 PSI4 装进 Anaconda、Miniconda 或 Psi4conda 发行版时屏幕上打印的建议的通用版本,记 condadist = ana|mini|psi4conda。初次安装之后想再看这条消息,可在激活该 conda 环境的情况下运行 .psi4-post-link.sh。若 which conda python psi4 都指向你的 condadist,且 echo $PSI_SCRATCH 已设置,可直接跳到下面的「Run PSI4」命令;否则就在终端执行下面的命令,或写进「rc」文件后重开一个终端。

如果你装的是 Psi4conda 发行版,或把 PSI4 conda 包按提示装进了 Anaconda/Miniconda 的主环境并加入了 PATH,那么 which psi4 多半会给出 condadist/bin/psi4,下面设置 PATH 的几行就是多余的。

如果你装进了名为 p4env 的 conda 环境并执行过 conda activate p4env,那么 which psi4 多半会给出 condadist/envs/p4env/bin/psi4,下面设置 PATH 的几行同样多余。

# csh、tcsh:写入 shell 或 ~/.tcshrc 文件unsetenv PSIDATADIRsetenv PATH {prefix}/bin:$PATHsetenv PSI_SCRATCH /path/to/existing/writable/local-not-network/directory/for/scratch/files
# sh、bash:写入 shell 或 ~/.bashrc(Linux/Windows)、~/.bash_profile(Mac)文件unset PSIDATADIRexport PATH={prefix}/bin:$PATHexport PSI_SCRATCH=/path/to/existing/writable/local-not-network/directory/for/scratch/files

以可执行文件方式运行 PSI4。

>>> cat sample.inmolecule {He}energy('hf/cc-pvdz')compare_values(-2.85518839, variable('current energy'), 5, 'SCF E')>>> psi4 sample.inSCF E.............................................................PASSED

或者以 Python 模块方式运行 PSI4。

>>> cat sample.pyimport psi4mol = psi4.geometry("""He""")psi4.energy('hf/cc-pvdz')psi4.compare_values(-2.85518839, psi4.core.variable('current energy'), 5, 'SCF E')>>> python sample.pySCF E.............................................................PASSED

Q20 / 50

编译后如何使用源码里的 driver 以可执行文件方式运行 PSI4?

开发 Python driver 代码时,每改一点就得反复 make 才能测试,很烦人。按下面的流程可以让 PSI4「就地(inplace)」运行。说清楚一点:这是用编译目录里已编译的 C++,配上源码目录里的 python。这是面向开发者的高级选项,并非所有功能都可用。

>>> cd {objdir}>>> ln -s {top-level-psi4-dir}/{objdir}/stage/lib/psi4/core.cpython-{ext_will_vary}.so ../psi4/core.cpython-{ext_will_vary}.so>>> python ../psi4/run_psi4.py --inplace input.dat

Q21 / 50

为什么不要设置 PSIDATADIR?

PSIDATADIR 是一个环境变量,存放 PSI4 代码库里文本资源部分的位置(如基组、数据库、EFP 片段)。它仅供开发者使用。在 PSI4 1.1 及以后,程序始终知道自己的资源在哪,设置这个变量的唯一理由是想指向另一处位置。早先的 PSI4 1.0 及更早版本里,只有已安装的可执行文件才知道资源位置,所以从编译目录运行时总得显式设置它。

在运行时

>>> psi4 -p {top-level-psi4-dir}/psi4/share/psi4

或者在 shell 里

# csh、tcsh:写入 shell 或 ~/.tcshrc 文件setenv PSIDATADIR {top-level-psi4-dir}/psi4/share/psi4
# sh、bash:写入 shell 或 ~/.bashrc(Linux/Windows)、~/.bash_profile(Mac)文件export PSIDATADIR={top-level-psi4-dir}/psi4/share/psi4

Q22 / 50

如何为构建 PSI4 配置 C++ 与 C 编译器?

作用与依赖

· 作用 — 在 PSI4 中,C++ 编译器是构建代码的关键。

· 下游依赖 — PSI4 依赖 C++ 编译器

CMake 变量

· CMAKE_CXX_COMPILER — 用于指定 C++ 编译器名称或完整路径的 CMake 变量。

· CMAKE_C_COMPILER — 用于指定 C 编译器名称或完整路径的 CMake 变量。

· CMAKE_CXX_FLAGS — 用于为 C++ 源码指定任意额外自定义编译选项的 CMake 变量。

· CMAKE_C_FLAGS — 用于为 C 源码指定任意额外自定义编译选项的 CMake 变量。

示例

· 用 PATH 中检测到的编译器构建

>>> cmake

· 用 PATH 中特定的(Intel)编译器构建

>>> cmake -DCMAKE_CXX_COMPILER=icpc -DCMAKE_C_COMPILER=icc

· 用 PATH 之外特定的(GNU)编译器构建

>>> cmake -DCMAKE_CXX_COMPILER=/path/to/gcc6.2/bin/g++ -DCMAKE_C_COMPILER=/path/to/gcc6.2/bin/gcc

· 用 PATH 中的特定(Intel)编译器构建,其底层 GCC 不在 PATH 中

>>> cmake -DCMAKE_C_COMPILER=icc \-DCMAKE_CXX_COMPILER=icpc \-DCMAKE_C_FLAGS="-gcc-name=${GCC5}/bin/gcc" \-DCMAKE_CXX_FLAGS="-gcc-name=${GCC5}/bin/gcc -gxx-name=${GCC5}/bin/g++"

· 用 PATH 中的特定(Intel)编译器构建,其底层 GCC 不在 PATH 中,且同时构建 Fortran 附加组件

>>> cmake -DCMAKE_C_COMPILER=icc \-DCMAKE_CXX_COMPILER=icpc \-DCMAKE_Fortran_COMPILER=ifort \-DCMAKE_C_FLAGS="-gcc-name=${GCC5}/bin/gcc" \-DCMAKE_CXX_FLAGS="-gcc-name=${GCC5}/bin/gcc -gxx-name=${GCC5}/bin/g++" \-DCMAKE_Fortran_FLAGS="-gcc-name=${GCC5}/bin/gcc -gxx-name=${GCC5}/bin/g++"

· 用 PATH 中的特定(Intel)编译器构建,其底层 GCC 带前缀且不在 PATH 中(GCCPFX=/full/path/to/bin/prefix-,编译器即 $GCCPFX-gcc)

>>> cmake -DCMAKE_C_COMPILER=icc \-DCMAKE_CXX_COMPILER=icpc \-DCMAKE_C_FLAGS="-gnu-prefix=${GCCPFX}" \-DCMAKE_CXX_FLAGS="-gnu-prefix=${GCCPFX}"

· 在 Linux 上用 PATH 中的特定(Intel)编译器构建,其底层 GCC 来自已激活环境中的 conda(CONDA_PREFIX 与 HOST 在激活时即已定义)

>>> cmake -DCMAKE_C_COMPILER=icc \-DCMAKE_CXX_COMPILER=icpc \-DCMAKE_C_FLAGS="-gnu-prefix=${CONDA_PREFIX}/bin/${HOST} --sysroot=${CONDA_PREFIX}/${HOST}/sysroot" \-DCMAKE_CXX_FLAGS="-gnu-prefix=${CONDA_PREFIX}/bin/${HOST} --sysroot=${CONDA_PREFIX}/${HOST}/sysroot"

· 在 Linux 上用来自已激活 conda 环境的特定(GCC)编译器构建(CONDA_PREFIX 与 HOST 在激活时即已定义)

>>> cmake -DCMAKE_C_COMPILER=${GCC} \-DCMAKE_CXX_COMPILER=${GXX} \-DCMAKE_Fortran_COMPILER=${GFORTRAN}

Q23 / 50

认可哪些 C 与 C++ 编译器及版本?

在 Linux 上,下面这些都能很好地工作。

· GNU:gcc、g++

· Intel:icc、icpc

· Clang:clang、clang++

在 Mac 上,下面这些都能很好地工作。

· Apple Clang:clang、clang++

· Intel:icc、icpc

PSI4 要求完整支持 C++20。这项合规性会在构建时用 psi4/cmake/custom_cxxstandard.cmake 检查,所以要么查该文件、要么先试构建一次,以确认你的编译器被认可。注意 Linux 上的 Intel 编译器同样依赖 GCC,因此 icpc 与 gcc 的版本都会被检查。Intel OneAPI Classic 编译器可用,OneAPI Clang 的 icpx 编译器也可用。

· 不升级操作系统,如何满足 Linux 上 GCC >= 4.9 的要求?

Q24 / 50

Mac 上不用 Fink、MacPorts 或 Homebrew,如何获得 C 与 C++ 编译器?

最容易拿到的编译器是 clang,它可以直接替代 gcc 和 g++。只要装好 XCode 即可。某些旧版 XCode 处理不了部分高级 C++ 语言特性,但这是软件层面的限制、不是硬件限制;版本合规检查在构建时进行。注意这款「AppleClang」与使用 C++11 的 conda Mac 包不兼容,也无法利用 OpenMP 指令。

绕开上述限制、拿到 clang 编译器的另一条路是 conda。

# 把 Clang 4.0.1 装进一个非主用的 conda 环境>>> conda create -n clang401 clangxx_osx-64 clang_osx-64 llvm-openmp intel-openmp# 构建前先激活环境(会把路径加到 PATH 前面,并定义 CLANG、CLANGXX、HOST 等环境变量):>>> conda activate clang401>>> echo ${CLANGXX}/path/to/miniconda/envs/clang401/bin/x86_64-apple-darwin13.4.0-clang++>>> echo ${HOST}x86_64-apple-darwin13.4.0# 用 Clang 构建>>> cmake -S. -Bbuild \-DCMAKE_C_COMPILER=${CLANG} \-DCMAKE_CXX_COMPILER=${CLANGXX} \-DCMAKE_CXX_FLAGS="-stdlib=libc++" \-DOpenMP_CXX_FLAG="-fopenmp=libiomp5"# 用 Intel 编译器构建>>> cmake -S. -Bbuild \-DCMAKE_C_COMPILER=icc \-DCMAKE_CXX_COMPILER=icpc \-DCMAKE_C_FLAGS="-clang-name=${CLANG}" \-DCMAKE_CXX_FLAGS="-clang-name=${CLANG} -clangxx-name=${CLANGXX} -stdlib=libc++ -I${CONDA_PREFIX}/include/c++/v1"# 配置并构建

Q25 / 50

不升级操作系统,如何满足 Linux 上 GCC >= 4.9 的要求?

# 看看 GCC 是不是太旧(这里确实是)>>> gcc --versiongcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)

即便你不用 GCC 当编译器,Intel 编译器也会去找 gcc,以生成与你当前 GCC 版本兼容的代码。如果 GCC 太旧(就像上面那样),可以用包管理器升级系统 GCC,或在系统别处装一个可接受的版本。后一条路已在 Linux 上用 Intel 编译器验证过,做法如下。

# 把 GCC 7.2 装进一个非主用的 conda 环境>>> conda create -n gcc72 gxx_linux-64 gcc_linux-64# 构建时二选一:# (A) 激活环境(会把路径加到 PATH 前面,并定义 CC、CXX、HOST 等环境变量)>>> conda activate gcc72>>> echo ${CXX}/path/to/miniconda/envs/gcc72/bin/x86_64-conda_cos6-linux-gnu-g++>>> echo ${HOST}x86_64-conda_cos6-linux-gnu# 用 GNU 编译器构建>>> cmake -S. -Bbuild \-DCMAKE_C_COMPILER=${CC} \-DCMAKE_CXX_COMPILER=${CXX} \# 用 Intel 编译器构建>>> cmake -S. -Bbuild \-DCMAKE_C_COMPILER=icc \-DCMAKE_CXX_COMPILER=icpc \-DCMAKE_C_FLAGS="-gnu-prefix=${HOST}-" \-DCMAKE_CXX_FLAGS="-gnu-prefix=${HOST}-" \# (B) 通过 CMake 告诉编译器该用哪个 GCC>>> GCC7=/path/to/miniconda/envs/gcc72>>> cmake -S. -Bbuild \-DCMAKE_C_COMPILER=icc \-DCMAKE_CXX_COMPILER=icpc \-DCMAKE_C_FLAGS="-gnu-prefix=${GCC7}/bin/x86_64-conda_cos6-linux-gnu-" \-DCMAKE_CXX_FLAGS="-gnu-prefix=${GCC7}/bin/x86_64-conda_cos6-linux-gnu-" \...# 如果启用了 Fortran ...-DCMAKE_Fortran_COMPILER=ifort \-DCMAKE_Fortran_FLAGS="-gnu-prefix=${GCC7}/bin/x86_64-conda_cos6-linux-gnu-" \# 配置并构建# 运行时:>>> export LD_LIBRARY_PATH=${GCC7}/lib:$LD_LIBRARY_PATH

Q26 / 50

如何在 Cray 上配置 PSI4 的构建?

Cray 系统强烈倾向于构建静态库,但 PSI4 要作为 Python 模块工作,必须是动态的。承蒙论坛上的 @misha 以及多份超算指南,在 Cray 上构建 PSI4 需要在运行 cmake 之前设置好环境变量。

CRAYPE_LINK_TYPE=dynamic CRAY_ADD_RPATH=yes cmake ...

CRAYPE_LINK_TYPE

设置它,以允许 PSI4 在 Cray 超算上构建为共享库。

CRAY_ADD_RPATH

设为 true,以允许 PSI4 在 Cray 超算上构建。

Q27 / 50

如何为构建 PSI4 配置 Fortran 编译器?

作用与依赖

· 作用 — 在 PSI4 中,核心功能并不需要 Fortran 编译器,但某些附加组件可能要用到。

· 下游依赖

– PSI4(可选依赖)Fortran 编译器

– dkh、gdma、PCMSolver 依赖 Fortran 编译器

CMake 变量

· CMAKE_Fortran_COMPILER — 用于指定 Fortran 编译器名称或完整路径的 CMake 变量。

· CMAKE_Fortran_FLAGS — 用于为 Fortran 源码指定任意额外自定义编译选项的 CMake 变量。

示例

· 用 PATH 中检测到的编译器构建

>>> cmake

· 用 PATH 中特定的(Intel)编译器构建

>>> cmake -DCMAKE_Fortran_COMPILER=ifort

Q28 / 50

认可哪些 Fortran 编译器?

在 Linux 和 Mac 上,下面这些都能很好地工作。

· GNU:gfortran

· Intel:ifort

· 针对特定系统或包管理器要安装的包:

– Ubuntu:gfortran

– conda:gfortran_linux-64 或 gfortran_osx-64,用于获得 gfortran

Q29 / 50

Mac 上不用 Fink、MacPorts 或 Homebrew,如何获得 Fortran 编译器?

Xcode 不提供 Fortran 编译器。获取办法之一是下载 gfortran_osx-64 conda 包,它为 Mac 提供 gfortran 编译器。版本是 4.8.5,相当老,但这个 Fortran 编译器能正常工作。

Q30 / 50

如何为构建 PSI4 配置 BLAS/LAPACK?

作用与依赖

· 作用 — 在 PSI4 中,由于计算化学本质上就是对分子体系做线性代数,BLAS 与 LAPACK 在很大程度上决定了代码的速度与效率。

· 下游依赖 — PSI4 依赖 LAPACK 库

CMake 变量

· BLAS_TYPE — 用于指定在 MKL|OPENBLAS|ESSL|ATLAS|ACML|SYSTEM_NATIVE 中寻找哪些 BLAS 库的 CMake 变量。

· LAPACK_TYPE — 用于指定在 MKL|OPENBLAS|ESSL|ATLAS|ACML|SYSTEM_NATIVE 中寻找哪些 LAPACK 库的 CMake 变量。

· LAPACK_LIBRARIES — 显式指定 BLAS/LAPACK 库、绕过数学库检测的 CMake 变量。应为以「;」分隔的完整路径列表。

· LAPACK_INCLUDE_DIRS — 显式指定 BLAS/LAPACK 头文件位置、绕过数学库检测的 CMake 变量。仅 MKL 需要。

· OpenMP_LIBRARY_DIRS — 显式指定 OpenMP 库(iomp5/gomp/omp)所在目录的 CMake 变量。应为以「;」分隔的完整目录路径列表。通常就是报错 Could NOT find MathOpenMP 的解法。

MKL_ROOT

由 Intel compilervars 脚本设置的环境变量。足以触发在该位置对 MKL 的数学库检测。

MATH_ROOT

用于指定在哪个根目录下检测 BLAS/LAPACK 库的环境变量(例如 ${MATH_ROOT}/lib64/libblas.so 与 ${MATH_ROOT}/lib64/liblapack.so)。

示例

· 用标准位置下任意一份 LAPACK 构建

>>> cmake

· 在 Mac 上用原生 Accelerate LAPACK 构建(且未同时装 MKL)。若 NumPy 并未使用原生 Accelerate LAPACK,那么强行让 Psi4 用它可不是什么好主意!

>>> cmake

· 在 Mac 上用原生 Accelerate LAPACK 构建(且同时装了 MKL)。若 NumPy 并未使用原生 Accelerate LAPACK,那么强行让 Psi4 用它可不是什么好主意!

>>> cmake -DBLAS_TYPE=SYSTEM_NATIVE -DLAPACK_TYPE=SYSTEM_NATIVE

· 用 Intel MKL 构建

>>> source /path/to/intel/vers/linux/mkl/bin/mklvars.sh intel64 # 按需要调整 sh/csh 与架构>>> cmake
>>> MATH_ROOT=/path/to/intel/vers/linux/mkl/ cmake

· 用来自 conda 的 Intel MKL 构建(从 defaults 频道安装 mkl-devel 包)

>>> cmake -DLAPACK_LIBRARIES="${CONDA_PREFIX}/lib/libmkl_rt.so" -DLAPACK_INCLUDE_DIRS="${CONDA_PREFIX}/include"

· OpenBLAS — 见下方说明。

>>> MATH_ROOT=/path/to/openblas/0.2.13_seq/x86_64/gcc_5.2.0/lib cmake

· 用显式指定的 MKL LAPACK 构建

>>> cmake -DLAPACK_LIBRARIES="/path/to/lib/intel64/libmkl_lapack95_lp64.a;/path/to/lib/intel64/libmkl_rt.so" -DLAPACK_INCLUDE_DIRS="/path/to/mkl-h-include/"

· 用显式指定的非 MKL LAPACK 构建

>>> cmake -DLAPACK_LIBRARIES="/path/to/lib/liblapack.so;/path/to/lib/libblas.a"

· 用 MKL 与 GCC 构建(线程化需要 iomp5 而非 gomp,可用 OpenMP_LIBRARY_DIRS 提示其位置)

>>> cmake -DLAPACK_LIBRARIES=/opt/intel/mkl/lib/intel64/libmkl_rt.so -DLAPACK_INCLUDE_DIRS=/opt/intel/mkl/include -DOpenMP_LIBRARY_DIRS=/opt/intel/compiler/lib/intel64/

说明

· PSI4 的速度与效率,很大程度上取决于所链接的 BLAS 与 LAPACK 库的速度与效率(尤其前者)。请参考下面这些建议:

– 不建议用许多 Linux 发行版(如 RedHat)自带的那个 BLAS 库,它通常就是完全没有优化过的 netlib 版本。LAPACK 的选择则没那么要紧,未优化的 netlib 版本是可以接受的。

– 如果有的话,最好的选择大概是 Intel 的 MKL 库,它包含高效的多线程 BLAS 与 LAPACK(截至 PSI4 v1.1,已知最早可用版本是 MKL 2013;截至 v1.4,应至少用 MKL 2019)。MKL 可通过 conda 免费获得,也是 PSI4 完整支持的唯一一款多线程 BLAS/LAPACK 发行版。

– 在 Mac 上,原生的 Accelerate 库非常好、本该推荐,但 PSI4 的 BLAS 与 NumPy 的 BLAS 可能冲突。除非你有特制的 NumPy,否则别用!

– 开源 LAPACK 发行版 OpenBLAS(原 GotoBLAS)大体可用。请自行承担风险,并先测试你手上这份发行版;若打算让 PSI4 多线程运行,也要把多线程情形测进去。至少用 0.2.15,并留意它是怎么编译的——不带线程的似乎安全,openmp 线程化的多半安全,默认的 pthread 线程化并不安全。近期分析见 https://github.com/psi4/psi4/issues/1009。

– 另一款开源 LAPACK 发行版 ATLAS,在上次测试时对 DFOCC 模块有稳定性问题,见 https://github.com/psi4/psi4/issues/391。

– 已知 ACML 库在 ACML 6 版本下可与 PSI4 v1.1 配合工作。

· 由于链接加载器的工作方式,运行时 PSI4 的 BLAS 与 NumPy 的 BLAS 并非彼此独立。如果两者的 BLAS 连库名都对不上(也就是说 libmkl_rt、libmkl_core.so、libmkl_core.a 不可互换),就可能出现难以预料但可复现的数值错误与线程扩展错误。详见 https://github.com/psi4/psi4/issues/1007、https://github.com/psi4/psi4/issues/748、https://github.com/psi4/psi4/issues/755 里那些细致的讨论。请让 NumPy 与 PSI4 的编译条件使用同一款 BLAS 发行版。

· 为 PSI4 检测到的 BLAS/LAPACK,也会链接进任何需要它们的附加组件(例如 libefp),而不是依赖那些包自带的数学库检测。

· 检测输出与 CMake 变量里把 BLAS 和 LAPACK 分开,纯属形式上的。实际上它们会一起运行,并按 ${LAPACK_LIBRARIES} ${BLAS_LIBRARIES} 链接。

· 有时 CMake 的库搜索能力会在 SONAME(如 libblas.so.3 与 libblas.so)、扩展名(静态与动态)、或后缀(如 libacml_mp.so 与 libacml.so)上卡壳。开发者很乐意听到这类问题,以便扩展数学库检测能力。不过眼下的直接解法,是在实际存在的库名与期望的库名之间建立符号链接。所查找的库名模式,见 psi4/cmake/math/MathLibs.cmake。

· BLAS/LAPACK 接口是标准化的,所以只需检测库、不必检测头文件。唯一的例外是 MKL:mkl.h 头文件定义了额外功能,要使用 BLAS 线程化就必须定位到它。

Q31 / 50

如何为构建 PSI4 配置 Python?

作用与依赖

· 作用 — 在 PSI4 中,Python 让核心的已编译 C++ 代码能在一门解释型语言里被灵活地调用、操作与扩展。

· 下游依赖 — PSI4 依赖 Python 解释器

CMake 变量

注意:在 v1.4 中,PSI4 从由 Numpy 编写的 CMake Python 检测,换成了由新版 CMake 编写的 CMake Python 检测。现在通常只需 Python_EXECUTABLE 来提示 Python 的位置。完整指南见 https://cmake.org/cmake/help/latest/module/FindPython.html。

· Python_EXECUTABLE — 指定 Python 解释器的名称或完整路径。

· Python_LIBRARY — 指定 Python 库的路径。

· Python_INCLUDE_DIR — 指定 Python 头文件所在目录,其中包含 Python.h。

示例

· 用 PATH 中检测到的 Python 构建

>>> cmake

· 用特定的 Python 构建

>>> cmake -DPython_EXECUTABLE=/path/to/interp/python3.9

· 把根目录 ${PFXC} 下的 Python 完整指定出来

>>> cmake -DPython_EXECUTABLE="${PFXC}/bin/python" \-DPython_LIBRARY="${PFXC}/lib/libpython3.9.so" \-DPython_INCLUDE_DIR="${PFXC}/include/python3.9"

Q32 / 50

PSI4 用的是哪个 Python?

构建时检测到的 Python 会被嵌进 PSI4 的可执行文件里。也就是说,bin/psi4 的第一行大致是 #!/path/to/miniconda/envs/p4deps/bin/python3.5,PSI4 是通过它来运行的,而不是 which python 指向的那个 Python。若想短期换个 Python 来配 PSI4,只要在命令行用 path/to/desired/python psi4 覆盖 shebang 行即可;想长期更换,就改 shebang 行。

如果你把 PSI4 当 Python 模块用,那么 PSI4 运行的就是 which python 所指的那个 Python。

Q33 / 50

如何修复「undefined symbol: _Py_FalseStruct」?

你多半是在 Py2 里加载了用 Py3 编译的 Psi4。换解释器重跑即可。PSI4 的「可执行文件」里烤进了一个 Py2 或 Py3 属性正确的 python,所以这个错误只会在把 Psi4 当 Python 模块用时出现。

Q34 / 50

如何在 PSI4 中使用 gdb 和 lldb?

如今 PSI4 通过 Python 运行,调试变得有点绕。语法如下:

>>> cd {objdir}>>> lldb -- python stage/bin/psi4 ../tests/tu1-h2o-energy/input.dat>>> (lldb) run
>>> cd {objdir}>>> gdb --args python stage/bin/psi4 ../tests/tu1-h2o-energy/input.dat>>> (gdb) run

Q35 / 50

如何查看 cmake 实际的编译命令(或错误)?

为了让编译输出更干净,CMake 默认隐藏了大量有用的调试信息。执行 make VERBOSE=1 即可显示完整的编译命令与错误。

Q36 / 50

如何在 vi 中高亮 git 合并冲突?

编辑 ~/.vimrc,加入下面这几行。按 F7 键即可切换 git 冲突标记的高亮。

>>> cat ~/.vimrcset hlsearchmap <F7> :/\(<<<<<<<\\|=======\\|>>>>>>>\)<CR>

Q37 / 50

用 Anaconda Python 构建时,如何处理「runtime library may be hidden」?

当针对 Ana/Miniconda 的 python 构建时(例如 cmake -DPython_EXECUTABLE=/path/to/conda/bin/python),常会出现下面这条警告。它无害,继续即可。

CMake Warning at src/bin/psi4/CMakeLists.txt:58 (add_executable):Cannot generate a safe runtime search path for target psi4 because files insome directories may conflict with libraries in implicit directories:runtime library [libm.so.6] in /usr/lib64 may be hidden by files in:/theoryfs2/common/software/anaconda/libSome of these libraries may not be found correctly.

Q38 / 50

如何设置 scratch 目录?

scratch 目录是 Psi4 在计算过程中存放临时文件的地方,这些文件可能很大。因此它应当放在本地的高速磁盘上,尽量减小 I/O 带来的效率损失。scratch 目录通常通过 PSI_SCRATCH 环境变量设置:

# csh、tcsh:写入 shell 或 ~/.tcshrc 文件setenv PSI_SCRATCH /path/to/existing/writable/local-not-network/directory/for/scratch/files
# sh、bash:写入 shell 或 ~/.bashrc(Linux/Windows)、~/.bash_profile(Mac)文件export PSI_SCRATCH=/path/to/existing/writable/local-not-network/directory/for/scratch/files

另见更通用的 scratch 文档。

Q39 / 50

如何保留指定的 PSI4 scratch 文件?

你可以为 PSI4 scratch 文件设定一个专门路径,并通过 psi4_io 处理器把它们留作后用。

Q40 / 50

如何在 PBS 队列中使用 Psi4?

通常需要写一个 PBS 作业脚本,把所有必要的环境变量设好、确认 scratch 目录已就位,再调用可执行文件。手册里提供了一份 PBS 脚本示例,但务必同时查阅你自己的 PBS 文档以做恰当配置。

Q41 / 50

如何更新并重新编译 PSI4?

按合适的方式取得代码更新:二进制安装程序、从 GitHub 克隆仓库,或从 GitHub 派生仓库。进入 objdir 后重新执行 make 或 cmake --build .,此时 CMake 可能会重新配置,但只会重建那些依赖已改动文件的对象与库。基于 PSI4 仓库的改动去更新 objdir,用户几乎从不需要重新调用 cmake。不过一旦切换了 conda 环境,就该另建一个新的 objdir,因为 objdir/CMakeCache.txt 里烤进了许多绝对路径。

Q42 / 50

如何跑一分钟量级的测试?

当你只想对构建做个极简验证、且已装好 CTest 时,下面这条命令很有用。

>>> ctest -L smoke -j`getconf _NPROCESSORS_ONLN`

如果你装了 pytest,用下面这条可获得几乎相同的覆盖:

>>> make pytest

Q43 / 50

如何运行部分测试?

CTest 允许把测试集灵活地分组运行。下面的例子里,testname 是测试名的正则,testlabel 是标签(如 cc、mints、libefp,定义见 [示例定义])的正则。

· 用 -j 参数并行跑测试。要最大并行度(不含 Windows):ctest -j`getconf _NPROCESSORS_ONLN`

· 跑完整测试集:ctest

· 用 5 分钟跑约三分之一的测试,即所谓的 quicktests:ctest -L quick

· 跑与持续集成所检查相同的那部分测试(不是完整测试集):ctest -L quick

· 跑最少量测试,确认 Psi4 与各附加组件都能正常工作:ctest -L smoke

· 按名字匹配来跑测试:ctest -R testname

· 按名字排除来跑测试:ctest -E testname

· 按标签匹配来跑测试:ctest -L testlabel

· 按标签排除来跑测试:ctest -LE testlabel

Pytest 也有类似的命令:

· 用 -n 参数并行跑测试(需装 Python 包 pytest-xdist)。要最大并行度:pytest -n auto

· 跑完整测试集:pytest

· 跑快速测试:pytest -m quick

· 跑最少量测试,确认 Psi4 与各附加组件都能正常工作:pytest -m smoke

· 按名字匹配来跑测试:pytest -k testname

· 按名字排除来跑测试:pytest -k "not testname"

· 按标签匹配来跑测试:pytest -m testlabel

· 按标签排除来跑测试:pytest -m "not testlabel"

· 按名字做复杂筛选来跑测试:pytest -k "cc and not cc4 and not stdsuite"

· 跑测试并显示测试名:pytest -v

· 跑测试并显示测试名、有时还能看到更详细的报错:pytest -vv

Q44 / 50

如何查看 CTest 的测试错误?

>>> ctestTest project /your/path/2/psi4/build/directory/testsStart 248: tu1-h2o-energy1/2 Test #248: tu1-h2o-energy ................... Passed 1.73 secStart 6: cc12/2 Test #6: cc1 ..............................***Failed 0.07 sec...

当 ctest 报告有部分(或全部)测试失败时,到构建目录里找 objdir/Testing/Temporary/LastTest.log 这个文件。取决于上一次测试是否被中断等因素,它可能带 .tmp 扩展名。无论哪种,这个文件都应包含 CMake 的测试输出,以及所有打印到屏幕上的内容。

Q45 / 50

如何测试一个已安装的 PSI4?

ctest 需要连到源文件和 cmake 机制,因此只能从 objdir(暂存安装)执行。要测试一个已安装的 PSI4(完整或暂存安装),有一套补充测试集可经由 pytest 运行。一般跑少量「smoke」测试就足以验证一份安装。

· 从可执行文件运行:

# 仅串行运行冒烟测试psi4 --test# 仅并行运行冒烟测试psi4 --test -n`getconf _NPROCESSORS_ONLN`# 运行大部分测试psi4 --test full

· 从库运行(PSI4 必须能作为 Python 模块被检测到;如需要,参见「如何配置 PsiAPI 的路径」一节):

# 仅运行冒烟测试python -c "import psi4; psi4.test('smoke')"# 运行大部分测试python -c "import psi4; psi4.test()"

· 直接用 pytest 运行。若已安装 pytest-xdist,还可以并行执行:

# 仅运行冒烟测试pytest {prefix}/lib/{PYMOD_INSTALL_LIBDIR}/psi4/tests/ -m smoke -n auto# 运行全部测试pytest {prefix}/lib/{PYMOD_INSTALL_LIBDIR}/psi4/tests/ -n auto

输出大致如下。绿色的 PASSED 是好的(表示测试正确跑完);黄色的 SKIPPED 是好的(表示该测试所需的软件没有全部就绪);黄色的 XPASS 或 XFAIL 也无妨(当我们纳入某些需要特定条件如多核才能正常运行的测试时,就会出现意外通过或预期失败);红色的 FAILED 才是坏消息。

test_addons.py::test_gdma PASSEDtest_addons.py::test_mrcc SKIPPEDtest_addons.py::test_chemps2 PASSEDtest_addons.py::test_dftd3 PASSEDtest_addons.py::test_libefp PASSEDtest_addons.py::test_pcmsolver PASSEDtest_addons.py::test_simint PASSEDtest_addons.py::test_json PASSEDtest_addons.py::test_cfour SKIPPEDtest_addons.py::test_v2rdm_casscf PASSEDtest_addons.py::test_grimme_3c PASSEDtest_addons.py::test_dkh PASSEDtest_psi4.py::test_psi4_basic PASSEDtest_psi4.py::test_psi4_cc PASSEDtest_psi4.py::test_psi4_cas PASSEDtest_psi4.py::test_psi4_dfmp2 PASSEDtest_psi4.py::test_psi4_sapt PASSEDtest_psi4.py::test_psi4_scfproperty PASSED

Q46 / 50

如何在文字中称呼 Psi4?

在文字里指代 PSI4 的写法,按推荐程度从高到低排列:

· 按 psi4/media/README.md,用 Optima 常规字体写成 Psi4,其中「si」用定制的(82%)小型大写。

– html: <span style="font-family: Optima, sans-serif; color: #273896;">P<span style="font-size: 82%;">SI</span>4</span>

· 写成 Psi4,其中「si」用生成的小型大写

– html: <span style="font-variant: small-caps;">Psi4</span>

· 写成 Psi4,其中「si」用小写

· 在代码里写成 psi4

· 不要写成 PSI4 或 PSI

Q47 / 50

如何获取 Psi4 的 logo 文件?

所有图片文件都存放在 https://github.com/psi4/psi4media。

Q48 / 50

如何在 PSI4 构建中使用本地的 Add-On 仓库?

对每一个 Add-On,PSI4 都会从某个特定的在线 Git 仓库、以及其中某个特定的 tag/分支/commit 拉取源码。这保证了 PSI4 构建能成功、运行结果可复现,也让上游开发可以继续自由推进。有时候做上游开发的人正是你自己,这时你需要让 CMake 的 superbuild 从本地路径、而非已审定的代码集拉取源码。

在 psi4/external 里找到管辖目标 Add-On 的 CMakeLists.txt,做类似下面的改动:

#GIT_REPOSITORY https://github.com/jturney/ambit#GIT_TAG 1.0DOWNLOAD_COMMAND ""SOURCE_DIR "/path/to/ambit-directclone"

如果你在两次编译之间改的是 PSI4 仓库本身的代码,就无需再做别的,CMake 会替你处理好代码重建的依赖。

如果你在两次编译之间改的是本地 Add-On 仓库的代码,CMake 并不知道 libaddon.[a|so|dylib] 何时需要重建。建议初次配置 PSI4 构建时就用 -DBUILD_SHARED_LIBS=ON(更容易察觉改动)。要触发 Add-On 库重建,执行 rm -rf {objdir}/external/upstream/addon/ 与 rm -rf {objdir}/stage/share/cmake/AddOn。这样应该会重新克隆该 Add-On、重新构建并安装它、重建 PSI4 中与它对接的部分,并重新链接主 core.so。如果你改动的是 Add-On 的文件或目录结构,机灵一点,把 {objdir}/stage/ 里它的所有痕迹都清掉,尤其是任何 *.pyc 文件。

相比上面,另一种更值得推荐的做法是:在 PSI4 仓库之外,自己构建并安装这个 Add-On 库。当你不想每改一次 Add-On 源码就全量重编它时,这尤其有用。以动态方式构建 Add-On 库(-DBUILD_SHARED_LIBS=ON),并留意 Add-On 顶层 CMakeLists.txt 里任何「Psi4 wants」的说明。装好 Add-On,记下 AddOnConfig.cmake 的完整路径,把包含该文件的路径以 -DAddon_DIR=/path/to/config/usually/ending/in/share/cmake/AddON 传给 PSI4 的 CMake 并构建 PSI4。主 core.so 应当会动态链接到你开发中的 AddOn 动态库,并在你重建 AddOn 库时自动更新。当然,按需你也可能需要删掉 core.so 再重新 make。

Q49 / 50

如何在 PSI4 中使用日志?

输出文件旁边会生成一个扩展名为 .log 的日志文件,一些精选的关键信息会写进去。日志文件的内容是临时的、也不成体系,别开始依赖它。目前的初步设想是,让日志文件包含与输出文件大体相同的结果,但更多地以结构化数据而非叙述性文字呈现,格式更整齐。在涉及外部调用的一些情形里,最详细的信息可能只能从日志文件里收集到。如果惯常的输出文件里缺少预期结果,值得去查一下日志文件。若日志文件是空的,可能是日志级别设得太低。

从命令行把日志级别改为 DEBUG:

>>> psi4 --logging 10

在 PsiAPI 里把日志级别改为 DEBUG:

>>> psi4.set_output_file(<filebase>, loglevel=10)

Q50 / 50

如何从可执行文件找到 Psi4 模块,以及反过来?

由于 C++/Linux 与 Python 的安装布局惯例不同,PSI4 可执行文件与 PSI4 Python 模块之间并没有固定的相对位置。为此加了一些访问器:可执行文件能指出模块在哪,模块也能指出可执行文件在哪。

> /path/to/psi4/install/bin/psi4 --module/path/to/psi4/install/lib//> python -c "import psi4;print(psi4.executable)"/path/to/psi4/install/bin/psi4

译注与资料来源

本文译自 PSI4 官方手册 Compiling and Installing from Source 页:https://psicode.org/psi4manual/master/build_planning.html 。本译文仅供中文读者学习参考,非官方中文版;复制命令或报告编译问题时请以英文原文为准。文中三张整理图与封面为本号依据原文自行绘制,非官方原图。

原文链接清单(纯文本,供复制访问)

订阅号正文不支持外链跳转。以下按来源列出官方本页出现的全部 124 条链接(80 条外部链接、44 条手册内相对链接展开后的完整地址),另附本页出处一条。

官方入口与本页出处(4 条)

https://psicode.org/installs/latest;https://psicode.org/installs/latest/;https://psicode.org/psi4manual/master/index.html;https://psicode.org/psi4manual/master/build_planning.html

PSI4 源码仓库、工作流与议题(32 条)

https://github.com/psi4/psi4/blob/master/.github/workflows/docs.yml;https://github.com/psi4/psi4/blob/master/.github/workflows/ecosystem.yml;https://github.com/psi4/psi4/blob/master//external/upstream/libint2/CMakeLists.txt;https://github.com/psi4/psi4/blob/master/CMakeLists.txt#L27

https://github.com/psi4/psi4/blob/master/cmake/custom_cxxstandard.cmake;https://github.com/psi4/psi4/blob/master/cmake/math/MathLibs.cmake;https://github.com/psi4/psi4/blob/master/codedeps.yaml;https://github.com/psi4/psi4/blob/master/conda/psi4-path-advisor.py

https://github.com/psi4/psi4/blob/master/devtools/conda-envs/docs-cf.yaml;https://github.com/psi4/psi4/blob/master/doc/sphinxman/CMakeLists.txt;https://github.com/psi4/psi4/blob/master/external;https://github.com/psi4/psi4/blob/master/external/upstream/chemps2/CMakeLists.txt#L2

https://github.com/psi4/psi4/blob/master/external/upstream/dkh/CMakeLists.txt#L2;https://github.com/psi4/psi4/blob/master/external/upstream/ecpint/CMakeLists.txt/#L2;https://github.com/psi4/psi4/blob/master/external/upstream/gau2grid/CMakeLists.txt#L1;https://github.com/psi4/psi4/blob/master/external/upstream/gdma/CMakeLists.txt#L2

https://github.com/psi4/psi4/blob/master/external/upstream/libefp/CMakeLists.txt#L1;https://github.com/psi4/psi4/blob/master/external/upstream/libint2/CMakeLists.txt;https://github.com/psi4/psi4/blob/master/external/upstream/libint2/CMakeLists.txt#L1;https://github.com/psi4/psi4/blob/master/external/upstream/libxc/CMakeLists.txt#L4

https://github.com/psi4/psi4/blob/master/external/upstream/pybind11/CMakeLists.txt#L2;https://github.com/psi4/psi4/blob/master/external/upstream/simint/CMakeLists.txt#L2;https://github.com/psi4/psi4/blob/master/media/README.md;https://github.com/psi4/psi4/blob/master/tests

https://github.com/psi4/psi4/blob/master/tests/ci-property/CMakeLists.txt#L3;https://github.com/psi4/psi4/issues/1007;https://github.com/psi4/psi4/issues/1009;https://github.com/psi4/psi4/issues/391

https://github.com/psi4/psi4/issues/748;https://github.com/psi4/psi4/issues/755;https://github.com/psi4/psi4media;https://github.com/psi4/sphinx-psi-theme

附加组件与第三方项目仓库(20 条)

https://github.com/Chandemonium/MP2D;https://github.com/DEShawResearch/sns-mp2/commits/master;https://github.com/Masterluke87/psixas;https://github.com/MolSSI-MDI/MDI_Library

https://github.com/adc-connect/adcc;https://github.com/cdsgroup/resp;https://github.com/ddsolvation/ddx;https://github.com/dftd3/simple-dftd3

https://github.com/edeprince3/gpu_dfcc/commits/master;https://github.com/giampaolo/psutil;https://github.com/grimme-lab/gcp;https://github.com/jturney/ambit

https://github.com/maxscheurer/cppe;https://github.com/networkx/networkx;https://github.com/piecuch-group/cct3;https://github.com/pytest-dev/pytest-xdist

https://github.com/quantumlib/OpenFermion;https://github.com/seperman/deepdiff;https://github.com/shannonhouck/psi4fockci;https://github.com/workhorsy/py-cpuinfo

编译器、数值库、Python 生态与文档(25 条)

http://doc.pytest.org/en/latest/;http://ipi-code.org/;http://nbsphinx.readthedocs.io/en/jupyter-theme/;http://sphinx-doc.org

http://www.zlib.net/;https://apps.apple.com/us/app/xcode/id497799835;https://cmake.org/cmake/help/latest/module/FindPython.html;https://cmake.org/download/

https://eigen.tuxfamily.org/index.php?title=Main_Page;https://molssi.github.io/QCElemental/;https://molssi.github.io/QCEngine/;https://molssi.github.io/QCManyBody/

https://msgpack.org/;https://numpy.org/;https://optking.readthedocs.io/en/latest/;https://pint.readthedocs.io/en/latest/

https://pybind11.readthedocs.io/en/stable/;https://pydantic-docs.helpmanual.io;https://scipy.org/;https://support.hdfgroup.org/HDF5/

https://www.boost.org/;https://www.brianqc.com/;https://www.mpfr.org/;https://www.perl.org/

https://www.python.org/

手册内相关章节(相对链接展开为完整地址)(44 条)

https://psicode.org/psi4manual/master/adcc.html#sec-adcc;https://psicode.org/psi4manual/master/brianqc.html#sec-brianqc;https://psicode.org/psi4manual/master/build_obtaining.html#faq-binary;https://psicode.org/psi4manual/master/build_obtaining.html#faq-clonepsi4public

https://psicode.org/psi4manual/master/build_obtaining.html#faq-forkpsi4public;https://psicode.org/psi4manual/master/build_obtaining.html#faq-obtainpsi4;https://psicode.org/psi4manual/master/cfour.html#sec-cfour;https://psicode.org/psi4manual/master/chemps2.html#cmake-chemps2

https://psicode.org/psi4manual/master/chemps2.html#sec-chemps2;https://psicode.org/psi4manual/master/cppe.html#sec-cppe;https://psicode.org/psi4manual/master/ddx.html#sec-ddx;https://psicode.org/psi4manual/master/dftd3.html#sec-dftd3

https://psicode.org/psi4manual/master/dkh.html#cmake-dkh;https://psicode.org/psi4manual/master/dkh.html#sec-dkh;https://psicode.org/psi4manual/master/ecpint.html#cmake-ecpint;https://psicode.org/psi4manual/master/ecpint.html#sec-ecpint

https://psicode.org/psi4manual/master/external.html#envvar-CONDA_PREFIX;https://psicode.org/psi4manual/master/external.html#envvar-HOST;https://psicode.org/psi4manual/master/external.html#envvar-PATH;https://psicode.org/psi4manual/master/external.html#envvar-PSIDATADIR

https://psicode.org/psi4manual/master/external.html#envvar-PSI_SCRATCH;https://psicode.org/psi4manual/master/external.html#envvar-PYTHONPATH;https://psicode.org/psi4manual/master/external.html#sec-pbs;https://psicode.org/psi4manual/master/external.html#sec-scratch

https://psicode.org/psi4manual/master/gau2grid.html#cmake-gau2grid;https://psicode.org/psi4manual/master/gau2grid.html#sec-gau2grid;https://psicode.org/psi4manual/master/gcp.html#sec-gcp;https://psicode.org/psi4manual/master/gdma.html#cmake-gdma

https://psicode.org/psi4manual/master/gdma.html#sec-gdma;https://psicode.org/psi4manual/master/libefp.html#cmake-libefp;https://psicode.org/psi4manual/master/libefp.html#sec-libefp;https://psicode.org/psi4manual/master/libint.html#cmake-libint

https://psicode.org/psi4manual/master/libint.html#sec-libint;https://psicode.org/psi4manual/master/libxc.html#cmake-libxc;https://psicode.org/psi4manual/master/libxc.html#sec-libxc;https://psicode.org/psi4manual/master/mrcc.html#sec-mrcc

https://psicode.org/psi4manual/master/ooo.html#cmake-ooo;https://psicode.org/psi4manual/master/pcmsolver.html#cmake-pcmsolver;https://psicode.org/psi4manual/master/pcmsolver.html#sec-pcmsolver;https://psicode.org/psi4manual/master/plugin_psi4fockci.html#sec-fockci

https://psicode.org/psi4manual/master/plugin_snsmp2.html#sec-snsmp2;https://psicode.org/psi4manual/master/plugin_v2rdm_casscf.html#sec-v2rdm-casscf;https://psicode.org/psi4manual/master/simint.html#cmake-simint;https://psicode.org/psi4manual/master/simint.html#sec-simint

你已经编译过 PSI4 吗?卡在依赖、编译器还是 Python 路径上?欢迎在留言区告诉我们,也可以点出你希望我们接着翻译手册的哪一节。

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料