使用GULP(General Utility Lattice Program)拟合经典势能模型的方法

GULP(General Utility Lattice Program)

链接地址:http://gulp.curtin.edu.au/gulp/

这是一个采用经典势能模型的计算平台,可以在经典势场模型的基础上计算很多物性,包括结构优化,声子计算,热输运,缺陷以及分子动力学等相关计算。

在这些物性计算的基础上,就可以进一步开展经典势能模型的参数拟合,因为经典分子动力学计算的准确程度完全取决于原子间作用模型的准确性和参数的合理性。

GULP使用需要制备一个.gin文件,内部包含Keywords和Options,所有关键词和选项参数可参考链接 http://gulp.curtin.edu.au/gulp/help/help_52_txt.html

势能拟合关键词只需要fit,拟合变量为相应势能模型的参数,拟合目标物理量分为两类:

第1类是structure相关的derivatives,即晶格参数如cell或vector内自由度以及晶胞内原子位置的自由度,由相应flag控制是否拟合,拟合时认为给出的cell或vector或原子相应位置处derivatives为0,可理解为给出结构处各原子在平衡位置,晶胞参数在相应取值处应力为0,相应的权重利用default_weight grad 1.0设置,即默认每个flag控制的权重为1;

第2类是除了structure相关derivatives的物理量,即在每组结构下observable内设置,可以是给出结构的能量,弹性系数,声子谱等。

因此,在开始势能拟合前,先要了解gulp内相应势能模型的表达式和参数设置,进行势能拟合可在.gin文本文件内使用fit关键词,然后利用选项

default_weight

改变势能拟合权重的默认值:

angle angle observable 1.0
bond bond length observable 1.0
cell_length cell parameter weight in relax fit 1000.0
cell_angle cell parameter weight in relax fit 1000.0
coord Cartesian coordinate weight (0-2-D) 1000.0
dipole dipole moment 10.0
elastic elastic constant tensor component 0.01
energy energy (absolute or reaction) 1.0
frac fractional coordinate in relax fit (3-D) 10000.0
freq vibrational frequency or phonon mode 1.0
grad gradient in a conventional fit 1.0
modulus bulk or Young's modulus 1.0
stress stress value in conventional fit 1.0

通常的拟合值在结构后的observable内设置,即每个独立结构(包含cell或vector以及原子坐标cood或frac),都设置observable,可以拟合的物理量包括:

elastic hfdlc sdlc energy bulk_modulus shear_modulus weight gradients hfrefractive_index srefractive_index piezoelectric frequency gradient potential entropy bornq monopoleq cv stress qreaxff fbond fangle reaction young poisson coordno sqomega volume fenergy

如果需要考虑晶格常数以及原子坐标等,可以额外添加一个晶胞结构,并打开vector或者cell后相应flags即可,注意可更改default_weight中晶格默认权重1000。如果要拟合晶胞,则关键词fit后不能添加noflag。

因此GULP中提供了势能模型参数的拟合,这里以sw势能模型为例,简单做一个介绍:

1.采用不同组能量进行拟合

关键词用fit,为了提高效率,可以再加入noflag,这样就不计算每组结构的力,仅对能量进行拟合

关键词后开始放入多组用于拟合的晶体结构和能量,每组包括描述结构的vectors或者cell,如:

vectors
7.2836 0.000000 0.000000
0.000000 9.0228 0.000000
0.000000 0.000000 20
0 0 0 0 0 0      #晶格参数的变化flag,用于晶格优化
Cartesian   #使用时默认单位angstrom
S2 core 0.899778 1.01243 1.62439 0 1 0 0 0 0    #最后3个为每个原子坐标变化的自由度flag,即在想yxz方向是否可动
S2 core 4.56721 1.01518 1.63963 0 1 0 0 0 0
Ge1 core 2.73844 2.6256 1.39913 0 1 0 0 0 0
Ge1 core 6.38759 2.65297 1.39224 0 1 0 0 0 0
.....

