跳转到主要内容

有限元纳米尺度动力学

项目描述

概述

FIEND 是一个用于模拟圆柱对称系统中时间相关单粒子量子力学的软件包。这包括在线性偏振激光场中的原子和线性分子、金属纳米锥和纳米簇等系统。

FIEND 使用 FEniCS FEM 工具包进行网格划分和组装系统矩阵,并使用 PETScSLEPc 进行高性能线性代数。

包结构

包结构如下

.
├── 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)(在 哈特里原子单位)中是

https://latex.codecogs.com/svg.latex?\Large&space;\mathrm{i}\partial_t\vert{\psi(t)}\rangle=\hat{H}(t)\vert{\psi(t)}\rangle,~\vert{\psi(t=0)}\rangle=\vert\psi_0\rangle

其中 ket_psi_td 是时间演化的态,ket_psi_0 是初始态,Ht 是时间依赖的哈密顿算符,其时间不变部分由 H0 给出,其中具有静态势 V

时间不变哈密顿量的定态可以通过时间不变薛定谔方程(TISE)求解。

https://latex.codecogs.com/svg.latex?\Large&space;\hat{H_0}\vert\psi_k\rangle=E_k\vert\psi_k\rangle,

其中 Ekpsik 分别是第 i 个本征能量和本征态。

在典型配置中,时间传播的初始状态 ket_psi_0 是静态态之一。

理论背景

有关TISE和TDSE离散化的描述,请参阅 MyArticle

简而言之,我们假设磁量子数为零 m=0 来描述我们的系统,这在圆柱坐标系中进行。这使我们能够在圆柱坐标系统的2D切片中描述系统。我们选择TISE和TDSE的模拟域 omegatiomegatd 并用无结构三角网格进行网格划分。请注意,模拟域可以不同,例如,如果需要,您可以增加TDSE计算的模拟域。

网格划分后,选择基函数。它们是具有网格单元紧支集的Lagrange多项式,直到某个程度n。网格划分和选择基函数使我们能够将薛定谔方程离散化为

https://latex.codecogs.com/svg.latex?(\mathbf{T}+\mathbf{V})\boldsymbol\psi_k=\mathbf{S}E_k\boldsymbol\psi_k

https://latex.codecogs.com/svg.latex?\mathrm{i}\mathbf{S}\boldsymbol{\psi}(t)=\left(\mathbf{T}+\mathbf{V}+\mathbf{W}\right)\boldsymbol\psi(t),

其中 psiti 是静态态实值展开系数的向量,psitd 是时间依赖态复值展开系数的向量,在Lagrange多项式基下的系统矩阵 basis 由以下给出

https://latex.codecogs.com/svg.latex?\Large&space;\mathbf{S}_{ij}=\langle\psi_i\vert\psi_j\rangle, https://latex.codecogs.com/svg.latex?\Large&space;\mathbf{T}_{ij}=-\frac{1}{2}\sum\limits_{\alpha=\rho,z}\langle\partial_\alpha\phi_i\vert\partial_\alpha\phi_j\rangle, https://latex.codecogs.com/svg.latex?\Large&space;\mathbf{V}_{ij}=\langle\psi_i\vert{V(\rho,z)}\psi_j\rangle,

https://latex.codecogs.com/svg.latex?\Large&space;\mathbf{W}_{ij}=\langle\psi_i\vert{W(\rho,z,\partial_\rho,\partial_z)}\psi_j\rangle.

这里自然内积是

https://latex.codecogs.com/svg.latex?\Large&space;\langle\chi\vert\psi\rangle=\int\limits_{\Omega_{\mathrm{TI}/\mathrm{TD}}}\chi^*(\rho,z)\psi(\rho,z),\rho,\mathrm{d}\rho,\mathrm{d}z.

请注意,我们在 rho0 处施加了连续边界条件,并在边界其他地方施加了零Dirichlet或零Neumann边界条件。

相互作用

默认情况下,我们实现了三种类型的激光-物质相互作用 Wint

对于线性偏振矢量势的长度规范下的偶极近似 Alin

https://latex.codecogs.com/svg.latex?\Large&space;W=z\partial_t{f(t)}

长度标度下线偏振矢量势的偶极近似Alin

https://latex.codecogs.com/svg.latex?\Large&space;W=-\mathrm{i}f(t)\partial_z

和非均匀矢量势Anh

https://latex.codecogs.com/svg.latex?\Large&space;W=f(t)\mathbf{A}_s\cdot\mathbf{\hat{p}}+\frac{1}{2}f(t)^2\Vert\mathbf{A}_s\Vert^2.

使用FIEND

一次时变模拟包含4个步骤

  1. 求解时不变系统以获得初始状态

  2. 准备系统矩阵进行时演

  3. 时演

  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.shdemos/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* 包含偶极矩矩阵的 rho 分量

  • data/tdse_Z* 包含偶极矩矩阵的 z 分量

  • data/tdse_partialRho* 包含 partialrho 的矩阵元素

  • data/tdse_partialZ* 包含 partialz 的矩阵元素

  • data/tdse_state_N* 包含 TDSE 网格中定态向量的表示

此外,fiend_linpol_prepare_tdse 将新的网格保存在 data/tdse_mesh.h5 中,并在 data/config附加 新的配置参数。

注意:重叠矩阵有三种版本,分别是 SS0S1S 是纯重叠矩阵,S0 中与 Dirichlet 边界对应的行被置零,而 S1S0 相似,但它将零行对角线上的元素置为 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 来设置激光场。文件应该是

  1. 一个两列文件,其中第一列是时间,第二列是矢量势的时间相关部分,或者

  2. 一个多脉冲配置,定义矢量势的时间相关部分,每个波长通道定义为

    [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/realml 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套件。

作者

Janne Solanpää

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分布

fiend-1.0.3.tar.gz (74.5 kB 查看哈希值)

上传时间 源代码

构建分布

fiend-1.0.3-py3-none-any.whl (98.4 kB 查看哈希值)

上传时间 Python 3

支持者: