1 #ifdef HAVE_STDLIB_H
2 #include <stdlib.h>
3 #endif
4 #include <stdio.h>
5 #include <math.h>
6 #include <errno.h>
7 #include "yagi.h"
8 /* better.c This function compares new and old performance of a yagi to see if
9 its better. */
10
11 extern double vswr, Zo;
12 extern struct performance_data max;
13 #include <errno.h>
is_it_better(int criteria,struct performance_data n,struct performance_data o)14 int is_it_better(int criteria,struct performance_data n, struct performance_data o)
15 {
16 double resistance_error;
17 struct FCOMPLEX zi_new, zi_old;
18
19 resistance_error=fabs(n.r - Zo) - fabs( o.r - Zo );
20 zi_new.r=n.r;
21 zi_old.r=o.r;
22 zi_new.i=n.x;
23 zi_old.i=o.x;
24 /* printf("o=%.3lfdBi %.3f dB %.4f:1\n", o.gain, o.fb, o.swr);
25 printf("n=%.3lfdBi %.3f dB %.4f:1\n\n", n.gain, n.fb, n.swr); */
26 /* If the user add REASONABLE to the 'better' argument, the program
27 will make some intelligent guesses about whats a reasonale antenna. This
28 could for example avoid ignoring an antenna with 20dB gain but 1.02:1
29 vswr, in favour of 15dB gain but 1.01 vswr. Usually we would consider
30 (all other things equal) the former antenna better. Hence we wont
31 bother optimising beyond these */
32
33 if( (criteria & REASONABLE) == REASONABLE)
34 {
35 if( (n.fb > max.fb) && (n.fb < o.fb))
36 n.fb=o.fb;
37
38 if( (fabs(n.r-Zo) < max.r) &&
39 ( fabs(n.r-Zo) > fabs(o.r-Zo) ) )
40 {
41 n.r=o.r;
42 }
43
44 if( (n.swr < max.swr) && (n.swr > o.swr) )
45 n.swr=o.swr;
46
47 if( (fabs(n.x) < max.x) &&
48 fabs(n.x) > fabs(o.x) )
49 n.x=o.x;
50
51 if( (n.sidelobe > max.sidelobe) && (n.sidelobe < o.sidelobe) )
52 n.sidelobe=o.sidelobe;
53 }
54 if( (criteria & GAIN) == GAIN)
55 {
56 if( n.gain < o.gain)
57 return(FALSE);
58 }
59 if( (criteria & FB) == FB)
60 {
61 if( n.fb < o.fb)
62 return(FALSE);
63 }
64 if( (criteria & RESISTANCE) == RESISTANCE)
65 {
66 resistance_error=fabs(n.r-Zo)-fabs(o.r-Zo);
67 if(resistance_error > 0.0)
68 return(FALSE);
69 }
70 if( (criteria & REACTANCE) == REACTANCE)
71 {
72 if(fabs(n.x) > fabs(o.x))
73 return(FALSE);
74 }
75 if( (criteria & VSWR) == VSWR)
76 {
77 if( n.swr > o.swr)
78 return(FALSE);
79 }
80 if((criteria & SIDE_LOBE_LEVEL) == SIDE_LOBE_LEVEL)
81 {
82 if(n.sidelobe < o.sidelobe)
83 return(FALSE);
84 }
85 #ifdef DEBUG
86 if(errno)
87 {
88 fprintf(stderr,"Errno =%d in better.c\n", errno);
89 exit(1);
90 }
91 #endif
92 return(TRUE);
93 }
94
95