2011-05-11 4 views
2

私はFDTD割り当てをしていますが、うまくいきません。ソースを入れてシミュレーションを少し実行させるときはいつでも(注 - テストするとデバッガを使用してループをステップする必要があります。それ以外の場合は大きなオーバーフローが起こります)FDTDは準境界や他の質問にあふれています。

私が見たシミュレーションの大半で、人々はExとEyを別々の部分に分けて、それらを1つの大きなE行列に入れ、インデックスオフセットを使用します(Ep(u、v + 1)とE u + 1、v)を計算してEyとExを独立に計算する)。私は参考のために使用さ

源は以下の通りであった。 http://fdtd.wikispaces.com/http://www.mathworks.com/matlabcentral/fileexchange/21000-tiny-fdtd-v1-0 1は音響ですが、うまく動作すること。

close all; 


    %% Some user modifiable parameters 
    mu0 = pi*4E-7; % pH/µm 
    e0 = 8.854187E-12; % Picofarads/micron 
    c = 1/sqrt(mu0*e0); 

    cellsizeX = 100;  % Size of Yee-Cell in microns 
    cellsizeY = 100;  % Size of Yee-Cell in microns 
    numX = 100; % Number of cells in X direction 
    numY = 100; % Number of cells in Y direction 
    lambda = 700*10^-9; 
    dx = lambda/20; 
    dy = lambda/20; 
    dt = (c*sqrt(dx^-2+dy^-2))^-1; 

    t0 = 100;  %index time of gaussian pulse peak 
    width = 10;  %peakyness of gaussian pulse 

    %% Initialise the H and E array 
    H = zeros(2*numX, 2*numY);  
    Hp = zeros(2*numX, 2*numY); 
    E = zeros(2*numX+1,2*numY+1);  
    Ep = zeros(2*numX+1,2*numY+1);  
    Etemp = zeros(2*numX+1,2*numY+1); 
    Htemp = zeros(2*numX, 2*numY); 
    P = zeros(2*numX+1,2*numY+1); 
    Pp = zeros(2*numX+1,2*numY+1); 

    % Scaling factors for H and E fields 

    CEx = dt/(dx*mu0); 
    CEy = dt/(dy*mu0); 
    CHx = dt/(dy*e0); 
    CHy = dt/(dx*e0); 
    x = 2:2:2*numX; %2*numX-2; 

    %Initialize Permibilities 
    Perm = ones(2*numX+1,2*numY+1); 


    %% FDTD loop 
for n = 1:1500; 

    if(n < 200) 
     E(numX-10:2:numX+10,numY+1) = 1E-19*sin(2*pi*428E12*n*dt); %exp(-.5 * ((n-t0)/width).^2); %insert hard source 
    end; 

    for u = 2:2:2*numX-1 
     for v = 2:2:2*numY-1 
      Hp(u,v) = H(u,v) + (dt/mu0)*(-(E(u+1,v) - E(u-1,v))/dx) + (E(u,v+1) - E(u,v-1)/dy); % Solving for Hplus 
      Ep(u,v+1) = E(u,v+1) + (dt/(dy*e0))*(Hp(u,v+2) - Hp(u, v)); % Solving for Ex plus 
      Ep(u+1, v) = E(u+1, v) - (dt/(dx*e0))*(Hp(u+2, v) - Hp(u, v)); % Solving for Ey plus 

     end 
    end; 


    % Dirichlet Boundary Conditions 
    Ep(1,:) = 0; 
    Ep(:,1) = 0; 
    Ep(2*numX+1,:) = 0; 
    Ep(:,2*numX+1) = 0; 

    % Plotting 
    surf(Ep); shading interp; lighting phong; colormap hot; axis off; zlim([0 1]); 
    set(gcf,'Color', [0 0 0], 'Number', 'on', 'Name', sprintf('FDTD Project, step = %i', n)); 
    %title(sprintf('Time = %.2f microsec',n*dt*1e12),'Color',[1 0 0],'FontSize', 22); 
    drawnow; 

    E = Ep; 
    H = Hp; 



end; 

end; 

答えて

1

2物事:

1 - Ep(:,2*numX+1,:) = 0;正しいのですか? (すなわち、それはEp(:,2*numX+1) = 0;べきか?)

2 - 一番最後に、私はあなたが最大(EP)として

if (max(max(Ep)) > 1e-3) 
     E = Ep/max(max(Ep)); 
else E = Ep; 
end 
if (max(max(Hp)) > 1e-3) 
    H = Hp/max(max(Hp)); 
else H = Hp; 
end 

にコードを変更したいかもしれないと思うあなたに1x100行列を与えます。 1e-3は保護のためのもので、選択した値に下げることができます。

+0

はい、間違いなく修正されています、ありがとう!私は配列をコピーするようにコードを変更しました。それらを正規化することが最良のアイデアであるかどうかはわかりませんが、私の安定性の危機を解決するかもしれないと思っていましたが、最高(ありがとう)のおかげで、それを考えなかった。 – MercuryRising

+0

@MercuryRising:私が編集した1と2の両方で間違いを犯しました。安定性の問題に関しては、コードを上記のように変更した後で(以前はMatlabが常にクラッシュしていました)また、 'if(max(EP)〜= 0)'は常にfalseであったため、値がオーバーフローした(Eの値が大きくなっていた...) – Rasman