导言
- 硬件:个人电脑1(i5-8300H,32G,1050TI),个人电脑2(R5-5600,32G,3060-12G)学校的超级计算机,研究室的工作站。
- 资料来源:哔哩哔哩/YouTube,SegmentFault
应用方向偏物理学背景的数据分析,但是一切都是0基础开始的。Python基础入门我是通过在线学习进行的:https://vitu.ai/
在超级计算机上配置meep
设备:JAIST 超级计算机
因为要做一些FDTD/电磁学仿真,但是用个人PC又很蛋疼,所以就选择在超算上搭一个meep的仿真环境,这样会非常省时间。我所参考的是MEEP官方文档https://meep.readthedocs.io/en/latest/Installation/
miniconda 的安装
在自己的目录下建立一个python文件夹,学校超算已经预装了python3的环境,所以只要照着官方文档来安装就好了。
1 | wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh |
下载miniconda的包,是python3版本的。然后
1 | bash miniconda.sh -b -p <desired_prefix> |
注意这里的
之后
1 | export PATH=<desired_prefix>/bin:$PATH |
会报错
1 | export: command not found |
难道我的SHELL有问题??所以先查看SHELL信息
1 | echo $SHELL |
返回
1 | /bin/tcsh |
原来是tcsh不是bash!!怪不得报错。在这种情况下,直接回到本人账户目录下,手动添加path信息到.cshrc文件里就行了
1 | vim ~/.cshrc |
但是我多次测试之后还是无法执行,可能是因为账户权限限制导致(另外学校超算的SHELL为什么是tcsh而不是bash啊orz),就只能手动用setenv命令执行了
1 | setenv PATH "<desired_prefix>/bin" |
之后就成功了,缺点是估计下次使用conda命令时要重新手动执行一下这个命令。然后创建一个名字为mp的环境,在里面安装meep。这里的mp可以是任意名字的
1 | conda create -n mp -c chogan -c conda-forge pymeep |
然后就是漫长的安装过程了。安装好之后突然跳出这么一个错误:
1 | Exception('No compatible shell found!') |
没有管,继续
1 | conda activate mp |
结果报错了!提示用conda init来指定shell。
看来是SHELL的选择问题,只能手动来了,为了方便,我选择tcsh,所以输入
1 | conda init tcsh |
然后激活mp这个环境
1 | conda activate mp |
没有报错,并且目录前显示(mp),说明激活成功!!之后就应该可以使用了,但是为了方便使用,直接装一个Jupyter比较好,这里我也是参考官方的文档https://jupyter.org/install
在这个miniconda的目录下执行:
1 | conda install -c conda-forge jupyterlab |
之后就是漫长的安装与等待,有时会提示让升级conda的版本,这个是可以忽略的jupyterlab是jupyter notebook的下一代产品(替代品),因此我也就不安装jupyter notebook了。虽然也可以用pip命令来安装,但是要配置PATH太过复杂了所以就用conda命令了。在安装完之后,执行:
1 | jupyter lab |
就会跳出一个浏览器窗口,在里面可以使用jupyter lab了。
但是,在使用时发现找不到包!!可是conda list是有包的!
于是
1 | conda search pymeep |
返回
1 | Loading channels: done |
解决方法是配置一下conda,输入
1 | conda config --append channels conda-forge |
这个时候
1 | python -c 'import meep' |
就不会报错了,说明总体上是安装成功了,且能运行。但是可能会有其他问题,如
1 | AttributeError: module 'meep' has no attribute 'Vector3' |
但是我用同样的方法在虚拟机上安装,跑同样的代码就没有出现这个问题。很可能是超算上python版本的问题。不过总体上这个安装方法是正确的,跑一些简单代码还是可以的。至于一些错误的解决方法之后会更新。
不过终究还是要用的,所以我尝试在工作站(DELL PowerEdge T620)上通过安装Linux for Windows 然后用上述方法进行安装,毕竟这个工作站的配置也不算低了,勉强能用。虽然因为不知名原因IEER1的问题一直解决不了(即使毫无大碍)。
关于WSL的安装与设置方法我是参考这里来弄的:https://zhuanlan.zhihu.com/p/61542198
开启Ubuntu之后先对vim进行美化,毕竟是要给老板展示装逼用的….具体的就不说了,代码如下:
1 | mkdir .vim |
打开vim之后添加如下代码,然后:wq退出
1 | colorscheme molokai |
之后创建一个meep文件夹,然后安装miniconda,由于这里的shell是默认bash的,因此直接copy很酸爽。命令依次如下:
1 | mkdir meep |
之后就是安装meep的步骤了,和上述方法也是完全一样的。命令依次如下:
1 | conda create -n mp -c chogan -c conda-forge pymeep //创建名为mp的虚拟环境以安装pymeep包 |
之后我在该环境下安装jupyterlab
1 | conda install -c conda-forge jupyterlab |
但是在打开jupyterlab的时候出现报错
1 | Running as root is not recommended. Use --allow-root to bypass. |
解决方法是:
1 | jupyter notebook --generate-config --allow-root |
然后vim生成的配置文件,之后
1 | #c.NotebookApp.allow_root = False //去掉#,并修改成True即可解决root权限运行的问题 |
为了啊wsl当中合理使用不报错,最好是使用这个命令然后手动复制地址到浏览器!
1 | jupyter-notebook --no-browser |
但是配置之后,meep还是无法正常使用orz…这里做一个统计,在超算,个人电脑的虚拟机上用上述方法安装,都是成功并且能跑一些简单代码的。而在工作站wsl上是不成功的…我放弃了…
但是!!!!在我重新创建了一个虚拟环境之后,所有指令又都能用了!!!一切又都正常了!!!!真是搞不懂啊!!!但好歹是成功了!!
ORCA的并行计算脚本
这个脚本是我基于JAIST官网的教程在Gaussian并行计算脚本的基础上改的
1 | #!/bin/csh |
注意USER_ID是用户目录的用户名,ORCA文件的输入与输出格式也要规范!ORCA的计算最好是32核-64核,但是每个核分的内存要大一点,最好3GB/Core!!
Gaussian中使用混合(赝势)基组的输入格式问题
这个问题在思想家公社中有详细说明过,原文链接:http://sobereva.com/60
但是,在实践当中会有一个容易出错的地方,就是“空格(=空一行)”在格式中的重要关系,在重金属离子配合物的计算体系下这可能会是重要问题!!以下用PBE0泛函混合赝势基组做演示,分子是一个含钆和银的有机配合物:
1 | %nprocshared=128 |
综上所述,不难看出常规正确格式可以总结为:
1 | 计算信息(CPU核数,内存,输出路径) |
也就是说,每个元素的赝势信息部分是不需要加空格(空行)的!不然会导致后来的赝势信息无法被读取,从而计算出错!!
超级计算机上使用MPI调用Gaussian做并行计算的脚本
学校超算是128核的双路CPU(64×2)节点。默认是分16核的,以及会给一个写好的32核的脚本。这里我展示一下单节点计算和多节点并行计算的CSH脚本,是自己调试的。
关于PBS设置,基本格式是:
1 | #PBS -l select=<节点数>:ncpus=<每节点核数>:mpiprocs=<每个节点进程数> |
如果选择单个节点跑满128核并行计算,脚本是这样的:
1 | #!/bin/csh |
如果是多个节点并行计算,比如单节点64核,直接2节点并行跑64核,脚本是这样的:
1 | #!/bin/csh |
基于我个人的测试,单节点128核+128进程,单节点128核+64进程,单节点32核+32进程,对于同一个隐式水环境中柠檬酸钠的结构优化+频率计算的问题,耗时如下:
1 | select=1:ncpus=128:mpiprocs=128 |
1 | select=1:ncpus=128:mpiprocs=64 |
1 | select=1:ncpus=32:mpiprocs=32 |
比较Elapsed time,可见最优设置是128核+64进程。实际运行当中128核时差不多40分钟,而32核时是52分钟左右,当体系更复杂一些,这样的耗时差距也会更大!
适用于def2-tzvpd基组的稀土元素的弥散函数
实际上就是所谓def2-tzvpd中的“d”,当然本文中的参考文献也放出了其他def2基组关于镧系元素的弥散函数,虽然通常的计算完全用不到就是了。另外原则是相似基组的弥散函数是可以“借用”的。
具体如下
La
1 | La 0 |
Ce
1 | Ce 0 |
Pr
1 | Pr 0 |
Nd
1 | Nd 0 |
Pm
1 | Pm 0 |
Sm
1 | Sm 0 |
Eu,def2-TZV+def2-P(1g)=def2-TZVP
1 | Eu 0 |
Gd
1 | GD 0 |
Tb
1 | Tb 0 |
Dy
1 | Dy 0 |
Ho
1 | Ho 0 |
Er
1 | Er 0 |
Tm
1 | Tm 0 |
Yb,def2-TZV+def2-P(1g)=def2-TZVP
1 | Yb 0 |
Lu,def2-TZV+def2-P(1g)=def2-TZVP
1 | Lu 0 |
另外关于CCDC数据库中的晶体数据,我最近遇到了使用数字编号搜不到之前下载的结构数据。问了一下搞晶体的同学说要用审核之后的6位字母编号才能搜索到orz
关于使用Gaussian做限制性优化和拉曼计算的一些思考。
一些量子化学计算需要根据实际情况对一些几何参数进行固定,然后再进行结构优化。例如:对于模拟分子对某个金属表面的吸附时,需要对外围原子进行坐标冻结以防止优化过程中乱动导致表面结构失效;对于一个平面结构的2聚体,需要冻结二面角以让它们在结构优化的过程中保持在同一平面当中。对于Gaussian做限制性优化,需要对opt添加ModRedundant关键词,然后末尾添加要限制的区域最后加F。A类别是角度,由3个点组成。D类别是二面角,由4个点组成(1和2所在的面与3和4所在面的夹角)。当然有时候不写这些也OK。参见:http://sobereva.com/404
我最近在复现一篇Nature子刊里的特殊的Raman效应,但是也遇到了一些值得好好琢磨的问题。
- 关于限制性优化
如果是用金属团簇来近似SERS,由于分子相对金属表面小太多太多,因此这个金属团簇不需要太大(毕竟不是做吸附研究),只要固定即可。同理,由于这是一个单分子-金属团簇模型,优化结果只要Gaussian默认的收敛即可(即至少2个Yes,其中受力小于收敛限的100倍)。毕竟分子与团簇的吸附方式多种多样,是一个柔性的吸附模式,并不一定是必须要最以“单个化合物”的刚性情况来优化至严格量子化学意义上的最小点。这对于复杂体系的SERS光谱模拟有现实意义,也符合实验的情况。
但是,如果是一些聚合物分子的堆积,就要考虑堆积方式。一般有J聚集和H聚集两种。J聚集是头和尾相互排列,而H聚集是头和头相互排列(就是完全平行)。还有可能的其他类型的堆积。如果有晶体数据,一般情况下对晶体进行全优化就行了。毕竟溶液或者分子体系和晶体体系是不一样的,其能量最小结构并不一定是一样的。但是对于严格模拟J或者H聚集的情况,就需要严格根据几何关系做限制性优化了。但是!量子化学计算只能获得用于定性比较的结果,定量没意义也不可靠。所以需要详细根据实际情况去设定参数,而非套用。
- 关于Raman光谱的计算
对于实验的Raman光谱,其Raman shift一般是由材料自身决定的,通常与激发光无关。而Raman intensity则与激发光密切相关!一般和入射光频率的4次方成正比。而对于enhanced-Raman,则更为复杂,更受激发光所诱发的“场”的影响。虽然拉曼光谱的本质是极化率的变化产生的,在实验(物理)当中,这个变化由入射光或者其他外场诱发引起的。但是量子化学计算当中所计算的都是静态极化率对正则坐标的导数来算的拉曼散射活性(拉曼强度和它成正比),即分子自身理论应该有的拉曼光谱的样子。这种计算强度对于模拟各个峰位上的峰是OK的,但是复现实验中的强度关系则不一定OK,因为其数学关系/物理关系有太大差距。
因此,对于enhanced-Raman的DFT模拟,一般情况下是可以获得一个ground-state charge transfer的增强拉曼光谱,仅与分子的吸附方式有关。而要进一步近似实验光谱,就必须考虑计算含频极化率。通常是有2中方式。一种是TDDFT计算某个激发态的拉曼光谱,即模拟共振拉曼。另一种是直接用Gaussian中的CPHF=RdFreq关键词读取设定的频率来计算即可。差异可以看这里:https://ajz34.readthedocs.io/zh-cn/latest/QC_Notes/Freq_Polar/Freq_Polar.html 但是需要注意的是:如果是一个分子-金属团簇的模型,这种计算方法并不一定适用!因为实验中的贵金属团簇会由于plasmon resonance而产生一个吸收峰,这个吸收峰并不一定是量子化学计算中的吸收光谱(电子跃迁的垂直吸收)!但是对于没什么特殊振动结构的极其简单的分子是大概适用的,仅对比一些强度关系。
所以很多时候模拟还是要先从物理关系上去考虑,通常只能有限的对某一项局部特征进行模拟,来论证一些定性差异。这对分析光谱细节是有帮助的。但是当应用到整个光谱时,局限性就非常大了!!所谓的一些模拟,和实际的差距太大,定量讨论的结果的可信度都不太OK。
理论光谱与实验光谱的差异分析与可比性探讨
一些自己在研究当中遇到的问题,这里总结一下:
- 关于Raman
需要有个明确的认知:大多数中文教材有关这部分的机理描述基本上就是瞎几把写的,大错特错。常规的Raman光谱的Raman shift与入射光关系不大,算是材料的特征。但是强度与入射光关系极大!而对于非常规的Raman,比如resonance Raman或者各种enhanced Raman,与入射光关系极大!可能会导致各种奇怪的效应而引起不响应的峰得以响应,从而出现了新峰或者发生位移。
而在量子化学计算中,常规的Raman光谱的计算所得的是个不含频率特征,只有振动特征的静态光谱。这就导致Raman shift在合适的校正因子的修正下是可以用来做峰位归属的,但是只是能做而不是100%复现!!毕竟计算参数实验参数及量子化学计算自身的问题都会导致Raman shift的计算值和理论值有差异。而对于光谱形状,或者峰强度的复现,几乎不可能。在某些特殊体系下可以辅助研究一些机制,例如电荷转移。但是这个的前提是计算模拟的的机制与实验机制一致且能够定量复现一些关键参数。例如研究相对强度关系就必须获得一个能复现这个强队强度的计算模型,然后再考虑其他的例如电子结构的影响。否则就是把A强加于B,毫无关系的两件事被拿来做想象力创作了。
最后谈一下实验影响。一般情况下浓度会有个检测限的问题,太低不好,而太高则会让峰太宽了变成一个宽包。此外就是光学参数,例如狭缝的大小直接影响进光量,进而影响峰宽峰高以及峰位(多个峰叠加去情况下),导致分辨率变得非常抽象。至于仪器的校正,还有基线校正这些明显问题就纯看日常维护了。但是归根结底,拉曼光谱的检测并不是测到信号=成功,而且实验是多分子层面的检测,其结果不等于单分子层面的模拟!所以很多时候理论和实验光谱的参考分析要基于“讨论”而非直接给结论。
- 关于UV-Vis
虽然UV-Vis是个常规的表征手段,通常是作为吸收光谱去表征材料在吸收光子能量后产生的电子跃迁带来的特性。例如各种分子的中特殊官能团的电子跃迁特征,即官能团的特征峰。或者半导体中的Band gap跃迁,是价带到导带的跃迁。但是在一些特殊的金属上,如果发生了自由电子的集体震荡,即plasmon resonance,那么这个时候的吸收峰就不是由电子跃迁引起的了。
而DFT计算UV-Vis,通常是使用TDDFT方法计算分子的基态到电子激发态的能量和振子强度,进而得到一个模拟的吸收光谱。因此,对于研究一些分子,计算模拟非常有用(当然也客观存在数值差异)。但是从机理上看,DFT本就难以模拟合理尺寸的等离激元共振效应。那种硬说几个原子组成的小团簇等效于一个几十纳米的聚集体是非常不合理的!!对于后者,FDTD或类似方法在合理尺寸下的模拟要好得多,可惜这种方法并不能考虑到分子。
所以模拟和实验的UV-Vis光谱如果要拿来分析,还是要先确定机理一致,然后尺寸/尺度一致,进而才有辅助分析的合理性。否则就也是瞎几把胡写了。
上述讨论都是在实验和计算参数合理的情况下进行的。可惜的是,大多数人没有量子化学计算的基础知识,只觉得是点点鼠标软件自动出结果的事。加上很多做实验的为了数据好看,论文看起来高大上而找带算,最后算出来的东西都很抽象却被拿去强行解释。终究是让错误扩散下去,与科研所要求的“客观”背道而驰。
- 本文链接:https://www.northarea.tech/2025/01/18/0x004/
- 版权声明:本博客所有文章除特别声明外,均默认采用 许可协议。
所以如果是重要的评论,建议跳转 GitHub Issues 发表。
若没有本文 Issue,您可以使用 Comment 模版新建。
GitHub Issues