diff --git a/include/mapper.h b/include/mapper.h new file mode 100644 index 0000000000000000000000000000000000000000..e4fb31819e225f0dbcd65df45818fb3c9de84b84 --- /dev/null +++ b/include/mapper.h @@ -0,0 +1,92 @@ +/** @file mapper.h + * @brief Definitions for mapper objects. + * + * A mapper objects defines how and what to map between two grid families. + * For example, a mapper object can be used to map the charge from + * a @a cdr grid to a @a Poisson grid, or to map the @a potential of a Poisson + * grid into one of the components of the @a electric field in a @a cdr grid. + * For that, a mapper object has to implement some methods that tell us + * how to map things in the cases\n + * a) the source grid is coarser than the target grid (interpolation),\n + * b) the source and the target are at the same level (copy),\n + * c) the target grid is coarser (coarsening). + */ + +#ifndef _MAPPER_H_ + +typedef struct mapper_t mapper_t; + +#ifndef _INTERPOL2_H_ +# include "interpol2.h" +#endif + +#define _coarsen_params_ (mapper_t *mapper, grid_t *source, grid_t *target, \ + int ir, int iz, int itheta) +#define _copy_params_ (mapper_t *mapper, grid_t *source, grid_t *target, \ + int ir, int iz, int itheta) +#define _interpol_set_params_ (mapper_t *mapper, grid_t *source, \ + interpol_t *interpol, int ir, \ + int iz, int itheta) +#define _interpol_params_ (mapper_t *mapper, grid_t *source, grid_t *target, \ + interpol_t *interpol, int ir, int iz, int itheta) + + +struct mapper_t { + interpol_method_t *interpol_method; + + void (*coarsen) _coarsen_params_; + void (*copy) _copy_params_; + /* may return false if we are outside the source grid. */ + int (*interpol_set) _interpol_set_params_; + + void (*interpol) _interpol_params_; + + /* This is used for the interpolation of electric fields and indicates + * the staggering of the cells. When we call the interpolator to set + * the stencil at coordinates pr, pz, the fine-grid cells whose value will + * later be calculated ir, iz with + * pr << level_diff + shift_r << (level_diff - 1) <= ir + * < pr << level_diff + shift_r << (level_diff - 1) + * + * (and the equivalent for iz). + * Hence note that for interpolation in not-staggered grids, + * (i.e. charge, densities, ...) + * shift_r = shift_z = 0. + */ + int shift_r, shift_z; + + /* We provide this extra member to allow the easy creation of different + * mappers that share the same functions but have a slightly different + * behaviour. In particular this is used in cdr.c to define + * different interpolators for each species. In that case, extra is the + * species index. + */ + int extra; +}; + + +/** Usually, we will define functions called xxxx_coarsen, xxxx_copy, etc + to implement the above interface. We define these macros to facilitate + the declaration of such functions. */ +#define decl_mapper_funcs(_VAR) \ + void _VAR ## _coarsen _coarsen_params_; \ + void _VAR ## _copy _copy_params_; \ + int _VAR ## _interpol_set _interpol_set_params_; \ + void _VAR ## _interpol _interpol_params_ + +/** Useful to init a staggered mapper object */ +#define mk_mapper_staggered(_C, _INTERPOL_METHOD, _SHIFT_R, _SHIFT_Z) \ + {_INTERPOL_METHOD, _C ## _coarsen, _C ## _copy, \ + _C ## _interpol_set, _C ##_interpol, _SHIFT_R, _SHIFT_Z, 0} + +/** Useful to init a mapper object */ +#define mk_mapper(_C, _INTERPOL_METHOD) \ + mk_mapper_staggered (_C, _INTERPOL_METHOD, 0, 0) + +/** Mappers that only copy or interpolate. */ +#define mk_mapper_down(_C, _INTERPOL_METHOD) \ + {_INTERPOL_METHOD, NULL, _C ## _copy, \ + _C ## _interpol_set, _C ##_interpol, 0, 0, 0} + +#define _MAPPER_H_ +#endif