initial commit of the fluid simulator.
[blender.git] / intern / elbeem / intern / utilities.h
1 /******************************************************************************
2  *
3  * El'Beem - Free Surface Fluid Simulation with the Lattice Boltzmann Method
4  * Copyright 2003,2004 Nils Thuerey
5  *
6  * Global C style utility funcions
7  *
8  *****************************************************************************/
9 #ifndef UTILITIES_H
10 #include "ntl_vector3dim.h"
11
12 typedef unsigned long myTime_t;
13
14 //! helper function that converts a string to integer
15 int convertString2Int(const char *string, int alt);
16
17 //! helper function that converts a flag field to a readable integer
18 std::string convertFlags2String(int flags);
19
20 //! write png image
21 #ifndef NOPNG
22 //int writePng(const char *fileName, unsigned char **rows, int w, int h, int colortype, int bitdepth);
23 int writePng(const char *fileName, unsigned char **rows, int w, int h);
24 //! write opengl buffer to png
25 void writeOpenglToPng(const char *fileName);
26 #endif// NOPNG
27
28 // output streams
29 #ifdef ELBEEM_BLENDER
30 extern "C" FILE* GEN_errorstream;
31 extern "C" FILE* GEN_userstream;
32 #endif // ELBEEM_BLENDER
33
34 //! get the current system time
35 myTime_t getTime();
36 //! convert time to readable string
37 std::string getTimeString(myTime_t usecs);
38
39 //! helper to check if a bounding box was specified in the right way
40 bool checkBoundingBox(ntlVec3Gfx s, ntlVec3Gfx e, std::string checker);
41
42 // optionally include OpenGL utility functions
43 #ifdef USE_GLUTILITIES
44
45 void drawCubeWire(ntlVec3Gfx s, ntlVec3Gfx e);
46 void drawCubeSolid(ntlVec3Gfx s, ntlVec3Gfx e);
47
48 #endif // USE_GLUTILITIES
49
50
51 /* debugging outputs */
52 //#define DEBUG 10
53
54 /* debug output function */
55 #define DM_MSG        1
56 #define DM_NOTIFY     2
57 #define DM_IMPORTANT  3
58 #define DM_WARNING    4
59 #define DM_ERROR      5
60 #define DM_DIRECT     6
61 void messageOutputFunc(std::string from, int id, std::string msg, myTime_t interval);
62
63 /* debugging messages defines */
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 #ifdef DEBUG 
70 #       define debMsgDirect(mStr)                        { std::ostringstream msg; msg << mStr; messageOutputFunc(string(""), DM_DIRECT, msg.str(), 0); }
71 #       define debMsgStd(from,id,mStr,level)             if(DEBUG>=level){ MSGSTREAM; msg << mStr <<"\n"; messageOutputFunc(from, id, msg.str(), 0); }
72 #       define debMsgNnl(from,id,mStr,level)             if(DEBUG>=level){ MSGSTREAM; msg << mStr       ; messageOutputFunc(from, id, msg.str(), 0); }
73 #       define debMsgInter(from,id,mStr,level, interval) if(DEBUG>=level){ MSGSTREAM; msg << mStr <<"\n"; messageOutputFunc(from, id, msg.str(), interval); }
74 #       define debugOut(mStr,level)    if(DEBUG>=level){ debMsgStd("D",DM_MSG,mStr,level); }
75 #       define debugOutNnl(mStr,level) if(DEBUG>=level){ debMsgNnl("D",DM_MSG,mStr,level); }
76 #       define debugOutInter(mStr,level, interval) debMsgInter("D",DM_MSG,mStr,level, interval); 
77
78 #else
79
80 #       define debMsgDirect(mStr)
81 #       define debMsgStd(from,id,mStr,level)
82 #       define debMsgNnl(from,id,mStr,level)
83 #       define debMsgInter(from,id,mStr,level, interval)
84 #       define debugOut(mStr,level)  
85 #       define debugOutNnl(mStr,level)  
86 #       define debugOutInter(mStr,level, interval) 
87 #endif
88
89 /* Error output function */
90 #define errMsg(from,mStr) { MSGSTREAM; msg << mStr <<"\n"; messageOutputFunc(from, DM_ERROR,   msg.str(), 0); }
91 #define warnMsg(from,mStr){ MSGSTREAM; msg << mStr <<"\n"; messageOutputFunc(from, DM_WARNING, msg.str(), 0); }
92 #define errorOut(mStr) { errMsg("D",mStr); }
93 // old...  #define ...(mStr) { std::cout << mStr << "\n"; fflush(stdout); }
94
95 /*! print some vector from 3 values e.g. for ux,uy,uz */
96 #define PRINT_VEC(x,y,z) " ["<<(x)<<","<<(y)<<","<<(z)<<"] "
97
98 /*! print some vector from 3 values e.g. for ux,uy,uz */
99 #define PRINT_VEC2D(x,y) " ["<<(x)<<","<<(y)<<"] "
100
101 /*! print l'th neighbor of i,j,k as a vector, as we need ijk all the time */
102 #define PRINT_IJK_NBL PRINT_VEC(i+D::dfVecX[l],j+D::dfVecY[l],k+D::dfVecZ[l])
103
104 /*! print i,j,k as a vector, as we need ijk all the time */
105 #define PRINT_IJK PRINT_VEC(i,j,k)
106
107 /*! print i,j,k as a vector, as we need ijk all the time */
108 #define PRINT_IJ PRINT_VEC2D(i,j)
109
110 /*! print some vector from 3 values e.g. for ux,uy,uz */
111 #define PRINT_NTLVEC(v) " ["<<(v)[0]<<","<<(v)[1]<<","<<(v)[2]<<"] "
112
113 /*! print some vector from 3 values e.g. for ux,uy,uz */
114 #define PRINT_NTLVEC2D(v) " ["<<(v)[0]<<","<<(v)[1]<<"] "
115
116 /*! print a triangle */
117 #define PRINT_TRIANGLE(t,mpV)  " { "<<PRINT_VEC( (mpV[(t).getPoints()[0]][0]),(mpV[(t).getPoints()[0]][1]),(mpV[(t).getPoints()[0]][2]) )<<\
118         PRINT_VEC( (mpV[(t).getPoints()[1]][0]),(mpV[(t).getPoints()[1]][1]),(mpV[(t).getPoints()[1]][2]) )<<" | "<<\
119         PRINT_VEC( (mpV[(t).getPoints()[2]][0]),(mpV[(t).getPoints()[2]][1]),(mpV[(t).getPoints()[2]][2]) )<<" } "
120
121
122
123 /* some useful templated functions 
124  * may require some operators for the classes
125  */
126
127 /* minimum */
128 template < class T >
129 inline T
130 MIN( T a, T b )
131 { return (a < b) ? a : b ; }
132
133 /* maximum */
134 template < class T >
135 inline T
136 MAX( T a, T b )
137 { return (a < b) ? b : a ; }
138
139 /* absolute value */
140 template < class T >
141 inline T
142 ABS( T a )
143 { return (0 < a) ? a : -a ; }
144
145 /* sign of the value */
146 template < class T >
147 inline T
148 SIGNUM( T a )
149 { return (0 < a) ? 1 : -1 ; }
150
151 /* sign, returns -1,0,1 depending on sign/value=0 */
152 template < class T >
153 inline T
154 SIGNUM0( T a )
155 { return (0 < a) ? 1 : ( a < 0 ? -1 : 0 ) ; }
156
157 /* round to nearest integer */
158 inline int
159 ROUND(double d)
160 { return int(d + 0.5); }
161
162 /* square function */
163 template < class T >
164 inline T
165 SQUARE( T a )
166 { return a*a; }
167
168
169 #define UTILITIES_H
170 #endif