I have written a tutorial called, A Comprehensive Corrugated Horn Generator and Simulation with openEMS. It is based on the article "Design of Corrugated Horns: A Primer" that appeared in the IEEE Antennas and Propagation Magazine in 2005 and can be found on the internet. References included in the document.
The tutorial describes the generation of various mode converters and horn profiles with options to choose any of them from within the script. The complete simulation setup is described in (hopefully) enough detail to be useful to simulate other types of horn antenna.
The script will plot the S11 reflection of the horn and a number of farfield plots, including cross polarization and 3D plots. The Efield is plot on two orthogonal planes. Best of all is a plot showing the phi=45 degree farfield along with equivalent simulation results from CST and HFSS and the results are extremely close to one another.
The simulation can take quite a long time to run, so reduce the mesh to 15 cells per wavelength if you are in a hurry. I could not get symmetry planes to work properly yet, but if I do, this would be an ideal example for their use. If anyone has had success using PEC and PMC symmetry planes, please let me know. I hope that you will find this tutorial useful.
Edit: I made a minor addition to the tutorial pdf, adding an alternative way to calculate the horn geometry, see last page of the document.
Latest update 16th August 2020, minor typos corrected.
Corrugated Horn Antenna Tutorial for openEMS
Moderator: thorsten
Corrugated Horn Antenna Tutorial for openEMS
 Attachments

 Corrugated Horn openEMS Tutorial.zip
 Corrugated Horn openEMS Tutorial 16_08_2020
 (1.39 MiB) Downloaded 647 times

 3D Farfield with Horn
 Horn.png (292.78 KiB) Viewed 17746 times
Last edited by PaulUK on Sun 16 Aug 2020, 20:33, edited 1 time in total.
Re: Corrugated Horn Antenna Tutorial for openEMS
Paul, thanks for this helpful tutorial.
I am a little confused. Is the definition of the mesh.x really correct?
BC = {'PML_8' 'PML_8' 'PML_8' 'PML_8' 'PML_8' 'PML_8'}; % boundary conditions
FDTD = SetBoundaryCond(FDTD, BC);
% Calculate lambda/4 at lowest frequency to use as distance to nf2ff surfaces
lambda_max = c0/f_start/unit/4;
% Create fixed lines for the simulation box, structure and port
mesh.x = [(a_offset(end)9lambda_max) radmsh(1:4:end) 0 radmsh(1:4:end) (a_offset(end)+9+lambda_max)];
or should the "9" be inside the brackets because we speak about 9 cells/layer for MPL_8 and not about 9 mm.
mesh.x = [(a_offset(end9)lambda_max) radmsh(1:4:end) 0 radmsh(1:4:end) (a_offset(end+9)+lambda_max)];
I am a little confused. Is the definition of the mesh.x really correct?
BC = {'PML_8' 'PML_8' 'PML_8' 'PML_8' 'PML_8' 'PML_8'}; % boundary conditions
FDTD = SetBoundaryCond(FDTD, BC);
% Calculate lambda/4 at lowest frequency to use as distance to nf2ff surfaces
lambda_max = c0/f_start/unit/4;
% Create fixed lines for the simulation box, structure and port
mesh.x = [(a_offset(end)9lambda_max) radmsh(1:4:end) 0 radmsh(1:4:end) (a_offset(end)+9+lambda_max)];
or should the "9" be inside the brackets because we speak about 9 cells/layer for MPL_8 and not about 9 mm.
mesh.x = [(a_offset(end9)lambda_max) radmsh(1:4:end) 0 radmsh(1:4:end) (a_offset(end+9)+lambda_max)];
Gerald, OE2IGL
http://wettersat.bplaced.net
http://wettersat.bplaced.net
Re: Corrugated Horn Antenna Tutorial for openEMS
Thanks for pointing this out. It may be that the 9 can be left out all together, but I will check this once I get some time and get the computer set up again (I'm setting up after moving at the moment).
It may well be an error but if so, it should have no impact on the meshing where it's important. If so I will correct and repost the file.
Thank you,
Paul
It may well be an error but if so, it should have no impact on the meshing where it's important. If so I will correct and repost the file.
Thank you,
Paul
Re: Corrugated Horn Antenna Tutorial for openEMS
I think, adding PML after the model and mesh is generated is a correct way. Calculating pml during mesh generation always creates troubles.
I prefer making a model first, with an array of important structural nodes.
Optimize the nodelist by removing duplicate nodes, and coordinate points within minimal threshold.
For this I create envelope functions of basic object functions, making both steps in one call.
Then synthesize a smoothed mesh basing on those nodes.
Optimize the mesh by removing really excessive coordinate points.
... This logic worked for me many times when examining big horn pulse shooting problems, secondary arrays (especially with many nonuniform elements) and RCS/scattering problems.
//It would be great if basic object functions export these node coordinates upon geometry CSX generation for using in the mesh automatically, without figuring each vertice on your own. I mean, it is easy to get vertices of simple box. But when you apply a translation/rotation, it requires unnecessary bloated code.
I prefer making a model first, with an array of important structural nodes.
Optimize the nodelist by removing duplicate nodes, and coordinate points within minimal threshold.
For this I create envelope functions of basic object functions, making both steps in one call.
Then synthesize a smoothed mesh basing on those nodes.
Optimize the mesh by removing really excessive coordinate points.
... This logic worked for me many times when examining big horn pulse shooting problems, secondary arrays (especially with many nonuniform elements) and RCS/scattering problems.
//It would be great if basic object functions export these node coordinates upon geometry CSX generation for using in the mesh automatically, without figuring each vertice on your own. I mean, it is easy to get vertices of simple box. But when you apply a translation/rotation, it requires unnecessary bloated code.
Re: Corrugated Horn Antenna Tutorial for openEMS
Hello Gerald,
I had a look at this and yes, the "9" would have been distance rather than mesh lines. However, as luck would have it the max_res was just over 1mm for 20 cells/wavelength so 9 cells are approximately 9mm in this particular case and is probably why I missed it. I have corrected the document and script and added 9*max_res in positive and negative x axis and in the z axis. This is not critical for this type of antenna but I stick to the rule of thumb anyway. I will replace the files in this thread soon if no other issues are found and when I do I will make a note of the change in the posting.
Re: Corrugated Horn Antenna Tutorial for openEMS
Hello Paul
Thanks, then it is clear.
I found a typo in the middle of page 36.
"wgl10 is the location" > wgl+10
Here it is correct mesh.z = [wgllambda_max9 wgl1 wgl wgl+10 0 len(1:2:z_number) length+2*lambda_max+9
];
Thanks, then it is clear.
I found a typo in the middle of page 36.
"wgl10 is the location" > wgl+10
Here it is correct mesh.z = [wgllambda_max9 wgl1 wgl wgl+10 0 len(1:2:z_number) length+2*lambda_max+9
];
Gerald, OE2IGL
http://wettersat.bplaced.net
http://wettersat.bplaced.net
Re: Corrugated Horn Antenna Tutorial for openEMS
It is indeed +10 not 10. Thank you for pointing that out. That's another one to correct.