指令輸入區塊

詳細說明:

下面圖為各係數所對應的變數的矩陣名稱,以及初始的值。每個矩陣的大小等同總尺寸的網格數,例如現在設定總尺寸網格

X=120;

Y=130;

Z=140;

那麼矩陣大小就是 size(geox)=120,130,140

提醒:若有輸入結構、則Data_Materials.csv是一定要用到的,三個方向軸的geox,geoy,goez值就是供程式模擬時,判斷是什麼材料用的

這些是程式裡判斷是何種材料(Data_Materials.csv),及什麼材料需要哪個檔案的圖表。基本上只要在輸入材料時看一下表即可。

風行內建的各種繪圖函數都有包括 Isotropic, Anisotropic , Electric Model, Magnetic Model等等可供使用。

您可以設計結構的方式有

方法1 輸入結構 (Method 1 Input Structure )

【指令輸入區塊】使用內部結構函數 Iso_Sphere

%=================球 sphere===========================

radius=150e-9; %diameter=2*radius

nindex=1^2;

sigma=0;

choice='E_Model1'; %E_Iso,PEC,M_Iso,PMC,E_Model1,M_Model1,EM_Model1

gridtype=-1; %electric material -1; magnetic material 1; other 0

xposition=icenter*gdx;

yposition=jcenter*gdy;

zposition=kcenter*gdz;

Iso_Sphere(choice,gridtype,nindex,sigma,xposition,yposition,zposition,radius)

%=================球 sphere===========================

使用內建的函數,我將能用的函數放在 『FonSinEM_Geometries.txt』這個檔案裡。這個txt檔有許多已經寫好的結構,也能在下拉式選單內快速開啟這個檔案,如下圖【指令變數(Command Variables)=>結構(Geometries)】,按下結構就會開啟『FonSinEM_Geometries.txt』這個檔案,輸入的方式就如同下圖裡的右上白色大框框裡。

然後按下執行就能開始設計結構,配合左邊的輔助顯示,看是否結構無誤、沒有超出設定的範圍如碰到觀測範圍、入射波、吸收層等等。若結構設計錯誤,請記得按一下【清除結構】才能把記憶體內的結構歸零,否則已經寫入的結構會還在程式記憶體裡。當結構設定正確後,再按下輸出結構,會輸出的檔案如上圖表。

例如,我們想模擬介電質如玻璃 n=1.5如下圖中nindex=1.5,那麼按下輸出結構後(記得先按執行才能將結構寫入記憶體),就能把程式記憶體內的矩陣寫出成檔案

Data_Materials.csv (裡面紀錄著-有玻璃球體的位置是0.1,其餘皆為0)

Data_Epsr_Isotropic.csv (裡面紀錄著-有玻璃球體的位置是2.25,其餘皆為1)

建立結構的步驟

1. 勾選欲模擬的材料 : ☑ 結構設計(Design Structures)

2. 按 ☑建立 (create) 按鈕

兩個設計結構方式

3a. 方法 1 : 輸入內建結構函數在輸入區塊內 【input panel】

3b. 方法 2 : 載入 2D 圖片 或 3D CAD (*.STL) file

4.按套用畫圖,檢查結構是否正確

5.按 ☑ 輸出結構 (Output. geo) 按鈕將結構檔案輸出

方法2 載入結構 (Method 2 Import Structure )

第2個是配合3D CAD建模軟體,再使用匯入風行的方式 (載入三維模型結構),如上圖方法2

載入二維圖片結構 (Load 2D Figure Structure)

https://sites.google.com/site/fonsinem/jie-gou-she-ji/er-wei-tu-pian-zai-ru

結合建模軟體-導入3D 模型簡介 (Load 3D CAD Model )

https://sites.google.com/site/fonsinem/importmodel

結合建模軟體-導入3D 球體範例 (Load 3D CAD Model Example)

https://sites.google.com/site/fonsinem/importmodel/importcadsample01

外部程式輸入結構法 (Other Input Method)

第3個是(不是在指令輸入區塊中執行的、使用外部程式如Matlab, Scilab, Octave,FreeMat)

