1 /* 2 * Copyright (c) 2016-2021, The OSKAR Developers. 3 * See the LICENSE file at the top-level directory of this distribution. 4 */ 5 6 #include <fitsio.h> 7 #include <log/oskar_log.h> 8 #include <math/oskar_fft.h> 9 #include <mem/oskar_mem.h> 10 #include <utility/oskar_thread.h> 11 #include <utility/oskar_timer.h> 12 13 #ifdef __cplusplus 14 extern "C" { 15 #endif 16 17 /* Memory allocated per GPU. */ 18 struct DeviceData 19 { 20 /* Scratch data. */ 21 oskar_Mem *uu, *vv, *ww, *vis, *weight, *counter, *count_skipped; 22 oskar_Mem *norm, *num_points_in_tiles, *tile_offsets, *tile_locks; 23 oskar_Mem *sorted_uu, *sorted_vv, *sorted_ww; 24 oskar_Mem *sorted_wt, *sorted_vis, *sorted_tile; 25 int num_planes; 26 oskar_Mem **planes; 27 28 /* FFT imager data. */ 29 oskar_Mem *conv_func; 30 31 /* W-projection imager data. */ 32 oskar_Mem *w_support, *w_kernels_compact, *w_kernel_start; 33 }; 34 typedef struct DeviceData DeviceData; 35 36 struct oskar_Imager 37 { 38 char* output_name[4]; 39 fitsfile* fits_file[4]; 40 oskar_Timer *tmr_overall, *tmr_grid_update, *tmr_grid_finalise, *tmr_init; 41 oskar_Timer *tmr_select_scale, *tmr_filter, *tmr_read, *tmr_write; 42 oskar_Timer *tmr_copy_convert, *tmr_coord_scan, *tmr_rotate; 43 oskar_Timer *tmr_weights_grid, *tmr_weights_lookup; 44 45 /* Settings parameters. */ 46 int imager_prec, num_devices, num_gpus_avail, dev_loc, num_gpus, *gpu_ids; 47 int chan_snaps, im_type, num_im_channels, num_im_pols, pol_offset; 48 int algorithm, fft_on_gpu, grid_on_gpu; 49 int image_size, use_stokes, support, oversample; 50 int generate_w_kernels_on_gpu, set_cellsize, set_fov, weighting; 51 int num_files, scale_norm_with_num_input_files; 52 char direction_type, kernel_type; 53 char **input_files, *input_root, *output_root, *ms_column; 54 double cellsize_rad, fov_deg, image_padding, im_centre_deg[2]; 55 double uv_filter_min, uv_filter_max, uv_taper[2]; 56 double time_min_utc, time_max_utc, freq_min_hz, freq_max_hz; 57 58 /* Visibility meta-data. */ 59 int num_sel_freqs; 60 double *im_freqs, *sel_freqs; 61 double vis_freq_start_hz, freq_inc_hz; 62 63 /* State. */ 64 int init, status, i_block; 65 int coords_only; /* Set if doing a first pass for uniform weighting. */ 66 oskar_Mutex* mutex; 67 oskar_Log* log; 68 size_t num_vis_processed; 69 70 /* Scratch data. */ 71 oskar_Mem *uu_im, *vv_im, *ww_im, *vis_im, *weight_im, *time_im; 72 oskar_Mem *uu_tmp, *vv_tmp, *ww_tmp, *stokes, *weight_tmp; 73 int num_planes; /* For each output channel and polarisation. */ 74 double *plane_norm, delta_l, delta_m, delta_n, M[9]; 75 oskar_Mem **planes, **weights_grids, **weights_guard; 76 77 /* DFT imager data. */ 78 oskar_Mem *l, *m, *n; 79 80 /* FFT imager data. */ 81 oskar_FFT* fft; 82 int grid_size; 83 oskar_Mem *conv_func, *corr_func; 84 85 /* W-projection imager data. */ 86 size_t ww_points; 87 int num_w_planes; 88 double w_scale, ww_min, ww_max, ww_rms; 89 oskar_Mem *w_support, *w_kernels_compact, *w_kernel_start; 90 91 /* Memory allocated per GPU (array of DeviceData structures). */ 92 DeviceData* d; 93 }; 94 #ifndef OSKAR_IMAGER_TYPEDEF_ 95 #define OSKAR_IMAGER_TYPEDEF_ 96 typedef struct oskar_Imager oskar_Imager; 97 #endif /* OSKAR_IMAGER_TYPEDEF_ */ 98 99 #ifdef __cplusplus 100 } 101 #endif 102