
寫在前面
最近在複習考研複試《固體實體》這一門課,去年學的内容已經忘幹淨了,是以就翻開前幾頁。突然看到了面心立方和體心立方結構圖,想到了去年室友用Mathematica做了晶胞的結構圖,于是就手癢癢自己也想來做一個。
具體實體内容不會涉及到多少,但還是要求大家能對“簡單立方結構”、“體心立方結構”、“面心立方結構”有一個簡單的了解,因為我比較懶,是以我就不放這些基礎内容湊字數了。
用MATLAB跑出來的效果圖為
面心立方-MATLAB跑出來的圖
我的所有程式都放在我的Github: https://github.com/HanpuLiang/Something-Small中,點選即可檢視。
基本的思考
如果我們想要做一個類似于這樣子的結構圖的話,我們需要知道些什麼?
想要達成的效果(圖源百度)
如果我們想要做成這麼大個超胞的話,又需要在上面的基礎上怎麼做?
超胞示意圖(圖源我自己)
有過做計算的同學已經想到了,需要計算實體中,描述晶胞中原子位置的檔案POSCAR,然後把POSCAR拖到VESTA中就可以上面這幅圖了。
是以我們這裡模拟POSCAR來輸入參數:
- 晶胞參數 :描述晶胞大小的參數。
- 超胞大小 :當晶胞數量大于1個并且周期性變化時,用三個數字描述其在三個方向上的晶胞疊加數目。
- 各個原子的坐标 :沒有這個還怎麼畫出來原子啊。
基本參數
晶胞參數
晶胞參數包括6個值:三條邊a1, a2, a3和三個角
,如下圖所示
晶胞參數
因為編寫程式的複雜程度問題,我們這裡隻考慮
這樣的情況。如果不這樣的話,那就有點難了,需要考慮這個晶胞斜向的角度。
超胞大小
超胞大小是用來形容我們這個超胞到底由幾個晶胞組成,以及他們的排列方式是怎麼樣子的。就比如下圖中,沿着a1方向的層數為1個,沿着a2方向的層數為3,沿着a3方向的層數為2.是以我們就可以設定為[1, 3, 2]。
值得注意的是,這裡我用的并不是x, y, z軸的方向!!!因為如果
的話,那麼a2方向就不和y軸平齊了,是以為了保證兩個晶胞相連,就必須要沿着晶軸方向拓展。
超胞大小
原子位置
這個沒什麼好說的,如果我們建立好了超胞,那麼直接在對應的坐标畫上原子就好。
開始寫程式
設定參數
首先我們來設定好上面的參數
%% 參數設定
這裡将體心和面心的原子分别提取出來,作圖的時候再放上去和簡單立方的一起做就好了。
作圖
我們為了圖像美觀就得做一些處理坐标軸的事情
%% 作圖
然後我們就可以愉快的畫超胞的架構和各個原子啦,下面的兩個函數是我自定義的兩個函數
% 做超胞架構
簡單立方因為最大,是以我在裡面設定了一些自動變坐标軸大小的内容,是以要放在最後面。
這樣子主程式就完成了。後面詳細解釋這兩個函數的内容。
做超胞的架構plotBox
我們需要定出立方體的8個頂點,然後做出12條邊,這一部分很簡單,根據簡單的數學就可以推導出公式,然後寫出程式來。
function
做各個原子的圖
這個才是重頭戲。
我們首先要确定出在超胞内,一共有多少個原子。我們之前設定的超胞大小就派上用場了,我們通過三個循環嵌套在一起,周遊出超胞内的所有晶胞,然後将其原子位置加到矩陣中,最後統一作圖。
function
然後這樣就完事了。是不是很簡單的。
寫在後面
以上所有代碼我都放在了我的Github中,可以通過點選我的Github: https://github.com/HanpuLiang/Something-Small去檢視。代碼下載下傳後可直接運作。
如果喜歡的話,麻煩點個關注,給個贊,加個收藏噢。