HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
GAS_ProjectNonDivergentAdaptive.h
Go to the documentation of this file.
1 #ifndef _GAS_ProjectNonDivergentAdaptive_
2 #define _GAS_ProjectNonDivergentAdaptive_
3 
4 #include "GAS_SubSolver.h"
5 #include "GAS_Utils.h"
6 
8 
9 #include <UT/UT_Array.h>
11 #include <UT/UT_SparseMatrix.h>
12 
13 class SIM_RawField;
14 class SIM_ScalarField;
15 class SIM_VectorField;
16 
18 {
22 
25 
26 public:
27 
28  static constexpr int FLUID_CELL = 0;
29  static constexpr int UNASSIGNED_CELL = -1;
30 
31  static constexpr int INVALID_FACE = 0;
32  static constexpr int VALID_FACE = 1;
33 
35  GET_DATA_FUNC_I("maxiterations", MaxIterations);
36 
37  GET_DATA_FUNC_I("octreelevels", OctreeLevels);
38  GET_DATA_FUNC_I("finebandwidth", FineBandwidth);
39 
40  GET_DATA_FUNC_B("generateoctree", GenerateOctree);
41  GET_DATA_FUNC_B("onlygenerateoctree", OnlyGenerateOctree);
42  GET_DATA_FUNC_I("smootheriterations", SmootherIterations);
43  GET_DATA_FUNC_B("usegaussseidelsmoother", UseGaussSeidelSmoother);
44 
45  GET_DATA_FUNC_F("extrapolation", Extrapolation);
46 
47  GET_DATA_FUNC_B("useoldpressure", UseOldPressure);
48 
49  GET_DATA_FUNC_F("waterline", Waterline);
50  GET_DATA_FUNC_B("usewaterline", UseWaterline);
51  GET_DATA_FUNC_V3("waterlinedirection", WaterlineDirection);
52 
55 
56 protected:
57  explicit GAS_ProjectNonDivergentAdaptive(const SIM_DataFactory *factory);
59 
60  // Used to determine if the field is complicated enough to justify
61  // the overhead of multithreading.
62  bool shouldMultiThread(const SIM_RawField *field) const
63  {
64  return field->field()->numTiles() > 1;
65  }
66 
67  // The overloaded callback that GAS_SubSolver will invoke to
68  // perform our actual computation. We are giving a single object
69  // at a time to work on.
70  virtual bool solveGasSubclass(SIM_Engine &engine, SIM_Object *obj,
71  SIM_Time time, SIM_Time timestep);
72 
73 private:
74  // We define this to be a DOP_Auto node which means we do not
75  // need to implement a DOP_Node derivative for this data. Instead,
76  // this description is used to define the interface.
77  static const SIM_DopDescription *getDopDescription();
78  /// These macros are necessary to bind our node to the factory and
79  /// ensure useful constants like BaseClass are defined.
82  "GAS Project Non Divergent Adaptive", getDopDescription());
83 
85  boundary_weights.shouldMultiThread(),
86  enforceVolumeLimitBoundaries,
87  SIM_RawField &, boundary_weights,
88  SIM_RawField &, valid_faces,
89  const SIM_RawField &, velocity,
90  const SIM_RawField &, cutcell_weights,
91  const SIM_BoundaryLine &, index_boundary_line,
92  const int, axis)
93 
94  void enforceVolumeLimitBoundariesPartial(SIM_RawField &boundary_weights,
95  SIM_RawField &valid_faces,
96  const SIM_RawField &velocity,
97  const SIM_RawField &cutcell_weights,
98  const SIM_BoundaryLine &index_boundary_line,
99  const int axis,
100  const UT_JobInfo &info) const;
101 
103  surface.shouldMultiThread(),
104  classifyRegularLiquidCells,
105  SIM_RawIndexField &, regular_liquid_cell_labels,
106  const SIM_RawField &, surface,
107  const SIM_RawField &, collision,
108  const SIM_RawField **, cutcell_weights,
109  const SIM_RawField *, boundary_weights,
110  const fpreal, extrapolation)
111 
112  void classifyRegularLiquidCellsPartial(SIM_RawIndexField &regular_liquid_cell_labels,
113  const SIM_RawField &surface,
114  const SIM_RawField &collision,
115  const SIM_RawField **cutcell_weights,
116  const SIM_RawField *boundary_weights,
117  const fpreal extrapolation,
118  const UT_JobInfo &info) const;
119 
120  //
121  // Helper functions for building octree labels
122  //
123 
125  regular_liquid_cell_labels.shouldMultiThread(),
126  setFineCellMaskInterior,
127  UT_Array<UT_Array<UT_Vector3I>> &, parallel_boundary_cell_list,
128  UT_VoxelArrayF &, fine_cell_mask,
129  const SIM_RawIndexField &, regular_liquid_cell_labels,
130  const SIM_RawField **, cutcell_weights)
131 
132  void setFineCellMaskInteriorPartial(UT_Array<UT_Array<UT_Vector3I>> &parallel_boundary_cell_list,
133  UT_VoxelArrayF &fine_cell_mask,
134  const SIM_RawIndexField &regular_liquid_cell_labels,
135  const SIM_RawField **cutcell_weights,
136  const UT_JobInfo &info) const;
137 
138  void findOccupiedFineTiles(UT_Array<bool> &is_tile_occupied_list,
139  const UT_Array<UT_Vector3I> &fine_cell_list,
140  const UT_VoxelArrayF &fine_cell_mask) const;
141 
142  void uncompressFineTiles(UT_VoxelArrayF &fine_cell_mask,
143  const UT_Array<bool> &is_tile_occupied_list) const;
144 
145  void setFineCells(UT_VoxelArrayF &fine_cell_mask,
146  const UT_Array<UT_Vector3I> &fine_cell_list) const;
147 
148  void setCustomFineCells(UT_VoxelArrayF &fine_cell_mask,
149  const SIM_RawField &custom_fine_cells) const;
150 
152  old_cell_list.size() > 1000,
153  loadNextOutsideFineCellLayer,
154  UT_Array<UT_Array<UT_Vector3I>> &, parallel_next_cell_list,
155  const UT_Array<UT_Vector3I> &, old_cell_list,
156  const UT_VoxelArrayF &, fine_cell_mask,
157  const SIM_RawIndexField &, regular_liquid_cell_labels)
158 
159  void loadNextOutsideFineCellLayerPartial(UT_Array<UT_Array<UT_Vector3I>> &parallel_next_cell_list,
160  const UT_Array<UT_Vector3I> &old_cell_list,
161  const UT_VoxelArrayF &fine_cell_mask,
162  const SIM_RawIndexField &regular_liquid_cell_labels,
163  const UT_JobInfo &info) const;
164 
166  old_cell_list.size() > 1000,
167  loadNextInsideFineCellLayer,
168  UT_Array<UT_Array<UT_Vector3I>> &, parallel_next_cell_list,
169  const UT_Array<UT_Vector3I> &, old_cell_list,
170  const UT_VoxelArrayF &, fine_cell_mask,
171  const SIM_RawIndexField &, regular_liquid_cell_labels)
172 
173  void loadNextInsideFineCellLayerPartial(UT_Array<UT_Array<UT_Vector3I>> &parallel_next_cell_list,
174  const UT_Array<UT_Vector3I> &old_cell_list,
175  const UT_VoxelArrayF &fine_cell_mask,
176  const SIM_RawIndexField &regular_liquid_cell_labels,
177  const UT_JobInfo &info) const;
178 
179  void buildOctreeCellLabels(UT_FaceGradedOctreeLabels &octree_labels,
180  const SIM_RawIndexField &regular_liquid_cell_labels,
181  const SIM_RawField *custom_fine_cells,
182  const SIM_RawField **cutcell_weights,
183  const int levels,
184  const int inside_fine_width,
185  const int outside_fine_width) const;
186 
187  //
188  // Build octree cell indices
189  //
190 
192  octree_labels.numTiles() > 100,
193  classifyOctreeLiquidCells,
194  SIM_RawIndexField &,liquid_indices,
195  const UT_VoxelArray<int> &, octree_labels,
196  const SIM_RawIndexField &, regular_liquid_cell_labels,
197  const int, level)
198 
199  void classifyOctreeLiquidCellsPartial(SIM_RawIndexField &liquid_indices,
200  const UT_VoxelArray<int> &octree_labels,
201  const SIM_RawIndexField &regular_liquid_cell_labels,
202  const int level,
203  const UT_JobInfo &info) const;
204 
205  exint buildOctreeCellIndices(UT_Array<SIM_RawIndexField> &liquid_indices,
206  const UT_FaceGradedOctreeLabels &octree_labels,
207  const SIM_RawIndexField &regular_liquid_cell_labels,
208  const UT_Vector3 &octree_grid_size) const;
209 
211  connected_component_field.shouldMultiThread(),
212  findFreeSurfacePerRegion,
213  UT_Array<bool> &, region_has_free_surface,
214  const SIM_RawIndexField &, connected_component_field,
215  const SIM_RawIndexField &, regular_liquid_cell_labels,
216  const SIM_RawField **, cutcell_weights)
217 
218  void findFreeSurfacePerRegionPartial(UT_Array<bool> &region_has_free_surface,
219  const SIM_RawIndexField &connected_component_field,
220  const SIM_RawIndexField &regular_liquid_cell_labels,
221  const SIM_RawField **cutcell_weights,
222  const UT_JobInfo &info) const;
223 
225  connected_liquid_components.shouldMultiThread(),
226  computeDivergencePerRegion,
227  UT_Array<UT_Array<fpreal>> &, parallel_region_divergence,
228  UT_Array<UT_Array<fpreal>> &, parallel_region_cell_count,
229  const SIM_RawIndexField &, connected_liquid_components,
230  const SIM_RawIndexField &, regular_liquid_cell_labels,
231  const SIM_RawField &, divergence,
232  const UT_Array<bool> &, region_has_free_surface)
233 
234  void computeDivergencePerRegionPartial(UT_Array<UT_Array<fpreal>> &parallel_region_divergence,
235  UT_Array<UT_Array<fpreal>> &parallel_region_cell_count,
236  const SIM_RawIndexField &connected_liquid_components,
237  const SIM_RawIndexField &regular_liquid_cell_labels,
238  const SIM_RawField &divergence,
239  const UT_Array<bool> &region_has_free_surface,
240  const UT_JobInfo &info) const;
241 
243  connected_liquid_components.shouldMultiThread(),
244  removeAverageDivergence,
246  const SIM_RawIndexField &, connected_liquid_components,
247  const SIM_RawIndexField &, regular_liquid_cell_labels,
248  const UT_Array<fpreal> &, region_divergence,
249  const UT_Array<bool> &, region_has_free_surface)
250 
251  void removeAverageDivergencePartial(SIM_RawField &divergence,
252  const SIM_RawIndexField &connected_liquid_components,
253  const SIM_RawIndexField &regular_liquid_cell_labels,
254  const UT_Array<fpreal> &region_divergence,
255  const UT_Array<bool> &region_has_free_surface,
256  const UT_JobInfo &info) const;
257 
259  octree_labels.numTiles() > 100,
260  buildOccupiedOctreeFaceTiles,
261  UT_Array<bool> &, occupied_tile_list,
262  const SIM_RawField &, valid_faces,
263  const UT_VoxelArray<int> &, octree_labels,
264  const int, axis)
265 
266  void buildOccupiedOctreeFaceTilesPartial(UT_Array<bool> &occupied_tile_list,
267  const SIM_RawField &valid_faces,
268  const UT_VoxelArray<int> &octree_labels,
269  const int axis,
270  const UT_JobInfo &info) const;
271 
273  occupied_tile_list.entries() > 20,
274  uncompressTiles,
275  SIM_RawField &, grid,
276  const UT_Array<bool> &, occupied_tile_list)
277 
278  void uncompressTilesPartial(SIM_RawField &grid,
279  const UT_Array<bool> &occupied_tile_list,
280  const UT_JobInfo &info) const;
281 
283  valid_faces.shouldMultiThread(),
284  classifyValidOctreeFaces,
285  SIM_RawField &, valid_faces,
286  const UT_FaceGradedOctreeLabels &, octree_labels,
287  const SIM_RawField &, surface,
288  const SIM_RawIndexField &, liquid_cell_indices,
289  const SIM_RawField **, cutcell_weights,
290  const int, axis, const int, level)
291 
292  void classifyValidOctreeFacesPartial(SIM_RawField &valid_faces,
293  const UT_FaceGradedOctreeLabels &octree_labels,
294  const SIM_RawField &surface,
295  const SIM_RawIndexField &liquid_cell_indices,
296  const SIM_RawField **cutcell_weights,
297  const int axis, const int level,
298  const UT_JobInfo &info) const;
299 
300  void buildValidOctreeFaces(UT_Array<UT_Array<SIM_RawField>> &valid_octree_faces,
301  const UT_Array<SIM_RawIndexField> &liquid_indices,
302  const UT_FaceGradedOctreeLabels &octree_labels,
303  const SIM_RawField **cutcell_weights,
304  const SIM_RawField &surface,
305  const UT_Vector3 &octree_grid_size) const;
306 
308  regular_liquid_cell_labels.field()->numTiles() > 100,
309  findOccupiedRegularGridFaceTiles,
310  UT_Array<bool> &, occupied_tile_list,
311  const SIM_RawIndexField &, regular_liquid_cell_labels,
312  const SIM_RawField &, valid_faces,
313  const int, axis)
314 
315  void findOccupiedRegularGridFaceTilesPartial(UT_Array<bool> &occupied_tile_list,
316  const SIM_RawIndexField &regular_liquid_cell_labels,
317  const SIM_RawField &valid_faces,
318  const int axis,
319  const UT_JobInfo &info) const;
320 
322  valid_faces.shouldMultiThread(),
323  classifyValidRegularGridFaces,
324  SIM_RawField &, valid_faces,
325  const SIM_RawIndexField &, regular_liquid_cell_labels,
326  const SIM_RawField &, cutcell_weights,
327  const int, axis)
328 
329  void classifyValidRegularGridFacesPartial(SIM_RawField &valid_faces,
330  const SIM_RawIndexField &regular_liquid_cell_labels,
331  const SIM_RawField &cutcell_weights,
332  const int axis,
333  const UT_JobInfo &info) const;
334 
335  void buildValidRegularGridFaces(SIM_VectorField &valid_faces,
336  const SIM_RawIndexField &regular_liquid_cell_labels,
337  const SIM_RawField **cutcell_weights) const;
338 
340  divergence.shouldMultiThread(),
341  buildFineCutCellDivergence,
343  const SIM_VectorField &, velocity,
344  const SIM_RawField **, cutcell_weights,
345  const SIM_VectorField *, collision_velocity,
346  const SIM_RawIndexField &, regular_liquid_cell_labels)
347 
348  void buildFineCutCellDivergencePartial(SIM_RawField &divergence,
349  const SIM_VectorField &velocity,
350  const SIM_RawField **cutcell_weights,
351  const SIM_VectorField *collision_velocity,
352  const SIM_RawIndexField &regular_liquid_cell_labels,
353  const UT_JobInfo &info) const;
354 
356  divergence[level].shouldMultiThread(),
357  buildCoarseDivergence,
359  const UT_FaceGradedOctreeLabels &, octree_labels,
360  const int, level)
361 
362  void buildCoarseDivergencePartial(UT_Array<SIM_RawField> &divergence,
363  const UT_FaceGradedOctreeLabels &octree_labels,
364  const int level,
365  const UT_JobInfo &info) const;
366 
368  liquid_cell_indices.shouldMultiThread(),
369  buildRHS,
370  Vector &, rhs_vector,
371  const SIM_RawField &, divergence,
372  const SIM_RawIndexField &, liquid_cell_indices)
373 
374  void buildRHSPartial(Vector &rhs_vector,
375  const SIM_RawField &divergence,
376  const SIM_RawIndexField &liquid_cell_indices,
377  const UT_JobInfo &info) const;
378 
379  THREADED_METHOD9_CONST(GAS_ProjectNonDivergentAdaptive,
380  valid_faces.shouldMultiThread(),
381  integrateSurfacePressure,
382  SIM_RawField &, velocity,
383  const SIM_RawField &, valid_faces,
384  const SIM_RawField &, surface_pressure,
385  const SIM_RawField &, surface,
386  const SIM_RawField &, density,
387  const SIM_RawIndexField &, regular_liquid_cell_labels,
388  const SIM_VectorField *, surface_weights,
389  const fpreal, dt,
390  const int, axis)
391 
392  void integrateSurfacePressurePartial(SIM_RawField &velocity,
393  const SIM_RawField &valid_faces,
394  const SIM_RawField &surface_pressure,
395  const SIM_RawField &surface,
396  const SIM_RawField &density,
397  const SIM_RawIndexField &regular_liquid_cell_labels,
398  const SIM_VectorField *surface_weights,
399  const fpreal dt,
400  const int axis,
401  const UT_JobInfo &info) const;
402 
403  THREADED_METHOD3_CONST(GAS_ProjectNonDivergentAdaptive,
404  source_pressure.shouldMultiThread(),
405  buildFinePressure,
406  SIM_RawField &, adaptive_pressure,
407  const SIM_RawField &, source_pressure,
408  const SIM_RawIndexField &, regular_liquid_cell_labels)
409 
410  void buildFinePressurePartial(SIM_RawField &adaptive_pressure,
411  const SIM_RawField &source_pressure,
412  const SIM_RawIndexField &regular_liquid_cell_labels,
413  const UT_JobInfo &info) const;
414 
415  THREADED_METHOD3_CONST(GAS_ProjectNonDivergentAdaptive,
416  pressure_pyramid[level].shouldMultiThread(),
417  buildCoarsePressure,
418  UT_Array<SIM_RawField> &, pressure_pyramid,
419  const UT_FaceGradedOctreeLabels &, octree_labels,
420  const int, level)
421 
422  void buildCoarsePressurePartial(UT_Array<SIM_RawField> &pressure_pyramid,
423  const UT_FaceGradedOctreeLabels &octree_labels,
424  const int level,
425  const UT_JobInfo &info) const;
426 
427  THREADED_METHOD3_CONST(GAS_ProjectNonDivergentAdaptive,
428  pressure.shouldMultiThread(),
429  applyWarmStart,
430  Vector &, solution_vector,
431  const SIM_RawField &, pressure,
432  const SIM_RawIndexField &, liquid_cell_indices)
433 
434  void applyWarmStartPartial(Vector &solution_vector,
435  const SIM_RawField &pressure,
436  const SIM_RawIndexField &liquid_cell_indices,
437  const UT_JobInfo &info) const;
438 
439 
440  struct OctreeSystemParms
441  {
442  OctreeSystemParms(const SIM_RawField **cutcell_weights,
443  const SIM_RawField *boundary_weights,
444  const SIM_RawField &density,
445  const SIM_RawField &surface,
446  const SIM_VectorField *surface_weights)
447  : m_cutcell_weights(cutcell_weights)
448  , m_boundary_weights(boundary_weights)
449  , m_density(density)
450  , m_surface(surface)
451  , m_surface_weights(surface_weights)
452  {}
453 
454  const SIM_RawField **m_cutcell_weights;
455  const SIM_RawField *m_boundary_weights;
456  const SIM_RawField &m_density;
457  const SIM_RawField &m_surface;
458  const SIM_VectorField *m_surface_weights;
459  };
460 
462  liquid_cell_indices[level].shouldMultiThread(),
463  buildOctreePressureSystem,
464  UT_Array<SparseMatrix> &, parallel_sparse_matrix,
465  const UT_Array<SIM_RawIndexField> &, liquid_cell_indices,
466  const UT_Array<UT_Array<SIM_RawField>> &, valid_octree_faces,
467  const UT_FaceGradedOctreeLabels &, octree_labels,
468  const OctreeSystemParms &, octree_parms,
469  const int, level)
470 
471  void buildOctreePressureSystemPartial(UT_Array<SparseMatrix> &parallel_sparse_matrix,
472  const UT_Array<SIM_RawIndexField> &liquid_cell_indices,
473  const UT_Array<UT_Array<SIM_RawField>> &valid_octree_faces,
474  const UT_FaceGradedOctreeLabels &octree_labels,
475  const OctreeSystemParms &octree_parms,
476  const int level,
477  const UT_JobInfo &info) const;
478 
479  void applySolutionPressure(SIM_RawField &pressure,
480  const Vector &solution_vector,
481  const SIM_RawIndexField &liquid_cell_indices) const;
482 
483  void samplePressureFromParent(UT_Array<SIM_RawField> &pressure_pyramid,
484  const UT_FaceGradedOctreeLabels &octree_labels,
485  const int level) const;
486 
488  pressure.shouldMultiThread(),
489  dampedJacobiSmoother,
490  SIM_RawField &, pressure,
491  const SIM_RawField &, temp_pressure,
492  const SIM_RawField &, divergence,
493  const UT_VoxelArray<int> &, octree_labels)
494 
495  void dampedJacobiSmootherPartial(SIM_RawField &pressure,
496  const SIM_RawField &temp_pressure,
497  const SIM_RawField &divergence,
498  const UT_VoxelArray<int> &octree_labels,
499  const UT_JobInfo &info) const;
500 
501  void tiledGaussSeidelSmoother(SIM_RawField &pressure,
502  const SIM_RawField &divergence,
503  const UT_VoxelArray<int> &octree_labels,
504  const bool apply_odd_tiles,
505  const bool apply_forward_iteration) const;
506 
507  void applyOutputPressure(SIM_RawField &pressure,
508  const SIM_RawField &source_pressure,
509  const SIM_RawIndexField &regular_liquid_cell_labels) const;
510 
511  THREADED_METHOD9_CONST(GAS_ProjectNonDivergentAdaptive,
512  valid_faces.shouldMultiThread(),
513  applyRegularGridPressure,
514  SIM_RawField &, velocity,
515  const SIM_RawField &, pressure,
516  const SIM_RawField &, valid_faces,
517  const SIM_RawField &, surface,
518  const SIM_RawField & ,density,
519  const SIM_RawIndexField &, regular_liquid_cell_labels,
520  const SIM_RawField *, boundary_weights,
521  const SIM_VectorField *, surface_weights,
522  const int, axis)
523 
524  void applyRegularGridPressurePartial(SIM_RawField &velocity,
525  const SIM_RawField &pressure,
526  const SIM_RawField &valid_faces,
527  const SIM_RawField &surface,
528  const SIM_RawField &density,
529  const SIM_RawIndexField &regular_liquid_cell_labels,
530  const SIM_RawField *boundary_weights,
531  const SIM_VectorField *surface_weights,
532  const int axis,
533  const UT_JobInfo &info) const;
534 };
535 
536 #endif
#define DECLARE_STANDARD_GETCASTTOTYPE()
Definition: SIM_DataUtils.h:45
#define THREADED_METHOD4_CONST(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4)
#define SIM_NAME_TOLERANCE
Definition: SIM_Names.h:202
#define THREADED_METHOD9_CONST(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5, PARMTYPE6, PARMNAME6, PARMTYPE7, PARMNAME7, PARMTYPE8, PARMNAME8, PARMTYPE9, PARMNAME9)
#define GET_DATA_FUNC_V3(DataName, FuncName)
GT_API const UT_StringHolder time
#define GAS_NAME_USETIMESTEP
Definition: GAS_Utils.h:39
#define GAS_API
Definition: GAS_API.h:10
GLsizei levels
Definition: glew.h:4099
virtual bool solveGasSubclass(SIM_Engine &engine, SIM_Object *obj, SIM_Time time, SIM_Time timestep)=0
GLhandleARB obj
Definition: glew.h:6236
#define THREADED_METHOD5_CONST(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5)
#define DECLARE_DATAFACTORY(DataClass, SuperClass, Description, DopParms)
Definition: SIM_DataUtils.h:58
#define GET_DATA_FUNC_I(DataName, FuncName)
int numTiles() const
int64 exint
Definition: SYS_Types.h:120
#define THREADED_METHOD7_CONST(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5, PARMTYPE6, PARMNAME6, PARMTYPE7, PARMNAME7)
void
Definition: png.h:1083
typedef int(WINAPI *PFNWGLRELEASEPBUFFERDCARBPROC)(HPBUFFERARB hPbuffer
#define THREADED_METHOD2_CONST(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2)
double fpreal
Definition: SYS_Types.h:276
#define GET_DATA_FUNC_B(DataName, FuncName)
THREADED_METHOD6_CONST(GAS_SubSolver, gdp->getNumPoints() > 2048, applyForces, GU_Detail *, gdp, const GA_PointGroup *, ptgrp, SIM_Time, timestep, bool, densityscale, bool, doorient, bool, updatepos) void applyForcesPartial(GU_Detail *gdp
#define GET_DATA_FUNC_F(DataName, FuncName)
This class holds a three dimensional scalar field.
#define GAS_NAME_TIMESCALE
Definition: GAS_Utils.h:40
VectorToScalarConverter< GridType >::Type::Ptr divergence(const GridType &grid, bool threaded, InterruptT *interrupt)
Compute the divergence of the given vector-valued grid.
#define const
Definition: zconf.h:214
#define THREADED_METHOD3_CONST(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3)
This class holds a three dimensional vector field.
GLint level
Definition: glew.h:1252
bool shouldMultiThread(const SIM_RawField *field) const
UT_VoxelArrayF UT_VoxelArrayF & field