void oskar_simulator_reset_cache(oskar_Simulator* h, int* status) { free_device_data(h, status); oskar_binary_free(h->vis); oskar_vis_header_free(h->header, status); #ifndef OSKAR_NO_MS oskar_ms_close(h->ms); #endif h->vis = 0; h->header = 0; h->ms = 0; }
static void ms_free(PyObject* capsule) { oskar_MeasurementSet* h = (oskar_MeasurementSet*) PyCapsule_GetPointer(capsule, name); oskar_ms_close(h); }
static void ms_free(PyObject* capsule) { oskar_ms_close((oskar_MeasurementSet*) get_handle(capsule, name)); }
void oskar_imager_read_coords_ms(oskar_Imager* h, const char* filename, int i_file, int num_files, int* percent_done, int* percent_next, int* status) { #ifndef OSKAR_NO_MS oskar_MeasurementSet* ms; oskar_Mem *uvw, *u, *v, *w, *weight, *time_centroid; int num_channels, num_stations, num_baselines, num_pols; int start_row, num_rows; double *uvw_, *u_, *v_, *w_; if (*status) return; /* Read the header. */ ms = oskar_ms_open(filename); if (!ms) { *status = OSKAR_ERR_FILE_IO; return; } num_rows = (int) oskar_ms_num_rows(ms); num_stations = (int) oskar_ms_num_stations(ms); num_baselines = num_stations * (num_stations - 1) / 2; num_pols = (int) oskar_ms_num_pols(ms); num_channels = (int) oskar_ms_num_channels(ms); /* Set visibility meta-data. */ oskar_imager_set_vis_frequency(h, oskar_ms_freq_start_hz(ms), oskar_ms_freq_inc_hz(ms), num_channels); oskar_imager_set_vis_phase_centre(h, oskar_ms_phase_centre_ra_rad(ms) * 180/M_PI, oskar_ms_phase_centre_dec_rad(ms) * 180/M_PI); /* Create arrays. */ uvw = oskar_mem_create(OSKAR_DOUBLE, OSKAR_CPU, 3 * num_baselines, status); u = oskar_mem_create(OSKAR_DOUBLE, OSKAR_CPU, num_baselines, status); v = oskar_mem_create(OSKAR_DOUBLE, OSKAR_CPU, num_baselines, status); w = oskar_mem_create(OSKAR_DOUBLE, OSKAR_CPU, num_baselines, status); weight = oskar_mem_create(OSKAR_SINGLE, OSKAR_CPU, num_baselines * num_pols, status); time_centroid = oskar_mem_create(OSKAR_DOUBLE, OSKAR_CPU, num_baselines, status); uvw_ = oskar_mem_double(uvw, status); u_ = oskar_mem_double(u, status); v_ = oskar_mem_double(v, status); w_ = oskar_mem_double(w, status); /* Loop over visibility blocks. */ for (start_row = 0; start_row < num_rows; start_row += num_baselines) { int i, block_size; size_t allocated, required; if (*status) break; /* Read coordinates and weights from Measurement Set. */ oskar_timer_resume(h->tmr_read); block_size = num_rows - start_row; if (block_size > num_baselines) block_size = num_baselines; allocated = oskar_mem_length(uvw) * oskar_mem_element_size(oskar_mem_type(uvw)); oskar_ms_read_column(ms, "UVW", start_row, block_size, allocated, oskar_mem_void(uvw), &required, status); allocated = oskar_mem_length(weight) * oskar_mem_element_size(oskar_mem_type(weight)); oskar_ms_read_column(ms, "WEIGHT", start_row, block_size, allocated, oskar_mem_void(weight), &required, status); allocated = oskar_mem_length(time_centroid) * oskar_mem_element_size(oskar_mem_type(time_centroid)); oskar_ms_read_column(ms, "TIME_CENTROID", start_row, block_size, allocated, oskar_mem_void(time_centroid), &required, status); /* Split up baseline coordinates. */ for (i = 0; i < block_size; ++i) { u_[i] = uvw_[3*i + 0]; v_[i] = uvw_[3*i + 1]; w_[i] = uvw_[3*i + 2]; } /* Update the imager with the data. */ oskar_timer_pause(h->tmr_read); oskar_imager_update(h, block_size, 0, num_channels - 1, num_pols, u, v, w, 0, weight, time_centroid, status); *percent_done = (int) round(100.0 * ( (start_row + block_size) / (double)(num_rows * num_files) + i_file / (double)num_files)); if (h->log && percent_next && *percent_done >= *percent_next) { oskar_log_message(h->log, 'S', -2, "%3d%% ...", *percent_done); *percent_next = 10 + 10 * (*percent_done / 10); } } oskar_mem_free(uvw, status); oskar_mem_free(u, status); oskar_mem_free(v, status); oskar_mem_free(w, status); oskar_mem_free(weight, status); oskar_mem_free(time_centroid, status); oskar_ms_close(ms); #else (void) filename; (void) i_file; (void) num_files; (void) percent_done; (void) percent_next; oskar_log_error(h->log, "OSKAR was compiled without Measurement Set support."); *status = OSKAR_ERR_FUNCTION_NOT_AVAILABLE; #endif }