TEST(Mem, type_check_double_complex) { int status = 0; oskar_Mem *mem; mem = oskar_mem_create(OSKAR_DOUBLE_COMPLEX, OSKAR_CPU, 0, &status); EXPECT_EQ((int)OSKAR_TRUE, oskar_mem_is_double(mem)); EXPECT_EQ((int)OSKAR_TRUE, oskar_mem_is_complex(mem)); EXPECT_EQ((int)OSKAR_TRUE, oskar_mem_is_scalar(mem)); EXPECT_EQ((int)OSKAR_TRUE, oskar_type_is_double(OSKAR_DOUBLE_COMPLEX)); EXPECT_EQ((int)OSKAR_TRUE, oskar_type_is_complex(OSKAR_DOUBLE_COMPLEX)); EXPECT_EQ((int)OSKAR_TRUE, oskar_type_is_scalar(OSKAR_DOUBLE_COMPLEX)); oskar_mem_free(mem, &status); ASSERT_EQ(0, status) << oskar_get_error_string(status); }
TEST(Mem, type_check_single) { int status = 0; oskar_Mem *mem; mem = oskar_mem_create(OSKAR_SINGLE, OSKAR_CPU, 0, &status); ASSERT_EQ(0, status) << oskar_get_error_string(status); EXPECT_EQ((int)OSKAR_FALSE, oskar_mem_is_double(mem)); EXPECT_EQ((int)OSKAR_FALSE, oskar_mem_is_complex(mem)); EXPECT_EQ((int)OSKAR_TRUE, oskar_mem_is_scalar(mem)); EXPECT_EQ((int)OSKAR_FALSE, oskar_type_is_double(OSKAR_SINGLE)); EXPECT_EQ((int)OSKAR_FALSE, oskar_type_is_complex(OSKAR_SINGLE)); EXPECT_EQ((int)OSKAR_TRUE, oskar_type_is_scalar(OSKAR_SINGLE)); oskar_mem_free(mem, &status); ASSERT_EQ(0, status) << oskar_get_error_string(status); }
/* Wrapper. */ void oskar_evaluate_jones_K(oskar_Jones* K, int num_sources, const oskar_Mem* l, const oskar_Mem* m, const oskar_Mem* n, const oskar_Mem* u, const oskar_Mem* v, const oskar_Mem* w, double frequency_hz, const oskar_Mem* source_filter, double source_filter_min, double source_filter_max, int* status) { int num_stations, jones_type, base_type, location; double wavenumber; /* Check if safe to proceed. */ if (*status) return; /* Get the Jones matrix block meta-data. */ jones_type = oskar_jones_type(K); base_type = oskar_type_precision(jones_type); location = oskar_jones_mem_location(K); num_stations = oskar_jones_num_stations(K); wavenumber = 2.0 * M_PI * frequency_hz / 299792458.0; /* Check that the data is in the right location. */ if (oskar_mem_location(l) != location || oskar_mem_location(m) != location || oskar_mem_location(n) != location || oskar_mem_location(source_filter) != location || oskar_mem_location(u) != location || oskar_mem_location(v) != location || oskar_mem_location(w) != location) { *status = OSKAR_ERR_LOCATION_MISMATCH; return; } /* Check that the data are of the right type. */ if (!oskar_type_is_complex(jones_type) || oskar_type_is_matrix(jones_type)) { *status = OSKAR_ERR_BAD_DATA_TYPE; return; } if (base_type != oskar_mem_type(l) || base_type != oskar_mem_type(m) || base_type != oskar_mem_type(n) || base_type != oskar_mem_type(u) || base_type != oskar_mem_type(v) || base_type != oskar_mem_type(w) || base_type != oskar_mem_type(source_filter)) { *status = OSKAR_ERR_TYPE_MISMATCH; return; } /* Evaluate Jones matrices. */ if (location == OSKAR_GPU) { #ifdef OSKAR_HAVE_CUDA if (jones_type == OSKAR_SINGLE_COMPLEX) { oskar_evaluate_jones_K_cuda_f(oskar_jones_float2(K, status), num_sources, oskar_mem_float_const(l, status), oskar_mem_float_const(m, status), oskar_mem_float_const(n, status), num_stations, oskar_mem_float_const(u, status), oskar_mem_float_const(v, status), oskar_mem_float_const(w, status), wavenumber, oskar_mem_float_const(source_filter, status), source_filter_min, source_filter_max); } else if (jones_type == OSKAR_DOUBLE_COMPLEX) { oskar_evaluate_jones_K_cuda_d(oskar_jones_double2(K, status), num_sources, oskar_mem_double_const(l, status), oskar_mem_double_const(m, status), oskar_mem_double_const(n, status), num_stations, oskar_mem_double_const(u, status), oskar_mem_double_const(v, status), oskar_mem_double_const(w, status), wavenumber, oskar_mem_double_const(source_filter, status), source_filter_min, source_filter_max); } oskar_device_check_error(status); #else *status = OSKAR_ERR_CUDA_NOT_AVAILABLE; #endif } else if (location == OSKAR_CPU) { if (jones_type == OSKAR_SINGLE_COMPLEX) { oskar_evaluate_jones_K_f(oskar_jones_float2(K, status), num_sources, oskar_mem_float_const(l, status), oskar_mem_float_const(m, status), oskar_mem_float_const(n, status), num_stations, oskar_mem_float_const(u, status), oskar_mem_float_const(v, status), oskar_mem_float_const(w, status), wavenumber, oskar_mem_float_const(source_filter, status), source_filter_min, source_filter_max); } else if (jones_type == OSKAR_DOUBLE_COMPLEX) { oskar_evaluate_jones_K_d(oskar_jones_double2(K, status), num_sources, oskar_mem_double_const(l, status), oskar_mem_double_const(m, status), oskar_mem_double_const(n, status), num_stations, oskar_mem_double_const(u, status), oskar_mem_double_const(v, status), oskar_mem_double_const(w, status), wavenumber, oskar_mem_double_const(source_filter, status), source_filter_min, source_filter_max); } } }
oskar_VisHeader* oskar_vis_header_create(int amp_type, int coord_precision, int max_times_per_block, int num_times_total, int max_channels_per_block, int num_channels_total, int num_stations, int write_autocorr, int write_crosscor, int* status) { oskar_VisHeader* hdr = 0; /* Check if safe to proceed. */ if (*status) return 0; /* Check type. */ if (!oskar_type_is_complex(amp_type)) { *status = OSKAR_ERR_BAD_DATA_TYPE; return 0; } /* Allocate the structure. */ hdr = (oskar_VisHeader*) malloc(sizeof(oskar_VisHeader)); if (!hdr) { *status = OSKAR_ERR_MEMORY_ALLOC_FAILURE; return 0; } hdr->amp_type = amp_type; hdr->coord_precision = coord_precision; /* Set number of tags per block in the binary file. */ /* This must be updated if the number of fields written to file from * the oskar_VisBlock structure is changed. */ hdr->num_tags_per_block = 1; if (write_crosscor) hdr->num_tags_per_block += 4; if (write_autocorr) hdr->num_tags_per_block += 1; /* Set dimensions. */ hdr->max_times_per_block = max_times_per_block; hdr->num_times_total = num_times_total; hdr->max_channels_per_block = max_channels_per_block; hdr->num_channels_total = num_channels_total; hdr->num_stations = num_stations; /* Set default polarisation type. */ if (oskar_type_is_matrix(amp_type)) hdr->pol_type = OSKAR_VIS_POL_TYPE_LINEAR_XX_XY_YX_YY; else hdr->pol_type = OSKAR_VIS_POL_TYPE_STOKES_I; /* Initialise meta-data. */ hdr->write_autocorr = write_autocorr; hdr->write_crosscorr = write_crosscor; hdr->freq_start_hz = 0.0; hdr->freq_inc_hz = 0.0; hdr->channel_bandwidth_hz = 0.0; hdr->time_start_mjd_utc = 0.0; hdr->time_inc_sec = 0.0; hdr->time_average_sec = 0.0; hdr->phase_centre_type = 0; hdr->phase_centre_deg[0] = 0.0; hdr->phase_centre_deg[1] = 0.0; hdr->telescope_centre_lon_deg = 0.0; hdr->telescope_centre_lat_deg = 0.0; hdr->telescope_centre_alt_m = 0.0; /* Initialise CPU memory. */ hdr->telescope_path = oskar_mem_create(OSKAR_CHAR, OSKAR_CPU, 0, status); hdr->settings = oskar_mem_create(OSKAR_CHAR, OSKAR_CPU, 0, status); hdr->station_x_offset_ecef_metres = oskar_mem_create(coord_precision, OSKAR_CPU, num_stations, status); hdr->station_y_offset_ecef_metres = oskar_mem_create(coord_precision, OSKAR_CPU, num_stations, status); hdr->station_z_offset_ecef_metres = oskar_mem_create(coord_precision, OSKAR_CPU, num_stations, status); /* Return handle to structure. */ return hdr; }