void oskar_station_resize(oskar_Station* station, int num_elements, int* status) { /* Check if safe to proceed. */ if (*status) return; /* Resize arrays in the model. */ oskar_mem_realloc(station->element_true_x_enu_metres, num_elements, status); oskar_mem_realloc(station->element_true_y_enu_metres, num_elements, status); oskar_mem_realloc(station->element_true_z_enu_metres, num_elements, status); oskar_mem_realloc(station->element_measured_x_enu_metres, num_elements, status); oskar_mem_realloc(station->element_measured_y_enu_metres, num_elements, status); oskar_mem_realloc(station->element_measured_z_enu_metres, num_elements, status); oskar_mem_realloc(station->element_weight, num_elements, status); oskar_mem_realloc(station->element_gain, num_elements, status); oskar_mem_realloc(station->element_gain_error, num_elements, status); oskar_mem_realloc(station->element_phase_offset_rad, num_elements, status); oskar_mem_realloc(station->element_phase_error_rad, num_elements, status); oskar_mem_realloc(station->element_x_alpha_cpu, num_elements, status); oskar_mem_realloc(station->element_x_beta_cpu, num_elements, status); oskar_mem_realloc(station->element_x_gamma_cpu, num_elements, status); oskar_mem_realloc(station->element_y_alpha_cpu, num_elements, status); oskar_mem_realloc(station->element_y_beta_cpu, num_elements, status); oskar_mem_realloc(station->element_y_gamma_cpu, num_elements, status); oskar_mem_realloc(station->element_types, num_elements, status); oskar_mem_realloc(station->element_types_cpu, num_elements, status); oskar_mem_realloc(station->element_mount_types_cpu, num_elements, status); /* Initialise any new elements with default values. */ if (num_elements > station->num_elements) { int offset, num_new; offset = station->num_elements; num_new = num_elements - offset; /* Must set default element weight, gain and orientation. */ oskar_mem_set_value_real(station->element_gain, 1.0, offset, num_new, status); oskar_mem_set_value_real(station->element_weight, 1.0, offset, num_new, status); memset(oskar_mem_char(station->element_mount_types_cpu) + offset, 'F', num_new); } /* Set the new number of elements. */ station->num_elements = num_elements; }
void oskar_imager_trim_image(oskar_Mem* plane, int plane_size, int image_size, int* status) { int i, num_cells, size_diff; if (*status) return; /* Get the real part only, if the plane is complex. */ if (oskar_mem_is_complex(plane)) { num_cells = plane_size * plane_size; if (oskar_mem_precision(plane) == OSKAR_DOUBLE) { double *t = oskar_mem_double(plane, status); for (i = 0; i < num_cells; ++i) t[i] = t[2 * i]; } else { float *t = oskar_mem_float(plane, status); for (i = 0; i < num_cells; ++i) t[i] = t[2 * i]; } } /* Trim to required image size. */ size_diff = plane_size - image_size; if (size_diff > 0) { char *ptr; size_t in = 0, out = 0, copy_len = 0, element_size = 0; ptr = oskar_mem_char(plane); element_size = oskar_mem_element_size(oskar_mem_precision(plane)); copy_len = element_size * image_size; in = element_size * (size_diff / 2) * (plane_size + 1); for (i = 0; i < image_size; ++i) { /* Use memmove() instead of memcpy() to allow for overlap. */ memmove(ptr + out, ptr + in, copy_len); in += plane_size * element_size; out += copy_len; } } }