ã¯ããã«
openEMSã¯ããªã¼ã§ãªã¼ãã³ã½ã¼ã¹ã®FDTDï¼æéå·®åæéé åæ³ï¼ã®é»ç£ç解æã½ããã§ãåã¯çµæ§æ°ã«å ¥ã£ã¦ä½¿ã£ã¦ããã®ã ããæ¥æ¬ã§ã¯ãã¾ãæµè¡ã£ã¦ããªãããã£ã¨åºã¾ã£ã¦ãããã¨æããã ãã©ãªãã
openEMSã¯ãMatlabã¾ãã¯GNU Octaveã§3Dã¢ãã«ãä½æãããä»ã®ææã®é»ç£ç解æã½ããï¼HFSSã¨ãCOMSOLã¨ãï¼ã¨éã£ã¦ãã¡ãã·ã¥ãèªåã§åããªããã°ãããªãã¨ãããé£ãããä¸å¿ãã¡ãã·ã¥ãããæãã«åã£ã¦ãããSmoothMeshé¢æ°ãªã©ãç¨æããã¦ããããããããªããªã使ãã«ãããå¦çãæ©ãçµããæãããã°æ¡ä»¶ã«ãã£ã¦ã¯å»¶ã ã¨çµãããªãæããã£ã¦ãçµæ§çã®ããé¢æ°ã ã
ããã§ãç°¡åã«openEMSã®ã¡ãã·ã¥ãåå²ããé¢æ°ãèªä½ãã¦ã¿ããã½ã¼ã¹ã³ã¼ãã¯ä¸çªä¸ã«è¼ããã
ã¡ãã·ã¥åå²ã®èãæ¹
ãããã£ã±ãªã¤ã¡ã¼ã¸ãæã£ã¦ãããããã«ä¸ã®ä¾ãè¦ã¦ã»ããã
FR4ã®åºæ¿ä¸ã«PECï¼perfect electric conductorï¼ã§ä½ã£ããã¤ã¯ãã¹ããªããç·è·¯ã¨ä¸å¤®ã«DUTãããã¢ãã«ãã¡ã¿ã«ã®ã¨ãã¸ã«ã¯é»çãéä¸ããããã®ã§ã¡ãã·ã¥ã¯ç´°ããåããããä¸æ¹ã§ããªãã¸ã§ã¯ãããé¢ããé»çãå¼±ãé¨åã¯ã¡ãã·ã¥ã¯ç²ãã¦ãåé¡ãªããã¨ãã¸ä»è¿ã¯ç´°ãããã¦ãå¾ã ã«ééãåºãã¦ãããããªã¡ãã·ã¥ã®åãæ¹ãæã¾ãããå ¨é¨ç´°ããåå²ãã¦ãã¾ãã®ã¯ãç¡é§ã«è¨ç®æéãé·ããªã£ã¦ãã¾ãå¹ççã§ãªãã
ä¸ã®ãããªã¡ãã·ã¥åå²æ³ãããå°ãå ·ä½çã«è¡¨ãã¨ã
- ãªãã¸ã§ã¯ãã®ã¨ãã¸å¨è¾ºã¯æå°ã¡ãã·ã¥å解è½ï¼min_resï¼ã§åå²ãã
- ä¸å®ã®æ¯çï¼ratioï¼ã§å¾ã ã«ã¡ãã·ã¥ã®ééã大ãããã
- æ大ã¡ãã·ã¥å解è½ï¼max_resï¼ã«éããããçééã«åå²ãã
ããã§ã以ä¸ã®ãã©ã¡ã¼ã¿ãå®ç¾©ãã¦ãããmax_resï¼æ大ã®ã¡ãã·ã¥å解è½ãmin_resï¼æå°ã®ã¡ãã·ã¥å解è½ãratioï¼é£ãåãã¡ãã·ã¥ã®æ¯ã®ä¸éå¤ã
ç®å®ã¨ãã¦ãmax_resã¯æ³¢é·Î»ã®1/30ãmin_resã¯max_res/5ãratioã¯1.3ãããã«è¨å®ããã¨ããã¨æãã
ã§ã¯ãå®éã«x1ããx2ã®åºéï¼x2>x1ï¼ãä¸ã®ã«ã¼ã«ã«å¾ã£ã¦åå²ããæ¹æ³ãèãã¦ã¿ãããããã§ã¯ãx=x1ã«ãªãã¸ã§ã¯ãã®ã¨ãã¸ãããã¨ä»®å®ãã¦ãx=x1è¿åã¯ç´°ãããx=x2ã«åããã»ã©ééãåºãã£ã¦ããããã«ãããã
ã¨ãã£ã¦ããåã¯æ°å¦çãªé£ãããã¨ã¯è¦æãªã®ã§ãå°å¦çã§ãæãã¤ããããªæ¹æ³ã§ãã£ã¦ã¿ããã¾ããé·ãã (x2-x1) ã®ãã¼ããç¨æããã
ãã¼ãã®å·¦ç«¯ããmin_resã®é·ãåã ãããµãã§åãåãã
ratioã®æ¯çã§å¾ã ã«åãé·ããå¢ããã¦ãããé·ããmax_resã«éãããããã¨ã¯max_resã§çééã«åã£ã¦ããã
æå¾ã«åã端ï¼ãã¾ãï¼ãæ®ããåã端ã®é·ãã§å ´ååãããã
i) åã端ã®é·ã ⥠min_res ã®ã¨ã
ããã¯ç°¡åãå°ããé ã«ä¸¦ã³æ¿ããã ãï¼ã½ã¼ãï¼ã並ã³æ¿ããå¾ã®åã端ã¨é£æ¥ããã¡ãã·ã¥ã¨ã®æ¯ã¯å¿
ãratio以ä¸ã«ãªãã®ã§OKã
ii) åã端ã®é·ã < min_res ã®ã¨ã
ii-a) å³äºã¤ã®é·ãã®åè¨ â¥ 2Ãmin_res ã®ã¨ã
åã端ã¨å³ãã2çªç®ï¼ã¤ã¾ãä¸çªé·ããã¤ï¼ãä¸æ¦ãã£ã¤ãã¦ãåã端ãmin_resã«ãªãããã«ååé
ããããã¨ã¯ã½ã¼ãããã°OKã
ii-b) å³äºã¤ã®é·ãã®åè¨ < 2Ãmin_res ã®ã¨ã
ãã®å ´ååãã¯ãåå²æ°ãå°ãªãã¨ãã«çºçããããã®å ´åãåã端ãã´ãç®±ã«ã½ããã¦ãæ®ãã®ãã¼ãã®é·ãã®åè¨ã (x2-x1) ã«ãªãããã«ã¹ã±ã¼ãªã³ã°ããã
以ä¸ã®ã¢ã«ã´ãªãºã ã§ã¡ãã·ã¥åå²ã§ããããã«ãªã£ãããã¨ã¯å®è£ ããã ãã
å®è£ ã»é¢æ°ã®ä½¿ãæ¹
Matlab/GNU Octaveã®é¢æ°ã¨ãã¦å®è£ ãããã½ã¼ã¹ã³ã¼ãã¯ä¸çªä¸ã«è¼ãããããã§ã¯ãé¢æ°ã®ä½¿ãæ¹ã説æããã
GradedMeshLines()
GradedMeshLines()ã¯1次å ã®ã¡ãã·ã¥åå²ãããé¢æ°ã
function lines = GradedMeshLines(lines, max_res, min_res, ratio)
å¼æ°ã«ããã¨ã¨ãªãã°ãªããï¼ä¸¡ç«¯ã®åº§æ¨ããªãã¸ã§ã¯ãã®ã¨ãã¸ã®åº§æ¨ã®é åï¼ã¨ãmax_resãmin_resãratioã渡ããmin_resã¨ratioã¯ãªãã·ã§ã³ã§ããããmax_res/5ã1.3ãããã©ã«ãå¤ã¨ãã¦ããã
使ãæ¹ã®ä¾âï¼ãã®ã¾ã¾å®è¡å¯è½ï¼
lines = [-10 0 10]; % ãã¨ã¨ãªãã°ãªãã lines = GradedMeshLines(lines, 1); % ã¡ãã·ã¥åå² % ãããã figure('Position', [100 100 600 100]); for x = lines plot([x x], [0 1], 'k-'); hold on; end
ããã®å®è¡çµæãä¸ã
å¤ãã®å ´åãã·ãã¥ã¬ã¼ã·ã§ã³ã¢ãã«ã®ä¸¡ç«¯ã¯å¸åå¢çã«å²ãå½ã¦ãã®ã§ã両端ã¯ã°ã¬ã¼ãã£ã³ã°ãããå å´ã®ã©ã¤ã³ããªãã¸ã§ã¯ãã®ã¨ãã¸ã¨ã¿ãªãã¦ã¡ãã·ã¥åå²ããããã«ãã¦ããã
GradedMesh()
GradedMesh()ã¯3次å ã®ã¡ãã·ã¥åå²ãããé¢æ°ã
function mesh = GradedMesh(mesh, max_res, min_res, ratio)
openEMSã®Matlab/Octaveé¢æ°ã®ä¸ã«DetectEdges()ã¨ãã便å©ãªé¢æ°ãããã®ã§ãæåã«DetectEdges()ã§CSXã®ãªãã¸ã§ã¯ãã®ã¨ãã¸ãæ¤åºãã¦ãããGradedMesh()ãé©ç¨ããã°ç°¡åã«ã¡ãã·ã¥ãä½æãããã
使ãæ¹ã®ä¾âï¼openEMSã®CSXãªãã¸ã§ã¯ãä½æå¾ï¼
resolution = 1; % mm mesh = DetectEdges(CSX); % CSXãªãã¸ã§ã¯ãã®ã¨ãã¸ãæ¤åº mesh = GradedMesh(mesh, resolution); % ã¡ãã·ã¥ãåå² CSX = DefineRectGrid(CSX, unit, mesh); % ç´äº¤åº§æ¨ç³»ã®ã°ãªãããè¨å®
ã½ã¼ã¹ã³ã¼ã
ãã¡ã¤ã«åï¼GradedMeshLines.m
function lines = GradedMeshLines(lines, max_res, min_res, ratio) % function lines = GradedMeshLines(lines, max_res, min_res, ratio) % % input parameters: % lines lines to create a graded mesh in between. % max_res maximum resolution. % min_res (optional) minimum resolution. default is max_res/5. % ratio (optional) ratio of adjacent grids. default is 1.3. if ~exist('min_res', 'var') min_res = max_res/5; end if ~exist('ratio', 'var') ratio = 1.3; end lines = uniquetol(lines); if length(lines) < 3 n = 1+floor(abs(lines(end)-lines(1))); lines = linspace(lines(1), lines(end), n); else lines_copy = lines; lines = [lines singleGradedMesh(lines_copy(2), lines_copy(1), max_res, min_res, ratio)]; lines = [lines singleGradedMesh(lines_copy(end-1), lines_copy(end), max_res, min_res, ratio)]; for n = 2:length(lines_copy)-2 lines = [lines doubleGradedMesh(lines_copy(n), lines_copy(n+1), max_res, min_res, ratio)]; end lines = sort(lines); end end function lines = singleGradedMesh(x1, x2, max_res, min_res, ratio) delta_total = abs(x1-x2); delta = [min_res]; while sum(delta) < delta_total delta = [delta min(ratio*delta(end), max_res)]; end delta(end) = delta_total-sum(delta(1:end-1)); if delta(end) < min_res && length(delta) > 1 if sum(delta(end-1:end)) > 2*min_res delta(end-1) = sum(delta(end-1:end))-min_res; delta(end) = min_res; else scaling = delta_total/sum(delta(1:end-1)); delta = scaling*delta(1:end-1); end end delta = sort(delta); lines = []; for n = 1:length(delta)-1 lines = [lines x1+sign(x2-x1)*sum(delta(1:n))]; end end function lines = doubleGradedMesh(x1, x2, max_res, min_res, ratio) delta_total = abs(x1-x2); delta = [min_res]; while sum(delta) < delta_total if mod(length(delta), 2) == 0 delta = [delta min(ratio*delta(end), max_res)]; else delta = [delta delta(end)]; end end delta(end) = delta_total-sum(delta(1:end-1)); if delta(end) < min_res && length(delta) > 1 if sum(delta(end-1:end)) > 2*min_res delta(end-1) = sum(delta(end-1:end))-min_res; delta(end) = min_res; else scaling = delta_total/sum(delta(1:end-1)); delta = scaling*delta(1:end-1); end end delta = sort(delta); delta = [delta(1:2:end) flip(delta(2:2:end))]; lines = []; for n = 1:length(delta)-1 lines = [lines x1+sign(x2-x1)*sum(delta(1:n))]; end end
ãã¡ã¤ã«åï¼GradedMesh.m
function mesh = GradedMesh(mesh, max_res, min_res, ratio) if ~exist('min_res', 'var') min_res = max_res/5; end if ~exist('ratio', 'var') ratio = 1.3; end mesh.x = GradedMeshLines(mesh.x, max_res, min_res, ratio); mesh.y = GradedMeshLines(mesh.y, max_res, min_res, ratio); mesh.z = GradedMeshLines(mesh.z, max_res, min_res, ratio); end