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