用VESTA建立表面模型

1、本文搬运自ETasci-2013-SurfacePreparationHowTo,简单总结一下,方便大家
2、首先讲一下思路:我们要找到新的单胞,然后我们做晶格基矢转换再加一个真空层就行了,其实很简单。下面讲解步骤。
首先你需要两个东西,一个是晶格结构,需要时VESTA能够打开的格式,这里以Material Project上下载下来的*.cif文件为例。然后把文件拖入到VESTA中。

1.jpg

然后就是找新的单胞,首先我们要找到单胞对应的6个平面,当然在这之前要先扩展成超胞看起来比较方便。(这一步的所有步骤都没有改变元胞信息只是为了我们看着方便,包括下面的删除原子之类的。)点左边的Boundary,然后把x,y,z改成3 3 3
2.jpg

然后我们的模型就变成超胞了。
3.jpg
,然后选平面,
4.jpg

点左上角的Edit,然后点Lattice Planes,就出来编辑平面的窗口
5.jpg

然后点New,就可以新建平面,新建完了以后会显示在左边,这里添加6个平面,得到新的单胞,如下图所示。
6.jpg

7.jpg

删除多余的原子,用最左侧边栏上的第二个鼠标指针选中然后按键盘上的Del键即可删除
8.jpg

然后我们就得到了新的单胞,这里丢失了一些原子。
9.jpg

这里因为晶格间距和例子中的不一样,所以截出来的单胞并不是很理想,所以拿上面那个PDF中的来说吧,实际操作中根据自己的需要来截,这一步是最关键的。
10.jpg

这个就是PDF中的例子给出的单胞,顶点上有4个原子,像上边一样用左边栏第二个箭头选中4个原子下面的窗口会给出4个原子现在的坐标,分别减去新的原点O‘的坐标,就得到了新的晶格基矢与原来的基矢的关系

a' = -a+b
b' = -\frac{1}{2}a-\frac{1}{2}b+c
c' = a+b+c

终于得到了晶格变换矩阵

\begin{matrix} -1 & -1/2 & 1 \\ 1 & -1/2 & 1 \\ 0 & 1 & 1 \end{matrix} \tag{1}
注意:到这里为止我们都没有实际上改变原来的晶格结构文件。下面我们就要改了
Edit>>Edit data>>Unit cell然后点Transform在Rotation matrixP中填上刚才得到的变换矩阵就得到了新的单胞,下面就是添加真空层了,只需要File>>Export data选VASP的格式然后选笛卡尔坐标,再把c方向加大就行了。PP

VESTA建立截止面/移除部分isosurface

添加平面不仅可以帮助简立新的单胞,还可以帮助截取isosurface的一部分。
我在画电荷密度的时候,有时候会遇到想去掉自己不想要的isosurface部分的想法但是直接像删除原子那样的方式是删不掉的,说明书里有一个如何截图像的方法,名字叫做建立边界平面。
同时按ctrlshiftB就可以打开建立截止面的界面,然后输入自己想要的截止面就可以了!

VESTA变换元胞后保持矢量与之前一致

按照上面描述的方法变换元胞之后,原来设置的矢量有可能会改变方向,因为元胞的基矢被改变了,但是我发现只要在变换的时候选择第二个选项就可以保持矢量不变,但是需要重新设置矢量和原子的对应顺序。

VESTA 批量添加矢量

VESTA里面添加矢量比较麻烦,手动一个一个点,能不能通过脚本来实现呢?答案是可以的,因为VESTA的输入文件prefix.vesta实际上是一个文本文档,所有的信息都以文本的方式存在里面,那么只需要按照VESTA的格式把矢量写进去就可以了,上网一搜有人写过了,于是就直接拿过来了。脚本来自GitHub - hzr-piggy/plot_vec_VESTA,他参考了另一个人的写法GitHub - lucydot/vesta_vectors。非常感谢他们!
输入文件就是两个,一个是需要修改的VESTA输入文件,还有一个就是记录矢量的文本文档,大致格式是这样的

-0.05
-0.05
-0.05
0.1
0.1
0.1

就是把矢量分成每行一个数就可以了。这里只加了两个矢量,需要加更多只需要也参照这个格式加下去就可以了。


