% % infinitesimal dipole example % close all clear clc postprocessing_only = 0; physical_constants % setup the simulation drawingunit = 1e-6; % specify everything in um Sim_Path = 'tmp'; Sim_CSX = 'tmp.xml'; f_max = 1e9; lambda = c0/f_max; % setup geometry values dipole_length = lambda/50 /drawingunit; dipole_orientation = 3; % 1,2,3: x,y,z CSX = InitCSX(); % create an equidistant mesh mesh.x = -dipole_length*10:dipole_length/2:dipole_length*10; mesh.y = -dipole_length*10:dipole_length/2:dipole_length*10; mesh.z = -dipole_length*10:dipole_length/2:dipole_length*10; % excitation ex_vector = [0 0 0]; ex_vector(dipole_orientation) = 1; start = ex_vector * -dipole_length/2; stop = ex_vector * dipole_length/2; CSX = AddExcitation( CSX, 'infDipole', 1, ex_vector ); % enlarge the box to be sure that one mesh line is covered by it start = start - [0.1 0.1 0.1] * dipole_length/2; stop = stop + [0.1 0.1 0.1] * dipole_length/2; CSX = AddBox( CSX, 'infDipole', 1, start, stop ); % NFFF contour start = [mesh.x(1) mesh.y(1) mesh.z(1) ]; stop = [mesh.x(end) mesh.y(end) mesh.z(end) ]; [CSX nf2ff] = CreateNF2FFBox(CSX, 'nf2ff', start, stop); % add space for PML mesh = AddPML( mesh, [8 8 8 8 8 8] ); % define the mesh CSX = DefineRectGrid( CSX, drawingunit, mesh ); if ~postprocessing_only % setup FDTD parameters & excitation function max_timesteps = 2000; min_decrement = 1e-6; FDTD = InitFDTD( max_timesteps, min_decrement, 'OverSampling',10 ); FDTD = SetGaussExcite( FDTD, f_max/2, f_max/2 ); BC = {'PML_8' 'PML_8' 'PML_8' 'PML_8' 'PML_8' 'PML_8'}; FDTD = SetBoundaryCond( FDTD, BC ); % Write openEMS compatible xml-file [~,~,~] = rmdir(Sim_Path,'s'); [~,~,~] = mkdir(Sim_Path); WriteOpenEMS([Sim_Path '/' Sim_CSX],FDTD,CSX); % take a view at the "structure" CSXGeomPlot( [Sim_Path '/' Sim_CSX] ); % define openEMS options and start simulation openEMS_opts = ''; RunOpenEMS( Sim_Path, Sim_CSX, openEMS_opts ); end %% post processing disp( ' ' ); disp( ' ********************************************************** ' ); disp( ' ' ); % calculate the far field at phi=0 degrees and at phi=90 degrees thetaRange = 0:0.5:359; disp( 'calculating far field at phi=[0 90] deg..' ); nf2ff = CalcNF2FF( nf2ff, Sim_Path, f_max, thetaRange/180*pi, [0 pi/2], 'Mode', 1 ); Prad = nf2ff.Prad; Dmax = nf2ff.Dmax; theta_HPBW = interp1(nf2ff.E_norm{1}(find(thetaRange<90),1)/max(nf2ff.E_norm{1}(find(thetaRange<90),1)),thetaRange(find(thetaRange<90)),1/sqrt(2))*2; % display power and directivity disp( ['radiated power: Prad = ' num2str(Prad)] ); disp( ['directivity: Dmax = ' num2str(Dmax)] ); disp( ['theta_HPBW = ' num2str(theta_HPBW) ' °']); % display polar plot for the e-field magnitude for phi = 0 deg figure polar( thetaRange/180*pi, nf2ff.E_norm{1}(:,1)' ); ylabel( 'theta / deg' ); title( 'electrical far field (V/m); r=1 m phi=0 deg' ); legend( 'e-field magnitude', 'Location', 'BestOutside' ); % display polar plot for the e-field magnitude for phi = 90 deg figure polar( thetaRange/180*pi, nf2ff.E_norm{1}(:,2)' ); ylabel( 'theta / deg' ); title( 'electrical far field (V/m); r=1 m phi=90 deg' ); legend( 'e-field magnitude', 'Location', 'BestOutside' ); %% calculate the far field at theta=90 degrees phiRange = 0:2:359; disp( 'calculating far field at theta=90 deg..' ); %[E_far_theta,E_far_phi] = AnalyzeNF2FF( Sim_Path, nf2ff, f_max, 90, phiRange, 1 ); nf2ff = CalcNF2FF( nf2ff, Sim_Path, f_max, 90, phiRange/180*pi, 'Mode', 1 ); Prad = nf2ff.Prad; Dmax = nf2ff.Dmax; % display polar plot figure polar( phiRange/180*pi, nf2ff.E_norm{1} ); ylabel( 'phi / deg' ); title( 'electrical far field (V/m); r=1 m theta=90 deg' ); legend( 'e-field magnitude', 'Location', 'BestOutside' ); %% calculate 3D pattern phiRange = 0:5:360; thetaRange = 0:5:180; disp( 'calculating 3D far field...' ); nf2ff = CalcNF2FF( nf2ff, Sim_Path, f_max, thetaRange/180*pi, phiRange/180*pi, 'Mode', 1 ); E_far = nf2ff.E_norm{1}; E_far_normalized = E_far / max(E_far(:)); [theta,phi] = ndgrid(thetaRange/180*pi,phiRange/180*pi); x = E_far_normalized .* sin(theta) .* cos(phi); y = E_far_normalized .* sin(theta) .* sin(phi); z = E_far_normalized .* cos(theta); figure surf( x,y,z, E_far_normalized ); axis equal xlabel( 'x' ); ylabel( 'y' ); zlabel( 'z' ); %% DumpFF2VTK([Sim_Path '/FF_pattern.vtk'],E_far_normalized, thetaRange, phiRange); disp(['view the farfield pattern "' Sim_Path '/FF_pattern.vtk" using paraview' ]);