1 #ifndef PURIFY_WPROJ_OPERATORS_GPU_H 
    2 #define PURIFY_WPROJ_OPERATORS_GPU_H 
    7 #ifdef PURIFY_ARRAYFIRE 
   11 std::tuple<sopt::OperatorFunction<af::array>, sopt::OperatorFunction<af::array>>
 
   12 af_base_padding_and_FFT_2d(
const std::function<t_real(t_real)> &ftkerneluv, 
const t_uint imsizey,
 
   13                            const t_uint imsizex, 
const t_real oversample_ratio, 
const t_real w_mean,
 
   14                            const t_real cellx, 
const t_real celly) {
 
   15   sopt::OperatorFunction<af::array> directZ, indirectZ;
 
   16   sopt::OperatorFunction<af::array> directFFT, indirectFFT;
 
   18       oversample_ratio, imsizey, imsizex, ftkerneluv, w_mean, cellx, celly);
 
   20   PURIFY_LOW_LOG(
"Constructing Zero Padding and Correction Operator: ZDB");
 
   23   std::tie(directZ, indirectZ) =
 
   24       purify::gpu::operators::init_af_zero_padding_2d(S.cast<
t_complexf>(), oversample_ratio);
 
   26   std::tie(directFFT, indirectFFT) =
 
   27       purify::gpu::operators::init_af_FFT_2d(imsizey, imsizex, oversample_ratio);
 
   28   const auto direct = sopt::chained_operators<af::array>(directFFT, directZ);
 
   29   const auto indirect = sopt::chained_operators<af::array>(indirectZ, indirectFFT);
 
   30   return std::make_tuple(direct, indirect);
 
   32 std::tuple<sopt::OperatorFunction<Vector<t_complex>>, sopt::OperatorFunction<Vector<t_complex>>>
 
   34                         const Vector<t_complex> &weights, 
const t_uint &imsizey,
 
   35                         const t_uint &imsizex, 
const t_real oversample_ratio,
 
   37                         const bool w_stacking, 
const t_real cellx, 
const t_real celly,
 
   38                         const t_real absolute_error, 
const t_real relative_error,
 
   39                         const dde_type dde, 