def plot_vec(vesta_file, vec_file,
        cutoff = 0.1,
        radius=0.5, color=[255,0,0], penetrate = True, add_atom_radius = False,
        scale_factor = 1,
        delim = None, vec_type = "Cart", lat = None,
        output_suffix = "_vec"):
    
    # vesta_file:   A *.vesta file
    # vec_file:    A file containing vectors having dimensions of 3N*1 (or 1*3N) 
    # with delimiter=delim i.e.
    
    #                     x1
    #                     y1
    #                     z1
    #                     x2
    #                     y2
    #                     z2
    #                     .
    #                     .
    #                     .
    
    # cutoff (Double):       Angstrom below which vector will not show
    # radius (Double):       Set radius of vector
    # color (Double 0-255):  Set color of vector
    # penetrate (Bool):      Set whether vector penetrate atom
    # add_atom_radius (Bool):Set whether to add atom radius to vector modulus
    # scale_factor (Double): Scale vector in the figure
    
    # delim:                 Delimiter in the vec_file
    # vec_type:              Type of vectors, can be "Cart" (Cartesian), "Lat" (Lattice vector notation [u v w], in reduced coord)
    #                        or "Modulus" (Modulus along crystallographic axis). Default is 'Cart'
    # lat:                   3-by-3 lattice parameter in Angstrom required if vec_type == 'Cart'
    
    import numpy as np
    import re
    import os
    
    # Read input files
    vesta_data = open(vesta_file,'r').read()
    temp = np.loadtxt(vec_file,delimiter=delim)
    N_dim = temp.shape[0]
    temp = temp.reshape((N_dim//3,3))
    
    # Convert to Modulus along crystallographic axis
    if vec_type == 'Lat':
        struct_match=re.findall(r'CELLP\n\s+(\d+\.\d+\s+\d+\.\d+\s+\d+\.\d+\s+)',vesta_data)[0]
        cell = np.array([float(x) for x in struct_match.split()]) # cell lengths in angstrong
        temp *= cell
    elif vec_type == 'Cart':
        assert lat is not None, '3-by-3 lattice parameter in Angstrom required if vec_type == Cart'
        temp = temp@np.linalg.inv(lat)*np.linalg.norm(lat,axis=1)
#   print(lat)  
    vectors = np.around(temp*scale_factor,decimals=3) # Round the disp to 3 decimals
    
    # Find unique vectors
    print(vectors)
    vectors_unique = np.unique(vectors,axis=0)
    
    # Vector penetrate atom or add atomic radius?
    flag = int(penetrate)+int(add_atom_radius)*2
    
    VECTR_str=r"\1"
    VECTT_str=r"\1"
    i = 1
    for v in vectors:
        if np.linalg.norm(v) > cutoff: # only create vector with modules > cutoff

            VECTR_str += "   {0}  {1}  {2}  {3}  0\n".format(i,v[0],v[1],v[2]) # create vectors

            atom_list = np.where((vectors == v).all(axis=1))[0]
            for atom in atom_list:
                print(atom)
                VECTR_str += "    {0}  0  0  0  0\n".format(atom+1) # create atom labels start from 1

            VECTR_str += "0 0 0 0 0\n"

            VECTT_str += "   {0}  {1}  {2}  {3}  {4}  {5}\n".format(i,radius, color[0], color[1], color[2], flag)

            i += 1
            
    output_data = re.sub(r"(VECTR\n)",VECTR_str,vesta_data)
    output_data = re.sub(r"(VECTT\n)",VECTT_str,output_data)
#   print(output_data)
    name, ext = os.path.splitext(vesta_file)
    file_out = open(name+output_suffix+ext,'w+')
    file_out.write(output_data)
    file_out.close()
mode = 12
plot_vec('NbAs.vesta', 'NbAs_vector'+str(mode)+'.dat',
cutoff = 0.1,
radius=0.4, color=[255,0,0], penetrate = False, add_atom_radius = False,
scale_factor =-1,
delim = None, vec_type = "Cart", lat =    [[6.374959638,   0.003597502 , -0.000000000],
  [ 4.478346762 ,  4.537022058 , -0.000000000],
  [-5.426653274 ,-2.270309811  , 2.457085633]],
output_suffix = "_vec"+str(mode))

VESTA保存带电荷密度图

VESTA为了保持vesta文件格式的简介一致性,将电荷密度这一类数据在保存的时候就删掉了,想要保存这一类数据需要将其再保存为一个XX.ggrid文件,然后打开的时候 Edit > volumetric-data 导入进去就可以了。

VESTA 调节isosurface 透明度,

VESTA中如果想要调节isosurface的透明度,是在properties里面然后打开isosurface选项里就可以调,关键在于理解两个透明度的意思是什么,


image.png

这一点从这个图上可以看出来,其中O1和O2分别代变两个方向的透明度,分别对应opacity1和opacity2,然后前面那个render from front to back 影响也很大。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容

  • 最近看了一篇文章,是关于铬的卤化物 CrX3 的诸多性质的计算 Robust intrinsic ferromag...
    jenny42阅读 6,415评论 1 6
  • 这是我在简书的第一篇文章,简书这个APP以后就用来作为我记录模拟计算的一个地方。。。 第一次发文章打...
    Phystimulate阅读 11,219评论 2 1
  • 最近在东京大学物性研究所参加第一性原理计算的Summer Workshop,期间要做一个 Project,我选择的...
    jenny42阅读 84,916评论 1 24
  • 本文转载自博主一个人就是一个叠加态,有部分删减修改,文中对相关概念方法做了详细的总结,留坑待填... 1. 第一原...
    chempeng阅读 43,647评论 1 33
  • 如何得到 CrI3 monolayer 的结构 先由结构优化过后的 CrI3 bulk 的 POSCAR 出发,切...
    jenny42阅读 6,423评论 0 1