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 
9 #include <errno.h>
10 
mutual_impedance(int i,int j,double frequency,int driven,int parasitic,double ** d,double ** p,double ** impedance)11 void mutual_impedance(int i, int j, double frequency, int driven, int parasitic, double **d, double **p, double **impedance)
12 {
13 	double xi, yi, xj, yj, li, lj, s, lamda, real, imag, mean_length;
14 	int col;
15 	/* first find location x,y of first element */
16 	if(i<=driven)				/* i is a  driven element*/
17 	{
18 		xi=d[i][X];
19 		yi=d[i][Y];
20 		li=d[i][LENGTH];
21 	}
22 	else if (i>driven)			/* i is a  parasitic  element */
23 	{
24 		xi=p[i-driven][X];
25 		yi=p[i-driven][Y];
26 		li=p[i-driven][LENGTH];
27 	}
28 	if(j<=driven)				/* j is a  driven element*/
29 	{
30 		xj=d[j][X];
31 		yj=d[j][Y];
32 		lj=d[j][LENGTH];
33 	}
34 	else if (j>driven)			/* i is a  parasitic  element */
35 	{
36 		col=j-driven;
37 		xj=p[col][X];
38 		yj=p[col][Y];
39 		lj=p[col][LENGTH];
40 	}
41 	/* compute distance from element i to element j */
42 	s=sqrt((xi-xj)*(xi-xj)+(yi-yj)*(yi-yj)); /* in metres */
43 	mean_length=(li+lj)/2.0;
44 	lamda=3e8/frequency;
45 	z21(lamda, s , mean_length , &real, &imag);
46 	/* fill in Zij and Zji at the same time, as matrix is symmetric. */
47 	impedance[i][(2*j)-1]=real; /* real; */
48 	impedance[i][2*j]=imag; /* imag; */
49 	impedance[j][2*i-1]=real; /* real; */
50 	impedance[j][2*i]=imag; /* imag; */
51 
52 #ifdef DEBUG
53 	if(errno)
54 	{
55 		fprintf(stderr,"Errno =%d in  mutual.c\n", errno);
56 		exit(1);
57 	}
58 #endif
59 }
60 
61 /* To find the mutual impedance between to arbitary length, thin elements
62 I used the equations on Krauss, Antennas, McGraw Hill, 1988, pp426 and
63 427. Original work from Brown and King, 'High Frequency Models in Antenna
64 Investigations', Proc IRE, vol 22, pp457-480, April 1934*/
z21(double lamda,double d,double l,double * r21,double * x21)65 void z21(double lamda, double d, double l, double *r21, double *x21)
66 {
67 
68 	double  b, cos_bl, sin_bl, sin_bl_over_2, cos_bl_over_2, c, s ;
69 	double t1, t2, t3, t4;
70 	double si_t1, ci_t1, si_t4, ci_t4, ci_bd, si_bd;
71 	double ci_t2, si_t2, ci_t3, si_t3;
72 
73 	b=M_PI*2/lamda;
74 	t1=b*(sqrt(d*d+l*l)+l);
75 	t2=0.5*b*(sqrt(4*d*d+l*l)-l);
76 	t3=0.5*b*(sqrt(4*d*d+l*l)+l);
77 	t4=b*(sqrt(d*d+l*l)-l);
78 	/* To save findinding the same slow trigometric and ever slower
79 	si and ci functions, I'll just look them up once */
80 	cos_bl=cos(b*l);
81 	sin_bl=sin(b*l);
82 	sin_bl_over_2=sin(b*l/2);
83 	cos_bl_over_2=cos(b*l/2);
84 	s=sin_bl_over_2*sin_bl_over_2;
85 	c=cos_bl_over_2*cos_bl_over_2;
86 
87 	cisi(t1, &ci_t1, &si_t1);
88 	cisi(t2,&ci_t2, &si_t2);
89 	cisi(t3,&ci_t3, &si_t3);
90 	cisi(t4, &ci_t4, &si_t4);
91 	cisi(b*d,&ci_bd, &si_bd);
92 	/* Real part of mutual impedance, computed as equation on page
93 	426 of Kraus */
94 	*r21=(30/s)*(2*(2+cos_bl)*ci_bd
95 	-4*c*( ci_t2 + ci_t3 )
96 	+cos_bl*( ci_t4 + ci_t1 )
97 	+sin_bl* ( si_t1 - si_t4 -2*si_t3 +2*si_t2 ) );
98 
99 	/* Imaginary part of mutual impedance, computed as equation on page
100 	427 of Kraus */
101 	*x21=(30/s)*(-2*(2+cos_bl)*si_bd
102 	+4*c*( si_t2 + si_t3 )
103 	-cos_bl*( si_t4 + si_t1 )
104 	+sin_bl* ( ci_t1 - ci_t4 -2*ci_t3 +2*ci_t2 ) );
105 #ifdef DEBUG
106 	if(errno)
107 	{
108 		fprintf(stderr,"Errno =%d in  z21() mutual.c\n", errno);
109 		exit(1);
110 	}
111 #endif
112 }
113 
114