static void evaluate_station_ECEF_coords( double* station_x, double* station_y, double* station_z, int stationID, const oskar_Telescope* telescope) { double st_x, st_y, st_z; double lon, lat, alt; const oskar_Station* station; const void *x_, *y_, *z_; x_ = oskar_mem_void_const( oskar_telescope_station_true_x_offset_ecef_metres_const(telescope)); y_ = oskar_mem_void_const( oskar_telescope_station_true_y_offset_ecef_metres_const(telescope)); z_ = oskar_mem_void_const( oskar_telescope_station_true_z_offset_ecef_metres_const(telescope)); station = oskar_telescope_station_const(telescope, stationID); lon = oskar_station_lon_rad(station); lat = oskar_station_lat_rad(station); alt = oskar_station_alt_metres(station); if (oskar_mem_type( oskar_telescope_station_true_x_offset_ecef_metres_const(telescope)) == OSKAR_DOUBLE) { st_x = ((const double*)x_)[stationID]; st_y = ((const double*)y_)[stationID]; st_z = ((const double*)z_)[stationID]; } else { st_x = (double)((const float*)x_)[stationID]; st_y = (double)((const float*)y_)[stationID]; st_z = (double)((const float*)z_)[stationID]; } oskar_convert_offset_ecef_to_ecef(1, &st_x, &st_y, &st_z, lon, lat, alt, station_x, station_y, station_z); }
static void sim_baselines(oskar_Simulator* h, DeviceData* d, oskar_Sky* sky, int channel_index_block, int time_index_block, int time_index_simulation, int* status) { int num_baselines, num_stations, num_src, num_times_block, num_channels; double dt_dump_days, t_start, t_dump, gast, frequency, ra0, dec0; const oskar_Mem *x, *y, *z; oskar_Mem* alias = 0; /* Get dimensions. */ num_baselines = oskar_telescope_num_baselines(d->tel); num_stations = oskar_telescope_num_stations(d->tel); num_src = oskar_sky_num_sources(sky); num_times_block = oskar_vis_block_num_times(d->vis_block); num_channels = oskar_vis_block_num_channels(d->vis_block); /* Return if there are no sources in the chunk, * or if block time index requested is outside the valid range. */ if (num_src == 0 || time_index_block >= num_times_block) return; /* Get the time and frequency of the visibility slice being simulated. */ dt_dump_days = h->time_inc_sec / 86400.0; t_start = h->time_start_mjd_utc; t_dump = t_start + dt_dump_days * (time_index_simulation + 0.5); gast = oskar_convert_mjd_to_gast_fast(t_dump); frequency = h->freq_start_hz + channel_index_block * h->freq_inc_hz; /* Scale source fluxes with spectral index and rotation measure. */ oskar_sky_scale_flux_with_frequency(sky, frequency, status); /* Evaluate station u,v,w coordinates. */ ra0 = oskar_telescope_phase_centre_ra_rad(d->tel); dec0 = oskar_telescope_phase_centre_dec_rad(d->tel); x = oskar_telescope_station_true_x_offset_ecef_metres_const(d->tel); y = oskar_telescope_station_true_y_offset_ecef_metres_const(d->tel); z = oskar_telescope_station_true_z_offset_ecef_metres_const(d->tel); oskar_convert_ecef_to_station_uvw(num_stations, x, y, z, ra0, dec0, gast, d->u, d->v, d->w, status); /* Set dimensions of Jones matrices. */ if (d->R) oskar_jones_set_size(d->R, num_stations, num_src, status); if (d->Z) oskar_jones_set_size(d->Z, num_stations, num_src, status); oskar_jones_set_size(d->J, num_stations, num_src, status); oskar_jones_set_size(d->E, num_stations, num_src, status); oskar_jones_set_size(d->K, num_stations, num_src, status); /* Evaluate station beam (Jones E: may be matrix). */ oskar_timer_resume(d->tmr_E); oskar_evaluate_jones_E(d->E, num_src, OSKAR_RELATIVE_DIRECTIONS, oskar_sky_l(sky), oskar_sky_m(sky), oskar_sky_n(sky), d->tel, gast, frequency, d->station_work, time_index_simulation, status); oskar_timer_pause(d->tmr_E); #if 0 /* Evaluate ionospheric phase (Jones Z: scalar) and join with Jones E. * NOTE this is currently only a CPU implementation. */ if (d->Z) { oskar_evaluate_jones_Z(d->Z, num_src, sky, d->tel, &settings->ionosphere, gast, frequency, &(d->workJonesZ), status); oskar_timer_resume(d->tmr_join); oskar_jones_join(d->E, d->Z, d->E, status); oskar_timer_pause(d->tmr_join); } #endif /* Evaluate parallactic angle (Jones R: matrix), and join with Jones Z*E. * TODO Move this into station beam evaluation instead. */ if (d->R) { oskar_timer_resume(d->tmr_E); oskar_evaluate_jones_R(d->R, num_src, oskar_sky_ra_rad_const(sky), oskar_sky_dec_rad_const(sky), d->tel, gast, status); oskar_timer_pause(d->tmr_E); oskar_timer_resume(d->tmr_join); oskar_jones_join(d->R, d->E, d->R, status); oskar_timer_pause(d->tmr_join); } /* Evaluate interferometer phase (Jones K: scalar). */ oskar_timer_resume(d->tmr_K); oskar_evaluate_jones_K(d->K, num_src, oskar_sky_l_const(sky), oskar_sky_m_const(sky), oskar_sky_n_const(sky), d->u, d->v, d->w, frequency, oskar_sky_I_const(sky), h->source_min_jy, h->source_max_jy, status); oskar_timer_pause(d->tmr_K); /* Join Jones K with Jones Z*E. */ oskar_timer_resume(d->tmr_join); oskar_jones_join(d->J, d->K, d->R ? d->R : d->E, status); oskar_timer_pause(d->tmr_join); /* Create alias for auto/cross-correlations. */ oskar_timer_resume(d->tmr_correlate); alias = oskar_mem_create_alias(0, 0, 0, status); /* Auto-correlate for this time and channel. */ if (oskar_vis_block_has_auto_correlations(d->vis_block)) { oskar_mem_set_alias(alias, oskar_vis_block_auto_correlations(d->vis_block), num_stations * (num_channels * time_index_block + channel_index_block), num_stations, status); oskar_auto_correlate(alias, num_src, d->J, sky, status); } /* Cross-correlate for this time and channel. */ if (oskar_vis_block_has_cross_correlations(d->vis_block)) { oskar_mem_set_alias(alias, oskar_vis_block_cross_correlations(d->vis_block), num_baselines * (num_channels * time_index_block + channel_index_block), num_baselines, status); oskar_cross_correlate(alias, num_src, d->J, sky, d->tel, d->u, d->v, d->w, gast, frequency, status); } /* Free alias for auto/cross-correlations. */ oskar_mem_free(alias, status); oskar_timer_pause(d->tmr_correlate); }
static void set_up_vis_header(oskar_Simulator* h, int* status) { int num_stations, vis_type; const double rad2deg = 180.0/M_PI; int write_autocorr = 0, write_crosscorr = 0; if (*status) return; /* Check type of correlations to produce. */ if (h->correlation_type == 'C') write_crosscorr = 1; else if (h->correlation_type == 'A') write_autocorr = 1; else if (h->correlation_type == 'B') { write_autocorr = 1; write_crosscorr = 1; } /* Create visibility header. */ num_stations = oskar_telescope_num_stations(h->tel); vis_type = h->prec | OSKAR_COMPLEX; if (oskar_telescope_pol_mode(h->tel) == OSKAR_POL_MODE_FULL) vis_type |= OSKAR_MATRIX; h->header = oskar_vis_header_create(vis_type, h->prec, h->max_times_per_block, h->num_time_steps, h->num_channels, h->num_channels, num_stations, write_autocorr, write_crosscorr, status); /* Add metadata from settings. */ oskar_vis_header_set_freq_start_hz(h->header, h->freq_start_hz); oskar_vis_header_set_freq_inc_hz(h->header, h->freq_inc_hz); oskar_vis_header_set_time_start_mjd_utc(h->header, h->time_start_mjd_utc); oskar_vis_header_set_time_inc_sec(h->header, h->time_inc_sec); /* Add settings file contents if defined. */ if (h->settings_path) { oskar_Mem* temp; temp = oskar_mem_read_binary_raw(h->settings_path, OSKAR_CHAR, OSKAR_CPU, status); oskar_mem_copy(oskar_vis_header_settings(h->header), temp, status); oskar_mem_free(temp, status); } /* Copy other metadata from telescope model. */ oskar_vis_header_set_time_average_sec(h->header, oskar_telescope_time_average_sec(h->tel)); oskar_vis_header_set_channel_bandwidth_hz(h->header, oskar_telescope_channel_bandwidth_hz(h->tel)); oskar_vis_header_set_phase_centre(h->header, 0, oskar_telescope_phase_centre_ra_rad(h->tel) * rad2deg, oskar_telescope_phase_centre_dec_rad(h->tel) * rad2deg); oskar_vis_header_set_telescope_centre(h->header, oskar_telescope_lon_rad(h->tel) * rad2deg, oskar_telescope_lat_rad(h->tel) * rad2deg, oskar_telescope_alt_metres(h->tel)); oskar_mem_copy(oskar_vis_header_station_x_offset_ecef_metres(h->header), oskar_telescope_station_true_x_offset_ecef_metres_const(h->tel), status); oskar_mem_copy(oskar_vis_header_station_y_offset_ecef_metres(h->header), oskar_telescope_station_true_y_offset_ecef_metres_const(h->tel), status); oskar_mem_copy(oskar_vis_header_station_z_offset_ecef_metres(h->header), oskar_telescope_station_true_z_offset_ecef_metres_const(h->tel), status); }