外部程式輸入

  1. clear;clear global; clc;

  2. Globalsetup;

  3. ReadParameters;

  4. %--------------------------------------------------

  5. radius=150.e-9;

  6. nindex=1^2;

  7. sigma=0;

  8. for k=1:kb;

  9. for j=1:jb;

  10. for i=1:ib;

  11. check=(radius)^2-( (i*gdx-icenter)^2+(j*gdy-jcenter)^2+(k*gdz-kcenter)^2);

  12. if( check >= 0);

  13. Material_E_Model1_m1;

  14. end

  15. end

  16. end

  17. end

  18. %======================

  19. % Output Parameters

  20. %======================

  21. WriteParameters

結構設計(外部程式輸入)

Hinet 連結

http://fonsinem.myweb.hinet.net/FonSinEM_WriteStructures.zip

Mega 連結

https://mega.nz/#!ftcyiRyL!0M5q_w3UAXsYBjK2FT-8n-kqABLihWh_gdMSJomiPS8

那麼第二種寫法是,請下載【Design_Geometries.zip】檔案(裡面為Matlab檔,若您沒有Matlab而想使用,可以使用免費仿Matlab的軟體如Scilab,)。裡面為能自行書寫結構的檔案。使用的方法很簡單,記得把要【參數設定】的檔案放在解壓縮的【Design_Geometries】,因為必須讀到【Data.set】設定檔。然後寫法如下

使用外部程式如 Matlab, Scilab, Octave, FreeMat

clear;clear global; clc;

Globalsetup;

ReadParameters;

%E_Iso,PEC,M_Iso,PMC,E_Model1,M_Model1,E_AnIso,M_AnIso

%Material_Iso_epsr_m1

%----------------------------------------------------------------------

radius=150.e-9/dx;

nindex=1^2;

sigma=0;

for k=1:kb

for j=1:jb

for i=1:ib

check=(radius)^2-( (i-icenter)^2+(j-jcenter)^2+(k-kcenter)^2);

if( check >= 0)

% Material_E_Model1_m1

% Material_EM_Model1_m1

Material_Iso_epsr_m1

% Material_Iso_mur_m1

% Material_Iso_sigmaE_m1

% Material_Iso_sigmaM_m1

% Material_PEC_p1

% Material_PMC_p1

end

end

end

end %Mie theory

%======================

% Output Parameters

%======================

WriteParameters

圓的方程式是x^2+y^2+z^2=radius^2;上面寫的部分i即代表x軸,(i-icenter)就是將x起始中心座標移至icenter此點

中間藍色的地方是您要自行寫的,紅色部分是固定的,

ReadParameters是讀取Data.set參數檔及將所要使用的參數歸0或1。

WriteParameters是將程式記憶體內的變數矩陣寫入檔案。

若有興趣研究者請看裡面怎麼寫的。

而其中Material_Iso_epsr_m1對應的就是上面函數寫法

Iso_epsr 對應 E_Iso

m1 (minus 1)就是 gridtype=-1; %electric material -1; magnetic material 1; other 0

p1 (plus 1) 就是 gridtype=1;

自行輸入時,對應的方式是

E_Iso == Iso_epsr,Iso_sigmaE

M_Iso == Iso_mur,Iso_sigmaM

其他皆相同,其實推薦您自行書寫結構,尤其在Anisotropic時,裡面的介電質矩陣並不是皆相似、風行裡不見得有內建可供使用。倔時需要您自行定義介電質變換的值。推薦您用此方法來寫結構。任何可定義出數學方程式的都能寫出來,我們舉個例子,如心型。在風行裡並沒有內建此結構圖

請參考此網址Threedimensional,心型方程式

http://www.mathematische-basteleien.de/heart.htm

check1=(2*x^2+y^2+z^2-1)^3-x^2*z^3/10-y^2*z^3 ;

其中的1就是我們可以調整的大小,那要如何畫?如下

clear;clear global; clc;

Globalsetup;

ReadParameters;

%E_Iso,PEC,M_Iso,PMC,E_Model1,M_Model1,E_AnIso,M_AnIso

%Material_Iso_epsr_m1

%----------------------------------------------------------------------

R=150.e-9/dx;

nindex=1^2;

sigma=0;

for i=1:ib

for j=1:jb

for k=1:kb

x=i-icenter;

y=j-jcenter;

z=k-kcenter;

check1=(2*x^2+y^2+z^2-R^2)^3-x^2*z^3/10-y^2*z^3 ;

if ( check1 <= 0. )

