1 |
|
2 |
/* $Id$ */ |
3 |
|
4 |
/******************************************************* |
5 |
* |
6 |
* Copyright 2003-2007 by ACceSS MNRF |
7 |
* Copyright 2007 by University of Queensland |
8 |
* |
9 |
* http://esscc.uq.edu.au |
10 |
* Primary Business: Queensland, Australia |
11 |
* Licensed under the Open Software License version 3.0 |
12 |
* http://www.opensource.org/licenses/osl-3.0.php |
13 |
* |
14 |
*******************************************************/ |
15 |
|
16 |
#ifndef INC_PASO_COMMON |
17 |
#define INC_PASO_COMMON |
18 |
|
19 |
/**************************************************************/ |
20 |
|
21 |
/* Finley finite element solver: common include file */ |
22 |
|
23 |
/**************************************************************/ |
24 |
|
25 |
/* Copyrights by ACcESS Australia, 2003 */ |
26 |
/* Version: $Id$ */ |
27 |
|
28 |
/**************************************************************/ |
29 |
|
30 |
/* some system values */ |
31 |
/* FIXME: This is not satisfactory. */ |
32 |
/* _ECC, __INTEL_COMPILER, and other */ |
33 |
/* intel compiler pre-defines need to be handled */ |
34 |
/* (__ICL, __ICC come to mind) */ |
35 |
#if ( defined __INTEL_COMPILER ) |
36 |
#include <mathimf.h> |
37 |
#else |
38 |
#include <math.h> |
39 |
#endif |
40 |
|
41 |
|
42 |
#include <float.h> |
43 |
#include <stdio.h> |
44 |
#include <limits.h> |
45 |
#include <stdlib.h> |
46 |
#include <string.h> |
47 |
|
48 |
#define LenString_MAX FILENAME_MAX*2 |
49 |
#define LenErrorMsg_MAX LenString_MAX |
50 |
|
51 |
/* on some arcitectures it could be a good idea to use long rather than int */ |
52 |
/* this has not really been tested */ |
53 |
|
54 |
typedef int dim_t; |
55 |
typedef int index_t; |
56 |
typedef int bool_t; |
57 |
typedef int type_t; |
58 |
typedef int err_t; |
59 |
|
60 |
#define INDEX_T_MAX INT_MAX |
61 |
#define EPSILON DBL_EPSILON |
62 |
#define LARGE_POSITIVE_FLOAT DBL_MAX |
63 |
|
64 |
/**************************************************************/ |
65 |
|
66 |
/* some useful functions: */ |
67 |
|
68 |
#define FALSE 0 |
69 |
#define TRUE 1 |
70 |
#define UNKNOWN -1 |
71 |
#define DBLE(_x_) (double)(_x_) |
72 |
#define INDEX1(_X1_) (_X1_) |
73 |
#define INDEX2(_X1_,_X2_,_N1_) ((_X1_)+(_N1_)*(_X2_)) |
74 |
#define INDEX3(_X1_,_X2_,_X3_,_N1_,_N2_) ((_X1_)+(_N1_)*INDEX2(_X2_,_X3_,_N2_)) |
75 |
#define INDEX4(_X1_,_X2_,_X3_,_X4_,_N1_,_N2_,_N3_) ((_X1_)+(_N1_)*INDEX3(_X2_,_X3_,_X4_,_N2_,_N3_)) |
76 |
#define INDEX5(_X1_,_X2_,_X3_,_X4_,_X5_,_N1_,_N2_,_N3_,_N4_) ((_X1_)+(_N1_)*INDEX4(_X2_,_X3_,_X4_,_X5_,_N2_,_N3_,_N4_)) |
77 |
#define INDEX6(_X1_,_X2_,_X3_,_X4_,_X5_,_X6_,_N1_,_N2_,_N3_,_N4_,_N5_) ((_X1_)+(_N1_)*INDEX5(_X2_,_X3_,_X4_,_X5_,_X6_,_N2_,_N3_,_N4_,_N5_)) |
78 |
|
79 |
#define MAX(_arg1_,_arg2_) ((_arg1_)>(_arg2_) ? (_arg1_) : (_arg2_)) |
80 |
#define MAX3(_arg1_,_arg2_,_arg3_) MAX(_arg1_,MAX(_arg2_,_arg3_)) |
81 |
#define MIN(_arg1_,_arg2_) ((_arg1_)>(_arg2_) ? (_arg2_) : (_arg1_)) |
82 |
#define MIN3(_arg1_,_arg2_,_arg3_) MIN(_arg1_,MIN(_arg2_,_arg3_)) |
83 |
#define ABS(_arg_) MAX((_arg_),-(_arg_)) |
84 |
#define SIGN(_arg_) ((_arg_)>0 ? 1 : ((_arg_)<0 ? -1 : 0 )) |
85 |
#define SWAP(_a0_,_a1_,_type_) { \ |
86 |
_type_ s; \ |
87 |
s=(_a0_); \ |
88 |
_a0_= (_a1_); \ |
89 |
_a1_=s; \ |
90 |
} |
91 |
/**************************************************************/ |
92 |
/* memory allocation: */ |
93 |
/* Wise to not use PASO_MALLOC/FREE/REALLOC and */ |
94 |
/* PASO_THREAD... directly. These are only for tailoring */ |
95 |
/* the main macros that follow */ |
96 |
/**************************************************************/ |
97 |
|
98 |
#if defined(_WIN32) /* Use python for memory management on windows. */ |
99 |
|
100 |
#include <python.h> |
101 |
|
102 |
#define PASO_MALLOC PyMem_Malloc |
103 |
#define PASO_FREE PyMem_Free |
104 |
#define PASO_REALLOC PyMem_Realloc |
105 |
|
106 |
#else |
107 |
|
108 |
#include <malloc.h> |
109 |
|
110 |
#define PASO_MALLOC malloc |
111 |
#define PASO_FREE free |
112 |
#define PASO_REALLOC realloc |
113 |
|
114 |
#endif |
115 |
|
116 |
|
117 |
/* FIXME: This is not satisfactory. */ |
118 |
/* _ECC, __INTEL_COMPILER, and other */ |
119 |
/* intel compiler pre-defines need to be handled */ |
120 |
/* (__ICL, __ICC come to mind) */ |
121 |
/* Also, _WIN32 may take this branch one day... */ |
122 |
/* SO KEEP ALL THREAD_MEMALLOC/FREEs CONFINED TO THE PASO LIBRARY. */ |
123 |
|
124 |
#if defined(__ECC) && defined(_OPENMP) /* ECC version of intel compiler with openmp. */ |
125 |
#include <omp.h> |
126 |
#define PASO_THREAD_MALLOC kmp_malloc |
127 |
#define PASO_THREAD_FREE kmp_free |
128 |
#else |
129 |
#define PASO_THREAD_MALLOC PASO_MALLOC |
130 |
#define PASO_THREAD_FREE PASO_FREE |
131 |
#endif |
132 |
|
133 |
/******************The main macros ************************************/ |
134 |
|
135 |
#define MEMALLOC(_LENGTH_,_TYPE_) \ |
136 |
(_TYPE_*) PASO_MALLOC(((size_t)(_LENGTH_))*sizeof(_TYPE_)) |
137 |
|
138 |
/* do {} while(0) - an old trick for bracketing a macro that */ |
139 |
/* makes sure a semi-colon does no harm. */ |
140 |
|
141 |
#define MEMFREE(_PTR_) \ |
142 |
do \ |
143 |
{ \ |
144 |
if ((void *)(_PTR_) != NULL ) { PASO_FREE(_PTR_); (_PTR_) = NULL; } \ |
145 |
} while(0) |
146 |
|
147 |
#define MEMREALLOC(_POINTER_,_LENGTH_,_TYPE_) \ |
148 |
do \ |
149 |
{ \ |
150 |
if( (_POINTER_)!=NULL ) \ |
151 |
{ \ |
152 |
_POINTER_ = (_TYPE_*)PASO_REALLOC((void*)(_POINTER_), \ |
153 |
((size_t)(_LENGTH_))*sizeof(_TYPE_) ); \ |
154 |
} \ |
155 |
else \ |
156 |
{ \ |
157 |
_POINTER_ = (_TYPE_*)PASO_MALLOC( ((size_t)(_LENGTH_))*sizeof(_TYPE_) ); \ |
158 |
} \ |
159 |
} while(0) |
160 |
|
161 |
#define TMPMEMALLOC MEMALLOC |
162 |
#define TMPMEMFREE MEMFREE |
163 |
|
164 |
#define THREAD_MEMALLOC(_LENGTH_,_TYPE_) \ |
165 |
(_TYPE_*) PASO_THREAD_MALLOC/**/(((size_t)(_LENGTH_))*sizeof(_TYPE_)) |
166 |
|
167 |
#define THREAD_MEMFREE(_PTR_) \ |
168 |
do \ |
169 |
{ \ |
170 |
if ((void *)(_PTR_) != NULL ) { PASO_THREAD_FREE(_PTR_); (_PTR_) = NULL; } \ |
171 |
} while(0) |
172 |
|
173 |
|
174 |
/* |
175 |
This was useful for seeing what memory is being allocated if you get an "Out of memory" error |
176 |
if used again, bracket with do {} while(0) |
177 |
#define TMPMEMALLOC(_LENGTH_,_TYPE_) (printf("TMPMEMALLOC at %s %d #bytes=%d*%d=%d\n", __FILE__, __LINE__, _LENGTH_, sizeof(_TYPE_), ((size_t)(_LENGTH_) * sizeof(_TYPE_))) , (_TYPE_*) malloc(((size_t)(_LENGTH_))*sizeof(_TYPE_))) |
178 |
|
179 |
This was useful for seeing where memory is being freed if you get an "glibc detected...free" error |
180 |
if used again, bracket with do {} while(0) |
181 |
#define TMPMEMFREE(_PTR_) if ((void *)(_PTR_) != NULL ) { printf("TMPMEMFREE AAA %s %d\n", __FILE__, __LINE__); free(_PTR_); (_PTR_) = NULL; printf("TMPMEMFREE BBB %s %d\n", __FILE__, __LINE__); } |
182 |
*/ |
183 |
|
184 |
#endif /* #ifndef INC_PASO_COMMON */ |