apply first part of patch #6994 - elbeem_warning_patch.diff
[blender.git] / intern / elbeem / intern / elbeem.h
1 /******************************************************************************
2  *
3  * El'Beem - Free Surface Fluid Simulation with the Lattice Boltzmann Method
4  * All code distributed as part of El'Beem is covered by the version 2 of the 
5  * GNU General Public License. See the file COPYING for details.
6  * Copyright 2003-2006 Nils Thuerey
7  *
8  * API header
9  */
10 #ifndef ELBEEM_API_H
11 #define ELBEEM_API_H
12
13
14 // simulation run callback function type (elbeemSimulationSettings->runsimCallback)
15 // best use with FLUIDSIM_CBxxx defines below.
16 // >parameters
17 // return values: 0=continue, 1=stop, 2=abort
18 // data pointer: user data pointer from elbeemSimulationSettings->runsimUserData
19 // status integer: 1=running simulation, 2=new frame saved
20 // frame integer: if status is 1, contains current frame number
21 typedef int (*elbeemRunSimulationCallback)(void *data, int status, int frame);
22 #define FLUIDSIM_CBRET_CONTINUE    0
23 #define FLUIDSIM_CBRET_STOP        1
24 #define FLUIDSIM_CBRET_ABORT       2 
25 #define FLUIDSIM_CBSTATUS_STEP     1 
26 #define FLUIDSIM_CBSTATUS_NEWFRAME 2 
27
28
29 // global settings for the simulation
30 typedef struct elbeemSimulationSettings {
31   /* version number */
32   short version;
33         /* id number of simulation domain, needed if more than a
34          * single domain should be simulated */
35         short domainId;
36
37         /* geometrical extent */
38         float geoStart[3], geoSize[3];
39
40   /* resolutions */
41   short resolutionxyz;
42   short previewresxyz;
43   /* size of the domain in real units (meters along largest resolution x,y,z extent) */
44   float realsize;
45
46   /* fluid properties */
47   double viscosity;
48   /* gravity strength */
49   float gravity[3];
50   /* anim start end time */
51   float animStart, aniFrameTime;
52         /* no. of frames to simulate & output */
53         short noOfFrames;
54   /* g star param (LBM compressibility) */
55   float gstar;
56   /* activate refinement? */
57   short maxRefine;
58   /* probability for surface particle generation (0.0=off) */
59   float generateParticles;
60   /* amount of tracer particles to generate (0=off) */
61   int numTracerParticles;
62
63   /* store output path, and file prefix for baked fluid surface */
64   char outputPath[160+80];
65
66         /* channel for frame time, visc & gravity animations */
67         int channelSizeFrameTime;
68         float *channelFrameTime;
69         int channelSizeViscosity;
70         float *channelViscosity;
71         int channelSizeGravity;
72         float *channelGravity;  // vector
73
74         /* boundary types and settings for domain walls */
75         short domainobsType;
76         float domainobsPartslip;
77         /* generate speed vectors for vertices (e.g. for image based motion blur)*/
78         short generateVertexVectors;
79         /* strength of surface smoothing */
80         float surfaceSmoothing;
81         /* no. of surface subdivisions */
82         int   surfaceSubdivs;
83
84         /* global transformation to apply to fluidsim mesh */
85         float surfaceTrafo[4*4];
86
87         /* development variables, testing for upcoming releases...*/
88         float farFieldSize;
89
90         /* callback function to notify calling program of performed simulation steps
91          * or newly available frame data, if NULL it is ignored */
92         elbeemRunSimulationCallback runsimCallback;
93         /* pointer passed to runsimCallback for user data storage */
94         void* runsimUserData;
95
96 } elbeemSimulationSettings;
97
98
99 // defines for elbeemMesh->type below
100 #define OB_FLUIDSIM_FLUID       4
101 #define OB_FLUIDSIM_OBSTACLE    8
102 #define OB_FLUIDSIM_INFLOW      16
103 #define OB_FLUIDSIM_OUTFLOW     32
104
105 // defines for elbeemMesh->obstacleType below
106 #define FLUIDSIM_OBSTACLE_NOSLIP     1
107 #define FLUIDSIM_OBSTACLE_PARTSLIP   2
108 #define FLUIDSIM_OBSTACLE_FREESLIP   3
109
110 #define OB_VOLUMEINIT_VOLUME 1
111 #define OB_VOLUMEINIT_SHELL  2
112 #define OB_VOLUMEINIT_BOTH   (OB_VOLUMEINIT_SHELL|OB_VOLUMEINIT_VOLUME)
113
114 // a single mesh object
115 typedef struct elbeemMesh {
116   /* obstacle,fluid or inflow... */
117   short type;
118         /* id of simulation domain it belongs to */
119         short parentDomainId;
120
121         /* vertices */
122   int numVertices;
123         float *vertices; // = float[n][3];
124         /* animated vertices */
125   int channelSizeVertices;
126         float *channelVertices; // = float[channelSizeVertices* (n*3+1) ];
127
128         /* triangles */
129         int   numTriangles;
130   int   *triangles; // = int[][3];
131
132         /* animation channels */
133         int channelSizeTranslation;
134         float *channelTranslation;
135         int channelSizeRotation;
136         float *channelRotation;
137         int channelSizeScale;
138         float *channelScale;
139         
140         /* active channel */
141         int channelSizeActive;
142         float *channelActive;
143         /* initial velocity channel (e.g. for inflow) */
144         int channelSizeInitialVel;
145         float *channelInitialVel; // vector
146         /* use initial velocity in object coordinates? (e.g. for rotation) */
147         short localInivelCoords;
148         /* boundary types and settings */
149         short obstacleType;
150         float obstaclePartslip;
151         /* amount of force transfer from fluid to obj, 0=off, 1=normal */
152         float obstacleImpactFactor;
153         /* init volume, shell or both? use OB_VOLUMEINIT_xxx defines above */
154         short volumeInitType;
155
156         /* name of the mesh, mostly for debugging */
157         const char *name;
158 } elbeemMesh;
159
160 // API functions
161
162 #ifdef __cplusplus
163 extern "C"  {
164 #endif // __cplusplus
165  
166
167 // reset elbeemSimulationSettings struct with defaults
168 void elbeemResetSettings(struct elbeemSimulationSettings*);
169  
170 // start fluidsim init (returns !=0 upon failure)
171 int elbeemInit(void);
172
173 // start fluidsim init (returns !=0 upon failure)
174 int elbeemAddDomain(struct elbeemSimulationSettings*);
175
176 // get failure message during simulation or init
177 // if an error occured (the string is copied into buffer,
178 // max. length = 256 chars )
179 void elbeemGetErrorString(char *buffer);
180
181 // reset elbeemMesh struct with zeroes
182 void elbeemResetMesh(struct elbeemMesh*);
183
184 // add mesh as fluidsim object
185 int elbeemAddMesh(struct elbeemMesh*);
186
187 // do the actual simulation
188 int elbeemSimulate(void);
189
190 // continue a previously stopped simulation
191 int elbeemContinueSimulation(void);
192
193
194 // helper functions 
195
196 // simplify animation channels
197 // returns if the channel and its size changed
198 int elbeemSimplifyChannelFloat(float *channel, int *size);
199 int elbeemSimplifyChannelVec3(float *channel, int *size);
200
201 // helper functions implemented in utilities.cpp
202
203 /* set elbeem debug output level (0=off to 10=full on) */
204 void elbeemSetDebugLevel(int level);
205 /* elbeem debug output function, prints if debug level >0 */
206 void elbeemDebugOut(char *msg);
207
208 /* estimate how much memory a given setup will require */
209 double elbeemEstimateMemreq(int res,
210     float sx, float sy, float sz,
211     int refine, char *retstr);
212
213
214
215 #ifdef __cplusplus
216 }
217 #endif // __cplusplus
218
219
220
221 /******************************************************************************/
222 // internal defines, do not use for initializing elbeemMesh
223 // structs, for these use OB_xxx defines above
224
225 /*! fluid geometry init types */
226 #define FGI_FLAGSTART   16
227 #define FGI_FLUID                         (1<<(FGI_FLAGSTART+ 0))
228 #define FGI_NO_FLUID      (1<<(FGI_FLAGSTART+ 1))
229 #define FGI_BNDNO                         (1<<(FGI_FLAGSTART+ 2))
230 #define FGI_BNDFREE               (1<<(FGI_FLAGSTART+ 3))
231 #define FGI_BNDPART               (1<<(FGI_FLAGSTART+ 4))
232 #define FGI_NO_BND                (1<<(FGI_FLAGSTART+ 5))
233 #define FGI_MBNDINFLOW  (1<<(FGI_FLAGSTART+ 6))
234 #define FGI_MBNDOUTFLOW (1<<(FGI_FLAGSTART+ 7))
235
236 // all boundary types at once
237 #define FGI_ALLBOUNDS ( FGI_BNDNO | FGI_BNDFREE | FGI_BNDPART | FGI_MBNDINFLOW | FGI_MBNDOUTFLOW )
238
239
240 #endif // ELBEEM_API_H