% Material_E_Model1_m1

% Material_EM_Model1_m1

% Material_Iso_epsr_m1

% Material_Iso_mur_m1

Material_Iso_sigmaE_m1

% Material_Iso_sigmaM_m1

% Material_PEC_p1

% Material_PMC_p1

end;

end;

end;

end;

%======================

% Output Parameters

%======================

WriteParameters

這個心型方程式心的形狀可能沒那麼明顯,當然您也可以用其他的心型方程,或者其他特別結構。看您若有特殊需求只要數學方程式描述的出來的都能作。

那麼我們再來看看Material_Iso_sigmaE_m1這個檔案裡的內容

geox(i ,j ,k)=0.1;

geoy(i ,j ,k)=0.1;

geoz(i ,j ,k)=0.1;

if(k~=1);

geox(i ,j ,k-1)=0.1;

geoy(i ,j ,k-1)=0.1;

end

if(j~=1);

geox(i ,j-1 ,k)=0.1;

geoz(i ,j-1 ,k)=0.1;

end

if(i~=1);

geoy(i-1 ,j ,k)=0.1;

geoz(i-1 ,j ,k)=0.1;

end;

sigmaex(i ,j ,k) =sigma;

sigmaey(i ,j ,k) =sigma;

sigmaez(i ,j ,k) =sigma;

if(k~=1);

sigmaex(i ,j ,k-1)=sigma;

sigmaey(i ,j ,k-1)=sigma;

end

if(j~=1);

sigmaex(i ,j-1 ,k)=sigma;

sigmaez(i ,j-1 ,k)=sigma;

end

if(i~=1);

sigmaey(i-1 ,j ,k)=sigma;

sigmaez(i-1 ,j ,k)=sigma;

end;

我們選擇了Iso_SigmaE的材料,他是屬於isotropic electric material 各向同性的電性材料。因此geox,geoy,geoz填入 0.1; 而另外還需要sigmaex,sigmaey,sigmaez三個方向的值。

#這個是網格數用減1(m1:minus 1)的寫法,是對應著電場的網格點。詳細情形可參照FDTD網格的說明那篇。而因為這個程式判定的寫法裡,使用了許多if條件式(由於有邊界、避免當結構是需要第一格或最後一格時,出現失誤)。因此迴圈跑完會多了非常多的時間,若您熟悉FDTD網格後,強烈建議您用更簡潔的寫法,例如同樣寫心型結構,因為邊界並不會用到,因此可以換成下面的寫法

R=150.e-9/dx;

nindex=1^2;

sigma=0;

for i=2:ib

for j=2:jb

for k=2:kb

x=i-icenter;

y=j-jcenter;

z=k-kcenter;

check1=(2*x^2+y^2+z^2-R^2)^3-x^2*z^3/10-y^2*z^3 ;

if ( check1 <= 0. )

geox(i ,j ,k)=0.1;

geoy(i ,j ,k)=0.1;

geoz(i ,j ,k)=0.1;

geox(i ,j ,k-1)=0.1;

geoy(i ,j ,k-1)=0.1;

geox(i ,j-1 ,k)=0.1;

geoz(i ,j-1 ,k)=0.1;

geoy(i-1 ,j ,k)=0.1;

geoz(i-1 ,j ,k)=0.1;

sigmaex(i ,j ,k) =sigma;

sigmaey(i ,j ,k) =sigma;

sigmaez(i ,j ,k) =sigma;

sigmaex(i ,j ,k-1)=sigma;

sigmaey(i ,j ,k-1)=sigma;

sigmaex(i ,j-1 ,k)=sigma;

sigmaez(i ,j-1 ,k)=sigma;

sigmaey(i-1 ,j ,k)=sigma;

sigmaez(i-1 ,j ,k)=sigma;

end;

end;

end;

end;

如此一來在執行時的速度就會快非常多了。寫結構的方式很多、這裡只是其中的一種,供您參考。

如果想自行書寫結構,除了利用風行內建的指令輸入區塊外,另外提供外部程式輸入方式

需要自行利用數學式描述結構,並將之以程式的方式輸入,有興趣的朋友可自行研究

下載連結:

結構設計(外部程式輸入)

Hinet 連結

http://fonsinem.myweb.hinet.net/FonSinEM_WriteStructures.zip

