【DDSCAT——離散偶極近似仿真程序12】calltarget與vtrconvert程序的使用

       這部分我們補充一下calltarget與vtrconvert的使用,並帶來另外一個精簡型可視化軟件ParaView的使用,並與前面介紹的Vislt進行了對比。

 

一、calltarget

       1)calltarget的使用

       calltarget,顧名思義,呼喚目標對象,即用來生成模型的程序。

       首先,需要說一下,使用DDSCAT內置模型進行消光近場計算的方式不只有在ddscat.par中設置shape參數。

       也可以使用DDSCAT內置的calltarget.exe程序,先幫助我們生成一個target.out模型文件,然後改名爲shape.dat,再根據前面介紹的FROM_FILE方法計算消光近場。此步驟相當於,DDSCAT幫助我們自主創建的模型,然後以文件的方式引用到ddscat.par中,與上面的一步法不同。

       與ddscat.exe和ddpostprocess.exe不同的是,calltarget.exe和vtrconvert.exe不需要對應的參數配置文件。

       cmd指令並進入有calltarget程序的路徑中,然後輸入calltarget.exe指令,出現如下圖的內容。給出了一系列的DDSCAT內置模型,並問我們需要選擇哪種。

       之前也有網友問我,爲什麼examples_exp裏面的示例不全,沒有手冊裏面所述的其他模型。現在看到calltarget程序顯示的示例,我們再來對比User Guide使用手冊中的內容,就可以知道手冊裏提到的模型現在都可以通過calltarget創建。

       現在我們假定輸入一個ELLIPSOID,表示想要生成一個球體。然後命令結果會提示我們輸入xv, yv, zv三個參數,表示橢球體的三個軸長。我們輸入19 19 19,表示生成一個直徑爲19的球體。這裏需要注意的是,三個參數需要以space空格隔開,有可能別的方式隔開也可以,不過目前我只確定空格是沒有問題的。生成結束後,此時程序並沒有運行完,繼續提示你進行輸入橢球的參數。這時如果需要剛纔創建好的模型,就不要再輸入了,因爲產生的target.out文件不會自動改文件名,因而會覆蓋剛剛產生的模型文件。此時,輸入0 0 0,結束程序。

       上圖中模型創建成功生成了一些文字說明,其中TARGET中的1.000 1.000 1.000表示晶格間距,此時不要驚慌,認爲1這樣的間距是不是太大了。根據我們第四部分的講解,其實,最後的d還是由我們自己設定的aeff有效半徑決定的。

       aeff確定,則V確定,V確定且N(即爲NATO=3695)確定,則d確定。

       而命令行中的SIZER,根據內容我們可以判斷出,這表示能夠囊括此球體的最小立方體積爲19*19*19=6859。

       此時打開創建模型成功後生成的target.out文件,NAT和lattice spacings與命令行中相一致。

       2)部分參數解釋

       根據我們上一篇(第11篇)中對模型旋轉的介紹所涉及到的一些內容,我們可以知道,上圖target.out文件內容中的部分參數意義。

       首先,A_1 vector和A_2 vector,即是上一篇中所提的 a^1 和 a^2 兩個正交向量,a^1初始狀態爲沿着x軸,因而表示爲1 0 0,a^2初始狀態爲沿着y軸,因此表示爲0 1 0。

       其次,對於lattice spaceings我們剛纔說到,它不表示偶極子之間的間距,d才表示。其描述的值爲(d_x,d_y,d_z)/d,既然默認值定爲1 1 1,那麼這裏我們正常設計模型可以忽略此參數。雖然目前對d_x,d_y,d_z的概念尚不清楚,但是我們可以理解爲,它表示了在每個座標軸上對模型的拉伸,如果爲值爲1 1 1,則表示模型比例不變。在下文中,我們將換一種模型,並對其可視化來理解這個概念。

       最後,lattice offset,表示模型中心的距離Lab框架中心的偏移量。對於模型中心的理解,其實並不是模型的幾何中心,而是a^1 和 a^2 兩個向量的起點。這個起點的設定方式,可以由我們自己設定。若改變了lattice offset,即改變了模型的旋轉中心,也就改變了模型在Lab框架中的位置。但是,根據我目前的實驗結果和思考,這個設定應該是沒有意義的。下文中我們解釋爲什麼。

       另外,在上一篇中,我提到可以將a^1和a^2看作Target Frame中的座標系,此時我在手冊中又找到了一些相關說明:

       上圖中框出的部分,都說明是在TF中的參數,這就表明,所有有關shape文件的參數,都是在TF框架中指定的。

 

