1 #ifdef HAVE_STDLIB_H
2 #include <stdlib.h>
3 #endif
4 #include <stdio.h>
5 #include <math.h>
6 #include <errno.h>
7 
8 #include "yagi.h"
9 
10 #include <errno.h>
11 /* The function automatic_enhancement optimises only for the gain, by
12 adjusting the length of the reflector (A=-1), the driven(A=0) the
13 first director (A=1), second director (A=2 ) etc */
14 
automatic_enhancement(struct flags flag,double frequency,double ** driven_data,double ** parasitic_data,int driven,int parasites,struct FCOMPLEX * voltage,struct FCOMPLEX * current,struct FCOMPLEX * input_impedance,double * v,double ** z,double ** A,double * b,int * indx,struct element_data * coordinates)15 void automatic_enhancement(struct flags flag, double frequency, double **driven_data, double **parasitic_data, int driven, int parasites, struct FCOMPLEX *voltage, struct FCOMPLEX *current, struct FCOMPLEX *input_impedance, double *v, double **z,double **A, double *b, int *indx, struct element_data *coordinates)
16 {
17 	int elements,element;
18 	double pin,E_fwd=0,H_fwd,max_gain=0.0,old_max=0.0;
19 	elements=driven+parasites;
20 	element=flag.Aflg-1000;
21 	if(element > parasites-1)
22 	{
23 		fprintf(stderr,"You have set the option '-A%d', which will maximise gain using director number %d, but there are only %d directors\n", element,element, parasites-1);
24 		exit(1);
25 	}
26 	if(element>0) /* optimise gain by adjusting a director */
27 	{
28 			parasitic_data[element+1][LENGTH]*=0.90;
29 			max_gain=0.0;
30 			old_max=0.0;
31 			do{
32 				parasitic_data[element+1][LENGTH]*=1.001;
33 				solve_equations(frequency, driven, parasites, driven_data, parasitic_data, v, z, &pin, voltage, current, input_impedance, coordinates, A, b, indx);
34 				gain(90.0,0.0,pin,1.0,coordinates,current,elements,&E_fwd,&H_fwd,frequency,frequency);
35 				if(E_fwd>max_gain)
36 				{
37 					old_max=max_gain;
38 					max_gain=E_fwd;
39 				}
40 			} while(E_fwd>old_max);
41 	}
42 	else if(element==-1) /* Optimise gain by adjeucting reflector */
43 	{
44 		parasitic_data[1][LENGTH]*=0.90;
45 		max_gain=0.0;
46 		old_max=0.0;
47 		do{
48 			parasitic_data[1][LENGTH]*=1.001;
49 			solve_equations(frequency, driven, parasites, driven_data, parasitic_data, v, z, &pin, voltage, current, input_impedance, coordinates, A, b, indx);
50 			gain(90.0,0.0,pin,1.0,coordinates,current,elements,&E_fwd,&H_fwd,frequency,frequency);
51 			if(E_fwd>max_gain)
52 			{
53 				old_max=max_gain;
54 				max_gain=E_fwd;
55 			}
56 		} while(E_fwd>old_max);
57 	}
58 	else if(element==0) /* Optimise gain by adjeucting driven-element */
59 	{
60 		driven_data[1][LENGTH]*=0.90;
61 		max_gain=0.0;
62 		old_max=0.0;
63 		do{
64 			driven_data[1][LENGTH]*=1.001;
65 			solve_equations(frequency, driven, parasites, driven_data, parasitic_data, v, z, &pin, voltage, current, input_impedance, coordinates, A, b, indx);
66 			gain(90.0,0.0,pin,1.0,coordinates,current,elements,&E_fwd,&H_fwd,frequency,frequency);
67 			if(E_fwd>max_gain)
68 			{
69 				old_max=max_gain;
70 				max_gain=E_fwd;
71 			}
72 		} while(E_fwd>old_max);
73 	}
74 }
75