% % examples / microstrip / MSL_Losses % % This example demonstrates how to model sheet conductor losses % % Tested with % - Matlab 2011a / Octave 3.4.3 % - openEMS v0.0.28 % % (C) 2012 Thorsten Liebig close all clear clc %% setup the simulation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% physical_constants; unit = 1e-6; % specify everything in um MSL.length = 10000; MSL.port_dist = 5000; MSL.width = 225; MSL.conductivity = 41e6; MSL.thickness = 35e-6; substrate.thickness = 250; substrate.epr = 9.8; f_start = 0e9; f_stop = 25e9; lambda = c0/f_stop; %% setup FDTD parameters & excitation function %%%%%%%%%%%%%%%%%%%%%%%%%%%% FDTD = InitFDTD(1e6,1e-4); FDTD = SetGaussExcite(FDTD,0.5*(f_start+f_stop),0.5*(f_stop-f_start)); BC = {'PML_8' 'PML_8' 'PML_8' 'PML_8' 'PEC' 'PML_8'}; FDTD = SetBoundaryCond( FDTD, BC ); %% setup CSXCAD geometry & mesh %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CSX = InitCSX(); resolution = c0/(f_stop*sqrt(substrate.epr))/unit /20; mesh.x = SmoothMeshLines( [-MSL.length*0.5-MSL.port_dist 0 MSL.length*0.5+MSL.port_dist], resolution, 1.3 ,0 ); mesh.y = SmoothMeshLines2( [0 MSL.width/2], resolution/6 , 1.3); mesh.y = SmoothMeshLines( [-0.5*lambda/unit -mesh.y mesh.y 0.5*lambda/unit], resolution, 1.4); mesh.z = SmoothMeshLines( [linspace(0,substrate.thickness,10) 0.5*lambda/unit], resolution ); CSX = DefineRectGrid( CSX, unit, mesh ); %% substrate CSX = AddMaterial( CSX, 'RO4350B' ); CSX = SetMaterialProperty( CSX, 'RO4350B', 'Epsilon', substrate.epr ); start = [mesh.x(1), mesh.y(1), 0]; stop = [mesh.x(end), mesh.y(end), substrate.thickness]; CSX = AddBox( CSX, 'RO4350B', 0, start, stop ); %% MSL ports and lossy line CSX = AddConductingSheet( CSX, 'gold', MSL.conductivity, MSL.thickness ); portstart = [ mesh.x(1), -MSL.width/2, substrate.thickness]; portstop = [ mesh.x(1)+MSL.port_dist, MSL.width/2, 0]; [CSX,portstruct{1}] = AddMSLPort( CSX, 999, 1, 'gold', portstart, portstop, 0, [0 0 -1], 'ExcitePort', 'excite', 'FeedShift', 10*resolution, 'MeasPlaneShift', MSL.port_dist); portstart = [mesh.x(end), -MSL.width/2, substrate.thickness]; portstop = [mesh.x(end)-MSL.port_dist, MSL.width/2, 0]; [CSX,portstruct{2}] = AddMSLPort( CSX, 999, 2, 'gold', portstart, portstop, 0, [0 0 -1], 'MeasPlaneShift', MSL.port_dist ); start = [mesh.x(1)+MSL.port_dist, -MSL.width/2, substrate.thickness]; stop = [mesh.x(end)-MSL.port_dist, MSL.width/2, substrate.thickness]; CSX = AddBox(CSX,'gold',500,start,stop); %% write/show/run the openEMS compatible xml-file Sim_Path = 'tmp'; Sim_CSX = 'msl.xml'; [status, message, messageid] = rmdir( Sim_Path, 's' ); % clear previous directory [status, message, messageid] = mkdir( Sim_Path ); % create empty simulation folder WriteOpenEMS( [Sim_Path '/' Sim_CSX], FDTD, CSX ); CSXGeomPlot( [Sim_Path '/' Sim_CSX] ); RunOpenEMS( Sim_Path, Sim_CSX ,''); %% post-processing close all f = linspace( f_start, f_stop, 1601 ); port{1} = calcPort( portstruct{1}, Sim_Path, f, 'RefImpedance', 50); port{2} = calcPort( portstruct{2}, Sim_Path, f, 'RefImpedance', 50); s11 = port{1}.uf.ref./ port{1}.uf.inc; s21 = port{2}.uf.ref./ port{1}.uf.inc; plot(f/1e9,-20*log10(abs(s21)),'r--','LineWidth',2); grid on; hold on; ylabel('-|S_21| (dB)','Interpreter','None'); xlabel('frequency (GHz)'); %% plot 35um thickness loss model curve % values extracted from http://wcalc.sourceforge.net/cgi-bin/microstrip.cgi model.f = [1 2 2.5 3 4 5 7.5 10 12.5 15 17.5 20 25 ]; % frequency in GHz model.loss = [3.0 4.2 4.7 5.2 5.9 6.6 8.1 9.38 10.5 11.5 12.4 13.2 14.65]; % loss in db/m plot(model.f, model.loss * MSL.length * unit ,'k-','LineWidth',1); legend('FDTD simulated attenuation','t=35um, loss model by E. Hammerstad & F. Bekkadal','Location','NorthWest');