学习自旋电子学的笔记02:OOMMF的报错和部分功能详述
文章目錄
- 前言
- 一、OOMMF使用之前就遇到的問題(即主要是編譯的問題)
- 1.不能運行OOMMF,需要重新編譯
- 2.添加額外的第三方模塊,需要重新編譯
- 二、OOMMF軟件部分功能的詳細描述和使用過程中報錯
- 1.Oxsii和mmDisp部分功能
- 2.檢查點文件
- 三、MIF文件內容即Tcl代碼中的一些問題
- 1.時間演化器和能量最小化演化器的區別
- 2.塞曼能(即外加磁場)的設置
- 3.驅動器的report_wall_time和m0參數
- 四、幾個簡單的示例
- 1.宏自旋模型
- 2.不同核殼模型的反磁化
- 3.外加磁場驅動180度疇壁運動
- 總結
一點浩然氣,千里快哉風。——蘇軾 《水調歌頭·黃州快哉亭贈張偓佺》
前言
又是一個三月=31天=744小時=44640分鐘過去了呀,time is going too fast。是該每月總結的時候了,但我也不曉得該寫點啥來敷衍一下哈,復制別人文章里面的一些內容,不不不,太明目張膽的抄是不好的,分享看過的文章,不不不,我自己都看不太明白,還是別誤導讀者了。思索良久之后,還是決定寫點關于本人在使用OOMMF軟件過程中遇到的各種問題吧,畢竟這些關于軟件的問題不涉及高深的理論,是一目了然的,肯定不會誤導讀者的。同時也包含有些童鞋私信遇到的各種軟件問題,這里建議讀者有疑惑的在評論區提問,別老是私信,如此讓大家都能看到不解的地方,避免后面的人重復踩坑。本文分為4個部分:①OOMMF使用之前就遇到的問題(即主要是編譯的問題)②OOMMF軟件部分功能的詳細描述和使用過程中報錯③MIF文件內容即Tcl代碼中的一些問題④幾個簡單的示例。一、OOMMF使用之前就遇到的問題(即主要是編譯的問題)
有兩種情況需要用戶自己在計算機上重新編譯OOMMF軟件:①當OOMMF軟件不能在計算機上正常運行,特別是用戶已經按照第0章描述的那樣操作了,還是不能運行該軟件的情況。②當用戶需要為OOMMF添加額外的第三方擴展模塊的情況。下面分別介紹這兩種情況:
1.不能運行OOMMF,需要重新編譯
有的用戶按照第0章描述的的步驟,在正確安裝Tcl/Tk環境后,并且下載OOMMF軟件包之后,雙擊oommf.tcl想運行,卻彈出一個錯誤彈窗(錯誤類型包括文件缺失,平臺識別錯誤,通信出錯等,若用戶實在是自己排除不了問題,則建議重新在自己的計算機上編譯一遍OOMMF。
雖然在教程手冊里清晰明白的給出了編譯流程,但為了湊夠本文的篇幅,我還是手把手演示一遍吧。
正如手冊所述的那樣,編譯OOMMF需要三樣東西,缺一不可:正確的Tcl/Tk環境,c++編譯器,OOMMF軟件包。
(一)
首先檢查自己是否已經正確安裝了Tcl/Tk環境,在任意目錄打開Windows的命令窗口,輸入命令“tclsh”,如下圖:
看到命令提示符從“>”變成"%",就說明正確安裝了Tcl/Tk環境,若提示識別不了命令,在確定不是由于環境變量Path導致的問題后,用戶仍然解決不了的,則建議按照第0章描述的的步驟重裝ActiveTcl。
(二)
其次是計算機上要有c++編譯器,手冊里提到了在Windows平臺的好幾個c++編譯器,但目前為止我親手使用過的就只有兩個:cl和g++,我相信大多數讀者也是只對這兩個程序比較熟悉。cl是VS系列IDE自帶的c++編譯器,g++是CodeBlocks自帶的c++編譯器。 本人按照手冊的說明,使用VS2019自帶的cl程序來編譯OOMMF軟件,但是當編譯到oommf/pkg目錄時總是提示找不到“error.h”頭文件,在嘗試了各種方法后依然不知怎么解決,所以換了g++來編譯oommf,很快啊,一會兒就編譯好了。 所以接下來就按照使用g++來編譯一步一步的講解:
①用戶若是第一次安裝OOMMF,在OOMMF安裝目錄下打開命令窗口,輸入命令“tclsh oommf.tcl +platform”,一般都是這種情況:
它提示用戶找不到c++編譯器“cl”程序,這說明你計算機上還沒有c++編譯器,需要去下載一個c++編譯器。由于本人使用VS2019自帶的cl編譯失敗,所以下載CodeBlocks安裝包的同時把附帶的g++也給下載了,點擊下載CodeBlocks最新版,注意選擇下載名稱中帶“mingw”的版本。安裝很簡單,這里省略安裝過程,安裝完成后需要為環境變量Path添加g++程序所在的目錄,如下圖:
在任意目錄打開命令窗口,輸入命令“g++ -v”,出現類似下圖的輸出就說明已經設置好g++程序了:
②接著,按照手冊所述的那樣,修改配置文件來選擇使用“g++”來編譯oommf,而不是使用默認的“cl”程序編譯。即需要在oommf的配置文件oommf\config\platforms\windows-x86_64.tcl中,將第103行注釋掉,并把第106行取消注釋,如下圖:
③如此,重新在OOMMF安裝目錄下打開命令窗口,輸入命令“tclsh oommf.tcl +platform”,于是輸出如下:
出現這種樣式的內容,就說明OOMMF已經能正確識別并使用你的c++編譯器了。
(三)
最后按照手冊所述的那樣,按順序輸入命令調用pimake即可。即先輸入命令“tclsh oommf.tcl pimake disclean -d”,等待清除所有舊的已編譯的無用文件:
接著輸入命令“tclsh oommf.tcl pimake -d”開始重新編譯OOMMF,此過程需要十多分鐘完成,整個編譯過程不會報錯,編譯完成效果如下圖:
注意:使用自己編譯的OOMMF軟件會出現一些小問題,比如:①在3D求解器Osxii中單擊“Reload”按鈕來重新加載問題時會報錯并退出Osxii,原因尚不可知,不過并不影響使用。②當mif文件中有語法錯誤時,Osxii雖然會加載錯誤,但并不會出現錯誤提示框來顯示代碼出錯的位置,Osxii只會瞬間異常退出,這種情況就稍微有點影響使用了。
2.添加額外的第三方模塊,需要重新編譯
瀏覽過OOMMF官網的擴展模塊介紹頁面,或者看過OOMMF視頻教程,或者看過示例文件的人,估計都接觸到了一些第三方模塊,這些模塊(或者類)在手冊中并沒有具體介紹。手冊16.17 Oxs包管理:oxspkg,詳細介紹了如何管理第三方模塊,使用命令“tclsh oommf.tcl oxspkg list”列出所有的第三方模塊的信息:
可以看到有什么周期邊界啊,DMI啊,電流在薄膜的STT啊等等模塊,每個模塊的具體用法都可以在對應目錄中找到源代碼和示例文件,以上Installed模塊都是OOMMF已經集成了的,可以直接在MIF文件中直接使用的。若用戶需要添加自定義的模塊,只需在oommf\app\oxs\local中新建模塊目錄,并把自定義模塊的.c和.h文件復制進去,并重新編譯OOMMF即可在MIF文件中使用新增的模塊。
具體的如何自定義模塊參見OOMMF視頻教程。
二、OOMMF軟件部分功能的詳細描述和使用過程中報錯
涉及OOMMF的兩個子程序:Oxsii和mmDisp,之所以單獨拎出它們的部分功能來講解,是因為我覺得手冊上關于部分功能的描述太令人費解了。接著是關于使用過程中關于檢查點文件的錯誤。
1.Oxsii和mmDisp部分功能
(一)在子程序Oxsii界面中,首先是File菜單打開的加載問題界面:
在這個界面中,需要補充說明的只有紅框中的三項:
①Restart框不能勾選,否則文件會加載錯誤,提示找不到檢查點文件:
勾選菜單Options中的Restart flag,并單擊Reload重新加載文件也會出現同樣的問題。
解決方法就是不勾選Restart框,從而禁用Oxsii的重啟功能。關于檢查點文件的說明后面還會提到。
②Threads框中是Oxsii使用的線程數量,一般它有默認值,不必修改它。經過親手測試,運行同一個MIF文件,對于把線程數量設置為超過默認值的情況,模擬過程中占用的CPU會增加,但是完成模擬所需的時間竟然增加了!! 若疑惑的用戶可以自己測試驗證一下。
③Params框可以為MIF文件中Parameter命令定義的變量設置新的值。在每次加載MIF文件之前,在這個框中按照類似“變量名1 值1 變量名2 值2”的形式為變量設置值,當然也可按照手冊所述的那樣較為麻煩的在命令行設置變量的值。
(二)在子程序Oxsii界面中,File菜單的Show Console會調出Tcl的命令窗口,在這里可以看到MIF文件中使用Report命令輸出的字符串,它對于用戶調試程序很有用。如下圖:
MIF文件中有三個Parameter命令定義的變量:xcell,ycell zcell,并使用Report命令輸出它們的值,在加載此文件之前,在Params框中為變量xcell,ycell重新設置新值,如此,加載此文件后,它們的值就變成了控制臺中顯示的新值了。
(三)在子程序Oxsii界面中,“Run”,“Relax”,“Step”三個按鈕用于控制模擬的進度,分別是:完成整個模擬,完成一個階段的模擬,完成一個步進的模擬。在手冊中關于“階段stage”和“步進step”的解釋很清晰,但又稍微有點抽象。我覺得作者在視頻教程中關于這三者的比喻很生動形象:想象把完成一個模擬看做是閱讀一本書,“Step”即一個步進,就代表閱讀書籍的一頁內容,“Relax”即一個階段,就代表閱讀書籍的一整章,而“Run”則表示不停地,從頭到尾閱讀整本書。 仔細想一哈,我覺得這個比喻確實是十分恰當的。
(四)在子程序Oxsii界面中,關于輸出計劃Schedule的內容。在手冊中,提到了在運行模擬之前可以先向數據接收子程序發送一個dummy數據,讓數據接收子程序依照收到的這個數據來進一步規劃顯示界面。首先此處的dummy數據是MIF文件加載后,各個類的可以輸出的參數的初始數據,其次數據接收子程序有了這個初始值就可以選擇如何處理顯示數據了。舉個例子:比如說,先打開一個mmGraph子程序,可以看到它的X,Y1,Y2菜單是沒有任何可選的數據的。在Oxsii中加載MIF文件但并不運行,并在Destination里選中數據輸出到mmGraph,這時再單擊Send按鈕,就可以把初始數據發送給mmGraph了,然后在mmGraph的X,Y1,Y2菜單選擇所需的數據來顯示即可。設置好mmGraph之后,再在Oxsii中,設置好輸出頻率,然后運行模擬,這樣就可以很正確的顯示所需數據了。
(五)在子程序mmDisp,菜單Configure界面中,手冊里對于顏色的描述我覺得也不是很清楚,特別是如下圖中對像素著色時,顏色量xy/xz/yz-angle表示的意思:
首先眾所周知的是,mmDisp是用來顯示矢量場的程序,矢量場中每個位置點都有一個矢量,而矢量是有大小有方向的量,所以一般情況下用箭頭的方向表示矢量的方向,用箭頭的顏色表示矢量的大小。 當然, 手冊里很清晰的舉了例子來說明如何對Arrow著色,比如上圖中顏色量Color Quantity選中z,Colormap選中Red-Black-Blue,那么箭頭的顏色表示的是矢量在z方向的分量大小,比如:該矢量的z分量為負的最小值,即指向-z,那么該箭頭就是紅色;z分量為0,即該矢量平躺在xy平面,那么該箭頭為黑色;z分量為正的最大值,即指向+z,那么該箭頭就是藍色。
其次,需要記住對像素著色時,若顏色量選擇xy/xz/yz-angle時,那么顏色映射必須要選擇一個“色環”。 可以看到Colormap有兩種色環:Red-Green-Blue-Red(即RGB色環)和Cyan-Magenta-Yellow-Cyan(即CMYK色環),它們如下:
有關色環的知識可以自己去了解一下,通常RGB色環用于計算機上的顏色顯示,而CMYK色環用于印刷等實物的顏色顯示。為了更加方便的解釋這個功能,我就自定義一個磁體系來說明:假設有一個沿著+y延伸的納米條帶,沿著+y方向平分為8個子區域,每個子區域的初始磁化分布規律是這樣的:所有區域的磁矩都在yz面內,磁矩從+z方向按照順時針旋轉45度的規律分布在360/45=8個子區域,那么具體的MIF文件內容如下:
加載此MIF文件后但是并不運行,而是選擇輸出初始數據到mmDisp,效果如下圖:
接著為像素Pixel著色,顏色映射選擇RGB色環,顏色量選擇yz-angle,勾選Reverse,最終效果如下:
結合左上圖,估計大家一眼就看出來像素是怎么著色了的吧!沒錯,在上圖中,顏色量yz-angle就表示,色環放在yz平面,yz平面的箭頭方向正是色環顏色對應的切線。 比如說第3區域里的磁矩指向+y方向,那么在色環上,它是紅色位置處的切線,其他顏色解釋相同。
2.檢查點文件
估計部分用戶在運行自己的MIF文件時,大概15分鐘左右就突然就報錯,提示checkpoint檢查點文件(xxx.restart文件)保存錯誤,或者找不到,報錯框類似下圖:
首先,需要知道檢查點文件是什么。按照手冊所述,檢查點文件是用于定時保存求解器狀態的,在求解器異常退出時用于恢復求解狀態,所以對于正常按規范使用軟件的用戶來說是沒有啥用的。若用戶沒有在MIF文件或者通過求解器菜單顯式設置保存時間的話,求解器一般會默認每15分鐘保存一次狀態,但由于檢查點文件找不到或者寫入失敗,那么求解器就報錯。但是我也發現MIF文件所在目錄中新生成了一個.temp的文件,這也是我覺得比較迷惑的地方。
但是,解決方法很簡單,既然這個錯誤是由于檢查點文件引起的,那把求解器的檢查點功能給禁用了,不就從源頭給解決了嗎?
按照手冊所述,將驅動器的checkpoint_interval參數設置為-1,從而禁用檢查點功能,于是求解器無論運行多長時間都不會報錯了。
三、MIF文件內容即Tcl代碼中的一些問題
1.時間演化器和能量最小化演化器的區別
眾所周知,演化器和驅動器要配對使用!但什么時候選擇時間演化器,什么時候選擇使用能量最小化演化器呢?按照作者在視頻教程所說的那樣:對于準靜態模擬(即磁體系不關心時間),需要快速達到穩態的情況使用能量最小化演化器。對于磁體系是按照LLG方程來演化的,需要觀察磁體系隨時間而變化的情況則使用時間演化器。其實看一下在MIF文件中這兩種演化器需要設置的參數:時間演化器需要的參數是LLG方程中的參數,而能量最小化演化器的參數則沒有,而且不同類型演化器/驅動器的輸出項也不同。
2.塞曼能(即外加磁場)的設置
對于MIF文件中的塞曼能,手冊里介紹了Oxs_FixedZeeman , Oxs_UZeeman,Oxs_ScriptUZeeman,Oxs_StageZeeman,Oxs_TransformZeeman共5個類。可以在MIF文件中添加多個塞曼項。
按照我目前所知的外加磁場類型:對整個磁體系施加均勻的磁場,對整個磁體系施加時變的磁場,對整個磁體系的部分區域施加均勻的磁場,對整個磁體系的部分區域施加時變的磁場,利用上面的類都能實現。比如最后一種情況:可以使用Oxs_StageZeeman ,結合時間驅動器,結合矢量場Oxs_ScriptVectorField等就可以實現。
3.驅動器的report_wall_time和m0參數
將驅動器的report_wall_time設置為1,表示啟用外界時間輸出,它是從計算機開機到此時刻的總時間(以秒為單位)。
磁體系的初始磁化是由驅動器的m0參數設置的,需要注意的是,m0要求用戶設置磁化矢量的方向即可,它會自動調整矢量大小為單位磁矩(即矢量模為1)。比如(0.1 0.1 0.1)和(0.2 0.2 0.2)和(1 1 1)等效果都是相同的。
四、幾個簡單的示例
1.宏自旋模型
讀者們應該對宏自旋模型十分的熟悉了,如下圖:
在總有效磁場H的作用下,單獨的磁矩M會繞著H進動(逆時針轉動的同時,向H靠近)。若在外加極化電流,那么由于STT效應,提供了兩個額外的力矩項:類場項和類阻尼項。則分為三種情況:電流促進阻尼過程導致磁矩更快收斂到有效場方向;電流適當,類阻尼項和阻尼項抵消,導致磁矩在固定軌道旋轉;電流的類阻尼項克服阻尼項,導致磁矩反向進動。至于導致磁矩翻轉的具體電流大小,應該是有公式計算的,但我忘了,所以下面代碼里關于電流大小的設置都是隨便設置的。。。
恰好OOMMF自帶了宏自旋模型的例程,文件位置:oommf\app\oxs\local\spinxfer-onespin.mif。
為它添加一些注釋,并少許修改:
(1)首先看一下時間演化器和能量最小化演化器的區別,兩者的參數都設置為:電流為0,極化方向為+z方向,外加磁場為(0 0 1)方向,大小10mT。
可以看到使用最小化演化器是看不到磁矩的具體動態變化過程,只看到了最終穩態:
而使用時間演化器,則磁矩正如LLG方程描述的那樣進行變化:磁矩會繞Z軸逆時針進動,接著由于阻尼作用,一段時間后達到穩態。
(2)接著是施加電流的情況,這里使用一個函數Jprofile 來定義隨著階段數而變化的電流脈沖,根據不同階段數,得到不同的電流大小。按照手冊所述,電流值為正的話,會使磁矩傾向電流極化方向,此處的電流極化方向(即極化層的磁矩方向)為+z方向,和外加場方向相同。那么當電流:①為一定大小的正值,則磁矩越快達到穩態。②為一定大小的負值,使單個磁矩傾向于和電流極化方向反平行,由電流產生的類阻尼矩可以克服阻尼矩,于是磁矩會翻轉。
2.不同核殼模型的反磁化
這是去年的時候看到的一篇知乎文章,本來那個時候就想模仿文章來做一下的,但奈何那個時候啥都不太懂,加上人又太懶,所以直到現在才動手模擬了一下。
這里給出文章原文,是中文的,很好理解。文章圖10描述的幾個核殼模型如下:
按照文章中給定的的參數和模型,并參照OOMMF自帶例程oommf\app\oxs\examples\stdprob1.mif,那么就很容易寫出:
這里只定義了兩種模型:“殼是均勻包裹核”(核的尺寸為202020,殼的厚度為6)和“只在核的x面分布的殼”(即ax型的尺寸:核的尺寸為404040,一邊的殼的厚度為20),其余模型的定義方式是類似的。此外,施加的外加磁場的順序和原文有一點點區別,原文是在+z方向以0.5 kOe的梯度從 0 kOe均勻地增加到 100 kOe,然后再降到-100KOe。本文就直接從0KOe以0.5KOe的梯度降到-100KOe。
(1)首先,對于“ax型”的模型,模擬得到它的磁化曲線如圖:
原文圖12中描述的ax型的矯頑力是51.25KOe,模擬得到的結果也是在這個范圍內。接下來對比一下原文和模擬的“ax型”反磁化過程:
原文圖12(f):
反磁化的模擬結果:
可以看到模擬的反磁化過程和原文描述是一致的。
(2)接著,來看一下均勻分布的殼的磁化曲線吧:
對比原文,雖然文中圖2(a)中“核:202020,殼:6”只有大概的數值范圍,沒有寫出具體的數值,但也能看出模擬得到6220mT的矯頑力是正確的。它的反磁化過程也和原文描述的一致,這里就不再贅述了。
3.外加磁場驅動180度疇壁運動
這個例子參考文章如下:
按照文章中的第四章 “場驅動下的磁疇壁在納米帶中的輸運”所述的內容設置參數并進行模擬。
原文中參數描述如下,其他參數讀者自己去看:
由第四章的所有內容,可以得到的代碼如下:(懶得分段張貼代碼,所以一股腦整出來)
(1)首先,使用最小化演化器達到頭對頭180度疇壁的穩態,并保存為文件“initial_state.omf”:
模擬得到穩態的180度疇壁的圖像看起來也和原文中圖4-2一樣,所以應該這一步是對了的。
(2)接著,對整個納米條帶施加靜態的沿著x軸的,大小為1mT=10Oe的外加磁場。此時疇壁的運動是向+x方向的,如下圖:
移動一定距離后,疇壁里的磁矩翻轉,于是疇壁向-x方向的移動,如下圖:
總共花費了1個多小時,但是居然才模擬了17皮秒左右,得到x方向的相對磁化強度隨著模擬時間的變化:
顯然疇壁是來回移動的,在計算疇壁速度時,又遇到了問題,按照原文給出的公式v=L/2*dmx/dt計算疇壁的速度,但在上圖中無論怎么選取點也不對啊,無論是曲線的哪兩個頂點,還是曲線同一邊的隨機兩個點,反正得到的結果就是離譜。我也嘗試在磁化矢量圖上找磁疇壁結構中相同的兩個點,看一下經過了多少時間和距離,然后用距離除以時間,得到的疇壁速度也是錯的。后來我也將磁場設為0.5mT,得到的圖像也是類似的,疇壁速度還是算不出來。我是真不知道到底是哪里出問題了,仿真時間太短了嗎?還是文章理解錯了嗎?哪里的參數設置錯了嗎?有大佬幫忙解惑嗎?
(3)對整個納米條帶施加yz平面內的圓偏振微波磁場,首先需要驗證施加的場是正確的,但由于將它直接施加給這個磁體系,模擬速度實在是太慢了,所以我就將它施加到宏自旋模型中,得到的磁場隨時間的變化如圖:
磁場的y和z方向的分量確實是頻率為1GHz,振幅為12.6mT=40π Oe,然后將這個磁場施加到文章中的磁體系。
到這一步,我覺得這些步驟都沒錯吧,但是運行模擬之后,等了半個小時,仿真時間才過了5.8e-12秒,x方向的相對磁化強度才變化了0.023,我都傻眼了:
看都不用看,又錯了,唉,真的是搞不懂。。。
總結
希望早點畢業!另外有大佬幫忙看一下第三個示例嗎?到底是哪里弄錯了,搞不懂。。總結
以上是生活随笔為你收集整理的学习自旋电子学的笔记02:OOMMF的报错和部分功能详述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【主动轮廓模型(一)】《Snakes:
- 下一篇: 基于模糊RBF神经网络轨迹跟踪matla