openEMS/matlab/examples/other/LumpedElement.m

159 lines
3.8 KiB
Matlab
Raw Normal View History

%
% EXAMPLE / other / lumped elements
%
% This example demonstrates how to:
% - use lumped elements
%
%
% Tested with
% - Matlab 2009b
% - openEMS v0.0.21-3
%
% (C) 2010 Thorsten Liebig <thorsten.liebig@uni-due.de>
close all
clear
clc
%% setup the simulation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
f_max = 100e6;
f_excite = 300e6;
SimBox = 100;
mesh_size = 2;
Lumped.R = 1000;
Lumped.C = 10e-12;
% the parasitice inductance of the feeding has to be deduced with a R=0
% simulation
parasitic_L = 63e-9;
%% define openEMS options %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
openEMS_opts = '';
% openEMS_opts = [openEMS_opts ' --debug-material'];
% openEMS_opts = [openEMS_opts ' --debug-boxes'];
% openEMS_opts = [openEMS_opts ' --debug-operator'];
Sim_Path = 'tmp';
Sim_CSX = 'lumped.xml';
[status, message, messageid] = rmdir(Sim_Path,'s');
[status,message,messageid] = mkdir(Sim_Path);
%% setup FDTD parameter & excitation function %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FDTD = InitFDTD(30000,1e-6);
FDTD = SetGaussExcite(FDTD,f_excite/2,f_excite/2);
BC = [1 1 1 1 1 1];
FDTD = SetBoundaryCond(FDTD,BC);
%% setup CSXCAD geometry & mesh %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CSX = InitCSX();
mesh.x = SmoothMeshLines([-SimBox/2,+SimBox/2],mesh_size);
mesh.y = SmoothMeshLines([-SimBox/2,+SimBox/2],mesh_size);
mesh.z = SmoothMeshLines([-SimBox/2,+SimBox/2],mesh_size);
CSX = DefineRectGrid(CSX, 1e-3,mesh);
%% create structure
% insert curve port
start = [ 10 -10 0];
stop = [ 10 10 0];
CSX = AddCurvePort(CSX,0,1,100,start,stop,'excite');
% insert lumped element
CSX = AddLumpedElement( CSX, 'Capacitor', 1, 'C', Lumped.C, 'R', Lumped.R);
start = [ -14 -4 -4];
stop = [ -6 4 4];
CSX = AddBox( CSX, 'Capacitor', 0, start, stop );
% insert feeding wire
CSX = AddMetal(CSX,'metal');
%first point
points(1,1) = -10;
points(2,1) = 4;
points(3,1) = 0;
%second point
points(1,2) = -10;
points(2,2) = 15;
points(3,2) = 0;
%3 point
points(1,end+1) = 10;
points(2,end) = 15;
points(3,end) = 0;
%4 point
points(1,end+1) = 10;
points(2,end) = 10;
points(3,end) = 0;
CSX = AddCurve(CSX,'metal', 10, points);
points(2,:) = -1*points(2,:);
CSX = AddCurve(CSX,'metal', 10, points);
%% Write openEMS compatoble xml-file %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
WriteOpenEMS([Sim_Path '/' Sim_CSX],FDTD,CSX);
% CSXGeomPlot([Sim_Path '/' Sim_CSX]);
%% run openEMS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
RunOpenEMS(Sim_Path, Sim_CSX, openEMS_opts);
%% postproc & do the plots %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
f = linspace(1e6,f_max,1001);
w = 2*pi*f;
% read currents and voltages
U = ReadUI('port_ut1','tmp/',f);
I = ReadUI('port_it1','tmp/',f);
% calculate analytic impedance
if (Lumped.R>=0)
Z_a = Lumped.R*(1-1i*w*Lumped.C*Lumped.R)./(1+(w*Lumped.C*Lumped.R).^2);
else
Z_a = -1i./(w*Lumped.C);
end
% calculate numerical impedance
Z = U.FD{1}.val./I.FD{1}.val;
% remove parasitic feeding effects
Z = Z - 1i*w*parasitic_L;
L = imag(Z)./w;
C = -1./(w.*imag(Z));
C(find(C<0)) = nan;
L(find(L<0)) = nan;
R = real(Z);
subplot(2,1,1);
plot(f*1e-6,C*1e12,'Linewidth',2);
xlabel('frequency (MHz)');
ylabel('capacitance (pF)');
grid on;
subplot(2,1,2);
plot(f*1e-6,L*1e9,'Linewidth',2);
xlabel('frequency (MHz)');
ylabel('inductance (nH)');
grid on;
figure();
plot(f*1e-6,R,'Linewidth',2);
hold on
plot(f*1e-6,imag(Z),'r--','Linewidth',2);
plot(f*1e-6,real(Z_a),'g-.','Linewidth',1);
plot(f*1e-6,imag(Z_a),'m--','Linewidth',1);
xlabel('frequency (MHz)');
ylabel('resistance (Ohm)');
grid on;
legend( '\Re\{Z\}','\Im\{Z\}','\Re\{Z_{analytisch}\}','\Im\{Z_{analytisch}\}', 'location', 'northeast' )
figure();
errorR = (R-real(Z_a))./R*100;
errorX = (imag(Z)-imag(Z_a))./imag(Z)*100;
plot(f*1e-6,errorR,'Linewidth',2);
hold on
grid on;
plot(f*1e-6,errorX,'r--','Linewidth',2);
xlabel('frequency (MHz)');
ylabel('error (%)');