const t_uint idx = 0) {
 
   40   sopt::OperatorFunction<af::array> directFZ, indirectFZ;
 
   41   sopt::OperatorFunction<af::array> directG, indirectG;
 
   42   t_real 
const w_mean = 
w_stacking ? w.array().mean() : 0;
 
   46     std::tie(directFZ, indirectFZ) = af_base_padding_and_FFT_2d(
 
   47         std::get<0>(kerneluvs), imsizey, imsizex, oversample_ratio, w_mean, cellx, celly);
 
   48     PURIFY_MEDIUM_LOG(
"FoV (width, height): {} deg x {} deg", imsizex * cellx / (60. * 60.),
 
   49                       imsizey * celly / (60. * 60.));
 
   50     PURIFY_LOW_LOG(
"Constructing Weighting and Gridding Operators: WG");
 
   52     PURIFY_MEDIUM_LOG(
"Mean, w: {}, +/- {}", w.array().mean(), (w.maxCoeff() - w.minCoeff()) * 0.5);
 
   53     std::tie(directG, indirectG) =
 
   54         init_af_gridding_matrix_2d(
u, 
v, w.array() - w_mean, weights, imsizey, imsizex,
 
   55                                    oversample_ratio, std::get<0>(kerneluvs), std::get<1>(kerneluvs),
 
   56                                    Ju, Jw, cellx, celly, absolute_error, relative_error, dde);
 
   60     std::function<t_real(t_real)> kernelu, kernelv, ftkernelu, ftkernelv;
 
   61     std::tie(kernelu, kernelv, ftkernelu, ftkernelv) =
 
   63     std::tie(directFZ, indirectFZ) = af_base_padding_and_FFT_2d(
 
   64         ftkernelu, ftkernelv, imsizey, imsizex, oversample_ratio, w_mean, cellx, celly);
 
   65     PURIFY_MEDIUM_LOG(
"FoV (width, height): {} deg x {} deg", imsizex * cellx / (60. * 60.),
 
   66                       imsizey * celly / (60. * 60.));
 
   67     PURIFY_LOW_LOG(
"Constructing Weighting and Gridding Operators: WG");
 
   69     PURIFY_MEDIUM_LOG(
"Mean, w: {}, +/- {}", w.array().mean(), (w.maxCoeff() - w.minCoeff()) * 0.5);
 
   71     std::tie(directG, indirectG) =
 
   72         init_af_gridding_matrix_2d(
u, 
v, w.array() - w_mean, weights, imsizey, imsizex,
 
   73                                    oversample_ratio, std::get<0>(kerneluvs), std::get<1>(kerneluvs),
 
   74                                    Ju, Jw, cellx, celly, absolute_error, relative_error, dde);
 
   78     throw std::runtime_error(
"DDE is not recognised.");
 
   80   auto direct = gpu::host_wrapper(sopt::chained_operators<af::array>(directG, directFZ),
 
   81                                   imsizey * imsizex, 
u.size(), idx);
 
   82   auto indirect = gpu::host_wrapper(sopt::chained_operators<af::array>(indirectFZ, indirectG),
 
   83                                     u.size(), imsizex * imsizey, idx);
 
   85   return std::make_tuple(direct, indirect);
 
   89 namespace measurementoperator {
 
   93     const Vector<t_real> &
u, 
const Vector<t_real> &
v, 
const Vector<t_real> &w,
 
   94     const Vector<t_complex> &weights, 
const t_uint imsizey, 
const t_uint imsizex,
 
   96     const bool w_stacking, 
const t_real cellx, 
const t_real celly, 
const t_real absolute_error,
 
   97     const t_real relative_error, 
const dde_type dde, 
const t_uint idx = 0) {
 
   98   std::array<t_int, 3> N = {0, 1, 
static_cast<t_int
>(imsizey * imsizex)};
 
   99   std::array<t_int, 3> M = {0, 1, 
static_cast<t_int
>(
u.size())};
 
  100   sopt::OperatorFunction<Vector<t_complex>> directDegrid, indirectDegrid;
 
  102       u, 
v, w, weights, imsizey, imsizex, oversample_ratio, 
kernel, Ju, Jw, 
w_stacking, cellx,
 
  103       celly, absolute_error, relative_error, dde, idx);
 
  104   auto direct = directDegrid;
 
  105   auto indirect = indirectDegrid;
 
  106   return std::make_shared<sopt::LinearTransform<Vector<t_complex>>>(direct, M, indirect, N);
 
  110     const utilities::vis_params &uv_vis_input, 
const t_uint imsizey, 
const t_uint imsizex,
 
  111     const t_real cell_x, 
const t_real cell_y, 
const t_real oversample_ratio,
 
  113     const t_real absolute_error, 
const t_real relative_error, 
const dde_type dde,
 
  114     const t_uint idx = 0) {
 
  119                                  absolute_error, relative_error, dde, idx);
 
  124     const sopt::mpi::Communicator &comm, 
const Vector<t_real> &
u, 
const Vector<t_real> &
v,
 
  125     const Vector<t_real> &w, 
const Vector<t_complex> &weights, 
const t_uint imsizey,
 
  127     const t_uint Ju, 
const t_uint Jw, 
const bool w_stacking, 
const t_real cellx, 
const t_real celly,
 
  128     const t_real absolute_error, 
const t_real relative_error, 
const dde_type dde,
 
  129     const t_uint idx = 0) {
 
  130   std::array<t_int, 3> N = {0, 1, 
static_cast<t_int
>(imsizey * imsizex)};
 
  131   std::array<t_int, 3> M = {0, 1, 
static_cast<t_int
>(
u.size())};
 
  132   sopt::OperatorFunction<Vector<t_complex>> directDegrid, indirectDegrid;
 
  134       u, 
v, w, weights, imsizey, imsizex, oversample_ratio, 
kernel, Ju, Jw, 
w_stacking, cellx,
 
  135       celly, absolute_error, relative_error, dde, idx);
 
  136   const auto allsumall = purify::operators::init_all_sum_all<Vector<t_complex>>(comm);
 
  137   auto direct = directDegrid;
 
  138   auto indirect = sopt::chained_operators<Vector<t_complex>>(allsumall, indirectDegrid);
 
  139   return std::make_shared<sopt::LinearTransform<Vector<t_complex>>>(direct, M, indirect, N);
 
  143     const sopt::mpi::Communicator &comm, 
const utilities::vis_params &uv_vis_input,
 
  144     const t_uint imsizey, 
const t_uint imsizex, 
const t_real cell_x, 
const t_real cell_y,
 
  146     const bool w_stacking, 
const t_real absolute_error, 
const t_real relative_error,
 
  147     const dde_type dde, 
