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