Skip to content

Commit

Permalink
update Computational Physics.
Browse files Browse the repository at this point in the history
  • Loading branch information
houhuawei23 committed Jan 11, 2025
1 parent 86955d0 commit 02ea9d3
Show file tree
Hide file tree
Showing 8 changed files with 264 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ Distributed task allocation algorithm for heterogeneous unmanned aerial vehicle

Overall_flowchart_of_the_coalition_formation_game_model

![alt text](images/Overall_flowchart_of_the_task_allocation_algorithm_based_on_coalition_formation_game.png)
<p align="center"> <img src="images/Overall_flowchart_of_the_task_allocation_algorithm_based_on_coalition_formation_game.png" width=50%/> </p>

Overall_flowchart_of_the_task_allocation_algorithm_based_on_coalition_formation_game

Expand Down
6 changes: 6 additions & 0 deletions Learn/LearnMordenCpp/Note.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@
- [RVO and NRVO](https://pvs-studio.com/en/blog/terms/6516/)
- [github: Mq-b/ModernCpp-ConcurrentProgramming-Tutorial](https://github.com/Mq-b/ModernCpp-ConcurrentProgramming-Tutorial)

awesome repositories:

- [github: awesome-cpp](https://github.com/fffaraz/awesome-cpp)
- cli arg parse:
- [github.com: p-ranav/argparse](https://github.com/p-ranav/argparse)

## Misc

### Smart Pointers
Expand Down
192 changes: 188 additions & 4 deletions Misc/ComputationalPhysics/MDsim.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Molecular dynamics simulations

- [Molecular-Dynamics-Simulation: 樊哲勇](https://github.com/brucefan1983/Molecular-Dynamics-Simulation)
- [恒温分子模拟与热浴(NVT Ensemble and Thermostat)](https://bohrium.dp.tech/notebooks/3323483662)

## 理论基础

Expand Down Expand Up @@ -121,6 +122,11 @@ $$

### 经典统计力学

- 统计系综和统计分布函数
- 微正则系综
- 正则系综
- 正则系综在理想气体体系中的应用

> TODO
#### 统计系综和统计分布函数
Expand All @@ -129,6 +135,16 @@ $$

#### 正则系综

麦克斯韦 (James Clerk Maxwell) 速度分布函数

如果将动量换成速度 $\mathbf{v}$, 我们可立刻写出速度分布函数:

$$
f_{\mathbf{v}}(\mathbf{v}) \text{d}v_x \text{d}v_y \text{d}v_z
= \left( \frac{m}{2\pi k_{\rm B} T} \right) ^{3/2}
e^{- \frac{m(v_x^2+v_y^2+v_z^2)}{2k_{\rm B} T}} \text{d}v_x \text{d}v_y \text{d}v_z.
$$

#### 正则系综在理想气体体系中的应用

## Sim
Expand Down Expand Up @@ -275,6 +291,115 @@ $$

给定一个多粒子体系的初始状态(坐标和速度),根据各个粒子之间的相互作用力就可预测该体系的运动状态,即任意时刻各个粒子的坐标和速度。该预测过程本质上就是对运动方程的数值积分。

### 三斜盒子

一个正交盒子(左)与一个三斜盒子(右)。

![](./images/box.png)

对 $3 \times 3$ 矩阵的行列式,有如下计算公式:

$$
\det(H) = a_x (b_y c_z - c_y b_z) +
b_x (c_y a_z - a_y c_z) +
c_x (a_y b_z - b_y a_z).
$$

三斜盒子情况下周期性边界条件

### 近邻列表加速计算

- 自动判断何时更新近邻列表
- 构建近邻列表的平方标度算法
- ~线性标度算法

#### 自动判断何时更新近邻列表

![](./images/neighbor.png)

之前在计算原子间相互作用力时,需要计算所有原子两两之间的作用力,计算量为 $N^2$ 级别,计算量较大。

可以为每个原子维护一个近邻列表,只需计算近邻列表内原子之间的相互作用力即可,大大减少计算量。

近邻列表更新的时机,既可按照某种固定频率决定,也可根据体系原子坐标的变化自动判断。
如下的算法可实现近邻列表更新时机的自动判断:

- 在程序的开头定义一套额外的坐标 $\{\mathbf{r}^0_i\}$,每个原子的每个坐标分量都初始化为 0。
- 在积分过程的每一步,对每个原子 $i$ 计算距离
$$
d_i = |\mathbf{r}_i - \mathbf{r}^0_i|,
$$
其中 $\mathbf{r}_i$ 为原子 $i$ 的当前坐标。
然后,计算这些距离中的最大值 $d _{\rm max}$。
- 若 $2d _{\rm max}>\delta$,则更新近邻列表,同时更新 $\{\mathbf{r}^0_i\}$:
$$
\mathbf{r}^0_i = \mathbf{r}_i.
$$

#### 构建近邻列表的平方标度算法

先讨论一个简单的平方标度算法。

- 首先,我们定义近邻列表。一个近邻列表指定了研究体系中每个原子的近邻个数,即与所考虑原子距离小于 $R _{\rm c}$ 的原子个数。
- 我们记原子 $i$ 的近邻个数为 $NN _{i}$。除此以外,确定一个近邻列表还需要知道原子 $i$ 的所有这 $NN _{i}$ 个近邻的指标。
- 我们记原子 $i$ 的第 $k$ 个邻居的指标为 $NL _{ik}$。因为我们在求力的时候将利用牛顿第三定律,所以在构建近邻列表时也要求一个原子的近邻指标大于原子本身的指标,即 $i < NL _{ik}$。
- 这样定义的近邻列表最早由 Verlet 提出 \cite{verlet1967pr},所以称为 Verlet 近邻列表。
- 一个很自然的构建近邻列表的算法是检验所有的粒子对的距离。这显然是一个
$\mathcal{O}(N^2)$ 复杂度的算法。

#### ~线性标度算法

本节介绍一个 $\mathcal{O}(N)$ 复杂度的算法,即所谓的线性标度算法。在分子动力学模拟中最早提出此类方法的可能是 Quentrec 和 Brot \cite{Quentrec1973jcp}。

![](./images/cell-list.png)

该算法的主要思想有以下两点:

- 整个模拟盒子被划分为一系列小胞,每个胞的任何厚度不小于近邻列表的截断半径 $R_{\rm c}$。图 \ref{fig-chapter-3-cell-list} 展示的是二维空间的情形,且每个小胞的边长刚好等于 $R_{\rm c}$。
- 对任何原子,只需在 27 个小胞(一个是原子所在的胞,另外 26 个是与该胞紧挨着的)中寻找近邻原子。 图 \ref{fig-chapter-3-cell-list} 展示的是二维空间的情形,只需在 $1+8=9$ 个小胞寻找近邻原子。

先看第一点。首先,我们需要确定将整个体系划分为多少个小胞。我们针对一般的三斜盒子来讨论。对于三斜盒子,我们需要计算三个厚度。在垂直于平面$\mathbf{b} \times \mathbf{c}$ 的方向,盒子厚度为

$$
L_a = V / A_{bc}.
$$

其中,$A_{bc}$ 代表盒子矢量 $\mathbf{b}$ 和 $\mathbf{c}$ 所在面的面积:

$$
A_{bc} = \| \mathbf{b} \times \mathbf{c} \|.
$$

类似可定义其他两个厚度:

$$
L_b = V / A_{ca};
$$

$$
L_c = V / A_{ab};
$$

将厚度除以近邻的截断半径并向下取整,就得到每个盒子矢量方向的小胞个数:

$$
N*{a} = \lfloor L_a / R*{\rm c} \rfloor;
$$

$$
N*{b} = \lfloor L_b / R*{\rm c} \rfloor;
$$

$$
N*{c} = \lfloor L_c / R*{\rm c} \rfloor.
$$

总的小盒子个数为

$$
N _{\rm cell} = N_a N_b N_c.
$$

## Program

### main 主控函数
Expand All @@ -294,9 +419,68 @@ $$

TODO:

- 计算并输出温度/动能/势能
- 可视化 X-Time 图,分析 X 量随时间的变化规律
- 计算并输出温度/压强/动能/势能
- 可视化 X-Time 图,分析 X 量随时间的变化规律 ok
- 输出轨迹: 即每一时刻各粒子的坐标和速度
- 使用 ovito 可视化
- 输出速度,验证速度是否以及何时满足麦克四位分布
- 使用 ovito 可视化 ok
- 输出速度,验证速度是否以及何时满足麦克斯韦分布
- 验证体系动量守恒,角动量不守恒
- 径向基函数 (RDF)
- 表征粒子的空间分布并提供对系统结构的深入了解
- Mean Squared Displacement (MSD) 均方位移
- 测量粒子随时间移动的距离并帮助确定系统的扩散特性
- Velocity Autocorrelation Function (VACF) 速度自相关函数
- 确定粒子速度如何随时间相关
- 了解扩散和弛豫时间等传输特性
- 实现近邻列表技术,加速计算 ok
- 探索使用 GPUMD 加速模拟
- 在某个样例上,分别使用 Lammps 和 我们的 MDsim 进行模拟,比较结果
- ??

#### 计算并输出温度/动能/势能

#### 输出轨迹(粒子位置和速度),验证速度分布是否满足麦克斯韦分布

##### 1. 理论背景

麦克斯韦-玻尔兹曼分布描述了理想气体在热平衡状态下粒子速度的概率分布。其概率密度函数为:

$$
f(v) = \left(\frac{m}{2\pi k_B T}\right)^{3/2} 4\pi v^2 \exp\left(-\frac{m v^2}{2 k_B T}\right)
$$

其中:

- $v$ 是粒子速度的大小(标量速度)。
- $m$ 是粒子的质量。
- $k_B$ 是玻尔兹曼常数。
- $T$ 是系统的温度。

在模拟中,可以通过分析粒子的速度分布来验证是否符合该分布。

##### 2. 分析步骤

(1) 提取速度数据

从轨迹文件中提取所有粒子的速度分量(`vx`, `vy`, `vz`),并计算每个粒子的标量速度:

$$
v = \sqrt{v_x^2 + v_y^2 + v_z^2}
$$

(2) 计算理论分布

根据系统的温度 $T$ 和粒子的质量 $m$,计算麦克斯韦-玻尔兹曼分布的理论曲线。

(3) 绘制速度分布直方图

将粒子的标量速度绘制成直方图,并与理论分布进行比较。

(4) 拟合与验证

通过拟合直方图数据,验证其是否与理论分布一致。

#### 检验体系动量和角动量是否守恒

####

69 changes: 69 additions & 0 deletions Misc/ComputationalPhysics/Terms.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# Terms for CP

## 'Thermal Bath' or 'Thermal Reservoir'

'热浴'或'热储层' [wiki](https://en.wikipedia.org/wiki/Thermal_reservoir)

在物理学中,“热浴”是指一个能够与系统交换热量并保持恒定温度的外部系统。它通过吸收或释放热量来维持系统的温度稳定。

### 实验中的热浴

在实验中,热浴通常通过以下方式实现:

1. 恒温槽:使用恒温液体(如水或油)包围实验系统,通过加热或冷却维持恒定温度。
2. 珀尔帖元件:利用热电效应控制温度,常用于小规模实验。
3. 恒温器:通过反馈机制调节加热或冷却功率,保持系统温度恒定。

### 数值模拟中的热浴(以 LAMMPS 为例)

在 LAMMPS 中,热浴通过“恒温器”实现,常用的恒温器包括:

1. Nose-Hoover 恒温器:
```lammps
fix myfix all nvt temp 300.0 300.0 100.0
```
其中,`nvt`表示恒温恒容模拟,`300.0`是初始和目标温度,`100.0`是阻尼参数。
2. Berendsen 恒温器:
```lammps
fix myfix all temp/berendsen 300.0 300.0 100.0
```
该恒温器通过调节原子速度使系统温度趋近目标温度。
3. Langevin 恒温器:
```lammps
fix myfix all langevin 300.0 300.0 100.0 12345
```
该恒温器通过引入随机力和阻尼力来维持温度,`12345`是随机数种子。

### 总结

- 实验:通过恒温槽、珀尔帖元件或恒温器实现热浴。
- 数值模拟:在 LAMMPS 中,使用 Nose-Hoover、Berendsen 或 Langevin 恒温器实现热浴。

这些方法确保了系统在模拟或实验中的温度恒定。


## Ensemble 系综

- [zhihu](https://zhuanlan.zhihu.com/p/350907022)

系综是指大量性质和结构完全相同的、处于各种运动状态的、各自独立的系统的集合。

#### nve(微正则系综)

nve 系综保证系统中原子数量 n、体系总体积 v 和体系总能量 e 保持不变。

nve 系综没有控温的功能,初始条件确定后,在力场的作用下,原子速度发生变化,相应的体系温度发生变化。我们知道,体系总能量 e=势能+动能,温度发生变化,动能就会变化,势能和动能相互转换,总能量保持不变。

#### nvt(等温等压)

nvt 系综保证体系的原子数量 n、体积 v 和温度 t 保持不变。

nvt 系综下,模拟盒子 box 的尺寸不会发生变化,lammps 通过改变原子的速度对体系的温度进行调节。

#### npt(等压等温)

npt 系综保证体系的原子数量 n、压强 p 和温度 t 保持不变。

npt 系综不仅进行控温,还进行控压。和 nvt 一样,npt 系综通过调节原子速度调控温度,不同的是,npt 系综下 box 的尺寸可以发生变化。

npt 系综通过改变 box 的尺寸调节压力,比如,当体系压力超过设定值时,扩大 box 尺寸降低压力。
Binary file added Misc/ComputationalPhysics/images/box.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Misc/ComputationalPhysics/images/cell-list.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Misc/ComputationalPhysics/images/compare.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Misc/ComputationalPhysics/images/neighbor.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 02ea9d3

Please sign in to comment.