Files @ b7792cb187f7
Branch filter:

Location: MD/arcos/include/mapper.h

greta
Edited file README via RhodeCode
/** @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