IWAVEBASE 1.0
|
00001 00014 /*============================================================================*/ 00015 00016 #ifndef __UTILS_H_ 00017 #define __UTILS_H_ 00018 /*----------------------------------------------------------------------------*/ 00019 00020 #include "cstd.h" 00021 #include "usempi.h" 00022 00023 /*----------------------------------------------------------------------------*/ 00024 /* inline keyword. */ 00025 #ifndef __cplusplus 00026 #if __STDC_VERSION__ >= 199901L 00027 #else 00028 #define inline 00029 #endif 00030 #endif 00031 /* restrict keyword. */ 00032 #if __STDC_VERSION__ >= 199901L 00033 #else 00034 #define restrict 00035 #endif 00036 /*----------------------------------------------------------------------------*/ 00037 /* 00038 Data types. 00039 */ 00040 #define DT_CSTRING 1 00041 #define DT_CHAR 2 00042 #define DT_SHORT 3 00043 #define DT_INT 4 00044 #define DT_LONG 5 00045 #define DT_FLOAT 6 00046 #define DT_DOUBLE 7 00047 #define DT_USHORT 9 00048 #define DT_UINT 10 00049 #define DT_ULONG 11 00050 /*----------------------------------------------------------------------------*/ 00054 /*#define DT_REAL DT_DOUBLE*/ 00055 #define DT_REAL DT_FLOAT 00056 /*----------------------------------------------------------------------------*/ 00057 /* DO NOT CHANGE. */ 00058 #if DT_REAL == DT_DOUBLE 00059 00060 #define ireal double 00061 #define REAL_NAN 0.0 /* TODO: better than 0 */ 00062 #define REAL_ZERO 0.0 00063 #define REAL_ONE 1.0 00064 #define REAL_EPS DBL_EPSILON 00065 #define REAL_MIN DBL_MIN 00066 #define REAL_MAX DBL_MAX 00067 #define IWAVE_MPI_REAL MPI_DOUBLE 00068 #elif DT_REAL == DT_FLOAT 00069 #define ireal float 00070 00071 #define REAL_NAN 0.0f /* TODO: better than 0 */ 00072 #define REAL_ZERO 0.0f 00073 #define REAL_ONE 1.0f 00074 #define REAL_EPS FLT_EPSILON 00075 #define REAL_MIN FLT_MIN 00076 #define REAL_MAX FLT_MAX 00077 #define IWAVE_MPI_REAL MPI_FLOAT 00078 #else 00079 #error REAL TYPE UNDEFINED. 00080 #endif 00081 00082 /*----------------------------------------------------------------------------*/ 00086 #define RDOM_MAX_NARR 30 00087 /*----------------------------------------------------------------------------*/ 00092 #define RARR_MAX_NDIM 7 00093 00094 /******************* begin formerly in iwave.h - moved 26.01.11 WWS ***********/ 00095 /* 00096 Number of SPATIAL dimensions. 1D/2D/3D only. 00097 CHANGE BEFORE COMPILING. 00098 IWAVE_NDIM SHOULD BE >= RARR_MAX_NDIM. 00099 */ 00100 #define IWAVE_NDIM 3 /* 1 | 2 | 3 */ 00101 00102 #if IWAVE_NDIM > RARR_MAX_NDIM 00103 #error NOT ENOUGH DIMENSIONS IN THE RARRAY: WAVE_NDIM > RARR_MAX_NDIM. 00104 #endif 00105 /*----------------------------------------------------------------------------*/ 00106 /* 00107 3^IWAVE_NDIM and number of neighbors for 1D/2D/3D. 00108 Note: lranks index is computed via ex_ind2n(..), 00109 lranks[IWAVE_NNEI] contains this processor's rank. 00110 */ 00111 #if IWAVE_NDIM == 1 00112 #define IWAVE_3NDIM 3 00113 #elif IWAVE_NDIM == 2 00114 #define IWAVE_3NDIM 9 00115 #elif IWAVE_NDIM == 3 00116 #define IWAVE_3NDIM 27 00117 #else 00118 #error IWAVE_3NDIM UNDEFINED. 00119 #endif 00120 00121 #define IWAVE_NNEI (IWAVE_3NDIM - 1) 00122 00123 /********************* end formerly in iwave.h - moved 26.01.11 WWS ***********/ 00124 00125 /*----------------------------------------------------------------------------*/ 00126 /* 00127 Indices of coordinate axes. Permutation of {0,1,2}. 00128 TO CHANGE BY USER. 00129 */ 00130 #define IX 0 00131 #define IY 1 00132 #define IZ 2 00133 /*----------------------------------------------------------------------------*/ 00134 /* 00135 Flag (0/1) to dump pointers when dumping an array. 00136 TO CHANGE BY USER. 00137 */ 00138 #define RARR_DUMP_POINTERS 0 00139 /*----------------------------------------------------------------------------*/ 00144 #define IARR_MAX_NDIM 7 00145 00146 #if RARR_MAX_NDIM > IARR_MAX_NDIM 00147 #error NOT ENOUGH DIMENSIONS IN THE IPNT: RARR_MAX_NDIM > IARR_MAX_NDIM. 00148 #endif 00149 typedef int IPNT[IARR_MAX_NDIM]; 00154 typedef ireal RPNT[RARR_MAX_NDIM]; 00155 00156 #if RARR_MAX_NDIM == 1 00157 static const IPNT IPNT_0 = {0}; 00158 static const IPNT IPNT_1 = {1}; 00159 static const RPNT RPNT_0 = {REAL_ZERO}; 00160 static const RPNT RPNT_1 = {REAL_ONE}; 00161 #define RARR_MAX_3NDIM 3 00162 #elif RARR_MAX_NDIM == 2 00163 static const IPNT IPNT_0 = {0, 0}; 00164 static const IPNT IPNT_1 = {1, 1}; 00165 static const RPNT RPNT_0 = {REAL_ZERO, REAL_ZERO}; 00166 static const RPNT RPNT_1 = {REAL_ONE, REAL_ONE}; 00167 #define RARR_MAX_3NDIM 9 00168 #elif RARR_MAX_NDIM == 3 00169 static const IPNT IPNT_0 = {0, 0, 0}; 00170 static const IPNT IPNT_1 = {1, 1, 1}; 00171 static const RPNT RPNT_0 = {REAL_ZERO, REAL_ZERO, REAL_ZERO}; 00172 static const RPNT RPNT_1 = {REAL_ONE, REAL_ONE, REAL_ONE}; 00173 #define RARR_MAX_3NDIM 27 00174 #elif RARR_MAX_NDIM == 4 00175 static const IPNT IPNT_0 = {0, 0, 0, 0}; 00176 static const IPNT IPNT_1 = {1, 1, 1, 1}; 00177 static const RPNT RPNT_0 = {REAL_ZERO, REAL_ZERO, REAL_ZERO, REAL_ZERO}; 00178 static const RPNT RPNT_1 = {REAL_ONE, REAL_ONE, REAL_ONE, REAL_ONE}; 00179 #define RARR_MAX_3NDIM 81 00180 #elif RARR_MAX_NDIM == 5 00181 static const IPNT IPNT_0 = {0, 0, 0, 0, 0}; 00182 static const IPNT IPNT_1 = {1, 1, 1, 1, 1}; 00183 static const RPNT RPNT_0 = {REAL_ZERO, REAL_ZERO, REAL_ZERO, REAL_ZERO, REAL_ZERO}; 00184 static const RPNT RPNT_1 = {REAL_ONE, REAL_ONE, REAL_ONE, REAL_ONE, REAL_ONE}; 00185 #define RARR_MAX_3NDIM 243 00186 #elif RARR_MAX_NDIM == 6 00187 static const IPNT IPNT_0 = {0, 0, 0, 0, 0, 0}; 00188 static const IPNT IPNT_1 = {1, 1, 1, 1, 1, 1}; 00189 static const RPNT RPNT_0 = {REAL_ZERO, REAL_ZERO, REAL_ZERO, REAL_ZERO, REAL_ZERO, REAL_ZERO}; 00190 static const RPNT RPNT_1 = {REAL_ONE, REAL_ONE, REAL_ONE, REAL_ONE, REAL_ONE, REAL_ONE}; 00191 #define RARR_MAX_3NDIM 729 00192 #elif RARR_MAX_NDIM == 7 00193 static const IPNT IPNT_0 = {0, 0, 0, 0, 0, 0, 0}; 00194 static const IPNT IPNT_1 = {1, 1, 1, 1, 1, 1, 1}; 00195 static const RPNT RPNT_0 = {REAL_ZERO, REAL_ZERO, REAL_ZERO, REAL_ZERO, REAL_ZERO, REAL_ZERO, REAL_ZERO}; 00196 static const RPNT RPNT_1 = {REAL_ONE, REAL_ONE, REAL_ONE, REAL_ONE, REAL_ONE, REAL_ONE, REAL_ONE}; 00197 #define RARR_MAX_3NDIM 2187 00198 #else 00199 #error IPNT/RPNT CONSTANTS UNDEFINED. 00200 #endif 00201 00202 00203 00205 int* IASN(IPNT l, const IPNT r); 00207 ireal* RASN(RPNT l, const RPNT r); 00208 00209 /* compatibility */ 00210 #define _IPNT IPNT 00211 #define _RPNT RPNT 00212 /*----------------------------------------------------------------------------*/ 00213 /* 00214 Flag to perform bounds checks. 00215 TO CHANGE BY USER. 00216 */ 00217 #define CHECK_BOUNDS 00218 /* #undef CHECK_BOUNDS */ 00219 /*----------------------------------------------------------------------------*/ 00227 typedef struct s_SIZEDSTRING 00228 { 00229 long n; 00230 char *s; 00231 } SIZEDSTRING; 00232 /*----------------------------------------------------------------------------*/ 00233 /* 00234 Separator and quote symbols for parser. 00235 TO CHANGE BY USER. 00236 */ 00237 #define PS_SEP '=' /* separator symbol */ 00238 #define PS_QUO '"' /* quote symbol */ 00239 /*----------------------------------------------------------------------------*/ 00240 void* usermalloc_(size_t size); 00249 void userfree_(void *ptr); 00250 /*----------------------------------------------------------------------------*/ 00251 /* 00252 Min, max macros. 00253 */ 00254 00255 #define iwave_min(a, b) ((a) < (b) ? (a) : (b)) 00256 #define iwave_max(a, b) ((a) > (b) ? (a) : (b)) 00257 #define iwave_abs(a) ((a) < REAL_ZERO ? (-a) : (a)) 00258 00259 /*----------------------------------------------------------------------------*/ 00264 #define E_SUCCESS 0 00266 #define E_INTERNAL 1000 00267 #define E_OTHER 2000 00268 #define E_ALLOC 1 00269 #define E_BADINPUT 2 00270 #define E_OUTOFBOUNDS 3 00271 #define E_BADINDEX 4 00272 #define E_BADARRINDEX 5 00273 #define E_BADDIMINDEX 6 00274 #define E_FILE 7 00275 #define E_FILEOPEN 8 00276 #define E_MPI 9 00277 #define E_DOMAINDECOMP 10 00278 #define E_PARSE 11 00279 #define E_PARSENONAME 12 00280 #define E_PARSENOVALUE 13 00281 #define E_PARSECONVERT 14 00282 #define E_ALREADYALLOC 15 00283 #define E_RANGE -2 00284 #define E_OVERFLOW -3 00285 #define E_UNDERFLOW -4 00286 #define E_NOTIMESTEP -100 00287 #define E_NOTINGRID -200 00289 00290 /*----------------------------------------------------------------------------*/ 00291 /* 00292 Numbering functions. 00293 Convert {-1,0,1}^ndim to a linear index and back. 00294 Note: {0,0,0} always gets last linear index (3^ndim - 1). 00295 00296 gen_3n1 : number of linear indices - 1 (IMPORTANT: returns n = 3^ndim - 1). 00297 gen_n2pnt : linear index to cartesian. 00298 gen_pnt2n : cartesian index to linear. 00299 00300 int ndim : number of dimensions. 00301 IPNT p : cartesian index, each p[i] is from {-1,0,1} set. 00302 int i : linear index from 0 to 3^ndim - 1 (including). 00303 int return : error code. 00304 */ 00305 int gen_3n1(int ndim, int *n); 00306 int gen_i2pnt(int ndim, int i, IPNT p); 00307 int gen_pnt2i(int ndim, const IPNT p, int *i); 00308 /*----------------------------------------------------------------------------*/ 00309 00310 void storeRank(int rk); 00311 int retrieveRank(); 00312 00313 void storeSize(int sz); 00314 int retrieveSize(); 00315 00316 void storeComm(MPI_Comm cm); 00317 MPI_Comm retrieveComm(); 00318 00319 void storeOutstream(FILE *stream); 00320 FILE* retrieveOutstream(); 00321 00322 /* 00323 * added 31.01.09 WWS 00324 */ 00325 void storeGlobalRank(int rk); 00326 int retrieveGlobalRank(); 00327 00328 void storeGlobalSize(int sz); 00329 int retrieveGlobalSize(); 00330 00331 void storeGlobalComm(MPI_Comm cm); 00332 MPI_Comm retrieveGlobalComm(); 00333 00334 void storeThreadSupp(int ts); 00335 int retrieveThreadSupp(); 00336 00337 /* 00338 * added 21.11.10 WWS 00339 */ 00340 void storeGroupID(int); 00341 int retrieveGroupID(); 00342 00343 void storeNumGroups(int); 00344 int retrieveNumGroups(); 00345 00346 /* 00347 * added 17.01.11 WWS 00348 */ 00349 void storeRemComm(MPI_Comm cm); 00350 MPI_Comm retrieveRemComm(); 00351 00352 /*----------------------------------------------------------------------------*/ 00353 /* 00354 Determine machine endiannes runtime 00355 */ 00356 #define SEAMX_BIG_ENDIAN 0 00357 #define SEAMX_LITTLE_ENDIAN 1 00358 00359 int getMachineEndianness(); 00360 00361 /* 00362 Swap bytes for each number in the array. 00363 Array has [arrsize] elements, each [atomsize] bytes long. 00364 */ 00365 void swapBytes(unsigned char *arr, int arrsize, int atomsize); 00366 00367 #endif