/** @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