src/grid/gpu/multigrid.h

    #if DOUBLE_PRECISION
    # define SINGLE_PRECISION 0
    #else
    # define SINGLE_PRECISION 1
    #endif
    #define _GPU 1
    #define GRIDNAME "Multigrid (GPU)"
    #define GRIDPARENT Multigrid
    #define shift_level(d) (multigrid->shift[d])
    #define field_size() (multigrid->shift[depth() + 1])
    #define grid_data() (multigrid->d)
    #define field_offset(s, level) (shift_level((level) ? (level) - 1 : depth()) + (s).i*field_size())
    
    #define GPU_CODE()							\
      "#define valt(s,k,l,m)"						\
      "  _data_val(_index(s,m), point.j + (l) + "				\
      " (point.i + (k))*(point.n.y + 2*GHOSTS) + _shift[point.level])\n"	\
      "#define val_red_(s) _data_val((s).i, point.j - GHOSTS +"		\
      "  (point.i - GHOSTS)*NY + _shift[point.level])\n"			\
      "#define fine(a,k,l,m)"						\
      "  _data_val(_index(a,m), 2*point.j - GHOSTS + (l) +"			\
      "        (2*point.i - GHOSTS + (k))*(point.n.y*2 + 2*GHOSTS) +"	\
      "        _shift[point.level + 1])\n"					\
      "#define coarse(a,k,l,m)"						\
      "  _data_val(_index(a,m), (point.j + GHOSTS)/2 + (l) +"		\
      "        ((point.i + GHOSTS)/2 + (k))*(point.n.y/2 + 2*GHOSTS) +"	\
      "        _shift[point.level - 1])\n"
    
    static bool _gpu_done_ = false;
    
    #include "../multigrid.h"
    #include "../stencils.h"
    #include "gpu.h"
    #include "../multigrid-common.h"
    
    static void gpu_multigrid_methods()
    {
      multigrid_methods();
      boundary_level = gpu_boundary_level;
    }
    
    #include "grid.h"