关于KMCLib中的Move
关于KMCLib中的MOVE相关的东西涉及到坐标和各种索引,这里比较混乱我觉得还是有必要梳理下。
move来源于process并作用于configuration。
Process中的move相关
Process中与move相关的变量:
std::vector<int> move_origins
说明在process中那些元素是在process发生时有移动的,(0, 1)的话就是指第一个(中心)和第二个元素发生了移动。std::vector<Coordinate> move_vectors
对应move_origin的元素移动的向量。std::vector< std::pair<int,int> > id_moves_
用于描述元素移动前后位置的变化,通过元素在process中的minimal_match_list中的索引号来表示,例如
id_moves_[0]中存放着两个值 (1, 4),则就说明在minimal_match_list中的第1号元素(也就是第二个)通过process的作用之后会移动到第4号位置上。变化如下图所示:
因此对应上图的id_moves_的内容为:1
<1, 4>, <4, 2>, <2, 0>, <0, 1>
Process中相关的成员方法
有process只是描述变化的信息,因此只要把移动相关的索引值和移动向量添加到process的minimal_match_list中即可,麻烦的操作在configuration那里。
Configuration中的move相关
Configuration与move相关的成员变量
int n_moved_
记录在一次process执行时有多少元素发生了改变(只要是前后元素类型不一致且不是通配符的时候,这个值就自加1,每次执行process时这个值会先重置。std::vector<int> moved_atom_ids_
记录在process中有移动过的元素的全局id号,例如若其中的值为:1
| 1434 | 150 | ...
则代表id为1434和150的元素发生了移动
std::vector<Coordinate> recent_move_vectors_
存储对应moved_atom_ids元素的移动向量值std::vector<std::string> elements_
与move间接相关,以为位置的移动会改变elements的排列。std::vector<int> types_
与上一条的原因相同std::vector<std::string> atom_id_elements_
这个值其实与移动无关,毕竟移动并不会改变id对应的元素类型,但是process仍然会造成这个值的改变,不是移动,而是通过直接的替换。std::vector<int> atom_id_
因为移动,所以必定会造成id之间的互换。std::vector< std::vector<MinimalMatchListEntry> > match_lists_
全局晶格的元素发生了移动或者替换,必定需要更新configuration的match_lists_中的数据,但是其实只需要更新match_type就好了,位置不会变(晶格没有变动),configuration的minimal_match_list不存储移动相关的数据。
Configuration与move相关的成员函数
performProcess()
1
2
3void Configuration::performProcess(Process & process,
const int site_index,
const LatticeMap & lattice_map)不得不吐槽这个函数让我看了很久,不过也要感谢这个函数,他让我把KMCLib的最难理解的部分搞清楚了。
这个函数中同时移动着5个迭代器1
2
3
4
5
6
7
8
9
10// 遍历process中的minimal_match_list
auto it1 = process_match_list.begin();
// 遍历全局晶格中某点的minimal_match_list
auto it2 = site_match_list.begin();
// 下面三个都用于用记录信息的
auto it3 = process.affectedIndices().begin();
auto it4 = moved_atom_ids_.begin();
auto it5 = recent_move_vectors_.begin();
我在这里决定把这个函数贴上来通过注释的方式解读这段代码:
1 | void Configuration::performProcess(Process & process, |
void Configuration::updateMatchList(const int index)
process执行过后需要对configuration的match_lists_进行更新,但是这里只需要对里面的match_type进行更新就可以了。
但是这个成员是对minmal_match_list的更新时针对一个index的minimal_match_list的,所以我猜测后面他会用他对发生反应的周围nearst neighbor和the next nearst neighbor的每个index。