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