二、對於自建模型,不同lattice offset下的近場結果

       1)先來看模型設計Matlab代碼,這裏創建了一個長寬高分別爲39 31 19的立方體。

nat = 0;
% 模型中心在 0 0 0
for x=-19:19
    for y=-9:9
        for z=-15:15
            nat=nat+1;
            ixyz(nat,1)=x;
            ixyz(nat,2)=y;
            ixyz(nat,3)=z;
            ixyz(nat,4)=1;
            ixyz(nat,5)=1;
            ixyz(nat,6)=1;
        end
    end
end

shape=fopen('CSDN_Block.dat','w'); % 運行時將文件名至於獨立文件夾中並改名爲shape.dat即可
for natnumber=1:nat
    fprintf(shape,'%4i',natnumber,ixyz(natnumber,1),ixyz(natnumber,2),ixyz(natnumber,3),ixyz(natnumber,4),ixyz(natnumber,5),ixyz(natnumber,6));
    fprintf(shape,'\n');
end
fclose(shape);

       Matlab代碼裏面此時沒有寫上shape.dat前面幾行的說明和參數,此時我們自行復制粘貼補上。

       這裏設定的lattice offset爲0 0 0,與模型的中心相對應,因而,做近場計算(具體的所有ddscat.par參數目前不重要,只要保證後面幾次的設定統一就行,因而此處沒有給出)可視化之後,如下圖。

       可以看到Vislt中的座標軸中心和我們創建的立方塊幾何中心是重合的。

       2)我們再使用Matlab創建兩外一個同樣大小的立方體,但幾何中心在19 9 15。

nat = 0;
% 模型中心在 19 9 15
for x=0:38
    for y=0:18
        for z=0:30
            nat=nat+1;
            ixyz(nat,1)=x;
            ixyz(nat,2)=y;
            ixyz(nat,3)=z;
            ixyz(nat,4)=1;
            ixyz(nat,5)=1;
            ixyz(nat,6)=1;
        end
    end
end

shape=fopen('CSDN_Block2.dat','w'); % 運行時將文件名至於獨立文件夾中並改名爲shape.dat即可
for natnumber=1:nat
    fprintf(shape,'%4i',natnumber,ixyz(natnumber,1),ixyz(natnumber,2),ixyz(natnumber,3),ixyz(natnumber,4),ixyz(natnumber,5),ixyz(natnumber,6));
    fprintf(shape,'\n');
end
fclose(shape);

       同時,shape文件中設定lattice offset爲0 0 0。

       此時的近場可視化如下圖。座標軸中心在0 0 0處,而幾何中心在19 9 15處,這符合我們的設定。        

       3)此時,僅對第二個模型shape文件中的lattice offset進行更改,改爲19 9 15。

       此時,近場圖如下,可以看到座標軸中心和立方體幾何中心是重合的。我們可以這樣理解這個現象,首先,幾何中心不再原點,而在19 9 15;然後,將lattice offset也設定爲19 9 15,則與幾何中心重合;最後,最終的座標軸原點將定爲lattice offset所在的位置。這樣一來,就通過相對一致的位置設定,將第二個偏移了座標軸原點的模型,重新拉回了座標軸中心。

       那爲什麼說lattice offset這樣的設定沒有意義呢,因爲入射光是沿着x軸正方向的一個平面波,首先考慮模型不旋轉的情況:此時,不論模型LF中的什麼位置,任何位置處的消光計算和近場計算結果都是一樣的,因爲入射光是相對同一方向的平面波;其次,考慮模型旋轉的情況:我們可以把lattice offset的位置考慮爲a^1座標軸的起點,看似座標軸的起點可以通過lattice offset改變位置,而實質是,不管改變到哪裏,旋轉的形式都是相對一致,只要a^1和a^2座標軸的方向保持相對不變(即1 0 0和0 1 0),這模型整體在TF中的方向是不變的。這一觀點我們可以這樣思考,即向量是一個有方向和大小的量,但是他們沒有固定的位置,是在空間中的一個相對方向。因而,改變lattice offset並不能改變a^1和a^2的方向,因此這個座標點的設定意義不大。

 

