HomerReid / scuff-em

A comprehensive and full-featured computational physics suite for boundary-element analysis of electromagnetic scattering, fluctuation-induced phenomena (Casimir forces and radiative heat transfer), nanophotonics, RF device engineering, electrostatics, and more. Includes a core library with C++ and python APIs as well as many command-line applications.
http://www.homerreid.com/scuff-em
GNU General Public License v2.0
126 stars 50 forks source link

Can scuff-rf handle junction? #144

Open lonAlpha opened 7 years ago

lonAlpha commented 7 years ago

blade_antenna.zip

Hi, Can scuff-rf handle junction? For example, I want to simulate the attached blade antenna,I get an error message. Am I doing something wrong?

How to reproduce: Download and unzip blade_antenna.zip scuff-rf < blade_antenna.args

HomerReid commented 7 years ago

Here are better ways to write your input files.

blade_antenna.geo:

L = 10; // triangle edge length (mesh fineness)

//Antenna

W_bottom = 20;
W_top    = 100;
H        = 220;
H2       = 77;
H_feed   = 10;
W_feed   = 10;

Point(1) = {-W_top/2,       0, H};
Point(2) = {-W_bottom/2,    0, H};
Point(3) = { W_bottom/2,    0, H};
Point(4) = { W_top/2,       0, H};
Line(1) = {1,2};
Line(2) = {2,3};
Line(3) = {3,4};
Transfinite Line(1) = 1 + (W_top-W_bottom)/(2*L);
Transfinite Line(2) = 1 + W_bottom/L;
Transfinite Line(3) = 1 + (W_top-W_bottom)/(2*L);
Extrude( 0, 0, -(H-H2)      ) { Line{1,2,3}; Layers{(H-H2)/L};     }
Extrude( 0, 0, -(H2-H_feed) ) { Line{8};     Layers{(H2-H_feed)/L}; }
Line(50) = {11,5};
Line(51) = {12,10};
Line Loop(52) = {4,17,50};
Line Loop(53) = {-12,18,51};
Plane Surface(54) = {52};
Plane Surface(55) = {53};

// Ground plane

L_ground = 230;
W_ground = 50;
Point(101) = { -L_ground/2, -W_ground/2, -H_feed};
Point(102) = { -L_ground/2,  W_ground/2, -H_feed};
Line(101) = {101,102};
Transfinite Line{101} = 1 + W_ground/L;
Extrude ( L_ground, 0, 0 ) { Line{101}; Layers{L_ground/L}; }

blade_antenna.ports:

PORT
    PPOLYGON -20 -20 +10  -20 20 +10  20 20 +10    20 -20 +10
    MPOLYGON -25 -25 -10  -25 25 -10  25 25 -10    25 -25 -10
ENDPORT

blade_antenna.scuffgeo:

OBJECT blade_antenna
    MESHFILE blade_antenna.msh
ENDOBJECT

Generate visualization files:

% gmsh -2 blade_antenna.geo
% scuff-analyze --geometry blade_antenna.scuffgeo --WriteGMSHFiles
% scuff-rf --geometry blade_antenna.scuffgeo --portfile blade_antenna.ports --PlotPorts
% gmsh blade_antenna.pp blade_antenna.ports.pp

blade_antenna

Compute input impedance:

% scuff-rf --geometry blade_antenna.scuffgeo --portfile blade_antenna.ports --minFreq 0.4 --maxFreq 0.8 --numFreqs 60 --zParameters

bladeantenna_zparms

Let me know if this works for you.

lonAlpha commented 7 years ago

Thanks for your detailed explanation. Transfinite line works better for rectangular ground.

If the ground is an irregular shape or corrugated, then how should the port be created?

It seems that the port needs to be 'exterior edges'. If a line is embedded in a surface, is there a workaround to set this line as port? If this works, I can change the ground without modifying the port.

The original error message is as below. Does this mean scuff-em does not handle junction where one edge can belong to 3 panels. This kind of junction is different from the MultiMaterialJunction.

error: blade_antenna.msh: invalid mesh topology: edge 0 of panel 210 also belongs to panels 136 and 137

HomerReid commented 7 years ago

It seems that the port needs to be 'exterior edges'.

That is correct.

If a line is embedded in a surface, is there a workaround to set this line as port? If this works, I can change the ground without modifying the port.

There is no workaround at the moment. However, I think I know how to implement this feature, so that a current could be fed directly into an interior edge as a port.

But I don't want to do this unless there's a clear test case with known results that we could use to check the correctness of the new feature. Could you supply such a test case, with known results for comparison?

lonAlpha commented 7 years ago

Hi, What about this case? The proposed line port could lie on the box and the ground. Box-Shaped Antenna on a Finite Plate

ex4_box-shaped-antenna

And this is the S_11 result

ex4_s11-curves

box_antenna.geo

// This example is from http://www.tet.tuhh.de/concept/numerical-benchmarks/?lang=en                                                                  
// Benchmark 4: Box-Shaped Antenna on a Finite Plate                                                                                                  

lc = 1;                                                                                                                                               
L_ground = 30;                                                                                                                                        
H_feed = 1;                                                                                                                                           

X_box = 5.4;                                                                                                                                          
Y_box = 7.2;                                                                                                                                          
Z_box = 5.6;                                                                                                                                          

Point(1) = {-X_box/2, -Y_box/2, 0, lc};                                                                                                               
Point(2) = { X_box/2, -Y_box/2, 0, lc};                                                                                                               
Line(1) = {1,2};                                                                                                                                      
Extrude {0, Y_box, 0} {                                                                                                                               
  Line{1};                                                                                                                                            
}                                                                                                                                                     
Extrude {0, 0, Z_box} {                                                                                                                               
  Surface{5};                                                                                                                                         
}                                                                                                                                                     

Point(100) = {-L_ground/2, -L_ground/2, -H_feed, lc};                                                                                                 
Point(101) = { L_ground/2, -L_ground/2, -H_feed, lc};                                                                                                 
Line(100) = {100,101};                                                                                                                                

Extrude {0, L_ground, 0} {                                                                                                                            
  Line{100};                                                                                                                                          
}                          
// line feed                                                                                                                                          
L_feed = 0.5;                                                                                                                                         
Point(200) = { -L_feed/2, 0, 0};                                                                                                                      
Point(201) = {  L_feed/2, 0, 0};                                                                                                                      
Line(200) = {200,201};                                                                                                                                
Translate {0, 0, -H_feed} {                                                                                                                           
  Duplicata { Line{200}; }                                                                                                                            
}                                                                                                                                                     

Line{200} In Surface{5};                                                                                                                              
Line{201} In Surface{104};