Files @ b7792cb187f7
Branch filter:

Location: MD/arcos/include/rz_array.h

greta
Edited file README via RhodeCode
/** @file rz_array.h
 *  @brief Definitions for 2D/3D arrays
 */

#ifndef _RZ_ARRAY_H_

#include "cstream.h"

typedef struct rz_array_t rz_array_t;

struct rz_array_t {
  REAL *data;
 
  int strides[3];
  int r0, z0, theta0, nr, nz;
  int ntheta;
  int dim;

  int len;

  rz_array_t *host;
};

#define R_INDX 0
#define Z_INDX 1
#define THETA_INDX 2

/* The 3D macros */
#define RZTP_OK(_A, _R, _Z, _T)						\
  ((_R) >= (_A)->r0 && (_R) < (_A)->nr + (_A)->r0 + 4			\
   && (_Z) >= (_A)->z0 && (_Z) < (_A)->nz + (_A)->z0 + 4		\
   && (_T) >= (_A)->theta0 && (_T) < (_A)->ntheta + (_A)->theta0 + 4)	\

#define __RZTP(_A, _R, _Z, _T) ((_A)->data				\
			      +	((_R) - (_A)->r0) * (_A)->strides[R_INDX] \
			      + ((_Z) - (_A)->z0) * (_A)->strides[Z_INDX] \
			      + (((_T) - (_A)->theta0) * (_A)->strides[THETA_INDX]))

#if defined (DEBUG_LEVEL) && DEBUG_LEVEL > 4
/* Look, mum! I am also doing array bound checking.
 * But, alas, since in some parts of the code we perform direct pointer
 * arithmetic, this check will not detect all possible out-of-indexes
 * (but we catch most of them).
 */
# define RZTP(_A, _R, _Z, _T) (RZTP_OK (_A, _R, _Z, _T)?		\
			       __RZTP (_A, _R, _Z, _T):			\
			       (fprintf (stderr, \
					 "%s:%d: Out of bounds ir = %d, iz = %d, itheta = %d\n", \
					 __FILE__, __LINE__, _R, _Z, _T), \
				fprintf (stderr, \
					 "->r0 = %d ->z0 = %d ->theta0 = %d ->nr = %d ->nz = %d ->ntheta = %d\n", \
					 (_A)->r0, (_A)->z0, (_A)->theta0, \
					 (_A)->nr, (_A)->nz, (_A)->ntheta), \
				exit(-1), (double*) NULL))
#else
# define RZTP(_A, _R, _Z, _T) __RZTP(_A, _R, _Z, _T)
#endif

#define RZT(_A,_R,_Z,_T) (*RZTP(_A, _R, _Z, _T))
#define RZTm(_A,_R,_Z,_T) ((fprintf (stderr, \
					 "%s:%d: CHECK ir = %d, iz = %d, itheta = %d\n", \
					 __FILE__, __LINE__, _R, _Z, _T), \
				fprintf (stderr, \
					 "->r0 = %d ->z0 = %d ->theta0 = %d ->nr = %d ->nz = %d ->ntheta = %d\n", \
					 (_A)->r0, (_A)->z0, (_A)->theta0, \
					 (_A)->nr, (_A)->nz, (_A)->ntheta), \
				fprintf (stderr, \
					 "->data = %g\n", \
					 (_A)->data), \
				exit(-1), (double*) NULL))


/* These are valid for 2D arrays.  When applied to a 3D array, they
 * return the value with theta=0.
 */
#define RZP(_A,_R,_Z) RZTP(_A, _R, _Z, (_A)->theta0)
#define RZ(_A,_R,_Z) RZT(_A, _R, _Z, (_A)->theta0)

#define BND_CND_HNEUMANN   1
#define BND_CND_HDIRICHLET -1

#define BND_INWARD -1
#define BND_OUTWARD 1

#define _RZ_ARRAY_H_
#endif