コード例 #1
0
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;
}
コード例 #2
0
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;
        }
    }
}