Función para el diseño de una bocina corrugada que depende de sus frecuencias de operación
La siguiente función genera genera una bocina cónica corrugada.
Los parámetros de entrada son las frecuencias mínimas y máximas de funcionamiento. El resultado es un script que genera una bocina corrugada que funciona entre las frecuencias establecidas.
El usuario también puede cambiar el tipo de perfil de la bocina. La función tiene 7 perfiles diferentes, aunque el usuario puede establecer sus propios perfiles. Las variables a tener en cuenta son:
profile_index = n; donde 'n' es el numero del perfil de entre los siguientes disponibles:
1 - Perfil lineal
2 - Perfil sinusoidal
3 - Perfil tangencial
4 - Perfil del tipo x^rho
5 - Perfil exponencial
6 - Perfil hiperbólico
7 - Perfil polinomial
A: Entre 0 (lineal) y 1; Afecta a los perfiles 2,3 y 4 y establece el grado de curvatura que tomarán los perfiles
Rho: Parámetro que afecta a los perfiles 2,3,4 y 7; Normalmente vale 2 aunque puede tomar valores entre 0,5 y 5
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
// 'fmin' and 'fmax' are the lowest and the highest operating frequencies (GHz)
void corrugated_horn(double fmin, double fmax) {
// Number of slots in the mode converter
int Nmc = 5; // tipically between 5 and 7
// Parameters that can be modified
double L = 6; // Horn length; depend of the aplicacion -- usually chosen between 5*lambda_c to 10*lambda_c
double Lg = 3.5; // Length of waveguide (x*lambda_c)
double ao = 1.95; // output radius -- usually 1*lambda_c to 2.5*lambda_c
double p = 0.125; // slot pitch -- usually chosen between lambda_c/10 (broadband) and lambda_c/5 (narrowband)
double delta = 0.8; // Slot pitch-to-width ratio; normally between 0.7 and 0.9
double d = 0.25; // Depth of the slots, normally lambda_c/4
// Profile type parameters
int profile_index = 1; // 1 - linear ; 2 - sinusoid ; 3 - tangential ; 4 - x^rho ; 5 - exponential ; 6 - hyperbolic ; 7 - polynomial
double A = 0.9; // between 0 and 1; affects only 2,3 and 4 profiles
double rho = 2; // usually between 0.5 and 5 but normally rho=2
// Name of generated script
String ScriptName ="script_corrugated_horn";
// Mode converter parameters
double[] dj=new double[Nmc];
double sigma = 0.5;
double kcaj = 20;
double k = Math.exp(1/(2.114*Math.pow(kcaj,1.134)));
double fc = Math.sqrt(fmin*fmax); // Center frequency
double f0 = 1.02*fc;
double lambda_c = 300/fc; // Center frequency wavelength
double ai = (3*lambda_c)/(2*PI); // input radius (mm)
ao = ao*lambda_c; // output radius (mm) -- usually 1*lambda_c to 2.5*lambda_c
p = lambda_c*p; // slot pitch -- usually chosen between lambda_c/10 (broadband) and lambda_c/5 (narrowband)
double w = delta*p; // Slot width
double a = p-w; // Teeth width
L = L*lambda_c; // Horn length; depend of the aplicacion -- usually chosen between 5*lambda_c to 10*lambda_c
double N = Math.ceil(L/p+1); // Total number of slots
Lg = Lg*(300/fmin); // Length of waveguide
double[] az=new double[N+1];
d = lambda_c*d; // Depth of the slots
int i, j;
String EOL = "\r\n";
String separator ="\t";
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new FileWriter("./mydatafiles/" + ScriptName + ".nfs"));
bw.write("#" + EOL);
bw.write("# newFASANT script file" + EOL);
bw.write("#" + EOL);
// Corrugated surface profile formulations
if(profile_index==1) { // z=i*p
for(i=0;i<=N;i++) { // linear
az[i]=ai+(ao-ai)*(i*p/L);
}
} else if(profile_index==2) { // sinusoid
for(i=0;i<=N;i++) {
az[i]=ai+(ao-ai)*((1-A)*i*p/L+A*Math.pow(Math.sin(Math.PI*i*p/(2*L)),rho));
}
} else if(profile_index==3) { // tangential
for(i=0;i<=N;i++) {
az[i]=ai+(ao-ai)*((1-A)*i*p/L+A*Math.pow(Math.tan(Math.PI*i*p/(4*L)),rho));
}
} else if(profile_index==4) { // x^rho
for(i=0;i<=N;i++) {
az[i]=ai+(ao-ai)*((1-A)*i*p/L+A*Math.pow(i*p/(L),rho));
}
} else if(profile_index==5) { // Exponential
for(i=0;i<=N;i++) {
az[i]=ai*Math.exp(Math.log(ao/ai)*i*p/L);
}
} else if(profile_index==6) { // Hyperbolic
for(i=0;i<=N;i++) {
az[i]=Math.sqrt(Math.pow(ai,2)+(Math.pow(i*p,2)*(Math.pow(ao,2)-Math.pow(ai,2)))/(Math.pow(L,2)));
}
} else if(profile_index==7) { // Polynomial
for(i=0;i<=N;i++) {
az[i]=ai+(rho+1)*(ao-ai)*(1-(rho*i*p)/((rho+1)*L))*Math.pow(i*p/L,rho);
}
} else if(profile_index==8) { // User profile 1
for(i=0;i<=N;i++) {
az[i]= 0;
}
} else if(profile_index==9) { // User profile 2
for(i=0;i<=N;i++) {
az[i]= 0;
}
} else if (profile_index<1 || profile_index>9) {
for(i=0;i<=N;i++) { // linear
az[i]=ai+(ao-ai)*(i*p/L);
}
}
// Mode converter
for(i=0;i<Nmc;i++) {
dj[i] = (sigma-((1.0*i/Nmc)*(sigma-0.25*k)))*lambda_c;
bw.write("line -n line" + (i+100000) + " -p " + az[i] + " 0.0 " + (p*i) + " " + (az[i]+dj[i]) + " 0.0 " + (p*i) + EOL);
bw.write("line -n line" + (i+200000) + " -p " + (az[i]+dj[i]) + " 0.0 " + (p*i) + " " + (az[i]+dj[i]) + " 0.0 " + (p*i+w) + EOL);
bw.write("line -n line" + (i+300000) + " -p " + (az[i]+dj[i]) + " 0.0 " + (p*i+w) + " " + (az[i+1]) + " 0.0 " + (p*i+w) + EOL);
bw.write("line -n line" + (i+400000) + " -p " + (az[i+1]) + " 0.0 " + (p*i+w) + " " + (az[i+1]) + " 0.0 " + (p*i+w+a) + EOL);
}
// Corrugated horn
for(i=Nmc;i<N-1;i++) {
bw.write("line -n line" + (4*i) + " -p " + az[i] + " 0.0 " + (p*i) + " " + (az[i]+d) + " 0.0 " + (p*i) + EOL);
bw.write("line -n line" + (4*i+1) + " -p " + (az[i]+d) + " 0.0 " + (p*i) + " " + (az[i]+d) + " 0.0 " + (p*i+w) + EOL);
bw.write("line -n line" + (4*i+2) + " -p " + (az[i]+d) + " 0.0 " + (p*i+w) + " " + (az[i+1]) + " 0.0 " + (p*i+w) + EOL);
bw.write("line -n line" + (4*i+3) + " -p " + (az[i+1]) + " 0.0 " + (p*i+w) + " " + (az[i+1]) + " 0.0 " + (p*i+w+a) + EOL);
}
bw.write("line -n guideline -p " + ai + " 0.0 0.0 " + ai + " 0.0 -" + Lg + EOL);
// revolve 180º
bw.write("revolve -s ");
for(i=1;i<=(Nmc-1);i++) {
for(j=0;j<Nmc;j++) {
bw.write("line" + (i) + "0000" + j + separator);
}
}
for(i=(4*(Nmc+1)-4);i<=((N-1)*4-1);i++) {
bw.write("line" + i + separator);
}
bw.write(" guideline -p 0.0 0.0 0.0 0.0 0.0 1.0 0.0 180.0" + EOL);
// revolve -180º
bw.write("revolve -s ");
for(i=1;i<=(Nmc-1);i++) {
for(j=0;j<Nmc;j++) {
bw.write("line" + (i) + "0000" + j + separator);
}
}
for(i=(4*(Nmc+1)-4);i<=((N-1)*4-1);i++) {
bw.write("line" + i + separator);
}
bw.write(" guideline -p 0.0 0.0 0.0 0.0 0.0 -1.0 0.0 180.0" + EOL);
// delete lines
bw.write("delete -s ");
for(i=1;i<=(Nmc-1);i++) {
for(j=0;j<Nmc;j++) {
bw.write("line" + (i) + "0000" + j + separator);
}
}
for(i=(4*(Nmc+1)-4);i<=((N-1)*4-1);i++) {
bw.write("line" + i + separator);
}
bw.write(" guideline" + EOL);
// disc
bw.write("disk -n tapa -p 0.0 0.0 -" + Lg + " " + ai + EOL);
} catch(Exception e){
System.out.println("Cannot write file " + EOL);
} finally {
if (bw != null) {
try {
bw.close();
} catch (IOException ex) {
Logger.getLogger(NewMain.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}