在Gaussian16中同时扫描两个反应坐标
本公众号之前推送过在高斯中的两种常见势能面扫描:
用高斯做势能面扫描(一):刚性扫描
用高斯做势能面扫描(二):柔性扫描
可能大家都熟知,在柔性扫描中如果写了两个扫描坐标,如
B 1 5 S 7 0.1
B 1 6 S 7 0.1
是依次扫描两个坐标,无法做到同时,因此得到的是一张二维势能面,总扫描点数是两个坐标扫描点数的乘积,计算量较大。然而有时候我们只想同时扫描两个反应坐标,即两个坐标同时改变,得到一条曲线。
例如,找[2+2]环加成反应的过渡态经常会碰到这种问题,对于复杂的分子结构,手动调整过渡态初猜很难合适,此时使用opt=ts找到过渡态的成功率自然也不高,这时候我们可能就想,取柔性扫描势能曲线(面)上的突跃点作为过渡态初猜,然而去扫两个坐标得到一张二维势能面未免过于耗时。
对于这种问题,笔者以往采用了两种做法:(1)写了一个小程序来产生调整键长后新的结构(不仅仅是拉进/远两个原子),然而产生的结构我并不满意,算法还需改进或者仍有bug。(2)若仅算一两步反应,那么就手动在GaussView里调整好两个键长,每次算完下载下来再调键长,这样扫描5个点就要下载、调整5次,甚是麻烦。
由于G16推出了广义内坐标(GIC)功能,于是笔者便研究了一下官网的说明
http://gaussian.com/gic/
琢磨出了一个同时扫描两个键长的文件模板。可能(大概率)这不是最优的方案,欢迎有更简洁做法的小伙伴们留言分享你的技巧,我们可以日后再出一期更新推送。
为简洁起见,本文以甲醛和水的加成反应(真空中)为例,示范如何写输入文件。
在这个反应中有两个主反应坐标(C−O键和O−H键)同时在动,单独去扫描C−O键或者O−H键能量都会一直升高,并不会有突跃点。为防止混淆,短横线−符号左边始终表示甲醛分子中的原子,符号右边则表示水分子中的原子。
当然,化学直觉较强的同学可以直接构造出这个简单反应的合理过渡态初始结构,但这招对复杂结构很难见效,因此有必要掌握同时扫描两个反应坐标的技巧。假设我们希望C−O键和O−H键按如下距离逐渐减小
C−O: 1.8, 1.7, 1.6, 1.5
O−H: 1.7, 1.5, 1.3, 1.1
则利用GIC功能的输入文件如下:
%chk=methanal_water.chk
%mem=24GB
%nprocshared=24
#p M062X/6-31G(d) nosymm geom=addgic
Title Card Required
0 1
C -1.13256115 -0.04504504 0.00000000
H -0.59939740 -0.97274996 0.00000000
H -2.20256115 -0.04504504 0.00000000
O -0.50552072 1.04600530 0.00000000
O -0.71081810 -0.28742611 1.83667749
H -0.42043150 -1.07235298 2.30695978
H -0.23246558 0.54490727 1.83667749
R15=R(1,5)
R47=R(4,7)
R15(value=1.8)
R47(value=1.7)
--Link1--
%chk=methanal_water.chk
%mem=24GB
%nprocshared=24
#p opt M062X/6-31G(d) nosymm geom(allcheck,addGIC) guess=read
R15(freeze)
R47(freeze)
--Link1--
%chk=methanal_water.chk
%mem=24GB
%nprocshared=24
#p M062X/6-31G(d) nosymm geom(allcheck,addGIC) guess=read
R15(value=1.7)
R47(value=1.5)
--Link1--
%chk=methanal_water.chk
%mem=24GB
%nprocshared=24
#p opt M062X/6-31G(d) nosymm geom(allcheck,addGIC) guess=read
R15(freeze)
R47(freeze)
--Link1--
%chk=methanal_water.chk
%mem=24GB
%nprocshared=24
#p M062X/6-31G(d) nosymm geom(allcheck,addGIC) guess=read
R15(value=1.6)
R47(value=1.3)
--Link1--
%chk=methanal_water.chk
%mem=24GB
%nprocshared=24
#p opt M062X/6-31G(d) nosymm geom(allcheck,addGIC) guess=read
R15(freeze)
R47(freeze)
--Link1--
%chk=methanal_water.chk
%mem=24GB
%nprocshared=24
#p M062X/6-31G(d) nosymm geom(allcheck,addGIC) guess=read
R15(value=1.5)
R47(value=1.1)
--Link1--
%chk=methanal_water.chk
%mem=24GB
%nprocshared=24
#p opt M062X/6-31G(d) nosymm geom(allcheck,addGIC) guess=read
R15(freeze)
R47(freeze)
其中R15和R47是新起的变量名,可以改成其他名称。而R(1,5)则表示1号和5号原子之间的距离。注意value并不能限制键长严格等于给定的值,只能是十分接近,这是高斯官网提到的(不过这点对普通用户并不重要)。
第一步是先用GIC调整两根化学键至目标键长,调整完成后会做单点计算,下一个任务--Link1--读取之,将调整好的键长冻结、做限制性优化;完成后再用GIC调整两根键至新的键长,算单点,再--Link1--读取之,将调整好的键长冻结、做限制性优化。。。如此几步下来就能同时让两根键缩短了。从始至终只用了一个gjf文件,中途无需人为干预,可以认为是达到了目的。完成后用GV 6.0打开log文件
会发现有很多任务,这是用了--Link1--造成的,只能打开一个个Optimization查看结构和能量,看在哪个任务处发生了突跃。这点不是很方便,后续如果没有发现更优的方案,笔者会考虑写个脚本从log里提取信息,避免这一步操作。
回到这个问题,经过查看后发现第三个任务是能量最高点,下一步能量就会下降了。将第三个任务中最后一帧结构另存为、提取出来作为过渡态初猜,经过10步可以收敛到正确的过渡态上
总结:本文用一个简单的反应展示了如何同时扫描两个反应坐标,该反应若仅扫描其中任何一个反应坐标都是得不到突跃点的。对于更密的扫描步长、及扫描键角等等,读者可根据文中提供的示例文件自己举一反三。
PS1:作为练习,感兴趣的读者可以自己试试找溴化氢HBr与乙烯或乙炔加成的过渡态,考验一下自己的化学直觉。若找不到的话,可试试本文的技巧。
PS2: GIC功能仅在>= G16 A版本才有,G09无法使用该功能。
- INET_ATON()函数在MySQL5.6版本和5.7版本的差异
- Linux主机之间ssh免密登录配置
- 远控木马Posion Ivy开始肆虐缅甸和其它亚洲国家
- Slf4j+Logback配置文件变量使用小记
- Storm消息处理可靠性保证
- git+github创建分支&提交并贡献代码(linux环境)
- 使用Nginx代理restful实现SSL链路加密
- 使用Nginx代理thrift NIO实现SSL链路加密
- TThreadedSelectorServer介绍及Direct Memory OOM分析
- 通过Java程序提交通用Mapreduce任务并获取Job信息
- Mapreduce 任务提交源码分析1
- Java分布式神经网络库Deeplearning4j 环境搭建和运行一个例子
- Java分布式神经网络库Deeplearning4j之上手实践手写数字图像识别与模型训练
- 调用腾讯优图开放平台进行人脸识别-Java调用API实现
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 形式化分析工具(六):HLPSL Tutorial(Example3)
- CODING DevOps + Nginx-ingress 实现自动化灰度发布
- TF入门04-TF实现Word2Vec
- TF入门03-实现线性回归&逻辑回归
- TF入门02-TensorFlow Ops
- 前端|利用Verify插件实现前端图像验证码
- 3分钟短文 | PHP位运算和逻辑运算,一个符号写两遍这么简单?
- 打卡群刷题总结0721——搜索二维矩阵
- NumPy进阶80题完整版|附Notebook版本下载
- 【LeetCode每日一题】21. Merge Two Sorted Lists
- 计算广告笔记06-程序化交易广告
- TF入门05-实验过程管理
- [LeetCode]709. To Lower Case
- ISO C forbids comparison between pointer and integer [-fpermissive]
- 【疑难杂症】解决-TensorFlow “FutureWarning: Conversion of the”