Example #1
0
void oskar_imager_free(oskar_Imager* h, int* status)
{
    int i;
    if (!h) return;
    oskar_imager_reset_cache(h, status);
    oskar_mem_free(h->uu_im, status);
    oskar_mem_free(h->vv_im, status);
    oskar_mem_free(h->ww_im, status);
    oskar_mem_free(h->uu_tmp, status);
    oskar_mem_free(h->vv_tmp, status);
    oskar_mem_free(h->ww_tmp, status);
    oskar_mem_free(h->vis_im, status);
    oskar_mem_free(h->weight_im, status);
    oskar_mem_free(h->weight_tmp, status);
    oskar_mem_free(h->time_im, status);
    oskar_timer_free(h->tmr_grid_finalise);
    oskar_timer_free(h->tmr_grid_update);
    oskar_timer_free(h->tmr_init);
    oskar_timer_free(h->tmr_read);
    oskar_timer_free(h->tmr_write);
    oskar_mutex_free(h->mutex);
    oskar_imager_free_device_data(h, status);
    for (i = 0; i < h->num_files; ++i)
        free(h->input_files[i]);
    free(h->input_files);
    free(h->input_root);
    free(h->output_root);
    free(h->ms_column);
    free(h->gpu_ids);
    free(h->d);
    free(h);
}
void oskar_imager_set_algorithm(oskar_Imager* h, const char* type,
        int* status)
{
    if (*status) return;
    h->image_padding = 1.0;
    if (!strncmp(type, "FFT", 3) || !strncmp(type, "fft", 3))
    {
        h->algorithm = OSKAR_ALGORITHM_FFT;
        h->kernel_type = 'S';
        h->support = 3;
        h->oversample = 100;
    }
    else if (!strncmp(type, "W", 1) || !strncmp(type, "w", 1))
    {
        h->algorithm = OSKAR_ALGORITHM_WPROJ;
        h->oversample = 4;
        h->image_padding = 1.2;
    }
    else if (!strncmp(type, "DFT 2", 5) || !strncmp(type, "dft 2", 5))
        h->algorithm = OSKAR_ALGORITHM_DFT_2D;
    else if (!strncmp(type, "DFT 3", 5) || !strncmp(type, "dft 3", 5))
        h->algorithm = OSKAR_ALGORITHM_DFT_3D;
    else *status = OSKAR_ERR_INVALID_ARGUMENT;

    /* Recalculate grid plane size. */
    h->grid_size = 0;
    oskar_imager_reset_cache(h, status);
    (void) oskar_imager_plane_size(h);
}
Example #3
0
void oskar_imager_finalise(oskar_Imager* h,
        int num_output_images, oskar_Mem** output_images,
        int num_output_grids, oskar_Mem** output_grids, int* status)
{
    int t, c, p, i;
    if (*status || !h->planes) return;

    /* Adjust normalisation if required. */
    if (h->scale_norm_with_num_input_files)
    {
        for (i = 0; i < h->num_planes; ++i)
            h->plane_norm[i] /= h->num_files;
    }

    /* Copy grids to output grid planes if given. */
    for (i = 0; (i < h->num_planes) && (i < num_output_grids); ++i)
    {
        oskar_mem_copy(output_grids[i], h->planes[i], status);
        oskar_mem_scale_real(output_grids[i], 1.0 / h->plane_norm[i], status);
    }

    /* Check if images are required. */
    if (h->fits_file[0] || output_images)
    {
        /* Finalise all the planes. */
        for (i = 0; i < h->num_planes; ++i)
        {
            oskar_imager_finalise_plane(h,
                    h->planes[i], h->plane_norm[i], status);
            oskar_imager_trim_image(h->planes[i],
                    h->grid_size, h->image_size, status);
        }

        /* Copy images to output image planes if given. */
        for (i = 0; (i < h->num_planes) && (i < num_output_images); ++i)
        {
            memcpy(oskar_mem_void(output_images[i]),
                    oskar_mem_void_const(h->planes[i]), h->image_size *
                    h->image_size * oskar_mem_element_size(h->imager_prec));
        }

        /* Write to files if required. */
        for (t = 0, i = 0; t < h->im_num_times; ++t)
            for (c = 0; c < h->im_num_channels; ++c)
                for (p = 0; p < h->im_num_pols; ++p, ++i)
                    write_plane(h, h->planes[i], t, c, p, status);
    }

    /* Reset imager memory. */
    oskar_imager_reset_cache(h, status);
}
void oskar_imager_set_size(oskar_Imager* h, int size, int* status)
{
    if (size < 2 || size % 2 != 0)
    {
        *status = OSKAR_ERR_INVALID_ARGUMENT;
        return;
    }
    h->image_size = size;
    h->grid_size = 0;
    oskar_imager_reset_cache(h, status);
    (void) oskar_imager_plane_size(h);
    if (h->set_fov)
        h->cellsize_rad = oskar_convert_fov_to_cellsize(
                h->fov_deg * (M_PI / 180.0), h->image_size);
    else if (h->set_cellsize)
        h->fov_deg = oskar_convert_cellsize_to_fov(
                h->cellsize_rad, h->image_size) * (180.0 / M_PI);
}