有限元纳米尺度动力学
项目描述
概述
FIEND 是一个用于模拟圆柱对称系统中时间相关单粒子量子力学的软件包。这包括在线性偏振激光场中的原子和线性分子、金属纳米锥和纳米簇等系统。
FIEND 使用 FEniCS FEM 工具包进行网格划分和组装系统矩阵,并使用 PETSc 和 SLEPc 进行高性能线性代数。
包结构
包结构如下
. ├── docker │ Files for building Docker containers │ for easy installation of Fiend │ ├── fiend │ ├── analysis │ │ │ Analysis scripts │ │ │ │ │ ├── animate_density.py │ │ │ Animation of electron density in time │ │ ├── custom.mplparams │ │ ├── draw_acceleration.py │ │ │ Visualization of dipole acceleration │ │ ├── draw_dipole.py │ │ │ Visualization of dipole moment │ │ ├── draw_final_state.py │ │ │ Visualization of the final state of the propagation │ │ ├── draw_laser.py │ │ │ Visualization of the laser electric field │ │ ├── draw_mesh.py │ │ │ Visualization of meshes │ │ ├── draw_norm.py │ │ │ Visualization of wavefunction norm in time │ │ ├── draw_pes.py │ │ │ Computation of photoelectron spectrum (experimental) │ │ ├── draw_snapshot.py │ │ │ Visualization of electron density at single instant of time │ │ ├── draw_stationary_states.py │ │ │ Visualization of stationary states │ │ ├── draw_velocity.py │ │ │ Visualization of dipole velocity │ │ ├── __init__.py │ │ ├── _pes_tsurff.py │ │ │ Implementation of tsurff │ │ ├── tests │ │ │ Tests of the analysis scripts │ │ │ │ │ ├── _unit_conversions.py │ │ │ Unit conversion tools │ │ └── _visualization_utils.py │ │ Visualization tools │ ├── __init__.py │ ├── lin_pol │ │ │ Tools for propagation with linearly polarized pulses │ │ │ │ │ ├── __init__.py │ │ ├── prepare_tdse.py │ │ ├── propagate.py │ │ └── solve_tise.py │ ├── propagation │ │ │ Implementation of propagation-related stuff │ │ │ │ │ ├── __init__.py │ │ ├── observables.py │ │ │ Implementation of all observables │ │ ├── propagation_utils.py │ │ │ Helpful tools for loading system matrices │ │ ├── propagators.py │ │ │ All propagators are implemented here │ │ └── tests │ │ Tests for the propagators │ │ │ ├── pulseconfig_parser │ │ │ Parser for laser pulse configuration files │ │ │ │ │ ├── __init__.py │ │ ├── laser.py │ │ │ Implementation of Laser │ │ ├── parameter.py │ │ │ Implementation of const/non-const parameter │ │ ├── parser.py │ │ │ Implementation of Laser configurtion parser │ │ └── singlecolorlaserpulse.py │ │ Implementation of a single channel laser pulse │ │ │ ├── tdse │ │ │ Tools for preparing the system matrices etc. for propagation │ │ │ │ │ ├── absorbing_boundaries.py │ │ │ Complex absorbing boundary │ │ ├── __init__.py │ │ ├── tdse.py │ │ │ Preparation of system matrices for propagation │ │ │ and related IO tools │ │ └── tests │ │ Tests related to preparation of │ │ system matrices │ │ │ ├── tests │ │ Global tests (mypy) │ │ │ ├── tise │ │ ├── __init__.py │ │ ├── tests │ │ │ Tests for TISE solver │ │ │ │ │ └── tise.py │ │ TISE solver and related IO tools │ └── utils │ │ Helper tools that are used all over the code │ │ │ ├── custom_matrices.py │ ├── dolfin.py │ ├── __init__.py │ ├── mesh.py │ ├── misc.py │ ├── mpi.py │ ├── petsc_utils.py │ ├── predefined_potentials.py │ └── tests │ Tests for the utilities │ ├── license.txt ├── README.md │ Readme for Gitlab ├── README.rst │ Readme for PYPI ├── requirements.txt │ Dependencies of Fiend └── setup.py Python setuptools script
求解薛定谔方程
时间相关薛定谔方程(TDSE)(在 哈特里原子单位)中是
其中 是时间演化的态,
是初始态,
是时间依赖的哈密顿算符,其时间不变部分由
给出,其中具有静态势
。
时间不变哈密顿量的定态可以通过时间不变薛定谔方程(TISE)求解。
其中 和
分别是第 i 个本征能量和本征态。
在典型配置中,时间传播的初始状态 是静态态之一。
理论背景
有关TISE和TDSE离散化的描述,请参阅 MyArticle。
简而言之,我们假设磁量子数为零 来描述我们的系统,这在圆柱坐标系中进行。这使我们能够在圆柱坐标系统的2D切片中描述系统。我们选择TISE和TDSE的模拟域
和
并用无结构三角网格进行网格划分。请注意,模拟域可以不同,例如,如果需要,您可以增加TDSE计算的模拟域。
网格划分后,选择基函数。它们是具有网格单元紧支集的Lagrange多项式,直到某个程度n。网格划分和选择基函数使我们能够将薛定谔方程离散化为
和
其中 是静态态实值展开系数的向量,
是时间依赖态复值展开系数的向量,在Lagrange多项式基下的系统矩阵
由以下给出
和
这里自然内积是
请注意,我们在 处施加了连续边界条件,并在边界其他地方施加了零Dirichlet或零Neumann边界条件。
相互作用
默认情况下,我们实现了三种类型的激光-物质相互作用
对于线性偏振矢量势的长度规范下的偶极近似
长度标度下线偏振矢量势的偶极近似
和非均匀矢量势
使用FIEND
一次时变模拟包含4个步骤
求解时不变系统以获得初始状态
准备系统矩阵进行时演
时演
后处理/分析
以下将详细描述在模拟原子系统在线偏振激光场下的这些步骤。对于更复杂的情况,请参阅demos/nanotip中的示例。
步骤1. 求解TISE
时不变系统应始终首先求解。确保您已加载支持HDF5、PETSc和SLEPc的FEniCS环境。在预安装的Docker镜像中,您可以使用命令ml petsc/real。
可以使用脚本fiend_linpol_tise求解TISE。它在一个有效电子近似下求解原子系统,原子势可以通过命令行选项--atom_type选择。
要获取选项的完整列表,请运行fiend_linpol_tise --help。示例可以在demos/hhg/step1.sh和demos/hhg/step2.sh中找到。
新的静态势可以在fiend.utils.predefined_potentials中实现,请参阅模块源代码以获取更多详细信息。
solve_tise保存以下文件
data/tise_mesh.h5,其中包含用于求解TISE的网格。
data/tise_eigenvalues,它是一组本征能量
data/tise_states.h5,它包含所有定态的展开系数
data/config,其中包含用于求解TISE的模拟参数
步骤2. 为TDSE准备系统矩阵
在求解TISE之后,您应设置时变模拟的矩阵。对于在线偏振场中的原子系统,这可以通过脚本fiend_linpol_prepare_tdse完成,但对于更复杂的设置请参阅demos/nanotip/。确保您已加载支持hdf5、petsc和slepc的FEniCS安装。在Docker镜像中,这可以通过ml petsc/real实现。
这一步的主要功能是它可以将网格从TISE模拟中更改。这允许您在较小的模拟域中求解TISE,并使用较大的模拟域进行时变模拟。可以使用fiend_linpol_prepare_tdse --help获取选项的完整列表。如果未给出某些选项,则使用求解TISE时使用的值。例如,如果您只想增加网格域的半径,请只提供--radius X,其中X是新的半径。
可以使用以下选项将复杂吸收势(CAP)包含在时传播模拟中
--cap_width,它设置吸收器从域边界的宽度
--cap_height,它设置吸收器的强度
还可以轻松实现其他吸收器,例如平滑外部复尺度。
prepare_tdse使用PETSc二进制格式保存以下文件
data/tdse_CAP*,包含CAP矩阵的虚部
data/tdse_H0* 包含哈密顿矩阵的时间不变部分
data/tdse_S* 包含重叠矩阵
data/tdse_rho* 包含偶极矩矩阵的
分量
data/tdse_Z* 包含偶极矩矩阵的 z 分量
data/tdse_partialRho* 包含
的矩阵元素
data/tdse_partialZ* 包含
的矩阵元素
data/tdse_state_N* 包含 TDSE 网格中定态向量的表示
此外,fiend_linpol_prepare_tdse 将新的网格保存在 data/tdse_mesh.h5 中,并在 data/config 中 附加 新的配置参数。
注意:重叠矩阵有三种版本,分别是 S、S0 和 S1。 S 是纯重叠矩阵,S0 中与 Dirichlet 边界对应的行被置零,而 S1 与 S0 相似,但它将零行对角线上的元素置为 1。对于所有其他矩阵,与 Dirichlet 边界对应的行总是被置零。
步骤 3. 传播
现在您必须加载支持 复数 的 Python 包 petsc4py、slepc4py 和 mpi4py。在 docker 图像中,可以使用 ml petsc/complex 来完成此操作。遗憾的是,目前(截至版本 2018.1.0),FEniCS 不支持复数的 PETSc,因此我们必须使用两个不同的 Python 包版本,但希望在未来不久我们可以解决这个问题。
可以使用 fiend_linpol_propagate 命令实现时间传播。它读取步骤 2 中准备的矩阵,并使用这些矩阵进行时间传播。可以使用 fiend_linpol_propagate --help 打印出完整的选项列表。
请注意,您可以使用 --save_interval 请求保存频率。例如,--save_interval 10 表示每 10 个时间步保存一次。时间传播将数据保存到
data/tdse_observables.npz,它包含每个可观察量的数组(除了密度)
data/tdse_wavefunction/realpart_iteration_N_real,它是一个表示波函数实部的展开系数的 PETSc 向量,在保存点 N
data/tdse_wavefunction/imagpart_iteration_N_real,它是一个表示波函数虚部的展开系数的 PETSc 向量,在保存点 N
data/config,其中它附加新的配置选项
设置激光场
可以使用选项 --vecpot path 来设置激光场。文件应该是
一个两列文件,其中第一列是时间,第二列是矢量势的时间相关部分,或者
一个多脉冲配置,定义矢量势的时间相关部分,每个波长通道定义为
[Pulse1] A = 0.1 w = 0.0569 k = 0 tcenter = 0 cep = 0.05 fwhm = 150
在这里,A 是电场峰值幅度,w 是载波频率,k 是啁啾,tcenter 是包络最大值的时间,cep 是载波包络相位,fwhm 是包络半峰全宽。
步骤 4. 后处理
--save 选项用于后处理脚本的保存功能,将图形保存到 data/figures,将数据保存到 data/postprocessing。
animate_density
该脚本从 data/tdse_wavefunction/ 读取数据,并动画显示电子密度。使用 Docker 时需要 FEniCS(ml petsc/real)。
draw_norm
用于绘制作为时间函数的范数。
draw_dipole / draw_velocity / draw_acceleration
绘制偶极矩/偶极速度/偶极加速度作为时间函数,以及相应的频谱和频谱的STFT。
draw_pes
绘制角积分和角分辨光电子谱。可以使用 MPI 加速谱的计算。
PETSc 和 SLEPc 选项
PETSc 和 SLEPc 有许多选项来微调它们的操作。所有传递给脚本 PETSC_ARGS 后的参数都用于初始化 PETSc 选项数据库,而之前的参数保留在 sys.argv 中,并用于 FIEND 的 argumentparser。
安装
使用 Docker
我们建议使用 Docker 镜像在个人电脑上运行模拟。对于超级计算机和集群,我们建议从源代码安装整个包或使用 pip 安装。
要使用准备好的 Docker 镜像,首先将 Docker <https://dockerd.com.cn> 安装到您的 PC 上。可以使用以下命令获取 fiend <https://hub.docker.com/r/solanpaa/fiend> 的 Docker 镜像:docker pull solanpaa/fiend。请注意,镜像大小约为几 GB。
默认情况下,运行交互式过程的 Docker 镜像,
docker run -it fiend
将您置于 Unix 命令行界面。所有脚本都已预安装,您可以使用 ml petsc/real 和 ml petsc/complex 命令在复数和实数 PETSc 安装之间切换。
要启用脚本的 GUI,您应该使用在 HOST 机器上执行的命令来启动 Docker 容器(适用于 Linux)
$ xhost +local:docker
$ docker run -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix:ro -it fiend
由于您可能希望保存容器内计算的数据文件,您应该在 HOST 上创建一个 data 目录,并将其挂载到容器中:
$ docker run -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix:ro -v `pwd`/data:/home/fiend/data:Z -it fiend
这还允许您通过将激光参数保存到 HOST 上 data 目录中的文件来提供激光参数,并将参数 --vecpot data/filename 传递给 docker run fiend fiend_linpol_propagate。
对于非交互式使用,您可以将上述命令参数及其对应的脚本及其参数一起传递,例如:
$ docker run -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix:ro -v `pwd`/data:/home/fiend/data:Z fiend fiend_linpol_tise --radius 10 --how_many 3
可以使用 docker run 的 -e OPENBLAS_NUM_THREADS N 标志实现线性代数后端的并行化。可以通过环境变量 NMPIPROC 实现MPI并行化模拟,例如:
$ docker run -e NMPIPROC=3 -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix:ro -v `pwd`/data:/home/fiend/data:Z fiend fiend_linpol_tise --radius 10 --how_many 3
使用pip安装
pip3 install fiend 应该可以解决问题。请注意,您需要手动安装实部和复部PETSc、SLEPc、petsc4py、slepc4py和FEniCS套件。
从源代码安装
fiend包托管在 GitLab <https://gitlab.com/qcad.fi/fiend>_。
python3 setup.py install 应该会安装该包。请注意,您需要手动安装实部和复部PETSc、SLEPc、petsc4py、slepc4py和FEniCS套件。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。
源分布
构建分布
fiend-1.0.3.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | aac475200793398a0c04d01467f368f986004e806a65f1751657a5df6d35c1e9 |
|
MD5 | 423ab55518815b3442e366ba29893498 |
|
BLAKE2b-256 | 3f650849829a0095b94df5e1fa0d5f32bf2d02b269929a9e9ddcd2e71f455f6c |
fiend-1.0.3-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7dbeb2ae59e32afa1a82d59f0eab1c49a1ec96f230d1cc8e38e878ecd4641fc1 |
|
MD5 | 3759f787ecdd46cb5fde3b8f15226088 |
|
BLAKE2b-256 | a4dd16b112ee216dfd335262bf3fbe70649635265ad27263489ff9f7f57b072e |