三、calltarget的使用細節

       對於calltarget的使用,我們對於所有要求輸入的尺寸,最好輸入奇數而不是偶數,這樣才能保持模型在該參數的對應方向上是對稱的。

       1)calltarget→ELLIPSOID→18 18 18

      通過設定ELLIPSOID的輸入參數爲18 18 18產生的targe.out文件可以直接可視化(這個方法我們在後面的vtrconvert中會講到),下圖爲Vislt對模型進行的可視化,使用的是Add→Pseudocolor→Composition疊加Operators→Slicing→Isosurface方法。

       在輔助線的幫助下,我們可以看到,球體的球心不在座標軸中心。這是因爲這個模型的球心不可能在座標軸中心,因爲每個座標軸上的偶極子點數都是偶數個,而DDSCAT的偶極子點設定又只能是整數,所以球心不會與座標軸中心重合。因而內置ELLIPSOID算法產生的球體球心是接近於座標軸中心的。

       下面再看下產生的target.out文件,其中的lattice offset設定的位置爲0.5 0.5 0.5。根據我的猜想,這隻能是一種理論上的位置,因爲是小數,所以是不能把模型的球心拉回到座標軸中心的。

       2)calltarget→ELLIPSOID→19 19 19

       此時,針對ELLIPSOID設定了奇數參數的模型,可視化出的球體就位於座標軸中心了,同時lattice offset也將變爲0 0 0。

 

四、vtrconvert的使用

       對於上文中我們提到的19 19 19球體模型,我們可以不進行近場計算,也可以將calltarget生成的target.out文件直接轉換爲vtr文件,從而可視化。此時,就是DDSCAT中最後一個exe執行程序登場的時候了,即vtrconvert.exe。

       使用方法爲,在同時有shape.dat和vtrconvert.exe程序的文件夾中,cmd命令行進入該路徑,並輸入vtrconvert.exe target.out vtrname,回車即可生成vtr文件。對於此輸入命令,第二個參數不用一定爲target.out(或shape.dat),也可以是別的文件全名,只要文件裏的內容是shape.dat的規範形式即可。而第三個參數爲輸出文件的命名,也是用戶自主命名。

       出現we will output VTK name: 這樣的內容的時候,就表示我們的shape.dat文件沒有問題,已經被轉換爲了vtr可視化文件。

       此處需要注意,如果通過vtrconvert程序將shape.dat轉換爲vtr的過程中報錯了,則說明shape.dat文件不符合規範,如果直接去運行ddscat程序,也一樣會報錯。即,若vtrconvert程序報錯,則ddscat程序必報錯。

 

       此時使用Vislt對vtrname.vtr進行可視化的步驟如下。

       注意,因爲沒有近場計算,所以我們添加僞彩效果呈現模型時,只能選擇Composition,即以材料的不同構成展現模型。而不像之前進行過近場計算的模型,此時還可以選擇Intensity,即以電場強度的形式呈現模型。

       第二步,在Silicing中添加Isosurface,即可看到模型的表面輪廓。

 

       當然,我們可以繼續選擇添加Silicing中別的切面方式或其他的模型效果,更多的可視化功能我們將在下一篇繼續介紹。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章