#include <complex.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "mwa_hyperbeam.h"
void handle_hyperbeam_error(char file[], int line_num, const char function_name[]) {
int err_length = hb_last_error_length();
char *err = malloc(err_length * sizeof(char));
int err_status = hb_last_error_message(err, err_length);
if (err_status == -1) {
printf("Something really bad happened!\n");
exit(EXIT_FAILURE);
}
printf("File %s:%d: hyperbeam error in %s: %s\n", file, line_num, function_name, err);
exit(EXIT_FAILURE);
}
int main(int argc, char *argv[]) {
AnalyticBeam *beam;
char rts_style = 0; double *dipole_height_metres = NULL; uint8_t *bowties_per_row = NULL;
if (new_analytic_beam(rts_style, dipole_height_metres, bowties_per_row, &beam))
handle_hyperbeam_error(__FILE__, __LINE__, "new_analytic_beam");
double az = 45.0 * M_PI / 180.0;
double za = 80.0 * M_PI / 180.0;
unsigned delays[16] = {3, 2, 1, 0, 3, 2, 1, 0, 3, 2, 1, 0, 3, 2, 1, 0};
double amps[16] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1};
int freq_hz = 51200000;
double latitude_rad = -0.4660608448386394;
int norm_to_zenith = 1;
complex double jones[4];
if (analytic_calc_jones(beam, az, za, freq_hz, delays, amps, 16, latitude_rad, norm_to_zenith, (double *)&jones))
handle_hyperbeam_error(__FILE__, __LINE__, "analytic_calc_jones");
printf("The returned Jones matrix:\n");
printf("[[%+.8f%+.8fi,", creal(jones[0]), cimag(jones[0]));
printf(" %+.8f%+.8fi]\n", creal(jones[1]), cimag(jones[1]));
printf(" [%+.8f%+.8fi,", creal(jones[2]), cimag(jones[2]));
printf(" %+.8f%+.8fi]]\n", creal(jones[3]), cimag(jones[3]));
double amps_2[32] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
complex double *jones_2 = malloc(4 * sizeof(complex double));
if (analytic_calc_jones(beam, az, za, freq_hz, delays, amps_2, 32, latitude_rad, norm_to_zenith, (double *)jones_2))
handle_hyperbeam_error(__FILE__, __LINE__, "analytic_calc_jones");
printf("The returned Jones matrix with altered Y amps:\n");
printf("[[%+.8f%+.8fi,", creal(jones_2[0]), cimag(jones_2[0]));
printf(" %+.8f%+.8fi]\n", creal(jones_2[1]), cimag(jones_2[1]));
printf(" [%+.8f%+.8fi,", creal(jones_2[2]), cimag(jones_2[2]));
printf(" %+.8f%+.8fi]]\n", creal(jones_2[3]), cimag(jones_2[3]));
free(jones_2);
free_analytic_beam(beam);
uint8_t cram_bowties_per_row = 8;
if (new_analytic_beam(rts_style, dipole_height_metres, &cram_bowties_per_row, &beam))
handle_hyperbeam_error(__FILE__, __LINE__, "new_analytic_beam");
unsigned delays_cram[64] = {3, 2, 1, 0, 3, 2, 1, 0, 3, 2, 1, 0, 3, 2, 1, 0, 3, 2, 1, 0, 3, 2,
1, 0, 3, 2, 1, 0, 3, 2, 1, 0, 3, 2, 1, 0, 3, 2, 1, 0, 3, 2, 1, 0,
3, 2, 1, 0, 3, 2, 1, 0, 3, 2, 1, 0, 3, 2, 1, 0, 3, 2, 1, 0};
double amps_cram[64] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1};
complex double *jones_cram = malloc(4 * sizeof(complex double));
if (analytic_calc_jones(beam, az, za, freq_hz, delays_cram, amps_cram, 64, latitude_rad, norm_to_zenith,
(double *)jones_cram))
handle_hyperbeam_error(__FILE__, __LINE__, "analytic_calc_jones");
printf("The CRAM Jones matrix:\n");
printf("[[%+.8f%+.8fi,", creal(jones_cram[0]), cimag(jones_cram[0]));
printf(" %+.8f%+.8fi]\n", creal(jones_cram[1]), cimag(jones_cram[1]));
printf(" [%+.8f%+.8fi,", creal(jones_cram[2]), cimag(jones_cram[2]));
printf(" %+.8f%+.8fi]]\n", creal(jones_cram[3]), cimag(jones_cram[3]));
free(jones_cram);
free_analytic_beam(beam);
return EXIT_SUCCESS;
}