apply first part of patch #6994 - elbeem_warning_patch.diff
[blender.git] / intern / elbeem / intern / utilities.h
1 /******************************************************************************
2  *
3  * El'Beem - Free Surface Fluid Simulation with the Lattice Boltzmann Method
4  * Copyright 2003-2006 Nils Thuerey
5  *
6  * Global C style utility funcions
7  *
8  *****************************************************************************/
9 #ifndef UTILITIES_H
10 #include "ntl_vector3dim.h"
11
12 // Solaris requires ieeefp.h for finite(3C)
13 #if !defined(linux) && defined(sun)
14 #include <ieeefp.h>
15 #endif
16
17
18 /* debugging outputs , debug level 0 (off) to 10 (max) */
19 #ifdef ELBEEM_PLUGIN
20 #define DEBUG 0
21 #else // ELBEEM_PLUGIN
22 #define DEBUG 10
23 #endif // ELBEEM_PLUGIN
24 extern "C" int gDebugLevel;
25
26
27 // time measurements
28 typedef unsigned long myTime_t;
29
30
31 // state of the simulation world
32 // default
33 #define SIMWORLD_INVALID       0
34 // performing init
35 #define SIMWORLD_INITIALIZING  1
36 // after init, before starting simulation
37 #define SIMWORLD_INITED        2
38 // stop of the simulation run, can be continued later
39 #define SIMWORLD_STOP          3
40 // error during init
41 #define SIMWORLD_INITERROR    -1
42 // error during simulation
43 #define SIMWORLD_PANIC        -2
44 // general error 
45 #define SIMWORLD_GENERICERROR -3
46
47 // access global state of elbeem simulator
48 void setElbeemState(int set);
49 int  getElbeemState(void);
50 int  isSimworldOk(void);
51
52 // access elbeem simulator error string
53 void setElbeemErrorString(const char* set);
54 char* getElbeemErrorString(void);
55
56
57 /* debug output function */
58 #define DM_MSG        1
59 #define DM_NOTIFY     2
60 #define DM_IMPORTANT  3
61 #define DM_WARNING    4
62 #define DM_ERROR      5
63 #define DM_DIRECT     6
64 #define DM_FATAL      7
65 void messageOutputFunc(string from, int id, string msg, myTime_t interval);
66
67 /* debugging messages defines */
68 #ifdef DEBUG 
69 #if LBM_PRECISION==2
70 #define MSGSTREAM std::ostringstream msg; msg.precision(15); msg.width(17);
71 #else
72 #define MSGSTREAM std::ostringstream msg; msg.precision(7); msg.width(9);
73 #endif
74
75 #       define debMsgDirect(mStr)                         if(gDebugLevel>0)      { std::ostringstream msg; msg << mStr; messageOutputFunc(string(""), DM_DIRECT, msg.str(), 0); }
76 #       define debMsgStd(from,id,mStr,level)              if(gDebugLevel>=level) { MSGSTREAM; msg << mStr <<"\n"; messageOutputFunc(from, id, msg.str(), 0); }
77 #       define debMsgNnl(from,id,mStr,level)              if(gDebugLevel>=level) { MSGSTREAM; msg << mStr       ; messageOutputFunc(from, id, msg.str(), 0); }
78 #       define debMsgInter(from,id,mStr,level, interval)  if(gDebugLevel>=level) { MSGSTREAM; msg << mStr <<"\n"; messageOutputFunc(from, id, msg.str(), interval); }
79 #       define debugOut(mStr,level)                       if(gDebugLevel>=level) { debMsgStd("D",DM_MSG,mStr,level); }
80 #       define debugOutNnl(mStr,level)                    if(gDebugLevel>=level) { debMsgNnl("D",DM_MSG,mStr,level); }
81 #       define debugOutInter(mStr,level, interval)        debMsgInter("D",DM_MSG ,mStr,level, interval); 
82 /* Error output function */
83 #define errMsg(from,mStr)                           if(gDebugLevel>0){ MSGSTREAM; msg << mStr <<"\n"; messageOutputFunc(from, DM_ERROR,   msg.str(), 0); }
84 #define warnMsg(from,mStr)                          if(gDebugLevel>0){ MSGSTREAM; msg << mStr <<"\n"; messageOutputFunc(from, DM_WARNING, msg.str(), 0); }
85
86 #else
87 // no messages at all...
88 #       define debMsgDirect(mStr)
89 #       define debMsgStd(from,id,mStr,level)
90 #       define debMsgNnl(from,id,mStr,level)
91 #       define debMsgInter(from,id,mStr,level, interval)
92 #       define debugOut(mStr,level)  
93 #       define debugOutNnl(mStr,level)  
94 #       define debugOutInter(mStr,level, interval) 
95 #       define errMsg(from,mStr)
96 #       define warnMsg(from,mStr)
97 #endif
98
99 #define errorOut(mStr) { errMsg("D",mStr); }
100
101 // fatal errors - have to be handled 
102 #define errFatal(from,mStr,errCode) { \
103         setElbeemState(errCode); \
104         MSGSTREAM; msg << mStr; \
105         messageOutputFunc(from, DM_FATAL, msg.str(), 0); \
106 }
107
108
109 //! helper function that converts a string to integer
110 int convertString2Int(const char *str, int alt);
111
112 //! helper function that converts a flag field to a readable integer
113 string convertFlags2String(int flags);
114
115 //! get the current system time
116 myTime_t getTime();
117 //! convert time to readable string
118 string getTimeString(myTime_t usecs);
119
120 //! helper to check if a bounding box was specified in the right way
121 bool checkBoundingBox(ntlVec3Gfx s, ntlVec3Gfx e, string checker);
122
123 //! reset color output for elbeem init
124 void resetGlobalColorSetting();
125
126
127 /*! print some vector from 3 values e.g. for ux,uy,uz */
128 #define PRINT_VEC(x,y,z) " ["<<(x)<<","<<(y)<<","<<(z)<<"] "
129
130 /*! print some vector from 3 values e.g. for ux,uy,uz */
131 #define PRINT_VEC2D(x,y) " ["<<(x)<<","<<(y)<<"] "
132
133 /*! print l'th neighbor of i,j,k as a vector, as we need ijk all the time */
134 #define PRINT_IJK_NBL PRINT_VEC(i+D::dfVecX[l],j+D::dfVecY[l],k+D::dfVecZ[l])
135
136 /*! print i,j,k as a vector, as we need ijk all the time */
137 #define PRINT_IJK PRINT_VEC(i,j,k)
138
139 /*! print i,j,k as a vector, as we need ijk all the time */
140 #define PRINT_IJ PRINT_VEC2D(i,j)
141
142 /*! print some vector from 3 values e.g. for ux,uy,uz */
143 #define PRINT_NTLVEC(v) " ["<<(v)[0]<<","<<(v)[1]<<","<<(v)[2]<<"] "
144
145 /*! print some vector from 3 values e.g. for ux,uy,uz */
146 #define PRINT_NTLVEC2D(v) " ["<<(v)[0]<<","<<(v)[1]<<"] "
147
148 /*! print a triangle */
149 #define PRINT_TRIANGLE(t,mpV)  " { "<<PRINT_VEC( (mpV[(t).getPoints()[0]][0]),(mpV[(t).getPoints()[0]][1]),(mpV[(t).getPoints()[0]][2]) )<<\
150         PRINT_VEC( (mpV[(t).getPoints()[1]][0]),(mpV[(t).getPoints()[1]][1]),(mpV[(t).getPoints()[1]][2]) )<<" | "<<\
151         PRINT_VEC( (mpV[(t).getPoints()[2]][0]),(mpV[(t).getPoints()[2]][1]),(mpV[(t).getPoints()[2]][2]) )<<" } "
152
153
154 // write png image
155 int writePng(const char *fileName, unsigned char **rowsp, int w, int h);
156
157 /* some useful templated functions 
158  * may require some operators for the classes
159  */
160
161 /* minimum */
162 template < class T >
163 inline T
164 MIN( T a, T b )
165 { return (a < b) ? a : b ; }
166
167 /* maximum */
168 template < class T >
169 inline T
170 MAX( T a, T b )
171 { return (a < b) ? b : a ; }
172
173 /* absolute value */
174 template < class T >
175 inline T
176 ABS( T a )
177 { return (0 < a) ? a : -a ; }
178
179 /* sign of the value */
180 template < class T >
181 inline T
182 SIGNUM( T a )
183 { return (0 < a) ? 1 : -1 ; }
184
185 /* sign, returns -1,0,1 depending on sign/value=0 */
186 template < class T >
187 inline T
188 SIGNUM0( T a )
189 { return (0 < a) ? 1 : ( a < 0 ? -1 : 0 ) ; }
190
191 /* round to nearest integer */
192 inline int
193 ROUND(double d)
194 { return int(d + 0.5); }
195
196 /* square function */
197 template < class T >
198 inline T
199 SQUARE( T a )
200 { return a*a; }
201
202
203 #define UTILITIES_H
204 #endif