最近在处理的结构的时候,本来是正交的晶胞,由于我切了某个面以后,变成了非正交的了(比如说a和b并不垂直,但是c还是垂直于ab构成的平面)。懒人做法当然是上网搜教程啦~~~~,这里的内容我是从b站学习来的,有兴趣可以去原地址看视频:BV16a4y1R7qB,在B站搜索即可,我也是学习原视频学来的。
其实方法非常简单。比如说POSCAR文件,我们仅仅讨论两个不垂直的晶格矢量a和b:


这时需要考虑的是,是否存在一个线性变换,使得这两个矢量a和b可以正交。

正交的条件非常好定,只需要两个矢量a和b的余弦值为0即可(在计算机中,可以设置一个非常小的值代替0),我们现在得到条件1:

再来看看条件2。对于晶体而言,最重要的就是周期性条件,再结合一下对于POSCAR中3个矢量的理解。不难得到,变换矩阵的4个值都必须为整数,我们得到条件2:

接下来就是另一个问题,我们建系是在右手系下建立的,那么在变换以后也必须满足右手系。由行列式公式:

我们可以知道,要想保证变换后的两个矢量和c 满足右手系,这只需要这个变换矩阵的行列式为正的即可,我们得到条件3:

好了,我们已经得到这个矩阵的所有约束条件了,但是还缺一个最小化的条件4:

这样一来,我们就可以通过这样一个非线性规划问题(我没学过什么算法啊,这算是非线性规划还是线性规划啊。。。。。??????),得出来我们想要的这个矩阵。对于计算机求解,看似有点困难。但是非常幸运的是,这个矩阵中的4个数字都是整数,这样一来我们可以使用嵌套循环的方式就可以轻松解决这个问题啦!下面附Fortran代码:
1 | module fun |
别看套了4个循环,效率还可以。需要自己改误差参数以及矢量的分量值。输出的结果右4个数字,就是x1,x2,x3,x4的值,最后一个值是最小化的值,用来判断是否出错。
改完以后就可以用M某软件重新定义晶胞操作(具体可以Google一下怎么做),即可得到正交后的晶胞(但是不是立方,仅仅只能正交)。对于三个矢量都不垂直的情况,可以再探究探究。需要注意的是,重新定义后的正交晶胞的体积会变大,M某软件会提示你体积变大了多少倍,所以最后还要自己看情况调整。
最后最重要的是,任何变幻出来的正交胞,需要自己再三确认是否是原来的结构!!!!!!!!!!!!!!这非常重要,可以使用XRD辅助检验,一定要手动检查。
懒人最近的施工计划:
KNN最近邻算法
基于高斯核函数的密度估计算法
晶体空间群识别算法(这个论文还没看完捏~~)
就这样啦,拜拜~~~~