observable
energy
-41564.246628349894 1.0
end
shift
-41551.228686
注意:每组的能量都是放置在observable....end之间,即表示拟合用的观测量,这里是能量,用energy,由于通常采用第一性原理计算,所以拟合时能量的准确数值没有必要完全相同,因此在第一组结构后还加入shift,表示在这个量上减去偏移量,再进行拟合,这个shift也可以作为一个拟合变量,需要在最后一组结构后加入:

variables
shift
end
表明shift也是一个拟合变量

最后根据势能模型,给出势能初始参数以及是否变化的flag,比如对sw,包括2体势能sw2和sw3的3体描述角度的势能

sw2
Ge1 S2    2.090   0.350  18.371   0.000   2.926 1 0 1
S1  Ge2   2.090   0.350  18.371   0.000   2.926 1 0 1
.....

拟合时要求数据量大于变量数目,测试用4800组第一性的计算结果拟合,并且也可以在每组结构中加入space空间群的描述,就可以拟合中考虑对称性

2.采用能量和力进行拟合

同上,只是关键词不需要加入noflag

注意,在每组原子结构中

Cartesian
S2 core 0.899778 1.01243 1.62439 0 1 0 0 0 0
......

observables
energy
-41564.246628349894 1.0
gradients
1 0.006756431721086923 -0.0066830013827219575 0.003624256995566136 0.03125
....

end

并且在observables中加入gradients,对应每个原子序号以及x,y,z的受力,拟合用的权重

当然还可以加入其它一些力学性质等构建拟合的损失函数,详见官网给出的教程中observables参数

3.采用声子谱计算数据进行拟合

关键词还是fit

给出晶体结构和原子坐标描述后,在observables中加入frequency,比如:

observable
frequency 72
1 0.0000 1 1.0
2 0.0000 1 1.0
3 0.0000 1 1.0
......

end

frequency后的数字表示拟合用声子频率的数据数目,即之后数据的行数

每一行包括:声子是哪一支(晶胞内4个原子,则有4*3=12支声子) 频率拟合值(cm-1)  k点的序号  权重

其中k点序号是对应于之后kpoints参数里的k点排列位置,如最后给出kpoints的信息:

kpoints
0.000000  0.000000  0.000000
kpoints
-0.500000  0.000000  0.000000

.......




  

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,以下是一个使用 `gulp-useref` 并过滤指定 js 文件的示例: ```javascript const gulp = require('gulp'); const useref = require('gulp-useref'); gulp.task('build', function() { return gulp.src('src/*.html') .pipe(useref({ searchPath: ['src', '.'] })) // 过滤掉不需要处理的 js 文件 .pipe(gulp.dest('dist')); }); ``` 在这个示例中,我们使用 `gulp-useref` 来处理 HTML 文件,并将注释块中引用的 JS、CSS 文件并到一个或多个文件中。同时,我们通过 `searchPath` 属性指定了搜索路径,这样 `gulp-useref` 就能够正确地解析 HTML 文件中的相对路径了。 接着,我们通过 `pipe` 方法将处理后的文件输出到 `dist` 目录中。在这个过程中,我们也可以使用 `gulp-if` 来过滤掉不需要处理的文件。例如,如果我们只想处理所有 `src` 目录下的 JS 文件,可以这样写: ```javascript const gulp = require('gulp'); const useref = require('gulp-useref'); const gulpIf = require('gulp-if'); gulp.task('build', function() { return gulp.src('src/*.html') .pipe(useref({ searchPath: ['src', '.'] })) // 只处理 src 目录下的 js 文件 .pipe(gulpIf('**/*.js', gulp.dest('dist'))) .pipe(gulp.dest('dist')); }); ``` 在这个示例中,我们使用 `gulp-if` 来过滤掉不需要处理的 JS 文件,而只处理 `src` 目录下的 JS 文件。这样,我们就能够只处理我们需要的文件了。 希望这个回答能够帮到你,如果你还有其他问题,可以继续问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值