File diff 000000000000 → d6faa5ffcedf
include/mapper.h
Show inline comments
 
new file 100644
 
/** @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