Mega 連結

https://mega.nz/#!ftcyiRyL!0M5q_w3UAXsYBjK2FT-8n-kqABLihWh_gdMSJomiPS8

第一種:直接輸入法

範例檔案 Example_Sphere.m

如下所示,這是輸入一顆三維球形的判斷式

球形數學式為 X^2+Y^2+Z^2=R^2

外部程式輸入 ---- 直接輸入法

  1. %------------ 初始化 --------------------

  2. clear;clear global;clc;clearvars;

  3. Global_Varibles;

  4. ReadParameters;

  5. %--------------------------------------------------------------------------------

  6. radius=150.e-9/dx;

  7. nindex=1^2;

  8. sigma=0;

  9. for k=1:kb

  10. for j=1:jb

  11. for i=1:ib

  12. check=(radius)^2-( (i-icenter)^2+(j-jcenter)^2+(k-kcenter)^2);

  13. if( check >= 0)

  14. Material_E_Model1_m1

  15. end

  16. end

  17. end

  18. end

  19. %--------------------------------------------------------------------------------

  20. %------------- 輸出結構-----------------

  21. WriteParameters

藍色的部分為預設請不要變更,上方為初始化各個結構參數。下方 WriteParameters 則為將參數寫出到各個檔案

而這個範例中我們設定此球形為150奈米,後面之所以除上 dx 是為了配合下方迴圈ib,jb,kb,icenter,jcenter,kcenter

這些數值為純格子點數量

換句話說,也可以用下方這個方式來書寫,如下面紅字部分

因此,上方的寫法是在預設 dx=dy=dz下,速度較快的寫法(注意在迴圈內加減乘除計算越少越好)

  1. %--------------------------------------------------------------------------------

  2. radius=150.e-9;

  3. nindex=1^2;

  4. sigma=0;

  5. for k=1:kb

  6. for j=1:jb

  7. for i=1:ib

  8. check=(radius)^2-( (i*dx-icenter*dx)^2+(j*dy-jcenter*dy)^2+(k*dz-kcenter*dz)^2);

  9. if( check >= 0)

  10. Material_E_Model1_m1

  11. end

  12. end

  13. end

  14. end

  15. %--------------------------------------------------------------------------------

最後要注意的是 Material_E_Model1_m1

這個指的就是使用 E_Model1 的參數模型,m1代表為gridtype為-1

在此我們先解釋為什麼要有gridtype這個分別

gridtype=-1 為電性材料填充對應的網格;

gridtype=1 為磁性材料填充對應的網格;

gridtype=0 則不做網格對應

詳細請參照

https://sites.google.com/site/fonsinem/she-ji-fen-xi-tu-xing-jie-mian/fu-zhu-xian-shi

另外當然程式裡能用的其他材料都有提供在裡面,可自行研究

Material_Iso_epsr....

Material_Iso_mur....

Material_Iso_sigmaE....

Material_Iso_sigmaM....

.......

第二種:函數(Function)輸入法

範例檔案 Example_square.m

這個的輸入方式為風行內建的指令輸入區塊所使用的函數寫法,此方法判斷式繁瑣

速度較上面第一種書寫方式慢很多,好處是輸入方便

有興趣者可自行研究

外部程式輸入 --- 函數(Function)輸入法

  1. %------------ 初始化 --------------------

  2. clear;clear global;clc;

  3. Global_Varibles

  4. ReadParameters

  5. Initializedgeometries

  6. %--------------------------------------------------------------------------------

  7. %=================矩形孔洞 SquareHole===========================

  8. lengthx=450e-9;

  9. lengthy=100e-9;

  10. lengthz=100e-9;

  11. nindex=1^2;

  12. sigma=0;

  13. choice='PEC'; %E_Iso,PEC,M_Iso,PMC,E_Model1,M_Model1,EM_Model1

  14. gridtype=-1; %

  15. xposition=icenter*gdx;

  16. yposition=jcenter*gdy;

  17. zposition=kcenter*gdz;

  18. Iso_SquareHole(choice,gridtype,nindex,sigma,xposition,yposition,zposition,lengthx,lengthy,lengthz)

  19. %=================矩形孔洞 SquareHole===========================

  20. %--------------------------------------------------------------------------------

  21. %------------- 輸出結構-----------------

  22. WriteParameters