指令輸入區塊
詳細說明:
下面圖為各係數所對應的變數的矩陣名稱,以及初始的值。每個矩陣的大小等同總尺寸的網格數,例如現在設定總尺寸網格
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)
外部程式輸入
clear;clear global; clc;
Globalsetup;
ReadParameters;
%--------------------------------------------------
radius=150.e-9;
nindex=1^2;
sigma=0;
for k=1:kb;
for j=1:jb;
for i=1:ib;
check=(radius)^2-( (i*gdx-icenter)^2+(j*gdy-jcenter)^2+(k*gdz-kcenter)^2);
if( check >= 0);
Material_E_Model1_m1;
end
end
end
end
%======================
% Output Parameters
%======================
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
外部程式輸入 ---- 直接輸入法
%------------ 初始化 --------------------
clear;clear global;clc;clearvars;
Global_Varibles;
ReadParameters;
%--------------------------------------------------------------------------------
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
end
end
end
end
%--------------------------------------------------------------------------------
%------------- 輸出結構-----------------
WriteParameters
藍色的部分為預設請不要變更,上方為初始化各個結構參數。下方 WriteParameters 則為將參數寫出到各個檔案
而這個範例中我們設定此球形為150奈米,後面之所以除上 dx 是為了配合下方迴圈ib,jb,kb,icenter,jcenter,kcenter
這些數值為純格子點數量
換句話說,也可以用下方這個方式來書寫,如下面紅字部分
因此,上方的寫法是在預設 dx=dy=dz下,速度較快的寫法(注意在迴圈內加減乘除計算越少越好)
%--------------------------------------------------------------------------------
radius=150.e-9;
nindex=1^2;
sigma=0;
for k=1:kb
for j=1:jb
for i=1:ib
check=(radius)^2-( (i*dx-icenter*dx)^2+(j*dy-jcenter*dy)^2+(k*dz-kcenter*dz)^2);
if( check >= 0)
Material_E_Model1_m1
end
end
end
end
%--------------------------------------------------------------------------------
最後要注意的是 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)輸入法
%------------ 初始化 --------------------
clear;clear global;clc;
Global_Varibles
ReadParameters
Initializedgeometries
%--------------------------------------------------------------------------------
%=================矩形孔洞 SquareHole===========================
lengthx=450e-9;
lengthy=100e-9;
lengthz=100e-9;
nindex=1^2;
sigma=0;
choice='PEC'; %E_Iso,PEC,M_Iso,PMC,E_Model1,M_Model1,EM_Model1
gridtype=-1; %
xposition=icenter*gdx;
yposition=jcenter*gdy;
zposition=kcenter*gdz;
Iso_SquareHole(choice,gridtype,nindex,sigma,xposition,yposition,zposition,lengthx,lengthy,lengthz)
%=================矩形孔洞 SquareHole===========================
%--------------------------------------------------------------------------------
%------------- 輸出結構-----------------
WriteParameters