有限元纳米尺度动力学
项目描述
概述
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://www.docker.com> 安装到您的 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 |