const t_uint idx = 0) {
 
  152                                  cell_y, absolute_error, relative_error, dde, idx);
 
  155 std::shared_ptr<sopt::LinearTransform<Vector<t_complex>>> init_degrid_operator_2d_mpi(
 
  156     const sopt::mpi::Communicator &comm, 
const Vector<t_real> &
u, 
const Vector<t_real> &
v,
 
  157     const Vector<t_real> &w, 
const Vector<t_complex> &weights, 
const t_uint imsizey,
 
  159     const t_uint Ju, 
const t_uint Jw, 
const bool w_stacking, 
const t_real cellx, 
const t_real celly,
 
  160     const t_real absolute_error, 
const t_real relative_error, 
const dde_type dde,
 
  161     const t_uint idx = 0) {
 
  162   throw std::runtime_error(
"Under construction!");
 
  164                                  Ju, Jw, 
w_stacking, cellx, celly, absolute_error, relative_error,
 
  168 std::shared_ptr<sopt::LinearTransform<Vector<t_complex>>> init_degrid_operator_2d_mpi(
 
  169     const sopt::mpi::Communicator &comm, 
const utilities::vis_params &uv_vis_input,
 
  170     const t_uint imsizey, 
const t_uint imsizex, 
const t_real cell_x, 
const t_real cell_y,
 
  172     const bool w_stacking, 
const t_real absolute_error, 
const t_real relative_error,
 
  173     const dde_type dde, 
const t_uint idx = 0) {
 
  178                                  cell_y, absolute_error, relative_error, dde, idx);
 
#define PURIFY_LOW_LOG(...)
Low priority message.
 
#define PURIFY_MEDIUM_LOG(...)
Medium priority message.
 
const std::vector< t_real > u
data for u coordinate
 
const std::vector< t_real > v
data for v coordinate
 
Image< t_complex > init_correction_radial_2d(const t_real oversample_ratio, const t_uint imsizey_, const t_uint imsizex_, const std::function< t_real(t_real)> &ftkerneluv, const t_real w_mean, const t_real cellx, const t_real celly)
 
std::shared_ptr< sopt::LinearTransform< T > > init_degrid_operator_2d(const Vector< t_real > &u, const Vector< t_real > &v, const Vector< t_real > &w, const Vector< t_complex > &weights, const t_uint &imsizey, const t_uint &imsizex, const t_real &oversample_ratio=2, const kernels::kernel kernel=kernels::kernel::kb, const t_uint Ju=4, const t_uint Jv=4, const bool w_stacking=false, const t_real &cellx=1, const t_real &celly=1)
Returns linear transform that is the standard degridding operator.
 
std::tuple< sopt::OperatorFunction< T >, sopt::OperatorFunction< T > > base_degrid_operator_2d(const Vector< t_real > &u, const Vector< t_real > &v, const Vector< t_real > &w, const Vector< t_complex > &weights, const t_uint &imsizey, const t_uint &imsizex, const t_real &oversample_ratio=2, const kernels::kernel kernel=kernels::kernel::kb, const t_uint Ju=4, const t_uint Jv=4, const fftw_plan &ft_plan=fftw_plan::measure, const bool w_stacking=false, const t_real &cellx=1, const t_real &celly=1, const bool on_the_fly=true)
 
utilities::vis_params w_stacking(utilities::vis_params const ¶ms, sopt::mpi::Communicator const &comm, const t_int iters, const std::function< t_real(t_real)> &cost, const t_real k_means_rel_diff)
 
utilities::vis_params convert_to_pixels(const utilities::vis_params &uv_vis, const t_real cell_x, const t_real cell_y, const t_real imsizex, const t_real imsizey, const t_real oversample_ratio)
Converts u and v coordaintes to units of pixels.
 
std::tuple< std::function< t_real(t_real)>, std::function< t_real(t_real)> > create_radial_ftkernel(const kernels::kernel kernel_name_, const t_uint Ju_, const t_real oversample_ratio)
 
std::complex< float > t_complexf
 
std::tuple< std::function< t_real(t_real)>, std::function< t_real(t_real)>, std::function< t_real(t_real)>, std::function< t_real(t_real)> > create_kernels(const kernels::kernel kernel_name_, const t_uint Ju_, const t_uint Jv_, const t_real imsizey_, const t_real imsizex_, const t_real oversample_ratio)
 
dde_type
Types of DDEs in purify.