// bruteforce H ANT prog

#include <iostream>
#include <math.h>

// some constants
#define PI 3.14159265		// pi
#define C 299792458		// speed of light in vacuum, in m/s
				// todo, replace with speed of light in air
#define CGHZ 0.299792458	// C for gigahertz
#define ACFAC 0.9997001		// C_air/C_vacuum

double gain(double c_l, double n, double s_l) {
	return( 11.8 + 10*log10(c_l*c_l*n*s_l));
}

double hpbw(double c_l, double n, double s_l) {
	// half power beamwidth in degrees
 	return(52 / (c_l * sqrt(n * s_l)));
}

double scale(double what, unsigned int digits) {
	double x;
	double loga = pow(10,digits);
	x = abs(what*loga);
	return (x/loga);
}
main() {
	double freq, length, diameter; // input
	double lambda, c_l, s_l, n; // calculated
	double oldgain, newgain, ga, diff;

	double record_gain, record_cl, record_sl, record_n;

	double count, sec, tri, tert;

	cout << "Enter target frequency in GHz:";
	cin >> freq;

	cout << "Enter length of tubing in cm:";
	cin >> length;
	length = length/100;	// change to meters

	lambda = (CGHZ*ACFAC)/freq;

	cout << "Wavelength: "<< lambda << "m \n";
	cout << "\n";

	cout << "Brute...\n";
	for (count = 0.75; count <= 1.33; count += 0.0290) { // c_l, frac of l
		for (sec = 0.2126; sec <= 0.2867; sec += 0.003705) { // s_l
			c_l = count;
			s_l = sec;
			diameter = ((c_l*lambda)/PI)*1000; // in mm
			
			n = length / (s_l * lambda);
			newgain = gain(c_l, n, s_l);

			diff = scale( scale(oldgain,2) - scale(newgain, 2), 2);
				// difference in gain
			
			if (diff != 0) { // only print if difference != 0
				cout << "c_l = "<<scale(c_l, 1);
				cout <<", s_l = "<< scale(s_l, 1) << ", ";
				cout << "n = "<<scale(n, 2) << "\t";
				cout << "gain = " << scale(newgain, 2) << "dBi";
				cout << ", HPBW ="<< scale(hpbw(c_l, n, s_l),1);
				cout << "' diameter = " << scale(diameter,1);
				cout << "mm\n";
			}
			if (newgain > record_gain) {
				record_gain = newgain;
				record_cl = c_l;
				record_sl = s_l;
				record_n = n;
			}
			oldgain = newgain;
		}
	}
	cout << "\n";
	cout << "Best configuration wrt gain:\n";
	cout << "Number of turns: " << scale(record_n, 1) << "\n";
	cout << "Diameter of tube: " << ((record_cl*lambda)/PI)*1000 << " mm\n";
	cout << "Circumference of winding: " << record_cl << "l = ";
		cout << (record_cl*lambda)*100 << "cm\n";
	cout << "Axial length of one turn: " << record_sl << "l = ";
		cout << (record_sl*lambda)*100 << "cm\n";
	cout << "\n";

	cout << "Half Power Beam Width: " << hpbw( record_cl, record_n, 
			record_sl) << " degrees \n";
	cout << "Gain: " << gain(record_cl, record_n, record_sl) << " dBi\n";
}
